From c5bdad2d8650b2827d45bec00f1940d6d2a9452d Mon Sep 17 00:00:00 2001 From: rene Date: Sat, 6 Jun 2026 11:07:42 +0200 Subject: [PATCH 1/2] Offline-Plan: Follow-ups Runde 1 dokumentiert (Staging-AN v1222, Runde 2 offen) --- docs/OFFLINE_MAPS_PLAN.md | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/docs/OFFLINE_MAPS_PLAN.md b/docs/OFFLINE_MAPS_PLAN.md index 73135e3..3fafa26 100644 --- a/docs/OFFLINE_MAPS_PLAN.md +++ b/docs/OFFLINE_MAPS_PLAN.md @@ -1,28 +1,41 @@ # Offline-Karten (GL/Vektor) — Feature-Plan -**Status:** KERN UMGESETZT + headless verifiziert (2026-06-05, v1213), **flag-gated `by_offline_tiles` (Default AUS)** bis Gerätetest. -**Stand:** 2026-06-05. Autor: René + Claude (Design). +**Status:** KERN + Follow-ups Runde 1 umgesetzt, **Staging-Default AN seit 2026-06-06 (v1222)** — Gerätetest ausstehend; Production AUS bis Freigabe. +**Stand:** 2026-06-06. Autor: René + Claude (Design). -## Umsetzungsstand (2026-06-05) -**✅ Fertig + headless bewiesen:** +## Umsetzungsstand (2026-06-06, v1222 auf Staging) +**✅ Fertig + headless bewiesen (2026-06-05, v1213):** - `map-offline.js` (`window.MapOffline`): Region-Download (`downloadAround(lat,lon,radiusKm)`) → Vektorkacheln z0–14 via `pmtiles.getZxy` (liefert bereits dekomprimierte MVT) + Glyphs in **IndexedDB** (`by-offline-tiles`). `byt://`-MapLibre-Protokoll (IndexedDB-first, remote-Fallback). ~15 MB / 5 km (dekomprimiert). -- `map-gl-style.js` `build({offline})`: `byt`-Source statt `pmtiles://`. Flag `by_offline_tiles` (Default AUS). +- `map-gl-style.js` `build({offline})`: `byt`-Source statt `pmtiles://`. - ui.js/map.js laden map-offline + registrieren `byt`. `UI.loadMapLibreUI` exportiert. - Welten-FAB Segment 5: prüft im GL-Modus gespeicherte Region (nicht mehr OSM-Raster); „Fehlende nachladen" stößt `MapOffline.downloadAround(GPS, 5km)` an. - **Beweis:** Download 97 Tiles (5 km München) → Netz AUS → **1903 Features gerendert**, nicht geladene Gegend (Paris) leer; Glyphs nötig (sonst lässt MapLibre offline die ganze Kachel fallen). -**🔲 Offen (Follow-ups):** -- **Gerätetest (iOS-PWA offline/IndexedDB)** → dann Flag-Default auf Staging-AN (analog `by_map_gl`). -- Download-Button auf der **Karte** (`map-offline-btn`) im GL-Modus auf `downloadAround(Karten-Center)` umbiegen - (bisher OSM-Raster-Prefetch). +**✅ Follow-ups Runde 1 (2026-06-06, v1222):** +- **Flag-Default Staging-AN:** `by_offline_tiles` Default AN auf `staging.banyaro.app`, AUS sonst; + localStorage `1`/`0` bzw. `?tilesoffline=1/0` (boot.js) übersteuert. Default-Logik 3× synchron: + `map-gl-style.js _offlineEnabled()`, `offline-indicator.js _offlineTilesMode()`, `pages/map.js _offlineTilesEnabled()`. +- **Karten-Download-Button:** Speed-Dial „Karte offline speichern" (`map-offline-btn`, war seit FAB-Redesign + verwaist) — GL-Modus → `downloadAround(Kartenmitte, 5 km)` mit Fortschritt in der Statusbar (Kartenmitte + statt GPS: Urlaubsort vorab speicherbar); Leaflet-Modus → alter Raster-Prefetch (`_cacheTiles`). + Sichtbarkeit gated: GL ohne Offline-Flag (= Production) zeigt den Button nicht. +- **Glyph-Persistenz:** Glyphs in IndexedDB (Key-Präfix `f/` im Tiles-Store, kein Schema-Bump) + Protokoll + `byt://f/{fontstack}/{range}` (IndexedDB-first, remote-Fallback); Style nutzt offline die byt-Glyph-URL + → überlebt App-Updates (SW-Cache wird gepurged, IndexedDB nicht). +- **Raster-Prefetch gegated:** `offline-indicator.js init()` überspringt `_prefetchTiles()` im + Offline-Tiles-Modus (GL nutzt das OSM-Raster nicht). + +**🔲 Offen (Follow-ups Runde 2):** +- **Gerätetest (iOS-PWA offline/IndexedDB)** auf Staging — jetzt ohne Flag-Frickelei möglich (Default AN). + Danach: Prod-Freigabe-Entscheidung (Default-Hostnames erweitern analog `by_map_gl`). - **Adaptives Lernen** (rollendes Vorausladen beim Aufzeichnen + Funkloch-Gedächtnis). - **Bereichsauswahl / Routen-Korridor** (inkl. „Route offline speichern" aus routes.js `_openDetail`). -- **Glyph-Persistenz** über App-Updates (aktuell SW-Cache, wird bei Update gepurged) → in IndexedDB ablegen + via `byt://f/` servieren. -- Alten OSM-Raster-Prefetch (`offline-indicator.js _prefetchTiles`) entfernen, wenn Flag dauerhaft AN. +- Alten OSM-Raster-Prefetch (`offline-indicator.js _prefetchTiles` + `map.js _cacheTiles`) komplett + entfernen, wenn Flag dauerhaft AN (auch Prod). ## Ziel GL-Vektorkarten offline-tauglich machen — Kernszenario **Gassi/Wandern im Funkloch**. From e2c75f04bcfccbacaa71c47c348ab049c7014d08 Mon Sep 17 00:00:00 2001 From: rene Date: Sat, 6 Jun 2026 11:25:40 +0200 Subject: [PATCH 2/2] Offline-Karten: POI-Marker offlinetauglich + Offline-Banner klappt ein (Geraetetest-Befunde) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MapOffline.downloadAround speichert zusaetzlich /api/osm/pois je Typ fuer die Region-Bbox in IndexedDB (Key-Praefix p/, Merge per id — zweite Region loescht die erste nicht); MapOffline.pois(type,bbox) filtert fuer den Ausschnitt - map.js Phase-1-Fallback: Fetch fehlgeschlagen (offline) -> gespeicherte Region-POIs statt leerer Karte; Download-Toast zeigt Marker-Anzahl - Offline-Banner: nach 5s auf schmale Icon-Leiste eingeklappt (verdeckte die Karten-Legende); Inline-Styles nach components.css konsolidiert - Bump v1223 --- VERSION | 2 +- backend/static/css/components.css | 19 ++++++++-- backend/static/index.html | 33 +++++++--------- backend/static/js/app.js | 2 +- backend/static/js/boot.js | 8 ++++ backend/static/js/map-offline.js | 63 +++++++++++++++++++++++++++---- backend/static/js/pages/map.js | 12 +++++- backend/static/landing.html | 2 +- backend/static/sw.js | 2 +- 9 files changed, 106 insertions(+), 37 deletions(-) diff --git a/VERSION b/VERSION index 904b8f9..de697b5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1222 \ No newline at end of file +1223 \ No newline at end of file diff --git a/backend/static/css/components.css b/backend/static/css/components.css index 87dea9c..5b2a7dd 100644 --- a/backend/static/css/components.css +++ b/backend/static/css/components.css @@ -7294,14 +7294,25 @@ svg.empty-state-icon { left: 0; right: 0; z-index: 9999; - background: var(--c-text-secondary, #6b7280); - color: #fff; - font-size: var(--text-sm); + background: #1f2937; + color: #f3f4f6; + font-size: 0.78rem; + font-weight: 500; text-align: center; - padding: var(--space-2) var(--space-4); + padding: calc(env(safe-area-inset-top, 0px) + 7px) 16px 7px; + align-items: center; + justify-content: center; + gap: 8px; + box-shadow: 0 2px 8px rgba(0,0,0,.3); pointer-events: none; letter-spacing: 0.01em; } +/* Eingeklappt (5s nach Offline-Gang, boot.js): schmale Icon-Leiste statt 2-Zeilen-Banner — + das volle Banner verdeckte die Karten-Steuerung oben (Gerätetest iOS 2026-06-06). */ +#offline-banner.collapsed { + padding: calc(env(safe-area-inset-top, 0px) + 2px) 16px 2px; +} +#offline-banner.collapsed #offline-banner-text { display: none; } /* ------------------------------------------------------------ STREAK-WIDGET (Welcome-Seite) diff --git a/backend/static/index.html b/backend/static/index.html index 579e5c6..1663fcf 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -86,24 +86,19 @@ Ban Yaro - + - - - - - + + + + + - -