Skip to content

The drawer measures late content, keeps an app band visible, and gestures stop at its edge - #102

Merged
lannbot merged 1 commit into
mainfrom
fix/drawer-mobile-overflow
Aug 23, 2026
Merged

The drawer measures late content, keeps an app band visible, and gestures stop at its edge#102
lannbot merged 1 commit into
mainfrom
fix/drawer-mobile-overflow

Conversation

@lannbot

@lannbot lannbot commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Fixes the mobile report (storage sheet on Firefox): drawer half closed, drags scrolling the app underneath.

Half-closed drawer — a stale measure, reproduced with numbers: reveal() sized the inner to the sheet's skeleton (70px), the async fill grew it to 525px, and overflow:hidden + flex-end clip from the top — sheet box top measured at −454.8px. A per-presentation ResizeObserver retargets on late content; fixes the class (every async-filled sheet). It also retroactively explains solo-gdrive's "Playwright actionability quirk" workaround — Playwright was correctly refusing to click a clipped element. Workaround removed; that scenario now gates the fix with a real click.

App-reveal band — the height budget subtracts 48px so the open drawer always leaves a visible band of dimmed app: a drawer that covers everything is indistinguishable from a page that drew one, which is the confusion the visor exists to prevent. Taller sheets scroll internally.

Gestures stop at the visor's edge — measured finding: overscroll-behavior: contain alone does NOT stop the chaining, because it only ends a chain at an element with scroll range and most sheets fit (wheel over a short sheet or the dim moved the document 117px with contain declared everywhere). A non-passive JS backstop on the drawer and dim refuses whatever the sheet under the pointer cannot consume; CSS containment stays for native touch edge behavior on sheets that do scroll. visualViewport resize joins the refit path.

Gates: new drawer-overflow scenario at 390×664 (sheet top ≥ 0, radio really inside the drawer box, app band ≥ 40px, wheel scrolls the sheet and never the document, real .click() actionability); strip-geometry extended with the band; full e2e 22/22; invariants 9/9.

Before/after at 390×664: the before shows only the sheet's bottom two buttons (form clipped above the viewport); the after shows the full sheet, strip below it, app band at the bottom.

Known separate issue, not addressed here: the solo page does not boot under headless Playwright Firefox (pre-existing, opaque error during device setup) — reproduction and gating are Chromium; the fixes are engine-agnostic.

…ures stop at its edge

Three mobile findings, one report (mobile Firefox, the storage sheet).

THE HALF-CLOSED DRAWER was a stale measure: reveal() sized the inner to
the sheet's SKELETON (70px — two buttons) and the async fill (a status
plus us-storage round trip through the worker RPC) then grew the sheet
to 525px under overflow:hidden and justify-content:flex-end — which
clips from the TOP, so the user saw the bottom two buttons of a form
whose heading was 455px above the viewport. A per-presentation
ResizeObserver on the mounted sheet now retargets the reveal when
content arrives late, which fixes the class (every async-filled sheet),
not the instance. It is also why solo-gdrive needed an evaluate-click
'for a Playwright actionability quirk': Playwright was refusing to
click a genuinely clipped element, and was right. The workaround is
removed; the scenario now gates the fix with a real click.

THE APP-REVEAL BAND: the height budget now subtracts 48px, so the open
drawer always leaves a band of dimmed app surface visible. A drawer
allowed to cover the last of the app is indistinguishable from a page
that drew one — the exact confusion the visor exists to prevent — so
the boundary stays perceivable at every size and a taller sheet scrolls
internally instead of taking the band.

THE GESTURE STOPS AT THE VISOR'S EDGE: overscroll-behavior only ends a
chain at an element with scroll RANGE, and most sheets fit — measured
in Chromium, a wheel over a short sheet or over the dim moved the
document 117px with contain declared the whole way up. A non-passive
JS backstop on the drawer and the dim now refuses everything the sheet
under the pointer cannot consume; the CSS stays for the smooth native
edge behaviour on sheets that do scroll. visualViewport resize joins
the refit path (the URL bar and keyboard report there first on phones).

New e2e scenario drawer-overflow (390x664) gates all three claims plus
real-click actionability; strip-geometry gains the app-band assertion.
Full suite 22/22, invariants 9/9. Playwright-Firefox note: the solo
page does not boot under headless Firefox for reasons predating this
change — reproduction was Chromium; the fixes are engine-agnostic.
@lannbot
lannbot merged commit b198004 into main Aug 23, 2026
3 checks passed
@lannbot
lannbot deleted the fix/drawer-mobile-overflow branch August 23, 2026 18:38
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.

2 participants