Skip to content

Appearance themes: complete light and dark color sets beyond accents #2161

Open

Description

@blakemcanally

Summary

Appearance has three settings now: Mode, Accent and Vibe level. An accent colors only the message bubbles, Send and the sidebar hover and selection. The canvas, the panels and all text use one fixed neutral ramp, so every Buzz window looks almost the same.

This issue proposes themes: named, complete color sets that also color the canvas, the sidebar and the neutral surfaces. Each theme has a light mode and a dark mode. The current look stays the default as Buzz.

Preview of the seven proposed themes, light and dark

Proposed themes

Theme Description shown in Settings
Relax Deep plum frame around a bright, open workspace.
Cacophony Stacked slate panels with an electric violet glow.
Utmost A steady navy sidebar, a crisp white page and a confident blue.
Troupe Soft periwinkle on calm, even grays.
Cable Airy sky blue with fresh green replies.
Howdy A warm paper page, teal accents and minty replies.
Baton Beige-box chrome and navy highlights. After dark, it glows green.

Each palette below was measured against the design system's contrast targets, and the values were adjusted in lightness until every pair passed. All 262 measured pairs pass WCAG AA (4.5:1 for text, including text on the accent; 3:1 for online and busy dots) and APCA (Lc 60 for body text, Lc 45 for headings and metadata). Pairs measured: text and muted text on the main pane, text on received bubbles, sidebar text and headings on the sidebar, sidebar text on hover, selected text on the selected row, the Send icon on the accent, own-bubble text on the own bubble, and badge text on the badge.

Relax: Deep plum frame around a bright, open workspace.

Dark frame (canvas, top bar and sidebar) in both modes. The selected row is a pale pill with plum text in light mode.

