claude-remote 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/styles.css CHANGED
@@ -12,11 +12,68 @@
12
12
  --accent: #2d8a6e;
13
13
  --accent-light: #e8f5ef;
14
14
  --accent-bg: #f0faf5;
15
+ --accent-active: #247a5e;
15
16
  --user-accent: #1967d2;
16
17
  --error: #d93025;
17
18
  --error-bg: #fce8e6;
19
+ --error-border: rgba(217,48,37,.3);
18
20
  --timeline: #d0d0c8;
19
21
  --code-bg: #f8f8f5;
22
+ --overlay-bg: rgba(0,0,0,.35);
23
+ --overlay-heavy: rgba(0,0,0,.45);
24
+ --overlay-light: rgba(0,0,0,.25);
25
+ --shadow-sm: rgba(0,0,0,.08);
26
+ --shadow-md: rgba(0,0,0,.12);
27
+ --shadow-lg: rgba(0,0,0,.18);
28
+ --status-unstable: #d5a000;
29
+ --status-offline: #bbb;
30
+ --status-probing: #e8a000;
31
+ --ping-excellent-bg: #daf5e8;
32
+ --ping-excellent-text: #18794e;
33
+ --ping-good-bg: #dff1ff;
34
+ --ping-good-text: #0f5ea8;
35
+ --ping-warn-bg: #fff0bf;
36
+ --ping-warn-text: #9a6b00;
37
+ --ping-bad-bg: #fde2de;
38
+ --ping-bad-text: #b42318;
39
+ --ping-stale-shadow: rgba(154,107,0,.18);
40
+ --hub-overlay-bg: rgba(245,247,250,.82);
41
+ --hub-card-bg: rgba(255,255,255,.96);
42
+ --hub-card-border: rgba(33,98,76,.12);
43
+ --hub-card-shadow: rgba(18,35,28,.14);
44
+ --spinner-track: rgba(42,138,107,.16);
45
+ --user-msg-bg: #1967d2;
46
+ --user-msg-text: #fff;
47
+ --user-msg-code-bg: rgba(255,255,255,.18);
48
+ --user-msg-pre-bg: rgba(255,255,255,.12);
49
+ --user-msg-link: #b3d4ff;
50
+ --toast-bg: rgba(26,26,26,.96);
51
+ --toast-text: #fff;
52
+ --toast-border: rgba(255,255,255,.08);
53
+ --shimmer-1: rgba(45,138,110,.06);
54
+ --shimmer-2: rgba(45,138,110,.12);
55
+ --shimmer-light-1: rgba(45,138,110,.05);
56
+ --shimmer-light-2: rgba(45,138,110,.10);
57
+ --diff-del-bg: rgba(255,0,0,.06);
58
+ --diff-del-sign: #d73a49;
59
+ --diff-del-code: #6e3630;
60
+ --diff-del-ln-bg: rgba(255,0,0,.08);
61
+ --diff-add-bg: rgba(0,180,0,.06);
62
+ --diff-add-sign: #22863a;
63
+ --diff-add-code: #24602e;
64
+ --diff-add-ln-bg: rgba(0,180,0,.08);
65
+ --diff-hunk-bg: #f1f8ff;
66
+ --diff-hunk-text: #7b93a8;
67
+ --todo-done-color: #4caf50;
68
+ --todo-done-bg: #e8f5e9;
69
+ --warn-bg: #fff3e0;
70
+ --warn-text: #e8a000;
71
+ --warn-active: #d49200;
72
+ --delete-hover-bg: #f5c6c2;
73
+ --plan-icon-bg: #e8f0fe;
74
+ --plan-icon-text: #1967d2;
75
+ --banner-warn-bg: #e8a000;
76
+ --banner-warn-text: #1a1a1a;
20
77
  --radius: 12px;
21
78
  --radius-sm: 8px;
22
79
  --mono: 'SF Mono', 'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'Consolas', monospace;
@@ -94,9 +151,9 @@ html, body {
94
151
  width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0;
95
152
  }
96
153
  .hub-card-status.online { background: var(--accent); }
