Skip to content

fix(mobile): the status bar stays clear on iOS 27, and views run to the bottom edge - #85

Merged
adibhanna merged 1 commit into
mainfrom
fix/ios-overlay-1035
Nov 1, 2026
Merged

adibhanna merged 1 commit into
mainfrom
fix/ios-overlay-1035

Conversation

@adibhanna

Copy link
Copy Markdown
Contributor

Fixes ZenNotes/zennotes#1035. On iOS 27.2 in dark mode, a whitish band covered the status bar until the keyboard opened, and a blank strip sat under every view.

The band. It is iOS 27's top scroll edge effect on the web view. Apps built with the iOS 27 SDK get the new design whatever UIDesignRequiresCompatibility says, and the effect's blur shows the window behind the transparent page. That window was painted from the stored theme at boot, and with the theme on Auto the stored id is the variant picked in light. So a dark-mode launch painted the window white, and nothing repainted it until a keyboard opened.

The fix:

  • ZNViewController hides the web view's four edge effects. The page draws its own chrome and never scrolls the document, so they have nothing to mark. This alone clears the band, whatever the window's color.
  • The window color now follows the theme: watchThemeBackdrop() re-reads --z-bg when core changes the theme, so the area around the rounded keyboard matches too.
  • The bottom strip was the shell's own bottom padding. Views now run to the screen edge, and each view's main scroller ends with the home-indicator clearance, so its last line still scrolls clear. The Kanban board, side panels and Cloud's attention row keep their positions, and with the keyboard up the clearance is 0, as before.

The Android shell keeps its rules: the band needs UIKit's edge effects, and its Cloud status row owns the bottom inset there.

Validation:

  • An iOS 27.2 simulator reproduced the band pixel for pixel against the reporter's screenshot, and the fix removes it. The layout tests are updated. Notes are in docs/status-bar-overlay-validation-2026-11-01.md.
  • On a real iPhone 16 Pro Max (iOS 27.2), with a Debug build on a fresh launch in dark mode, Apple theme on Auto (stored variant light):
    • the status bar is the page color, rgb(28,28,30), with no band;
    • views run to the bottom edge;
    • a note's last line clears the home indicator.
  • Not yet checked on the device: the on-screen keyboard, which iPhone Mirroring never shows.

…he bottom edge

ZenNotes/zennotes#1035: on iOS 27.2 in dark mode a whitish band covered
the status bar until the keyboard opened, and a blank strip sat under
every view.

The band is the system's top scroll edge effect on the web view. Apps
built with the iOS 27 SDK get the new design whatever
UIDesignRequiresCompatibility says, so the WKWebView's scroll view carries
the effect, and its blur reaches past the transparent page into the
window behind it. That window's color is the keyboard backdrop's, set at
boot and on keyboardWillShow only. index.html's pre-boot theme takes the
stored themeId as is, and Auto keeps the id of the variant picked in
light, so a dark-mode launch painted the window white before core
resolved the theme to dark; nothing repainted it until a keyboard opened,
which is why the band went away then. On an iOS 27.2 simulator with Auto
and the Apple theme the band's pixels match the reporter's screenshot.

ZNViewController hides the web view's four edge effects: the page draws
its own chrome and never scrolls the document, so they have nothing to
mark, and this alone clears the band whatever the window's color. The
backdrop also follows the theme now: watchThemeBackdrop() re-reads --z-bg
when core changes the theme attributes on <html> or its managed styles in
<head>, once a frame, and sends a color only when it changed, so the
window around the rounded keyboard matches too.

The strip was the app shell's own bottom padding, 0.75rem plus the home
indicator. The shell no longer pads the bottom: views run under the
indicator to the screen edge, and each view's main scroller (a flex-1
overflow element) ends with that clearance as a spacer, so its last line
still scrolls clear. The editor already ends with core's padding. The
Kanban board pads itself so its columns stop where they did; side panels
and the note-list column pad themselves and add no spacer; with the
keyboard up the clearance is 0, as the padding was; and Cloud's attention
row, now the last thing in the shell, carries the clearance under its
44px so its action and the circle stay put.

The Android shell keeps its rules: the band needs UIKit's edge effects,
and its always-on Cloud status row owns the bottom inset there.

Verified on the simulator through the page, touch and lldb; the notes are
in docs/status-bar-overlay-validation-2026-11-01.md.
@adibhanna
adibhanna merged commit 15f9506 into main Nov 1, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[UI/Dark Mode] Whitish overlay at the top and unnecessary blank space at the bottom

1 participant