diff --git a/ui/src/components/Screen.svelte b/ui/src/components/Screen.svelte index b7baf57..1fa31c0 100644 --- a/ui/src/components/Screen.svelte +++ b/ui/src/components/Screen.svelte @@ -101,9 +101,10 @@ bottom input — chat, word-check — stays above an open soft keyboard without the page scrolling; falls back to the full height where the var is unset. */ height: var(--vvh, 100%); - /* Clear the device safe-area cut-outs inside Telegram — the home indicator at the bottom and - the notch sides in landscape; all 0 elsewhere. The top inset is owned by the header. */ - padding-bottom: var(--tg-safe-bottom, 0px); + /* Clear the landscape notch sides inside Telegram (0 elsewhere). The top inset is owned by the + header; the home-indicator (bottom) inset is owned by the bottom bar — the .tabbar paints its + own chrome into it, and a screen with no tab bar pads its content (.content:last-child) — so + the strip takes the bar's colour rather than the detached content background. */ padding-left: var(--tg-safe-left, 0px); padding-right: var(--tg-safe-right, 0px); } @@ -121,7 +122,18 @@ display: flex; flex-direction: column; } + /* No tab bar → the content is the bottom-most element: pad it by the device home-indicator inset + so it clears the cut-out, the strip taking the content's own background. With a tab bar the + .tabbar owns that inset instead (and content is not the last child, so this does not apply). */ + .content:last-child { + padding-bottom: var(--tg-safe-bottom, 0px); + } .tabbar { flex: 0 0 auto; + /* Extend the bottom bar's chrome (the TabBar's --bg-elev) under the device home indicator + inside Telegram (the inset is 0 elsewhere), so the safe-area strip reads as part of the bar + instead of the content background showing through. */ + background: var(--bg-elev); + padding-bottom: var(--tg-safe-bottom, 0px); }