claude-maestro 0.1.20 → 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 +708 -226
  2. package/out/preload/index.js +4 -0
  3. package/out/renderer/assets/{index-C2xG1-2F.js → index-BDJGybQo.js} +2 -2
  4. package/out/renderer/assets/{index-CALj_g-h.js → index-BDxfkk76.js} +2 -2
  5. package/out/renderer/assets/{index-BX4eMUiW.js → index-BNIPHMhg.js} +2 -2
  6. package/out/renderer/assets/{index-BSnEdUx8.js → index-BPiKmKfX.js} +5 -5
  7. package/out/renderer/assets/{index-BUr9qTcP.js → index-Bf87-cF0.js} +5 -5
  8. package/out/renderer/assets/{index--LsdCcT2.js → index-Bm6BMufC.js} +2 -2
  9. package/out/renderer/assets/{index-KjJOaoK3.js → index-Bw6wDwNB.js} +2 -2
  10. package/out/renderer/assets/{index-CwrdXZxY.js → index-C2wfbMG1.js} +2 -2
  11. package/out/renderer/assets/{index-BD5wVgZG.js → index-C3_9l5Zo.js} +2 -2
  12. package/out/renderer/assets/{index-2Q5NJLLa.js → index-CIAp39oC.js} +2 -2
  13. package/out/renderer/assets/{index-B4pxYlCv.css → index-CTyPr1hG.css} +942 -102
  14. package/out/renderer/assets/{index-B9wQ40iJ.js → index-CYo0nynQ.js} +4 -4
  15. package/out/renderer/assets/{index-BdkQGOfF.js → index-CZmL3oq-.js} +5 -5
  16. package/out/renderer/assets/{index-CqEbh7gN.js → index-CdG7xnB7.js} +2 -2
  17. package/out/renderer/assets/{index-Dpj9EP42.js → index-Cfvyl_8T.js} +3 -3
  18. package/out/renderer/assets/{index-NXP0WfIH.js → index-Ck4WZgFA.js} +2 -2
  19. package/out/renderer/assets/{index-DFnn9t0U.js → index-D9lxbtli.js} +5 -5
  20. package/out/renderer/assets/{index-DMLpIsZn.js → index-DD6EoqPp.js} +2 -2
  21. package/out/renderer/assets/{index-BKVqTAbd.js → index-DGNONcNh.js} +3 -3
  22. package/out/renderer/assets/{index-K7jPnu8A.js → index-DroXAl3A.js} +1 -1
  23. package/out/renderer/assets/{index-BYrBOYyo.js → index-DzjUOrFM.js} +5 -5
  24. package/out/renderer/assets/{index-BeXyvqqV.js → index-Uh6FxvAQ.js} +4358 -2417
  25. package/out/renderer/assets/{index-DwCelZNB.js → index-iIulTEbp.js} +5 -5
  26. package/out/renderer/assets/{index-RU5VUPJx.js → index-kJ0KF5bI.js} +2 -2
  27. package/out/renderer/index.html +2 -2
  28. package/package.json +2 -1
@@ -1,9 +1,59 @@
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;
9
59
  /* readable text on a solid --accent fill (overridden per-theme + by a custom accent) */
@@ -25,8 +75,10 @@
25
75
  --bg: #0c0e14;
26
76
  --panel: #12151f;
27
77
  --panel-2: #171b28;
78
+ --panel-3: #1e2434;
28
79
  --border: #243049;
29
80
  --text: #e6f1ff;
81
+ --text-2: #aeb9d4;
30
82
  --dim: #7e8ba8;
31
83
  --accent: #22d3ee;
32
84
  --accent-fg: #06121a;
@@ -46,8 +98,10 @@
46
98
  --bg: #190f2e;
47
99
  --panel: #21163f;
48
100
  --panel-2: #2b1d52;
101
+ --panel-3: #33215f;
49
102
  --border: #3d2a6b;
50
103
  --text: #ffe9f6;
104
+ --text-2: #c7a9e0;
51
105
  --dim: #a98fc8;
52
106
  --accent: #ff2e88;
53
107
  --accent-fg: #ffffff;
@@ -74,6 +128,18 @@
74
128
  transition: none !important;
75
129
  }
