cmux-next: the static status look everywhere; indicators name their state (cx-sya4n)

Merged
TE
19d ago
+1395-7

cmux NEXT's static status look, from Static status indicators or Reduce Motion, now reaches every surface. Separately, every status indicator now names its state in every look.

  • Tabs draw the static look's still marks. That covers the busy and working icon slot and the needs-input, done and failed badge, which now draws a mark instead of a dot told apart by color alone. They follow the status.static.shapes Debug toggle like every other indicator.
  • Pane attention ring: under Static it's the steady ring, with no blink or pulse. Reduce Motion already took a single fade.
  • Agent pane: its theme sends statusIndicators: "static" under Static or Reduce Motion, and "animated" otherwise. The page's data-status-indicators rules come from #21657. AgentPaneView re-applies the theme when the setting changes.
  • Labels: every StatusIndicatorView's tooltip and VoiceOver label is the state's short name (StatusIndicatorState.shortLabel): Working, Loading, Paused, Waiting, Needs permission, Question, Sign-in needed, Error, Done. A tab's VoiceOver text names the blocked kind when there is one. No surface shows the name as visible text.

Stacked on #21659. This branch contains #21659's two commits, so review the top two: 976ac374448 (test) and f2c86b2a86f. It doesn't need #21662 (the Settings row). It does need #21657 for the agent pane's page to act on the look.

Freeze WINDOW areas: a CmuxNext string catalog (CmuxNextDesign/Resources/Localizable.xcstrings, nine status.label.* keys) and scripts/localization-allowed-omissions.json. No settings schema, Package.swift or Cargo changes.

cx-sya4n: blinking lights give a teammate headaches.

Testing

  • StaticStatusIndicatorTests (CmuxNextAppTests) covers:

    • every state's indicator has a tooltip and an equal VoiceOver label, and the nine labels differ
    • under Static, every tab state draws a still, non-dot mark with no loop
    • with the shapes toggle, every tab state draws its own mark
    • the attention ring doesn't loop or blink under Static
    • the agent pane's theme reports static under Static or Reduce Motion

    The test is committed first (976ac374448), where it's red as a compile failure. The fix is f2c86b2a86f. Neither has run yet: this host is Linux, so this PR's macOS CI lane is the first run.

  • Localization audit:

    • The nine status.label.* keys carry all 21 catalog locales, taken from #20511.
    • localization_catalog.py check on the Design catalog reports nothing for them.
    • Two shared spellings are recorded as identityLocales in the omissions file: es "Error" and fr "Question".
    • The changed Swift has no new bare English.
    • scripts/localize-changes couldn't run here because this sparse checkout has no web/.
  • Locally on Linux: check-motion.sh passes and lint-swift-post-edit.sh is clean.

Changelog

Added: in cmux NEXT, status indicators name their state in their tooltip and to VoiceOver; under Static or Reduce Motion, tabs, the attention ring and the agent pane stand still too.

🤖 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

Extends cmux NEXT's static status look, from Static status indicators or Reduce Motion, to every surface, and gives every status indicator a tooltip and VoiceOver label naming its state instead of signifying it by color or motion alone.

What changed

  • Tabs draw the static look's still marks for busy/working and the needs-input, done and failed badges; badges no longer fall back to a dot told apart by color alone.
  • The pane attention ring is the steady ring under Static, with no blink or pulse.
  • The agent pane's theme sends statusIndicators: "static" under Static or Reduce Motion, and re-applies the theme when the setting changes.
  • Every indicator names its state (Working, Loading, Paused, Waiting, Needs permission, Question, Sign-in needed, Error, Done) in its tooltip and VoiceOver label, in every look; a tab's needs-input VoiceOver text names the blocked kind.
  • The Debug toggle status.static.shapes switches the static look between the Static set's glyphs and per-state shapes.

Testing

  • StaticStatusIndicatorTests covers the markings, stillness, agent-pane theme, and labels; the tab tests need StatusIndicatorView to lay out its host again when the static look hides or shows a glyph.

Freeze WINDOW

  • Nine status.label.* keys land in the Design catalog with all catalog locales, and two identity locales are recorded in localization-allowed-omissions.json.