From e184ae55657cf432cd36c75397d24aea46cf14ce Mon Sep 17 00:00:00 2001 From: Steve Dudenhoeffer Date: Sun, 23 Aug 2026 03:02:50 -0400 Subject: [PATCH] Assistant: scroll the thread to a new reply for real MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scrollIntoView({ behavior: 'smooth' }) on the thread's nested scroller never moved it in Chrome — measured live: scrollTop stayed 0 after sending and after the reply, while the instant form scrolled to the end. A long conversation therefore showed its oldest messages after every turn, with the new reply out of view below. Instant it is. Co-Authored-By: Claude Fable 5 --- web/src/editor/AssistantTab.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/src/editor/AssistantTab.tsx b/web/src/editor/AssistantTab.tsx index d42faf5..42ce553 100644 --- a/web/src/editor/AssistantTab.tsx +++ b/web/src/editor/AssistantTab.tsx @@ -40,8 +40,12 @@ export function AssistantTab({ gardenId, canEdit, undo, large = false }: { garde // Deliberately NOT aborted on unmount: selecting a bed switches the rail to // the inspector, and that must not kill a turn mid-flight. The request runs // on; the exchange is persisted server-side; coming back shows it. + // Instant, not smooth: Chrome left the thread at the top with + // `behavior: 'smooth'` — a smooth scrollIntoView into this nested scroller + // never moved it, so every new reply landed out of view below a long + // conversation (found live, 2026-08-23). The instant form scrolls. useEffect(() => { - bottom.current?.scrollIntoView({ behavior: 'smooth', block: 'end' }) + bottom.current?.scrollIntoView({ block: 'end' }) }, [history.data, pending]) const send = () => {