The drawer measures late content, keeps an app band visible, and gestures stop at its edge - #102
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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, andoverflow:hidden+flex-endclip 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: containalone 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.visualViewportresize joins the refit path.Gates: new
drawer-overflowscenario 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.