From 37a80ac9bdfbe05e51ccc9fa33f5a43cf5fbc384 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Mon, 6 Jul 2026 17:27:17 -0700 Subject: [PATCH] =?UTF-8?q?nvrsion:=20Add:=20Fix=20=E2=80=9Cjump=20to=20bo?= =?UTF-8?q?ttom=E2=80=9D=20chevron=20button=20visibility=20in=20iOS=20chat?= =?UTF-8?q?:=20it=20now=20appears=20on=20first=20scroll=20up,=20fixes=20re?= =?UTF-8?q?peated=20scrolling=20requirement.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nucleic-Promote: 1 Co-authored-by: Nucleic --- .../NucleicRemote/Views/SessionDetailView.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift index 8247caf..ae2ab37 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift @@ -556,6 +556,17 @@ struct TranscriptList: View { guard transcriptSettling, transcriptContentHeight > 0 else { return } try? await Task.sleep(for: .milliseconds(80)) if Task.isCancelled { return } + // Pin to the true bottom before opening the gate. The settling layout lands a + // hair off the bottom, so the passive `.defaultScrollAnchor` alone leaves the + // scroll geometry reading "not at bottom" — and that stale reading latches + // `onScrollGeometryChange`'s tracked value at `false` while the gate above holds + // `isScrolledToBottom` at `true`. Because the callback only fires on a *change*, + // the user's first real scroll-up (still `false`) then never fires it: the chevron + // never appears and live output keeps yanking the view to the bottom, until a + // down-then-up round-trip finally re-emits the change. An explicit pin nudges the + // offset the last hair, forcing a fresh "at bottom" emission that re-syncs the + // tracker with the gate. Mirrors the Mac's reveal pin. + scrollToEnd(proxy, animated: false) transcriptSettling = false } // Coalescing means item count lags event count; key the autoscroll on the raw stream