Abfahrtstafel- und Favoriten-Polling (je 30s) liefen bisher die gesamte
Seitenlebensdauer weiter, egal ob der Tab überhaupt sichtbar war -
anders als LiveMap, das schon länger korrekt über den aktiven Tab
gesteuert wird. Über die Page Visibility API werden beide Intervalle
jetzt pausiert, sobald der Tab in den Hintergrund geht, und beim
Zurückkehren mit einer sofortigen Aktualisierung neu gestartet. Der
Fahrtalarm bleibt bewusst unangetastet, da er sicherheitsrelevant ist.
Zusätzlich: beim Entfernen eines Favoriten wird jetzt auch dessen
gemerkter Störungs-Stand aus dem localStorage entfernt (sonst bleibt
er dort für immer hängen - analog zum seenDisruptions-Leck, das
letzte Runde schon im Backend gefixt wurde).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01De7H8hR1Q9DdgyuS2ukN6y
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
Löst die WebApp aus der eigenen OTP2-Instanz heraus und nutzt dieselbe
HAFAS-Anbindung (VBB + Deutsche Bahn) wie die iOS-App, damit beide Clients
gegen dasselbe Backend-Feature-Set laufen:
- js/api.js: getJourneys() ruft jetzt /journeys statt /otp/journeys auf,
inkl. via0-2 (Lat/Lon/Name/WaitMinutes), modes, bike, earlierRef/laterRef.
Gibt die volle Antwort zurück statt nur { journeys }.
- js/app.js: bis zu 3 Zwischenhalte mit eigener Ortssuche und Aufenthaltszeit,
Verkehrsmittel-Filter (ModeFilter-Komponente wiederverwendet), Fahrrad-
Toggle, Früher/Später-Buttons zum Nachladen. Share-Link-Format um
Vias/Modes/Bike erweitert, alter Umstiegszeit-Puffer entfernt (von HAFAS
nicht unterstützt).
- index.html/styles.css: neue Formularelemente für Zwischenhalte, Filter
und Paginierung.
- js/i18n.js: neue Übersetzungsschlüssel in DE/EN, alten sourceNote-String
korrigiert (& wurde per textContent gesetzt und wäre literal
angezeigt worden statt als &).
- README.md: Feature-Beschreibung aktualisiert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01De7H8hR1Q9DdgyuS2ukN6y