Repository navigation
cmux-next: Change Font… with live preview, fonts in their own face, recent fonts first - #22762
Conversation
…ecent fonts first Settings > Appearance: every font family row (terminal, chat code, editor, Markdown code) opens a searchable list of the installed families, each drawn in its own face. The arrow keys preview the highlighted font live in the app, a resting pointer after 450 ms, Return or a click writes it, Escape reverts (FontPicker, the theme picker's behavior). Fonts written lately lead the list under a Recent tag. Palette: font family settings now list the installed families (they took typed text only), drawn in their own face, recent first, with the settings value page's live preview and Escape revert. Change Font… lists every font setting (families, sizes, line heights, the chat's and the Markdown viewer's font), derived from the schema, so a new font setting joins on its own. Recent fonts: RecentFonts (user defaults, client view state, never cmux-next.json) records every font family write in setSetting, newest first, six kept; the Settings page reads it as the recent_fonts domain. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&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 Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by web and size checks: green
Tour of Path-selected interactions
Core UI (before): DEGRADED — 19 ok, 1 unavailable
Screenshots (15)1. Launch Tours are data in |
This comment has been minimized.
This comment has been minimized.
|
Bead |
|
|
…he highlight The palette's font options and typed-value parsing move into CmuxNextSettings (RecentFonts.options, SettingDescriptor.value(typed:)); SettingOption carries isRecent. CmuxNextApp shrinks by 5 source lines against base. The What's New highlight gets an Open Settings action. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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. |
|
owner: 01a15bdd-880a-7a72-b582-c0a285babfd6 |
Applies the pr-autofix-patch artifact of run 39536083597 (head 5d222b9): the settings export stamp now covers RecentFonts.swift, plus the exports it regenerates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only generated exports conflicted (docs/mdm, settings schema, defaults snapshot, settings export stamp); took the base side, PR autofix regenerates them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Picks up the base fixes (#22877 inspector page, #22853 compile, #22856, #22876). settings.gallery.ts: kept both new covers entries (ChiefPetCard, FontPicker). ci-target-graph.json and the settings exports take the base side; PR autofix regenerates them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
|
Review (independent Claude review subagent): SHIP at 7582def Checked: preview/revert state machine in the Settings FontPicker and the palette's Change Font… page; recent-fonts recording, dedupe, cap of 6, and filtering of uninstalled fonts; main-actor state; no |
|
Found 4 test failures on Blacksmith runners: Failures
|
SettingsPaletteSource.swift conflicted: base taught the palette's `parse` the new choiceOrURL kind (home.server), while this branch moved `parse` into `SettingDescriptor.value(typed:)`. The choiceOrURL case now lives in `value(typed:)`, and the address input validates through it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&host=cosmic-gray
|
Review (independent Claude review subagent): SHIP at 3d9e946 Scope: the base-merge conflict resolution. Base taught |
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. |
DomainListEditor.tsx conflicted with #23400 (the font list ignored a click in the page's first 400 ms because closedAt started at 0). The font list now lives in FontPicker, so its closedAt starts at -Infinity the same way, and DomainListEditor keeps this branch's thin wrapper. #23400's editors test passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&host=cosmic-gray
|
Review (independent Claude review subagent): SHIP at 0b4c5bf Scope: the base-merge conflict with #23400 in
|
Applies the pr-autofix-patch artifact of run 39610887469 (head 0b4c5bf): the stamp now covers RecentFonts.swift and this branch's settings sources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&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. |
…sleeping 450 ms check-fixed-waits (web lint) refuses a new fixed wait in a test; the test now stubs performance.now, as #23400's editors test does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&host=cosmic-gray
|
Review (independent Claude review subagent): SHIP at 3a97b47 Post-merge review of the delta since the last receipt (0b4c5bf..3a97b47), done after the squash because the previous receipt did not cover the final head:
|
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39647649905 at d881a7e failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39647862464 at 5818254 failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
|
Shipped in:
|
…own red (#23620) * test(defaults guard): a base merge that keeps the branch's stamp is the pull request's red (red) #22762 merged with its stamp keeping older digests for two base sources (a local base merge with cmux-generated-v1 keeps this branch's stamp). The check-stamp red named only base files, so it read as a base red, and the squash put the old digests back on feat-cmux-next. This fixture reproduces it and asks check-stamp --base to say plainly that the red is the PR's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&host=cosmic-gray * defaults guard: name a stamp a base merge kept as this pull request's red check-stamp --base now splits a stale entry whose source matches the base but whose stamp entry does not: that is the head's stamp (a local base merge with the cmux-generated-v1 driver keeps this branch's side), not base staleness. It prints an ::error annotation, "this pull request's red, not the base's", with the fix (apply the PR autofix patch). The merge driver stays keep-ours: a line-merged stamp would call one-sided exports fresh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-880a-7a72-b582-c0a285babfd6&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
















Makes switching fonts in cmux NEXT quick, using the font settings that already exist. The one addition is a list of recently used fonts.
What changes
FontPicker.RecentFontskeeps the six most recent in user defaults (client view state, never cmux-next.json). Every font write throughsetSettingrecords one, and the page reads them as therecent_fontsdomain.font-picker-open.Size and line height stay where they are, next to each font row. The terminal has no line-height key; that would need a Ghostty
adjust-cell-heightsetting, which I left out.Supersedes most of #20985 (orphaned, conflicting). Base has since added the chat look (
agentPane.display.font.*,chatDisplay.ts), which duplicates itsappearance.fonts.*keys.Changelog
Testing
bun test src/pages/settings/fontPicker.test.tsx: 7 pass (row order, recent tag, own face, arrows preview, Escape reverts with no write, Return writes and moves the font to the front).bun test src/pages/settings: 218 pass, 1 skip.bun run check(webviews): clean.prepush-gate.py: no new violations.check-l10n.sh: 0 errors.lint-ios-package-conventions.sh: OK.RecentFontsTests,PaletteChangeFontTests,SettingsPaletteFontOptionsTests.Observed / Not run
test/galleryhas one red,ChatHeaderStatus.tsx#ChatHeaderInlineStatuswith no gallery entry, which comes from base, not this PR.Localization: 3 new keys (
settingsPage.font.recent,settingsPage.font.noMatch,palette.setting.changeFont), all 21 locales filled.Agent session: cosmic-gray
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Makes font switching in cmux NEXT a one-step pick: Settings font rows and the palette list installed fonts, each drawn in its own face, with live preview and fonts used lately first.
RecentFontskeeps the six most recently used families in user defaults (client view state, nevercmux-next.json); every font family write records one. The palette's font options and typed-value parsing live inCmuxNextSettings(RecentFonts.options,SettingDescriptor.value(typed:));SettingOptioncarriesisRecent.adjust-cell-heightsetting, left out.Written for commit 3a97b47. Summary will update on new commits.