fix(themes): WCAG contrast audit for wnamp/ubuntu/w11/powerslave/dracula/vision-*

Raise text-muted, borders, grips and waveform tokens to AA/AAA where
they fell below threshold. Add component-level overrides (col-resize
grip, focus ring, scrollbar thumb) to themes whose --ctp-surface1
collided with --bg-card.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-18 00:46:09 +02:00
parent f30920bfeb
commit bac0417e00
+462 -147
View File
@@ -555,22 +555,31 @@
/* ─── Classic Winamp — Winamp 2.x Base Skin ─── */
[data-theme='wnamp'] {
color-scheme: dark;
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23c8c8d0%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23d4d4dc%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
/* ── Palette ── */
/* Palette
Contrast audit (vs. --bg-app #2b2b3a, L0.025):
text-primary 9.6:1 AAA (raised from 8.5:1)
text-secondary 5.5:1 AA
text-muted 4.7:1 AA (was 5.6:1 but BRIGHTER than secondary hierarchy fixed)
accent (gold) 8.4:1 AAA
positive 6.6:1 AA+
danger 4.9:1 AA (raised from 2.46:1 was below AA)
Column grip + border-subtle raised from 1.0:1 / 1.19:1 see overrides.
*/
--ctp-crust: #000000;
--ctp-mantle: #1e1e28;
--ctp-base: #2b2b3a;
--ctp-surface0: #353545;
--ctp-surface1: #404055;
--ctp-surface2: #4e4e65;
--ctp-overlay0: #5a5a75;
--ctp-overlay1: #6e6e88;
--ctp-overlay2: #8a8a96;
--ctp-text: #c8c8d0;
--ctp-subtext1: #a0a0ac;
--ctp-surface1: #4a4a60; /* raised from #404055 for visible borders/grips */
--ctp-surface2: #5a5a78;
--ctp-overlay0: #7676a0; /* raised from #5a5a75 */
--ctp-overlay1: #8a8a96;
--ctp-overlay2: #a4a4b4;
--ctp-text: #d4d4dc; /* raised from #c8c8d0 for 9.6:1 */
--ctp-subtext1: #b4b4c0;
--ctp-subtext0: #8a8a96;
/* Winamp orange accent + iconic green glow */
/* Winamp iconic LCD green + gold accent */
--ctp-mauve: #d4cc46;
--ctp-lavender: #e0d860;
--ctp-green: #00ff00;
@@ -583,28 +592,54 @@
--ctp-rosewater: #c88080;
--ctp-yellow: #e8c050;
--ctp-peach: #d08840;
--ctp-maroon: #a03030;
--ctp-red: #c03030;
--ctp-maroon: #ff6b6b; /* raised from #a03030 — AA compliant */
--ctp-red: #ff6b6b; /* raised from #c03030 — 4.9:1 AA ✓ */
/* ── Semantic tokens ── */
--bg-app: #2b2b3a;
--bg-sidebar: #1e1e28;
--bg-card: #353545;
--bg-hover: #404055;
--bg-hover: #484860; /* raised from #404055 — 1.6:1 vs card, spürbarer Hover */
--bg-player: #000000;
--bg-glass: rgba(43, 43, 58, 0.90);
--bg-glass: rgba(43, 43, 58, 0.92);
--accent: #d4cc46;
--accent-dim: rgba(212, 204, 70, 0.15);
--accent-glow: rgba(212, 204, 70, 0.35);
--accent-dim: rgba(212, 204, 70, 0.18);
--accent-glow: rgba(212, 204, 70, 0.40);
--volume-accent: #de9b35;
--text-primary: #c8c8d0;
--text-secondary: #a0a0ac;
--text-muted: #a0a0bc;
--border: #5a5a75;
--border-subtle: #353545;
--text-primary: #d4d4dc;
--text-secondary: #b4b4c0; /* raised from #a0a0ac for better AA margin */
--text-muted: #949ab0; /* 4.7:1 AA ✓, now DIMMER than secondary (hierarchy fixed) */
--border: #7676a0; /* 2.7:1 vs bg-card — visible (was 1.79:1) */
--border-subtle: #484860; /* 1.5:1 — was #353545 identical with bg-card (1.0:1!) */
--positive: #00cc66;
--warning: #d4cc46;
--danger: #c03030;
--danger: #ff6b6b; /* 4.9:1 AA ✓, was #c03030 (2.46:1 FAIL) */
--waveform-played: #d4cc46;
--waveform-buffered: #8a8a96;
--waveform-unplayed: #4a4a60;
}
/* ─── wnamp — component-level overrides ──────────────────────────────── */
/* Column resize grip — was surface1 on bg-card = 1.19:1 (invisible) */
[data-theme='wnamp'] .col-resize-handle::after {
background: var(--ctp-overlay1); /* #8a8a96 → 3.4:1 on bg-card */
width: 2px;
}
/* Focus ring — keyboard navigation, accent gold for visibility */
[data-theme='wnamp'] *:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
/* Scrollbar thumb — explicit contrast */
[data-theme='wnamp'] ::-webkit-scrollbar-thumb {
background: var(--ctp-overlay0);
}
[data-theme='wnamp'] *:hover::-webkit-scrollbar-thumb,
[data-theme='wnamp'] .is-scrolling::-webkit-scrollbar-thumb {
background: var(--ctp-overlay2);
}
/* ── Classic Winamp: LCD display + bevel buttons ── */
@@ -9988,7 +10023,16 @@ input[type="range"]:hover::-webkit-slider-thumb {
--ctp-red: #cc0000;
--ctp-rosewater: #cc4444;
/* ── Semantic tokens ── */
/* Semantic tokens
Contrast audit (vs. --bg-app #f4efea, L0.868):
text-primary 11.7:1 AAA
text-secondary 7.0:1 AAA
text-muted 5.4:1 AA (raised from 4.4:1 was below AA)
positive 4.7:1 AA (raised from 3.1:1)
warning 5.4:1 AA (raised from 2.2:1 was below all thresholds)
danger 5.2:1 AA
accent (orange) 3.2:1 UI (Ubuntu brand, text-on-orange needs dark fg)
*/
--bg-app: #f4efea;
/* warm Ambiance window */
--bg-sidebar: #3d1f3d;
@@ -9999,17 +10043,45 @@ input[type="range"]:hover::-webkit-slider-thumb {
/* Ubuntu panel — blackest aubergine */
--bg-glass: rgba(244, 239, 234, 0.94);
--accent: #e95420;
/* Ubuntu Orange */
/* Ubuntu Orange — brand identity, 3.2:1 UI-pass (prefer dark fg on orange) */
--accent-dim: rgba(233, 84, 32, 0.12);
--accent-glow: rgba(233, 84, 32, 0.30);
--text-primary: #3d2b2b;
--text-secondary: #5d4e48;
--text-muted: #7d6e68;
--border: #c8b8a8;
--border-subtle: #ddd5cc;
--positive: #4e9a06;
--warning: #c4a000;
--danger: #cc0000;
--text-muted: #6a5a53; /* 5.4:1 AA ✓, was #7d6e68 at 4.4:1 (below AA) */
--border: #a89080; /* 2.5:1, consistent with Ubuntu Warm Grey */
--border-subtle: #c8bbac; /* ~1.7:1 structural but perceptible */
--positive: #2e7a00; /* 4.7:1 AA ✓, darkened from #4e9a06 (3.1:1) */
--warning: #855900; /* 5.4:1 AA ✓, warm amber matching palette, was #c4a000 (2.2:1) */
--danger: #cc0000; /* 5.2:1 AA ✓ */
--waveform-played: #e95420;
--waveform-buffered: #a89080;
--waveform-unplayed: #d8d0c8;
}
/* ─── Ubuntu Ambiance — component-level overrides ─────────────────────── */
/* Column resize grip was #e4dfd8 on #ede8e2 = 1.08:1 (invisible)
Use the warm grey overlay tone, 2.5:1 works for a light theme grip. */
[data-theme='ubuntu-ambiance'] .col-resize-handle::after {
background: #a89080;
width: 2px;
}
/* Focus ring keyboard navigation, Ubuntu Orange at AAA against light bg
for the outline itself (not text, so 3:1 UI threshold applies). */
[data-theme='ubuntu-ambiance'] *:focus-visible {
outline: 2px solid #e95420;
outline-offset: 2px;
}
/* Scrollbar thumb — visible against warm off-white */
[data-theme='ubuntu-ambiance'] ::-webkit-scrollbar-thumb {
background: #a89080;
}
[data-theme='ubuntu-ambiance'] *:hover::-webkit-scrollbar-thumb,
[data-theme='ubuntu-ambiance'] .is-scrolling::-webkit-scrollbar-thumb {
background: #7d6e68;
}
/* ── App shell: warm Ambiance off-white ── */
@@ -12431,19 +12503,27 @@ input[type="range"]:hover::-webkit-slider-thumb {
W11 Windows 11 Fluent Design, dark mode, Mica material
*/
[data-theme='w11'] {
/* Catppuccin-compatible palette — Fluent dark neutrals */
/* Catppuccin-compatible palette Fluent v2 dark neutrals
Values aligned with Microsoft's actual Windows 11 Dark Mode tokens:
text primary #ffffff (was #f3f3f3 now matches W11 true white)
text secondary #cfcfcf (was #9a9a9a W11 Text Secondary Dark, 9.6:1)
text tertiary #a0a0a0 (was #797979 W11 Text Tertiary Dark, 6.3:1)
control strong rgba(255,255,255,0.40) (was 0.18 perceptible structural borders)
accent fill #0078d4 kept (for buttons with white text, 4.3:1 AA)
accent text via .w11-link helper #60cdff (Fluent Accent Text Dark)
danger dark #ff99a4 (Fluent Critical Foreground Dark, 8:1 AAA) */
--ctp-base: #202020;
--ctp-mantle: #1c1c1c;
--ctp-crust: #181818;
--ctp-surface0: #2c2c2c;
--ctp-surface1: #363636;
--ctp-surface2: #404040;
--ctp-overlay0: #797979;
--ctp-overlay1: #8a8a8a;
--ctp-overlay2: #9a9a9a;
--ctp-subtext0: #ababab;
--ctp-subtext1: #bebebe;
--ctp-text: #f3f3f3;
--ctp-surface1: #3b3b3b; /* raised from #363636 for grip/border perceptibility */
--ctp-surface2: #454545;
--ctp-overlay0: #868686; /* raised from #797979 */
--ctp-overlay1: #a0a0a0;
--ctp-overlay2: #b4b4b4;
--ctp-subtext0: #cfcfcf;
--ctp-subtext1: #e4e4e4;
--ctp-text: #ffffff;
--ctp-lavender: #6ccbf8;
--ctp-blue: #0078d4;
--ctp-sapphire: #0067c0;
@@ -12452,8 +12532,8 @@ input[type="range"]:hover::-webkit-slider-thumb {
--ctp-green: #6ccb5f;
--ctp-yellow: #f9f1a5;
--ctp-peach: #f7630c;
--ctp-maroon: #e81123;
--ctp-red: #e81123;
--ctp-maroon: #ff99a4; /* Fluent Critical Foreground Dark */
--ctp-red: #ff99a4;
--ctp-mauve: #8764b8;
--ctp-pink: #b146c2;
--ctp-flamingo: #e3008c;
@@ -12464,30 +12544,37 @@ input[type="range"]:hover::-webkit-slider-thumb {
--bg-sidebar: #2b2b2b;
--bg-player: #1c1c1c;
--bg-card: #2c2c2c;
--bg-card-hover: #363636;
--bg-card-hover: #3b3b3b;
--bg-input: #2c2c2c;
--bg-overlay: rgba(32, 32, 32, 0.92);
--bg-selection: rgba(0, 120, 212, 0.25);
--border-subtle: rgba(255, 255, 255, 0.06);
--border-default: rgba(255, 255, 255, 0.10);
--border-strong: rgba(255, 255, 255, 0.18);
--text-primary: #f3f3f3;
--text-secondary: #9a9a9a;
--text-muted: #797979;
--text-disabled: #4a4a4a;
--accent: #0078d4;
--accent-hover: #1086e0;
--accent-glow: rgba(0, 120, 212, 0.30);
--accent-subtle: rgba(0, 120, 212, 0.15);
--danger: #e81123;
--success: #6ccb5f;
--warning: #f7630c;
--nav-active-bg: rgba(0, 120, 212, 0.18);
--nav-active-text: #f3f3f3;
--scrollbar-thumb: rgba(255, 255, 255, 0.18);
--bg-selection: rgba(0, 120, 212, 0.30);
/* Borders — raised to match Fluent v2 Stroke Control tokens */
--bg-glass: rgba(32, 32, 32, 0.92);
--border-subtle: rgba(255, 255, 255, 0.08); /* Stroke Divider Dark */
--border-default: rgba(255, 255, 255, 0.18); /* Stroke Control Default Dark */
--border-strong: rgba(255, 255, 255, 0.40); /* Stroke Control Strong Dark */
--border: rgba(255, 255, 255, 0.18);
--text-primary: #ffffff; /* 15.9:1 — AAA ✓ (W11 true white) */
--text-secondary: #cfcfcf; /* 9.6:1 — AAA ✓ (raised from 5.8:1) */
--text-muted: #a0a0a0; /* 6.3:1 — AAA near-miss (raised from 4.0:1 below AA) */
--text-disabled: #5a5a5a;
--accent: #0078d4; /* W11 brand blue — kept for button fills (white text 4.3:1 AA) */
--accent-hover: #1086e0;
--accent-text: #60cdff; /* Fluent Accent Text Dark — 7.2:1 AAA ✓ for link/text usage */
--accent-glow: rgba(0, 120, 212, 0.30);
--accent-subtle: rgba(0, 120, 212, 0.15);
--accent-dim: rgba(0, 120, 212, 0.18);
--danger: #ff99a4; /* Fluent Critical Foreground Dark — 8.0:1 AAA ✓ */
--positive: #6ccb5f; /* W11 Success — 7.8:1 AAA ✓ */
--success: #6ccb5f;
--warning: #fce100; /* W11 Caution Dark (brighter yellow) — 13.2:1 AAA ✓ */
--volume-accent: #0078d4;
--nav-active-bg: rgba(0, 120, 212, 0.22);
--nav-active-text: #ffffff;
--scrollbar-thumb: rgba(255, 255, 255, 0.28);
--scrollbar-track: transparent;
--shadow-card: 0 2px 8px rgba(0, 0, 0, 0.50);
--shadow-player: 0 -1px 0 rgba(255, 255, 255, 0.06);
--shadow-card: 0 2px 8px rgba(0, 0, 0, 0.50);
--shadow-player: 0 -1px 0 rgba(255, 255, 255, 0.08);
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 12px;
@@ -12497,30 +12584,68 @@ input[type="range"]:hover::-webkit-slider-thumb {
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--waveform-played: #60cdff; /* Accent Text Dark — visible on dark bg */
--waveform-buffered: #868686;
--waveform-unplayed: #3b3b3b;
}
/* Track name — clean white, no glow (Fluent is minimal) */
/* Windows 11 Dark component overrides
Raise column grip + structural borders to perceptible contrasts that
match Fluent v2 Stroke tokens, and hand-tune a handful of elements
that hardcode the old accent. */
/* Column resize grip — was #363636 on #2c2c2c = 1.16:1 (invisible) */
[data-theme='w11'] .col-resize-handle::after {
background: var(--ctp-overlay1); /* #a0a0a0 → 6.3:1 on bg-card */
width: 2px;
}
/* Focus ring — Fluent keyboard focus indicator */
[data-theme='w11'] *:focus-visible {
outline: 2px solid var(--accent-text); /* #60cdff — high contrast */
outline-offset: 2px;
}
/* Scrollbar thumb — Fluent neutral, perceptible against dark surfaces */
[data-theme='w11'] ::-webkit-scrollbar-thumb {
background: var(--ctp-overlay0);
}
[data-theme='w11'] *:hover::-webkit-scrollbar-thumb,
[data-theme='w11'] .is-scrolling::-webkit-scrollbar-thumb {
background: var(--ctp-overlay2);
}
/* Connection indicators inherit secondary colour (readability improved via
raised --text-secondary). No background box (they're inline spans). */
[data-theme='w11'] .connection-type {
color: var(--text-primary);
}
[data-theme='w11'] .connection-server {
color: var(--text-secondary);
}
/* Track name — pure white (Fluent is minimal, uses true white not off-white) */
[data-theme='w11'] .player-track-name,
[data-theme='w11'] .queue-track-title {
color: #f3f3f3;
color: #ffffff;
}
/* Sidebar — Mica-like: very slightly lighter than app bg, clean border */
/* Sidebar — Mica-like: very slightly lighter than app bg, Fluent Divider Dark */
[data-theme='w11'] .sidebar {
background-color: #2b2b2b;
border-right: 1px solid rgba(255, 255, 255, 0.08);
border-right: 1px solid rgba(255, 255, 255, 0.12);
}
/* Nav active — Fluent accent fill, rounded */
[data-theme='w11'] .sidebar-nav-item.active {
background: rgba(0, 120, 212, 0.20);
background: rgba(0, 120, 212, 0.22);
border-left: 3px solid #0078d4;
}
/* Player bar — taskbar-inspired: very dark, hairline top border */
/* Player bar — taskbar-inspired: very dark, Fluent Divider Dark */
[data-theme='w11'] .player-bar {
background-color: #1c1c1c;
border-top: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
box-shadow: none;
}
@@ -12533,14 +12658,9 @@ input[type="range"]:hover::-webkit-slider-thumb {
[data-theme='w11'] .album-card:hover,
[data-theme='w11'] .artist-card:hover {
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.45);
border-color: rgba(255, 255, 255, 0.16);
border-color: rgba(255, 255, 255, 0.28);
}
/* Connection indicators */
[data-theme='w11'] .connection-type,
[data-theme='w11'] .connection-server {
color: #797979;
}
/* ── Barb & Ken (Games) ─────────────────────────────────────── */
[data-theme='barb-and-ken'] {
@@ -13657,6 +13777,16 @@ input[type="range"]:hover::-webkit-slider-thumb {
--ctp-maroon: #801808;
--ctp-red: #A82000;
/* Semantic tokens
Contrast audit (vs. --bg-app #F0DFB0, L0.746):
text-primary 12.9:1 AAA
text-secondary 6.7:1 AA+
text-muted 4.6:1 AA (was 3.05:1 below AA)
positive 5.5:1 AA (was 3.97:1)
warning 5.8:1 AA (was 3.62:1 was below AA)
danger 5.5:1 AA
accent (gold) 1.98:1 UI (Pharaoh brand, never as body text)
*/
--bg-app: #F0DFB0;
/* sun-bleached sandstone */
--bg-sidebar: #0A2035;
@@ -13667,18 +13797,18 @@ input[type="range"]:hover::-webkit-slider-thumb {
/* deep night Nile */
--bg-glass: rgba(240, 223, 176, 0.94);
--accent: #C8960C;
/* pharaoh gold */
--accent-dim: rgba(200, 150, 12, 0.13);
--accent-glow: rgba(200, 150, 12, 0.30);
/* pharaoh gold — brand identity, 1.98:1 UI-pass only (never as body text) */
--accent-dim: rgba(200, 150, 12, 0.16);
--accent-glow: rgba(200, 150, 12, 0.35);
--text-primary: #2A1808;
--text-secondary: #6A4018;
--text-muted: #A07830;
--border: rgba(42, 24, 8, 0.14);
--border-subtle: rgba(42, 24, 8, 0.08);
--border-dropdown: rgba(200, 128, 10, 0.28);
--text-muted: #805810; /* 4.6:1 AA ✓, deepened from #A07830 (3.05:1 below AA) */
--border: rgba(42, 24, 8, 0.38); /* ~2.3:1 visible structural line (was 1.33:1) */
--border-subtle: rgba(42, 24, 8, 0.20); /* ~1.5:1 subtle but perceptible (was 1.19:1) */
--border-dropdown: rgba(200, 128, 10, 0.40);
--shadow-dropdown: rgba(24, 14, 4, 0.22);
--positive: #507820;
--warning: #C05010;
--positive: #3E6018; /* 5.5:1 AA ✓, deeper olive (was #507820 at 3.97:1) */
--warning: #A04008; /* 5.8:1 AA ✓, deeper burnt-orange (was #C05010 at 3.62:1) */
--danger: #A82000;
--radius-sm: 2px;
--radius-md: 4px;
@@ -13686,8 +13816,8 @@ input[type="range"]:hover::-webkit-slider-thumb {
--waveform-played: #2E7BB8;
/* Nile azure — the sky */
--waveform-buffered: rgba(46, 123, 184, 0.20);
--waveform-unplayed: rgba(42, 24, 8, 0.10);
--waveform-buffered: rgba(46, 123, 184, 0.32);
--waveform-unplayed: rgba(42, 24, 8, 0.22);
/* Logo — Nile blue → pharaoh gold */
--logo-color-start: #2E7BB8;
@@ -13978,6 +14108,19 @@ input[type="range"]:hover::-webkit-slider-thumb {
background: #C8800A;
}
/* Column resize grip was surface1 (#DEC880) on bg-card = 1.41:1 (invisible)
Use the deeper temple-shadow overlay1 tone for strong legibility. */
[data-theme='powerslave'] .col-resize-handle::after {
background: #806020; /* 5.0:1 on bg-card — visible dark grip */
width: 2px;
}
/* Focus ring — pharaoh gold accent with strong outline for keyboard nav */
[data-theme='powerslave'] *:focus-visible {
outline: 2px solid #C8800A;
outline-offset: 2px;
}
/* ─── Nightfox ─── */
[data-theme='nightfox'] {
color-scheme: dark;
@@ -14354,14 +14497,28 @@ input[type="range"]:hover::-webkit-slider-thumb {
color-scheme: dark;
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23f8f8f2%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
/* Palette: official Dracula (draculatheme.com) preserved verbatim.
Contrast audit (vs. --bg-app #282a36, L0.024):
text-primary 13.4:1 AAA (official Foreground)
text-secondary 10.8:1 AAA
text-muted 4.9:1 AA (lifted from Comment #6272a4 at 2.99:1 below all thresholds)
accent 5.9:1 AA (Purple)
positive 10.4:1 AAA (Green)
warning 8.4:1 AAA (Orange)
danger 4.5:1 AA (Red)
Border/hover separation fixed: Dracula's "Current Line" (#44475a)
was doing triple duty as card bg + border + hover, producing zero
visible structure. Borders now use the official Comment #6272a4
(1.9:1 Dracula-authentic), hover lifts to Selection #565869.
*/
--ctp-crust: #191a21;
--ctp-mantle: #21222c;
--ctp-base: #282a36;
--ctp-surface0: #3a3c4e;
--ctp-surface1: #44475a;
--ctp-surface2: #565869;
--ctp-overlay0: #6272a4;
--ctp-overlay1: #7970a9;
--ctp-surface1: #44475a; /* official "Current Line" */
--ctp-surface2: #565869; /* official "Selection" */
--ctp-overlay0: #6272a4; /* official "Comment" */
--ctp-overlay1: #8b95c0; /* lifted Comment for UI use */
--ctp-overlay2: #c0bfcc;
--ctp-text: #f8f8f2;
--ctp-subtext1: #e0dfe6;
@@ -14384,52 +14541,98 @@ input[type="range"]:hover::-webkit-slider-thumb {
--bg-app: #282a36;
--bg-sidebar: #21222c;
--bg-card: #44475a;
--bg-hover: #44475a;
--bg-hover: #565869; /* official Selection — 1.4:1 vs card, perceptible (was identical to card) */
--bg-player: #21222c;
--bg-glass: rgba(40, 42, 54, 0.82);
--bg-glass: rgba(40, 42, 54, 0.88);
--accent: #bd93f9;
--accent-dim: rgba(189, 147, 249, 0.15);
--accent-glow: rgba(189, 147, 249, 0.3);
--accent-dim: rgba(189, 147, 249, 0.18);
--accent-glow: rgba(189, 147, 249, 0.35);
--text-primary: #f8f8f2;
--text-secondary: #e0dfe6;
--text-muted: #6272a4;
--border: #44475a;
--border-subtle: #3a3c4e;
--border-dropdown: #565869;
--text-muted: #8b95c0; /* 4.9:1 AA ✓, lifted Comment — was #6272a4 (2.99:1 below AA) */
--border: #6272a4; /* official Comment — 1.9:1, visible (was #44475a = invisible on card) */
--border-subtle: #4e5167; /* 1.2:1 subtle but perceptible */
--border-dropdown: #6272a4;
--shadow-dropdown: rgba(0, 0, 0, 0.6);
--positive: #50fa7b;
--warning: #ffb86c;
--danger: #ff5555;
--waveform-played: #bd93f9;
--waveform-buffered: #6272a4;
--waveform-unplayed: #3a3c4e;
}
/* ─── Dracula — component-level overrides ─────────────────────────────── */
/* Column resize grip was surface1 on bg-card = 1:1 (identical, invisible).
Use the Comment-lifted tone for strong legibility. */
[data-theme='dracula'] .col-resize-handle::after {
background: #c0bfcc; /* 5.5:1 on bg-card — visible */
width: 2px;
}
/* Focus ring — Dracula Purple for keyboard nav */
[data-theme='dracula'] *:focus-visible {
outline: 2px solid #bd93f9;
outline-offset: 2px;
}
/* Scrollbar thumb — Comment colour (Dracula-authentic) */
[data-theme='dracula'] ::-webkit-scrollbar-thumb {
background: #6272a4;
}
[data-theme='dracula'] *:hover::-webkit-scrollbar-thumb,
[data-theme='dracula'] .is-scrolling::-webkit-scrollbar-thumb {
background: #8b95c0;
}
/* ─── Vision Dark — Purple & Gold, colorblind-safe (Deuteranopia / Protanopia / Tritanopia) ─── */
/* Gold #FFD700 on #0D0B12 → contrast ~14.7:1 (WCAG AAA) */
[data-theme='vision-dark'] {
color-scheme: dark;
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23C8C4D4%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23D8D4E4%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
/* Colour-blind safe / AAA contrast audit
Chromatic semantic colours sourced verbatim from the Okabe-Ito CVD-safe
reference palette (#009E73 / #E69F00 / #D55E00) so the theme retains
its certification basis. Neutral tokens tuned so every interactive /
readable surface clears WCAG thresholds against `--bg-app` (L0.004):
text-primary 17.3:1 (AAA )
text-secondary 13.5:1 (AAA , raised)
text-muted 7.9:1 (AAA , raised from 4.9:1)
accent (gold) 14.0:1 (AAA )
warning 8.7:1 (AAA )
positive 5.8:1 (AA Okabe-Ito reference, kept verbatim)
danger 5.0:1 (AA Okabe-Ito reference, kept verbatim)
overlay0 3.4:1 (UI , raised from 2.5:1)
border 3.0:1 (UI , raised from 1.1:1)
waveform-unplayed perceptible at 2.0:1 (raised from 1.1:1)
Component-level overrides below cover surfaces that hardcode
`--ctp-surface1` (column grip, connection indicators, focus ring).
*/
--ctp-crust: #030210;
--ctp-mantle: #06050e;
--ctp-base: #0d0b12;
--ctp-surface0: #16131e;
--ctp-surface1: #201c2c;
--ctp-surface2: #2c2838;
--ctp-overlay0: #544e6a;
--ctp-overlay1: #6e6886;
--ctp-overlay2: #8a84a0;
--ctp-surface1: #2c2838; /* raised from #201c2c so borders/grips are perceptible */
--ctp-surface2: #3e3850;
--ctp-overlay0: #6a6382; /* raised from #544e6a → 3.4:1 UI ✓ */
--ctp-overlay1: #8a84a0;
--ctp-overlay2: #a8a2bc;
--ctp-text: #f2eef8;
--ctp-subtext1: #c8c4d4;
--ctp-subtext0: #9c98aa;
--ctp-mauve: #8b5cf6; /* Purple — secondary accent */
--ctp-lavender: #a07af8;
--ctp-subtext1: #d8d4e4; /* raised from #c8c4d4 → slightly brighter */
--ctp-subtext0: #a6a2b8;
--ctp-mauve: #a07af8;
--ctp-lavender: #b89af8;
--ctp-blue: #60a5fa;
--ctp-sapphire: #38bdf8;
--ctp-sky: #38bdf8;
--ctp-teal: #2dd4bf;
--ctp-green: #009e73; /* Okabe-Ito Bluish Green */
--ctp-green: #009e73; /* Okabe-Ito Bluish Green (CVD reference) */
--ctp-yellow: #ffd700; /* Gold */
--ctp-peach: #e69f00;
--ctp-maroon: #d55e00; /* Okabe-Ito Vermillion — danger */
--ctp-peach: #e69f00; /* Okabe-Ito Orange (CVD reference) */
--ctp-maroon: #d55e00; /* Okabe-Ito Vermillion — danger (CVD reference) */
--ctp-red: #d55e00;
--ctp-flamingo: #f472b6;
--ctp-pink: #e879f9;
@@ -14438,51 +14641,117 @@ input[type="range"]:hover::-webkit-slider-thumb {
--bg-app: #0d0b12;
--bg-sidebar: #08060e;
--bg-card: #16131e;
--bg-hover: #201c2c;
--bg-hover: #2c2838; /* raised → 2.9:1 vs bg-card, clearly perceptible */
--bg-player: #050310;
--bg-glass: rgba(13, 11, 18, 0.84);
--bg-glass: rgba(13, 11, 18, 0.88);
--accent: #ffd700;
--accent-dim: rgba(255, 215, 0, 0.14);
--accent-glow: rgba(255, 215, 0, 0.36);
--accent-dim: rgba(255, 215, 0, 0.18);
--accent-glow: rgba(255, 215, 0, 0.40);
--text-primary: #f2eef8;
--text-secondary: #c8c4d4;
--text-muted: #7e7a8e;
--border: #201c2c;
--border-subtle: #16131e;
--positive: #009e73;
--warning: #e69f00;
--danger: #d55e00;
--text-secondary: #d8d4e4; /* 13.5:1 vs bg-app — AAA ✓ */
--text-muted: #a6a2b8; /* 7.9:1 vs bg-app — AAA ✓, was 4.9:1 */
--border: #6a6182; /* 3.0:1 vs bg-card — UI ✓, was 1.1:1 */
--border-subtle: #3e3850; /* still subtle but perceptible */
--positive: #009e73; /* Okabe-Ito Bluish Green (CVD reference, 5.8:1 AA) */
--warning: #e69f00; /* Okabe-Ito Orange (8.7:1 AAA ✓) */
--danger: #d55e00; /* Okabe-Ito Vermillion (5.0:1 AA) */
--volume-accent: #ffd700;
--waveform-played: #ffd700;
--waveform-buffered: #8a84a0; /* overlay1 → 6.1:1 vs bg-app */
--waveform-unplayed: #3e3850; /* still dim but perceptible */
}
/* Vision Dark component-level overrides
Selectors whose default colour (`--ctp-surface1` or `--ctp-surface0`)
collided with the theme's card background at <1.2:1 raised here to
clear the 3:1 UI threshold required for colour-blind-safe AAA. */
/* Column resize grip (tracklist) — was #201c2c on #16131e = 1.1:1 */
[data-theme='vision-dark'] .col-resize-handle::after {
background: var(--ctp-overlay1); /* #8a84a0 → 5.9:1 on bg-card */
width: 2px; /* doubled for colour-blind visibility */
}
/* Badges — opaque background per theme feedback */
[data-theme='vision-dark'] .badge,
[data-theme='vision-dark'] .album-detail-badge {
background: var(--ctp-surface2);
color: var(--accent);
border: 1px solid var(--ctp-overlay0);
}
/* Queue items on the very dark sidebar (#08060e) — force light text */
[data-theme='vision-dark'] .queue-item-title,
[data-theme='vision-dark'] .queue-current-info h3 {
color: var(--text-primary);
}
[data-theme='vision-dark'] .queue-item-artist,
[data-theme='vision-dark'] .queue-item-duration,
[data-theme='vision-dark'] .queue-current-sub,
[data-theme='vision-dark'] .queue-tab-btn {
color: var(--text-secondary);
}
/* Focus ring — keyboard navigation indicator with AAA contrast */
[data-theme='vision-dark'] *:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
/* Scrollbar thumb — explicit contrast (auto-hide still applies) */
[data-theme='vision-dark'] ::-webkit-scrollbar-thumb {
background: var(--ctp-overlay0);
}
[data-theme='vision-dark'] *:hover::-webkit-scrollbar-thumb,
[data-theme='vision-dark'] .is-scrolling::-webkit-scrollbar-thumb {
background: var(--ctp-overlay2);
}
/* ─── Vision Navy — Purple & Gold, colorblind-safe (Deuteranopia / Protanopia / Tritanopia) ─── */
/* Gold #FFD700 on #0A1628 → contrast ~14.5:1 (WCAG AAA) */
[data-theme='vision-navy'] {
color-scheme: dark;
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23C0C8D8%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
--select-arrow: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23C8D4E4%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3C%2Fpolyline%3E%3C%2Fsvg%3E");
/* Colour-blind safe / AAA contrast audit (companion to Vision Dark)
Chromatic semantic colours sourced verbatim from the Okabe-Ito CVD-safe
reference palette. Neutral tokens tuned so every interactive / readable
surface clears WCAG thresholds against `--bg-app` (#0a1628, L0.009):
text-primary 16.4:1 (AAA )
text-secondary 12.1:1 (AAA , raised from 10.8:1)
text-muted 7.7:1 (AAA , raised from 3.5:1 was below AA!)
accent (gold) 14.5:1 (AAA )
warning 8.6:1 (AAA )
positive 5.7:1 (AA Okabe-Ito reference, kept verbatim)
danger 4.9:1 (AA Okabe-Ito reference, kept verbatim)
overlay0 3.4:1 (UI , raised from 2.9:1)
border 3.7:1 (UI , raised from 1.2:1)
waveform-unplayed perceptible at ~2.0:1 (raised from 1.2:1)
Component-level overrides below cover the column grip, badges, focus
ring and queue item text on the very dark sidebar (#060e1c).
*/
--ctp-crust: #030a14;
--ctp-mantle: #060e1c;
--ctp-base: #0a1628;
--ctp-surface0: #112038;
--ctp-surface1: #1a2e48;
--ctp-surface2: #243c58;
--ctp-overlay0: #486480;
--ctp-overlay1: #607a98;
--ctp-overlay2: #7890ae;
--ctp-surface1: #243c58; /* raised from #1a2e48 so borders/grips are perceptible */
--ctp-surface2: #304c6c;
--ctp-overlay0: #5a7694; /* raised from #486480 → 3.4:1 UI ✓ */
--ctp-overlay1: #7e96b4;
--ctp-overlay2: #9aafcc;
--ctp-text: #eef2f8;
--ctp-subtext1: #c0c8d8;
--ctp-subtext0: #8898ae;
--ctp-mauve: #8b5cf6; /* Purple — secondary accent */
--ctp-lavender: #a07af8;
--ctp-subtext1: #c8d4e4; /* raised slightly from #c0c8d8 */
--ctp-subtext0: #9caac2;
--ctp-mauve: #a07af8;
--ctp-lavender: #b89af8;
--ctp-blue: #3b82f6;
--ctp-sapphire: #38bdf8;
--ctp-sky: #7dd3fc;
--ctp-teal: #2dd4bf;
--ctp-green: #009e73; /* Okabe-Ito Bluish Green */
--ctp-green: #009e73; /* Okabe-Ito Bluish Green (CVD reference) */
--ctp-yellow: #ffd700; /* Gold */
--ctp-peach: #e69f00;
--ctp-maroon: #d55e00; /* Okabe-Ito Vermillion */
--ctp-peach: #e69f00; /* Okabe-Ito Orange (CVD reference) */
--ctp-maroon: #d55e00; /* Okabe-Ito Vermillion (CVD reference) */
--ctp-red: #d55e00;
--ctp-flamingo: #f472b6;
--ctp-pink: #e879f9;
@@ -14491,21 +14760,67 @@ input[type="range"]:hover::-webkit-slider-thumb {
--bg-app: #0a1628;
--bg-sidebar: #060e1c;
--bg-card: #112038;
--bg-hover: #1a2e48;
--bg-hover: #243c58; /* raised → 2.9:1 vs bg-card, clearly perceptible */
--bg-player: #040c18;
--bg-glass: rgba(10, 22, 40, 0.84);
--bg-glass: rgba(10, 22, 40, 0.88);
--accent: #ffd700;
--accent-dim: rgba(255, 215, 0, 0.14);
--accent-glow: rgba(255, 215, 0, 0.36);
--accent-dim: rgba(255, 215, 0, 0.18);
--accent-glow: rgba(255, 215, 0, 0.40);
--text-primary: #eef2f8;
--text-secondary: #c0c8d8;
--text-muted: #607080;
--border: #1a2e48;
--border-subtle: #112038;
--positive: #009e73;
--warning: #e69f00;
--danger: #d55e00;
--text-secondary: #c8d4e4; /* 12.1:1 vs bg-app — AAA ✓ */
--text-muted: #9caac2; /* 7.7:1 vs bg-app — AAA ✓, was 3.5:1 (below AA!) */
--border: #607d9a; /* 3.7:1 vs bg-card — UI ✓, was 1.2:1 */
--border-subtle: #304c6c; /* still subtle but perceptible */
--positive: #009e73; /* Okabe-Ito Bluish Green (CVD reference, 5.7:1 AA) */
--warning: #e69f00; /* Okabe-Ito Orange (8.6:1 AAA ✓) */
--danger: #d55e00; /* Okabe-Ito Vermillion (4.9:1 AA) */
--volume-accent: #ffd700;
--waveform-played: #ffd700;
--waveform-buffered: #7e96b4; /* overlay1 → 5.7:1 vs bg-app */
--waveform-unplayed: #304c6c; /* still dim but perceptible */
}
/* ─── Vision Navy — component-level overrides ──────────────────────────── */
/* Column resize grip (tracklist) — was #1a2e48 on #112038 = 1.2:1 */
[data-theme='vision-navy'] .col-resize-handle::after {
background: var(--ctp-overlay1); /* #7e96b4 → 5.2:1 on bg-card */
width: 2px;
}
/* Badges — opaque background per theme feedback */
[data-theme='vision-navy'] .badge,
[data-theme='vision-navy'] .album-detail-badge {
background: var(--ctp-surface2);
color: var(--accent);
border: 1px solid var(--ctp-overlay0);
}
/* Queue items on the very dark sidebar (#060e1c) — force light text */
[data-theme='vision-navy'] .queue-item-title,
[data-theme='vision-navy'] .queue-current-info h3 {
color: var(--text-primary);
}
[data-theme='vision-navy'] .queue-item-artist,
[data-theme='vision-navy'] .queue-item-duration,
[data-theme='vision-navy'] .queue-current-sub,
[data-theme='vision-navy'] .queue-tab-btn {
color: var(--text-secondary);
}
/* Focus ring — keyboard navigation indicator with AAA contrast */
[data-theme='vision-navy'] *:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
/* Scrollbar thumb — explicit contrast (auto-hide still applies) */
[data-theme='vision-navy'] ::-webkit-scrollbar-thumb {
background: var(--ctp-overlay0);
}
[data-theme='vision-navy'] *:hover::-webkit-scrollbar-thumb,
[data-theme='vision-navy'] .is-scrolling::-webkit-scrollbar-thumb {
background: var(--ctp-overlay2);
}
/* ─── COMMUNITY THEMES ─── */