agent pane: older turns fade in as they load above the reader (cx-2lv1k)
cx-2lv1k, Leo's paging addendum (1): "fade new rows in subtly at the top edge."
What changes
- When an older page lands above the reader (scroll-up paging, #20536), each of its rows fades from 35% to full ink over 180 ms the first time it comes into view. The anchor row stays put; only opacity changes, so there is no layout shift.
- Rows present when the chat opened, and live rows that stream in at the bottom, never fade.
- Reduce Motion draws older rows in full ink at once.
I tried three variants in Chromium: A 160 ms from 0, B 240 ms with a 40 ms stagger from 0, and C 180 ms from 35%. I picked C. A and B read as rows blinking in. With C, text is legible on the first frame and settles calmly.
Evidence
webviews/test/agent-pane-older-rows-fade.test.ts loads the real pane in Chromium with a long chat and scrolls up across a page boundary.
- Red at 69e8d815fe5bd: older rows draw at full ink at once.
- Green at 78584fe4d4f03, and again on the merged head on the private builder: the fade, older-rows paging, soft-edge and ui-rules tests pass, and
tscis clean.vp fmt --checkandvp lintare clean on the changed files. - After merging feat-cmux-next (e26f5faef1b7) into the branch: the fade test (2/2) passes and
tscis clean on 8998da8f7235.
In the app (cmux NEXT DEV builds, before and after)
Both builds come from the same tree: Before is feat-cmux-next at e26f5faef1b7, After is this PR's head 8998da8f7235 (that base merged in). Each opens the same imported 160-turn finished chat at its latest turn, presses Home to reach the top of the first page (the older page loads above with the reader's place held), then presses Page Up about once a second.
Light: the moment an older row comes into view.

Dark:

Paging up across the older page, light: I checked these frame by frame.

Full quality:
Dark:

Full quality:
Notes on the recordings:
- Shot on a shared capture Mac, where the window updated only a few times a second during these runs. The 180 ms fade therefore shows as two or three steps from 0.35 to full ink rather than a smooth ramp. The two sides scroll slightly different distances per key, so the same rows do not cross the top at the same instant.
- Paging is by keyboard. Synthesized wheel events do not reach the pane's web view on the capture Mac, so trackpad scrolling is not shown.
- The machine name in the composer's folder chip is masked.
Extra: Chromium renders of the page alone
These are Chromium renders of the agent pane page served by a stand-in daemon, made before the in-app captures above. Left: rows already settled. Right: 60 ms after an older page lands, still on its way to full ink.
Dark

Light

Scrolling up across two older pages (variant C): I watched this recording frame by frame.

Full quality:
Changelog
- Changed: older chat turns fade in gently as they load above you while scrolling up.
🤖 Generated with Claude Code