- Shipped
- August 28, 2026 at 3:45 AM UTC
- Author
- Kamo
- Commit
- aed599e
Switching conversations in the maximized view was an 8px nudge and a 180ms fade — close enough to nothing that the pane looked like it had simply repainted. It now reads as arriving somewhere: the incoming conversation comes up from 6% under size with a short rise and lands in the pane, opaque early so it is readable while it is still moving, on a curve that spends most of its travel up front and then settles. The shape is dictated by the z-stack rather than chosen. Clicking a navigator row focuses the new window, so the incoming is painted OVER the outgoing, and that decides both halves: - The incoming may grow INTO the pane but never past it. The maximized shell is a fixed element the size of the viewport and nothing here pins the document's overflow, so an arrival that overshoots 1 paints outside the viewport. - The outgoing holds full size and only fades. While the incoming is still under-scale it does not cover the pane and the outgoing is the only thing behind it, so shrinking that too would open a rim of backdrop around a MAXIMIZED window — a flicker, not depth. It is free to fade because the incoming is opaque over it long before it is gone. That coverage rule is arithmetic, not taste, so it is a test: the outgoing fade must outlast the incoming's. Two more pin the constraints that are invisible until they break — the arrival never scales past 1, and it finishes inside the swap phase, which retires the role and would otherwise retarget it mid-flight. Reduced motion keeps the plain crossfade. Incidentally fixes a smaller thing: the arrival used to be 200ms inside a 180ms phase, so it was handed the settle target 20ms before it finished.