Skip to content

Move Bot-mode surfaces, mobile, the window companion and Computer/Browser settings onto design tokens - #1626

Merged
DoodleBears merged 7 commits into
mainfrom
claude/design-system-slice-4
Oct 14, 2026
Merged

DoodleBears merged 7 commits into
mainfrom
claude/design-system-slice-4

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Vain

Why the change

After the dialogs (#1608, #1619), the main Bot-mode surfaces still carried their own spacing, type, radius and colour values in legacy CSS and local alias tables. This moves them onto the same design tokens and components, without a new look: one source of values.

Refs #1589
Closes #1602

Special things to note

  • Scope:
    • Desktop: Channel sidebar tab strip and views menu, entry headers, Sessions, Work, Bot Inbox and Memory tab chrome, the conversation title, the composer context bar.
    • Mobile: the mobile Bot panel (header, bottom nav) and the mobile conversation header.
    • Desktop window companion: bubble, toolbar, request card. The --bh-companion-* alias table is gone.
    • Computer and Browser bundle settings: off the legacy bh-settings-* classes onto SettingsRow, Select, Note and a new PillButton.
  • New design-system pieces in packages/client/src/client/ds/: icon-button, panel-header, chip-button, group-heading, pill-button, hooked (keeps a legacy class next to StyleX output where a test or selector needs it). New on-scale tokens: color.borderSoft, borderStrong, onAccent, elevated, navSelected, radius.menuItem, text.regular.
  • scripts/stylex-plugin.mjs: every stylesheet now gets an empty anchor rule per StyleX priority level, so a shared design-system class has the same specificity in the Computer and Browser bundles as in the client. Before, most shared classes ranked one level lower there. New scripts/test/stylex-plugin.test.mjs covers it.
  • The token guard now also scans the Computer and Browser client sources.
  • Visible changes are small alignments to the scale: a few gaps and paddings move by 2px, small labels go from 11px to 12px, Memory tree rows are slightly tighter, focus rings use the accent colour, disabled buttons are dimmed, select chevrons are smaller, and the last settings row in Computer and Browser no longer has a divider below it (same as other settings pages).
  • Selectors: legacy class hooks used by e2e scripts and tests were replaced with data attributes (data-sidebar-entry, data-panel-head, data-conversation-title, data-sessions, data-memory-view-tabs and others) in about 25 scripts/e2e-*.mjs files. e2e not run.
  • Left for slice 5 (Design system 5: remove legacy classes and feature-local token aliases; tighten the token guard #1603): roster, floating channel island, topbar, SidebarCardList / SidebarCardRow, the Memory graph and versions, the remaining bh-settings-row* rules (still used by DSH Bot settings and release notes), and a few rules mobile and companion CSS override.
  • Verification:
    • pnpm typecheck, pnpm lint, pnpm format:check, pnpm build pass.
    • Vitest on client, browser, computer and the plugin test: 2146 passed, 10 skipped; client-observer.test.ts fails as on main.
    • New jsdom tests by role and name: design-system-surfaces.test.ts, mobile panel, window companion, Computer and Browser settings, and committed-bundle stylesheet checks.
    • Screenshots from local dev instances with synthetic data: before is main at e363a64, after is this branch. Bot Inbox is empty in these profiles, so the Work tab of a group is shown instead. The companion overlay was hidden in the other shots because it walks over the mobile nav.
    • Human QA: not done.

Change outline

ds/  icon-button  panel-header  chip-button  group-heading  pill-button  hooked
desktop  sidebar tabs + entries + tab chrome, conversation title, composer context  -> ds components + tokens
mobile   Bot panel, conversation header                                             -> tokens
companion bubble, toolbar, request card (alias table removed)                       -> tokens
computer / browser settings  bh-settings-*                                          -> SettingsRow / Select / Note / PillButton
scripts/stylex-plugin.mjs  per-level anchors -> same specificity in every bundle

Each image: rows zh light, zh dark, en light, en dark; left Before, right After.

Sidebar tabs (Sessions)

Sidebar tabs (Sessions): before and after

Memory tab

Memory tab: before and after

Work tab

Work tab: before and after

Conversation header and composer context

Conversation header and composer context: before and after

Mobile Bot panel

Mobile Bot panel: before and after

Mobile conversation header

Mobile conversation header: before and after

Window companion

Window companion: before and after

Computer settings

Computer settings: before and after

Browser settings

Browser settings: before and after

🤖 Generated with Claude Code

https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76


Generated by Claude Code

The Computer and Browser bundle settings now render with the shared
SettingsRow, Select, Note and a new PillButton instead of the legacy
bh-settings-* classes. Both bundles already run the StyleX plugin, so they
import ds/ directly and append their compiled rules to their own
stylesheet. Each stylesheet now anchors every priority level, so a class
shipped by several bundles gets the same specificity in each one.

The six bh-settings-* rules with no remaining users are removed from the
client stylesheet; rows, row, row-text and row-desc stay for the client
files that still use them.

Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
The mobile shell, Activity header, bottom navigation, Exit button and
mobile conversation header now take spacing, type, radius and colour from
the StyleX tokens. The desktop window companion's bubble, request card,
toolbar, attention badge, character and tether do the same, sharing one
speech-bubble shape. Rules that restyle other components' markup, react to
ancestor state, animate or honour reduced motion stay in the scoped
stylesheets and read the same token values. The companion alias table is
gone.

Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
Add IconButton and PanelHeader to the design system. The Channel sidebar
tab strip, views menu, entry headers and entry header actions now take
spacing, type, radius, size and colour from the StyleX tokens. Entry
sections expose data hooks instead of legacy classes, and the e2e scripts
follow them.

Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
…em tokens

Add ChipButton to the design system and a shared ComposerContextBar for the
DM and Group composer context chips. The conversation title, Group name
button and empty Group mark take type, radius and colour from the tokens.
Tests and e2e scripts select them through data hooks.

Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
…em components

Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
Issue: #1602
Agent-Task: claude-code/cloud/session_0152zfVCAc6MNB8R8xVq9b76
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152zfVCAc6MNB8R8xVq9b76
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 101 files, which is 1 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: d32b1a96-a34c-414f-a879-ace2a25e977b
📥 Commits

Reviewing files that changed from the base of the PR and between e363a64 and e8ad30c.

⛔ Files ignored due to path filters: 12
  • .github/pr-screenshots/design-system-main-surfaces/browser-settings.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/computer-settings.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/conversation-header.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/mobile-header.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/mobile-panel.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/sidebar-inbox.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/sidebar-memory.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/sidebar-tabs.png is excluded by !**/*.png
  • .github/pr-screenshots/design-system-main-surfaces/window-companion.png is excluded by !**/*.png
  • packages/browser/lib/client.js.map is excluded by !**/*.map
  • packages/computer/lib/client.js.map is excluded by !**/*.map
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing: 101
  • changes/1602-design-system-main-surfaces.md
  • packages/browser/lib/client.js
  • packages/browser/package.json
  • packages/browser/src/client/settings.tsx
  • packages/browser/src/client/styles.ts
  • packages/browser/test/client-access.test.ts
  • packages/browser/test/client-stylesheet.test.ts
  • packages/browser/test/target-settings.test.ts
  • packages/client/src/client/bot-main.tsx
  • packages/client/src/client/channel-sidebar-builtins.tsx
  • packages/client/src/client/channel-sidebar-styles.ts
  • packages/client/src/client/channel-sidebar-tabs.tsx
  • packages/client/src/client/channel-sidebar-view.tsx
  • packages/client/src/client/companion-requests-view.tsx
  • packages/client/src/client/companion-surface.ts
  • packages/client/src/client/composer-context-bar.tsx
  • packages/client/src/client/composer-context-styles.ts
  • packages/client/src/client/dm-composer-context.tsx
  • packages/client/src/client/ds/chip-button.tsx
  • packages/client/src/client/ds/group-heading.tsx
  • packages/client/src/client/ds/hooked.ts
  • packages/client/src/client/ds/icon-button.tsx
  • packages/client/src/client/ds/note.tsx
  • packages/client/src/client/ds/panel-header.tsx
  • packages/client/src/client/ds/pill-button.tsx
  • packages/client/src/client/ds/select.tsx
  • packages/client/src/client/ds/tokens.stylex.ts
  • packages/client/src/client/group-channel-header.tsx
  • packages/client/src/client/group-composer-context.tsx
  • packages/client/src/client/group-member-controls.tsx
  • packages/client/src/client/group-work-entry.tsx
  • packages/client/src/client/human-channel-name.tsx
  • packages/client/src/client/memory-file-tree.tsx
  • packages/client/src/client/memory-files-entry.tsx
  • packages/client/src/client/memory-working-groups.tsx
  • packages/client/src/client/mobile-bot-panel.tsx
  • packages/client/src/client/mobile-bot-styles.ts
  • packages/client/src/client/mobile-conversation-header.tsx
  • packages/client/src/client/schedules-entry.tsx
  • packages/client/src/client/sessions-entry.tsx
  • packages/client/src/client/sidebar-view-menu.tsx
  • packages/client/src/client/styles.ts
  • packages/client/src/client/window-companion-styles.ts
  • packages/client/src/client/window-companion-view.tsx
  • packages/client/test/bot-inbox-entry.test.ts
  • packages/client/test/bot-main.test.ts
  • packages/client/test/bot-schedules-entry.test.ts
  • packages/client/test/channel-sidebar-expandable.test.ts
  • packages/client/test/channel-sidebar-order.test.ts
  • packages/client/test/channel-sidebar-tabs.test.ts
  • packages/client/test/channel-sidebar-visibility.test.ts
  • packages/client/test/design-system-surfaces.test.ts
  • packages/client/test/design-system-tokens.test.ts
  • packages/client/test/dm-composer-context.test.ts
  • packages/client/test/group-channel-header.test.ts
  • packages/client/test/group-composer-context.test.ts
  • packages/client/test/group-work.test.ts
  • packages/client/test/memory-git-interaction.test.ts
  • packages/client/test/mobile-bot-panel.test.ts
  • packages/client/test/personabot-profile.test.ts
  • packages/client/test/sessions-entry.test.ts
  • packages/client/test/standing-memory.test.ts
  • packages/client/test/window-companion-view.test.ts
  • packages/computer/lib/client.js
  • packages/computer/package.json
  • packages/computer/src/client/index.tsx
  • packages/computer/src/client/local-computer.tsx
  • packages/computer/src/client/settings-rows.tsx
  • packages/computer/test/client-stylesheet.test.ts
  • packages/computer/test/settings-interaction.test.ts
  • scripts/e2e-activity-entry.mjs
  • scripts/e2e-activity-overview.mjs
  • scripts/e2e-assignment-probe.mjs
  • scripts/e2e-browser-access-tabs.mjs
  • scripts/e2e-browser-human-window.mjs
  • scripts/e2e-browser-observation-refs.mjs
  • scripts/e2e-browser-pause.mjs
  • scripts/e2e-browser-queued-guards.mjs
  • scripts/e2e-channel-session-return.mjs
  • scripts/e2e-client-interactions.mjs
  • scripts/e2e-client-reads.mjs
  • scripts/e2e-computer-viewer.mjs
  • scripts/e2e-dm-delivery.mjs
  • scripts/e2e-group-activity.mjs
  • scripts/e2e-group-assignment-activity.mjs
  • scripts/e2e-group-management.mjs
  • scripts/e2e-group-motion-matrix.mjs
  • scripts/e2e-group-shell.mjs
  • scripts/e2e-human-inbox-list.mjs
  • scripts/e2e-memory-file-actions.mjs
  • scripts/e2e-memory-inbox.mjs
  • scripts/e2e-memory-recovery.mjs
  • scripts/e2e-message-inline-actions.mjs
  • scripts/e2e-personabot-session-return-menu.mjs
  • scripts/e2e-personabot-session-return.mjs
  • scripts/e2e-personabot-session-views.mjs
  • scripts/e2e-personabot-sessions.mjs
  • scripts/e2e-session-view-menu.mjs
  • scripts/e2e-workspace-file-actions.mjs
  • scripts/stylex-plugin.mjs
  • scripts/test/stylex-plugin.test.mjs

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

  • 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.

@DoodleBears DoodleBears self-assigned this Oct 13, 2026
@DoodleBears
DoodleBears marked this pull request as ready for review October 14, 2026 04:57
@DoodleBears
DoodleBears merged commit 7fe5079 into main Oct 14, 2026
2 checks passed
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.

Design system 4: Bot mode main surfaces, mobile and desktop companion on design tokens

2 participants