From c6e6b1c1c68add9c8cf92349a4f5cbefda4d76ed Mon Sep 17 00:00:00 2001 From: Marve10s Date: Mon, 30 Mar 2026 11:52:59 +0300 Subject: [PATCH 1/4] fix(web): add cursor-pointer to work log "Show more" button The raw + + {isExpanded ? "Show less" : `Show ${overflowEntries.length} more`} + )} )}
- {visibleEntries.map((workEntry) => ( + {hasOverflow && ( + +
+ {overflowEntries.map((workEntry) => ( + + ))} +
+
+ )} + {alwaysVisibleEntries.map((workEntry) => ( ))}
- + ); })()} From 8caccfb1423f27d21a2cd18a6752853377623f49 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Mon, 30 Mar 2026 12:10:03 +0300 Subject: [PATCH 3/4] fix(web): prevent auto-scroll when toggling work log expansion Expanding a work log group during a running session would trigger scheduleStickToBottom via the timelineEntries effect, yanking the viewport to the bottom. Disable auto-scroll on toggle so the user stays where they clicked; the scroll-to-bottom button is shown if they want to jump back. --- apps/web/src/components/ChatView.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index eaead424fb..ce9a321608 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -3434,12 +3434,18 @@ export default function ChatView({ threadId }: ChatViewProps) { } return false; }; - const onToggleWorkGroup = useCallback((groupId: string) => { - setExpandedWorkGroups((existing) => ({ - ...existing, - [groupId]: !existing[groupId], - })); - }, []); + const onToggleWorkGroup = useCallback( + (groupId: string) => { + cancelPendingStickToBottom(); + shouldAutoScrollRef.current = false; + setShowScrollToBottom(true); + setExpandedWorkGroups((existing) => ({ + ...existing, + [groupId]: !existing[groupId], + })); + }, + [cancelPendingStickToBottom], + ); const onExpandTimelineImage = useCallback((preview: ExpandedImagePreview) => { setExpandedImage(preview); }, []); From 3db43d01cd4103bd530fef5c7917172981da3388 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Mon, 6 Apr 2026 23:07:55 +0300 Subject: [PATCH 4/4] fix(web): stabilize work log expansion scroll --- apps/web/src/components/ChatView.tsx | 1 + .../components/chat/MessagesTimeline.test.tsx | 42 +++++++++++++++++++ .../src/components/chat/MessagesTimeline.tsx | 5 ++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index eb43ec2112..ebdc54076b 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -3978,6 +3978,7 @@ export default function ChatView({ threadId }: ChatViewProps) {
{ expect(markup).toContain("Context compacted"); expect(markup).toContain("Work log"); }); + + it("opts work log expansion controls out of scroll anchoring", async () => { + const { MessagesTimeline } = await import("./MessagesTimeline"); + const markup = renderToStaticMarkup( + ({ + id: `entry-${index + 1}`, + kind: "work" as const, + createdAt: "2026-03-17T19:12:28.000Z", + entry: { + id: `work-${index + 1}`, + createdAt: "2026-03-17T19:12:28.000Z", + label: `Tool call ${index + 1}`, + tone: "tool" as const, + }, + }))} + completionDividerBeforeEntryId={null} + completionSummary={null} + turnDiffSummaryByAssistantMessageId={new Map()} + nowIso="2026-03-17T19:12:30.000Z" + expandedWorkGroups={{}} + onToggleWorkGroup={() => {}} + onOpenTurnDiff={() => {}} + revertTurnCountByUserMessageId={new Map()} + onRevertUserMessage={() => {}} + isRevertingCheckpoint={false} + onImageExpand={() => {}} + markdownCwd={undefined} + resolvedTheme="light" + timestampFormat="locale" + workspaceRoot={undefined} + />, + ); + + expect(markup).toContain("Show 1 more"); + expect(markup).toContain("data-scroll-anchor-ignore"); + }); }); diff --git a/apps/web/src/components/chat/MessagesTimeline.tsx b/apps/web/src/components/chat/MessagesTimeline.tsx index f52044f483..2c2aab242e 100644 --- a/apps/web/src/components/chat/MessagesTimeline.tsx +++ b/apps/web/src/components/chat/MessagesTimeline.tsx @@ -340,7 +340,10 @@ export const MessagesTimeline = memo(function MessagesTimeline({ {groupLabel} ({groupedEntries.length})

{hasOverflow && ( - + {isExpanded ? "Show less" : `Show ${overflowEntries.length} more`} )}