@phenx-inc/ctlsurf 0.14.2 → 0.15.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.
Files changed (39) hide show
  1. package/THIRD-PARTY-NOTICES.md +82 -0
  2. package/out/headless/index.mjs +3 -2
  3. package/out/headless/index.mjs.map +2 -2
  4. package/out/main/index.js +27 -0
  5. package/out/preload/index.js +5 -0
  6. package/out/renderer/assets/{cssMode-bQYoCKra.js → cssMode-CJR4iD-G.js} +3 -3
  7. package/out/renderer/assets/{freemarker2-BS1ERQl_.js → freemarker2-BRI9ISq9.js} +1 -1
  8. package/out/renderer/assets/{handlebars-B-ZEHRLr.js → handlebars-3hL6XIZI.js} +1 -1
  9. package/out/renderer/assets/{html-lk9e1Lkl.js → html-Dd5_vBoP.js} +1 -1
  10. package/out/renderer/assets/{htmlMode-Ds1eMYgM.js → htmlMode-DgNtlKcG.js} +3 -3
  11. package/out/renderer/assets/{index-BpCORklm.css → index-3sFJEz7i.css} +787 -399
  12. package/out/renderer/assets/{index-BJNR4hRK.js → index-5azC4yNn.js} +421 -99
  13. package/out/renderer/assets/{javascript-D6OeziKX.js → javascript-D0vPLEJg.js} +2 -2
  14. package/out/renderer/assets/{jsonMode-t5SESE75.js → jsonMode-DBvR0zMu.js} +3 -3
  15. package/out/renderer/assets/{liquid-B5Wjh0p_.js → liquid-CLoc6Tx7.js} +1 -1
  16. package/out/renderer/assets/{lspLanguageFeatures-BEgiDCIW.js → lspLanguageFeatures-CiaMaQoY.js} +1 -1
  17. package/out/renderer/assets/{mdx-ByNAXh8t.js → mdx-DTsq6tlv.js} +1 -1
  18. package/out/renderer/assets/{python-CIFO0XQW.js → python-D04DpZDr.js} +1 -1
  19. package/out/renderer/assets/{razor-LXHhGcNO.js → razor-Di6CJ6s8.js} +1 -1
  20. package/out/renderer/assets/{tsMode-WiO8CDaI.js → tsMode-mfv6mHOv.js} +1 -1
  21. package/out/renderer/assets/{typescript-ZBQlq256.js → typescript-CDA0Hhef.js} +1 -1
  22. package/out/renderer/assets/{xml-DBaLJlQU.js → xml-BU0voRuq.js} +1 -1
  23. package/out/renderer/assets/{yaml-CId9skah.js → yaml-qzFWnaZJ.js} +1 -1
  24. package/out/renderer/index.html +60 -3
  25. package/package.json +5 -4
  26. package/src/main/index.ts +52 -1
  27. package/src/main/orchestrator.ts +8 -0
  28. package/src/preload/index.ts +10 -0
  29. package/src/renderer/App.tsx +2 -0
  30. package/src/renderer/components/CtlsurfPanel.tsx +1 -1
  31. package/src/renderer/components/EditorPanel.tsx +29 -1
  32. package/src/renderer/components/ObserverPanel.tsx +13 -6
  33. package/src/renderer/components/SettingsDialog.tsx +82 -0
  34. package/src/renderer/components/TerminalPanel.tsx +12 -22
  35. package/src/renderer/components/TicketPanel.tsx +17 -10
  36. package/src/renderer/index.html +58 -1
  37. package/src/renderer/lib/theme.ts +173 -0
  38. package/src/renderer/lib/themes.ts +126 -0
  39. package/src/renderer/styles.css +787 -399
@@ -1,3 +1,273 @@
1
+ /* ─────────────────────────────────────────────────────────────
2
+ Theme tokens
3
+
4
+ Every colour in this file resolves through one of these. `:root` holds
5
+ Tokyo Night and doubles as the fallback, so anything that renders before
6
+ the theme attribute lands still gets a full palette. Each additional
7
+ scheme is a `[data-theme='<id>']` block whose id must match an entry in
8
+ lib/themes.ts — that module owns the parts CSS cannot reach (the xterm
9
+ canvas palette, Monaco, and the picker swatches). `data-theme` is stamped
10
+ on <html> by the pre-paint script in index.html and kept in sync by
11
+ lib/theme.ts.
12
+
13
+ Adding a scheme means: one block here + one entry in lib/themes.ts.
14
+
15
+ Names are roles, not shades — "well" is deeper than "app" in dark and
16
+ *lighter* in light, which is exactly why the old literals could not be
17
+ flipped mechanically.
18
+ ───────────────────────────────────────────────────────────── */
19
+
20
+ :root,
21
+ :root[data-theme='tokyo-night'] {
22
+ color-scheme: dark;
23
+
24
+ /* Surfaces, roughly back-to-front */
25
+ --bg-app: #1a1b26; /* window/page background */
26
+ --bg-chrome: #16161e; /* title bar, tab strips, status bar, menus */
27
+ --bg-raised: #1f2335; /* dialogs, popovers, toasts */
28
+ --bg-surface: #2a2b3d; /* button and control fills, dividers */
29
+ --bg-surface-hi: #343650; /* hover on --bg-surface */
30
+ --bg-chrome-hi: #1a1b2e; /* hover on --bg-chrome rows */
31
+ --bg-well: #15161f; /* inputs, cards — sunken in dark, raised in light */
32
+ --bg-well-hi: #181a26; /* hover on --bg-well */
33
+ --bg-inset-hi: #1b2030; /* hover on a transparent inset action */
34
+ --bg-selected: #2a2f4a; /* selected segment in a segmented control */
35
+ --bg-chip: #262a3f; /* count badges */
36
+ --bg-chip-soft: #1c1e2b; /* inline fact pills */
37
+ --bg-editor: #1e1e2e; /* Monaco backdrop — matches its own theme */
38
+
39
+ /* Borders */
40
+ --border: #3b3d57; /* default: dialogs, inputs, buttons */
41
+ --border-subtle: #2a2b3d; /* panel separators, header rules */
42
+ --border-well: #262a3f; /* card outlines */
43
+ --border-strong: #565f89; /* hover/emphasis borders */
44
+ --border-dim: #414868; /* terminal chrome, context menus */
45
+ --border-hover: #3d425f; /* card hover outline */
46
+
47
+ /* Text */
48
+ --text: #a9b1d6; /* body */
49
+ --text-bright: #c0caf5; /* headings, emphasis */
50
+ --text-soft: #9aa5ce; /* long-form secondary copy */
51
+ --text-muted: #565f89; /* labels, captions, inactive dots */
52
+ --text-dim: #414868; /* tertiary, placeholders, grips */
53
+ --text-ticket: #d5dbf5; /* ticket titles */
54
+ --text-ticket-muted: #6b739b;
55
+ --text-ticket-dim: #8088ac;
56
+ --text-placeholder: #4a4f6e;
57
+
58
+ /* Brand */
59
+ --accent: #7aa2f7;
60
+ --accent-hover: #89b4fa;
61
+ --accent-soft: #9db4f5;
62
+ --accent-softer: #c0d0fb;
63
+ --accent-grad-top: #8db0fa;
64
+ --accent-grad-top-hi: #9bbcfb;
65
+ --on-accent: #1a1b26; /* text/icons sitting on an accent fill */
66
+
67
+ /* Status */
68
+ --danger: #f7768e;
69
+ --warning: #e0af68;
70
+ --success: #9ece6a;
71
+ --danger-bg: #2d2030;
72
+ --sev-high: #ff9e64; /* Observer severity, set from ObserverPanel */
73
+ --sev-digest: #bb9af7;
74
+
75
+ /* Odds and ends */
76
+ --selection-bg: #33467c;
77
+ --switch-track: #3b4261;
78
+ --switch-thumb: #c0caf5;
79
+ --ticket-grad-top: #20243a;
80
+ --ticket-grad-bot: #1b1e2e;
81
+ --shadow-color: rgba(0, 0, 0, 0.5);
82
+ --overlay-bg: rgba(0, 0, 0, 0.65);
83
+ --hover-veil: rgba(255, 255, 255, 0.05);
84
+ --footer-veil: rgba(13, 14, 22, 0.35);
85
+ }
86
+
87
+ :root[data-theme='tokyo-day'] {
88
+ color-scheme: light;
89
+
90
+ --bg-app: #e9eaef;
91
+ --bg-chrome: #dfe1e8;
92
+ --bg-raised: #f5f6f9;
93
+ --bg-surface: #d4d7e2;
94
+ --bg-surface-hi: #c3c7d6;
95
+ --bg-chrome-hi: #d7dae6;
96
+ --bg-well: #ffffff;
97
+ --bg-well-hi: #f7f8fc;
98
+ --bg-inset-hi: #e4e8f4;
99
+ --bg-selected: #ccd4ea;
100
+ --bg-chip: #dde0eb;
101
+ --bg-chip-soft: #eef0f6;
102
+ --bg-editor: #ffffff;
103
+
104
+ --border: #c0c4d4;
105
+ --border-subtle: #d5d8e2;
106
+ --border-well: #dcdfe9;
107
+ --border-strong: #9aa0b8;
108
+ --border-dim: #b8bdcf;
109
+ --border-hover: #aab0c6;
110
+
111
+ --text: #3a4060;
112
+ --text-bright: #1b1e33;
113
+ --text-soft: #4c5270;
114
+ --text-muted: #6b7190;
115
+ --text-dim: #9096ad;
116
+ --text-ticket: #22263c;
117
+ --text-ticket-muted: #666d8b;
118
+ --text-ticket-dim: #5f6685;
119
+ --text-placeholder: #9aa0b6;
120
+
121
+ --accent: #2e7de9;
122
+ --accent-hover: #1a68d6;
123
+ --accent-soft: #2f6fd0;
124
+ --accent-softer: #1b5cb8;
125
+ --accent-grad-top: #4d90ef;
126
+ --accent-grad-top-hi: #61a0f5;
127
+ --on-accent: #ffffff;
128
+
129
+ --danger: #f52a65;
130
+ --warning: #8c6c3e;
131
+ --success: #587539;
132
+ --danger-bg: #fce8ee;
133
+ --sev-high: #b15c00;
134
+ --sev-digest: #7847d1;
135
+
136
+ --selection-bg: #b6c8f0;
137
+ --switch-track: #c2c6d6;
138
+ --switch-thumb: #ffffff;
139
+ --ticket-grad-top: #eef0f7;
140
+ --ticket-grad-bot: #e5e7f0;
141
+ --shadow-color: rgba(60, 70, 110, 0.18);
142
+ --overlay-bg: rgba(30, 35, 60, 0.32);
143
+ --hover-veil: rgba(0, 0, 0, 0.04);
144
+ --footer-veil: rgba(255, 255, 255, 0.55);
145
+ }
146
+
147
+ /* Catppuccin Mocha — palette per catppuccin/catppuccin (MIT).
148
+ See THIRD-PARTY-NOTICES.md. */
149
+ :root[data-theme='catppuccin-mocha'] {
150
+ color-scheme: dark;
151
+
152
+ --bg-app: #1e1e2e; /* base */
153
+ --bg-chrome: #181825; /* mantle */
154
+ --bg-raised: #272739;
155
+ --bg-surface: #313244; /* surface0 */
156
+ --bg-surface-hi: #45475a; /* surface1 */
157
+ --bg-chrome-hi: #21212f;
158
+ --bg-well: #11111b; /* crust */
159
+ --bg-well-hi: #17171f;
160
+ --bg-inset-hi: #1b1b28;
161
+ --bg-selected: #3a3c52;
162
+ --bg-chip: #313244;
163
+ --bg-chip-soft: #1a1a27;
164
+ --bg-editor: #1e1e2e;
165
+
166
+ --border: #45475a; /* surface1 */
167
+ --border-subtle: #313244; /* surface0 */
168
+ --border-well: #2a2b3c;
169
+ --border-strong: #6c7086; /* overlay0 */
170
+ --border-dim: #585b70; /* surface2 */
171
+ --border-hover: #585b70;
172
+
173
+ --text: #cdd6f4; /* text */
174
+ --text-bright: #f2f4fd;
175
+ --text-soft: #bac2de; /* subtext1 */
176
+ --text-muted: #7f849c; /* overlay1 */
177
+ --text-dim: #6c7086; /* overlay0 */
178
+ --text-ticket: #cdd6f4;
179
+ --text-ticket-muted: #9399b2;
180
+ --text-ticket-dim: #a6adc8;
181
+ --text-placeholder: #585b70;
182
+
183
+ --accent: #89b4fa; /* blue */
184
+ --accent-hover: #b4befe; /* lavender */
185
+ --accent-soft: #a3c4fb;
186
+ --accent-softer: #c8d6fd;
187
+ --accent-grad-top: #9ec1fb;
188
+ --accent-grad-top-hi: #b4cffc;
189
+ --on-accent: #1e1e2e;
190
+
191
+ --danger: #f38ba8;
192
+ --warning: #f9e2af;
193
+ --success: #a6e3a1;
194
+ --danger-bg: #302334;
195
+ --sev-high: #fab387; /* peach */
196
+ --sev-digest: #cba6f7; /* mauve */
197
+
198
+ --selection-bg: #3e4470;
199
+ --switch-track: #45475a;
200
+ --switch-thumb: #cdd6f4;
201
+ --ticket-grad-top: #232338;
202
+ --ticket-grad-bot: #1c1c29;
203
+ --shadow-color: rgba(0, 0, 0, 0.5);
204
+ --overlay-bg: rgba(0, 0, 0, 0.65);
205
+ --hover-veil: rgba(255, 255, 255, 0.05);
206
+ --footer-veil: rgba(17, 17, 27, 0.35);
207
+ }
208
+
209
+ /* Catppuccin Latte — palette per catppuccin/catppuccin (MIT).
210
+ See THIRD-PARTY-NOTICES.md. */
211
+ :root[data-theme='catppuccin-latte'] {
212
+ color-scheme: light;
213
+
214
+ --bg-app: #eff1f5; /* base */
215
+ --bg-chrome: #e6e9ef; /* mantle */
216
+ --bg-raised: #fafbfc;
217
+ --bg-surface: #ccd0da; /* surface0 */
218
+ --bg-surface-hi: #bcc0cc; /* surface1 */
219
+ --bg-chrome-hi: #dce0e8; /* crust */
220
+ --bg-well: #ffffff;
221
+ --bg-well-hi: #f7f8fa;
222
+ --bg-inset-hi: #e8ecf5;
223
+ --bg-selected: #ccd6ee;
224
+ --bg-chip: #dce0e8;
225
+ --bg-chip-soft: #f0f2f6;
226
+ --bg-editor: #eff1f5;
227
+
228
+ --border: #bcc0cc; /* surface1 */
229
+ --border-subtle: #d5d9e2;
230
+ --border-well: #dce0e8; /* crust */
231
+ --border-strong: #9ca0b0; /* overlay0 */
232
+ --border-dim: #acb0be; /* surface2 */
233
+ --border-hover: #acb0be;
234
+
235
+ --text: #4c4f69; /* text */
236
+ --text-bright: #2f3145;
237
+ --text-soft: #5c5f77; /* subtext1 */
238
+ --text-muted: #7c7f93; /* overlay2 */
239
+ --text-dim: #9ca0b0; /* overlay0 */
240
+ --text-ticket: #3d4059;
241
+ --text-ticket-muted: #6c6f85;
242
+ --text-ticket-dim: #6c6f85;
243
+ --text-placeholder: #9ca0b0;
244
+
245
+ --accent: #1e66f5; /* blue */
246
+ --accent-hover: #0b52d4;
247
+ --accent-soft: #2b60cf;
248
+ --accent-softer: #17479f;
249
+ --accent-grad-top: #4a83f7;
250
+ --accent-grad-top-hi: #6497f8;
251
+ --on-accent: #ffffff;
252
+
253
+ --danger: #d20f39;
254
+ --warning: #df8e1d;
255
+ --success: #40a02b;
256
+ --danger-bg: #fbe3e8;
257
+ --sev-high: #fe640b; /* peach */
258
+ --sev-digest: #8839ef; /* mauve */
259
+
260
+ --selection-bg: #bcc9f0;
261
+ --switch-track: #bcc0cc;
262
+ --switch-thumb: #ffffff;
263
+ --ticket-grad-top: #f2f4f8;
264
+ --ticket-grad-bot: #e9ecf2;
265
+ --shadow-color: rgba(70, 80, 110, 0.16);
266
+ --overlay-bg: rgba(40, 45, 70, 0.3);
267
+ --hover-veil: rgba(0, 0, 0, 0.04);
268
+ --footer-veil: rgba(255, 255, 255, 0.55);
269
+ }
270
+
1
271
  * {
2
272
  margin: 0;
3
273
  padding: 0;
@@ -8,8 +278,8 @@ html, body, #root {
8
278
  height: 100%;
9
279
  width: 100%;
10
280
  overflow: hidden;
11
- background: #1a1b26;
12
- color: #a9b1d6;
281
+ background: var(--bg-app);
282
+ color: var(--text);
13
283
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
14
284
  }
