@phenx-inc/ctlsurf 0.14.1 → 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 (40) hide show
  1. package/README.md +36 -0
  2. package/THIRD-PARTY-NOTICES.md +82 -0
  3. package/out/headless/index.mjs +13 -3
  4. package/out/headless/index.mjs.map +2 -2
  5. package/out/main/index.js +27 -0
  6. package/out/preload/index.js +5 -0
  7. package/out/renderer/assets/{cssMode-bQYoCKra.js → cssMode-CJR4iD-G.js} +3 -3
  8. package/out/renderer/assets/{freemarker2-BS1ERQl_.js → freemarker2-BRI9ISq9.js} +1 -1
  9. package/out/renderer/assets/{handlebars-B-ZEHRLr.js → handlebars-3hL6XIZI.js} +1 -1
  10. package/out/renderer/assets/{html-lk9e1Lkl.js → html-Dd5_vBoP.js} +1 -1
  11. package/out/renderer/assets/{htmlMode-Ds1eMYgM.js → htmlMode-DgNtlKcG.js} +3 -3
  12. package/out/renderer/assets/{index-BpCORklm.css → index-3sFJEz7i.css} +787 -399
  13. package/out/renderer/assets/{index-BJNR4hRK.js → index-5azC4yNn.js} +421 -99
  14. package/out/renderer/assets/{javascript-D6OeziKX.js → javascript-D0vPLEJg.js} +2 -2
  15. package/out/renderer/assets/{jsonMode-t5SESE75.js → jsonMode-DBvR0zMu.js} +3 -3
  16. package/out/renderer/assets/{liquid-B5Wjh0p_.js → liquid-CLoc6Tx7.js} +1 -1
  17. package/out/renderer/assets/{lspLanguageFeatures-BEgiDCIW.js → lspLanguageFeatures-CiaMaQoY.js} +1 -1
  18. package/out/renderer/assets/{mdx-ByNAXh8t.js → mdx-DTsq6tlv.js} +1 -1
  19. package/out/renderer/assets/{python-CIFO0XQW.js → python-D04DpZDr.js} +1 -1
  20. package/out/renderer/assets/{razor-LXHhGcNO.js → razor-Di6CJ6s8.js} +1 -1
  21. package/out/renderer/assets/{tsMode-WiO8CDaI.js → tsMode-mfv6mHOv.js} +1 -1
  22. package/out/renderer/assets/{typescript-ZBQlq256.js → typescript-CDA0Hhef.js} +1 -1
  23. package/out/renderer/assets/{xml-DBaLJlQU.js → xml-BU0voRuq.js} +1 -1
  24. package/out/renderer/assets/{yaml-CId9skah.js → yaml-qzFWnaZJ.js} +1 -1
  25. package/out/renderer/index.html +60 -3
  26. package/package.json +13 -3
  27. package/src/main/index.ts +52 -1
  28. package/src/main/orchestrator.ts +8 -0
  29. package/src/preload/index.ts +10 -0
  30. package/src/renderer/App.tsx +2 -0
  31. package/src/renderer/components/CtlsurfPanel.tsx +1 -1
  32. package/src/renderer/components/EditorPanel.tsx +29 -1
  33. package/src/renderer/components/ObserverPanel.tsx +13 -6
  34. package/src/renderer/components/SettingsDialog.tsx +82 -0
  35. package/src/renderer/components/TerminalPanel.tsx +12 -22
  36. package/src/renderer/components/TicketPanel.tsx +17 -10
  37. package/src/renderer/index.html +58 -1
  38. package/src/renderer/lib/theme.ts +173 -0
  39. package/src/renderer/lib/themes.ts +126 -0
  40. package/src/renderer/styles.css +787 -399
@@ -7384,6 +7384,276 @@
7384
7384
  }
7385
7385
  }
7386
7386
  }
7387
+ /* ─────────────────────────────────────────────────────────────
7388
+ Theme tokens
7389
+
7390
+ Every colour in this file resolves through one of these. `:root` holds
7391
+ Tokyo Night and doubles as the fallback, so anything that renders before
7392
+ the theme attribute lands still gets a full palette. Each additional
7393
+ scheme is a `[data-theme='<id>']` block whose id must match an entry in
7394
+ lib/themes.ts — that module owns the parts CSS cannot reach (the xterm
7395
+ canvas palette, Monaco, and the picker swatches). `data-theme` is stamped
7396
+ on <html> by the pre-paint script in index.html and kept in sync by
7397
+ lib/theme.ts.
7398
+
7399
+ Adding a scheme means: one block here + one entry in lib/themes.ts.
7400
+
7401
+ Names are roles, not shades — "well" is deeper than "app" in dark and
7402
+ *lighter* in light, which is exactly why the old literals could not be
7403
+ flipped mechanically.
7404
+ ───────────────────────────────────────────────────────────── */
7405
+
7406
+ :root,
7407
+ :root[data-theme='tokyo-night'] {
7408
+ color-scheme: dark;
7409
+
7410
+ /* Surfaces, roughly back-to-front */
7411
+ --bg-app: #1a1b26; /* window/page background */
7412
+ --bg-chrome: #16161e; /* title bar, tab strips, status bar, menus */
7413
+ --bg-raised: #1f2335; /* dialogs, popovers, toasts */
7414
+ --bg-surface: #2a2b3d; /* button and control fills, dividers */
7415
+ --bg-surface-hi: #343650; /* hover on --bg-surface */
7416
+ --bg-chrome-hi: #1a1b2e; /* hover on --bg-chrome rows */
7417
+ --bg-well: #15161f; /* inputs, cards — sunken in dark, raised in light */
7418
+ --bg-well-hi: #181a26; /* hover on --bg-well */
7419
+ --bg-inset-hi: #1b2030; /* hover on a transparent inset action */
7420
+ --bg-selected: #2a2f4a; /* selected segment in a segmented control */
7421
+ --bg-chip: #262a3f; /* count badges */
7422
+ --bg-chip-soft: #1c1e2b; /* inline fact pills */
7423
+ --bg-editor: #1e1e2e; /* Monaco backdrop — matches its own theme */
7424
+
7425
+ /* Borders */
7426
+ --border: #3b3d57; /* default: dialogs, inputs, buttons */
7427
+ --border-subtle: #2a2b3d; /* panel separators, header rules */
7428
+ --border-well: #262a3f; /* card outlines */
7429
+ --border-strong: #565f89; /* hover/emphasis borders */
7430
+ --border-dim: #414868; /* terminal chrome, context menus */
7431
+ --border-hover: #3d425f; /* card hover outline */
7432
+
7433
+ /* Text */
7434
+ --text: #a9b1d6; /* body */
7435
+ --text-bright: #c0caf5; /* headings, emphasis */
7436
+ --text-soft: #9aa5ce; /* long-form secondary copy */
7437
+ --text-muted: #565f89; /* labels, captions, inactive dots */
7438
+ --text-dim: #414868; /* tertiary, placeholders, grips */
7439
+ --text-ticket: #d5dbf5; /* ticket titles */
7440
+ --text-ticket-muted: #6b739b;
7441
+ --text-ticket-dim: #8088ac;
7442
+ --text-placeholder: #4a4f6e;
7443
+
7444
+ /* Brand */
7445
+ --accent: #7aa2f7;
7446
+ --accent-hover: #89b4fa;
7447
+ --accent-soft: #9db4f5;
7448
+ --accent-softer: #c0d0fb;
7449
+ --accent-grad-top: #8db0fa;
7450
+ --accent-grad-top-hi: #9bbcfb;
7451
+ --on-accent: #1a1b26; /* text/icons sitting on an accent fill */
7452
+
7453
+ /* Status */
7454
+ --danger: #f7768e;
7455
+ --warning: #e0af68;
7456
+ --success: #9ece6a;
7457
+ --danger-bg: #2d2030;
7458
+ --sev-high: #ff9e64; /* Observer severity, set from ObserverPanel */
7459
+ --sev-digest: #bb9af7;
7460
+
7461
+ /* Odds and ends */
7462
+ --selection-bg: #33467c;
7463
+ --switch-track: #3b4261;
7464
+ --switch-thumb: #c0caf5;
7465
+ --ticket-grad-top: #20243a;
7466
+ --ticket-grad-bot: #1b1e2e;
7467
+ --shadow-color: rgba(0, 0, 0, 0.5);
7468
+ --overlay-bg: rgba(0, 0, 0, 0.65);
7469
+ --hover-veil: rgba(255, 255, 255, 0.05);
7470
+ --footer-veil: rgba(13, 14, 22, 0.35);
7471
+ }
7472
+
7473
+ :root[data-theme='tokyo-day'] {
7474
+ color-scheme: light;
7475
+
7476
+ --bg-app: #e9eaef;
7477
+ --bg-chrome: #dfe1e8;
7478
+ --bg-raised: #f5f6f9;
7479
+ --bg-surface: #d4d7e2;
7480
+ --bg-surface-hi: #c3c7d6;
7481
+ --bg-chrome-hi: #d7dae6;
7482
+ --bg-well: #ffffff;
7483
+ --bg-well-hi: #f7f8fc;
7484
+ --bg-inset-hi: #e4e8f4;
7485
+ --bg-selected: #ccd4ea;
7486
+ --bg-chip: #dde0eb;
7487
+ --bg-chip-soft: #eef0f6;
7488
+ --bg-editor: #ffffff;
7489
+
7490
+ --border: #c0c4d4;
7491
+ --border-subtle: #d5d8e2;
7492
+ --border-well: #dcdfe9;
7493
+ --border-strong: #9aa0b8;
7494
+ --border-dim: #b8bdcf;
7495
+ --border-hover: #aab0c6;
7496
+
7497
+ --text: #3a4060;
7498
+ --text-bright: #1b1e33;
7499
+ --text-soft: #4c5270;
7500
+ --text-muted: #6b7190;
7501
+ --text-dim: #9096ad;
7502
+ --text-ticket: #22263c;
7503
+ --text-ticket-muted: #666d8b;
7504
+ --text-ticket-dim: #5f6685;
7505
+ --text-placeholder: #9aa0b6;
7506
+
7507
+ --accent: #2e7de9;
7508
+ --accent-hover: #1a68d6;
7509
+ --accent-soft: #2f6fd0;
7510
+ --accent-softer: #1b5cb8;
7511
+ --accent-grad-top: #4d90ef;
7512
+ --accent-grad-top-hi: #61a0f5;
7513
+ --on-accent: #ffffff;
7514
+
7515
+ --danger: #f52a65;
7516
+ --warning: #8c6c3e;
7517
+ --success: #587539;
7518
+ --danger-bg: #fce8ee;
7519
+ --sev-high: #b15c00;
7520
+ --sev-digest: #7847d1;
7521
+
7522
+ --selection-bg: #b6c8f0;
7523
+ --switch-track: #c2c6d6;
7524
+ --switch-thumb: #ffffff;
7525
+ --ticket-grad-top: #eef0f7;
7526
+ --ticket-grad-bot: #e5e7f0;
7527
+ --shadow-color: rgba(60, 70, 110, 0.18);
7528
+ --overlay-bg: rgba(30, 35, 60, 0.32);
7529
+ --hover-veil: rgba(0, 0, 0, 0.04);
7530
+ --footer-veil: rgba(255, 255, 255, 0.55);
7531
+ }
7532
+
7533
+ /* Catppuccin Mocha — palette per catppuccin/catppuccin (MIT).
7534
+ See THIRD-PARTY-NOTICES.md. */
7535
+ :root[data-theme='catppuccin-mocha'] {
7536
+ color-scheme: dark;
7537
+
7538
+ --bg-app: #1e1e2e; /* base */
7539
+ --bg-chrome: #181825; /* mantle */
7540
+ --bg-raised: #272739;
7541
+ --bg-surface: #313244; /* surface0 */
7542
+ --bg-surface-hi: #45475a; /* surface1 */
7543
+ --bg-chrome-hi: #21212f;
7544
+ --bg-well: #11111b; /* crust */
7545
+ --bg-well-hi: #17171f;
7546
+ --bg-inset-hi: #1b1b28;
7547
+ --bg-selected: #3a3c52;
7548
+ --bg-chip: #313244;
7549
+ --bg-chip-soft: #1a1a27;
7550
+ --bg-editor: #1e1e2e;
7551
+
7552
+ --border: #45475a; /* surface1 */
7553
+ --border-subtle: #313244; /* surface0 */
7554
+ --border-well: #2a2b3c;
7555
+ --border-strong: #6c7086; /* overlay0 */
7556
+ --border-dim: #585b70; /* surface2 */
7557
+ --border-hover: #585b70;
7558
+
7559
+ --text: #cdd6f4; /* text */
7560
+ --text-bright: #f2f4fd;
7561
+ --text-soft: #bac2de; /* subtext1 */
7562
+ --text-muted: #7f849c; /* overlay1 */
7563
+ --text-dim: #6c7086; /* overlay0 */
7564
+ --text-ticket: #cdd6f4;
7565
+ --text-ticket-muted: #9399b2;
7566
+ --text-ticket-dim: #a6adc8;
7567
+ --text-placeholder: #585b70;
7568
+
7569
+ --accent: #89b4fa; /* blue */
7570
+ --accent-hover: #b4befe; /* lavender */
7571
+ --accent-soft: #a3c4fb;
7572
+ --accent-softer: #c8d6fd;
7573
+ --accent-grad-top: #9ec1fb;
7574
+ --accent-grad-top-hi: #b4cffc;
7575
+ --on-accent: #1e1e2e;
7576
+
7577
+ --danger: #f38ba8;
7578
+ --warning: #f9e2af;
7579
+ --success: #a6e3a1;
7580
+ --danger-bg: #302334;
7581
+ --sev-high: #fab387; /* peach */
7582
+ --sev-digest: #cba6f7; /* mauve */
7583
+
7584
+ --selection-bg: #3e4470;
7585
+ --switch-track: #45475a;
7586
+ --switch-thumb: #cdd6f4;
7587
+ --ticket-grad-top: #232338;
7588
+ --ticket-grad-bot: #1c1c29;
7589
+ --shadow-color: rgba(0, 0, 0, 0.5);
7590
+ --overlay-bg: rgba(0, 0, 0, 0.65);
7591
+ --hover-veil: rgba(255, 255, 255, 0.05);
7592
+ --footer-veil: rgba(17, 17, 27, 0.35);
7593
+ }
7594
+
7595
+ /* Catppuccin Latte — palette per catppuccin/catppuccin (MIT).
7596
+ See THIRD-PARTY-NOTICES.md. */
7597
+ :root[data-theme='catppuccin-latte'] {
7598
+ color-scheme: light;
7599
+
7600
+ --bg-app: #eff1f5; /* base */
7601
+ --bg-chrome: #e6e9ef; /* mantle */
7602
+ --bg-raised: #fafbfc;
7603
+ --bg-surface: #ccd0da; /* surface0 */
7604
+ --bg-surface-hi: #bcc0cc; /* surface1 */
7605
+ --bg-chrome-hi: #dce0e8; /* crust */
7606
+ --bg-well: #ffffff;
7607
+ --bg-well-hi: #f7f8fa;
7608
+ --bg-inset-hi: #e8ecf5;
7609
+ --bg-selected: #ccd6ee;
7610
+ --bg-chip: #dce0e8;
7611
+ --bg-chip-soft: #f0f2f6;
7612
+ --bg-editor: #eff1f5;
7613
+
7614
+ --border: #bcc0cc; /* surface1 */
7615
+ --border-subtle: #d5d9e2;
7616
+ --border-well: #dce0e8; /* crust */
7617
+ --border-strong: #9ca0b0; /* overlay0 */
7618
+ --border-dim: #acb0be; /* surface2 */
7619
+ --border-hover: #acb0be;
7620
+
7621
+ --text: #4c4f69; /* text */
7622
+ --text-bright: #2f3145;
7623
+ --text-soft: #5c5f77; /* subtext1 */
7624
+ --text-muted: #7c7f93; /* overlay2 */
7625
+ --text-dim: #9ca0b0; /* overlay0 */
7626
+ --text-ticket: #3d4059;
7627
+ --text-ticket-muted: #6c6f85;
7628
+ --text-ticket-dim: #6c6f85;
7629
+ --text-placeholder: #9ca0b0;
7630
+
7631
+ --accent: #1e66f5; /* blue */
7632
+ --accent-hover: #0b52d4;
7633
+ --accent-soft: #2b60cf;
7634
+ --accent-softer: #17479f;
7635
+ --accent-grad-top: #4a83f7;
7636
+ --accent-grad-top-hi: #6497f8;
7637
+ --on-accent: #ffffff;
7638
+
7639
+ --danger: #d20f39;
7640
+ --warning: #df8e1d;
7641
+ --success: #40a02b;
7642
+ --danger-bg: #fbe3e8;
7643
+ --sev-high: #fe640b; /* peach */
7644
+ --sev-digest: #8839ef; /* mauve */
7645
+
7646
+ --selection-bg: #bcc9f0;
7647
+ --switch-track: #bcc0cc;
7648
+ --switch-thumb: #ffffff;
7649
+ --ticket-grad-top: #f2f4f8;
7650
+ --ticket-grad-bot: #e9ecf2;
7651
+ --shadow-color: rgba(70, 80, 110, 0.16);
7652
+ --overlay-bg: rgba(40, 45, 70, 0.3);
7653
+ --hover-veil: rgba(0, 0, 0, 0.04);
7654
+ --footer-veil: rgba(255, 255, 255, 0.55);
7655
+ }
7656
+
7387
7657
  * {
7388
7658
  margin: 0;
7389
7659
  padding: 0;
@@ -7394,8 +7664,8 @@ html, body, #root {
7394
7664
  height: 100%;
7395
7665
  width: 100%;
7396
7666
  overflow: hidden;
7397
- background: #1a1b26;
7398
- color: #a9b1d6;
7667
+ background: var(--bg-app);
7668
+ color: var(--text);
7399
7669
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
7400
7670
  }
