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