From e4ada9145f78937757f1db3f3eb83be4d0f5254f Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Mon, 6 Jul 2026 19:41:53 -0700 Subject: [PATCH] Transcript Incremental Projection Nucleic-Session: 0FFD007B-0696-4517-9429-129C7B0FD5AC Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/SessionDetailView.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift index 26b57fb..ba56965 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift @@ -664,7 +664,12 @@ struct TranscriptList: View { // they scroll away, which lets new content land off-screen below instead of dragging // the viewport, and restore `.bottom` once they're back at the end. .defaultScrollAnchor(isScrolledToBottom ? .bottom : nil) - .onScrollPhaseChange { _, newPhase in scrollPhase = newPhase } + .onScrollPhaseChange { _, newPhase in + scrollPhase = newPhase + // A real grab (drag displacement, not a mere touch-down) takes over from an + // in-flight programmatic jump: the user may scroll away again immediately. + if newPhase == .interacting { jumpingToBottom = false } + } // Track the live scroll position straight from the scroll view's geometry: how much // content still sits below the viewport bottom. Parked within the follow threshold // means live output keeps following; a *user* scroll past the (wider) unfollow