Phone: document scrolling in a tab, no live blur on the frosted screens, solid top strip (#445) #528

Closed
kayg wants to merge 0 commits from issue/445-no-bleed-3 into dev
Owner

Refs #445, #476. Replaces #521 (rebased onto train/2026-10-17w: dev + #522 list chrome + #524). Not merged.

  • Phone list pages scroll the DOCUMENT in a browser tab, through the shared packages/ui/src/lib/scroll.ts adapter. #522's windowing (list-window, bodyTop) is kept; NoteList reads the window's scroll less where its rows start. The pills (TopPills, header sources) now ask the Scroller (document or box) instead of scrollTop.
  • The pills, their blur and the + button are position: fixed with no transformed, filtered, contained or will-change ancestor; a new list-chrome test walks the ancestors and fails on any. The strip (12px, edge colour) and the blur (starts at y=8) overlap, so there is no unblurred band from y=0 down past the pills (checked with a screenshot scrolled to 500).
  • No live blur on the frosted screens: photos and the sky are blurred once in script (soft-picture.ts, a small opaque copy) and the live layers are not painted under it. This removes the 28px blur that cost every scroll frame.
  • Backdrop technique unchanged: document-height clipped surface, a layer counter-scrolled on a root scroll timeline, touch WebKit 26.4+ only (scroll-link.ts), fixed elsewhere.

Tests (phone-bars, phone-edges, home-screen, safe-areas, pwa, glass, list-chrome; one project at a time): chromium-390 444 passed 2 failed; webkit-390 444 passed 2 failed; chromium-1440 8 passed; webkit-1440 6 passed. The 4 failures are safe-areas.spec.ts "app shell clears the insets, portrait light/dark" (theme-color rgb() vs oklab() string compare on a note); they fail the same on train/2026-10-17w itself, so they are not from this PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WCcFhwwgMK66k9LMVqogNJ

Refs #445, #476. Replaces #521 (rebased onto `train/2026-10-17w`: dev + #522 list chrome + #524). Not merged. - Phone list pages scroll the DOCUMENT in a browser tab, through the shared `packages/ui/src/lib/scroll.ts` adapter. #522's windowing (`list-window`, `bodyTop`) is kept; `NoteList` reads the window's scroll less where its rows start. The pills (`TopPills`, header sources) now ask the `Scroller` (document or box) instead of `scrollTop`. - The pills, their blur and the + button are `position: fixed` with no transformed, filtered, `contain`ed or will-change ancestor; a new list-chrome test walks the ancestors and fails on any. The strip (12px, edge colour) and the blur (starts at y=8) overlap, so there is no unblurred band from y=0 down past the pills (checked with a screenshot scrolled to 500). - No live blur on the frosted screens: photos and the sky are blurred once in script (`soft-picture.ts`, a small opaque copy) and the live layers are not painted under it. This removes the 28px blur that cost every scroll frame. - Backdrop technique unchanged: document-height clipped surface, a layer counter-scrolled on a root scroll timeline, touch WebKit 26.4+ only (`scroll-link.ts`), fixed elsewhere. Tests (phone-bars, phone-edges, home-screen, safe-areas, pwa, glass, list-chrome; one project at a time): chromium-390 444 passed 2 failed; webkit-390 444 passed 2 failed; chromium-1440 8 passed; webkit-1440 6 passed. The 4 failures are `safe-areas.spec.ts` "app shell clears the insets, portrait light/dark" (theme-color `rgb()` vs `oklab()` string compare on a note); they fail the same on `train/2026-10-17w` itself, so they are not from this PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01WCcFhwwgMK66k9LMVqogNJ
kayg added 22 commits 2026-10-17 09:59:39 +00:00
Doc scroll: the page's tint runs under the toolbar itself, so the floor adds none (#445)
Some checks failed
CI / server (pull_request) Successful in 41s
CI / rust (pull_request) Failing after 2m47s
CI / web (pull_request) Failing after 43m3s
eca5974b35
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Test: the contrast measurement sees the glass under the + button, not the button (#469, #511)
Some checks failed
CI / server (pull_request) Successful in 31s
CI / rust (pull_request) Successful in 2m29s
CI / web (pull_request) Failing after 23s
77aaaa0f34
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
E2E: sample opacity after backdrop settles (#442)
Some checks failed
CI / server (pull_request) Successful in 31s
CI / rust (pull_request) Failing after 2m38s
CI / web (pull_request) Failing after 41m44s
a2e841cce9
Pills and their blur stay on the window while the document scrolls (#445)
Some checks failed
CI / server (pull_request) Successful in 30s
CI / rust (pull_request) Successful in 2m39s
CI / web (pull_request) Failing after 23s
d8f3a5ae84
Author
Owner

Landed in train AA, #569.

Landed in train AA, #569.
kayg closed this pull request 2026-10-18 06:14:51 +00:00
Some checks failed
CI / server (pull_request) Successful in 30s
CI / rust (pull_request) Successful in 2m39s
CI / web (pull_request) Failing after 23s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal!528
No description provided.