reviewflow 3.21.0 → 3.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/dashboard/index.html +258 -44
  3. package/dist/dashboard/modules/animations.d.ts +164 -0
  4. package/dist/dashboard/modules/animations.d.ts.map +1 -0
  5. package/dist/dashboard/modules/animations.js +405 -0
  6. package/dist/dashboard/modules/animations.js.map +1 -0
  7. package/dist/dashboard/modules/cardCounters.d.ts +16 -1
  8. package/dist/dashboard/modules/cardCounters.d.ts.map +1 -1
  9. package/dist/dashboard/modules/cardCounters.js +36 -2
  10. package/dist/dashboard/modules/cardCounters.js.map +1 -1
  11. package/dist/dashboard/modules/i18n.d.ts.map +1 -1
  12. package/dist/dashboard/modules/i18n.js +20 -2
  13. package/dist/dashboard/modules/i18n.js.map +1 -1
  14. package/dist/dashboard/modules/settingsModal.d.ts.map +1 -1
  15. package/dist/dashboard/modules/settingsModal.js +28 -8
  16. package/dist/dashboard/modules/settingsModal.js.map +1 -1
  17. package/dist/dashboard/styles.css +731 -372
  18. package/dist/main/server.d.ts.map +1 -1
  19. package/dist/main/server.js +22 -0
  20. package/dist/main/server.js.map +1 -1
  21. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts +1 -0
  22. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts.map +1 -1
  23. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js +26 -5
  24. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js.map +1 -1
  25. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.d.ts.map +1 -1
  26. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.js +1 -0
  27. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.js.map +1 -1
  28. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  29. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +3 -0
  30. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  31. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  32. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +3 -0
  33. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  34. package/dist/modules/review-execution/entities/reviewContext/reviewContext.gateway.d.ts +1 -0
  35. package/dist/modules/review-execution/entities/reviewContext/reviewContext.gateway.d.ts.map +1 -1
  36. package/dist/modules/review-execution/entities/reviewContext/reviewContext.schema.d.ts +10 -2
  37. package/dist/modules/review-execution/entities/reviewContext/reviewContext.schema.d.ts.map +1 -1
  38. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.d.ts +11 -0
  39. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.d.ts.map +1 -0
  40. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.js +22 -0
  41. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.js.map +1 -0
  42. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.guard.d.ts +10 -0
  43. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.guard.d.ts.map +1 -1
  44. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.d.ts +31 -1
  45. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.d.ts.map +1 -1
  46. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.js +11 -1
  47. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.js.map +1 -1
  48. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.d.ts +1 -0
  49. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.d.ts.map +1 -1
  50. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.js +27 -1
  51. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.js.map +1 -1
  52. package/dist/modules/review-execution/services/reviewRecovery.service.d.ts +33 -0
  53. package/dist/modules/review-execution/services/reviewRecovery.service.d.ts.map +1 -0
  54. package/dist/modules/review-execution/services/reviewRecovery.service.js +80 -0
  55. package/dist/modules/review-execution/services/reviewRecovery.service.js.map +1 -0
  56. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.js +2 -0
  57. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.js.map +1 -1
  58. package/dist/tests/stubs/reviewContextGateway.stub.d.ts +1 -0
  59. package/dist/tests/stubs/reviewContextGateway.stub.d.ts.map +1 -1
  60. package/dist/tests/stubs/reviewContextGateway.stub.js +3 -0
  61. package/dist/tests/stubs/reviewContextGateway.stub.js.map +1 -1
  62. package/dist/tests/units/dashboard/modules/animations.test.d.ts +10 -0
  63. package/dist/tests/units/dashboard/modules/animations.test.d.ts.map +1 -0
  64. package/dist/tests/units/dashboard/modules/animations.test.js +223 -0
  65. package/dist/tests/units/dashboard/modules/animations.test.js.map +1 -0
  66. package/dist/tests/units/dashboard/modules/cardCounters.test.js +56 -0
  67. package/dist/tests/units/dashboard/modules/cardCounters.test.js.map +1 -1
  68. package/dist/tests/units/entities/reviewContext/reviewContext.schema.test.js +1 -0
  69. package/dist/tests/units/entities/reviewContext/reviewContext.schema.test.js.map +1 -1
  70. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.d.ts +2 -0
  71. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.d.ts.map +1 -0
  72. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.js +43 -0
  73. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.js.map +1 -0
  74. package/dist/tests/units/entities/reviewContext/reviewContextResult.guard.test.js +7 -3
  75. package/dist/tests/units/entities/reviewContext/reviewContextResult.guard.test.js.map +1 -1
  76. package/dist/tests/units/entities/reviewContext/reviewContextResult.schema.test.js +12 -1
  77. package/dist/tests/units/entities/reviewContext/reviewContextResult.schema.test.js.map +1 -1
  78. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +57 -0
  79. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
  80. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +1 -0
  81. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  82. package/dist/tests/units/interface-adapters/gateways/reviewContext.fileSystem.gateway.test.js +64 -4
  83. package/dist/tests/units/interface-adapters/gateways/reviewContext.fileSystem.gateway.test.js.map +1 -1
  84. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js +56 -0
  85. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js.map +1 -1
  86. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.js +1 -1
  87. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.js.map +1 -1
  88. package/dist/tests/units/services/reviewRecovery.service.test.d.ts +2 -0
  89. package/dist/tests/units/services/reviewRecovery.service.test.d.ts.map +1 -0
  90. package/dist/tests/units/services/reviewRecovery.service.test.js +49 -0
  91. package/dist/tests/units/services/reviewRecovery.service.test.js.map +1 -0
  92. package/dist/tests/units/services/runReviewRecovery.service.test.d.ts +2 -0
  93. package/dist/tests/units/services/runReviewRecovery.service.test.d.ts.map +1 -0
  94. package/dist/tests/units/services/runReviewRecovery.service.test.js +199 -0
  95. package/dist/tests/units/services/runReviewRecovery.service.test.js.map +1 -0
  96. package/package.json +1 -1
@@ -1,20 +1,62 @@
1
+
1
2
  * { margin: 0; padding: 0; box-sizing: border-box; }
2
3
 
