diff --git a/VERSION b/VERSION index 64e9c64..08e9158 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1219 \ No newline at end of file +1217 \ No newline at end of file diff --git a/backend/static/css/components.css b/backend/static/css/components.css index 87dea9c..77b70ec 100644 --- a/backend/static/css/components.css +++ b/backend/static/css/components.css @@ -3053,18 +3053,17 @@ html.modal-open { .map-legend::-webkit-scrollbar { display: none; } /* Regenradar-Zeitleiste (RainViewer: ~2h Vergangenheit + ~30min Nowcast, Play/Pause + Slider) */ -/* Optik + Maße wie die Status-Pill darunter: gleiche linke Kante (var(--space-3)); die Breite wird - per JS an die Pill angeglichen (gleiche rechte Kante). Höhe wie die Pill. */ +/* Optik wie die Status-Pill darunter (hell/cremefarben, Blur, Border), direkt darüber gesetzt. */ .map-radar-timeline { position: absolute; left: var(--space-3); - width: min(320px, calc(100% - 100px)); /* Fallback; JS setzt = Pill-Breite */ - bottom: calc(var(--space-3) + 34px); /* unmittelbar über der Status-Pill */ + right: 88px; /* Platz für die Ecken-FABs (Speed-Dial / Zurück) rechts */ + bottom: calc(var(--space-3) + 40px); /* unmittelbar über der Status-Pill */ z-index: 900; display: flex; align-items:center; - gap: 7px; - padding: 3px 12px 3px 4px; + gap: 8px; + padding: 4px 12px 4px 5px; border-radius: var(--radius-full); background: rgba(255, 255, 255, 0.88); backdrop-filter: blur(4px); @@ -3072,7 +3071,6 @@ html.modal-open { border: 1px solid var(--c-border-light); color: var(--c-text); pointer-events: auto; - box-sizing: border-box; } :root[data-theme="dark"] .map-radar-timeline { background: rgba(24, 20, 16, 0.92); @@ -3080,20 +3078,19 @@ html.modal-open { } .rdr-play { flex-shrink: 0; - width: 24px; height: 24px; + width: 30px; height: 30px; border: none; border-radius: 50%; background: var(--c-surface-2); color: var(--c-text); cursor: pointer; display: flex; align-items: center; justify-content: center; } -.rdr-play svg { width: 14px; height: 14px; } .rdr-play:active { background: var(--c-border); } .rdr-slider { flex: 1; min-width: 0; height: 4px; accent-color: var(--c-primary); cursor: pointer; } .rdr-time { flex-shrink: 0; font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; - min-width: 74px; text-align: right; color: var(--c-text-secondary); + min-width: 78px; text-align: right; color: var(--c-text-secondary); } .rdr-time.is-forecast { color: var(--c-primary); } /* Nowcast/Vorhersage-Frames hervorgehoben */ diff --git a/backend/static/index.html b/backend/static/index.html index 1770205..60bf077 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -86,14 +86,14 @@ Ban Yaro - + - - - - - + + + + + @@ -617,11 +617,11 @@ - - - - - + + + + + @@ -631,7 +631,7 @@ - + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 6d91f3c..1433eb5 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '1219'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1217'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator) window.APP_VERSION = APP_VERSION; diff --git a/backend/static/js/pages/map.js b/backend/static/js/pages/map.js index 568f5d3..29bff06 100644 --- a/backend/static/js/pages/map.js +++ b/backend/static/js/pages/map.js @@ -621,16 +621,12 @@ window.Page_map = (() => { document.getElementById('central-map')?.appendChild(el); el.querySelector('#rdr-play').addEventListener('click', _toggleRadarPlay); el.querySelector('#rdr-slider').addEventListener('input', e => { - const idx = parseInt(e.target.value, 10); // ZUERST lesen: _radarPause() setzt slider.value zurück _radarPause(); - _showRadarFrame(idx); + _showRadarFrame(parseInt(e.target.value, 10)); }); } else { el.querySelector('#rdr-slider').max = _radarFrames.length - 1; } - // Breite an die Status-Pill angleichen → gleiche linke + rechte Kante. - const pill = document.querySelector('.map-statusbar'); - if (pill && pill.offsetWidth > 60) el.style.width = pill.offsetWidth + 'px'; _updateRadarTimelineUI(); } diff --git a/backend/static/landing.html b/backend/static/landing.html index 9eef0c0..0b01da6 100644 --- a/backend/static/landing.html +++ b/backend/static/landing.html @@ -4,7 +4,7 @@ - + Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz diff --git a/backend/static/sw.js b/backend/static/sw.js index b3e17b8..1affc8c 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -4,7 +4,7 @@ ============================================================ */ // ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab -const VER = '1219'; +const VER = '1217'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten diff --git a/docs/DWD_RAIN_FORECAST_PLAN.md b/docs/DWD_RAIN_FORECAST_PLAN.md deleted file mode 100644 index 4c84e5d..0000000 --- a/docs/DWD_RAIN_FORECAST_PLAN.md +++ /dev/null @@ -1,56 +0,0 @@ -# DWD Regen-Vorhersage (Radar-Nowcast) — Scoping-Plan - -**Status:** gescoppt + Datenformat verifiziert (2026-06-05). Umsetzung offen. -**Ziel:** Verlässliche, längere Regen-**Vorhersage** als animiertes Karten-Overlay (bis +2 h) statt RainViewers -unzuverlässigem 30-Min-Nowcast (der oft leer ist). Self-hosted wie die Basemap — passt zur Tile-Server-Philosophie. - -## Quelle: DWD RV (Composite RV) — kostenlos, kein API-Key -- `https://opendata.dwd.de/weather/radar/composite/rv/DE1200_RV.tar.bz2` -- **Alle 5 Min** publiziert. Jedes Archiv = ein Vorhersage-Lauf mit **25 Frames** `_000`…`_120` - (**0 bis +120 Min**, 5-Min-Schritte), je ~2,5 MB unkomprimiert (~1 MB als .tar.bz2). -- **Format (verifiziert):** RADOLAN-Binär. 194-Byte-ASCII-Header bis `ETX (0x03)`, dann **1200×1100 uint16 - little-endian** (= 2.640.000 Byte). Header-Felder: `PR E-02` (0,01 mm), `INT 5` (5-Min-Summe), - `GP1200x1100`, `VV` (Lead-Time). **Wert = `raw & 0x0FFF` × 0,01 mm/5min; `raw & 0x2000` = kein Daten.** - → Decode trivial, **kein wradlib nötig** (PoC: 1,32 Mio Zellen geparst, Regen korrekt erkannt). -- **Gitter/Projektion:** DE1200 (1 km), polar-stereografisch, fest georeferenziert (Eckkoordinaten dokumentiert; - wradlib `get_radolan_grid` ODER GDAL mit dem bekannten RADOLAN-PROJ-String). -- **Abdeckung:** Deutschland + Randbereiche (reicht etwas nach AT/CH/Nachbarn, aber DE-zentriert). - Voll-AT/CH bräuchte ACG/MeteoSwiss → out of scope. - -## Pipeline (Server-seitig, Cron alle 5 Min — analog zum OSM-POI-Job) -1. **Fetch** neueste `DE1200_RV