Repository navigation
Fix prompt rail pane anchoring and narrow-width access - #26641
Conversation
The Chromium pane-close regression fails against 22a2728: the rail follows the centered column instead of the pane edge. Also cover compression, hover-strip reveal, card alignment and keyboard access. Agent-Session: https://cmux.com/deeplink/agent?id=aid-c2793b771c663431e8c4
Detach the rail and preview from the inspector chat translation. Reuse pane resize measurements and an inspector layout event to compress against the actual text gutter. Read spacing tokens for the edge inset. An always-mounted edge strip and keyboard focus reveal the rail over text; a one-shot 120ms leave grace is cancelled on reentry and unmount. No observer or frame loop added. Chromium: 11 pass, including frame alignment and narrow click/scrub/wheel/card access. Web lint/type/protocol checks pass; unit checks pass. Localization verification is unchanged base debt. Agent-Session: https://cmux.com/deeplink/agent?id=aid-c2793b771c663431e8c4
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Bead |
…-origin-1028 # Conflicts: # webviews/src/agent-session/acpmux/threadMinimap/ThreadMinimap.tsx
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: Gallery before/after for
States
Pick other states with a |
|
Found 9 test failures on Blacksmith runners: Failures
|
|
Orphaned: no activity for 15 h, and no lane holds a lease on it. The orphan sweep could not merge |
|
Owned by an agent session · session |
Resolve against #27192's exploratory inset gallery: the pane-edge placement here replaces those plays, so the gallery keeps this PR's resting/hovered/focused variants and the exploratory inset test goes with them. Keep the flushSync band render (9439a80) and Session Info's useUnderInspector. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-636fd2e0ce24b82d1b3d
|
Owned by an agent session · session |
…p overlap Review at 7ff8959 found three blockers: - useRailPlacement measured in a layout effect that ran before the ancestor scroller's ref attached, so a same-width remount never subscribed to the shell's layout event. A passive effect now measures again and subscribes. - A click on an occluded rail's tick kept focus there, which held the rail and its card over the text after the pointer left. The leave grace now blurs focus a click gave (not :focus-visible) and closes the card. - The full-height map lost its gutter cutoff and lay over text with live click and drag handlers. It now shows only where its box overlaps the text by at most 8 px, measured from the compact rail's placement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-636fd2e0ce24b82d1b3d
…dencies Clears the two react-hooks/exhaustive-deps warnings that failed web lint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The occluded rail hid after a hard-coded 120 ms. It now waits HOVER_INTENT.cardGrace, hides at once under Reduce Motion or while the page is hidden, and a hidden page clears a pending timer (design/session-rail.md, Settled position and gutter). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check:switch-fetches refuses page visibility listeners in the agent page. The leave grace already reads document.hidden when it is scheduled, and the one-shot timer only hides the rail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ars its grace Review findings at d83de16: the occluded rail hover strip spanned the hidden rail width over the transcript text, taking its clicks, links and selection drags; it now ends at the text edge and keeps at least the pane-edge inset. A page that hides mid-grace clears the leave timer and settles the rail hidden (allow-listed in check-switch-fetches: reads no data). The narrow tests follow the shared HOVER_INTENT.cardGrace and assert the strip stops at the text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the strip keeps the rail Review findings at 89876bb: a page hide during the leave grace cleared the timer but left the card intended, so a later strip hover brought back a stale card; and a tick blur while the pointer rested on the strip hid the rail with no new pointer enter to reveal it. The visibility handler now dismisses the card too, and the grace keeps the rail while the pointer is on the strip. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (independent Codex gpt-6-astra, high, fast; correctness first): SHIP at 879e108 Earlier rounds at d83de16 and 89876bb returned BLOCK; their four findings (leave grace running after a page hide, the occluded strip covering the text edge, a stale card after a page hide, a blur hiding the rail under a resting pointer) are fixed in d83de16..879e108 and confirmed resolved at this head. Nit noted: the removed inset-variants unit test; browser tests cover the shipped narrow states. |
|
Shipped in:
|
|
Shipped in:
|
Resolved on top of the rewritten latency harness (#26554): the rail hover case uses its inputEvent (pointerover) in place of the hover flag, and its server-ready match keeps the ANSI-stripped, cross-chunk banner match. ThreadMinimap header comment keeps #26641 left-edge wording with the same-frame card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ool output cap) (#28256) * test(webviews): follow the pane-edge prompt rail in two stale tests #26641 pinned the prompt rail to the pane's left edge and made its leave grace skip under Reduce Motion. Two tests still assumed the old placement and timing: - thread-minimap-narrow: the file runs with Reduce Motion on, so the strip's revealed rail hides at once instead of after HOVER_INTENT.cardGrace. The grace case now turns motion on, and a new case covers the immediate hide under Reduce Motion. - transcript-follow: the touch tap at the pane's left edge (x + 12) now lands on a rail tick, which jumps to that prompt and unmounts the streaming row. The tap now lands on a reply's text, checked to be off the rail. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(webviews): scale the tool output viewport cap with transcript text size #26696 capped every [data-output-viewport] at a fixed calc(8 * 18px + 16px). At larger chat text sizes that box holds fewer than eight lines, and transcript-content-font fails ("eight scaled lines remain in the preview", 160 < 288 at 28px). The cap is now eight 18/14-scaled lines plus padding, which is still 160px at the 14px default. Not 8lh: the Markdown viewport sets no line-height of its own, so its lh would be the inherited normal line-height and the Markdown preview would shrink below its base height (Codex review of #28135). Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Pin the prompt rail to the pane’s left edge when a right pane closes, the transcript recenters, or Session Info shifts the chat. The rail gets a token-based 8–16 px inset and compresses before it covers text. When space is exhausted, a live edge strip and keyboard focus reveal the usable rail; leaving the rail and preview hides it again. The preview remains flush with the rail’s right edge.
#25800 made the rail and its portaled preview inherit the transcript’s animated inspector shift. Remove that coupling, measure pane width through the existing resize observer, and refresh overlap placement on scoped chat-layout changes. No new observer or per-frame layout work is added.
Leo, October 28:
Lawrence, relayed by Leo:
Leo’s placement clarification:
Leo’s updated narrow-width requirement:
The gallery covers wide, compressed, occluded, hovered, and focused states using the actual component. The reference is the supplied pane-edge padding crop; private reference images are not published. Existing tick style, colors, click behavior, and full minimap mode are preserved.
Validation:
22a2728ed33eabb65eef1493a227d738a2d2f372(7 failures).Risk: compressed rail hit testing and pointer travel to the preview. Chromium exercises both. The leave grace is the shared hover-intent grace (
HOVER_INTENT.cardGrace, 200 ms, off the motion scale): one-shot, cancelled on re-entry or focus, skipped under Reduce Motion or on a hidden page, and cleared on unmount and on a page hide (which also closes the card). While the rail is hidden, its hover strip ends at the text edge (never under the text), so text clicks, links and selection drags stay the text's. The scoped layout listener and the visibility listener (allow-listed in check-switch-fetches: reads no data) are removed by effect cleanup. Existing resize observer cleanup is unchanged.Takeover (2026-10-29): the original lane stalled; this lane brought the branch up to date with its base, fixed web lint (memoized rail measure), and addressed two independent review rounds. Leo, 2026-10-29: "but how about fixing up the left side scroll rail thing (moving it to the left, giving it faster scrttoll/hover over) and being able to scroll it?" This PR is the moving-it-left part; scroll speed and wheel scrolling are on #27858 and #26520.
Browser captures of the actual app entry, using a synthetic transcript (before
22a2728, after6828f3f). The vertical height difference comes from the separately landed rail-height change.Takes back #25800: it made the rail and its preview card follow Session Info's chat shift; the settled spec (design/session-rail.md, "Settled position and gutter") pins the rail to the pane's left edge instead, so this PR removes that shared translate.
Takes back #27192: its gallery-only inset variants (and their unit test) were exploratory placements for the pending railPlacement/useRailPlacement seam; this PR is that seam, and the gallery entry now shows the shipped wide, compressed, hidden, hovered and focused states.
Performance
No perf numbers: this PR moves and compresses the rail; it adds no per-token or per-row work, no observer and no frame loop (the placement reuses the existing resize measurement and a scoped layout event). Rail scroll and hover speed are #27858.
Agent session: agent session