97
- .hub-card-status.unstable { background: #d5a000; animation: pulse 1.2s infinite; }
98
- .hub-card-status.offline { background: #bbb; }
99
- .hub-card-status.probing { background: #e8a000; animation: pulse 1.2s infinite; }
154
+ .hub-card-status.unstable { background: var(--status-unstable); animation: pulse 1.2s infinite; }
155
+ .hub-card-status.offline { background: var(--status-offline); }
156
+ .hub-card-status.probing { background: var(--status-probing); animation: pulse 1.2s infinite; }
100
157
 
101
158
  .hub-card-info { flex: 1; min-width: 0; }
102
159
  .hub-card-name {
@@ -116,13 +173,13 @@ html, body {
116
173
  font-size: 11px; font-weight: 700; text-align: center;
117
174
  background: var(--bg-hover); color: var(--text-muted);
118
175
  }
119
- .hub-card-ping.excellent { background: #daf5e8; color: #18794e; }
120
- .hub-card-ping.good { background: #dff1ff; color: #0f5ea8; }
121
- .hub-card-ping.warn { background: #fff0bf; color: #9a6b00; }
122
- .hub-card-ping.bad { background: #fde2de; color: #b42318; }
123
- .hub-card-ping.probing { background: #fff0bf; color: #9a6b00; }
176
+ .hub-card-ping.excellent { background: var(--ping-excellent-bg); color: var(--ping-excellent-text); }
177
+ .hub-card-ping.good { background: var(--ping-good-bg); color: var(--ping-good-text); }
178
+ .hub-card-ping.warn { background: var(--ping-warn-bg); color: var(--ping-warn-text); }
179
+ .hub-card-ping.bad { background: var(--ping-bad-bg); color: var(--ping-bad-text); }
180
+ .hub-card-ping.probing { background: var(--ping-warn-bg); color: var(--ping-warn-text); }
124
181
  .hub-card-ping.offline { background: var(--bg-hover); color: var(--text-muted); }
125
- .hub-card-ping.stale { box-shadow: inset 0 0 0 1px rgba(154, 107, 0, .18); }
182
+ .hub-card-ping.stale { box-shadow: inset 0 0 0 1px var(--ping-stale-shadow); }
126
183
  .hub-card-time {
127
184
  font-size: 12px; color: var(--text-muted); white-space: nowrap; flex-shrink: 0;
128
185
  }
@@ -142,7 +199,7 @@ html, body {
142
199
 
143
200
  #hub-connect-overlay {
144
201
  position: fixed; inset: 0;
145
- background: rgba(245, 247, 250, .82);
202
+ background: var(--hub-overlay-bg);
146
203
  backdrop-filter: blur(6px);
147
204
  display: none; align-items: center; justify-content: center;
148
205
  z-index: 180;
@@ -152,15 +209,15 @@ html, body {
152
209
  width: min(280px, calc(100vw - 32px));
153
210
  padding: 22px 20px;
154
211
  border-radius: 18px;
155
- background: rgba(255,255,255,.96);
156
- border: 1px solid rgba(33, 98, 76, .12);
157
- box-shadow: 0 16px 40px rgba(18, 35, 28, .14);
212
+ background: var(--hub-card-bg);
213
+ border: 1px solid var(--hub-card-border);
214
+ box-shadow: 0 16px 40px var(--hub-card-shadow);
158
215
  text-align: center;
159
216
  }
160
217
  .hub-connect-spinner {
161
218
  width: 34px; height: 34px; margin: 0 auto 14px;
162
219
  border-radius: 50%;
163
- border: 3px solid rgba(42, 138, 107, .16);
220
+ border: 3px solid var(--spinner-track);
164
221
  border-top-color: var(--accent);
165
222
  animation: spin .8s linear infinite;
166
223
  }
@@ -175,7 +232,7 @@ html, body {
175
232
 
176
233
  /* Hub Add/Edit Dialog */
177
234
  #hub-add-overlay {
178
- position: fixed; inset: 0; background: rgba(0,0,0,.35);
235
+ position: fixed; inset: 0; background: var(--overlay-bg);
179
236
  display: none; align-items: flex-end; justify-content: center;
180
237
  z-index: 200;
181
238
  }
@@ -236,11 +293,11 @@ html, body {
236
293
  .hub-dialog-btn.save {
237
294
  background: var(--accent); color: #fff;
238
295
  }
239
- .hub-dialog-btn.save:hover { background: #247a5e; }
296
+ .hub-dialog-btn.save:hover { background: var(--accent-active); }
240
297
  .hub-dialog-btn.delete {
241
298
  background: var(--error-bg); color: var(--error); flex: 0 0 auto; padding: 0 20px;
242
299
  }
243
- .hub-dialog-btn.delete:hover { background: #f5c6c2; }
300
+ .hub-dialog-btn.delete:hover { background: var(--delete-hover-bg); }
244
301
 
245
302
  /* ===== Main App ===== */
246
303
  #app {
@@ -288,7 +345,7 @@ header {
288
345
  }
289
346
  .status-dot.connected { background: var(--accent); }
290
347
  .status-dot.disconnected { background: var(--error); }
291
- .status-dot.starting { background: #e8a000; animation: pulse 1.2s infinite; }
348
+ .status-dot.starting { background: var(--status-probing); animation: pulse 1.2s infinite; }
292
349
  @keyframes pulse { 0%,100%{opacity:1}50%{opacity:.3} }
293
350
 
294
351
  /* ===== Chat Area ===== */
@@ -310,8 +367,8 @@ header {
310
367
  max-width: 80%;
311
368
  width: fit-content;
312
369
  padding: 10px 16px;
313
- background: #1967d2;
314
- color: #fff;
370
+ background: var(--user-msg-bg);
371
+ color: var(--user-msg-text);
315
372
  border-radius: 18px 18px 4px 18px;
316
373
  font-size: 15px; line-height: 1.5;
317
374
  word-break: break-word;
@@ -320,17 +377,17 @@ header {
320
377
  .user-msg p { margin: 0; }
321
378
  .user-msg p + p { margin-top: 4px; }
322
379
  .user-msg code {
323
- background: rgba(255,255,255,.18); border: none;
380
+ background: var(--user-msg-code-bg); border: none;
324
381
  padding: 1px 5px; border-radius: 4px; font-family: var(--mono); font-size: .88em;
325
- color: #fff;
382
+ color: var(--user-msg-text);
326
383
  }
327
384
  .user-msg pre {
328
- background: rgba(255,255,255,.12);
385
+ background: var(--user-msg-pre-bg);
329
386
  border: none; border-radius: 8px; padding: 10px; margin: 6px 0;
330
387
  overflow-x: auto;
331
388
  }
332
389
  .user-msg pre code { background: none; padding: 0; font-size: 13px; }
333
- .user-msg a { color: #b3d4ff; }
390
+ .user-msg a { color: var(--user-msg-link); }
334
391
  @keyframes fadeUp { from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)} }
335
392
 
336
393
  /* Toast */
@@ -346,8 +403,8 @@ header {
346
403
  }
347
404
  .toast {
348
405
  width: min(100%, 420px);
349
- background: rgba(26, 26, 26, .96);
350
- color: #fff;
406
+ background: var(--toast-bg);
407
+ color: var(--toast-text);
351
408
  padding: 12px 14px;
352
409
  border-radius: 16px;
353
410
  font-size: 14px;
@@ -357,8 +414,8 @@ header {
357
414
  overflow-wrap: anywhere;
358
415
  text-align: left;
359
416
  animation: toastIn .3s ease, toastOut .3s ease 3.1s forwards;
360
- box-shadow: 0 10px 24px rgba(0,0,0,.18);
361
- border: 1px solid rgba(255,255,255,.08);
417
+ box-shadow: 0 10px 24px var(--shadow-lg);
418
+ border: 1px solid var(--toast-border);
362
419
  }
363
420
  @keyframes toastIn { from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)} }
364
421
  @keyframes toastOut { from{opacity:1}to{opacity:0;transform:translateY(-10px)} }
@@ -485,9 +542,9 @@ header {
485
542
  background: linear-gradient(
486
543
  90deg,
487
544
  transparent 0%,
488
- rgba(45,138,110,.06) 30%,
489
- rgba(45,138,110,.12) 50%,
490
- rgba(45,138,110,.06) 70%,
545
+ var(--shimmer-1) 30%,
546
+ var(--shimmer-2) 50%,
547
+ var(--shimmer-1) 70%,
491
548
  transparent 100%
492
549
  );
493
550
  animation: shimmer 1.8s infinite ease-in-out;
@@ -558,7 +615,7 @@ header {
558
615
  .result-image-block img {
559
616
  max-width: 100%; border-radius: 10px; cursor: pointer;
560
617
  border: 1px solid var(--border);
561
- box-shadow: 0 2px 8px rgba(0,0,0,.12);
618
+ box-shadow: 0 2px 8px var(--shadow-md);
562
619
  }
563
620
  .image-overlay {
564
621
  display: none; position: fixed; inset: 0; z-index: 9999;
@@ -628,22 +685,22 @@ header {
628
685
  word-break: break-all;
629
686
  }
630
687
  /* Delete line */
631
- .diff-del { background: rgba(255,0,0,.06); }
632
- .diff-del .diff-sign { color: #d73a49; }
633
- .diff-del .diff-code { color: #6e3630; }
634
- .diff-del .diff-ln { background: rgba(255,0,0,.08); }
688
+ .diff-del { background: var(--diff-del-bg); }
689
+ .diff-del .diff-sign { color: var(--diff-del-sign); }
690
+ .diff-del .diff-code { color: var(--diff-del-code); }
691
+ .diff-del .diff-ln { background: var(--diff-del-ln-bg); }
635
692
  /* Add line */
636
- .diff-add { background: rgba(0,180,0,.06); }
637
- .diff-add .diff-sign { color: #22863a; }
638
- .diff-add .diff-code { color: #24602e; }
639
- .diff-add .diff-ln { background: rgba(0,180,0,.08); }
693
+ .diff-add { background: var(--diff-add-bg); }
694
+ .diff-add .diff-sign { color: var(--diff-add-sign); }
695
+ .diff-add .diff-code { color: var(--diff-add-code); }
696
+ .diff-add .diff-ln { background: var(--diff-add-ln-bg); }
640
697
  /* Context line */
641
698
  .diff-ctx { background: var(--code-bg); }
642
699
  .diff-ctx .diff-sign { color: transparent; }
643
700
  .diff-ctx .diff-code { color: var(--text-secondary); }
644
701
  /* Hunk separator */
645
702
  .diff-hunk {
646
- background: #f1f8ff; color: #7b93a8;
703
+ background: var(--diff-hunk-bg); color: var(--diff-hunk-text);
647
704
  font-size: 11px;
648
705
  }
649
706
  .diff-hunk td { padding: 4px 12px; }
@@ -652,8 +709,8 @@ header {
652
709
  display: inline-flex; align-items: center; gap: 4px;
653
710
  margin-left: auto; font-size: 11px; font-weight: 600;
654
711
  }
655
- .diff-stats .ds-add { color: #22863a; }
656
- .diff-stats .ds-del { color: #d73a49; }
712
+ .diff-stats .ds-add { color: var(--diff-add-sign); }
713
+ .diff-stats .ds-del { color: var(--diff-del-sign); }
657
714
 
658
715
  /* Token count */
659
716
  .token-count {
@@ -727,7 +784,7 @@ header {
727
784
  border-radius: 2px;
728
785
  transition: width .4s ease;
729
786
  }
730
- .todo-progress-bar.all-done { background: #4caf50; }
787
+ .todo-progress-bar.all-done { background: var(--todo-done-color); }
731
788
  .todo-summary {
732
789
  font-size: 12px; color: var(--text-muted);
733
790
  white-space: nowrap; flex-shrink: 0;
@@ -770,9 +827,9 @@ header {
770
827
  animation: pulse 1.2s infinite;
771
828
  }
772
829
  .todo-item.completed .todo-icon {
773
- border-color: #4caf50;
774
- background: #e8f5e9;
775
- color: #4caf50;
830
+ border-color: var(--todo-done-color);
831
+ background: var(--todo-done-bg);
832
+ color: var(--todo-done-color);
776
833
  }
777
834
  .todo-body { flex: 1; min-width: 0; }
778
835
  .todo-subject {
@@ -811,7 +868,7 @@ header {
811
868
  background: var(--accent-light); color: var(--accent);
812
869
  }
813
870
  .todo-item.completed .todo-status-tag {
814
- background: #e8f5e9; color: #4caf50;
871
+ background: var(--todo-done-bg); color: var(--todo-done-color);
815
872
  }
816
873
 
817
874
  /* ===== Input Area ===== */
@@ -855,7 +912,7 @@ header {
855
912
  animation: pulse 1.5s infinite ease-in-out;
856
913
  }
857
914
  #btn-send.stop-mode:hover, #btn-send.stop-mode:active {
858
- background: var(--error-bg); color: var(--error); border-color: rgba(217,48,37,.3);
915
+ background: var(--error-bg); color: var(--error); border-color: var(--error-border);
859
916
  }
860
917
 
861
918
  /* ===== Welcome ===== */
@@ -870,7 +927,7 @@ header {
870
927
  /* ===== Command Overlay (compact spinner etc.) ===== */
871
928
  #cmd-overlay {
872
929
  display: none; position: fixed; inset: 0; z-index: 150;
873
- background: rgba(0,0,0,.25);
930
+ background: var(--overlay-light);
874
931
  align-items: center; justify-content: center;
875
932
  }
876
933
  #cmd-overlay.visible { display: flex; }
@@ -878,7 +935,7 @@ header {
878
935
  display: flex; flex-direction: column; align-items: center; gap: 16px;
879
936
  padding: 32px 40px; border-radius: 16px;
880
937
  background: var(--bg-white);
881
- box-shadow: 0 8px 32px rgba(0,0,0,.12);
938
+ box-shadow: 0 8px 32px var(--shadow-md);
882
939
  animation: fadeUp .2s ease;
883
940
  }
884
941
  .cmd-overlay-spinner {
@@ -958,9 +1015,9 @@ header {
958
1015
  background: linear-gradient(
959
1016
  90deg,
960
1017
  transparent 0%,
961
- rgba(45,138,110,.05) 40%,
962
- rgba(45,138,110,.10) 50%,
963
- rgba(45,138,110,.05) 60%,
1018
+ var(--shimmer-light-1) 40%,
1019
+ var(--shimmer-light-2) 50%,
1020
+ var(--shimmer-light-1) 60%,
964
1021
  transparent 100%
965
1022
  );
966
1023
  animation: inputShimmer 2s infinite ease-in-out;
@@ -1016,7 +1073,7 @@ header {
1016
1073
  #image-upload-overlay {
1017
1074
  position: absolute; inset: 0;
1018
1075
  display: flex; align-items: center; justify-content: center;
1019
- background: rgba(0, 0, 0, 0.45);
1076
+ background: var(--overlay-heavy);
1020
1077
  backdrop-filter: blur(2px);
1021
1078
  border-radius: var(--radius-sm);
1022
1079
  color: #fff;
@@ -1088,7 +1145,7 @@ header {
1088
1145
  animation: fadeUp .2s ease;
1089
1146
  }
1090
1147
  #conn-banner.visible { display: flex; }
1091
- #conn-banner.reconnecting { background: #e8a000; color: #1a1a1a; }
1148
+ #conn-banner.reconnecting { background: var(--banner-warn-bg); color: var(--banner-warn-text); }
1092
1149
  #conn-banner .banner-dot {
1093
1150
  width: 6px; height: 6px; border-radius: 50%;
1094
1151
  background: currentColor; animation: pulse 1.2s infinite;
@@ -1097,7 +1154,7 @@ header {
1097
1154
  /* ===== Permission Overlay ===== */
1098
1155
  #perm-overlay {
1099
1156
  display: none; position: fixed; inset: 0; z-index: 200;
1100
- background: rgba(0,0,0,.35);
1157
+ background: var(--overlay-bg);
1101
1158
  align-items: flex-end; justify-content: center;
1102
1159
  animation: fadeIn .15s ease;
1103
1160
  }
@@ -1110,7 +1167,7 @@ header {
1110
1167
  padding: 20px 20px 24px;
1111
1168
  padding-bottom: 24px;
1112
1169
  padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px));
1113
- box-shadow: 0 -4px 24px rgba(0,0,0,.12);
1170
+ box-shadow: 0 -4px 24px var(--shadow-md);
1114
1171
  animation: slideUp .2s ease;
1115
1172
  }
1116
1173
  @keyframes slideUp { from{transform:translateY(30px);opacity:0}to{transform:translateY(0);opacity:1} }
@@ -1120,7 +1177,7 @@ header {
1120
1177
  }
1121
1178
  .perm-icon {
1122
1179
  width: 40px; height: 40px; border-radius: 10px;
1123
- background: #fff3e0; color: #e8a000;
1180
+ background: var(--warn-bg); color: var(--warn-text);
1124
1181
  display: flex; align-items: center; justify-content: center;
1125
1182
  flex-shrink: 0;
1126
1183
  }
@@ -1152,12 +1209,12 @@ header {
1152
1209
  .perm-btn-allow {
1153
1210
  background: var(--accent); color: #fff;
1154
1211
  }
1155
- .perm-btn-allow:hover, .perm-btn-allow:active { background: #247a5e; }
1212
+ .perm-btn-allow:hover, .perm-btn-allow:active { background: var(--accent-active); }
1156
1213
 
1157
1214
  /* ===== Question Overlay (AskUserQuestion) ===== */
1158
1215
  #question-overlay {
1159
1216
  display: none; position: fixed; inset: 0; z-index: 200;
1160
- background: rgba(0,0,0,.35);
1217
+ background: var(--overlay-bg);
1161
1218
  align-items: flex-end; justify-content: center;
1162
1219
  animation: fadeIn .15s ease;
1163
1220
  }
@@ -1166,7 +1223,7 @@ header {
1166
1223
  width: 100%; max-width: 480px;
1167
1224
  background: var(--bg-white); border-radius: 16px 16px 0 0;
1168
1225
  padding: 20px 20px calc(24px + env(safe-area-inset-bottom, 0px));
1169
- box-shadow: 0 -4px 24px rgba(0,0,0,.12);
1226
+ box-shadow: 0 -4px 24px var(--shadow-md);
1170
1227
  animation: slideUp .2s ease;
1171
1228
  margin-bottom: var(--keyboard-offset);
1172
1229
  max-height: calc(100dvh - var(--keyboard-offset) - env(safe-area-inset-top, 0px) - 12px);
@@ -1222,12 +1279,36 @@ header {
1222
1279
  font-size: 14px; font-weight: 600; cursor: pointer;
1223
1280
  font-family: inherit;
1224
1281
  }
1225
- .question-other-btn:active { background: #247a5e; }
1282
+ .question-other-btn:active { background: var(--accent-active); }
1283
+ .question-opt.selected { background: var(--accent-bg); border-color: var(--accent); }
1284
+ .question-opt-num.active { background: var(--accent); color: #fff; }
1285
+ .question-opt-check {
1286
+ width: 24px; height: 24px; border-radius: 4px;
1287
+ display: flex; align-items: center; justify-content: center;
1288
+ font-size: 18px; flex-shrink: 0; color: var(--text-muted); line-height: 1;
1289
+ }
1290
+ .question-opt.selected .question-opt-check { color: var(--accent); }
1291
+ .question-progress {
1292
+ font-size: 12px; font-weight: 600; color: var(--accent);
1293
+ background: var(--accent-light); border-radius: 12px;
1294
+ padding: 2px 10px; white-space: nowrap; flex-shrink: 0; line-height: 1.5;
1295
+ }
1296
+ .question-nav { display: flex; gap: 8px; margin-top: 4px; }
1297
+ .question-nav-btn {
1298
+ flex: 1; padding: 10px; border-radius: var(--radius-sm);
1299
+ font-family: inherit; font-size: 14px; font-weight: 600;
1300
+ cursor: pointer; border: 1px solid var(--border);
1301
+ background: var(--bg-white); color: var(--text);
1302
+ -webkit-tap-highlight-color: transparent;
1303
+ }
1304
+ .question-nav-btn:active { background: var(--bg); }
1305
+ .question-nav-primary { background: var(--accent); color: #fff; border-color: var(--accent); }
1306
+ .question-nav-primary:active { background: var(--accent-active); }
1226
1307
 
1227
1308
  /* ===== Plan Approval Overlay (ExitPlanMode) ===== */
1228
1309
  #plan-overlay {
1229
1310
  display: none; position: fixed; inset: 0; z-index: 200;
1230
- background: rgba(0,0,0,.35);
1311
+ background: var(--overlay-bg);
1231
1312
  align-items: flex-end; justify-content: center;
1232
1313
  animation: fadeIn .15s ease;
1233
1314
  }
@@ -1236,7 +1317,7 @@ header {
1236
1317
  width: 100%; max-width: 480px;
1237
1318
  background: var(--bg-white); border-radius: 16px 16px 0 0;
1238
1319
  padding: 20px 20px calc(24px + env(safe-area-inset-bottom, 0px));
1239
- box-shadow: 0 -4px 24px rgba(0,0,0,.12);
1320
+ box-shadow: 0 -4px 24px var(--shadow-md);
1240
1321
  animation: slideUp .2s ease;
1241
1322
  margin-bottom: var(--keyboard-offset);
1242
1323
  max-height: calc(100dvh - var(--keyboard-offset) - env(safe-area-inset-top, 0px) - 12px);
@@ -1248,7 +1329,7 @@ header {
1248
1329
  }
1249
1330
  .plan-icon {
1250
1331
  width: 36px; height: 36px; border-radius: 10px;
1251
- background: #e8f0fe; color: #1967d2;
1332
+ background: var(--plan-icon-bg); color: var(--plan-icon-text);
1252
1333
  display: flex; align-items: center; justify-content: center;
1253
1334
  flex-shrink: 0;
1254
1335
  }
@@ -1282,12 +1363,12 @@ header {
1282
1363
  font-size: 14px; font-weight: 600; cursor: pointer;
1283
1364
  font-family: inherit;
1284
1365
  }
1285
- .plan-other-btn:active { background: #247a5e; }
1366
+ .plan-other-btn:active { background: var(--accent-active); }
1286
1367
 
1287
1368
  /* ===== Settings Overlay ===== */
1288
1369
  #settings-overlay {
1289
1370
  display: none; position: fixed; inset: 0; z-index: 300;
1290
- background: rgba(0,0,0,.35);
1371
+ background: var(--overlay-bg);
1291
1372
  align-items: flex-end; justify-content: center;
1292
1373
  animation: fadeIn .15s ease;
1293
1374
  }
@@ -1298,7 +1379,7 @@ header {
1298
1379
  padding: 20px 20px 24px;
1299
1380
  padding-bottom: 24px;
1300
1381
  padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px));
1301
- box-shadow: 0 -4px 24px rgba(0,0,0,.12);
1382
+ box-shadow: 0 -4px 24px var(--shadow-md);
1302
1383
  animation: slideUp .2s ease;
1303
1384
  max-height: 80vh; overflow-y: auto;
1304
1385
  }
@@ -1334,7 +1415,7 @@ header {
1334
1415
  /* ===== Confirm Dialog ===== */
1335
1416
  #confirm-overlay {
1336
1417
  display: none; position: fixed; inset: 0; z-index: 400;
1337
- background: rgba(0,0,0,.45);
1418
+ background: var(--overlay-heavy);
1338
1419
  align-items: center; justify-content: center;
1339
1420
  animation: fadeIn .15s ease;
1340
1421
  }
@@ -1342,12 +1423,12 @@ header {
1342
1423
  #confirm-dialog {
1343
1424
  width: calc(100% - 48px); max-width: 340px;
1344
1425
  background: var(--bg-white); border-radius: 16px;
1345
- padding: 24px; box-shadow: 0 8px 32px rgba(0,0,0,.18);
1426
+ padding: 24px; box-shadow: 0 8px 32px var(--shadow-lg);
1346
1427
  text-align: center; animation: slideUp .2s ease;
1347
1428
  }
1348
1429
  .confirm-icon {
1349
1430
  width: 48px; height: 48px; border-radius: 50%;
1350
- background: #fff3e0; color: #e8a000;
1431
+ background: var(--warn-bg); color: var(--warn-text);
1351
1432
  display: flex; align-items: center; justify-content: center;
1352
1433
  margin: 0 auto 12px;
1353
1434
  }
@@ -1361,15 +1442,15 @@ header {
1361
1442
  }
1362
1443
  .confirm-btn-cancel { background: var(--bg); color: var(--text-secondary); border: 1px solid var(--border) !important; }
1363
1444
  .confirm-btn-cancel:active { background: var(--bg-hover); }
1364
- .confirm-btn-ok { background: #e8a000; color: #fff; }
1365
- .confirm-btn-ok:active { background: #d49200; }
1445
+ .confirm-btn-ok { background: var(--warn-text); color: #fff; }
1446
+ .confirm-btn-ok:active { background: var(--warn-active); }
1366
1447
 
1367
1448
  /* ===== Slash Command Menu ===== */
1368
1449
  #cmd-menu {
1369
1450
  display: none; position: absolute; bottom: 100%; left: 0; right: 0;
1370
1451
  background: var(--bg-white); border: 1px solid var(--border);
1371
1452
  border-radius: var(--radius) var(--radius) 0 0;
1372
- box-shadow: 0 -4px 16px rgba(0,0,0,.08);
1453
+ box-shadow: 0 -4px 16px var(--shadow-sm);
1373
1454
  max-height: 260px; overflow-y: auto; z-index: 20;
1374
1455
  }
1375
1456
  #cmd-menu.visible { display: block; }
@@ -1391,7 +1472,7 @@ header {
1391
1472
  /* ===== Model Picker Overlay ===== */
1392
1473
  #model-picker {
1393
1474
  display: none; position: fixed; inset: 0; z-index: 200;
1394
- background: rgba(0,0,0,.35);
1475
+ background: var(--overlay-bg);
1395
1476
  align-items: flex-end; justify-content: center;
1396
1477
  }
1397
1478
  #model-picker.visible { display: flex; }
@@ -1401,7 +1482,7 @@ header {
1401
1482
  padding: 16px 0 20px;
1402
1483
  padding-bottom: 20px;
1403
1484
  padding-bottom: calc(20px + env(safe-area-inset-bottom, 0px));
1404
- box-shadow: 0 -4px 24px rgba(0,0,0,.12);
1485
+ box-shadow: 0 -4px 24px var(--shadow-md);
1405
1486
  animation: slideUp .2s ease;
1406
1487
  }
1407
1488
  .model-title {
@@ -1491,8 +1572,8 @@ header {
1491
1572
  .plan-inline-header {
1492
1573
  display: flex; align-items: center; gap: 8px;
1493
1574
  padding: 12px 16px; font-weight: 600; font-size: 14px;
1494
- color: #1967d2; border-bottom: 1px solid var(--border);
1495
- background: #e8f0fe;
1575
+ color: var(--plan-icon-text); border-bottom: 1px solid var(--border);
1576
+ background: var(--plan-icon-bg);
1496
1577
  }
1497
1578
  .plan-inline-header svg { flex-shrink: 0; }
1498
1579
  .plan-inline-body {
@@ -1518,7 +1599,7 @@ header {
1518
1599
  /* ===== Session Drawer ===== */
1519
1600
  #session-overlay {
1520
1601
  position: fixed; inset: 0; z-index: 350;
1521
- background: rgba(0,0,0,.35);
1602
+ background: var(--overlay-bg);
1522
1603
  display: none; opacity: 0;
1523
1604
  transition: opacity .2s ease;
1524
1605
  }
@@ -1640,12 +1721,12 @@ header {
1640
1721
  font-size: 14px; font-weight: 500; cursor: pointer;
1641
1722
  flex-shrink: 0; transition: background .15s;
1642
1723
  }
1643
- .settings-cwd-btn:active { background: #247a5e; }
1724
+ .settings-cwd-btn:active { background: var(--accent-active); }
1644
1725
 
1645
1726
  /* ===== Directory Picker ===== */
1646
1727
  #dir-overlay {
1647
1728
  position: fixed; inset: 0; z-index: 360;
1648
- background: rgba(0,0,0,.35);
1729
+ background: var(--overlay-bg);
1649
1730
  display: none; opacity: 0;
1650
1731
  transition: opacity .2s ease;
1651
1732
  }
@@ -1659,7 +1740,7 @@ header {
1659
1740
  display: flex; flex-direction: column;
1660
1741
  transform: translateY(100%);
1661
1742
  transition: transform .25s cubic-bezier(.4,0,.2,1);
1662
- box-shadow: 0 -4px 20px rgba(0,0,0,.12);
1743
+ box-shadow: 0 -4px 20px var(--shadow-md);
1663
1744
  }
1664
1745
  #dir-overlay.visible #dir-drawer { transform: translateY(0); }
1665
1746
  .dir-toolbar {
@@ -1719,4 +1800,160 @@ header {
1719
1800
  background: var(--accent); color: #fff;
1720
1801
  font-size: 14px; font-weight: 600; cursor: pointer;
1721
1802
  }
1722
- .drawer-btn-select:active { background: #247a5e; }
1803
+ .drawer-btn-select:active { background: var(--accent-active); }
1804
+
1805
+ /* ===== Dark Mode ===== */
1806
+ @media (prefers-color-scheme: dark) {
1807
+ html:not([data-theme="light"]) {
1808
+ --bg: #1e1e1e;
1809
+ --bg-white: #252526;
1810
+ --bg-hover: #2a2d2e;
1811
+ --border: #3c3c3c;
1812
+ --border-light: #333333;
1813
+ --text: #cccccc;
1814
+ --text-secondary: #9d9d9d;
1815
+ --text-muted: #6a6a6a;
1816
+ --accent: #3dab8e;
1817
+ --accent-light: #1a3a2e;
1818
+ --accent-bg: #1e2e26;
1819
+ --accent-active: #2f9576;
1820
+ --user-accent: #569cd6;
1821
+ --error: #f14c4c;
1822
+ --error-bg: #3b1e1e;
1823
+ --error-border: rgba(241,76,76,.3);
1824
+ --timeline: #444444;
1825
+ --code-bg: #1e1e1e;
1826
+ --overlay-bg: rgba(0,0,0,.55);
1827
+ --overlay-heavy: rgba(0,0,0,.65);
1828
+ --overlay-light: rgba(0,0,0,.4);
1829
+ --shadow-sm: rgba(0,0,0,.2);
1830
+ --shadow-md: rgba(0,0,0,.3);
1831
+ --shadow-lg: rgba(0,0,0,.4);
1832
+ --status-unstable: #d5a000;
1833
+ --status-offline: #555;
1834
+ --status-probing: #e8a000;
1835
+ --ping-excellent-bg: #1a3a2e;
1836
+ --ping-excellent-text: #4ec89a;
1837
+ --ping-good-bg: #1a2d3e;
1838
+ --ping-good-text: #6cb6ff;
1839
+ --ping-warn-bg: #3a2e1a;
1840
+ --ping-warn-text: #dba84c;
1841
+ --ping-bad-bg: #3b1e1e;
1842
+ --ping-bad-text: #f87171;
1843
+ --ping-stale-shadow: rgba(219,168,76,.2);
1844
+ --hub-overlay-bg: rgba(20,20,20,.85);
1845
+ --hub-card-bg: rgba(40,40,40,.96);
1846
+ --hub-card-border: rgba(61,171,142,.15);
1847
+ --hub-card-shadow: rgba(0,0,0,.4);
1848
+ --spinner-track: rgba(61,171,142,.2);
1849
+ --user-msg-bg: #264f78;
1850
+ --user-msg-text: #e0e0e0;
1851
+ --user-msg-code-bg: rgba(255,255,255,.12);
1852
+ --user-msg-pre-bg: rgba(255,255,255,.08);
1853
+ --user-msg-link: #6cb6ff;
1854
+ --toast-bg: rgba(50,50,50,.96);
1855
+ --toast-text: #e0e0e0;
1856
+ --toast-border: rgba(255,255,255,.12);
1857
+ --shimmer-1: rgba(61,171,142,.08);
1858
+ --shimmer-2: rgba(61,171,142,.16);
1859
+ --shimmer-light-1: rgba(61,171,142,.06);
1860
+ --shimmer-light-2: rgba(61,171,142,.12);
1861
+ --diff-del-bg: rgba(255,80,80,.1);
1862
+ --diff-del-sign: #f97583;
1863
+ --diff-del-code: #ffa6a6;
1864
+ --diff-del-ln-bg: rgba(255,80,80,.14);
1865
+ --diff-add-bg: rgba(80,255,80,.08);
1866
+ --diff-add-sign: #85e89d;
1867
+ --diff-add-code: #a5d6a7;
1868
+ --diff-add-ln-bg: rgba(80,255,80,.1);
1869
+ --diff-hunk-bg: #1e2d3d;
1870
+ --diff-hunk-text: #6a8fad;
1871
+ --todo-done-color: #66bb6a;
1872
+ --todo-done-bg: #1a2e1e;
1873
+ --warn-bg: #3a2e1a;
1874
+ --warn-text: #e8a000;
1875
+ --warn-active: #c28600;
1876
+ --delete-hover-bg: #3b2020;
1877
+ --plan-icon-bg: #1a2d3e;
1878
+ --plan-icon-text: #6cb6ff;
1879
+ --banner-warn-bg: #e8a000;
1880
+ --banner-warn-text: #1a1a1a;
1881
+ color-scheme: dark;
1882
+ }
1883
+ }
1884
+ html[data-theme="dark"] {
1885
+ --bg: #1e1e1e;
1886
+ --bg-white: #252526;
1887
+ --bg-hover: #2a2d2e;
1888
+ --border: #3c3c3c;
1889
+ --border-light: #333333;
1890
+ --text: #cccccc;
1891
+ --text-secondary: #9d9d9d;
1892
+ --text-muted: #6a6a6a;
1893
+ --accent: #3dab8e;
1894
+ --accent-light: #1a3a2e;
1895
+ --accent-bg: #1e2e26;
1896
+ --accent-active: #2f9576;
1897
+ --user-accent: #569cd6;
1898
+ --error: #f14c4c;
1899
+ --error-bg: #3b1e1e;
1900
+ --error-border: rgba(241,76,76,.3);
1901
+ --timeline: #444444;
1902
+ --code-bg: #1e1e1e;
1903
+ --overlay-bg: rgba(0,0,0,.55);
1904
+ --overlay-heavy: rgba(0,0,0,.65);
1905
+ --overlay-light: rgba(0,0,0,.4);
1906
+ --shadow-sm: rgba(0,0,0,.2);
1907
+ --shadow-md: rgba(0,0,0,.3);
1908
+ --shadow-lg: rgba(0,0,0,.4);
1909
+ --status-unstable: #d5a000;
1910
+ --status-offline: #555;
1911
+ --status-probing: #e8a000;
1912
+ --ping-excellent-bg: #1a3a2e;
1913
+ --ping-excellent-text: #4ec89a;
1914
+ --ping-good-bg: #1a2d3e;
1915
+ --ping-good-text: #6cb6ff;
1916
+ --ping-warn-bg: #3a2e1a;
1917
+ --ping-warn-text: #dba84c;
1918
+ --ping-bad-bg: #3b1e1e;
1919
+ --ping-bad-text: #f87171;
1920
+ --ping-stale-shadow: rgba(219,168,76,.2);
1921
+ --hub-overlay-bg: rgba(20,20,20,.85);
1922
+ --hub-card-bg: rgba(40,40,40,.96);
1923
+ --hub-card-border: rgba(61,171,142,.15);
1924
+ --hub-card-shadow: rgba(0,0,0,.4);
1925
+ --spinner-track: rgba(61,171,142,.2);
1926
+ --user-msg-bg: #264f78;
1927
+ --user-msg-text: #e0e0e0;
1928
+ --user-msg-code-bg: rgba(255,255,255,.12);
1929
+ --user-msg-pre-bg: rgba(255,255,255,.08);
1930
+ --user-msg-link: #6cb6ff;
1931
+ --toast-bg: rgba(50,50,50,.96);
1932
+ --toast-text: #e0e0e0;
1933
+ --toast-border: rgba(255,255,255,.12);
1934
+ --shimmer-1: rgba(61,171,142,.08);
1935
+ --shimmer-2: rgba(61,171,142,.16);
1936
+ --shimmer-light-1: rgba(61,171,142,.06);
1937
+ --shimmer-light-2: rgba(61,171,142,.12);
1938
+ --diff-del-bg: rgba(255,80,80,.1);
1939
+ --diff-del-sign: #f97583;
1940
+ --diff-del-code: #ffa6a6;
1941
+ --diff-del-ln-bg: rgba(255,80,80,.14);
1942
+ --diff-add-bg: rgba(80,255,80,.08);
1943
+ --diff-add-sign: #85e89d;
1944
+ --diff-add-code: #a5d6a7;
1945
+ --diff-add-ln-bg: rgba(80,255,80,.1);
1946
+ --diff-hunk-bg: #1e2d3d;
1947
+ --diff-hunk-text: #6a8fad;
1948
+ --todo-done-color: #66bb6a;
1949
+ --todo-done-bg: #1a2e1e;
1950
+ --warn-bg: #3a2e1a;
1951
+ --warn-text: #e8a000;
1952
+ --warn-active: #c28600;
1953
+ --delete-hover-bg: #3b2020;
1954
+ --plan-icon-bg: #1a2d3e;
1955
+ --plan-icon-text: #6cb6ff;
1956
+ --banner-warn-bg: #e8a000;
1957
+ --banner-warn-text: #1a1a1a;
1958
+ color-scheme: dark;
1959
+ }