diff --git a/webui/src/components/thread/AgentActivityCluster.tsx b/webui/src/components/thread/AgentActivityCluster.tsx index 13e502d5c..fe821317f 100644 --- a/webui/src/components/thread/AgentActivityCluster.tsx +++ b/webui/src/components/thread/AgentActivityCluster.tsx @@ -307,7 +307,7 @@ export function AgentActivityCluster({ } if (!wasStreaming || userToggledOuter) return undefined; setCompletionHoldOpen(true); - const timeout = window.setTimeout(() => setCompletionHoldOpen(false), 900); + const timeout = window.setTimeout(() => setCompletionHoldOpen(false), 300); return () => window.clearTimeout(timeout); }, [isTurnStreaming, userToggledOuter]); diff --git a/webui/src/components/thread/ThreadComposer.tsx b/webui/src/components/thread/ThreadComposer.tsx index d930e7c7c..66de104e6 100644 --- a/webui/src/components/thread/ThreadComposer.tsx +++ b/webui/src/components/thread/ThreadComposer.tsx @@ -2226,7 +2226,7 @@ export function ThreadComposer({ role="alert" className={cn( "mx-3 mb-1 max-h-10 overflow-hidden rounded-md border border-destructive/40 bg-destructive/8 px-2.5 py-1", - "text-[11.5px] font-medium text-destructive transition-[max-height,margin,padding,opacity] duration-500 ease-out", + "text-[11.5px] font-medium text-destructive transition-[max-height,margin,padding,opacity] [transition-duration:220ms] ease-out motion-reduce:transition-none", voiceErrorFading && "mb-0 max-h-0 border-transparent py-0 opacity-0", )} > diff --git a/webui/src/components/thread/ThreadShell.tsx b/webui/src/components/thread/ThreadShell.tsx index cfca2096e..eccfba003 100644 --- a/webui/src/components/thread/ThreadShell.tsx +++ b/webui/src/components/thread/ThreadShell.tsx @@ -1455,7 +1455,7 @@ export function ThreadShell({ {t("thread.loadingConversation")} ) : ( -
+
); diff --git a/webui/src/components/thread/ThreadViewport.tsx b/webui/src/components/thread/ThreadViewport.tsx index df3c8214d..5c5c5c1bf 100644 --- a/webui/src/components/thread/ThreadViewport.tsx +++ b/webui/src/components/thread/ThreadViewport.tsx @@ -97,6 +97,11 @@ function isKeyboardEditableElement(element: Element | null): element is HTMLElem ].includes(element.type); } +function isThreadDisclosureTarget(target: EventTarget | null): boolean { + return target instanceof Element + && target.closest("[data-thread-disclosure]") !== null; +} + type ThreadScrollDirection = "backward" | "forward"; const KEYBOARD_SCROLL_DIRECTIONS: Readonly< @@ -572,7 +577,12 @@ export const ThreadViewport = forwardRef { - if (event.button === 0 && event.target === el) yieldCameraToUser(); + if ( + event.button === 0 + && (event.target === el || isThreadDisclosureTarget(event.target)) + ) { + yieldCameraToUser(); + } }; let lastTouchY: number | null = null; const handleTouchStart = (event: TouchEvent) => { @@ -600,6 +610,13 @@ export const ThreadViewport = forwardRef { if (wasStreamingRef.current && !streaming) { setJustCompleted(true); - const timeout = window.setTimeout(() => setJustCompleted(false), 650); + const timeout = window.setTimeout(() => setJustCompleted(false), 300); wasStreamingRef.current = streaming; return () => window.clearTimeout(timeout); } diff --git a/webui/src/components/thread/activity/ThinkingReasoningShell.tsx b/webui/src/components/thread/activity/ThinkingReasoningShell.tsx index 26666ee2d..7825cc0af 100644 --- a/webui/src/components/thread/activity/ThinkingReasoningShell.tsx +++ b/webui/src/components/thread/activity/ThinkingReasoningShell.tsx @@ -35,6 +35,7 @@ export function ThinkingReasoningShell({ >