From da8f3e92a7bbc3b288f89f6b535b72b94c1d1c19 Mon Sep 17 00:00:00 2001 From: adamelmore <2363879+adamdottv@users.noreply.github.com> Date: Fri, 23 Jan 2026 23:18:54 -0600 Subject: perf(app): better session stream rendering --- packages/ui/src/hooks/create-auto-scroll.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'packages/ui/src/hooks') diff --git a/packages/ui/src/hooks/create-auto-scroll.tsx b/packages/ui/src/hooks/create-auto-scroll.tsx index 26cd06e88..c8c380cb8 100644 --- a/packages/ui/src/hooks/create-auto-scroll.tsx +++ b/packages/ui/src/hooks/create-auto-scroll.tsx @@ -15,7 +15,6 @@ export function createAutoScroll(options: AutoScrollOptions) { let settleTimer: ReturnType | undefined let autoTimer: ReturnType | undefined let cleanup: (() => void) | undefined - let resizeFrame: number | undefined let auto: { top: number; time: number } | undefined const threshold = () => options.bottomThreshold ?? 10 @@ -152,11 +151,10 @@ export function createAutoScroll(options: AutoScrollOptions) { () => { if (!active()) return if (store.userScrolled) return - if (resizeFrame !== undefined) return - resizeFrame = requestAnimationFrame(() => { - resizeFrame = undefined - scrollToBottom(false) - }) + // ResizeObserver fires after layout, before paint. + // Keep the bottom locked in the same frame to avoid visible + // "jump up then catch up" artifacts while streaming content. + scrollToBottom(false) }, ) @@ -190,7 +188,6 @@ export function createAutoScroll(options: AutoScrollOptions) { onCleanup(() => { if (settleTimer) clearTimeout(settleTimer) if (autoTimer) clearTimeout(autoTimer) - if (resizeFrame !== undefined) cancelAnimationFrame(resizeFrame) if (cleanup) cleanup() }) -- cgit v1.2.3