feat(chat-thread): user-message minimap in place of the jump pill + copy message next to timestamp - #3829
Merged
Merged
Conversation
The floating "jump to your message" pill only ever offered the single anchored turn, and only once it had scrolled off. Replace it with a small rail hugging the scroll container's top-right: one tick per user message, width scaled by message length, current turn highlighted. Hovering or keyboard-focusing the rail opens the full list, anchored to the rail's own corner so it expands in place under the pointer. Rows ticker-scroll their text on hover rather than clipping it, and picking one scrolls the thread and stays open for the next hop. Built on quill's DropdownMenu (Base UI), so roving focus, typeahead and Escape come with it. Both bodies render it: the windowed body passes its own jump and anchor (the engine's reach only mounted rows). ThreadStickyHeader and the now unused `offscreen` anchor flag are deleted. The thread reserves CHAT_CONTENT_GUTTER on both sides of its scroll content so rows stay clear of the rail at any panel width, and turn rows drop their extra px now that the gutter provides it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BYPVPkN4Lm3gygchrpcoqr
|
😎 Merged successfully - details. |
|
React Doctor found 1 issue in 1 file · 1 warning. 1 warning
Reviewed by React Doctor for commit |
Contributor
|
Reviews (1): Last reviewed commit: "feat(chat-thread): user-message minimap ..." | Re-trigger Greptile |
Hover delay 120ms -> 50ms, close delay 80ms -> 30ms. The list opens over the rail, so there is no pointer travel a long close delay needs to protect; both linger read as lag. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BYPVPkN4Lm3gygchrpcoqr
jonathanlab
approved these changes
Jul 27, 2026
adamleithp
enabled auto-merge (squash)
July 27, 2026 13:33
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Replaces the floating "jump to your message" pill with a minimap of the user's turns, parked at the scroll container's top-right.
sideOffset=-anchor.height) so it expands in place, under the pointer, with no gap to cross. Opens scrolled to the current turn.OverflowTickerText, same as sidebar items). Clicking scrolls the thread and leaves the list open for the next hop.onJumpandanchorId, since the scroller engine only reaches mounted rows.Built on quill's
DropdownMenu(Base UI), so roving focus, typeahead, Escape andaria-haspopup/expandedcome for free. The trigger carriesaria-label="Jump to one of your N messages"; ticks arearia-hidden.Gutter
The rail hugs the scroll container, not the message column, so the thread reserves
CHAT_CONTENT_GUTTERon both sides of its scroll content (mirrored, so the column stays centred). Rows clear the rail at any panel width; turn rows drop their extrapxnow that the gutter provides it.Removed
ThreadStickyHeader.tsx(both pill variants) and theoffscreenflag on the virtualized anchor state, which only existed to time the pill's appearance.Testing
pnpm --filter @posthog/ui typecheckand the full UI suite (2162 tests) pass. Driven in the running app over CDP: rail renders with the right tick count, hover opens the list, clicking a row scrolls the thread and keeps the list open, Escape closes it, and rows stay clear of the rail down to a 600px-wide panel. The windowed path was exercised by temporarily lowering the virtualization threshold — rail, list and anchor highlight all render there; the jump itself couldn't be observed because that session was mid-stream and auto-follow re-pins the viewport (same for the pill it replaces).🤖 Generated with Claude Code
https://claude.ai/code/session_01BYPVPkN4Lm3gygchrpcoqr