Repository navigation
cmux NEXT composer: a Codex look of the same composer, two dots to switch (New Tab, and on hover in a chat) - #24367
Conversation
…in a chat Fails on feat-cmux-next: New Tab has no look dots and the chat composer has no data-composer-look switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o dots Leo: "first dot claude, second dot codex. since it's just all looks anyways. first 2 dots minimal on the new tab page, and then when you're in a chat you can also switch the dots if you hover on that bottom area". The composer has two looks (composerLook.ts), kept in localStorage. Claude's, the default, is the composer as it was. Codex's lays the same controls out as Codex desktop: one row in the box under the prompt (+ and the mode left; the ring, the model, the mic and Send right) and the folder strip a tray tucked under the box (composerLook.css). New Tab: the first two dots under the page are the looks (PageDots.tsx); with the style dots widget on, the other page styles follow them. In a chat the same two dots sit in the composer's bottom area (the quiet row's empty middle, or the band under the box) and show on hover (LookSwitch.tsx). StyleSwitch's dots are now DotSwitch over any options; StyleSwitch keeps its API. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 44fc3d3 to compare; do not merge until green; see lane-rules Tour of |
|
Found 38 test failures on Blacksmith runners: Failures
...and 28 more test failures. View all on Blacksmith: run 39821621358, run 39873433393, run 39821621761
|
|
Bead |
|
Review (codex gpt-6.1-sol): BLOCK at aa20d0e Blocking findings
Non-blocking findings
Checked the exact merge-base diff and whole changed TS/TSX/CSS/localization files, commit log, and git diff --check; no builds or test suites were run. |
…and Cards draws Codex's tray Fails at aa20d0e: Classic has no look dots of their own (picking Codex switched the page to Minimal) and draws no look; Cards with Codex's look drew its pill, not the tray. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… New Tab page Codex review of #24367 at aa20d0e: on Classic, picking Codex's dot switched the whole page to Minimal, and Classic drew no look. Now the page's dots are two groups in one row: the composer's looks (Claude, Codex), always marking the look and switching only it, then, with the style dots on, the page's styles as the style switch had them, Minimal among them. Classic (NewTabPage) draws Codex's look in its own box's row; Cards with Codex's look draws the chat composer's box with the strip as Codex's tray, not its pill. A cleared localStorage (StorageEvent key null) reloads the look. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
|
|
…aving Classic), not on a class Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The PR was past the size cap (about 1000 changed lines). This one keeps the look, the New Tab page's dots and every page drawing the look; the dots on hover in a chat's composer bottom area (LookSwitch.tsx, ComposerBox's bottom slot, their CSS, gallery stages and test) land in the next PR, stacked on this one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (codex gpt-6.1-sol): SHIP at f6052c8 There are no blocking findings. There are no non-blocking findings. I checked the exact base/head diff and all 15 changed files, including look-only switching, Classic and Cards rendering, localStorage and null-key storage events, CSS/build inclusion, localization, and the added tests; |
|
|
|
|
|
|
…'s bottom area Leo 2026-10-22: "and then when you're in a chat you can also switch the dots if you hover on that bottom area. e.g. there's space down here, and also dead space in codex's thing". The New Tab page's two look dots (manaflow-ai#24367) also sit in a chat composer's bottom area, unseen until the pointer is over it: with Claude's look in the quiet row's empty middle, with Codex's in the band under the box. They show at once and fade out (an exit, no entry); the Quick Composer has none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16588-d7e6-73f2-83cb-60263fe765ce&host=cosmic-gray
|
Review (Codex xhigh, re-pinned after base update): SHIP at 632549a
Agent session: cosmic-gray |
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39890924985 at da65a72 failed: cmux-next perf gate. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s bottom area (#24395) * test: the composer look dots (Claude, Codex) on New Tab and on hover in a chat Fails on feat-cmux-next: New Tab has no look dots and the chat composer has no data-composer-look switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT composer: a Codex look of the same composer, switched by two dots Leo: "first dot claude, second dot codex. since it's just all looks anyways. first 2 dots minimal on the new tab page, and then when you're in a chat you can also switch the dots if you hover on that bottom area". The composer has two looks (composerLook.ts), kept in localStorage. Claude's, the default, is the composer as it was. Codex's lays the same controls out as Codex desktop: one row in the box under the prompt (+ and the mode left; the ring, the model, the mic and Send right) and the folder strip a tray tucked under the box (composerLook.css). New Tab: the first two dots under the page are the looks (PageDots.tsx); with the style dots widget on, the other page styles follow them. In a chat the same two dots sit in the composer's bottom area (the quiet row's empty middle, or the band under the box) and show on hover (LookSwitch.tsx). StyleSwitch's dots are now DotSwitch over any options; StyleSwitch keeps its API. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * style: format the look dots with vp fmt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: the look dots switch the look only on Classic, which draws it, and Cards draws Codex's tray Fails at aa20d0e: Classic has no look dots of their own (picking Codex switched the page to Minimal) and draws no look; Cards with Codex's look drew its pill, not the tray. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT composer look: the look dots switch the look only, on every New Tab page Codex review of #24367 at aa20d0e: on Classic, picking Codex's dot switched the whole page to Minimal, and Classic drew no look. Now the page's dots are two groups in one row: the composer's looks (Claude, Codex), always marking the look and switching only it, then, with the style dots on, the page's styles as the style switch had them, Minimal among them. Classic (NewTabPage) draws Codex's look in its own box's row; Cards with Codex's look draws the chat composer's box with the strip as Codex's tray, not its pill. A cleared localStorage (StorageEvent key null) reloads the look. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: the Classic look test fails on the behaviour first (the page leaving Classic), not on a class Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * gallery: Classic and Cards New Tab with Codex's look Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT composer look: the in-chat look dots move to their own PR The PR was past the size cap (about 1000 changed lines). This one keeps the look, the New Tab page's dots and every page drawing the look; the dots on hover in a chat's composer bottom area (LookSwitch.tsx, ComposerBox's bottom slot, their CSS, gallery stages and test) land in the next PR, stacked on this one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT composer: the look dots in a chat, on hover in the composer's bottom area Leo 2026-10-22: "and then when you're in a chat you can also switch the dots if you hover on that bottom area. e.g. there's space down here, and also dead space in codex's thing". The New Tab page's two look dots (#24367) also sit in a chat composer's bottom area, unseen until the pointer is over it: with Claude's look in the quiet row's empty middle, with Codex's in the band under the box. They show at once and fade out (an exit, no entry); the Quick Composer has none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: the chat look dots switch by keys both ways and Escape goes back to the prompt (red) Codex review of #24395 at 2b7775c: ArrowRight on Claude's dot remounted the dots under the box and left the keyboard on BODY, so ArrowLeft and Escape did nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT composer: one set of look dots across a look change, so keys keep switching Codex review of #24395 at 2b7775c: switching the look by keys from the quiet row's dots unmounted them with the row and mounted new ones under the box, leaving the keyboard on BODY, so ArrowLeft and Escape did nothing. ComposerBox now draws the dots in one element after the box for both looks: with the quiet row it has no height and the dots ride over the row's empty middle, with Codex's look it is the band under the box. The radio keeps its focus, arrows go both ways, and Escape goes back to the prompt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: in shell mode Escape on a look dot goes back to the shell prompt (red) Codex review of #24395 at a3421d2: the dots always focused the Markdown field, which shell mode hides, so focus stayed on the dot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT composer: the look dots go back to the prompt that shows, the shell line in shell mode Codex review of #24395 at a3421d2: the dots' Escape and click always focused the Markdown field, which shell mode hides. One helper, focusPrompt, focuses the prompt that shows; the card press, the edit commands and the look dots all use it, so they cannot drift apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: arrow keys keep the keyboard on the look dots right after load and right after a click (red) Codex review of #24395 at b5bc94d: DotSwitch took a pick within 500 ms of the page's start, or of a pointer press, for a click, and sent the keyboard to the prompt after one arrow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT dots: tell a key's pick from a click by the event, never by a clock Codex review of #24395 at b5bc94d: DotSwitch called a pick a click when it came within 500 ms of the last pointer press, and performance.now() starts at 0, so for the page's first half second (or right after a click) an arrow key sent the keyboard to the prompt and the next arrow or Escape did nothing. The change now reads its own event: a pointer's click counts its presses (detail 1 or more), and the arrow keys' pick is a click of detail 0 or a plain change. The New Tab style dots share DotSwitch and get the same fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT dots: a pointer press on a dot, with no key since, also makes the pick a click A press-then-click that reaches the radio without a press count (a label forwarding it, or new-tab-style-switch's pointerdown + click()) stays a click. A key going down clears the press, so arrow keys after a click are keys. Still no clock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Shipped in:
|
…t its solid fill hides (#24457) The Codex look (#24367) gives the folder strip the solid composer surface but keeps the strip's backdrop-filter, so accent-glass-invariants finds opaque glass on agent-pane.composer-look/codex-new-chat and codex-new-chat-alt-text-row. The test is red on feat-cmux-next; a PR that changes the gallery's stage count sees it as its own red, because the test's name carries the count. An opaque fill shows none of the blur, so dropping it on an opaque window changes no pixel; over art or a see-through window the surface is glass and keeps it. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Leo <cheerleaderleo@outlook.com>
- webviews/src/experiments/registry.ts: kept both experiments (this branch's newTabHeadline, base's chromiumGlassUnderlay), import and list. - newtab/NewTabScreen.gallery.ts minimal-default: kept this branch's "no greeting" (waits for .nt-field, fails on .nt-greeting/.nt-headline) and base #24367's two composer look dots (PageDots, .nt-style): .nt-style leaves the "extra" list and the two-dot check stays. - schemas/settings-export/settings-schema.sources.sha256: provisional (this branch's side); the next commit replaces it and the exports with regenerate-settings-exports.sh output from the fleet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ComposerBox.tsx: base #24367 gave the box a Codex look (useQuietRow, the ring before the model in the box's row, a bottom slot); this branch removes Codex's bolt (FastToggle) from the box. Kept base's quietRow gating (useRowFit(bar, quietRow), {!quietRow && chips}, the ring for Codex's look) and this branch's removal of the speed state and SpeedToggleHost wrapper, so chips go in unwrapped (FastToggle.tsx stays deleted; nothing else imports it). - composerLocation.css, context ring: kept this branch's margin-inline-start: 0 and its comment (no 8 px margin on top of the button's inset), and noted #23785. Base #24138 raised the row's pill inset from 4 to 8 px, so the ring's glyph now sits 13 px after the effort, not 9. - test/composer-model-quiet.test.ts: the ring-gap bound follows #24138's inset (<= 14 px, was <= 10); the name and header comment say so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t the composer look dots composer-bottom-space.test.ts "New Tab stage with the template dots" failed on base in chromium and webkit (react-apps-check, run 39900669473): `.nt-style` resolved to 2 elements once #24367 gave the composer look dots (PageDots.tsx) the same class. The test waits for the "New Tab templates" group by role and measures the templates row (`.nt-style:not(.nt-look-dots)`), which is what it checked before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16a58-94be-7551-a374-38b3749fa191&host=huge-blue
…t the composer look dots composer-bottom-space.test.ts "New Tab stage with the template dots" failed on base in chromium and webkit (react-apps-check, run 39900669473): `.nt-style` resolved to 2 elements once #24367 gave the composer look dots (PageDots.tsx) the same class. The test waits for the "New Tab templates" group by role and measures the templates row (`.nt-style:not(.nt-look-dots)`), which is what it checked before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16a58-94be-7551-a374-38b3749fa191&host=huge-blue
…t the composer look dots (#24470) * test(webviews): the template-dots stage finds the templates group, not the composer look dots composer-bottom-space.test.ts "New Tab stage with the template dots" failed on base in chromium and webkit (react-apps-check, run 39900669473): `.nt-style` resolved to 2 elements once #24367 gave the composer look dots (PageDots.tsx) the same class. The test waits for the "New Tab templates" group by role and measures the templates row (`.nt-style:not(.nt-look-dots)`), which is what it checked before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16a58-94be-7551-a374-38b3749fa191&host=huge-blue * test(webviews): scope template dots selector to template group Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16a58-94be-7551-a374-38b3749fa191&host=huge-blue --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Leo Li <t@e>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
The composer gets a second look, Codex's, of the same one composer, picked with two dots: the first dot is Claude's look (today's composer, still the default), the second is Codex's. The two dots sit first under every New Tab page. Split for size: the same dots on hover in a chat's composer bottom area are #24395, stacked on this one.
Leo-ask: ask-5a69bb86d3
Leo-ask: ask-7fcf472bf8
Leo's words:
What changes
composerLook.ts,composerLook.css).claudeis the composer as it was: nothing in its drawing changes.codexlays out the same controls the way Codex desktop does. The box holds one row under the prompt, with + and the mode on the left and the context ring, the model and effort, the mic and Send on the right. On a new chat and on New Tab, the folder and computer strip becomes a tray tucked under the box's top edge.ComposerBox,ComposerandNewTabScreenread the look and setdata-composer-look="codex", so it stays one component with a layout attribute.newtab/PageDots.tsx). The first two dots under the page are the looks: Claude, then Codex. They show on every New Tab page; on Minimal with the style dots widget off (its default) they are the only dots: "first 2 dots minimal on the new tab page". A look dot switches the look only, in place, on every page style (this answers the Codex review at aa20d0e: on Classic it used to switch the whole page to Minimal). The dots are two groups in one row: the looks, always marking the current look, then, with the style dots on (always on the other styles), the page styles exactly as the style switch had them, Minimal among them, marking the page's style.NewTabScreen. Classic (NewTabPage, two lines:useComposerLookanddata-composer-look) lays out its box's row in Codex's order: the mode first, then the project and agent, and the model by Send. Cards with Codex's look draws the chat composer's box with the project strip as Codex's tray, instead of its pill.cmux.composer.look), shared across chats, panes and launches through thestorageevent, the way the transcript's wrap choice already works. AlocalStorage.clear()(a storage event with a null key) returns the look to the default. There was no existing setting for this.StyleSwitch's dots are nowDotSwitchover any option list.StyleSwitchkeeps its API and behaviour (its tests are unchanged and pass).Kept: our glass and colours. Full access takes the theme accent, never Codex's orange. Send stays our plain glyph with no disc. The two switcher dots are the only dots added, and there is no status dot. Not touched: what Claude's look draws, the model menu internals (#24224), the queue and the mode menu. No default flips: Claude's look stays the default.
Gallery
There is a new entry,
agent-pane.composer-look:claude-chat,codex-chat,codex-new-chat,newtab-claude,newtab-codex,newtab-classic-codexandnewtab-cards-codex. (claude-chat-dotsandcodex-chat-dotscome with #24395.) It also has two alternates for the Codex look:codex-new-chat-alt-plain-strip(Codex's row, with the strip left as plain text over the box) andcodex-new-chat-alt-text-row(the tray, with the row as quiet text and no mode glyph). Pick:codex-chat/codex-new-chat, the tray. It is closest to Codex's references, and the row keeps the mode's symbol, which Leo asked for on 10-21 ("(!) Full access").Before/after: https://cmux-lawrences-mac-mini.tail137216.ts.net:18796/compare/composer-look-codex-dot/?entry=agent-pane.composer-look.
agent-pane.new-tab#minimal-defaultnow shows the two dots and nothing else changes; its play now asserts exactly two dots.Evidence
test/composer-look-dots.test.ts(real Chromium on the gallery stage). Command:CMUX_BROWSER_TESTS=1 bun test test/composer-look-dots.test.ts, run on huge-blue..acpmux-newtab[data-composer-look="codex"]never shows..nt-above), with no.nt-toolbarpill and the model in the box. On Minimal, the pick setsdata-composer-look="codex"and survives a reload.new-tab-style-switch(3),new-tab-style-dots(2),new-tab-minimal-default(6),composer-claude-split(18),new-tab-widget-edit(5),new-tab-no-dots(1) andsuggestion-lists-float(3).popup-escape: "a 600x400 window sends the commands list past its edge" fails the same way on base 487876a (a base red). The other 4 pass.vp check(format, lint and type-aware lint over 2352 files) is clean at the head.check:system-blue,check:text-focus,check:layers,check:motion-scale,check:status-glyphs,check:dialog-keysandcheck:switch-fetchespass. There is no repeated key in the changed catalog.cmux-ci compile-check --ref f6052c8f474870c7d4e146a6f6ec610aa63acc2e --apppassed (job c191fd6d2300fbd13a05d760, 62 s).Observed / Not run
No capture: webview-only (agent pane web page); gallery entry agent-pane.composer-look.Overlap: #20598 (open, the New Tab style switch as a Debug Settings choice) touches the same dots; this PR keeps
StyleSwitch's API for it. #24314 also editsNewTabPage.tsxandNewTabScreen.tsx, in different hunks (an import and a hook near the top).Changelog
Agent session: cosmic-gray
🤖 Generated with Claude Code