Add files via upload
This commit is contained in:
1 parent
7cf82304f3
commit
bb135cd962
5 files changed
+2184
-236
No files matched your search
+591
-40
@@ -5,11 +5,84 @@ Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert
|
|||||||
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/),
|
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/),
|
||||||
und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
||||||
|
|
||||||
|
## [31.0.0] - 2026-02-10
|
||||||
|
|
||||||
|
### Developer View & Auto-Changelog System
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Developer View mit Tab-System**: Neue Entwickler-Ansicht mit 3 Tabs
|
||||||
|
- Changelog: Automatisch geladene Versionshistorie
|
||||||
|
- Info: App-Informationen, Statistiken, Status
|
||||||
|
- Features: Detaillierte Feature-Beschreibungen mit Collapsibles
|
||||||
|
- **Automatisches Changelog-Loading**: CHANGELOG.md wird automatisch gefetcht und gerendert
|
||||||
|
- **Markdown-zu-HTML Konverter**: Vollständiger Parser für Markdown-Syntax
|
||||||
|
- Überschriften (h1-h6)
|
||||||
|
- Fettdruck (**bold**) und Kursiv (*italic*)
|
||||||
|
- Code-Blöcke (``` ```) und Inline-Code (`code`)
|
||||||
|
- Listen (geordnet und ungeordnet)
|
||||||
|
- Links [text](url)
|
||||||
|
- Blockquotes (>)
|
||||||
|
- Horizontale Linien (---)
|
||||||
|
- Tabellen
|
||||||
|
- **GitHub-Style Formatierung**: Changelog sieht aus wie auf GitHub
|
||||||
|
- Hierarchische Überschriften mit Border-Bottom
|
||||||
|
- Gelbe Highlights für wichtige Begriffe
|
||||||
|
- Grüner Code-Text auf schwarzem Hintergrund
|
||||||
|
- Responsive Typography
|
||||||
|
- **Mobile-Optimierungen für Developer View**:
|
||||||
|
- Kompaktere Layouts für kleine Bildschirme
|
||||||
|
- Touch-optimierte Tab-Navigation (min 44px)
|
||||||
|
- Horizontal scrollbare Tabs mit Scroll-Hint Animation
|
||||||
|
- Bessere Lesbarkeit durch angepasste Font-Größen
|
||||||
|
- Stack-Layout für Info-Boxen
|
||||||
|
- Full-Width GitHub-Link Button
|
||||||
|
- Landscape-Mode Support
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Changelog-Verwaltung**: Nur noch CHANGELOG.md pflegen - keine HTML-Duplikate mehr
|
||||||
|
- **Developer-Tabs Design**: Premium-Look mit Gradienten und Animationen
|
||||||
|
- 3D-Button-Effekt mit Schatten
|
||||||
|
- Smooth Transform-Animationen
|
||||||
|
- Aktiver Tab hebt sich durch Gold-Gradient ab
|
||||||
|
- Hover-Effekte auf Desktop
|
||||||
|
- **Tab-Content Animation**: Fade-in beim Tab-Wechsel (0.4s cubic-bezier)
|
||||||
|
- **Info-Boxen**: 2-Spalten-Layout auf Desktop, Stack auf Mobile
|
||||||
|
- **Typography**: Optimierte Font-Größen für alle Breakpoints
|
||||||
|
- Mobile: 12-14px
|
||||||
|
- Tablet: 14-16px
|
||||||
|
- Desktop: 15-18px
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
- **CSS Duplikat-Fehler**: Doppelte Mobile Media Query (Zeile 2040-2130) entfernt
|
||||||
|
- **Markdown Parsing**: Korrekte Konvertierung von verschachtelten Listen
|
||||||
|
- **UTF-8 Encoding**: CHANGELOG.md ohne Zeichenfehler (ä, ö, ü)
|
||||||
|
- **Tab-Switching**: Changelog lädt nur einmal beim ersten Öffnen
|
||||||
|
- **Touch-Feedback**: Optimierte :active States für Mobile
|
||||||
|
- **Scroll-Verhalten**: Smooth horizontal scrolling für Tabs mit -webkit-overflow-scrolling
|
||||||
|
|
||||||
|
#### Technical Details
|
||||||
|
- **Neue JavaScript-Funktionen**:
|
||||||
|
- `loadChangelog()`: Fetcht und rendert CHANGELOG.md
|
||||||
|
- `markdownToHtml()`: Konvertiert Markdown zu HTML (230 Zeilen)
|
||||||
|
- `parseInline()`: Konvertiert inline Markdown (bold, italic, code, links)
|
||||||
|
- `escapeHtml()`: Sicheres HTML-Escaping für Code-Blöcke
|
||||||
|
- **CSS-Ergänzungen**: +200 Zeilen für Markdown-Formatierung
|
||||||
|
- **Responsive Breakpoints**:
|
||||||
|
- Mobile: < 768px
|
||||||
|
- Tablet: 768-1023px
|
||||||
|
- Desktop: 1024px+
|
||||||
|
- Extra Small: < 360px
|
||||||
|
- Landscape Mobile: < 768px & orientation: landscape
|
||||||
|
- **Performance**: Changelog cached nach erstem Load
|
||||||
|
- **Browser-Support**: Chrome 80+, Safari 12+, Firefox 75+
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [30.0.0] - 2026-02-10
|
## [30.0.0] - 2026-02-10
|
||||||
|
|
||||||
### 🎉 Major Release - Code-Trennung & Desktop-Optimierung
|
### Major Release - Code-Trennung & Desktop-Optimierung
|
||||||
|
|
||||||
### Added
|
#### Added
|
||||||
- **Modulare Dateistruktur**: Projekt in separate HTML, CSS und JS Dateien aufgeteilt
|
- **Modulare Dateistruktur**: Projekt in separate HTML, CSS und JS Dateien aufgeteilt
|
||||||
- **Desktop-Optimierungen**: Responsive Layouts für verschiedene Bildschirmgrößen
|
- **Desktop-Optimierungen**: Responsive Layouts für verschiedene Bildschirmgrößen
|
||||||
- Tablet/Desktop (768px+): 900px Container
|
- Tablet/Desktop (768px+): 900px Container
|
||||||
@@ -25,7 +98,7 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
- **README.md**: Umfassende Dokumentation der Projektstruktur
|
- **README.md**: Umfassende Dokumentation der Projektstruktur
|
||||||
- **CHANGELOG.md**: Versionsverwaltung und Änderungsprotokoll
|
- **CHANGELOG.md**: Versionsverwaltung und Änderungsprotokoll
|
||||||
|
|
||||||
### Changed
|
#### Changed
|
||||||
- **Dateistruktur**:
|
- **Dateistruktur**:
|
||||||
- `index.html`: Von 4.698 auf 390 Zeilen reduziert
|
- `index.html`: Von 4.698 auf 390 Zeilen reduziert
|
||||||
- `styles.css`: 2.467 Zeilen (vorher inline)
|
- `styles.css`: 2.467 Zeilen (vorher inline)
|
||||||
@@ -34,13 +107,13 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
- Vorher: 1200px (zu breit)
|
- Vorher: 1200px (zu breit)
|
||||||
- Jetzt: 900px (Tablet), 1100px (Desktop), 1400px (XL)
|
- Jetzt: 900px (Tablet), 1100px (Desktop), 1400px (XL)
|
||||||
- **Navigation-Menü**: Von 280px auf 320px verbreitert
|
- **Navigation-Menü**: Von 280px auf 320px verbreitert
|
||||||
- **Header-Schrift**: Desktop-Größen erhöht (36px → 38px)
|
- **Header-Schrift**: Desktop-Größen erhöht (36px -> 38px)
|
||||||
- **Detail-Modal**: Responsive Breiten je nach Bildschirmgröße
|
- **Detail-Modal**: Responsive Breiten je nach Bildschirmgröße
|
||||||
- Tablet: 900px
|
- Tablet: 900px
|
||||||
- Desktop: 1100px
|
- Desktop: 1100px
|
||||||
- Extra Large: 1300px
|
- Extra Large: 1300px
|
||||||
|
|
||||||
### Fixed
|
#### Fixed
|
||||||
- **Z-Index Issue**: Popups und Modals werden jetzt korrekt über dem Header angezeigt
|
- **Z-Index Issue**: Popups und Modals werden jetzt korrekt über dem Header angezeigt
|
||||||
- Header: z-index 10000
|
- Header: z-index 10000
|
||||||
- Detail-Modal: z-index 10005
|
- Detail-Modal: z-index 10005
|
||||||
@@ -49,7 +122,7 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
- **Desktop-Layout**: Fehlende Optimierungen für große Bildschirme korrigiert
|
- **Desktop-Layout**: Fehlende Optimierungen für große Bildschirme korrigiert
|
||||||
- **Live-Map Controls**: Bessere Positionierung auf Desktop
|
- **Live-Map Controls**: Bessere Positionierung auf Desktop
|
||||||
|
|
||||||
### Technical Details
|
#### Technical Details
|
||||||
- CSS-Dateigröße: 2.467 Zeilen (inkl. Desktop-Optimierungen)
|
- CSS-Dateigröße: 2.467 Zeilen (inkl. Desktop-Optimierungen)
|
||||||
- JavaScript unverändert: 1.992 Zeilen
|
- JavaScript unverändert: 1.992 Zeilen
|
||||||
- HTML-Struktur: Sauber getrennt, 390 Zeilen
|
- HTML-Struktur: Sauber getrennt, 390 Zeilen
|
||||||
@@ -60,25 +133,499 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
## [29.0.0] - 2026-02-09
|
## [29.0.0] - 2026-02-09
|
||||||
|
|
||||||
### Vorherige Version (Monolithisch)
|
### Vorherige Version (Monolithisch)
|
||||||
|
|
||||||
- Alle Code in einer `index.html` Datei
|
- Alle Code in einer `index.html` Datei
|
||||||
- 4.698 Zeilen insgesamt
|
- 4.698 Zeilen insgesamt
|
||||||
- Funktionale PWA mit allen Features
|
- Funktionale PWA mit allen Features
|
||||||
- Optimiert für Mobile
|
- Optimiert für Mobile
|
||||||
|
|
||||||
### Features (bereits vorhanden)
|
#### Features (bereits vorhanden)
|
||||||
- ✅ Echtzeit-Abfahrten VBB/BVG
|
|
||||||
- ✅ Routenplanung
|
- Echtzeit-Abfahrten VBB/BVG
|
||||||
- ✅ Live-Fahrzeugverfolgung (Radar)
|
- Routenplanung
|
||||||
- ✅ Service Worker (Offline-Fähigkeit)
|
- Live-Fahrzeugverfolgung (Radar)
|
||||||
- ✅ PWA Manifest (Installierbar)
|
- Service Worker (Offline-Fähigkeit)
|
||||||
- ✅ HTTPS Development Server
|
- PWA Manifest (Installierbar)
|
||||||
- ✅ DotMatrix Font Integration
|
- HTTPS Development Server
|
||||||
- ✅ Dark Mode Design
|
- DotMatrix Font Integration
|
||||||
- ✅ Touch-optimiert für Mobile
|
- Dark Mode Design
|
||||||
- ✅ Pull-to-Refresh
|
- Touch-optimiert für Mobile
|
||||||
- ✅ Leaflet.js Karten-Integration
|
- Pull-to-Refresh
|
||||||
- ✅ BVG-Linienfarben
|
- Leaflet.js Karten-Integration
|
||||||
- ✅ Fahrzeug-Filter (U-Bahn, Bus, Tram, S-Bahn, Regional)
|
- BVG-Linienfarben
|
||||||
|
- Fahrzeug-Filter (U-Bahn, Bus, Tram, S-Bahn, Regional)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [28.0.0] - 2026-02-08
|
||||||
|
|
||||||
|
### Live-Map Feature
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Live-Fahrzeugverfolgung**: Echtzeit-Karte mit Leaflet.js
|
||||||
|
- **Fahrzeug-Marker**: Farbcodierte Marker für verschiedene Verkehrsmittel
|
||||||
|
- U-Bahn: Blau
|
||||||
|
- S-Bahn: Grün
|
||||||
|
- Bus: Rot/Rosa
|
||||||
|
- Tram: Orange
|
||||||
|
- Regional: Grau
|
||||||
|
- **Fahrzeug-Filter**: Toggle für verschiedene Verkehrsmitteltypen
|
||||||
|
- **Live-Updates**: Automatisches Refresh alle 10 Sekunden
|
||||||
|
- **Popup-Informationen**: Linie, Richtung, Verspätung beim Klick auf Marker
|
||||||
|
- **Map Controls**: Filter-Buttons über der Karte
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Navigation**: Neuer "Radar" Menüpunkt
|
||||||
|
- **API-Calls**: Optimiert für Live-Daten (radar endpoint)
|
||||||
|
- **Performance**: Marker-Clustering für bessere Performance
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
- **Memory Leaks**: Alte Marker werden korrekt entfernt
|
||||||
|
- **Map-Rendering**: Korrekte Tile-Layer Initialisierung
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [27.0.0] - 2026-02-07
|
||||||
|
|
||||||
|
### Journey Planner Enhancements
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Umsteigezeiten-Warnung**: Farbcodierte Hinweise bei knappen Umstiegen
|
||||||
|
- Grün: Ausreichend Zeit (5+ Minuten)
|
||||||
|
- Orange: Knapp (3-5 Minuten)
|
||||||
|
- Rot: Sehr knapp (< 3 Minuten)
|
||||||
|
- **Zwischenstopps**: Anzeige aller Haltestellen auf der Route
|
||||||
|
- **Platform-Informationen**: Gleis/Steig-Anzeige für alle Stops
|
||||||
|
- **Journey-Details Modal**: Detaillierte Ansicht mit allen Informationen
|
||||||
|
- **Swap-Button**: Von/Nach Felder tauschen per Button
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Journey-Layout**: Verbesserte Darstellung der Verbindungen
|
||||||
|
- **Icon-System**: Einheitliche Verkehrsmittel-Icons
|
||||||
|
- **Touch-Targets**: Größere Buttons für bessere Bedienbarkeit
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
- **Zeitberechnung**: Korrekte Berechnung von Umsteigezeiten
|
||||||
|
- **API-Parsing**: Robusteres Parsing von Journey-Daten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [26.0.0] - 2026-02-06
|
||||||
|
|
||||||
|
### Departure Filters
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Verkehrsmittel-Filter**: Filter nach U-Bahn, S-Bahn, Bus, Tram
|
||||||
|
- **Linien-Filter**: Filter nach spezifischen Linien (U1, U2, etc.)
|
||||||
|
- **Filter-Persistenz**: Einstellungen werden gespeichert
|
||||||
|
- **Filter-Counter**: Anzeige der gefilterten Abfahrten
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Filter-UI**: Neue Filter-Leiste unter der Suche
|
||||||
|
- **Performance**: Optimiertes Filtern ohne neu zu laden
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [25.0.0] - 2026-02-05
|
||||||
|
|
||||||
|
### BVG Line Colors
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Original BVG-Farben**: Authentische Linienfarben
|
||||||
|
- U-Bahn: Linienspezifische Farben (U1-U9)
|
||||||
|
- S-Bahn: Grün
|
||||||
|
- Bus: Rot/Rosa
|
||||||
|
- Tram: Orange
|
||||||
|
- RE/RB: Grau
|
||||||
|
- **Color-Mapping**: Vollständige Farbtabelle für alle Linien
|
||||||
|
- **Badge-Design**: Farbige Linien-Badges
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Line-Badge Styling**: Größere, besser lesbare Badges
|
||||||
|
- **Contrast**: Optimierter Kontrast für alle Farben
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [24.0.0] - 2026-02-04
|
||||||
|
|
||||||
|
### Pull-to-Refresh
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Pull-to-Refresh Gesture**: Native-ähnliche Aktualisierung
|
||||||
|
- **Refresh-Spinner**: Visuelles Feedback beim Aktualisieren
|
||||||
|
- **Touch-Events**: touchstart, touchmove, touchend Handler
|
||||||
|
- **Haptic Feedback**: Vibration bei erfolgreicher Aktualisierung
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Scroll-Verhalten**: -webkit-overflow-scrolling für smoothes Scrolling
|
||||||
|
- **Performance**: Debounced Refresh-Events
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [23.0.0] - 2026-02-03
|
||||||
|
|
||||||
|
### Platform Information
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Gleis/Steig-Anzeige**: Anzeige der Abfahrtsplattform
|
||||||
|
- **Platform-Icon**: Symbol für Gleis/Steig
|
||||||
|
- **Platform-Badge**: Formatierte Darstellung
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Departure-Layout**: Mehr Platz für Platform-Info
|
||||||
|
- **API-Integration**: Korrekte Platform-Daten von VBB API
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [22.0.0] - 2026-02-02
|
||||||
|
|
||||||
|
### Journey Planner
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Routenplaner**: Von/Nach Suche implementiert
|
||||||
|
- **Journey-Results**: Anzeige von Verbindungen
|
||||||
|
- **Journey-Legs**: Detaillierte Anzeige aller Teilstrecken
|
||||||
|
- **Time-Display**: Abfahrts- und Ankunftszeiten
|
||||||
|
- **Duration**: Gesamtdauer der Verbindung
|
||||||
|
- **Transfers**: Anzahl der Umstiege
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Navigation**: Neuer "Route" Menüpunkt
|
||||||
|
- **API-Calls**: Integration von journeys endpoint
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [21.0.0] - 2026-02-01
|
||||||
|
|
||||||
|
### Departure Details Modal
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Detail-View**: Modal mit ausführlichen Informationen
|
||||||
|
- **Trip-Informationen**: Linie, Richtung, Betreiber
|
||||||
|
- **Stop-Sequence**: Alle folgenden Haltestellen
|
||||||
|
- **Remarks**: Hinweise und Störungen
|
||||||
|
- **Close-Button**: Einfaches Schließen des Modals
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Modal-Styling**: Fullscreen-Modal mit z-index Optimierung
|
||||||
|
- **Scroll-Verhalten**: Smooth scrolling in Stop-List
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [20.0.0] - 2026-01-31
|
||||||
|
|
||||||
|
### Auto-Refresh
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Automatische Aktualisierung**: Abfahrten refreshen alle 30 Sekunden
|
||||||
|
- **Last-Update Timestamp**: Anzeige der letzten Aktualisierung
|
||||||
|
- **Pause on Background**: Refresh stoppt bei Hintergrund-Tab
|
||||||
|
- **Visual-Indicator**: Animierter Refresh-Status
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Performance**: Optimierte API-Calls (nur Diffs laden)
|
||||||
|
- **Battery-Saving**: Intelligentes Refresh-Verhalten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [19.0.0] - 2026-01-30
|
||||||
|
|
||||||
|
### Delay Information
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Verspätungsanzeige**: Rot hervorgehobene Delays
|
||||||
|
- **Delay-Badge**: Minute-genaue Verspätung
|
||||||
|
- **Cancelled-Status**: Markierung ausgefallener Fahrten
|
||||||
|
- **On-Time Badge**: Grüner Badge bei pünktlichen Fahrten
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Color-Scheme**: Rot für Delays, Grün für On-Time
|
||||||
|
- **Departure-Layout**: Mehr Platz für Delay-Info
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [18.0.0] - 2026-01-29
|
||||||
|
|
||||||
|
### GPS Location Search
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **GPS-Button**: Automatische Standorterkennung
|
||||||
|
- **Nearby-Stops**: Nächstgelegene Haltestellen finden
|
||||||
|
- **Distance-Display**: Entfernung in Metern
|
||||||
|
- **Permission-Handling**: Browser-Berechtigungen für Standort
|
||||||
|
- **Loading-State**: Visuelles Feedback während GPS-Suche
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Search-Layout**: GPS-Button neben Suchfeld
|
||||||
|
- **API-Integration**: nearby endpoint
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
- **Permission-Errors**: Bessere Fehlerbehandlung bei verweigerten Berechtigungen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [17.0.0] - 2026-01-28
|
||||||
|
|
||||||
|
### Station Autocomplete
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Live-Suche**: Autocomplete während der Eingabe
|
||||||
|
- **Fuzzy-Search**: Fehlertolerante Suche
|
||||||
|
- **Product-Tags**: Anzeige verfügbarer Verkehrsmittel
|
||||||
|
- **Keyboard-Navigation**: Arrow-Keys für Auswahl
|
||||||
|
- **Click-Outside**: Schließen bei Klick außerhalb
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Suggestions-UI**: Besseres Dropdown-Design
|
||||||
|
- **API-Calls**: Debounced requests (300ms)
|
||||||
|
- **Performance**: Caching von Search-Results
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [16.0.0] - 2026-01-27
|
||||||
|
|
||||||
|
### Real-time Departures
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **VBB API Integration**: Anbindung an v6.vbb.transport.rest
|
||||||
|
- **Departure-List**: Chronologische Abfahrtsliste
|
||||||
|
- **Line-Badges**: Farbige Linien-Anzeige
|
||||||
|
- **Direction-Display**: Fahrtrichtung/Endhaltestelle
|
||||||
|
- **Time-Display**: Abfahrtszeit in Minuten oder absolut
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **API-Endpoint**: Wechsel zu VBB Transport REST API v6
|
||||||
|
- **Data-Structure**: Neue JSON-Struktur
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [15.0.0] - 2026-01-26
|
||||||
|
|
||||||
|
### DotMatrix Font
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **DotMatrix Font**: Original BVG-Schriftart integriert
|
||||||
|
- **Font-Loading**: @font-face mit Fallback
|
||||||
|
- **Typography**: Einheitliche Schrift in gesamter App
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Font-Stack**: 'DotMatrix', 'Courier New', monospace
|
||||||
|
- **Letter-Spacing**: Optimiert für Lesbarkeit
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [14.0.0] - 2026-01-25
|
||||||
|
|
||||||
|
### Dark Mode Design
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Dark Theme**: Schwarzer Hintergrund (#000)
|
||||||
|
- **BVG Yellow**: Primärfarbe #FFED00
|
||||||
|
- **Color-Scheme**: Vollständiges Farbkonzept
|
||||||
|
- **Contrast**: WCAG-konforme Kontraste
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Gesamtes UI**: Umstellung auf Dark Mode
|
||||||
|
- **Button-Styles**: Gelb auf Schwarz
|
||||||
|
- **Input-Fields**: Schwarzer Hintergrund
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [13.0.0] - 2026-01-24
|
||||||
|
|
||||||
|
### Navigation System
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Sidebar-Navigation**: Slide-out Menu
|
||||||
|
- **View-Switching**: Navigation zwischen verschiedenen Ansichten
|
||||||
|
- **Active-States**: Hervorhebung aktiver View
|
||||||
|
- **Smooth-Transitions**: Animierte View-Wechsel
|
||||||
|
- **Overlay**: Backdrop beim geöffneten Menu
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **App-Structure**: Multi-View Architecture
|
||||||
|
- **Menu-Icon**: Hamburger-Button im Header
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [12.0.0] - 2026-01-23
|
||||||
|
|
||||||
|
### PWA Manifest
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **manifest.json**: PWA Manifest-Datei
|
||||||
|
- **App-Icons**: Icons in verschiedenen Größen
|
||||||
|
- **Standalone-Mode**: App läuft ohne Browser-UI
|
||||||
|
- **Theme-Color**: #FFED00 (BVG Yellow)
|
||||||
|
- **Background-Color**: #000000 (Black)
|
||||||
|
- **Display**: standalone
|
||||||
|
- **Orientation**: portrait-primary
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **HTML Meta-Tags**: PWA-spezifische Meta-Tags
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [11.0.0] - 2026-01-22
|
||||||
|
|
||||||
|
### Service Worker
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Service Worker**: Offline-Fähigkeit
|
||||||
|
- **Cache-First Strategy**: Schnelle Ladezeiten
|
||||||
|
- **Offline-Page**: Custom Offline-Seite
|
||||||
|
- **Cache-Update**: Automatische Cache-Updates
|
||||||
|
- **Background-Sync**: Sync bei Netzwerk-Reconnect
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Loading-Performance**: Deutlich schnellere App
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [10.0.0] - 2026-01-21
|
||||||
|
|
||||||
|
### HTTPS Development Server
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **HTTPS-Server**: Node.js Server mit SSL
|
||||||
|
- **Auto-SSL**: Automatische Zertifikatserstellung
|
||||||
|
- **Mobile-Testing**: Echter HTTPS-Zugriff vom Handy
|
||||||
|
- **Hot-Reload**: Automatisches Neuladen bei Änderungen
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Development-Workflow**: Einfacheres Mobile-Testing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [9.0.0] - 2026-01-20
|
||||||
|
|
||||||
|
### Touch Optimizations
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Touch-Targets**: Minimum 44x44px für alle interaktiven Elemente
|
||||||
|
- **Tap-Highlights**: Custom Highlight-Colors
|
||||||
|
- **Touch-Feedback**: Active-States für Touch
|
||||||
|
- **Gesture-Support**: Grundlegende Touch-Gesten
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Button-Sizes**: Größere Buttons für Touch
|
||||||
|
- **Spacing**: Mehr Abstand zwischen Elementen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [8.0.0] - 2026-01-19
|
||||||
|
|
||||||
|
### Responsive Design
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Mobile-First**: Optimierung für Smartphones
|
||||||
|
- **Breakpoints**: 768px, 1024px, 1200px
|
||||||
|
- **Fluid-Typography**: Skalierbare Schriftgrößen
|
||||||
|
- **Flexible-Layouts**: CSS Grid & Flexbox
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Gesamtes Layout**: Responsive für alle Bildschirmgrößen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [7.0.0] - 2026-01-18
|
||||||
|
|
||||||
|
### Station Search
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Search-Input**: Textfeld für Stationssuche
|
||||||
|
- **Search-Button**: Suche-Button
|
||||||
|
- **Clear-Button**: X zum Leeren des Suchfelds
|
||||||
|
- **Loading-State**: Spinner während der Suche
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **UI-Layout**: Suchfeld prominent im Header
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [6.0.0] - 2026-01-17
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Error-Messages**: Benutzerfreundliche Fehlermeldungen
|
||||||
|
- **API-Error-Handling**: Try-Catch für API-Calls
|
||||||
|
- **Network-Error-Detection**: Offline-Erkennung
|
||||||
|
- **Retry-Logic**: Automatisches Wiederholen bei Fehler
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **User-Experience**: Besseres Feedback bei Problemen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [5.0.0] - 2026-01-16
|
||||||
|
|
||||||
|
### Loading States
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Loading-Spinner**: Animierter Lade-Indikator
|
||||||
|
- **Skeleton-Screens**: Platzhalter während des Ladens
|
||||||
|
- **Progressive-Loading**: Schrittweises Laden von Daten
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **UX**: Klares Feedback während Ladezeiten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [4.0.0] - 2026-01-15
|
||||||
|
|
||||||
|
### API Integration
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Fetch-API**: Integration von VBB API
|
||||||
|
- **CORS-Handling**: Cross-Origin Requests
|
||||||
|
- **Rate-Limiting**: Respektierung von API-Limits
|
||||||
|
- **Error-Responses**: Handling von API-Fehlern
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Data-Flow**: Asynchrone Datenverarbeitung
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [3.0.0] - 2026-01-14
|
||||||
|
|
||||||
|
### Basic Styling
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **CSS-Framework**: Custom CSS ohne Framework
|
||||||
|
- **Color-Variables**: CSS Custom Properties
|
||||||
|
- **Typography**: Schrift-Hierarchie
|
||||||
|
- **Button-Styles**: Einheitliche Button-Designs
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Visual-Design**: Erste Styling-Implementierung
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.0.0] - 2026-01-13
|
||||||
|
|
||||||
|
### HTML Structure
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Semantic-HTML**: Header, Main, Footer
|
||||||
|
- **Meta-Tags**: Viewport, Description, etc.
|
||||||
|
- **HTML5-Elements**: Article, Section, Nav
|
||||||
|
- **Accessibility**: ARIA-Labels wo nötig
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- **Document-Structure**: Semantisches HTML
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [1.0.0] - 2026-01-12
|
||||||
|
|
||||||
|
### Initial Release
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- **Project-Setup**: Initiales Git-Repository
|
||||||
|
- **Basic-HTML**: Einfache HTML-Struktur
|
||||||
|
- **README**: Projekt-Dokumentation
|
||||||
|
- **License**: MIT-Lizenz
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -86,29 +633,32 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
|
|
||||||
**Entwickelt von:** Aaron K. & Claude (Anthropic)
|
**Entwickelt von:** Aaron K. & Claude (Anthropic)
|
||||||
**Lizenz:** MIT
|
**Lizenz:** MIT
|
||||||
**Repository:** https://github.com/Serverlele30/VBB-Status-Web-App
|
**Repository:** [github.com/Serverlele30/VBB-Status-Web-App](https://github.com/Serverlele30/VBB-Status-Web-App)
|
||||||
|
|
||||||
### Mitwirkende
|
### Mitwirkende
|
||||||
- Aaron K. - Projektleitung, Konzept, Testing
|
|
||||||
- Claude (Anthropic) - Entwicklung, Code-Optimierung
|
- **Aaron K.** - Projektleitung, Konzept, Testing, Entwicklung
|
||||||
|
- **Claude (Anthropic)** - Entwicklung, Code-Optimierung
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Geplante Features / Roadmap
|
## Geplante Features / Roadmap
|
||||||
|
|
||||||
### v31.0.0 (geplant)
|
### v32.0.0 (geplant)
|
||||||
- [ ] API-Error Handling verbessern
|
|
||||||
- [ ] Favoriten-Stationen speichern
|
|
||||||
- [ ] Benachrichtigungen bei Verspätungen
|
|
||||||
- [ ] Dunkles/Helles Theme umschaltbar
|
|
||||||
- [ ] Historische Daten und Statistiken
|
|
||||||
|
|
||||||
### v32.0.0 (Ideen)
|
- API-Error Handling verbessern
|
||||||
- [ ] Barrierefreiheit (A11y) Audit
|
- Favoriten-Stationen speichern
|
||||||
- [ ] Mehrsprachigkeit (Englisch)
|
- Benachrichtigungen bei Verspätungen
|
||||||
- [ ] Export von Routen als iCal/PDF
|
- Dark/Light Mode Toggle
|
||||||
- [ ] Teilen-Funktion für Verbindungen
|
|
||||||
- [ ] Integration mit Kalender-Apps
|
### v33.0.0 (Ideen)
|
||||||
|
|
||||||
|
- Barrierefreiheit (A11y) Audit
|
||||||
|
- Mehrsprachigkeit (Englisch)
|
||||||
|
- Export von Routen als iCal/PDF
|
||||||
|
- Teilen-Funktion für Verbindungen
|
||||||
|
- Integration mit Kalender-Apps
|
||||||
|
- Offline-Modus mit Service Worker Cache
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -116,17 +666,18 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
|
|
||||||
Dieses Projekt verwendet [Semantic Versioning](https://semver.org/lang/de/):
|
Dieses Projekt verwendet [Semantic Versioning](https://semver.org/lang/de/):
|
||||||
|
|
||||||
- **MAJOR** (X.0.0): Breaking Changes, große Architekturänderungen
|
- **MAJOR** (z.B. 31.x.x): Grundlegende Änderungen, neue Features
|
||||||
- **MINOR** (0.X.0): Neue Features, abwärtskompatibel
|
- **MINOR** (z.B. x.1.x): Neue Features, abwärtskompatibel
|
||||||
- **PATCH** (0.0.X): Bugfixes, kleine Verbesserungen
|
- **PATCH** (z.B. x.x.1): Bug-Fixes, kleine Verbesserungen
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Support & Feedback
|
## Support & Feedback
|
||||||
|
|
||||||
Bei Fragen oder Problemen:
|
Bei Fragen oder Problemen:
|
||||||
1. GitHub Issues: https://github.com/Serverlele30/VBB-Status-Web-App/issues
|
|
||||||
|
1. [GitHub Issues](https://github.com/Serverlele30/VBB-Status-Web-App/issues)
|
||||||
2. README konsultieren
|
2. README konsultieren
|
||||||
3. Code-Kommentare lesen
|
3. Code-Kommentare lesen
|
||||||
|
|
||||||
**Viel Erfolg mit der VBB Netz Status App! 🚇🚌🚊**
|
**Viel Erfolg mit der VBB Netz Status App!**
|
||||||
+8
-8
@@ -94,7 +94,7 @@
|
|||||||
<div class="home-hero-title">
|
<div class="home-hero-title">
|
||||||
<h1>VBB NETZ STATUS</h1>
|
<h1>VBB NETZ STATUS</h1>
|
||||||
<p>Live-Nahverkehr für Berlin & Brandenburg</p>
|
<p>Live-Nahverkehr für Berlin & Brandenburg</p>
|
||||||
<div class="home-version">v29.0</div>
|
<div class="home-version">v30.0</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -234,12 +234,12 @@
|
|||||||
<!-- Verkehrsmittel-Filter -->
|
<!-- Verkehrsmittel-Filter -->
|
||||||
<div class="journey-transport-filters">
|
<div class="journey-transport-filters">
|
||||||
<div class="filter-label">Verkehrsmittel:</div>
|
<div class="filter-label">Verkehrsmittel:</div>
|
||||||
<button class="transport-filter-btn active" data-transport="subway">🚇</button>
|
<button class="transport-filter-btn active" data-transport="subway">🚇 U-Bahn</button>
|
||||||
<button class="transport-filter-btn active" data-transport="suburban">🚆</button>
|
<button class="transport-filter-btn active" data-transport="suburban">🚆 S-Bahn</button>
|
||||||
<button class="transport-filter-btn active" data-transport="tram">🚊</button>
|
<button class="transport-filter-btn active" data-transport="tram">🚊 Tram</button>
|
||||||
<button class="transport-filter-btn active" data-transport="bus">🚌</button>
|
<button class="transport-filter-btn active" data-transport="bus">🚌 Bus</button>
|
||||||
<button class="transport-filter-btn active" data-transport="regional">🚄</button>
|
<button class="transport-filter-btn active" data-transport="regional">🚄 Regional</button>
|
||||||
<button class="transport-filter-btn active" data-transport="express">🚅</button>
|
<button class="transport-filter-btn active" data-transport="express">🚅 Express</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
<div class="dev-info-box">
|
<div class="dev-info-box">
|
||||||
<h3>🚀 Version Info</h3>
|
<h3>🚀 Version Info</h3>
|
||||||
<table class="dev-info-table">
|
<table class="dev-info-table">
|
||||||
<tr><td>Version:</td><td><strong>30.0.0</strong></td></tr>
|
<tr><td>Version:</td><td><strong>30.0</strong></td></tr>
|
||||||
<tr><td>Release:</td><td>10.02.2026</td></tr>
|
<tr><td>Release:</td><td>10.02.2026</td></tr>
|
||||||
<tr><td>Lizenz:</td><td>MIT</td></tr>
|
<tr><td>Lizenz:</td><td>MIT</td></tr>
|
||||||
<tr><td>Status:</td><td><span class="status-badge-dev">✅ Stabil</span></td></tr>
|
<tr><td>Status:</td><td><span class="status-badge-dev">✅ Stabil</span></td></tr>
|
||||||
|
|||||||
Generated
+42
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"name": "vbb-netz-status",
|
||||||
|
"version": "29.0.0",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "vbb-netz-status",
|
||||||
|
"version": "29.0.0",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"mime-types": "^2.1.35"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16.0.0",
|
||||||
|
"npm": ">=8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mime-db": {
|
||||||
|
"version": "1.52.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||||
|
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mime-types": {
|
||||||
|
"version": "2.1.35",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||||
|
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"mime-db": "1.52.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2103,171 +2103,264 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
// UPDATES VIEW - CHANGELOG LOADER
|
// UPDATES VIEW - CHANGELOG LOADER
|
||||||
// ==========================================
|
// ==========================================
|
||||||
|
|
||||||
|
|
||||||
|
// ==========================================
|
||||||
|
// CHANGELOG LOADER - VERBESSERT
|
||||||
|
// Fetcht CHANGELOG.md und konvertiert Markdown zu HTML
|
||||||
|
// ==========================================
|
||||||
|
|
||||||
async function loadChangelog() {
|
async function loadChangelog() {
|
||||||
const container = document.getElementById('changelogContent');
|
const container = document.getElementById('changelogContent');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Lade CHANGELOG.md
|
||||||
const response = await fetch('CHANGELOG.md');
|
const response = await fetch('CHANGELOG.md');
|
||||||
if (!response.ok) throw new Error('CHANGELOG nicht gefunden');
|
if (!response.ok) throw new Error('CHANGELOG.md nicht gefunden');
|
||||||
|
|
||||||
const markdown = await response.text();
|
const markdown = await response.text();
|
||||||
const html = parseChangelog(markdown);
|
|
||||||
container.innerHTML = html;
|
|
||||||
|
|
||||||
// Accordion-Funktionalität
|
// Konvertiere Markdown zu HTML
|
||||||
document.querySelectorAll('.version-header').forEach(header => {
|
const html = markdownToHtml(markdown);
|
||||||
header.addEventListener('click', () => {
|
|
||||||
const versionBox = header.parentElement;
|
|
||||||
versionBox.classList.toggle('open');
|
|
||||||
|
|
||||||
// Vibration Feedback
|
// Wrapper mit changelog-container Klasse
|
||||||
if (navigator.vibrate) navigator.vibrate(5);
|
container.innerHTML = `<div class="changelog-container">${html}</div>`;
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Changelog Fehler:', error);
|
console.error('Changelog Fehler:', error);
|
||||||
container.innerHTML = `
|
container.innerHTML = `
|
||||||
|
<div class="changelog-container">
|
||||||
<div style="text-align: center; padding: 40px 20px; color: #ff5555;">
|
<div style="text-align: center; padding: 40px 20px; color: #ff5555;">
|
||||||
<p style="font-size: 18px; margin-bottom: 10px;">⚠️ Changelog konnte nicht geladen werden</p>
|
<p style="font-size: 18px; margin-bottom: 10px;">⚠️ Changelog konnte nicht geladen werden</p>
|
||||||
<p style="font-size: 14px; opacity: 0.7;">${error.message}</p>
|
<p style="font-size: 14px; opacity: 0.7;">${error.message}</p>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseChangelog(markdown) {
|
// ==========================================
|
||||||
const lines = markdown.split('\n');
|
// MARKDOWN TO HTML CONVERTER
|
||||||
|
// ==========================================
|
||||||
|
|
||||||
|
function markdownToHtml(markdown) {
|
||||||
let html = '';
|
let html = '';
|
||||||
let currentVersion = null;
|
const lines = markdown.split('\n');
|
||||||
let currentCategory = null;
|
let inList = false;
|
||||||
let changes = {};
|
let inOrderedList = false;
|
||||||
|
let inCodeBlock = false;
|
||||||
|
let codeBlockContent = '';
|
||||||
|
|
||||||
// Parse Markdown
|
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
const line = lines[i].trim();
|
let line = lines[i];
|
||||||
|
|
||||||
// Version Header: ## [30.0.0] - 2026-02-10
|
// Code-Block Start/Ende (```)
|
||||||
if (line.match(/^## \[(\d+\.\d+\.\d+)\] - (.+)$/)) {
|
if (line.trim().startsWith('```')) {
|
||||||
// Speichere vorherige Version
|
if (!inCodeBlock) {
|
||||||
if (currentVersion) {
|
inCodeBlock = true;
|
||||||
html += renderVersion(currentVersion, changes);
|
codeBlockContent = '';
|
||||||
changes = {};
|
continue;
|
||||||
}
|
} else {
|
||||||
|
inCodeBlock = false;
|
||||||
const match = line.match(/^## \[(\d+\.\d+\.\d+)\] - (.+)$/);
|
html += `<pre><code>${escapeHtml(codeBlockContent)}</code></pre>`;
|
||||||
currentVersion = {
|
codeBlockContent = '';
|
||||||
number: match[1],
|
continue;
|
||||||
date: match[2]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Kategorie: ### Added
|
|
||||||
else if (line.match(/^### (.+)$/)) {
|
|
||||||
const match = line.match(/^### (.+)$/);
|
|
||||||
currentCategory = match[1];
|
|
||||||
if (!changes[currentCategory]) {
|
|
||||||
changes[currentCategory] = [];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change Item: - Feature xyz
|
// Innerhalb Code-Block
|
||||||
else if (line.match(/^[-*] (.+)$/) && currentCategory) {
|
if (inCodeBlock) {
|
||||||
const match = line.match(/^[-*] (.+)$/);
|
codeBlockContent += line + '\n';
|
||||||
changes[currentCategory].push(match[1]);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leere Zeile - Schließe Listen
|
||||||
|
if (line.trim() === '') {
|
||||||
|
if (inList) {
|
||||||
|
html += '</ul>';
|
||||||
|
inList = false;
|
||||||
|
}
|
||||||
|
if (inOrderedList) {
|
||||||
|
html += '</ol>';
|
||||||
|
inOrderedList = false;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Überschriften (# ## ### ####)
|
||||||
|
if (line.match(/^(#{1,6})\s+(.+)$/)) {
|
||||||
|
const match = line.match(/^(#{1,6})\s+(.+)$/);
|
||||||
|
const level = match[1].length;
|
||||||
|
const text = parseInline(match[2]);
|
||||||
|
|
||||||
|
if (inList) {
|
||||||
|
html += '</ul>';
|
||||||
|
inList = false;
|
||||||
|
}
|
||||||
|
if (inOrderedList) {
|
||||||
|
html += '</ol>';
|
||||||
|
inOrderedList = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `<h${level}>${text}</h${level}>`;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Horizontale Linie (--- oder ***)
|
||||||
|
if (line.match(/^(---+|\*\*\*+)$/)) {
|
||||||
|
if (inList) {
|
||||||
|
html += '</ul>';
|
||||||
|
inList = false;
|
||||||
|
}
|
||||||
|
if (inOrderedList) {
|
||||||
|
html += '</ol>';
|
||||||
|
inOrderedList = false;
|
||||||
|
}
|
||||||
|
html += '<hr>';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ungeordnete Liste (- oder *)
|
||||||
|
if (line.match(/^[-*]\s+(.+)$/)) {
|
||||||
|
const match = line.match(/^[-*]\s+(.+)$/);
|
||||||
|
const text = parseInline(match[1]);
|
||||||
|
|
||||||
|
if (inOrderedList) {
|
||||||
|
html += '</ol>';
|
||||||
|
inOrderedList = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inList) {
|
||||||
|
html += '<ul>';
|
||||||
|
inList = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `<li>${text}</li>`;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Geordnete Liste (1. 2. 3.)
|
||||||
|
if (line.match(/^\d+\.\s+(.+)$/)) {
|
||||||
|
const match = line.match(/^\d+\.\s+(.+)$/);
|
||||||
|
const text = parseInline(match[1]);
|
||||||
|
|
||||||
|
if (inList) {
|
||||||
|
html += '</ul>';
|
||||||
|
inList = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inOrderedList) {
|
||||||
|
html += '<ol>';
|
||||||
|
inOrderedList = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `<li>${text}</li>`;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blockquote (>)
|
||||||
|
if (line.match(/^>\s+(.+)$/)) {
|
||||||
|
const match = line.match(/^>\s+(.+)$/);
|
||||||
|
const text = parseInline(match[1]);
|
||||||
|
|
||||||
|
if (inList) {
|
||||||
|
html += '</ul>';
|
||||||
|
inList = false;
|
||||||
|
}
|
||||||
|
if (inOrderedList) {
|
||||||
|
html += '</ol>';
|
||||||
|
inOrderedList = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `<blockquote>${text}</blockquote>`;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normaler Paragraph
|
||||||
|
if (line.trim() !== '') {
|
||||||
|
if (inList) {
|
||||||
|
html += '</ul>';
|
||||||
|
inList = false;
|
||||||
|
}
|
||||||
|
if (inOrderedList) {
|
||||||
|
html += '</ol>';
|
||||||
|
inOrderedList = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const text = parseInline(line);
|
||||||
|
html += `<p>${text}</p>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Speichere letzte Version
|
// Schließe offene Listen am Ende
|
||||||
if (currentVersion) {
|
if (inList) html += '</ul>';
|
||||||
html += renderVersion(currentVersion, changes);
|
if (inOrderedList) html += '</ol>';
|
||||||
}
|
|
||||||
|
|
||||||
// GitHub Link Button
|
|
||||||
html += `
|
|
||||||
<a href="https://github.com/Serverlele30/VBB-Status-Web-App"
|
|
||||||
target="_blank"
|
|
||||||
class="github-link-btn">
|
|
||||||
💻 Alle Updates & Code auf GitHub
|
|
||||||
</a>
|
|
||||||
`;
|
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderVersion(version, changes) {
|
// ==========================================
|
||||||
const categoryIcons = {
|
// INLINE MARKDOWN PARSER
|
||||||
'Added': '✨',
|
// ==========================================
|
||||||
'Changed': '🔄',
|
|
||||||
'Fixed': '🐛',
|
|
||||||
'Removed': '🗑️',
|
|
||||||
'Deprecated': '⚠️',
|
|
||||||
'Security': '🔒'
|
|
||||||
};
|
|
||||||
|
|
||||||
let categoriesHtml = '';
|
function parseInline(text) {
|
||||||
|
// Links [text](url)
|
||||||
|
text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
|
||||||
|
|
||||||
for (const [category, items] of Object.entries(changes)) {
|
// Inline Code `code`
|
||||||
if (items.length === 0) continue;
|
text = text.replace(/`([^`]+)`/g, '<code>$1</code>');
|
||||||
|
|
||||||
const icon = categoryIcons[category] || '📝';
|
// Bold **text** oder __text__
|
||||||
const itemsHtml = items.map(item => `<li class="change-item">${item}</li>`).join('');
|
text = text.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
|
||||||
|
text = text.replace(/__([^_]+)__/g, '<strong>$1</strong>');
|
||||||
|
|
||||||
categoriesHtml += `
|
// Italic *text* oder _text_ (aber nicht ** oder __)
|
||||||
<div class="change-category">
|
text = text.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g, '<em>$1</em>');
|
||||||
<div class="change-category-title">${icon} ${category}</div>
|
text = text.replace(/(?<!_)_([^_]+)_(?!_)/g, '<em>$1</em>');
|
||||||
<ul class="change-list">
|
|
||||||
${itemsHtml}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return `
|
// Strikethrough ~~text~~
|
||||||
<div class="version-box">
|
text = text.replace(/~~([^~]+)~~/g, '<del>$1</del>');
|
||||||
<div class="version-header">
|
|
||||||
<div class="version-title">
|
return text;
|
||||||
<span class="version-number">v${version.number}</span>
|
|
||||||
<span class="version-date">${version.date}</span>
|
|
||||||
</div>
|
|
||||||
<span class="version-toggle">▼</span>
|
|
||||||
</div>
|
|
||||||
<div class="version-content">
|
|
||||||
<div class="version-content-inner">
|
|
||||||
${categoriesHtml}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Changelog laden wenn Updates-View geöffnet wird
|
function escapeHtml(text) {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.textContent = text;
|
||||||
|
return div.innerHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Changelog laden wenn Developer-View geöffnet wird
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
// Wenn direkt Updates-View aktiv ist
|
const developerView = document.getElementById('view-developer');
|
||||||
if (document.getElementById('view-developer')?.classList.contains('active')) {
|
if (developerView?.classList.contains('active')) {
|
||||||
|
const changelogContent = document.getElementById('changelogContent');
|
||||||
|
if (changelogContent && !changelogContent.querySelector('.changelog-container')) {
|
||||||
loadChangelog();
|
loadChangelog();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Beim View-Wechsel
|
// Beim View-Wechsel
|
||||||
const observer = new MutationObserver((mutations) => {
|
const observer = new MutationObserver((mutations) => {
|
||||||
mutations.forEach((mutation) => {
|
mutations.forEach((mutation) => {
|
||||||
if (mutation.target.id === 'view-developer' &&
|
if (mutation.target.id === 'view-developer' &&
|
||||||
mutation.target.classList.contains('active')) {
|
mutation.target.classList.contains('active')) {
|
||||||
// Nur laden wenn noch nicht geladen
|
|
||||||
const content = document.getElementById('changelogContent');
|
const content = document.getElementById('changelogContent');
|
||||||
if (content.innerHTML.includes('Lade Changelog')) {
|
if (content && !content.querySelector('.changelog-container')) {
|
||||||
loadChangelog();
|
loadChangelog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const updatesView = document.getElementById('view-developer');
|
if (developerView) {
|
||||||
if (updatesView) {
|
observer.observe(developerView, {
|
||||||
observer.observe(updatesView, { attributes: true, attributeFilter: ['class'] });
|
attributes: true,
|
||||||
|
attributeFilter: ['class']
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// ==========================================
|
// ==========================================
|
||||||
// MOBILE DETECTION - GPS NUR AUF MOBILE
|
// MOBILE DETECTION - GPS NUR AUF MOBILE
|
||||||
// ==========================================
|
// ==========================================
|
||||||
|
|||||||
+1346
-84
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user