From 21649d3cf05380354950faab8b0e699ceb5a4428 Mon Sep 17 00:00:00 2001 From: Maurice Date: Sat, 18 Apr 2026 01:08:02 +0200 Subject: [PATCH 1/4] feat(dashboard): unify desktop header with the planner toolbar style Brings the dashboard header in line with the Bookings/Lists/Budget/Files toolbars: a single rounded bg-tertiary bar that groups the title, the active/archived trip counters, and the view-toggle + widgets + new-trip actions. Added a border and light shadow so the bar stands out against the dashboard background in both light and dark mode. Mobile header is untouched. --- client/src/pages/DashboardPage.tsx | 119 ++++++++++++++++------------- 1 file changed, 67 insertions(+), 52 deletions(-) diff --git a/client/src/pages/DashboardPage.tsx b/client/src/pages/DashboardPage.tsx index 96c8375f..47063034 100644 --- a/client/src/pages/DashboardPage.tsx +++ b/client/src/pages/DashboardPage.tsx @@ -897,61 +897,76 @@ export default function DashboardPage(): React.ReactElement { - {/* Desktop header */} -
-
-

{t('dashboard.title')}

-

+ {/* Desktop header — unified toolbar */} +

+
+

+ {t('dashboard.title')} +

+
+ {isLoading ? t('common.loading') : trips.length > 0 ? `${t(trips.length !== 1 ? 'dashboard.subtitle.activeMany' : 'dashboard.subtitle.activeOne', { count: trips.length })}${archivedTrips.length > 0 ? t('dashboard.subtitle.archivedSuffix', { count: archivedTrips.length }) : ''}` : t('dashboard.subtitle.empty')} -

-
-
- {/* View mode toggle */} - - {/* Widget settings */} - - {can('trip_create') && } + + +
+ + + {can('trip_create') && ( + + )} +
From 8042db8d7a61cb8ffd7c706dade6ea27f1fe048d Mon Sep 17 00:00:00 2001 From: Maurice Date: Sat, 18 Apr 2026 01:13:33 +0200 Subject: [PATCH 2/4] feat(vacay,journey): apply the same unified toolbar header Wraps the Vacay and Journey desktop headers in the shared rounded bg-tertiary bar (title + divider + subtitle, actions grouped on the right, border and light shadow for contrast). Vacay keeps its filters sidebar-toggle inside the bar on tablet widths; Journey keeps the search-toggle and the primary "Create journey" action. Mobile headers are unchanged. --- client/src/pages/JourneyPage.tsx | 99 +++++++++++++++++++++----------- client/src/pages/VacayPage.tsx | 63 +++++++++++++++++--- 2 files changed, 121 insertions(+), 41 deletions(-) diff --git a/client/src/pages/JourneyPage.tsx b/client/src/pages/JourneyPage.tsx index dbd6d818..c0638322 100644 --- a/client/src/pages/JourneyPage.tsx +++ b/client/src/pages/JourneyPage.tsx @@ -150,39 +150,72 @@ export default function JourneyPage() { )}
- {/* Header — desktop */} -
-
-

{t('journey.title')}

-

{t("journey.frontpage.subtitle")}

-
-
- {searchOpen && ( - setSearchQuery(e.target.value)} - onKeyDown={e => { if (e.key === 'Escape') { setSearchQuery(''); setSearchOpen(false) } }} - placeholder={t('journey.search.placeholder')} - autoFocus - className="w-52 px-3 py-2 border border-zinc-200 dark:border-zinc-700 rounded-[10px] text-[13px] bg-white dark:bg-zinc-800 text-zinc-900 dark:text-white focus:border-zinc-400 focus:outline-none" - /> - )} - - + {/* Header — desktop (unified toolbar) */} +
+
+

+ {t('journey.title')} +

+
+ + {t('journey.frontpage.subtitle')} + + +
+ {searchOpen && ( + setSearchQuery(e.target.value)} + onKeyDown={e => { if (e.key === 'Escape') { setSearchQuery(''); setSearchOpen(false) } }} + placeholder={t('journey.search.placeholder')} + autoFocus + className="w-52 px-3 py-2 rounded-[10px] text-[13px] bg-white dark:bg-zinc-800 text-zinc-900 dark:text-white focus:outline-none" + style={{ border: '1px solid var(--border-primary)' }} + /> + )} + + +
diff --git a/client/src/pages/VacayPage.tsx b/client/src/pages/VacayPage.tsx index b3a524ed..fec226c4 100644 --- a/client/src/pages/VacayPage.tsx +++ b/client/src/pages/VacayPage.tsx @@ -138,19 +138,15 @@ export default function VacayPage(): React.ReactElement {
- {/* Header */} -
+ {/* Mobile header */} +
-
-

{t('admin.addons.catalog.vacay.name')}

-

{t('vacay.subtitle')}

-
+

{t('admin.addons.catalog.vacay.name')}

- {/* Mobile sidebar toggle */}
+ {/* Desktop header — unified toolbar */} +
+
+

+ {t('admin.addons.catalog.vacay.name')} +

+
+ + {t('vacay.subtitle')} + +
+ + +
+
+
+ {/* Main layout */}
{/* Desktop Sidebar */} From 01ed60e2d5d7a130f69dfbf6dadfc153dbfecba2 Mon Sep 17 00:00:00 2001 From: Maurice Date: Sat, 18 Apr 2026 01:16:18 +0200 Subject: [PATCH 3/4] refactor(vacay,journey): drop redundant buttons from the new toolbar Vacay: remove the filter-sidebar toggle from the desktop bar and shift the breakpoint so the pre-existing mobile/tablet header (which still has the toggle) handles everything below the lg threshold where the sidebar is always visible anyway. Journey: drop the desktop search toggle and inline search input from the bar. Mobile search UI is untouched. --- client/src/pages/JourneyPage.tsx | 31 ------------------------------- client/src/pages/VacayPage.tsx | 24 ++++-------------------- 2 files changed, 4 insertions(+), 51 deletions(-) diff --git a/client/src/pages/JourneyPage.tsx b/client/src/pages/JourneyPage.tsx index c0638322..31da4b9a 100644 --- a/client/src/pages/JourneyPage.tsx +++ b/client/src/pages/JourneyPage.tsx @@ -168,37 +168,6 @@ export default function JourneyPage() {
- {searchOpen && ( - setSearchQuery(e.target.value)} - onKeyDown={e => { if (e.key === 'Escape') { setSearchQuery(''); setSearchOpen(false) } }} - placeholder={t('journey.search.placeholder')} - autoFocus - className="w-52 px-3 py-2 rounded-[10px] text-[13px] bg-white dark:bg-zinc-800 text-zinc-900 dark:text-white focus:outline-none" - style={{ border: '1px solid var(--border-primary)' }} - /> - )} -