7401
7671
 
@@ -7413,15 +7683,15 @@ html, body, #root {
7413
7683
  align-items: center;
7414
7684
  justify-content: space-between;
7415
7685
  padding: 0 16px 0 80px;
7416
- background: #16161e;
7417
- border-bottom: 1px solid #2a2b3d;
7686
+ background: var(--bg-chrome);
7687
+ border-bottom: 1px solid var(--border-subtle);
7418
7688
  font-size: 13px;
7419
7689
  flex-shrink: 0;
7420
7690
  }
7421
7691
 
7422
7692
  .titlebar-title {
7423
7693
  font-weight: 600;
7424
- color: #c0caf5;
7694
+ color: var(--text-bright);
7425
7695
  display: flex;
7426
7696
  align-items: center;
7427
7697
  gap: 6px;
@@ -7429,12 +7699,12 @@ html, body, #root {
7429
7699
  }
7430
7700
 
7431
7701
  .titlebar-title-sep {
7432
- color: #565f89;
7702
+ color: var(--text-muted);
7433
7703
  font-weight: 400;
7434
7704
  }
7435
7705
 
7436
7706
  .titlebar-project {
7437
- color: #7aa2f7;
7707
+ color: var(--accent);
7438
7708
  font-weight: 600;
7439
7709
  white-space: nowrap;
7440
7710
  overflow: hidden;
@@ -7450,9 +7720,9 @@ html, body, #root {
7450
7720
  }
7451
7721
 
7452
7722
  .titlebar-controls select {
7453
- background: #2a2b3d;
7454
- color: #a9b1d6;
7455
- border: 1px solid #3b3d57;
7723
+ background: var(--bg-surface);
7724
+ color: var(--text);
7725
+ border: 1px solid var(--border);
7456
7726
  border-radius: 4px;
7457
7727
  padding: 2px 8px;
7458
7728
  font-size: 12px;
@@ -7461,13 +7731,13 @@ html, body, #root {
7461
7731
 
7462
7732
  .titlebar-controls select:focus {
7463
7733
  outline: none;
7464
- border-color: #7aa2f7;
7734
+ border-color: var(--accent);
7465
7735
  }
7466
7736
 
7467
7737
  .titlebar-btn {
7468
- background: #2a2b3d;
7469
- color: #565f89;
7470
- border: 1px solid #3b3d57;
7738
+ background: var(--bg-surface);
7739
+ color: var(--text-muted);
7740
+ border: 1px solid var(--border);
7471
7741
  border-radius: 4px;
7472
7742
  padding: 2px 10px;
7473
7743
  font-size: 11px;
@@ -7476,14 +7746,14 @@ html, body, #root {
7476
7746
  }
7477
7747
 
7478
7748
  .titlebar-btn:hover {
7479
- color: #a9b1d6;
7480
- border-color: #565f89;
7749
+ color: var(--text);
7750
+ border-color: var(--border-strong);
7481
7751
  }
7482
7752
 
7483
7753
  .titlebar-btn.active {
7484
- color: #7aa2f7;
7485
- border-color: #7aa2f7;
7486
- background: #1f2335;
7754
+ color: var(--accent);
7755
+ border-color: var(--accent);
7756
+ background: var(--bg-raised);
7487
7757
  }
7488
7758
 
7489
7759
  .titlebar-btn:disabled {
@@ -7493,21 +7763,21 @@ html, body, #root {
7493
7763
 
7494
7764
  /* Keep the greyed-out look stable on hover for disabled buttons. */
7495
7765
  .titlebar-btn:disabled:hover {
7496
- color: #565f89;
7497
- border-color: #3b3d57;
7766
+ color: var(--text-muted);
7767
+ border-color: var(--border);
7498
7768
  }
7499
7769
 
7500
7770
  .titlebar-separator {
7501
7771
  width: 1px;
7502
7772
  height: 16px;
7503
- background: #3b3d57;
7773
+ background: var(--border);
7504
7774
  margin: 0 4px;
7505
7775
  }
7506
7776
 
7507
7777
  .titlebar-agent-btn {
7508
- background: #2a2b3d;
7509
- color: #565f89;
7510
- border: 1px solid #3b3d57;
7778
+ background: var(--bg-surface);
7779
+ color: var(--text-muted);
7780
+ border: 1px solid var(--border);
7511
7781
  border-radius: 4px;
7512
7782
  padding: 2px 12px;
7513
7783
  font-size: 11px;
@@ -7516,14 +7786,14 @@ html, body, #root {
7516
7786
  }
7517
7787
 
7518
7788
  .titlebar-agent-btn:hover {
7519
- color: #a9b1d6;
7520
- border-color: #565f89;
7789
+ color: var(--text);
7790
+ border-color: var(--border-strong);
7521
7791
  }
7522
7792
 
7523
7793
  .titlebar-agent-btn.active {
7524
- color: #1a1b26;
7525
- background: #7aa2f7;
7526
- border-color: #7aa2f7;
7794
+ color: var(--on-accent);
7795
+ background: var(--accent);
7796
+ border-color: var(--accent);
7527
7797
  font-weight: 600;
7528
7798
  }
7529
7799
 
@@ -7547,8 +7817,8 @@ html, body, #root {
7547
7817
  align-items: center;
7548
7818
  gap: 1px;
7549
7819
  padding: 2px 4px;
7550
- background: #16161e;
7551
- border-bottom: 1px solid #292e42;
7820
+ background: var(--bg-chrome);
7821
+ border-bottom: 1px solid var(--border-subtle);
7552
7822
  flex-shrink: 0;
7553
7823
  overflow-x: auto;
7554
7824
  min-height: 28px;
@@ -7560,7 +7830,7 @@ html, body, #root {
7560
7830
  gap: 4px;
7561
7831
  padding: 3px 8px;
7562
7832
  font-size: 11px;
7563
- color: #565f89;
7833
+ color: var(--text-muted);
7564
7834
  background: transparent;
7565
7835
  border-radius: 4px;
7566
7836
  cursor: pointer;
@@ -7569,13 +7839,13 @@ html, body, #root {
7569
7839
  }
7570
7840
 
7571
7841
  .terminal-tab:hover {
7572
- background: #1f2335;
7573
- color: #a9b1d6;
7842
+ background: var(--bg-raised);
7843
+ color: var(--text);
7574
7844
  }
7575
7845
 
7576
7846
  .terminal-tab.active {
7577
- background: #1a1b26;
7578
- color: #c0caf5;
7847
+ background: var(--bg-app);
7848
+ color: var(--text-bright);
7579
7849
  }
7580
7850
 
7581
7851
  .terminal-tab-label {
@@ -7592,23 +7862,23 @@ html, body, #root {
7592
7862
  }
7593
7863
 
7594
7864
  .terminal-tab-dot.active {
7595
- background: #9ece6a;
7865
+ background: var(--success);
7596
7866
  }
7597
7867
 
7598
7868
  .terminal-tab-dot.exited {
7599
- background: #565f89;
7869
+ background: var(--text-muted);
7600
7870
  }
7601
7871
 
7602
7872
  /* Agent is waiting on the user — pulse to draw the eye across tabs. */
7603
7873
  .terminal-tab-dot.awaiting {
7604
- background: #e0af68; /* amber: waiting for next prompt */
7605
- color: #e0af68; /* drives the box-shadow glow via currentColor */
7874
+ background: var(--warning); /* amber: waiting for next prompt */
7875
+ color: var(--warning); /* drives the box-shadow glow via currentColor */
7606
7876
  animation: tab-dot-pulse 1.1s ease-in-out infinite;
7607
7877
  }
7608
7878
 
7609
7879
  .terminal-tab-dot.decision {
7610
- background: #f7768e; /* red: blocked on an approval/permission prompt */
7611
- color: #f7768e;
7880
+ background: var(--danger); /* red: blocked on an approval/permission prompt */
7881
+ color: var(--danger);
7612
7882
  animation: tab-dot-pulse 1.1s ease-in-out infinite;
7613
7883
  }
7614
7884
 
@@ -7631,14 +7901,14 @@ html, body, #root {
7631
7901
 
7632
7902
  .terminal-tab-close:hover {
7633
7903
  opacity: 1;
7634
- background: rgba(247, 118, 142, 0.2);
7635
- color: #f7768e;
7904
+ background: color-mix(in srgb, var(--danger) 20%, transparent);
7905
+ color: var(--danger);
7636
7906
  }
7637
7907
 
7638
7908
  .terminal-tab-add {
7639
7909
  background: none;
7640
7910
  border: none;
7641
- color: #565f89;
7911
+ color: var(--text-muted);
7642
7912
  font-size: 16px;
7643
7913
  cursor: pointer;
7644
7914
  padding: 2px 6px;
@@ -7647,8 +7917,8 @@ html, body, #root {
7647
7917
  }
7648
7918
 
7649
7919
  .terminal-tab-add:hover {
7650
- background: #1f2335;
7651
- color: #a9b1d6;
7920
+ background: var(--bg-raised);
7921
+ color: var(--text);
7652
7922
  }
7653
7923
 
7654
7924
  .terminal-tabs-content {
@@ -7694,18 +7964,18 @@ html, body, #root {
7694
7964
  gap: 5px;
7695
7965
  padding: 5px 12px;
7696
7966
  border-radius: 14px;
7697
- background: #2a2b3d;
7698
- border: 1px solid #7aa2f7;
7699
- color: #c0caf5;
7967
+ background: var(--bg-surface);
7968
+ border: 1px solid var(--accent);
7969
+ color: var(--text-bright);
7700
7970
  font-family: inherit;
7701
7971
  font-size: 11.5px;
7702
7972
  font-weight: 600;
7703
7973
  cursor: pointer;
7704
- box-shadow: 0 4px 14px rgba(0, 0, 0, 0.45);
7974
+ box-shadow: 0 4px 14px var(--shadow-color);
7705
7975
  transition: background 0.13s ease, transform 0.06s ease;
7706
7976
  }
7707
7977
  .term-jump-latest:hover {
7708
- background: #343650;
7978
+ background: var(--bg-surface-hi);
7709
7979
  }
7710
7980
  .term-jump-latest:active {
7711
7981
  transform: translateY(1px);
@@ -7749,7 +8019,7 @@ html, body, #root {
7749
8019
  /* Dividers */
7750
8020
  .split-divider {
7751
8021
  flex-shrink: 0;
7752
- background: #2a2b3d;
8022
+ background: var(--bg-surface);
7753
8023
  transition: background 0.15s;
7754
8024
  z-index: 2;
7755
8025
  }
@@ -7767,7 +8037,7 @@ html, body, #root {
7767
8037
  }
7768
8038
 
7769
8039
  .split-divider:hover {
7770
- background: #7aa2f7;
8040
+ background: var(--accent);
7771
8041
  }
7772
8042
 
7773
8043
  /* Leaf pane */
@@ -7796,8 +8066,8 @@ html, body, #root {
7796
8066
  align-items: center;
7797
8067
  height: 26px;
7798
8068
  padding: 0 6px;
7799
- background: #16161e;
7800
- border-bottom: 1px solid #2a2b3d;
8069
+ background: var(--bg-chrome);
8070
+ border-bottom: 1px solid var(--border-subtle);
7801
8071
  flex-shrink: 0;
7802
8072
  cursor: grab;
7803
8073
  user-select: none;
@@ -7809,19 +8079,19 @@ html, body, #root {
7809
8079
 
7810
8080
  .pane-drag-grip {
7811
8081
  font-size: 10px;
7812
- color: #414868;
8082
+ color: var(--text-dim);
7813
8083
  margin-right: 6px;
7814
8084
  line-height: 1;
7815
8085
  }
7816
8086
 
7817
8087
  .pane-header:hover .pane-drag-grip {
7818
- color: #7aa2f7;
8088
+ color: var(--accent);
7819
8089
  }
7820
8090
 
7821
8091
  .pane-header-label {
7822
8092
  font-size: 11px;
7823
8093
  font-weight: 600;
7824
- color: #565f89;
8094
+ color: var(--text-muted);
7825
8095
  letter-spacing: 0.3px;
7826
8096
  flex: 1;
7827
8097
  }
@@ -7829,7 +8099,7 @@ html, body, #root {
7829
8099
  .pane-hide-btn {
7830
8100
  background: none;
7831
8101
  border: none;
7832
- color: #414868;
8102
+ color: var(--text-dim);
7833
8103
  font-size: 14px;
7834
8104
  cursor: pointer;
7835
8105
  padding: 0 4px;
@@ -7837,7 +8107,7 @@ html, body, #root {
7837
8107
  }
7838
8108
 
7839
8109
  .pane-hide-btn:hover {
7840
- color: #f7768e;
8110
+ color: var(--danger);
7841
8111
  }
7842
8112
 
7843
8113
  /* Drop zone overlay */
@@ -7896,8 +8166,8 @@ html, body, #root {
7896
8166
  }