Role Light Dark
Canvas #3B1238 #170F17
Sidebar #4C1C48 #211621
Sidebar text #F1E4EE #E4D9E2
Section heading #C8AEC3 #B09FAC
Sidebar hover #5A2956 #2E202D
Selected row #F6E7F2 #6B3466
Selected text #4A1745 #FFFFFF
Main pane #FFFFFF #1C1A1E
Text #1D191D #DDD7DC
Muted text #635B62 #A79DA6
Border #E6DFE5 #34303A
Received bubble #F4F0F3 #272429
Own bubble (Chillin') #F3E3EF #3B2338
Own bubble text #3E123A #F1E1EE
Accent / Send #7B2C75 #94408B
Send icon #FFFFFF #FFFFFF
Badge #D0335E #C23D63
Badge text #FFFFFF #FFFFFF
Online / away / busy #1A9D6F / #E8A524 / #D93C65 #3CC28F / #EDB547 / #E0557A
Cacophony: Stacked slate panels with an electric violet glow.

Three slate tiers. The sidebar selection is a gray step, not the accent. Send and own bubbles use Iris.

Role Light Dark
Canvas #E1E3EA #1C1D24
Sidebar #F0F1F5 #292B34
Sidebar text #3B3E49 #BEC1CC
Section heading #5C6070 #A4A8B6
Sidebar hover #E2E4EB #33353F
Selected row #D6D9E2 #3E414C
Selected text #1E2029 #F4F5F8
Main pane #FFFFFF #2F303E
Text #2E3038 #DDDFE6
Muted text #5B5F6E #9EA2B0
Border #DDE0E7 #40424C
Received bubble #F2F3F6 #393B45
Own bubble (Chillin') #E4E5FD #3A3C6E
Own bubble text #1F2173 #ECEDFF
Accent / Send #5D5FEF #6467F2
Send icon #FFFFFF #FFFFFF
Badge #D1323A #D2353B
Badge text #FFFFFF #FFFFFF
Online / away / busy #249A57 / #D9981A / #D1323A #28A960 / #EFB43A / #EE4549
Utmost: A steady navy sidebar, a crisp white page and a confident blue.

Dark navy frame in both modes. The selected row is a solid blue pill. Send and own bubbles use Cobalt. The unread badge is white with navy text.

Role Light Dark
Canvas #14243F #0E1525
Sidebar #1B3152 #162037
Sidebar text #F1F4F9 #E3E7EF
Section heading #A8B6CC #95A2BB
Sidebar hover #26416A #1F2B45
Selected row #3B6CD8 #3C6BD9
Selected text #FFFFFF #FFFFFF
Main pane #FFFFFF #131A29
Text #353A47 #DCE0E8
Muted text #5D6371 #97A0B2
Border #E1E4EA #252F45
Received bubble #F3F5F8 #1B2335
Own bubble (Chillin') #E1EAFB #1D2E55
Own bubble text #14306B #E2EAFB
Accent / Send #1E5FD6 #3F6FDB
Send icon #FFFFFF #FFFFFF
Badge #FFFFFF #3966D2
Badge text #1B3152 #FFFFFF
Online / away / busy #159E78 / #F5B521 / #D24D51 #3DBA87 / #F2AD12 / #D65A5D
Troupe: Soft periwinkle on calm, even grays.

Grays with a small lavender tint. The selected row is a soft periwinkle pill.

Role Light Dark
Canvas #EAEAF0 #111114
Sidebar #F4F4F8 #1E1E22
Sidebar text #3E3E46 #D6D6DC
Section heading #5D5D67 #A9A9B2
Sidebar hover #E9E9F1 #2A2A30
Selected row #E1E2F6 #3A3B66
Selected text #3B3D8C #FFFFFF
Main pane #FFFFFF #28282D
Text #242428 #F2F2F5
Muted text #5E5E67 #ADADB6
Border #DEDEE5 #3A3A41
Received bubble #F3F3F6 #323238
Own bubble (Chillin') #E7E7F8 #363864
Own bubble text #2E3075 #EEEEFF
Accent / Send #5F62C2 #6266D9
Send icon #FFFFFF #FFFFFF
Badge #CF3A3E #CC383D
Badge text #FFFFFF #FFFFFF
Online / away / busy #2D8A2D / #D98A00 / #C8232F #47A447 / #F0A030 / #E0484C
Cable: Airy sky blue with fresh green replies.

A sky-blue accent with pale-green own bubbles. The night mode is blue-slate.

Role Light Dark
Canvas #DCE7EE #0D141C
Sidebar #FFFFFF #132231
Sidebar text #22272C #E8EDF2
Section heading #626C75 #95A3B0
Sidebar hover #F0F4F7 #1F2B37
Selected row #2378B6 #2C6A9E
Selected text #FFFFFF #FFFFFF
Main pane #F7FAFB #0F1822
Text #15191D #F0F3F6
Muted text #5A646F #95A4B2
Border #DFE6EB #1F2A35
Received bubble #FFFFFF #192634
Own bubble (Chillin') #E8F7DB #2A4E72
Own bubble text #1F3313 #EEF5FC
Accent / Send #107BBB #6ABAFD
Send icon #FFFFFF #08131F
Badge #2378B6 #6ABAFA
Badge text #FFFFFF #06101A
Online / away / busy #3B9C42 / #E3A33A / #D9534F #5CC160 / #E7AE48 / #E0625E
Howdy: A warm paper page, teal accents and minty replies.

The main pane is a warm beige page. White received bubbles and mint own bubbles. The dark mode is green-slate.

Role Light Dark
Canvas #EDF0F1 #0A1115
Sidebar #FFFFFF #0D1C1F
Sidebar text #2A3237 #E6ECEE
Section heading #5E6A71 #97A5AD
Sidebar hover #F2F4F5 #1B262D
Selected row #E4F1EC #22323B
Selected text #0B5446 #F2F6F7
Main pane #F4EEE2 #0B1419
Text #141B1F #E7ECEE
Muted text #59636A #91A0A9
Border #DDE2E4 #1F2B32
Received bubble #FFFFFF #1F2B31
Own bubble (Chillin') #DAF6D0 #04594A
Own bubble text #122A10 #E9F3F0
Accent / Send #00856B #49C8A6
Send icon #FFFFFF #03140F
Badge #0B7F66 #41C8A3
Badge text #FFFFFF #04140F
Online / away / busy #059676 / #E0A43A / #D9534F #1BB08C / #E8B04A / #E0625E
Baton: Beige-box chrome and navy highlights. After dark, it glows green.

Putty-gray chrome and a navy selection in light mode. A black page with a phosphor-green accent in dark mode.

Role Light Dark
Canvas #C4C1B8 #1E1E1E
Sidebar #FFFFFF #080808
Sidebar text #000000 #D2D2D2
Section heading #4A4A4A #9C9C9C
Sidebar hover #E4E4E4 #1C1C1C
Selected row #10108A #1F1FA8
Selected text #FFFFFF #FFFFFF
Main pane #FFFFFF #000000
Text #000000 #D2D2D2
Muted text #4F4F4F #A4A4A4
Border #808080 #3A3A3A
Received bubble #F2F2F2 #141414
Own bubble (Chillin') #E2E2F4 #0A2A0A
Own bubble text #00004A #C8F5C8
Accent / Send #10108A #2BD12B
Send icon #FFFFFF #001A00
Badge #C70000 #D41F1F
Badge text #FFFFFF #FFFFFF
Online / away / busy #008C00 / #B86E00 / #C70000 #2BD12B / #F7A53A / #FF3B3B

Proposed design

  1. A theme setting. Add theme to the appearance snapshot, stored as buzz-theme.v1. The service writes data-theme on <html>, next to data-color-mode, data-accent and data-color-level. Unknown values fall back to buzz.
  2. A fixed set of theme slots. A theme overrides a tinted neutral ramp, the canvas, a new --surface-sidebar role and, optionally, the badge and status colors. Buttons, tabs, menus and links still read the neutral roles, so they stay neutral within each theme's tinted grays and never take the accent.
  3. Dark frames on light pages. Relax and Utmost put the frame (canvas, top bar and sidebar) in a dark scope in light mode, and the main pane stays light. The frame reuses the dark-mode role pairs, so its text pairs are covered by the existing contrast guard.
  4. A signature accent for each theme. Add an accent value Theme, shown as the first swatch, which follows the active theme's family. Cacophony uses Iris, and Utmost uses Cobalt. The other five themes need new families (plum, periwinkle, sky, teal, navy and phosphor), which exist only inside their themes. Under the Buzz theme, Theme resolves to Citrus, so the default look does not change. A saved manual accent stays as it is.
  5. Theme-owned selection and own bubbles. A theme may set the sidebar selection pair and the own-bubble pair. Cacophony uses a gray selection, Troupe and Howdy use a soft selected pill, and Cable and Howdy use green own bubbles. The vibe level still chooses soft or solid bubbles.
  6. Settings. A Theme row at the top of Appearance → Interface shows radio cards with a live preview, the name and the description. It uses the existing RadioGroup, so keyboard and screen-reader behavior stay the same.
  7. Guards and tests. check-contrast.mjs covers every theme × mode × vibe × accent, including the dark frame scope. There are unit tests for the service and one browser journey: pick a theme with the keyboard and with the pointer, reload, switch the mode, and check the frame scope.

Design-system decisions needed

  • DESIGN.md says "Never recolor the whole shell." The proposal makes themes the only owner allowed to recolor the shell, and only through the fixed slots above. The same change updates DESIGN.md (Accent color and Both modes).
  • Limit theme color to messages, send, and sidebar states #1479 limited accent color to bubbles, Send and the sidebar on purpose. The proposal keeps that limit, because shared controls stay neutral and accents keep their scope. Please review this before implementation starts.
  • Five new accent families add maintenance: twelve steps × two modes, plus ink, link and pressed values each.

Out of scope for the first version

  • Custom themes that people create and share.
  • Syncing the theme across devices through encrypted preferences.
  • Changes to corner shape or fonts for a theme.
  • Mobile parity.

Implementation plan

Two parallel tracks, then one PR for each remaining theme:

  1. Foundation: the setting, slots, frame scope, Theme accent, Settings row, contrast guard, DESIGN.md update and the Relax theme.
  2. Palettes: the values for all seven themes, as palette-layer tokens only.
  3. Cacophony, Utmost, Troupe, Cable, Howdy and Baton, each as a small PR on top of the foundation.

Activity

  1. self-assigned this
    on Nov 2, 2026
  2. blakemcanally commented on Nov 2, 2026

    @blakemcanally
    ContributorAuthor

    🤖 Follow-up for user-defined themes: #2163

  3. blakemcanally commented on Nov 2, 2026

    @blakemcanally
    ContributorAuthor

    🤖 Implementation PRs (all drafts):

    Some palette values moved slightly from the tables above so that every theme passes the contrast guard with no new exceptions. Each PR lists its changes.

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions