Navigation an iOS-Tabs angleichen, Benachrichtigungscenter, Einfacher Modus

Phase 2-4 der WebApp-Angleichung an die iOS-App:

- Navigation: Favoriten und Störungen sind jetzt eigene Top-Level-Tabs
  (Desktop-Tableiste + mobile Bottom-Nav) statt nur über das Mehr-Grid bzw.
  den Stern im Header erreichbar. Neue Header-Icons für Einstellungen (⚙)
  und Benachrichtigungen (🔔, mit rotem Punkt bei ungelesenen Einträgen).
  "Mehr" ist jetzt schlanker (In der Nähe, Tickets, Verlauf, App-Info mit
  Verbindungstest gegen /health/full) und die Sprachauswahl in einen neuen
  eigenen "Einstellungen"-Tab umgezogen.

- Benachrichtigungscenter (js/notifications.js, neu): persistenter
  Verlauf über IndexedDB, sowohl vom Service Worker (eingehende Web-Push-
  Nachrichten, auch bei geschlossenem Tab) als auch von der Seite selbst
  (Störungs-Matches bei Favoriten, Fahrtalarm) beschrieben. Neuer
  "Benachrichtigungen"-Tab zeigt den Verlauf, Badge am Glocken-Icon zeigt
  ungelesene Einträge, per postMessage vom Service Worker live aktualisiert.

- Einfacher Modus: neuer Toggle im Einstellungen-Tab, persistiert in
  localStorage, setzt eine .simple-mode-Klasse auf <html> - moderat
  größere Schrift plus Ausblenden von Verkehrsmittel-Filter/Fahrrad-Option/
  "Zwischenhalt hinzufügen" im Routenplaner, analog zur iOS-App (bewusst
  keine Accessibility-Schriftgrößenstufe, die ist für Screenreader gedacht).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01De7H8hR1Q9DdgyuS2ukN6y
This commit is contained in:
Claude committed 2026-09-28 11:58:15 +02:00
1 parent 32c594bc4d
commit 4da99c913c
8 files changed
+455 -12

No files matched your search

+38
View File
@@ -23,6 +23,8 @@ const I18N = (() => {
'nav.route': 'Route',
'nav.map': 'Karte',
'nav.more': 'Mehr',
'nav.settings': 'Einstellungen',
'nav.notifications': 'Benachrichtigungen',
'common.optional': 'OPTIONAL',
'common.showAll': 'Alle anzeigen',
'common.live': 'LIVE',
@@ -124,10 +126,27 @@ const I18N = (() => {
'more.nearbyText': 'Haltestellen in deiner Umgebung',
'more.disruptionsText': 'Ortsbezogen & netzweit',
'more.faresText': 'Preise & wo kaufen',
'more.notificationsText': 'Verlauf & Push-Status',
'more.settingsText': 'Sprache, Anzeige & mehr',
'more.historyEyebrow': 'VERLAUF',
'more.historyTitle': 'Zuletzt gesucht',
'more.langEyebrow': 'SPRACHE / LANGUAGE',
'more.langTitle': 'Sprache',
'more.aboutEyebrow': 'ÜBER',
'more.aboutTitle': 'App-Info',
'more.backend': 'Backend',
'more.testConnection': 'Verbindung testen',
'more.connectionOk': 'Erreichbar',
'more.connectionError': 'Nicht erreichbar',
'notifications.eyebrow': 'VERLAUF',
'notifications.title': 'Benachrichtigungen',
'notifications.text': 'Alles, was zuletzt eine Push- oder In-App-Benachrichtigung ausgelöst hat.',
'notifications.empty': 'Noch keine Benachrichtigungen.',
'settings.eyebrow': 'EINSTELLUNGEN',
'settings.text': 'Anzeige, Sprache und Benachrichtigungen anpassen.',
'settings.displayTitle': 'Anzeige',
'settings.simpleModeTitle': 'Einfacher Modus',
'settings.simpleModeText': 'Größere Schrift, weniger Optionen auf einen Blick.',
'search.noResults': 'Keine Treffer',
'search.recentSearches': 'Zuletzt gesucht',
'search.resultsLabel': 'Suchergebnisse',
@@ -144,6 +163,8 @@ const I18N = (() => {
'nav.route': 'Route',
'nav.map': 'Map',
'nav.more': 'More',
'nav.settings': 'Settings',
'nav.notifications': 'Notifications',
'common.optional': 'OPTIONAL',
'common.showAll': 'Show all',
'common.live': 'LIVE',
@@ -245,10 +266,27 @@ const I18N = (() => {
'more.nearbyText': 'Stops around you',
'more.disruptionsText': 'Local & network-wide',
'more.faresText': 'Prices & where to buy',
'more.notificationsText': 'History & push status',
'more.settingsText': 'Language, display & more',
'more.historyEyebrow': 'HISTORY',
'more.historyTitle': 'Recently searched',
'more.langEyebrow': 'SPRACHE / LANGUAGE',
'more.langTitle': 'Language',
'more.aboutEyebrow': 'ABOUT',
'more.aboutTitle': 'App info',
'more.backend': 'Backend',
'more.testConnection': 'Test connection',
'more.connectionOk': 'Reachable',
'more.connectionError': 'Unreachable',
'notifications.eyebrow': 'HISTORY',
'notifications.title': 'Notifications',
'notifications.text': 'Everything that recently triggered a push or in-app notification.',
'notifications.empty': 'No notifications yet.',
'settings.eyebrow': 'SETTINGS',
'settings.text': 'Adjust display, language and notifications.',
'settings.displayTitle': 'Display',
'settings.simpleModeTitle': 'Simple mode',
'settings.simpleModeText': 'Larger text, fewer options at a glance.',
'search.noResults': 'No results',
'search.recentSearches': 'Recently searched',
'search.resultsLabel': 'Search results',