From 3bc926d766e3e31a456a7dc5dffd26a73c934411 Mon Sep 17 00:00:00 2001 From: Ulas Date: Mon, 13 Apr 2026 22:17:31 +0200 Subject: [PATCH] fix: iOS PWA bottom nav shifting up in standalone mode In iOS WebKit standalone (home screen) mode, position:fixed elements move with the page when the body itself becomes scrollable - unlike regular Safari where fixed elements stay pinned. The root cause was body having min-height: 100dvh without overflow: hidden, which allowed body scroll to occur when content overflowed. Fix: html and body are now overflow: hidden with fixed height (100% / 100dvh) so all scrolling is confined to .app-content. Service worker bumped to shell-v30 to force re-download of reset.css on installed PWAs. --- CHANGELOG.md | 6 ++++++ package.json | 2 +- public/styles/reset.css | 7 +++++-- public/sw.js | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f0e66..bffd972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.17.4] - 2026-04-13 + +### Fixed +- iOS PWA: bottom navigation no longer shifts upward in standalone mode - root cause was `body` having `min-height: 100dvh` and no `overflow: hidden`, which allowed the body to scroll; in iOS WebKit standalone mode, body scroll moves `position: fixed` elements rather than keeping them pinned; fix: `html` and `body` are now `overflow: hidden` with fixed height so all scrolling is confined to `.app-content` +- Service worker: cache bumped to `shell-v30` to ensure iOS devices receive the updated `reset.css` + ## [0.17.3] - 2026-04-13 ### Fixed diff --git a/package.json b/package.json index 7f202c8..7fb9723 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.17.3", + "version": "0.17.4", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", diff --git a/public/styles/reset.css b/public/styles/reset.css index 9400f1b..f255fbb 100644 --- a/public/styles/reset.css +++ b/public/styles/reset.css @@ -21,11 +21,14 @@ html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + /* iOS PWA: verhindert Body-Scroll, der position:fixed-Elemente verschiebt */ + height: 100%; + overflow: hidden; } body { - min-height: 100dvh; - overflow-x: hidden; + height: 100dvh; + overflow: hidden; } img, svg, video { diff --git a/public/sw.js b/public/sw.js index 65c0e20..0bec896 100644 --- a/public/sw.js +++ b/public/sw.js @@ -12,7 +12,7 @@ * API: Immer Netzwerk (kein Caching von Nutzerdaten) */ -const SHELL_CACHE = 'oikos-shell-v29'; +const SHELL_CACHE = 'oikos-shell-v30'; const PAGES_CACHE = 'oikos-pages-v28'; const ASSETS_CACHE = 'oikos-assets-v27'; const ALL_CACHES = [SHELL_CACHE, PAGES_CACHE, ASSETS_CACHE];