From 769f664896500fff0eb01010fe9719a3b6d8e371 Mon Sep 17 00:00:00 2001 From: 8tp <8tp@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:41:19 -0500 Subject: [PATCH] fix(pwa): stop bottom nav overlapping content on mobile scroll MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On iOS standalone PWAs a position:fixed bottom nav over a nested scroll container (
inside a height:100% shell) jumps and covers content as you scroll. Make the shell exactly one dynamic viewport tall (.app-shell = 100dvh, 100vh fallback, overflow hidden) and turn the bottom nav into a normal flex child (shrink-0) below the scroll area instead of position:fixed.
is now the only scroller and the nav is structurally pinned — no fixed-positioning quirks. Drops the 72px bottom reserve that the fixed nav needed. Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/web/src/components/layout/BottomNav.tsx | 8 +++++--- apps/web/src/components/layout/Layout.tsx | 6 +++--- apps/web/src/styles/globals.css | 11 +++++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/layout/BottomNav.tsx b/apps/web/src/components/layout/BottomNav.tsx index 476f478..aa5307c 100644 --- a/apps/web/src/components/layout/BottomNav.tsx +++ b/apps/web/src/components/layout/BottomNav.tsx @@ -6,14 +6,16 @@ import { useSettingsStore, selectAiEnabled } from '../../stores/settingsStore.js /** * Mobile bottom tab bar — the only navigation below md (the Sidebar is - * hidden there). Fixed to the bottom, 5 tabs, safe-area aware so it clears - * the iPhone home indicator when installed as a PWA. + * hidden there). A normal flex child at the bottom of the app shell (NOT + * position:fixed — that jumps and overlaps content over a nested scroller in + * iOS standalone PWAs), 5 tabs, safe-area aware so it clears the iPhone home + * indicator when installed as a PWA. */ export function BottomNav() { const aiEnabled = useSettingsStore(selectAiEnabled); return (