fix(web): phone pane transition leaves no backdrop roots; idle warming order (train #1026) #1033

Closed
kayg wants to merge 0 commits from fix/phone-pane-backdrop-roots into dev
Owner

Fixes the real regressions train #1026 found on dev 4906cdb11 (from #1014, phone pane-to-pane transitions). Refs #1026.

Causes and fixes

  1. glass.spec.ts:76 (article.page.see-through in div.live.in: filter, div.float-glass..under in div.dock: opacity 0): .live and .plain rested at filter: blur(0), and the hidden list dock rested at opacity: 0; both are backdrop roots over glass. The resting filter is gone (the crossfade keyframes still animate it, and end). The hidden dock now rests below the window (bottom: -300px, as before) with no opacity; its pop fade-in is a keyframe dock-in that ends (flagged by a class set from the lazy card chunk, so the first-screen script does not grow).
  2. preload.spec.ts:89 + 4. lazy-offline.spec.ts:3: the phone note card (swipe-back chunk, asked for as soon as the stack is up) imported paperOf from lib/page-colour, which the splitter had placed in idle-screens, so the card fetched all of idle-screens before idle. The card now takes its colour from the editor's CSS (:is(.page, .pv)[data-paper=…] in editor.css): no import, no new chunk, no duplicated hues.
  3. lazy-ui.spec.ts:70 (SecurityError on cssRules): was a knock-on of the early idle-screens fetch (gone with 2). The spec's stylesheet reads also now skip a sheet that cannot be read.
  • Specs that pinned the old resting opacity (pane-transition, phone-foot) now check "below the window, no opacity"; the card-paper check reads data-paper.

Bisect: not needed; causes read from the #1014/pickers diff and confirmed by the specs.

Gates (dev-01, head of this PR)

  • The four specs, --repeat-each=5, chromium-390 + webkit-390: 75 passed, 0 failed.
  • Broad set (glass glass-roots lazy preload pane-transition phone swipe picker-lazy tasks-lazy), --workers=1:
    • chromium-390: 496 passed, 3 failed, 10 skipped. swipe-guard.spec.ts:112 and swipe-rows.spec.ts:437 fail the same on plain dev (3/3 on base, same binary), so not from this PR. phone-bars.spec.ts:113 "all, sky light dawn" failed once on first run, passes alone on this branch and on base (3 reruns each).
    • webkit-390: 495 passed, 2 failed (the same two swipe specs, which fail on dev in chromium; not rerun on dev in WebKit).
    • chromium-1440: 80 passed, 0 failed. webkit-1440: 79 passed, 0 failed.
  • perf/web.sh --bundle-only --gate: exit 0. first_js_brotli 221.685 KB (dev budget 222.01, first-screen budget 240), first_css_brotli 17.746 KB, total_js_brotli 496.261 KB (budget 506.34); no new chunk, no budget file change.
  • Not run: svelte-check, vitest (this PR changes no types or logic outside two small Svelte/CSS edits).

Frames (Mac VM, WebKit 390, 4 runs each, push + pop, light + dark)

The Mac VM is 60 Hz with a noisy floor (p50 17 ms; frames of 70 to 120 ms appear in both variants). Base and after are equal within that noise: base p95 24 to 76 ms, max 79 to 120; after p95 26 to 43, max 68 to 117; frames over 16.7 ms: base 36 to 43, after 34 to 47 of about 65. The 120 Hz budget (p95 <= 8.3 ms) cannot be judged on this VM; it needs a real 120 Hz device. Nothing in the motion changed: same transitions on translate/opacity of the screens; only the resting values of the dock and wrapper changed.

Before/after shots (light/dark, push mid-slide and pop) are in the comment below.

🤖 Generated with Claude Code

Fixes the real regressions train #1026 found on dev 4906cdb11 (from #1014, phone pane-to-pane transitions). Refs #1026. ## Causes and fixes 1. **glass.spec.ts:76** (`article.page.see-through in div.live.in: filter`, `div.float-glass..under in div.dock: opacity 0`): `.live` and `.plain` rested at `filter: blur(0)`, and the hidden list dock rested at `opacity: 0`; both are backdrop roots over glass. The resting `filter` is gone (the crossfade keyframes still animate it, and end). The hidden dock now rests below the window (`bottom: -300px`, as before) with no opacity; its pop fade-in is a keyframe `dock-in` that ends (flagged by a class set from the lazy card chunk, so the first-screen script does not grow). 2. **preload.spec.ts:89 + 4. lazy-offline.spec.ts:3**: the phone note card (`swipe-back` chunk, asked for as soon as the stack is up) imported `paperOf` from `lib/page-colour`, which the splitter had placed in `idle-screens`, so the card fetched all of idle-screens before idle. The card now takes its colour from the editor's CSS (`:is(.page, .pv)[data-paper=…]` in editor.css): no import, no new chunk, no duplicated hues. 3. **lazy-ui.spec.ts:70** (`SecurityError` on `cssRules`): was a knock-on of the early idle-screens fetch (gone with 2). The spec's stylesheet reads also now skip a sheet that cannot be read. - Specs that pinned the old resting opacity (`pane-transition`, `phone-foot`) now check "below the window, no opacity"; the card-paper check reads `data-paper`. Bisect: not needed; causes read from the #1014/pickers diff and confirmed by the specs. ## Gates (dev-01, head of this PR) - The four specs, `--repeat-each=5`, chromium-390 + webkit-390: **75 passed, 0 failed**. - Broad set (`glass glass-roots lazy preload pane-transition phone swipe picker-lazy tasks-lazy`), `--workers=1`: - chromium-390: 496 passed, 3 failed, 10 skipped. `swipe-guard.spec.ts:112` and `swipe-rows.spec.ts:437` fail the same on plain dev (3/3 on base, same binary), so not from this PR. `phone-bars.spec.ts:113` "all, sky light dawn" failed once on first run, passes alone on this branch and on base (3 reruns each). - webkit-390: 495 passed, 2 failed (the same two swipe specs, which fail on dev in chromium; not rerun on dev in WebKit). - chromium-1440: 80 passed, 0 failed. webkit-1440: 79 passed, 0 failed. - `perf/web.sh --bundle-only --gate`: exit 0. first_js_brotli 221.685 KB (dev budget 222.01, first-screen budget 240), first_css_brotli 17.746 KB, total_js_brotli 496.261 KB (budget 506.34); no new chunk, no budget file change. - Not run: svelte-check, vitest (this PR changes no types or logic outside two small Svelte/CSS edits). ## Frames (Mac VM, WebKit 390, 4 runs each, push + pop, light + dark) The Mac VM is 60 Hz with a noisy floor (p50 17 ms; frames of 70 to 120 ms appear in both variants). Base and after are equal within that noise: base p95 24 to 76 ms, max 79 to 120; after p95 26 to 43, max 68 to 117; frames over 16.7 ms: base 36 to 43, after 34 to 47 of about 65. The 120 Hz budget (p95 <= 8.3 ms) cannot be judged on this VM; it needs a real 120 Hz device. Nothing in the motion changed: same transitions on `translate`/`opacity` of the screens; only the resting values of the dock and wrapper changed. Before/after shots (light/dark, push mid-slide and pop) are in the comment below. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(web): the phone note card takes the page colour from the editor's CSS, so its lazy chunk no longer imports idle-screens; no extra chunk, no budget change (#1026)
Some checks are pending
CI / server (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
CI / web (pull_request) Waiting to run
Markdown extraction contract / markdown-native-contract (pull_request) Waiting to run
Markdown extraction contract / markdown-editor-contract (pull_request) Waiting to run
9c9be336f4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Before (dev) / after (this PR), phone 390, WebKit on the Mac VM, light and dark: pane push mid-slide, pop mid-slide, pop at rest (list bar back). Sample data only.

Before (dev) / after (this PR), phone 390, WebKit on the Mac VM, light and dark: pane push mid-slide, pop mid-slide, pop at rest (list bar back). Sample data only.
Author
Owner

Merged into dev locally (head 9c9be336f is in origin/dev); closing.

Merged into dev locally (head `9c9be336f` is in origin/dev); closing.
kayg closed this pull request 2026-11-09 18:55:12 +00:00
Some checks are pending
CI / server (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
CI / web (pull_request) Waiting to run
Markdown extraction contract / markdown-native-contract (pull_request) Waiting to run
Markdown extraction contract / markdown-editor-contract (pull_request) Waiting to run

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!1033
No description provided.