From d45d9c2cfaa109580ec726fcbe24272ee43b0fe5 Mon Sep 17 00:00:00 2001 From: Maurice Date: Fri, 20 Mar 2026 23:38:54 +0100 Subject: [PATCH] Fix Atlas labels, update Demo Banner with addons & NOMAD intro (v2.5.0) - Remove Next Trip from Atlas bottom panel - Fix label wrapping with whitespace-nowrap on streak/year labels - Redesign Demo Banner: add addon showcase (Vacay, Atlas, Packing, Budget, Documents, Widgets), "What is NOMAD?" section, 2-column grid layout, compact design --- client/src/components/Layout/DemoBanner.jsx | 155 ++++++++++++++------ 1 file changed, 109 insertions(+), 46 deletions(-) diff --git a/client/src/components/Layout/DemoBanner.jsx b/client/src/components/Layout/DemoBanner.jsx index d892f36..916565e 100644 --- a/client/src/components/Layout/DemoBanner.jsx +++ b/client/src/components/Layout/DemoBanner.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react' -import { Info, Github, Shield, Key, Users, Database, Upload, Clock } from 'lucide-react' +import { Info, Github, Shield, Key, Users, Database, Upload, Clock, Puzzle, CalendarDays, Globe, ArrowRightLeft, Map, Briefcase, ListChecks, Wallet, FileText, Plane } from 'lucide-react' import { useTranslation } from '../../i18n' const texts = { @@ -9,14 +9,25 @@ const texts = { resetIn: 'Naechster Reset in', minutes: 'Minuten', uploadNote: 'Datei-Uploads (Fotos, Dokumente, Cover) sind in der Demo deaktiviert.', - fullVersionTitle: 'In der Vollversion zusaetzlich verfuegbar:', + fullVersionTitle: 'In der Vollversion zusaetzlich:', features: [ - 'Datei-Uploads (Fotos, Dokumente, Reise-Cover)', - 'API-Schluessel verwalten (Google Maps, Wetter)', - 'Benutzer & Rechte verwalten', - 'Automatische Backups & Wiederherstellung', + 'Datei-Uploads (Fotos, Dokumente, Cover)', + 'API-Schluessel (Google Maps, Wetter)', + 'Benutzer- & Rechteverwaltung', + 'Automatische Backups', ], - selfHost: 'NOMAD ist Open Source — ', + addonsTitle: 'Modulare Addons', + addons: [ + ['Vacay', 'Urlaubsplaner mit Kalender, Feiertagen & Fusion'], + ['Atlas', 'Weltkarte mit besuchten Laendern & Reisestatistiken'], + ['Packliste', 'Checklisten pro Reise'], + ['Budget', 'Kostenplanung mit Splitting'], + ['Dokumente', 'Dateien an Reisen anhaengen'], + ['Widgets', 'Waehrungsrechner & Zeitzonen'], + ], + whatIs: 'Was ist NOMAD?', + whatIsDesc: 'Ein selbst-gehosteter Reiseplaner mit Echtzeit-Kollaboration, interaktiver Karte, OIDC Login und Dark Mode.', + selfHost: 'Open Source — ', selfHostLink: 'selbst hosten', close: 'Verstanden', }, @@ -26,20 +37,32 @@ const texts = { resetIn: 'Next reset in', minutes: 'minutes', uploadNote: 'File uploads (photos, documents, covers) are disabled in demo mode.', - fullVersionTitle: 'Additionally available in the full version:', + fullVersionTitle: 'Additionally in the full version:', features: [ - 'File uploads (photos, documents, trip covers)', + 'File uploads (photos, documents, covers)', 'API key management (Google Maps, Weather)', 'User & permission management', - 'Automatic backups & restore', + 'Automatic backups', ], - selfHost: 'NOMAD is open source — ', + addonsTitle: 'Modular Addons', + addons: [ + ['Vacay', 'Vacation planner with calendar, holidays & user fusion'], + ['Atlas', 'World map with visited countries & travel stats'], + ['Packing', 'Checklists per trip'], + ['Budget', 'Expense tracking with splitting'], + ['Documents', 'Attach files to trips'], + ['Widgets', 'Currency converter & timezones'], + ], + whatIs: 'What is NOMAD?', + whatIsDesc: 'A self-hosted travel planner with real-time collaboration, interactive maps, OIDC login and dark mode.', + selfHost: 'Open source — ', selfHostLink: 'self-host it', close: 'Got it', }, } const featureIcons = [Upload, Key, Users, Database] +const addonIcons = [CalendarDays, Globe, ListChecks, Wallet, FileText, ArrowRightLeft] export default function DemoBanner() { const [dismissed, setDismissed] = useState(false) @@ -57,85 +80,125 @@ export default function DemoBanner() { return (
setDismissed(true)}>
e.stopPropagation()}> -
+ {/* Header */} +
- +
-

+

{t.title}

-

+

{t.description}

-
- - - {t.resetIn} {minutesLeft} {t.minutes} - + {/* Timer + Upload note */} +
+
+ + + {t.resetIn} {minutesLeft} {t.minutes} + +
+
+ + {t.uploadNote} +
-

- - {t.uploadNote} -

+
+ + {t.whatIs} +
+

{t.whatIsDesc}

+
-

+ {/* Addons */} +

+ + {t.addonsTitle} +

+
+ {t.addons.map(([name, desc], i) => { + const Icon = addonIcons[i] + return ( +
+ +
+ {name} +

{desc}

+
+
+ ) + })} +
+ + {/* Full version features */} +

+ {t.fullVersionTitle}

- -
+
{t.features.map((text, i) => { const Icon = featureIcons[i] return ( -
- +
+ {text}
) })}
+ {/* Footer */}
-
- + -