3
4
  :root {
4
- --nsc-bg-base: #0b1220;
5
- --nsc-bg-elevated: #111a2b;
6
- --nsc-bg-surface: #162235;
7
- --nsc-bg-surface-strong: #1c2a40;
8
- --nsc-border-soft: rgba(163, 192, 224, 0.16);
9
- --nsc-border-strong: rgba(163, 192, 224, 0.28);
10
- --nsc-text-primary: #e8efff;
11
- --nsc-text-secondary: #b2c1dd;
12
- --nsc-text-muted: #8393b0;
13
- --nsc-focus: #7ad8ff;
14
- --nsc-action: #60c7ff;
15
- --nsc-warning: #f4bc71;
16
- --nsc-success: #62d3a8;
17
- --nsc-danger: #f07f88;
5
+ /* warm near-black backgrounds */
6
+ --bg-0: #0E0E10;
7
+ --bg-1: #141416;
8
+ --bg-2: #1A1A1D;
9
+ --bg-3: #212125;
10
+ --bg-4: #2A2A2F;
11
+ /* warm paper white inks */
12
+ --ink-0: #F4F2EE;
13
+ --ink-1: #C9C6BE;
14
+ --ink-2: #8A8780;
15
+ --ink-3: #5A5852;
16
+ --ink-4: #3A3935;
17
+ /* single sacred accent: amber-gold */
18
+ --accent: #F4A93D;
19
+ --accent-hover: #FFBC54;
20
+ --accent-active: #D8901F;
21
+ --accent-ghost: rgba(244, 169, 61, 0.10);
22
+ /* desaturated status set */
23
+ --success: #7BC47F;
24
+ --warning: #E0B341;
25
+ --danger: #D9656A;
26
+ --info: #7BA3C7;
27
+ /* typography */
28
+ --font-sans: 'Geist', system-ui, -apple-system, sans-serif;
29
+ --font-mono: 'JetBrains Mono', 'SF Mono', Menlo, monospace;
30
+ /* type scale */
31
+ --type-xs: 11px;
32
+ --type-sm: 12.5px;
33
+ --type-base: 14px;
34
+ --type-lg: 18px;
35
+ --type-xl: 28px;
36
+ /* spacing */
37
+ --space-1: 4px;
38
+ --space-2: 8px;
39
+ --space-3: 12px;
40
+ --space-4: 16px;
41
+ --space-5: 24px;
42
+ --space-6: 32px;
43
+ --space-7: 48px;
44
+
45
+ /* Legacy aliases — keeps existing selectors that reference --nsc-* working */
46
+ --nsc-bg-base: var(--bg-0);
47
+ --nsc-bg-elevated: var(--bg-1);
48
+ --nsc-bg-surface: var(--bg-2);
49
+ --nsc-bg-surface-strong: var(--bg-3);
50
+ --nsc-border-soft: var(--ink-4);
51
+ --nsc-border-strong: rgba(90, 88, 82, 0.5);
52
+ --nsc-text-primary: var(--ink-0);
53
+ --nsc-text-secondary: var(--ink-1);
54
+ --nsc-text-muted: var(--ink-2);
55
+ --nsc-focus: var(--accent);
56
+ --nsc-action: var(--accent-hover);
57
+ --nsc-warning: var(--warning);
58
+ --nsc-success: var(--success);
59
+ --nsc-danger: var(--danger);
18
60
  }
19
61
 
20
62
  /* Lucide icons base styling */
@@ -105,19 +147,40 @@
105
147
  }
106
148
 