15
285
 
@@ -27,15 +297,15 @@ html, body, #root {
27
297
  align-items: center;
28
298
  justify-content: space-between;
29
299
  padding: 0 16px 0 80px;
30
- background: #16161e;
31
- border-bottom: 1px solid #2a2b3d;
300
+ background: var(--bg-chrome);
301
+ border-bottom: 1px solid var(--border-subtle);
32
302
  font-size: 13px;
33
303
  flex-shrink: 0;
34
304
  }
35
305
 
36
306
  .titlebar-title {
37
307
  font-weight: 600;
38
- color: #c0caf5;
308
+ color: var(--text-bright);
39
309
  display: flex;
40
310
  align-items: center;
41
311
  gap: 6px;
@@ -43,12 +313,12 @@ html, body, #root {
43
313
  }
44
314
 
45
315
  .titlebar-title-sep {
46
- color: #565f89;
316
+ color: var(--text-muted);
47
317
  font-weight: 400;
48
318
  }
49
319
 
50
320
  .titlebar-project {
51
- color: #7aa2f7;
321
+ color: var(--accent);
52
322
  font-weight: 600;
53
323
  white-space: nowrap;
54
324
  overflow: hidden;
@@ -64,9 +334,9 @@ html, body, #root {
64
334
  }
65
335
 
66
336
  .titlebar-controls select {
67
- background: #2a2b3d;
68
- color: #a9b1d6;
69
- border: 1px solid #3b3d57;
337
+ background: var(--bg-surface);
338
+ color: var(--text);
339
+ border: 1px solid var(--border);
70
340
  border-radius: 4px;
71
341
  padding: 2px 8px;
72
342
  font-size: 12px;
@@ -75,13 +345,13 @@ html, body, #root {
75
345
 
76
346
  .titlebar-controls select:focus {
77
347
  outline: none;
78
- border-color: #7aa2f7;
348
+ border-color: var(--accent);
79
349
  }
80
350
 
81
351
  .titlebar-btn {
82
- background: #2a2b3d;
83
- color: #565f89;
84
- border: 1px solid #3b3d57;
352
+ background: var(--bg-surface);
353
+ color: var(--text-muted);
354
+ border: 1px solid var(--border);
85
355
  border-radius: 4px;
86
356
  padding: 2px 10px;
87
357
  font-size: 11px;
@@ -90,14 +360,14 @@ html, body, #root {
90
360
  }
91
361
 
92
362
  .titlebar-btn:hover {
93
- color: #a9b1d6;
94
- border-color: #565f89;
363
+ color: var(--text);
364
+ border-color: var(--border-strong);
95
365
  }
96
366
 
97
367
  .titlebar-btn.active {
98
- color: #7aa2f7;
99
- border-color: #7aa2f7;
100
- background: #1f2335;
368
+ color: var(--accent);
369
+ border-color: var(--accent);
370
+ background: var(--bg-raised);
101
371
  }
102
372
 
103
373
  .titlebar-btn:disabled {
@@ -107,21 +377,21 @@ html, body, #root {
107
377
 
108
378
  /* Keep the greyed-out look stable on hover for disabled buttons. */
109
379
  .titlebar-btn:disabled:hover {
110
- color: #565f89;
111
- border-color: #3b3d57;
380
+ color: var(--text-muted);
381
+ border-color: var(--border);
112
382
  }
113
383
 
114
384
  .titlebar-separator {
115
385
  width: 1px;
116
386
  height: 16px;
117
- background: #3b3d57;
387
+ background: var(--border);
118
388
  margin: 0 4px;
119
389
  }
120
390
 
121
391
  .titlebar-agent-btn {
122
- background: #2a2b3d;
123
- color: #565f89;
124
- border: 1px solid #3b3d57;
392
+ background: var(--bg-surface);
393
+ color: var(--text-muted);
394
+ border: 1px solid var(--border);
125
395
  border-radius: 4px;
126
396
  padding: 2px 12px;
127
397
  font-size: 11px;
@@ -130,14 +400,14 @@ html, body, #root {
130
400
  }
131
401
 
132
402
  .titlebar-agent-btn:hover {
133
- color: #a9b1d6;
134
- border-color: #565f89;
403
+ color: var(--text);
404
+ border-color: var(--border-strong);
135
405
  }
136
406
 
137
407
  .titlebar-agent-btn.active {
138
- color: #1a1b26;
139
- background: #7aa2f7;
140
- border-color: #7aa2f7;
408
+ color: var(--on-accent);
409
+ background: var(--accent);
410
+ border-color: var(--accent);
141
411
  font-weight: 600;
142
412
  }
143
413
 
@@ -161,8 +431,8 @@ html, body, #root {
161
431
  align-items: center;
162
432
  gap: 1px;
163
433
  padding: 2px 4px;
164
- background: #16161e;
165
- border-bottom: 1px solid #292e42;
434
+ background: var(--bg-chrome);
435
+ border-bottom: 1px solid var(--border-subtle);
166
436
  flex-shrink: 0;
167
437
  overflow-x: auto;
168
438
  min-height: 28px;
@@ -174,7 +444,7 @@ html, body, #root {
174
444
  gap: 4px;
175
445
  padding: 3px 8px;
176
446
  font-size: 11px;
177
- color: #565f89;
447
+ color: var(--text-muted);
178
448
  background: transparent;
179
449
  border-radius: 4px;
180
450
  cursor: pointer;
@@ -183,13 +453,13 @@ html, body, #root {
183
453
  }
184
454
 
185
455
  .terminal-tab:hover {
186
- background: #1f2335;
187
- color: #a9b1d6;
456
+ background: var(--bg-raised);
457
+ color: var(--text);
188
458
  }
189
459
 
190
460
  .terminal-tab.active {
191
- background: #1a1b26;
192
- color: #c0caf5;
461
+ background: var(--bg-app);
462
+ color: var(--text-bright);
193
463
  }
194
464
 
195
465
  .terminal-tab-label {
@@ -206,23 +476,23 @@ html, body, #root {
206
476
  }
207
477
 
208
478
  .terminal-tab-dot.active {
209
- background: #9ece6a;
479
+ background: var(--success);
210
480
  }
211
481
 
212
482
  .terminal-tab-dot.exited {
213
- background: #565f89;
483
+ background: var(--text-muted);
214
484
  }
215
485
 
216
486
  /* Agent is waiting on the user — pulse to draw the eye across tabs. */
217
487
  .terminal-tab-dot.awaiting {
218
- background: #e0af68; /* amber: waiting for next prompt */
219
- color: #e0af68; /* drives the box-shadow glow via currentColor */
488
+ background: var(--warning); /* amber: waiting for next prompt */
489
+ color: var(--warning); /* drives the box-shadow glow via currentColor */
220
490
  animation: tab-dot-pulse 1.1s ease-in-out infinite;
221
491
  }
222
492
 
223
493
  .terminal-tab-dot.decision {
224
- background: #f7768e; /* red: blocked on an approval/permission prompt */
225
- color: #f7768e;
494
+ background: var(--danger); /* red: blocked on an approval/permission prompt */
495
+ color: var(--danger);
226
496
  animation: tab-dot-pulse 1.1s ease-in-out infinite;
227
497
  }
228
498
 
@@ -245,14 +515,14 @@ html, body, #root {
245
515
 
246
516
  .terminal-tab-close:hover {
247
517
  opacity: 1;
248
- background: rgba(247, 118, 142, 0.2);
249
- color: #f7768e;
518
+ background: color-mix(in srgb, var(--danger) 20%, transparent);
519
+ color: var(--danger);
250
520
  }
251
521
 
252
522
  .terminal-tab-add {
253
523
  background: none;
254
524
  border: none;
255
- color: #565f89;
525
+ color: var(--text-muted);
256
526
  font-size: 16px;
257
527
  cursor: pointer;
258
528
  padding: 2px 6px;
@@ -261,8 +531,8 @@ html, body, #root {
261
531
  }
262
532
 
263
533
  .terminal-tab-add:hover {
264
- background: #1f2335;
265
- color: #a9b1d6;
534
+ background: var(--bg-raised);
535
+ color: var(--text);
266
536
  }
267
537
 
268
538
  .terminal-tabs-content {
@@ -308,18 +578,18 @@ html, body, #root {
308
578
  gap: 5px;
309
579
  padding: 5px 12px;
310
580
  border-radius: 14px;
311
- background: #2a2b3d;
312
- border: 1px solid #7aa2f7;
313
- color: #c0caf5;
581
+ background: var(--bg-surface);
582
+ border: 1px solid var(--accent);
583
+ color: var(--text-bright);
314
584
  font-family: inherit;
315
585
  font-size: 11.5px;
316
586
  font-weight: 600;
317
587
  cursor: pointer;
318
- box-shadow: 0 4px 14px rgba(0, 0, 0, 0.45);
588
+ box-shadow: 0 4px 14px var(--shadow-color);
319
589
  transition: background 0.13s ease, transform 0.06s ease;
320
590
  }
321
591
  .term-jump-latest:hover {
322
- background: #343650;
592
+ background: var(--bg-surface-hi);
323
593
  }
324
594
  .term-jump-latest:active {
325
595
  transform: translateY(1px);
@@ -363,7 +633,7 @@ html, body, #root {
363
633
  /* Dividers */
364
634
  .split-divider {
365
635
  flex-shrink: 0;
366
- background: #2a2b3d;
636
+ background: var(--bg-surface);
367
637
  transition: background 0.15s;
368
638
  z-index: 2;
369
639
  }
@@ -381,7 +651,7 @@ html, body, #root {
381
651
  }
382
652
 
383
653
  .split-divider:hover {
384
- background: #7aa2f7;
654
+ background: var(--accent);
385
655
  }
386
656
 
387
657
  /* Leaf pane */
@@ -410,8 +680,8 @@ html, body, #root {
410
680
  align-items: center;
411
681
  height: 26px;
412
682
  padding: 0 6px;
413
- background: #16161e;
414
- border-bottom: 1px solid #2a2b3d;
683
+ background: var(--bg-chrome);
684
+ border-bottom: 1px solid var(--border-subtle);
415
685
  flex-shrink: 0;
416
686
  cursor: grab;
417
687
  user-select: none;
@@ -423,19 +693,19 @@ html, body, #root {
423
693
 
424
694
  .pane-drag-grip {
425
695
  font-size: 10px;
426
- color: #414868;
696
+ color: var(--text-dim);
427
697
  margin-right: 6px;
428
698
  line-height: 1;
429
699
  }
430
700
 
431
701
  .pane-header:hover .pane-drag-grip {
432
- color: #7aa2f7;
702
+ color: var(--accent);
433
703
  }
434
704
 
435
705
  .pane-header-label {
436
706
  font-size: 11px;
437
707
  font-weight: 600;
438
- color: #565f89;
708
+ color: var(--text-muted);
439
709
  letter-spacing: 0.3px;
440
710
  flex: 1;
441
711
  }
@@ -443,7 +713,7 @@ html, body, #root {
443
713
  .pane-hide-btn {
444
714
  background: none;
445
715
  border: none;
446
- color: #414868;
716
+ color: var(--text-dim);
447
717
  font-size: 14px;
448
718
  cursor: pointer;
449
719
  padding: 0 4px;
@@ -451,7 +721,7 @@ html, body, #root {
451
721
  }
452
722
 
453
723
  .pane-hide-btn:hover {
454
- color: #f7768e;
724
+ color: var(--danger);
455
725
  }
456
726
 
457
727
  /* Drop zone overlay */
@@ -510,8 +780,8 @@ html, body, #root {
510
780
  }
