Skip to content

cmux NEXT composer: a Codex look of the same composer, two dots to switch (New Tab, and on hover in a chat) - #24367

Merged
teamleaderleo merged 9 commits into
feat-cmux-nextfrom
composer-look-codex-dot
Oct 23, 2026
Merged

teamleaderleo merged 9 commits into
feat-cmux-nextfrom
composer-look-codex-dot

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

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:

  • "lawrence likes the codex way i think we can have as option... the composer looks"
  • "this is the codex composer. i guess we could make the alternative composer like codex. 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. e.g. there's space down here, and also dead space in codex's thing"
  • (part) "we can have the alt composer like chatgpt styled but for now just have "minimal" be the claude thing"

What changes

  • One composer, two looks (composerLook.ts, composerLook.css). claude is the composer as it was: nothing in its drawing changes. codex lays 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, Composer and NewTabScreen read the look and set data-composer-look="codex", so it stays one component with a layout attribute.
  • New Tab dots (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.
  • Every New Tab page draws the look. Minimal, Default, Composer, Threads and Console through NewTabScreen. Classic (NewTabPage, two lines: useComposerLook and data-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.
  • The choice persists in localStorage (cmux.composer.look), shared across chats, panes and launches through the storage event, the way the transcript's wrap choice already works. A localStorage.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 now DotSwitch over any option list. StyleSwitch keeps 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-codex and newtab-cards-codex. (claude-chat-dots and codex-chat-dots come 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) and codex-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-default now 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.
    • The New Tab test was committed first (5323986). It failed on that commit because New Tab had no look dots.
    • The Classic and Cards test was committed before its fix (9e8cf4f). Run against aa20d0e's code it fails (1 pass, 1 fail): picking Codex on Classic leaves Classic, so .acpmux-newtab[data-composer-look="codex"] never shows.
    • At the head: 2 pass, 0 fail (14 expects). On Classic, the Codex dot keeps the page Classic, with Classic's style dot still marked and Minimal still offered. The box takes Codex's look, which also holds after a reload. Cards draws the tray (.nt-above), with no .nt-toolbar pill and the model in the box. On Minimal, the pick sets data-composer-look="codex" and survives a reload.
  • These still pass at the head: 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) and suggestion-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-keys and check:switch-fetches pass. There is no repeated key in the changed catalog.
  • cmux-ci compile-check --ref f6052c8f474870c7d4e146a6f6ec610aa63acc2e --app passed (job c191fd6d2300fbd13a05d760, 62 s).

Observed / Not run

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 edits NewTabPage.tsx and NewTabScreen.tsx, in different hunks (an import and a hook near the top).

Changelog

  • Added: A Codex look for the composer, picked with the first two dots on any New Tab page. Claude's look stays the default.

Agent session: cosmic-gray

🤖 Generated with Claude Code

teamleaderleo and others added 3 commits October 22, 2026 01:58
…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>
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 632549a: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr24367 -f ref=composer-look-codex-dot -f platform=macos -f backend_mode=local

Gallery before/after for 632549a: 16 states rendered, 6 images differ, 1596 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 39821621304 -R manaflow-ai/cmux -n gallery-advisory-24367-632549a203419aedd1dd95f2d1a54b3898d14ec5 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/standard Apple System Colors unchanged 0% own App.tsx
agent-pane.chat-width/wide Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/wide Apple System Colors unchanged 0% own App.tsx
agent-pane.chat-width/wide-blocks Apple System Colors Light unchanged 0% own App.tsx
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% own App.tsx
agent-pane.composer/new-chat Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/new-chat Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/side-session Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/side-session Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-suggest-open Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-suggest-open Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-suggest-failing Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-suggest-failing Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-suggest-draft Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-suggest-draft Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-reasoning Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/new-chat-reasoning Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/agent-home Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/agent-home Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/agent-home-path Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/agent-home-path Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer-floats/scrolled-to-end Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-floats/scrolled-to-end Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-floats/composer-grown Apple System Colors Light unchanged 0% own App.tsx
agent-pane.composer-floats/composer-grown Apple System Colors unchanged 0% own App.tsx
agent-pane.composer-look/claude-chat Apple System Colors Light new 0% own composerLook.gallery.ts
agent-pane.composer-look/claude-chat Apple System Colors new 0% own composerLook.gallery.ts
agent-pane.composer-look/codex-chat Apple System Colors Light new 0% own composerLook.gallery.ts
agent-pane.composer-look/codex-chat Apple System Colors new 0% own composerLook.gallery.ts
agent-pane.composer-look/codex-new-chat Apple System Colors Light new 0% own composerLook.gallery.ts
agent-pane.composer-look/codex-new-chat Apple System Colors new 0% own composerLook.gallery.ts

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Probably yours: accent-glass-invariants.test.ts fails here but not on main's latest full suite. Seen on other PRs too (likely flaky): agent-pane-no-capsules.test.ts, agent-pane-peer-chat.test.ts, composer-edges.test.ts and 4 more.

CI failed on 632549a203 (run 39873433393 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-check (4) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • new in this PR accent-glass-invariants.test.ts no orange or system accent and no opaque glass on 1785 gallery stages: failed (job)
  • seen on other PRs agent-pane-no-capsules.test.ts agent pane page > rounds its controls as small-radius rects, not capsules: failed (job)
  • seen on other PRs agent-pane-peer-chat.test.ts a chat on an SSH machine > counts its running turn from the prompt and offers no machine switch mid-...: failed (job)
  • seen on other PRs composer-edges.test.ts composer card: appearance.borders = none draws no edge: failed (job)
  • seen on other PRs composer-edges.test.ts composer card: one hairline edge by default: failed (job)
  • seen on other PRs composer-foot-pill-inset.test.ts the row's padding is counted from the inset, so only the pill grows, not the text's place: failed (job)
  • seen on other PRs composer-location-strip.test.ts the chat composer: no hairline across the seam under the strip: failed (job)
  • seen on other PRs composer-location-strip.test.ts the chat composer: no gap where the strip stands inside the card's corner: failed (job)
Matched log lines
web / react-apps-check (4): (fail) no orange or system accent and no opaque glass on 1785 gallery stages [306895.75ms]

Not re-run automatically: web / react-apps-check (4), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

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
red: web / Web status; NEW: green on the base 44fc3d3; do not merge until green; see lane-rules
red: web / react-apps-check; no finished base run on 44fc3d3 to compare; do not merge until green; see lane-rules
red: web / react-apps-check (4); no finished base run on 44fc3d3 to compare; do not merge until green; see lane-rules

Tour of 632549a203 (run): no media. The tour did not run: only webview code changed (14 path(s)), which the gallery advisory run checks in Linux Chromium on the pull request (its artifact holds any captures); add the media-tour-mac label, then re-add media-tour, to tour it on a Mac.

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 22, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 38 test failures on Blacksmith runners:

Failures

Test View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
/tmp/tmpbp_n3znk/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpum0f25dy/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs

...and 28 more test failures. View all on Blacksmith: run 39821621358, run 39873433393, run 39821621761

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-c6npj created for this PR by the cmux coordinator.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at aa20d0e

Blocking findings

  • App.tsx:7819-7828, with the legacy Classic New Tab state (shownTemplate(newTab) === "classic", including newTab.layout === "a"), the new PageDots still renders, but App.tsx:7852-7930 routes that page to NewTabPage, which has no useComposerLook or data-composer-look (NewTabPage.tsx:482-588). Trigger: persist cmux.composer.look=codex (or choose Codex in another pane), then open a Classic New Tab. Result: the dots show a Codex choice but the visible legacy composer remains Claude and the checked dot is Classic, so the persisted Codex look is ignored. Choosing Codex there instead calls PageDots.tsx:47-50, which changes the whole page to Minimal rather than switching the displayed composer in place. The PR says the dots show on every New Tab page and that the look is shared across launches.

Non-blocking findings

  • NewTabScreen.tsx:870-875, 1114-1118 keeps the Cards template's folder/computer strip in nt-toolbar; composerLook.css:44-59 only makes nt-above a Codex tray, so selecting Codex and then Cards does not get the tray layout described in the PR body.
  • composerLook.ts:50-54 ignores StorageEvent.key === null; clearing localStorage in another pane leaves an already-open pane on the old look until it remounts.

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.

teamleaderleo and others added 2 commits October 22, 2026 06:49
…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>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / tooling-tests is red on 15 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 14 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

teamleaderleo and others added 3 commits October 22, 2026 07:00
…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>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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; git diff --check is clean. No macOS build or Swift test suite was run.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 16 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No fleet host names in gallery fixtures is red on 16 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No new SwiftUI (macOS UI is AppKit) is red on 16 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

teamleaderleo added a commit to teamleaderleo/cmux that referenced this pull request Oct 22, 2026
…'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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (Codex xhigh, re-pinned after base update): SHIP at 632549a

Agent session: cosmic-gray

@teamleaderleo teamleaderleo added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 22, 2026
@teamleaderleo
teamleaderleo merged commit da65a72 into feat-cmux-next Oct 23, 2026
43 of 46 checks passed
@teamleaderleo
teamleaderleo deleted the composer-look-codex-dot branch October 23, 2026 02:41
@github-actions

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39890924985 at da65a72 failed: cmux-next perf gate.
Those jobs last passed at 7d7bca5. This pull request is one of 2 merged since: #24324, #24367.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…'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>
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…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>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
- 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>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
- 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>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…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
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…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
teamleaderleo added a commit that referenced this pull request Oct 26, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant