shipwright-cli 1.7.1 → 1.9.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 (105) hide show
  1. package/.claude/agents/code-reviewer.md +90 -0
  2. package/.claude/agents/devops-engineer.md +142 -0
  3. package/.claude/agents/pipeline-agent.md +80 -0
  4. package/.claude/agents/shell-script-specialist.md +150 -0
  5. package/.claude/agents/test-specialist.md +196 -0
  6. package/.claude/hooks/post-tool-use.sh +38 -0
  7. package/.claude/hooks/pre-tool-use.sh +25 -0
  8. package/.claude/hooks/session-started.sh +37 -0
  9. package/README.md +212 -814
  10. package/claude-code/CLAUDE.md.shipwright +54 -0
  11. package/claude-code/hooks/notify-idle.sh +2 -2
  12. package/claude-code/hooks/session-start.sh +24 -0
  13. package/claude-code/hooks/task-completed.sh +6 -2
  14. package/claude-code/settings.json.template +12 -0
  15. package/dashboard/public/app.js +4422 -0
  16. package/dashboard/public/index.html +816 -0
  17. package/dashboard/public/styles.css +4755 -0
  18. package/dashboard/server.ts +4315 -0
  19. package/docs/KNOWN-ISSUES.md +18 -10
  20. package/docs/TIPS.md +38 -26
  21. package/docs/patterns/README.md +33 -23
  22. package/package.json +9 -5
  23. package/scripts/adapters/iterm2-adapter.sh +1 -1
  24. package/scripts/adapters/tmux-adapter.sh +52 -23
  25. package/scripts/adapters/wezterm-adapter.sh +26 -14
  26. package/scripts/lib/compat.sh +200 -0
  27. package/scripts/lib/helpers.sh +72 -0
  28. package/scripts/postinstall.mjs +72 -13
  29. package/scripts/{cct → sw} +109 -21
  30. package/scripts/sw-adversarial.sh +274 -0
  31. package/scripts/sw-architecture-enforcer.sh +330 -0
  32. package/scripts/sw-checkpoint.sh +390 -0
  33. package/scripts/{cct-cleanup.sh → sw-cleanup.sh} +3 -1
  34. package/scripts/sw-connect.sh +619 -0
  35. package/scripts/{cct-cost.sh → sw-cost.sh} +368 -34
  36. package/scripts/{cct-daemon.sh → sw-daemon.sh} +2217 -204
  37. package/scripts/sw-dashboard.sh +477 -0
  38. package/scripts/sw-developer-simulation.sh +252 -0
  39. package/scripts/sw-docs.sh +635 -0
  40. package/scripts/sw-doctor.sh +907 -0
  41. package/scripts/{cct-fix.sh → sw-fix.sh} +10 -6
  42. package/scripts/{cct-fleet.sh → sw-fleet.sh} +498 -22
  43. package/scripts/sw-github-checks.sh +521 -0
  44. package/scripts/sw-github-deploy.sh +533 -0
  45. package/scripts/sw-github-graphql.sh +972 -0
  46. package/scripts/sw-heartbeat.sh +293 -0
  47. package/scripts/{cct-init.sh → sw-init.sh} +144 -11
  48. package/scripts/sw-intelligence.sh +1196 -0
  49. package/scripts/sw-jira.sh +643 -0
  50. package/scripts/sw-launchd.sh +364 -0
  51. package/scripts/sw-linear.sh +648 -0
  52. package/scripts/{cct-logs.sh → sw-logs.sh} +72 -2
  53. package/scripts/{cct-loop.sh → sw-loop.sh} +534 -44
  54. package/scripts/{cct-memory.sh → sw-memory.sh} +321 -38
  55. package/scripts/sw-patrol-meta.sh +417 -0
  56. package/scripts/sw-pipeline-composer.sh +455 -0
  57. package/scripts/{cct-pipeline.sh → sw-pipeline.sh} +2319 -178
  58. package/scripts/sw-predictive.sh +820 -0
  59. package/scripts/{cct-prep.sh → sw-prep.sh} +339 -49
  60. package/scripts/{cct-ps.sh → sw-ps.sh} +6 -4
  61. package/scripts/{cct-reaper.sh → sw-reaper.sh} +6 -4
  62. package/scripts/sw-remote.sh +687 -0
  63. package/scripts/sw-self-optimize.sh +947 -0
  64. package/scripts/sw-session.sh +519 -0
  65. package/scripts/sw-setup.sh +234 -0
  66. package/scripts/sw-status.sh +605 -0
  67. package/scripts/{cct-templates.sh → sw-templates.sh} +9 -4
  68. package/scripts/sw-tmux.sh +591 -0
  69. package/scripts/sw-tracker-jira.sh +277 -0
  70. package/scripts/sw-tracker-linear.sh +292 -0
  71. package/scripts/sw-tracker.sh +409 -0
  72. package/scripts/{cct-upgrade.sh → sw-upgrade.sh} +103 -46
  73. package/scripts/{cct-worktree.sh → sw-worktree.sh} +3 -0
  74. package/templates/pipelines/autonomous.json +27 -5
  75. package/templates/pipelines/full.json +12 -0
  76. package/templates/pipelines/standard.json +12 -0
  77. package/tmux/{claude-teams-overlay.conf → shipwright-overlay.conf} +27 -9
  78. package/tmux/templates/accessibility.json +34 -0
  79. package/tmux/templates/api-design.json +35 -0
  80. package/tmux/templates/architecture.json +1 -0
  81. package/tmux/templates/bug-fix.json +9 -0
  82. package/tmux/templates/code-review.json +1 -0
  83. package/tmux/templates/compliance.json +36 -0
  84. package/tmux/templates/data-pipeline.json +36 -0
  85. package/tmux/templates/debt-paydown.json +34 -0
  86. package/tmux/templates/devops.json +1 -0
  87. package/tmux/templates/documentation.json +1 -0
  88. package/tmux/templates/exploration.json +1 -0
  89. package/tmux/templates/feature-dev.json +1 -0
  90. package/tmux/templates/full-stack.json +8 -0
  91. package/tmux/templates/i18n.json +34 -0
  92. package/tmux/templates/incident-response.json +36 -0
  93. package/tmux/templates/migration.json +1 -0
  94. package/tmux/templates/observability.json +35 -0
  95. package/tmux/templates/onboarding.json +33 -0
  96. package/tmux/templates/performance.json +35 -0
  97. package/tmux/templates/refactor.json +1 -0
  98. package/tmux/templates/release.json +35 -0
  99. package/tmux/templates/security-audit.json +8 -0
  100. package/tmux/templates/spike.json +34 -0
  101. package/tmux/templates/testing.json +1 -0
  102. package/tmux/tmux.conf +98 -9
  103. package/scripts/cct-doctor.sh +0 -414
  104. package/scripts/cct-session.sh +0 -284
  105. package/scripts/cct-status.sh +0 -169