511
781
 
512
782
  .drop-zone.active {
513
- background: rgba(122, 162, 247, 0.25);
514
- border: 2px solid rgba(122, 162, 247, 0.6);
783
+ background: color-mix(in srgb, var(--accent) 25%, transparent);
784
+ border: 2px solid color-mix(in srgb, var(--accent) 60%, transparent);
515
785
  }
516
786
 
517
787
  .multi-split-empty {
@@ -520,7 +790,7 @@ html, body, #root {
520
790
  display: flex;
521
791
  align-items: center;
522
792
  justify-content: center;
523
- color: #565f89;
793
+ color: var(--text-muted);
524
794
  font-size: 13px;
525
795
  }
526
796
 
@@ -539,8 +809,8 @@ html, body, #root {
539
809
  align-items: center;
540
810
  gap: 4px;
541
811
  padding: 5px 6px;
542
- background: #1a1b26;
543
- border-bottom: 1px solid #2a2b3d;
812
+ background: var(--bg-app);
813
+ border-bottom: 1px solid var(--border-subtle);
544
814
  }
545
815
 
546
816
  .ctlsurf-nav-btn {
@@ -554,18 +824,18 @@ html, body, #root {
554
824
  background: transparent;
555
825
  border: none;
556
826
  border-radius: 4px;
557
- color: #a9b1d6;
827
+ color: var(--text);
558
828
  font-size: 16px;
559
829
  line-height: 1;
560
830
  cursor: pointer;
561
831
  }
562
832
 
563
833
  .ctlsurf-nav-btn:hover:not(:disabled) {
564
- background: #2a2b3d;
834
+ background: var(--bg-surface);
565
835
  }
566
836
 
567
837
  .ctlsurf-nav-btn:disabled {
568
- color: #565f89;
838
+ color: var(--text-muted);
569
839
  opacity: 0.5;
570
840
  cursor: default;
571
841
  }
@@ -580,16 +850,16 @@ html, body, #root {
580
850
  width: 100%;
581
851
  height: 26px;
582
852
  padding: 0 11px;
583
- background: #16161e;
584
- border: 1px solid #2a2b3d;
853
+ background: var(--bg-chrome);
854
+ border: 1px solid var(--border-subtle);
585
855
  border-radius: 13px;
586
- color: #c0caf5;
856
+ color: var(--text-bright);
587
857
  font-size: 12px;
588
858
  outline: none;
589
859
  }
590
860
 
591
861
  .ctlsurf-address-input:focus {
592
- border-color: #7aa2f7;
862
+ border-color: var(--accent);
593
863
  }
594
864
 
595
865
  .ctlsurf-webview-host {
@@ -618,10 +888,10 @@ html, body, #root {
618
888
  align-items: center;
619
889
  justify-content: space-between;
620
890
  padding: 0 12px;
621
- background: #16161e;
622
- border-top: 1px solid #2a2b3d;
891
+ background: var(--bg-chrome);
892
+ border-top: 1px solid var(--border-subtle);
623
893
  font-size: 11px;
624
- color: #565f89;
894
+ color: var(--text-muted);
625
895
  flex-shrink: 0;
626
896
  }
627
897
 
@@ -636,14 +906,14 @@ html, body, #root {
636
906
  border-radius: 3px;
637
907
  font-size: 11px;
638
908
  cursor: pointer;
639
- border: 1px solid #3b3d57;
640
- background: #2a2b3d;
641
- color: #7aa2f7;
909
+ border: 1px solid var(--border);
910
+ background: var(--bg-surface);
911
+ color: var(--accent);
642
912
  margin-left: 4px;
643
913
  }
644
914
 
645
915
  .statusbar-btn:hover {
646
- background: #3b3d57;
916
+ background: var(--border);
647
917
  }
648
918
 
649
919
  .statusbar-btn:disabled {
@@ -655,14 +925,14 @@ html, body, #root {
655
925
  cursor: pointer;
656
926
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
657
927
  font-size: 11px;
658
- color: #a9b1d6;
928
+ color: var(--text);
659
929
  padding: 1px 4px;
660
930
  border-radius: 3px;
661
931
  }
662
932
 
663
933
  .statusbar-path:hover {
664
- background: #2a2b3d;
665
- color: #7aa2f7;
934
+ background: var(--bg-surface);
935
+ color: var(--accent);
666
936
  }
667
937
 
668
938
  .status-dot {
@@ -672,21 +942,21 @@ html, body, #root {
672
942
  display: inline-block;
673
943
  }
674
944
 
