Compare commits

..

10 commits

6 changed files with 52 additions and 52 deletions

View file

@ -2590,7 +2590,8 @@ html.modal-open {
.rk-layout { .rk-layout {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-height: 100dvh; height: 100%;
overflow: hidden;
background: var(--c-bg); background: var(--c-bg);
} }
.rk-header { .rk-header {

View file

@ -197,7 +197,6 @@ html {
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
scroll-behavior: smooth; scroll-behavior: smooth;
height: 100%; height: 100%;
overscroll-behavior: none; /* kein Window-Bounce auf iOS */
} }
body { body {
@ -208,7 +207,6 @@ body {
color: var(--c-text); color: var(--c-text);
background-color: var(--c-bg); background-color: var(--c-bg);
min-height: 100%; min-height: 100%;
overscroll-behavior: none;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }

View file

@ -10,44 +10,38 @@
#app { #app {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100dvh; /* dvh = dynamic viewport inkl. safe areas */ min-height: 100dvh;
overflow: hidden;
} }
/* Content-Bereich scrollt intern — kein padding-bottom nötig da Nav Flex-Kind */ /* Content-Bereich: füllt den Raum zwischen Header und Bottom-Nav */
#page-content { #page-content {
flex: 1; flex: 1;
min-height: 0; min-height: 0; /* iOS-Flex-Bug: ohne das scrollt body statt #page-content */
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
padding-bottom: calc(var(--nav-bottom-height) + var(--safe-bottom) + 16px);
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
overscroll-behavior-y: none;
} }
/* Vollbild-Seiten: #page-content kein Scroll */ /* Mobile only: iOS-Bounce verhindert dass fixed-Nav driftet */
body.page-fullscreen #page-content { @media (max-width: 767px) {
overflow: hidden; #page-content {
overscroll-behavior-y: none;
}
} }
/* Desktop: window-scroll, Sidebar-Layout */ /* Desktop: Sidebar-Layout — kein Bottom-Nav, natürliche Höhe */
@media (min-width: 768px) { @media (min-width: 768px) {
#app { #app {
height: auto;
min-height: 100dvh;
overflow: visible;
flex-direction: row; flex-direction: row;
} }
#page-content { #page-content {
flex: unset; min-height: unset;
min-height: unset; overflow-y: visible; /* nicht als Scroll-Container — Window scrollt */
overflow-y: visible; overflow-x: visible;
overflow-x: visible;
padding-bottom: 0; padding-bottom: 0;
padding-left: var(--nav-sidebar-width); padding-left: var(--nav-sidebar-width);
} }
body.page-fullscreen #page-content {
overflow: visible;
}
} }
/* ------------------------------------------------------------ /* ------------------------------------------------------------
@ -165,28 +159,40 @@ body.page-fullscreen #page-content {
position: relative; position: relative;
} }
/* Routen: window-scroll (kein overflow:hidden), padding entfernt */ /* Routen: volle Höhe damit .rk-layout height:100% auflöst und
das Grid intern scrollt (nicht die gesamte Seite via #page-content) */
#page-routes {
height: 100%;
overflow: hidden;
}
#page-routes > .page-body { #page-routes > .page-body {
padding: 0 !important; padding: 0 !important;
overflow: hidden;
height: 100%;
} }
/* ------------------------------------------------------------ /* ------------------------------------------------------------
3. BOTTOM NAVIGATION (Mobile) 3. BOTTOM NAVIGATION (Mobile)
------------------------------------------------------------ */ ------------------------------------------------------------ */
#bottom-nav { #bottom-nav {
/* Flex-Kind von #app{height:100dvh} kein position:fixed nötig. position: fixed;
100dvh auf iOS inkludiert Safe Areas Nav endet am physischen Rand. */ bottom: 0;
flex-shrink: 0; left: 0;
z-index: 700; right: 0;
min-height: calc(var(--nav-bottom-height) + var(--safe-bottom)); z-index: 700; /* über Leaflet-Panes (~400) */
/* GPU-Layer erzwingen → iOS Safari fixed-position Stabilität */
transform: translateZ(0);
-webkit-transform: translateZ(0);
will-change: transform;
min-height: calc(var(--nav-bottom-height) + var(--safe-bottom));
padding-top: var(--space-1); padding-top: var(--space-1);
padding-bottom: calc(var(--safe-bottom) + var(--space-1)); padding-bottom: calc(var(--safe-bottom) + var(--space-1));
background: var(--c-surface); background: var(--c-surface);
border-top: 1px solid var(--c-border-light); border-top: 1px solid var(--c-border-light);
display: flex; display: flex;
align-items: stretch; align-items: stretch;
box-shadow: 0 -2px 12px rgba(42, 31, 20, 0.08); box-shadow: 0 -2px 12px rgba(42, 31, 20, 0.08);
transition: border-top-color 0.4s ease; transition: border-top-color 0.4s ease;
} }
@keyframes nav-alert-pulse { @keyframes nav-alert-pulse {

View file

@ -88,9 +88,9 @@
</script> </script>
<!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung --> <!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung -->
<link rel="stylesheet" href="/css/design-system.css?v=500"> <link rel="stylesheet" href="/css/design-system.css?v=543">
<link rel="stylesheet" href="/css/layout.css?v=500"> <link rel="stylesheet" href="/css/layout.css?v=543">
<link rel="stylesheet" href="/css/components.css?v=500"> <link rel="stylesheet" href="/css/components.css?v=543">
</head> </head>
<body> <body>
@ -434,7 +434,7 @@
</main> </main>
<!-- MOBILE BOTTOM NAVIGATION — Flex-Kind von #app (height:100dvh) --> <!-- MOBILE BOTTOM NAVIGATION -->
<nav id="bottom-nav" role="navigation" aria-label="Hauptnavigation"> <nav id="bottom-nav" role="navigation" aria-label="Hauptnavigation">
<div class="nav-item" data-page="map"> <div class="nav-item" data-page="map">
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#map-trifold"></use></svg> <svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#map-trifold"></use></svg>

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung. Router, State-Management, Navigation, Initialisierung.
============================================================ */ ============================================================ */
const APP_VER = '511'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VER = '521'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.0.0'; // ← semantische Version, wird bei make release gesetzt const APP_VERSION = '1.0.0'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app'; const IS_STAGING = location.hostname === 'staging.banyaro.app';
@ -88,14 +88,9 @@ const App = (() => {
// ---------------------------------------------------------- // ----------------------------------------------------------
// ROUTER // ROUTER
// ---------------------------------------------------------- // ----------------------------------------------------------
const _FULLSCREEN_PAGES = new Set(['map', 'walks', 'sitting', 'chat']);
function navigate(pageId, pushHistory = true, params = {}) { function navigate(pageId, pushHistory = true, params = {}) {
if (!pages[pageId]) return; if (!pages[pageId]) return;
// Vollbild-Seiten benötigen window-scroll deaktiviert (iOS fixed-nav Fix)
document.body.classList.toggle('page-fullscreen', _FULLSCREEN_PAGES.has(pageId));
// Aktive Seite ausblenden // Aktive Seite ausblenden
document.querySelector('.page.active')?.classList.remove('active'); document.querySelector('.page.active')?.classList.remove('active');
document.querySelectorAll('.nav-item.active, .sidebar-item.active') document.querySelectorAll('.nav-item.active, .sidebar-item.active')

View file

@ -3,16 +3,16 @@
Offline-Cache + Push Notifications + Tile-Cache Offline-Cache + Push Notifications + Tile-Cache
============================================================ */ ============================================================ */
const CACHE_VERSION = 'by-v534'; const CACHE_VERSION = 'by-v544';
const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
// index.html wird NICHT pre-gecacht (immer Network-First) // index.html wird NICHT pre-gecacht (immer Network-First)
const STATIC_ASSETS = [ const STATIC_ASSETS = [
'/css/design-system.css?v=500', '/css/design-system.css?v=543',
'/css/layout.css?v=500', '/css/layout.css?v=543',
'/css/components.css?v=500', '/css/components.css?v=543',
'/icons/phosphor.svg', '/icons/phosphor.svg',
'/js/api.js', '/js/api.js',
'/js/ui.js', '/js/ui.js',