107
149
  body {
108
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
109
- background:
110
- radial-gradient(1100px 700px at 12% -10%, #1a2a4a 0%, rgba(26, 42, 74, 0) 58%),
111
- linear-gradient(145deg, var(--nsc-bg-base) 0%, #0e1728 100%);
112
- color: var(--nsc-text-primary);
150
+ font-family: var(--font-sans);
151
+ background: var(--bg-0);
152
+ color: var(--ink-0);
113
153
  min-height: 100vh;
114
- padding: 1.5rem 0;
154
+ padding: 0;
155
+ -webkit-font-smoothing: antialiased;
156
+ -moz-osx-font-smoothing: grayscale;
115
157
  }
116
158
 
117
- .container { margin: 1rem; }
159
+ /* Top accent line */
160
+ body::before {
161
+ content: '';
162
+ position: fixed;
163
+ top: 0;
164
+ left: 0;
165
+ right: 0;
166
+ height: 2px;
167
+ background: linear-gradient(90deg, transparent 0%, var(--accent) 40%, var(--accent-hover) 70%, transparent 100%);
168
+ opacity: 0.6;
169
+ z-index: 9999;
170
+ }
171
+
172
+ /* Custom scrollbar */
173
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
174
+ ::-webkit-scrollbar-track { background: transparent; }
175
+ ::-webkit-scrollbar-thumb { background: var(--ink-4); border-radius: 99px; }
176
+ ::-webkit-scrollbar-thumb:hover { background: var(--ink-3); }
177
+
178
+ ::selection { background: var(--accent-ghost); color: var(--ink-0); }
179
+
180
+ .container { margin: 0.75rem; }
118
181
 
119
182
  @media (min-width: 1024px) {
120
- .container { margin: 68px; }
183
+ .container { margin: 1.25rem 2rem; }
121
184
  }
122
185
 
123
186
  .dashboard-layout {
@@ -190,17 +253,64 @@ header {
190
253
  gap: 1rem;
191
254
  margin-bottom: 2rem;
192
255
  flex-wrap: wrap;
256
+ position: sticky;
257
+ top: 0;
258
+ z-index: 100;
259
+ padding: 0.75rem 0;
260
+ margin-top: -0.5rem;
261
+ backdrop-filter: blur(16px) saturate(140%);
262
+ -webkit-backdrop-filter: blur(16px) saturate(140%);
263
+ background: rgba(14, 14, 16, 0.85);
264
+ border-bottom: 1px solid var(--ink-4);
193
265
  }
194
266
 
195
267
  .logo {
196
- width: 48px; height: 48px;
197
- background: linear-gradient(145deg, #58c4ff 0%, #3c8cc4 100%);
198
- border-radius: 12px;
268
+ width: 44px; height: 44px;
199
269
  display: flex; align-items: center; justify-content: center;
200
- font-size: 24px;
270
+ position: relative;
271
+ flex-shrink: 0;
272
+ }
273
+
274
+ .logo svg {
275
+ width: 44px;
276
+ height: 44px;
277
+ overflow: visible;
278
+ }
279
+
280
+ .logo .logo-frame {
281
+ fill: none;
282
+ stroke: var(--accent);
283
+ stroke-width: 1.5;
284
+ opacity: 0.35;
201
285
  }
202
286
 
203
- h1 { font-size: 1.75rem; font-weight: 600; }
287
+ .logo .logo-line {
288
+ stroke: var(--ink-1);
289
+ stroke-width: 2;
290
+ stroke-linecap: round;
291
+ fill: none;
292
+ }
293
+
294
+ .logo .logo-line--accent { stroke: var(--accent); }
295
+
296
+ .logo .logo-check {
297
+ stroke: var(--success);
298
+ stroke-width: 2.5;
299
+ stroke-linecap: round;
300
+ stroke-linejoin: round;
301
+ fill: none;
302
+ }
303
+
304
+ .logo .logo-pulse {
305
+ fill: var(--accent);
306
+ filter: drop-shadow(0 0 4px var(--accent));
307
+ }
308
+
309
+ @media (prefers-reduced-motion: reduce) {
310
+ .logo .logo-pulse { animation: none !important; }
311
+ }
312
+
313
+ h1 { font-size: 1.75rem; font-weight: 700; letter-spacing: -0.025em; }
204
314
 
205
315
  .header-actions {
206
316
  display: flex;
@@ -223,11 +333,14 @@ h1 { font-size: 1.75rem; font-weight: 600; }
223
333
  }
224
334
 
225
335
  .btn-primary {
226
- background: rgba(96, 199, 255, 0.16);
227
- color: #9ce1ff;
228
- border: 1px solid rgba(96, 199, 255, 0.34);
336
+ background: var(--accent-ghost);
337
+ color: var(--accent);
338
+ border: 1px solid rgba(244, 169, 61, 0.34);
339
+ }
340
+ .btn-primary:hover {
341
+ background: rgba(244, 169, 61, 0.18);
342
+ border-color: var(--accent);
229
343
  }
230
- .btn-primary:hover { background: rgba(96, 199, 255, 0.25); }
231
344
 
232
345
  .btn-secondary {
233
346
  background: rgba(255, 255, 255, 0.03);
@@ -393,9 +506,9 @@ input:focus-visible,
393
506
  font-weight: 500;
394
507
  }
395
508
 
396
- .status-indicator.online { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
397
- .status-indicator.offline { background: rgba(240, 127, 136, 0.2); color: var(--nsc-danger); }
398
- .status-indicator.connecting { background: rgba(122, 216, 255, 0.2); color: var(--nsc-focus); }
509
+ .status-indicator.online { background: rgba(123, 196, 127, 0.12); color: var(--success); border: 1px solid rgba(123, 196, 127, 0.2); }
510
+ .status-indicator.offline { background: rgba(217, 101, 106, 0.12); color: var(--danger); border: 1px solid rgba(217, 101, 106, 0.2); }
511
+ .status-indicator.connecting { background: var(--accent-ghost); color: var(--accent); border: 1px solid rgba(244, 169, 61, 0.2); }
399
512
 
400
513
  .status-dot {
401
514
  width: 8px; height: 8px;
@@ -414,12 +527,22 @@ input:focus-visible,
414
527
  }
415
528
 
416
529
  .card {
417
- background: linear-gradient(170deg, var(--nsc-bg-surface) 0%, #142034 100%);
418
- border: 1px solid var(--nsc-border-soft);
530
+ background: var(--bg-2);
531
+ border: none;
532
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
419
533
  border-radius: 12px;
420
534
  padding: 1.25rem;
421
535
  position: relative;
422
536
  overflow: hidden;
537
+ height: 92px;
538
+ display: flex;
539
+ flex-direction: column;
540
+ justify-content: space-between;
541
+ transition: background 120ms ease;
542
+ }
543
+
544
+ .card:hover {
545
+ background: var(--bg-3);
423
546
  }
424
547
 
425
548
  .card::before {
@@ -433,20 +556,39 @@ input:focus-visible,
433
556
  }
434
557
 
435
558
  .card-priority::before {
436
- background: linear-gradient(180deg, #7ad8ff 0%, rgba(122, 216, 255, 0.2) 100%);
559
+ background: var(--accent);
560
+ opacity: 0.7;
437
561
  }
438
562
 
439
- .card-label { font-size: 0.75rem; color: var(--nsc-text-secondary); margin-bottom: 0.5rem; }
440
- .card-value { font-size: 1.75rem; font-weight: 700; }
441
- .card-value.running { color: var(--nsc-focus); }
442
- .card-value.queued { color: #8ab7ff; }
563
+ .card-label {
564
+ font-size: var(--type-xs);
565
+ font-family: var(--font-mono);
566
+ color: var(--ink-2);
567
+ margin-bottom: 0.5rem;
568
+ text-transform: uppercase;
569
+ letter-spacing: 0.08em;
570
+ }
571
+
572
+ .card-label::before { content: '// '; opacity: 0.5; }
573
+
574
+ .card-value {
575
+ font-size: var(--type-xl);
576
+ font-weight: 500;
577
+ font-family: var(--font-mono);
578
+ font-variant-numeric: tabular-nums;
579
+ color: var(--ink-0);
580
+ line-height: 1;
581
+ }
582
+
583
+ .card-value.running { color: var(--accent); }
584
+ .card-value.queued { color: var(--ink-1); }
443
585
 
444
586
  .focus-strip {
445
587
  display: grid;
446
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
588
+ grid-template-columns: repeat(3, 1fr);
447
589
  gap: 0.75rem;
448
- margin-top: -0.75rem;
449
- margin-bottom: 1.5rem;
590
+ margin-top: 0;
591
+ margin-bottom: 1.25rem;
450
592
  }
451
593
 
452
594
  .focus-strip.compact .focus-meta {
@@ -459,14 +601,15 @@ input:focus-visible,
459
601
  }
460
602
 
461
603
  .focus-chip {
462
- background: linear-gradient(160deg, var(--nsc-bg-surface) 0%, var(--nsc-bg-surface-strong) 100%);
463
- border: 1px solid var(--nsc-border-soft);
464
- border-radius: 10px;
604
+ background: var(--bg-2);
605
+ border: 1px solid var(--ink-4);
606
+ border-radius: 8px;
465
607
  padding: 0.65rem 0.75rem;
466
608
  display: flex;
467
609
  justify-content: space-between;
468
610
  align-items: center;
469
611
  gap: 0.5rem;
612
+ transition: border-color 150ms ease;
470
613
  }
471
614
 
472
615
  .focus-copy {
@@ -476,26 +619,47 @@ input:focus-visible,
476
619
  }
477
620
 
478
621
  .focus-label {
479
- font-size: 0.72rem;
480
- color: var(--nsc-text-secondary);
622
+ font-size: var(--type-xs);
623
+ font-family: var(--font-mono);
624
+ color: var(--ink-2);
481
625
  text-transform: uppercase;
482
- letter-spacing: 0.05em;
626
+ letter-spacing: 0.08em;
483
627
  }
484
628
 
485
629
  .focus-meta {
486
- font-size: 0.68rem;
487
- color: var(--nsc-text-muted);
630
+ font-size: var(--type-xs);
631
+ color: var(--ink-3);
488
632
  }
489
633
 
490
634
  .focus-value {
491
- font-size: 1.05rem;
492
- font-weight: 700;
493
- color: var(--nsc-text-primary);
635
+ font-size: var(--type-xl);
636
+ font-weight: 500;
637
+ font-family: var(--font-mono);
638
+ font-variant-numeric: tabular-nums;
639
+ color: var(--ink-0);
640
+ line-height: 1;
641
+ }
642
+
643
+ /* Default state — quiet (count === 0) */
644
+ .focus-now .focus-value,
645
+ .focus-next .focus-value,
646
+ .focus-blocked .focus-value {
647
+ color: var(--ink-2);
494
648
  }
495
649
 
496
- .focus-now .focus-value { color: var(--nsc-focus); }
497
- .focus-next .focus-value { color: var(--nsc-warning); }
498
- .focus-blocked .focus-value { color: var(--nsc-danger); }
650
+ /* Active state count > 0 */
651
+ .focus-now[data-active="true"] .focus-value { color: var(--accent); }
652
+ .focus-next[data-active="true"] .focus-value { color: var(--accent); }
653
+ /* Critical state — blocked > 0 */
654
+ .focus-blocked[data-active="critical"] .focus-value { color: var(--danger); }
655
+
656
+ .focus-now { border-color: rgba(244, 169, 61, 0.15); }
657
+ .focus-next { border-color: rgba(224, 179, 65, 0.12); }
658
+ .focus-blocked { border-color: rgba(217, 101, 106, 0.12); }
659
+
660
+ .focus-now[data-active="true"] { border-color: rgba(244, 169, 61, 0.35); }
661
+ .focus-next[data-active="true"] { border-color: rgba(224, 179, 65, 0.28); }
662
+ .focus-blocked[data-active="critical"] { border-color: rgba(217, 101, 106, 0.3); }
499
663
 
500
664
  .focus-toggle-btn {
501
665
  background: rgba(255, 255, 255, 0.03);
@@ -546,17 +710,34 @@ input:focus-visible,
546
710
  .card-claude.checking .status { color: #f59e0b; }
547
711
 
548
712
  .section {
549
- background: linear-gradient(175deg, var(--nsc-bg-elevated) 0%, #101b2d 100%);
550
- border: 1px solid var(--nsc-border-soft);
713
+ background: var(--bg-1);
714
+ border: 1px solid var(--ink-4);
551
715
  border-radius: 12px;
552
716
  margin-bottom: 1.5rem;
553
717
  overflow: hidden;
718
+ position: relative;
719
+ }
720
+
721
+ .section[data-attention="true"]::before {
722
+ content: '';
723
+ position: absolute;
724
+ left: 0;
725
+ top: 0;
726
+ bottom: 0;
727
+ width: 2px;
728
+ background: var(--accent);
729
+ z-index: 1;
554
730
  }
555
731
 
556
732
  .section-header {
557
733
  padding: 1rem 1.5rem;
558
- border-bottom: 1px solid var(--nsc-border-soft);
734
+ border-bottom: 1px solid var(--ink-4);
559
735
  font-weight: 600;
736
+ font-family: var(--font-mono);
737
+ font-size: var(--type-sm);
738
+ letter-spacing: 0.05em;
739
+ text-transform: uppercase;
740
+ color: var(--ink-1);
560
741
  display: flex;
561
742
  align-items: center;
562
743
  gap: 0.5rem;
@@ -574,10 +755,14 @@ input:focus-visible,
574
755
  }
575
756
 
576
757
  .section-header .badge-count {
577
- background: rgba(240, 127, 136, 0.16);
578
- color: #ff9ea5;
758
+ background: rgba(217, 101, 106, 0.12);
759
+ color: var(--danger);
579
760
  padding: 0.125rem 0.5rem;
580
761
  border-radius: 9999px;
762
+ font-family: var(--font-mono);
763
+ font-size: var(--type-xs);
764
+ font-variant-numeric: tabular-nums;
765
+ font-weight: 500;
581
766
  }
582
767
 
583
768
  .section-header .btn-sync {
@@ -2283,324 +2468,95 @@ body.compact-density .quality-trend {
2283
2468
  }
2284
2469
  }
2285
2470
 
2286
- /* =====================================================
2287
- DESIGN UPGRADE — Premium polish layer
2288
- Applied on top of base styles for visual refinement.
2289
- ===================================================== */
2290
-
2291
- /* Font smoothing + better background */
2292
- body {
2293
- -webkit-font-smoothing: antialiased;
2294
- -moz-osx-font-smoothing: grayscale;
2295
- background:
2296
- radial-gradient(ellipse 1400px 900px at 8% -12%, rgba(30, 58, 110, 0.55) 0%, transparent 55%),
2297
- radial-gradient(ellipse 600px 500px at 92% 105%, rgba(40, 20, 80, 0.25) 0%, transparent 50%),
2298
- linear-gradient(155deg, #080e1a 0%, #0b1220 40%, #0d1528 100%);
2299
- }
2300
-
2301
- /* Top accent gradient line */
2302
- body::before {
2303
- content: '';
2304
- position: fixed;
2305
- top: 0;
2306
- left: 0;
2307
- right: 0;
2308
- height: 2px;
2309
- background: linear-gradient(90deg,
2310
- transparent 0%,
2311
- rgba(96, 199, 255, 0.4) 20%,
2312
- rgba(98, 211, 168, 0.4) 50%,
2313
- rgba(244, 188, 113, 0.3) 80%,
2314
- transparent 100%
2315
- );
2316
- z-index: 9999;
2317
- }
2318
-
2319
- /* Custom scrollbar */
2320
- ::-webkit-scrollbar { width: 6px; height: 6px; }
2321
- ::-webkit-scrollbar-track { background: transparent; }
2322
- ::-webkit-scrollbar-thumb { background: rgba(130, 160, 200, 0.18); border-radius: 99px; }
2323
- ::-webkit-scrollbar-thumb:hover { background: rgba(130, 160, 200, 0.3); }
2324
-
2325
- /* Text selection */
2326
- ::selection {
2327
- background: rgba(96, 199, 255, 0.25);
2328
- color: #fff;
2329
- }
2330
-
2331
- /* --- Header --- */
2332
- header {
2333
- position: sticky;
2334
- top: 0;
2335
- z-index: 100;
2336
- padding: 0.75rem 0;
2337
- margin: -0.5rem 0 1.5rem;
2338
- backdrop-filter: blur(16px) saturate(140%);
2339
- -webkit-backdrop-filter: blur(16px) saturate(140%);
2340
- background: rgba(11, 18, 32, 0.72);
2341
- border-bottom: 1px solid rgba(130, 170, 220, 0.08);
2342
- }
2343
-
2344
- h1 {
2345
- font-weight: 700;
2346
- letter-spacing: -0.025em;
2347
- font-size: 1.6rem;
2348
- }
2349
-
2350
- .logo {
2351
- background: linear-gradient(145deg, #5ec8ff 0%, #3b8fd4 50%, #2a6db0 100%);
2352
- box-shadow: 0 2px 12px rgba(90, 190, 255, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.15);
2353
- border-radius: 14px;
2354
- }
2355
-
2356
- .version-label {
2357
- font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
2358
- font-size: 0.7rem;
2359
- letter-spacing: 0.02em;
2360
- background: rgba(122, 216, 255, 0.06);
2361
- border-color: rgba(122, 216, 255, 0.15);
2362
- color: rgba(122, 216, 255, 0.7);
2363
- }
2364
-
2365
- .status-indicator {
2366
- font-size: 0.8rem;
2367
- padding: 0.4rem 0.85rem;
2368
- backdrop-filter: blur(8px);
2369
- }
2370
- .status-indicator.online {
2371
- background: rgba(34, 197, 94, 0.12);
2372
- border: 1px solid rgba(34, 197, 94, 0.2);
2373
- }
2374
-
2375
- /* --- Cards --- */
2376
- .card {
2377
- background: linear-gradient(170deg, rgba(22, 34, 53, 0.85) 0%, rgba(14, 23, 40, 0.95) 100%);
2378
- backdrop-filter: blur(12px);
2379
- border: 1px solid rgba(130, 170, 220, 0.1);
2380
- border-radius: 14px;
2381
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06);
2382
- transition: border-color 0.3s, box-shadow 0.3s, transform 0.2s;
2383
- }
2384
- .card:hover {
2385
- border-color: rgba(130, 170, 220, 0.18);
2386
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 8px 24px rgba(0, 0, 0, 0.1);
2387
- transform: translateY(-1px);
2388
- }
2389
-
2390
- .card-priority::before {
2391
- width: 3px;
2392
- background: linear-gradient(180deg, rgba(122, 216, 255, 0.8) 0%, rgba(122, 216, 255, 0.1) 100%);
2393
- }
2394
-
2395
- .card-value {
2396
- font-weight: 800;
2397
- letter-spacing: -0.02em;
2398
- }
2399
-
2400
- /* --- Sections --- */
2401
- .section {
2402
- background: linear-gradient(178deg, rgba(17, 26, 43, 0.9) 0%, rgba(12, 20, 35, 0.95) 100%);
2403
- backdrop-filter: blur(8px);
2404
- border: 1px solid rgba(130, 170, 220, 0.08);
2405
- border-radius: 14px;
2406
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.04);
2407
- }
2408
-
2409
- .section-header {
2410
- font-weight: 700;
2411
- letter-spacing: -0.01em;
2412
- font-size: 0.95rem;
2413
- padding: 1rem 1.25rem;
2414
- }
2415
- .section-header.clickable:hover {
2416
- background: rgba(122, 216, 255, 0.03);
2417
- }
2418
- .section-header .badge-count {
2419
- background: rgba(240, 127, 136, 0.1);
2420
- border: 1px solid rgba(240, 127, 136, 0.15);
2421
- font-size: 0.72rem;
2422
- font-weight: 700;
2423
- }
2424
-
2425
- /* --- Buttons --- */
2426
- .btn {
2427
- border-radius: 10px;
2428
- font-weight: 600;
2429
- letter-spacing: 0.01em;
2430
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2431
- }
2432
- .btn:active { transform: scale(0.97); }
2433
-
2434
- .btn-primary {
2435
- background: rgba(96, 199, 255, 0.12);
2436
- border: 1px solid rgba(96, 199, 255, 0.22);
2437
- }
2438
- .btn-primary:hover {
2439
- background: rgba(96, 199, 255, 0.2);
2440
- box-shadow: 0 0 16px rgba(96, 199, 255, 0.08);
2441
- }
2442
-
2443
- .btn-action {
2444
- border-radius: 6px;
2445
- font-weight: 600;
2446
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2447
- }
2448
- .btn-action:active { transform: scale(0.96); }
2449
-
2450
- /* --- Focus strip --- */
2451
- .focus-chip {
2452
- backdrop-filter: blur(8px);
2453
- border-radius: 12px;
2454
- transition: border-color 0.2s, box-shadow 0.2s;
2455
- }
2456
- .focus-now { border-color: rgba(122, 216, 255, 0.2); }
2457
- .focus-now:hover { box-shadow: 0 0 20px rgba(122, 216, 255, 0.06); }
2458
- .focus-next { border-color: rgba(244, 188, 113, 0.2); }
2459
- .focus-next:hover { box-shadow: 0 0 20px rgba(244, 188, 113, 0.06); }
2460
- .focus-blocked { border-color: rgba(240, 127, 136, 0.2); }
2461
- .focus-blocked:hover { box-shadow: 0 0 20px rgba(240, 127, 136, 0.06); }
2462
-
2463
- /* --- MR items --- */
2471
+ /* --- MR items upgrade --- */
2464
2472
  .mr-item-accordion {
2465
- border: 1px solid rgba(130, 170, 220, 0.08);
2473
+ border: 1px solid var(--ink-4);
2466
2474
  border-left: 2px solid transparent;
2467
- border-radius: 12px;
2468
- background: linear-gradient(180deg, rgba(13, 23, 42, 0.7) 0%, rgba(10, 19, 36, 0.85) 100%);
2469
- backdrop-filter: blur(6px);
2470
- transition: border-color 0.2s, box-shadow 0.2s, border-left-color 0.2s;
2475
+ border-radius: 10px;
2476
+ background: var(--bg-2);
2477
+ transition: border-color 0.2s, border-left-color 0.2s;
2471
2478
  }
2472
2479
  .mr-item-accordion:hover {
2473
- border-color: rgba(130, 170, 220, 0.14);
2474
- border-left-color: rgba(122, 216, 255, 0.3);
2480
+ border-color: var(--ink-3);
2481
+ border-left-color: var(--accent);
2475
2482
  }
2476
2483
  .mr-item-header:hover {
2477
- background: rgba(122, 216, 255, 0.02);
2484
+ background: var(--bg-3);
2485
+ }
2486
+
2487
+ /* Active review card — live radial wash */
2488
+ .mr-item-accordion.is-running {
2489
+ border: 1px solid var(--accent);
2490
+ background: radial-gradient(circle at top left, var(--accent-ghost), transparent 60%), var(--bg-2);
2478
2491
  }
2479
2492
 
2480
2493
  /* Review status glow */
2481
- .review-status.running { box-shadow: 0 0 8px rgba(245, 158, 11, 0.5); }
2482
- .review-status.completed { box-shadow: 0 0 6px rgba(34, 197, 94, 0.4); }
2483
- .review-status.failed { box-shadow: 0 0 6px rgba(239, 68, 68, 0.4); }
2494
+ .review-status.running { box-shadow: 0 0 8px rgba(244, 169, 61, 0.45); }
2495
+ .review-status.completed { box-shadow: 0 0 6px rgba(123, 196, 127, 0.4); }
2496
+ .review-status.failed { box-shadow: 0 0 6px rgba(217, 101, 106, 0.4); }
2484
2497
 
2485
2498
  /* Avatars */
2486
2499
  .mr-avatar, .review-avatar {
2487
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.04);
2488
- border: 2px solid rgba(255, 255, 255, 0.08);
2500
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
2501
+ border: 2px solid var(--ink-4);
2489
2502
  }
2490
2503
 
2491
- /* Stat badges */
2492
- .stat-badge {
2493
- border-radius: 6px;
2494
- font-weight: 700;
2495
- letter-spacing: 0.01em;
2496
- backdrop-filter: blur(4px);
2497
- }
2498
-
2499
- /* --- Queue lanes --- */
2500
- .queue-lane-header {
2501
- background: rgba(255, 255, 255, 0.015);
2502
- border-bottom: 1px solid rgba(130, 170, 220, 0.06);
2503
- }
2504
- .queue-lane-title {
2505
- font-size: 0.7rem;
2506
- font-weight: 800;
2507
- letter-spacing: 0.06em;
2508
- color: var(--nsc-text-secondary);
2509
- }
2510
- .queue-lane-count {
2511
- background: rgba(122, 216, 255, 0.08);
2512
- border-color: rgba(122, 216, 255, 0.15);
2513
- color: var(--nsc-focus);
2514
- }
2515
- .queue-lane {
2516
- border-radius: 12px;
2517
- backdrop-filter: blur(6px);
2518
- }
2519
-
2520
- /* --- Now lane --- */
2504
+ /* Now lane */
2521
2505
  .now-lane {
2522
- background: linear-gradient(165deg, rgba(96, 199, 255, 0.08) 0%, rgba(122, 216, 255, 0.03) 100%);
2523
- backdrop-filter: blur(8px);
2524
- border: 1px solid rgba(96, 199, 255, 0.18);
2525
- border-left: 3px solid rgba(96, 199, 255, 0.5);
2526
- border-radius: 14px;
2527
- box-shadow: 0 0 24px rgba(96, 199, 255, 0.04);
2528
- }
2529
- .now-lane-kicker {
2530
- font-size: 0.64rem;
2531
- letter-spacing: 0.06em;
2532
- }
2533
- .now-lane-quality {
2534
- background: rgba(0, 0, 0, 0.15);
2535
- border-color: rgba(130, 170, 220, 0.1);
2536
- border-radius: 10px;
2537
- backdrop-filter: blur(4px);
2538
- }
2539
-
2540
- /* --- Stat cards --- */
2541
- .stat-card {
2506
+ background: radial-gradient(circle at top left, var(--accent-ghost), transparent 60%), var(--bg-2);
2507
+ border: 1px solid rgba(244, 169, 61, 0.25);
2508
+ border-left: 3px solid var(--accent);
2542
2509
  border-radius: 12px;
2543
- backdrop-filter: blur(8px);
2544
- transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2545
- }
2546
- .stat-card:hover {
2547
- transform: translateY(-2px);
2548
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
2549
2510
  }
2550
2511
 
2551
- /* --- Progress bar --- */
2552
- .progress-bar {
2553
- background: rgba(255, 255, 255, 0.06);
2554
- height: 5px;
2555
- }
2556
- .progress-bar-fill {
2557
- background: linear-gradient(90deg, #60c7ff 0%, #62d3a8 100%);
2558
- box-shadow: 0 0 8px rgba(96, 199, 255, 0.3);
2512
+ /* Section header clickable hover */
2513
+ .section-header.clickable:hover {
2514
+ background: var(--bg-2);
2559
2515
  }
2560
2516
 
2561
- /* --- Toasts --- */
2517
+ /* Toasts */
2562
2518
  .toast {
2563
2519
  backdrop-filter: blur(16px) saturate(140%);
2564
- border-radius: 12px;
2520
+ border-radius: 10px;
2565
2521
  font-weight: 600;
2566
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.04);
2522
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
2567
2523
  }
2568
2524
  .toast.success {
2569
- background: rgba(34, 197, 94, 0.14);
2570
- border: 1px solid rgba(34, 197, 94, 0.25);
2525
+ background: rgba(123, 196, 127, 0.12);
2526
+ border: 1px solid rgba(123, 196, 127, 0.25);
2571
2527
  }
2572
2528
  .toast.error {
2573
- background: rgba(239, 68, 68, 0.14);
2574
- border: 1px solid rgba(239, 68, 68, 0.25);
2529
+ background: rgba(217, 101, 106, 0.12);
2530
+ border: 1px solid rgba(217, 101, 106, 0.25);
2575
2531
  }
2576
2532
  .toast.info {
2577
- background: rgba(59, 130, 246, 0.14);
2578
- border: 1px solid rgba(59, 130, 246, 0.25);
2533
+ background: var(--accent-ghost);
2534
+ border: 1px solid rgba(244, 169, 61, 0.2);
2579
2535
  }
2580
2536
 
2581
- /* --- Modal --- */
2537
+ /* Modal */
2582
2538
  .modal-overlay {
2583
2539
  backdrop-filter: blur(6px);
2584
- background: rgba(0, 0, 0, 0.5);
2540
+ background: rgba(0, 0, 0, 0.6);
2585
2541
  }
2586
2542
  .modal-content {
2587
- background: rgba(22, 34, 53, 0.95);
2588
- backdrop-filter: blur(20px);
2589
- border: 1px solid rgba(130, 170, 220, 0.12);
2590
- border-radius: 16px;
2591
- box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.03);
2543
+ background: var(--bg-2);
2544
+ border: 1px solid var(--ink-4);
2545
+ border-radius: 14px;
2546
+ box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
2592
2547
  }
2593
2548
 
2594
- /* --- Inputs / Selects --- */
2549
+ /* Inputs / Selects */
2595
2550
  .project-input, .model-select, .token-input {
2596
- border-radius: 10px;
2597
- background: rgba(0, 0, 0, 0.25);
2598
- border: 1px solid rgba(130, 170, 220, 0.1);
2551
+ border-radius: 8px;
2552
+ background: var(--bg-3);
2553
+ border: 1px solid var(--ink-4);
2554
+ color: var(--ink-0);
2599
2555
  transition: border-color 0.2s, box-shadow 0.2s;
2600
2556
  }
2601
2557
  .project-input:focus, .model-select:focus, .token-input:focus {
2602
- border-color: rgba(96, 199, 255, 0.4);
2603
- box-shadow: 0 0 0 3px rgba(96, 199, 255, 0.08);
2558
+ border-color: var(--accent);
2559
+ box-shadow: 0 0 0 3px var(--accent-ghost);
2604
2560
  outline: none;
2605
2561
  }
2606
2562
 
@@ -2610,56 +2566,64 @@ a:focus-visible,
2610
2566
  select:focus-visible,
2611
2567
  input:focus-visible,
2612
2568
  [role='button']:focus-visible {
2613
- outline: 2px solid rgba(122, 216, 255, 0.6);
2569
+ outline: 2px solid var(--accent);
2614
2570
  outline-offset: 2px;
2615
- box-shadow: 0 0 0 4px rgba(122, 216, 255, 0.1);
2571
+ box-shadow: 0 0 0 4px var(--accent-ghost);
2616
2572
  }
2617
2573
 
2618
- /* --- Empty states --- */
2574
+ /* Empty states */
2619
2575
  .empty-state {
2620
- color: rgba(130, 155, 190, 0.5);
2621
- font-style: italic;
2576
+ color: var(--ink-3);
2622
2577
  font-size: 0.85rem;
2578
+ font-family: var(--font-mono);
2579
+ padding: 1rem;
2623
2580
  }
2624
2581
 
2625
- /* --- Config info --- */
2582
+ /* Config info */
2626
2583
  .config-info {
2627
2584
  border-radius: 10px;
2628
- backdrop-filter: blur(4px);
2629
2585
  }
2630
2586
  .config-status.success {
2631
2587
  border-radius: 99px;
2632
2588
  font-weight: 600;
2633
2589
  }
2634
2590
 
2635
- /* --- Data loading --- */
2591
+ /* Data loading */
2636
2592
  .data-loading {
2637
- backdrop-filter: blur(4px);
2638
- border-color: rgba(122, 216, 255, 0.12);
2639
- color: rgba(122, 216, 255, 0.7);
2593
+ border-color: rgba(244, 169, 61, 0.2);
2594
+ color: var(--accent);
2640
2595
  }
2641
2596
 
2642
- /* --- Logs --- */
2597
+ /* Logs */
2643
2598
  .log-entry {
2644
- font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'Monaco', monospace;
2599
+ font-family: var(--font-mono);
2645
2600
  font-size: 0.72rem;
2646
- border-bottom-color: rgba(130, 170, 220, 0.05);
2647
- border-radius: 6px;
2601
+ border-bottom-color: var(--ink-4);
2602
+ border-radius: 4px;
2648
2603
  margin-bottom: 1px;
2649
2604
  transition: background 0.15s;
2650
2605
  }
2651
2606
  .log-entry:hover {
2652
- background: rgba(255, 255, 255, 0.02);
2607
+ background: var(--bg-3);
2653
2608
  }
2654
2609
 
2655
- /* --- Markdown --- */
2610
+ /* Markdown */
2656
2611
  .markdown-content {
2657
- background: rgba(0, 0, 0, 0.15);
2658
- border: 1px solid rgba(130, 170, 220, 0.06);
2659
- border-radius: 12px;
2612
+ background: var(--bg-3);
2613
+ border: 1px solid var(--ink-4);
2614
+ border-radius: 10px;
2615
+ }
2616
+
2617
+ /* Progress bar */
2618
+ .progress-bar {
2619
+ background: var(--ink-4);
2620
+ height: 4px;
2621
+ }
2622
+ .progress-bar-fill {
2623
+ background: var(--accent);
2660
2624
  }
2661
2625
 
2662
- /* --- Collapsible list toggle --- */
2626
+ /* Collapsible list toggle */
2663
2627
  .collapsible-toggle {
2664
2628
  display: flex;
2665
2629
  align-items: center;
@@ -2669,9 +2633,9 @@ input:focus-visible,
2669
2633
  padding: 0.6rem 0;
2670
2634
  margin-top: 0.25rem;
2671
2635
  background: transparent;
2672
- border: 1px dashed rgba(130, 170, 220, 0.12);
2673
- border-radius: 10px;
2674
- color: var(--nsc-text-muted);
2636
+ border: 1px dashed var(--ink-4);
2637
+ border-radius: 8px;
2638
+ color: var(--ink-2);
2675
2639
  font-size: 0.78rem;
2676
2640
  font-weight: 600;
2677
2641
  cursor: pointer;
@@ -4905,7 +4869,7 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
4905
4869
  align-items: center;
4906
4870
  justify-content: space-between;
4907
4871
  gap: 0.5rem;
4908
- width: 100%;
4872
+ width: auto;
4909
4873
  padding: 0.4rem 0.6rem;
4910
4874
  margin-bottom: 0.35rem;
4911
4875
  background: transparent;
@@ -4956,11 +4920,14 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
4956
4920
  #manage-panel .manage-panel-inner {
4957
4921
  display: flex;
4958
4922
  flex-direction: column;
4959
- gap: 0.5rem;
4960
- padding: 0.5rem;
4961
- border: 1px solid rgba(251, 191, 36, 0.15);
4962
- border-radius: 4px;
4963
- background: rgba(20, 17, 14, 0.6);
4923
+ gap: 0.6rem;
4924
+ padding: 0.75rem;
4925
+ border: 1px solid rgba(251, 191, 36, 0.35);
4926
+ border-radius: 6px;
4927
+ background: var(--bg-3);
4928
+ box-shadow: 0 12px 36px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(0, 0, 0, 0.3);
4929
+ max-width: min(480px, 90vw);
4930
+ width: 100%;
4964
4931
  }
4965
4932
 
4966
4933
  #manage-panel .manage-rows {
@@ -5250,8 +5217,12 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
5250
5217
  }
5251
5218
 
5252
5219
  .project-bar > #manage-panel {
5253
- flex: 0 0 auto;
5254
- min-width: 0;
5220
+ position: absolute;
5221
+ top: 100%;
5222
+ left: 0;
5223
+ z-index: 20;
5224
+ width: min(480px, 90vw);
5225
+ margin-top: 0.25rem;
5255
5226
  }
5256
5227
 
5257
5228
  .project-bar > #dashboard-tabs {
@@ -5509,3 +5480,391 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
5509
5480
  transition: none !important;
5510
5481
  }
5511
5482
  }
5483
+
5484
+ /* ============================================================
5485
+ OPERATOR'S CONSOLE — Amber redesign additions
5486
+ ============================================================ */
5487
+
5488
+ /* Tabular numerals for all number-displaying elements */
5489
+ #running-count,
5490
+ #queued-count,
5491
+ #completed-count,
5492
+ .focus-value,
5493
+ .badge-count,
5494
+ .card-value,
5495
+ .focus-now-count,
5496
+ .focus-next-count,
5497
+ .focus-blocked-count {
5498
+ font-variant-numeric: tabular-nums;
5499
+ font-family: var(--font-mono);
5500
+ font-weight: 500;
5501
+ }
5502
+
5503
+ /* Heartbeat empty state container */
5504
+ .heartbeat-empty-state {
5505
+ display: flex;
5506
+ flex-direction: column;
5507
+ align-items: center;
5508
+ gap: 1rem;
5509
+ padding: 2rem 1rem;
5510
+ text-align: center;
5511
+ }
5512
+
5513
+ .heartbeat-label {
5514
+ font-family: var(--font-mono);
5515
+ font-size: var(--type-xs);
5516
+ color: var(--ink-2);
5517
+ letter-spacing: 0.12em;
5518
+ text-transform: uppercase;
5519
+ }
5520
+
5521
+ .heartbeat-message {
5522
+ font-family: var(--font-sans);
5523
+ font-size: var(--type-sm);
5524
+ color: var(--ink-1);
5525
+ }
5526
+
5527
+ .heartbeat-line-container {
5528
+ width: 240px;
5529
+ height: 1px;
5530
+ background: var(--ink-4);
5531
+ position: relative;
5532
+ overflow: hidden;
5533
+ }
5534
+
5535
+ @media (prefers-reduced-motion: reduce) {
5536
+ .heartbeat-line-container {
5537
+ background: linear-gradient(90deg, transparent 0%, var(--accent) 50%, transparent 100%);
5538
+ opacity: 0.4;
5539
+ }
5540
+ }
5541
+
5542
+ /* Sidebar layout reset for slimmer profile */
5543
+ .dashboard-sidebar {
5544
+ display: flex;
5545
+ flex-direction: column;
5546
+ gap: 0.75rem;
5547
+ }
5548
+
5549
+ /* Attention strip (focus-strip moved to main) */
5550
+ .attention-strip {
5551
+ display: flex;
5552
+ flex-wrap: wrap;
5553
+ gap: 0.75rem;
5554
+ margin-bottom: 1.25rem;
5555
+ }
5556
+
5557
+ /* Tabs type-only upgrade */
5558
+ .dashboard-tab-bar-wrapper .dashboard-tab {
5559
+ position: relative;
5560
+ }
5561
+
5562
+ /* Shared tab underline element (injected via JS) */
5563
+ .tab-underline-indicator {
5564
+ position: absolute;
5565
+ bottom: -1px;
5566
+ height: 2px;
5567
+ background: var(--accent);
5568
+ pointer-events: none;
5569
+ opacity: 0;
5570
+ transition: none;
5571
+ }
5572
+
5573
+ /* Version label with mono font */
5574
+ .version-label {
5575
+ font-family: var(--font-mono);
5576
+ font-size: var(--type-xs);
5577
+ color: var(--ink-2);
5578
+ background: var(--bg-3);
5579
+ border: 1px solid var(--ink-4);
5580
+ border-radius: 4px;
5581
+ padding: 0.2rem 0.5rem;
5582
+ letter-spacing: 0.04em;
5583
+ }
5584
+
5585
+ /* Context bar chips (toolchain) */
5586
+ .context-bar {
5587
+ display: flex;
5588
+ flex-wrap: wrap;
5589
+ gap: 0.5rem;
5590
+ align-items: center;
5591
+ margin-bottom: 0.75rem;
5592
+ padding: 0.4rem 0;
5593
+ border-bottom: 1px solid var(--ink-4);
5594
+ }
5595
+
5596
+ .context-chip {
5597
+ display: inline-flex;
5598
+ align-items: center;
5599
+ gap: 0.3rem;
5600
+ padding: 0.2rem 0.55rem;
5601
+ background: var(--bg-3);
5602
+ border: 1px solid var(--ink-4);
5603
+ border-radius: 99px;
5604
+ font-family: var(--font-mono);
5605
+ font-size: var(--type-xs);
5606
+ color: var(--ink-2);
5607
+ letter-spacing: 0.04em;
5608
+ }
5609
+
5610
+ .context-chip .status-dot {
5611
+ width: 6px;
5612
+ height: 6px;
5613
+ }
5614
+
5615
+ /* Scope marker — minimal single-line, no separator block decoration */
5616
+ .cards-scope-marker {
5617
+ font-size: 13px;
5618
+ color: var(--ink-3);
5619
+ font-family: var(--font-mono);
5620
+ letter-spacing: 0.08em;
5621
+ text-transform: uppercase;
5622
+ opacity: 1;
5623
+ padding: 0;
5624
+ margin: 0 0 0.5rem 0;
5625
+ border: none;
5626
+ background: none;
5627
+ display: flex;
5628
+ gap: 0.4rem;
5629
+ align-items: baseline;
5630
+ }
5631
+
5632
+ .cards-scope-marker .cards-scope-prefix {
5633
+ color: var(--ink-3);
5634
+ opacity: 0.6;
5635
+ }
5636
+
5637
+ .cards-scope-marker .cards-scope-label {
5638
+ color: var(--ink-3);
5639
+ font-weight: 500;
5640
+ }
5641
+
5642
+ /* Version update button with amber accent */
5643
+ .btn-update {
5644
+ background: var(--accent);
5645
+ color: var(--bg-0);
5646
+ border: none;
5647
+ }
5648
+ .btn-update:hover { background: var(--accent-hover); }
5649
+
5650
+ /* Queue lane count with amber */
5651
+ .queue-lane-count {
5652
+ background: var(--accent-ghost);
5653
+ border-color: rgba(244, 169, 61, 0.25);
5654
+ color: var(--accent);
5655
+ font-family: var(--font-mono);
5656
+ font-variant-numeric: tabular-nums;
5657
+ }
5658
+
5659
+ /* Collapsible toggle hover */
5660
+ .collapsible-toggle:hover {
5661
+ background: var(--bg-3);
5662
+ border-color: var(--ink-3);
5663
+ color: var(--ink-1);
5664
+ }
5665
+ .collapsible-toggle:active { transform: scale(0.98); }
5666
+
5667
+ /* Stat badge with mono font */
5668
+ .stat-badge {
5669
+ font-family: var(--font-mono);
5670
+ font-variant-numeric: tabular-nums;
5671
+ font-weight: 500;
5672
+ border-radius: 4px;
5673
+ }
5674
+
5675
+ /* Team insights with token colors */
5676
+ .team-insights {
5677
+ background: var(--bg-2);
5678
+ border: 1px solid var(--ink-4);
5679
+ border-radius: 10px;
5680
+ padding: 1rem;
5681
+ }
5682
+
5683
+ /* AI section with amber accent */
5684
+ .ai-generate-btn {
5685
+ border-color: rgba(244, 169, 61, 0.35);
5686
+ background: var(--accent-ghost);
5687
+ color: var(--accent);
5688
+ }
5689
+ .ai-generate-btn:hover {
5690
+ background: rgba(244, 169, 61, 0.18);
5691
+ border-color: var(--accent);
5692
+ }
5693
+
5694
+ .ai-badge {
5695
+ background: var(--accent-ghost);
5696
+ border: 1px solid rgba(244, 169, 61, 0.35);
5697
+ color: var(--accent);
5698
+ }
5699
+
5700
+ .ai-team-card {
5701
+ background: var(--bg-2);
5702
+ border: 1px solid var(--ink-4);
5703
+ border-left: 3px solid var(--accent);
5704
+ border-radius: 10px;
5705
+ }
5706
+
5707
+ .ai-team-card-header {
5708
+ color: var(--accent);
5709
+ }
5710
+
5711
+ /* Sheet panels with new bg */
5712
+ .sheet-panel {
5713
+ background: var(--bg-1);
5714
+ border-left: 1px solid var(--ink-4);
5715
+ }
5716
+
5717
+ .sheet-stat-card {
5718
+ background: var(--bg-3);
5719
+ border: 1px solid var(--ink-4);
5720
+ }
5721
+
5722
+ /* Dev card with new bg */
5723
+ .dev-card {
5724
+ background: var(--bg-2);
5725
+ border: 1px solid var(--ink-4);
5726
+ }
5727
+ .dev-card:hover {
5728
+ border-color: var(--ink-2);
5729
+ }
5730
+
5731
+ /* Focus ring update */
5732
+ button:focus-visible,
5733
+ a:focus-visible,
5734
+ select:focus-visible,
5735
+ input:focus-visible,
5736
+ [role='button']:focus-visible {
5737
+ outline: 2px solid var(--accent);
5738
+ outline-offset: 2px;
5739
+ box-shadow: 0 0 0 4px var(--accent-ghost);
5740
+ }
5741
+
5742
+ @media (prefers-reduced-motion: reduce) {
5743
+ .status-dot {
5744
+ animation: none !important;
5745
+ }
5746
+ .heartbeat-line-container {
5747
+ overflow: visible;
5748
+ }
5749
+ .context-bar,
5750
+ .attention-strip,
5751
+ .context-chip {
5752
+ transition: none !important;
5753
+ animation: none !important;
5754
+ }
5755
+ .card {
5756
+ transition: none !important;
5757
+ }
5758
+ }
5759
+
5760
+ /* Logo SVG — life signal */
5761
+ @keyframes logo-pulse-breath {
5762
+ 0%, 100% { transform: scale(0.7); opacity: 0.35; }
5763
+ 50% { transform: scale(1.1); opacity: 1; }
5764
+ }
5765
+ @keyframes logo-check-glow {
5766
+ 0%, 90%, 100% { opacity: 0.6; }
5767
+ 93% { opacity: 1; filter: drop-shadow(0 0 3px var(--success)); }
5768
+ }
5769
+ @keyframes logo-flow-line {
5770
+ 0%, 100% { stroke-dashoffset: 0; opacity: 1; }
5771
+ 50% { stroke-dashoffset: -10; opacity: 0.6; }
5772
+ }
5773
+ .logo .logo-pulse {
5774
+ transform-origin: center;
5775
+ transform-box: fill-box;
5776
+ animation: logo-pulse-breath 2.8s ease-in-out infinite;
5777
+ }
5778
+ .logo .logo-check {
5779
+ animation: logo-check-glow 4.5s ease-in-out infinite;
5780
+ }
5781
+ .logo .logo-line--accent {
5782
+ stroke-dasharray: 12 4;
5783
+ animation: logo-flow-line 3.5s linear infinite;
5784
+ }
5785
+ @media (prefers-reduced-motion: reduce) {
5786
+ .logo .logo-pulse,
5787
+ .logo .logo-check,
5788
+ .logo .logo-line--accent {
5789
+ animation: none !important;
5790
+ }
5791
+ }
5792
+
5793
+ /* Task 6 — Toolchain chips: inline mono text, right-aligned in project-bar */
5794
+ /* Renamed from .context-chip to .toolchain-chip to avoid collision with the
5795
+ legacy .context-chip pill rule (line 5597). No !important needed. */
5796
+ .context-chips {
5797
+ flex: 0 0 auto;
5798
+ display: flex;
5799
+ gap: 1.75rem;
5800
+ align-items: center;
5801
+ margin-left: auto;
5802
+ padding: 0 0.25rem;
5803
+ height: 100%;
5804
+ }
5805
+ .context-chips .toolchain-chip {
5806
+ display: flex;
5807
+ flex-direction: row;
5808
+ align-items: center;
5809
+ gap: 0.5rem;
5810
+ font-family: var(--font-mono);
5811
+ font-size: 11px;
5812
+ white-space: nowrap;
5813
+ min-height: 28px;
5814
+ letter-spacing: 0.04em;
5815
+ }
5816
+ .context-chips .toolchain-chip-label {
5817
+ text-transform: uppercase;
5818
+ letter-spacing: 0.12em;
5819
+ color: var(--ink-2);
5820
+ font-size: 10px;
5821
+ font-weight: 500;
5822
+ }
5823
+ .context-chips .toolchain-chip .card-claude {
5824
+ display: inline-flex;
5825
+ align-items: center;
5826
+ gap: 6px;
5827
+ flex-direction: row;
5828
+ font-size: 12px;
5829
+ padding: 0;
5830
+ background: transparent;
5831
+ }
5832
+ .context-chips .toolchain-chip .card-claude .status { font-size: 12px; }
5833
+ .context-chips .toolchain-chip .card-claude .version {
5834
+ color: var(--ink-3);
5835
+ font-size: 10px;
5836
+ }
5837
+ .context-chips .toolchain-chip .card-claude.available,
5838
+ .context-chips .toolchain-chip .card-claude.available .status { color: var(--success); }
5839
+ .context-chips .toolchain-chip .card-claude.unavailable,
5840
+ .context-chips .toolchain-chip .card-claude.unavailable .status { color: var(--danger); }
5841
+ .context-chips .toolchain-chip .card-claude.checking,
5842
+ .context-chips .toolchain-chip .card-claude.checking .status { color: var(--warning); }
5843
+ .context-chips .toolchain-chip-model .model-select {
5844
+ background: var(--bg-1);
5845
+ color: var(--ink-1);
5846
+ border: 1px solid var(--ink-4);
5847
+ border-radius: 4px;
5848
+ padding: 3px 8px;
5849
+ font-family: var(--font-mono);
5850
+ font-size: 11px;
5851
+ line-height: 16px;
5852
+ cursor: pointer;
5853
+ transition: border-color 150ms ease;
5854
+ }
5855
+ .context-chips .toolchain-chip-model .model-select:hover { border-color: var(--accent); }
5856
+ .context-chips .toolchain-chip-model .model-select:focus {
5857
+ outline: none;
5858
+ border-color: var(--accent);
5859
+ box-shadow: 0 0 0 2px var(--accent-ghost);
5860
+ }
5861
+
5862
+ @media (max-width: 1100px) {
5863
+ .context-chips {
5864
+ margin-left: 0;
5865
+ width: 100%;
5866
+ flex-basis: 100%;
5867
+ margin-top: 0.5rem;
5868
+ justify-content: flex-end;
5869
+ }
5870
+ }