675
- .status-dot.active { background: #9ece6a; }
676
- .status-dot.inactive { background: #f7768e; }
677
- .status-dot.idle { background: #565f89; }
678
- .status-dot.pending { background: #e0af68; }
945
+ .status-dot.active { background: var(--success); }
946
+ .status-dot.inactive { background: var(--danger); }
947
+ .status-dot.idle { background: var(--text-muted); }
948
+ .status-dot.pending { background: var(--warning); }
679
949
 
680
950
  .statusbar-version {
681
951
  margin-left: 12px;
682
- color: #565f89;
952
+ color: var(--text-muted);
683
953
  font-size: 11px;
684
954
  white-space: nowrap;
685
955
  cursor: help;
686
956
  }
687
957
 
688
958
  .statusbar-version.has-update {
689
- color: #e0af68;
959
+ color: var(--warning);
690
960
  font-weight: 500;
691
961
  }
692
962
 
@@ -697,8 +967,8 @@ html, body, #root {
697
967
  display: inline-block;
698
968
  vertical-align: middle;
699
969
  }
700
- .tracking-dot.on { background: #9ece6a; box-shadow: 0 0 4px #9ece6a; }
701
- .tracking-dot.off { background: #565f89; }
970
+ .tracking-dot.on { background: var(--success); box-shadow: 0 0 4px var(--success); }
971
+ .tracking-dot.off { background: var(--text-muted); }
702
972
 
703
973
  .titlebar-icon-btn {
704
974
  display: inline-flex;
@@ -726,14 +996,14 @@ html, body, #root {
726
996
  cursor: not-allowed;
727
997
  }
728
998
  .voice-btn.listening {
729
- color: #f7768e;
730
- border-color: #f7768e;
731
- background: #1f2335;
999
+ color: var(--danger);
1000
+ border-color: var(--danger);
1001
+ background: var(--bg-raised);
732
1002
  }
733
1003
  .voice-btn.busy {
734
- color: #e0af68;
735
- border-color: #e0af68;
736
- background: #1f2335;
1004
+ color: var(--warning);
1005
+ border-color: var(--warning);
1006
+ background: var(--bg-raised);
737
1007
  }
738
1008
  .voice-icon {
739
1009
  font-size: 13px;
@@ -745,16 +1015,16 @@ html, body, #root {
745
1015
  border-radius: 50%;
746
1016
  display: inline-block;
747
1017
  vertical-align: middle;
748
- background: #565f89;
1018
+ background: var(--text-muted);
749
1019
  }
750
1020
  .voice-dot.on {
751
- background: #f7768e;
752
- box-shadow: 0 0 4px #f7768e;
1021
+ background: var(--danger);
1022
+ box-shadow: 0 0 4px var(--danger);
753
1023
  animation: voice-pulse 1s ease-in-out infinite;
754
1024
  }
755
1025
  .voice-dot.busy {
756
- background: #e0af68;
757
- box-shadow: 0 0 4px #e0af68;
1026
+ background: var(--warning);
1027
+ box-shadow: 0 0 4px var(--warning);
758
1028
  animation: voice-pulse 0.8s ease-in-out infinite;
759
1029
  }
760
1030
  @keyframes voice-pulse {
@@ -776,27 +1046,27 @@ html, body, #root {
776
1046
  text-overflow: ellipsis;
777
1047
  z-index: 50;
778
1048
  pointer-events: none;
779
- border: 1px solid #3b3d57;
1049
+ border: 1px solid var(--border);
780
1050
  }
781
1051
  .voice-chip.listening {
782
- background: #1f2335;
783
- color: #a9b1d6;
1052
+ background: var(--bg-raised);
1053
+ color: var(--text);
784
1054
  }
785
1055
  .voice-chip.busy {
786
- background: #1f2335;
787
- color: #e0af68;
788
- border-color: #e0af68;
1056
+ background: var(--bg-raised);
1057
+ color: var(--warning);
1058
+ border-color: var(--warning);
789
1059
  }
790
1060
  .voice-chip.notice {
791
- background: #1f2335;
792
- color: #e0af68;
793
- border-color: #e0af68;
1061
+ background: var(--bg-raised);
1062
+ color: var(--warning);
1063
+ border-color: var(--warning);
794
1064
  white-space: normal;
795
1065
  }
796
1066
  .voice-chip.error {
797
- background: #2d2030;
798
- color: #f7768e;
799
- border-color: #f7768e;
1067
+ background: var(--danger-bg);
1068
+ color: var(--danger);
1069
+ border-color: var(--danger);
800
1070
  white-space: normal;
801
1071
  }
802
1072
 
@@ -809,10 +1079,10 @@ html, body, #root {
809
1079
  align-items: center;
810
1080
  gap: 4px;
811
1081
  padding: 4px 4px 6px;
812
- background: #16161e;
813
- border: 1px solid #3b3d57;
1082
+ background: var(--bg-chrome);
1083
+ border: 1px solid var(--border);
814
1084
  border-radius: 12px;
815
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45);
1085
+ box-shadow: 0 4px 16px var(--shadow-color);
816
1086
  user-select: none;
817
1087
  -webkit-user-select: none;
818
1088
  }
@@ -826,7 +1096,7 @@ html, body, #root {
826
1096
  }
827
1097
  .floating-mic-handle:active { cursor: grabbing; }
828
1098
  .floating-mic-grip {
829
- color: #565f89;
1099
+ color: var(--text-muted);
830
1100
  font-size: 12px;
831
1101
  line-height: 1;
832
1102
  padding: 0 2px;
@@ -834,13 +1104,13 @@ html, body, #root {
834
1104
  .floating-mic-hide {
835
1105
  background: transparent;
836
1106
  border: none;
837
- color: #565f89;
1107
+ color: var(--text-muted);
838
1108
  font-size: 15px;
839
1109
  line-height: 1;
840
1110
  cursor: pointer;
841
1111
  padding: 0 2px;
842
1112
  }
843
- .floating-mic-hide:hover { color: #f7768e; }
1113
+ .floating-mic-hide:hover { color: var(--danger); }
844
1114
 
845
1115
  /* Smaller sibling of the round mic: read the last agent reply aloud. */
846
1116
  .floating-mic-read {
@@ -850,16 +1120,16 @@ html, body, #root {
850
1120
  display: inline-flex;
851
1121
  align-items: center;
852
1122
  justify-content: center;
853
- background: #2a2b3d;
854
- border: 1px solid #3b3d57;
855
- color: #a9b1d6;
1123
+ background: var(--bg-surface);
1124
+ border: 1px solid var(--border);
1125
+ color: var(--text);
856
1126
  cursor: pointer;
857
1127
  transition: all 0.15s;
858
1128
  }
859
- .floating-mic-read:hover { border-color: #565f89; color: #c0caf5; }
1129
+ .floating-mic-read:hover { border-color: var(--border-strong); color: var(--text-bright); }
860
1130
  .floating-mic-read.speaking {
861
- color: #7aa2f7;
862
- border-color: #7aa2f7;
1131
+ color: var(--accent);
1132
+ border-color: var(--accent);
863
1133
  }
864
1134
  .floating-mic-note {
865
1135
  position: absolute;
@@ -868,9 +1138,9 @@ html, body, #root {
868
1138
  transform: translateX(-50%);
869
1139
  white-space: nowrap;
870
1140
  font-size: 11px;
871
- color: #565f89;
872
- background: #16161e;
873
- border: 1px solid #3b3d57;
1141
+ color: var(--text-muted);
1142
+ background: var(--bg-chrome);
1143
+ border: 1px solid var(--border);
874
1144
  border-radius: 6px;
875
1145
  padding: 2px 6px;
876
1146
  pointer-events: none;
@@ -883,14 +1153,14 @@ html, body, #root {
883
1153
  display: inline-flex;
884
1154
  align-items: center;
885
1155
  justify-content: center;
886
- background: #2a2b3d;
887
- border: 1px solid #3b3d57;
888
- color: #a9b1d6;
1156
+ background: var(--bg-surface);
1157
+ border: 1px solid var(--border);
1158
+ color: var(--text);
889
1159
  cursor: pointer;
890
1160
  position: relative;
891
1161
  transition: all 0.15s;
892
1162
  }
893
- .voice-btn-floating:hover { border-color: #565f89; }
1163
+ .voice-btn-floating:hover { border-color: var(--border-strong); }
894
1164
  .voice-btn-floating .voice-icon { font-size: 22px; }
895
1165
  .voice-btn-floating .voice-dot {
896
1166
  position: absolute;
@@ -922,15 +1192,15 @@ html, body, #root {
922
1192
  padding: 0;
923
1193
  font-size: 10px;
924
1194
  line-height: 1;
925
- background: #2a2b3d;
926
- border: 1px solid #3b3d57;
927
- color: #a9b1d6;
1195
+ background: var(--bg-surface);
1196
+ border: 1px solid var(--border);
1197
+ color: var(--text);
928
1198
  cursor: pointer;
929
1199
  z-index: 60;
930
1200
  }
931
1201
  .voice-source-btn:hover {
932
- border-color: #7aa2f7;
933
- color: #c0caf5;
1202
+ border-color: var(--accent);
1203
+ color: var(--text-bright);
934
1204
  }
935
1205
  .voice-source-menu {
936
1206
  position: absolute;
@@ -940,17 +1210,17 @@ html, body, #root {
940
1210
  min-width: 200px;
941
1211
  max-width: 280px;
942
1212
  padding: 4px;
943
- background: #16161e;
944
- border: 1px solid #3b3d57;
1213
+ background: var(--bg-chrome);
1214
+ border: 1px solid var(--border);
945
1215
  border-radius: 8px;
946
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5);
1216
+ box-shadow: 0 6px 20px var(--shadow-color);
947
1217
  z-index: 300;
948
1218
  }
949
1219
  .voice-source-head {
950
1220
  font-size: 10px;
951
1221
  text-transform: uppercase;
952
1222
  letter-spacing: 0.04em;
953
- color: #565f89;
1223
+ color: var(--text-muted);
954
1224
  padding: 4px 8px 6px;
955
1225
  }
956
1226
  .voice-source-item {
@@ -962,17 +1232,17 @@ html, body, #root {
962
1232
  border: none;
963
1233
  border-radius: 5px;
964
1234
  background: transparent;
965
- color: #a9b1d6;
1235
+ color: var(--text);
966
1236
  font-size: 12px;
967
1237
  text-align: left;
968
1238
  cursor: pointer;
969
1239
  }
970
- .voice-source-item:hover { background: #1f2335; }
971
- .voice-source-item.active { color: #7aa2f7; }
1240
+ .voice-source-item:hover { background: var(--bg-raised); }
1241
+ .voice-source-item.active { color: var(--accent); }
972
1242
  .voice-source-check {
973
1243
  flex: 0 0 12px;
974
1244
  width: 12px;
975
- color: #7aa2f7;
1245
+ color: var(--accent);
976
1246
  font-size: 11px;
977
1247
  }
978
1248
  .voice-source-label {
@@ -983,7 +1253,7 @@ html, body, #root {
983
1253
  .voice-source-empty {
984
1254
  padding: 6px 8px;
985
1255
  font-size: 11px;
986
- color: #565f89;
1256
+ color: var(--text-muted);
987
1257
  }
988
1258
 
989
1259
  /* Spoken-replies titlebar control */
@@ -993,13 +1263,13 @@ html, body, #root {
993
1263
  align-items: center;
994
1264
  }
995
1265
  .speak-btn.active {
996
- color: #7aa2f7;
997
- border-color: #7aa2f7;
1266
+ color: var(--accent);
1267
+ border-color: var(--accent);
998
1268
  }
999
1269
  .speak-pct {
1000
1270
  font-size: 9px;
1001
1271
  margin-left: 3px;
1002
- color: #e0af68;
1272
+ color: var(--warning);
1003
1273
  }
1004
1274
  .speak-caret {
1005
1275
  padding: 0 3px;
@@ -1007,10 +1277,10 @@ html, body, #root {
1007
1277
  min-width: 0;
1008
1278
  }
1009
1279
  .speak-stop {
1010
- color: #f7768e;
1011
- border-color: #f7768e;
1280
+ color: var(--danger);
1281
+ border-color: var(--danger);
1012
1282
  }
1013
- .speak-stop:hover { background: #2d2030; }
1283
+ .speak-stop:hover { background: var(--danger-bg); }
1014
1284
  .speak-error {
1015
1285
  position: absolute;
1016
1286
  top: 100%;
@@ -1023,9 +1293,9 @@ html, body, #root {
1023
1293
  line-height: 1.3;
1024
1294
  white-space: normal;
1025
1295
  word-break: break-word;
1026
- background: #2d2030;
1027
- color: #f7768e;
1028
- border: 1px solid #f7768e;
1296
+ background: var(--danger-bg);
1297
+ color: var(--danger);
1298
+ border: 1px solid var(--danger);
1029
1299
  z-index: 60;
1030
1300
  }
1031
1301
  .speak-menu {
@@ -1036,17 +1306,17 @@ html, body, #root {
1036
1306
  min-width: 220px;
1037
1307
  max-width: 280px;
1038
1308
  padding: 6px;
1039
- background: #16161e;
1040
- border: 1px solid #3b3d57;
1309
+ background: var(--bg-chrome);
1310
+ border: 1px solid var(--border);
1041
1311
  border-radius: 8px;
1042
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5);
1312
+ box-shadow: 0 6px 20px var(--shadow-color);
1043
1313
  z-index: 300;
1044
1314
  }
1045
1315
  .speak-menu-head {
1046
1316
  font-size: 10px;
1047
1317
  text-transform: uppercase;
1048
1318
  letter-spacing: 0.04em;
1049
- color: #565f89;
1319
+ color: var(--text-muted);
1050
1320
  padding: 6px 6px 4px;
1051
1321
  }
1052
1322
  .speak-menu-item {
@@ -1058,33 +1328,33 @@ html, body, #root {
1058
1328
  border: none;
1059
1329
  border-radius: 5px;
1060
1330
  background: transparent;
1061
- color: #a9b1d6;
1331
+ color: var(--text);
1062
1332
  font-size: 12px;
1063
1333
  text-align: left;
1064
1334
  cursor: pointer;
1065
1335
  }
1066
- .speak-menu-item:hover { background: #1f2335; }
1067
- .speak-menu-item.active { color: #7aa2f7; }
1336
+ .speak-menu-item:hover { background: var(--bg-raised); }
1337
+ .speak-menu-item.active { color: var(--accent); }
1068
1338
  .speak-menu-check {
1069
1339
  flex: 0 0 12px;
1070
1340
  width: 12px;
1071
- color: #7aa2f7;
1341
+ color: var(--accent);
1072
1342
  font-size: 11px;
1073
1343
  }
1074
1344
  .speak-select {
1075
1345
  width: 100%;
1076
1346
  margin: 2px 0 4px;
1077
1347
  padding: 4px 6px;
1078
- background: #1f2335;
1079
- color: #a9b1d6;
1080
- border: 1px solid #3b3d57;
1348
+ background: var(--bg-raised);
1349
+ color: var(--text);
1350
+ border: 1px solid var(--border);
1081
1351
  border-radius: 5px;
1082
1352
  font-size: 12px;
1083
1353
  }
1084
1354
  .speak-rate {
1085
1355
  width: 100%;
1086
1356
  margin: 2px 0 6px;
1087
- accent-color: #7aa2f7;
1357
+ accent-color: var(--accent);
1088
1358
  }
1089
1359
  .speak-menu-row {
1090
1360
  display: flex;
@@ -1094,14 +1364,14 @@ html, body, #root {
1094
1364
  .speak-menu-btn {
1095
1365
  flex: 1;
1096
1366
  padding: 5px 6px;
1097
- background: #2a2b3d;
1098
- color: #a9b1d6;
1099
- border: 1px solid #3b3d57;
1367
+ background: var(--bg-surface);
1368
+ color: var(--text);
1369
+ border: 1px solid var(--border);
1100
1370
  border-radius: 5px;
1101
1371
  font-size: 12px;
1102
1372
  cursor: pointer;
1103
1373
  }
1104
- .speak-menu-btn:hover { border-color: #7aa2f7; color: #c0caf5; }
1374
+ .speak-menu-btn:hover { border-color: var(--accent); color: var(--text-bright); }
1105
1375
 
1106
1376
  /* Editor panel */
1107
1377
  .editor-panel {
@@ -1109,7 +1379,7 @@ html, body, #root {
1109
1379
  width: 100%;
1110
1380
  height: 100%;
1111
1381
  overflow: hidden;
1112
- background: #1e1e2e;
1382
+ background: var(--bg-editor);
1113
1383
  }
1114
1384
 
1115
1385
  .editor-tree {
@@ -1117,17 +1387,17 @@ html, body, #root {
1117
1387
  display: flex;
1118
1388
  flex-direction: column;
1119
1389
  flex-shrink: 0;
1120
- background: #1a1b26;
1121
- border-right: 1px solid #2a2b3d;
1390
+ background: var(--bg-app);
1391
+ border-right: 1px solid var(--border-subtle);
1122
1392
  }
1123
1393
 
1124
1394
  .editor-tree-header {
1125
1395
  padding: 8px 12px;
1126
1396
  font-size: 11px;
1127
1397
  font-weight: 600;
1128
- color: #565f89;
1398
+ color: var(--text-muted);
1129
1399
  letter-spacing: 0.5px;
1130
- border-bottom: 1px solid #2a2b3d;
1400
+ border-bottom: 1px solid var(--border-subtle);
1131
1401
  flex-shrink: 0;
1132
1402
  }
1133
1403
 
@@ -1142,7 +1412,7 @@ html, body, #root {
1142
1412
  }
1143
1413
 
1144
1414
  .editor-tree-content::-webkit-scrollbar-thumb {
1145
- background: #2a2b3d;
1415
+ background: var(--bg-surface);
1146
1416
  border-radius: 3px;
1147
1417
  }
1148
1418
 
@@ -1152,19 +1422,19 @@ html, body, #root {
1152
1422
  padding: 3px 0;
1153
1423
  cursor: pointer;
1154
1424
  font-size: 12px;
1155
- color: #a9b1d6;
1425
+ color: var(--text);
1156
1426
  white-space: nowrap;
1157
1427
  overflow: hidden;
1158
1428
  text-overflow: ellipsis;
1159
1429
  }
1160
1430
 
1161
1431
  .tree-node:hover {
1162
- background: rgba(122, 162, 247, 0.08);
1432
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
1163
1433
  }
1164
1434
 
1165
1435
  .tree-node.selected {
1166
- background: rgba(122, 162, 247, 0.15);
1167
- color: #c0caf5;
1436
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
1437
+ color: var(--text-bright);
1168
1438
  }
1169
1439
 
1170
1440
  .tree-icon {
@@ -1172,7 +1442,7 @@ html, body, #root {
1172
1442
  text-align: center;
1173
1443
  flex-shrink: 0;
1174
1444
  font-size: 10px;
1175
- color: #565f89;
1445
+ color: var(--text-muted);
1176
1446
  }
1177
1447
 
1178
1448
  .tree-file-icon {
@@ -1193,7 +1463,7 @@ html, body, #root {
1193
1463
  }
1194
1464
 
1195
1465
  .editor-tree-divider:hover {
1196
- background: #7aa2f7;
1466
+ background: var(--accent);
1197
1467
  }
1198
1468
 
1199
1469
  .editor-main {
@@ -1210,36 +1480,36 @@ html, body, #root {
1210
1480
  gap: 4px;
1211
1481
  padding: 0 8px;
1212
1482
  height: 32px;
1213
- background: #16161e;
1214
- border-bottom: 1px solid #2a2b3d;
1483
+ background: var(--bg-chrome);
1484
+ border-bottom: 1px solid var(--border-subtle);
1215
1485
  flex-shrink: 0;
1216
1486
  }
1217
1487
 
1218
1488
  .editor-tab {
1219
1489
  font-size: 12px;
1220
- color: #a9b1d6;
1490
+ color: var(--text);
1221
1491
  padding: 4px 10px;
1222
1492
  border-radius: 3px;
1223
1493
  }
1224
1494
 
1225
1495
  .editor-tab.active {
1226
- color: #c0caf5;
1227
- background: #2a2b3d;
1496
+ color: var(--text-bright);
1497
+ background: var(--bg-surface);
1228
1498
  }
1229
1499
 
1230
1500
  .editor-save-btn {
1231
1501
  margin-left: auto;
1232
1502
  padding: 2px 10px;
1233
1503
  font-size: 11px;
1234
- background: #7aa2f7;
1235
- color: #1a1b26;
1504
+ background: var(--accent);
1505
+ color: var(--on-accent);
1236
1506
  border: none;
1237
1507
  border-radius: 3px;
1238
1508
  cursor: pointer;
1239
1509
  }
1240
1510
 
1241
1511
  .editor-save-btn:hover {
1242
- background: #89b4fa;
1512
+ background: var(--accent-hover);
1243
1513
  }
1244
1514
 
1245
1515
  .editor-monaco-container {
@@ -1252,7 +1522,7 @@ html, body, #root {
1252
1522
  display: flex;
1253
1523
  align-items: center;
1254
1524
  justify-content: center;
1255
- color: #565f89;
1525
+ color: var(--text-muted);
1256
1526
  font-size: 13px;
1257
1527
  }
1258
1528
 
@@ -1260,7 +1530,7 @@ html, body, #root {
1260
1530
  .agent-picker-overlay {
1261
1531
  position: fixed;
1262
1532
  inset: 0;
1263
- background: rgba(0, 0, 0, 0.7);
1533
+ background: var(--overlay-bg);
1264
1534
  display: flex;
1265
1535
  align-items: center;
1266
1536
  justify-content: center;
@@ -1268,8 +1538,8 @@ html, body, #root {
1268
1538
  }
1269
1539
 
1270
1540
  .agent-picker-modal {
1271
- background: #1f2335;
1272
- border: 1px solid #3b3d57;
1541
+ background: var(--bg-raised);
1542
+ border: 1px solid var(--border);
1273
1543
  border-radius: 12px;
1274
1544
  padding: 32px 40px;
1275
1545
  min-width: 360px;
@@ -1282,7 +1552,7 @@ html, body, #root {
1282
1552
  .agent-picker-brand {
1283
1553
  font-size: 22px;
1284
1554
  font-weight: 700;
1285
- color: #7aa2f7;
1555
+ color: var(--accent);
1286
1556
  margin-bottom: 20px;
1287
1557
  letter-spacing: 0.5px;
1288
1558
  }
@@ -1294,15 +1564,15 @@ html, body, #root {
1294
1564
  gap: 8px;
1295
1565
  padding: 10px 16px;
1296
1566
  margin-bottom: 20px;
1297
- background: #16161e;
1298
- border: 1px solid #2a2b3d;
1567
+ background: var(--bg-chrome);
1568
+ border: 1px solid var(--border-subtle);
1299
1569
  border-radius: 8px;
1300
1570
  cursor: pointer;
1301
1571
  transition: border-color 0.15s;
1302
1572
  }
1303
1573
 
1304
1574
  .agent-picker-cwd:hover {
1305
- border-color: #7aa2f7;
1575
+ border-color: var(--accent);
1306
1576
  }
1307
1577
 
1308
1578
  .agent-picker-cwd-icon {
@@ -1312,7 +1582,7 @@ html, body, #root {
1312
1582
  .agent-picker-cwd-path {
1313
1583
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
1314
1584
  font-size: 12px;
1315
- color: #a9b1d6;
1585
+ color: var(--text);
1316
1586
  flex: 1;
1317
1587
  text-align: left;
1318
1588
  overflow: hidden;
@@ -1322,13 +1592,13 @@ html, body, #root {
1322
1592
 
1323
1593
  .agent-picker-cwd-change {
1324
1594
  font-size: 11px;
1325
- color: #7aa2f7;
1595
+ color: var(--accent);
1326
1596
  flex-shrink: 0;
1327
1597
  }
1328
1598
 
1329
1599
  .agent-picker-title {
1330
1600
  font-size: 11px;
1331
- color: #565f89;
1601
+ color: var(--text-muted);
1332
1602
  margin-bottom: 12px;
1333
1603
  text-transform: uppercase;
1334
1604
  letter-spacing: 1px;
@@ -1346,8 +1616,8 @@ html, body, #root {
1346
1616
  justify-content: space-between;
1347
1617
  gap: 16px;
1348
1618
  padding: 14px 18px;
1349
- background: #16161e;
1350
- border: 1px solid #2a2b3d;
1619
+ background: var(--bg-chrome);
1620
+ border: 1px solid var(--border-subtle);
1351
1621
  border-radius: 8px;
1352
1622
  cursor: pointer;
1353
1623
  transition: all 0.15s;
@@ -1355,27 +1625,27 @@ html, body, #root {
1355
1625
  }
1356
1626
 
1357
1627
  .agent-picker-item:hover {
1358
- border-color: #7aa2f7;
1359
- background: #1a1b2e;
1628
+ border-color: var(--accent);
1629
+ background: var(--bg-chrome-hi);
1360
1630
  }
1361
1631
 
1362
1632
  .agent-picker-name {
1363
1633
  font-size: 14px;
1364
1634
  font-weight: 600;
1365
- color: #c0caf5;
1635
+ color: var(--text-bright);
1366
1636
  flex-shrink: 0;
1367
1637
  }
1368
1638
 
1369
1639
  .agent-picker-desc {
1370
1640
  font-size: 11px;
1371
- color: #565f89;
1641
+ color: var(--text-muted);
1372
1642
  text-align: right;
1373
1643
  }
1374
1644
 
1375
1645
  .agent-picker-hint {
1376
1646
  margin-top: 20px;
1377
1647
  font-size: 11px;
1378
- color: #414868;
1648
+ color: var(--text-dim);
1379
1649
  }
1380
1650
 
1381
1651
  .agent-picker-option {
@@ -1384,21 +1654,21 @@ html, body, #root {
1384
1654
  align-items: center;
1385
1655
  gap: 8px;
1386
1656
  font-size: 12px;
1387
- color: #a9b1d6;
1657
+ color: var(--text);
1388
1658
  cursor: pointer;
1389
1659
  user-select: none;
1390
1660
  }
1391
1661
 
1392
1662
  .agent-picker-option input[type="checkbox"] {
1393
1663
  cursor: pointer;
1394
- accent-color: #7aa2f7;
1664
+ accent-color: var(--accent);
1395
1665
  }
1396
1666
 
1397
1667
  /* ─── Remote (SSH) connect ───────────────────────── */
1398
1668
 
1399
1669
  .remote-section-label {
1400
1670
  font-size: 10px;
1401
- color: #565f89;
1671
+ color: var(--text-muted);
1402
1672
  text-transform: uppercase;
1403
1673
  letter-spacing: 1px;
1404
1674
  text-align: left;
@@ -1450,29 +1720,29 @@ html, body, #root {
1450
1720
 
1451
1721
  .remote-toggle-label {
1452
1722
  font-size: 12px;
1453
- color: #565f89;
1723
+ color: var(--text-muted);
1454
1724
  }
1455
1725
 
1456
1726
  .remote-toggle-btn {
1457
1727
  flex: 1;
1458
1728
  padding: 8px 10px;
1459
- background: #16161e;
1460
- border: 1px solid #2a2b3d;
1729
+ background: var(--bg-chrome);
1730
+ border: 1px solid var(--border-subtle);
1461
1731
  border-radius: 8px;
1462
- color: #a9b1d6;
1732
+ color: var(--text);
1463
1733
  font-size: 12px;
1464
1734
  cursor: pointer;
1465
1735
  transition: all 0.15s;
1466
1736
  }
1467
1737
 
1468
1738
  .remote-toggle-btn:hover {
1469
- border-color: #7aa2f7;
1739
+ border-color: var(--accent);
1470
1740
  }
1471
1741
 
1472
1742
  .remote-toggle-btn.is-active {
1473
- border-color: #7aa2f7;
1474
- background: #1a1b2e;
1475
- color: #c0caf5;
1743
+ border-color: var(--accent);
1744
+ background: var(--bg-chrome-hi);
1745
+ color: var(--text-bright);
1476
1746
  font-weight: 600;
1477
1747
  }
1478
1748
 
@@ -1484,25 +1754,25 @@ html, body, #root {
1484
1754
  .remote-input {
1485
1755
  flex: 1;
1486
1756
  padding: 10px 12px;
1487
- background: #16161e;
1488
- border: 1px solid #2a2b3d;
1757
+ background: var(--bg-chrome);
1758
+ border: 1px solid var(--border-subtle);
1489
1759
  border-radius: 8px;
1490
- color: #c0caf5;
1760
+ color: var(--text-bright);
1491
1761
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
1492
1762
  font-size: 12px;
1493
1763
  outline: none;
1494
1764
  }
1495
1765
 
1496
1766
  .remote-input:focus {
1497
- border-color: #7aa2f7;
1767
+ border-color: var(--accent);
1498
1768
  }
1499
1769
 
1500
1770
  .remote-btn {
1501
1771
  padding: 10px 16px;
1502
- background: #7aa2f7;
1772
+ background: var(--accent);
1503
1773
  border: none;
1504
1774
  border-radius: 8px;
1505
- color: #1f2335;
1775
+ color: var(--on-accent);
1506
1776
  font-size: 12px;
1507
1777
  font-weight: 600;
1508
1778
  cursor: pointer;
@@ -1517,21 +1787,21 @@ html, body, #root {
1517
1787
  margin-top: 18px;
1518
1788
  background: none;
1519
1789
  border: none;
1520
- color: #7aa2f7;
1790
+ color: var(--accent);
1521
1791
  font-size: 12px;
1522
1792
  cursor: pointer;
1523
1793
  }
1524
1794
 
1525
1795
  .remote-status {
1526
1796
  padding: 24px 8px;
1527
- color: #a9b1d6;
1797
+ color: var(--text);
1528
1798
  font-size: 13px;
1529
1799
  }
1530
1800
 
1531
1801
  .remote-status-sub {
1532
1802
  margin-top: 6px;
1533
1803
  font-size: 11px;
1534
- color: #565f89;
1804
+ color: var(--text-muted);
1535
1805
  word-break: break-word;
1536
1806
  }
1537
1807
 
@@ -1539,8 +1809,8 @@ html, body, #root {
1539
1809
  width: 22px;
1540
1810
  height: 22px;
1541
1811
  margin: 0 auto 14px;
1542
- border: 2px solid #2a2b3d;
1543
- border-top-color: #7aa2f7;
1812
+ border: 2px solid var(--border-subtle);
1813
+ border-top-color: var(--accent);
1544
1814
  border-radius: 50%;
1545
1815
  animation: remote-spin 0.8s linear infinite;
1546
1816
  }
@@ -1551,15 +1821,15 @@ html, body, #root {
1551
1821
 
1552
1822
  .remote-target-line {
1553
1823
  font-size: 13px;
1554
- color: #a9b1d6;
1824
+ color: var(--text);
1555
1825
  margin-bottom: 4px;
1556
1826
  }
1557
1827
 
1558
1828
  .remote-note {
1559
1829
  font-size: 11px;
1560
- color: #e0af68;
1561
- background: rgba(224, 175, 104, 0.08);
1562
- border: 1px solid rgba(224, 175, 104, 0.25);
1830
+ color: var(--warning);
1831
+ background: color-mix(in srgb, var(--warning) 8%, transparent);
1832
+ border: 1px solid color-mix(in srgb, var(--warning) 25%, transparent);
1563
1833
  border-radius: 8px;
1564
1834
  padding: 8px 12px;
1565
1835
  margin: 8px 0;
@@ -1569,7 +1839,7 @@ html, body, #root {
1569
1839
 
1570
1840
  .remote-error {
1571
1841
  font-size: 13px;
1572
- color: #f7768e;
1842
+ color: var(--danger);
1573
1843
  margin-bottom: 4px;
1574
1844
  }
1575
1845
 
@@ -1585,7 +1855,7 @@ html, body, #root {
1585
1855
  .remote-pw-hint {
1586
1856
  margin-top: 6px;
1587
1857
  font-size: 10px;
1588
- color: #565f89;
1858
+ color: var(--text-muted);
1589
1859
  text-align: left;
1590
1860
  }
1591
1861
 
@@ -1593,7 +1863,7 @@ html, body, #root {
1593
1863
  .settings-overlay {
1594
1864
  position: fixed;
1595
1865
  inset: 0;
1596
- background: rgba(0, 0, 0, 0.6);
1866
+ background: var(--overlay-bg);
1597
1867
  display: flex;
1598
1868
  align-items: center;
1599
1869
  justify-content: center;
@@ -1601,8 +1871,8 @@ html, body, #root {
1601
1871
  }
1602
1872
 
1603
1873
  .settings-dialog {
1604
- background: #1f2335;
1605
- border: 1px solid #3b3d57;
1874
+ background: var(--bg-raised);
1875
+ border: 1px solid var(--border);
1606
1876
  border-radius: 8px;
1607
1877
  padding: 24px;
1608
1878
  width: 480px;
@@ -1611,23 +1881,23 @@ html, body, #root {
1611
1881
  }
1612
1882
 
1613
1883
  .settings-dialog h3 {
1614
- color: #c0caf5;
1884
+ color: var(--text-bright);
1615
1885
  margin-bottom: 16px;
1616
1886
  font-size: 16px;
1617
1887
  }
1618
1888
 
1619
1889
  /* About section inside the Settings dialog. */
1620
1890
  .settings-about {
1621
- border-top: 1px solid #2a2b3d;
1891
+ border-top: 1px solid var(--border-subtle);
1622
1892
  padding-top: 16px;
1623
1893
  }
1624
1894
  .settings-about .about-name {
1625
- color: #c0caf5;
1895
+ color: var(--text-bright);
1626
1896
  font-size: 14px;
1627
1897
  font-weight: 600;
1628
1898
  }
1629
1899
  .settings-about .about-copyright {
1630
- color: #9aa5ce;
1900
+ color: var(--text-soft);
1631
1901
  font-size: 12px;
1632
1902
  margin: 6px 0 8px;
1633
1903
  }
@@ -1637,13 +1907,13 @@ html, body, #root {
1637
1907
  }
1638
1908
 
1639
1909
  .settings-section h4 {
1640
- color: #a9b1d6;
1910
+ color: var(--text);
1641
1911
  font-size: 13px;
1642
1912
  margin-bottom: 8px;
1643
1913
  }
1644
1914
 
1645
1915
  .settings-hint {
1646
- color: #565f89;
1916
+ color: var(--text-muted);
1647
1917
  font-size: 11px;
1648
1918
  display: block;
1649
1919
  margin-bottom: 12px;
@@ -1651,7 +1921,7 @@ html, body, #root {
1651
1921
 
1652
1922
  .settings-dialog label {
1653
1923
  display: block;
1654
- color: #a9b1d6;
1924
+ color: var(--text);
1655
1925
  font-size: 12px;
1656
1926
  margin-bottom: 12px;
1657
1927
  }
@@ -1661,21 +1931,139 @@ html, body, #root {
1661
1931
  width: 100%;
1662
1932
  margin-top: 4px;
1663
1933
  padding: 6px 10px;
1664
- background: #16161e;
1665
- border: 1px solid #3b3d57;
1934
+ background: var(--bg-chrome);
1935
+ border: 1px solid var(--border);
1666
1936
  border-radius: 4px;
1667
- color: #a9b1d6;
1937
+ color: var(--text);
1668
1938
  font-size: 13px;
1669
1939
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
1670
1940
  }
1671
1941
 
1672
1942
  .settings-dialog input:focus {
1673
1943
  outline: none;
1674
- border-color: #7aa2f7;
1944
+ border-color: var(--accent);
1675
1945
  }
1676
1946
 
1677
1947
  .settings-dialog input::placeholder {
1678
- color: #414868;
1948
+ color: var(--text-dim);
1949
+ }
1950
+
1951
+ /* Checkbox rows: <input><span>label</span><span class="settings-hint">.
1952
+ The class was used by the dialog but never styled, so the box inherited the
1953
+ full-width text-input rule above and rendered stretched and centred above its
1954
+ own label. Two columns: the box, then label on row 1 and hint on row 2. */
1955
+ .settings-checkbox {
1956
+ display: grid;
1957
+ grid-template-columns: auto 1fr;
1958
+ align-items: center;
1959
+ column-gap: 8px;
1960
+ cursor: pointer;
1961
+ }
1962
+
1963
+ .settings-checkbox input[type='checkbox'] {
1964
+ display: inline-block;
1965
+ width: auto;
1966
+ margin: 0;
1967
+ padding: 0;
1968
+ accent-color: var(--accent);
1969
+ cursor: pointer;
1970
+ }
1971
+
1972
+ .settings-checkbox > span {
1973
+ grid-column: 2;
1974
+ }
1975
+
1976
+ .settings-checkbox .settings-hint {
1977
+ margin-top: 2px;
1978
+ margin-bottom: 0;
1979
+ }
1980
+
1981
+ /* Appearance picker — a swatch tile per scheme, grouped by mode when syncing. */
1982
+ .theme-group-label {
1983
+ font-size: 10px;
1984
+ font-weight: 600;
1985
+ letter-spacing: 0.06em;
1986
+ text-transform: uppercase;
1987
+ color: var(--text-muted);
1988
+ margin: 10px 0 6px;
1989
+ }
1990
+
1991
+ .theme-options {
1992
+ display: grid;
1993
+ grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
1994
+ gap: 8px;
1995
+ margin-bottom: 8px;
1996
+ }
1997
+
1998
+ .theme-option {
1999
+ display: flex;
2000
+ flex-direction: column;
2001
+ align-items: stretch;
2002
+ gap: 7px;
2003
+ padding: 8px 8px 7px;
2004
+ background: var(--bg-chrome);
2005
+ border: 1px solid var(--border-subtle);
2006
+ border-radius: 8px;
2007
+ color: var(--text-muted);
2008
+ font-family: inherit;
2009
+ font-size: 11.5px;
2010
+ text-align: center;
2011
+ cursor: pointer;
2012
+ transition: border-color 0.13s ease, color 0.13s ease;
2013
+ }
2014
+
2015
+ .theme-option:hover {
2016
+ border-color: var(--border-strong);
2017
+ color: var(--text);
2018
+ }
2019
+
2020
+ .theme-option.active {
2021
+ border-color: var(--accent);
2022
+ color: var(--text-bright);
2023
+ font-weight: 600;
2024
+ }
2025
+
2026
+ /* A miniature of the scheme: background, a surface bar, an accent dot and a
2027
+ text line. Colours come from the theme's own palette via inline styles, so
2028
+ this must not reference the token layer. */
2029
+ .theme-swatch {
2030
+ position: relative;
2031
+ display: block;
2032
+ height: 38px;
2033
+ border-radius: 5px;
2034
+ border: 1px solid var(--border);
2035
+ overflow: hidden;
2036
+ }
2037
+
2038
+ .theme-swatch-bar {
2039
+ position: absolute;
2040
+ inset: 0 0 auto 0;
2041
+ height: 9px;
2042
+ }
2043
+
2044
+ .theme-swatch-dot {
2045
+ position: absolute;
2046
+ left: 7px;
2047
+ top: 16px;
2048
+ width: 8px;
2049
+ height: 8px;
2050
+ border-radius: 50%;
2051
+ }
2052
+
2053
+ .theme-swatch-line {
2054
+ position: absolute;
2055
+ left: 20px;
2056
+ top: 19px;
2057
+ right: 8px;
2058
+ height: 3px;
2059
+ border-radius: 2px;
2060
+ opacity: 0.65;
2061
+ }
2062
+
2063
+ .theme-option-label {
2064
+ overflow: hidden;
2065
+ text-overflow: ellipsis;
2066
+ white-space: nowrap;
1679
2067
  }
1680
2068
 
1681
2069
  .settings-actions {
@@ -1694,23 +2082,23 @@ html, body, #root {
1694
2082
  }
1695
2083
 
1696
2084
  .btn-primary {
1697
- background: #7aa2f7;
1698
- color: #1a1b26;
1699
- border-color: #7aa2f7;
2085
+ background: var(--accent);
2086
+ color: var(--on-accent);
2087
+ border-color: var(--accent);
1700
2088
  }
1701
2089
 
1702
2090
  .btn-primary:hover {
1703
- background: #89b4fa;
2091
+ background: var(--accent-hover);
1704
2092
  }
1705
2093
 
1706
2094
  .btn-secondary {
1707
- background: #2a2b3d;
1708
- color: #a9b1d6;
1709
- border-color: #3b3d57;
2095
+ background: var(--bg-surface);
2096
+ color: var(--text);
2097
+ border-color: var(--border);
1710
2098
  }
1711
2099
 
1712
2100
  .btn-secondary:hover {
1713
- border-color: #565f89;
2101
+ border-color: var(--border-strong);
1714
2102
  }
1715
2103
 
1716
2104
  .btn-ghost {
@@ -1720,16 +2108,16 @@ html, body, #root {
1720
2108
  cursor: pointer;
1721
2109
  border: none;
1722
2110
  background: transparent;
1723
- color: #565f89;
2111
+ color: var(--text-muted);
1724
2112
  }
1725
2113
 
1726
2114
  .btn-ghost:hover {
1727
- background: #2a2b3d;
1728
- color: #a9b1d6;
2115
+ background: var(--bg-surface);
2116
+ color: var(--text);
1729
2117
  }
1730
2118
 
1731
2119
  .btn-danger:hover {
1732
- color: #f7768e;
2120
+ color: var(--danger);
1733
2121
  }
1734
2122
 
1735
2123
  /* Profile list */
@@ -1746,18 +2134,18 @@ html, body, #root {
1746
2134
  justify-content: space-between;
1747
2135
  padding: 8px 12px;
1748
2136
  border-radius: 6px;
1749
- border: 1px solid #2a2b3d;
2137
+ border: 1px solid var(--border-subtle);
1750
2138
  cursor: pointer;
1751
2139
  transition: border-color 0.15s;
1752
2140
  }
1753
2141
 
1754
2142
  .profile-item:hover {
1755
- border-color: #3b3d57;
2143
+ border-color: var(--border);
1756
2144
  }
1757
2145
 
1758
2146
  .profile-item.active {
1759
- border-color: #7aa2f7;
1760
- background: rgba(122, 162, 247, 0.05);
2147
+ border-color: var(--accent);
2148
+ background: color-mix(in srgb, var(--accent) 5%, transparent);
1761
2149
  }
1762
2150
 
1763
2151
  .profile-info {
@@ -1771,22 +2159,22 @@ html, body, #root {
1771
2159
  width: 8px;
1772
2160
  height: 8px;
1773
2161
  border-radius: 50%;
1774
- background: #3b3d57;
2162
+ background: var(--border);
1775
2163
  flex-shrink: 0;
1776
2164
  }
1777
2165
 
1778
2166
  .profile-dot.active {
1779
- background: #9ece6a;
2167
+ background: var(--success);
1780
2168
  }
1781
2169
 
1782
2170
  .profile-name {
1783
- color: #c0caf5;
2171
+ color: var(--text-bright);
1784
2172
  font-size: 13px;
1785
2173
  font-weight: 500;
1786
2174
  }
1787
2175
 
1788
2176
  .profile-url {
1789
- color: #565f89;
2177
+ color: var(--text-muted);
1790
2178
  font-size: 11px;
1791
2179
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
1792
2180
  }
@@ -1804,7 +2192,7 @@ html, body, #root {
1804
2192
  flex-direction: column;
1805
2193
  height: 100%;
1806
2194
  min-height: 0;
1807
- background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
2195
+ background: linear-gradient(180deg, var(--ticket-grad-top) 0%, var(--ticket-grad-bot) 100%);
1808
2196
  }
1809
2197
 
1810
2198
  /* ── header ── */
@@ -1813,7 +2201,7 @@ html, body, #root {
1813
2201
  align-items: flex-start;
1814
2202
  justify-content: space-between;
1815
2203
  padding: 16px 16px 14px;
1816
- border-bottom: 1px solid #2a2b3d;
2204
+ border-bottom: 1px solid var(--border-subtle);
1817
2205
  }
1818
2206
  .ticket-drawer-heading {
1819
2207
  display: flex;
@@ -1824,8 +2212,8 @@ html, body, #root {
1824
2212
  width: 34px;
1825
2213
  height: 34px;
1826
2214
  border-radius: 9px;
1827
- background: rgba(122, 162, 247, 0.14);
1828
- border: 1px solid rgba(122, 162, 247, 0.3);
2215
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
2216
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
1829
2217
  display: flex;
1830
2218
  align-items: center;
1831
2219
  justify-content: center;
@@ -1840,15 +2228,15 @@ html, body, #root {
1840
2228
  .ticket-drawer-title {
1841
2229
  font-size: 14px;
1842
2230
  font-weight: 650;
1843
- color: #d5dbf5;
2231
+ color: var(--text-ticket);
1844
2232
  letter-spacing: 0.01em;
1845
2233
  }
1846
2234
  .ticket-drawer-subtitle {
1847
2235
  font-size: 11.5px;
1848
- color: #6b739b;
2236
+ color: var(--text-ticket-muted);
1849
2237
  }
1850
2238
  .ticket-drawer-subtitle strong {
1851
- color: #7aa2f7;
2239
+ color: var(--accent);
1852
2240
  font-weight: 600;
1853
2241
  }
1854
2242
  /* "+ New" action in the header (replaces the old footer button). */
@@ -1860,9 +2248,9 @@ html, body, #root {
1860
2248
  gap: 3px;
1861
2249
  padding: 5px 11px;
1862
2250
  border-radius: 7px;
1863
- background: rgba(122, 162, 247, 0.14);
1864
- border: 1px solid rgba(122, 162, 247, 0.3);
1865
- color: #9db4f5;
2251
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
2252
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
2253
+ color: var(--accent-soft);
1866
2254
  font-family: inherit;
1867
2255
  font-size: 12px;
1868
2256
  font-weight: 600;
@@ -1870,15 +2258,15 @@ html, body, #root {
1870
2258
  transition: background 0.13s ease, border-color 0.13s ease, color 0.13s ease, transform 0.06s ease;
1871
2259
  }
1872
2260
  .ticket-drawer-new:hover {
1873
- background: rgba(122, 162, 247, 0.22);
1874
- border-color: rgba(122, 162, 247, 0.5);
1875
- color: #c0d0fb;
2261
+ background: color-mix(in srgb, var(--accent) 22%, transparent);
2262
+ border-color: color-mix(in srgb, var(--accent) 50%, transparent);
2263
+ color: var(--accent-softer);
1876
2264
  }
1877
2265
  .ticket-drawer-new:active {
1878
2266
  transform: translateY(1px);
1879
2267
  }
1880
2268
  .ticket-drawer-warn {
1881
- color: #e0af68;
2269
+ color: var(--warning);
1882
2270
  }
1883
2271
  /* ── body ── */
1884
2272
  .ticket-drawer-body {
@@ -1898,17 +2286,17 @@ html, body, #root {
1898
2286
  .ticket-field-label {
1899
2287
  font-size: 10.5px;
1900
2288
  font-weight: 600;
1901
- color: #6b739b;
2289
+ color: var(--text-ticket-muted);
1902
2290
  text-transform: uppercase;
1903
2291
  letter-spacing: 0.07em;
1904
2292
  }
1905
2293
 
1906
2294
  .ticket-field input,
1907
2295
  .ticket-field textarea {
1908
- background: #15161f;
1909
- border: 1px solid #2a2b3d;
2296
+ background: var(--bg-well);
2297
+ border: 1px solid var(--border-subtle);
1910
2298
  border-radius: 8px;
1911
- color: #d5dbf5;
2299
+ color: var(--text-ticket);
1912
2300
  font-size: 13px;
1913
2301
  font-family: inherit;
1914
2302
  padding: 9px 11px;
@@ -1917,12 +2305,12 @@ html, body, #root {
1917
2305
  }
1918
2306
  .ticket-field input::placeholder,
1919
2307
  .ticket-field textarea::placeholder {
1920
- color: #4a4f6e;
2308
+ color: var(--text-placeholder);
1921
2309
  }
1922
2310
  .ticket-field input:focus,
1923
2311
  .ticket-field textarea:focus {
1924
- border-color: #7aa2f7;
1925
- box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.13);
2312
+ border-color: var(--accent);
2313
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent);
1926
2314
  }
1927
2315
  .ticket-input-title {
1928
2316
  font-size: 14px !important;
@@ -1943,10 +2331,10 @@ html, body, #root {
1943
2331
  display: inline-flex;
1944
2332
  align-items: center;
1945
2333
  gap: 6px;
1946
- background: #15161f;
1947
- border: 1px solid #2a2b3d;
2334
+ background: var(--bg-well);
2335
+ border: 1px solid var(--border-subtle);
1948
2336
  border-radius: 999px;
1949
- color: #8088ac;
2337
+ color: var(--text-ticket-dim);
1950
2338
  font-size: 12px;
1951
2339
  font-family: inherit;
1952
2340
  font-weight: 550;
@@ -1955,8 +2343,8 @@ html, body, #root {
1955
2343
  transition: background 0.13s ease, border-color 0.13s ease, color 0.13s ease;
1956
2344
  }
1957
2345
  .ticket-seg:hover {
1958
- border-color: #3b3d57;
1959
- color: #c0caf5;
2346
+ border-color: var(--border);
2347
+ color: var(--text-bright);
1960
2348
  }
1961
2349
  .ticket-seg-dot {
1962
2350
  width: 7px;
@@ -1969,9 +2357,9 @@ html, body, #root {
1969
2357
  }
1970
2358
 
1971
2359
  .ticket-drawer-error {
1972
- background: rgba(247, 118, 142, 0.13);
1973
- border: 1px solid rgba(247, 118, 142, 0.38);
1974
- color: #f7768e;
2360
+ background: color-mix(in srgb, var(--danger) 13%, transparent);
2361
+ border: 1px solid color-mix(in srgb, var(--danger) 38%, transparent);
2362
+ color: var(--danger);
1975
2363
  font-size: 12px;
1976
2364
  border-radius: 8px;
1977
2365
  padding: 8px 10px;
@@ -1984,12 +2372,12 @@ html, body, #root {
1984
2372
  justify-content: space-between;
1985
2373
  gap: 8px;
1986
2374
  padding: 12px 16px;
1987
- border-top: 1px solid #2a2b3d;
1988
- background: rgba(13, 14, 22, 0.35);
2375
+ border-top: 1px solid var(--border-subtle);
2376
+ background: var(--footer-veil);
1989
2377
  }
1990
2378
  .ticket-drawer-hint {
1991
2379
  font-size: 11px;
1992
- color: #565f89;
2380
+ color: var(--text-muted);
1993
2381
  }
1994
2382
  .ticket-drawer-footer-btns {
1995
2383
  display: flex;
@@ -2007,20 +2395,20 @@ html, body, #root {
2007
2395
  }
2008
2396
  .ticket-btn-secondary {
2009
2397
  background: transparent;
2010
- color: #c0caf5;
2011
- border: 1px solid #2a2b3d;
2398
+ color: var(--text-bright);
2399
+ border: 1px solid var(--border-subtle);
2012
2400
  }
2013
2401
  .ticket-btn-secondary:hover {
2014
- background: rgba(255, 255, 255, 0.05);
2015
- border-color: #3b3d57;
2402
+ background: var(--hover-veil);
2403
+ border-color: var(--border);
2016
2404
  }
2017
2405
  .ticket-btn-primary {
2018
- background: linear-gradient(180deg, #8db0fa 0%, #7aa2f7 100%);
2019
- color: #11131f;
2020
- border: 1px solid #7aa2f7;
2406
+ background: linear-gradient(180deg, var(--accent-grad-top) 0%, var(--accent) 100%);
2407
+ color: var(--on-accent);
2408
+ border: 1px solid var(--accent);
2021
2409
  }
2022
2410
  .ticket-btn-primary:hover:not(:disabled) {
2023
- background: linear-gradient(180deg, #9bbcfb 0%, #89b4fa 100%);
2411
+ background: linear-gradient(180deg, var(--accent-grad-top-hi) 0%, var(--accent-hover) 100%);
2024
2412
  }
2025
2413
  .ticket-btn-primary:active:not(:disabled) {
2026
2414
  transform: translateY(1px);
@@ -2039,15 +2427,15 @@ html, body, #root {
2039
2427
 
2040
2428
  /* ── drawer badge / back button ── */
2041
2429
  .ticket-drawer-badge {
2042
- color: #7aa2f7;
2430
+ color: var(--accent);
2043
2431
  }
2044
2432
  .ticket-drawer-back {
2045
2433
  width: 34px;
2046
2434
  height: 34px;
2047
2435
  border-radius: 9px;
2048
- background: rgba(122, 162, 247, 0.1);
2049
- border: 1px solid rgba(122, 162, 247, 0.28);
2050
- color: #7aa2f7;
2436
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
2437
+ border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
2438
+ color: var(--accent);
2051
2439
  font-size: 22px;
2052
2440
  line-height: 1;
2053
2441
  cursor: pointer;
@@ -2055,7 +2443,7 @@ html, body, #root {
2055
2443
  transition: background 0.12s ease;
2056
2444
  }
2057
2445
  .ticket-drawer-back:hover {
2058
- background: rgba(122, 162, 247, 0.2);
2446
+ background: color-mix(in srgb, var(--accent) 20%, transparent);
2059
2447
  }
2060
2448
 
2061
2449
  /* ── ticket list ── */
@@ -2068,7 +2456,7 @@ html, body, #root {
2068
2456
  gap: 7px;
2069
2457
  }
2070
2458
  .ticket-list-msg {
2071
- color: #6b739b;
2459
+ color: var(--text-ticket-muted);
2072
2460
  font-size: 12.5px;
2073
2461
  padding: 16px 4px;
2074
2462
  text-align: center;
@@ -2084,8 +2472,8 @@ html, body, #root {
2084
2472
  padding: 7px 4px;
2085
2473
  background: none;
2086
2474
  border: none;
2087
- border-top: 1px solid #262a3f;
2088
- color: #6b739b;
2475
+ border-top: 1px solid var(--border-well);
2476
+ color: var(--text-ticket-muted);
2089
2477
  font-family: inherit;
2090
2478
  font-size: 11.5px;
2091
2479
  font-weight: 600;
@@ -2095,7 +2483,7 @@ html, body, #root {
2095
2483
  transition: color 0.13s ease;
2096
2484
  }
2097
2485
  .ticket-done-toggle:hover {
2098
- color: #a9b1d6;
2486
+ color: var(--text);
2099
2487
  }
2100
2488
  .ticket-done-caret {
2101
2489
  display: inline-block;
@@ -2110,8 +2498,8 @@ html, body, #root {
2110
2498
  min-width: 18px;
2111
2499
  padding: 1px 6px;
2112
2500
  border-radius: 9px;
2113
- background: #262a3f;
2114
- color: #8088ac;
2501
+ background: var(--bg-chip);
2502
+ color: var(--text-ticket-dim);
2115
2503
  font-size: 11px;
2116
2504
  font-weight: 600;
2117
2505
  text-align: center;
@@ -2126,32 +2514,32 @@ html, body, #root {
2126
2514
  text-align: center;
2127
2515
  }
2128
2516
  .ticket-empty-icon {
2129
- color: #3b3d57;
2517
+ color: var(--text-dim);
2130
2518
  margin-bottom: 4px;
2131
2519
  }
2132
2520
  .ticket-empty-title {
2133
2521
  font-size: 13.5px;
2134
2522
  font-weight: 600;
2135
- color: #8088ac;
2523
+ color: var(--text-ticket-dim);
2136
2524
  }
2137
2525
  .ticket-empty-hint {
2138
2526
  font-size: 12px;
2139
- color: #565f89;
2527
+ color: var(--text-muted);
2140
2528
  }
2141
2529
 
2142
2530
  /* ── ticket card ── */
2143
2531
  .ticket-card {
2144
2532
  display: flex;
2145
2533
  align-items: stretch;
2146
- background: #15161f;
2147
- border: 1px solid #262a3f;
2534
+ background: var(--bg-well);
2535
+ border: 1px solid var(--border-well);
2148
2536
  border-radius: 10px;
2149
2537
  overflow: hidden;
2150
2538
  transition: border-color 0.13s ease, background 0.13s ease;
2151
2539
  }
2152
2540
  .ticket-card:hover {
2153
- border-color: #3d425f;
2154
- background: #181a26;
2541
+ border-color: var(--border-hover);
2542
+ background: var(--bg-well-hi);
2155
2543
  }
2156
2544
  /* Clickable body of the card — opens the editor. */
2157
2545
  .ticket-card-open {
@@ -2182,14 +2570,14 @@ html, body, #root {
2182
2570
  justify-content: center;
2183
2571
  background: transparent;
2184
2572
  border: none;
2185
- border-left: 1px solid #262a3f;
2186
- color: #565f89;
2573
+ border-left: 1px solid var(--border-well);
2574
+ color: var(--text-muted);
2187
2575
  cursor: pointer;
2188
2576
  transition: background 0.13s ease, color 0.13s ease, transform 0.06s ease;
2189
2577
  }
2190
2578
  .ticket-card-send:hover {
2191
- background: #1b2030;
2192
- color: #7aa2f7;
2579
+ background: var(--bg-inset-hi);
2580
+ color: var(--accent);
2193
2581
  }
2194
2582
  .ticket-card-send:active {
2195
2583
  transform: scale(0.9);
@@ -2210,7 +2598,7 @@ html, body, #root {
2210
2598
  .ticket-card-title {
2211
2599
  font-size: 13px;
2212
2600
  font-weight: 550;
2213
- color: #d5dbf5;
2601
+ color: var(--text-ticket);
2214
2602
  white-space: nowrap;
2215
2603
  overflow: hidden;
2216
2604
  text-overflow: ellipsis;
@@ -2229,7 +2617,7 @@ html, body, #root {
2229
2617
  }
2230
2618
  .ticket-card-date {
2231
2619
  font-size: 11px;
2232
- color: #565f89;
2620
+ color: var(--text-muted);
2233
2621
  }
2234
2622
  .ticket-card-pri {
2235
2623
  align-self: center;
@@ -2246,11 +2634,11 @@ html, body, #root {
2246
2634
  /* ─── Terminal "Copy as email table" context menu + toast ─── */
2247
2635
  .term-context-menu {
2248
2636
  z-index: 1000;
2249
- background: #1f2335;
2250
- border: 1px solid #414868;
2637
+ background: var(--bg-raised);
2638
+ border: 1px solid var(--border-dim);
2251
2639
  border-radius: 6px;
2252
2640
  padding: 4px;
2253
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
2641
+ box-shadow: 0 8px 24px var(--shadow-color);
2254
2642
  min-width: 180px;
2255
2643
  }
2256
2644
  .term-context-menu button {
@@ -2260,13 +2648,13 @@ html, body, #root {
2260
2648
  background: transparent;
2261
2649
  border: none;
2262
2650
  border-radius: 4px;
2263
- color: #c0caf5;
2651
+ color: var(--text-bright);
2264
2652
  font-size: 13px;
2265
2653
  padding: 7px 10px;
2266
2654
  cursor: pointer;
2267
2655
  }
2268
2656
  .term-context-menu button:hover {
2269
- background: #2a2b3d;
2657
+ background: var(--bg-surface);
2270
2658
  }
2271
2659
  /* Always-visible utility button (top-right) — opens the snapshot panel. */
2272
2660
  .term-util-btn {
@@ -2280,9 +2668,9 @@ html, body, #root {
2280
2668
  align-items: center;
2281
2669
  justify-content: center;
2282
2670
  border-radius: 6px;
2283
- background: #2a2b3d;
2284
- border: 1px solid #414868;
2285
- color: #c0caf5;
2671
+ background: var(--bg-surface);
2672
+ border: 1px solid var(--border-dim);
2673
+ color: var(--text-bright);
2286
2674
  font-size: 16px;
2287
2675
  line-height: 1;
2288
2676
  cursor: pointer;
@@ -2291,7 +2679,7 @@ html, body, #root {
2291
2679
  }
2292
2680
  .term-util-btn:hover {
2293
2681
  opacity: 1;
2294
- background: #343650;
2682
+ background: var(--bg-surface-hi);
2295
2683
  }
2296
2684
 
2297
2685
  /* Snapshot panel: a frozen, selectable copy of the screen text. */
@@ -2301,8 +2689,8 @@ html, body, #root {
2301
2689
  z-index: 20;
2302
2690
  display: flex;
2303
2691
  flex-direction: column;
2304
- background: #16161e;
2305
- border: 1px solid #414868;
2692
+ background: var(--bg-chrome);
2693
+ border: 1px solid var(--border-dim);
2306
2694
  }
2307
2695
  .term-snapshot-head {
2308
2696
  display: flex;
@@ -2310,23 +2698,23 @@ html, body, #root {
2310
2698
  justify-content: space-between;
2311
2699
  gap: 12px;
2312
2700
  padding: 8px 12px;
2313
- background: #1f2335;
2314
- border-bottom: 1px solid #414868;
2315
- color: #9aa5ce;
2701
+ background: var(--bg-raised);
2702
+ border-bottom: 1px solid var(--border-dim);
2703
+ color: var(--text-soft);
2316
2704
  font-size: 12px;
2317
2705
  }
2318
2706
  .term-snapshot-x {
2319
2707
  background: transparent;
2320
2708
  border: none;
2321
- color: #9aa5ce;
2709
+ color: var(--text-soft);
2322
2710
  font-size: 14px;
2323
2711
  cursor: pointer;
2324
2712
  padding: 2px 6px;
2325
2713
  border-radius: 4px;
2326
2714
  }
2327
2715
  .term-snapshot-x:hover {
2328
- background: #2a2b3d;
2329
- color: #c0caf5;
2716
+ background: var(--bg-surface);
2717
+ color: var(--text-bright);
2330
2718
  }
2331
2719
  .term-snapshot-text {
2332
2720
  flex: 1;
@@ -2337,33 +2725,33 @@ html, body, #root {
2337
2725
  white-space: pre;
2338
2726
  user-select: text;
2339
2727
  cursor: text;
2340
- color: #c0caf5;
2341
- background: #16161e;
2728
+ color: var(--text-bright);
2729
+ background: var(--bg-chrome);
2342
2730
  font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
2343
2731
  font-size: 13px;
2344
2732
  line-height: 1.4;
2345
2733
  }
2346
2734
  .term-snapshot-text::selection {
2347
- background: #33467c;
2735
+ background: var(--selection-bg);
2348
2736
  }
2349
2737
  .term-snapshot-actions {
2350
2738
  display: flex;
2351
2739
  gap: 6px;
2352
2740
  padding: 8px 12px;
2353
- background: #1f2335;
2354
- border-top: 1px solid #414868;
2741
+ background: var(--bg-raised);
2742
+ border-top: 1px solid var(--border-dim);
2355
2743
  }
2356
2744
  .term-snapshot-actions button {
2357
- background: #2a2b3d;
2358
- border: 1px solid #414868;
2745
+ background: var(--bg-surface);
2746
+ border: 1px solid var(--border-dim);
2359
2747
  border-radius: 5px;
2360
- color: #c0caf5;
2748
+ color: var(--text-bright);
2361
2749
  font-size: 12.5px;
2362
2750
  padding: 6px 12px;
2363
2751
  cursor: pointer;
2364
2752
  }
2365
2753
  .term-snapshot-actions button:hover {
2366
- background: #343650;
2754
+ background: var(--bg-surface-hi);
2367
2755
  }
2368
2756
  .term-snapshot-done {
2369
2757
  margin-left: auto;
@@ -2373,13 +2761,13 @@ html, body, #root {
2373
2761
  bottom: 24px;
2374
2762
  right: 24px;
2375
2763
  z-index: 1000;
2376
- background: #1f2335;
2377
- border: 1px solid #7aa2f7;
2378
- color: #c0caf5;
2764
+ background: var(--bg-raised);
2765
+ border: 1px solid var(--accent);
2766
+ color: var(--text-bright);
2379
2767
  font-size: 13px;
2380
2768
  padding: 9px 14px;
2381
2769
  border-radius: 6px;
2382
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
2770
+ box-shadow: 0 8px 24px var(--shadow-color);
2383
2771
  pointer-events: none;
2384
2772
  }
2385
2773
 
@@ -2390,16 +2778,16 @@ html, body, #root {
2390
2778
  .observer-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
2391
2779
  .observer-switch-track {
2392
2780
  width: 34px; height: 19px; border-radius: 10px;
2393
- background: #3b4261; position: relative; transition: background 0.15s ease;
2781
+ background: var(--switch-track); position: relative; transition: background 0.15s ease;
2394
2782
  display: inline-block; flex-shrink: 0;
2395
2783
  }
2396
2784
  .observer-switch-thumb {
2397
2785
  position: absolute; top: 2px; left: 2px; width: 15px; height: 15px;
2398
- border-radius: 50%; background: #c0caf5; transition: transform 0.15s ease;
2786
+ border-radius: 50%; background: var(--switch-thumb); transition: transform 0.15s ease;
2399
2787
  }
2400
- .observer-switch input:checked + .observer-switch-track { background: #9ece6a; }
2788
+ .observer-switch input:checked + .observer-switch-track { background: var(--success); }
2401
2789
  .observer-switch input:checked + .observer-switch-track .observer-switch-thumb {
2402
- transform: translateX(15px); background: #1a1b26;
2790
+ transform: translateX(15px); background: var(--on-accent);
2403
2791
  }
2404
2792
  .observer-switch input:disabled + .observer-switch-track { opacity: 0.5; }
2405
2793
 
@@ -2417,14 +2805,14 @@ html, body, #root {
2417
2805
  font: inherit;
2418
2806
  color: inherit;
2419
2807
  cursor: pointer;
2420
- background: #15161f;
2421
- border: 1px solid #262a3f;
2422
- border-left: 3px solid #565f89;
2808
+ background: var(--bg-well);
2809
+ border: 1px solid var(--border-well);
2810
+ border-left: 3px solid var(--border-strong);
2423
2811
  border-radius: 9px;
2424
2812
  padding: 9px 26px 9px 12px;
2425
2813
  transition: border-color 0.12s ease, background 0.12s ease;
2426
2814
  }
2427
- .obs-card:hover { background: #181a26; border-color: #323752; border-left-width: 3px; }
2815
+ .obs-card:hover { background: var(--bg-well-hi); border-color: var(--border-hover); border-left-width: 3px; }
2428
2816
  .obs-card:active { transform: scale(0.995); }
2429
2817
 
2430
2818
  .obs-card-top {
@@ -2450,7 +2838,7 @@ html, body, #root {
2450
2838
  .obs-chip-dot { width: 5px; height: 5px; border-radius: 50%; flex-shrink: 0; }
2451
2839
  .obs-card-cat {
2452
2840
  font-size: 10px;
2453
- color: #565f89;
2841
+ color: var(--text-muted);
2454
2842
  letter-spacing: 0.05em;
2455
2843
  text-transform: uppercase;
2456
2844
  white-space: nowrap;
@@ -2461,19 +2849,19 @@ html, body, #root {
2461
2849
  margin-left: auto;
2462
2850
  flex-shrink: 0;
2463
2851
  font-size: 10px;
2464
- color: #414868;
2852
+ color: var(--text-dim);
2465
2853
  font-variant-numeric: tabular-nums;
2466
2854
  }
2467
2855
  .obs-card-title {
2468
2856
  font-size: 12.5px;
2469
2857
  font-weight: 600;
2470
- color: #c0caf5;
2858
+ color: var(--text-bright);
2471
2859
  line-height: 1.4;
2472
2860
  word-break: break-word;
2473
2861
  }
2474
2862
  .obs-card-body {
2475
2863
  font-size: 11.5px;
2476
- color: #9aa5ce;
2864
+ color: var(--text-soft);
2477
2865
  line-height: 1.5;
2478
2866
  word-break: break-word;
2479
2867
  }
@@ -2481,9 +2869,9 @@ html, body, #root {
2481
2869
  .obs-card-facts { display: flex; flex-wrap: wrap; gap: 6px; }
2482
2870
  .obs-fact {
2483
2871
  font-size: 10px;
2484
- color: #565f89;
2485
- background: #1c1e2b;
2486
- border: 1px solid #262a3f;
2872
+ color: var(--text-muted);
2873
+ background: var(--bg-chip-soft);
2874
+ border: 1px solid var(--border-well);
2487
2875
  border-radius: 5px;
2488
2876
  padding: 1px 6px;
2489
2877
  font-variant-numeric: tabular-nums;
@@ -2493,7 +2881,7 @@ html, body, #root {
2493
2881
  right: 10px;
2494
2882
  top: 10px;
2495
2883
  font-size: 10px;
2496
- color: #414868;
2884
+ color: var(--text-dim);
2497
2885
  transition: transform 0.12s ease;
2498
2886
  }
2499
2887
  .obs-card-caret.open { transform: rotate(90deg); }
@@ -2505,24 +2893,24 @@ html, body, #root {
2505
2893
  gap: 8px;
2506
2894
  padding: 3px 12px 3px 14px;
2507
2895
  font-size: 11px;
2508
- color: #565f89;
2896
+ color: var(--text-muted);
2509
2897
  line-height: 1.45;
2510
2898
  }
2511
2899
  .obs-line-dot {
2512
2900
  flex-shrink: 0;
2513
2901
  width: 4px; height: 4px;
2514
2902
  border-radius: 50%;
2515
- background: #3b4261;
2903
+ background: var(--switch-track);
2516
2904
  align-self: center;
2517
2905
  }
2518
- .obs-line.health { color: #e0af68; }
2519
- .obs-line.health .obs-line-dot { background: #e0af68; }
2906
+ .obs-line.health { color: var(--warning); }
2907
+ .obs-line.health .obs-line-dot { background: var(--warning); }
2520
2908
  .obs-line-text { min-width: 0; word-break: break-word; }
2521
2909
  .obs-line-time {
2522
2910
  margin-left: auto;
2523
2911
  flex-shrink: 0;
2524
2912
  font-size: 10px;
2525
- color: #414868;
2913
+ color: var(--text-dim);
2526
2914
  font-variant-numeric: tabular-nums;
2527
2915
  }
2528
2916
 
@@ -2533,12 +2921,12 @@ html, body, #root {
2533
2921
  justify-content: space-between;
2534
2922
  gap: 10px;
2535
2923
  padding: 8px 14px;
2536
- border-bottom: 1px solid #23263a;
2924
+ border-bottom: 1px solid var(--border-well);
2537
2925
  }
2538
2926
  .obs-sensitivity {
2539
2927
  display: inline-flex;
2540
- background: #15161f;
2541
- border: 1px solid #262a3f;
2928
+ background: var(--bg-well);
2929
+ border: 1px solid var(--border-well);
2542
2930
  border-radius: 7px;
2543
2931
  padding: 2px;
2544
2932
  gap: 2px;
@@ -2547,7 +2935,7 @@ html, body, #root {
2547
2935
  appearance: none;
2548
2936
  border: none;
2549
2937
  background: transparent;
2550
- color: #565f89;
2938
+ color: var(--text-muted);
2551
2939
  font: inherit;
2552
2940
  font-size: 10.5px;
2553
2941
  font-weight: 600;
@@ -2557,8 +2945,8 @@ html, body, #root {
2557
2945
  transition: background 0.12s ease, color 0.12s ease;
2558
2946
  white-space: nowrap;
2559
2947
  }
2560
- .obs-sens-btn:hover { color: #9aa5ce; }
2561
- .obs-sens-btn.active { background: #2a2f4a; color: #c0caf5; }
2948
+ .obs-sens-btn:hover { color: var(--text-soft); }
2949
+ .obs-sens-btn.active { background: var(--bg-selected); color: var(--text-bright); }
2562
2950
 
2563
2951
  /* "reviewing" bouncing dots */
2564
2952
  .obs-reviewing {
@@ -2566,13 +2954,13 @@ html, body, #root {
2566
2954
  align-items: center;
2567
2955
  gap: 3px;
2568
2956
  font-size: 10.5px;
2569
- color: #7aa2f7;
2957
+ color: var(--accent);
2570
2958
  letter-spacing: 0.03em;
2571
2959
  }
2572
2960
  .obs-reviewing-dot {
2573
2961
  width: 4px; height: 4px;
2574
2962
  border-radius: 50%;
2575
- background: #7aa2f7;
2963
+ background: var(--accent);
2576
2964
  animation: obs-dot-bounce 1.1s ease-in-out infinite;
2577
2965
  }
2578
2966
  .obs-reviewing-dot:nth-child(2) { animation-delay: 0.15s; }
@@ -2584,13 +2972,13 @@ html, body, #root {
2584
2972
 
2585
2973
  /* Pulsing eye badge while a model review is in flight */
2586
2974
  .obs-badge { position: relative; }
2587
- .obs-badge.reviewing { color: #7aa2f7; }
2975
+ .obs-badge.reviewing { color: var(--accent); }
2588
2976
  .obs-badge.reviewing::after {
2589
2977
  content: '';
2590
2978
  position: absolute;
2591
2979
  inset: -1px;
2592
2980
  border-radius: inherit;
2593
- border: 1px solid #7aa2f7;
2981
+ border: 1px solid var(--accent);
2594
2982
  animation: obs-badge-pulse 1.6s ease-out infinite;
2595
2983
  pointer-events: none;
2596
2984
  }