Repository navigation
Agent chat: the composer keeps a thin scrollbar while its draft overflows - #23854
Conversation
… on every frame (red) Fills the prompt past its eight lines and reads the scrollbar lane after every painted frame and the drawn thumb through typing, a 2.5 s idle, blur, focus and the pointer leaving, in Chromium and WebKit; then cuts the draft back and expects no scrollbar. Fails on base: the prompt has the engine's own scroller (a 15 px classic bar or an overlay that hides at rest). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
…lows The prompt (.acpmux-md-field) had the engine's own scroller, which WebKit shows while the field scrolls and fades out a moment later, so it flashed on every line typed. It now carries the minimal scroller (MINIMAL_SCROLLER_ATTRIBUTE / MINIMAL_SCROLLER_CSS in webviews/src/scrollers.ts, installed with the other shared scroller rules): a thin thumb in --cmux-scroller-thumb on no track, drawn the whole time the draft overflows, its track inset from the card's rounded corners. A draft that fits has no scrollbar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc7-79b0-b869-8ac78b0edd90&host=cosmic-gray
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. |
|
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)
Gallery before/after for
States
Pick other states with a Probably yours: CI failed on
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: Tour of |
|
Found 17 test failures on Blacksmith runners: Failures
...and 7 more test failures. View all on Blacksmith: run 39713019329, run 39713019369
|
|
Bead |
|
Owned by orphan-sweep on air-blue · session |
…er-persistent-scrollbar
…ft never rewraps The minimal scroller is a classic WebKit scrollbar, which takes layout width. When a draft first overflowed, its lane appeared and the text rewrapped (composer-draft-wrap at 300 px: 8 lines became 9, the caret left the view). The minimal scroller now keeps its lane (scrollbar-gutter: stable) and the composer takes it out of its right padding, in both looks, so the draft keeps base's width whether or not it overflows. The lane stays empty while the draft fits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=Air-Blue
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. |
|
Review (subagent, correctness first): SHIP at ee2217d Independent review subagent (fresh context, read-only) at the exact head. No correctness findings. Non-blocking follow-ups, not fixed here:
Fleet compile-check at this head: passed (job 5471b4b64609c29da955208c). |
…croll (WebKit ignores scrollbar-gutter) composer-draft-wrap still failed in WebKit at 300 px after the gutter fix: WebKit ignores scrollbar-gutter on a box with a custom ::-webkit-scrollbar (measured with Playwright WebKit 26.5: client width 215 px while the content fits, 207 px once it overflows), so the lane still appeared on overflow and the draft rewrapped. overflow-y: scroll reserves it in both engines; the track is transparent and a box with nothing to scroll draws no thumb (0 thumb pixels fitting, 76 overflowing, in WebKit and Chromium). scrollers.ts is the scrollbar guard's allowed home for this rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=Air-Blue
|
Review (subagent, correctness first): SHIP at e762574 Independent review subagent (fresh context, read-only) at the exact head. No correctness findings. What changed since the SHIP at ee2217d: GitHub update-branch merges of feat-cmux-next (9735061, 05f3595; base only, PR diff unchanged), and e762574, which reserves the composer's thin scrollbar lane with Non-blocking follow-ups, not fixed here:
Fleet compile-check at this head: passed (job 5d15e498461abc5d4d66aa7a). Reds at this head that also fail on base 80d19e4: gallery health |
|
Shipped in:
|
…ws, even under the scrollbar fade (#32112) * test(composer): the draft's thumb stays at rest under the scrollbar fade too Leo-ask: ask-c8936f0e52 Agent-Session: https://cmux.com/deeplink/agent?id=aid-591ebe5be3c52ce16103 * cmux NEXT composer: the scrollbar fade passes the composer by; its thumb stays while the draft overflows Leo 2026-10-21: "STOP HIDING THEN SHOWING THEN HIDING THE SCROLLBAR. IF THERE ARE THINGS TO SCROLL, JUST KEEP THE SCROLLBAR IN THE COMPOSER, LIKE CLAUDE DOES." #23854 built that, but the agent pane's scrollbar fade (on by default since 2026-10-23) also faded the composer's thumb at rest. The fade now covers the transcript only. Leo-ask: ask-c8936f0e52 Agent-Session: https://cmux.com/deeplink/agent?id=aid-591ebe5be3c52ce16103 * Composer: the minimal scroller sets its own thumb ink Leo-ask: c-c8936f0e52 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-591ebe5be3c52ce16103 --------- 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)
Leo, 2026-10-21: "STOP HIDING THEN SHOWING THEN HIDING THE SCROLLBAR. IF THERE ARE THINGS TO SCROLL, JUST KEEP THE SCROLLBAR IN THE COMPOSER, LIKE CLAUDE DOES."
The agent chat's prompt (
.acpmux-md-field) scrolled with the engine's own scroller. WebKit's overlay scroller shows while the field scrolls and fades out a moment later, so a long draft's scrollbar flashed on every line typed and went away when you stopped.Now the prompt has the shared minimal scroller:
MINIMAL_SCROLLER_ATTRIBUTE(data-cmux-minimal-scroller) andMINIMAL_SCROLLER_CSSinwebviews/src/scrollers.ts, installed with the other shared scroller rules byinstallScrollers. It draws a thin thumb (--cmux-scroller-size,--cmux-scroller-thumb) with no track, the whole time the content overflows. Typing, focus, hover and resize never fade it. Its track stops--cmux-minimal-scroller-insetshort of each end, clear of the card's rounded corners. A draft that fits has no scrollbar (overflow: auto). The style uses theme tokens only.This is the smallest fix, the composer only. The transcript and the sidebar move to the same style, and an opt-in auto-hide variant gets added, in follow-ups (chat-load and sidebar-rows lanes). Other code can opt in by putting the attribute on its scroll container.
Base merge and the reserved lane (orphan-sweep, head ee2217d)
After one merge of feat-cmux-next,
composer-draft-wrap.test.tsfailed in WebKit at 300 px: the minimal scroller is a classic WebKit scrollbar, so when a draft first overflowed its 8 px lane took layout width and the text rewrapped (8 lines became 9, and the caret left the view). The minimal scroller now reserves its lane (scrollbar-gutter: stable), and the agent composer takes that lane out of its right padding in both looks, so the draft keeps base's width whether or not it overflows. The lane stays empty while the draft fits. The Home composer (pages/home-channels/styles.css) uses the same field and does not adjust its padding, so its text area is 8 px narrower than before.Test
webviews/test/composer-persistent-scrollbar.test.ts, in Chromium (scrollbars on) and WebKit. It pastes past the prompt's eight lines, then reads the scrollbar lane after every painted frame (cmuxAfterPaint) and samples the drawn thumb through typing, a 2.5 s idle, blur, focus and the pointer leaving. Every frame must have a thin lane (1 to 10 px) and every sample a thumb with no track. Then it cuts the draft back to one line and expects no scrollbar on any frame.cmux-ci run --class light --script scripts/ci/run-webviews-tests.sh --env CMUX_BROWSER_TESTS=1 --env CMUX_WEB_TEST_FILES=test/composer-persistent-scrollbar.test.tsObserved / Not run
cmux-ci compile-check --apppassed on the head.scripts/web-lint.shandprepush-gate.pyran locally. The web lint's only reds come from the sparse worktree (noPackages/, nocmux-tui/, no generated strings), and the same checks are red on base in that checkout. None of them is in a changed file.Changelog
Agent session: cosmic-gray
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes the agent chat composer so a long draft keeps a thin scrollbar visible while it overflows, instead of flashing it on each line typed and fading out at rest.
The prompt (
.acpmux-md-field) now uses the shared minimal scroller (MINIMAL_SCROLLER_ATTRIBUTE/MINIMAL_SCROLLER_CSSinwebviews/src/scrollers.ts), which draws a thin thumb on no track the whole time content overflows, clear of the rounded corners.overflow-y: scroll— WebKit ignoresscrollbar-gutteron a box with a custom scrollbar — and is taken out of the composer's right padding, so drafts keep their width and never rewrap when the scrollbar appears or disappears. The Home composer uses the same field without this adjustment, so its text area is 8 px narrower.Written for commit e762574. Summary will update on new commits.