From aeabb134fd1072428cea9114ecf5a2472626c368 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Sun, 14 Jun 2026 22:02:34 +0200 Subject: [PATCH] fix(app): preserve anchors across large row measurements --- packages/app/src/pages/session/message-timeline.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index 2d78cf747dd..db1e3d09713 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -16,7 +16,7 @@ import { createStore, produce } from "solid-js/store" import { Dynamic } from "solid-js/web" import { useNavigate } from "@solidjs/router" import { useMutation } from "@tanstack/solid-query" -import { createVirtualizer, defaultRangeExtractor } from "@tanstack/solid-virtual" +import { createVirtualizer, defaultRangeExtractor, elementScroll } from "@tanstack/solid-virtual" import { Accordion } from "@opencode-ai/ui/accordion" import { Button } from "@opencode-ai/ui/button" import { Card } from "@opencode-ai/ui/card" @@ -468,12 +468,18 @@ export function MessageTimeline(props: { return reuseTimelineRows(previous, rows) }) const [toolOpen, setToolOpen] = createStore>({}) + let virtualContent: HTMLDivElement | undefined const virtualizer = createVirtualizer({ get count() { return timelineRows().length }, getScrollElement: () => listRoot() ?? null, estimateSize: () => timelineFallbackItemSize, + scrollToFn: (offset, options, instance) => { + // Expose the computed range before core writes an anchor correction so the browser does not clamp it to the old height. + if (virtualContent) virtualContent.style.height = `${instance.getTotalSize()}px` + elementScroll(offset, options, instance) + }, get getItemKey() { const rows = timelineRows() return (index: number) => { @@ -1579,6 +1585,7 @@ export function MessageTimeline(props: {
{ + virtualContent = element props.setContentRef(element) }} style={{