claude-code-kanban 4.8.0 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-kanban",
3
- "version": "4.8.0",
3
+ "version": "4.9.0",
4
4
  "description": "A web-based Kanban board for viewing Claude Code tasks with agent teams support",
5
5
  "main": "server.js",
6
6
  "bin": {
package/public/app.js CHANGED
@@ -5986,6 +5986,69 @@ function loadTheme() {
5986
5986
  updateThemeIcon();
5987
5987
  updateThemeColor(document.body.classList.contains('light'));
5988
5988
  syncHljsTheme();
5989
+ buildThemeMenu();
5990
+ const colorTheme = localStorage.getItem('color-theme');
5991
+ if (colorTheme) document.body.dataset.colorTheme = colorTheme;
5992
+ syncColorThemeSelect(colorTheme || 'ember');
5993
+ }
5994
+
5995
+ const COLOR_THEMES = [
5996
+ ['ember', 'Ember'],
5997
+ ['gruvbox', 'Gruvbox'],
5998
+ ['catppuccin', 'Catppuccin'],
5999
+ ['tokyo-night', 'Tokyo Night'],
6000
+ ['solarized', 'Solarized'],
6001
+ ['dracula', 'Dracula'],
6002
+ ['nord', 'Nord'],
6003
+ ['rose-pine', 'Rosé Pine'],
6004
+ ['everforest', 'Everforest'],
6005
+ ['kanagawa', 'Kanagawa'],
6006
+ ['one-dark', 'One Dark'],
6007
+ ['night-owl', 'Night Owl'],
6008
+ ['monokai', 'Monokai Pro'],
6009
+ ['github', 'GitHub'],
6010
+ ['ayu', 'Ayu'],
6011
+ ['vitesse', 'Vitesse'],
6012
+ ['synthwave', "Synthwave '84"],
6013
+ ];
6014
+
6015
+ function buildThemeMenu() {
6016
+ const menu = document.getElementById('themeMenu');
6017
+ menu.innerHTML = COLOR_THEMES.map(
6018
+ ([id, label]) =>
6019
+ `<button type="button" class="theme-menu-item" data-theme-id="${id}"
6020
+ onclick="event.stopPropagation(); setColorTheme('${id}'); toggleThemeMenu()">
6021
+ <span class="theme-swatch theme-swatch-${id}"><i class="sw-bg"></i><i class="sw-accent"></i><i class="sw-ink"></i></span>${label}
6022
+ </button>`,
6023
+ ).join('');
6024
+ }
6025
+
6026
+ // biome-ignore lint/correctness/noUnusedVariables: used in HTML
6027
+ function toggleThemeMenu(e) {
6028
+ e?.stopPropagation();
6029
+ const menu = document.getElementById('themeMenu');
6030
+ const open = menu.classList.toggle('open');
6031
+ if (open) {
6032
+ document.addEventListener('click', () => menu.classList.remove('open'), { once: true });
6033
+ }
6034
+ }
6035
+
6036
+ function syncColorThemeSelect(id) {
6037
+ document.querySelectorAll('.theme-menu-item').forEach((el) => {
6038
+ el.classList.toggle('on', el.dataset.themeId === (id || 'ember'));
6039
+ });
6040
+ }
6041
+
6042
+ // 'ember' (the :root default) has no override block — selecting it clears the attribute.
6043
+ function setColorTheme(id) {
6044
+ if (!id || id === 'ember') {
6045
+ delete document.body.dataset.colorTheme;
6046
+ localStorage.removeItem('color-theme');
6047
+ } else {
6048
+ document.body.dataset.colorTheme = id;
6049
+ localStorage.setItem('color-theme', id);
6050
+ }
6051
+ syncColorThemeSelect(id);
5989
6052
  }
5990
6053
 
5991
6054
  //#endregion
@@ -7065,21 +7128,35 @@ window.hubNavigate = function hubNavigate(app, url) {
7065
7128
 
7066
7129
  (function initHubTheme() {
7067
7130
  const getTheme = () => (document.body.classList.contains('light') ? 'light' : 'dark');
7131
+ const getColorTheme = () => document.body.dataset.colorTheme || 'ember';
7068
7132
  const hubOrigin = () => (window.__HUB__?.url ? new URL(window.__HUB__.url).origin : null);
7133
+ // lastTheme/lastColorTheme are updated synchronously when applying a hub
7134
+ // message, so the (async) observer sees no diff and doesn't echo it back.
7069
7135
  let lastTheme = getTheme();
7136
+ let lastColorTheme = getColorTheme();
7070
7137
  window.addEventListener('message', (e) => {
7071
7138
  if (e.source !== window.parent || e.origin !== hubOrigin()) return;
7072
7139
  if (e.data?.type !== 'hub:theme') return;
7073
- if (getTheme() === e.data.theme) return;
7074
- window.toggleTheme();
7075
- lastTheme = getTheme();
7140
+ if (typeof e.data.colorTheme === 'string' && e.data.colorTheme !== getColorTheme()) {
7141
+ setColorTheme(e.data.colorTheme);
7142
+ lastColorTheme = getColorTheme();
7143
+ }
7144
+ if (getTheme() !== e.data.theme) {
7145
+ window.toggleTheme();
7146
+ lastTheme = getTheme();
7147
+ }
7076
7148
  });
7077
7149
  new MutationObserver(() => {
7078
7150
  const t = getTheme();
7079
- if (t === lastTheme) return;
7151
+ const ct = getColorTheme();
7152
+ if (t === lastTheme && ct === lastColorTheme) return;
7080
7153
  lastTheme = t;
7154
+ lastColorTheme = ct;
7081
7155
  const origin = hubOrigin();
7082
- if (origin) window.parent.postMessage({ type: 'hub:theme', theme: t }, origin);
7083
- }).observe(document.body, { attributes: true, attributeFilter: ['class'] });
7156
+ if (origin) window.parent.postMessage({ type: 'hub:theme', theme: t, colorTheme: ct }, origin);
7157
+ }).observe(document.body, {
7158
+ attributes: true,
7159
+ attributeFilter: ['class', 'data-color-theme'],
7160
+ });
7084
7161
  })();
7085
7162
  // #endregion HUB_INTEGRATION
package/public/index.html CHANGED
@@ -15,6 +15,7 @@
15
15
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
16
  <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Playfair+Display:wght@400;500;600&display=swap" rel="stylesheet">
17
17
  <link rel="stylesheet" href="/style.css">
18
+ <link rel="stylesheet" href="/themes.css">
18
19
  <script defer src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
19
20
  <script defer src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"></script>
20
21
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github-dark.min.css" id="hljs-theme-dark">
@@ -143,6 +144,10 @@
143
144
  <ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/>
144
145
  </svg>
