Skip to content

Interface themes: CaYaDev, Dark, Light, Device default, High Contrast and more (#770) - #771

Merged
CaYatur merged 4 commits into
mainfrom
feat/ui-themes-770
Oct 17, 2026
Merged

CaYatur merged 4 commits into
mainfrom
feat/ui-themes-770

Conversation

@CaYatur

@CaYatur CaYatur commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

Closes #770.

What

Settings → Application → Interface Theme offers seven themes and a Device default option:

  • CaYaDev, the current look and still the default;
  • Dark (neutral graphite);
  • Light;
  • High Contrast (WCAG AAA);
  • Midnight, Sepia and Neon.

Device default follows the OS light/dark preference and switches live.

The theme changes the panel only. The visualizer output, the stream overlay and user colours are untouched. The setting is ui.theme: it travels with settings backups and survives Reset to Defaults.

How

  • src/shared/ui-themes.js holds 64 colour tokens per theme. Channel tokens (--fg-rgb) are used as rgb(var(--fg-rgb) / a), so hover tints flip on light themes.
  • About 320 colour literals in admin.css/studio.css became tokens. :root is the CaYaDev table.
  • The timeline and mapping canvases read tokens and redraw on a theme change.
  • theme-boot.js applies the theme in <head>. The main process opens the window in the theme's background and passes the theme in the address, so there is no dark flash. README shots stay CaYaDev, and nativeTheme.themeSource is not touched.

CaYaDev changes (intentional)

  • --muted2 goes from #8a6f79 to #a1858f. Hint text was 3.4–4.4:1 on cards and needs 4.5:1.
  • Code comments go from #6d5f72 to #9a8aa0 (they were 3.3:1).
  • Solid danger button goes from #e5484d to #d93a40 (white text was 3.9:1).
  • Gradient end on filled buttons is a new token, --accent-grad = #ea2636. --accent2 stays #ff4d5e for headings. White text was 3.96:1 mid-gradient.

Pixel comparison against screenshots taken before any CSS change, with these set back to their old values: the remaining differences were live content, the new picker and one consolidated status green.

Correction (#774): those screenshots did not cover every surface. Reading the old CSS afterwards found more visible CaYaDev changes:

  • near-identical status shades merged into one per role;
  • the Performance View moved from its own neutral greys to the panel's surfaces;
  • the lyric editor and MCP snippets moved to the code editor's colours;
  • Studio's solid danger button became the panel's red;
  • the mapping guide line changed from cyan to info blue;
  • the selected tempo marker became the strong text colour.

#774 also fixes clip cells that this PR's audit skipped: slot-colour tint, countdowns, and the sourceless slot. CHANGELOG and ROADMAP list all of it.

Tests

npm test passes 3215 (+32). The new tests check:

  • token completeness;
  • :root parity with the CaYaDev table;
  • no colour literal in the panel CSS or panel scripts outside the table (a content allowlist with reasons, which cannot go stale);
  • every var() is defined;
  • 128 contrast rules per theme;
  • every CSS rule that sets both a text colour and a background, measured in every theme;
  • the head script in a fake DOM.

Self-test (--smoke, isolated profile): PASS. A new step picks every theme from the picker, scrolls every category and measures the drawn contrast of each visible text, about 2,600 per theme.

Theme Lowest ratio Below threshold
CaYaDev 4.54 0
Dark 4.54 0
Light 4.96 0
High Contrast 7.8 0
Midnight 4.54 0
Sepia 5.12 0
Neon 4.54 0

Also checked by hand in Light and Sepia: the timeline with clips, automation and markers, the clip deck, the shader code editor, search results, confirm dialogs and toasts.

CaYatur and others added 2 commits October 17, 2026 11:31
…770)

- src/shared/ui-themes.js: one table of 64 colour tokens per theme (CaYaDev, Dark, Light, High Contrast, Midnight, Sepia, Neon) plus Device default, which resolves from prefers-color-scheme and follows it live.
- admin.css/studio.css: about 320 colour literals became tokens; channel tokens are used as rgb(var(--x-rgb) / a) so tints flip on light themes; :root is the CaYaDev table.
- Timeline and projection-mapping canvases read tokens and redraw on a theme change.
- theme-boot.js applies the theme in <head>; the main process opens the panel in the theme's background and passes the theme in the address. README shots stay CaYaDev; nativeTheme.themeSource is not touched.
- Settings → Application → Interface Theme picker (radio group, arrow keys); the setting lives in ui.theme, travels with backups and survives Reset to Defaults; MCP group output.
- CaYaDev: --muted2, code comments and the solid danger button raised to 4.5:1; the button gradient end is its own token (--accent-grad) so white text reads mid-gradient.
- Fixed two labels below 3:1 in every theme (crossfader empty side, Studio built-in tag); decorative separators are aria-hidden.
- Tests: token completeness, :root parity, no colour literals outside the table (CSS and panel scripts), defined variables, 128 contrast rules per theme, every CSS text/background pair per theme, head script in a fake DOM. Self-test measures the drawn contrast of every visible text in every theme.

Co-authored-by: caganturgut <271973834+caganturgut@users.noreply.github.com>
Co-authored-by: caganturgut <271973834+caganturgut@users.noreply.github.com>
@cayadraft

cayadraft Bot commented Oct 17, 2026

Copy link
Copy Markdown

@CaYatur

CaYaDraft — pull request

Summary
Interface themes: CaYaDev, Dark, Light, Device default, High Contrast and more (#770)

Files
CHANGELOG.md (modified, +40/-0)
@@ -5,6 +5,46 @@ GitHub. The full reasoning and the measurements behind each change are in [ROADM

Unreleased

+### Control panel
+
+- Interface themes [770]. Settings → Application → Interface Theme offers seven themes and

  • Device default:
    • CaYaDev, the existing look and still the default;
    • Dark, a neutral graphite;
    • Light;
    • High Contrast, black with yellow, held to W…

README.md (modified, +5/-2)
@@ -17,7 +17,7 @@ layers and 40 GPU effects, an OBS overlay, Spout / Syphon, **project
Downloads
License: MIT
[![Platform](https://img.shields.io/badge/platform-Windows%20%…

README.tr.md (modified, +5/-2)
@@ -18,7 +18,7 @@ destesi**, ve MCP üzerinden yapay zekâ kontrolü.
İndirme
Lisans: MIT
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-111997.sv…

ROADMAP.md (modified, +43/-1)
@@ -93,6 +93,7 @@ hands, and a row only moves up once it ships.
|---|:--:|---|
| Per-app audio capture on macOS and Linux | v3.1.6 | On main (#514, #517). Linux verified in WSLg with PulseAudio; macOS written on ScreenCaptureKit and compiled in CI, never run on a Mac. Windows shipped in v3.1.3 |
| Live level meter per application | v3.1.6 | Done on main (#516): a moving dB-scale bar per ap…

src/admin/admin.css (modified, +232/-139)
@@ -5,30 +5,91 @@

  • SPDX-License-Identifier: MIT
    */
    :root {

src/admin/admin.js (modified, +110/-2)
@@ -662,6 +662,8 @@
return window.SVUpdatesPanel ? window.SVUpdatesPanel.panel() : null;
case 'language':
return languageCtrl();

  •  case 'uitheme':
    
  •    return uiThemeCtrl();
     case 'extendedrange':
       return extendedRangeCtrl();
     case 'n…
    

Note
The local model is unavailable, so this is only the title and file list.


Stopping here. I will not merge, push, or change this pull request until you ask.

/caya explain describes the diff. /caya plan previews the next edit. /caya revise adds a commit.

CaYatur and others added 2 commits October 17, 2026 11:38
…cue, plus cell, warn note, media badge (#770)

Adds a guard test that fails when a CSS color uses a theme variable without a contrast rule. Darkens --cue-armed in Light and Sepia, moves the empty-cell plus to --muted2, uses --warn-text for the backup conflict note and checks white text on the media scrim. Test count 3216.

Co-authored-by: caganturgut <271973834+caganturgut@users.noreply.github.com>
# Conflicts:
#	README.md
#	README.tr.md
#	ROADMAP.md
@CaYatur
CaYatur merged commit 03c72cb into main Oct 17, 2026
5 checks passed
@CaYatur
CaYatur deleted the feat/ui-themes-770 branch October 17, 2026 09:01
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.

Settings: interface themes (CaYaDev, dark, light, device default, high contrast)

1 participant