cmux-next agent pane: the thread minimap spans the transcript's height
The thread minimap now spans the transcript's full height. Leo liked how smooth the rail is, but said it "feels short": it covered a small, centered part of the pane and showed only a few ticks. The whole scroll height now maps onto a rail as tall as the transcript.
What it does
- Marks at their place: every prompt and every reply is drawn where it sits in the chat. Prompts are longer, brighter ticks and tab stops. Replies are shorter, dimmer and set in by 4 px. Replies a few px apart merge, so a 2,000-turn chat stays bounded.
- The view bar: a faint bar shows what's on screen. It moves by transform on the scroll's own frame, with no React render.
- Hover: marks near the pointer grow (a fisheye by px distance), and the nearest message opens the existing preview card after the hover delay. A prompt's card has its bookmark; a reply's card shows the reply's start.
- Jumping: clicking a prompt jumps the way the compact rail does (lands, settles, flashes the bubble). Clicking a reply scrolls to it. Clicking empty track centers the view there. Dragging anywhere scrubs.
- Keyboard: Tab, arrow keys and Home/End walk the prompts; Return or Space jumps; Escape closes the card.
- Old rail kept as an option: Codex's compact rail stays as the
compactarm of the newthread-minimap-layoutexperiment. To switch, setcmux.experimentsto{"thread-minimap-layout":"compact"}.fullis the default. - Shared card: the preview card moved into
PreviewCard.tsx, which both rails now use.
Claude Code desktop has no transcript minimap as far as I know, so this follows the Codex rail's motion and goes further on coverage.
Proof
Gallery agent-pane.thread-minimap now has an experiment compare view showing full and compact side by side, and its variants play in both arms.
Tests
test/thread-scroll-map.test.tscovers the model: placement, merging, the view bar, seek and hit testing.- The compact rail's existing tests pin the compact arm.
Observed / Not run
- Not run locally: no test, lint or type check. Leo's Mac (cosmic-gray) is under the load rule and its git is frozen, so CI is the first run.
- Only the formatter ran, in the commit hook.
Changelog
- Changed: The chat's thread minimap spans the whole transcript, with a tick for every prompt and reply, a bar for the view, click or drag to jump, and a preview on hover.
Agent session: cosmic-gray
š¤ Generated with Claude Code
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
The thread minimap now spans the full height of the transcript instead of sitting as a small centered rail. Every prompt and reply draws at its place in the chat, with a view bar that follows the scroll, hover previews, and click or drag to jump.
- Prompts render as longer, brighter ticks and tab stops; replies as shorter, dimmer ones that merge when close together so long chats stay bounded. Marks are keyed by row id, so they stay on the same message when replies merge or older turns arrive above.
- Hovering near a mark grows it (fisheye) and previews the nearest message; clicking a prompt lands, settles, and flashes the bubble like the compact rail.
- The compact Codex rail stays available as the
compactarm of the newthread-minimap-layoutexperiment;fullis the default and{"thread-minimap-layout":"compact"}opts out. - The preview card moved into a shared
PreviewCard.tsxused by both rails. - New
thread-scroll-map.test.tscovers the map's model inmapGeometry.ts; the compact rail's existing tests now pin that arm.