145
146
  </button>
147
+ <span class="icon-btn theme-picker" id="themePickerBtn" title="Color theme" onclick="toggleThemeMenu(event)">
148
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"/></svg>
149
+ <div class="theme-menu" id="themeMenu"></div>
150
+ </span>
146
151
  <button id="theme-toggle" class="icon-btn" onclick="toggleTheme()" title="Toggle theme" aria-label="Toggle theme">
147
152
  <svg id="theme-icon-dark" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
148
153
  <path d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/>
package/public/style.css CHANGED
@@ -472,6 +472,8 @@ body::before {
472
472
  white-space: nowrap;
473
473
  overflow: hidden;
474
474
  text-overflow: ellipsis;
475
+ /* reserve room for the absolutely-positioned pin button at top-right */
476
+ padding-right: 22px;
475
477
  }
476
478
 
477
479
  .session-indicators .pulse {
@@ -900,6 +902,76 @@ body::before {
900
902
  border-color: #ef4444;
901
903
  }
902
904
 
905
+ /* theme picker: palette icon button + custom popover with per-theme swatches
906
+ (swatch colors are generated into themes.css) */
907
+ .theme-picker {
908
+ position: relative;
909
+ }
910
+ .theme-menu {
911
+ display: none;
912
+ position: absolute;
913
+ top: calc(100% + 6px);
914
+ right: 0;
915
+ z-index: 100;
916
+ min-width: 170px;
917
+ max-height: 70vh;
918
+ overflow-y: auto;
919
+ padding: 4px;
920
+ background: var(--bg-elevated);
921
+ border: 1px solid var(--border);
922
+ border-radius: 8px;
923
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
924
+ }
925
+ .theme-menu.open {
926
+ display: block;
927
+ }
928
+ .theme-menu-item {
929
+ display: flex;
930
+ align-items: center;
931
+ gap: 8px;
932
+ width: 100%;
933
+ padding: 6px 8px;
934
+ border: 0;
935
+ border-radius: 6px;
936
+ background: none;
937
+ color: var(--text-secondary);
938
+ font-family: var(--font-mono);
939
+ font-size: 11px;
940
+ text-transform: uppercase;
941
+ letter-spacing: 0.03em;
942
+ text-align: left;
943
+ cursor: pointer;
944
+ }
945
+ .theme-menu-item:hover {
946
+ background: var(--bg-hover);
947
+ color: var(--text-primary);
948
+ }
949
+ .theme-menu-item.on {
950
+ color: var(--accent-text);
951
+ }
952
+ /* 3-dot palette preview: surface, accent, ink (colors from themes.css vars) */
953
+ .theme-swatch {
954
+ display: inline-flex;
955
+ align-items: center;
956
+ gap: 3px;
957
+ flex: 0 0 auto;
958
+ }
959
+ .theme-swatch i {
960
+ width: 9px;
961
+ height: 9px;
962
+ border-radius: 50%;
963
+ border: 1px solid var(--sw-border);
964
+ }
965
+ .theme-swatch .sw-bg {
966
+ background: var(--sw-bg);
967
+ }
968
+ .theme-swatch .sw-accent {
969
+ background: var(--sw-accent);
970
+ }
971
+ .theme-swatch .sw-ink {
972
+ background: var(--sw-ink);
973
+ }
974
+
903
975
  /* #endregion */
904
976
 
905
977
  /* #region KANBAN */
@@ -2882,9 +2954,7 @@ body::before {
2882
2954
  .agent-card.selected:hover {
2883
2955
  background: var(--bg-elevated);
2884
2956
  border-color: var(--accent);
2885
- box-shadow:
2886
- 0 0 0 1px var(--accent-dim),
2887
- 0 0 12px var(--accent-dim);
2957
+ box-shadow: 0 0 0 1px var(--accent-dim);
2888
2958
  }
2889
2959
  .agent-card.fading {
2890
2960
  opacity: 0.4;
@@ -2920,18 +2990,18 @@ body::before {
2920
2990
  gap: 5px;
2921
2991
  }
2922
2992
  .agent-dot {
2923
- width: 7px;
2924
- height: 7px;
2993
+ width: 5px;
2994
+ height: 5px;
2925
2995
  border-radius: 50%;
2926
2996
  flex-shrink: 0;
2927
2997
  }
2928
2998
  .agent-dot.active {
2929
2999
  background: var(--success);
2930
- box-shadow: 0 0 6px var(--success);
3000
+ box-shadow: 0 0 4px color-mix(in srgb, var(--success) 50%, transparent);
2931
3001
  }
2932
3002
  .agent-dot.idle {
2933
3003
  background: var(--warning);
2934
- box-shadow: 0 0 6px var(--warning);
3004
+ box-shadow: 0 0 4px color-mix(in srgb, var(--warning) 50%, transparent);
2935
3005
  }
2936
3006
  .agent-dot.stopped {
2937
3007
  background: var(--text-muted);
@@ -0,0 +1,823 @@
1
+ /* GENERATED by scripts/generate-themes.mjs — do not edit by hand.
2
+ Color themes override only the shared design-token variables; semantic
3
+ colors (success/warning/error/scope/...) stay constant across themes. */
4
+
5
+ /* picker swatches */
6
+ .theme-swatch-ember { --sw-bg: #16181c; --sw-accent: #e86f33; --sw-ink: #f0f1f3; --sw-border: #363840; }
7
+ body.light .theme-swatch-ember { --sw-bg: #efede9; --sw-accent: #e86f33; --sw-ink: #0a0a0a; --sw-border: #cfcbc4; }
8
+ .theme-swatch-gruvbox { --sw-bg: #282828; --sw-accent: #fe8019; --sw-ink: #ebdbb2; --sw-border: #504945; }
9
+ body.light .theme-swatch-gruvbox { --sw-bg: #f3eee0; --sw-accent: #d65d0e; --sw-ink: #3c3836; --sw-border: #c9bc9d; }
10
+ .theme-swatch-catppuccin { --sw-bg: #181825; --sw-accent: #cba6f7; --sw-ink: #cdd6f4; --sw-border: #45475a; }
11
+ body.light .theme-swatch-catppuccin { --sw-bg: #eff1f5; --sw-accent: #8839ef; --sw-ink: #4c4f69; --sw-border: #bcc0cc; }
12
+ .theme-swatch-tokyo-night { --sw-bg: #1a1b26; --sw-accent: #7aa2f7; --sw-ink: #c0caf5; --sw-border: #3b4261; }
13
+ body.light .theme-swatch-tokyo-night { --sw-bg: #e9eaf0; --sw-accent: #2e7de9; --sw-ink: #343b58; --sw-border: #a8aecb; }
14
+ .theme-swatch-solarized { --sw-bg: #073642; --sw-accent: #cb4b16; --sw-ink: #93a1a1; --sw-border: #586e75; }
15
+ body.light .theme-swatch-solarized { --sw-bg: #f5efdc; --sw-accent: #cb4b16; --sw-ink: #073642; --sw-border: #d3cbb7; }
16
+ .theme-swatch-dracula { --sw-bg: #282a36; --sw-accent: #bd93f9; --sw-ink: #f8f8f2; --sw-border: #565a75; }
17
+ body.light .theme-swatch-dracula { --sw-bg: #f0f0f5; --sw-accent: #7c3aed; --sw-ink: #16161e; --sw-border: #c9c9d6; }
18
+ .theme-swatch-nord { --sw-bg: #2e3440; --sw-accent: #88c0d0; --sw-ink: #eceff4; --sw-border: #4c566a; }
19
+ body.light .theme-swatch-nord { --sw-bg: #eceff4; --sw-accent: #5e81ac; --sw-ink: #2e3440; --sw-border: #c2c9d6; }
20
+ .theme-swatch-rose-pine { --sw-bg: #1f1d2e; --sw-accent: #c4a7e7; --sw-ink: #e0def4; --sw-border: #403d52; }
21
+ body.light .theme-swatch-rose-pine { --sw-bg: #faf4ed; --sw-accent: #907aa9; --sw-ink: #575279; --sw-border: #dfdad9; }
22
+ .theme-swatch-everforest { --sw-bg: #2d353b; --sw-accent: #a7c080; --sw-ink: #d3c6aa; --sw-border: #475258; }
23
+ body.light .theme-swatch-everforest { --sw-bg: #fdf6e3; --sw-accent: #6f8352; --sw-ink: #4d5960; --sw-border: #d8d3ba; }
24
+ .theme-swatch-kanagawa { --sw-bg: #1f1f28; --sw-accent: #7e9cd8; --sw-ink: #dcd7ba; --sw-border: #54546d; }
25
+ body.light .theme-swatch-kanagawa { --sw-bg: #f2ecbc; --sw-accent: #4d699b; --sw-ink: #545464; --sw-border: #c7bf94; }
26
+ .theme-swatch-one-dark { --sw-bg: #282c34; --sw-accent: #61afef; --sw-ink: #d7dae0; --sw-border: #4b5263; }
27
+ body.light .theme-swatch-one-dark { --sw-bg: #fafafa; --sw-accent: #4078f2; --sw-ink: #383a42; --sw-border: #d4d4d6; }
28
+ .theme-swatch-night-owl { --sw-bg: #0b2942; --sw-accent: #82aaff; --sw-ink: #d6deeb; --sw-border: #5f7e97; }
29
+ body.light .theme-swatch-night-owl { --sw-bg: #f6f6f6; --sw-accent: #0c969b; --sw-ink: #403f53; --sw-border: #d0d0d0; }
30
+ .theme-swatch-monokai { --sw-bg: #2d2a2e; --sw-accent: #ffd866; --sw-ink: #fcfcfa; --sw-border: #5b595c; }
31
+ body.light .theme-swatch-monokai { --sw-bg: #f1efed; --sw-accent: #c08a00; --sw-ink: #2c292d; --sw-border: #cdc8c5; }
32
+ .theme-swatch-github { --sw-bg: #24292e; --sw-accent: #58a6ff; --sw-ink: #e1e4e8; --sw-border: #444d56; }
33
+ body.light .theme-swatch-github { --sw-bg: #f6f8fa; --sw-accent: #0366d6; --sw-ink: #24292e; --sw-border: #d1d5da; }
34
+ .theme-swatch-ayu { --sw-bg: #10141c; --sw-accent: #e6b450; --sw-ink: #bfbdb6; --sw-border: #2d3343; }
35
+ body.light .theme-swatch-ayu { --sw-bg: #f8f9fa; --sw-accent: #f2ae49; --sw-ink: #3d4149; --sw-border: #d8dde2; }
36
+ .theme-swatch-vitesse { --sw-bg: #181818; --sw-accent: #4d9375; --sw-ink: #dbd7ca; --sw-border: #333333; }
37
+ body.light .theme-swatch-vitesse { --sw-bg: #f7f7f7; --sw-accent: #1c6b48; --sw-ink: #393a34; --sw-border: #d6d6d6; }
38
+ .theme-swatch-synthwave { --sw-bg: #262335; --sw-accent: #ff7edb; --sw-ink: #ffffff; --sw-border: #495495; }
39
+ body.light .theme-swatch-synthwave { --sw-bg: #efecf6; --sw-accent: #c936a6; --sw-ink: #241b2f; --sw-border: #c5bcdd; }
40
+
41
+ /* Gruvbox */
42
+ body[data-color-theme="gruvbox"]:not(.light) {
43
+ --accent: #fe8019;
44
+ --accent-text: #f9b27c;
45
+ --accent-dim: rgba(254,128,25,0.25);
46
+ --accent-glow: rgba(254, 128, 25, 0.55);
47
+ --bg-deep: #1d2021;
48
+ --bg-surface: #282828;
49
+ --bg-elevated: #32302f;
50
+ --bg-hover: #3c3836;
51
+ --border: #504945;
52
+ --text-primary: #ebdbb2;
53
+ --text-secondary: #d5c4a1;
54
+ --text-tertiary: #bdae93;
55
+ --text-muted: #928374;
56
+ }
57
+ body.light[data-color-theme="gruvbox"] {
58
+ --accent: #d65d0e;
59
+ --accent-text: #af3a03;
60
+ --accent-dim: rgba(214,93,14,0.18);
61
+ --accent-glow: rgba(214, 93, 14, 0.5);
62
+ --bg-deep: #ede7d5;
63
+ --bg-surface: #f3eee0;
64
+ --bg-elevated: #faf7ec;
65
+ --bg-hover: #e4dcc6;
66
+ --border: #c9bc9d;
67
+ --text-primary: #3c3836;
68
+ --text-secondary: #504945;
69
+ --text-tertiary: #665c54;
70
+ --text-muted: #7c6f64;
71
+ }
72
+ @media (prefers-color-scheme: light) {
73
+ body:not(.dark-forced)[data-color-theme="gruvbox"] {
74
+ --accent: #d65d0e;
75
+ --accent-text: #af3a03;
76
+ --accent-dim: rgba(214,93,14,0.18);
77
+ --accent-glow: rgba(214, 93, 14, 0.5);
78
+ --bg-deep: #ede7d5;
79
+ --bg-surface: #f3eee0;
80
+ --bg-elevated: #faf7ec;
81
+ --bg-hover: #e4dcc6;
82
+ --border: #c9bc9d;
83
+ --text-primary: #3c3836;
84
+ --text-secondary: #504945;
85
+ --text-tertiary: #665c54;
86
+ --text-muted: #7c6f64;
87
+ }
88
+ }
89
+
90
+ /* Catppuccin */
91
+ body[data-color-theme="catppuccin"]:not(.light) {
92
+ --accent: #cba6f7;
93
+ --accent-text: #d8c2fa;
94
+ --accent-dim: rgba(203,166,247,0.25);
95
+ --accent-glow: rgba(203, 166, 247, 0.55);
96
+ --bg-deep: #11111b;
97
+ --bg-surface: #181825;
98
+ --bg-elevated: #1e1e2e;
99
+ --bg-hover: #313244;
100
+ --border: #45475a;
101
+ --text-primary: #cdd6f4;
102
+ --text-secondary: #bac2de;
103
+ --text-tertiary: #a6adc8;
104
+ --text-muted: #7f849c;
105
+ }
106
+ body.light[data-color-theme="catppuccin"] {
107
+ --accent: #8839ef;
108
+ --accent-text: #6f2dbd;
109
+ --accent-dim: rgba(136,57,239,0.18);
110
+ --accent-glow: rgba(136, 57, 239, 0.5);
111
+ --bg-deep: #e6e9ef;
112
+ --bg-surface: #eff1f5;
113
+ --bg-elevated: #ffffff;
114
+ --bg-hover: #ccd0da;
115
+ --border: #bcc0cc;
116
+ --text-primary: #4c4f69;
117
+ --text-secondary: #5c5f77;
118
+ --text-tertiary: #6c6f85;
119
+ --text-muted: #8c8fa1;
120
+ }
121
+ @media (prefers-color-scheme: light) {
122
+ body:not(.dark-forced)[data-color-theme="catppuccin"] {
123
+ --accent: #8839ef;
124
+ --accent-text: #6f2dbd;
125
+ --accent-dim: rgba(136,57,239,0.18);
126
+ --accent-glow: rgba(136, 57, 239, 0.5);
127
+ --bg-deep: #e6e9ef;
128
+ --bg-surface: #eff1f5;
129
+ --bg-elevated: #ffffff;
130
+ --bg-hover: #ccd0da;
131
+ --border: #bcc0cc;
132
+ --text-primary: #4c4f69;
133
+ --text-secondary: #5c5f77;
134
+ --text-tertiary: #6c6f85;
135
+ --text-muted: #8c8fa1;
136
+ }
137
+ }
138
+
139
+ /* Tokyo Night */
140
+ body[data-color-theme="tokyo-night"]:not(.light) {
141
+ --accent: #7aa2f7;
142
+ --accent-text: #9ab8ff;
143
+ --accent-dim: rgba(122,162,247,0.25);
144
+ --accent-glow: rgba(122, 162, 247, 0.55);
145
+ --bg-deep: #16161e;
146
+ --bg-surface: #1a1b26;
147
+ --bg-elevated: #1f2335;
148
+ --bg-hover: #292e42;
149
+ --border: #3b4261;
150
+ --text-primary: #c0caf5;
151
+ --text-secondary: #a9b1d6;
152
+ --text-tertiary: #787c99;
153
+ --text-muted: #565f89;
154
+ }
155
+ body.light[data-color-theme="tokyo-night"] {
156
+ --accent: #2e7de9;
157
+ --accent-text: #1659c7;
158
+ --accent-dim: rgba(46,125,233,0.18);
159
+ --accent-glow: rgba(46, 125, 233, 0.5);
160
+ --bg-deep: #e1e2e7;
161
+ --bg-surface: #e9eaf0;
162
+ --bg-elevated: #f7f8fc;
163
+ --bg-hover: #d0d5e3;
164
+ --border: #a8aecb;
165
+ --text-primary: #343b58;
166
+ --text-secondary: #565a6e;
167
+ --text-tertiary: #6c6e75;
168
+ --text-muted: #848cb5;
169
+ }
170
+ @media (prefers-color-scheme: light) {
171
+ body:not(.dark-forced)[data-color-theme="tokyo-night"] {
172
+ --accent: #2e7de9;
173
+ --accent-text: #1659c7;
174
+ --accent-dim: rgba(46,125,233,0.18);
175
+ --accent-glow: rgba(46, 125, 233, 0.5);
176
+ --bg-deep: #e1e2e7;
177
+ --bg-surface: #e9eaf0;
178
+ --bg-elevated: #f7f8fc;
179
+ --bg-hover: #d0d5e3;
180
+ --border: #a8aecb;
181
+ --text-primary: #343b58;
182
+ --text-secondary: #565a6e;
183
+ --text-tertiary: #6c6e75;
184
+ --text-muted: #848cb5;
185
+ }
186
+ }
187
+
188
+ /* Solarized */
189
+ body[data-color-theme="solarized"]:not(.light) {
190
+ --accent: #cb4b16;
191
+ --accent-text: #e9663a;
192
+ --accent-dim: rgba(203,75,22,0.25);
193
+ --accent-glow: rgba(203, 75, 22, 0.55);
194
+ --bg-deep: #002b36;
195
+ --bg-surface: #073642;
196
+ --bg-elevated: #0a4250;
197
+ --bg-hover: #11505f;
198
+ --border: #586e75;
199
+ --text-primary: #93a1a1;
200
+ --text-secondary: #839496;
201
+ --text-tertiary: #657b83;
202
+ --text-muted: #586e75;
203
+ }
204
+ body.light[data-color-theme="solarized"] {
205
+ --accent: #cb4b16;
206
+ --accent-text: #b34a12;
207
+ --accent-dim: rgba(203,75,22,0.18);
208
+ --accent-glow: rgba(203, 75, 22, 0.5);
209
+ --bg-deep: #eee8d5;
210
+ --bg-surface: #f5efdc;
211
+ --bg-elevated: #fdf6e3;
212
+ --bg-hover: #e4ddc8;
213
+ --border: #d3cbb7;
214
+ --text-primary: #073642;
215
+ --text-secondary: #586e75;
216
+ --text-tertiary: #657b83;
217
+ --text-muted: #839496;
218
+ }
219
+ @media (prefers-color-scheme: light) {
220
+ body:not(.dark-forced)[data-color-theme="solarized"] {
221
+ --accent: #cb4b16;
222
+ --accent-text: #b34a12;
223
+ --accent-dim: rgba(203,75,22,0.18);
224
+ --accent-glow: rgba(203, 75, 22, 0.5);
225
+ --bg-deep: #eee8d5;
226
+ --bg-surface: #f5efdc;
227
+ --bg-elevated: #fdf6e3;
228
+ --bg-hover: #e4ddc8;
229
+ --border: #d3cbb7;
230
+ --text-primary: #073642;
231
+ --text-secondary: #586e75;
232
+ --text-tertiary: #657b83;
233
+ --text-muted: #839496;
234
+ }
235
+ }
236
+
237
+ /* Dracula */
238
+ body[data-color-theme="dracula"]:not(.light) {
239
+ --accent: #bd93f9;
240
+ --accent-text: #d6b5ff;
241
+ --accent-dim: rgba(189,147,249,0.25);
242
+ --accent-glow: rgba(189, 147, 249, 0.55);
243
+ --bg-deep: #21222c;
244
+ --bg-surface: #282a36;
245
+ --bg-elevated: #343746;
246
+ --bg-hover: #44475a;
247
+ --border: #565a75;
248
+ --text-primary: #f8f8f2;
249
+ --text-secondary: #d8d8d2;
250
+ --text-tertiary: #b0b3c5;
251
+ --text-muted: #6272a4;
252
+ }
253
+ body.light[data-color-theme="dracula"] {
254
+ --accent: #7c3aed;
255
+ --accent-text: #5b21b6;
256
+ --accent-dim: rgba(124,58,237,0.18);
257
+ --accent-glow: rgba(124, 58, 237, 0.5);
258
+ --bg-deep: #e8e8ee;
259
+ --bg-surface: #f0f0f5;
260
+ --bg-elevated: #fbfbfd;
261
+ --bg-hover: #dfdfe8;
262
+ --border: #c9c9d6;
263
+ --text-primary: #16161e;
264
+ --text-secondary: #34343f;
265
+ --text-tertiary: #5a5a68;
266
+ --text-muted: #787885;
267
+ }
268
+ @media (prefers-color-scheme: light) {
269
+ body:not(.dark-forced)[data-color-theme="dracula"] {
270
+ --accent: #7c3aed;
271
+ --accent-text: #5b21b6;
272
+ --accent-dim: rgba(124,58,237,0.18);
273
+ --accent-glow: rgba(124, 58, 237, 0.5);
274
+ --bg-deep: #e8e8ee;
275
+ --bg-surface: #f0f0f5;
276
+ --bg-elevated: #fbfbfd;
277
+ --bg-hover: #dfdfe8;
278
+ --border: #c9c9d6;
279
+ --text-primary: #16161e;
280
+ --text-secondary: #34343f;
281
+ --text-tertiary: #5a5a68;
282
+ --text-muted: #787885;
283
+ }
284
+ }
285
+
286
+ /* Nord */
287
+ body[data-color-theme="nord"]:not(.light) {
288
+ --accent: #88c0d0;
289
+ --accent-text: #a8d8e8;
290
+ --accent-dim: rgba(136,192,208,0.25);
291
+ --accent-glow: rgba(136, 192, 208, 0.55);
292
+ --bg-deep: #272c36;
293
+ --bg-surface: #2e3440;
294
+ --bg-elevated: #3b4252;
295
+ --bg-hover: #434c5e;
296
+ --border: #4c566a;
297
+ --text-primary: #eceff4;
298
+ --text-secondary: #d8dee9;
299
+ --text-tertiary: #aeb6c5;
300
+ --text-muted: #7b88a1;
301
+ }
302
+ body.light[data-color-theme="nord"] {
303
+ --accent: #5e81ac;
304
+ --accent-text: #44688f;
305
+ --accent-dim: rgba(94,129,172,0.18);
306
+ --accent-glow: rgba(94, 129, 172, 0.5);
307
+ --bg-deep: #e5e9f0;
308
+ --bg-surface: #eceff4;
309
+ --bg-elevated: #f8f9fb;
310
+ --bg-hover: #d8dee9;
311
+ --border: #c2c9d6;
312
+ --text-primary: #2e3440;
313
+ --text-secondary: #3b4252;
314
+ --text-tertiary: #4c566a;
315
+ --text-muted: #6b7589;
316
+ }
317
+ @media (prefers-color-scheme: light) {
318
+ body:not(.dark-forced)[data-color-theme="nord"] {
319
+ --accent: #5e81ac;
320
+ --accent-text: #44688f;
321
+ --accent-dim: rgba(94,129,172,0.18);
322
+ --accent-glow: rgba(94, 129, 172, 0.5);
323
+ --bg-deep: #e5e9f0;
324
+ --bg-surface: #eceff4;
325
+ --bg-elevated: #f8f9fb;
326
+ --bg-hover: #d8dee9;
327
+ --border: #c2c9d6;
328
+ --text-primary: #2e3440;
329
+ --text-secondary: #3b4252;
330
+ --text-tertiary: #4c566a;
331
+ --text-muted: #6b7589;
332
+ }
333
+ }
334
+
335
+ /* Rosé Pine */
336
+ body[data-color-theme="rose-pine"]:not(.light) {
337
+ --accent: #c4a7e7;
338
+ --accent-text: #d9c4f2;
339
+ --accent-dim: rgba(196,167,231,0.25);
340
+ --accent-glow: rgba(196, 167, 231, 0.55);
341
+ --bg-deep: #191724;
342
+ --bg-surface: #1f1d2e;
343
+ --bg-elevated: #26233a;
344
+ --bg-hover: #34304e;
345
+ --border: #403d52;
346
+ --text-primary: #e0def4;
347
+ --text-secondary: #c5c2dd;
348
+ --text-tertiary: #908caa;
349
+ --text-muted: #6e6a86;
350
+ }
351
+ body.light[data-color-theme="rose-pine"] {
352
+ --accent: #907aa9;
353
+ --accent-text: #6f598c;
354
+ --accent-dim: rgba(144,122,169,0.18);
355
+ --accent-glow: rgba(144, 122, 169, 0.5);
356
+ --bg-deep: #f2e9e1;
357
+ --bg-surface: #faf4ed;
358
+ --bg-elevated: #fffaf3;
359
+ --bg-hover: #ebdfd4;
360
+ --border: #dfdad9;
361
+ --text-primary: #575279;
362
+ --text-secondary: #635e87;
363
+ --text-tertiary: #797593;
364
+ --text-muted: #9893a5;
365
+ }
366
+ @media (prefers-color-scheme: light) {
367
+ body:not(.dark-forced)[data-color-theme="rose-pine"] {
368
+ --accent: #907aa9;
369
+ --accent-text: #6f598c;
370
+ --accent-dim: rgba(144,122,169,0.18);
371
+ --accent-glow: rgba(144, 122, 169, 0.5);
372
+ --bg-deep: #f2e9e1;
373
+ --bg-surface: #faf4ed;
374
+ --bg-elevated: #fffaf3;
375
+ --bg-hover: #ebdfd4;
376
+ --border: #dfdad9;
377
+ --text-primary: #575279;
378
+ --text-secondary: #635e87;
379
+ --text-tertiary: #797593;
380
+ --text-muted: #9893a5;
381
+ }
382
+ }
383
+
384
+ /* Everforest */
385
+ body[data-color-theme="everforest"]:not(.light) {
386
+ --accent: #a7c080;
387
+ --accent-text: #c3d6a2;
388
+ --accent-dim: rgba(167,192,128,0.25);
389
+ --accent-glow: rgba(167, 192, 128, 0.55);
390
+ --bg-deep: #232a2e;
391
+ --bg-surface: #2d353b;
392
+ --bg-elevated: #343f44;
393
+ --bg-hover: #3d484d;
394
+ --border: #475258;
395
+ --text-primary: #d3c6aa;
396
+ --text-secondary: #bfb6a3;
397
+ --text-tertiary: #9da9a0;
398
+ --text-muted: #859289;
399
+ }
400
+ body.light[data-color-theme="everforest"] {
401
+ --accent: #6f8352;
402
+ --accent-text: #56683f;
403
+ --accent-dim: rgba(111,131,82,0.18);
404
+ --accent-glow: rgba(111, 131, 82, 0.5);
405
+ --bg-deep: #f4f0d9;
406
+ --bg-surface: #fdf6e3;
407
+ --bg-elevated: #fffbef;
408
+ --bg-hover: #efebd4;
409
+ --border: #d8d3ba;
410
+ --text-primary: #4d5960;
411
+ --text-secondary: #5c6a72;
412
+ --text-tertiary: #7a8478;
413
+ --text-muted: #939f91;
414
+ }
415
+ @media (prefers-color-scheme: light) {
416
+ body:not(.dark-forced)[data-color-theme="everforest"] {
417
+ --accent: #6f8352;
418
+ --accent-text: #56683f;
419
+ --accent-dim: rgba(111,131,82,0.18);
420
+ --accent-glow: rgba(111, 131, 82, 0.5);
421
+ --bg-deep: #f4f0d9;
422
+ --bg-surface: #fdf6e3;
423
+ --bg-elevated: #fffbef;
424
+ --bg-hover: #efebd4;
425
+ --border: #d8d3ba;
426
+ --text-primary: #4d5960;
427
+ --text-secondary: #5c6a72;
428
+ --text-tertiary: #7a8478;
429
+ --text-muted: #939f91;
430
+ }
431
+ }
432
+
433
+ /* Kanagawa */
434
+ body[data-color-theme="kanagawa"]:not(.light) {
435
+ --accent: #7e9cd8;
436
+ --accent-text: #9fb9ec;
437
+ --accent-dim: rgba(126,156,216,0.25);
438
+ --accent-glow: rgba(126, 156, 216, 0.55);
439
+ --bg-deep: #16161d;
440
+ --bg-surface: #1f1f28;
441
+ --bg-elevated: #2a2a37;
442
+ --bg-hover: #363646;
443
+ --border: #54546d;
444
+ --text-primary: #dcd7ba;
445
+ --text-secondary: #c8c093;
446
+ --text-tertiary: #a6a69c;
447
+ --text-muted: #727169;
448
+ }
449
+ body.light[data-color-theme="kanagawa"] {
450
+ --accent: #4d699b;
451
+ --accent-text: #38537f;
452
+ --accent-dim: rgba(77,105,155,0.18);
453
+ --accent-glow: rgba(77, 105, 155, 0.5);
454
+ --bg-deep: #e5ddb0;
455
+ --bg-surface: #f2ecbc;
456
+ --bg-elevated: #faf5d2;
457
+ --bg-hover: #dcd5ac;
458
+ --border: #c7bf94;
459
+ --text-primary: #545464;
460
+ --text-secondary: #66667a;
461
+ --text-tertiary: #716e61;
462
+ --text-muted: #8a8775;
463
+ }
464
+ @media (prefers-color-scheme: light) {
465
+ body:not(.dark-forced)[data-color-theme="kanagawa"] {
466
+ --accent: #4d699b;
467
+ --accent-text: #38537f;
468
+ --accent-dim: rgba(77,105,155,0.18);
469
+ --accent-glow: rgba(77, 105, 155, 0.5);
470
+ --bg-deep: #e5ddb0;
471
+ --bg-surface: #f2ecbc;
472
+ --bg-elevated: #faf5d2;
473
+ --bg-hover: #dcd5ac;
474
+ --border: #c7bf94;
475
+ --text-primary: #545464;
476
+ --text-secondary: #66667a;
477
+ --text-tertiary: #716e61;
478
+ --text-muted: #8a8775;
479
+ }
480
+ }
481
+
482
+ /* One Dark */
483
+ body[data-color-theme="one-dark"]:not(.light) {
484
+ --accent: #61afef;
485
+ --accent-text: #8cc7ff;
486
+ --accent-dim: rgba(97,175,239,0.25);
487
+ --accent-glow: rgba(97, 175, 239, 0.55);
488
+ --bg-deep: #21252b;
489
+ --bg-surface: #282c34;
490
+ --bg-elevated: #2f343e;
491
+ --bg-hover: #3e4452;
492
+ --border: #4b5263;
493
+ --text-primary: #d7dae0;
494
+ --text-secondary: #abb2bf;
495
+ --text-tertiary: #8b919e;
496
+ --text-muted: #5c6370;
497
+ }
498
+ body.light[data-color-theme="one-dark"] {
499
+ --accent: #4078f2;
500
+ --accent-text: #2c5dd4;
501
+ --accent-dim: rgba(64,120,242,0.18);
502
+ --accent-glow: rgba(64, 120, 242, 0.5);
503
+ --bg-deep: #eaeaeb;
504
+ --bg-surface: #fafafa;
505
+ --bg-elevated: #ffffff;
506
+ --bg-hover: #e0e0e2;
507
+ --border: #d4d4d6;
508
+ --text-primary: #383a42;
509
+ --text-secondary: #50525a;
510
+ --text-tertiary: #696c77;
511
+ --text-muted: #a0a1a7;
512
+ }
513
+ @media (prefers-color-scheme: light) {
514
+ body:not(.dark-forced)[data-color-theme="one-dark"] {
515
+ --accent: #4078f2;
516
+ --accent-text: #2c5dd4;
517
+ --accent-dim: rgba(64,120,242,0.18);
518
+ --accent-glow: rgba(64, 120, 242, 0.5);
519
+ --bg-deep: #eaeaeb;
520
+ --bg-surface: #fafafa;
521
+ --bg-elevated: #ffffff;
522
+ --bg-hover: #e0e0e2;
523
+ --border: #d4d4d6;
524
+ --text-primary: #383a42;
525
+ --text-secondary: #50525a;
526
+ --text-tertiary: #696c77;
527
+ --text-muted: #a0a1a7;
528
+ }
529
+ }
530
+
531
+ /* Night Owl */
532
+ body[data-color-theme="night-owl"]:not(.light) {
533
+ --accent: #82aaff;
534
+ --accent-text: #a8c4ff;
535
+ --accent-dim: rgba(130,170,255,0.25);
536
+ --accent-glow: rgba(130, 170, 255, 0.55);
537
+ --bg-deep: #011627;
538
+ --bg-surface: #0b2942;
539
+ --bg-elevated: #13344f;
540
+ --bg-hover: #1d3b53;
541
+ --border: #5f7e97;
542
+ --text-primary: #d6deeb;
543
+ --text-secondary: #b8c5d6;
544
+ --text-tertiary: #8ba3b8;
545
+ --text-muted: #637777;
546
+ }
547
+ body.light[data-color-theme="night-owl"] {
548
+ --accent: #0c969b;
549
+ --accent-text: #0a7479;
550
+ --accent-dim: rgba(12,150,155,0.18);
551
+ --accent-glow: rgba(12, 150, 155, 0.5);
552
+ --bg-deep: #ededed;
553
+ --bg-surface: #f6f6f6;
554
+ --bg-elevated: #fbfbfb;
555
+ --bg-hover: #e2e2e2;
556
+ --border: #d0d0d0;
557
+ --text-primary: #403f53;
558
+ --text-secondary: #545167;
559
+ --text-tertiary: #6f6e85;
560
+ --text-muted: #989fb1;
561
+ }
562
+ @media (prefers-color-scheme: light) {
563
+ body:not(.dark-forced)[data-color-theme="night-owl"] {
564
+ --accent: #0c969b;
565
+ --accent-text: #0a7479;
566
+ --accent-dim: rgba(12,150,155,0.18);
567
+ --accent-glow: rgba(12, 150, 155, 0.5);
568
+ --bg-deep: #ededed;
569
+ --bg-surface: #f6f6f6;
570
+ --bg-elevated: #fbfbfb;
571
+ --bg-hover: #e2e2e2;
572
+ --border: #d0d0d0;
573
+ --text-primary: #403f53;
574
+ --text-secondary: #545167;
575
+ --text-tertiary: #6f6e85;
576
+ --text-muted: #989fb1;
577
+ }
578
+ }
579
+
580
+ /* Monokai Pro */
581
+ body[data-color-theme="monokai"]:not(.light) {
582
+ --accent: #ffd866;
583
+ --accent-text: #ffe6a0;
584
+ --accent-dim: rgba(255,216,102,0.25);
585
+ --accent-glow: rgba(255, 216, 102, 0.55);
586
+ --bg-deep: #221f22;
587
+ --bg-surface: #2d2a2e;
588
+ --bg-elevated: #403e41;
589
+ --bg-hover: #4a484b;
590
+ --border: #5b595c;
591
+ --text-primary: #fcfcfa;
592
+ --text-secondary: #d9d8d6;
593
+ --text-tertiary: #939293;
594
+ --text-muted: #727072;
595
+ }
596
+ body.light[data-color-theme="monokai"] {
597
+ --accent: #c08a00;
598
+ --accent-text: #9a6e00;
599
+ --accent-dim: rgba(192,138,0,0.18);
600
+ --accent-glow: rgba(192, 138, 0, 0.5);
601
+ --bg-deep: #e9e6e4;
602
+ --bg-surface: #f1efed;
603
+ --bg-elevated: #fcfbfa;
604
+ --bg-hover: #e0dcda;
605
+ --border: #cdc8c5;
606
+ --text-primary: #2c292d;
607
+ --text-secondary: #46434a;
608
+ --text-tertiary: #6b686d;
609
+ --text-muted: #8d8a8d;
610
+ }
611
+ @media (prefers-color-scheme: light) {
612
+ body:not(.dark-forced)[data-color-theme="monokai"] {
613
+ --accent: #c08a00;
614
+ --accent-text: #9a6e00;
615
+ --accent-dim: rgba(192,138,0,0.18);
616
+ --accent-glow: rgba(192, 138, 0, 0.5);
617
+ --bg-deep: #e9e6e4;
618
+ --bg-surface: #f1efed;
619
+ --bg-elevated: #fcfbfa;
620
+ --bg-hover: #e0dcda;
621
+ --border: #cdc8c5;
622
+ --text-primary: #2c292d;
623
+ --text-secondary: #46434a;
624
+ --text-tertiary: #6b686d;
625
+ --text-muted: #8d8a8d;
626
+ }
627
+ }
628
+
629
+ /* GitHub */
630
+ body[data-color-theme="github"]:not(.light) {
631
+ --accent: #58a6ff;
632
+ --accent-text: #85bdff;
633
+ --accent-dim: rgba(88,166,255,0.25);
634
+ --accent-glow: rgba(88, 166, 255, 0.55);
635
+ --bg-deep: #1f2428;
636
+ --bg-surface: #24292e;
637
+ --bg-elevated: #2b3138;
638
+ --bg-hover: #2f363d;
639
+ --border: #444d56;
640
+ --text-primary: #e1e4e8;
641
+ --text-secondary: #d1d5da;
642
+ --text-tertiary: #959da5;
643
+ --text-muted: #6a737d;
644
+ }
645
+ body.light[data-color-theme="github"] {
646
+ --accent: #0366d6;
647
+ --accent-text: #044289;
648
+ --accent-dim: rgba(3,102,214,0.18);
649
+ --accent-glow: rgba(3, 102, 214, 0.5);
650
+ --bg-deep: #f0f2f4;
651
+ --bg-surface: #f6f8fa;
652
+ --bg-elevated: #ffffff;
653
+ --bg-hover: #e8eaed;
654
+ --border: #d1d5da;
655
+ --text-primary: #24292e;
656
+ --text-secondary: #444d56;
657
+ --text-tertiary: #586069;
658
+ --text-muted: #6a737d;
659
+ }
660
+ @media (prefers-color-scheme: light) {
661
+ body:not(.dark-forced)[data-color-theme="github"] {
662
+ --accent: #0366d6;
663
+ --accent-text: #044289;
664
+ --accent-dim: rgba(3,102,214,0.18);
665
+ --accent-glow: rgba(3, 102, 214, 0.5);
666
+ --bg-deep: #f0f2f4;
667
+ --bg-surface: #f6f8fa;
668
+ --bg-elevated: #ffffff;
669
+ --bg-hover: #e8eaed;
670
+ --border: #d1d5da;
671
+ --text-primary: #24292e;
672
+ --text-secondary: #444d56;
673
+ --text-tertiary: #586069;
674
+ --text-muted: #6a737d;
675
+ }
676
+ }
677
+
678
+ /* Ayu */
679
+ body[data-color-theme="ayu"]:not(.light) {
680
+ --accent: #e6b450;
681
+ --accent-text: #f0cd85;
682
+ --accent-dim: rgba(230,180,80,0.25);
683
+ --accent-glow: rgba(230, 180, 80, 0.55);
684
+ --bg-deep: #0d1017;
685
+ --bg-surface: #10141c;
686
+ --bg-elevated: #141821;
687
+ --bg-hover: #1d2330;
688
+ --border: #2d3343;
689
+ --text-primary: #bfbdb6;
690
+ --text-secondary: #a8a6a0;
691
+ --text-tertiary: #8a9199;
692
+ --text-muted: #6c7380;
693
+ }
694
+ body.light[data-color-theme="ayu"] {
695
+ --accent: #f2ae49;
696
+ --accent-text: #b87514;
697
+ --accent-dim: rgba(242,174,73,0.18);
698
+ --accent-glow: rgba(242, 174, 73, 0.5);
699
+ --bg-deep: #eff1f3;
700
+ --bg-surface: #f8f9fa;
701
+ --bg-elevated: #fcfcfc;
702
+ --bg-hover: #e7eaed;
703
+ --border: #d8dde2;
704
+ --text-primary: #3d4149;
705
+ --text-secondary: #5c6166;
706
+ --text-tertiary: #787b80;
707
+ --text-muted: #8a9199;
708
+ }
709
+ @media (prefers-color-scheme: light) {
710
+ body:not(.dark-forced)[data-color-theme="ayu"] {
711
+ --accent: #f2ae49;
712
+ --accent-text: #b87514;
713
+ --accent-dim: rgba(242,174,73,0.18);
714
+ --accent-glow: rgba(242, 174, 73, 0.5);
715
+ --bg-deep: #eff1f3;
716
+ --bg-surface: #f8f9fa;
717
+ --bg-elevated: #fcfcfc;
718
+ --bg-hover: #e7eaed;
719
+ --border: #d8dde2;
720
+ --text-primary: #3d4149;
721
+ --text-secondary: #5c6166;
722
+ --text-tertiary: #787b80;
723
+ --text-muted: #8a9199;
724
+ }
725
+ }
726
+
727
+ /* Vitesse */
728
+ body[data-color-theme="vitesse"]:not(.light) {
729
+ --accent: #4d9375;
730
+ --accent-text: #6fb392;
731
+ --accent-dim: rgba(77,147,117,0.25);
732
+ --accent-glow: rgba(77, 147, 117, 0.55);
733
+ --bg-deep: #121212;
734
+ --bg-surface: #181818;
735
+ --bg-elevated: #1e1e1e;
736
+ --bg-hover: #262626;
737
+ --border: #333333;
738
+ --text-primary: #dbd7ca;
739
+ --text-secondary: #bfbaaa;
740
+ --text-tertiary: #8f8f85;
741
+ --text-muted: #758575;
742
+ }
743
+ body.light[data-color-theme="vitesse"] {
744
+ --accent: #1c6b48;
745
+ --accent-text: #145236;
746
+ --accent-dim: rgba(28,107,72,0.18);
747
+ --accent-glow: rgba(28, 107, 72, 0.5);
748
+ --bg-deep: #f0f0f0;
749
+ --bg-surface: #f7f7f7;
750
+ --bg-elevated: #ffffff;
751
+ --bg-hover: #e7e7e7;
752
+ --border: #d6d6d6;
753
+ --text-primary: #393a34;
754
+ --text-secondary: #4e4f47;
755
+ --text-tertiary: #6b6d63;
756
+ --text-muted: #a0ada0;
757
+ }
758
+ @media (prefers-color-scheme: light) {
759
+ body:not(.dark-forced)[data-color-theme="vitesse"] {
760
+ --accent: #1c6b48;
761
+ --accent-text: #145236;
762
+ --accent-dim: rgba(28,107,72,0.18);
763
+ --accent-glow: rgba(28, 107, 72, 0.5);
764
+ --bg-deep: #f0f0f0;
765
+ --bg-surface: #f7f7f7;
766
+ --bg-elevated: #ffffff;
767
+ --bg-hover: #e7e7e7;
768
+ --border: #d6d6d6;
769
+ --text-primary: #393a34;
770
+ --text-secondary: #4e4f47;
771
+ --text-tertiary: #6b6d63;
772
+ --text-muted: #a0ada0;
773
+ }
774
+ }
775
+
776
+ /* Synthwave '84 */
777
+ body[data-color-theme="synthwave"]:not(.light) {
778
+ --accent: #ff7edb;
779
+ --accent-text: #ffa9e7;
780
+ --accent-dim: rgba(255,126,219,0.25);
781
+ --accent-glow: rgba(255, 126, 219, 0.55);
782
+ --bg-deep: #241b2f;
783
+ --bg-surface: #262335;
784
+ --bg-elevated: #322a47;
785
+ --bg-hover: #3d3460;
786
+ --border: #495495;
787
+ --text-primary: #ffffff;
788
+ --text-secondary: #d8d6e8;
789
+ --text-tertiary: #b6b1d8;
790
+ --text-muted: #848bbd;
791
+ }
792
+ body.light[data-color-theme="synthwave"] {
793
+ --accent: #c936a6;
794
+ --accent-text: #9c2381;
795
+ --accent-dim: rgba(201,54,166,0.18);
796
+ --accent-glow: rgba(201, 54, 166, 0.5);
797
+ --bg-deep: #e6e2f0;
798
+ --bg-surface: #efecf6;
799
+ --bg-elevated: #fbfafd;
800
+ --bg-hover: #ddd7ec;
801
+ --border: #c5bcdd;
802
+ --text-primary: #241b2f;
803
+ --text-secondary: #3d3455;
804
+ --text-tertiary: #5c5380;
805
+ --text-muted: #7d76a3;
806
+ }
807
+ @media (prefers-color-scheme: light) {
808
+ body:not(.dark-forced)[data-color-theme="synthwave"] {
809
+ --accent: #c936a6;
810
+ --accent-text: #9c2381;
811
+ --accent-dim: rgba(201,54,166,0.18);
812
+ --accent-glow: rgba(201, 54, 166, 0.5);
813
+ --bg-deep: #e6e2f0;
814
+ --bg-surface: #efecf6;
815
+ --bg-elevated: #fbfafd;
816
+ --bg-hover: #ddd7ec;
817
+ --border: #c5bcdd;
818
+ --text-primary: #241b2f;
819
+ --text-secondary: #3d3455;
820
+ --text-tertiary: #5c5380;
821
+ --text-muted: #7d76a3;
822
+ }
823
+ }