7897
8167
 
7898
8168
  .drop-zone.active {
7899
- background: rgba(122, 162, 247, 0.25);
7900
- border: 2px solid rgba(122, 162, 247, 0.6);
8169
+ background: color-mix(in srgb, var(--accent) 25%, transparent);
8170
+ border: 2px solid color-mix(in srgb, var(--accent) 60%, transparent);
7901
8171
  }
7902
8172
 
7903
8173
  .multi-split-empty {
@@ -7906,7 +8176,7 @@ html, body, #root {
7906
8176
  display: flex;
7907
8177
  align-items: center;
7908
8178
  justify-content: center;
7909
- color: #565f89;
8179
+ color: var(--text-muted);
7910
8180
  font-size: 13px;
7911
8181
  }
7912
8182
 
@@ -7925,8 +8195,8 @@ html, body, #root {
7925
8195
  align-items: center;
7926
8196
  gap: 4px;
7927
8197
  padding: 5px 6px;
7928
- background: #1a1b26;
7929
- border-bottom: 1px solid #2a2b3d;
8198
+ background: var(--bg-app);
8199
+ border-bottom: 1px solid var(--border-subtle);
7930
8200
  }
7931
8201
 
7932
8202
  .ctlsurf-nav-btn {
@@ -7940,18 +8210,18 @@ html, body, #root {
7940
8210
  background: transparent;
7941
8211
  border: none;
7942
8212
  border-radius: 4px;
7943
- color: #a9b1d6;
8213
+ color: var(--text);
7944
8214
  font-size: 16px;
7945
8215
  line-height: 1;
7946
8216
  cursor: pointer;
7947
8217
  }
7948
8218
 
7949
8219
  .ctlsurf-nav-btn:hover:not(:disabled) {
7950
- background: #2a2b3d;
8220
+ background: var(--bg-surface);
7951
8221
  }
7952
8222
 
7953
8223
  .ctlsurf-nav-btn:disabled {
7954
- color: #565f89;
8224
+ color: var(--text-muted);
7955
8225
  opacity: 0.5;
7956
8226
  cursor: default;
7957
8227
  }
@@ -7966,16 +8236,16 @@ html, body, #root {
7966
8236
  width: 100%;
7967
8237
  height: 26px;
7968
8238
  padding: 0 11px;
7969
- background: #16161e;
7970
- border: 1px solid #2a2b3d;
8239
+ background: var(--bg-chrome);
8240
+ border: 1px solid var(--border-subtle);
7971
8241
  border-radius: 13px;
7972
- color: #c0caf5;
8242
+ color: var(--text-bright);
7973
8243
  font-size: 12px;
7974
8244
  outline: none;
7975
8245
  }
7976
8246
 
7977
8247
  .ctlsurf-address-input:focus {
7978
- border-color: #7aa2f7;
8248
+ border-color: var(--accent);
7979
8249
  }
7980
8250
 
7981
8251
  .ctlsurf-webview-host {
@@ -8004,10 +8274,10 @@ html, body, #root {
8004
8274
  align-items: center;
8005
8275
  justify-content: space-between;
8006
8276
  padding: 0 12px;
8007
- background: #16161e;
8008
- border-top: 1px solid #2a2b3d;
8277
+ background: var(--bg-chrome);
8278
+ border-top: 1px solid var(--border-subtle);
8009
8279
  font-size: 11px;
8010
- color: #565f89;
8280
+ color: var(--text-muted);
8011
8281
  flex-shrink: 0;
8012
8282
  }
8013
8283
 
@@ -8022,14 +8292,14 @@ html, body, #root {
8022
8292
  border-radius: 3px;
8023
8293
  font-size: 11px;
8024
8294
  cursor: pointer;
8025
- border: 1px solid #3b3d57;
8026
- background: #2a2b3d;
8027
- color: #7aa2f7;
8295
+ border: 1px solid var(--border);
8296
+ background: var(--bg-surface);
8297
+ color: var(--accent);
8028
8298
  margin-left: 4px;
8029
8299
  }
8030
8300
 
8031
8301
  .statusbar-btn:hover {
8032
- background: #3b3d57;
8302
+ background: var(--border);
8033
8303
  }
8034
8304
 
8035
8305
  .statusbar-btn:disabled {
@@ -8041,14 +8311,14 @@ html, body, #root {
8041
8311
  cursor: pointer;
8042
8312
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
8043
8313
  font-size: 11px;
8044
- color: #a9b1d6;
8314
+ color: var(--text);
8045
8315
  padding: 1px 4px;
8046
8316
  border-radius: 3px;
8047
8317
  }
8048
8318
 
8049
8319
  .statusbar-path:hover {
8050
- background: #2a2b3d;
8051
- color: #7aa2f7;
8320
+ background: var(--bg-surface);
8321
+ color: var(--accent);
8052
8322
  }
8053
8323
 
8054
8324
  .status-dot {
@@ -8058,21 +8328,21 @@ html, body, #root {
8058
8328
  display: inline-block;
8059
8329
  }
8060
8330
 
