Skip to content

cmux-next sidebar: group color picker with theme colors, custom hex and emoji (cx-25az) - #18997

Merged
teamleaderleo merged 10 commits into
feat-cmux-nextfrom
feat-cmux-next-group-color-picker
Oct 10, 2026
Merged

teamleaderleo merged 10 commits into
feat-cmux-nextfrom
feat-cmux-next-group-color-picker

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

cx-25az: let people pick a group's color and emoji, and make the group header subtler. Builds on #18991 (landed), which added the theme-color headers and the stable default order.

  • Subtler header (Leo's screenshot feedback). The header no longer has a full pastel fill.

    • The group's color is a dot on the group line, and the line runs from the dot to the last member.
    • The name uses the sidebar's text color and lines up with the members' titles.
    • Hover and drop fills look like a row's, right of the line.
    • The faint vertical dots became the icon pack's three-dot action.more button; cx-a9h6 (cmux-next sidebar: more menu on group headers and workspace rows (cx-a9h6) #19019) turns it into the full menu.
  • Theme colors. The editor's existing dots are the active theme's palette: none, then the ANSI accents.

  • Custom color. A new icon-only dot after the palette opens the system color panel, which has a wheel, sliders and a hex field.

    • The group's color is stored as #RRGGBB, a value the daemon already accepts for group colors.
    • Once chosen, the dot shows that color with the chosen ring.
    • The header and line keep a custom color readable over the sidebar, and the ink is black or white by contrast.
  • Emoji. A new icon-only button runs workspaceGroup.setIcon. That opens the shared icon picker, emoji included, so this is the same path as the menu and palette.

  • Every entrypoint. workspaceGroup.setColor and the sidebar bridge now take a GroupTint, either a token or a hex color. The CLI, palette and editor all accept #RRGGBB.

  • The color and emoji controls are icon-only, never full width (Lawrence's decision on the bead).

  • Review fixes:

    • The emoji and custom color controls keep a new empty group, which the editor's close used to delete first.
    • The shared color panel gives back its target and settings when it closes.
  • Known gap: undo of Ungroup or Delete restores a custom color as no color, because the create intent still carries a palette token.

Testing

  • No test added. The no-unit-tests rule applies, and the debug socket doesn't expose group colors, so there is no behavior boundary to assert on.
  • Fleet CmuxNext suites pass on b7f4396 (51 PASS, the base merge with the icon pack). The iOS package lint passes. The emoji button draws face.smiling through the pack's SF Symbol path (SidebarIconButton(symbol:)), because the pack has no emoji icon.
  • The two new strings (sidebar.groupColor.custom, sidebar.groupEditor.emoji) are in all 21 locales of the sidebar catalog. scripts/localization_catalog.py check reports nothing for this catalog; its repo-wide count is the same as base.
  • Not yet checked on a Mac: the color panel flow, and a custom color across light and dark themes.

Changelog

Added: Workspace groups can take a custom color from the system color panel (hex included) and an emoji, from icon-only controls in the group editor.

🤖 Generated with Claude Code


Note

Low Risk
UI and personal-group color serialization only; hex values reuse an existing daemon wire format. Undo after ungroup/delete may still drop custom colors (noted gap).

Overview
cx-25az extends workspace group styling and editing: group colors are modeled as GroupTint (theme palette token or daemon-stored #RRGGBB), wired through actions, sidebar intents, bridge mapping, and personal-group updates via wire strings.

The group header no longer uses a full-width pastel bar. Color shows as a dot on the members’ vertical line; the title uses normal sidebar text. The editor adds an eyedropper swatch (system color panel, discrete commits) and an emoji/icon control that routes through workspaceGroup.setIcon. Opening those pickers sends keepGroupItem so a new empty group is not removed when the bubble closes.

Palette shortcuts and workspaceGroup.setColor now set .palette(...) or parse hex; SidebarGroup stores optional custom and applies colors through tint. New localized strings cover custom color and emoji picker labels.

Reviewed by Cursor Bugbot for commit b7f4396. Bugbot is set up for automated code reviews on this repo. Configure here.

Showcase

group header before after

group editor colors before after

Open the live gallery

teamleaderleo and others added 3 commits October 10, 2026 02:48
…s, header +, spam-click toggles (cx-q5jw)

- Member rows start right of their group's line (SidebarStyle.groupGutter),
  so hover and selection fills never cover it; tab rows drop their own rail.
  The line runs from under the header to the last member.
- Header bar and line take the theme's ANSI color itself (no pastel), with
  black or white ink by contrast; none is the sidebar's tonal step.
- New groups get colors in a stable theme order (GroupColor.automaticOrder).
- Header + (hover, with the more button) runs workspaceGroup.newWorkspace,
  the editor's New Workspace in Group.
- Fast repeated clicks on the chip toggle the editor open, closed, open:
  clicks are matched by event number, not a double-click time window.
- Member titles start closer to the line (less left space).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd emoji (cx-25az)

- GroupTint: a palette token or a custom #RRGGBB, the two color shapes the
  daemon stores for a group. SidebarGroup keeps the token and a custom hex.
- The group editor's dot row adds two icon-only controls (Lawrence: never
  full width): a custom color dot that opens the system color panel (wheel,
  sliders, hex field) and shows the color once chosen, and an emoji button
  that runs workspaceGroup.setIcon (the shared icon picker, emoji included).
- workspaceGroup.setColor and the bridge take a GroupTint, so the CLI and
  palette accept #RRGGBB as well as the tokens.
- Two new strings in all 21 sidebar catalog locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 9bd9332b-dc22-4007-943d-e611209e41ea

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@blacksmith-sh

This comment has been minimized.

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

CI fast guards failed on b7f4396e58 (https://github.com/manaflow-ai/cmux/actions/runs/38045495746). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally. This comment is updated in place on each push.

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Unclear: GhosttyKit release check failed: no known signature; failed step: Verify published GhosttyKit release and checksum.

CI failed on b7f4396e58 (run 38045495746 attempt 1): 1 unknown.
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped.

Job Verdict Why
GhosttyKit release check unknown no known signature; failed step: Verify published GhosttyKit release and checksum

Not re-run automatically: GhosttyKit release check is not a machine failure.

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.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

teamleaderleo and others added 3 commits October 10, 2026 03:02
- No + on an empty group: a click on it raced the editor closing on a new
  group, which then went before the workspace arrived. The editor's New
  Workspace in Group stays.
- The + is hidden (not only transparent) while it does not show, so a
  click there before any hover still collapses the group.
- Header buttons draw in the header's ink (SidebarIconButton.tintOverride);
  their own hover tint overrode white ink on dark accents.
- The + never moves left of the bar's padding in a narrow sidebar.
- The tab-drop insertion line inside a group starts right of the group's
  line, as the row does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-color-picker

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/GroupHeaderRowView.swift
…5az)

- The emoji button (workspaceGroup.setIcon) and the custom color dot keep a
  new empty group: both pickers edit it after the editor closes, and the
  close used to delete it first.
- The shared color panel is released when it closes: its target, action,
  alpha and continuous settings go back, so a later Show Colors elsewhere
  never recolors the group.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base automatically changed from feat-cmux-next-groups-polish to feat-cmux-next October 10, 2026 10:08
teamleaderleo and others added 3 commits October 10, 2026 03:09
…x-next-group-color-picker

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/GroupEditor/SidebarGroupEditor.swift
#	Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/GroupHeaderRowView.swift
…d-file type limit) (cx-25az)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e instead of a full fill (cx-25az)

Leo 2026-10-10 screenshot: no full pastel header fill. The group's color is
a dot on its line (the line runs from the dot to the last member); the name
is in the sidebar's text color and lines up with the members' titles; hover
and drop fills are a row's, right of the line. The faint vertical more glyph
becomes the clear three-dot (ellipsis) symbol.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

…x-next-group-color-picker

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/GroupHeaderRowView.swift

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit b7f4396. Configure here.

guard let group, let tint = GroupTint(picked: NSColorPanel.shared.color) else { return }
onColor?(group, tint)
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Color panel target dangles after teardown

High Severity

SidebarGroupColorPanel borrows the shared NSColorPanel (target, action, showsAlpha, isContinuous) and only gives them back in release(), which runs from willCloseNotification. There is no deinit cleanup. NSControl targets are unowned, so tearing down the sidebar or window while the panel is still up leaves a dangling target; the next click on that panel can crash, and the borrowed settings stay applied.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit b7f4396. Configure here.

@teamleaderleo
teamleaderleo merged commit 295fc2e into feat-cmux-next Oct 10, 2026
72 of 74 checks passed
@teamleaderleo
teamleaderleo deleted the feat-cmux-next-group-color-picker branch October 10, 2026 11:01
@lawrencecchen

Copy link
Copy Markdown
Contributor

Lawrence decided 2026-10-11: solid group header fill back; row actions on hover only, no layout shift. Landed in feat-cmux-next as b2ced02 (train 31936c9) under cx-qno.22: cx-rcby full-width pill chip with a hover step, one glyph ink at 4.5:1, header + and more and workspace-row more on hover only in reserved slots.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants