cmux NEXT: the New Tab page chooses its style again, with a quiet switch

Merged
TE
24d ago
+1218-8

Summary

Leo (2026-10-13): the old New Tab template dots looked, clicked and moved badly, but choosing the style was good. #20127 removed the dots. This PR brings the function back with a new control, not a revert.

  • The control. One quiet row under the page with the five style names: Default, Composer, Threads, Console, Classic.
    • They are native radios inside the shared ChoiceGroup. Arrow keys move between styles; Return or Escape goes back to the field.
    • The current style sits on a small accent fill (5px radius). On a pick, the fill slides over with --agent-motion-move; there is no motion under Reduce Motion, and none on first paint.
    • Dim text, a theme-token focus ring, no capsule and no popup.
  • What a pick does. The page shows the new style at once and saves it as tabs.newTabTemplate (newTab.setTemplate โ†’ NewTabPage.saveTemplate, through the settings schema as the Settings window writes it).
  • What is ignored. Terminal and unknown values: New Tab still never opens a terminal by itself.
  • Strings. The five names and the group label come back in all 21 locales, from the catalog before #20127.

Bead: cx-txe89.

Testing

  • Red (a19a25d7):
    • bun test test/new-tab-style-switch.test.tsx: "Cannot find module ../newtab/StyleSwitch".
    • NewTabStyleSwitchTests does not build on base.
  • Green (head):
    • bun test test/new-tab-style-switch.test.tsx test/new-tab-no-dots.test.ts: 3 pass.
    • NewTabStyleSwitchTests on the fleet.
  • Checks:
    • gen-strings --check agentPane: ok.
    • Swift: check-concurrency, check-motion, crash_ratchet, check-system-blue and check-no-godfiles: all ok. AgentTabStore gets no longer: onNewTabInputReady is folded to one line, same behavior.
    • bun run check: the only warnings are in base files (DaemonGate.tsx, cloudHome.ts).
    • ui-rules: one base failure (DaemonGate.tsx:244), not from this PR.
  • Gallery: new agent-pane.new-tab state style-switch (pick Threads; the native call and checked state follow). no-template-dots still holds.

Changelog

Added: The New Tab page has a quiet style switch again (Default, Composer, Threads, Console, Classic); a pick is saved as tabs.newTabTemplate.

Proof

Behavior tests above; capture to follow in the showcase.

๐Ÿค– Generated with Claude Code


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


Summary by cubic

Restores choosing the New Tab page's style, which #20127 removed along with the template dots, as a quiet new control instead of a revert.

New Features

  • A row under the page offers the five style names (Default, Composer, Threads, Console, Classic) as native radios, with the current style on a small accent fill that slides to a new pick; it sits out of the page's flow so pages lay out as without it.
  • A pick shows the new style in place and saves it as tabs.newTabTemplate through the new newTab.setTemplate native method; the style names are restored in all 21 locales.
  • After the picked page mounts, the switch hands focus over: arrow keys keep moving through the styles, while a click returns to the new page's field.
  • Terminal and unknown values are ignored: New Tab never opens a terminal by itself.