@@ -0,0 +1,4755 @@
1
+ /* ── Reset & Custom Properties ─────────────────── */
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ box-sizing: border-box;
6
+ margin: 0;
7
+ padding: 0;
8
+ }
9
+
10
+ :root {
11
+ --abyss: #060a14;
12
+ --deep: #0a1628;
13
+ --ocean: #0d1f3c;
14
+ --surface: #132d56;
15
+ --foam: #1a3a6a;
16
+
17
+ --cyan: #00d4ff;
18
+ --cyan-glow: rgba(0, 212, 255, 0.15);
19
+ --cyan-dim: rgba(0, 212, 255, 0.4);
20
+ --purple: #7c3aed;
21
+ --purple-glow: rgba(124, 58, 237, 0.15);
22
+ --blue: #0066ff;
23
+
24
+ --green: #4ade80;
25
+ --amber: #fbbf24;
26
+ --rose: #f43f5e;
27
+
28
+ --text-primary: #e8ecf4;
29
+ --text-secondary: #8899b8;
30
+ --text-muted: #5a6d8a;
31
+
32
+ --card-bg: rgba(10, 22, 40, 0.8);
33
+ --card-border: rgba(0, 212, 255, 0.08);
34
+ --card-hover-border: rgba(0, 212, 255, 0.2);
35
+ --card-radius: 16px;
36
+
37
+ --font-display: "Instrument Serif", Georgia, serif;
38
+ --font-body: "Plus Jakarta Sans", system-ui, sans-serif;
39
+ --font-mono: "JetBrains Mono", "SF Mono", monospace;
40
+
41
+ --transition-fast: 0.15s ease;
42
+ --transition-base: 0.3s ease;
43
+ }
44
+
45
+ ::selection {
46
+ background: var(--cyan);
47
+ color: var(--abyss);
48
+ }
49
+
50
+ /* ── Base ─────────────────────────────────────── */
51
+ body {
52
+ background: var(--abyss);
53
+ color: var(--text-primary);
54
+ font-family: var(--font-body);
55
+ font-size: 14px;
56
+ line-height: 1.6;
57
+ min-height: 100vh;
58
+ overflow-x: hidden;
59
+ -webkit-font-smoothing: antialiased;
60
+ -moz-osx-font-smoothing: grayscale;
61
+ scrollbar-color: var(--cyan-dim) var(--deep);
62
+ }
63
+
64
+ body::-webkit-scrollbar {
65
+ width: 8px;
66
+ }
67
+ body::-webkit-scrollbar-track {
68
+ background: var(--deep);
69
+ }
70
+ body::-webkit-scrollbar-thumb {
71
+ background: var(--cyan-dim);
72
+ border-radius: 4px;
73
+ }
74
+
75
+ /* ── Header ───────────────────────────────────── */
76
+ .header {
77
+ position: fixed;
78
+ top: 0;
79
+ left: 0;
80
+ right: 0;
81
+ z-index: 100;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: space-between;
85
+ height: 56px;
86
+ padding: 0 24px;
87
+ background: rgba(6, 10, 20, 0.85);
88
+ backdrop-filter: blur(20px) saturate(1.5);
89
+ -webkit-backdrop-filter: blur(20px) saturate(1.5);
90
+ border-bottom: 1px solid var(--card-border);
91
+ transition: border-color var(--transition-base);
92
+ }
93
+
94
+ .header:hover {
95
+ border-bottom-color: rgba(0, 212, 255, 0.15);
96
+ }
97
+
98
+ .header-left {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 10px;
102
+ }
103
+
104
+ .header-icon {
105
+ flex-shrink: 0;
106
+ }
107
+
108
+ .header-title {
109
+ font-family: var(--font-display);
110
+ font-size: 1.25rem;
111
+ color: var(--text-primary);
112
+ line-height: 1;
113
+ }
114
+
115
+ .header-center {
116
+ display: flex;
117
+ align-items: center;
118
+ gap: 8px;
119
+ }
120
+
121
+ .connection-dot {
122
+ width: 8px;
123
+ height: 8px;
124
+ border-radius: 50%;
125
+ display: inline-block;
126
+ flex-shrink: 0;
127
+ }
128
+
129
+ .connection-dot.live {
130
+ background: var(--green);
131
+ box-shadow: 0 0 8px var(--green);
132
+ animation: pulse-dot 2s ease-in-out infinite;
133
+ }
134
+
135
+ .connection-dot.offline {
136
+ background: var(--rose);
137
+ box-shadow: 0 0 8px var(--rose);
138
+ }
139
+
140
+ .connection-text {
141
+ font-family: var(--font-mono);
142
+ font-size: 0.75rem;
143
+ color: var(--text-secondary);
144
+ letter-spacing: 0.05em;
145
+ }
146
+
147
+ @keyframes pulse-dot {
148
+ 0%,
149
+ 100% {
150
+ opacity: 1;
151
+ transform: scale(1);
152
+ }
153
+ 50% {
154
+ opacity: 0.5;
155
+ transform: scale(0.85);
156
+ }
157
+ }
158
+
159
+ /* ── User Menu ────────────────────────────────── */
160
+ .header-right {
161
+ display: flex;
162
+ align-items: center;
163
+ }
164
+
165
+ .user-menu {
166
+ position: relative;
167
+ }
168
+
169
+ .user-avatar {
170
+ width: 32px;
171
+ height: 32px;
172
+ border-radius: 50%;
173
+ border: 1px solid var(--card-border);
174
+ background: var(--ocean);
175
+ color: var(--text-secondary);
176
+ font-family: var(--font-mono);
177
+ font-size: 0.7rem;
178
+ font-weight: 500;
179
+ cursor: pointer;
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ transition:
184
+ border-color var(--transition-base),
185
+ box-shadow var(--transition-base);
186
+ }
187
+
188
+ .user-avatar:hover {
189
+ border-color: var(--card-hover-border);
190
+ box-shadow: 0 0 12px var(--cyan-glow);
191
+ }
192
+
193
+ .user-avatar img {
194
+ width: 100%;
195
+ height: 100%;
196
+ border-radius: 50%;
197
+ object-fit: cover;
198
+ }
199
+
200
+ .user-dropdown {
201
+ display: none;
202
+ position: absolute;
203
+ top: calc(100% + 8px);
204
+ right: 0;
205
+ min-width: 160px;
206
+ background: var(--foam);
207
+ border: 1px solid var(--card-border);
208
+ border-radius: 12px;
209
+ padding: 8px 0;
210
+ z-index: 200;
211
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
212
+ }
213
+
214
+ .user-dropdown.open {
215
+ display: block;
216
+ }
217
+
218
+ .dropdown-username {
219
+ padding: 8px 16px;
220
+ font-family: var(--font-mono);
221
+ font-size: 0.75rem;
222
+ color: var(--text-secondary);
223
+ border-bottom: 1px solid var(--card-border);
224
+ margin-bottom: 4px;
225
+ }
226
+
227
+ .dropdown-link {
228
+ display: block;
229
+ padding: 8px 16px;
230
+ font-size: 0.8rem;
231
+ color: var(--text-secondary);
232
+ text-decoration: none;
233
+ transition:
234
+ color var(--transition-fast),
235
+ background var(--transition-fast);
236
+ }
237
+
238
+ .dropdown-link:hover {
239
+ color: var(--text-primary);
240
+ background: rgba(0, 212, 255, 0.05);
241
+ }
242
+
243
+ /* ── Tab Bar ──────────────────────────────────── */
244
+ .tab-bar {
245
+ position: fixed;
246
+ top: 56px;
247
+ left: 0;
248
+ right: 0;
249
+ z-index: 99;
250
+ height: 48px;
251
+ background: rgba(6, 10, 20, 0.9);
252
+ backdrop-filter: blur(20px) saturate(1.5);
253
+ -webkit-backdrop-filter: blur(20px) saturate(1.5);
254
+ border-bottom: 1px solid var(--card-border);
255
+ }
256
+
257
+ .tab-bar-inner {
258
+ max-width: 1200px;
259
+ margin: 0 auto;
260
+ padding: 0 24px;
261
+ display: flex;
262
+ align-items: stretch;
263
+ height: 100%;
264
+ position: relative;
265
+ gap: 0;
266
+ }
267
+
268
+ .tab-btn {
269
+ background: none;
270
+ border: none;
271
+ padding: 0 20px;
272
+ font-family: var(--font-body);
273
+ font-size: 0.85rem;
274
+ font-weight: 500;
275
+ color: var(--text-muted);
276
+ cursor: pointer;
277
+ position: relative;
278
+ transition: color var(--transition-base);
279
+ white-space: nowrap;
280
+ }
281
+
282
+ .tab-btn:hover {
283
+ color: var(--text-secondary);
284
+ }
285
+
286
+ .tab-btn.active {
287
+ color: var(--cyan);
288
+ }
289
+
290
+ .tab-btn.active::after {
291
+ content: "";
292
+ position: absolute;
293
+ bottom: 0;
294
+ left: 12px;
295
+ right: 12px;
296
+ height: 2px;
297
+ background: var(--cyan);
298
+ border-radius: 2px 2px 0 0;
299
+ }
300
+
301
+ .tab-indicator {
302
+ display: none;
303
+ }
304
+
305
+ /* ── Main Layout ──────────────────────────────── */
306
+ .main {
307
+ max-width: 1200px;
308
+ min-width: 0;
309
+ margin: 0 auto;
310
+ padding: 120px 24px 24px; /* 56px header + 48px tab bar + 16px gap */
311
+ }
312
+
313
+ /* ── Tab Panels ──────────────────────────────── */
314
+ .tab-panel {
315
+ display: none;
316
+ animation: tab-fade 0.3s ease-out;
317
+ }
318
+
319
+ .tab-panel.active {
320
+ display: block;
321
+ }
322
+
323
+ @keyframes tab-fade {
324
+ from {
325
+ opacity: 0;
326
+ transform: translateY(6px);
327
+ }
328
+ to {
329
+ opacity: 1;
330
+ transform: translateY(0);
331
+ }
332
+ }
333
+
334
+ /* ── Stats Row ────────────────────────────────── */
335
+ .stats-row {
336
+ display: grid;
337
+ grid-template-columns: repeat(4, 1fr);
338
+ gap: 16px;
339
+ margin-bottom: 24px;
340
+ }
341
+
342
+ .stat-card {
343
+ background: var(--card-bg);
344
+ border: 1px solid var(--card-border);
345
+ border-radius: var(--card-radius);
346
+ padding: 1.5rem;
347
+ transition:
348
+ border-color var(--transition-base),
349
+ transform var(--transition-base),
350
+ box-shadow var(--transition-base);
351
+ animation: card-enter 0.4s ease-out both;
352
+ }
353
+
354
+ .stat-card:nth-child(1) {
355
+ animation-delay: 0s;
356
+ }
357
+ .stat-card:nth-child(2) {
358
+ animation-delay: 0.05s;
359
+ }
360
+ .stat-card:nth-child(3) {
361
+ animation-delay: 0.1s;
362
+ }
363
+ .stat-card:nth-child(4) {
364
+ animation-delay: 0.15s;
365
+ }
366
+
367
+ .stat-card:hover {
368
+ border-color: var(--card-hover-border);
369
+ transform: translateY(-2px);
370
+ box-shadow: 0 8px 32px rgba(0, 212, 255, 0.06);
371
+ }
372
+
373
+ .stat-label {
374
+ display: block;
375
+ font-family: var(--font-mono);
376
+ font-size: 0.7rem;
377
+ font-weight: 500;
378
+ letter-spacing: 0.2em;
379
+ text-transform: uppercase;
380
+ color: var(--text-muted);
381
+ margin-bottom: 8px;
382
+ }
383
+
384
+ .stat-value {
385
+ font-family: var(--font-display);
386
+ font-size: 1.75rem;
387
+ font-weight: 400;
388
+ line-height: 1.2;
389
+ }
390
+
391
+ .stat-value-row {
392
+ display: flex;
393
+ align-items: center;
394
+ gap: 10px;
395
+ }
396
+
397
+ .stat-value-row .stat-value {
398
+ font-size: 1.25rem;
399
+ }
400
+
401
+ .gradient-text {
402
+ background: linear-gradient(135deg, var(--cyan), var(--purple));
403
+ -webkit-background-clip: text;
404
+ -webkit-text-fill-color: transparent;
405
+ background-clip: text;
406
+ }
407
+
408
+ .stat-value.status-green {
409
+ color: var(--green);
410
+ }
411
+ .stat-value.status-rose {
412
+ color: var(--rose);
413
+ }
414
+ .stat-value.status-amber {
415
+ color: var(--amber);
416
+ }
417
+
418
+ .stat-subtitle {
419
+ font-family: var(--font-mono);
420
+ font-size: 0.7rem;
421
+ color: var(--text-muted);
422
+ margin-top: 4px;
423
+ }
424
+
425
+ .stat-subtitle.failed-some {
426
+ color: var(--rose);
427
+ }
428
+ .stat-subtitle.failed-none {
429
+ color: var(--green);
430
+ }
431
+
432
+ /* ── Stat Progress Bar ────────────────────────── */
433
+ .stat-bar-track {
434
+ height: 4px;
435
+ background: var(--ocean);
436
+ border-radius: 2px;
437
+ margin-top: 12px;
438
+ overflow: hidden;
439
+ }
440
+
441
+ .stat-bar-fill {
442
+ height: 100%;
443
+ background: linear-gradient(90deg, var(--cyan), var(--blue));
444
+ border-radius: 2px;
445
+ width: 0%;
446
+ transition: width 0.6s ease;
447
+ }
448
+
449
+ /* ── Pulse Dot (status card) ──────────────────── */
450
+ .pulse-dot {
451
+ width: 10px;
452
+ height: 10px;
453
+ border-radius: 50%;
454
+ flex-shrink: 0;
455
+ }
456
+
457
+ .pulse-dot.operational {
458
+ background: var(--green);
459
+ box-shadow: 0 0 8px var(--green);
460
+ animation: pulse-dot 2s ease-in-out infinite;
461
+ }
462
+
463
+ .pulse-dot.offline {
464
+ background: var(--rose);
465
+ box-shadow: 0 0 6px var(--rose);
466
+ }
467
+
468
+ /* ── Section Labels ───────────────────────────── */
469
+ .section {
470
+ margin-bottom: 24px;
471
+ }
472
+
473
+ .section-label {
474
+ font-family: var(--font-mono);
475
+ font-size: 0.7rem;
476
+ font-weight: 500;
477
+ letter-spacing: 0.2em;
478
+ text-transform: uppercase;
479
+ color: var(--text-muted);
480
+ margin-bottom: 12px;
481
+ }
482
+
483
+ /* ── Empty State ──────────────────────────────── */
484
+ .empty-state {
485
+ text-align: center;
486
+ padding: 32px 16px;
487
+ color: var(--text-muted);
488
+ font-size: 0.85rem;
489
+ }
490
+
491
+ .empty-icon {
492
+ margin-bottom: 8px;
493
+ opacity: 0.4;
494
+ }
495
+
496
+ /* ── Pipeline Cards (Overview tab) ────────────── */
497
+ .pipeline-card {
498
+ background: var(--card-bg);
499
+ border: 1px solid var(--card-border);
500
+ border-radius: var(--card-radius);
501
+ padding: 1.25rem 1.5rem;
502
+ margin-bottom: 12px;
503
+ transition:
504
+ border-color var(--transition-base),
505
+ transform var(--transition-base),
506
+ box-shadow var(--transition-base);
507
+ animation: card-enter 0.4s ease-out both;
508
+ cursor: pointer;
509
+ }
510
+
511
+ .pipeline-card:hover {
512
+ border-color: var(--card-hover-border);
513
+ transform: translateY(-2px);
514
+ box-shadow: 0 8px 32px rgba(0, 212, 255, 0.06);
515
+ }
516
+
517
+ .pipeline-header {
518
+ display: flex;
519
+ align-items: baseline;
520
+ gap: 12px;
521
+ margin-bottom: 12px;
522
+ flex-wrap: wrap;
523
+ }
524
+
525
+ .pipeline-issue {
526
+ font-family: var(--font-mono);
527
+ font-size: 1rem;
528
+ font-weight: 700;
529
+ color: var(--cyan);
530
+ }
531
+
532
+ .pipeline-title {
533
+ font-family: var(--font-body);
534
+ font-size: 0.9rem;
535
+ color: var(--text-primary);
536
+ flex: 1;
537
+ min-width: 120px;
538
+ }
539
+
540
+ .pipeline-elapsed {
541
+ font-family: var(--font-mono);
542
+ font-size: 0.75rem;
543
+ color: var(--text-muted);
544
+ }
545
+
546
+ /* ── Stage Bar ────────────────────────────────── */
547
+ .stage-bar {
548
+ display: flex;
549
+ gap: 3px;
550
+ margin-bottom: 12px;
551
+ }
552
+
553
+ .stage-seg {
554
+ flex: 1;
555
+ text-align: center;
556
+ padding: 4px 8px;
557
+ font-family: var(--font-mono);
558
+ font-size: 0.6rem;
559
+ font-weight: 500;
560
+ letter-spacing: 0.05em;
561
+ border-radius: 4px;
562
+ background: var(--ocean);
563
+ color: var(--text-muted);
564
+ transition: all var(--transition-base);
565
+ }
566
+
567
+ .stage-seg.done {
568
+ background: var(--green);
569
+ color: #fff;
570
+ }
571
+
572
+ .stage-seg.active {
573
+ background: var(--cyan);
574
+ color: var(--abyss);
575
+ animation: stage-glow 2s ease-in-out infinite;
576
+ }
577
+
578
+ .stage-seg.skipped {
579
+ text-decoration: line-through;
580
+ opacity: 0.3;
581
+ }
582
+
583
+ @keyframes stage-glow {
584
+ 0%,
585
+ 100% {
586
+ box-shadow: 0 0 6px var(--cyan-glow);
587
+ }
588
+ 50% {
589
+ box-shadow: 0 0 14px rgba(0, 212, 255, 0.35);
590
+ }
591
+ }
592
+
593
+ /* ── Iteration Progress ───────────────────────── */
594
+ .pipeline-iter {
595
+ display: flex;
596
+ align-items: center;
597
+ gap: 12px;
598
+ margin-bottom: 6px;
599
+ }
600
+
601
+ .pipeline-iter-label {
602
+ font-family: var(--font-mono);
603
+ font-size: 0.7rem;
604
+ color: var(--text-secondary);
605
+ white-space: nowrap;
606
+ }
607
+
608
+ .iter-bar-track {
609
+ flex: 1;
610
+ height: 4px;
611
+ background: var(--ocean);
612
+ border-radius: 2px;
613
+ overflow: hidden;
614
+ }
615
+
616
+ .iter-bar-fill {
617
+ height: 100%;
618
+ background: var(--cyan);
619
+ border-radius: 2px;
620
+ transition: width 0.6s ease;
621
+ }
622
+
623
+ .pipeline-meta {
624
+ font-family: var(--font-mono);
625
+ font-size: 0.7rem;
626
+ color: var(--text-muted);
627
+ display: flex;
628
+ gap: 12px;
629
+ flex-wrap: wrap;
630
+ }
631
+
632
+ .pipeline-meta .tests-pass {
633
+ color: var(--green);
634
+ }
635
+ .pipeline-meta .tests-fail {
636
+ color: var(--rose);
637
+ }
638
+
639
+ .pipeline-worktree {
640
+ font-family: var(--font-mono);
641
+ font-size: 0.65rem;
642
+ color: var(--text-muted);
643
+ margin-top: 6px;
644
+ }
645
+
646
+ /* ── Queue Table ──────────────────────────────── */
647
+ .queue-row {
648
+ display: flex;
649
+ align-items: center;
650
+ gap: 16px;
651
+ padding: 10px 16px;
652
+ border-radius: 8px;
653
+ transition: background var(--transition-fast);
654
+ }
655
+
656
+ .queue-row:nth-child(even) {
657
+ background: rgba(10, 22, 40, 0.4);
658
+ }
659
+ .queue-row:hover {
660
+ background: rgba(0, 212, 255, 0.03);
661
+ }
662
+
663
+ .queue-issue {
664
+ font-family: var(--font-mono);
665
+ font-size: 0.85rem;
666
+ font-weight: 700;
667
+ color: var(--cyan);
668
+ min-width: 50px;
669
+ }
670
+
671
+ .queue-title-text {
672
+ font-family: var(--font-body);
673
+ font-size: 0.85rem;
674
+ color: var(--text-primary);
675
+ flex: 1;
676
+ min-width: 0;
677
+ overflow: hidden;
678
+ text-overflow: ellipsis;
679
+ white-space: nowrap;
680
+ }
681
+
682
+ .queue-score {
683
+ font-family: var(--font-mono);
684
+ font-size: 0.75rem;
685
+ color: var(--text-muted);
686
+ white-space: nowrap;
687
+ }
688
+
689
+ /* ── Bottom Grid ──────────────────────────────── */
690
+ .bottom-grid {
691
+ display: grid;
692
+ grid-template-columns: 2fr 1fr;
693
+ gap: 24px;
694
+ }
695
+
696
+ /* ── Activity Feed (Overview compact) ──────────── */
697
+ .activity-feed {
698
+ max-height: 400px;
699
+ overflow-y: auto;
700
+ scrollbar-color: var(--cyan-dim) var(--deep);
701
+ }
702
+
703
+ .activity-feed::-webkit-scrollbar {
704
+ width: 6px;
705
+ }
706
+ .activity-feed::-webkit-scrollbar-track {
707
+ background: transparent;
708
+ }
709
+ .activity-feed::-webkit-scrollbar-thumb {
710
+ background: var(--cyan-dim);
711
+ border-radius: 3px;
712
+ }
713
+
714
+ .activity-row {
715
+ display: flex;
716
+ align-items: center;
717
+ gap: 12px;
718
+ padding: 6px 0;
719
+ border-left: 2px solid transparent;
720
+ padding-left: 10px;
721
+ transition:
722
+ border-color var(--transition-fast),
723
+ background var(--transition-fast);
724
+ }
725
+
726
+ .activity-row:hover {
727
+ border-left-color: var(--cyan-glow);
728
+ background: rgba(0, 212, 255, 0.02);
729
+ }
730
+
731
+ .activity-ts {
732
+ font-family: var(--font-mono);
733
+ font-size: 0.7rem;
734
+ color: var(--text-muted);
735
+ white-space: nowrap;
736
+ min-width: 60px;
737
+ }
738
+
739
+ .activity-badge {
740
+ display: inline-block;
741
+ padding: 2px 10px;
742
+ border-radius: 100px;
743
+ font-family: var(--font-mono);
744
+ font-size: 0.65rem;
745
+ font-weight: 500;
746
+ white-space: nowrap;
747
+ }
748
+
749
+ .activity-badge.poll {
750
+ background: rgba(90, 109, 138, 0.2);
751
+ color: var(--text-muted);
752
+ }
753
+ .activity-badge.started {
754
+ background: rgba(0, 212, 255, 0.15);
755
+ color: var(--cyan);
756
+ }
757
+ .activity-badge.spawn {
758
+ background: rgba(0, 212, 255, 0.15);
759
+ color: var(--cyan);
760
+ }
761
+ .activity-badge.completed {
762
+ background: rgba(74, 222, 128, 0.15);
763
+ color: var(--green);
764
+ }
765
+ .activity-badge.failed {
766
+ background: rgba(244, 63, 94, 0.15);
767
+ color: var(--rose);
768
+ }
769
+ .activity-badge.stage {
770
+ background: rgba(124, 58, 237, 0.15);
771
+ color: var(--purple);
772
+ }
773
+ .activity-badge.scale {
774
+ background: rgba(251, 191, 36, 0.15);
775
+ color: var(--amber);
776
+ }
777
+ .activity-badge.default {
778
+ background: rgba(90, 109, 138, 0.1);
779
+ color: var(--text-muted);
780
+ }
781
+
782
+ .activity-detail {
783
+ font-size: 0.8rem;
784
+ color: var(--text-secondary);
785
+ flex: 1;
786
+ min-width: 0;
787
+ overflow: hidden;
788
+ text-overflow: ellipsis;
789
+ white-space: nowrap;
790
+ }
791
+
792
+ /* ── Resource Bars ────────────────────────────── */
793
+ .resources-panel {
794
+ background: var(--card-bg);
795
+ border: 1px solid var(--card-border);
796
+ border-radius: var(--card-radius);
797
+ padding: 1.25rem;
798
+ transition: border-color var(--transition-base);
799
+ }
800
+
801
+ .resources-panel:hover {
802
+ border-color: var(--card-hover-border);
803
+ }
804
+
805
+ .resource-row {
806
+ display: flex;
807
+ align-items: center;
808
+ gap: 12px;
809
+ margin-bottom: 14px;
810
+ }
811
+
812
+ .resource-row:last-of-type {
813
+ margin-bottom: 16px;
814
+ }
815
+
816
+ .resource-label {
817
+ font-family: var(--font-mono);
818
+ font-size: 0.7rem;
819
+ font-weight: 500;
820
+ color: var(--text-muted);
821
+ letter-spacing: 0.1em;
822
+ min-width: 52px;
823
+ }
824
+
825
+ .resource-bar-track {
826
+ flex: 1;
827
+ height: 8px;
828
+ background: var(--ocean);
829
+ border-radius: 4px;
830
+ overflow: hidden;
831
+ }
832
+
833
+ .resource-bar-fill {
834
+ height: 100%;
835
+ border-radius: 4px;
836
+ background: linear-gradient(90deg, var(--cyan), var(--blue));
837
+ width: 0%;
838
+ transition:
839
+ width 0.6s ease,
840
+ background-color var(--transition-base);
841
+ }
842
+
843
+ .resource-bar-fill.warning {
844
+ background: linear-gradient(90deg, var(--amber), #e5a00d);
845
+ }
846
+ .resource-bar-fill.critical {
847
+ background: linear-gradient(90deg, var(--rose), #d92d4a);
848
+ }
849
+
850
+ .resource-info {
851
+ font-family: var(--font-mono);
852
+ font-size: 0.65rem;
853
+ color: var(--text-muted);
854
+ white-space: nowrap;
855
+ min-width: 100px;
856
+ text-align: right;
857
+ }
858
+
859
+ .resource-constraint {
860
+ text-align: center;
861
+ padding-top: 4px;
862
+ border-top: 1px solid var(--card-border);
863
+ }
864
+
865
+ .constraint-badge {
866
+ display: inline-block;
867
+ font-family: var(--font-mono);
868
+ font-size: 0.65rem;
869
+ font-weight: 700;
870
+ letter-spacing: 0.15em;
871
+ padding: 4px 14px;
872
+ border-radius: 100px;
873
+ }
874
+
875
+ .constraint-badge.nominal {
876
+ background: rgba(74, 222, 128, 0.15);
877
+ color: var(--green);
878
+ }
879
+ .constraint-badge.warning {
880
+ background: rgba(251, 191, 36, 0.15);
881
+ color: var(--amber);
882
+ }
883
+ .constraint-badge.critical {
884
+ background: rgba(244, 63, 94, 0.15);
885
+ color: var(--rose);
886
+ }
887
+
888
+ /* ── Filter Bar ───────────────────────────────── */
889
+ .filter-bar {
890
+ display: flex;
891
+ align-items: center;
892
+ gap: 8px;
893
+ margin-bottom: 20px;
894
+ flex-wrap: wrap;
895
+ }
896
+
897
+ .filter-chip {
898
+ background: var(--card-bg);
899
+ border: 1px solid var(--card-border);
900
+ border-radius: 100px;
901
+ padding: 6px 16px;
902
+ font-family: var(--font-mono);
903
+ font-size: 0.7rem;
904
+ font-weight: 500;
905
+ color: var(--text-muted);
906
+ cursor: pointer;
907
+ transition: all var(--transition-base);
908
+ }
909
+
910
+ .filter-chip:hover {
911
+ color: var(--text-secondary);
912
+ border-color: var(--card-hover-border);
913
+ background: rgba(0, 212, 255, 0.04);
914
+ }
915
+
916
+ .filter-chip.active {
917
+ background: rgba(0, 212, 255, 0.1);
918
+ border-color: var(--cyan);
919
+ color: var(--cyan);
920
+ }
921
+
922
+ .filter-issue-input {
923
+ margin-left: auto;
924
+ }
925
+
926
+ .issue-filter-input {
927
+ background: var(--card-bg);
928
+ border: 1px solid var(--card-border);
929
+ border-radius: 8px;
930
+ padding: 6px 12px;
931
+ font-family: var(--font-mono);
932
+ font-size: 0.75rem;
933
+ color: var(--text-primary);
934
+ width: 140px;
935
+ transition:
936
+ border-color var(--transition-base),
937
+ box-shadow var(--transition-base);
938
+ }
939
+
940
+ .issue-filter-input::placeholder {
941
+ color: var(--text-muted);
942
+ }
943
+
944
+ .issue-filter-input:focus {
945
+ outline: none;
946
+ border-color: var(--cyan);
947
+ box-shadow: 0 0 12px var(--cyan-glow);
948
+ }
949
+
950
+ /* ── Segmented Control ────────────────────────── */
951
+ .segmented-control {
952
+ display: inline-flex;
953
+ background: var(--ocean);
954
+ border: 1px solid var(--card-border);
955
+ border-radius: 8px;
956
+ padding: 2px;
957
+ gap: 2px;
958
+ }
959
+
960
+ .segmented-control button {
961
+ background: none;
962
+ border: none;
963
+ padding: 6px 14px;
964
+ font-family: var(--font-mono);
965
+ font-size: 0.7rem;
966
+ font-weight: 500;
967
+ color: var(--text-muted);
968
+ border-radius: 6px;
969
+ cursor: pointer;
970
+ transition: all var(--transition-fast);
971
+ }
972
+
973
+ .segmented-control button:hover {
974
+ color: var(--text-secondary);
975
+ }
976
+
977
+ .segmented-control button.active {
978
+ background: rgba(0, 212, 255, 0.12);
979
+ color: var(--cyan);
980
+ }
981
+
982
+ /* ── Pipeline Table (Pipelines tab) ───────────── */
983
+ .pipeline-table-wrap {
984
+ overflow-x: auto;
985
+ margin-bottom: 16px;
986
+ }
987
+
988
+ .pipeline-table {
989
+ width: 100%;
990
+ border-collapse: collapse;
991
+ font-size: 0.85rem;
992
+ }
993
+
994
+ .pipeline-table thead th {
995
+ font-family: var(--font-mono);
996
+ font-size: 0.7rem;
997
+ font-weight: 500;
998
+ letter-spacing: 0.15em;
999
+ text-transform: uppercase;
1000
+ color: var(--text-muted);
1001
+ text-align: left;
1002
+ padding: 10px 16px;
1003
+ border-bottom: 1px solid var(--card-border);
1004
+ white-space: nowrap;
1005
+ }
1006
+
1007
+ .pipeline-table tbody tr {
1008
+ cursor: pointer;
1009
+ transition: background var(--transition-fast);
1010
+ }
1011
+
1012
+ .pipeline-table tbody tr:nth-child(even) {
1013
+ background: rgba(10, 22, 40, 0.3);
1014
+ }
1015
+
1016
+ .pipeline-table tbody tr:hover {
1017
+ background: rgba(0, 212, 255, 0.03);
1018
+ }
1019
+
1020
+ .pipeline-table tbody tr.row-selected {
1021
+ background: rgba(0, 212, 255, 0.06);
1022
+ border-left: 2px solid var(--cyan);
1023
+ }
1024
+
1025
+ .pipeline-table td {
1026
+ padding: 12px 16px;
1027
+ border-bottom: 1px solid rgba(0, 212, 255, 0.04);
1028
+ vertical-align: middle;
1029
+ }
1030
+
1031
+ .pipeline-table .col-issue {
1032
+ font-family: var(--font-mono);
1033
+ font-weight: 700;
1034
+ color: var(--cyan);
1035
+ white-space: nowrap;
1036
+ }
1037
+
1038
+ .pipeline-table .col-title {
1039
+ color: var(--text-primary);
1040
+ max-width: 300px;
1041
+ overflow: hidden;
1042
+ text-overflow: ellipsis;
1043
+ white-space: nowrap;
1044
+ }
1045
+
1046
+ .pipeline-table .col-duration {
1047
+ font-family: var(--font-mono);
1048
+ font-size: 0.8rem;
1049
+ color: var(--text-secondary);
1050
+ white-space: nowrap;
1051
+ }
1052
+
1053
+ .pipeline-table .col-stage {
1054
+ font-family: var(--font-mono);
1055
+ font-size: 0.75rem;
1056
+ color: var(--text-secondary);
1057
+ white-space: nowrap;
1058
+ }
1059
+
1060
+ .pipeline-table .col-branch {
1061
+ font-family: var(--font-mono);
1062
+ font-size: 0.75rem;
1063
+ color: var(--text-muted);
1064
+ max-width: 160px;
1065
+ overflow: hidden;
1066
+ text-overflow: ellipsis;
1067
+ white-space: nowrap;
1068
+ }
1069
+
1070
+ /* ── Status Badges ────────────────────────────── */
1071
+ .status-badge {
1072
+ display: inline-block;
1073
+ padding: 3px 12px;
1074
+ border-radius: 100px;
1075
+ font-family: var(--font-mono);
1076
+ font-size: 0.65rem;
1077
+ font-weight: 600;
1078
+ letter-spacing: 0.05em;
1079
+ white-space: nowrap;
1080
+ }
1081
+
1082
+ .status-badge.active {
1083
+ background: rgba(0, 212, 255, 0.15);
1084
+ color: var(--cyan);
1085
+ }
1086
+ .status-badge.completed {
1087
+ background: rgba(74, 222, 128, 0.15);
1088
+ color: var(--green);
1089
+ }
1090
+ .status-badge.failed {
1091
+ background: rgba(244, 63, 94, 0.15);
1092
+ color: var(--rose);
1093
+ }
1094
+ .status-badge.queued {
1095
+ background: rgba(251, 191, 36, 0.15);
1096
+ color: var(--amber);
1097
+ }
1098
+
1099
+ /* ── Pipeline Detail Panel ────────────────────── */
1100
+ .pipeline-detail-panel {
1101
+ display: none;
1102
+ background: var(--card-bg);
1103
+ border: 1px solid var(--card-border);
1104
+ border-radius: var(--card-radius);
1105
+ margin-top: 16px;
1106
+ animation: card-enter 0.3s ease-out both;
1107
+ overflow: hidden;
1108
+ }
1109
+
1110
+ .pipeline-detail-panel.open {
1111
+ display: block;
1112
+ }
1113
+
1114
+ .detail-panel-header {
1115
+ display: flex;
1116
+ align-items: center;
1117
+ justify-content: space-between;
1118
+ padding: 16px 20px;
1119
+ border-bottom: 1px solid var(--card-border);
1120
+ }
1121
+
1122
+ .detail-panel-title {
1123
+ font-family: var(--font-body);
1124
+ font-size: 1rem;
1125
+ font-weight: 600;
1126
+ color: var(--text-primary);
1127
+ }
1128
+
1129
+ .detail-panel-close {
1130
+ background: none;
1131
+ border: none;
1132
+ font-size: 1.5rem;
1133
+ color: var(--text-muted);
1134
+ cursor: pointer;
1135
+ padding: 0 4px;
1136
+ line-height: 1;
1137
+ transition: color var(--transition-base);
1138
+ }
1139
+
1140
+ .detail-panel-close:hover {
1141
+ color: var(--text-primary);
1142
+ }
1143
+
1144
+ .detail-panel-body {
1145
+ padding: 20px;
1146
+ }
1147
+
1148
+ /* Stage timeline (vertical) */
1149
+ .stage-timeline {
1150
+ position: relative;
1151
+ padding-left: 28px;
1152
+ margin-bottom: 20px;
1153
+ }
1154
+
1155
+ .stage-timeline::before {
1156
+ content: "";
1157
+ position: absolute;
1158
+ left: 8px;
1159
+ top: 4px;
1160
+ bottom: 4px;
1161
+ width: 2px;
1162
+ background: var(--ocean);
1163
+ }
1164
+
1165
+ .stage-timeline-item {
1166
+ position: relative;
1167
+ padding: 6px 0 6px 12px;
1168
+ display: flex;
1169
+ align-items: center;
1170
+ gap: 12px;
1171
+ }
1172
+
1173
+ .stage-timeline-dot {
1174
+ position: absolute;
1175
+ left: -24px;
1176
+ width: 10px;
1177
+ height: 10px;
1178
+ border-radius: 50%;
1179
+ background: var(--ocean);
1180
+ border: 2px solid var(--foam);
1181
+ z-index: 1;
1182
+ transition: all var(--transition-base);
1183
+ }
1184
+
1185
+ .stage-timeline-dot.done {
1186
+ background: var(--green);
1187
+ border-color: var(--green);
1188
+ }
1189
+ .stage-timeline-dot.active {
1190
+ background: var(--cyan);
1191
+ border-color: var(--cyan);
1192
+ box-shadow: 0 0 8px var(--cyan-glow);
1193
+ }
1194
+ .stage-timeline-dot.failed {
1195
+ background: var(--rose);
1196
+ border-color: var(--rose);
1197
+ }
1198
+
1199
+ .stage-timeline-name {
1200
+ font-family: var(--font-mono);
1201
+ font-size: 0.75rem;
1202
+ font-weight: 500;
1203
+ color: var(--text-secondary);
1204
+ min-width: 100px;
1205
+ }
1206
+
1207
+ .stage-timeline-duration {
1208
+ font-family: var(--font-mono);
1209
+ font-size: 0.7rem;
1210
+ color: var(--text-muted);
1211
+ }
1212
+
1213
+ /* Detail sections */
1214
+ .detail-section {
1215
+ margin-top: 16px;
1216
+ padding-top: 16px;
1217
+ border-top: 1px solid var(--card-border);
1218
+ }
1219
+
1220
+ .detail-section-label {
1221
+ font-family: var(--font-mono);
1222
+ font-size: 0.65rem;
1223
+ font-weight: 500;
1224
+ letter-spacing: 0.2em;
1225
+ text-transform: uppercase;
1226
+ color: var(--text-muted);
1227
+ margin-bottom: 8px;
1228
+ }
1229
+
1230
+ .detail-plan-content {
1231
+ font-family: var(--font-mono);
1232
+ font-size: 0.8rem;
1233
+ line-height: 1.6;
1234
+ color: var(--text-secondary);
1235
+ white-space: pre-wrap;
1236
+ max-height: 300px;
1237
+ overflow-y: auto;
1238
+ padding: 12px;
1239
+ background: var(--ocean);
1240
+ border-radius: 8px;
1241
+ }
1242
+
1243
+ .detail-plan-content::-webkit-scrollbar {
1244
+ width: 6px;
1245
+ }
1246
+ .detail-plan-content::-webkit-scrollbar-track {
1247
+ background: transparent;
1248
+ }
1249
+ .detail-plan-content::-webkit-scrollbar-thumb {
1250
+ background: var(--cyan-dim);
1251
+ border-radius: 3px;
1252
+ }
1253
+
1254
+ .detail-meta-row {
1255
+ display: flex;
1256
+ gap: 16px;
1257
+ flex-wrap: wrap;
1258
+ font-family: var(--font-mono);
1259
+ font-size: 0.75rem;
1260
+ }
1261
+
1262
+ .detail-meta-item {
1263
+ color: var(--text-muted);
1264
+ }
1265
+
1266
+ .detail-meta-item span {
1267
+ color: var(--text-secondary);
1268
+ }
1269
+
1270
+ .detail-meta-item a {
1271
+ color: var(--cyan);
1272
+ text-decoration: none;
1273
+ transition: color var(--transition-fast);
1274
+ }
1275
+
1276
+ .detail-meta-item a:hover {
1277
+ text-decoration: underline;
1278
+ }
1279
+
1280
+ /* ── Activity Timeline (Activity tab) ─────────── */
1281
+ .activity-timeline {
1282
+ max-height: calc(100vh - 260px);
1283
+ overflow-y: auto;
1284
+ scrollbar-color: var(--cyan-dim) var(--deep);
1285
+ }
1286
+
1287
+ .activity-timeline::-webkit-scrollbar {
1288
+ width: 6px;
1289
+ }
1290
+ .activity-timeline::-webkit-scrollbar-track {
1291
+ background: transparent;
1292
+ }
1293
+ .activity-timeline::-webkit-scrollbar-thumb {
1294
+ background: var(--cyan-dim);
1295
+ border-radius: 3px;
1296
+ }
1297
+
1298
+ .timeline-row {
1299
+ display: flex;
1300
+ align-items: center;
1301
+ gap: 12px;
1302
+ padding: 8px 12px;
1303
+ border-radius: 8px;
1304
+ border-left: 2px solid transparent;
1305
+ transition:
1306
+ background var(--transition-fast),
1307
+ border-color var(--transition-fast);
1308
+ animation: card-enter 0.3s ease-out both;
1309
+ }
1310
+
1311
+ .timeline-row:hover {
1312
+ background: rgba(0, 212, 255, 0.03);
1313
+ border-left-color: var(--cyan-glow);
1314
+ }
1315
+
1316
+ .timeline-ts {
1317
+ font-family: var(--font-mono);
1318
+ font-size: 0.7rem;
1319
+ color: var(--text-muted);
1320
+ white-space: nowrap;
1321
+ min-width: 70px;
1322
+ }
1323
+
1324
+ .timeline-issue {
1325
+ font-family: var(--font-mono);
1326
+ font-size: 0.75rem;
1327
+ font-weight: 700;
1328
+ color: var(--cyan);
1329
+ min-width: 40px;
1330
+ }
1331
+
1332
+ .timeline-detail {
1333
+ font-size: 0.8rem;
1334
+ color: var(--text-secondary);
1335
+ flex: 1;
1336
+ min-width: 0;
1337
+ overflow: hidden;
1338
+ text-overflow: ellipsis;
1339
+ white-space: nowrap;
1340
+ }
1341
+
1342
+ .timeline-duration {
1343
+ font-family: var(--font-mono);
1344
+ font-size: 0.7rem;
1345
+ color: var(--text-muted);
1346
+ white-space: nowrap;
1347
+ }
1348
+
1349
+ /* Load more */
1350
+ .load-more-wrap {
1351
+ text-align: center;
1352
+ padding: 16px 0;
1353
+ }
1354
+
1355
+ .load-more-btn {
1356
+ background: var(--card-bg);
1357
+ border: 1px solid var(--card-border);
1358
+ border-radius: 8px;
1359
+ padding: 8px 24px;
1360
+ font-family: var(--font-mono);
1361
+ font-size: 0.75rem;
1362
+ color: var(--text-secondary);
1363
+ cursor: pointer;
1364
+ transition: all var(--transition-base);
1365
+ }
1366
+
1367
+ .load-more-btn:hover {
1368
+ border-color: var(--card-hover-border);
1369
+ color: var(--text-primary);
1370
+ box-shadow: 0 4px 16px rgba(0, 212, 255, 0.08);
1371
+ }
1372
+
1373
+ .load-more-btn:disabled {
1374
+ opacity: 0.5;
1375
+ cursor: not-allowed;
1376
+ }
1377
+
1378
+ /* ── Metrics (Metrics tab) ────────────────────── */
1379
+ .metrics-grid {
1380
+ display: flex;
1381
+ flex-direction: column;
1382
+ gap: 20px;
1383
+ }
1384
+
1385
+ .metrics-top-row {
1386
+ display: grid;
1387
+ grid-template-columns: repeat(4, 1fr);
1388
+ gap: 16px;
1389
+ }
1390
+
1391
+ .metric-card {
1392
+ background: var(--card-bg);
1393
+ border: 1px solid var(--card-border);
1394
+ border-radius: var(--card-radius);
1395
+ padding: 1.5rem;
1396
+ animation: card-enter 0.4s ease-out both;
1397
+ transition:
1398
+ border-color var(--transition-base),
1399
+ box-shadow var(--transition-base);
1400
+ }
1401
+
1402
+ .metric-card:hover {
1403
+ border-color: var(--card-hover-border);
1404
+ box-shadow: 0 4px 24px rgba(0, 212, 255, 0.06);
1405
+ }
1406
+
1407
+ .metric-card-lg {
1408
+ text-align: center;
1409
+ }
1410
+
1411
+ .metric-card-wide {
1412
+ width: 100%;
1413
+ }
1414
+
1415
+ .metric-label {
1416
+ display: block;
1417
+ font-family: var(--font-mono);
1418
+ font-size: 0.7rem;
1419
+ font-weight: 500;
1420
+ letter-spacing: 0.2em;
1421
+ text-transform: uppercase;
1422
+ color: var(--text-muted);
1423
+ margin-bottom: 12px;
1424
+ }
1425
+
1426
+ .metric-big-value {
1427
+ font-family: var(--font-display);
1428
+ font-size: 2rem;
1429
+ font-weight: 400;
1430
+ line-height: 1.2;
1431
+ color: var(--text-primary);
1432
+ }
1433
+
1434
+ .metric-sub {
1435
+ display: block;
1436
+ font-family: var(--font-mono);
1437
+ font-size: 0.65rem;
1438
+ color: var(--text-muted);
1439
+ margin-top: 4px;
1440
+ }
1441
+
1442
+ /* Donut chart (CSS fallback) */
1443
+ .donut-wrap {
1444
+ display: flex;
1445
+ align-items: center;
1446
+ justify-content: center;
1447
+ padding: 8px 0;
1448
+ }
1449
+
1450
+ .donut {
1451
+ width: 120px;
1452
+ height: 120px;
1453
+ border-radius: 50%;
1454
+ background: conic-gradient(
1455
+ var(--green) 0% var(--pct),
1456
+ var(--ocean) var(--pct) 100%
1457
+ );
1458
+ display: flex;
1459
+ align-items: center;
1460
+ justify-content: center;
1461
+ position: relative;
1462
+ transition: background 0.6s;
1463
+ }
1464
+
1465
+ .donut::after {
1466
+ content: "";
1467
+ width: 80px;
1468
+ height: 80px;
1469
+ border-radius: 50%;
1470
+ background: var(--card-bg);
1471
+ position: absolute;
1472
+ }
1473
+
1474
+ .donut-value {
1475
+ position: relative;
1476
+ z-index: 1;
1477
+ font-family: var(--font-display);
1478
+ font-size: 1.5rem;
1479
+ font-weight: 400;
1480
+ color: var(--text-primary);
1481
+ }
1482
+
1483
+ /* SVG Donut chart */
1484
+ .svg-donut {
1485
+ display: block;
1486
+ margin: 0 auto;
1487
+ }
1488
+
1489
+ .svg-donut circle {
1490
+ transition:
1491
+ stroke-dasharray 0.6s ease,
1492
+ stroke 0.3s ease;
1493
+ }
1494
+
1495
+ .svg-donut .donut-track {
1496
+ fill: none;
1497
+ stroke: var(--ocean);
1498
+ }
1499
+
1500
+ .svg-donut .donut-fill {
1501
+ fill: none;
1502
+ stroke-linecap: round;
1503
+ transform-origin: center;
1504
+ transform: rotate(-90deg);
1505
+ }
1506
+
1507
+ .svg-donut .donut-fill-green {
1508
+ stroke: var(--green);
1509
+ }
1510
+ .svg-donut .donut-fill-cyan {
1511
+ stroke: var(--cyan);
1512
+ }
1513
+ .svg-donut .donut-fill-amber {
1514
+ stroke: var(--amber);
1515
+ }
1516
+ .svg-donut .donut-fill-rose {
1517
+ stroke: var(--rose);
1518
+ }
1519
+
1520
+ .svg-donut text {
1521
+ font-family: var(--font-display);
1522
+ fill: var(--text-primary);
1523
+ text-anchor: middle;
1524
+ dominant-baseline: central;
1525
+ }
1526
+
1527
+ /* SVG Bar chart */
1528
+ .svg-bar-chart {
1529
+ display: block;
1530
+ width: 100%;
1531
+ height: auto;
1532
+ }
1533
+
1534
+ .svg-bar-chart rect {
1535
+ transition:
1536
+ height var(--transition-base),
1537
+ y var(--transition-base);
1538
+ rx: 3;
1539
+ ry: 3;
1540
+ }
1541
+
1542
+ .svg-bar-chart .bar-completed {
1543
+ fill: var(--green);
1544
+ }
1545
+ .svg-bar-chart .bar-failed {
1546
+ fill: var(--rose);
1547
+ }
1548
+ .svg-bar-chart .bar-active {
1549
+ fill: var(--cyan);
1550
+ }
1551
+
1552
+ .svg-bar-chart text {
1553
+ font-family: var(--font-mono);
1554
+ font-size: 10px;
1555
+ fill: var(--text-muted);
1556
+ text-anchor: middle;
1557
+ }
1558
+
1559
+ .svg-bar-chart line.grid-line {
1560
+ stroke: rgba(0, 212, 255, 0.06);
1561
+ stroke-dasharray: 4 4;
1562
+ }
1563
+
1564
+ /* Stage breakdown bars */
1565
+ .stage-breakdown {
1566
+ display: flex;
1567
+ flex-direction: column;
1568
+ gap: 10px;
1569
+ }
1570
+
1571
+ .stage-bar-row {
1572
+ display: flex;
1573
+ align-items: center;
1574
+ gap: 12px;
1575
+ }
1576
+
1577
+ .stage-bar-label {
1578
+ font-family: var(--font-mono);
1579
+ font-size: 0.7rem;
1580
+ color: var(--text-muted);
1581
+ min-width: 80px;
1582
+ text-align: right;
1583
+ }
1584
+
1585
+ .stage-bar-track-h {
1586
+ flex: 1;
1587
+ height: 12px;
1588
+ background: var(--ocean);
1589
+ border-radius: 6px;
1590
+ overflow: hidden;
1591
+ }
1592
+
1593
+ .stage-bar-fill-h {
1594
+ height: 100%;
1595
+ border-radius: 6px;
1596
+ transition: width 0.6s ease;
1597
+ min-width: 2px;
1598
+ }
1599
+
1600
+ .stage-bar-fill-h.c-cyan {
1601
+ background: linear-gradient(90deg, var(--cyan), rgba(0, 212, 255, 0.7));
1602
+ }
1603
+ .stage-bar-fill-h.c-blue {
1604
+ background: linear-gradient(90deg, var(--blue), rgba(0, 102, 255, 0.7));
1605
+ }
1606
+ .stage-bar-fill-h.c-purple {
1607
+ background: linear-gradient(90deg, var(--purple), rgba(124, 58, 237, 0.7));
1608
+ }
1609
+ .stage-bar-fill-h.c-green {
1610
+ background: linear-gradient(90deg, var(--green), rgba(74, 222, 128, 0.7));
1611
+ }
1612
+ .stage-bar-fill-h.c-amber {
1613
+ background: linear-gradient(90deg, var(--amber), rgba(251, 191, 36, 0.7));
1614
+ }
1615
+
1616
+ .stage-bar-value {
1617
+ font-family: var(--font-mono);
1618
+ font-size: 0.7rem;
1619
+ color: var(--text-secondary);
1620
+ min-width: 50px;
1621
+ }
1622
+
1623
+ /* Daily bar chart */
1624
+ .daily-chart-wrap {
1625
+ min-height: 120px;
1626
+ }
1627
+
1628
+ .bar-chart {
1629
+ display: flex;
1630
+ align-items: flex-end;
1631
+ gap: 4px;
1632
+ height: 100px;
1633
+ padding-top: 8px;
1634
+ }
1635
+
1636
+ .bar-group {
1637
+ flex: 1;
1638
+ display: flex;
1639
+ flex-direction: column;
1640
+ align-items: center;
1641
+ gap: 4px;
1642
+ min-width: 0;
1643
+ }
1644
+
1645
+ .bar-stack {
1646
+ display: flex;
1647
+ flex-direction: column-reverse;
1648
+ width: 100%;
1649
+ max-width: 32px;
1650
+ }
1651
+
1652
+ .bar-seg {
1653
+ width: 100%;
1654
+ border-radius: 3px 3px 0 0;
1655
+ transition: height 0.4s ease;
1656
+ min-height: 0;
1657
+ }
1658
+
1659
+ .bar-seg.completed {
1660
+ background: linear-gradient(180deg, var(--green), rgba(74, 222, 128, 0.7));
1661
+ }
1662
+ .bar-seg.failed {
1663
+ background: linear-gradient(180deg, var(--rose), rgba(244, 63, 94, 0.7));
1664
+ }
1665
+
1666
+ .bar-seg:first-child {
1667
+ border-radius: 3px 3px 0 0;
1668
+ }
1669
+
1670
+ .bar-date {
1671
+ font-family: var(--font-mono);
1672
+ font-size: 0.55rem;
1673
+ color: var(--text-muted);
1674
+ white-space: nowrap;
1675
+ overflow: hidden;
1676
+ text-overflow: ellipsis;
1677
+ max-width: 100%;
1678
+ text-align: center;
1679
+ }
1680
+
1681
+ /* ── Footer ───────────────────────────────────── */
1682
+ .footer {
1683
+ display: flex;
1684
+ justify-content: center;
1685
+ gap: 24px;
1686
+ padding: 24px;
1687
+ font-family: var(--font-mono);
1688
+ font-size: 0.65rem;
1689
+ color: var(--text-muted);
1690
+ letter-spacing: 0.05em;
1691
+ }
1692
+
1693
+ /* ── Cost Ticker ──────────────────────────────── */
1694
+ .cost-ticker {
1695
+ display: inline-flex;
1696
+ align-items: center;
1697
+ gap: 6px;
1698
+ margin-left: 16px;
1699
+ font-family: var(--font-mono);
1700
+ font-size: 0.7rem;
1701
+ color: var(--text-secondary);
1702
+ }
1703
+
1704
+ .cost-ticker:empty {
1705
+ display: none;
1706
+ }
1707
+
1708
+ .cost-amount {
1709
+ color: var(--text-primary);
1710
+ font-weight: 600;
1711
+ }
1712
+ .cost-budget {
1713
+ color: var(--text-muted);
1714
+ }
1715
+
1716
+ .cost-bar-track {
1717
+ width: 60px;
1718
+ height: 4px;
1719
+ background: var(--ocean);
1720
+ border-radius: 2px;
1721
+ overflow: hidden;
1722
+ }
1723
+
1724
+ .cost-bar-fill {
1725
+ height: 100%;
1726
+ border-radius: 2px;
1727
+ transition: width 0.6s ease;
1728
+ }
1729
+
1730
+ .cost-bar-fill.cost-ok {
1731
+ background: var(--green);
1732
+ }
1733
+ .cost-bar-fill.cost-warn {
1734
+ background: var(--amber);
1735
+ }
1736
+ .cost-bar-fill.cost-over {
1737
+ background: var(--rose);
1738
+ }
1739
+
1740
+ /* ── Agent Cards (Agents tab) ────────────────── */
1741
+ .agents-grid {
1742
+ display: grid;
1743
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
1744
+ gap: 16px;
1745
+ }
1746
+
1747
+ .agent-card {
1748
+ background: var(--card-bg);
1749
+ border: 1px solid var(--card-border);
1750
+ border-radius: var(--card-radius);
1751
+ padding: 1.25rem 1.5rem;
1752
+ transition:
1753
+ border-color var(--transition-base),
1754
+ transform var(--transition-base),
1755
+ box-shadow var(--transition-base);
1756
+ animation: card-enter 0.4s ease-out both;
1757
+ cursor: pointer;
1758
+ }
1759
+
1760
+ .agent-card:hover {
1761
+ border-color: var(--card-hover-border);
1762
+ transform: translateY(-2px);
1763
+ box-shadow: 0 8px 32px rgba(0, 212, 255, 0.06);
1764
+ }
1765
+
1766
+ .agent-card-header {
1767
+ display: flex;
1768
+ align-items: center;
1769
+ gap: 10px;
1770
+ margin-bottom: 10px;
1771
+ }
1772
+
1773
+ .presence-dot {
1774
+ width: 10px;
1775
+ height: 10px;
1776
+ border-radius: 50%;
1777
+ flex-shrink: 0;
1778
+ transition:
1779
+ background var(--transition-base),
1780
+ box-shadow var(--transition-base);
1781
+ }
1782
+
1783
+ .presence-dot.active {
1784
+ background: var(--green);
1785
+ box-shadow: 0 0 8px var(--green);
1786
+ animation: pulse-dot 2s ease-in-out infinite;
1787
+ }
1788
+
1789
+ .presence-dot.idle {
1790
+ background: var(--amber);
1791
+ box-shadow: 0 0 6px var(--amber);
1792
+ }
1793
+
1794
+ .presence-dot.stale {
1795
+ background: var(--rose);
1796
+ box-shadow: 0 0 6px var(--rose);
1797
+ }
1798
+
1799
+ .presence-dot.dead {
1800
+ background: var(--text-muted);
1801
+ }
1802
+
1803
+ .presence-dot.online {
1804
+ background: var(--green);
1805
+ box-shadow: 0 0 8px var(--green);
1806
+ animation: pulse-dot 2s ease-in-out infinite;
1807
+ }
1808
+
1809
+ .presence-dot.degraded {
1810
+ background: var(--amber);
1811
+ box-shadow: 0 0 6px var(--amber);
1812
+ }
1813
+
1814
+ .presence-dot.offline {
1815
+ background: var(--text-muted);
1816
+ }
1817
+
1818
+ .agent-issue {
1819
+ font-family: var(--font-mono);
1820
+ font-size: 0.9rem;
1821
+ font-weight: 700;
1822
+ color: var(--cyan);
1823
+ }
1824
+
1825
+ .agent-title {
1826
+ font-size: 0.85rem;
1827
+ color: var(--text-primary);
1828
+ flex: 1;
1829
+ overflow: hidden;
1830
+ text-overflow: ellipsis;
1831
+ white-space: nowrap;
1832
+ }
1833
+
1834
+ .agent-stage {
1835
+ display: flex;
1836
+ align-items: center;
1837
+ gap: 8px;
1838
+ margin-bottom: 4px;
1839
+ }
1840
+
1841
+ .agent-stage-badge {
1842
+ display: inline-block;
1843
+ padding: 2px 10px;
1844
+ border-radius: 100px;
1845
+ font-family: var(--font-mono);
1846
+ font-size: 0.6rem;
1847
+ font-weight: 500;
1848
+ background: rgba(0, 212, 255, 0.15);
1849
+ color: var(--cyan);
1850
+ }
1851
+
1852
+ .agent-activity {
1853
+ font-family: var(--font-mono);
1854
+ font-size: 0.75rem;
1855
+ color: var(--text-secondary);
1856
+ margin: 8px 0;
1857
+ overflow: hidden;
1858
+ text-overflow: ellipsis;
1859
+ white-space: nowrap;
1860
+ }
1861
+
1862
+ .agent-metrics {
1863
+ display: flex;
1864
+ gap: 16px;
1865
+ margin: 8px 0;
1866
+ }
1867
+
1868
+ .agent-metric {
1869
+ display: flex;
1870
+ align-items: center;
1871
+ gap: 4px;
1872
+ font-family: var(--font-mono);
1873
+ font-size: 0.65rem;
1874
+ color: var(--text-muted);
1875
+ }
1876
+
1877
+ .agent-metric-bar {
1878
+ width: 40px;
1879
+ height: 4px;
1880
+ background: var(--ocean);
1881
+ border-radius: 2px;
1882
+ overflow: hidden;
1883
+ }
1884
+
1885
+ .agent-metric-fill {
1886
+ height: 100%;
1887
+ border-radius: 2px;
1888
+ background: linear-gradient(90deg, var(--cyan), var(--blue));
1889
+ transition: width 0.6s ease;
1890
+ }
1891
+
1892
+ .agent-elapsed {
1893
+ font-family: var(--font-mono);
1894
+ font-size: 0.7rem;
1895
+ color: var(--text-muted);
1896
+ }
1897
+
1898
+ .agent-actions {
1899
+ display: flex;
1900
+ gap: 6px;
1901
+ margin-top: 10px;
1902
+ padding-top: 10px;
1903
+ border-top: 1px solid var(--card-border);
1904
+ }
1905
+
1906
+ .agent-action-btn {
1907
+ background: var(--ocean);
1908
+ border: 1px solid var(--card-border);
1909
+ border-radius: 6px;
1910
+ padding: 4px 10px;
1911
+ font-family: var(--font-mono);
1912
+ font-size: 0.6rem;
1913
+ font-weight: 500;
1914
+ color: var(--text-secondary);
1915
+ cursor: pointer;
1916
+ transition: all var(--transition-fast);
1917
+ }
1918
+
1919
+ .agent-action-btn:hover {
1920
+ border-color: var(--card-hover-border);
1921
+ color: var(--text-primary);
1922
+ }
1923
+
1924
+ .agent-action-btn.btn-abort {
1925
+ border-color: rgba(244, 63, 94, 0.3);
1926
+ color: var(--rose);
1927
+ }
1928
+
1929
+ .agent-action-btn.btn-abort:hover {
1930
+ background: rgba(244, 63, 94, 0.1);
1931
+ }
1932
+
1933
+ /* ── Gantt Timeline (Timeline tab) ───────────── */
1934
+ .timeline-controls {
1935
+ margin-bottom: 16px;
1936
+ }
1937
+
1938
+ .timeline-range-select {
1939
+ background: var(--card-bg);
1940
+ border: 1px solid var(--card-border);
1941
+ border-radius: 8px;
1942
+ padding: 6px 12px;
1943
+ font-family: var(--font-mono);
1944
+ font-size: 0.75rem;
1945
+ color: var(--text-primary);
1946
+ cursor: pointer;
1947
+ transition: border-color var(--transition-base);
1948
+ }
1949
+
1950
+ .timeline-range-select:focus {
1951
+ outline: none;
1952
+ border-color: var(--cyan);
1953
+ }
1954
+
1955
+ .gantt-chart {
1956
+ display: flex;
1957
+ flex-direction: column;
1958
+ gap: 4px;
1959
+ }
1960
+
1961
+ .gantt-header {
1962
+ display: flex;
1963
+ padding-left: 100px;
1964
+ margin-bottom: 8px;
1965
+ position: relative;
1966
+ height: 24px;
1967
+ }
1968
+
1969
+ .gantt-label-header {
1970
+ width: 100px;
1971
+ flex-shrink: 0;
1972
+ font-family: var(--font-mono);
1973
+ font-size: 0.65rem;
1974
+ font-weight: 600;
1975
+ color: var(--text-muted);
1976
+ padding-right: 12px;
1977
+ text-align: right;
1978
+ }
1979
+
1980
+ .gantt-bar-header {
1981
+ flex: 1;
1982
+ position: relative;
1983
+ height: 24px;
1984
+ }
1985
+
1986
+ .gantt-marker {
1987
+ position: absolute;
1988
+ font-family: var(--font-mono);
1989
+ font-size: 0.6rem;
1990
+ color: var(--text-muted);
1991
+ transform: translateX(-50%);
1992
+ }
1993
+
1994
+ .gantt-hour-mark {
1995
+ position: absolute;
1996
+ font-family: var(--font-mono);
1997
+ font-size: 0.6rem;
1998
+ color: var(--text-muted);
1999
+ transform: translateX(-50%);
2000
+ }
2001
+
2002
+ .gantt-row {
2003
+ display: flex;
2004
+ align-items: center;
2005
+ height: 32px;
2006
+ border-radius: 6px;
2007
+ transition: background var(--transition-fast);
2008
+ }
2009
+
2010
+ .gantt-row:hover {
2011
+ background: rgba(0, 212, 255, 0.03);
2012
+ }
2013
+
2014
+ .gantt-label {
2015
+ width: 100px;
2016
+ flex-shrink: 0;
2017
+ font-family: var(--font-mono);
2018
+ font-size: 0.7rem;
2019
+ font-weight: 700;
2020
+ color: var(--cyan);
2021
+ padding-right: 12px;
2022
+ text-align: right;
2023
+ overflow: hidden;
2024
+ text-overflow: ellipsis;
2025
+ white-space: nowrap;
2026
+ }
2027
+
2028
+ .gantt-label-title {
2029
+ display: block;
2030
+ font-weight: 400;
2031
+ font-size: 0.6rem;
2032
+ color: var(--text-muted);
2033
+ overflow: hidden;
2034
+ text-overflow: ellipsis;
2035
+ }
2036
+
2037
+ .gantt-bar-area {
2038
+ flex: 1;
2039
+ position: relative;
2040
+ height: 24px;
2041
+ }
2042
+
2043
+ .gantt-segment {
2044
+ position: absolute;
2045
+ height: 20px;
2046
+ top: 2px;
2047
+ border-radius: 4px;
2048
+ font-family: var(--font-mono);
2049
+ font-size: 0.55rem;
2050
+ color: #fff;
2051
+ display: flex;
2052
+ align-items: center;
2053
+ justify-content: center;
2054
+ overflow: hidden;
2055
+ text-overflow: ellipsis;
2056
+ white-space: nowrap;
2057
+ padding: 0 4px;
2058
+ min-width: 2px;
2059
+ transition: opacity var(--transition-fast);
2060
+ }
2061
+
2062
+ .gantt-segment:hover {
2063
+ opacity: 0.85;
2064
+ }
2065
+
2066
+ .gantt-segment.done {
2067
+ background: linear-gradient(90deg, var(--green), rgba(74, 222, 128, 0.8));
2068
+ }
2069
+ .gantt-segment.running {
2070
+ background: linear-gradient(90deg, var(--cyan), rgba(0, 212, 255, 0.8));
2071
+ animation: stage-glow 2s ease-in-out infinite;
2072
+ }
2073
+ .gantt-segment.failed {
2074
+ background: linear-gradient(90deg, var(--rose), rgba(244, 63, 94, 0.8));
2075
+ }
2076
+
2077
+ /* Timeline bar gradient (generic) */
2078
+ .timeline-bar-gradient {
2079
+ height: 100%;
2080
+ border-radius: 4px;
2081
+ transition: width 0.6s ease;
2082
+ }
2083
+
2084
+ .timeline-bar-gradient.status-done {
2085
+ background: linear-gradient(90deg, var(--green), rgba(74, 222, 128, 0.6));
2086
+ }
2087
+ .timeline-bar-gradient.status-active {
2088
+ background: linear-gradient(90deg, var(--cyan), rgba(0, 212, 255, 0.6));
2089
+ }
2090
+ .timeline-bar-gradient.status-failed {
2091
+ background: linear-gradient(90deg, var(--rose), rgba(244, 63, 94, 0.6));
2092
+ }
2093
+ .timeline-bar-gradient.status-queued {
2094
+ background: linear-gradient(90deg, var(--amber), rgba(251, 191, 36, 0.6));
2095
+ }
2096
+
2097
+ /* ── Machines Grid (Overview) ────────────────── */
2098
+ .machines-grid {
2099
+ display: grid;
2100
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
2101
+ gap: 12px;
2102
+ }
2103
+
2104
+ .machine-card {
2105
+ background: var(--card-bg);
2106
+ border: 1px solid var(--card-border);
2107
+ border-radius: var(--card-radius);
2108
+ padding: 1rem 1.25rem;
2109
+ animation: card-enter 0.4s ease-out both;
2110
+ transition: border-color var(--transition-base);
2111
+ }
2112
+
2113
+ .machine-card:hover {
2114
+ border-color: var(--card-hover-border);
2115
+ }
2116
+
2117
+ .machine-card-header {
2118
+ display: flex;
2119
+ align-items: center;
2120
+ gap: 8px;
2121
+ margin-bottom: 8px;
2122
+ }
2123
+
2124
+ .machine-name {
2125
+ font-family: var(--font-mono);
2126
+ font-size: 0.85rem;
2127
+ font-weight: 700;
2128
+ color: var(--text-primary);
2129
+ }
2130
+
2131
+ .machine-role {
2132
+ display: inline-block;
2133
+ padding: 1px 8px;
2134
+ border-radius: 100px;
2135
+ font-family: var(--font-mono);
2136
+ font-size: 0.55rem;
2137
+ font-weight: 500;
2138
+ background: rgba(124, 58, 237, 0.15);
2139
+ color: var(--purple);
2140
+ }
2141
+
2142
+ .machine-role.primary {
2143
+ background: rgba(0, 212, 255, 0.15);
2144
+ color: var(--cyan);
2145
+ }
2146
+
2147
+ .machine-info {
2148
+ font-family: var(--font-mono);
2149
+ font-size: 0.7rem;
2150
+ color: var(--text-muted);
2151
+ }
2152
+
2153
+ /* ── Intervention Modal ──────────────────────── */
2154
+ .modal-overlay {
2155
+ position: fixed;
2156
+ inset: 0;
2157
+ z-index: 300;
2158
+ background: rgba(6, 10, 20, 0.8);
2159
+ backdrop-filter: blur(8px);
2160
+ -webkit-backdrop-filter: blur(8px);
2161
+ display: flex;
2162
+ align-items: center;
2163
+ justify-content: center;
2164
+ }
2165
+
2166
+ .modal-card {
2167
+ background: var(--deep);
2168
+ border: 1px solid var(--card-border);
2169
+ border-radius: var(--card-radius);
2170
+ width: 420px;
2171
+ max-width: 90vw;
2172
+ animation: card-enter 0.3s ease-out both;
2173
+ box-shadow:
2174
+ 0 0 60px rgba(0, 212, 255, 0.06),
2175
+ 0 20px 60px rgba(0, 0, 0, 0.4);
2176
+ }
2177
+
2178
+ .modal-header {
2179
+ display: flex;
2180
+ align-items: center;
2181
+ justify-content: space-between;
2182
+ padding: 16px 20px;
2183
+ border-bottom: 1px solid var(--card-border);
2184
+ }
2185
+
2186
+ .modal-title {
2187
+ font-family: var(--font-body);
2188
+ font-size: 1rem;
2189
+ font-weight: 600;
2190
+ color: var(--text-primary);
2191
+ }
2192
+
2193
+ .modal-close {
2194
+ background: none;
2195
+ border: none;
2196
+ font-size: 1.5rem;
2197
+ color: var(--text-muted);
2198
+ cursor: pointer;
2199
+ line-height: 1;
2200
+ transition: color var(--transition-base);
2201
+ }
2202
+
2203
+ .modal-close:hover {
2204
+ color: var(--text-primary);
2205
+ }
2206
+
2207
+ .modal-body {
2208
+ padding: 16px 20px;
2209
+ }
2210
+
2211
+ .modal-textarea {
2212
+ width: 100%;
2213
+ background: var(--ocean);
2214
+ border: 1px solid var(--card-border);
2215
+ border-radius: 8px;
2216
+ padding: 10px 12px;
2217
+ font-family: var(--font-mono);
2218
+ font-size: 0.8rem;
2219
+ color: var(--text-primary);
2220
+ resize: vertical;
2221
+ transition:
2222
+ border-color var(--transition-base),
2223
+ box-shadow var(--transition-base);
2224
+ }
2225
+
2226
+ .modal-textarea:focus {
2227
+ outline: none;
2228
+ border-color: var(--cyan);
2229
+ box-shadow: 0 0 12px var(--cyan-glow);
2230
+ }
2231
+
2232
+ .modal-footer {
2233
+ display: flex;
2234
+ justify-content: flex-end;
2235
+ gap: 8px;
2236
+ padding: 12px 20px;
2237
+ border-top: 1px solid var(--card-border);
2238
+ }
2239
+
2240
+ .modal-btn {
2241
+ padding: 6px 16px;
2242
+ border-radius: 8px;
2243
+ font-family: var(--font-mono);
2244
+ font-size: 0.75rem;
2245
+ font-weight: 500;
2246
+ cursor: pointer;
2247
+ transition: all var(--transition-fast);
2248
+ }
2249
+
2250
+ .modal-btn-cancel {
2251
+ background: none;
2252
+ border: 1px solid var(--card-border);
2253
+ color: var(--text-secondary);
2254
+ }
2255
+
2256
+ .modal-btn-cancel:hover {
2257
+ border-color: var(--card-hover-border);
2258
+ color: var(--text-primary);
2259
+ }
2260
+
2261
+ .modal-btn-send {
2262
+ background: linear-gradient(135deg, var(--cyan), var(--blue));
2263
+ border: none;
2264
+ color: var(--abyss);
2265
+ font-weight: 600;
2266
+ }
2267
+
2268
+ .modal-btn-send:hover {
2269
+ transform: translateY(-1px);
2270
+ box-shadow: 0 4px 20px rgba(0, 212, 255, 0.3);
2271
+ }
2272
+
2273
+ /* ── Buttons (matching landing page) ──────────── */
2274
+ .btn-primary {
2275
+ display: inline-flex;
2276
+ align-items: center;
2277
+ gap: 0.5rem;
2278
+ padding: 0.65rem 1.5rem;
2279
+ background: linear-gradient(135deg, var(--cyan), var(--blue));
2280
+ color: var(--abyss);
2281
+ font-weight: 700;
2282
+ font-size: 0.85rem;
2283
+ border-radius: 8px;
2284
+ border: none;
2285
+ cursor: pointer;
2286
+ transition:
2287
+ transform 0.2s,
2288
+ box-shadow var(--transition-base);
2289
+ letter-spacing: 0.02em;
2290
+ }
2291
+
2292
+ .btn-primary:hover {
2293
+ transform: translateY(-2px);
2294
+ box-shadow: 0 8px 30px rgba(0, 212, 255, 0.35);
2295
+ }
2296
+
2297
+ .btn-secondary {
2298
+ display: inline-flex;
2299
+ align-items: center;
2300
+ gap: 0.5rem;
2301
+ padding: 0.65rem 1.5rem;
2302
+ background: rgba(255, 255, 255, 0.04);
2303
+ color: var(--text-primary);
2304
+ font-weight: 600;
2305
+ font-size: 0.85rem;
2306
+ border-radius: 8px;
2307
+ border: 1px solid rgba(255, 255, 255, 0.1);
2308
+ cursor: pointer;
2309
+ transition: all var(--transition-base);
2310
+ }
2311
+
2312
+ .btn-secondary:hover {
2313
+ background: rgba(255, 255, 255, 0.08);
2314
+ border-color: rgba(0, 212, 255, 0.3);
2315
+ color: var(--cyan);
2316
+ }
2317
+
2318
+ /* ── New Activity Badge Types ────────────────── */
2319
+ .activity-badge.intervention {
2320
+ background: rgba(124, 58, 237, 0.15);
2321
+ color: var(--purple);
2322
+ }
2323
+ .activity-badge.heartbeat {
2324
+ background: rgba(251, 191, 36, 0.15);
2325
+ color: var(--amber);
2326
+ }
2327
+ .activity-badge.recovery {
2328
+ background: rgba(74, 222, 128, 0.15);
2329
+ color: var(--green);
2330
+ }
2331
+ .activity-badge.remote {
2332
+ background: rgba(0, 102, 255, 0.15);
2333
+ color: var(--blue);
2334
+ }
2335
+ .activity-badge.checkpoint {
2336
+ background: rgba(124, 58, 237, 0.15);
2337
+ color: var(--purple);
2338
+ }
2339
+
2340
+ /* ── SVG Pipeline Visualization ───────────────── */
2341
+ .pipeline-svg {
2342
+ display: block;
2343
+ margin: 0 auto;
2344
+ max-width: 100%;
2345
+ height: auto;
2346
+ overflow: visible;
2347
+ }
2348
+
2349
+ .stage-node {
2350
+ cursor: pointer;
2351
+ transition: filter var(--transition-base);
2352
+ }
2353
+
2354
+ .stage-node:hover {
2355
+ filter: brightness(1.2);
2356
+ }
2357
+
2358
+ .stage-node rect,
2359
+ .stage-node circle {
2360
+ transition:
2361
+ fill var(--transition-base),
2362
+ stroke var(--transition-base);
2363
+ }
2364
+
2365
+ .stage-active rect,
2366
+ .stage-active circle {
2367
+ fill: var(--cyan);
2368
+ stroke: var(--cyan);
2369
+ animation: stage-node-pulse 2s ease-in-out infinite;
2370
+ }
2371
+
2372
+ .stage-complete rect,
2373
+ .stage-complete circle {
2374
+ fill: var(--green);
2375
+ stroke: var(--green);
2376
+ }
2377
+
2378
+ .stage-pending rect,
2379
+ .stage-pending circle {
2380
+ fill: var(--ocean);
2381
+ stroke: var(--foam);
2382
+ }
2383
+
2384
+ .stage-failed rect,
2385
+ .stage-failed circle {
2386
+ fill: var(--rose);
2387
+ stroke: var(--rose);
2388
+ }
2389
+
2390
+ .stage-connector {
2391
+ stroke: var(--foam);
2392
+ stroke-width: 2;
2393
+ fill: none;
2394
+ transition: stroke var(--transition-base);
2395
+ }
2396
+
2397
+ .stage-connector.done {
2398
+ stroke: var(--green);
2399
+ }
2400
+
2401
+ .stage-connector.active {
2402
+ stroke: var(--cyan);
2403
+ stroke-dasharray: 8 4;
2404
+ animation: dash-flow 1s linear infinite;
2405
+ }
2406
+
2407
+ @keyframes stage-node-pulse {
2408
+ 0%,
2409
+ 100% {
2410
+ filter: drop-shadow(0 0 4px var(--cyan-glow));
2411
+ }
2412
+ 50% {
2413
+ filter: drop-shadow(0 0 12px rgba(0, 212, 255, 0.4));
2414
+ }
2415
+ }
2416
+
2417
+ @keyframes dash-flow {
2418
+ to {
2419
+ stroke-dashoffset: -12;
2420
+ }
2421
+ }
2422
+
2423
+ .stage-node text {
2424
+ font-family: var(--font-mono);
2425
+ font-size: 10px;
2426
+ fill: var(--text-primary);
2427
+ text-anchor: middle;
2428
+ dominant-baseline: central;
2429
+ pointer-events: none;
2430
+ }
2431
+
2432
+ /* ── DORA Grade Badges ────────────────────────── */
2433
+ .dora-badge {
2434
+ display: inline-flex;
2435
+ align-items: center;
2436
+ justify-content: center;
2437
+ width: 48px;
2438
+ height: 48px;
2439
+ border-radius: 12px;
2440
+ font-family: var(--font-display);
2441
+ font-size: 1.25rem;
2442
+ font-weight: 400;
2443
+ letter-spacing: 0.02em;
2444
+ }
2445
+
2446
+ .dora-badge-sm {
2447
+ width: 32px;
2448
+ height: 32px;
2449
+ border-radius: 8px;
2450
+ font-size: 0.85rem;
2451
+ }
2452
+
2453
+ .dora-elite {
2454
+ background: linear-gradient(
2455
+ 135deg,
2456
+ rgba(0, 212, 255, 0.2),
2457
+ rgba(124, 58, 237, 0.2)
2458
+ );
2459
+ border: 1px solid rgba(0, 212, 255, 0.3);
2460
+ color: var(--cyan);
2461
+ box-shadow: 0 0 16px rgba(0, 212, 255, 0.15);
2462
+ }
2463
+
2464
+ .dora-high {
2465
+ background: linear-gradient(
2466
+ 135deg,
2467
+ rgba(74, 222, 128, 0.15),
2468
+ rgba(0, 212, 255, 0.1)
2469
+ );
2470
+ border: 1px solid rgba(74, 222, 128, 0.25);
2471
+ color: var(--green);
2472
+ }
2473
+
2474
+ .dora-medium {
2475
+ background: linear-gradient(
2476
+ 135deg,
2477
+ rgba(251, 191, 36, 0.15),
2478
+ rgba(0, 212, 255, 0.05)
2479
+ );
2480
+ border: 1px solid rgba(251, 191, 36, 0.25);
2481
+ color: var(--amber);
2482
+ }
2483
+
2484
+ .dora-low {
2485
+ background: linear-gradient(
2486
+ 135deg,
2487
+ rgba(244, 63, 94, 0.15),
2488
+ rgba(0, 0, 0, 0.1)
2489
+ );
2490
+ border: 1px solid rgba(244, 63, 94, 0.25);
2491
+ color: var(--rose);
2492
+ }
2493
+
2494
+ /* ── DORA Grades Container ────────────────────── */
2495
+ .dora-grades-row {
2496
+ display: grid;
2497
+ grid-template-columns: repeat(4, 1fr);
2498
+ gap: 16px;
2499
+ margin-top: 12px;
2500
+ }
2501
+
2502
+ .dora-grade-card {
2503
+ display: flex;
2504
+ flex-direction: column;
2505
+ align-items: center;
2506
+ gap: 8px;
2507
+ padding: 16px 12px;
2508
+ background: var(--deep);
2509
+ border: 1px solid var(--border);
2510
+ border-radius: 12px;
2511
+ transition:
2512
+ border-color 0.3s,
2513
+ box-shadow 0.3s;
2514
+ }
2515
+
2516
+ .dora-grade-card:hover {
2517
+ border-color: rgba(0, 212, 255, 0.2);
2518
+ box-shadow: 0 0 12px rgba(0, 212, 255, 0.06);
2519
+ }
2520
+
2521
+ .dora-grade-label {
2522
+ font-family: var(--font-mono);
2523
+ font-size: 0.65rem;
2524
+ font-weight: 600;
2525
+ letter-spacing: 0.08em;
2526
+ text-transform: uppercase;
2527
+ color: var(--text-muted);
2528
+ }
2529
+
2530
+ .dora-grade-value {
2531
+ font-family: var(--font-mono);
2532
+ font-size: 0.75rem;
2533
+ color: var(--text-secondary);
2534
+ }
2535
+
2536
+ /* ── Agent Resource Bars ─────────────────────── */
2537
+ .agent-resources {
2538
+ display: flex;
2539
+ flex-direction: column;
2540
+ gap: 6px;
2541
+ padding: 8px 0;
2542
+ }
2543
+
2544
+ .agent-res-row {
2545
+ display: flex;
2546
+ align-items: center;
2547
+ gap: 8px;
2548
+ }
2549
+
2550
+ .agent-res-label {
2551
+ font-family: var(--font-mono);
2552
+ font-size: 0.6rem;
2553
+ font-weight: 600;
2554
+ letter-spacing: 0.06em;
2555
+ color: var(--text-muted);
2556
+ width: 28px;
2557
+ flex-shrink: 0;
2558
+ }
2559
+
2560
+ .agent-res-val {
2561
+ font-family: var(--font-mono);
2562
+ font-size: 0.65rem;
2563
+ color: var(--text-secondary);
2564
+ width: 40px;
2565
+ text-align: right;
2566
+ flex-shrink: 0;
2567
+ }
2568
+
2569
+ /* ── Agent Metadata ──────────────────────────── */
2570
+ .agent-heartbeat {
2571
+ font-family: var(--font-mono);
2572
+ font-size: 0.65rem;
2573
+ color: var(--text-muted);
2574
+ }
2575
+
2576
+ .agent-machine {
2577
+ font-family: var(--font-mono);
2578
+ font-size: 0.65rem;
2579
+ color: var(--text-muted);
2580
+ opacity: 0.7;
2581
+ }
2582
+
2583
+ /* ── Machine Workers ─────────────────────────── */
2584
+ .machine-workers {
2585
+ font-family: var(--font-mono);
2586
+ font-size: 0.75rem;
2587
+ color: var(--text-secondary);
2588
+ margin-top: 4px;
2589
+ }
2590
+
2591
+ .machine-workers-label {
2592
+ color: var(--text-muted);
2593
+ font-weight: 600;
2594
+ font-size: 0.65rem;
2595
+ letter-spacing: 0.06em;
2596
+ text-transform: uppercase;
2597
+ }
2598
+
2599
+ /* ── KPI Cards ────────────────────────────────── */
2600
+ .kpi-value {
2601
+ font-family: var(--font-display);
2602
+ font-size: 2.5rem;
2603
+ font-weight: 400;
2604
+ line-height: 1;
2605
+ color: var(--text-primary);
2606
+ }
2607
+
2608
+ .kpi-value.gradient-text {
2609
+ background: linear-gradient(135deg, var(--cyan), var(--purple));
2610
+ -webkit-background-clip: text;
2611
+ -webkit-text-fill-color: transparent;
2612
+ background-clip: text;
2613
+ }
2614
+
2615
+ .kpi-trend {
2616
+ display: inline-flex;
2617
+ align-items: center;
2618
+ gap: 4px;
2619
+ font-family: var(--font-mono);
2620
+ font-size: 0.7rem;
2621
+ font-weight: 600;
2622
+ padding: 2px 8px;
2623
+ border-radius: 100px;
2624
+ }
2625
+
2626
+ .kpi-trend.up {
2627
+ background: rgba(74, 222, 128, 0.12);
2628
+ color: var(--green);
2629
+ }
2630
+
2631
+ .kpi-trend.down {
2632
+ background: rgba(244, 63, 94, 0.12);
2633
+ color: var(--rose);
2634
+ }
2635
+
2636
+ .kpi-trend.flat {
2637
+ background: rgba(90, 109, 138, 0.12);
2638
+ color: var(--text-muted);
2639
+ }
2640
+
2641
+ /* ── Animations ───────────────────────────────── */
2642
+ @keyframes card-enter {
2643
+ from {
2644
+ opacity: 0;
2645
+ transform: translateY(10px);
2646
+ }
2647
+ to {
2648
+ opacity: 1;
2649
+ transform: translateY(0);
2650
+ }
2651
+ }
2652
+
2653
+ /* ── Artifact Tabs (Phase 1) ─────────────────── */
2654
+ .artifact-tabs {
2655
+ display: flex;
2656
+ gap: 0;
2657
+ border-bottom: 1px solid var(--card-border);
2658
+ margin-bottom: 16px;
2659
+ overflow-x: auto;
2660
+ }
2661
+
2662
+ .artifact-tab {
2663
+ background: none;
2664
+ border: none;
2665
+ padding: 8px 16px;
2666
+ font-family: var(--font-mono);
2667
+ font-size: 0.7rem;
2668
+ font-weight: 500;
2669
+ color: var(--text-muted);
2670
+ cursor: pointer;
2671
+ white-space: nowrap;
2672
+ border-bottom: 2px solid transparent;
2673
+ transition: all var(--transition-base);
2674
+ }
2675
+
2676
+ .artifact-tab:hover {
2677
+ color: var(--text-secondary);
2678
+ }
2679
+ .artifact-tab.active {
2680
+ color: var(--cyan);
2681
+ border-bottom-color: var(--cyan);
2682
+ }
2683
+
2684
+ .artifact-content {
2685
+ max-height: 400px;
2686
+ overflow-y: auto;
2687
+ scrollbar-color: var(--cyan-dim) var(--deep);
2688
+ }
2689
+
2690
+ .artifact-content::-webkit-scrollbar {
2691
+ width: 6px;
2692
+ }
2693
+ .artifact-content::-webkit-scrollbar-track {
2694
+ background: transparent;
2695
+ }
2696
+ .artifact-content::-webkit-scrollbar-thumb {
2697
+ background: var(--cyan-dim);
2698
+ border-radius: 3px;
2699
+ }
2700
+
2701
+ /* ── Log Viewer (Phase 1) ────────────────────── */
2702
+ .log-viewer {
2703
+ font-family: var(--font-mono);
2704
+ font-size: 0.75rem;
2705
+ line-height: 1.7;
2706
+ color: var(--text-secondary);
2707
+ background: var(--abyss);
2708
+ border: 1px solid var(--card-border);
2709
+ border-radius: 8px;
2710
+ padding: 16px;
2711
+ max-height: 500px;
2712
+ overflow-y: auto;
2713
+ white-space: pre-wrap;
2714
+ word-break: break-all;
2715
+ scrollbar-color: var(--cyan-dim) var(--abyss);
2716
+ }
2717
+
2718
+ .log-viewer::-webkit-scrollbar {
2719
+ width: 6px;
2720
+ }
2721
+ .log-viewer::-webkit-scrollbar-track {
2722
+ background: transparent;
2723
+ }
2724
+ .log-viewer::-webkit-scrollbar-thumb {
2725
+ background: var(--cyan-dim);
2726
+ border-radius: 3px;
2727
+ }
2728
+
2729
+ .log-line-number {
2730
+ display: inline-block;
2731
+ min-width: 40px;
2732
+ color: var(--text-muted);
2733
+ opacity: 0.5;
2734
+ user-select: none;
2735
+ text-align: right;
2736
+ margin-right: 12px;
2737
+ }
2738
+
2739
+ /* ── GitHub Banner (Phase 1) ─────────────────── */
2740
+ .github-banner {
2741
+ display: flex;
2742
+ align-items: center;
2743
+ gap: 12px;
2744
+ padding: 10px 16px;
2745
+ background: rgba(0, 212, 255, 0.04);
2746
+ border: 1px solid var(--card-border);
2747
+ border-radius: 10px;
2748
+ margin-bottom: 16px;
2749
+ flex-wrap: wrap;
2750
+ }
2751
+
2752
+ .github-badge {
2753
+ display: inline-flex;
2754
+ align-items: center;
2755
+ gap: 4px;
2756
+ padding: 2px 10px;
2757
+ border-radius: 100px;
2758
+ font-family: var(--font-mono);
2759
+ font-size: 0.65rem;
2760
+ font-weight: 600;
2761
+ }
2762
+
2763
+ .github-badge.open {
2764
+ background: rgba(74, 222, 128, 0.15);
2765
+ color: var(--green);
2766
+ }
2767
+ .github-badge.closed {
2768
+ background: rgba(124, 58, 237, 0.15);
2769
+ color: var(--purple);
2770
+ }
2771
+ .github-badge.merged {
2772
+ background: rgba(124, 58, 237, 0.15);
2773
+ color: var(--purple);
2774
+ }
2775
+ .github-badge.pending {
2776
+ background: rgba(251, 191, 36, 0.15);
2777
+ color: var(--amber);
2778
+ }
2779
+ .github-badge.success {
2780
+ background: rgba(74, 222, 128, 0.15);
2781
+ color: var(--green);
2782
+ }
2783
+ .github-badge.failure {
2784
+ background: rgba(244, 63, 94, 0.15);
2785
+ color: var(--rose);
2786
+ }
2787
+
2788
+ .github-link {
2789
+ color: var(--cyan);
2790
+ text-decoration: none;
2791
+ font-family: var(--font-mono);
2792
+ font-size: 0.75rem;
2793
+ transition: opacity var(--transition-fast);
2794
+ }
2795
+
2796
+ .github-link:hover {
2797
+ opacity: 0.8;
2798
+ text-decoration: underline;
2799
+ }
2800
+
2801
+ .github-status-banner {
2802
+ margin-bottom: 12px;
2803
+ }
2804
+
2805
+ .github-checks {
2806
+ display: inline-flex;
2807
+ gap: 4px;
2808
+ align-items: center;
2809
+ }
2810
+
2811
+ /* ── Error Highlight (Phase 1) ───────────────── */
2812
+ .error-highlight {
2813
+ border: 1px solid rgba(244, 63, 94, 0.3);
2814
+ background: rgba(244, 63, 94, 0.06);
2815
+ border-radius: 10px;
2816
+ padding: 12px 16px;
2817
+ margin-bottom: 16px;
2818
+ }
2819
+
2820
+ .error-highlight-title {
2821
+ font-family: var(--font-mono);
2822
+ font-size: 0.7rem;
2823
+ font-weight: 600;
2824
+ color: var(--rose);
2825
+ letter-spacing: 0.1em;
2826
+ text-transform: uppercase;
2827
+ margin-bottom: 6px;
2828
+ }
2829
+
2830
+ .error-highlight-content {
2831
+ font-family: var(--font-mono);
2832
+ font-size: 0.8rem;
2833
+ color: var(--text-secondary);
2834
+ white-space: pre-wrap;
2835
+ line-height: 1.5;
2836
+ }
2837
+
2838
+ /* ── Event Detail Expand (Phase 1) ───────────── */
2839
+ .event-detail-expand {
2840
+ display: none;
2841
+ padding: 8px 12px;
2842
+ margin: 4px 0;
2843
+ background: var(--ocean);
2844
+ border-radius: 8px;
2845
+ font-family: var(--font-mono);
2846
+ font-size: 0.7rem;
2847
+ color: var(--text-secondary);
2848
+ line-height: 1.6;
2849
+ white-space: pre-wrap;
2850
+ animation: card-enter 0.2s ease-out both;
2851
+ }
2852
+
2853
+ .event-detail-expand.open {
2854
+ display: block;
2855
+ }
2856
+
2857
+ /* ── Queue Scoring Bars (Phase 2) ────────────── */
2858
+ .queue-detail {
2859
+ padding: 8px 16px 12px;
2860
+ animation: card-enter 0.2s ease-out both;
2861
+ }
2862
+
2863
+ .queue-score-bars {
2864
+ display: flex;
2865
+ flex-direction: column;
2866
+ gap: 6px;
2867
+ margin-top: 8px;
2868
+ }
2869
+
2870
+ .queue-score-row {
2871
+ display: flex;
2872
+ align-items: center;
2873
+ gap: 8px;
2874
+ }
2875
+
2876
+ .queue-score-label {
2877
+ font-family: var(--font-mono);
2878
+ font-size: 0.6rem;
2879
+ color: var(--text-muted);
2880
+ min-width: 70px;
2881
+ text-align: right;
2882
+ }
2883
+
2884
+ .queue-score-bar {
2885
+ flex: 1;
2886
+ height: 6px;
2887
+ background: var(--ocean);
2888
+ border-radius: 3px;
2889
+ overflow: hidden;
2890
+ }
2891
+
2892
+ .queue-score-fill {
2893
+ height: 100%;
2894
+ border-radius: 3px;
2895
+ background: linear-gradient(90deg, var(--cyan), var(--blue));
2896
+ transition: width 0.4s ease;
2897
+ }
2898
+
2899
+ .queue-score-value {
2900
+ font-family: var(--font-mono);
2901
+ font-size: 0.6rem;
2902
+ color: var(--text-secondary);
2903
+ min-width: 24px;
2904
+ text-align: right;
2905
+ }
2906
+
2907
+ /* ── Cost Charts (Phase 2) ───────────────────── */
2908
+ .cost-breakdown {
2909
+ display: grid;
2910
+ grid-template-columns: 1fr 1fr;
2911
+ gap: 16px;
2912
+ margin-top: 12px;
2913
+ }
2914
+
2915
+ .cost-section {
2916
+ background: var(--card-bg);
2917
+ border: 1px solid var(--card-border);
2918
+ border-radius: var(--card-radius);
2919
+ padding: 1.25rem;
2920
+ }
2921
+
2922
+ .cost-bar-row {
2923
+ display: flex;
2924
+ align-items: center;
2925
+ gap: 8px;
2926
+ margin-bottom: 8px;
2927
+ }
2928
+
2929
+ .cost-bar-label {
2930
+ font-family: var(--font-mono);
2931
+ font-size: 0.65rem;
2932
+ color: var(--text-muted);
2933
+ min-width: 60px;
2934
+ text-align: right;
2935
+ }
2936
+
2937
+ .cost-bar-track-h {
2938
+ flex: 1;
2939
+ height: 10px;
2940
+ background: var(--ocean);
2941
+ border-radius: 5px;
2942
+ overflow: hidden;
2943
+ }
2944
+
2945
+ .cost-bar-fill-h {
2946
+ height: 100%;
2947
+ border-radius: 5px;
2948
+ transition: width 0.4s ease;
2949
+ }
2950
+
2951
+ .cost-bar-fill-h.opus {
2952
+ background: linear-gradient(90deg, #7c3aed, rgba(124, 58, 237, 0.7));
2953
+ }
2954
+ .cost-bar-fill-h.sonnet {
2955
+ background: linear-gradient(90deg, #00d4ff, rgba(0, 212, 255, 0.7));
2956
+ }
2957
+ .cost-bar-fill-h.haiku {
2958
+ background: linear-gradient(90deg, #4ade80, rgba(74, 222, 128, 0.7));
2959
+ }
2960
+
2961
+ .cost-bar-amount {
2962
+ font-family: var(--font-mono);
2963
+ font-size: 0.65rem;
2964
+ color: var(--text-secondary);
2965
+ min-width: 50px;
2966
+ text-align: right;
2967
+ }
2968
+
2969
+ /* ── DORA Sparklines (Phase 2) ──────────────── */
2970
+ .dora-sparkline-row {
2971
+ display: grid;
2972
+ grid-template-columns: repeat(4, 1fr);
2973
+ gap: 12px;
2974
+ margin-top: 12px;
2975
+ }
2976
+
2977
+ .dora-sparkline-card {
2978
+ background: var(--deep);
2979
+ border: 1px solid var(--card-border);
2980
+ border-radius: 12px;
2981
+ padding: 12px;
2982
+ text-align: center;
2983
+ }
2984
+
2985
+ .dora-sparkline-label {
2986
+ font-family: var(--font-mono);
2987
+ font-size: 0.6rem;
2988
+ color: var(--text-muted);
2989
+ letter-spacing: 0.08em;
2990
+ text-transform: uppercase;
2991
+ margin-bottom: 8px;
2992
+ }
2993
+
2994
+ .sparkline-svg {
2995
+ display: block;
2996
+ margin: 0 auto;
2997
+ width: 100%;
2998
+ height: 30px;
2999
+ }
3000
+
3001
+ .sparkline-svg polyline {
3002
+ fill: none;
3003
+ stroke-width: 1.5;
3004
+ stroke-linecap: round;
3005
+ stroke-linejoin: round;
3006
+ }
3007
+
3008
+ /* ── Insights Tab (Phase 3) ──────────────────── */
3009
+ .insights-grid {
3010
+ display: flex;
3011
+ flex-direction: column;
3012
+ gap: 24px;
3013
+ }
3014
+
3015
+ .insight-card {
3016
+ background: var(--card-bg);
3017
+ border: 1px solid var(--card-border);
3018
+ border-radius: var(--card-radius);
3019
+ padding: 1.25rem;
3020
+ transition: border-color var(--transition-base);
3021
+ }
3022
+
3023
+ .insight-card:hover {
3024
+ border-color: var(--card-hover-border);
3025
+ }
3026
+
3027
+ .insight-card-header {
3028
+ display: flex;
3029
+ align-items: center;
3030
+ gap: 10px;
3031
+ margin-bottom: 8px;
3032
+ }
3033
+
3034
+ .insight-frequency {
3035
+ font-family: var(--font-mono);
3036
+ font-size: 0.7rem;
3037
+ font-weight: 700;
3038
+ color: var(--rose);
3039
+ background: rgba(244, 63, 94, 0.1);
3040
+ padding: 2px 8px;
3041
+ border-radius: 100px;
3042
+ }
3043
+
3044
+ .insight-pattern {
3045
+ font-family: var(--font-mono);
3046
+ font-size: 0.8rem;
3047
+ color: var(--text-primary);
3048
+ flex: 1;
3049
+ }
3050
+
3051
+ .insight-details {
3052
+ font-family: var(--font-mono);
3053
+ font-size: 0.75rem;
3054
+ color: var(--text-secondary);
3055
+ line-height: 1.6;
3056
+ margin-top: 8px;
3057
+ }
3058
+
3059
+ .insight-fix {
3060
+ display: flex;
3061
+ align-items: flex-start;
3062
+ gap: 6px;
3063
+ margin-top: 8px;
3064
+ padding: 8px 12px;
3065
+ background: rgba(74, 222, 128, 0.06);
3066
+ border: 1px solid rgba(74, 222, 128, 0.15);
3067
+ border-radius: 8px;
3068
+ font-family: var(--font-mono);
3069
+ font-size: 0.75rem;
3070
+ color: var(--green);
3071
+ }
3072
+
3073
+ .insight-fix-label {
3074
+ font-weight: 600;
3075
+ white-space: nowrap;
3076
+ }
3077
+
3078
+ /* ── Failure Heatmap (Phase 3) ──────────────── */
3079
+ .heatmap-grid {
3080
+ display: grid;
3081
+ gap: 2px;
3082
+ margin-top: 8px;
3083
+ }
3084
+
3085
+ .heatmap-cell {
3086
+ border-radius: 3px;
3087
+ min-height: 20px;
3088
+ min-width: 20px;
3089
+ transition: opacity var(--transition-fast);
3090
+ }
3091
+
3092
+ .heatmap-cell:hover {
3093
+ opacity: 0.8;
3094
+ }
3095
+
3096
+ .heatmap-label {
3097
+ font-family: var(--font-mono);
3098
+ font-size: 0.6rem;
3099
+ color: var(--text-muted);
3100
+ text-align: center;
3101
+ padding: 2px;
3102
+ }
3103
+
3104
+ /* ── Patrol Cards (Phase 3) ─────────────────── */
3105
+ .patrol-card {
3106
+ display: flex;
3107
+ align-items: flex-start;
3108
+ gap: 10px;
3109
+ padding: 10px 14px;
3110
+ background: var(--card-bg);
3111
+ border: 1px solid var(--card-border);
3112
+ border-radius: 10px;
3113
+ margin-bottom: 8px;
3114
+ }
3115
+
3116
+ .patrol-severity {
3117
+ font-family: var(--font-mono);
3118
+ font-size: 0.6rem;
3119
+ font-weight: 700;
3120
+ padding: 2px 8px;
3121
+ border-radius: 100px;
3122
+ white-space: nowrap;
3123
+ }
3124
+
3125
+ .patrol-severity.high {
3126
+ background: rgba(244, 63, 94, 0.15);
3127
+ color: var(--rose);
3128
+ }
3129
+ .patrol-severity.medium {
3130
+ background: rgba(251, 191, 36, 0.15);
3131
+ color: var(--amber);
3132
+ }
3133
+ .patrol-severity.low {
3134
+ background: rgba(0, 212, 255, 0.15);
3135
+ color: var(--cyan);
3136
+ }
3137
+
3138
+ .patrol-content {
3139
+ flex: 1;
3140
+ font-size: 0.8rem;
3141
+ color: var(--text-secondary);
3142
+ }
3143
+
3144
+ /* ── Pattern Match Box (Phase 3) ────────────── */
3145
+ .pattern-match-box {
3146
+ border: 1px solid rgba(251, 191, 36, 0.3);
3147
+ background: rgba(251, 191, 36, 0.06);
3148
+ border-radius: 10px;
3149
+ padding: 10px 14px;
3150
+ margin-bottom: 12px;
3151
+ display: flex;
3152
+ align-items: flex-start;
3153
+ gap: 8px;
3154
+ }
3155
+
3156
+ .pattern-match-label {
3157
+ font-family: var(--font-mono);
3158
+ font-size: 0.65rem;
3159
+ font-weight: 700;
3160
+ color: var(--amber);
3161
+ white-space: nowrap;
3162
+ }
3163
+
3164
+ .pattern-match-text {
3165
+ font-family: var(--font-mono);
3166
+ font-size: 0.75rem;
3167
+ color: var(--text-secondary);
3168
+ }
3169
+
3170
+ /* ── Stage Performance Table (Phase 4) ──────── */
3171
+ .stage-perf-table {
3172
+ width: 100%;
3173
+ border-collapse: collapse;
3174
+ font-size: 0.8rem;
3175
+ margin-top: 12px;
3176
+ }
3177
+
3178
+ .stage-perf-table th {
3179
+ font-family: var(--font-mono);
3180
+ font-size: 0.65rem;
3181
+ font-weight: 500;
3182
+ letter-spacing: 0.1em;
3183
+ text-transform: uppercase;
3184
+ color: var(--text-muted);
3185
+ text-align: left;
3186
+ padding: 8px 12px;
3187
+ border-bottom: 1px solid var(--card-border);
3188
+ }
3189
+
3190
+ .stage-perf-table td {
3191
+ padding: 8px 12px;
3192
+ font-family: var(--font-mono);
3193
+ font-size: 0.75rem;
3194
+ color: var(--text-secondary);
3195
+ border-bottom: 1px solid rgba(0, 212, 255, 0.04);
3196
+ }
3197
+
3198
+ .trend-arrow {
3199
+ font-size: 0.7rem;
3200
+ margin-left: 4px;
3201
+ }
3202
+ .trend-arrow.up {
3203
+ color: var(--rose);
3204
+ }
3205
+ .trend-arrow.down {
3206
+ color: var(--green);
3207
+ }
3208
+ .trend-arrow.flat {
3209
+ color: var(--text-muted);
3210
+ }
3211
+
3212
+ /* ── Bottleneck Alert (Phase 4) ─────────────── */
3213
+ .bottleneck-alert {
3214
+ display: flex;
3215
+ align-items: flex-start;
3216
+ gap: 10px;
3217
+ padding: 12px 16px;
3218
+ background: rgba(251, 191, 36, 0.06);
3219
+ border: 1px solid rgba(251, 191, 36, 0.2);
3220
+ border-radius: 10px;
3221
+ margin-bottom: 16px;
3222
+ }
3223
+
3224
+ .bottleneck-icon {
3225
+ font-size: 1.1rem;
3226
+ line-height: 1;
3227
+ }
3228
+
3229
+ .bottleneck-text {
3230
+ font-family: var(--font-mono);
3231
+ font-size: 0.8rem;
3232
+ color: var(--text-secondary);
3233
+ line-height: 1.5;
3234
+ }
3235
+
3236
+ /* ── Capacity Forecast (Phase 4) ────────────── */
3237
+ .capacity-forecast {
3238
+ display: flex;
3239
+ align-items: center;
3240
+ gap: 16px;
3241
+ padding: 12px 16px;
3242
+ background: var(--card-bg);
3243
+ border: 1px solid var(--card-border);
3244
+ border-radius: var(--card-radius);
3245
+ margin-top: 12px;
3246
+ }
3247
+
3248
+ .capacity-value {
3249
+ font-family: var(--font-display);
3250
+ font-size: 1.5rem;
3251
+ color: var(--text-primary);
3252
+ }
3253
+
3254
+ .capacity-label {
3255
+ font-family: var(--font-mono);
3256
+ font-size: 0.7rem;
3257
+ color: var(--text-muted);
3258
+ }
3259
+
3260
+ /* ── Alert Banner (Phase 5) ─────────────────── */
3261
+ .alert-banner {
3262
+ position: fixed;
3263
+ top: 104px; /* header 56px + tab bar 48px */
3264
+ left: 0;
3265
+ right: 0;
3266
+ z-index: 98;
3267
+ padding: 0 24px;
3268
+ animation: card-enter 0.3s ease-out both;
3269
+ }
3270
+
3271
+ .alert-banner-inner {
3272
+ max-width: 1200px;
3273
+ margin: 0 auto;
3274
+ display: flex;
3275
+ align-items: center;
3276
+ gap: 12px;
3277
+ padding: 10px 16px;
3278
+ background: rgba(244, 63, 94, 0.08);
3279
+ border: 1px solid rgba(244, 63, 94, 0.2);
3280
+ border-radius: 10px;
3281
+ }
3282
+
3283
+ .alert-banner-inner.warning {
3284
+ background: rgba(251, 191, 36, 0.08);
3285
+ border-color: rgba(251, 191, 36, 0.2);
3286
+ }
3287
+
3288
+ .alert-icon {
3289
+ font-size: 1rem;
3290
+ flex-shrink: 0;
3291
+ }
3292
+
3293
+ .alert-message {
3294
+ flex: 1;
3295
+ font-family: var(--font-mono);
3296
+ font-size: 0.8rem;
3297
+ color: var(--text-primary);
3298
+ }
3299
+
3300
+ .alert-actions {
3301
+ display: flex;
3302
+ gap: 6px;
3303
+ }
3304
+
3305
+ .alert-action-btn {
3306
+ background: rgba(255, 255, 255, 0.06);
3307
+ border: 1px solid rgba(255, 255, 255, 0.1);
3308
+ border-radius: 6px;
3309
+ padding: 4px 10px;
3310
+ font-family: var(--font-mono);
3311
+ font-size: 0.65rem;
3312
+ font-weight: 600;
3313
+ color: var(--text-primary);
3314
+ cursor: pointer;
3315
+ transition: all var(--transition-fast);
3316
+ }
3317
+
3318
+ .alert-action-btn:hover {
3319
+ background: rgba(255, 255, 255, 0.1);
3320
+ border-color: rgba(0, 212, 255, 0.3);
3321
+ }
3322
+
3323
+ .alert-banner-content {
3324
+ display: flex;
3325
+ align-items: center;
3326
+ gap: 12px;
3327
+ width: 100%;
3328
+ }
3329
+
3330
+ .alert-banner-content.alert-warning {
3331
+ border-left: 3px solid var(--amber);
3332
+ }
3333
+
3334
+ .alert-banner-content.alert-critical {
3335
+ border-left: 3px solid var(--rose);
3336
+ background: rgba(244, 63, 94, 0.06);
3337
+ }
3338
+
3339
+ .alert-banner-content.alert-info {
3340
+ border-left: 3px solid var(--cyan);
3341
+ }
3342
+
3343
+ .alert-dismiss {
3344
+ background: none;
3345
+ border: none;
3346
+ font-size: 1.2rem;
3347
+ color: var(--text-muted);
3348
+ cursor: pointer;
3349
+ padding: 0 4px;
3350
+ transition: color var(--transition-fast);
3351
+ }
3352
+
3353
+ .alert-dismiss:hover {
3354
+ color: var(--text-primary);
3355
+ }
3356
+
3357
+ .main.has-alert {
3358
+ padding-top: 170px;
3359
+ }
3360
+
3361
+ /* ── Bulk Actions (Phase 5) ─────────────────── */
3362
+ .bulk-actions {
3363
+ display: flex;
3364
+ align-items: center;
3365
+ gap: 10px;
3366
+ padding: 8px 16px;
3367
+ background: rgba(0, 212, 255, 0.04);
3368
+ border: 1px solid var(--card-border);
3369
+ border-radius: 8px;
3370
+ margin-bottom: 12px;
3371
+ animation: card-enter 0.2s ease-out both;
3372
+ }
3373
+
3374
+ .bulk-count {
3375
+ font-family: var(--font-mono);
3376
+ font-size: 0.75rem;
3377
+ color: var(--text-secondary);
3378
+ }
3379
+
3380
+ .bulk-btn {
3381
+ background: var(--ocean);
3382
+ border: 1px solid var(--card-border);
3383
+ border-radius: 6px;
3384
+ padding: 4px 12px;
3385
+ font-family: var(--font-mono);
3386
+ font-size: 0.65rem;
3387
+ font-weight: 600;
3388
+ color: var(--text-secondary);
3389
+ cursor: pointer;
3390
+ transition: all var(--transition-fast);
3391
+ }
3392
+
3393
+ .bulk-btn:hover {
3394
+ border-color: var(--card-hover-border);
3395
+ color: var(--text-primary);
3396
+ }
3397
+
3398
+ .bulk-btn-danger {
3399
+ border-color: rgba(244, 63, 94, 0.3);
3400
+ color: var(--rose);
3401
+ }
3402
+
3403
+ .bulk-btn-danger:hover {
3404
+ background: rgba(244, 63, 94, 0.1);
3405
+ }
3406
+
3407
+ .pipeline-checkbox {
3408
+ accent-color: var(--cyan);
3409
+ cursor: pointer;
3410
+ }
3411
+
3412
+ /* ── Emergency Brake (Phase 5) ──────────────── */
3413
+ .emergency-brake-btn {
3414
+ background: none;
3415
+ border: 1px solid rgba(244, 63, 94, 0.3);
3416
+ border-radius: 8px;
3417
+ padding: 4px 8px;
3418
+ color: var(--rose);
3419
+ cursor: pointer;
3420
+ display: flex;
3421
+ align-items: center;
3422
+ justify-content: center;
3423
+ margin-right: 12px;
3424
+ transition: all var(--transition-base);
3425
+ }
3426
+
3427
+ .emergency-brake-btn:hover {
3428
+ background: rgba(244, 63, 94, 0.1);
3429
+ border-color: var(--rose);
3430
+ box-shadow: 0 0 12px rgba(244, 63, 94, 0.2);
3431
+ }
3432
+
3433
+ .modal-btn-danger {
3434
+ background: linear-gradient(135deg, var(--rose), #d92d4a);
3435
+ border: none;
3436
+ color: #fff;
3437
+ font-weight: 600;
3438
+ }
3439
+
3440
+ .modal-btn-danger:hover {
3441
+ transform: translateY(-1px);
3442
+ box-shadow: 0 4px 20px rgba(244, 63, 94, 0.3);
3443
+ }
3444
+
3445
+ .emergency-warning {
3446
+ font-size: 0.9rem;
3447
+ color: var(--text-secondary);
3448
+ line-height: 1.6;
3449
+ }
3450
+
3451
+ .emergency-warning strong {
3452
+ color: var(--rose);
3453
+ }
3454
+
3455
+ /* ── Missing Phase 1-5 Classes ───────────────── */
3456
+
3457
+ .artifact-viewer {
3458
+ margin-top: 12px;
3459
+ }
3460
+
3461
+ .artifact-code {
3462
+ font-family: var(--font-mono);
3463
+ font-size: 0.75rem;
3464
+ background: rgba(0, 0, 0, 0.3);
3465
+ padding: 12px;
3466
+ border-radius: 6px;
3467
+ overflow-x: auto;
3468
+ white-space: pre-wrap;
3469
+ color: var(--text-secondary);
3470
+ }
3471
+
3472
+ .log-line {
3473
+ display: flex;
3474
+ gap: 12px;
3475
+ font-family: var(--font-mono);
3476
+ font-size: 0.72rem;
3477
+ line-height: 1.6;
3478
+ padding: 0 8px;
3479
+ }
3480
+
3481
+ .log-line:hover {
3482
+ background: rgba(0, 212, 255, 0.04);
3483
+ }
3484
+
3485
+ .log-line-error {
3486
+ background: rgba(244, 63, 94, 0.06);
3487
+ color: var(--rose);
3488
+ }
3489
+
3490
+ .log-line-num {
3491
+ color: var(--text-muted);
3492
+ min-width: 36px;
3493
+ text-align: right;
3494
+ user-select: none;
3495
+ opacity: 0.5;
3496
+ }
3497
+
3498
+ .log-line-text {
3499
+ white-space: pre-wrap;
3500
+ word-break: break-all;
3501
+ }
3502
+
3503
+ .cost-bar-value {
3504
+ font-family: var(--font-mono);
3505
+ font-size: 0.7rem;
3506
+ color: var(--text-secondary);
3507
+ min-width: 60px;
3508
+ text-align: right;
3509
+ }
3510
+
3511
+ .cost-section-label {
3512
+ font-family: var(--font-mono);
3513
+ font-size: 0.65rem;
3514
+ font-weight: 600;
3515
+ letter-spacing: 0.08em;
3516
+ color: var(--text-muted);
3517
+ margin-bottom: 10px;
3518
+ text-transform: uppercase;
3519
+ }
3520
+
3521
+ .cost-issue-table {
3522
+ width: 100%;
3523
+ border-collapse: collapse;
3524
+ font-family: var(--font-mono);
3525
+ font-size: 0.75rem;
3526
+ }
3527
+
3528
+ .cost-issue-table th {
3529
+ text-align: left;
3530
+ color: var(--text-muted);
3531
+ font-size: 0.65rem;
3532
+ font-weight: 600;
3533
+ letter-spacing: 0.08em;
3534
+ padding: 6px 8px;
3535
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
3536
+ }
3537
+
3538
+ .cost-issue-table td {
3539
+ padding: 6px 8px;
3540
+ color: var(--text-secondary);
3541
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
3542
+ }
3543
+
3544
+ .budget-util-bar {
3545
+ height: 8px;
3546
+ border-radius: 4px;
3547
+ background: var(--glass-border);
3548
+ overflow: hidden;
3549
+ margin-bottom: 6px;
3550
+ }
3551
+
3552
+ .budget-util-text {
3553
+ font-family: var(--font-mono);
3554
+ font-size: 0.7rem;
3555
+ color: var(--text-muted);
3556
+ text-align: center;
3557
+ }
3558
+
3559
+ .dora-trend-grid {
3560
+ display: grid;
3561
+ grid-template-columns: repeat(4, 1fr);
3562
+ gap: 16px;
3563
+ }
3564
+
3565
+ .dora-trend-card {
3566
+ background: var(--glass-bg);
3567
+ border: 1px solid var(--glass-border);
3568
+ border-radius: 10px;
3569
+ padding: 12px;
3570
+ text-align: center;
3571
+ }
3572
+
3573
+ .dora-trend-label {
3574
+ font-family: var(--font-mono);
3575
+ font-size: 0.65rem;
3576
+ font-weight: 600;
3577
+ letter-spacing: 0.08em;
3578
+ color: var(--text-muted);
3579
+ margin-bottom: 8px;
3580
+ text-transform: uppercase;
3581
+ }
3582
+
3583
+ .dora-trend-empty {
3584
+ color: var(--text-muted);
3585
+ font-size: 0.8rem;
3586
+ text-align: center;
3587
+ padding: 20px;
3588
+ }
3589
+
3590
+ .sparkline {
3591
+ display: block;
3592
+ }
3593
+
3594
+ .svg-line-chart {
3595
+ display: block;
3596
+ width: 100%;
3597
+ }
3598
+
3599
+ .trend-up {
3600
+ color: var(--green);
3601
+ }
3602
+
3603
+ .trend-down {
3604
+ color: var(--rose);
3605
+ }
3606
+
3607
+ .trend-flat {
3608
+ color: var(--text-muted);
3609
+ }
3610
+
3611
+ .insights-section {
3612
+ margin-bottom: 24px;
3613
+ }
3614
+
3615
+ .insights-full-width {
3616
+ grid-column: 1 / -1;
3617
+ }
3618
+
3619
+ .section-header {
3620
+ display: flex;
3621
+ align-items: center;
3622
+ justify-content: space-between;
3623
+ margin-bottom: 12px;
3624
+ }
3625
+
3626
+ .pattern-card {
3627
+ background: var(--glass-bg);
3628
+ border: 1px solid var(--glass-border);
3629
+ border-radius: 10px;
3630
+ padding: 14px 16px;
3631
+ margin-bottom: 10px;
3632
+ }
3633
+
3634
+ .pattern-card-header {
3635
+ display: flex;
3636
+ align-items: center;
3637
+ justify-content: space-between;
3638
+ margin-bottom: 6px;
3639
+ }
3640
+
3641
+ .pattern-label {
3642
+ font-family: var(--font-mono);
3643
+ font-size: 0.7rem;
3644
+ font-weight: 600;
3645
+ color: var(--text-primary);
3646
+ }
3647
+
3648
+ .pattern-freq-badge {
3649
+ font-family: var(--font-mono);
3650
+ font-size: 0.65rem;
3651
+ padding: 2px 8px;
3652
+ border-radius: 999px;
3653
+ background: rgba(251, 191, 36, 0.15);
3654
+ color: var(--amber);
3655
+ }
3656
+
3657
+ .pattern-desc {
3658
+ font-size: 0.78rem;
3659
+ color: var(--text-secondary);
3660
+ margin-bottom: 4px;
3661
+ }
3662
+
3663
+ .pattern-detail {
3664
+ font-size: 0.72rem;
3665
+ color: var(--text-muted);
3666
+ }
3667
+
3668
+ .pattern-fix {
3669
+ font-family: var(--font-mono);
3670
+ font-size: 0.7rem;
3671
+ color: var(--green);
3672
+ margin-top: 6px;
3673
+ }
3674
+
3675
+ .patrol-card-header {
3676
+ display: flex;
3677
+ align-items: center;
3678
+ gap: 8px;
3679
+ margin-bottom: 6px;
3680
+ }
3681
+
3682
+ .patrol-type {
3683
+ font-family: var(--font-mono);
3684
+ font-size: 0.7rem;
3685
+ font-weight: 600;
3686
+ color: var(--text-primary);
3687
+ }
3688
+
3689
+ .patrol-desc {
3690
+ font-size: 0.78rem;
3691
+ color: var(--text-secondary);
3692
+ margin-bottom: 4px;
3693
+ }
3694
+
3695
+ .patrol-file {
3696
+ font-family: var(--font-mono);
3697
+ font-size: 0.68rem;
3698
+ color: var(--text-muted);
3699
+ }
3700
+
3701
+ .decision-list {
3702
+ display: flex;
3703
+ flex-direction: column;
3704
+ gap: 8px;
3705
+ }
3706
+
3707
+ .decision-row {
3708
+ display: flex;
3709
+ align-items: center;
3710
+ gap: 12px;
3711
+ padding: 8px 12px;
3712
+ background: var(--glass-bg);
3713
+ border: 1px solid var(--glass-border);
3714
+ border-radius: 8px;
3715
+ }
3716
+
3717
+ .decision-ts {
3718
+ font-family: var(--font-mono);
3719
+ font-size: 0.65rem;
3720
+ color: var(--text-muted);
3721
+ min-width: 60px;
3722
+ }
3723
+
3724
+ .decision-issue {
3725
+ font-family: var(--font-mono);
3726
+ font-size: 0.7rem;
3727
+ color: var(--cyan);
3728
+ min-width: 40px;
3729
+ }
3730
+
3731
+ .decision-action {
3732
+ font-size: 0.78rem;
3733
+ color: var(--text-secondary);
3734
+ flex: 1;
3735
+ }
3736
+
3737
+ .decision-outcome {
3738
+ font-family: var(--font-mono);
3739
+ font-size: 0.68rem;
3740
+ padding: 2px 8px;
3741
+ border-radius: 999px;
3742
+ }
3743
+
3744
+ .heatmap-corner {
3745
+ background: transparent;
3746
+ }
3747
+
3748
+ .heatmap-stage-label {
3749
+ font-family: var(--font-mono);
3750
+ font-size: 0.6rem;
3751
+ color: var(--text-muted);
3752
+ text-align: center;
3753
+ padding: 4px;
3754
+ }
3755
+
3756
+ .heatmap-day-label {
3757
+ font-family: var(--font-mono);
3758
+ font-size: 0.6rem;
3759
+ color: var(--text-muted);
3760
+ text-align: right;
3761
+ padding: 4px;
3762
+ }
3763
+
3764
+ .stage-perf-table .trend-arrow {
3765
+ margin-left: 6px;
3766
+ }
3767
+
3768
+ .bottleneck-msg {
3769
+ font-size: 0.85rem;
3770
+ color: var(--text-primary);
3771
+ margin-bottom: 4px;
3772
+ }
3773
+
3774
+ .bottleneck-suggestion {
3775
+ font-size: 0.78rem;
3776
+ color: var(--text-muted);
3777
+ }
3778
+
3779
+ .capacity-text {
3780
+ text-align: center;
3781
+ padding: 12px;
3782
+ }
3783
+
3784
+ .queue-detailed-header,
3785
+ .queue-detailed-row {
3786
+ display: flex;
3787
+ align-items: center;
3788
+ gap: 12px;
3789
+ padding: 8px 12px;
3790
+ }
3791
+
3792
+ .queue-detailed-header {
3793
+ font-family: var(--font-mono);
3794
+ font-size: 0.65rem;
3795
+ font-weight: 600;
3796
+ letter-spacing: 0.08em;
3797
+ color: var(--text-muted);
3798
+ border-bottom: 1px solid var(--glass-border);
3799
+ }
3800
+
3801
+ .queue-detailed-row {
3802
+ background: var(--glass-bg);
3803
+ border: 1px solid var(--glass-border);
3804
+ border-radius: 8px;
3805
+ margin-bottom: 6px;
3806
+ cursor: pointer;
3807
+ transition: border-color var(--transition-fast);
3808
+ }
3809
+
3810
+ .queue-detailed-row:hover {
3811
+ border-color: var(--cyan);
3812
+ }
3813
+
3814
+ .queue-detailed-body {
3815
+ margin-top: 8px;
3816
+ }
3817
+
3818
+ .queue-cost-est {
3819
+ font-family: var(--font-mono);
3820
+ font-size: 0.7rem;
3821
+ color: var(--text-muted);
3822
+ }
3823
+
3824
+ .alert-banner-icon {
3825
+ font-size: 1.1rem;
3826
+ }
3827
+
3828
+ .alert-banner-msg {
3829
+ flex: 1;
3830
+ font-size: 0.82rem;
3831
+ color: var(--text-primary);
3832
+ }
3833
+
3834
+ .alert-banner-actions {
3835
+ display: flex;
3836
+ gap: 8px;
3837
+ }
3838
+
3839
+ .alert-dismiss-btn {
3840
+ background: none;
3841
+ border: none;
3842
+ color: var(--text-muted);
3843
+ font-size: 1.2rem;
3844
+ cursor: pointer;
3845
+ padding: 0 4px;
3846
+ line-height: 1;
3847
+ }
3848
+
3849
+ .alert-dismiss-btn:hover {
3850
+ color: var(--text-primary);
3851
+ }
3852
+
3853
+ .btn-abort {
3854
+ background: rgba(244, 63, 94, 0.15);
3855
+ border: 1px solid rgba(244, 63, 94, 0.3);
3856
+ color: var(--rose);
3857
+ padding: 4px 10px;
3858
+ border-radius: 6px;
3859
+ font-family: var(--font-mono);
3860
+ font-size: 0.7rem;
3861
+ cursor: pointer;
3862
+ }
3863
+
3864
+ .btn-abort:hover {
3865
+ background: rgba(244, 63, 94, 0.25);
3866
+ }
3867
+
3868
+ /* ── Machines Tab ────────────────────────────── */
3869
+ .machines-summary {
3870
+ display: grid;
3871
+ grid-template-columns: repeat(4, 1fr);
3872
+ gap: 12px;
3873
+ margin-bottom: 1.5rem;
3874
+ }
3875
+
3876
+ .machines-summary-card {
3877
+ background: var(--card-bg);
3878
+ border: 1px solid var(--card-border);
3879
+ border-radius: var(--card-radius);
3880
+ padding: 1rem 1.25rem;
3881
+ transition: border-color var(--transition-base);
3882
+ }
3883
+
3884
+ .machines-summary-card:hover {
3885
+ border-color: var(--card-hover-border);
3886
+ }
3887
+
3888
+ .machines-summary-card .stat-value {
3889
+ font-size: 1.5rem;
3890
+ font-weight: 800;
3891
+ color: var(--text-primary);
3892
+ font-family: var(--font-mono);
3893
+ }
3894
+
3895
+ .machines-summary-card .stat-label {
3896
+ font-size: 0.7rem;
3897
+ color: var(--text-muted);
3898
+ text-transform: uppercase;
3899
+ letter-spacing: 0.5px;
3900
+ font-family: var(--font-mono);
3901
+ }
3902
+
3903
+ .machines-actions {
3904
+ display: flex;
3905
+ gap: 12px;
3906
+ margin-bottom: 1.5rem;
3907
+ }
3908
+
3909
+ .btn-primary {
3910
+ background: linear-gradient(135deg, var(--cyan), var(--blue));
3911
+ color: #060a14;
3912
+ border: none;
3913
+ border-radius: 8px;
3914
+ padding: 0.65rem 1.25rem;
3915
+ font-family: var(--font-sans);
3916
+ font-size: 0.8rem;
3917
+ font-weight: 700;
3918
+ cursor: pointer;
3919
+ transition:
3920
+ opacity 0.2s,
3921
+ transform 0.15s,
3922
+ box-shadow 0.2s;
3923
+ }
3924
+
3925
+ .btn-primary:hover {
3926
+ opacity: 0.9;
3927
+ transform: translateY(-1px);
3928
+ box-shadow: 0 4px 20px rgba(0, 212, 255, 0.3);
3929
+ }
3930
+
3931
+ .btn-secondary {
3932
+ background: transparent;
3933
+ color: var(--text-primary);
3934
+ border: 1px solid rgba(255, 255, 255, 0.15);
3935
+ border-radius: 8px;
3936
+ padding: 0.65rem 1.25rem;
3937
+ font-family: var(--font-sans);
3938
+ font-size: 0.8rem;
3939
+ font-weight: 600;
3940
+ cursor: pointer;
3941
+ transition:
3942
+ border-color 0.2s,
3943
+ background 0.2s;
3944
+ }
3945
+
3946
+ .btn-secondary:hover {
3947
+ border-color: rgba(255, 255, 255, 0.3);
3948
+ background: rgba(255, 255, 255, 0.04);
3949
+ }
3950
+
3951
+ #panel-machines .machines-grid {
3952
+ grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
3953
+ gap: 16px;
3954
+ }
3955
+
3956
+ .machine-card-expanded {
3957
+ background: var(--card-bg);
3958
+ border: 1px solid var(--card-border);
3959
+ border-radius: var(--card-radius);
3960
+ padding: 1.25rem 1.5rem;
3961
+ animation: card-enter 0.4s ease-out both;
3962
+ transition: border-color var(--transition-base);
3963
+ }
3964
+
3965
+ .machine-card-expanded:hover {
3966
+ border-color: var(--card-hover-border);
3967
+ }
3968
+
3969
+ .machine-host {
3970
+ font-family: var(--font-mono);
3971
+ font-size: 0.75rem;
3972
+ color: var(--text-muted);
3973
+ background: rgba(0, 0, 0, 0.25);
3974
+ padding: 4px 10px;
3975
+ border-radius: 6px;
3976
+ margin-bottom: 12px;
3977
+ display: inline-block;
3978
+ }
3979
+
3980
+ .machine-workers-section {
3981
+ margin-bottom: 12px;
3982
+ }
3983
+
3984
+ .machine-workers-label-row {
3985
+ display: flex;
3986
+ justify-content: space-between;
3987
+ align-items: center;
3988
+ margin-bottom: 6px;
3989
+ }
3990
+
3991
+ .machine-workers-label-row span {
3992
+ font-size: 0.7rem;
3993
+ color: var(--text-muted);
3994
+ font-family: var(--font-mono);
3995
+ text-transform: uppercase;
3996
+ letter-spacing: 0.5px;
3997
+ }
3998
+
3999
+ .machine-workers-label-row .workers-count {
4000
+ font-size: 0.8rem;
4001
+ color: var(--text-primary);
4002
+ font-weight: 700;
4003
+ font-family: var(--font-mono);
4004
+ }
4005
+
4006
+ .workers-slider {
4007
+ -webkit-appearance: none;
4008
+ appearance: none;
4009
+ width: 100%;
4010
+ height: 4px;
4011
+ border-radius: 2px;
4012
+ background: rgba(255, 255, 255, 0.08);
4013
+ outline: none;
4014
+ cursor: pointer;
4015
+ }
4016
+
4017
+ .workers-slider::-webkit-slider-thumb {
4018
+ -webkit-appearance: none;
4019
+ appearance: none;
4020
+ width: 16px;
4021
+ height: 16px;
4022
+ border-radius: 50%;
4023
+ background: linear-gradient(135deg, var(--cyan), var(--blue));
4024
+ cursor: pointer;
4025
+ border: 2px solid #060a14;
4026
+ box-shadow: 0 2px 8px rgba(0, 212, 255, 0.3);
4027
+ }
4028
+
4029
+ .workers-slider::-moz-range-track {
4030
+ height: 4px;
4031
+ border-radius: 2px;
4032
+ background: rgba(255, 255, 255, 0.08);
4033
+ }
4034
+
4035
+ .workers-slider::-moz-range-thumb {
4036
+ width: 16px;
4037
+ height: 16px;
4038
+ border-radius: 50%;
4039
+ background: linear-gradient(135deg, var(--cyan), var(--blue));
4040
+ cursor: pointer;
4041
+ border: 2px solid #060a14;
4042
+ box-shadow: 0 2px 8px rgba(0, 212, 255, 0.3);
4043
+ }
4044
+
4045
+ .machine-health {
4046
+ border-top: 1px solid var(--card-border);
4047
+ padding-top: 10px;
4048
+ margin-top: 8px;
4049
+ }
4050
+
4051
+ .machine-health-row {
4052
+ display: flex;
4053
+ justify-content: space-between;
4054
+ align-items: center;
4055
+ padding: 3px 0;
4056
+ font-size: 0.7rem;
4057
+ }
4058
+
4059
+ .health-label {
4060
+ color: var(--text-muted);
4061
+ text-transform: uppercase;
4062
+ font-family: var(--font-mono);
4063
+ letter-spacing: 0.5px;
4064
+ }
4065
+
4066
+ .health-status {
4067
+ font-family: var(--font-mono);
4068
+ font-weight: 600;
4069
+ font-size: 0.7rem;
4070
+ }
4071
+
4072
+ .health-status.running {
4073
+ color: var(--green);
4074
+ }
4075
+
4076
+ .health-status.stopped {
4077
+ color: var(--rose);
4078
+ }
4079
+
4080
+ .health-value {
4081
+ color: var(--text-secondary);
4082
+ font-family: var(--font-mono);
4083
+ }
4084
+
4085
+ .machine-card-actions {
4086
+ display: flex;
4087
+ gap: 8px;
4088
+ margin-top: 12px;
4089
+ padding-top: 10px;
4090
+ border-top: 1px solid var(--card-border);
4091
+ }
4092
+
4093
+ .machine-action-btn {
4094
+ background: transparent;
4095
+ border: 1px solid rgba(255, 255, 255, 0.1);
4096
+ border-radius: 100px;
4097
+ padding: 4px 12px;
4098
+ font-family: var(--font-mono);
4099
+ font-size: 0.65rem;
4100
+ color: var(--text-secondary);
4101
+ cursor: pointer;
4102
+ transition:
4103
+ border-color 0.2s,
4104
+ color 0.2s,
4105
+ background 0.2s;
4106
+ }
4107
+
4108
+ .machine-action-btn:hover {
4109
+ border-color: rgba(255, 255, 255, 0.25);
4110
+ color: var(--text-primary);
4111
+ background: rgba(255, 255, 255, 0.04);
4112
+ }
4113
+
4114
+ .machine-action-btn.danger:hover {
4115
+ border-color: rgba(244, 63, 94, 0.4);
4116
+ color: var(--rose);
4117
+ background: rgba(244, 63, 94, 0.08);
4118
+ }
4119
+
4120
+ .join-command {
4121
+ background: rgba(0, 0, 0, 0.35);
4122
+ border: 1px solid rgba(0, 212, 255, 0.1);
4123
+ border-radius: 8px;
4124
+ padding: 0.75rem 1rem;
4125
+ font-family: var(--font-mono);
4126
+ font-size: 0.75rem;
4127
+ color: var(--cyan);
4128
+ position: relative;
4129
+ word-break: break-all;
4130
+ margin-top: 8px;
4131
+ }
4132
+
4133
+ .join-copy-btn {
4134
+ position: absolute;
4135
+ top: 6px;
4136
+ right: 6px;
4137
+ background: rgba(0, 212, 255, 0.1);
4138
+ border: 1px solid rgba(0, 212, 255, 0.2);
4139
+ border-radius: 100px;
4140
+ padding: 3px 10px;
4141
+ font-family: var(--font-mono);
4142
+ font-size: 0.6rem;
4143
+ color: var(--cyan);
4144
+ cursor: pointer;
4145
+ transition: background 0.2s;
4146
+ }
4147
+
4148
+ .join-copy-btn:hover {
4149
+ background: rgba(0, 212, 255, 0.2);
4150
+ }
4151
+
4152
+ .join-token-row {
4153
+ display: flex;
4154
+ align-items: center;
4155
+ gap: 8px;
4156
+ padding: 6px 0;
4157
+ }
4158
+
4159
+ .join-token-label {
4160
+ font-family: var(--font-mono);
4161
+ font-size: 0.75rem;
4162
+ color: var(--text-secondary);
4163
+ overflow: hidden;
4164
+ text-overflow: ellipsis;
4165
+ white-space: nowrap;
4166
+ max-width: 200px;
4167
+ }
4168
+
4169
+ .join-token-expiry {
4170
+ font-family: var(--font-mono);
4171
+ font-size: 0.6rem;
4172
+ font-weight: 600;
4173
+ padding: 2px 8px;
4174
+ border-radius: 100px;
4175
+ }
4176
+
4177
+ .join-token-expiry.valid {
4178
+ background: rgba(74, 222, 128, 0.12);
4179
+ color: var(--green);
4180
+ }
4181
+
4182
+ .join-token-expiry.expiring {
4183
+ background: rgba(251, 191, 36, 0.12);
4184
+ color: var(--amber);
4185
+ }
4186
+
4187
+ .join-token-expiry.expired {
4188
+ background: rgba(244, 63, 94, 0.12);
4189
+ color: var(--rose);
4190
+ }
4191
+
4192
+ .join-token-created {
4193
+ font-size: 0.7rem;
4194
+ color: var(--text-muted);
4195
+ font-family: var(--font-mono);
4196
+ }
4197
+
4198
+ .join-token-status {
4199
+ font-family: var(--font-mono);
4200
+ font-size: 0.65rem;
4201
+ font-weight: 600;
4202
+ }
4203
+
4204
+ .join-token-status.c-green {
4205
+ color: var(--green);
4206
+ }
4207
+
4208
+ .join-token-status.c-amber {
4209
+ color: var(--amber);
4210
+ }
4211
+
4212
+ .modal-wide {
4213
+ max-width: 640px !important;
4214
+ }
4215
+
4216
+ .form-row {
4217
+ display: grid;
4218
+ grid-template-columns: 1fr 1fr;
4219
+ gap: 12px;
4220
+ margin-bottom: 12px;
4221
+ }
4222
+
4223
+ .form-group {
4224
+ display: flex;
4225
+ flex-direction: column;
4226
+ gap: 4px;
4227
+ }
4228
+
4229
+ .form-label {
4230
+ font-size: 0.7rem;
4231
+ font-weight: 600;
4232
+ text-transform: uppercase;
4233
+ letter-spacing: 0.5px;
4234
+ color: var(--text-muted);
4235
+ font-family: var(--font-mono);
4236
+ }
4237
+
4238
+ .form-input {
4239
+ background: rgba(0, 212, 255, 0.04);
4240
+ border: 1px solid rgba(0, 212, 255, 0.12);
4241
+ border-radius: 8px;
4242
+ padding: 0.6rem 0.85rem;
4243
+ color: var(--text-primary);
4244
+ font-family: var(--font-sans);
4245
+ font-size: 0.85rem;
4246
+ outline: none;
4247
+ transition: border-color 0.2s;
4248
+ }
4249
+
4250
+ .form-input:focus {
4251
+ border-color: rgba(0, 212, 255, 0.4);
4252
+ box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.06);
4253
+ }
4254
+
4255
+ select.form-input {
4256
+ background: rgba(0, 212, 255, 0.04);
4257
+ border: 1px solid rgba(0, 212, 255, 0.12);
4258
+ border-radius: 8px;
4259
+ padding: 0.6rem 0.85rem;
4260
+ color: var(--text-primary);
4261
+ font-family: var(--font-sans);
4262
+ font-size: 0.85rem;
4263
+ outline: none;
4264
+ transition: border-color 0.2s;
4265
+ }
4266
+
4267
+ .form-error {
4268
+ color: var(--rose);
4269
+ font-size: 0.75rem;
4270
+ margin-top: 8px;
4271
+ }
4272
+
4273
+ .form-checkbox-label {
4274
+ display: flex;
4275
+ align-items: center;
4276
+ gap: 8px;
4277
+ font-size: 0.85rem;
4278
+ color: var(--text-secondary);
4279
+ cursor: pointer;
4280
+ }
4281
+
4282
+ /* ── Reduced Motion ───────────────────────────── */
4283
+ @media (prefers-reduced-motion: reduce) {
4284
+ *,
4285
+ *::before,
4286
+ *::after {
4287
+ animation-duration: 0.01ms !important;
4288
+ animation-iteration-count: 1 !important;
4289
+ transition-duration: 0.01ms !important;
4290
+ scroll-behavior: auto !important;
4291
+ }
4292
+
4293
+ .connection-dot.live,
4294
+ .pulse-dot.operational,
4295
+ .presence-dot.active {
4296
+ animation: none;
4297
+ }
4298
+
4299
+ .stage-seg.active,
4300
+ .gantt-segment.running,
4301
+ .stage-active rect,
4302
+ .stage-active circle,
4303
+ .stage-connector.active {
4304
+ animation: none;
4305
+ }
4306
+ }
4307
+
4308
+ /* ── Responsive ───────────────────────────────── */
4309
+ @media (max-width: 1024px) {
4310
+ .stats-row {
4311
+ grid-template-columns: repeat(2, 1fr);
4312
+ }
4313
+
4314
+ .metrics-top-row {
4315
+ grid-template-columns: repeat(2, 1fr);
4316
+ }
4317
+
4318
+ .bottom-grid {
4319
+ grid-template-columns: 1fr;
4320
+ }
4321
+
4322
+ .stage-seg {
4323
+ font-size: 0.55rem;
4324
+ padding: 3px 4px;
4325
+ }
4326
+
4327
+ .pipeline-table .col-branch,
4328
+ .pipeline-table .col-title {
4329
+ max-width: 140px;
4330
+ }
4331
+
4332
+ .filter-bar {
4333
+ gap: 6px;
4334
+ }
4335
+
4336
+ .filter-chip {
4337
+ padding: 5px 12px;
4338
+ font-size: 0.65rem;
4339
+ }
4340
+
4341
+ .cost-breakdown {
4342
+ grid-template-columns: 1fr;
4343
+ }
4344
+
4345
+ .dora-sparkline-row {
4346
+ grid-template-columns: repeat(2, 1fr);
4347
+ }
4348
+
4349
+ #panel-machines .machines-grid {
4350
+ grid-template-columns: 1fr;
4351
+ }
4352
+
4353
+ .machines-summary {
4354
+ grid-template-columns: repeat(2, 1fr);
4355
+ }
4356
+ }
4357
+
4358
+ @media (max-width: 640px) {
4359
+ .stats-row {
4360
+ grid-template-columns: 1fr;
4361
+ }
4362
+
4363
+ .metrics-top-row {
4364
+ grid-template-columns: 1fr;
4365
+ }
4366
+
4367
+ .tab-btn {
4368
+ padding: 0 12px;
4369
+ font-size: 0.8rem;
4370
+ }
4371
+
4372
+ .main {
4373
+ padding-left: 12px;
4374
+ padding-right: 12px;
4375
+ }
4376
+
4377
+ .agents-grid {
4378
+ grid-template-columns: 1fr;
4379
+ }
4380
+
4381
+ .dora-badge {
4382
+ width: 40px;
4383
+ height: 40px;
4384
+ font-size: 1.1rem;
4385
+ }
4386
+
4387
+ .dora-grades-row {
4388
+ grid-template-columns: repeat(2, 1fr);
4389
+ }
4390
+
4391
+ .alert-banner {
4392
+ top: 104px;
4393
+ padding: 0 12px;
4394
+ }
4395
+
4396
+ .bulk-actions {
4397
+ flex-wrap: wrap;
4398
+ }
4399
+
4400
+ .machines-summary {
4401
+ grid-template-columns: 1fr;
4402
+ }
4403
+
4404
+ .form-row {
4405
+ grid-template-columns: 1fr;
4406
+ }
4407
+
4408
+ .machines-actions {
4409
+ flex-direction: column;
4410
+ }
4411
+ }
4412
+
4413
+ /* ── Daemon Control Bar ──────────────────────────────────────────── */
4414
+ .daemon-control-bar {
4415
+ display: flex;
4416
+ align-items: center;
4417
+ gap: 1.5rem;
4418
+ padding: 0.75rem 1.25rem;
4419
+ background: linear-gradient(
4420
+ 135deg,
4421
+ rgba(0, 212, 255, 0.06),
4422
+ rgba(124, 58, 237, 0.04)
4423
+ );
4424
+ border: 1px solid rgba(0, 212, 255, 0.15);
4425
+ border-radius: 12px;
4426
+ margin-bottom: 1.5rem;
4427
+ flex-wrap: wrap;
4428
+ }
4429
+
4430
+ .daemon-control-status {
4431
+ display: flex;
4432
+ align-items: center;
4433
+ gap: 0.5rem;
4434
+ }
4435
+
4436
+ .daemon-status-badge {
4437
+ display: inline-block;
4438
+ padding: 0.2rem 0.6rem;
4439
+ border-radius: 999px;
4440
+ font-size: 0.75rem;
4441
+ font-weight: 600;
4442
+ text-transform: uppercase;
4443
+ letter-spacing: 0.05em;
4444
+ }
4445
+
4446
+ .daemon-status-badge.running {
4447
+ background: rgba(74, 222, 128, 0.15);
4448
+ color: #4ade80;
4449
+ border: 1px solid rgba(74, 222, 128, 0.3);
4450
+ }
4451
+
4452
+ .daemon-status-badge.stopped {
4453
+ background: rgba(248, 113, 113, 0.15);
4454
+ color: #f87171;
4455
+ border: 1px solid rgba(248, 113, 113, 0.3);
4456
+ }
4457
+
4458
+ .daemon-status-badge.paused {
4459
+ background: rgba(251, 191, 36, 0.15);
4460
+ color: #fbbf24;
4461
+ border: 1px solid rgba(251, 191, 36, 0.3);
4462
+ }
4463
+
4464
+ .daemon-status-badge.unknown {
4465
+ background: rgba(148, 163, 184, 0.15);
4466
+ color: #94a3b8;
4467
+ border: 1px solid rgba(148, 163, 184, 0.3);
4468
+ }
4469
+
4470
+ .daemon-status-label {
4471
+ font-size: 0.85rem;
4472
+ color: #94a3b8;
4473
+ font-weight: 500;
4474
+ }
4475
+
4476
+ .daemon-control-actions {
4477
+ display: flex;
4478
+ gap: 0.5rem;
4479
+ }
4480
+
4481
+ .daemon-control-actions .btn-sm {
4482
+ padding: 0.3rem 0.75rem;
4483
+ font-size: 0.75rem;
4484
+ border-radius: 6px;
4485
+ border: 1px solid rgba(255, 255, 255, 0.1);
4486
+ background: rgba(255, 255, 255, 0.05);
4487
+ color: #e2e8f0;
4488
+ cursor: pointer;
4489
+ transition: all 0.2s;
4490
+ font-weight: 500;
4491
+ }
4492
+
4493
+ .daemon-control-actions .btn-sm:hover {
4494
+ background: rgba(255, 255, 255, 0.1);
4495
+ border-color: rgba(0, 212, 255, 0.3);
4496
+ }
4497
+
4498
+ .daemon-control-actions .btn-sm:disabled {
4499
+ opacity: 0.4;
4500
+ cursor: not-allowed;
4501
+ }
4502
+
4503
+ .daemon-control-actions .btn-start:hover {
4504
+ border-color: rgba(74, 222, 128, 0.5);
4505
+ color: #4ade80;
4506
+ }
4507
+ .daemon-control-actions .btn-stop:hover {
4508
+ border-color: rgba(248, 113, 113, 0.5);
4509
+ color: #f87171;
4510
+ }
4511
+ .daemon-control-actions .btn-pause:hover {
4512
+ border-color: rgba(251, 191, 36, 0.5);
4513
+ color: #fbbf24;
4514
+ }
4515
+ .daemon-control-actions .btn-patrol:hover {
4516
+ border-color: rgba(0, 212, 255, 0.5);
4517
+ color: #00d4ff;
4518
+ }
4519
+
4520
+ .daemon-control-info {
4521
+ display: flex;
4522
+ gap: 1rem;
4523
+ margin-left: auto;
4524
+ flex-wrap: wrap;
4525
+ }
4526
+
4527
+ .daemon-info-item {
4528
+ font-size: 0.75rem;
4529
+ color: #94a3b8;
4530
+ }
4531
+
4532
+ .daemon-info-item strong {
4533
+ color: #cbd5e1;
4534
+ }
4535
+
4536
+ /* ── Team Tab ──────────────────────────────────── */
4537
+ .team-stats-bar {
4538
+ display: flex;
4539
+ gap: 1.5rem;
4540
+ margin-bottom: 2rem;
4541
+ padding: 1.25rem 1.5rem;
4542
+ background: var(--card-bg);
4543
+ border: 1px solid var(--card-border);
4544
+ border-radius: var(--card-radius);
4545
+ }
4546
+
4547
+ .team-stat {
4548
+ flex: 1;
4549
+ text-align: center;
4550
+ }
4551
+
4552
+ .team-stat-label {
4553
+ font-size: 0.7rem;
4554
+ font-weight: 600;
4555
+ letter-spacing: 0.08em;
4556
+ color: var(--text-muted);
4557
+ text-transform: uppercase;
4558
+ }
4559
+
4560
+ .team-stat-value {
4561
+ font-size: 1.75rem;
4562
+ font-weight: 700;
4563
+ font-family: var(--font-mono);
4564
+ color: var(--text-primary);
4565
+ margin-top: 0.25rem;
4566
+ }
4567
+
4568
+ .team-grid {
4569
+ display: grid;
4570
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
4571
+ gap: 1rem;
4572
+ }
4573
+
4574
+ .team-card {
4575
+ background: var(--card-bg);
4576
+ border: 1px solid var(--card-border);
4577
+ border-radius: var(--card-radius);
4578
+ padding: 1.25rem;
4579
+ transition:
4580
+ border-color var(--transition-base),
4581
+ transform var(--transition-fast);
4582
+ }
4583
+
4584
+ .team-card:hover {
4585
+ border-color: var(--card-hover-border);
4586
+ transform: translateY(-1px);
4587
+ }
4588
+
4589
+ .team-card-header {
4590
+ display: flex;
4591
+ align-items: center;
4592
+ gap: 0.75rem;
4593
+ margin-bottom: 1rem;
4594
+ }
4595
+
4596
+ .team-card-avatar {
4597
+ width: 40px;
4598
+ height: 40px;
4599
+ border-radius: 50%;
4600
+ background: linear-gradient(135deg, var(--cyan), var(--purple));
4601
+ display: flex;
4602
+ align-items: center;
4603
+ justify-content: center;
4604
+ font-weight: 700;
4605
+ font-size: 0.95rem;
4606
+ color: white;
4607
+ flex-shrink: 0;
4608
+ }
4609
+
4610
+ .team-card-info {
4611
+ flex: 1;
4612
+ min-width: 0;
4613
+ }
4614
+
4615
+ .team-card-name {
4616
+ font-weight: 600;
4617
+ font-size: 0.95rem;
4618
+ color: var(--text-primary);
4619
+ white-space: nowrap;
4620
+ overflow: hidden;
4621
+ text-overflow: ellipsis;
4622
+ }
4623
+
4624
+ .team-card-machine {
4625
+ font-size: 0.75rem;
4626
+ color: var(--text-muted);
4627
+ font-family: var(--font-mono);
4628
+ }
4629
+
4630
+ .team-card-body {
4631
+ display: flex;
4632
+ flex-direction: column;
4633
+ gap: 0.5rem;
4634
+ }
4635
+
4636
+ .team-card-row {
4637
+ display: flex;
4638
+ justify-content: space-between;
4639
+ align-items: center;
4640
+ font-size: 0.8rem;
4641
+ }
4642
+
4643
+ .team-card-row-label {
4644
+ color: var(--text-muted);
4645
+ }
4646
+
4647
+ .team-card-row-value {
4648
+ font-family: var(--font-mono);
4649
+ font-size: 0.8rem;
4650
+ color: var(--text-secondary);
4651
+ }
4652
+
4653
+ .team-card-pipelines {
4654
+ margin-top: 0.5rem;
4655
+ padding-top: 0.75rem;
4656
+ border-top: 1px solid var(--card-border);
4657
+ }
4658
+
4659
+ .team-card-pipeline-item {
4660
+ display: flex;
4661
+ align-items: center;
4662
+ gap: 0.5rem;
4663
+ padding: 0.35rem 0;
4664
+ font-size: 0.8rem;
4665
+ }
4666
+
4667
+ .team-card-pipeline-issue {
4668
+ font-family: var(--font-mono);
4669
+ color: var(--cyan);
4670
+ font-weight: 500;
4671
+ }
4672
+
4673
+ .team-card-pipeline-stage {
4674
+ font-family: var(--font-mono);
4675
+ font-size: 0.7rem;
4676
+ padding: 0.15rem 0.5rem;
4677
+ border-radius: 4px;
4678
+ background: rgba(0, 212, 255, 0.1);
4679
+ color: var(--cyan);
4680
+ }
4681
+
4682
+ /* Team Activity Feed */
4683
+ .team-activity {
4684
+ display: flex;
4685
+ flex-direction: column;
4686
+ gap: 0.5rem;
4687
+ max-height: 500px;
4688
+ overflow-y: auto;
4689
+ padding-right: 0.5rem;
4690
+ }
4691
+
4692
+ .team-activity-item {
4693
+ display: flex;
4694
+ align-items: flex-start;
4695
+ gap: 0.75rem;
4696
+ padding: 0.75rem 1rem;
4697
+ background: var(--card-bg);
4698
+ border: 1px solid var(--card-border);
4699
+ border-radius: 10px;
4700
+ font-size: 0.8rem;
4701
+ transition: border-color var(--transition-fast);
4702
+ }
4703
+
4704
+ .team-activity-item:hover {
4705
+ border-color: var(--card-hover-border);
4706
+ }
4707
+
4708
+ .source-badge {
4709
+ flex-shrink: 0;
4710
+ font-size: 0.65rem;
4711
+ font-weight: 600;
4712
+ letter-spacing: 0.05em;
4713
+ padding: 0.2rem 0.5rem;
4714
+ border-radius: 4px;
4715
+ text-transform: uppercase;
4716
+ white-space: nowrap;
4717
+ }
4718
+
4719
+ .source-badge.local {
4720
+ background: rgba(74, 222, 128, 0.15);
4721
+ color: var(--green);
4722
+ }
4723
+
4724
+ .source-badge.ci {
4725
+ background: rgba(124, 58, 237, 0.15);
4726
+ color: var(--purple);
4727
+ }
4728
+
4729
+ .team-activity-content {
4730
+ flex: 1;
4731
+ min-width: 0;
4732
+ }
4733
+
4734
+ .team-activity-text {
4735
+ color: var(--text-primary);
4736
+ line-height: 1.4;
4737
+ }
4738
+
4739
+ .team-activity-time {
4740
+ font-size: 0.7rem;
4741
+ color: var(--text-muted);
4742
+ font-family: var(--font-mono);
4743
+ margin-top: 0.25rem;
4744
+ }
4745
+
4746
+ #panel-team .empty-state code {
4747
+ font-family: var(--font-mono);
4748
+ background: rgba(0, 212, 255, 0.08);
4749
+ padding: 0.2rem 0.5rem;
4750
+ border-radius: 4px;
4751
+ color: var(--cyan);
4752
+ font-size: 0.85rem;
4753
+ }
4754
+
4755
+ /* presence-pulse: used by pulse-dot keyframes on .presence-dot.online */