CmuxNext: quieter sidebar group headers and the theme's group colors, as Debug choices

Closed
TE
17d ago
+283-8

cg-design-judge's sidebar Thunderdome (108 blind bouts, Tact #115) found the solid pastel group header bands the loudest thing in the NEXT sidebar, and the same in Catppuccin Latte and Apple System Colors Light. Leo's rule is that group colors come from the theme. Lawrence put the fixed palette back as the default on 2026-10-13 ("familiar group colors first") and chose the solid band on 2026-10-11 (cx-qno.22), so this PR adds the quieter looks and the theme's colors as Debug Settings choices, keeps today's look as the default, and asks Leo and Lawrence to pick the default.

SHOW LEO: hold for Leo's OK. Not merging.

Captures

A fleet DEV build of this head (fefbc0f68f), one window, sidebar crops. Each grid shows the four header looks (columns) with the fixed palette (top row) and the theme's colors (bottom row). The first column, top row, is today's default and is unchanged. The sidebar has four groups: Backend (red), Frontend (green), Infra (orange, collapsed) and Docs (purple). The selected row is workspace-1, and no row is hovered.

Apple System Colors Light

Group header looks, Apple System Colors Light

Apple System Colors (dark)

Group header looks, Apple System Colors dark

Rose Pine Dawn (light)

Group header looks, Rose Pine Dawn

Rose Pine (dark)

Group header looks, Rose Pine

Live switch (Apple System Colors Light, theme colors): band, then line, tinted, wash and back to band. Each change applies at once, with no relaunch.

Group header looks switching live

Full quality:

The choices (Debug Settings, sidebar)

  • sidebar.groupHeader: how a group header draws.
    • band (default): today's solid rounded bar in the group's color.
    • line: the name in primary ink, and the group's color only as a dot where its members' line starts.
    • tinted: the name in the group's color (darkened as far as 4.5:1 text contrast needs), with the dot.
    • wash: a faint wash of the group's color behind a name in primary ink, with the dot.
  • sidebar.groupColors: where group colors come from.
    • fixed (default): the fixed group palette, the same in every theme.
    • theme: the theme's own color for each group color (its terminal palette, GroupColor.themeRGB). It applies to the dot, the members' line, the band, the drag lift and the group editor's swatches. Grey and custom colors stay as they are.

Both switch live; the quiet looks take the row's own hover, editor and drop fills (the wash steps over its own color, as the band does). Minimal mode keeps its thin header.

In the app (first capture)

An earlier fleet DEV build of this PR, one window per theme, sidebar crops. The first column is today's look; the others are the choices with the theme's colors.

Group header looks in Catppuccin Latte and Apple System Colors Light

My pick: line with theme colors. It is the quietest: the color keeps its place as the dot and the members' line, so each group still reads at a glance, and the header no longer outweighs the rows. tinted puts red and green into names, where they compete with the error and success status colors (a red group name reads like a failure). wash is gentle but is still a band.

On Leo's OK: flip the two defaults (band to line, fixed to theme) in SidebarGroupHeaderLook.swift and update GroupPaletteDefaultTests, which pins today's default. Lawrence's 2026-10-13 call on the fixed palette needs his OK too.

Tests

GroupHeaderThemeLookTests, red on the test commit and green on the fix:

  • With the theme's colors, every group's dot and members' line are the theme's color, and red differs between Latte and Apple Light.
  • line and tinted draw no band, show the dot, and draw the name in primary ink or the group's readable color.
  • wash is tinted but faint (under 1.25:1 against the sidebar), behind a name in primary ink.

GroupPaletteDefaultTests still passes: the default draws exactly what it did.

Fleet receipts:

  • Red, test commit fb91d3bdcbe3 (light step e55b9851df694d906ecb2775): GroupHeaderThemeLookTests fails with 57 issues on behavior (the band still draws, no dot, the name keeps the band's ink, the fixed palette).
  • Green on 11960536ad3d (light step 18c90a2caa5bffa57c081a88): GroupHeaderThemeLookTests, GroupPaletteDefaultTests and 293 other suites pass. Three reds, none from this PR:
    • AgentChatFromHomeTests fails on base since f9490028b939 (the docked Home default).
    • SettingsSchemaExportTests.exportIsFresh: base's settings schema is stale; this PR changes no setting, and the diff does not include its keys.
    • The step's same-tree guard exits 1: the worker lacked this head's cmux-tui tree, so the daemon suites skipped.
      The tinted-name expectation was refined in the fix commit to hold 4.5:1 text contrast; it failed on the red commit either way.
  • Release compile on 11960536ad3d (isolated step 2feca8d1d864ef0d55e784e4): BUILD SUCCEEDED.

Bead: cx-7yywz.

Review fix on fefbc0f68f26 (Opus review): the group header and the members' line now keep one observation of the Debug Settings look at a time, like UnreadBadgeView; before, each layout pass registered another and a later change fired one repaint per pass.

  • Release compile on fefbc0f68f26 (isolated step 13cb337fcceda3a5661f4ac0): BUILD SUCCEEDED.
  • Suites on fefbc0f68f26 (light step 0c8686c3cd5fe5eabd3c8705): GroupHeaderThemeLookTests and GroupPaletteDefaultTests pass. Failures are the base reds AgentChatFromHomeTests (docked Home default) and SettingsSchemaExportTests (stale base schema).

Review nits left for the call: the group editor and the drag lift read the setting without observing it (short-lived views); a tinted name over the hover fill can fall slightly under 4.5:1; nothing forces adjacent groups apart in theme mode (yellow and orange can come out close in light themes); no test yet for a live setting flip on existing rows, dark mode, or a theme with fewer than 8 ANSI colors.

Changelog

none (Debug Settings choices; the default is unchanged until Leo's call)

🤖 Generated with Claude Code