@worca/ui 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/app/styles.css ADDED
@@ -0,0 +1,3897 @@
1
+ /* ============================================================
2
+ WORCA UI — Modernized Stylesheet
3
+ Inter font, Shoelace tokens, Lucide icons, xterm terminal
4
+ ============================================================ */
5
+
6
+ /* --- 1. CSS Custom Properties (Light Theme Default) --- */
7
+ :root {
8
+ --sidebar-width: 250px;
9
+ --fg: #1e293b;
10
+ --bg: #ffffff;
11
+ --bg-secondary: #f8fafc;
12
+ --bg-tertiary: #f1f5f9;
13
+ --border: #e2e8f0;
14
+ --border-subtle: rgba(226, 232, 240, 0.6);
15
+ --muted: #94a3b8;
16
+ --accent: #3b82f6;
17
+ --accent-hover: #2563eb;
18
+
19
+ /* Status colors */
20
+ --status-pending: #94a3b8;
21
+ --status-running: #3b82f6;
22
+ --status-paused: #f59e0b;
23
+ --status-completed: #22c55e;
24
+ --status-failed: #ef4444;
25
+ --status-resuming: #3b82f6;
26
+ --status-skipped: #94a3b8;
27
+ /* legacy */
28
+ --status-in-progress: #f59e0b;
29
+ --status-error: #ef4444;
30
+ --status-blocked: #3b82f6;
31
+
32
+ /* Log viewer */
33
+ --log-bg: #0f172a;
34
+ --log-fg: #e2e8f0;
35
+
36
+ /* Shadows & radii */
37
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 3px rgba(0, 0, 0, 0.06);
38
+ --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.03), 0 4px 8px rgba(0, 0, 0, 0.06);
39
+ --shadow-lg: 0 4px 6px rgba(0, 0, 0, 0.02), 0 10px 20px rgba(0, 0, 0, 0.06);
40
+ --radius: 8px;
41
+ --radius-lg: 12px;
42
+ --radius-xl: 16px;
43
+
44
+ /* Transitions */
45
+ --transition-fast: 0.2s ease-out;
46
+
47
+ /* Shoelace token mapping */
48
+ --sl-color-primary-600: var(--accent);
49
+ --sl-color-success-600: var(--status-completed);
50
+ --sl-color-warning-600: var(--status-in-progress);
51
+ --sl-color-danger-600: var(--status-error);
52
+ --sl-color-neutral-600: var(--status-pending);
53
+ --sl-border-radius-medium: var(--radius);
54
+ --sl-border-radius-large: var(--radius-lg);
55
+ --sl-font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
56
+ --sl-font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
57
+ --sl-shadow-small: var(--shadow-sm);
58
+ --sl-shadow-medium: var(--shadow-md);
59
+ }
60
+
61
+ /* --- 2. Dark Theme Overrides --- */
62
+ [data-theme="dark"] {
63
+ --fg: #e2e8f0;
64
+ --bg: #0f172a;
65
+ --bg-secondary: #1e293b;
66
+ --bg-tertiary: #1a2332;
67
+ --border: #334155;
68
+ --border-subtle: rgba(51, 65, 85, 0.6);
69
+ --muted: #64748b;
70
+ --filter-chip-inactive: #94a3b8;
71
+ --accent: #60a5fa;
72
+ --accent-hover: #93bbfd;
73
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2), 0 1px 3px rgba(0, 0, 0, 0.15);
74
+ --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.15), 0 4px 8px rgba(0, 0, 0, 0.2);
75
+ --shadow-lg: 0 4px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.25);
76
+ }
77
+
78
+ /* Apply Shoelace dark theme when our dark theme is active */
79
+ [data-theme="dark"] {
80
+ color-scheme: dark;
81
+ }
82
+
83
+ /* --- 3. Reset --- */
84
+ *,
85
+ *::before,
86
+ *::after {
87
+ box-sizing: border-box;
88
+ margin: 0;
89
+ padding: 0;
90
+ }
91
+
92
+ html, body {
93
+ height: 100%;
94
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
95
+ font-size: 15px;
96
+ line-height: 1.5;
97
+ color: var(--fg);
98
+ background: var(--bg);
99
+ -webkit-font-smoothing: antialiased;
100
+ -moz-osx-font-smoothing: grayscale;
101
+ }
102
+
103
+ /* Global Shoelace button icon alignment */
104
+ sl-button::part(label) {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ gap: 6px;
108
+ }
109
+
110
+ sl-button svg {
111
+ flex-shrink: 0;
112
+ }
113
+
114
+ h1, h2, h3, h4, h5, h6 {
115
+ font-weight: 600;
116
+ letter-spacing: -0.01em;
117
+ }
118
+
119
+ /* --- 4. App Shell --- */
120
+ .app-shell {
121
+ display: flex;
122
+ flex-direction: row;
123
+ height: 100vh;
124
+ overflow: hidden;
125
+ }
126
+
127
+ /* --- 5. Sidebar --- */
128
+ .sidebar {
129
+ width: var(--sidebar-width);
130
+ min-width: var(--sidebar-width);
131
+ display: flex;
132
+ flex-direction: column;
133
+ background: var(--bg-secondary);
134
+ backdrop-filter: blur(12px);
135
+ border-right: 1px solid var(--border-subtle);
136
+ overflow-y: auto;
137
+ overflow-x: hidden;
138
+ transition: width var(--transition-fast), min-width var(--transition-fast);
139
+ }
140
+
141
+ .sidebar.collapsed {
142
+ width: 56px;
143
+ min-width: 56px;
144
+ }
145
+
146
+ .sidebar.collapsed .sidebar-section-header,
147
+ .sidebar.collapsed .sidebar-item span,
148
+ .sidebar.collapsed .conn-label,
149
+ .sidebar.collapsed .logo-text {
150
+ display: none;
151
+ }
152
+
153
+ .sidebar-logo {
154
+ padding: 20px 16px 12px;
155
+ border-bottom: 1px solid var(--border-subtle);
156
+ }
157
+
158
+ .logo-text {
159
+ font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
160
+ font-size: 18px;
161
+ font-weight: 700;
162
+ letter-spacing: 0.08em;
163
+ color: var(--fg);
164
+ }
165
+
166
+ /* --- 6. Sidebar Sections --- */
167
+ .sidebar-section {
168
+ padding: 8px 0;
169
+ }
170
+
171
+ .sidebar-section-header {
172
+ padding: 8px 16px 4px;
173
+ font-size: 11px;
174
+ font-weight: 600;
175
+ text-transform: uppercase;
176
+ letter-spacing: 0.05em;
177
+ color: var(--muted);
178
+ }
179
+
180
+ /* --- 7. Sidebar Items --- */
181
+ .sidebar-item {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: space-between;
185
+ padding: 8px 12px;
186
+ cursor: pointer;
187
+ color: var(--fg);
188
+ border-radius: var(--radius);
189
+ margin: 2px 8px;
190
+ transition: background var(--transition-fast), color var(--transition-fast);
191
+ font-size: 13px;
192
+ font-weight: 500;
193
+ }
194
+
195
+ .sidebar-item-left {
196
+ display: flex;
197
+ align-items: center;
198
+ gap: 8px;
199
+ }
200
+
201
+ .sidebar-item-left svg {
202
+ flex-shrink: 0;
203
+ opacity: 0.7;
204
+ }
205
+
206
+ .sidebar-item:hover {
207
+ background: var(--border);
208
+ }
209
+
210
+ .sidebar-item:hover .sidebar-item-left svg {
211
+ opacity: 1;
212
+ }
213
+
214
+ .sidebar-item.active {
215
+ background: var(--accent);
216
+ color: #ffffff;
217
+ }
218
+
219
+ .sidebar-item.active .sidebar-item-left svg {
220
+ opacity: 1;
221
+ }
222
+
223
+ .sidebar-item.active sl-badge {
224
+ --sl-color-primary-600: #ffffff;
225
+ --sl-color-neutral-600: #ffffff;
226
+ --sl-color-success-600: #ffffff;
227
+ --sl-color-warning-600: #ffffff;
228
+ --sl-color-neutral-0: var(--accent);
229
+ }
230
+
231
+ /* --- 8. Sidebar Footer --- */
232
+ .sidebar-footer {
233
+ margin-top: auto;
234
+ padding: 12px 16px;
235
+ border-top: 1px solid var(--border-subtle);
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: space-between;
239
+ gap: 8px;
240
+ }
241
+
242
+ .theme-toggle-btn {
243
+ display: flex;
244
+ align-items: center;
245
+ justify-content: center;
246
+ width: 34px;
247
+ height: 34px;
248
+ padding: 0;
249
+ border: 1px solid var(--border);
250
+ border-radius: var(--radius);
251
+ background: transparent;
252
+ color: var(--muted);
253
+ cursor: pointer;
254
+ transition: background var(--transition-fast), color var(--transition-fast);
255
+ }
256
+
257
+ .theme-toggle-btn:hover {
258
+ background: var(--border);
259
+ color: var(--fg);
260
+ }
261
+
262
+ /* --- 9. Main Content --- */
263
+ .main-content {
264
+ flex: 1;
265
+ overflow: auto;
266
+ padding: 24px 32px;
267
+ background: var(--bg);
268
+ }
269
+
270
+ /* --- 9b. Content Header --- */
271
+ .content-header {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 12px;
275
+ padding-bottom: 20px;
276
+ margin-bottom: 4px;
277
+ border-bottom: 1px solid var(--border-subtle);
278
+
279
+ /* Sticky behavior */
280
+ position: sticky;
281
+ top: -24px; /* Negative of .main-content padding-top (24px) */
282
+ z-index: 10;
283
+ background: var(--bg);
284
+ padding-top: 24px; /* Compensate: absorb .main-content's top padding */
285
+ margin-top: -24px; /* Pull up into .main-content padding area */
286
+ }
287
+
288
+ .content-header--scrolled {
289
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
290
+ border-bottom-color: transparent;
291
+ }
292
+
293
+ [data-theme="dark"] .content-header--scrolled {
294
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
295
+ }
296
+
297
+ .content-header-back {
298
+ display: flex;
299
+ align-items: center;
300
+ justify-content: center;
301
+ width: 32px;
302
+ height: 32px;
303
+ border: 1px solid var(--border);
304
+ border-radius: 8px;
305
+ background: var(--surface);
306
+ color: var(--text-secondary);
307
+ cursor: pointer;
308
+ transition: all 0.15s ease;
309
+ flex-shrink: 0;
310
+ }
311
+
312
+ .content-header-back:hover {
313
+ background: var(--bg-hover);
314
+ color: var(--text-primary);
315
+ border-color: var(--text-secondary);
316
+ }
317
+
318
+ .content-header-title {
319
+ font-size: 1.25rem;
320
+ font-weight: 600;
321
+ color: var(--text-primary);
322
+ margin: 0;
323
+ letter-spacing: -0.01em;
324
+ line-height: 1.3;
325
+ }
326
+
327
+ .content-header-actions {
328
+ margin-left: auto;
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 10px;
332
+ }
333
+
334
+ .beads-db-path {
335
+ font-size: 0.75rem;
336
+ color: var(--fg);
337
+ opacity: 0.6;
338
+ text-align: right;
339
+ line-height: 1.4;
340
+ }
341
+ .beads-db-path svg {
342
+ vertical-align: -2px;
343
+ opacity: 0.7;
344
+ }
345
+ .beads-db-path code {
346
+ font-size: 0.7rem;
347
+ opacity: 0.9;
348
+ }
349
+
350
+ .action-btn {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ gap: 6px;
354
+ padding: 6px 14px;
355
+ border: 1px solid var(--border);
356
+ border-radius: var(--radius);
357
+ background: var(--bg-secondary);
358
+ color: var(--fg);
359
+ font-size: 13px;
360
+ font-weight: 500;
361
+ cursor: pointer;
362
+ transition: background var(--transition-fast), border-color var(--transition-fast);
363
+ }
364
+
365
+ .action-btn:hover {
366
+ background: var(--border);
367
+ }
368
+
369
+ .action-btn--danger {
370
+ border-color: var(--status-error);
371
+ color: var(--status-error);
372
+ }
373
+
374
+ .action-btn--danger:hover {
375
+ background: var(--status-error);
376
+ color: #ffffff;
377
+ }
378
+
379
+ .action-btn--primary {
380
+ border-color: var(--accent);
381
+ color: var(--accent);
382
+ }
383
+
384
+ .action-btn--primary:hover {
385
+ background: var(--accent);
386
+ color: #ffffff;
387
+ }
388
+
389
+ .action-btn:disabled {
390
+ opacity: 0.6;
391
+ cursor: not-allowed;
392
+ }
393
+
394
+ .action-btn:disabled:hover {
395
+ background: var(--bg-secondary);
396
+ color: inherit;
397
+ }
398
+
399
+ .error-dialog-body {
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 16px;
403
+ padding: 8px 0;
404
+ }
405
+ .error-dialog-body p {
406
+ margin: 0;
407
+ font-size: 14px;
408
+ line-height: 1.5;
409
+ }
410
+ .error-dialog-icon {
411
+ color: var(--status-error);
412
+ flex-shrink: 0;
413
+ }
414
+
415
+ /* --- 10. Run Header --- */
416
+ .run-header {
417
+ display: flex;
418
+ align-items: flex-start;
419
+ justify-content: space-between;
420
+ padding: 16px 0;
421
+ margin-bottom: 16px;
422
+ border-bottom: 1px solid var(--border-subtle);
423
+ }
424
+
425
+ .run-header-left {
426
+ display: flex;
427
+ align-items: center;
428
+ gap: 12px;
429
+ }
430
+
431
+ .run-title {
432
+ font-size: 22px;
433
+ font-weight: 600;
434
+ color: var(--fg);
435
+ letter-spacing: -0.01em;
436
+ }
437
+
438
+ .run-header-right {
439
+ display: flex;
440
+ align-items: center;
441
+ gap: 16px;
442
+ }
443
+
444
+ .run-meta {
445
+ font-size: 13px;
446
+ color: var(--muted);
447
+ }
448
+
449
+ .meta-label {
450
+ font-weight: 500;
451
+ color: var(--fg);
452
+ opacity: 0.7;
453
+ }
454
+
455
+ .meta-value {
456
+ font-weight: 600;
457
+ color: var(--fg);
458
+ }
459
+
460
+ .run-pr-link {
461
+ color: var(--accent);
462
+ text-decoration: none;
463
+ font-weight: 500;
464
+ }
465
+
466
+ .run-pr-link:hover {
467
+ text-decoration: underline;
468
+ }
469
+
470
+ .run-meta-grid {
471
+ display: flex;
472
+ flex-direction: column;
473
+ gap: 6px;
474
+ padding: 12px 16px;
475
+ background: var(--bg-hover);
476
+ border-radius: var(--radius-md);
477
+ margin-bottom: 8px;
478
+ font-size: 13px;
479
+ color: var(--muted);
480
+ font-variant-numeric: tabular-nums;
481
+ }
482
+
483
+ .run-meta-row {
484
+ display: flex;
485
+ flex-wrap: wrap;
486
+ gap: 4px 20px;
487
+ }
488
+
489
+ .timing-strip {
490
+ display: flex;
491
+ flex-wrap: wrap;
492
+ gap: 4px 20px;
493
+ font-size: 13px;
494
+ color: var(--muted);
495
+ font-variant-numeric: tabular-nums;
496
+ }
497
+
498
+ .timing-strip-item {
499
+ white-space: nowrap;
500
+ }
501
+
502
+ .run-card .timing-strip {
503
+ font-size: 12px;
504
+ gap: 6px 16px;
505
+ padding-left: 26px;
506
+ }
507
+
508
+ .stage-detail .timing-strip {
509
+ margin-bottom: 8px;
510
+ padding-bottom: 8px;
511
+ border-bottom: 1px solid var(--border);
512
+ }
513
+
514
+ .run-info-section {
515
+ padding: 12px 16px;
516
+ background: var(--bg-hover);
517
+ border-radius: var(--radius-md);
518
+ margin-bottom: 8px;
519
+ display: flex;
520
+ flex-direction: column;
521
+ gap: 6px;
522
+ }
523
+
524
+ .run-branch {
525
+ display: flex;
526
+ align-items: center;
527
+ gap: 6px;
528
+ font-size: 13px;
529
+ }
530
+
531
+ .pipeline-cost-strip {
532
+ display: flex;
533
+ flex-wrap: wrap;
534
+ gap: 4px 20px;
535
+ font-size: 13px;
536
+ font-weight: 600;
537
+ color: var(--fg);
538
+ }
539
+
540
+ /* Pipeline timing bar */
541
+ .pipeline-timing-bar-container {
542
+ margin-top: 8px;
543
+ }
544
+
545
+ .pipeline-timing-bar-label {
546
+ font-size: 13px;
547
+ font-weight: 600;
548
+ margin-bottom: 4px;
549
+ }
550
+
551
+ .pipeline-timing-bar {
552
+ display: flex;
553
+ height: 22px;
554
+ border-radius: 6px;
555
+ overflow: hidden;
556
+ background: var(--surface);
557
+ }
558
+
559
+ .timing-bar-segment {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ min-width: 0;
564
+ transition: opacity 0.15s;
565
+ cursor: default;
566
+ }
567
+
568
+ .timing-bar-segment:hover {
569
+ opacity: 0.85;
570
+ }
571
+
572
+ .timing-bar-thinking {
573
+ background: var(--status-blocked, #3b82f6);
574
+ }
575
+
576
+ .timing-bar-tools {
577
+ background: var(--status-in-progress, #f59e0b);
578
+ }
579
+
580
+ .timing-bar-rest {
581
+ background: var(--muted, #94a3b8);
582
+ opacity: 0.4;
583
+ }
584
+
585
+ .timing-bar-segment-text {
586
+ font-size: 11px;
587
+ font-weight: 600;
588
+ color: #fff;
589
+ white-space: nowrap;
590
+ overflow: hidden;
591
+ text-overflow: ellipsis;
592
+ padding: 0 6px;
593
+ text-shadow: 0 1px 2px rgba(0,0,0,0.3);
594
+ }
595
+
596
+ .pipeline-timing-bar-legend {
597
+ display: flex;
598
+ flex-wrap: wrap;
599
+ gap: 4px 16px;
600
+ margin-top: 6px;
601
+ font-size: 12px;
602
+ }
603
+
604
+ .timing-bar-legend-item {
605
+ display: flex;
606
+ align-items: center;
607
+ gap: 4px;
608
+ }
609
+
610
+ .timing-bar-legend-swatch {
611
+ width: 10px;
612
+ height: 10px;
613
+ border-radius: 2px;
614
+ }
615
+
616
+ .timing-bar-legend-label {
617
+ color: var(--fg);
618
+ font-weight: 500;
619
+ }
620
+
621
+ .timing-bar-legend-value {
622
+ color: var(--muted);
623
+ }
624
+
625
+ .stage-totals-strip {
626
+ display: flex;
627
+ gap: 20px;
628
+ padding: 6px 0 2px;
629
+ font-size: 13px;
630
+ font-weight: 600;
631
+ color: var(--fg);
632
+ }
633
+
634
+ .stage-totals-item {
635
+ display: inline-flex;
636
+ align-items: center;
637
+ gap: 4px;
638
+ }
639
+
640
+ .stage-info-strip {
641
+ display: flex;
642
+ flex-wrap: wrap;
643
+ gap: 4px 20px;
644
+ font-size: 13px;
645
+ color: var(--muted);
646
+ padding: 4px 0;
647
+ }
648
+
649
+ .stage-info-item {
650
+ display: inline-flex;
651
+ align-items: center;
652
+ gap: 4px;
653
+ white-space: nowrap;
654
+ }
655
+
656
+ .text-muted {
657
+ color: var(--muted);
658
+ opacity: 0.7;
659
+ }
660
+
661
+ .iteration-detail .timing-strip {
662
+ margin-bottom: 8px;
663
+ padding-bottom: 8px;
664
+ border-bottom: 1px solid var(--border);
665
+ }
666
+
667
+ /* --- 11. Stage Timeline --- */
668
+ .stage-timeline {
669
+ display: flex;
670
+ align-items: center;
671
+ justify-content: safe center;
672
+ padding: 28px 16px;
673
+ gap: 0;
674
+ overflow-x: auto;
675
+ }
676
+
677
+ .stage-node {
678
+ display: flex;
679
+ flex-direction: column;
680
+ align-items: center;
681
+ gap: 8px;
682
+ position: relative;
683
+ min-width: 90px;
684
+ }
685
+
686
+ .stage-icon {
687
+ width: 52px;
688
+ height: 52px;
689
+ border-radius: 50%;
690
+ display: flex;
691
+ align-items: center;
692
+ justify-content: center;
693
+ font-size: 18px;
694
+ border: 3px solid var(--border);
695
+ background: var(--bg);
696
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast);
697
+ }
698
+
699
+ .stage-icon svg {
700
+ width: 22px;
701
+ height: 22px;
702
+ }
703
+
704
+ .stage-node.status-pending .stage-icon {
705
+ border-color: var(--status-pending);
706
+ }
707
+
708
+ .stage-node.status-in-progress .stage-icon {
709
+ border-color: var(--status-in-progress);
710
+ box-shadow: 0 0 0 4px rgba(245, 158, 11, 0.15);
711
+ }
712
+
713
+ .stage-node.status-completed .stage-icon {
714
+ border-color: var(--status-completed);
715
+ background: var(--status-completed);
716
+ color: #ffffff;
717
+ transform: scale(1.05);
718
+ }
719
+
720
+ .stage-node.status-error .stage-icon {
721
+ border-color: var(--status-error);
722
+ box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.15);
723
+ }
724
+
725
+ .stage-node.status-interrupted .stage-icon {
726
+ border-color: var(--status-in-progress);
727
+ opacity: 0.6;
728
+ }
729
+
730
+ .stage-label {
731
+ font-size: 11px;
732
+ font-weight: 500;
733
+ color: var(--muted);
734
+ text-align: center;
735
+ white-space: nowrap;
736
+ text-transform: uppercase;
737
+ letter-spacing: 0.04em;
738
+ }
739
+
740
+ /* --- 12. Spin Animation --- */
741
+ .icon-spin {
742
+ animation: icon-spin 1.5s linear infinite;
743
+ }
744
+
745
+ @keyframes icon-spin {
746
+ from { transform: rotate(0deg); }
747
+ to { transform: rotate(360deg); }
748
+ }
749
+
750
+ /* --- 13. Stage Connector --- */
751
+ .stage-connector {
752
+ width: 36px;
753
+ height: 4px;
754
+ background: var(--border);
755
+ border-radius: 2px;
756
+ flex-shrink: 0;
757
+ align-self: center;
758
+ margin-bottom: 24px;
759
+ transition: background var(--transition-fast);
760
+ }
761
+
762
+ .stage-connector.completed {
763
+ background: var(--status-completed);
764
+ }
765
+
766
+ /* --- 13b. Prompt Panel --- */
767
+ .run-prompt-panel {
768
+ margin-bottom: 16px;
769
+ }
770
+
771
+ .run-prompt-summary {
772
+ font-size: 13px;
773
+ font-weight: 500;
774
+ color: var(--muted);
775
+ text-transform: uppercase;
776
+ letter-spacing: 0.04em;
777
+ }
778
+
779
+ .run-prompt-body {
780
+ font-size: 13px;
781
+ color: var(--fg);
782
+ line-height: 1.6;
783
+ white-space: pre-wrap;
784
+ word-break: break-word;
785
+ max-height: 400px;
786
+ overflow-y: auto;
787
+ padding: 8px 0;
788
+ }
789
+
790
+ /* --- 14. Stage Detail & Panel --- */
791
+ .stage-panels {
792
+ display: flex;
793
+ flex-direction: column;
794
+ gap: 8px;
795
+ margin-top: 16px;
796
+ }
797
+
798
+ sl-details.stage-panel {
799
+ --border-color: var(--border-subtle);
800
+ --border-radius: var(--radius-lg);
801
+ }
802
+
803
+ sl-details.stage-panel::part(base) {
804
+ border: 1px solid var(--border-subtle);
805
+ border-radius: var(--radius-lg);
806
+ background: var(--bg-secondary);
807
+ box-shadow: var(--shadow-sm);
808
+ }
809
+
810
+ sl-details.stage-panel::part(header) {
811
+ padding: 12px 16px;
812
+ }
813
+
814
+ sl-details.stage-panel::part(content) {
815
+ padding: 0 16px 16px;
816
+ }
817
+
818
+ .stage-content-wrapper {
819
+ position: relative;
820
+ }
821
+
822
+ .stage-copy-btn {
823
+ position: absolute;
824
+ top: 0;
825
+ right: 0;
826
+ display: inline-flex;
827
+ align-items: center;
828
+ gap: 4px;
829
+ padding: 2px 8px;
830
+ font-size: 11px;
831
+ font-family: inherit;
832
+ color: var(--fg-muted);
833
+ background: transparent;
834
+ border: 1px solid var(--border-subtle);
835
+ border-radius: var(--radius-sm);
836
+ cursor: pointer;
837
+ transition: color 0.15s, border-color 0.15s;
838
+ z-index: 1;
839
+ }
840
+
841
+ .stage-copy-btn:hover {
842
+ color: var(--fg);
843
+ border-color: var(--fg-muted);
844
+ }
845
+
846
+ .stage-copy-btn svg {
847
+ flex-shrink: 0;
848
+ }
849
+
850
+ .stage-panel-header {
851
+ display: flex;
852
+ align-items: center;
853
+ gap: 10px;
854
+ width: 100%;
855
+ }
856
+
857
+ .stage-panel-icon {
858
+ display: flex;
859
+ align-items: center;
860
+ }
861
+
862
+ .stage-panel-icon svg {
863
+ width: 16px;
864
+ height: 16px;
865
+ }
866
+
867
+ .stage-panel-label {
868
+ font-weight: 500;
869
+ font-size: 14px;
870
+ }
871
+
872
+ .stage-panel-meta {
873
+ display: flex;
874
+ gap: 12px;
875
+ margin-left: auto;
876
+ margin-right: 8px;
877
+ font-size: 12px;
878
+ color: var(--muted);
879
+ font-variant-numeric: tabular-nums;
880
+ }
881
+
882
+ .stage-meta-item {
883
+ display: inline-flex;
884
+ align-items: center;
885
+ gap: 4px;
886
+ white-space: nowrap;
887
+ }
888
+
889
+ .stage-meta-icon {
890
+ display: inline-flex;
891
+ opacity: 0.6;
892
+ }
893
+
894
+ .stage-meta-iteration {
895
+ color: var(--status-in-progress);
896
+ font-weight: 600;
897
+ }
898
+
899
+ .stage-detail {
900
+ padding: 4px 0;
901
+ }
902
+
903
+ .detail-row {
904
+ padding: 4px 0;
905
+ font-size: 13px;
906
+ color: var(--muted);
907
+ }
908
+
909
+ .detail-label {
910
+ font-weight: 500;
911
+ color: var(--fg);
912
+ opacity: 0.7;
913
+ margin-right: 4px;
914
+ }
915
+
916
+ .detail-error {
917
+ color: var(--status-error);
918
+ }
919
+
920
+ /* --- 15. Loop Indicator --- */
921
+ .loop-indicator {
922
+ position: absolute;
923
+ top: -4px;
924
+ right: 8px;
925
+ display: flex;
926
+ align-items: center;
927
+ gap: 2px;
928
+ font-size: 10px;
929
+ font-weight: 600;
930
+ background: var(--accent);
931
+ color: #ffffff;
932
+ padding: 2px 6px;
933
+ border-radius: 10px;
934
+ line-height: 1.3;
935
+ }
936
+
937
+ /* --- 16. Milestone Marker --- */
938
+ .milestone-marker {
939
+ position: absolute;
940
+ bottom: -18px;
941
+ left: 50%;
942
+ transform: translateX(-50%);
943
+ color: var(--status-in-progress);
944
+ }
945
+
946
+ /* --- 17. Log Viewer (Log History) --- */
947
+ .log-history-container {
948
+ margin-top: 20px;
949
+ }
950
+
951
+ sl-details.log-history-panel::part(base) {
952
+ border: 1px solid var(--border-subtle);
953
+ border-radius: var(--radius-lg);
954
+ background: var(--bg-secondary);
955
+ box-shadow: var(--shadow-sm);
956
+ }
957
+
958
+ sl-details.log-history-panel::part(header) {
959
+ padding: 12px 16px;
960
+ }
961
+
962
+ sl-details.log-history-panel::part(content) {
963
+ padding: 0;
964
+ }
965
+
966
+ .log-history-header {
967
+ display: flex;
968
+ align-items: center;
969
+ gap: 10px;
970
+ width: 100%;
971
+ }
972
+
973
+ .log-history-icon {
974
+ display: flex;
975
+ align-items: center;
976
+ color: var(--muted);
977
+ }
978
+
979
+ .log-history-title {
980
+ font-weight: 600;
981
+ font-size: 14px;
982
+ color: var(--fg);
983
+ text-transform: uppercase;
984
+ letter-spacing: 0.04em;
985
+ }
986
+
987
+ .log-history-body {
988
+ border-top: 1px solid var(--border-subtle);
989
+ padding: 0 16px 16px;
990
+ }
991
+
992
+ .log-history-empty {
993
+ display: flex;
994
+ flex-direction: column;
995
+ align-items: center;
996
+ justify-content: center;
997
+ padding: 40px 24px;
998
+ color: var(--muted);
999
+ text-align: center;
1000
+ gap: 12px;
1001
+ }
1002
+
1003
+ .log-history-empty-icon {
1004
+ display: flex;
1005
+ align-items: center;
1006
+ opacity: 0.4;
1007
+ }
1008
+
1009
+ .log-history-empty p {
1010
+ margin: 0;
1011
+ font-size: 13px;
1012
+ line-height: 1.5;
1013
+ }
1014
+
1015
+ .log-controls {
1016
+ display: flex;
1017
+ align-items: center;
1018
+ gap: 10px;
1019
+ padding: 10px 0;
1020
+ }
1021
+
1022
+ .log-controls sl-select {
1023
+ min-width: 160px;
1024
+ }
1025
+
1026
+ .log-controls .terminal-copy-btn {
1027
+ margin-left: auto;
1028
+ }
1029
+
1030
+ .log-controls sl-input {
1031
+ flex: 1;
1032
+ min-width: 140px;
1033
+ }
1034
+
1035
+ .log-controls sl-input [slot="prefix"] {
1036
+ display: flex;
1037
+ align-items: center;
1038
+ padding-left: 4px;
1039
+ }
1040
+
1041
+ .log-terminal-wrapper {
1042
+ border-radius: var(--radius-lg);
1043
+ overflow: hidden;
1044
+ border: 1px solid var(--border);
1045
+ box-shadow: var(--shadow-md);
1046
+ }
1047
+
1048
+ .log-terminal {
1049
+ height: 420px;
1050
+ background: var(--log-bg);
1051
+ }
1052
+
1053
+ /* xterm.js overrides */
1054
+ .log-terminal .xterm-viewport::-webkit-scrollbar {
1055
+ width: 8px;
1056
+ }
1057
+
1058
+ .log-terminal .xterm-viewport::-webkit-scrollbar-track {
1059
+ background: transparent;
1060
+ }
1061
+
1062
+ .log-terminal .xterm-viewport::-webkit-scrollbar-thumb {
1063
+ background: #334155;
1064
+ border-radius: 4px;
1065
+ }
1066
+
1067
+ .log-terminal .xterm-viewport::-webkit-scrollbar-thumb:hover {
1068
+ background: #475569;
1069
+ }
1070
+
1071
+ /* --- 18. Status Badge --- */
1072
+ .status-badge {
1073
+ display: inline-flex;
1074
+ align-items: center;
1075
+ gap: 5px;
1076
+ padding: 3px 10px;
1077
+ border-radius: 12px;
1078
+ font-size: 11px;
1079
+ font-weight: 600;
1080
+ text-transform: uppercase;
1081
+ letter-spacing: 0.04em;
1082
+ }
1083
+
1084
+ .status-badge svg {
1085
+ width: 12px;
1086
+ height: 12px;
1087
+ }
1088
+
1089
+ .status-pending {
1090
+ color: var(--status-pending);
1091
+ }
1092
+
1093
+ .status-in-progress {
1094
+ color: var(--status-in-progress);
1095
+ }
1096
+
1097
+ .status-completed {
1098
+ color: var(--status-completed);
1099
+ }
1100
+
1101
+ .status-error {
1102
+ color: var(--status-error);
1103
+ }
1104
+
1105
+ .status-interrupted {
1106
+ color: var(--status-in-progress);
1107
+ opacity: 0.6;
1108
+ }
1109
+
1110
+ .status-running {
1111
+ color: var(--status-running);
1112
+ }
1113
+
1114
+ .status-paused {
1115
+ color: var(--status-paused);
1116
+ }
1117
+
1118
+ .status-failed {
1119
+ color: var(--status-failed);
1120
+ }
1121
+
1122
+ .status-resuming {
1123
+ color: var(--status-resuming);
1124
+ }
1125
+
1126
+ /* --- 18b. Control Buttons --- */
1127
+ .action-btn--amber {
1128
+ border-color: var(--status-paused);
1129
+ color: var(--status-paused);
1130
+ }
1131
+
1132
+ .action-btn--amber:hover {
1133
+ background: var(--status-paused);
1134
+ color: #ffffff;
1135
+ }
1136
+
1137
+ .action-btn--green {
1138
+ border-color: var(--status-completed);
1139
+ color: var(--status-completed);
1140
+ }
1141
+
1142
+ .action-btn--green:hover {
1143
+ background: var(--status-completed);
1144
+ color: #ffffff;
1145
+ }
1146
+
1147
+ .action-btn--red {
1148
+ border-color: var(--status-failed);
1149
+ color: var(--status-failed);
1150
+ }
1151
+
1152
+ .action-btn--red:hover {
1153
+ background: var(--status-failed);
1154
+ color: #ffffff;
1155
+ }
1156
+
1157
+ /* --- 19. Connection Indicator --- */
1158
+ .connection-indicator {
1159
+ display: flex;
1160
+ align-items: center;
1161
+ gap: 6px;
1162
+ font-size: 11px;
1163
+ color: var(--muted);
1164
+ }
1165
+
1166
+ .conn-dot {
1167
+ width: 8px;
1168
+ height: 8px;
1169
+ border-radius: 50%;
1170
+ flex-shrink: 0;
1171
+ }
1172
+
1173
+ .connection-indicator.connected .conn-dot {
1174
+ background: var(--status-completed);
1175
+ }
1176
+
1177
+ .connection-indicator.disconnected .conn-dot {
1178
+ background: var(--status-error);
1179
+ }
1180
+
1181
+ .connection-indicator.reconnecting .conn-dot {
1182
+ background: var(--status-in-progress);
1183
+ animation: conn-blink 1.2s ease-in-out infinite;
1184
+ }
1185
+
1186
+ @keyframes conn-blink {
1187
+ 0%, 100% { opacity: 1; }
1188
+ 50% { opacity: 0.3; }
1189
+ }
1190
+
1191
+ /* --- 20. Run List & Run Card --- */
1192
+ .run-list {
1193
+ list-style: none;
1194
+ display: flex;
1195
+ flex-direction: column;
1196
+ gap: 8px;
1197
+ }
1198
+
1199
+ .run-card {
1200
+ display: flex;
1201
+ flex-direction: column;
1202
+ gap: 10px;
1203
+ padding: 14px 18px;
1204
+ border: 1px solid var(--border-subtle);
1205
+ border-radius: var(--radius-lg);
1206
+ cursor: pointer;
1207
+ background: var(--surface);
1208
+ transition: background var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast);
1209
+ }
1210
+
1211
+ .run-card:hover {
1212
+ background: var(--bg-hover);
1213
+ box-shadow: var(--shadow-md);
1214
+ transform: translateY(-1px);
1215
+ }
1216
+
1217
+ .run-card-top {
1218
+ display: flex;
1219
+ align-items: center;
1220
+ gap: 10px;
1221
+ }
1222
+
1223
+ .run-card-status {
1224
+ display: flex;
1225
+ align-items: center;
1226
+ flex-shrink: 0;
1227
+ }
1228
+
1229
+ .run-card-title {
1230
+ font-weight: 500;
1231
+ font-size: 14px;
1232
+ color: var(--fg);
1233
+ white-space: nowrap;
1234
+ overflow: hidden;
1235
+ text-overflow: ellipsis;
1236
+ flex: 1;
1237
+ min-width: 0;
1238
+ }
1239
+
1240
+ .run-card-meta {
1241
+ display: flex;
1242
+ flex-wrap: wrap;
1243
+ gap: 6px 16px;
1244
+ padding-left: 26px;
1245
+ font-size: 12px;
1246
+ color: var(--muted);
1247
+ font-variant-numeric: tabular-nums;
1248
+ }
1249
+
1250
+ .run-card-stages {
1251
+ display: flex;
1252
+ flex-wrap: wrap;
1253
+ gap: 5px;
1254
+ padding-left: 26px;
1255
+ }
1256
+
1257
+ .run-card-stage-badge {
1258
+ font-size: 10px;
1259
+ }
1260
+
1261
+ .run-card-stage-badge::part(base) {
1262
+ font-size: 10px;
1263
+ padding: 2px 8px;
1264
+ letter-spacing: 0.03em;
1265
+ }
1266
+
1267
+ /* Status-colored left border accent on run cards */
1268
+ .run-card.status-running { border-left: 3px solid var(--status-running); }
1269
+ .run-card.status-resuming { border-left: 3px solid var(--status-resuming); }
1270
+ .run-card.status-paused { border-left: 3px solid var(--status-paused); }
1271
+ .run-card.status-completed { border-left: 3px solid var(--status-completed); }
1272
+ .run-card.status-failed { border-left: 3px solid var(--status-failed); }
1273
+ .run-card.status-pending { border-left: 3px solid var(--status-pending); }
1274
+
1275
+ /* --- 21. Dashboard --- */
1276
+ .dashboard {
1277
+ padding: 0;
1278
+ }
1279
+
1280
+ .dashboard-section-title {
1281
+ display: flex;
1282
+ align-items: baseline;
1283
+ gap: 12px;
1284
+ font-size: 14px;
1285
+ font-weight: 600;
1286
+ margin: 28px 0 12px;
1287
+ text-transform: uppercase;
1288
+ letter-spacing: 0.04em;
1289
+ color: var(--muted);
1290
+ }
1291
+ .dashboard-view-all {
1292
+ font-size: 12px;
1293
+ font-weight: 500;
1294
+ text-transform: none;
1295
+ letter-spacing: normal;
1296
+ color: var(--accent);
1297
+ cursor: pointer;
1298
+ }
1299
+ .dashboard-view-all:hover {
1300
+ text-decoration: underline;
1301
+ }
1302
+
1303
+ .dashboard-stats {
1304
+ display: grid;
1305
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1306
+ gap: 14px;
1307
+ }
1308
+
1309
+ /* --- 22. Stat Card --- */
1310
+ .stat-card {
1311
+ display: flex;
1312
+ align-items: center;
1313
+ gap: 14px;
1314
+ padding: 18px 20px;
1315
+ border: 1px solid var(--border-subtle);
1316
+ border-radius: var(--radius-lg);
1317
+ background: var(--surface);
1318
+ box-shadow: var(--shadow-sm);
1319
+ transition: box-shadow var(--transition-fast), transform var(--transition-fast);
1320
+ }
1321
+
1322
+ .stat-card:hover {
1323
+ box-shadow: var(--shadow-md);
1324
+ transform: translateY(-1px);
1325
+ }
1326
+
1327
+ .stat-icon-ring {
1328
+ display: flex;
1329
+ align-items: center;
1330
+ justify-content: center;
1331
+ width: 40px;
1332
+ height: 40px;
1333
+ border-radius: 10px;
1334
+ flex-shrink: 0;
1335
+ background: var(--bg-hover);
1336
+ color: var(--muted);
1337
+ }
1338
+
1339
+ .stat-total .stat-icon-ring { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
1340
+ .stat-active .stat-icon-ring { background: color-mix(in srgb, var(--status-in-progress) 12%, transparent); color: var(--status-in-progress); }
1341
+ .stat-completed .stat-icon-ring { background: color-mix(in srgb, var(--status-completed) 12%, transparent); color: var(--status-completed); }
1342
+ .stat-errors .stat-icon-ring { background: color-mix(in srgb, var(--status-error) 12%, transparent); color: var(--status-error); }
1343
+ .stat-cost-total .stat-icon-ring { background: color-mix(in srgb, #10b981 12%, transparent); color: #10b981; }
1344
+
1345
+ .stat-body {
1346
+ display: flex;
1347
+ flex-direction: column;
1348
+ min-width: 0;
1349
+ }
1350
+
1351
+ .stat-card .stat-number {
1352
+ font-size: 26px;
1353
+ font-weight: 700;
1354
+ color: var(--fg);
1355
+ line-height: 1.15;
1356
+ letter-spacing: -0.02em;
1357
+ }
1358
+
1359
+ .stat-card .stat-label {
1360
+ font-size: 12px;
1361
+ color: var(--muted);
1362
+ margin-top: 2px;
1363
+ text-transform: uppercase;
1364
+ letter-spacing: 0.04em;
1365
+ font-weight: 500;
1366
+ }
1367
+
1368
+
1369
+ /* --- 23. Empty State --- */
1370
+ .empty-state {
1371
+ display: flex;
1372
+ flex-direction: column;
1373
+ align-items: center;
1374
+ justify-content: center;
1375
+ padding: 48px 24px;
1376
+ color: var(--muted);
1377
+ text-align: center;
1378
+ font-size: 14px;
1379
+ gap: 8px;
1380
+ }
1381
+
1382
+ /* --- 24. Badge --- */
1383
+ .badge {
1384
+ display: inline-flex;
1385
+ align-items: center;
1386
+ justify-content: center;
1387
+ min-width: 20px;
1388
+ height: 20px;
1389
+ padding: 0 6px;
1390
+ border-radius: 10px;
1391
+ font-size: 11px;
1392
+ font-weight: 600;
1393
+ background: var(--border);
1394
+ color: var(--fg);
1395
+ line-height: 1;
1396
+ }
1397
+
1398
+ /* --- 25. Scrollbar Styling --- */
1399
+ .sidebar::-webkit-scrollbar,
1400
+ .main-content::-webkit-scrollbar {
1401
+ width: 6px;
1402
+ }
1403
+
1404
+ .sidebar::-webkit-scrollbar-track,
1405
+ .main-content::-webkit-scrollbar-track {
1406
+ background: transparent;
1407
+ }
1408
+
1409
+ .sidebar::-webkit-scrollbar-thumb,
1410
+ .main-content::-webkit-scrollbar-thumb {
1411
+ background: var(--border);
1412
+ border-radius: 3px;
1413
+ }
1414
+
1415
+ /* --- 26. Settings Page --- */
1416
+ .settings-page {
1417
+ padding: 0;
1418
+ }
1419
+
1420
+ .settings-page sl-tab-group {
1421
+ --indicator-color: var(--accent);
1422
+ }
1423
+
1424
+ .settings-page sl-tab::part(base) {
1425
+ font-size: 13px;
1426
+ font-weight: 500;
1427
+ padding: 10px 16px;
1428
+ gap: 6px;
1429
+ display: flex;
1430
+ align-items: center;
1431
+ }
1432
+
1433
+ .settings-page sl-tab svg {
1434
+ width: 14px;
1435
+ height: 14px;
1436
+ flex-shrink: 0;
1437
+ }
1438
+
1439
+ .settings-page sl-tab-panel::part(base) {
1440
+ padding: 20px 0 0;
1441
+ }
1442
+
1443
+ .settings-tab-content {
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ gap: 20px;
1447
+ }
1448
+
1449
+ .settings-section-title {
1450
+ font-size: 13px;
1451
+ font-weight: 600;
1452
+ text-transform: uppercase;
1453
+ letter-spacing: 0.04em;
1454
+ color: var(--muted);
1455
+ margin: 0;
1456
+ }
1457
+
1458
+ .settings-cards {
1459
+ display: grid;
1460
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
1461
+ gap: 12px;
1462
+ }
1463
+
1464
+ .settings-card {
1465
+ border: 1px solid var(--border-subtle);
1466
+ border-radius: var(--radius-lg);
1467
+ background: var(--bg-secondary);
1468
+ padding: 16px;
1469
+ box-shadow: var(--shadow-sm);
1470
+ }
1471
+
1472
+ .settings-card-header {
1473
+ display: flex;
1474
+ align-items: center;
1475
+ gap: 8px;
1476
+ margin-bottom: 14px;
1477
+ padding-bottom: 10px;
1478
+ border-bottom: 1px solid var(--border-subtle);
1479
+ }
1480
+
1481
+ .settings-card-icon {
1482
+ display: flex;
1483
+ align-items: center;
1484
+ color: var(--accent);
1485
+ }
1486
+
1487
+ .settings-card-title {
1488
+ font-size: 14px;
1489
+ font-weight: 600;
1490
+ color: var(--fg);
1491
+ text-transform: capitalize;
1492
+ }
1493
+
1494
+ .settings-card-body {
1495
+ display: flex;
1496
+ flex-direction: column;
1497
+ gap: 12px;
1498
+ }
1499
+
1500
+ .settings-field {
1501
+ display: flex;
1502
+ flex-direction: column;
1503
+ gap: 4px;
1504
+ }
1505
+
1506
+ .settings-label {
1507
+ font-size: 12px;
1508
+ font-weight: 500;
1509
+ color: var(--muted);
1510
+ text-transform: uppercase;
1511
+ letter-spacing: 0.03em;
1512
+ }
1513
+
1514
+ .settings-field-hint {
1515
+ font-size: 11px;
1516
+ color: var(--muted);
1517
+ margin-top: 2px;
1518
+ }
1519
+
1520
+ .settings-grid {
1521
+ display: grid;
1522
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1523
+ gap: 14px;
1524
+ }
1525
+
1526
+ .settings-switches {
1527
+ display: flex;
1528
+ flex-direction: column;
1529
+ gap: 8px;
1530
+ }
1531
+
1532
+ .settings-switch-row {
1533
+ display: flex;
1534
+ align-items: center;
1535
+ gap: 12px;
1536
+ padding: 6px 0;
1537
+ }
1538
+
1539
+ .settings-switch-desc {
1540
+ font-size: 12px;
1541
+ color: var(--muted);
1542
+ }
1543
+
1544
+ .settings-tab-actions {
1545
+ padding-top: 12px;
1546
+ border-top: 1px solid var(--border-subtle);
1547
+ display: flex;
1548
+ align-items: center;
1549
+ gap: 10px;
1550
+ }
1551
+
1552
+ .settings-tab-actions sl-button svg {
1553
+ width: 14px;
1554
+ height: 14px;
1555
+ }
1556
+
1557
+ /* Pipeline flow visualization */
1558
+ .pipeline-flow {
1559
+ display: flex;
1560
+ align-items: center;
1561
+ gap: 4px;
1562
+ padding: 16px 0;
1563
+ overflow-x: auto;
1564
+ }
1565
+
1566
+ .pipeline-stage-node {
1567
+ display: flex;
1568
+ flex-direction: column;
1569
+ align-items: center;
1570
+ gap: 4px;
1571
+ padding: 10px 14px;
1572
+ border: 1px solid var(--border-subtle);
1573
+ border-radius: var(--radius);
1574
+ background: var(--bg-secondary);
1575
+ min-width: 140px;
1576
+ transition: opacity 0.2s, border-color 0.2s, background 0.2s;
1577
+ }
1578
+
1579
+ .pipeline-stage-name {
1580
+ font-size: 12px;
1581
+ font-weight: 600;
1582
+ color: var(--fg);
1583
+ text-transform: uppercase;
1584
+ letter-spacing: 0.03em;
1585
+ }
1586
+
1587
+ .pipeline-stage-agent {
1588
+ font-size: 11px;
1589
+ color: var(--muted);
1590
+ }
1591
+
1592
+ .pipeline-arrow {
1593
+ display: flex;
1594
+ align-items: center;
1595
+ color: var(--muted);
1596
+ flex-shrink: 0;
1597
+ }
1598
+
1599
+ /* Pipeline stage states */
1600
+ .pipeline-stage-node--enabled {
1601
+ border-color: var(--sl-color-primary-300);
1602
+ background: color-mix(in srgb, var(--sl-color-primary-500) 8%, var(--bg-secondary));
1603
+ }
1604
+
1605
+ .pipeline-stage-node--disabled {
1606
+ opacity: 0.55;
1607
+ border-color: var(--border-subtle);
1608
+ background: var(--bg-secondary);
1609
+ }
1610
+
1611
+ .pipeline-stage-name--disabled {
1612
+ text-decoration: line-through;
1613
+ color: var(--muted);
1614
+ }
1615
+
1616
+ .pipeline-stage-header {
1617
+ display: flex;
1618
+ align-items: center;
1619
+ justify-content: space-between;
1620
+ width: 100%;
1621
+ gap: 8px;
1622
+ }
1623
+
1624
+ .pipeline-stage-field {
1625
+ width: 100%;
1626
+ margin-top: 4px;
1627
+ }
1628
+
1629
+ .pipeline-stage-field .settings-label {
1630
+ font-size: 10px;
1631
+ }
1632
+
1633
+ /* Dispatch table */
1634
+ .settings-dispatch-table {
1635
+ display: flex;
1636
+ flex-direction: column;
1637
+ gap: 8px;
1638
+ }
1639
+
1640
+ .settings-dispatch-row {
1641
+ display: grid;
1642
+ grid-template-columns: 120px 1fr;
1643
+ align-items: center;
1644
+ gap: 12px;
1645
+ }
1646
+
1647
+ .settings-dispatch-agent {
1648
+ font-size: 13px;
1649
+ font-weight: 500;
1650
+ color: var(--fg);
1651
+ text-transform: capitalize;
1652
+ }
1653
+
1654
+ /* Permissions list */
1655
+ .settings-permissions {
1656
+ display: flex;
1657
+ flex-direction: column;
1658
+ gap: 4px;
1659
+ }
1660
+
1661
+ .settings-perm-item {
1662
+ font-size: 13px;
1663
+ padding: 4px 8px;
1664
+ border-radius: var(--radius);
1665
+ background: var(--bg-tertiary);
1666
+ }
1667
+
1668
+ .settings-perm-item code {
1669
+ font-family: var(--sl-font-mono);
1670
+ font-size: 12px;
1671
+ }
1672
+
1673
+ .settings-perm-item--editable {
1674
+ display: flex;
1675
+ align-items: center;
1676
+ gap: 6px;
1677
+ }
1678
+
1679
+ .settings-perm-item--editable sl-input {
1680
+ flex: 1;
1681
+ }
1682
+
1683
+ .perm-remove-btn {
1684
+ font-size: 14px;
1685
+ color: var(--muted);
1686
+ cursor: pointer;
1687
+ }
1688
+
1689
+ .perm-remove-btn:hover {
1690
+ color: var(--danger, #e74c3c);
1691
+ }
1692
+
1693
+ .settings-muted {
1694
+ font-size: 13px;
1695
+ color: var(--muted);
1696
+ }
1697
+
1698
+ /* Pricing table */
1699
+ .pricing-table-wrap {
1700
+ overflow-x: auto;
1701
+ margin-bottom: 8px;
1702
+ }
1703
+
1704
+ .pricing-table {
1705
+ width: 100%;
1706
+ border-collapse: collapse;
1707
+ font-size: 13px;
1708
+ }
1709
+
1710
+ .pricing-table th,
1711
+ .pricing-table td {
1712
+ padding: 4px 6px;
1713
+ text-align: left;
1714
+ vertical-align: middle;
1715
+ border-bottom: 1px solid var(--border);
1716
+ }
1717
+
1718
+ /* Right-align number columns (all except the model name column) */
1719
+ .pricing-table th:not(:first-child),
1720
+ .pricing-table td:not(:first-child) {
1721
+ text-align: right;
1722
+ }
1723
+
1724
+ .pricing-table th {
1725
+ font-weight: 600;
1726
+ color: var(--muted);
1727
+ font-size: 11px;
1728
+ text-transform: uppercase;
1729
+ letter-spacing: 0.5px;
1730
+ }
1731
+
1732
+ .pricing-model-name {
1733
+ font-weight: 500;
1734
+ text-transform: capitalize;
1735
+ }
1736
+
1737
+ .pricing-table sl-input {
1738
+ min-width: 90px;
1739
+ max-width: 130px;
1740
+ }
1741
+
1742
+ .pricing-info {
1743
+ display: flex;
1744
+ gap: 16px;
1745
+ margin-bottom: 8px;
1746
+ }
1747
+
1748
+ /* Settings toast overlay */
1749
+ .settings-toast {
1750
+ position: fixed;
1751
+ top: 16px;
1752
+ right: 16px;
1753
+ z-index: 9999;
1754
+ max-width: 360px;
1755
+ }
1756
+
1757
+ /* Active state for settings button in sidebar */
1758
+ .theme-toggle-btn.active {
1759
+ background: var(--accent);
1760
+ color: #ffffff;
1761
+ border-color: var(--accent);
1762
+ }
1763
+
1764
+ /* --- 27. Iteration Tabs & Details --- */
1765
+
1766
+ /* Iteration tabs inside stage panels */
1767
+ .stage-panel sl-tab-group {
1768
+ --indicator-color: var(--accent);
1769
+ }
1770
+
1771
+ .stage-panel sl-tab::part(base) {
1772
+ font-size: 12px;
1773
+ padding: 6px 12px;
1774
+ gap: 4px;
1775
+ }
1776
+
1777
+ .stage-panel sl-tab-panel::part(base) {
1778
+ padding: 8px 0 0;
1779
+ }
1780
+
1781
+ .iter-status-icon {
1782
+ display: inline-flex;
1783
+ align-items: center;
1784
+ margin-left: 4px;
1785
+ }
1786
+
1787
+ .iter-status-icon svg {
1788
+ width: 12px;
1789
+ height: 12px;
1790
+ }
1791
+
1792
+ .iter-status-icon.success { color: var(--status-completed); }
1793
+ .iter-status-icon.failure { color: var(--status-error); }
1794
+ .iter-status-icon.in-progress { color: var(--status-in-progress); }
1795
+
1796
+ /* Iteration detail inside tab panel */
1797
+ .iteration-detail {
1798
+ padding: 4px 0;
1799
+ }
1800
+
1801
+ .iteration-detail .detail-row {
1802
+ padding: 3px 0;
1803
+ font-size: 13px;
1804
+ color: var(--muted);
1805
+ }
1806
+
1807
+ .iteration-trigger {
1808
+ display: inline-flex;
1809
+ align-items: center;
1810
+ gap: 4px;
1811
+ padding: 2px 8px;
1812
+ border-radius: 4px;
1813
+ font-size: 11px;
1814
+ font-weight: 500;
1815
+ background: var(--bg-tertiary);
1816
+ }
1817
+
1818
+ .iteration-outcome {
1819
+ display: inline-flex;
1820
+ align-items: center;
1821
+ gap: 4px;
1822
+ font-weight: 500;
1823
+ }
1824
+
1825
+ .iteration-outcome.success { color: var(--status-completed); }
1826
+ .iteration-outcome.failure { color: var(--status-error); }
1827
+
1828
+ /* --- Agent Prompt Section --- */
1829
+ sl-details.agent-prompt-section {
1830
+ margin-top: 12px;
1831
+ border-top: 1px solid var(--border-subtle);
1832
+ padding-top: 4px;
1833
+ }
1834
+
1835
+ sl-details.agent-prompt-section::part(base) {
1836
+ border: none;
1837
+ background: transparent;
1838
+ }
1839
+
1840
+ sl-details.agent-prompt-section::part(header) {
1841
+ padding: 6px 0;
1842
+ font-size: 12px;
1843
+ color: var(--muted);
1844
+ }
1845
+
1846
+ sl-details.agent-prompt-section::part(content) {
1847
+ padding: 0;
1848
+ }
1849
+
1850
+ .agent-prompt-header {
1851
+ display: flex;
1852
+ align-items: center;
1853
+ gap: 6px;
1854
+ font-size: 12px;
1855
+ font-weight: 500;
1856
+ color: var(--muted);
1857
+ }
1858
+
1859
+ .agent-prompt-block {
1860
+ margin-bottom: 12px;
1861
+ }
1862
+
1863
+ .agent-prompt-label-row {
1864
+ display: flex;
1865
+ align-items: center;
1866
+ justify-content: space-between;
1867
+ }
1868
+
1869
+ .copy-btn {
1870
+ display: inline-flex;
1871
+ align-items: center;
1872
+ gap: 4px;
1873
+ padding: 2px 8px;
1874
+ font-size: 11px;
1875
+ font-family: inherit;
1876
+ color: var(--fg-muted);
1877
+ background: transparent;
1878
+ border: 1px solid var(--border-subtle);
1879
+ border-radius: var(--radius-sm);
1880
+ cursor: pointer;
1881
+ transition: color 0.15s, border-color 0.15s;
1882
+ }
1883
+
1884
+ .copy-btn:hover {
1885
+ color: var(--fg);
1886
+ border-color: var(--fg-muted);
1887
+ }
1888
+
1889
+ .copy-btn svg {
1890
+ flex-shrink: 0;
1891
+ }
1892
+
1893
+ .agent-prompt-label {
1894
+ font-size: 11px;
1895
+ font-weight: 600;
1896
+ color: var(--muted);
1897
+ text-transform: uppercase;
1898
+ letter-spacing: 0.5px;
1899
+ margin-bottom: 4px;
1900
+ }
1901
+
1902
+ .agent-prompt-content {
1903
+ margin: 0;
1904
+ padding: 10px 12px;
1905
+ background: var(--bg-tertiary);
1906
+ border-radius: var(--radius-md);
1907
+ font-size: 12px;
1908
+ line-height: 1.5;
1909
+ color: var(--fg);
1910
+ white-space: pre-wrap;
1911
+ word-break: break-word;
1912
+ max-height: 300px;
1913
+ overflow-y: auto;
1914
+ }
1915
+
1916
+ /* Iteration selector in log controls */
1917
+ .log-controls sl-select:nth-of-type(2) {
1918
+ min-width: 140px;
1919
+ }
1920
+
1921
+ /* --- 27b. Live Output Panel --- */
1922
+ .live-output-container {
1923
+ margin-top: 20px;
1924
+ }
1925
+
1926
+ sl-details.live-output-panel::part(base) {
1927
+ border: 1px solid var(--border-subtle);
1928
+ border-radius: var(--radius-lg);
1929
+ background: var(--bg-secondary);
1930
+ box-shadow: var(--shadow-sm);
1931
+ }
1932
+
1933
+ sl-details.live-output-panel::part(header) {
1934
+ padding: 10px 16px;
1935
+ }
1936
+
1937
+ sl-details.live-output-panel::part(content) {
1938
+ padding: 0;
1939
+ }
1940
+
1941
+ .live-output-header {
1942
+ display: flex;
1943
+ align-items: center;
1944
+ gap: 10px;
1945
+ width: 100%;
1946
+ }
1947
+
1948
+ .live-output-icon {
1949
+ display: flex;
1950
+ align-items: center;
1951
+ color: var(--status-in-progress);
1952
+ }
1953
+
1954
+ .live-output-title {
1955
+ font-weight: 600;
1956
+ font-size: 14px;
1957
+ color: var(--fg);
1958
+ text-transform: uppercase;
1959
+ letter-spacing: 0.04em;
1960
+ }
1961
+
1962
+ .live-output-controls {
1963
+ display: flex;
1964
+ align-items: center;
1965
+ justify-content: flex-end;
1966
+ padding: 4px 12px;
1967
+ border-top: 1px solid var(--border-subtle);
1968
+ }
1969
+
1970
+ .live-output-terminal-wrapper {
1971
+ border-top: 1px solid var(--border-subtle);
1972
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1973
+ overflow: hidden;
1974
+ }
1975
+
1976
+ /* Shared terminal copy button */
1977
+ .terminal-copy-btn {
1978
+ display: inline-flex;
1979
+ align-items: center;
1980
+ gap: 4px;
1981
+ padding: 2px 8px;
1982
+ font-size: 11px;
1983
+ color: var(--fg-muted);
1984
+ background: transparent;
1985
+ border: 1px solid var(--border-subtle);
1986
+ border-radius: var(--radius-sm);
1987
+ cursor: pointer;
1988
+ transition: color 0.15s, border-color 0.15s;
1989
+ }
1990
+
1991
+ .terminal-copy-btn:hover {
1992
+ color: var(--fg);
1993
+ border-color: var(--border-default);
1994
+ }
1995
+
1996
+ .terminal-copy-btn.copy-success {
1997
+ color: var(--status-success);
1998
+ border-color: var(--status-success);
1999
+ }
2000
+
2001
+ .live-output-terminal {
2002
+ height: 280px;
2003
+ background: var(--log-bg);
2004
+ }
2005
+
2006
+ /* xterm.js overrides for live output */
2007
+ .live-output-terminal .xterm-viewport::-webkit-scrollbar {
2008
+ width: 8px;
2009
+ }
2010
+
2011
+ .live-output-terminal .xterm-viewport::-webkit-scrollbar-track {
2012
+ background: transparent;
2013
+ }
2014
+
2015
+ .live-output-terminal .xterm-viewport::-webkit-scrollbar-thumb {
2016
+ background: #334155;
2017
+ border-radius: 4px;
2018
+ }
2019
+
2020
+ .live-output-terminal .xterm-viewport::-webkit-scrollbar-thumb:hover {
2021
+ background: #475569;
2022
+ }
2023
+
2024
+ /* --- 27c. Run Detail Two-Column Layout --- */
2025
+ .run-detail-layout {
2026
+ display: flex;
2027
+ flex-direction: column;
2028
+ gap: 16px;
2029
+ }
2030
+
2031
+ .run-detail-layout__overview {
2032
+ min-width: 0;
2033
+ }
2034
+
2035
+ .run-detail-layout__stages {
2036
+ min-width: 0;
2037
+ display: flex;
2038
+ flex-direction: column;
2039
+ gap: 8px;
2040
+ }
2041
+
2042
+ .run-detail-layout__stages .stage-panels {
2043
+ margin-top: 0;
2044
+ }
2045
+
2046
+ .run-detail-column-header {
2047
+ font-size: 11px;
2048
+ font-weight: 600;
2049
+ text-transform: uppercase;
2050
+ letter-spacing: 0.06em;
2051
+ color: var(--muted);
2052
+ padding-bottom: 8px;
2053
+ border-bottom: 1px solid var(--border-subtle);
2054
+ }
2055
+
2056
+ .run-detail-layout__logs {
2057
+ min-width: 0;
2058
+ display: flex;
2059
+ flex-direction: column;
2060
+ gap: 8px;
2061
+ }
2062
+
2063
+ .run-detail-layout__logs > * {
2064
+ margin-top: 0;
2065
+ }
2066
+
2067
+ @media (min-width: 1800px) {
2068
+ .run-detail-layout {
2069
+ display: grid;
2070
+ grid-template-columns: 1fr 1fr;
2071
+ gap: 24px;
2072
+ align-items: start;
2073
+ }
2074
+
2075
+ .run-detail-layout__overview {
2076
+ grid-column: 1 / -1;
2077
+ }
2078
+
2079
+ .run-detail-layout__logs {
2080
+ position: sticky;
2081
+ top: 0;
2082
+ max-height: calc(100vh - 120px);
2083
+ overflow-y: auto;
2084
+ }
2085
+
2086
+ /* Subtle scrollbar for the sticky logs column */
2087
+ .run-detail-layout__logs::-webkit-scrollbar {
2088
+ width: 5px;
2089
+ }
2090
+
2091
+ .run-detail-layout__logs::-webkit-scrollbar-track {
2092
+ background: transparent;
2093
+ }
2094
+
2095
+ .run-detail-layout__logs::-webkit-scrollbar-thumb {
2096
+ background: var(--border);
2097
+ border-radius: 3px;
2098
+ }
2099
+ }
2100
+
2101
+ /* --- 28. Utility --- */
2102
+ .visually-hidden {
2103
+ position: absolute;
2104
+ width: 1px;
2105
+ height: 1px;
2106
+ padding: 0;
2107
+ margin: -1px;
2108
+ overflow: hidden;
2109
+ clip: rect(0, 0, 0, 0);
2110
+ border: 0;
2111
+ }
2112
+
2113
+ .truncate {
2114
+ overflow: hidden;
2115
+ text-overflow: ellipsis;
2116
+ white-space: nowrap;
2117
+ }
2118
+
2119
+ /* --- 29. Notification Banner --- */
2120
+ .notification-banner {
2121
+ display: flex;
2122
+ align-items: center;
2123
+ padding: 0.75rem 1rem;
2124
+ border-radius: 8px;
2125
+ gap: 0.75rem;
2126
+ margin-bottom: 1rem;
2127
+ }
2128
+
2129
+ .notification-banner--info {
2130
+ background: color-mix(in srgb, var(--accent) 8%, var(--bg));
2131
+ border: 1px solid color-mix(in srgb, var(--accent) 25%, var(--border));
2132
+ }
2133
+
2134
+ .notification-banner--warning {
2135
+ background: color-mix(in srgb, var(--status-in-progress) 8%, var(--bg));
2136
+ border: 1px solid color-mix(in srgb, var(--status-in-progress) 25%, var(--border));
2137
+ }
2138
+
2139
+ .notification-banner-text {
2140
+ flex: 1;
2141
+ font-size: 0.875rem;
2142
+ }
2143
+
2144
+ .notification-banner-dismiss {
2145
+ cursor: pointer;
2146
+ border: none;
2147
+ background: none;
2148
+ color: var(--muted);
2149
+ opacity: 0.6;
2150
+ padding: 4px;
2151
+ display: flex;
2152
+ align-items: center;
2153
+ transition: opacity var(--transition-fast);
2154
+ }
2155
+
2156
+ .notification-banner-dismiss:hover {
2157
+ opacity: 1;
2158
+ }
2159
+
2160
+ /* --- 30. New Pipeline Page --- */
2161
+ .new-run-page {
2162
+ max-width: 640px;
2163
+ margin: 0 auto;
2164
+ }
2165
+
2166
+ .new-run-header {
2167
+ display: flex;
2168
+ align-items: flex-start;
2169
+ justify-content: space-between;
2170
+ gap: 16px;
2171
+ margin-bottom: 24px;
2172
+ }
2173
+
2174
+ .new-run-header h2 {
2175
+ font-size: 1.5rem;
2176
+ font-weight: 700;
2177
+ margin-bottom: 4px;
2178
+ }
2179
+
2180
+ .new-run-header p {
2181
+ font-size: 14px;
2182
+ color: var(--muted);
2183
+ }
2184
+
2185
+ .new-run-form {
2186
+ display: flex;
2187
+ flex-direction: column;
2188
+ gap: 16px;
2189
+ }
2190
+
2191
+ .new-run-section {
2192
+ display: flex;
2193
+ flex-direction: column;
2194
+ gap: 16px;
2195
+ padding: 20px;
2196
+ border: 1px solid var(--border-subtle);
2197
+ border-radius: var(--radius-lg);
2198
+ background: var(--bg-secondary);
2199
+ }
2200
+
2201
+ .new-run-section-title {
2202
+ font-size: 14px;
2203
+ font-weight: 600;
2204
+ color: var(--muted);
2205
+ text-transform: uppercase;
2206
+ letter-spacing: 0.04em;
2207
+ margin: 0 0 4px;
2208
+ }
2209
+
2210
+ .new-run-advanced {
2211
+ display: flex;
2212
+ flex-direction: column;
2213
+ gap: 16px;
2214
+ }
2215
+
2216
+ .new-run-grid {
2217
+ display: grid;
2218
+ grid-template-columns: 1fr 1fr;
2219
+ gap: 16px;
2220
+ }
2221
+
2222
+ .new-run-actions {
2223
+ display: flex;
2224
+ flex-direction: column;
2225
+ align-items: flex-end;
2226
+ gap: 8px;
2227
+ flex-shrink: 0;
2228
+ }
2229
+
2230
+ .new-run-warning {
2231
+ font-size: 13px;
2232
+ color: var(--status-in-progress);
2233
+ font-weight: 500;
2234
+ }
2235
+
2236
+ .new-run-error {
2237
+ font-size: 13px;
2238
+ color: var(--status-error);
2239
+ font-weight: 500;
2240
+ }
2241
+
2242
+ /* Plan file autocomplete */
2243
+ .plan-autocomplete {
2244
+ position: relative;
2245
+ }
2246
+
2247
+ .plan-dropdown {
2248
+ position: absolute;
2249
+ top: 100%;
2250
+ left: 0;
2251
+ right: 0;
2252
+ max-height: 300px;
2253
+ overflow-y: auto;
2254
+ background: var(--bg);
2255
+ border: 1px solid var(--border);
2256
+ border-radius: var(--radius);
2257
+ box-shadow: var(--shadow-lg);
2258
+ z-index: 100;
2259
+ margin-top: 4px;
2260
+ }
2261
+
2262
+ .plan-group-header {
2263
+ padding: 6px 12px 4px;
2264
+ font-size: 10px;
2265
+ font-weight: 600;
2266
+ text-transform: uppercase;
2267
+ letter-spacing: 0.04em;
2268
+ color: var(--muted);
2269
+ background: var(--bg-secondary);
2270
+ border-bottom: 1px solid var(--border-subtle);
2271
+ }
2272
+
2273
+ .plan-item {
2274
+ padding: 8px 12px;
2275
+ font-size: 13px;
2276
+ cursor: pointer;
2277
+ transition: background var(--transition-fast);
2278
+ }
2279
+
2280
+ .plan-item:hover {
2281
+ background: var(--bg-tertiary);
2282
+ }
2283
+
2284
+ /* Sidebar new run button */
2285
+ .sidebar-new-run {
2286
+ padding: 8px 8px 4px;
2287
+ }
2288
+
2289
+ .sidebar-new-run-btn {
2290
+ display: flex;
2291
+ align-items: center;
2292
+ justify-content: center;
2293
+ gap: 8px;
2294
+ width: 100%;
2295
+ padding: 8px 12px;
2296
+ border: 2px dashed var(--accent);
2297
+ border-radius: var(--radius);
2298
+ background: transparent;
2299
+ color: var(--accent);
2300
+ font-size: 13px;
2301
+ font-weight: 600;
2302
+ font-family: inherit;
2303
+ cursor: pointer;
2304
+ transition: background var(--transition-fast), color var(--transition-fast);
2305
+ }
2306
+
2307
+ .sidebar-new-run-btn:hover {
2308
+ background: var(--accent);
2309
+ color: #ffffff;
2310
+ }
2311
+
2312
+ .sidebar.collapsed .sidebar-new-run-btn span {
2313
+ display: none;
2314
+ }
2315
+
2316
+ .sidebar.collapsed .sidebar-new-run-btn {
2317
+ padding: 8px;
2318
+ }
2319
+
2320
+ /* Stage restart button */
2321
+ .stage-restart-btn {
2322
+ padding: 8px 0 4px;
2323
+ display: flex;
2324
+ justify-content: flex-end;
2325
+ }
2326
+
2327
+ .stage-restart-btn sl-button svg {
2328
+ width: 14px;
2329
+ height: 14px;
2330
+ }
2331
+
2332
+ /* Confirmation dialog text */
2333
+ .confirm-dialog-body {
2334
+ font-size: 14px;
2335
+ line-height: 1.5;
2336
+ }
2337
+
2338
+ /* ============================================================
2339
+ Beads Integration Panel
2340
+ ============================================================ */
2341
+
2342
+ .beads-panel {
2343
+ display: flex;
2344
+ flex-direction: column;
2345
+ gap: 24px;
2346
+ padding: 0 0 40px;
2347
+ }
2348
+
2349
+ /* --- Filter bar --- */
2350
+
2351
+ .beads-filters {
2352
+ display: flex;
2353
+ align-items: center;
2354
+ gap: 12px;
2355
+ flex-wrap: wrap;
2356
+ }
2357
+
2358
+ .beads-filters sl-select {
2359
+ min-width: 160px;
2360
+ }
2361
+
2362
+ .beads-filter-count {
2363
+ margin-left: auto;
2364
+ font-size: 13px;
2365
+ color: var(--muted);
2366
+ }
2367
+
2368
+ /* --- Issue list --- */
2369
+
2370
+ .beads-issue-list {
2371
+ display: flex;
2372
+ flex-direction: column;
2373
+ gap: 8px;
2374
+ }
2375
+
2376
+ .beads-issue-row {
2377
+ display: grid;
2378
+ grid-template-columns: auto auto 1fr auto;
2379
+ align-items: start;
2380
+ gap: 10px 14px;
2381
+ padding: 14px 16px;
2382
+ background: var(--bg-secondary);
2383
+ border: 1px solid var(--border);
2384
+ border-radius: var(--radius);
2385
+ box-shadow: var(--shadow-sm);
2386
+ transition: box-shadow var(--transition-fast);
2387
+ }
2388
+
2389
+ .beads-issue-row:hover {
2390
+ box-shadow: var(--shadow-md);
2391
+ }
2392
+
2393
+ .beads-issue-body {
2394
+ display: flex;
2395
+ flex-direction: column;
2396
+ gap: 4px;
2397
+ min-width: 0;
2398
+ }
2399
+
2400
+ .beads-issue-title {
2401
+ font-weight: 600;
2402
+ font-size: 14px;
2403
+ white-space: nowrap;
2404
+ overflow: hidden;
2405
+ text-overflow: ellipsis;
2406
+ }
2407
+
2408
+ .beads-issue-excerpt {
2409
+ font-size: 12px;
2410
+ color: var(--muted);
2411
+ white-space: nowrap;
2412
+ overflow: hidden;
2413
+ text-overflow: ellipsis;
2414
+ }
2415
+
2416
+ .beads-issue-deps {
2417
+ display: flex;
2418
+ flex-wrap: wrap;
2419
+ gap: 4px;
2420
+ margin-top: 4px;
2421
+ }
2422
+
2423
+ .beads-dep-chip {
2424
+ display: inline-flex;
2425
+ align-items: center;
2426
+ gap: 3px;
2427
+ padding: 1px 7px;
2428
+ font-size: 11px;
2429
+ border-radius: 999px;
2430
+ background: var(--bg-tertiary);
2431
+ border: 1px solid var(--border);
2432
+ color: var(--muted);
2433
+ }
2434
+
2435
+ .beads-dep-chip--blocking {
2436
+ border-color: var(--status-blocked);
2437
+ color: var(--status-blocked);
2438
+ }
2439
+
2440
+ .beads-dep-chip--satisfied {
2441
+ border-color: var(--border);
2442
+ color: var(--muted);
2443
+ }
2444
+
2445
+ .beads-issue-actions {
2446
+ display: flex;
2447
+ align-items: flex-start;
2448
+ padding-top: 2px;
2449
+ }
2450
+
2451
+ /* --- Closed issue styling --- */
2452
+
2453
+ .beads-issue-row--closed { opacity: 0.55; }
2454
+ .beads-issue-row--closed .beads-issue-title {
2455
+ text-decoration: line-through;
2456
+ color: var(--muted);
2457
+ }
2458
+
2459
+ /* --- Run filter width --- */
2460
+
2461
+ .beads-filters sl-select:first-child { min-width: 240px; }
2462
+
2463
+ /* --- Kanban board --- */
2464
+
2465
+ .beads-kanban {
2466
+ display: grid;
2467
+ grid-template-columns: 1fr 1fr 1fr;
2468
+ gap: 16px;
2469
+ }
2470
+
2471
+ .beads-kanban-column {
2472
+ display: flex;
2473
+ flex-direction: column;
2474
+ gap: 8px;
2475
+ }
2476
+
2477
+ .beads-kanban-header {
2478
+ display: flex;
2479
+ align-items: center;
2480
+ gap: 8px;
2481
+ font-weight: 600;
2482
+ text-transform: uppercase;
2483
+ font-size: 12px;
2484
+ color: var(--muted);
2485
+ padding-bottom: 8px;
2486
+ border-bottom: 2px solid var(--border);
2487
+ }
2488
+
2489
+ .beads-kanban-header--open { border-color: var(--status-completed); }
2490
+ .beads-kanban-header--in_progress { border-color: var(--status-in-progress); }
2491
+ .beads-kanban-header--closed { border-color: var(--muted); }
2492
+
2493
+ .beads-kanban-empty {
2494
+ font-size: 12px;
2495
+ color: var(--muted);
2496
+ padding: 12px;
2497
+ text-align: center;
2498
+ }
2499
+
2500
+ .beads-kanban-card {
2501
+ padding: 12px;
2502
+ border-radius: 8px;
2503
+ border: 1px solid var(--border);
2504
+ background: var(--bg-secondary);
2505
+ cursor: default;
2506
+ }
2507
+
2508
+ .beads-kanban-card:hover {
2509
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
2510
+ }
2511
+
2512
+ .beads-kanban-card--blocked {
2513
+ border-color: var(--status-blocked);
2514
+ border-style: dashed;
2515
+ }
2516
+
2517
+ .beads-kanban-card-header {
2518
+ display: flex;
2519
+ align-items: center;
2520
+ gap: 6px;
2521
+ margin-bottom: 6px;
2522
+ }
2523
+
2524
+ .beads-kanban-card-id {
2525
+ font-size: 11px;
2526
+ color: var(--muted);
2527
+ font-family: var(--sl-font-mono);
2528
+ margin-left: auto;
2529
+ }
2530
+
2531
+ .beads-kanban-card-title {
2532
+ font-size: 13px;
2533
+ font-weight: 500;
2534
+ line-height: 1.3;
2535
+ overflow: hidden;
2536
+ text-overflow: ellipsis;
2537
+ display: -webkit-box;
2538
+ -webkit-line-clamp: 2;
2539
+ -webkit-box-orient: vertical;
2540
+ }
2541
+
2542
+ .beads-kanban-card-blocked {
2543
+ display: flex;
2544
+ align-items: center;
2545
+ gap: 4px;
2546
+ margin-top: 8px;
2547
+ font-size: 11px;
2548
+ color: var(--status-blocked);
2549
+ }
2550
+
2551
+ /* --- Dependency graph --- */
2552
+
2553
+ .beads-graph-section {
2554
+ display: flex;
2555
+ flex-direction: column;
2556
+ gap: 12px;
2557
+ }
2558
+
2559
+ .beads-graph-section-title {
2560
+ font-size: 13px;
2561
+ font-weight: 600;
2562
+ color: var(--muted);
2563
+ text-transform: uppercase;
2564
+ letter-spacing: 0.05em;
2565
+ }
2566
+
2567
+ .beads-graph-container {
2568
+ overflow-x: auto;
2569
+ border: 1px solid var(--border);
2570
+ border-radius: var(--radius);
2571
+ background: var(--bg-secondary);
2572
+ padding: 16px;
2573
+ }
2574
+
2575
+ .beads-graph-container svg {
2576
+ display: block;
2577
+ }
2578
+
2579
+ .beads-graph-node rect {
2580
+ fill: var(--bg);
2581
+ stroke: var(--border);
2582
+ stroke-width: 1.5;
2583
+ }
2584
+
2585
+ .beads-graph-node--open rect {
2586
+ stroke: var(--status-completed);
2587
+ }
2588
+
2589
+ .beads-graph-node--in_progress rect {
2590
+ stroke: var(--status-in-progress);
2591
+ }
2592
+
2593
+ .beads-graph-node--closed rect {
2594
+ stroke: var(--muted);
2595
+ opacity: 0.6;
2596
+ }
2597
+
2598
+ .beads-graph-node--blocked rect {
2599
+ stroke: var(--status-blocked);
2600
+ stroke-dasharray: 4 2;
2601
+ }
2602
+
2603
+ .beads-graph-node text {
2604
+ font-size: 11px;
2605
+ font-family: var(--sl-font-sans);
2606
+ fill: var(--fg);
2607
+ }
2608
+
2609
+ .beads-graph-node-id {
2610
+ font-size: 10px;
2611
+ fill: var(--muted);
2612
+ }
2613
+
2614
+ .beads-graph-edge {
2615
+ fill: none;
2616
+ stroke: var(--border);
2617
+ stroke-width: 1.5;
2618
+ }
2619
+
2620
+ .beads-graph-edge--satisfied {
2621
+ stroke: var(--border);
2622
+ }
2623
+
2624
+ .beads-graph-edge--blocking {
2625
+ stroke: var(--status-blocked);
2626
+ stroke-dasharray: 4 2;
2627
+ }
2628
+
2629
+ /* --- Run-detail linked Beads section --- */
2630
+ .run-beads-section {
2631
+ margin: 0;
2632
+ }
2633
+
2634
+ sl-details.run-beads-panel::part(base) {
2635
+ border: 1px solid var(--border-subtle);
2636
+ border-radius: var(--radius-lg);
2637
+ background: var(--bg-secondary);
2638
+ box-shadow: var(--shadow-sm);
2639
+ }
2640
+
2641
+ sl-details.run-beads-panel::part(header) {
2642
+ padding: 12px 16px;
2643
+ }
2644
+
2645
+ sl-details.run-beads-panel::part(content) {
2646
+ padding: 0 16px 12px;
2647
+ }
2648
+
2649
+ .run-beads-header {
2650
+ display: flex;
2651
+ align-items: center;
2652
+ gap: 10px;
2653
+ width: 100%;
2654
+ }
2655
+
2656
+ .run-beads-icon {
2657
+ display: flex;
2658
+ align-items: center;
2659
+ color: var(--muted);
2660
+ }
2661
+
2662
+ .run-beads-title {
2663
+ font-weight: 600;
2664
+ font-size: 14px;
2665
+ color: var(--fg);
2666
+ text-transform: uppercase;
2667
+ letter-spacing: 0.04em;
2668
+ }
2669
+
2670
+ .run-beads-count {
2671
+ background: var(--accent);
2672
+ color: #fff;
2673
+ font-size: 0.7rem;
2674
+ padding: 1px 6px;
2675
+ border-radius: 10px;
2676
+ font-weight: 600;
2677
+ }
2678
+
2679
+ .run-beads-empty {
2680
+ font-size: 0.82rem;
2681
+ color: var(--muted);
2682
+ padding: 4px 0;
2683
+ }
2684
+
2685
+ .run-beads-list {
2686
+ display: flex;
2687
+ flex-direction: column;
2688
+ gap: 4px;
2689
+ }
2690
+
2691
+ .run-bead-row {
2692
+ display: flex;
2693
+ align-items: center;
2694
+ gap: 6px;
2695
+ padding: 4px 8px;
2696
+ border-radius: 6px;
2697
+ font-size: 0.82rem;
2698
+ background: var(--bg);
2699
+ border: 1px solid var(--border-subtle);
2700
+ }
2701
+
2702
+ .run-bead-row sl-badge::part(base) {
2703
+ font-size: 0.68rem;
2704
+ padding: 0 5px;
2705
+ }
2706
+
2707
+ .run-bead-id {
2708
+ color: var(--muted);
2709
+ font-family: var(--sl-font-mono);
2710
+ font-size: 0.75rem;
2711
+ min-width: 28px;
2712
+ }
2713
+
2714
+ .run-bead-title {
2715
+ flex: 1;
2716
+ overflow: hidden;
2717
+ text-overflow: ellipsis;
2718
+ white-space: nowrap;
2719
+ }
2720
+
2721
+ .run-beads-graph {
2722
+ margin-top: 8px;
2723
+ overflow-x: auto;
2724
+ }
2725
+
2726
+ /* --- Learnings section --- */
2727
+ .learnings-section {
2728
+ margin: 0;
2729
+ }
2730
+
2731
+ sl-details.learnings-panel::part(base) {
2732
+ border: 1px solid var(--border-subtle);
2733
+ border-radius: var(--radius-lg);
2734
+ background: var(--bg-secondary);
2735
+ box-shadow: var(--shadow-sm);
2736
+ }
2737
+
2738
+ sl-details.learnings-panel::part(header) {
2739
+ padding: 12px 16px;
2740
+ }
2741
+
2742
+ sl-details.learnings-panel::part(content) {
2743
+ padding: 0 16px 12px;
2744
+ }
2745
+
2746
+ .learnings-header {
2747
+ display: flex;
2748
+ align-items: center;
2749
+ gap: 10px;
2750
+ width: 100%;
2751
+ }
2752
+
2753
+ .learnings-icon {
2754
+ display: flex;
2755
+ align-items: center;
2756
+ color: var(--muted);
2757
+ }
2758
+
2759
+ .learnings-title {
2760
+ font-weight: 600;
2761
+ font-size: 14px;
2762
+ color: var(--fg);
2763
+ text-transform: uppercase;
2764
+ letter-spacing: 0.04em;
2765
+ }
2766
+
2767
+ .learnings-count {
2768
+ background: var(--accent);
2769
+ color: #fff;
2770
+ font-size: 0.7rem;
2771
+ padding: 1px 6px;
2772
+ border-radius: 10px;
2773
+ font-weight: 600;
2774
+ }
2775
+
2776
+ .learnings-empty {
2777
+ font-size: 0.82rem;
2778
+ color: var(--muted);
2779
+ padding: 4px 0;
2780
+ }
2781
+
2782
+ /* Learnings in-progress state */
2783
+ .learnings-in-progress {
2784
+ display: flex;
2785
+ align-items: center;
2786
+ gap: 12px;
2787
+ padding: 12px 0;
2788
+ }
2789
+ .learnings-in-progress-spinner {
2790
+ color: var(--accent);
2791
+ display: flex;
2792
+ align-items: center;
2793
+ }
2794
+ .learnings-in-progress-title {
2795
+ font-size: 0.85rem;
2796
+ font-weight: 500;
2797
+ color: var(--fg);
2798
+ margin: 0;
2799
+ }
2800
+ .learnings-in-progress-meta {
2801
+ font-size: 0.75rem;
2802
+ color: var(--muted);
2803
+ margin: 2px 0 0;
2804
+ }
2805
+
2806
+ /* Learnings error state */
2807
+ .learnings-error {
2808
+ display: flex;
2809
+ align-items: flex-start;
2810
+ gap: 10px;
2811
+ padding: 8px 0;
2812
+ }
2813
+ .learnings-error-icon {
2814
+ color: var(--danger, #ef4444);
2815
+ display: flex;
2816
+ align-items: center;
2817
+ flex-shrink: 0;
2818
+ padding-top: 2px;
2819
+ }
2820
+ .learnings-error-title {
2821
+ font-size: 0.85rem;
2822
+ font-weight: 500;
2823
+ color: var(--fg);
2824
+ margin: 0;
2825
+ }
2826
+ .learnings-error-detail {
2827
+ font-size: 0.78rem;
2828
+ color: var(--muted);
2829
+ margin: 4px 0 0;
2830
+ font-family: var(--sl-font-mono);
2831
+ }
2832
+ .learnings-error-text {
2833
+ flex: 1;
2834
+ }
2835
+
2836
+ /* Timing and meta strips inside learnings panel */
2837
+ .learnings-panel .timing-strip {
2838
+ margin-bottom: 8px;
2839
+ padding-bottom: 8px;
2840
+ border-bottom: 1px solid var(--border);
2841
+ }
2842
+
2843
+ .learnings-panel .stage-info-strip {
2844
+ margin-bottom: 8px;
2845
+ padding-bottom: 8px;
2846
+ border-bottom: 1px solid var(--border);
2847
+ }
2848
+
2849
+ /* Re-run button after completed results */
2850
+ .learnings-rerun {
2851
+ margin-top: 8px;
2852
+ text-align: right;
2853
+ }
2854
+
2855
+ /* Skipped status for timeline */
2856
+ .status-skipped {
2857
+ color: var(--muted);
2858
+ opacity: 0.5;
2859
+ }
2860
+
2861
+ .stage-node.status-skipped .stage-icon {
2862
+ border-color: var(--muted);
2863
+ border-style: dashed;
2864
+ opacity: 0.5;
2865
+ }
2866
+
2867
+ /* Learnings table */
2868
+ .col-center {
2869
+ text-align: center;
2870
+ justify-self: center;
2871
+ }
2872
+
2873
+ .learnings-table {
2874
+ display: grid;
2875
+ gap: 1px;
2876
+ background: var(--border-subtle);
2877
+ border-radius: var(--radius);
2878
+ overflow: hidden;
2879
+ }
2880
+
2881
+ .learnings-table-header {
2882
+ display: grid;
2883
+ grid-template-columns: 80px 100px 1fr 1fr 50px 36px;
2884
+ gap: 12px;
2885
+ padding: 8px 12px;
2886
+ background: var(--bg-tertiary);
2887
+ font-weight: 600;
2888
+ font-size: 12px;
2889
+ text-transform: uppercase;
2890
+ letter-spacing: 0.03em;
2891
+ color: var(--muted);
2892
+ }
2893
+
2894
+ .learnings-table-row {
2895
+ display: grid;
2896
+ grid-template-columns: 80px 100px 1fr 1fr 50px 36px;
2897
+ gap: 12px;
2898
+ padding: 8px 12px;
2899
+ background: var(--bg-secondary);
2900
+ font-size: 13px;
2901
+ align-items: center;
2902
+ }
2903
+
2904
+ .learnings-table-row:hover {
2905
+ background: var(--bg-tertiary);
2906
+ }
2907
+
2908
+ .learnings-table-title {
2909
+ font-size: 13px;
2910
+ font-weight: 600;
2911
+ color: var(--fg);
2912
+ margin: 12px 0 6px;
2913
+ }
2914
+
2915
+ .learnings-summary-strip {
2916
+ display: flex;
2917
+ gap: 16px;
2918
+ padding: 8px 12px;
2919
+ background: var(--bg-tertiary);
2920
+ border-radius: var(--radius);
2921
+ font-size: 13px;
2922
+ color: var(--fg);
2923
+ margin-bottom: 12px;
2924
+ }
2925
+
2926
+ .learnings-summary-strip span {
2927
+ white-space: nowrap;
2928
+ }
2929
+
2930
+ .learnings-evidence {
2931
+ font-size: 0.78rem;
2932
+ color: var(--muted);
2933
+ font-style: italic;
2934
+ }
2935
+
2936
+ .learnings-category {
2937
+ font-size: 0.78rem;
2938
+ font-family: var(--sl-font-mono);
2939
+ color: var(--muted);
2940
+ }
2941
+
2942
+ .learnings-table-header--suggestions,
2943
+ .learnings-table-row--suggestions {
2944
+ grid-template-columns: 120px 1fr 1fr 36px;
2945
+ }
2946
+
2947
+ .learnings-table-header--patterns,
2948
+ .learnings-table-row--patterns {
2949
+ grid-template-columns: 1fr 150px 80px;
2950
+ }
2951
+
2952
+ .learnings-subtable-title {
2953
+ font-size: 12px;
2954
+ font-weight: 600;
2955
+ color: var(--muted);
2956
+ margin: 8px 0 4px;
2957
+ }
2958
+
2959
+ .learnings-target {
2960
+ font-family: var(--sl-font-mono);
2961
+ font-size: 0.78rem;
2962
+ color: var(--fg);
2963
+ }
2964
+
2965
+ .learnings-rationale {
2966
+ font-size: 0.78rem;
2967
+ color: var(--muted);
2968
+ font-style: italic;
2969
+ }
2970
+
2971
+ .learnings-copy-btn {
2972
+ display: inline-flex;
2973
+ align-items: center;
2974
+ justify-content: center;
2975
+ width: 28px;
2976
+ height: 28px;
2977
+ padding: 0;
2978
+ border: 1px solid var(--border);
2979
+ border-radius: var(--radius);
2980
+ background: var(--bg-secondary);
2981
+ color: var(--muted);
2982
+ cursor: pointer;
2983
+ transition: color 0.15s, border-color 0.15s;
2984
+ }
2985
+
2986
+ .learnings-copy-btn:hover {
2987
+ color: var(--accent);
2988
+ border-color: var(--accent);
2989
+ }
2990
+
2991
+ .learnings-copy-btn .copy-icon.copy-success {
2992
+ color: var(--success, #22c55e);
2993
+ }
2994
+
2995
+ /* --- 31. Token & Cost Dashboard --- */
2996
+
2997
+ .costs-dashboard {
2998
+ padding: 0;
2999
+ }
3000
+
3001
+ .costs-stats {
3002
+ display: grid;
3003
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
3004
+ gap: 12px;
3005
+ margin-bottom: 20px;
3006
+ }
3007
+
3008
+ .costs-section-title {
3009
+ font-size: 0.95rem;
3010
+ font-weight: 600;
3011
+ color: var(--fg);
3012
+ margin: 0 0 12px;
3013
+ text-transform: uppercase;
3014
+ letter-spacing: 0.04em;
3015
+ }
3016
+
3017
+ .cost-run-list {
3018
+ display: flex;
3019
+ flex-direction: column;
3020
+ gap: 6px;
3021
+ }
3022
+
3023
+ .cost-run-row {
3024
+ background: var(--bg-secondary);
3025
+ border: 1px solid var(--border-subtle);
3026
+ border-radius: var(--radius);
3027
+ overflow: hidden;
3028
+ }
3029
+
3030
+ .cost-run-row.expanded {
3031
+ border-color: var(--accent);
3032
+ }
3033
+
3034
+ .cost-run-summary {
3035
+ display: grid;
3036
+ grid-template-columns: 1fr 130px 80px 80px 24px;
3037
+ align-items: center;
3038
+ gap: 8px;
3039
+ padding: 10px 14px;
3040
+ cursor: pointer;
3041
+ font-size: 0.85rem;
3042
+ transition: background var(--transition-fast);
3043
+ }
3044
+
3045
+ .cost-run-summary:hover {
3046
+ background: var(--bg-hover);
3047
+ }
3048
+
3049
+ .cost-run-title {
3050
+ font-weight: 500;
3051
+ overflow: hidden;
3052
+ text-overflow: ellipsis;
3053
+ white-space: nowrap;
3054
+ }
3055
+
3056
+ .cost-run-date {
3057
+ color: var(--muted);
3058
+ font-size: 0.78rem;
3059
+ }
3060
+
3061
+ .cost-run-cost {
3062
+ font-weight: 600;
3063
+ color: var(--accent);
3064
+ text-align: right;
3065
+ }
3066
+
3067
+
3068
+ .cost-run-duration {
3069
+ color: var(--muted);
3070
+ font-size: 0.78rem;
3071
+ text-align: right;
3072
+ }
3073
+
3074
+ .cost-run-chevron {
3075
+ color: var(--muted);
3076
+ font-size: 0.7rem;
3077
+ text-align: center;
3078
+ }
3079
+
3080
+ .cost-run-detail {
3081
+ padding: 12px 14px;
3082
+ border-top: 1px solid var(--border-subtle);
3083
+ background: var(--bg);
3084
+ }
3085
+
3086
+ /* Cost breakdown bar */
3087
+
3088
+ .cost-bar-container {
3089
+ margin-bottom: 14px;
3090
+ }
3091
+
3092
+ .cost-bar {
3093
+ display: flex;
3094
+ height: 8px;
3095
+ border-radius: 4px;
3096
+ overflow: hidden;
3097
+ background: var(--bg-secondary);
3098
+ }
3099
+
3100
+ .cost-bar-segment {
3101
+ min-width: 3px;
3102
+ transition: width 0.3s ease;
3103
+ }
3104
+
3105
+ .cost-bar-legend {
3106
+ display: flex;
3107
+ flex-wrap: wrap;
3108
+ gap: 10px;
3109
+ margin-top: 6px;
3110
+ font-size: 0.75rem;
3111
+ color: var(--muted);
3112
+ }
3113
+
3114
+ .cost-legend-item {
3115
+ display: flex;
3116
+ align-items: center;
3117
+ gap: 4px;
3118
+ }
3119
+
3120
+ .cost-legend-dot {
3121
+ width: 8px;
3122
+ height: 8px;
3123
+ border-radius: 50%;
3124
+ flex-shrink: 0;
3125
+ }
3126
+
3127
+ /* Cost detail table */
3128
+
3129
+ .cost-table {
3130
+ width: 100%;
3131
+ border-collapse: collapse;
3132
+ font-size: 0.78rem;
3133
+ }
3134
+
3135
+ .cost-table th {
3136
+ text-align: left;
3137
+ font-weight: 600;
3138
+ color: var(--muted);
3139
+ padding: 6px 8px;
3140
+ border-bottom: 1px solid var(--border-subtle);
3141
+ font-size: 0.72rem;
3142
+ text-transform: uppercase;
3143
+ letter-spacing: 0.03em;
3144
+ }
3145
+
3146
+ .cost-table td {
3147
+ padding: 5px 8px;
3148
+ border-bottom: 1px solid var(--border-subtle);
3149
+ }
3150
+
3151
+ .cost-table-stage td:first-child {
3152
+ font-weight: 500;
3153
+ }
3154
+
3155
+ .cost-table-iter td {
3156
+ color: var(--muted);
3157
+ }
3158
+
3159
+ .cost-muted {
3160
+ color: var(--muted);
3161
+ }
3162
+
3163
+ /* Preflight checks view */
3164
+
3165
+ .preflight-checks-view {
3166
+ margin-top: 10px;
3167
+ }
3168
+
3169
+ .preflight-summary {
3170
+ font-size: 0.8rem;
3171
+ color: var(--muted);
3172
+ margin-bottom: 8px;
3173
+ }
3174
+
3175
+ .preflight-table {
3176
+ width: 100%;
3177
+ border-collapse: collapse;
3178
+ font-size: 0.8rem;
3179
+ }
3180
+
3181
+ .preflight-table th {
3182
+ text-align: left;
3183
+ font-weight: 600;
3184
+ color: var(--muted);
3185
+ padding: 5px 8px;
3186
+ border-bottom: 1px solid var(--border-subtle);
3187
+ font-size: 0.72rem;
3188
+ text-transform: uppercase;
3189
+ letter-spacing: 0.03em;
3190
+ }
3191
+
3192
+ .preflight-table td {
3193
+ padding: 4px 8px;
3194
+ border-bottom: 1px solid var(--border-subtle);
3195
+ vertical-align: middle;
3196
+ }
3197
+
3198
+ .preflight-check-name {
3199
+ font-family: var(--sl-font-mono);
3200
+ font-size: 0.78rem;
3201
+ }
3202
+
3203
+ .preflight-check-message {
3204
+ color: var(--muted);
3205
+ }
3206
+
3207
+ .circuit-breaker-banner {
3208
+ margin: 8px 0 4px;
3209
+ }
3210
+
3211
+ .classification-strip {
3212
+ margin-top: 10px;
3213
+ padding: 8px 10px;
3214
+ background: var(--bg-secondary);
3215
+ border: 1px solid var(--border-subtle);
3216
+ border-radius: var(--radius);
3217
+ font-size: 0.8rem;
3218
+ display: flex;
3219
+ flex-wrap: wrap;
3220
+ gap: 8px 16px;
3221
+ align-items: center;
3222
+ }
3223
+
3224
+ .classification-strip-item {
3225
+ display: flex;
3226
+ align-items: center;
3227
+ gap: 4px;
3228
+ }
3229
+
3230
+ .classification-strip-label {
3231
+ color: var(--muted);
3232
+ font-size: 0.75rem;
3233
+ }
3234
+
3235
+ .classification-strip-value {
3236
+ color: var(--fg);
3237
+ font-size: 0.8rem;
3238
+ }
3239
+
3240
+ .classification-remediation {
3241
+ width: 100%;
3242
+ }
3243
+
3244
+ .classification-remediation .classification-strip-value {
3245
+ color: var(--muted);
3246
+ font-style: italic;
3247
+ }
3248
+
3249
+ /* --- Webhook Inbox --- */
3250
+
3251
+ .webhook-inbox {
3252
+ display: flex;
3253
+ flex-direction: column;
3254
+ gap: 0;
3255
+ height: 100%;
3256
+ min-height: 0;
3257
+ }
3258
+
3259
+ .webhook-inbox-toolbar {
3260
+ display: flex;
3261
+ align-items: center;
3262
+ gap: 10px;
3263
+ padding: 8px 0;
3264
+ flex-wrap: wrap;
3265
+ border-bottom: 1px solid var(--border-subtle);
3266
+ }
3267
+
3268
+ .webhook-inbox-toolbar-right {
3269
+ display: flex;
3270
+ align-items: center;
3271
+ gap: 8px;
3272
+ margin-left: auto;
3273
+ }
3274
+
3275
+ .webhook-inbox-category-chips {
3276
+ display: flex;
3277
+ gap: 4px;
3278
+ flex-wrap: wrap;
3279
+ }
3280
+
3281
+ .webhook-inbox-category-chip {
3282
+ display: inline-flex;
3283
+ align-items: center;
3284
+ gap: 4px;
3285
+ padding: 3px 10px;
3286
+ border-radius: 12px;
3287
+ border: 1px solid var(--border-subtle);
3288
+ background: var(--bg-secondary);
3289
+ font-size: 0.72rem;
3290
+ font-weight: 500;
3291
+ cursor: pointer;
3292
+ color: var(--muted);
3293
+ transition: all 0.15s;
3294
+ text-transform: capitalize;
3295
+ }
3296
+
3297
+ .webhook-inbox-category-chip:hover {
3298
+ border-color: var(--accent);
3299
+ color: var(--fg);
3300
+ }
3301
+
3302
+ .webhook-inbox-category-chip.active {
3303
+ background: var(--accent);
3304
+ color: #fff;
3305
+ border-color: var(--accent);
3306
+ }
3307
+
3308
+ .webhook-inbox-category-chip .chip-count {
3309
+ font-size: 0.68rem;
3310
+ opacity: 0.7;
3311
+ }
3312
+
3313
+ .webhook-inbox-run-filter {
3314
+ padding: 4px 8px;
3315
+ border-radius: var(--radius);
3316
+ border: 1px solid var(--border-subtle);
3317
+ background: var(--bg-secondary);
3318
+ color: var(--fg);
3319
+ font-size: 0.78rem;
3320
+ cursor: pointer;
3321
+ }
3322
+
3323
+ .webhook-inbox-search {
3324
+ display: flex;
3325
+ align-items: center;
3326
+ gap: 4px;
3327
+ padding: 4px 8px;
3328
+ border-radius: var(--radius);
3329
+ border: 1px solid var(--border-subtle);
3330
+ background: var(--bg-secondary);
3331
+ color: var(--muted);
3332
+ }
3333
+
3334
+ .webhook-inbox-search input {
3335
+ border: none;
3336
+ background: transparent;
3337
+ color: var(--fg);
3338
+ font-size: 0.78rem;
3339
+ outline: none;
3340
+ width: 120px;
3341
+ }
3342
+
3343
+ .webhook-inbox-clear-btn {
3344
+ display: inline-flex;
3345
+ align-items: center;
3346
+ justify-content: center;
3347
+ padding: 4px 8px;
3348
+ border-radius: var(--radius);
3349
+ border: 1px solid var(--border-subtle);
3350
+ background: var(--bg-secondary);
3351
+ color: var(--muted);
3352
+ cursor: pointer;
3353
+ transition: all 0.15s;
3354
+ }
3355
+
3356
+ .webhook-inbox-clear-btn:hover {
3357
+ color: var(--danger, #ef4444);
3358
+ border-color: var(--danger, #ef4444);
3359
+ }
3360
+
3361
+ /* Control segment */
3362
+
3363
+ .webhook-inbox-control {
3364
+ display: inline-flex;
3365
+ }
3366
+
3367
+ .webhook-control-segment {
3368
+ display: inline-flex;
3369
+ border-radius: var(--radius);
3370
+ overflow: hidden;
3371
+ border: 1px solid var(--border-subtle);
3372
+ }
3373
+
3374
+ .webhook-control-btn {
3375
+ padding: 3px 10px;
3376
+ border: none;
3377
+ background: var(--bg-secondary);
3378
+ color: var(--muted);
3379
+ font-size: 0.72rem;
3380
+ font-weight: 500;
3381
+ cursor: pointer;
3382
+ text-transform: capitalize;
3383
+ transition: all 0.15s;
3384
+ border-right: 1px solid var(--border-subtle);
3385
+ }
3386
+
3387
+ .webhook-control-btn:last-child {
3388
+ border-right: none;
3389
+ }
3390
+
3391
+ .webhook-control-btn:hover {
3392
+ background: var(--bg-tertiary);
3393
+ color: var(--fg);
3394
+ }
3395
+
3396
+ .webhook-control-btn.active {
3397
+ background: var(--accent);
3398
+ color: #fff;
3399
+ }
3400
+
3401
+ .webhook-control-btn.active.danger {
3402
+ background: var(--danger, #ef4444);
3403
+ }
3404
+
3405
+ /* Event list */
3406
+
3407
+ .webhook-inbox-list {
3408
+ flex: 1;
3409
+ min-height: 0;
3410
+ overflow-y: auto;
3411
+ font-size: 0.78rem;
3412
+ }
3413
+
3414
+ .webhook-inbox-list-header {
3415
+ display: grid;
3416
+ grid-template-columns: 40px 75px 65px 180px 80px 1fr minmax(80px, auto);
3417
+ gap: 8px;
3418
+ padding: 6px 10px;
3419
+ background: var(--bg-tertiary);
3420
+ font-weight: 600;
3421
+ font-size: 0.72rem;
3422
+ text-transform: uppercase;
3423
+ letter-spacing: 0.03em;
3424
+ color: var(--muted);
3425
+ position: sticky;
3426
+ top: 0;
3427
+ z-index: 1;
3428
+ }
3429
+
3430
+ .webhook-inbox-list-body {
3431
+ max-height: 400px;
3432
+ overflow-y: auto;
3433
+ }
3434
+
3435
+ .webhook-inbox-row {
3436
+ display: grid;
3437
+ grid-template-columns: 40px 75px 65px 180px 80px 1fr minmax(80px, auto);
3438
+ gap: 8px;
3439
+ padding: 5px 10px;
3440
+ border-bottom: 1px solid var(--border-subtle);
3441
+ cursor: pointer;
3442
+ transition: background 0.1s;
3443
+ align-items: center;
3444
+ }
3445
+
3446
+ .webhook-inbox-row:hover {
3447
+ background: var(--bg-hover, var(--bg-tertiary));
3448
+ }
3449
+
3450
+ .webhook-inbox-row.selected {
3451
+ background: color-mix(in srgb, var(--accent) 10%, var(--bg-secondary));
3452
+ border-left: 2px solid var(--accent);
3453
+ }
3454
+
3455
+ .wh-col-id {
3456
+ color: var(--muted);
3457
+ font-size: 0.72rem;
3458
+ font-family: var(--sl-font-mono);
3459
+ }
3460
+
3461
+ .wh-col-date {
3462
+ color: var(--muted);
3463
+ font-size: 0.72rem;
3464
+ font-family: var(--sl-font-mono);
3465
+ }
3466
+
3467
+ .wh-col-time {
3468
+ color: var(--muted);
3469
+ font-size: 0.72rem;
3470
+ font-family: var(--sl-font-mono);
3471
+ }
3472
+
3473
+ .wh-col-stage {
3474
+ color: var(--muted);
3475
+ font-size: 0.72rem;
3476
+ }
3477
+
3478
+ .wh-col-run {
3479
+ color: var(--muted);
3480
+ font-size: 0.72rem;
3481
+ font-family: var(--sl-font-mono);
3482
+ overflow: hidden;
3483
+ text-overflow: ellipsis;
3484
+ }
3485
+
3486
+ .webhook-event-type {
3487
+ display: inline-block;
3488
+ padding: 1px 6px;
3489
+ border-radius: 8px;
3490
+ font-size: 0.72rem;
3491
+ font-weight: 500;
3492
+ font-family: var(--sl-font-mono);
3493
+ }
3494
+
3495
+ .webhook-event-type.cat-run { background: color-mix(in srgb, var(--accent) 15%, transparent); color: var(--accent); }
3496
+ .webhook-event-type.cat-stage { background: color-mix(in srgb, var(--success, #22c55e) 15%, transparent); color: var(--success, #22c55e); }
3497
+ .webhook-event-type.cat-agent { background: var(--bg-tertiary); color: var(--muted); }
3498
+ .webhook-event-type.cat-cost { background: color-mix(in srgb, var(--warning, #f59e0b) 15%, transparent); color: var(--warning, #f59e0b); }
3499
+ .webhook-event-type.cat-danger { background: color-mix(in srgb, var(--danger, #ef4444) 15%, transparent); color: var(--danger, #ef4444); }
3500
+ .webhook-event-type.cat-neutral { background: var(--bg-tertiary); color: var(--muted); }
3501
+
3502
+ .webhook-inbox-summary {
3503
+ overflow: hidden;
3504
+ text-overflow: ellipsis;
3505
+ white-space: nowrap;
3506
+ color: var(--fg);
3507
+ font-size: 0.75rem;
3508
+ }
3509
+
3510
+ /* Detail pane */
3511
+
3512
+ .webhook-inbox-detail {
3513
+ border-top: 1px solid var(--border-subtle);
3514
+ background: var(--bg-secondary);
3515
+ padding: 10px 12px;
3516
+ max-height: 350px;
3517
+ overflow-y: auto;
3518
+ }
3519
+
3520
+ .webhook-inbox-detail-header {
3521
+ display: flex;
3522
+ align-items: center;
3523
+ justify-content: space-between;
3524
+ margin-bottom: 8px;
3525
+ }
3526
+
3527
+ .webhook-inbox-detail-title {
3528
+ font-weight: 600;
3529
+ font-size: 0.85rem;
3530
+ color: var(--fg);
3531
+ }
3532
+
3533
+ .webhook-inbox-detail-actions {
3534
+ display: flex;
3535
+ gap: 6px;
3536
+ }
3537
+
3538
+ .webhook-inbox-copy-btn,
3539
+ .webhook-inbox-dismiss-btn {
3540
+ display: inline-flex;
3541
+ align-items: center;
3542
+ justify-content: center;
3543
+ width: 28px;
3544
+ height: 28px;
3545
+ padding: 0;
3546
+ border: 1px solid var(--border);
3547
+ border-radius: var(--radius);
3548
+ background: var(--bg-secondary);
3549
+ color: var(--muted);
3550
+ cursor: pointer;
3551
+ transition: color 0.15s, border-color 0.15s;
3552
+ }
3553
+
3554
+ .webhook-inbox-copy-btn:hover,
3555
+ .webhook-inbox-dismiss-btn:hover {
3556
+ color: var(--accent);
3557
+ border-color: var(--accent);
3558
+ }
3559
+
3560
+ .webhook-inbox-detail-headers {
3561
+ display: flex;
3562
+ flex-wrap: wrap;
3563
+ gap: 6px 16px;
3564
+ font-size: 0.75rem;
3565
+ color: var(--muted);
3566
+ margin-bottom: 8px;
3567
+ font-family: var(--sl-font-mono);
3568
+ }
3569
+
3570
+ .webhook-inbox-detail-headers .detail-label {
3571
+ font-weight: 600;
3572
+ color: var(--fg);
3573
+ }
3574
+
3575
+ .webhook-inbox-json {
3576
+ background: var(--log-bg, #0f172a);
3577
+ color: var(--log-fg, #e2e8f0);
3578
+ padding: 10px 12px;
3579
+ border-radius: var(--radius);
3580
+ font-size: 0.75rem;
3581
+ font-family: var(--sl-font-mono);
3582
+ overflow-x: auto;
3583
+ white-space: pre;
3584
+ margin: 0;
3585
+ max-height: 250px;
3586
+ overflow-y: auto;
3587
+ }
3588
+
3589
+ /* Empty state */
3590
+
3591
+ .webhook-inbox-empty {
3592
+ display: flex;
3593
+ flex-direction: column;
3594
+ align-items: center;
3595
+ justify-content: center;
3596
+ padding: 60px 20px;
3597
+ text-align: center;
3598
+ color: var(--muted);
3599
+ gap: 8px;
3600
+ }
3601
+
3602
+ .webhook-inbox-empty p {
3603
+ margin: 2px 0;
3604
+ font-size: 0.85rem;
3605
+ }
3606
+
3607
+ .webhook-inbox-url {
3608
+ display: inline-block;
3609
+ padding: 6px 14px;
3610
+ background: var(--bg-tertiary);
3611
+ border: 1px solid var(--border-subtle);
3612
+ border-radius: var(--radius);
3613
+ font-family: var(--sl-font-mono);
3614
+ font-size: 0.85rem;
3615
+ color: var(--accent);
3616
+ margin: 8px 0;
3617
+ }
3618
+
3619
+ /* --- Run Controls (run-detail.js) --- */
3620
+ .run-controls {
3621
+ display: flex;
3622
+ align-items: center;
3623
+ gap: 8px;
3624
+ margin-top: 8px;
3625
+ }
3626
+
3627
+ /* --- Dashboard Active Groups --- */
3628
+ .active-group {
3629
+ margin-bottom: 16px;
3630
+ }
3631
+ .active-group-header {
3632
+ display: flex;
3633
+ align-items: center;
3634
+ gap: 8px;
3635
+ margin-bottom: 8px;
3636
+ }
3637
+ .active-group-count {
3638
+ font-size: 13px;
3639
+ font-weight: 600;
3640
+ text-transform: uppercase;
3641
+ letter-spacing: 0.04em;
3642
+ color: var(--muted);
3643
+ }
3644
+ .active-group-running .active-group-count { color: var(--status-running); }
3645
+ .active-group-paused .active-group-count { color: var(--status-paused); }
3646
+ .active-group-failed .active-group-count { color: var(--status-failed); }
3647
+
3648
+ /* --- Filter Chips (history, etc.) --- */
3649
+ .filter-chips {
3650
+ display: flex;
3651
+ gap: 4px;
3652
+ flex-wrap: wrap;
3653
+ margin-bottom: 16px;
3654
+ }
3655
+ .filter-chip {
3656
+ display: inline-flex;
3657
+ align-items: center;
3658
+ gap: 4px;
3659
+ padding: 3px 10px;
3660
+ border-radius: 12px;
3661
+ border: 1px solid var(--border-subtle);
3662
+ background: var(--bg-secondary);
3663
+ font-size: 0.72rem;
3664
+ font-weight: 500;
3665
+ cursor: pointer;
3666
+ color: var(--filter-chip-inactive, var(--muted));
3667
+ transition: all 0.15s;
3668
+ text-transform: capitalize;
3669
+ }
3670
+ .filter-chip:hover {
3671
+ border-color: var(--accent);
3672
+ color: var(--fg);
3673
+ }
3674
+ .filter-chip.active {
3675
+ background: var(--accent);
3676
+ color: #fff;
3677
+ border-color: var(--accent);
3678
+ }
3679
+ .filter-chip-running.active { background: var(--status-running); border-color: var(--status-running); }
3680
+ .filter-chip-completed.active { background: var(--status-completed); border-color: var(--status-completed); }
3681
+ .filter-chip-failed.active { background: var(--status-failed); border-color: var(--status-failed); }
3682
+ .filter-chip-paused.active { background: var(--status-paused); border-color: var(--status-paused); }
3683
+ .filter-chip-error.active { background: var(--status-failed); border-color: var(--status-failed); }
3684
+ .filter-chip .chip-count {
3685
+ font-size: 0.68rem;
3686
+ opacity: 0.7;
3687
+ }
3688
+
3689
+ /* --- Run Card Quick-Action Buttons --- */
3690
+ .run-card-actions {
3691
+ display: flex;
3692
+ align-items: center;
3693
+ margin-left: auto;
3694
+ }
3695
+ .btn-quick-resume {
3696
+ display: inline-flex;
3697
+ align-items: center;
3698
+ gap: 4px;
3699
+ padding: 4px 12px;
3700
+ border: 1px solid var(--status-completed);
3701
+ border-radius: var(--radius);
3702
+ background: transparent;
3703
+ color: var(--status-completed);
3704
+ font-size: 12px;
3705
+ font-weight: 500;
3706
+ cursor: pointer;
3707
+ transition: background var(--transition-fast);
3708
+ }
3709
+ .btn-quick-resume:hover {
3710
+ background: var(--status-completed);
3711
+ color: #ffffff;
3712
+ }
3713
+ .btn-quick-archive {
3714
+ display: inline-flex;
3715
+ align-items: center;
3716
+ gap: 4px;
3717
+ padding: 4px 12px;
3718
+ border: 1px solid var(--muted);
3719
+ border-radius: var(--radius);
3720
+ background: transparent;
3721
+ color: var(--muted);
3722
+ font-size: 12px;
3723
+ font-weight: 500;
3724
+ cursor: pointer;
3725
+ transition: background var(--transition-fast), color var(--transition-fast);
3726
+ }
3727
+ .btn-quick-archive:hover {
3728
+ background: var(--muted);
3729
+ color: #ffffff;
3730
+ }
3731
+
3732
+ /* --- Sidebar Project Selector --- */
3733
+ .sidebar-project-section { padding-top: 4px; padding-bottom: 0; margin-bottom: 12px; }
3734
+ .sidebar-project-selector-row { display: flex; align-items: center; gap: 4px; padding: 0 8px; }
3735
+ .sidebar-project-selector { flex: 1; min-width: 0; }
3736
+ .sidebar-project-selector sl-select::part(combobox) { font-size: 0.85rem; }
3737
+ .sidebar-add-project-btn {
3738
+ display: flex; align-items: center; justify-content: center;
3739
+ width: 28px; height: 28px; flex-shrink: 0;
3740
+ border: 1px solid var(--border); border-radius: var(--radius);
3741
+ background: transparent; color: var(--muted); cursor: pointer;
3742
+ transition: color var(--transition-fast), border-color var(--transition-fast);
3743
+ }
3744
+ .sidebar-add-project-btn:hover { color: var(--accent); border-color: var(--accent); }
3745
+
3746
+ /* Project status dots in project selector */
3747
+ .project-option-label { display: inline-flex; align-items: center; gap: 6px; }
3748
+ .project-status-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; display: inline-block; }
3749
+ .project-status-idle { background: var(--status-completed, #22c55e); }
3750
+ .project-status-running { background: var(--status-in-progress, #f59e0b); animation: conn-blink 1.2s ease-in-out infinite; }
3751
+ .project-status-error { background: var(--status-error, #ef4444); }
3752
+ .project-status-paused { background: var(--status-paused, #eab308); }
3753
+
3754
+ /* --- Dashboard Project Cards --- */
3755
+ .project-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-bottom: 24px; }
3756
+ .project-card { background: var(--surface); border-radius: var(--radius); padding: 16px; cursor: pointer; transition: var(--transition-fast); border: 1px solid var(--border); }
3757
+ .project-card:hover { border-color: var(--accent); box-shadow: var(--shadow-sm); }
3758
+ .project-card-name { font-weight: 600; margin-bottom: 4px; }
3759
+ .project-card-stats { font-size: 0.85rem; color: var(--text-secondary); }
3760
+
3761
+ /* --- Settings Projects List --- */
3762
+ .projects-list-item { display: flex; justify-content: space-between; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--border); }
3763
+ .projects-list-item:last-child { border-bottom: none; }
3764
+ .project-path { font-size: 0.85rem; color: var(--text-secondary); font-family: var(--sl-font-mono); }
3765
+
3766
+ /* --- Multi-Pipeline Dashboard --- */
3767
+ .multi-pipeline-section {
3768
+ margin-top: 24px;
3769
+ }
3770
+
3771
+ .pipeline-grid {
3772
+ display: grid;
3773
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
3774
+ gap: 12px;
3775
+ margin-top: 12px;
3776
+ }
3777
+
3778
+ .pipeline-card {
3779
+ background: var(--bg);
3780
+ border: 1px solid var(--border);
3781
+ border-left: 3px solid var(--border);
3782
+ border-radius: var(--radius);
3783
+ padding: 14px 16px;
3784
+ cursor: pointer;
3785
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
3786
+ }
3787
+ .pipeline-card:hover {
3788
+ box-shadow: var(--shadow-sm);
3789
+ }
3790
+
3791
+ .pipeline-running { border-left-color: var(--status-running); }
3792
+ .pipeline-succeeded { border-left-color: var(--status-completed); }
3793
+ .pipeline-failed { border-left-color: var(--status-failed); }
3794
+ .pipeline-paused { border-left-color: var(--status-paused); }
3795
+ .pipeline-unknown { border-left-color: var(--muted); }
3796
+
3797
+ .pipeline-card-header {
3798
+ display: flex;
3799
+ justify-content: space-between;
3800
+ align-items: flex-start;
3801
+ gap: 8px;
3802
+ margin-bottom: 8px;
3803
+ }
3804
+
3805
+ .pipeline-title {
3806
+ font-weight: 600;
3807
+ font-size: 0.9rem;
3808
+ line-height: 1.3;
3809
+ overflow: hidden;
3810
+ text-overflow: ellipsis;
3811
+ white-space: nowrap;
3812
+ flex: 1;
3813
+ }
3814
+
3815
+ .pipeline-status-badge {
3816
+ font-size: 0.7rem;
3817
+ font-weight: 600;
3818
+ text-transform: uppercase;
3819
+ letter-spacing: 0.04em;
3820
+ padding: 2px 8px;
3821
+ border-radius: 10px;
3822
+ flex-shrink: 0;
3823
+ }
3824
+ .pipeline-badge-running { background: rgba(59, 130, 246, 0.12); color: var(--status-running); }
3825
+ .pipeline-badge-succeeded { background: rgba(34, 197, 94, 0.12); color: var(--status-completed); }
3826
+ .pipeline-badge-failed { background: rgba(239, 68, 68, 0.12); color: var(--status-failed); }
3827
+ .pipeline-badge-paused { background: rgba(245, 158, 11, 0.12); color: var(--status-paused); }
3828
+
3829
+ .pipeline-card-progress {
3830
+ display: flex;
3831
+ align-items: center;
3832
+ gap: 4px;
3833
+ margin-bottom: 10px;
3834
+ }
3835
+
3836
+ .stage-dot {
3837
+ width: 8px;
3838
+ height: 8px;
3839
+ border-radius: 50%;
3840
+ background: var(--border);
3841
+ transition: background var(--transition-fast);
3842
+ }
3843
+ .stage-dot.completed { background: var(--status-completed); }
3844
+ .stage-dot.active { background: var(--status-running); animation: conn-blink 1.2s ease-in-out infinite; }
3845
+
3846
+ .pipeline-stage-label {
3847
+ font-size: 0.75rem;
3848
+ color: var(--muted);
3849
+ margin-left: 4px;
3850
+ text-transform: capitalize;
3851
+ }
3852
+
3853
+ .pipeline-card-footer {
3854
+ display: flex;
3855
+ align-items: center;
3856
+ gap: 8px;
3857
+ font-size: 0.8rem;
3858
+ color: var(--muted);
3859
+ }
3860
+
3861
+ .pipeline-elapsed {
3862
+ display: inline-flex;
3863
+ align-items: center;
3864
+ gap: 3px;
3865
+ }
3866
+
3867
+ .pipeline-run-id {
3868
+ flex: 1;
3869
+ overflow: hidden;
3870
+ text-overflow: ellipsis;
3871
+ white-space: nowrap;
3872
+ font-family: var(--sl-font-mono);
3873
+ font-size: 0.75rem;
3874
+ }
3875
+
3876
+ .pipeline-actions {
3877
+ display: inline-flex;
3878
+ gap: 4px;
3879
+ margin-left: auto;
3880
+ }
3881
+
3882
+ .pipeline-action-btn {
3883
+ background: none;
3884
+ border: 1px solid var(--border);
3885
+ border-radius: 4px;
3886
+ padding: 3px 6px;
3887
+ cursor: pointer;
3888
+ color: var(--muted);
3889
+ display: inline-flex;
3890
+ align-items: center;
3891
+ transition: var(--transition-fast);
3892
+ }
3893
+ .pipeline-action-btn:hover {
3894
+ background: var(--bg-tertiary);
3895
+ color: var(--fg);
3896
+ }
3897
+