diff --git a/VERSION b/VERSION index 95fa1c9..bcdab7e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1186 \ No newline at end of file +1187 \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index f30c1f6..201cb60 100644 --- a/backend/main.py +++ b/backend/main.py @@ -381,6 +381,12 @@ app.mount("/img", StaticFiles(directory=f"{STATIC_DIR}/img"), name="img") # (Range nativ, keine App-CPU) — siehe docs/TILE_SERVER_HANDOVER.md, Entscheidung #2. _TILES_DIR = os.getenv("TILES_DIR", "/data/tiles") +# Glyphs (Font-PBFs) für MapLibre-Labels — kleine Static-Files (kein Range nötig), +# liegen im data-Volume unter tiles/fonts/{fontstack}/{range}.pbf. +_FONTS_DIR = os.getenv("FONTS_DIR", os.path.join(_TILES_DIR, "fonts")) +if os.path.isdir(_FONTS_DIR): + app.mount("/fonts", StaticFiles(directory=_FONTS_DIR), name="fonts") + @app.api_route("/tiles/{filename}", methods=["GET", "HEAD"]) async def serve_tile(filename: str, request: Request): # Kein Path-Traversal diff --git a/backend/static/index.html b/backend/static/index.html index 5c65e72..c285f9b 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 53b1ef2..a8447a4 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 = '1186'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1187'; // ← 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/map-gl-style.js b/backend/static/js/map-gl-style.js index b4fe7d5..b9b4d92 100644 --- a/backend/static/js/map-gl-style.js +++ b/backend/static/js/map-gl-style.js @@ -13,20 +13,25 @@ bg: '#f4f1ec', land: '#dce8c8', park: '#c8e6b0', water: '#a0c8f0', road: '#ffffff', roadCasing: '#d9cfc2', building: '#e6ddcf', buildingLine: '#d4cabb', boundary: '#b08ac0', + label: '#33312e', roadLabel: '#6b6357', waterLabel: '#4a78a8', labelHalo: 'rgba(255,255,255,0.9)', }, dark: { bg: '#1a1d21', land: '#222820', park: '#27331f', water: '#16242e', road: '#3a4046', roadCasing: '#23282d', building: '#262b30', buildingLine: '#31373d', boundary: '#7d5a8c', + label: '#d6d9dd', roadLabel: '#9aa0a6', waterLabel: '#6fa0cc', labelHalo: 'rgba(0,0,0,0.8)', }, }; + var FONT = ['Open Sans Regular']; + // Liefert ein MapLibre-Style-JSON (Version 8) ohne glyphs/sprite. function build(opts) { opts = opts || {}; var t = THEMES[opts.dark ? 'dark' : 'light']; return { version: 8, + glyphs: window.location.origin + '/fonts/{fontstack}/{range}.pbf', sources: { by: { type: 'vector', url: 'pmtiles://' + tilesUrl() }, }, @@ -52,6 +57,33 @@ paint: { 'fill-color': t.building, 'fill-outline-color': t.buildingLine } }, { id: 'boundary', type: 'line', source: 'by', 'source-layer': 'boundary', paint: { 'line-color': t.boundary, 'line-dasharray': [2, 2], 'line-width': 1 } }, + + // ---- Labels (brauchen glyphs) ---- + { id: 'water-labels', type: 'symbol', source: 'by', 'source-layer': 'water_name', + layout: { + 'text-field': ['coalesce', ['get', 'name:de'], ['get', 'name']], + 'text-font': FONT, 'text-size': 12, 'text-max-width': 6, + }, + paint: { 'text-color': t.waterLabel, 'text-halo-color': t.labelHalo, 'text-halo-width': 1.2 } }, + + { id: 'street-labels', type: 'symbol', source: 'by', 'source-layer': 'transportation_name', + minzoom: 14, + layout: { + 'text-field': ['coalesce', ['get', 'name:de'], ['get', 'name']], + 'text-font': FONT, 'symbol-placement': 'line', 'text-size': 11, + }, + paint: { 'text-color': t.roadLabel, 'text-halo-color': t.labelHalo, 'text-halo-width': 1.2 } }, + + // Ortsnamen (Städte/Dörfer) — wichtig für Orientierung, auch bei kleinem Zoom. + { id: 'place-labels', type: 'symbol', source: 'by', 'source-layer': 'place', + filter: ['in', ['get', 'class'], ['literal', ['city', 'town', 'village', 'suburb', 'hamlet', 'neighbourhood']]], + layout: { + 'text-field': ['coalesce', ['get', 'name:de'], ['get', 'name']], + 'text-font': FONT, 'text-max-width': 8, 'text-anchor': 'center', + 'text-size': ['interpolate', ['linear'], ['zoom'], + 4, 10, 8, 12, 12, 14, 16, 17], + }, + paint: { 'text-color': t.label, 'text-halo-color': t.labelHalo, 'text-halo-width': 1.6 } }, ], }; } diff --git a/backend/static/js/pages/map.js b/backend/static/js/pages/map.js index 8e693fa..8dc7f9d 100644 --- a/backend/static/js/pages/map.js +++ b/backend/static/js/pages/map.js @@ -756,7 +756,6 @@ window.Page_map = (() => { // Pinch bleibt in der Karte (verhindert iOS-Page-Zoom), ohne globales user-scalable=no. el.style.touchAction = 'none'; _map.addControl(new maplibregl.NavigationControl({ showCompass: false }), 'top-left'); - _map.addControl(new maplibregl.ScaleControl()); _map.addControl(new maplibregl.AttributionControl({ compact: true, customAttribution: '© OpenStreetMap contributors', })); diff --git a/backend/static/landing.html b/backend/static/landing.html index 85bac3f..59f327e 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 393ee97..66e353a 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 = '1186'; +const VER = '1187'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten