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({
>