76
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
+ }
141
+ }
142
+
77
143
  * {
78
144
  box-sizing: border-box;
79
145
  margin: 0;
@@ -122,28 +188,64 @@ body {
122
188
  --bg: rgba(22, 23, 26, 0.82);
123
189
  --panel: rgba(29, 30, 35, 0.82);
124
190
  --panel-2: rgba(34, 35, 41, 0.82);
191
+ --panel-3: rgba(43, 44, 51, 0.86);
125
192
  }
126
193
 
127
194
  .app.loading {
128
195
  align-items: center;
129
196
  justify-content: center;
197
+ gap: 10px;
130
198
  color: var(--dim);
131
199
  }
132
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
+
133
210
  .btn {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ gap: 6px;
134
215
  background: var(--panel-2);
135
216
  color: var(--text);
136
217
  border: 1px solid var(--border);
137
- border-radius: 4px;
218
+ border-radius: var(--r-sm);
138
219
  padding: 4px 10px;
139
220
  cursor: pointer;
140
- 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);
141
229
  }
142
230
 
143
231
  .btn:hover {
144
232
  border-color: var(--dim);
145
233
  }
146
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
+
147
249
  .btn.primary {
148
250
  background: var(--accent);
149
251
  border-color: var(--accent);
@@ -151,6 +253,32 @@ body {
151
253
  font-weight: 600;
152
254
  }
153
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);
273
+ color: #fff;
274
+ font-weight: 600;
275
+ }
276
+
277
+ .btn.btn-sm {
278
+ padding: 2px 8px;
279
+ font-size: var(--text-sm);
280
+ }
281
+
154
282
  .btn.ghost {
155
283
  background: transparent;
156
284
  border: none;
@@ -160,12 +288,35 @@ body {
160
288
 
161
289
  .btn.ghost:hover {
162
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);
163
298
  }
164
299
 
165
300
  .btn.ghost.on {
166
301
  color: var(--accent);
167
302
  }
168
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
+
169
320
  .row {
170
321
  display: flex;
171
322
  gap: 8px;
@@ -174,8 +325,8 @@ body {
174
325
  /* ---------- sidebar ---------- */
175
326
 
176
327
  .sidebar {
177
- width: 220px;
178
- min-width: 220px;
328
+ width: 248px;
329
+ min-width: 248px;
179
330
  background: var(--panel);
180
331
  border-right: 1px solid var(--border);
181
332
  display: flex;
@@ -186,11 +337,9 @@ body {
186
337
  display: flex;
187
338
  justify-content: space-between;
188
339
  align-items: center;
189
- /* Wrap when the action buttons can't all fit on one row, so none (e.g. the
190
- new-session button) gets clipped off the right edge of the 220px rail. */
191
- flex-wrap: wrap;
192
- gap: 4px 8px;
193
- padding: 10px 12px 6px;
340
+ flex-wrap: nowrap;
341
+ gap: 8px;
342
+ padding: 10px 10px 6px 12px;
194
343
  font-size: 11px;
195
344
  font-weight: 600;
196
345
  letter-spacing: 0.08em;
@@ -198,15 +347,26 @@ body {
198
347
  color: var(--dim);
199
348
  }
200
349
 
201
- /* 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
+
202
357
  .sidebar-header .row {
203
- flex-wrap: wrap;
358
+ flex: none;
359
+ flex-wrap: nowrap;
204
360
  justify-content: flex-end;
205
361
  gap: 2px;
206
362
  }
207
363
 
208
- .sidebar-header .row .btn.ghost {
209
- 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);
210
370
  }
211
371
 
212
372
  .sidebar-list {
@@ -221,6 +381,7 @@ body {
221
381
  padding: 7px 8px 7px 10px;
222
382
  border-left: 3px solid transparent;
223
383
  cursor: pointer;
384
+ transition: background var(--dur-fast) var(--ease-out);
224
385
  }
225
386
 
226
387
  .session-entry:hover {
@@ -228,16 +389,20 @@ body {
228
389
  }
229
390
 
230
391
  .session-entry.active {
231
- background: var(--panel-2);
392
+ background: var(--accent-soft);
232
393
  border-left-color: var(--accent);
233
394
  }
234
395
 
235
396
  .session-entry .close {
236
- visibility: hidden;
397
+ opacity: 0;
398
+ pointer-events: none;
399
+ transition: opacity var(--dur-fast) var(--ease-out);
237
400
  }
238
401
 
239
- .session-entry:hover .close {
240
- visibility: visible;
402
+ .session-entry:hover .close,
403
+ .session-entry:focus-within .close {
404
+ opacity: 1;
405
+ pointer-events: auto;
241
406
  }
242
407
 
243
408
  .session-meta {
@@ -267,7 +432,7 @@ body {
267
432
  .rename-input {
268
433
  background: var(--bg);
269
434
  border: 1px solid var(--accent);
270
- border-radius: 3px;
435
+ border-radius: var(--r-sm);
271
436
  color: var(--text);
272
437
  font-size: 13px;
273
438
  padding: 1px 4px;
@@ -276,28 +441,27 @@ body {
276
441
 
277
442
  .glyph {
278
443
  width: 14px;
279
- text-align: center;
280
- font-size: 13px;
444
+ height: 14px;
445
+ display: inline-flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ flex: none;
281
449
  }
282
450
 
283
451
  .glyph.status-working {
284
452
  color: var(--working);
285
453
  animation: spin 1.2s linear infinite;
286
- display: inline-block;
287
454
  }
288
455
 
289
456
  /* Blocked on the user — the only nagging signal: amber, breathing pulse. */
290
457
  .glyph.status-needs-attention {
291
458
  color: var(--attention);
292
- display: inline-block;
293
459
  animation: pulse 1.4s ease-in-out infinite;
294
460
  }
295
461
 
296
462
  /* Finished a turn — your turn now: green check that pops in once, then rests. */
297
463
  .glyph.status-done {
298
464
  color: var(--green);
299
- font-weight: 700;
300
- display: inline-block;
301
465
  animation: done-pop 0.5s ease-out;
302
466
  }
303
467
 
@@ -348,9 +512,10 @@ body {
348
512
  .watchdog-badge {
349
513
  flex: none;
350
514
  width: 14px;
351
- text-align: center;
352
- font-size: 12px;
353
- line-height: 14px;
515
+ height: 14px;
516
+ display: inline-flex;
517
+ align-items: center;
518
+ justify-content: center;
354
519
  cursor: help;
355
520
  animation: pulse 1.5s ease-in-out infinite;
356
521
  }
@@ -415,6 +580,65 @@ body {
415
580
  color: var(--attention);
416
581
  }
417
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
+
418
642
  .usage-window {
419
643
  display: flex;
420
644
  flex-direction: column;
@@ -435,15 +659,16 @@ body {
435
659
  max-width: calc(100vw - 24px);
436
660
  max-height: 70vh;
437
661
  overflow-y: auto;
438
- background: var(--panel-2);
662
+ background: var(--panel-3);
439
663
  border: 1px solid var(--border);
440
- border-radius: 10px;
664
+ border-radius: var(--r-md);
441
665
  padding: 12px 14px;
442
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);
666
+ box-shadow: var(--shadow-3);
443
667
  display: flex;
444
668
  flex-direction: column;
445
669
  gap: 8px;
446
670
  font-size: 12px;
671
+ animation: popover-in var(--dur-fast) var(--ease-out);
447
672
  }
448
673
 
449
674
  .usage-summary {
@@ -675,6 +900,11 @@ body {
675
900
  background: rgba(217, 119, 87, 0.16);
676
901
  }
677
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
+
678
908
  .flash-dot {
679
909
  font-size: 10px;
680
910
  color: var(--attention);
@@ -1155,15 +1385,16 @@ body {
1155
1385
 
1156
1386
  .context-menu {
1157
1387
  position: fixed;
1158
- z-index: 100;
1159
- background: var(--panel-2);
1388
+ z-index: var(--z-dropdown);
1389
+ background: var(--panel-3);
1160
1390
  border: 1px solid var(--border);
1161
- border-radius: 6px;
1391
+ border-radius: var(--r-md);
1162
1392
  padding: 4px;
1163
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
1393
+ box-shadow: var(--shadow-2);
1164
1394
  display: flex;
1165
1395
  flex-direction: column;
1166
1396
  min-width: 170px;
1397
+ animation: popover-in var(--dur-fast) var(--ease-out);
1167
1398
  }
1168
1399
 
1169
1400
  .context-menu button {
@@ -1178,8 +1409,8 @@ body {
1178
1409
  }
1179
1410
 
1180
1411
  .context-menu button:hover {
1181
- background: var(--accent);
1182
- color: var(--accent-fg);
1412
+ background: var(--accent-soft);
1413
+ color: var(--text);
1183
1414
  }
1184
1415
 
1185
1416
  /* ---------- main area ---------- */
@@ -1230,29 +1461,51 @@ body {
1230
1461
  cursor: pointer;
1231
1462
  color: var(--dim);
1232
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);
1233
1468
  }
1234
1469
 
1235
1470
  .tab:hover {
1236
1471
  color: var(--text);
1237
1472
  }
1238
1473
 
1474
+ .tab:hover:not(.active) {
1475
+ background: var(--panel-2);
1476
+ }
1477
+
1239
1478
  .tab.active {
1240
1479
  background: var(--bg);
1241
1480
  color: var(--text);
1242
1481
  }
1243
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
+
1244
1493
  .tab-icon {
1245
1494
  font-size: 11px;
1246
1495
  color: var(--accent);
1247
1496
  }
1248
1497
 
1249
1498
  .tab .close {
1250
- visibility: hidden;
1499
+ opacity: 0;
1500
+ pointer-events: none;
1251
1501
  font-size: 10px;
1502
+ transition: opacity var(--dur-fast) var(--ease-out);
1252
1503
  }
1253
1504
 
1254
- .tab:hover .close {
1255
- visibility: visible;
1505
+ .tab:hover .close,
1506
+ .tab:focus-within .close {
1507
+ opacity: 1;
1508
+ pointer-events: auto;
1256
1509
  }
1257
1510
 
1258
1511
  .tab-kind {
@@ -1272,19 +1525,19 @@ body {
1272
1525
 
1273
1526
  /* Per-claude-tab model switcher */
1274
1527
  .tab-model {
1275
- background: var(--bg);
1528
+ background: var(--panel-2);
1276
1529
  border: 1px solid var(--border);
1277
- border-radius: 3px;
1278
- color: var(--dim);
1279
- font-size: 10px;
1280
- padding: 0 2px;
1281
- 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;
1282
1535
  cursor: pointer;
1283
1536
  }
1284
1537
 
1285
1538
  .tab-model:hover {
1286
1539
  color: var(--text);
1287
- border-color: var(--accent);
1540
+ border-color: var(--accent-border);
1288
1541
  }
1289
1542
 
1290
1543
  /* Add-terminal dropdown */
@@ -1309,13 +1562,14 @@ body {
1309
1562
 
1310
1563
  .tab-add-menu {
1311
1564
  position: fixed;
1312
- z-index: 100;
1565
+ z-index: var(--z-dropdown);
1313
1566
  min-width: 150px;
1314
- background: var(--panel-2);
1567
+ background: var(--panel-3);
1315
1568
  border: 1px solid var(--border);
1316
- border-radius: 4px;
1569
+ border-radius: var(--r-md);
1317
1570
  padding: 4px;
1318
- 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);
1319
1573
  }
1320
1574
 
1321
1575
  .tab-add-item {
@@ -1326,7 +1580,7 @@ body {
1326
1580
  padding: 6px 10px;
1327
1581
  background: none;
1328
1582
  border: none;
1329
- border-radius: 3px;
1583
+ border-radius: var(--r-sm);
1330
1584
  color: var(--text);
1331
1585
  text-align: left;
1332
1586
  cursor: pointer;
@@ -1334,7 +1588,7 @@ body {
1334
1588
  }
1335
1589
 
1336
1590
  .tab-add-item:hover {
1337
- background: var(--accent);
1591
+ background: var(--accent-soft);
1338
1592
  }
1339
1593
 
1340
1594
  .session-termcount {
@@ -1381,11 +1635,15 @@ body {
1381
1635
  /* ---------- worktree (parallel task) sessions ---------- */
1382
1636
 
1383
1637
  .session-entry .fork {
1384
- visibility: hidden;
1638
+ opacity: 0;
1639
+ pointer-events: none;
1640
+ transition: opacity var(--dur-fast) var(--ease-out);
1385
1641
  }
1386
1642
 
1387
- .session-entry:hover .fork {
1388
- visibility: visible;
1643
+ .session-entry:hover .fork,
1644
+ .session-entry:focus-within .fork {
1645
+ opacity: 1;
1646
+ pointer-events: auto;
1389
1647
  }
1390
1648
 
1391
1649
  /* Indent worktree tasks under their parent, with a connector tick. */
@@ -1416,14 +1674,16 @@ body {
1416
1674
  max-width: 150px;
1417
1675
  }
1418
1676
 
1419
- .merge-btn {
1677
+ .merge-btn,
1678
+ .review-btn {
1420
1679
  font-size: 11px;
1421
1680
  padding: 1px 7px;
1422
1681
  border: 1px solid var(--border);
1423
1682
  border-radius: 4px;
1424
1683
  }
1425
1684
 
1426
- .merge-btn:hover {
1685
+ .merge-btn:hover,
1686
+ .review-btn:hover {
1427
1687
  border-color: var(--accent);
1428
1688
  color: var(--accent);
1429
1689
  }
@@ -1481,14 +1741,18 @@ body {
1481
1741
  /* ---------- prompt queue ---------- */
1482
1742
 
1483
1743
  .session-entry .queue-btn {
1484
- visibility: hidden;
1744
+ opacity: 0;
1745
+ pointer-events: none;
1485
1746
  position: relative;
1747
+ transition: opacity var(--dur-fast) var(--ease-out);
1486
1748
  }
1487
1749
 
1488
1750
  /* With queued prompts, the button (and its count badge) is always visible. */
1489
1751
  .session-entry:hover .queue-btn,
1752
+ .session-entry:focus-within .queue-btn,
1490
1753
  .session-entry .queue-btn.has-items {
1491
- visibility: visible;
1754
+ opacity: 1;
1755
+ pointer-events: auto;
1492
1756
  }
1493
1757
 
1494
1758
  .queue-badge {
@@ -1519,14 +1783,15 @@ body {
1519
1783
  position: fixed;
1520
1784
  width: 340px;
1521
1785
  max-width: calc(100vw - 24px);
1522
- background: var(--panel);
1786
+ background: var(--panel-3);
1523
1787
  border: 1px solid var(--border);
1524
- border-radius: 8px;
1788
+ border-radius: var(--r-md);
1525
1789
  padding: 10px 12px;
1526
1790
  display: flex;
1527
1791
  flex-direction: column;
1528
1792
  gap: 8px;
1529
- 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);
1530
1795
  }
1531
1796
 
1532
1797
  .queue-popover-title {
@@ -1627,17 +1892,20 @@ body {
1627
1892
  .modal-overlay {
1628
1893
  position: fixed;
1629
1894
  inset: 0;
1630
- z-index: 200;
1631
- 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%);
1632
1899
  display: flex;
1633
1900
  align-items: center;
1634
1901
  justify-content: center;
1902
+ animation: overlay-in var(--dur-base) var(--ease-out);
1635
1903
  }
1636
1904
 
1637
1905
  .modal {
1638
- background: var(--panel);
1906
+ background: var(--panel-3);
1639
1907
  border: 1px solid var(--border);
1640
- border-radius: 10px;
1908
+ border-radius: var(--r-lg);
1641
1909
  padding: 18px 20px;
1642
1910
  width: 420px;
1643
1911
  max-width: 90vw;
@@ -1646,7 +1914,8 @@ body {
1646
1914
  display: flex;
1647
1915
  flex-direction: column;
1648
1916
  gap: 12px;
1649
- 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);
1650
1919
  }
1651
1920
 
1652
1921
  .modal-wide {
@@ -1690,18 +1959,22 @@ body {
1690
1959
  .field textarea {
1691
1960
  background: var(--bg);
1692
1961
  border: 1px solid var(--border);
1693
- border-radius: 4px;
1962
+ border-radius: var(--r-sm);
1694
1963
  color: var(--text);
1695
1964
  font-size: 13px;
1696
1965
  padding: 5px 8px;
1697
1966
  outline: none;
1698
1967
  font-family: inherit;
1968
+ transition:
1969
+ border-color var(--dur-fast) var(--ease-out),
1970
+ box-shadow var(--dur-fast) var(--ease-out);
1699
1971
  }
1700
1972
 
1701
1973
  .field input:focus,
1702
1974
  .field select:focus,
1703
1975
  .field textarea:focus {
1704
1976
  border-color: var(--accent);
1977
+ box-shadow: var(--ring);
1705
1978
  }
1706
1979
 
1707
1980
  .field-hint {
@@ -1732,6 +2005,15 @@ body {
1732
2005
  cursor: pointer;
1733
2006
  }
1734
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
+
1735
2017
  .check-row > span {
1736
2018
  display: flex;
1737
2019
  flex-direction: column;
@@ -1778,6 +2060,63 @@ body {
1778
2060
  font-size: 12px;
1779
2061
  }
1780
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
+
1781
2120
  .bg-preview {
1782
2121
  height: 140px;
1783
2122
  border: 1px solid var(--border);
@@ -1806,11 +2145,43 @@ body {
1806
2145
  .modal-error {
1807
2146
  background: rgba(229, 72, 77, 0.15);
1808
2147
  color: var(--error);
1809
- border-radius: 4px;
2148
+ border-radius: var(--r-sm);
1810
2149
  padding: 6px 10px;
1811
2150
  font-size: 12px;
1812
2151
  }
1813
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
+
1814
2185
  /* ---------- broadcast-prompt dialog ---------- */
1815
2186
 
1816
2187
  .broadcast-list-header {
@@ -1873,6 +2244,116 @@ body {
1873
2244
  padding-left: 8px;
1874
2245
  }
1875
2246
 
2247
+ /* ---------- repo status overview dialog ---------- */
2248
+
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
+
1876
2357
  /* ---------- global search palette ---------- */
1877
2358
 
1878
2359
  .gs-overlay {
@@ -1887,15 +2368,16 @@ body {
1887
2368
  }
1888
2369
 
1889
2370
  .gs-palette {
1890
- background: var(--panel);
2371
+ background: var(--panel-3);
1891
2372
  border: 1px solid var(--border);
1892
- border-radius: 10px;
2373
+ border-radius: var(--r-lg);
1893
2374
  width: 640px;
1894
2375
  max-width: 90vw;
1895
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
2376
+ box-shadow: var(--shadow-4);
1896
2377
  display: flex;
1897
2378
  flex-direction: column;
1898
2379
  overflow: hidden;
2380
+ animation: modal-in var(--dur-base) var(--ease-out);
1899
2381
  }
1900
2382
 
1901
2383
  .gs-input-row {
@@ -2004,11 +2486,58 @@ body {
2004
2486
  font-size: 12px;
2005
2487
  }
2006
2488
 
2007
- .gs-hint {
2008
- padding: 6px 12px;
2009
- border-top: 1px solid var(--border);
2010
- font-size: 11px;
2011
- color: var(--dim);
2489
+ .gs-hint {
2490
+ padding: 6px 12px;
2491
+ border-top: 1px solid var(--border);
2492
+ font-size: 11px;
2493
+ color: var(--dim);
2494
+ }
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;
2012
2541
  }
2013
2542
 
2014
2543
  /* ---------- command palette (Ctrl+K) ---------- */
@@ -2017,24 +2546,28 @@ body {
2017
2546
  position: fixed;
2018
2547
  inset: 0;
2019
2548
  z-index: 300;
2020
- 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%);
2021
2552
  display: flex;
2022
2553
  align-items: flex-start;
2023
2554
  justify-content: center;
2024
2555
  padding-top: 12vh;
2556
+ animation: overlay-in var(--dur-base) var(--ease-out);
2025
2557
  }
2026
2558
 
2027
2559
  .palette {
2028
- background: var(--panel);
2560
+ background: var(--panel-3);
2029
2561
  border: 1px solid var(--border);
2030
- border-radius: 10px;
2562
+ border-radius: var(--r-lg);
2031
2563
  width: 560px;
2032
2564
  max-width: 90vw;
2033
2565
  max-height: 60vh;
2034
2566
  display: flex;
2035
2567
  flex-direction: column;
2036
2568
  overflow: hidden;
2037
- 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);
2038
2571
  }
2039
2572
 
2040
2573
  .palette-input {
@@ -2077,11 +2610,14 @@ body {
2077
2610
  text-overflow: ellipsis;
2078
2611
  }
2079
2612
 
2080
- .palette-item.sel,
2081
2613
  .palette-item:hover {
2082
2614
  background: var(--panel-2);
2083
2615
  }
2084
2616
 
2617
+ .palette-item.sel {
2618
+ background: var(--accent-soft);
2619
+ }
2620
+
2085
2621
  .palette-sub {
2086
2622
  color: var(--dim);
2087
2623
  font-size: 11px;
@@ -2253,6 +2789,132 @@ body {
2253
2789
  min-height: 0;
2254
2790
  }
2255
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
+
2256
2918
  /* ---------- terminal ---------- */
2257
2919
 
2258
2920
  .term-wrap {
@@ -2436,6 +3098,87 @@ body {
2436
3098
  color: var(--dim);
2437
3099
  }
2438
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
+
2439
3182
  .viewer-image {
2440
3183
  flex: 1;
2441
3184
  display: flex;
@@ -2598,8 +3341,9 @@ body {
2598
3341
  .statusbar {
2599
3342
  display: flex;
2600
3343
  align-items: center;
2601
- gap: 14px;
2602
- padding: 4px 12px;
3344
+ gap: 10px;
3345
+ padding: 5px 12px;
3346
+ min-height: 28px;
2603
3347
  border-top: 1px solid var(--border);
2604
3348
  background: var(--panel);
2605
3349
  font-size: 11px;
@@ -2607,8 +3351,12 @@ body {
2607
3351
  }
2608
3352
 
2609
3353
  .status-pill {
2610
- padding: 1px 8px;
2611
- 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);
2612
3360
  font-weight: 600;
2613
3361
  }
2614
3362
 
@@ -2639,15 +3387,21 @@ body {
2639
3387
  }
2640
3388
 
2641
3389
  .statusbar-folder {
3390
+ flex: 0 1 auto;
3391
+ min-width: 40px;
2642
3392
  overflow: hidden;
2643
3393
  text-overflow: ellipsis;
2644
3394
  white-space: nowrap;
2645
3395
  }
2646
3396
 
2647
3397
  .statusbar-attention {
3398
+ flex: none;
3399
+ display: inline-flex;
3400
+ align-items: center;
3401
+ gap: 4px;
2648
3402
  border: none;
2649
3403
  padding: 1px 8px;
2650
- border-radius: 8px;
3404
+ border-radius: var(--r-lg);
2651
3405
  font-size: 11px;
2652
3406
  font-weight: 600;
2653
3407
  cursor: pointer;
@@ -2660,6 +3414,7 @@ body {
2660
3414
  }
2661
3415
 
2662
3416
  .statusbar-age {
3417
+ flex: none;
2663
3418
  margin-left: auto;
2664
3419
  }
2665
3420
 
@@ -2876,6 +3631,23 @@ body {
2876
3631
  text-decoration: underline;
2877
3632
  }
2878
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
+
2879
3651
  /* sentinel dialog */
2880
3652
  .sentinel-prompt {
2881
3653
  resize: vertical;
@@ -3205,31 +3977,86 @@ body {
3205
3977
 
3206
3978
  /* ---------- app notice (brief auto-dismissing confirmation) ---------- */
3207
3979
 
3208
- .app-notice {
3980
+ /* ---------- toasts (leveled, stacked bottom-right) ---------- */
3981
+
3982
+ .toasts {
3209
3983
  position: fixed;
3210
- bottom: 36px;
3211
- left: 50%;
3212
- transform: translateX(-50%);
3213
- z-index: 400;
3214
- background: var(--panel-2);
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);
3215
3999
  border: 1px solid var(--border);
3216
- border-radius: 6px;
3217
- padding: 8px 16px;
4000
+ border-left: 3px solid var(--dim);
4001
+ border-radius: var(--r-md);
4002
+ padding: 10px 12px;
4003
+ box-shadow: var(--shadow-3);
3218
4004
  font-size: 12px;
3219
4005
  color: var(--text);
3220
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
3221
- pointer-events: none;
3222
- animation: notice-in 0.15s ease-out;
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);
3223
4050
  }
3224
4051
 
3225
- @keyframes notice-in {
4052
+ @keyframes toast-in {
3226
4053
  from {
3227
4054
  opacity: 0;
3228
- transform: translateX(-50%) translateY(6px);
4055
+ transform: translateY(8px);
3229
4056
  }
3230
4057
  to {
3231
4058
  opacity: 1;
3232
- transform: translateX(-50%) translateY(0);
4059
+ transform: none;
3233
4060
  }
3234
4061
  }
3235
4062
 
@@ -4854,10 +5681,23 @@ body {
4854
5681
  display: flex;
4855
5682
  align-items: center;
4856
5683
  gap: 10px;
5684
+ flex: 0 1 auto;
5685
+ overflow: hidden;
4857
5686
  white-space: nowrap;
4858
5687
  }
4859
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
+
4860
5697
  .statusbar-te {
5698
+ display: inline-flex;
5699
+ align-items: center;
5700
+ gap: 4px;
4861
5701
  background: none;
4862
5702
  border: none;
4863
5703
  font: inherit;