From 77b21333fb5a6300505a2eca230b66d7a1521606 Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Tue, 24 Mar 2026 02:27:06 -0700 Subject: [PATCH] fix(studio): restore scroll lock on reasoning panel collapse (#4545) PR #4543 removed useScrollLock from ReasoningRoot, causing the thread viewport to jump when a user collapses a reasoning panel. Restore the hook to freeze scrollTop during the 200ms collapse animation, matching the pattern used by tool-fallback.tsx and tool-group.tsx. --- .../frontend/src/components/assistant-ui/reasoning.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/studio/frontend/src/components/assistant-ui/reasoning.tsx b/studio/frontend/src/components/assistant-ui/reasoning.tsx index 157a08297a..0e37f6d433 100644 --- a/studio/frontend/src/components/assistant-ui/reasoning.tsx +++ b/studio/frontend/src/components/assistant-ui/reasoning.tsx @@ -17,6 +17,7 @@ import { type ReasoningGroupComponent, type ReasoningMessagePartComponent, useAuiState, + useScrollLock, } from "@assistant-ui/react"; import { copyToClipboard } from "@/lib/copy-to-clipboard"; import { Idea01Icon } from "@hugeicons/core-free-icons"; @@ -66,23 +67,29 @@ function ReasoningRoot({ children, ...props }: ReasoningRootProps) { + const collapsibleRef = useRef(null); const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen); + const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION); const isControlled = controlledOpen !== undefined; const isOpen = isControlled ? controlledOpen : uncontrolledOpen; const handleOpenChange = useCallback( (open: boolean) => { + if (!open) { + lockScroll(); + } if (!isControlled) { setUncontrolledOpen(open); } controlledOnOpenChange?.(open); }, - [isControlled, controlledOnOpenChange], + [lockScroll, isControlled, controlledOnOpenChange], ); return (