From 6545e2af2980eab6565c49458e630ce670c1e01a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Feb 2026 10:15:12 +0000 Subject: [PATCH] fix: disable smooth scroll on initial chat load The chat viewer was using smooth scrolling for all followOutput events, including when first loading the message list. This caused a slow, animated scroll towards the latest messages on initial load. Fix by tracking whether initial render is complete and only enabling smooth scrolling for subsequent followOutput events (new incoming messages). The ref is reset when switching between conversations. https://claude.ai/code/session_0174r1Ddh5e2RuhHf2ZrFiNc --- src/components/ChatViewer.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/components/ChatViewer.tsx b/src/components/ChatViewer.tsx index efd7d23..2b55d12 100644 --- a/src/components/ChatViewer.tsx +++ b/src/components/ChatViewer.tsx @@ -608,6 +608,11 @@ export function ChatViewer({ }; }, [adapter, conversation]); + // Reset initial scroll flag when conversation changes + useEffect(() => { + isInitialScrollDone.current = false; + }, [conversation?.id]); + // Load messages for this conversation (reactive) const messages = use$( () => (conversation ? adapter.loadMessages(conversation) : undefined), @@ -674,6 +679,9 @@ export function ChatViewer({ // Ref to Virtuoso for programmatic scrolling const virtuosoRef = useRef(null); + // Track if initial scroll has completed (to avoid smooth scroll on first load) + const isInitialScrollDone = useRef(false); + // State for send in progress (prevents double-sends) const [isSending, setIsSending] = useState(false); @@ -1076,7 +1084,14 @@ export function ChatViewer({ ref={virtuosoRef} data={messagesWithMarkers} initialTopMostItemIndex={messagesWithMarkers.length - 1} - followOutput="smooth" + followOutput={() => { + // Skip smooth scroll on initial load to avoid slow scroll animation + if (!isInitialScrollDone.current) { + isInitialScrollDone.current = true; + return false; + } + return "smooth"; + }} alignToBottom components={{ Header: () =>