Claude 888b96d595 Top-Navigation abgeflacht + Handy-Header verschlankt
Zwei konkrete Punkte aus dem Feedback zum neuen Design:

- Die segmentierte Pillen-Navigation (schwebende Karte mit rundem
  Amber-Button) passte stilistisch nicht zum sonst flachen, scharf-
  kantigen Brutalist-Look. Ersetzt durch eine randlose Signage-Leiste
  direkt unter dem Header: Reiter liegen flach auf der Fläche, der
  aktive Reiter bekommt nur eine dezente Amber-Unterlinie plus
  sanften Flächenton statt eines separaten schwebenden Verlaufs-
  Buttons - wirkt mehr wie eine Zugtafel mit Reitern, weniger wie
  ein UI-Widget.

- Auf dem Handy hatte die Suche praktisch keinen Platz mehr: Marke
  (Icon + "ÖPNV NAVI"-Schriftzug) + Suchfeld + 3 Icon-Buttons mussten
  sich eine Zeile teilen, und die Wortmarke trug durch einen bisher
  nur ab 701px zurückgesetzten Button-Rahmen zusätzlich nativen
  Browser-Rahmen/-Innenabstand. Behoben: Wortmarke ab 700px Breite
  ausgeblendet (nur das Icon bleibt als Home-Button), Button-Reset
  gilt jetzt für alle Breiten, Icon-Buttons und Abstände auf dem
  Handy weiter verkleinert - die Sucheingabe bekommt dadurch wieder
  echten Platz statt auf ein paar Pixel zusammengequetscht zu sein.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01De7H8hR1Q9DdgyuS2ukN6y
2026-09-28 12:35:00 +02:00
2026-09-01 13:37:00 +02:00
2026-09-01 13:12:08 +02:00
2026-08-28 16:19:41 +02:00

ÖPNV Navi – Frontend

Vanilla-JS-Webapp für Live-Abfahrten, Routenplanung und eine Live-Karte im VBB-Verbund (Berlin/Brandenburg) mit Anbindung an echte DB-Bahnhöfe. Kein Build-Schritt, kein Framework – reines HTML/CSS/JS, läuft direkt als statische Website.

Tech-Stack

  • Reines HTML5, CSS3, ES2020+ JavaScript (keine Frameworks, kein Bundler)
  • Leaflet für die Live-Karte (per CDN eingebunden)
  • Google Fonts: IBM Plex Mono / Sans / Sans Condensed
  • Service Worker für Web-Push-Benachrichtigungen

Ordnerstruktur

frontend/
├── index.html          Einzige HTML-Seite (Single Page App über Tabs)
├── styles.css           Komplettes Stylesheet ("Solari-Anzeigetafel bei Nacht"-Theme)
├── sw.js                 Service Worker (Web-Push) - MUSS im Root liegen, nicht unter js/
├── manifest.json         PWA-Manifest
└── js/
    ├── config.js         Zentrale Konfiguration (API_BASE-URL des Backends)
    ├── api.js            Schlanker fetch()-Wrapper für alle Backend-Endpunkte
    ├── i18n.js           Mehrsprachigkeit (DE/EN), Wörterbuch + Sprachumschaltung
    ├── app.js            Hauptlogik: Tabs, Suche, Abfahrtstafel, Favoriten, Routenplaner
    ├── splitflap.js       Flip-Animation der Abfahrtstafel (+ Screenreader-Textalternative)
    ├── modefilter.js      Wiederverwendbare Verkehrsmittel-Filter-Chips
    ├── livemap.js         Live-Karte (Leaflet): Radar-Modus, Trip-Tracking, Isolations-Modus
    ├── tripmodal.js       Fahrt-Detail-Modal (Zwischenhalte, Mini-Karte, Verspätungsstatistik)
    ├── tripalarm.js       Fahrtalarm ("wecke mich X Stationen vorher")
    └── push.js            Web-Push: Service-Worker-Registrierung, Abo-Verwaltung

Einrichtung / Deployment

Keine Installation nötig – es sind statische Dateien. Einfach den kompletten Ordnerinhalt auf einen Webserver (nginx, Apache, Vercel, o.ä.) legen.

Wichtig:

  • sw.js muss im Root des ausgelieferten Verzeichnisses liegen (dort, wo auch index.html liegt), nicht unter js/. Der Geltungsbereich eines Service Workers ist standardmäßig auf sein eigenes Verzeichnis und alles darunter beschränkt.
  • Web Push (und Service Worker generell) funktionieren nur über HTTPS (oder localhost während der Entwicklung).
  • In js/config.js die Backend-URL eintragen:
    window.APP_CONFIG = {
      API_BASE: 'https://dein-server.example/live_navi',
    };
    

Features im Überblick

  • Abfahrten: Live-Abfahrtstafel (VBB + echte DB-Bahnhöfe), Verkehrsmittel-Filter, Gleiswechsel-Hinweis, Störungen & Aufzugsstatus direkt unter der Tafel
  • Route: Routenplanung über HAFAS (VBB + Deutsche Bahn, dieselbe Anbindung wie die iOS-App), bis zu 3 Zwischenhalte, Verkehrsmittel-Filter, Fahrrad-Option, rollstuhlgerechte Verbindungen, Früher/Später-Nachladen, Route teilen (Link)
  • Karte: Live-Fahrzeugpositionen, Fahrt isolieren/verfolgen, display-breite Darstellung auf jeder Bildschirmgröße
  • Favoriten: eigener Tab, Live-Vorschau der nächsten Abfahrt, Störungs-Badges
  • Fahrtalarm: weckt X Stationen vor dem Ziel (Ton, Vibration, Vollbild-Overlay)
  • Push-Benachrichtigungen: funktionieren auch bei geschlossenem Tab/Browser (Service Worker + Web Push, siehe js/push.js)
  • Verlauf: zuletzt gesuchte Haltestellen, direkt als Vorschläge im Suchfeld
  • Mehrsprachigkeit: Deutsch/Englisch, automatische Browsersprache-Erkennung
  • Barrierefreiheit: Tastaturbedienung überall (inkl. Suche), ARIA-Tab-Pattern, Fokus-Fallen in Dialogen, Screenreader-Textalternative zur Flip-Animation, aria-live-Regionen für Störungen/Ergebnisse

Browser-Unterstützung

Moderne Evergreen-Browser (Chrome, Firefox, Safari, Edge). Nutzt u. a. fetch, IntersectionObserver-freies Vanilla-DOM, Service Worker, Push API, CSS Custom Properties und dvh-Einheiten (mit vh-Fallback). Kein IE11-Support.

Bekannte Grenzen

  • Die Live-Karte ist für blinde Nutzer naturgemäß eingeschränkt zugänglich (Leaflet-Karten sind visuell) – Abfahrtstafel und Routenplaner liefern dieselben Informationen barrierefrei.
  • Störungstexte kommen direkt von VBB/HAFAS auf Deutsch – eine Übersetzung ins Englische findet nicht statt (nur die App-Oberfläche selbst ist zweisprachig).
  • Fahrtalarm-Ton und Vollbild-Overlay funktionieren nur bei offenem Tab; bei geschlossenem Browser zeigt ein Push nur die Systembenachrichtigung.
Languages
JavaScript 63.1%
CSS 26.8%
HTML 10.1%