From a9e2bbe80eb95c8c9689b5d3f1ac7f155be28a90 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Mon, 6 Jul 2026 19:33:25 -0700 Subject: [PATCH] Transcript Incremental Projection Nucleic-Session: 0FFD007B-0696-4517-9429-129C7B0FD5AC Co-authored-by: Nucleic --- .../NucleicRemote/Views/SessionDetailView.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift index 2afc6f8..0a866ab 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift @@ -707,11 +707,15 @@ struct TranscriptList: View { // user is already parked there. Scrolling up to read history is never yanked down, // and a finger actively on the transcript is never fought mid-drag (the drag that // takes them past the unfollow threshold flips the gate; until then the native - // bottom anchor alone keeps content pinned, without an animated scroll grabbing the - // viewport back out of their hand). + // bottom anchor alone keeps content pinned, without a scroll grabbing the viewport + // back out of their hand). Never animated: while pinned, the bottom anchor provides + // the visual continuity and this call only closes the last few points — but a + // session still *opening* keeps receiving history merges (cached transcript, + // reconnect backfill) after the settle window closes, and animating those rode the + // viewport visibly down through the whole transcript instead of landing at the end. .onChange(of: events.count) { if isScrolledToBottom, !isUserScrolling { - scrollToEnd(proxy, animated: !transcriptSettling) + scrollToEnd(proxy, animated: false) } } // An explicit jump — the chevron or sending a message — always wins, and it *is* the