From 4e33d710ea7032fe1f01fa856127d3cbdf4ca5e9 Mon Sep 17 00:00:00 2001 From: Maurice Date: Thu, 19 Mar 2026 13:58:27 +0100 Subject: [PATCH] Fix demo banner: add EN/DE translations, fix navbar overlap Banner is now in document flow instead of fixed position, so it no longer covers the navigation. Language follows the app's i18n setting. --- client/src/App.jsx | 2 - client/src/components/Layout/DemoBanner.jsx | 93 ++++++++++++++------- 2 files changed, 63 insertions(+), 32 deletions(-) diff --git a/client/src/App.jsx b/client/src/App.jsx index b44fda1..60c8dfa 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -90,7 +90,6 @@ export default function App() { {demoMode && isAuthenticated && } -
} /> } /> @@ -137,7 +136,6 @@ export default function App() { /> } /> -
) } diff --git a/client/src/components/Layout/DemoBanner.jsx b/client/src/components/Layout/DemoBanner.jsx index f27926e..ef215f4 100644 --- a/client/src/components/Layout/DemoBanner.jsx +++ b/client/src/components/Layout/DemoBanner.jsx @@ -1,32 +1,65 @@ import React, { useState, useEffect } from 'react' -import { Info, X, Github, Shield, Key, Users, Database, ChevronDown, ChevronUp } from 'lucide-react' +import { Info, Github, Shield, Key, Users, Database, ChevronDown, ChevronUp } from 'lucide-react' +import { useTranslation } from '../../i18n' + +const texts = { + de: { + title: 'Demo-Modus', + resetInfo: 'Aenderungen werden stuendlich zurueckgesetzt', + nextReset: 'naechster Reset in ~{min} Min.', + moreInfo: 'Mehr Info', + lessInfo: 'Weniger', + description: 'Du nutzt die NOMAD Demo. Du kannst Reisen ansehen, bearbeiten und eigene erstellen — alles wird jede Stunde automatisch zurueckgesetzt.', + fullVersionTitle: 'Diese Funktionen sind in der Vollversion verfuegbar:', + features: [ + 'API-Schluessel verwalten (Google Maps, Wetter)', + 'Benutzer & Rechte verwalten', + 'Automatische Backups & Wiederherstellung', + 'Registrierung & Sicherheitseinstellungen', + ], + selfHost: 'NOMAD ist Open Source — ', + selfHostLink: 'selbst hosten', + }, + en: { + title: 'Demo Mode', + resetInfo: 'Changes are reset every hour', + nextReset: 'next reset in ~{min} min.', + moreInfo: 'More info', + lessInfo: 'Less', + description: 'You are using the NOMAD demo. You can view, edit and create trips — everything is automatically reset every hour.', + fullVersionTitle: 'These features are available in the full version:', + features: [ + 'API key management (Google Maps, Weather)', + 'User & permission management', + 'Automatic backups & restore', + 'Registration & security settings', + ], + selfHost: 'NOMAD is open source — ', + selfHostLink: 'self-host it', + }, +} + +const featureIcons = [Key, Users, Database, Shield] export default function DemoBanner() { const [expanded, setExpanded] = useState(false) const [minutesLeft, setMinutesLeft] = useState(null) + const { language } = useTranslation() + const t = texts[language] || texts.en useEffect(() => { - const update = () => { - const now = new Date() - setMinutesLeft(59 - now.getMinutes()) - } + const update = () => setMinutesLeft(59 - new Date().getMinutes()) update() const interval = setInterval(update, 30000) return () => clearInterval(interval) }, []) - const adminFeatures = [ - { icon: Key, text: 'API-Schluessel verwalten (Google Maps, Wetter)' }, - { icon: Users, text: 'Benutzer & Rechte verwalten' }, - { icon: Database, text: 'Automatische Backups & Wiederherstellung' }, - { icon: Shield, text: 'Registrierung & Sicherheitseinstellungen' }, - ] + const bannerHeight = expanded ? undefined : 36 return ( -
+
{/* Main banner bar */}
- Demo-Modus + {t.title} · - Aenderungen werden stuendlich zurueckgesetzt + {t.resetInfo} {minutesLeft !== null && ( - (naechster Reset in ~{minutesLeft} Min.) + ({t.nextReset.replace('{min}', minutesLeft)}) )} @@ -69,7 +101,7 @@ export default function DemoBanner() { }} > {expanded ? : } - {expanded ? 'Weniger' : 'Mehr Info'} + {expanded ? t.lessInfo : t.moreInfo}
@@ -80,25 +112,26 @@ export default function DemoBanner() { borderBottom: '1px solid #fbbf24', padding: '16px 24px', fontFamily: "-apple-system, BlinkMacSystemFont, 'SF Pro Text', system-ui, sans-serif", - boxShadow: '0 4px 12px rgba(0,0,0,0.08)', }}>

- Du nutzt die NOMAD Demo. Du kannst Reisen ansehen, bearbeiten und eigene erstellen — - alles wird jede Stunde automatisch zurueckgesetzt. + {t.description}

- Diese Funktionen sind in der Vollversion verfuegbar: + {t.fullVersionTitle}

- {adminFeatures.map(({ icon: Icon, text }) => ( -
- - {text} -
- ))} + {t.features.map((text, i) => { + const Icon = featureIcons[i] + return ( +
+ + {text} +
+ ) + })}
- NOMAD ist Open Source — + {t.selfHost} - selbst hosten → + {t.selfHostLink} →