8061
- .status-dot.active { background: #9ece6a; }
8062
- .status-dot.inactive { background: #f7768e; }
8063
- .status-dot.idle { background: #565f89; }
8064
- .status-dot.pending { background: #e0af68; }
8331
+ .status-dot.active { background: var(--success); }
8332
+ .status-dot.inactive { background: var(--danger); }
8333
+ .status-dot.idle { background: var(--text-muted); }
8334
+ .status-dot.pending { background: var(--warning); }
8065
8335
 
8066
8336
  .statusbar-version {
8067
8337
  margin-left: 12px;
8068
- color: #565f89;
8338
+ color: var(--text-muted);
8069
8339
  font-size: 11px;
8070
8340
  white-space: nowrap;
8071
8341
  cursor: help;
8072
8342
  }
8073
8343
 
8074
8344
  .statusbar-version.has-update {
8075
- color: #e0af68;
8345
+ color: var(--warning);
8076
8346
  font-weight: 500;
8077
8347
  }
8078
8348
 
@@ -8083,8 +8353,8 @@ html, body, #root {
8083
8353
  display: inline-block;
8084
8354
  vertical-align: middle;
8085
8355
  }
8086
- .tracking-dot.on { background: #9ece6a; box-shadow: 0 0 4px #9ece6a; }
8087
- .tracking-dot.off { background: #565f89; }
8356
+ .tracking-dot.on { background: var(--success); box-shadow: 0 0 4px var(--success); }
8357
+ .tracking-dot.off { background: var(--text-muted); }
8088
8358
 
8089
8359
  .titlebar-icon-btn {
8090
8360
  display: inline-flex;
@@ -8112,14 +8382,14 @@ html, body, #root {
8112
8382
  cursor: not-allowed;
8113
8383
  }
8114
8384
  .voice-btn.listening {
8115
- color: #f7768e;
8116
- border-color: #f7768e;
8117
- background: #1f2335;
8385
+ color: var(--danger);
8386
+ border-color: var(--danger);
8387
+ background: var(--bg-raised);
8118
8388
  }
8119
8389
  .voice-btn.busy {
8120
- color: #e0af68;
8121
- border-color: #e0af68;
8122
- background: #1f2335;
8390
+ color: var(--warning);
8391
+ border-color: var(--warning);
8392
+ background: var(--bg-raised);
8123
8393
  }
8124
8394
  .voice-icon {
8125
8395
  font-size: 13px;
@@ -8131,16 +8401,16 @@ html, body, #root {
8131
8401
  border-radius: 50%;
8132
8402
  display: inline-block;
8133
8403
  vertical-align: middle;
8134
- background: #565f89;
8404
+ background: var(--text-muted);
8135
8405
  }
8136
8406
  .voice-dot.on {
8137
- background: #f7768e;
8138
- box-shadow: 0 0 4px #f7768e;
8407
+ background: var(--danger);
8408
+ box-shadow: 0 0 4px var(--danger);
8139
8409
  animation: voice-pulse 1s ease-in-out infinite;
8140
8410
  }
8141
8411
  .voice-dot.busy {
8142
- background: #e0af68;
8143
- box-shadow: 0 0 4px #e0af68;
8412
+ background: var(--warning);
8413
+ box-shadow: 0 0 4px var(--warning);
8144
8414
  animation: voice-pulse 0.8s ease-in-out infinite;
8145
8415
  }
8146
8416
  @keyframes voice-pulse {
@@ -8162,27 +8432,27 @@ html, body, #root {
8162
8432
  text-overflow: ellipsis;
8163
8433
  z-index: 50;
8164
8434
  pointer-events: none;
8165
- border: 1px solid #3b3d57;
8435
+ border: 1px solid var(--border);
8166
8436
  }
8167
8437
  .voice-chip.listening {
8168
- background: #1f2335;
8169
- color: #a9b1d6;
8438
+ background: var(--bg-raised);
8439
+ color: var(--text);
8170
8440
  }
8171
8441
  .voice-chip.busy {
8172
- background: #1f2335;
8173
- color: #e0af68;
8174
- border-color: #e0af68;
8442
+ background: var(--bg-raised);
8443
+ color: var(--warning);
8444
+ border-color: var(--warning);
8175
8445
  }
8176
8446
  .voice-chip.notice {
8177
- background: #1f2335;
8178
- color: #e0af68;
8179
- border-color: #e0af68;
8447
+ background: var(--bg-raised);
8448
+ color: var(--warning);
8449
+ border-color: var(--warning);
8180
8450
  white-space: normal;
8181
8451
  }
8182
8452
  .voice-chip.error {
8183
- background: #2d2030;
8184
- color: #f7768e;
8185
- border-color: #f7768e;
8453
+ background: var(--danger-bg);
8454
+ color: var(--danger);
8455
+ border-color: var(--danger);
8186
8456
  white-space: normal;
8187
8457
  }
8188
8458
 
@@ -8195,10 +8465,10 @@ html, body, #root {
8195
8465
  align-items: center;
8196
8466
  gap: 4px;
8197
8467
  padding: 4px 4px 6px;
8198
- background: #16161e;
8199
- border: 1px solid #3b3d57;
8468
+ background: var(--bg-chrome);
8469
+ border: 1px solid var(--border);
8200
8470
  border-radius: 12px;
8201
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45);
8471
+ box-shadow: 0 4px 16px var(--shadow-color);
8202
8472
  user-select: none;
8203
8473
  -webkit-user-select: none;
8204
8474
  }
@@ -8212,7 +8482,7 @@ html, body, #root {
8212
8482
  }
8213
8483
  .floating-mic-handle:active { cursor: grabbing; }
8214
8484
  .floating-mic-grip {
8215
- color: #565f89;
8485
+ color: var(--text-muted);
8216
8486
  font-size: 12px;
8217
8487
  line-height: 1;
8218
8488
  padding: 0 2px;
@@ -8220,13 +8490,13 @@ html, body, #root {
8220
8490
  .floating-mic-hide {
8221
8491
  background: transparent;
8222
8492
  border: none;
8223
- color: #565f89;
8493
+ color: var(--text-muted);
8224
8494
  font-size: 15px;
8225
8495
  line-height: 1;
8226
8496
  cursor: pointer;
8227
8497
  padding: 0 2px;
8228
8498
  }
8229
- .floating-mic-hide:hover { color: #f7768e; }
8499
+ .floating-mic-hide:hover { color: var(--danger); }
8230
8500
 
8231
8501
  /* Smaller sibling of the round mic: read the last agent reply aloud. */
8232
8502
  .floating-mic-read {
@@ -8236,16 +8506,16 @@ html, body, #root {
8236
8506
  display: inline-flex;
8237
8507
  align-items: center;
8238
8508
  justify-content: center;
8239
- background: #2a2b3d;
8240
- border: 1px solid #3b3d57;
8241
- color: #a9b1d6;
8509
+ background: var(--bg-surface);
8510
+ border: 1px solid var(--border);
8511
+ color: var(--text);
8242
8512
  cursor: pointer;
8243
8513
  transition: all 0.15s;
8244
8514
  }
8245
- .floating-mic-read:hover { border-color: #565f89; color: #c0caf5; }
8515
+ .floating-mic-read:hover { border-color: var(--border-strong); color: var(--text-bright); }
8246
8516
  .floating-mic-read.speaking {
8247
- color: #7aa2f7;
8248
- border-color: #7aa2f7;
8517
+ color: var(--accent);
8518
+ border-color: var(--accent);
8249
8519
  }
8250
8520
  .floating-mic-note {
8251
8521
  position: absolute;
@@ -8254,9 +8524,9 @@ html, body, #root {
8254
8524
  transform: translateX(-50%);
8255
8525
  white-space: nowrap;
8256
8526
  font-size: 11px;
8257
- color: #565f89;
8258
- background: #16161e;
8259
- border: 1px solid #3b3d57;
8527
+ color: var(--text-muted);
8528
+ background: var(--bg-chrome);
8529
+ border: 1px solid var(--border);
8260
8530
  border-radius: 6px;
8261
8531
  padding: 2px 6px;
8262
8532
  pointer-events: none;
@@ -8269,14 +8539,14 @@ html, body, #root {
8269
8539
  display: inline-flex;
8270
8540
  align-items: center;
8271
8541
  justify-content: center;
8272
- background: #2a2b3d;
8273
- border: 1px solid #3b3d57;
8274
- color: #a9b1d6;
8542
+ background: var(--bg-surface);
8543
+ border: 1px solid var(--border);
8544
+ color: var(--text);
8275
8545
  cursor: pointer;
8276
8546
  position: relative;
8277
8547
  transition: all 0.15s;
8278
8548
  }
8279
- .voice-btn-floating:hover { border-color: #565f89; }
8549
+ .voice-btn-floating:hover { border-color: var(--border-strong); }
8280
8550
  .voice-btn-floating .voice-icon { font-size: 22px; }
8281
8551
  .voice-btn-floating .voice-dot {
8282
8552
  position: absolute;
@@ -8308,15 +8578,15 @@ html, body, #root {
8308
8578
  padding: 0;
8309
8579
  font-size: 10px;
8310
8580
  line-height: 1;
8311
- background: #2a2b3d;
8312
- border: 1px solid #3b3d57;
8313
- color: #a9b1d6;
8581
+ background: var(--bg-surface);
8582
+ border: 1px solid var(--border);
8583
+ color: var(--text);
8314
8584
  cursor: pointer;
8315
8585
  z-index: 60;
8316
8586
  }
8317
8587
  .voice-source-btn:hover {
8318
- border-color: #7aa2f7;
8319
- color: #c0caf5;
8588
+ border-color: var(--accent);
8589
+ color: var(--text-bright);
8320
8590
  }
8321
8591
  .voice-source-menu {
8322
8592
  position: absolute;
@@ -8326,17 +8596,17 @@ html, body, #root {
8326
8596
  min-width: 200px;
8327
8597
  max-width: 280px;
8328
8598
  padding: 4px;
8329
- background: #16161e;
8330
- border: 1px solid #3b3d57;
8599
+ background: var(--bg-chrome);
8600
+ border: 1px solid var(--border);
8331
8601
  border-radius: 8px;
8332
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5);
8602
+ box-shadow: 0 6px 20px var(--shadow-color);
8333
8603
  z-index: 300;
8334
8604
  }
8335
8605
  .voice-source-head {
8336
8606
  font-size: 10px;
8337
8607
  text-transform: uppercase;
8338
8608
  letter-spacing: 0.04em;
8339
- color: #565f89;
8609
+ color: var(--text-muted);
8340
8610
  padding: 4px 8px 6px;
8341
8611
  }
8342
8612
  .voice-source-item {
@@ -8348,17 +8618,17 @@ html, body, #root {
8348
8618
  border: none;
8349
8619
  border-radius: 5px;
8350
8620
  background: transparent;
8351
- color: #a9b1d6;
8621
+ color: var(--text);
8352
8622
  font-size: 12px;
8353
8623
  text-align: left;
8354
8624
  cursor: pointer;
8355
8625
  }
8356
- .voice-source-item:hover { background: #1f2335; }
8357
- .voice-source-item.active { color: #7aa2f7; }
8626
+ .voice-source-item:hover { background: var(--bg-raised); }
8627
+ .voice-source-item.active { color: var(--accent); }
8358
8628
  .voice-source-check {
8359
8629
  flex: 0 0 12px;
8360
8630
  width: 12px;
8361
- color: #7aa2f7;
8631
+ color: var(--accent);
8362
8632
  font-size: 11px;
8363
8633
  }
8364
8634
  .voice-source-label {
@@ -8369,7 +8639,7 @@ html, body, #root {
8369
8639
  .voice-source-empty {
8370
8640
  padding: 6px 8px;
8371
8641
  font-size: 11px;
8372
- color: #565f89;
8642
+ color: var(--text-muted);
8373
8643
  }
8374
8644
 
8375
8645
  /* Spoken-replies titlebar control */
@@ -8379,13 +8649,13 @@ html, body, #root {
8379
8649
  align-items: center;
8380
8650
  }
8381
8651
  .speak-btn.active {
8382
- color: #7aa2f7;
8383
- border-color: #7aa2f7;
8652
+ color: var(--accent);
8653
+ border-color: var(--accent);
8384
8654
  }
8385
8655
  .speak-pct {
8386
8656
  font-size: 9px;
8387
8657
  margin-left: 3px;
8388
- color: #e0af68;
8658
+ color: var(--warning);
8389
8659
  }
8390
8660
  .speak-caret {
8391
8661
  padding: 0 3px;
@@ -8393,10 +8663,10 @@ html, body, #root {
8393
8663
  min-width: 0;
8394
8664
  }
8395
8665
  .speak-stop {
8396
- color: #f7768e;
8397
- border-color: #f7768e;
8666
+ color: var(--danger);
8667
+ border-color: var(--danger);
8398
8668
  }
8399
- .speak-stop:hover { background: #2d2030; }
8669
+ .speak-stop:hover { background: var(--danger-bg); }
8400
8670
  .speak-error {
8401
8671
  position: absolute;
8402
8672
  top: 100%;
@@ -8409,9 +8679,9 @@ html, body, #root {
8409
8679
  line-height: 1.3;
8410
8680
  white-space: normal;
8411
8681
  word-break: break-word;
8412
- background: #2d2030;
8413
- color: #f7768e;
8414
- border: 1px solid #f7768e;
8682
+ background: var(--danger-bg);
8683
+ color: var(--danger);
8684
+ border: 1px solid var(--danger);
8415
8685
  z-index: 60;
8416
8686
  }
8417
8687
  .speak-menu {
@@ -8422,17 +8692,17 @@ html, body, #root {
8422
8692
  min-width: 220px;
8423
8693
  max-width: 280px;
8424
8694
  padding: 6px;
8425
- background: #16161e;
8426
- border: 1px solid #3b3d57;
8695
+ background: var(--bg-chrome);
8696
+ border: 1px solid var(--border);
8427
8697
  border-radius: 8px;
8428
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5);
8698
+ box-shadow: 0 6px 20px var(--shadow-color);
8429
8699
  z-index: 300;
8430
8700
  }
8431
8701
  .speak-menu-head {
8432
8702
  font-size: 10px;
8433
8703
  text-transform: uppercase;
8434
8704
  letter-spacing: 0.04em;
8435
- color: #565f89;
8705
+ color: var(--text-muted);
8436
8706
  padding: 6px 6px 4px;
8437
8707
  }
8438
8708
  .speak-menu-item {
@@ -8444,33 +8714,33 @@ html, body, #root {
8444
8714
  border: none;
8445
8715
  border-radius: 5px;
8446
8716
  background: transparent;
8447
- color: #a9b1d6;
8717
+ color: var(--text);
8448
8718
  font-size: 12px;
8449
8719
  text-align: left;
8450
8720
  cursor: pointer;
8451
8721
  }
8452
- .speak-menu-item:hover { background: #1f2335; }
8453
- .speak-menu-item.active { color: #7aa2f7; }
8722
+ .speak-menu-item:hover { background: var(--bg-raised); }
8723
+ .speak-menu-item.active { color: var(--accent); }
8454
8724
  .speak-menu-check {
8455
8725
  flex: 0 0 12px;
8456
8726
  width: 12px;
8457
- color: #7aa2f7;
8727
+ color: var(--accent);
8458
8728
  font-size: 11px;
8459
8729
  }
8460
8730
  .speak-select {
8461
8731
  width: 100%;
8462
8732
  margin: 2px 0 4px;
8463
8733
  padding: 4px 6px;
8464
- background: #1f2335;
8465
- color: #a9b1d6;
8466
- border: 1px solid #3b3d57;
8734
+ background: var(--bg-raised);
8735
+ color: var(--text);
8736
+ border: 1px solid var(--border);
8467
8737
  border-radius: 5px;
8468
8738
  font-size: 12px;
8469
8739
  }
8470
8740
  .speak-rate {
8471
8741
  width: 100%;
8472
8742
  margin: 2px 0 6px;
8473
- accent-color: #7aa2f7;
8743
+ accent-color: var(--accent);
8474
8744
  }
8475
8745
  .speak-menu-row {
8476
8746
  display: flex;
@@ -8480,14 +8750,14 @@ html, body, #root {
8480
8750
  .speak-menu-btn {
8481
8751
  flex: 1;
8482
8752
  padding: 5px 6px;
8483
- background: #2a2b3d;
8484
- color: #a9b1d6;
8485
- border: 1px solid #3b3d57;
8753
+ background: var(--bg-surface);
8754
+ color: var(--text);
8755
+ border: 1px solid var(--border);
8486
8756
  border-radius: 5px;
8487
8757
  font-size: 12px;
8488
8758
  cursor: pointer;
8489
8759
  }
8490
- .speak-menu-btn:hover { border-color: #7aa2f7; color: #c0caf5; }
8760
+ .speak-menu-btn:hover { border-color: var(--accent); color: var(--text-bright); }
8491
8761
 
8492
8762
  /* Editor panel */
8493
8763
  .editor-panel {
@@ -8495,7 +8765,7 @@ html, body, #root {
8495
8765
  width: 100%;
8496
8766
  height: 100%;
8497
8767
  overflow: hidden;
8498
- background: #1e1e2e;
8768
+ background: var(--bg-editor);
8499
8769
  }
8500
8770
 
8501
8771
  .editor-tree {
@@ -8503,17 +8773,17 @@ html, body, #root {
8503
8773
  display: flex;
8504
8774
  flex-direction: column;
8505
8775
  flex-shrink: 0;
8506
- background: #1a1b26;
8507
- border-right: 1px solid #2a2b3d;
8776
+ background: var(--bg-app);
8777
+ border-right: 1px solid var(--border-subtle);
8508
8778
  }
8509
8779
 
8510
8780
  .editor-tree-header {
8511
8781
  padding: 8px 12px;
8512
8782
  font-size: 11px;
8513
8783
  font-weight: 600;
8514
- color: #565f89;
8784
+ color: var(--text-muted);
8515
8785
  letter-spacing: 0.5px;
8516
- border-bottom: 1px solid #2a2b3d;
8786
+ border-bottom: 1px solid var(--border-subtle);
8517
8787
  flex-shrink: 0;
8518
8788
  }
8519
8789
 
@@ -8528,7 +8798,7 @@ html, body, #root {
8528
8798
  }
8529
8799
 
8530
8800
  .editor-tree-content::-webkit-scrollbar-thumb {
8531
- background: #2a2b3d;
8801
+ background: var(--bg-surface);
8532
8802
  border-radius: 3px;
8533
8803
  }
8534
8804
 
@@ -8538,19 +8808,19 @@ html, body, #root {
8538
8808
  padding: 3px 0;
8539
8809
  cursor: pointer;
8540
8810
  font-size: 12px;
8541
- color: #a9b1d6;
8811
+ color: var(--text);
8542
8812
  white-space: nowrap;
8543
8813
  overflow: hidden;
8544
8814
  text-overflow: ellipsis;
8545
8815
  }
8546
8816
 
8547
8817
  .tree-node:hover {
8548
- background: rgba(122, 162, 247, 0.08);
8818
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
8549
8819
  }
8550
8820
 
8551
8821
  .tree-node.selected {
8552
- background: rgba(122, 162, 247, 0.15);
8553
- color: #c0caf5;
8822
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
8823
+ color: var(--text-bright);
8554
8824
  }
8555
8825
 
8556
8826
  .tree-icon {
@@ -8558,7 +8828,7 @@ html, body, #root {
8558
8828
  text-align: center;
8559
8829
  flex-shrink: 0;
8560
8830
  font-size: 10px;
8561
- color: #565f89;
8831
+ color: var(--text-muted);
8562
8832
  }
8563
8833
 
8564
8834
  .tree-file-icon {
@@ -8579,7 +8849,7 @@ html, body, #root {
8579
8849
  }
8580
8850
 
8581
8851
  .editor-tree-divider:hover {
8582
- background: #7aa2f7;
8852
+ background: var(--accent);
8583
8853
  }
8584
8854
 
8585
8855
  .editor-main {
@@ -8596,36 +8866,36 @@ html, body, #root {
8596
8866
  gap: 4px;
8597
8867
  padding: 0 8px;
8598
8868
  height: 32px;
8599
- background: #16161e;
8600
- border-bottom: 1px solid #2a2b3d;
8869
+ background: var(--bg-chrome);
8870
+ border-bottom: 1px solid var(--border-subtle);
8601
8871
  flex-shrink: 0;
8602
8872
  }
8603
8873
 
8604
8874
  .editor-tab {
8605
8875
  font-size: 12px;
8606
- color: #a9b1d6;
8876
+ color: var(--text);
8607
8877
  padding: 4px 10px;
8608
8878
  border-radius: 3px;
8609
8879
  }
8610
8880
 
8611
8881
  .editor-tab.active {
8612
- color: #c0caf5;
8613
- background: #2a2b3d;
8882
+ color: var(--text-bright);
8883
+ background: var(--bg-surface);
8614
8884
  }
8615
8885
 
8616
8886
  .editor-save-btn {
8617
8887
  margin-left: auto;
8618
8888
  padding: 2px 10px;
8619
8889
  font-size: 11px;
8620
- background: #7aa2f7;
8621
- color: #1a1b26;
8890
+ background: var(--accent);
8891
+ color: var(--on-accent);
8622
8892
  border: none;
8623
8893
  border-radius: 3px;
8624
8894
  cursor: pointer;
8625
8895
  }
8626
8896
 
8627
8897
  .editor-save-btn:hover {
8628
- background: #89b4fa;
8898
+ background: var(--accent-hover);
8629
8899
  }
8630
8900
 
8631
8901
  .editor-monaco-container {
@@ -8638,7 +8908,7 @@ html, body, #root {
8638
8908
  display: flex;
8639
8909
  align-items: center;
8640
8910
  justify-content: center;
8641
- color: #565f89;
8911
+ color: var(--text-muted);
8642
8912
  font-size: 13px;
8643
8913
  }
8644
8914
 
@@ -8646,7 +8916,7 @@ html, body, #root {
8646
8916
  .agent-picker-overlay {
8647
8917
  position: fixed;
8648
8918
  inset: 0;
8649
- background: rgba(0, 0, 0, 0.7);
8919
+ background: var(--overlay-bg);
8650
8920
  display: flex;
8651
8921
  align-items: center;
8652
8922
  justify-content: center;
@@ -8654,8 +8924,8 @@ html, body, #root {
8654
8924
  }
8655
8925
 
8656
8926
  .agent-picker-modal {
8657
- background: #1f2335;
8658
- border: 1px solid #3b3d57;
8927
+ background: var(--bg-raised);
8928
+ border: 1px solid var(--border);
8659
8929
  border-radius: 12px;
8660
8930
  padding: 32px 40px;
8661
8931
  min-width: 360px;
@@ -8668,7 +8938,7 @@ html, body, #root {
8668
8938
  .agent-picker-brand {
8669
8939
  font-size: 22px;
8670
8940
  font-weight: 700;
8671
- color: #7aa2f7;
8941
+ color: var(--accent);
8672
8942
  margin-bottom: 20px;
8673
8943
  letter-spacing: 0.5px;
8674
8944
  }
@@ -8680,15 +8950,15 @@ html, body, #root {
8680
8950
  gap: 8px;
8681
8951
  padding: 10px 16px;
8682
8952
  margin-bottom: 20px;
8683
- background: #16161e;
8684
- border: 1px solid #2a2b3d;
8953
+ background: var(--bg-chrome);
8954
+ border: 1px solid var(--border-subtle);
8685
8955
  border-radius: 8px;
8686
8956
  cursor: pointer;
8687
8957
  transition: border-color 0.15s;
8688
8958
  }
8689
8959
 
8690
8960
  .agent-picker-cwd:hover {
8691
- border-color: #7aa2f7;
8961
+ border-color: var(--accent);
8692
8962
  }
8693
8963
 
8694
8964
  .agent-picker-cwd-icon {
@@ -8698,7 +8968,7 @@ html, body, #root {
8698
8968
  .agent-picker-cwd-path {
8699
8969
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
8700
8970
  font-size: 12px;
8701
- color: #a9b1d6;
8971
+ color: var(--text);
8702
8972
  flex: 1;
8703
8973
  text-align: left;
8704
8974
  overflow: hidden;
@@ -8708,13 +8978,13 @@ html, body, #root {
8708
8978
 
8709
8979
  .agent-picker-cwd-change {
8710
8980
  font-size: 11px;
8711
- color: #7aa2f7;
8981
+ color: var(--accent);
8712
8982
  flex-shrink: 0;
8713
8983
  }
8714
8984
 
8715
8985
  .agent-picker-title {
8716
8986
  font-size: 11px;
8717
- color: #565f89;
8987
+ color: var(--text-muted);
8718
8988
  margin-bottom: 12px;
8719
8989
  text-transform: uppercase;
8720
8990
  letter-spacing: 1px;
@@ -8732,8 +9002,8 @@ html, body, #root {
8732
9002
  justify-content: space-between;
8733
9003
  gap: 16px;
8734
9004
  padding: 14px 18px;
8735
- background: #16161e;
8736
- border: 1px solid #2a2b3d;
9005
+ background: var(--bg-chrome);
9006
+ border: 1px solid var(--border-subtle);
8737
9007
  border-radius: 8px;
8738
9008
  cursor: pointer;
8739
9009
  transition: all 0.15s;
@@ -8741,27 +9011,27 @@ html, body, #root {
8741
9011
  }
8742
9012
 
8743
9013
  .agent-picker-item:hover {
8744
- border-color: #7aa2f7;
8745
- background: #1a1b2e;
9014
+ border-color: var(--accent);
9015
+ background: var(--bg-chrome-hi);
8746
9016
  }
8747
9017
 
8748
9018
  .agent-picker-name {
8749
9019
  font-size: 14px;
8750
9020
  font-weight: 600;
8751
- color: #c0caf5;
9021
+ color: var(--text-bright);
8752
9022
  flex-shrink: 0;
8753
9023
  }
8754
9024
 
8755
9025
  .agent-picker-desc {
8756
9026
  font-size: 11px;
8757
- color: #565f89;
9027
+ color: var(--text-muted);
8758
9028
  text-align: right;
8759
9029
  }
8760
9030
 
8761
9031
  .agent-picker-hint {
8762
9032
  margin-top: 20px;
8763
9033
  font-size: 11px;
8764
- color: #414868;
9034
+ color: var(--text-dim);
8765
9035
  }
8766
9036
 
8767
9037
  .agent-picker-option {
@@ -8770,21 +9040,21 @@ html, body, #root {
8770
9040
  align-items: center;
8771
9041
  gap: 8px;
8772
9042
  font-size: 12px;
8773
- color: #a9b1d6;
9043
+ color: var(--text);
8774
9044
  cursor: pointer;
8775
9045
  user-select: none;
8776
9046
  }
8777
9047
 
8778
9048
  .agent-picker-option input[type="checkbox"] {
8779
9049
  cursor: pointer;
8780
- accent-color: #7aa2f7;
9050
+ accent-color: var(--accent);
8781
9051
  }
8782
9052
 
8783
9053
  /* ─── Remote (SSH) connect ───────────────────────── */
8784
9054
 
8785
9055
  .remote-section-label {
8786
9056
  font-size: 10px;
8787
- color: #565f89;
9057
+ color: var(--text-muted);
8788
9058
  text-transform: uppercase;
8789
9059
  letter-spacing: 1px;
8790
9060
  text-align: left;
@@ -8836,29 +9106,29 @@ html, body, #root {
8836
9106
 
8837
9107
  .remote-toggle-label {
8838
9108
  font-size: 12px;
8839
- color: #565f89;
9109
+ color: var(--text-muted);
8840
9110
  }
8841
9111
 
8842
9112
  .remote-toggle-btn {
8843
9113
  flex: 1;
8844
9114
  padding: 8px 10px;
8845
- background: #16161e;
8846
- border: 1px solid #2a2b3d;
9115
+ background: var(--bg-chrome);
9116
+ border: 1px solid var(--border-subtle);
8847
9117
  border-radius: 8px;
8848
- color: #a9b1d6;
9118
+ color: var(--text);
8849
9119
  font-size: 12px;
8850
9120
  cursor: pointer;
8851
9121
  transition: all 0.15s;
8852
9122
  }
8853
9123
 
8854
9124
  .remote-toggle-btn:hover {
8855
- border-color: #7aa2f7;
9125
+ border-color: var(--accent);
8856
9126
  }
8857
9127
 
8858
9128
  .remote-toggle-btn.is-active {
8859
- border-color: #7aa2f7;
8860
- background: #1a1b2e;
8861
- color: #c0caf5;
9129
+ border-color: var(--accent);
9130
+ background: var(--bg-chrome-hi);
9131
+ color: var(--text-bright);
8862
9132
  font-weight: 600;
8863
9133
  }
8864
9134
 
@@ -8870,25 +9140,25 @@ html, body, #root {
8870
9140
  .remote-input {
8871
9141
  flex: 1;
8872
9142
  padding: 10px 12px;
8873
- background: #16161e;
8874
- border: 1px solid #2a2b3d;
9143
+ background: var(--bg-chrome);
9144
+ border: 1px solid var(--border-subtle);
8875
9145
  border-radius: 8px;
8876
- color: #c0caf5;
9146
+ color: var(--text-bright);
8877
9147
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
8878
9148
  font-size: 12px;
8879
9149
  outline: none;
8880
9150
  }
8881
9151
 
8882
9152
  .remote-input:focus {
8883
- border-color: #7aa2f7;
9153
+ border-color: var(--accent);
8884
9154
  }
8885
9155
 
8886
9156
  .remote-btn {
8887
9157
  padding: 10px 16px;
8888
- background: #7aa2f7;
9158
+ background: var(--accent);
8889
9159
  border: none;
8890
9160
  border-radius: 8px;
8891
- color: #1f2335;
9161
+ color: var(--on-accent);
8892
9162
  font-size: 12px;
8893
9163
  font-weight: 600;
8894
9164
  cursor: pointer;
@@ -8903,21 +9173,21 @@ html, body, #root {
8903
9173
  margin-top: 18px;
8904
9174
  background: none;
8905
9175
  border: none;
8906
- color: #7aa2f7;
9176
+ color: var(--accent);
8907
9177
  font-size: 12px;
8908
9178
  cursor: pointer;
8909
9179
  }
8910
9180
 
8911
9181
  .remote-status {
8912
9182
  padding: 24px 8px;
8913
- color: #a9b1d6;
9183
+ color: var(--text);
8914
9184
  font-size: 13px;
8915
9185
  }
8916
9186
 
8917
9187
  .remote-status-sub {
8918
9188
  margin-top: 6px;
8919
9189
  font-size: 11px;
8920
- color: #565f89;
9190
+ color: var(--text-muted);
8921
9191
  word-break: break-word;
8922
9192
  }
8923
9193
 
@@ -8925,8 +9195,8 @@ html, body, #root {
8925
9195
  width: 22px;
8926
9196
  height: 22px;
8927
9197
  margin: 0 auto 14px;
8928
- border: 2px solid #2a2b3d;
8929
- border-top-color: #7aa2f7;
9198
+ border: 2px solid var(--border-subtle);
9199
+ border-top-color: var(--accent);
8930
9200
  border-radius: 50%;
8931
9201
  animation: remote-spin 0.8s linear infinite;
8932
9202
  }
@@ -8937,15 +9207,15 @@ html, body, #root {
8937
9207
 
8938
9208
  .remote-target-line {
8939
9209
  font-size: 13px;
8940
- color: #a9b1d6;
9210
+ color: var(--text);
8941
9211
  margin-bottom: 4px;
8942
9212
  }
8943
9213
 
8944
9214
  .remote-note {
8945
9215
  font-size: 11px;
8946
- color: #e0af68;
8947
- background: rgba(224, 175, 104, 0.08);
8948
- border: 1px solid rgba(224, 175, 104, 0.25);
9216
+ color: var(--warning);
9217
+ background: color-mix(in srgb, var(--warning) 8%, transparent);
9218
+ border: 1px solid color-mix(in srgb, var(--warning) 25%, transparent);
8949
9219
  border-radius: 8px;
8950
9220
  padding: 8px 12px;
8951
9221
  margin: 8px 0;
@@ -8955,7 +9225,7 @@ html, body, #root {
8955
9225
 
8956
9226
  .remote-error {
8957
9227
  font-size: 13px;
8958
- color: #f7768e;
9228
+ color: var(--danger);
8959
9229
  margin-bottom: 4px;
8960
9230
  }
8961
9231
 
@@ -8971,7 +9241,7 @@ html, body, #root {
8971
9241
  .remote-pw-hint {
8972
9242
  margin-top: 6px;
8973
9243
  font-size: 10px;
8974
- color: #565f89;
9244
+ color: var(--text-muted);
8975
9245
  text-align: left;
8976
9246
  }
8977
9247
 
@@ -8979,7 +9249,7 @@ html, body, #root {
8979
9249
  .settings-overlay {
8980
9250
  position: fixed;
8981
9251
  inset: 0;
8982
- background: rgba(0, 0, 0, 0.6);
9252
+ background: var(--overlay-bg);
8983
9253
  display: flex;
8984
9254
  align-items: center;
8985
9255
  justify-content: center;
@@ -8987,8 +9257,8 @@ html, body, #root {
8987
9257
  }
8988
9258
 
8989
9259
  .settings-dialog {
8990
- background: #1f2335;
8991
- border: 1px solid #3b3d57;
9260
+ background: var(--bg-raised);
9261
+ border: 1px solid var(--border);
8992
9262
  border-radius: 8px;
8993
9263
  padding: 24px;
8994
9264
  width: 480px;
@@ -8997,23 +9267,23 @@ html, body, #root {
8997
9267
  }
8998
9268
 
8999
9269
  .settings-dialog h3 {
9000
- color: #c0caf5;
9270
+ color: var(--text-bright);
9001
9271
  margin-bottom: 16px;
9002
9272
  font-size: 16px;
9003
9273
  }
9004
9274
 
9005
9275
  /* About section inside the Settings dialog. */
9006
9276
  .settings-about {
9007
- border-top: 1px solid #2a2b3d;
9277
+ border-top: 1px solid var(--border-subtle);
9008
9278
  padding-top: 16px;
9009
9279
  }
9010
9280
  .settings-about .about-name {
9011
- color: #c0caf5;
9281
+ color: var(--text-bright);
9012
9282
  font-size: 14px;
9013
9283
  font-weight: 600;
9014
9284
  }
9015
9285
  .settings-about .about-copyright {
9016
- color: #9aa5ce;
9286
+ color: var(--text-soft);
9017
9287
  font-size: 12px;
9018
9288
  margin: 6px 0 8px;
9019
9289
  }
@@ -9023,13 +9293,13 @@ html, body, #root {
9023
9293
  }
9024
9294
 
9025
9295
  .settings-section h4 {
9026
- color: #a9b1d6;
9296
+ color: var(--text);
9027
9297
  font-size: 13px;
9028
9298
  margin-bottom: 8px;
9029
9299
  }
9030
9300
 
9031
9301
  .settings-hint {
9032
- color: #565f89;
9302
+ color: var(--text-muted);
9033
9303
  font-size: 11px;
9034
9304
  display: block;
9035
9305
  margin-bottom: 12px;
@@ -9037,7 +9307,7 @@ html, body, #root {
9037
9307
 
9038
9308
  .settings-dialog label {
9039
9309
  display: block;
9040
- color: #a9b1d6;
9310
+ color: var(--text);
9041
9311
  font-size: 12px;
9042
9312
  margin-bottom: 12px;
9043
9313
  }
@@ -9047,21 +9317,139 @@ html, body, #root {
9047
9317
  width: 100%;
9048
9318
  margin-top: 4px;
9049
9319
  padding: 6px 10px;
9050
- background: #16161e;
9051
- border: 1px solid #3b3d57;
9320
+ background: var(--bg-chrome);
9321
+ border: 1px solid var(--border);
9052
9322
  border-radius: 4px;
9053
- color: #a9b1d6;
9323
+ color: var(--text);
9054
9324
  font-size: 13px;
9055
9325
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
9056
9326
  }
9057
9327
 
9058
9328
  .settings-dialog input:focus {
9059
9329
  outline: none;
9060
- border-color: #7aa2f7;
9330
+ border-color: var(--accent);
9061
9331
  }
9062
9332
 
9063
9333
  .settings-dialog input::placeholder {
9064
- color: #414868;
9334
+ color: var(--text-dim);
9335
+ }
9336
+
9337
+ /* Checkbox rows: <input><span>label</span><span class="settings-hint">.
9338
+ The class was used by the dialog but never styled, so the box inherited the
9339
+ full-width text-input rule above and rendered stretched and centred above its
9340
+ own label. Two columns: the box, then label on row 1 and hint on row 2. */
9341
+ .settings-checkbox {
9342
+ display: grid;
9343
+ grid-template-columns: auto 1fr;
9344
+ align-items: center;
9345
+ column-gap: 8px;
9346
+ cursor: pointer;
9347
+ }
9348
+
9349
+ .settings-checkbox input[type='checkbox'] {
9350
+ display: inline-block;
9351
+ width: auto;
9352
+ margin: 0;
9353
+ padding: 0;
9354
+ accent-color: var(--accent);
9355
+ cursor: pointer;
9356
+ }
9357
+
9358
+ .settings-checkbox > span {
9359
+ grid-column: 2;
9360
+ }
9361
+
9362
+ .settings-checkbox .settings-hint {
9363
+ margin-top: 2px;
9364
+ margin-bottom: 0;
9365
+ }
9366
+
9367
+ /* Appearance picker — a swatch tile per scheme, grouped by mode when syncing. */
9368
+ .theme-group-label {
9369
+ font-size: 10px;
9370
+ font-weight: 600;
9371
+ letter-spacing: 0.06em;
9372
+ text-transform: uppercase;
9373
+ color: var(--text-muted);
9374
+ margin: 10px 0 6px;
9375
+ }
9376
+
9377
+ .theme-options {
9378
+ display: grid;
9379
+ grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
9380
+ gap: 8px;
9381
+ margin-bottom: 8px;
9382
+ }
9383
+
9384
+ .theme-option {
9385
+ display: flex;
9386
+ flex-direction: column;
9387
+ align-items: stretch;
9388
+ gap: 7px;
9389
+ padding: 8px 8px 7px;
9390
+ background: var(--bg-chrome);
9391
+ border: 1px solid var(--border-subtle);
9392
+ border-radius: 8px;
9393
+ color: var(--text-muted);
9394
+ font-family: inherit;
9395
+ font-size: 11.5px;
9396
+ text-align: center;
9397
+ cursor: pointer;
9398
+ transition: border-color 0.13s ease, color 0.13s ease;
9399
+ }
9400
+
9401
+ .theme-option:hover {
9402
+ border-color: var(--border-strong);
9403
+ color: var(--text);
9404
+ }
9405
+
9406
+ .theme-option.active {
9407
+ border-color: var(--accent);
9408
+ color: var(--text-bright);
9409
+ font-weight: 600;
9410
+ }
9411
+
9412
+ /* A miniature of the scheme: background, a surface bar, an accent dot and a
9413
+ text line. Colours come from the theme's own palette via inline styles, so
9414
+ this must not reference the token layer. */
9415
+ .theme-swatch {
9416
+ position: relative;
9417
+ display: block;
9418
+ height: 38px;
9419
+ border-radius: 5px;
9420
+ border: 1px solid var(--border);
9421
+ overflow: hidden;
9422
+ }
9423
+
9424
+ .theme-swatch-bar {
9425
+ position: absolute;
9426
+ inset: 0 0 auto 0;
9427
+ height: 9px;
9428
+ }
9429
+
9430
+ .theme-swatch-dot {
9431
+ position: absolute;
9432
+ left: 7px;
9433
+ top: 16px;
9434
+ width: 8px;
9435
+ height: 8px;
9436
+ border-radius: 50%;
9437
+ }
9438
+
9439
+ .theme-swatch-line {
9440
+ position: absolute;
9441
+ left: 20px;
9442
+ top: 19px;
9443
+ right: 8px;
9444
+ height: 3px;
9445
+ border-radius: 2px;
9446
+ opacity: 0.65;
9447
+ }
9448
+
9449
+ .theme-option-label {
9450
+ overflow: hidden;
9451
+ text-overflow: ellipsis;
9452
+ white-space: nowrap;
9065
9453
  }
9066
9454
 
9067
9455
  .settings-actions {
@@ -9080,23 +9468,23 @@ html, body, #root {
9080
9468
  }
9081
9469
 
9082
9470
  .btn-primary {
9083
- background: #7aa2f7;
9084
- color: #1a1b26;
9085
- border-color: #7aa2f7;
9471
+ background: var(--accent);
9472
+ color: var(--on-accent);
9473
+ border-color: var(--accent);
9086
9474
  }
9087
9475
 
9088
9476
  .btn-primary:hover {
9089
- background: #89b4fa;
9477
+ background: var(--accent-hover);
9090
9478
  }
9091
9479
 
9092
9480
  .btn-secondary {
9093
- background: #2a2b3d;
9094
- color: #a9b1d6;
9095
- border-color: #3b3d57;
9481
+ background: var(--bg-surface);
9482
+ color: var(--text);
9483
+ border-color: var(--border);
9096
9484
  }
9097
9485
 
9098
9486
  .btn-secondary:hover {
9099
- border-color: #565f89;
9487
+ border-color: var(--border-strong);
9100
9488
  }
9101
9489
 
9102
9490
  .btn-ghost {
@@ -9106,16 +9494,16 @@ html, body, #root {
9106
9494
  cursor: pointer;
9107
9495
  border: none;
9108
9496
  background: transparent;
9109
- color: #565f89;
9497
+ color: var(--text-muted);
9110
9498
  }
9111
9499
 
9112
9500
  .btn-ghost:hover {
9113
- background: #2a2b3d;
9114
- color: #a9b1d6;
9501
+ background: var(--bg-surface);
9502
+ color: var(--text);
9115
9503
  }
9116
9504
 
9117
9505
  .btn-danger:hover {
9118
- color: #f7768e;
9506
+ color: var(--danger);
9119
9507
  }
9120
9508
 
9121
9509
  /* Profile list */
@@ -9132,18 +9520,18 @@ html, body, #root {
9132
9520
  justify-content: space-between;
9133
9521
  padding: 8px 12px;
9134
9522
  border-radius: 6px;
9135
- border: 1px solid #2a2b3d;
9523
+ border: 1px solid var(--border-subtle);
9136
9524
  cursor: pointer;
9137
9525
  transition: border-color 0.15s;
9138
9526
  }
9139
9527
 
9140
9528
  .profile-item:hover {
9141
- border-color: #3b3d57;
9529
+ border-color: var(--border);
9142
9530
  }
9143
9531
 
9144
9532
  .profile-item.active {
9145
- border-color: #7aa2f7;
9146
- background: rgba(122, 162, 247, 0.05);
9533
+ border-color: var(--accent);
9534
+ background: color-mix(in srgb, var(--accent) 5%, transparent);
9147
9535
  }
9148
9536
 
9149
9537
  .profile-info {
@@ -9157,22 +9545,22 @@ html, body, #root {
9157
9545
  width: 8px;
9158
9546
  height: 8px;
9159
9547
  border-radius: 50%;
9160
- background: #3b3d57;
9548
+ background: var(--border);
9161
9549
  flex-shrink: 0;
9162
9550
  }
9163
9551
 
9164
9552
  .profile-dot.active {
9165
- background: #9ece6a;
9553
+ background: var(--success);
9166
9554
  }
9167
9555
 
9168
9556
  .profile-name {
9169
- color: #c0caf5;
9557
+ color: var(--text-bright);
9170
9558
  font-size: 13px;
9171
9559
  font-weight: 500;
9172
9560
  }
9173
9561
 
9174
9562
  .profile-url {
9175
- color: #565f89;
9563
+ color: var(--text-muted);
9176
9564
  font-size: 11px;
9177
9565
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
9178
9566
  }
@@ -9190,7 +9578,7 @@ html, body, #root {
9190
9578
  flex-direction: column;
9191
9579
  height: 100%;
9192
9580
  min-height: 0;
9193
- background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
9581
+ background: linear-gradient(180deg, var(--ticket-grad-top) 0%, var(--ticket-grad-bot) 100%);
9194
9582
  }
9195
9583
 
9196
9584
  /* ── header ── */
@@ -9199,7 +9587,7 @@ html, body, #root {
9199
9587
  align-items: flex-start;
9200
9588
  justify-content: space-between;
9201
9589
  padding: 16px 16px 14px;
9202
- border-bottom: 1px solid #2a2b3d;
9590
+ border-bottom: 1px solid var(--border-subtle);
9203
9591
  }
9204
9592
  .ticket-drawer-heading {
9205
9593
  display: flex;
@@ -9210,8 +9598,8 @@ html, body, #root {
9210
9598
  width: 34px;
9211
9599
  height: 34px;
9212
9600
  border-radius: 9px;
9213
- background: rgba(122, 162, 247, 0.14);
9214
- border: 1px solid rgba(122, 162, 247, 0.3);
9601
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
9602
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
9215
9603
  display: flex;
9216
9604
  align-items: center;
9217
9605
  justify-content: center;
@@ -9226,15 +9614,15 @@ html, body, #root {
9226
9614
  .ticket-drawer-title {
9227
9615
  font-size: 14px;
9228
9616
  font-weight: 650;
9229
- color: #d5dbf5;
9617
+ color: var(--text-ticket);
9230
9618
  letter-spacing: 0.01em;
9231
9619
  }
9232
9620
  .ticket-drawer-subtitle {
9233
9621
  font-size: 11.5px;
9234
- color: #6b739b;
9622
+ color: var(--text-ticket-muted);
9235
9623
  }
9236
9624
  .ticket-drawer-subtitle strong {
9237
- color: #7aa2f7;
9625
+ color: var(--accent);
9238
9626
  font-weight: 600;
9239
9627
  }
9240
9628
  /* "+ New" action in the header (replaces the old footer button). */
@@ -9246,9 +9634,9 @@ html, body, #root {
9246
9634
  gap: 3px;
9247
9635
  padding: 5px 11px;
9248
9636
  border-radius: 7px;
9249
- background: rgba(122, 162, 247, 0.14);
9250
- border: 1px solid rgba(122, 162, 247, 0.3);
9251
- color: #9db4f5;
9637
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
9638
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
9639
+ color: var(--accent-soft);
9252
9640
  font-family: inherit;
9253
9641
  font-size: 12px;
9254
9642
  font-weight: 600;
@@ -9256,15 +9644,15 @@ html, body, #root {
9256
9644
  transition: background 0.13s ease, border-color 0.13s ease, color 0.13s ease, transform 0.06s ease;
9257
9645
  }
9258
9646
  .ticket-drawer-new:hover {
9259
- background: rgba(122, 162, 247, 0.22);
9260
- border-color: rgba(122, 162, 247, 0.5);
9261
- color: #c0d0fb;
9647
+ background: color-mix(in srgb, var(--accent) 22%, transparent);
9648
+ border-color: color-mix(in srgb, var(--accent) 50%, transparent);
9649
+ color: var(--accent-softer);
9262
9650
  }
9263
9651
  .ticket-drawer-new:active {
9264
9652
  transform: translateY(1px);
9265
9653
  }
9266
9654
  .ticket-drawer-warn {
9267
- color: #e0af68;
9655
+ color: var(--warning);
9268
9656
  }
9269
9657
  /* ── body ── */
9270
9658
  .ticket-drawer-body {
@@ -9284,17 +9672,17 @@ html, body, #root {
9284
9672
  .ticket-field-label {
9285
9673
  font-size: 10.5px;
9286
9674
  font-weight: 600;
9287
- color: #6b739b;
9675
+ color: var(--text-ticket-muted);
9288
9676
  text-transform: uppercase;
9289
9677
  letter-spacing: 0.07em;
9290
9678
  }
9291
9679
 
9292
9680
  .ticket-field input,
9293
9681
  .ticket-field textarea {
9294
- background: #15161f;
9295
- border: 1px solid #2a2b3d;
9682
+ background: var(--bg-well);
9683
+ border: 1px solid var(--border-subtle);
9296
9684
  border-radius: 8px;
9297
- color: #d5dbf5;
9685
+ color: var(--text-ticket);
9298
9686
  font-size: 13px;
9299
9687
  font-family: inherit;
9300
9688
  padding: 9px 11px;
@@ -9303,12 +9691,12 @@ html, body, #root {
9303
9691
  }
9304
9692
  .ticket-field input::placeholder,
9305
9693
  .ticket-field textarea::placeholder {
9306
- color: #4a4f6e;
9694
+ color: var(--text-placeholder);
9307
9695
  }
9308
9696
  .ticket-field input:focus,
9309
9697
  .ticket-field textarea:focus {
9310
- border-color: #7aa2f7;
9311
- box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.13);
9698
+ border-color: var(--accent);
9699
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent);
9312
9700
  }
9313
9701
  .ticket-input-title {
9314
9702
  font-size: 14px !important;
@@ -9329,10 +9717,10 @@ html, body, #root {
9329
9717
  display: inline-flex;
9330
9718
  align-items: center;
9331
9719
  gap: 6px;
9332
- background: #15161f;
9333
- border: 1px solid #2a2b3d;
9720
+ background: var(--bg-well);
9721
+ border: 1px solid var(--border-subtle);
9334
9722
  border-radius: 999px;
9335
- color: #8088ac;
9723
+ color: var(--text-ticket-dim);
9336
9724
  font-size: 12px;
9337
9725
  font-family: inherit;
9338
9726
  font-weight: 550;
@@ -9341,8 +9729,8 @@ html, body, #root {
9341
9729
  transition: background 0.13s ease, border-color 0.13s ease, color 0.13s ease;
9342
9730
  }
9343
9731
  .ticket-seg:hover {
9344
- border-color: #3b3d57;
9345
- color: #c0caf5;
9732
+ border-color: var(--border);
9733
+ color: var(--text-bright);
9346
9734
  }
9347
9735
  .ticket-seg-dot {
9348
9736
  width: 7px;
@@ -9355,9 +9743,9 @@ html, body, #root {
9355
9743
  }
9356
9744
 
9357
9745
  .ticket-drawer-error {
9358
- background: rgba(247, 118, 142, 0.13);
9359
- border: 1px solid rgba(247, 118, 142, 0.38);
9360
- color: #f7768e;
9746
+ background: color-mix(in srgb, var(--danger) 13%, transparent);
9747
+ border: 1px solid color-mix(in srgb, var(--danger) 38%, transparent);
9748
+ color: var(--danger);
9361
9749
  font-size: 12px;
9362
9750
  border-radius: 8px;
9363
9751
  padding: 8px 10px;
@@ -9370,12 +9758,12 @@ html, body, #root {
9370
9758
  justify-content: space-between;
9371
9759
  gap: 8px;
9372
9760
  padding: 12px 16px;
9373
- border-top: 1px solid #2a2b3d;
9374
- background: rgba(13, 14, 22, 0.35);
9761
+ border-top: 1px solid var(--border-subtle);
9762
+ background: var(--footer-veil);
9375
9763
  }
9376
9764
  .ticket-drawer-hint {
9377
9765
  font-size: 11px;
9378
- color: #565f89;
9766
+ color: var(--text-muted);
9379
9767
  }
9380
9768
  .ticket-drawer-footer-btns {
9381
9769
  display: flex;
@@ -9393,20 +9781,20 @@ html, body, #root {
9393
9781
  }
9394
9782
  .ticket-btn-secondary {
9395
9783
  background: transparent;
9396
- color: #c0caf5;
9397
- border: 1px solid #2a2b3d;
9784
+ color: var(--text-bright);
9785
+ border: 1px solid var(--border-subtle);
9398
9786
  }
9399
9787
  .ticket-btn-secondary:hover {
9400
- background: rgba(255, 255, 255, 0.05);
9401
- border-color: #3b3d57;
9788
+ background: var(--hover-veil);
9789
+ border-color: var(--border);
9402
9790
  }
9403
9791
  .ticket-btn-primary {
9404
- background: linear-gradient(180deg, #8db0fa 0%, #7aa2f7 100%);
9405
- color: #11131f;
9406
- border: 1px solid #7aa2f7;
9792
+ background: linear-gradient(180deg, var(--accent-grad-top) 0%, var(--accent) 100%);
9793
+ color: var(--on-accent);
9794
+ border: 1px solid var(--accent);
9407
9795
  }
9408
9796
  .ticket-btn-primary:hover:not(:disabled) {
9409
- background: linear-gradient(180deg, #9bbcfb 0%, #89b4fa 100%);
9797
+ background: linear-gradient(180deg, var(--accent-grad-top-hi) 0%, var(--accent-hover) 100%);
9410
9798
  }
9411
9799
  .ticket-btn-primary:active:not(:disabled) {
9412
9800
  transform: translateY(1px);
@@ -9425,15 +9813,15 @@ html, body, #root {
9425
9813
 
9426
9814
  /* ── drawer badge / back button ── */
9427
9815
  .ticket-drawer-badge {
9428
- color: #7aa2f7;
9816
+ color: var(--accent);
9429
9817
  }
9430
9818
  .ticket-drawer-back {
9431
9819
  width: 34px;
9432
9820
  height: 34px;
9433
9821
  border-radius: 9px;
9434
- background: rgba(122, 162, 247, 0.1);
9435
- border: 1px solid rgba(122, 162, 247, 0.28);
9436
- color: #7aa2f7;
9822
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
9823
+ border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
9824
+ color: var(--accent);
9437
9825
  font-size: 22px;
9438
9826
  line-height: 1;
9439
9827
  cursor: pointer;
@@ -9441,7 +9829,7 @@ html, body, #root {
9441
9829
  transition: background 0.12s ease;
9442
9830
  }
9443
9831
  .ticket-drawer-back:hover {
9444
- background: rgba(122, 162, 247, 0.2);
9832
+ background: color-mix(in srgb, var(--accent) 20%, transparent);
9445
9833
  }
9446
9834
 
9447
9835
  /* ── ticket list ── */
@@ -9454,7 +9842,7 @@ html, body, #root {
9454
9842
  gap: 7px;
9455
9843
  }
9456
9844
  .ticket-list-msg {
9457
- color: #6b739b;
9845
+ color: var(--text-ticket-muted);
9458
9846
  font-size: 12.5px;
9459
9847
  padding: 16px 4px;
9460
9848
  text-align: center;
@@ -9470,8 +9858,8 @@ html, body, #root {
9470
9858
  padding: 7px 4px;
9471
9859
  background: none;
9472
9860
  border: none;
9473
- border-top: 1px solid #262a3f;
9474
- color: #6b739b;
9861
+ border-top: 1px solid var(--border-well);
9862
+ color: var(--text-ticket-muted);
9475
9863
  font-family: inherit;
9476
9864
  font-size: 11.5px;
9477
9865
  font-weight: 600;
@@ -9481,7 +9869,7 @@ html, body, #root {
9481
9869
  transition: color 0.13s ease;
9482
9870
  }
9483
9871
  .ticket-done-toggle:hover {
9484
- color: #a9b1d6;
9872
+ color: var(--text);
9485
9873
  }
9486
9874
  .ticket-done-caret {
9487
9875
  display: inline-block;
@@ -9496,8 +9884,8 @@ html, body, #root {
9496
9884
  min-width: 18px;
9497
9885
  padding: 1px 6px;
9498
9886
  border-radius: 9px;
9499
- background: #262a3f;
9500
- color: #8088ac;
9887
+ background: var(--bg-chip);
9888
+ color: var(--text-ticket-dim);
9501
9889
  font-size: 11px;
9502
9890
  font-weight: 600;
9503
9891
  text-align: center;
@@ -9512,32 +9900,32 @@ html, body, #root {
9512
9900
  text-align: center;
9513
9901
  }
9514
9902
  .ticket-empty-icon {
9515
- color: #3b3d57;
9903
+ color: var(--text-dim);
9516
9904
  margin-bottom: 4px;
9517
9905
  }
9518
9906
  .ticket-empty-title {
9519
9907
  font-size: 13.5px;
9520
9908
  font-weight: 600;
9521
- color: #8088ac;
9909
+ color: var(--text-ticket-dim);
9522
9910
  }
9523
9911
  .ticket-empty-hint {
9524
9912
  font-size: 12px;
9525
- color: #565f89;
9913
+ color: var(--text-muted);
9526
9914
  }
9527
9915
 
9528
9916
  /* ── ticket card ── */
9529
9917
  .ticket-card {
9530
9918
  display: flex;
9531
9919
  align-items: stretch;
9532
- background: #15161f;
9533
- border: 1px solid #262a3f;
9920
+ background: var(--bg-well);
9921
+ border: 1px solid var(--border-well);
9534
9922
  border-radius: 10px;
9535
9923
  overflow: hidden;
9536
9924
  transition: border-color 0.13s ease, background 0.13s ease;
9537
9925
  }
9538
9926
  .ticket-card:hover {
9539
- border-color: #3d425f;
9540
- background: #181a26;
9927
+ border-color: var(--border-hover);
9928
+ background: var(--bg-well-hi);
9541
9929
  }
9542
9930
  /* Clickable body of the card — opens the editor. */
9543
9931
  .ticket-card-open {
@@ -9568,14 +9956,14 @@ html, body, #root {
9568
9956
  justify-content: center;
9569
9957
  background: transparent;
9570
9958
  border: none;
9571
- border-left: 1px solid #262a3f;
9572
- color: #565f89;
9959
+ border-left: 1px solid var(--border-well);
9960
+ color: var(--text-muted);
9573
9961
  cursor: pointer;
9574
9962
  transition: background 0.13s ease, color 0.13s ease, transform 0.06s ease;
9575
9963
  }
9576
9964
  .ticket-card-send:hover {
9577
- background: #1b2030;
9578
- color: #7aa2f7;
9965
+ background: var(--bg-inset-hi);
9966
+ color: var(--accent);
9579
9967
  }
9580
9968
  .ticket-card-send:active {
9581
9969
  transform: scale(0.9);
@@ -9596,7 +9984,7 @@ html, body, #root {
9596
9984
  .ticket-card-title {
9597
9985
  font-size: 13px;
9598
9986
  font-weight: 550;
9599
- color: #d5dbf5;
9987
+ color: var(--text-ticket);
9600
9988
  white-space: nowrap;
9601
9989
  overflow: hidden;
9602
9990
  text-overflow: ellipsis;
@@ -9615,7 +10003,7 @@ html, body, #root {
9615
10003
  }
9616
10004
  .ticket-card-date {
9617
10005
  font-size: 11px;
9618
- color: #565f89;
10006
+ color: var(--text-muted);
9619
10007
  }
9620
10008
  .ticket-card-pri {
9621
10009
  align-self: center;
@@ -9632,11 +10020,11 @@ html, body, #root {
9632
10020
  /* ─── Terminal "Copy as email table" context menu + toast ─── */
9633
10021
  .term-context-menu {
9634
10022
  z-index: 1000;
9635
- background: #1f2335;
9636
- border: 1px solid #414868;
10023
+ background: var(--bg-raised);
10024
+ border: 1px solid var(--border-dim);
9637
10025
  border-radius: 6px;
9638
10026
  padding: 4px;
9639
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
10027
+ box-shadow: 0 8px 24px var(--shadow-color);
9640
10028
  min-width: 180px;
9641
10029
  }
9642
10030
  .term-context-menu button {
@@ -9646,13 +10034,13 @@ html, body, #root {
9646
10034
  background: transparent;
9647
10035
  border: none;
9648
10036
  border-radius: 4px;
9649
- color: #c0caf5;
10037
+ color: var(--text-bright);
9650
10038
  font-size: 13px;
9651
10039
  padding: 7px 10px;
9652
10040
  cursor: pointer;
9653
10041
  }
9654
10042
  .term-context-menu button:hover {
9655
- background: #2a2b3d;
10043
+ background: var(--bg-surface);
9656
10044
  }
9657
10045
  /* Always-visible utility button (top-right) — opens the snapshot panel. */
9658
10046
  .term-util-btn {
@@ -9666,9 +10054,9 @@ html, body, #root {
9666
10054
  align-items: center;
9667
10055
  justify-content: center;
9668
10056
  border-radius: 6px;
9669
- background: #2a2b3d;
9670
- border: 1px solid #414868;
9671
- color: #c0caf5;
10057
+ background: var(--bg-surface);
10058
+ border: 1px solid var(--border-dim);
10059
+ color: var(--text-bright);
9672
10060
  font-size: 16px;
9673
10061
  line-height: 1;
9674
10062
  cursor: pointer;
@@ -9677,7 +10065,7 @@ html, body, #root {
9677
10065
  }
9678
10066
  .term-util-btn:hover {
9679
10067
  opacity: 1;
9680
- background: #343650;
10068
+ background: var(--bg-surface-hi);
9681
10069
  }
9682
10070
 
9683
10071
  /* Snapshot panel: a frozen, selectable copy of the screen text. */
@@ -9687,8 +10075,8 @@ html, body, #root {
9687
10075
  z-index: 20;
9688
10076
  display: flex;
9689
10077
  flex-direction: column;
9690
- background: #16161e;
9691
- border: 1px solid #414868;
10078
+ background: var(--bg-chrome);
10079
+ border: 1px solid var(--border-dim);
9692
10080
  }
9693
10081
  .term-snapshot-head {
9694
10082
  display: flex;
@@ -9696,23 +10084,23 @@ html, body, #root {
9696
10084
  justify-content: space-between;
9697
10085
  gap: 12px;
9698
10086
  padding: 8px 12px;
9699
- background: #1f2335;
9700
- border-bottom: 1px solid #414868;
9701
- color: #9aa5ce;
10087
+ background: var(--bg-raised);
10088
+ border-bottom: 1px solid var(--border-dim);
10089
+ color: var(--text-soft);
9702
10090
  font-size: 12px;
9703
10091
  }
9704
10092
  .term-snapshot-x {
9705
10093
  background: transparent;
9706
10094
  border: none;
9707
- color: #9aa5ce;
10095
+ color: var(--text-soft);
9708
10096
  font-size: 14px;
9709
10097
  cursor: pointer;
9710
10098
  padding: 2px 6px;
9711
10099
  border-radius: 4px;
9712
10100
  }
9713
10101
  .term-snapshot-x:hover {
9714
- background: #2a2b3d;
9715
- color: #c0caf5;
10102
+ background: var(--bg-surface);
10103
+ color: var(--text-bright);
9716
10104
  }
9717
10105
  .term-snapshot-text {
9718
10106
  flex: 1;
@@ -9723,33 +10111,33 @@ html, body, #root {
9723
10111
  white-space: pre;
9724
10112
  user-select: text;
9725
10113
  cursor: text;
9726
- color: #c0caf5;
9727
- background: #16161e;
10114
+ color: var(--text-bright);
10115
+ background: var(--bg-chrome);
9728
10116
  font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
9729
10117
  font-size: 13px;
9730
10118
  line-height: 1.4;
9731
10119
  }
9732
10120
  .term-snapshot-text::selection {
9733
- background: #33467c;
10121
+ background: var(--selection-bg);
9734
10122
  }
9735
10123
  .term-snapshot-actions {
9736
10124
  display: flex;
9737
10125
  gap: 6px;
9738
10126
  padding: 8px 12px;
9739
- background: #1f2335;
9740
- border-top: 1px solid #414868;
10127
+ background: var(--bg-raised);
10128
+ border-top: 1px solid var(--border-dim);
9741
10129
  }
9742
10130
  .term-snapshot-actions button {
9743
- background: #2a2b3d;
9744
- border: 1px solid #414868;
10131
+ background: var(--bg-surface);
10132
+ border: 1px solid var(--border-dim);
9745
10133
  border-radius: 5px;
9746
- color: #c0caf5;
10134
+ color: var(--text-bright);
9747
10135
  font-size: 12.5px;
9748
10136
  padding: 6px 12px;
9749
10137
  cursor: pointer;
9750
10138
  }
9751
10139
  .term-snapshot-actions button:hover {
9752
- background: #343650;
10140
+ background: var(--bg-surface-hi);
9753
10141
  }
9754
10142
  .term-snapshot-done {
9755
10143
  margin-left: auto;
@@ -9759,13 +10147,13 @@ html, body, #root {
9759
10147
  bottom: 24px;
9760
10148
  right: 24px;
9761
10149
  z-index: 1000;
9762
- background: #1f2335;
9763
- border: 1px solid #7aa2f7;
9764
- color: #c0caf5;
10150
+ background: var(--bg-raised);
10151
+ border: 1px solid var(--accent);
10152
+ color: var(--text-bright);
9765
10153
  font-size: 13px;
9766
10154
  padding: 9px 14px;
9767
10155
  border-radius: 6px;
9768
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
10156
+ box-shadow: 0 8px 24px var(--shadow-color);
9769
10157
  pointer-events: none;
9770
10158
  }
9771
10159
 
@@ -9776,16 +10164,16 @@ html, body, #root {
9776
10164
  .observer-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
9777
10165
  .observer-switch-track {
9778
10166
  width: 34px; height: 19px; border-radius: 10px;
9779
- background: #3b4261; position: relative; transition: background 0.15s ease;
10167
+ background: var(--switch-track); position: relative; transition: background 0.15s ease;
9780
10168
  display: inline-block; flex-shrink: 0;
9781
10169
  }
9782
10170
  .observer-switch-thumb {
9783
10171
  position: absolute; top: 2px; left: 2px; width: 15px; height: 15px;
9784
- border-radius: 50%; background: #c0caf5; transition: transform 0.15s ease;
10172
+ border-radius: 50%; background: var(--switch-thumb); transition: transform 0.15s ease;
9785
10173
  }
9786
- .observer-switch input:checked + .observer-switch-track { background: #9ece6a; }
10174
+ .observer-switch input:checked + .observer-switch-track { background: var(--success); }
9787
10175
  .observer-switch input:checked + .observer-switch-track .observer-switch-thumb {
9788
- transform: translateX(15px); background: #1a1b26;
10176
+ transform: translateX(15px); background: var(--on-accent);
9789
10177
  }
9790
10178
  .observer-switch input:disabled + .observer-switch-track { opacity: 0.5; }
9791
10179
 
@@ -9803,14 +10191,14 @@ html, body, #root {
9803
10191
  font: inherit;
9804
10192
  color: inherit;
9805
10193
  cursor: pointer;
9806
- background: #15161f;
9807
- border: 1px solid #262a3f;
9808
- border-left: 3px solid #565f89;
10194
+ background: var(--bg-well);
10195
+ border: 1px solid var(--border-well);
10196
+ border-left: 3px solid var(--border-strong);
9809
10197
  border-radius: 9px;
9810
10198
  padding: 9px 26px 9px 12px;
9811
10199
  transition: border-color 0.12s ease, background 0.12s ease;
9812
10200
  }
9813
- .obs-card:hover { background: #181a26; border-color: #323752; border-left-width: 3px; }
10201
+ .obs-card:hover { background: var(--bg-well-hi); border-color: var(--border-hover); border-left-width: 3px; }
9814
10202
  .obs-card:active { transform: scale(0.995); }
9815
10203
 
9816
10204
  .obs-card-top {
@@ -9836,7 +10224,7 @@ html, body, #root {
9836
10224
  .obs-chip-dot { width: 5px; height: 5px; border-radius: 50%; flex-shrink: 0; }
9837
10225
  .obs-card-cat {
9838
10226
  font-size: 10px;
9839
- color: #565f89;
10227
+ color: var(--text-muted);
9840
10228
  letter-spacing: 0.05em;
9841
10229
  text-transform: uppercase;
9842
10230
  white-space: nowrap;
@@ -9847,19 +10235,19 @@ html, body, #root {
9847
10235
  margin-left: auto;
9848
10236
  flex-shrink: 0;
9849
10237
  font-size: 10px;
9850
- color: #414868;
10238
+ color: var(--text-dim);
9851
10239
  font-variant-numeric: tabular-nums;
9852
10240
  }
9853
10241
  .obs-card-title {
9854
10242
  font-size: 12.5px;
9855
10243
  font-weight: 600;
9856
- color: #c0caf5;
10244
+ color: var(--text-bright);
9857
10245
  line-height: 1.4;
9858
10246
  word-break: break-word;
9859
10247
  }
9860
10248
  .obs-card-body {
9861
10249
  font-size: 11.5px;
9862
- color: #9aa5ce;
10250
+ color: var(--text-soft);
9863
10251
  line-height: 1.5;
9864
10252
  word-break: break-word;
9865
10253
  }
@@ -9867,9 +10255,9 @@ html, body, #root {
9867
10255
  .obs-card-facts { display: flex; flex-wrap: wrap; gap: 6px; }
9868
10256
  .obs-fact {
9869
10257
  font-size: 10px;
9870
- color: #565f89;
9871
- background: #1c1e2b;
9872
- border: 1px solid #262a3f;
10258
+ color: var(--text-muted);
10259
+ background: var(--bg-chip-soft);
10260
+ border: 1px solid var(--border-well);
9873
10261
  border-radius: 5px;
9874
10262
  padding: 1px 6px;
9875
10263
  font-variant-numeric: tabular-nums;
@@ -9879,7 +10267,7 @@ html, body, #root {
9879
10267
  right: 10px;
9880
10268
  top: 10px;
9881
10269
  font-size: 10px;
9882
- color: #414868;
10270
+ color: var(--text-dim);
9883
10271
  transition: transform 0.12s ease;
9884
10272
  }
9885
10273
  .obs-card-caret.open { transform: rotate(90deg); }
@@ -9891,24 +10279,24 @@ html, body, #root {
9891
10279
  gap: 8px;
9892
10280
  padding: 3px 12px 3px 14px;
9893
10281
  font-size: 11px;
9894
- color: #565f89;
10282
+ color: var(--text-muted);
9895
10283
  line-height: 1.45;
9896
10284
  }
9897
10285
  .obs-line-dot {
9898
10286
  flex-shrink: 0;
9899
10287
  width: 4px; height: 4px;
9900
10288
  border-radius: 50%;
9901
- background: #3b4261;
10289
+ background: var(--switch-track);
9902
10290
  align-self: center;
9903
10291
  }
9904
- .obs-line.health { color: #e0af68; }
9905
- .obs-line.health .obs-line-dot { background: #e0af68; }
10292
+ .obs-line.health { color: var(--warning); }
10293
+ .obs-line.health .obs-line-dot { background: var(--warning); }
9906
10294
  .obs-line-text { min-width: 0; word-break: break-word; }
9907
10295
  .obs-line-time {
9908
10296
  margin-left: auto;
9909
10297
  flex-shrink: 0;
9910
10298
  font-size: 10px;
9911
- color: #414868;
10299
+ color: var(--text-dim);
9912
10300
  font-variant-numeric: tabular-nums;
9913
10301
  }
9914
10302
 
@@ -9919,12 +10307,12 @@ html, body, #root {
9919
10307
  justify-content: space-between;
9920
10308
  gap: 10px;
9921
10309
  padding: 8px 14px;
9922
- border-bottom: 1px solid #23263a;
10310
+ border-bottom: 1px solid var(--border-well);
9923
10311
  }
9924
10312
  .obs-sensitivity {
9925
10313
  display: inline-flex;
9926
- background: #15161f;
9927
- border: 1px solid #262a3f;
10314
+ background: var(--bg-well);
10315
+ border: 1px solid var(--border-well);
9928
10316
  border-radius: 7px;
9929
10317
  padding: 2px;
9930
10318
  gap: 2px;
@@ -9933,7 +10321,7 @@ html, body, #root {
9933
10321
  appearance: none;
9934
10322
  border: none;
9935
10323
  background: transparent;
9936
- color: #565f89;
10324
+ color: var(--text-muted);
9937
10325
  font: inherit;
9938
10326
  font-size: 10.5px;
9939
10327
  font-weight: 600;
@@ -9943,8 +10331,8 @@ html, body, #root {
9943
10331
  transition: background 0.12s ease, color 0.12s ease;
9944
10332
  white-space: nowrap;
9945
10333
  }
9946
- .obs-sens-btn:hover { color: #9aa5ce; }
9947
- .obs-sens-btn.active { background: #2a2f4a; color: #c0caf5; }
10334
+ .obs-sens-btn:hover { color: var(--text-soft); }
10335
+ .obs-sens-btn.active { background: var(--bg-selected); color: var(--text-bright); }
9948
10336
 
9949
10337
  /* "reviewing" bouncing dots */
9950
10338
  .obs-reviewing {
@@ -9952,13 +10340,13 @@ html, body, #root {
9952
10340
  align-items: center;
9953
10341
  gap: 3px;
9954
10342
  font-size: 10.5px;
9955
- color: #7aa2f7;
10343
+ color: var(--accent);
9956
10344
  letter-spacing: 0.03em;
9957
10345
  }
9958
10346
  .obs-reviewing-dot {
9959
10347
  width: 4px; height: 4px;
9960
10348
  border-radius: 50%;
9961
- background: #7aa2f7;
10349
+ background: var(--accent);
9962
10350
  animation: obs-dot-bounce 1.1s ease-in-out infinite;
9963
10351
  }
9964
10352
  .obs-reviewing-dot:nth-child(2) { animation-delay: 0.15s; }
@@ -9970,13 +10358,13 @@ html, body, #root {
9970
10358
 
9971
10359
  /* Pulsing eye badge while a model review is in flight */
9972
10360
  .obs-badge { position: relative; }
9973
- .obs-badge.reviewing { color: #7aa2f7; }
10361
+ .obs-badge.reviewing { color: var(--accent); }
9974
10362
  .obs-badge.reviewing::after {
9975
10363
  content: '';
9976
10364
  position: absolute;
9977
10365
  inset: -1px;
9978
10366
  border-radius: inherit;
9979
- border: 1px solid #7aa2f7;
10367
+ border: 1px solid var(--accent);
9980
10368
  animation: obs-badge-pulse 1.6s ease-out infinite;
9981
10369
  pointer-events: none;
9982
10370
  }