diff --git a/backend/static/css/design-system.css b/backend/static/css/design-system.css index 5b6f1e0..98898bb 100644 --- a/backend/static/css/design-system.css +++ b/backend/static/css/design-system.css @@ -206,7 +206,8 @@ body { line-height: var(--leading-normal); color: var(--c-text); background-color: var(--c-bg); - min-height: 100%; + height: 100%; + overflow: hidden; /* body nie scrollen — nur #page-content */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } diff --git a/backend/static/css/layout.css b/backend/static/css/layout.css index 33fde8e..48b669a 100644 --- a/backend/static/css/layout.css +++ b/backend/static/css/layout.css @@ -10,7 +10,8 @@ #app { display: flex; flex-direction: column; - min-height: 100dvh; /* dvh: berücksichtigt mobile Browser-Chrome */ + height: 100dvh; /* exakte Viewport-Höhe: body scrollt nie, nur #page-content */ + overflow: hidden; } /* Content-Bereich: füllt den Raum zwischen Header und Bottom-Nav */ @@ -19,12 +20,17 @@ overflow-y: auto; overflow-x: hidden; padding-bottom: calc(var(--nav-bottom-height) + var(--safe-bottom) + 16px); + /* -webkit-overflow-scrolling für iOS-Momentum-Scroll */ + -webkit-overflow-scrolling: touch; } -/* Desktop: Sidebar-Layout */ +/* Desktop: Sidebar-Layout — kein Bottom-Nav, natürliche Höhe */ @media (min-width: 768px) { #app { flex-direction: row; + height: auto; + min-height: 100dvh; + overflow: visible; } #page-content { padding-bottom: 0; diff --git a/backend/static/js/app.js b/backend/static/js/app.js index c457cd0..3d48808 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 = '498'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '499'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.0.0'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/gruender.js b/backend/static/js/pages/gruender.js index 8906057..e82fc3e 100644 --- a/backend/static/js/pages/gruender.js +++ b/backend/static/js/pages/gruender.js @@ -40,9 +40,10 @@ window.Page_gruender = (() => { const el = _container.querySelector('#grnd-content'); try { const d = await API.get('/api/partner/founders/stats'); + if (!d || typeof d.total === 'undefined') throw new Error('Ungültige Antwort vom Server.'); el.innerHTML = _renderStats(d); } catch (e) { - el.innerHTML = `

${e.message}

`; + el.innerHTML = `

${e.message || 'Fehler beim Laden.'}

`; } } diff --git a/backend/static/sw.js b/backend/static/sw.js index 0f44eb9..ed8efb1 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v521'; +const CACHE_VERSION = 'by-v522'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache