claude-maestro 0.1.19 → 0.1.21

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 (28) hide show
  1. package/out/main/index.js +1119 -274
  2. package/out/preload/index.js +7 -0
  3. package/out/renderer/assets/{index-9AHdXE8U.js → index-BDJGybQo.js} +2 -2
  4. package/out/renderer/assets/{index-CVWvgy2Y.js → index-BDxfkk76.js} +2 -2
  5. package/out/renderer/assets/{index-C0rsWi9C.js → index-BNIPHMhg.js} +2 -2
  6. package/out/renderer/assets/{index-JMVyecfQ.js → index-BPiKmKfX.js} +5 -5
  7. package/out/renderer/assets/{index-C479DZmL.js → index-Bf87-cF0.js} +5 -5
  8. package/out/renderer/assets/{index-CNNAMsV1.js → index-Bm6BMufC.js} +2 -2
  9. package/out/renderer/assets/{index-LW-gCnC-.js → index-Bw6wDwNB.js} +2 -2
  10. package/out/renderer/assets/{index-1Z03T0zz.js → index-C2wfbMG1.js} +2 -2
  11. package/out/renderer/assets/{index-DI2ly48w.js → index-C3_9l5Zo.js} +2 -2
  12. package/out/renderer/assets/{index-Dhxn3JIv.js → index-CIAp39oC.js} +2 -2
  13. package/out/renderer/assets/{index-Dgaj6c_K.css → index-CTyPr1hG.css} +1384 -104
  14. package/out/renderer/assets/{index-B59uuZRU.js → index-CYo0nynQ.js} +4 -4
  15. package/out/renderer/assets/{index-D9GPva9-.js → index-CZmL3oq-.js} +5 -5
  16. package/out/renderer/assets/{index-Bg4ondS2.js → index-CdG7xnB7.js} +2 -2
  17. package/out/renderer/assets/{index-CoyUYEik.js → index-Cfvyl_8T.js} +3 -3
  18. package/out/renderer/assets/{index-DJwKAmOm.js → index-Ck4WZgFA.js} +2 -2
  19. package/out/renderer/assets/{index-jAA5WJm3.js → index-D9lxbtli.js} +5 -5
  20. package/out/renderer/assets/{index-CZP8wVw-.js → index-DD6EoqPp.js} +2 -2
  21. package/out/renderer/assets/{index-CWk6CwGd.js → index-DGNONcNh.js} +3 -3
  22. package/out/renderer/assets/{index-BkOzhsuz.js → index-DroXAl3A.js} +1 -1
  23. package/out/renderer/assets/{index-CuHjzw7d.js → index-DzjUOrFM.js} +5 -5
  24. package/out/renderer/assets/{index-CTxGDYbk.js → index-Uh6FxvAQ.js} +6157 -3651
  25. package/out/renderer/assets/{index-Cq5xQaOf.js → index-iIulTEbp.js} +5 -5
  26. package/out/renderer/assets/{index-CXeHg_Qc.js → index-kJ0KF5bI.js} +2 -2
  27. package/out/renderer/index.html +2 -2
  28. package/package.json +2 -1
@@ -1,15 +1,143 @@
1
+ /* ===== Design-system scales (additive, theme-independent) =====
2
+ * Spacing / radius / elevation / motion + focus ring + z-index. Colours live in
3
+ * the per-theme :root blocks below; accent tints derive from --accent via
4
+ * color-mix so they track the active theme AND a custom accent automatically. */
5
+ :root {
6
+ /* spacing — 4px base + a 2px step for this dense tool */
7
+ --space-half: 2px;
8
+ --space-xs: 4px;
9
+ --space-sm: 6px;
10
+ --space-md: 8px;
11
+ --space-lg: 12px;
12
+ --space-xl: 16px;
13
+ --space-2xl: 20px;
14
+ --space-3xl: 24px;
15
+
16
+ /* radius */
17
+ --r-sm: 5px;
18
+ --r-md: 8px;
19
+ --r-lg: 12px;
20
+ --r-pill: 999px;
21
+
22
+ /* elevation — tuned for dark surfaces */
23
+ --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.3);
24
+ --shadow-2: 0 4px 12px rgba(0, 0, 0, 0.35);
25
+ --shadow-3: 0 12px 32px rgba(0, 0, 0, 0.45);
26
+ --shadow-4: 0 24px 64px rgba(0, 0, 0, 0.55);
27
+
28
+ /* motion */
29
+ --ease-out: cubic-bezier(0.2, 0.7, 0.3, 1);
30
+ --dur-fast: 0.12s;
31
+ --dur-base: 0.16s;
32
+
33
+ /* hairline divider + accent tints (derived so custom accents work too) */
34
+ --border-soft: rgba(255, 255, 255, 0.06);
35
+ --accent-soft: color-mix(in srgb, var(--accent) 14%, transparent);
36
+ --accent-border: color-mix(in srgb, var(--accent) 45%, transparent);
37
+
38
+ /* keyboard focus ring — bg gap + accent halo */
39
+ --ring: 0 0 0 2px var(--bg), 0 0 0 4px var(--accent);
40
+
41
+ /* z-index scale */
42
+ --z-rail: 50;
43
+ --z-dropdown: 150;
44
+ --z-modal: 200;
45
+ --z-toast: 500;
46
+ }
47
+
48
+ /* Theme colour tokens — dark (default) */
1
49
  :root {
2
50
  --bg: #16171a;
3
51
  --panel: #1d1e23;
4
52
  --panel-2: #222329;
53
+ --panel-3: #2b2c33;
5
54
  --border: #2a2c33;
6
- --text: #d7d8db;
55
+ --text: #e3e4e8;
56
+ --text-2: #b3b5bd;
7
57
  --dim: #8b8d94;
8
58
  --accent: #d97757;
59
+ /* readable text on a solid --accent fill (overridden per-theme + by a custom accent) */
60
+ --accent-fg: #ffffff;
9
61
  --attention: #e2b93d;
10
62
  --working: #58a6ff;
11
63
  --error: #e5484d;
12
64
  --green: #4cc38a;
65
+ /* gamification palette */
66
+ --xp: #58a6ff;
67
+ --level-up: #ffd54a;
68
+ --badge: #d97757;
69
+ --celebrate-1: #ff6b6b;
70
+ --celebrate-2: #4cc38a;
71
+ }
72
+
73
+ /* Neon theme — cyan/violet on near-black, soft glows. */
74
+ .app.theme-neon {
75
+ --bg: #0c0e14;
76
+ --panel: #12151f;
77
+ --panel-2: #171b28;
78
+ --panel-3: #1e2434;
79
+ --border: #243049;
80
+ --text: #e6f1ff;
81
+ --text-2: #aeb9d4;
82
+ --dim: #7e8ba8;
83
+ --accent: #22d3ee;
84
+ --accent-fg: #06121a;
85
+ --attention: #fbbf24;
86
+ --working: #a78bfa;
87
+ --error: #fb7185;
88
+ --green: #34d399;
89
+ --xp: #22d3ee;
90
+ --level-up: #fde047;
91
+ --badge: #a78bfa;
92
+ --celebrate-1: #22d3ee;
93
+ --celebrate-2: #a78bfa;
94
+ }
95
+
96
+ /* Synthwave theme — magenta/indigo, sunset accents. */
97
+ .app.theme-synthwave {
98
+ --bg: #190f2e;
99
+ --panel: #21163f;
100
+ --panel-2: #2b1d52;
101
+ --panel-3: #33215f;
102
+ --border: #3d2a6b;
103
+ --text: #ffe9f6;
104
+ --text-2: #c7a9e0;
105
+ --dim: #a98fc8;
106
+ --accent: #ff2e88;
107
+ --accent-fg: #ffffff;
108
+ --attention: #ffd23f;
109
+ --working: #00e5ff;
110
+ --error: #ff5d73;
111
+ --green: #4ade80;
112
+ --xp: #ff2e88;
113
+ --level-up: #ffd23f;
114
+ --badge: #00e5ff;
115
+ --celebrate-1: #ff2e88;
116
+ --celebrate-2: #00e5ff;
117
+ }
118
+ .app.theme-synthwave .btn.primary {
119
+ background: linear-gradient(135deg, var(--accent), #b14bff);
120
+ border-color: transparent;
121
+ }
122
+
123
+ /* Reduce-motion: kill all animations/transitions app-wide. */
124
+ .app.reduce-motion *,
125
+ .app.reduce-motion *::before,
126
+ .app.reduce-motion *::after {
127
+ animation: none !important;
128
+ transition: none !important;
129
+ }
130
+
131
+ /* Honour the OS "reduce motion" preference even when the in-app toggle is off. */
132
+ @media (prefers-reduced-motion: reduce) {
133
+ *,
134
+ *::before,
135
+ *::after {
136
+ animation-duration: 0.001ms !important;
137
+ animation-iteration-count: 1 !important;
138
+ transition-duration: 0.001ms !important;
139
+ scroll-behavior: auto !important;
140
+ }
13
141
  }
14
142
 
15
143
  * {
@@ -60,35 +188,97 @@ body {
60
188
  --bg: rgba(22, 23, 26, 0.82);
61
189
  --panel: rgba(29, 30, 35, 0.82);
62
190
  --panel-2: rgba(34, 35, 41, 0.82);
191
+ --panel-3: rgba(43, 44, 51, 0.86);
63
192
  }
64
193
 
65
194
  .app.loading {
66
195
  align-items: center;
67
196
  justify-content: center;
197
+ gap: 10px;
68
198
  color: var(--dim);
69
199
  }
70
200
 
201
+ /* Indeterminate spinner (reuses the spin keyframe; respects reduce-motion). */
202
+ .spinner {
203
+ display: inline-block;
204
+ border-radius: 50%;
205
+ border: 2px solid var(--border);
206
+ border-top-color: var(--accent);
207
+ animation: spin 0.8s linear infinite;
208
+ }
209
+
71
210
  .btn {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ gap: 6px;
72
215
  background: var(--panel-2);
73
216
  color: var(--text);
74
217
  border: 1px solid var(--border);
75
- border-radius: 4px;
218
+ border-radius: var(--r-sm);
76
219
  padding: 4px 10px;
77
220
  cursor: pointer;
78
- font-size: 12px;
221
+ font-size: var(--text-base);
222
+ font-family: inherit;
223
+ transition:
224
+ background var(--dur-fast) var(--ease-out),
225
+ border-color var(--dur-fast) var(--ease-out),
226
+ color var(--dur-fast) var(--ease-out),
227
+ transform var(--dur-fast) var(--ease-out),
228
+ filter var(--dur-fast) var(--ease-out);
79
229
  }
80
230
 
81
231
  .btn:hover {
82
232
  border-color: var(--dim);
83
233
  }
84
234
 
235
+ .btn:focus-visible {
236
+ outline: none;
237
+ box-shadow: var(--ring);
238
+ }
239
+
240
+ .btn:active:not(:disabled) {
241
+ transform: translateY(0.5px);
242
+ }
243
+
244
+ .btn:disabled {
245
+ opacity: 0.5;
246
+ cursor: default;
247
+ }
248
+
85
249
  .btn.primary {
86
250
  background: var(--accent);
87
251
  border-color: var(--accent);
252
+ color: var(--accent-fg);
253
+ font-weight: 600;
254
+ }
255
+
256
+ .btn.primary:hover:not(:disabled),
257
+ .btn.danger:hover:not(:disabled) {
258
+ filter: brightness(1.08);
259
+ }
260
+
261
+ .btn.secondary {
262
+ background: var(--panel);
263
+ }
264
+
265
+ .btn.outline {
266
+ background: transparent;
267
+ border-color: var(--dim);
268
+ }
269
+
270
+ .btn.danger {
271
+ background: var(--error);
272
+ border-color: var(--error);
88
273
  color: #fff;
89
274
  font-weight: 600;
90
275
  }
91
276
 
277
+ .btn.btn-sm {
278
+ padding: 2px 8px;
279
+ font-size: var(--text-sm);
280
+ }
281
+
92
282
  .btn.ghost {
93
283
  background: transparent;
94
284
  border: none;
@@ -98,12 +288,35 @@ body {
98
288
 
99
289
  .btn.ghost:hover {
100
290
  color: var(--text);
291
+ background: var(--border-soft);
292
+ }
293
+
294
+ .btn.ghost:disabled,
295
+ .btn.ghost:disabled:hover {
296
+ background: transparent;
297
+ color: var(--dim);
101
298
  }
102
299
 
103
300
  .btn.ghost.on {
104
301
  color: var(--accent);
105
302
  }
106
303
 
304
+ /* Consistent keyboard focus ring across interactive surfaces. */
305
+ .tab:focus-visible,
306
+ .session-entry:focus-visible,
307
+ .tab-model:focus-visible,
308
+ .context-menu button:focus-visible,
309
+ .tab-add-item:focus-visible,
310
+ .palette-item:focus-visible,
311
+ .statusbar-attention:focus-visible,
312
+ .statusbar-te:focus-visible,
313
+ .merge-badge:focus-visible,
314
+ .rename-input:focus-visible,
315
+ .palette-input:focus-visible {
316
+ outline: none;
317
+ box-shadow: var(--ring);
318
+ }
319
+
107
320
  .row {
108
321
  display: flex;
109
322
  gap: 8px;
@@ -112,8 +325,8 @@ body {
112
325
  /* ---------- sidebar ---------- */
113
326
 
114
327
  .sidebar {
115
- width: 220px;
116
- min-width: 220px;
328
+ width: 248px;
329
+ min-width: 248px;
117
330
  background: var(--panel);
118
331
  border-right: 1px solid var(--border);
119
332
  display: flex;
@@ -124,11 +337,9 @@ body {
124
337
  display: flex;
125
338
  justify-content: space-between;
126
339
  align-items: center;
127
- /* Wrap when the action buttons can't all fit on one row, so none (e.g. the
128
- new-session button) gets clipped off the right edge of the 220px rail. */
129
- flex-wrap: wrap;
130
- gap: 4px 8px;
131
- padding: 10px 12px 6px;
340
+ flex-wrap: nowrap;
341
+ gap: 8px;
342
+ padding: 10px 10px 6px 12px;
132
343
  font-size: 11px;
133
344
  font-weight: 600;
134
345
  letter-spacing: 0.08em;
@@ -136,15 +347,26 @@ body {
136
347
  color: var(--dim);
137
348
  }
138
349
 
139
- /* Tighten the header's icon-button row so more fit before wrapping. */
350
+ .sidebar-header > span:first-child {
351
+ flex: 1;
352
+ min-width: 0;
353
+ overflow: hidden;
354
+ text-overflow: ellipsis;
355
+ }
356
+
140
357
  .sidebar-header .row {
141
- flex-wrap: wrap;
358
+ flex: none;
359
+ flex-wrap: nowrap;
142
360
  justify-content: flex-end;
143
361
  gap: 2px;
144
362
  }
145
363
 
146
- .sidebar-header .row .btn.ghost {
147
- padding: 2px 4px;
364
+ /* Square icon buttons in the header uniform hit targets with a hover affordance. */
365
+ .sidebar-header .row .btn.ghost.icon-btn {
366
+ width: 24px;
367
+ height: 24px;
368
+ padding: 0;
369
+ border-radius: var(--r-sm);
148
370
  }
149
371
 
150
372
  .sidebar-list {
@@ -159,6 +381,7 @@ body {
159
381
  padding: 7px 8px 7px 10px;
160
382
  border-left: 3px solid transparent;
161
383
  cursor: pointer;
384
+ transition: background var(--dur-fast) var(--ease-out);
162
385
  }
163
386
 
164
387
  .session-entry:hover {
@@ -166,16 +389,20 @@ body {
166
389
  }
167
390
 
168
391
  .session-entry.active {
169
- background: var(--panel-2);
392
+ background: var(--accent-soft);
170
393
  border-left-color: var(--accent);
171
394
  }
172
395
 
173
396
  .session-entry .close {
174
- visibility: hidden;
397
+ opacity: 0;
398
+ pointer-events: none;
399
+ transition: opacity var(--dur-fast) var(--ease-out);
175
400
  }
176
401
 
177
- .session-entry:hover .close {
178
- visibility: visible;
402
+ .session-entry:hover .close,
403
+ .session-entry:focus-within .close {
404
+ opacity: 1;
405
+ pointer-events: auto;
179
406
  }
180
407
 
181
408
  .session-meta {
@@ -205,7 +432,7 @@ body {
205
432
  .rename-input {
206
433
  background: var(--bg);
207
434
  border: 1px solid var(--accent);
208
- border-radius: 3px;
435
+ border-radius: var(--r-sm);
209
436
  color: var(--text);
210
437
  font-size: 13px;
211
438
  padding: 1px 4px;
@@ -214,28 +441,27 @@ body {
214
441
 
215
442
  .glyph {
216
443
  width: 14px;
217
- text-align: center;
218
- font-size: 13px;
444
+ height: 14px;
445
+ display: inline-flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ flex: none;
219
449
  }
220
450
 
221
451
  .glyph.status-working {
222
452
  color: var(--working);
223
453
  animation: spin 1.2s linear infinite;
224
- display: inline-block;
225
454
  }
226
455
 
227
456
  /* Blocked on the user — the only nagging signal: amber, breathing pulse. */
228
457
  .glyph.status-needs-attention {
229
458
  color: var(--attention);
230
- display: inline-block;
231
459
  animation: pulse 1.4s ease-in-out infinite;
232
460
  }
233
461
 
234
462
  /* Finished a turn — your turn now: green check that pops in once, then rests. */
235
463
  .glyph.status-done {
236
464
  color: var(--green);
237
- font-weight: 700;
238
- display: inline-block;
239
465
  animation: done-pop 0.5s ease-out;
240
466
  }
241
467
 
@@ -286,9 +512,10 @@ body {
286
512
  .watchdog-badge {
287
513
  flex: none;
288
514
  width: 14px;
289
- text-align: center;
290
- font-size: 12px;
291
- line-height: 14px;
515
+ height: 14px;
516
+ display: inline-flex;
517
+ align-items: center;
518
+ justify-content: center;
292
519
  cursor: help;
293
520
  animation: pulse 1.5s ease-in-out infinite;
294
521
  }
@@ -353,6 +580,65 @@ body {
353
580
  color: var(--attention);
354
581
  }
355
582
 
583
+ /* Spend-budget progress bars, shown below the collapsed usage bar when set. */
584
+ .usage-budgets {
585
+ display: flex;
586
+ flex-direction: column;
587
+ gap: 8px;
588
+ padding: 0 12px 10px;
589
+ }
590
+
591
+ .usage-limit {
592
+ display: flex;
593
+ flex-direction: column;
594
+ gap: 3px;
595
+ }
596
+
597
+ .usage-limit-head {
598
+ display: flex;
599
+ justify-content: space-between;
600
+ gap: 8px;
601
+ font-size: 11px;
602
+ }
603
+
604
+ .usage-limit-label {
605
+ color: var(--dim);
606
+ }
607
+
608
+ .usage-limit-value {
609
+ font-variant-numeric: tabular-nums;
610
+ }
611
+
612
+ .usage-limit-track {
613
+ height: 5px;
614
+ border-radius: 3px;
615
+ background: var(--panel-2);
616
+ overflow: hidden;
617
+ }
618
+
619
+ .usage-limit-fill {
620
+ height: 100%;
621
+ border-radius: 3px;
622
+ transition: width 0.3s ease;
623
+ }
624
+
625
+ .usage-limit-fill.neutral {
626
+ background: var(--working);
627
+ }
628
+
629
+ .usage-limit-fill.amber {
630
+ background: var(--attention);
631
+ }
632
+
633
+ .usage-limit-fill.red {
634
+ background: var(--error);
635
+ }
636
+
637
+ .usage-limit-warn {
638
+ font-size: 11px;
639
+ color: var(--attention);
640
+ }
641
+
356
642
  .usage-window {
357
643
  display: flex;
358
644
  flex-direction: column;
@@ -373,15 +659,16 @@ body {
373
659
  max-width: calc(100vw - 24px);
374
660
  max-height: 70vh;
375
661
  overflow-y: auto;
376
- background: var(--panel-2);
662
+ background: var(--panel-3);
377
663
  border: 1px solid var(--border);
378
- border-radius: 10px;
664
+ border-radius: var(--r-md);
379
665
  padding: 12px 14px;
380
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);
666
+ box-shadow: var(--shadow-3);
381
667
  display: flex;
382
668
  flex-direction: column;
383
669
  gap: 8px;
384
670
  font-size: 12px;
671
+ animation: popover-in var(--dur-fast) var(--ease-out);
385
672
  }
386
673
 
387
674
  .usage-summary {
@@ -613,6 +900,11 @@ body {
613
900
  background: rgba(217, 119, 87, 0.16);
614
901
  }
615
902
 
903
+ .tree-row.file.selected {
904
+ background: rgba(217, 119, 87, 0.28);
905
+ box-shadow: inset 2px 0 0 var(--accent);
906
+ }
907
+
616
908
  .flash-dot {
617
909
  font-size: 10px;
618
910
  color: var(--attention);
@@ -1093,15 +1385,16 @@ body {
1093
1385
 
1094
1386
  .context-menu {
1095
1387
  position: fixed;
1096
- z-index: 100;
1097
- background: var(--panel-2);
1388
+ z-index: var(--z-dropdown);
1389
+ background: var(--panel-3);
1098
1390
  border: 1px solid var(--border);
1099
- border-radius: 6px;
1391
+ border-radius: var(--r-md);
1100
1392
  padding: 4px;
1101
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
1393
+ box-shadow: var(--shadow-2);
1102
1394
  display: flex;
1103
1395
  flex-direction: column;
1104
1396
  min-width: 170px;
1397
+ animation: popover-in var(--dur-fast) var(--ease-out);
1105
1398
  }
1106
1399
 
1107
1400
  .context-menu button {
@@ -1116,8 +1409,8 @@ body {
1116
1409
  }
1117
1410
 
1118
1411
  .context-menu button:hover {
1119
- background: var(--accent);
1120
- color: #fff;
1412
+ background: var(--accent-soft);
1413
+ color: var(--text);
1121
1414
  }
1122
1415
 
1123
1416
  /* ---------- main area ---------- */
@@ -1168,29 +1461,51 @@ body {
1168
1461
  cursor: pointer;
1169
1462
  color: var(--dim);
1170
1463
  white-space: nowrap;
1464
+ position: relative;
1465
+ transition:
1466
+ background var(--dur-fast) var(--ease-out),
1467
+ color var(--dur-fast) var(--ease-out);
1171
1468
  }
1172
1469
 
1173
1470
  .tab:hover {
1174
1471
  color: var(--text);
1175
1472
  }
1176
1473
 
1474
+ .tab:hover:not(.active) {
1475
+ background: var(--panel-2);
1476
+ }
1477
+
1177
1478
  .tab.active {
1178
1479
  background: var(--bg);
1179
1480
  color: var(--text);
1180
1481
  }
1181
1482
 
1483
+ .tab.active::after {
1484
+ content: '';
1485
+ position: absolute;
1486
+ left: 0;
1487
+ right: 0;
1488
+ bottom: -1px;
1489
+ height: 2px;
1490
+ background: var(--accent);
1491
+ }
1492
+
1182
1493
  .tab-icon {
1183
1494
  font-size: 11px;
1184
1495
  color: var(--accent);
1185
1496
  }
1186
1497
 
1187
1498
  .tab .close {
1188
- visibility: hidden;
1499
+ opacity: 0;
1500
+ pointer-events: none;
1189
1501
  font-size: 10px;
1502
+ transition: opacity var(--dur-fast) var(--ease-out);
1190
1503
  }
1191
1504
 
1192
- .tab:hover .close {
1193
- visibility: visible;
1505
+ .tab:hover .close,
1506
+ .tab:focus-within .close {
1507
+ opacity: 1;
1508
+ pointer-events: auto;
1194
1509
  }
1195
1510
 
1196
1511
  .tab-kind {
@@ -1210,19 +1525,19 @@ body {
1210
1525
 
1211
1526
  /* Per-claude-tab model switcher */
1212
1527
  .tab-model {
1213
- background: var(--bg);
1528
+ background: var(--panel-2);
1214
1529
  border: 1px solid var(--border);
1215
- border-radius: 3px;
1216
- color: var(--dim);
1217
- font-size: 10px;
1218
- padding: 0 2px;
1219
- max-width: 74px;
1530
+ border-radius: var(--r-sm);
1531
+ color: var(--text-2);
1532
+ font-size: 11px;
1533
+ height: 22px;
1534
+ padding: 0 6px;
1220
1535
  cursor: pointer;
1221
1536
  }
1222
1537
 
1223
1538
  .tab-model:hover {
1224
1539
  color: var(--text);
1225
- border-color: var(--accent);
1540
+ border-color: var(--accent-border);
1226
1541
  }
1227
1542
 
1228
1543
  /* Add-terminal dropdown */
@@ -1247,13 +1562,14 @@ body {
1247
1562
 
1248
1563
  .tab-add-menu {
1249
1564
  position: fixed;
1250
- z-index: 100;
1565
+ z-index: var(--z-dropdown);
1251
1566
  min-width: 150px;
1252
- background: var(--panel-2);
1567
+ background: var(--panel-3);
1253
1568
  border: 1px solid var(--border);
1254
- border-radius: 4px;
1569
+ border-radius: var(--r-md);
1255
1570
  padding: 4px;
1256
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
1571
+ box-shadow: var(--shadow-2);
1572
+ animation: popover-in var(--dur-fast) var(--ease-out);
1257
1573
  }
1258
1574
 
1259
1575
  .tab-add-item {
@@ -1264,7 +1580,7 @@ body {
1264
1580
  padding: 6px 10px;
1265
1581
  background: none;
1266
1582
  border: none;
1267
- border-radius: 3px;
1583
+ border-radius: var(--r-sm);
1268
1584
  color: var(--text);
1269
1585
  text-align: left;
1270
1586
  cursor: pointer;
@@ -1272,7 +1588,7 @@ body {
1272
1588
  }
1273
1589
 
1274
1590
  .tab-add-item:hover {
1275
- background: var(--accent);
1591
+ background: var(--accent-soft);
1276
1592
  }
1277
1593
 
1278
1594
  .session-termcount {
@@ -1319,11 +1635,15 @@ body {
1319
1635
  /* ---------- worktree (parallel task) sessions ---------- */
1320
1636
 
1321
1637
  .session-entry .fork {
1322
- visibility: hidden;
1638
+ opacity: 0;
1639
+ pointer-events: none;
1640
+ transition: opacity var(--dur-fast) var(--ease-out);
1323
1641
  }
1324
1642
 
1325
- .session-entry:hover .fork {
1326
- visibility: visible;
1643
+ .session-entry:hover .fork,
1644
+ .session-entry:focus-within .fork {
1645
+ opacity: 1;
1646
+ pointer-events: auto;
1327
1647
  }
1328
1648
 
1329
1649
  /* Indent worktree tasks under their parent, with a connector tick. */
@@ -1354,14 +1674,16 @@ body {
1354
1674
  max-width: 150px;
1355
1675
  }
1356
1676
 
1357
- .merge-btn {
1677
+ .merge-btn,
1678
+ .review-btn {
1358
1679
  font-size: 11px;
1359
1680
  padding: 1px 7px;
1360
1681
  border: 1px solid var(--border);
1361
1682
  border-radius: 4px;
1362
1683
  }
1363
1684
 
1364
- .merge-btn:hover {
1685
+ .merge-btn:hover,
1686
+ .review-btn:hover {
1365
1687
  border-color: var(--accent);
1366
1688
  color: var(--accent);
1367
1689
  }
@@ -1419,14 +1741,18 @@ body {
1419
1741
  /* ---------- prompt queue ---------- */
1420
1742
 
1421
1743
  .session-entry .queue-btn {
1422
- visibility: hidden;
1744
+ opacity: 0;
1745
+ pointer-events: none;
1423
1746
  position: relative;
1747
+ transition: opacity var(--dur-fast) var(--ease-out);
1424
1748
  }
1425
1749
 
1426
1750
  /* With queued prompts, the button (and its count badge) is always visible. */
1427
1751
  .session-entry:hover .queue-btn,
1752
+ .session-entry:focus-within .queue-btn,
1428
1753
  .session-entry .queue-btn.has-items {
1429
- visibility: visible;
1754
+ opacity: 1;
1755
+ pointer-events: auto;
1430
1756
  }
1431
1757
 
1432
1758
  .queue-badge {
@@ -1457,14 +1783,15 @@ body {
1457
1783
  position: fixed;
1458
1784
  width: 340px;
1459
1785
  max-width: calc(100vw - 24px);
1460
- background: var(--panel);
1786
+ background: var(--panel-3);
1461
1787
  border: 1px solid var(--border);
1462
- border-radius: 8px;
1788
+ border-radius: var(--r-md);
1463
1789
  padding: 10px 12px;
1464
1790
  display: flex;
1465
1791
  flex-direction: column;
1466
1792
  gap: 8px;
1467
- box-shadow: 0 12px 36px rgba(0, 0, 0, 0.55);
1793
+ box-shadow: var(--shadow-3);
1794
+ animation: popover-in var(--dur-fast) var(--ease-out);
1468
1795
  }
1469
1796
 
1470
1797
  .queue-popover-title {
@@ -1565,17 +1892,20 @@ body {
1565
1892
  .modal-overlay {
1566
1893
  position: fixed;
1567
1894
  inset: 0;
1568
- z-index: 200;
1569
- background: rgba(0, 0, 0, 0.55);
1895
+ z-index: var(--z-modal);
1896
+ background: rgba(10, 11, 14, 0.55);
1897
+ backdrop-filter: blur(6px) saturate(120%);
1898
+ -webkit-backdrop-filter: blur(6px) saturate(120%);
1570
1899
  display: flex;
1571
1900
  align-items: center;
1572
1901
  justify-content: center;
1902
+ animation: overlay-in var(--dur-base) var(--ease-out);
1573
1903
  }
1574
1904
 
1575
1905
  .modal {
1576
- background: var(--panel);
1906
+ background: var(--panel-3);
1577
1907
  border: 1px solid var(--border);
1578
- border-radius: 10px;
1908
+ border-radius: var(--r-lg);
1579
1909
  padding: 18px 20px;
1580
1910
  width: 420px;
1581
1911
  max-width: 90vw;
@@ -1584,7 +1914,8 @@ body {
1584
1914
  display: flex;
1585
1915
  flex-direction: column;
1586
1916
  gap: 12px;
1587
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
1917
+ box-shadow: var(--shadow-4);
1918
+ animation: modal-in var(--dur-base) var(--ease-out);
1588
1919
  }
1589
1920
 
1590
1921
  .modal-wide {
@@ -1628,18 +1959,22 @@ body {
1628
1959
  .field textarea {
1629
1960
  background: var(--bg);
1630
1961
  border: 1px solid var(--border);
1631
- border-radius: 4px;
1962
+ border-radius: var(--r-sm);
1632
1963
  color: var(--text);
1633
1964
  font-size: 13px;
1634
1965
  padding: 5px 8px;
1635
1966
  outline: none;
1636
1967
  font-family: inherit;
1968
+ transition:
1969
+ border-color var(--dur-fast) var(--ease-out),
1970
+ box-shadow var(--dur-fast) var(--ease-out);
1637
1971
  }
1638
1972
 
1639
1973
  .field input:focus,
1640
1974
  .field select:focus,
1641
1975
  .field textarea:focus {
1642
1976
  border-color: var(--accent);
1977
+ box-shadow: var(--ring);
1643
1978
  }
1644
1979
 
1645
1980
  .field-hint {
@@ -1670,6 +2005,15 @@ body {
1670
2005
  cursor: pointer;
1671
2006
  }
1672
2007
 
2008
+ .check-row.disabled {
2009
+ opacity: 0.5;
2010
+ cursor: default;
2011
+ }
2012
+
2013
+ .check-row.disabled input[type='checkbox'] {
2014
+ cursor: default;
2015
+ }
2016
+
1673
2017
  .check-row > span {
1674
2018
  display: flex;
1675
2019
  flex-direction: column;
@@ -1716,6 +2060,63 @@ body {
1716
2060
  font-size: 12px;
1717
2061
  }
1718
2062
 
2063
+ /* resume picker — list of prior conversations */
2064
+ .conv-list {
2065
+ display: flex;
2066
+ flex-direction: column;
2067
+ gap: 4px;
2068
+ max-height: 260px;
2069
+ overflow-y: auto;
2070
+ }
2071
+
2072
+ .conv-item {
2073
+ display: flex;
2074
+ flex-direction: column;
2075
+ gap: 2px;
2076
+ align-items: flex-start;
2077
+ text-align: left;
2078
+ background: var(--bg);
2079
+ border: 1px solid var(--border);
2080
+ border-radius: 4px;
2081
+ color: var(--text);
2082
+ padding: 6px 9px;
2083
+ cursor: pointer;
2084
+ font: inherit;
2085
+ width: 100%;
2086
+ }
2087
+
2088
+ .conv-item:hover {
2089
+ border-color: var(--accent);
2090
+ }
2091
+
2092
+ .conv-item.sel {
2093
+ border-color: var(--accent);
2094
+ background: var(--panel-2);
2095
+ }
2096
+
2097
+ .conv-preview {
2098
+ font-size: 13px;
2099
+ overflow: hidden;
2100
+ text-overflow: ellipsis;
2101
+ white-space: nowrap;
2102
+ width: 100%;
2103
+ }
2104
+
2105
+ .conv-meta {
2106
+ font-size: 11px;
2107
+ color: var(--dim);
2108
+ }
2109
+
2110
+ .conv-fresh {
2111
+ margin-bottom: 2px;
2112
+ }
2113
+
2114
+ .conv-empty {
2115
+ font-size: 12px;
2116
+ color: var(--dim);
2117
+ padding: 8px 2px;
2118
+ }
2119
+
1719
2120
  .bg-preview {
1720
2121
  height: 140px;
1721
2122
  border: 1px solid var(--border);
@@ -1744,11 +2145,43 @@ body {
1744
2145
  .modal-error {
1745
2146
  background: rgba(229, 72, 77, 0.15);
1746
2147
  color: var(--error);
1747
- border-radius: 4px;
2148
+ border-radius: var(--r-sm);
1748
2149
  padding: 6px 10px;
1749
2150
  font-size: 12px;
1750
2151
  }
1751
2152
 
2153
+ /* Entrance animations (auto-disabled by .reduce-motion and prefers-reduced-motion). */
2154
+ @keyframes overlay-in {
2155
+ from {
2156
+ opacity: 0;
2157
+ }
2158
+ to {
2159
+ opacity: 1;
2160
+ }
2161
+ }
2162
+
2163
+ @keyframes modal-in {
2164
+ from {
2165
+ opacity: 0;
2166
+ transform: translateY(6px) scale(0.985);
2167
+ }
2168
+ to {
2169
+ opacity: 1;
2170
+ transform: none;
2171
+ }
2172
+ }
2173
+
2174
+ @keyframes popover-in {
2175
+ from {
2176
+ opacity: 0;
2177
+ transform: translateY(4px);
2178
+ }
2179
+ to {
2180
+ opacity: 1;
2181
+ transform: none;
2182
+ }
2183
+ }
2184
+
1752
2185
  /* ---------- broadcast-prompt dialog ---------- */
1753
2186
 
1754
2187
  .broadcast-list-header {
@@ -1811,10 +2244,120 @@ body {
1811
2244
  padding-left: 8px;
1812
2245
  }
1813
2246
 
1814
- /* ---------- global search palette ---------- */
2247
+ /* ---------- repo status overview dialog ---------- */
1815
2248
 
1816
- .gs-overlay {
1817
- position: fixed;
2249
+ .repo-overview-header {
2250
+ display: flex;
2251
+ align-items: center;
2252
+ justify-content: space-between;
2253
+ }
2254
+
2255
+ .repo-overview-header-actions {
2256
+ display: flex;
2257
+ align-items: center;
2258
+ gap: 10px;
2259
+ }
2260
+
2261
+ .repo-overview-header-actions .btn {
2262
+ font-size: 11px;
2263
+ padding: 1px 8px;
2264
+ text-transform: none;
2265
+ letter-spacing: normal;
2266
+ }
2267
+
2268
+ .repo-overview-loading {
2269
+ font-size: 11px;
2270
+ color: var(--dim);
2271
+ }
2272
+
2273
+ .repo-overview-list {
2274
+ border: 1px solid var(--border);
2275
+ border-radius: 4px;
2276
+ background: var(--bg);
2277
+ max-height: 60vh;
2278
+ overflow-y: auto;
2279
+ }
2280
+
2281
+ .repo-overview-empty {
2282
+ padding: 12px;
2283
+ font-size: 12px;
2284
+ color: var(--dim);
2285
+ }
2286
+
2287
+ .repo-overview-row {
2288
+ display: flex;
2289
+ align-items: center;
2290
+ gap: 10px;
2291
+ padding: 7px 10px;
2292
+ font-size: 13px;
2293
+ cursor: pointer;
2294
+ border-left: 2px solid transparent;
2295
+ }
2296
+
2297
+ .repo-overview-row:hover {
2298
+ background: var(--panel-2);
2299
+ }
2300
+
2301
+ .repo-overview-row.flagged {
2302
+ border-left-color: var(--attention);
2303
+ }
2304
+
2305
+ .repo-overview-main {
2306
+ display: flex;
2307
+ flex-direction: column;
2308
+ min-width: 0;
2309
+ flex: 1;
2310
+ }
2311
+
2312
+ .repo-overview-name {
2313
+ overflow: hidden;
2314
+ text-overflow: ellipsis;
2315
+ white-space: nowrap;
2316
+ }
2317
+
2318
+ .repo-overview-sub {
2319
+ font-size: 11px;
2320
+ color: var(--dim);
2321
+ font-family: 'Cascadia Mono', Consolas, monospace;
2322
+ overflow: hidden;
2323
+ text-overflow: ellipsis;
2324
+ white-space: nowrap;
2325
+ }
2326
+
2327
+ .repo-overview-chips {
2328
+ padding: 0;
2329
+ flex: 0 0 auto;
2330
+ justify-content: flex-end;
2331
+ }
2332
+
2333
+ .repo-overview-note {
2334
+ font-size: 11px;
2335
+ color: var(--dim);
2336
+ white-space: nowrap;
2337
+ }
2338
+
2339
+ .repo-overview-note.error {
2340
+ color: var(--error);
2341
+ }
2342
+
2343
+ .repo-overview-subhead {
2344
+ font-size: 11px;
2345
+ text-transform: uppercase;
2346
+ letter-spacing: 0.5px;
2347
+ color: var(--dim);
2348
+ padding: 8px 10px 4px;
2349
+ border-top: 1px solid var(--border);
2350
+ margin-top: 4px;
2351
+ }
2352
+
2353
+ .repo-overview-row.non-repo .repo-overview-name {
2354
+ color: var(--dim);
2355
+ }
2356
+
2357
+ /* ---------- global search palette ---------- */
2358
+
2359
+ .gs-overlay {
2360
+ position: fixed;
1818
2361
  inset: 0;
1819
2362
  z-index: 200;
1820
2363
  background: rgba(0, 0, 0, 0.45);
@@ -1825,15 +2368,16 @@ body {
1825
2368
  }
1826
2369
 
1827
2370
  .gs-palette {
1828
- background: var(--panel);
2371
+ background: var(--panel-3);
1829
2372
  border: 1px solid var(--border);
1830
- border-radius: 10px;
2373
+ border-radius: var(--r-lg);
1831
2374
  width: 640px;
1832
2375
  max-width: 90vw;
1833
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
2376
+ box-shadow: var(--shadow-4);
1834
2377
  display: flex;
1835
2378
  flex-direction: column;
1836
2379
  overflow: hidden;
2380
+ animation: modal-in var(--dur-base) var(--ease-out);
1837
2381
  }
1838
2382
 
1839
2383
  .gs-input-row {
@@ -1949,30 +2493,81 @@ body {
1949
2493
  color: var(--dim);
1950
2494
  }
1951
2495
 
2496
+ /* ---------- conversation history recall (Ctrl+Shift+H) ---------- */
2497
+
2498
+ .hr-row {
2499
+ padding: 6px 12px;
2500
+ cursor: pointer;
2501
+ border-left: 2px solid transparent;
2502
+ }
2503
+
2504
+ .hr-row.sel {
2505
+ background: var(--panel-2);
2506
+ border-left-color: var(--accent);
2507
+ }
2508
+
2509
+ .hr-head {
2510
+ display: flex;
2511
+ align-items: center;
2512
+ gap: 8px;
2513
+ margin-bottom: 2px;
2514
+ }
2515
+
2516
+ .hr-repo {
2517
+ font-size: 12px;
2518
+ font-weight: 600;
2519
+ color: var(--text);
2520
+ }
2521
+
2522
+ .hr-ago {
2523
+ font-size: 11px;
2524
+ color: var(--dim);
2525
+ }
2526
+
2527
+ .hr-count {
2528
+ margin-left: auto;
2529
+ font-size: 10px;
2530
+ color: var(--dim);
2531
+ border: 1px solid var(--border);
2532
+ border-radius: 3px;
2533
+ padding: 0 4px;
2534
+ white-space: nowrap;
2535
+ }
2536
+
2537
+ .hr-row .gs-snippet {
2538
+ display: block;
2539
+ font-family: 'Cascadia Mono', Consolas, monospace;
2540
+ font-size: 12px;
2541
+ }
2542
+
1952
2543
  /* ---------- command palette (Ctrl+K) ---------- */
1953
2544
 
1954
2545
  .palette-overlay {
1955
2546
  position: fixed;
1956
2547
  inset: 0;
1957
2548
  z-index: 300;
1958
- background: rgba(0, 0, 0, 0.45);
2549
+ background: rgba(10, 11, 14, 0.5);
2550
+ backdrop-filter: blur(6px) saturate(120%);
2551
+ -webkit-backdrop-filter: blur(6px) saturate(120%);
1959
2552
  display: flex;
1960
2553
  align-items: flex-start;
1961
2554
  justify-content: center;
1962
2555
  padding-top: 12vh;
2556
+ animation: overlay-in var(--dur-base) var(--ease-out);
1963
2557
  }
1964
2558
 
1965
2559
  .palette {
1966
- background: var(--panel);
2560
+ background: var(--panel-3);
1967
2561
  border: 1px solid var(--border);
1968
- border-radius: 10px;
2562
+ border-radius: var(--r-lg);
1969
2563
  width: 560px;
1970
2564
  max-width: 90vw;
1971
2565
  max-height: 60vh;
1972
2566
  display: flex;
1973
2567
  flex-direction: column;
1974
2568
  overflow: hidden;
1975
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
2569
+ box-shadow: var(--shadow-4);
2570
+ animation: modal-in var(--dur-base) var(--ease-out);
1976
2571
  }
1977
2572
 
1978
2573
  .palette-input {
@@ -2015,11 +2610,14 @@ body {
2015
2610
  text-overflow: ellipsis;
2016
2611
  }
2017
2612
 
2018
- .palette-item.sel,
2019
2613
  .palette-item:hover {
2020
2614
  background: var(--panel-2);
2021
2615
  }
2022
2616
 
2617
+ .palette-item.sel {
2618
+ background: var(--accent-soft);
2619
+ }
2620
+
2023
2621
  .palette-sub {
2024
2622
  color: var(--dim);
2025
2623
  font-size: 11px;
@@ -2191,6 +2789,132 @@ body {
2191
2789
  min-height: 0;
2192
2790
  }
2193
2791
 
2792
+ /* ---------- handoff notes strip ---------- */
2793
+
2794
+ .handoff-strip {
2795
+ flex: none;
2796
+ border-bottom: 1px solid var(--border);
2797
+ background: var(--panel);
2798
+ }
2799
+
2800
+ .handoff-icon {
2801
+ opacity: 0.8;
2802
+ }
2803
+
2804
+ /* Empty + collapsed: a minimal, unobtrusive "Add note" affordance. */
2805
+ .handoff-strip.collapsed.empty {
2806
+ border-bottom: none;
2807
+ background: transparent;
2808
+ }
2809
+
2810
+ .handoff-add {
2811
+ background: transparent;
2812
+ border: none;
2813
+ color: var(--dim);
2814
+ cursor: pointer;
2815
+ font-size: 12px;
2816
+ padding: 3px 10px;
2817
+ }
2818
+
2819
+ .handoff-add:hover {
2820
+ color: var(--text);
2821
+ }
2822
+
2823
+ /* Non-empty + collapsed: a compact read-only preview, click to edit. */
2824
+ .handoff-strip.collapsed:not(.empty) {
2825
+ display: flex;
2826
+ align-items: flex-start;
2827
+ gap: 8px;
2828
+ padding: 5px 10px;
2829
+ cursor: pointer;
2830
+ }
2831
+
2832
+ .handoff-strip.collapsed:not(.empty):hover {
2833
+ background: var(--panel-2);
2834
+ }
2835
+
2836
+ .handoff-preview {
2837
+ flex: 1;
2838
+ min-width: 0;
2839
+ max-height: 3.4em;
2840
+ overflow: hidden;
2841
+ position: relative;
2842
+ color: var(--dim);
2843
+ font-size: 12px;
2844
+ }
2845
+
2846
+ /* Fade the clipped bottom edge so the preview reads as truncated. */
2847
+ .handoff-preview::after {
2848
+ content: '';
2849
+ position: absolute;
2850
+ inset: auto 0 0 0;
2851
+ height: 1.1em;
2852
+ background: linear-gradient(transparent, var(--panel));
2853
+ pointer-events: none;
2854
+ }
2855
+
2856
+ .handoff-strip.collapsed:not(.empty):hover .handoff-preview::after {
2857
+ background: linear-gradient(transparent, var(--panel-2));
2858
+ }
2859
+
2860
+ .handoff-preview .md {
2861
+ font-size: 12px;
2862
+ }
2863
+
2864
+ .handoff-preview .md > :first-child {
2865
+ margin-top: 0;
2866
+ }
2867
+
2868
+ /* Expanded: an inline editable scratchpad. */
2869
+ .handoff-strip.expanded {
2870
+ display: flex;
2871
+ flex-direction: column;
2872
+ padding: 6px 10px 8px;
2873
+ gap: 6px;
2874
+ }
2875
+
2876
+ .handoff-head {
2877
+ display: flex;
2878
+ align-items: center;
2879
+ gap: 10px;
2880
+ }
2881
+
2882
+ .handoff-label {
2883
+ font-size: 12px;
2884
+ font-weight: 600;
2885
+ color: var(--text);
2886
+ }
2887
+
2888
+ .handoff-hint {
2889
+ flex: 1;
2890
+ font-size: 11px;
2891
+ color: var(--dim);
2892
+ }
2893
+
2894
+ .handoff-collapse {
2895
+ padding: 2px 10px;
2896
+ font-size: 12px;
2897
+ }
2898
+
2899
+ .handoff-input {
2900
+ background: var(--bg);
2901
+ border: 1px solid var(--border);
2902
+ border-radius: 4px;
2903
+ color: var(--text);
2904
+ font-family: inherit;
2905
+ font-size: 13px;
2906
+ line-height: 1.5;
2907
+ min-height: 84px;
2908
+ max-height: 240px;
2909
+ padding: 6px 8px;
2910
+ outline: none;
2911
+ resize: vertical;
2912
+ }
2913
+
2914
+ .handoff-input:focus {
2915
+ border-color: var(--accent);
2916
+ }
2917
+
2194
2918
  /* ---------- terminal ---------- */
2195
2919
 
2196
2920
  .term-wrap {
@@ -2374,6 +3098,87 @@ body {
2374
3098
  color: var(--dim);
2375
3099
  }
2376
3100
 
3101
+ /* ---------- branch-review diff (changed-file list + combined diff) ---------- */
3102
+
3103
+ .branch-diff-layout {
3104
+ flex: 1;
3105
+ min-height: 0;
3106
+ display: flex;
3107
+ }
3108
+
3109
+ .branch-diff-files {
3110
+ flex: none;
3111
+ width: 240px;
3112
+ overflow-y: auto;
3113
+ border-right: 1px solid var(--border);
3114
+ background: var(--bg);
3115
+ }
3116
+
3117
+ .branch-diff-files-head {
3118
+ padding: 6px 10px;
3119
+ font-size: 11px;
3120
+ color: var(--dim);
3121
+ border-bottom: 1px solid var(--border);
3122
+ position: sticky;
3123
+ top: 0;
3124
+ background: var(--bg);
3125
+ }
3126
+
3127
+ .branch-diff-file {
3128
+ display: flex;
3129
+ align-items: center;
3130
+ gap: 7px;
3131
+ width: 100%;
3132
+ padding: 3px 10px;
3133
+ border: none;
3134
+ background: none;
3135
+ color: var(--text);
3136
+ font-size: 12px;
3137
+ text-align: left;
3138
+ cursor: pointer;
3139
+ }
3140
+
3141
+ .branch-diff-file:hover {
3142
+ background: var(--panel-2);
3143
+ }
3144
+
3145
+ .branch-diff-status {
3146
+ flex: none;
3147
+ width: 14px;
3148
+ text-align: center;
3149
+ font-family: 'Cascadia Mono', Consolas, monospace;
3150
+ font-weight: 700;
3151
+ font-size: 11px;
3152
+ }
3153
+
3154
+ .branch-diff-status.added {
3155
+ color: var(--green);
3156
+ }
3157
+
3158
+ .branch-diff-status.removed {
3159
+ color: var(--error);
3160
+ }
3161
+
3162
+ .branch-diff-status.modified {
3163
+ color: var(--working);
3164
+ }
3165
+
3166
+ .branch-diff-status.renamed {
3167
+ color: var(--accent);
3168
+ }
3169
+
3170
+ .branch-diff-name {
3171
+ overflow: hidden;
3172
+ text-overflow: ellipsis;
3173
+ white-space: nowrap;
3174
+ font-family: 'Cascadia Mono', Consolas, monospace;
3175
+ }
3176
+
3177
+ .branch-diff-layout .viewer-editor {
3178
+ flex: 1;
3179
+ min-width: 0;
3180
+ }
3181
+
2377
3182
  .viewer-image {
2378
3183
  flex: 1;
2379
3184
  display: flex;
@@ -2536,8 +3341,9 @@ body {
2536
3341
  .statusbar {
2537
3342
  display: flex;
2538
3343
  align-items: center;
2539
- gap: 14px;
2540
- padding: 4px 12px;
3344
+ gap: 10px;
3345
+ padding: 5px 12px;
3346
+ min-height: 28px;
2541
3347
  border-top: 1px solid var(--border);
2542
3348
  background: var(--panel);
2543
3349
  font-size: 11px;
@@ -2545,8 +3351,12 @@ body {
2545
3351
  }
2546
3352
 
2547
3353
  .status-pill {
2548
- padding: 1px 8px;
2549
- border-radius: 8px;
3354
+ flex: none;
3355
+ display: inline-flex;
3356
+ align-items: center;
3357
+ gap: 5px;
3358
+ padding: 1px 8px 1px 6px;
3359
+ border-radius: var(--r-lg);
2550
3360
  font-weight: 600;
2551
3361
  }
2552
3362
 
@@ -2577,15 +3387,21 @@ body {
2577
3387
  }
2578
3388
 
2579
3389
  .statusbar-folder {
3390
+ flex: 0 1 auto;
3391
+ min-width: 40px;
2580
3392
  overflow: hidden;
2581
3393
  text-overflow: ellipsis;
2582
3394
  white-space: nowrap;
2583
3395
  }
2584
3396
 
2585
3397
  .statusbar-attention {
3398
+ flex: none;
3399
+ display: inline-flex;
3400
+ align-items: center;
3401
+ gap: 4px;
2586
3402
  border: none;
2587
3403
  padding: 1px 8px;
2588
- border-radius: 8px;
3404
+ border-radius: var(--r-lg);
2589
3405
  font-size: 11px;
2590
3406
  font-weight: 600;
2591
3407
  cursor: pointer;
@@ -2598,6 +3414,7 @@ body {
2598
3414
  }
2599
3415
 
2600
3416
  .statusbar-age {
3417
+ flex: none;
2601
3418
  margin-left: auto;
2602
3419
  }
2603
3420
 
@@ -2814,6 +3631,23 @@ body {
2814
3631
  text-decoration: underline;
2815
3632
  }
2816
3633
 
3634
+ .sentinel-finding-actions {
3635
+ display: flex;
3636
+ align-items: center;
3637
+ gap: 6px;
3638
+ margin-top: 6px;
3639
+ }
3640
+
3641
+ .btn.ghost.sentinel-fix-btn {
3642
+ font-size: 10px;
3643
+ padding: 2px 6px;
3644
+ }
3645
+
3646
+ .sentinel-fix-ack {
3647
+ font-size: 10px;
3648
+ color: var(--accent);
3649
+ }
3650
+
2817
3651
  /* sentinel dialog */
2818
3652
  .sentinel-prompt {
2819
3653
  resize: vertical;
@@ -3143,31 +3977,86 @@ body {
3143
3977
 
3144
3978
  /* ---------- app notice (brief auto-dismissing confirmation) ---------- */
3145
3979
 
3146
- .app-notice {
3147
- position: fixed;
3148
- bottom: 36px;
3149
- left: 50%;
3150
- transform: translateX(-50%);
3151
- z-index: 400;
3152
- background: var(--panel-2);
3153
- border: 1px solid var(--border);
3154
- border-radius: 6px;
3155
- padding: 8px 16px;
3156
- font-size: 12px;
3157
- color: var(--text);
3158
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
3159
- pointer-events: none;
3160
- animation: notice-in 0.15s ease-out;
3980
+ /* ---------- toasts (leveled, stacked bottom-right) ---------- */
3981
+
3982
+ .toasts {
3983
+ position: fixed;
3984
+ right: 16px;
3985
+ bottom: 16px;
3986
+ z-index: var(--z-toast);
3987
+ display: flex;
3988
+ flex-direction: column;
3989
+ gap: 8px;
3990
+ max-width: 360px;
3991
+ pointer-events: none;
3992
+ }
3993
+
3994
+ .toast {
3995
+ display: flex;
3996
+ align-items: flex-start;
3997
+ gap: 10px;
3998
+ background: var(--panel-3);
3999
+ border: 1px solid var(--border);
4000
+ border-left: 3px solid var(--dim);
4001
+ border-radius: var(--r-md);
4002
+ padding: 10px 12px;
4003
+ box-shadow: var(--shadow-3);
4004
+ font-size: 12px;
4005
+ color: var(--text);
4006
+ pointer-events: auto;
4007
+ animation: toast-in var(--dur-base) var(--ease-out);
4008
+ }
4009
+
4010
+ .toast .toast-icon {
4011
+ flex: none;
4012
+ margin-top: 1px;
4013
+ }
4014
+
4015
+ .toast.success {
4016
+ border-left-color: var(--green);
4017
+ }
4018
+ .toast.success .toast-icon {
4019
+ color: var(--green);
4020
+ }
4021
+ .toast.info {
4022
+ border-left-color: var(--working);
4023
+ }
4024
+ .toast.info .toast-icon {
4025
+ color: var(--working);
4026
+ }
4027
+ .toast.warn {
4028
+ border-left-color: var(--attention);
4029
+ }
4030
+ .toast.warn .toast-icon {
4031
+ color: var(--attention);
4032
+ }
4033
+ .toast.error {
4034
+ border-left-color: var(--error);
4035
+ }
4036
+ .toast.error .toast-icon {
4037
+ color: var(--error);
4038
+ }
4039
+
4040
+ .toast-text {
4041
+ flex: 1;
4042
+ line-height: 1.4;
4043
+ padding-top: 1px;
4044
+ }
4045
+
4046
+ .toast .toast-close {
4047
+ flex: none;
4048
+ margin: -2px -4px 0 0;
4049
+ color: var(--dim);
3161
4050
  }
3162
4051
 
3163
- @keyframes notice-in {
4052
+ @keyframes toast-in {
3164
4053
  from {
3165
4054
  opacity: 0;
3166
- transform: translateX(-50%) translateY(6px);
4055
+ transform: translateY(8px);
3167
4056
  }
3168
4057
  to {
3169
4058
  opacity: 1;
3170
- transform: translateX(-50%) translateY(0);
4059
+ transform: none;
3171
4060
  }
3172
4061
  }
3173
4062
 
@@ -4792,10 +5681,23 @@ body {
4792
5681
  display: flex;
4793
5682
  align-items: center;
4794
5683
  gap: 10px;
5684
+ flex: 0 1 auto;
5685
+ overflow: hidden;
4795
5686
  white-space: nowrap;
4796
5687
  }
4797
5688
 
5689
+ .statusbar-tokens > span {
5690
+ display: inline-flex;
5691
+ align-items: center;
5692
+ gap: 4px;
5693
+ overflow: hidden;
5694
+ text-overflow: ellipsis;
5695
+ }
5696
+
4798
5697
  .statusbar-te {
5698
+ display: inline-flex;
5699
+ align-items: center;
5700
+ gap: 4px;
4799
5701
  background: none;
4800
5702
  border: none;
4801
5703
  font: inherit;
@@ -4807,6 +5709,384 @@ body {
4807
5709
  .statusbar-te.pending {
4808
5710
  color: var(--attention);
4809
5711
  }
5712
+
5713
+ /* ===================== gamification ===================== */
5714
+
5715
+ /* --- XP progress bar primitive (also used in the Arcade) --- */
5716
+ .xp-bar {
5717
+ flex: 1;
5718
+ height: 7px;
5719
+ border-radius: 4px;
5720
+ background: var(--border);
5721
+ overflow: hidden;
5722
+ }
5723
+ .xp-bar.lg {
5724
+ height: 10px;
5725
+ }
5726
+ .xp-bar-fill {
5727
+ height: 100%;
5728
+ border-radius: 4px;
5729
+ background: linear-gradient(90deg, var(--xp), var(--accent));
5730
+ transition: width 0.5s ease;
5731
+ }
5732
+
5733
+ /* --- sidebar XP HUD --- */
5734
+ .xp-hud {
5735
+ display: flex;
5736
+ align-items: center;
5737
+ gap: 8px;
5738
+ padding: 6px 10px;
5739
+ border-bottom: 1px solid var(--border);
5740
+ cursor: pointer;
5741
+ font-size: 11px;
5742
+ }
5743
+ .xp-hud:hover {
5744
+ background: var(--panel-2);
5745
+ }
5746
+ .xp-level {
5747
+ font-weight: 700;
5748
+ color: var(--level-up);
5749
+ white-space: nowrap;
5750
+ }
5751
+ .xp-streak {
5752
+ color: var(--attention);
5753
+ font-weight: 600;
5754
+ white-space: nowrap;
5755
+ }
5756
+
5757
+ /* --- celebration toast + confetti --- */
5758
+ .celebration {
5759
+ position: fixed;
5760
+ inset: 0;
5761
+ z-index: 600;
5762
+ pointer-events: none;
5763
+ overflow: hidden;
5764
+ }
5765
+ .celebration-card {
5766
+ position: absolute;
5767
+ left: 50%;
5768
+ bottom: 64px;
5769
+ transform: translateX(-50%);
5770
+ display: flex;
5771
+ align-items: center;
5772
+ gap: 12px;
5773
+ padding: 12px 18px;
5774
+ border-radius: 12px;
5775
+ background: var(--panel);
5776
+ border: 1px solid var(--accent);
5777
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
5778
+ animation: celebrate-pop 0.4s cubic-bezier(0.2, 1.4, 0.4, 1);
5779
+ }
5780
+ .celebration.kind-level-up .celebration-card {
5781
+ border-color: var(--level-up);
5782
+ box-shadow: 0 0 32px rgba(255, 213, 74, 0.35), 0 12px 40px rgba(0, 0, 0, 0.55);
5783
+ animation: celebrate-pop 0.4s cubic-bezier(0.2, 1.4, 0.4, 1), level-up-glow 1.4s ease-in-out 0.4s 2;
5784
+ }
5785
+ .celebration-icon {
5786
+ font-size: 26px;
5787
+ line-height: 1;
5788
+ }
5789
+ .celebration-title {
5790
+ font-weight: 700;
5791
+ font-size: 14px;
5792
+ }
5793
+ .celebration-sub {
5794
+ font-size: 12px;
5795
+ color: var(--dim);
5796
+ }
5797
+ .celebration-xp {
5798
+ margin-left: 6px;
5799
+ font-weight: 700;
5800
+ color: var(--level-up);
5801
+ }
5802
+
5803
+ .confetti {
5804
+ position: absolute;
5805
+ inset: 0;
5806
+ }
5807
+ .confetti-bit {
5808
+ position: absolute;
5809
+ top: -12px;
5810
+ width: 8px;
5811
+ height: 12px;
5812
+ border-radius: 1px;
5813
+ background: var(--celebrate-1);
5814
+ animation: confetti-fall 1.7s ease-in forwards;
5815
+ }
5816
+ .confetti-bit.hue-0 { background: var(--celebrate-1); }
5817
+ .confetti-bit.hue-1 { background: var(--celebrate-2); }
5818
+ .confetti-bit.hue-2 { background: var(--level-up); }
5819
+ .confetti-bit.hue-3 { background: var(--accent); }
5820
+ .confetti-bit.hue-4 { background: var(--working); }
5821
+ .confetti-bit.hue-5 { background: var(--green); }
5822
+
5823
+ @keyframes confetti-fall {
5824
+ 0% {
5825
+ transform: translate(0, 0) rotate(0deg);
5826
+ opacity: 1;
5827
+ }
5828
+ 100% {
5829
+ transform: translate(calc(var(--dx) * 140px), calc(var(--dy) * 460px))
5830
+ rotate(calc(var(--rot) * 3));
5831
+ opacity: 0;
5832
+ }
5833
+ }
5834
+ @keyframes celebrate-pop {
5835
+ 0% {
5836
+ transform: translateX(-50%) scale(0.7);
5837
+ opacity: 0;
5838
+ }
5839
+ 100% {
5840
+ transform: translateX(-50%) scale(1);
5841
+ opacity: 1;
5842
+ }
5843
+ }
5844
+ @keyframes level-up-glow {
5845
+ 0%, 100% {
5846
+ box-shadow: 0 0 18px rgba(255, 213, 74, 0.3), 0 12px 40px rgba(0, 0, 0, 0.55);
5847
+ }
5848
+ 50% {
5849
+ box-shadow: 0 0 38px rgba(255, 213, 74, 0.6), 0 12px 40px rgba(0, 0, 0, 0.55);
5850
+ }
5851
+ }
5852
+ @keyframes badge-pop {
5853
+ 0% { transform: scale(0.6); opacity: 0; }
5854
+ 60% { transform: scale(1.15); }
5855
+ 100% { transform: scale(1); opacity: 1; }
5856
+ }
5857
+
5858
+ /* --- Arcade pane --- */
5859
+ .arcade-pane {
5860
+ flex: 1;
5861
+ min-height: 0;
5862
+ overflow-y: auto;
5863
+ padding: 18px 22px;
5864
+ }
5865
+ .arcade-empty {
5866
+ color: var(--dim);
5867
+ padding: 40px;
5868
+ text-align: center;
5869
+ }
5870
+ .arcade-header {
5871
+ display: flex;
5872
+ align-items: baseline;
5873
+ gap: 12px;
5874
+ margin-bottom: 16px;
5875
+ }
5876
+ .arcade-header h2 {
5877
+ margin: 0;
5878
+ font-size: 20px;
5879
+ }
5880
+ .arcade-sub,
5881
+ .arcade-dim {
5882
+ color: var(--dim);
5883
+ font-size: 12px;
5884
+ }
5885
+ .arcade-dim.small {
5886
+ font-size: 11px;
5887
+ }
5888
+ .arcade-grid {
5889
+ display: grid;
5890
+ grid-template-columns: 2fr 1fr;
5891
+ gap: 14px;
5892
+ margin-bottom: 14px;
5893
+ }
5894
+ .arcade-card {
5895
+ background: var(--panel);
5896
+ border: 1px solid var(--border);
5897
+ border-radius: 12px;
5898
+ padding: 16px;
5899
+ margin-bottom: 14px;
5900
+ }
5901
+ .arcade-card-head {
5902
+ display: flex;
5903
+ align-items: baseline;
5904
+ justify-content: space-between;
5905
+ margin-bottom: 12px;
5906
+ }
5907
+ .arcade-card-head h3,
5908
+ .arcade-section h3 {
5909
+ margin: 0;
5910
+ font-size: 14px;
5911
+ }
5912
+ .arcade-hero {
5913
+ display: flex;
5914
+ align-items: center;
5915
+ gap: 18px;
5916
+ margin-bottom: 0;
5917
+ }
5918
+ .arcade-level-badge {
5919
+ flex: none;
5920
+ width: 64px;
5921
+ height: 64px;
5922
+ border-radius: 50%;
5923
+ display: flex;
5924
+ align-items: center;
5925
+ justify-content: center;
5926
+ font-weight: 800;
5927
+ font-size: 16px;
5928
+ color: #1a1208;
5929
+ background: radial-gradient(circle at 35% 30%, #ffe9a8, var(--level-up));
5930
+ box-shadow: 0 0 22px rgba(255, 213, 74, 0.35);
5931
+ }
5932
+ .arcade-hero-main {
5933
+ flex: 1;
5934
+ display: flex;
5935
+ flex-direction: column;
5936
+ gap: 6px;
5937
+ }
5938
+ .arcade-xp-row {
5939
+ display: flex;
5940
+ justify-content: space-between;
5941
+ font-size: 13px;
5942
+ font-weight: 600;
5943
+ }
5944
+ .arcade-streak {
5945
+ display: flex;
5946
+ align-items: center;
5947
+ gap: 14px;
5948
+ margin-bottom: 0;
5949
+ }
5950
+ .arcade-streak-flame {
5951
+ font-size: 38px;
5952
+ }
5953
+ .arcade-streak-num {
5954
+ font-size: 26px;
5955
+ font-weight: 800;
5956
+ color: var(--attention);
5957
+ }
5958
+ .arcade-quests {
5959
+ display: flex;
5960
+ flex-direction: column;
5961
+ gap: 12px;
5962
+ }
5963
+ .quest-row .quest-top {
5964
+ display: flex;
5965
+ justify-content: space-between;
5966
+ margin-bottom: 5px;
5967
+ font-size: 13px;
5968
+ }
5969
+ .quest-row.done .quest-title {
5970
+ color: var(--dim);
5971
+ text-decoration: line-through;
5972
+ }
5973
+ .quest-reward {
5974
+ font-weight: 700;
5975
+ color: var(--level-up);
5976
+ }
5977
+ .quest-row.done .quest-reward {
5978
+ color: var(--green);
5979
+ }
5980
+ .arcade-ach-group {
5981
+ margin-bottom: 14px;
5982
+ }
5983
+ .arcade-ach-cat {
5984
+ font-size: 11px;
5985
+ text-transform: uppercase;
5986
+ letter-spacing: 0.05em;
5987
+ color: var(--dim);
5988
+ margin-bottom: 8px;
5989
+ }
5990
+ .arcade-ach-grid {
5991
+ display: grid;
5992
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
5993
+ gap: 8px;
5994
+ }
5995
+ .achievement {
5996
+ display: flex;
5997
+ align-items: center;
5998
+ gap: 8px;
5999
+ padding: 8px 10px;
6000
+ border-radius: 8px;
6001
+ border: 1px solid var(--border);
6002
+ background: var(--panel-2);
6003
+ font-size: 12px;
6004
+ }
6005
+ .achievement.unlocked {
6006
+ border-color: var(--badge);
6007
+ animation: badge-pop 0.4s ease-out;
6008
+ }
6009
+ .achievement.locked {
6010
+ opacity: 0.45;
6011
+ filter: grayscale(0.6);
6012
+ }
6013
+ .achievement-icon {
6014
+ font-size: 17px;
6015
+ }
6016
+ .achievement-title {
6017
+ overflow: hidden;
6018
+ text-overflow: ellipsis;
6019
+ white-space: nowrap;
6020
+ }
6021
+ .arcade-stats {
6022
+ display: grid;
6023
+ grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
6024
+ gap: 12px;
6025
+ }
6026
+ .arcade-stat {
6027
+ background: var(--panel-2);
6028
+ border: 1px solid var(--border);
6029
+ border-radius: 8px;
6030
+ padding: 12px;
6031
+ text-align: center;
6032
+ }
6033
+ .arcade-stat-num {
6034
+ font-size: 22px;
6035
+ font-weight: 800;
6036
+ color: var(--accent);
6037
+ }
6038
+
6039
+ /* --- Settings → Appearance tab --- */
6040
+ .appearance-tab {
6041
+ display: flex;
6042
+ flex-direction: column;
6043
+ gap: 22px;
6044
+ padding: 16px 4px;
6045
+ }
6046
+ .appearance-section h3 {
6047
+ margin: 0 0 10px;
6048
+ font-size: 13px;
6049
+ }
6050
+ .appearance-themes {
6051
+ display: flex;
6052
+ gap: 10px;
6053
+ }
6054
+ .theme-swatch {
6055
+ flex: 1;
6056
+ height: 56px;
6057
+ border-radius: 10px;
6058
+ border: 2px solid var(--border);
6059
+ cursor: pointer;
6060
+ display: flex;
6061
+ align-items: flex-end;
6062
+ padding: 8px;
6063
+ color: #fff;
6064
+ font-size: 12px;
6065
+ font-weight: 600;
6066
+ }
6067
+ .theme-swatch.sel {
6068
+ border-color: var(--text);
6069
+ }
6070
+ .theme-swatch.theme-dark {
6071
+ background: linear-gradient(135deg, #16171a, #2a2c33);
6072
+ }
6073
+ .theme-swatch.theme-neon {
6074
+ background: linear-gradient(135deg, #0c0e14, #22d3ee);
6075
+ }
6076
+ .theme-swatch.theme-synthwave {
6077
+ background: linear-gradient(135deg, #190f2e, #ff2e88);
6078
+ }
6079
+ .swatch-default {
6080
+ background: conic-gradient(#d97757, #22d3ee, #a855f7, #22c55e, #ff2e88, #d97757);
6081
+ }
6082
+ .appearance-toggle {
6083
+ display: flex;
6084
+ align-items: center;
6085
+ gap: 8px;
6086
+ font-size: 13px;
6087
+ margin-bottom: 8px;
6088
+ cursor: pointer;
6089
+ }
4810
6090
  /**
4811
6091
  * Copyright (c) 2014 The xterm.js authors. All rights reserved.
4812
6092
  * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)