fix(chat): keep the outgoing conversation still until the next one replaces it

Switching sessions moved the conversation on screen before the swap: the
composer and the status chip followed the live selection and re-shaped a
commit ahead of the timeline, so the pinned outgoing chat jumped; and the
reveal effect re-ran for the outgoing session when its waited flag flipped,
hiding it a few frames before the next one mounted. The chat column now
reads one deferred session, and the reveal runs once per opened session.
This commit is contained in:
Bohdan Triapitsyn
2026-08-30 16:54:41 +03:00
parent 02b1ee637d
commit 654b3d2441
5 changed files with 61 additions and 6 deletions
+8
View File
@@ -464,6 +464,14 @@ the user waited for fades in (100ms); one that was ready appears in the same
frame. The sidebar prefetches the two rows on either side of the open session
shortly after it settles, so most neighbouring switches are warm.
The column changes as one. The composer and the status chip above it read
the session the timeline shows (`components/chat/chatColumnSession.ts`), not
the live selection: read live, they re-shaped a commit ahead of the swap
(a taller draft, chips, a working chip) and the outgoing timeline, pinned to
its end, jumped before it was replaced. The reveal effect below runs once per
gate for the same reason — `revealWaited` flips for the outgoing session at
the click, and re-running on it hid that timeline before the next one mounted.
The timeline's first paint for a session is atomic. `ChatContainer` owns a
`TimelineRevealGate` per session key (`components/chat/timelineRevealGate.ts`):
a markdown renderer whose first paint is provisional (blocks not yet in the