@mce-bt/microagents-dashboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1192 @@
1
+ /* ─── MicroAgents Dashboard — Dark Theme ─── */
2
+
3
+ :root {
4
+ --bg-primary: #0d1117;
5
+ --bg-secondary: #161b22;
6
+ --bg-tertiary: #21262d;
7
+ --bg-card: #1c2128;
8
+ --border: #30363d;
9
+ --border-light: #3d444d;
10
+ --text-primary: #e6edf3;
11
+ --text-secondary: #8b949e;
12
+ --text-muted: #6e7681;
13
+ --accent: #58a6ff;
14
+ --accent-hover: #79c0ff;
15
+ --green: #3fb950;
16
+ --green-bg: rgba(63, 185, 80, 0.15);
17
+ --red: #f85149;
18
+ --red-bg: rgba(248, 81, 73, 0.15);
19
+ --yellow: #d29922;
20
+ --yellow-bg: rgba(210, 153, 34, 0.15);
21
+ --purple: #bc8cff;
22
+ --purple-bg: rgba(188, 140, 255, 0.15);
23
+ --orange: #f0883e;
24
+ --font-mono: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
25
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
26
+ --radius: 6px;
27
+ --radius-lg: 10px;
28
+ --shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
29
+ }
30
+
31
+ * { box-sizing: border-box; margin: 0; padding: 0; }
32
+
33
+ html, body {
34
+ height: 100%;
35
+ font-family: var(--font-sans);
36
+ font-size: 14px;
37
+ color: var(--text-primary);
38
+ background: var(--bg-primary);
39
+ line-height: 1.5;
40
+ }
41
+
42
+ /* ─── Layout ─── */
43
+
44
+ .app {
45
+ display: flex;
46
+ height: 100vh;
47
+ }
48
+
49
+ .sidebar {
50
+ width: 220px;
51
+ min-width: 220px;
52
+ background: var(--bg-secondary);
53
+ border-right: 1px solid var(--border);
54
+ display: flex;
55
+ flex-direction: column;
56
+ padding: 16px 0;
57
+ }
58
+
59
+ .sidebar-brand {
60
+ padding: 0 16px 16px;
61
+ border-bottom: 1px solid var(--border);
62
+ margin-bottom: 8px;
63
+ }
64
+
65
+ .sidebar-brand h1 {
66
+ font-size: 16px;
67
+ font-weight: 600;
68
+ color: var(--accent);
69
+ }
70
+
71
+ .sidebar-brand .subtitle {
72
+ font-size: 11px;
73
+ color: var(--text-muted);
74
+ text-transform: uppercase;
75
+ letter-spacing: 0.5px;
76
+ }
77
+
78
+ .sidebar nav {
79
+ flex: 1;
80
+ padding: 8px;
81
+ }
82
+
83
+ .sidebar nav a {
84
+ display: flex;
85
+ align-items: center;
86
+ gap: 10px;
87
+ padding: 8px 12px;
88
+ color: var(--text-secondary);
89
+ text-decoration: none;
90
+ border-radius: var(--radius);
91
+ font-size: 13px;
92
+ transition: all 0.15s;
93
+ }
94
+
95
+ .sidebar nav a:hover {
96
+ color: var(--text-primary);
97
+ background: var(--bg-tertiary);
98
+ }
99
+
100
+ .sidebar nav a.active {
101
+ color: var(--text-primary);
102
+ background: var(--bg-tertiary);
103
+ font-weight: 500;
104
+ }
105
+
106
+ .sidebar nav a .icon {
107
+ width: 18px;
108
+ text-align: center;
109
+ font-size: 15px;
110
+ }
111
+
112
+ .main {
113
+ flex: 1;
114
+ overflow-y: auto;
115
+ padding: 24px 32px;
116
+ }
117
+
118
+ /* ─── Page header ─── */
119
+
120
+ .page-header {
121
+ margin-bottom: 24px;
122
+ }
123
+
124
+ .page-header h2 {
125
+ font-size: 22px;
126
+ font-weight: 600;
127
+ }
128
+
129
+ .page-header p {
130
+ color: var(--text-secondary);
131
+ margin-top: 4px;
132
+ }
133
+
134
+ /* ─── Cards ─── */
135
+
136
+ .card {
137
+ background: var(--bg-card);
138
+ border: 1px solid var(--border);
139
+ border-radius: var(--radius-lg);
140
+ padding: 20px;
141
+ box-shadow: var(--shadow);
142
+ }
143
+
144
+ .card-header {
145
+ display: flex;
146
+ justify-content: space-between;
147
+ align-items: center;
148
+ margin-bottom: 16px;
149
+ }
150
+
151
+ .card-header h3 {
152
+ font-size: 15px;
153
+ font-weight: 600;
154
+ }
155
+
156
+ /* ─── Grid ─── */
157
+
158
+ .grid {
159
+ display: grid;
160
+ gap: 16px;
161
+ }
162
+
163
+ .grid-2 { grid-template-columns: repeat(2, 1fr); }
164
+ .grid-3 { grid-template-columns: repeat(3, 1fr); }
165
+ .grid-4 { grid-template-columns: repeat(4, 1fr); }
166
+ .grid-5 { grid-template-columns: repeat(5, 1fr); }
167
+
168
+ @media (max-width: 1200px) {
169
+ .grid-4 { grid-template-columns: repeat(2, 1fr); }
170
+ .grid-5 { grid-template-columns: repeat(3, 1fr); }
171
+ .grid-3 { grid-template-columns: repeat(2, 1fr); }
172
+ }
173
+
174
+ @media (max-width: 768px) {
175
+ .grid-5, .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr; }
176
+ .sidebar { display: none; }
177
+ .main { padding: 16px; }
178
+ }
179
+
180
+ /* ─── Stat cards ─── */
181
+
182
+ .stat-card {
183
+ background: var(--bg-card);
184
+ border: 1px solid var(--border);
185
+ border-radius: var(--radius-lg);
186
+ padding: 16px 20px;
187
+ }
188
+
189
+ .stat-card .label {
190
+ font-size: 12px;
191
+ color: var(--text-muted);
192
+ text-transform: uppercase;
193
+ letter-spacing: 0.5px;
194
+ }
195
+
196
+ .stat-card .value {
197
+ font-size: 28px;
198
+ font-weight: 700;
199
+ margin-top: 4px;
200
+ font-family: var(--font-mono);
201
+ }
202
+
203
+ .stat-card .value.green { color: var(--green); }
204
+ .stat-card .value.red { color: var(--red); }
205
+ .stat-card .value.yellow { color: var(--yellow); }
206
+ .stat-card .value.accent { color: var(--accent); }
207
+ .stat-card .value.purple { color: var(--purple); }
208
+
209
+ /* ─── Tables ─── */
210
+
211
+ .table-wrap {
212
+ overflow-x: auto;
213
+ }
214
+
215
+ table {
216
+ width: 100%;
217
+ border-collapse: collapse;
218
+ }
219
+
220
+ thead th {
221
+ text-align: left;
222
+ font-size: 11px;
223
+ font-weight: 600;
224
+ color: var(--text-muted);
225
+ text-transform: uppercase;
226
+ letter-spacing: 0.5px;
227
+ padding: 8px 12px;
228
+ border-bottom: 1px solid var(--border);
229
+ }
230
+
231
+ tbody td {
232
+ padding: 10px 12px;
233
+ border-bottom: 1px solid var(--border);
234
+ font-size: 13px;
235
+ }
236
+
237
+ tbody tr:hover {
238
+ background: var(--bg-tertiary);
239
+ }
240
+
241
+ tbody tr:last-child td {
242
+ border-bottom: none;
243
+ }
244
+
245
+ /* ─── Badges ─── */
246
+
247
+ .badge {
248
+ display: inline-block;
249
+ padding: 2px 8px;
250
+ border-radius: 12px;
251
+ font-size: 11px;
252
+ font-weight: 500;
253
+ letter-spacing: 0.3px;
254
+ }
255
+
256
+ .badge-green {
257
+ background: var(--green-bg);
258
+ color: var(--green);
259
+ }
260
+
261
+ .badge-red {
262
+ background: var(--red-bg);
263
+ color: var(--red);
264
+ }
265
+
266
+ .badge-yellow {
267
+ background: var(--yellow-bg);
268
+ color: var(--yellow);
269
+ }
270
+
271
+ .badge-purple {
272
+ background: var(--purple-bg);
273
+ color: var(--purple);
274
+ }
275
+
276
+ .badge-muted {
277
+ background: var(--bg-tertiary);
278
+ color: var(--text-secondary);
279
+ }
280
+
281
+ /* ─── Links ─── */
282
+
283
+ a.link {
284
+ color: var(--accent);
285
+ text-decoration: none;
286
+ }
287
+
288
+ a.link:hover {
289
+ color: var(--accent-hover);
290
+ text-decoration: underline;
291
+ }
292
+
293
+ /* ─── Code / Mono ─── */
294
+
295
+ code, .mono {
296
+ font-family: var(--font-mono);
297
+ font-size: 12px;
298
+ }
299
+
300
+ pre {
301
+ background: var(--bg-primary);
302
+ border: 1px solid var(--border);
303
+ border-radius: var(--radius);
304
+ padding: 12px 16px;
305
+ overflow-x: auto;
306
+ font-family: var(--font-mono);
307
+ font-size: 12px;
308
+ line-height: 1.6;
309
+ }
310
+
311
+ /* ─── Timeline (session entries) ─── */
312
+
313
+ .timeline {
314
+ position: relative;
315
+ padding-left: 24px;
316
+ }
317
+
318
+ .timeline::before {
319
+ content: '';
320
+ position: absolute;
321
+ left: 7px;
322
+ top: 0;
323
+ bottom: 0;
324
+ width: 2px;
325
+ background: var(--border);
326
+ }
327
+
328
+ .timeline-entry {
329
+ position: relative;
330
+ margin-bottom: 16px;
331
+ padding: 12px 16px;
332
+ background: var(--bg-card);
333
+ border: 1px solid var(--border);
334
+ border-radius: var(--radius);
335
+ }
336
+
337
+ .timeline-entry::before {
338
+ content: '';
339
+ position: absolute;
340
+ left: -21px;
341
+ top: 16px;
342
+ width: 10px;
343
+ height: 10px;
344
+ border-radius: 50%;
345
+ background: var(--border-light);
346
+ border: 2px solid var(--bg-primary);
347
+ }
348
+
349
+ .timeline-entry.type-user::before { background: var(--accent); }
350
+ .timeline-entry.type-assistant::before { background: var(--green); }
351
+ .timeline-entry.type-tool::before { background: var(--purple); }
352
+ .timeline-entry.type-system::before { background: var(--yellow); }
353
+
354
+ .timeline-entry .entry-header {
355
+ display: flex;
356
+ justify-content: space-between;
357
+ align-items: center;
358
+ margin-bottom: 8px;
359
+ }
360
+
361
+ .timeline-entry .entry-type {
362
+ font-size: 11px;
363
+ font-weight: 600;
364
+ text-transform: uppercase;
365
+ letter-spacing: 0.5px;
366
+ }
367
+
368
+ .timeline-entry .entry-time {
369
+ font-size: 11px;
370
+ color: var(--text-muted);
371
+ font-family: var(--font-mono);
372
+ }
373
+
374
+ .timeline-entry .entry-content {
375
+ font-size: 13px;
376
+ white-space: pre-wrap;
377
+ word-break: break-word;
378
+ }
379
+
380
+ .timeline-entry .entry-meta {
381
+ margin-top: 8px;
382
+ font-size: 11px;
383
+ color: var(--text-muted);
384
+ }
385
+
386
+ /* ─── Tabs ─── */
387
+
388
+ .tabs {
389
+ display: flex;
390
+ gap: 0;
391
+ border-bottom: 1px solid var(--border);
392
+ margin-bottom: 16px;
393
+ }
394
+
395
+ .tab {
396
+ padding: 8px 16px;
397
+ color: var(--text-secondary);
398
+ text-decoration: none;
399
+ font-size: 13px;
400
+ border-bottom: 2px solid transparent;
401
+ cursor: pointer;
402
+ background: none;
403
+ border-top: none;
404
+ border-left: none;
405
+ border-right: none;
406
+ }
407
+
408
+ .tab:hover {
409
+ color: var(--text-primary);
410
+ }
411
+
412
+ .tab.active {
413
+ color: var(--text-primary);
414
+ border-bottom-color: var(--accent);
415
+ }
416
+
417
+ /* ─── Log viewer ─── */
418
+
419
+ .log-viewer {
420
+ background: var(--bg-primary);
421
+ border: 1px solid var(--border);
422
+ border-radius: var(--radius);
423
+ padding: 16px;
424
+ height: 500px;
425
+ overflow-y: auto;
426
+ font-family: var(--font-mono);
427
+ font-size: 12px;
428
+ line-height: 1.7;
429
+ }
430
+
431
+ .log-line {
432
+ display: flex;
433
+ gap: 8px;
434
+ }
435
+
436
+ .log-line .log-time {
437
+ color: var(--text-muted);
438
+ white-space: nowrap;
439
+ }
440
+
441
+ .log-line .log-level {
442
+ min-width: 45px;
443
+ font-weight: 600;
444
+ }
445
+
446
+ .log-line .log-level.info { color: var(--accent); }
447
+ .log-line .log-level.warn { color: var(--yellow); }
448
+ .log-line .log-level.error { color: var(--red); }
449
+ .log-line .log-level.debug { color: var(--text-muted); }
450
+
451
+ .log-line .log-msg {
452
+ color: var(--text-secondary);
453
+ word-break: break-all;
454
+ }
455
+
456
+ /* ─── Empty state ─── */
457
+
458
+ .empty-state {
459
+ text-align: center;
460
+ padding: 48px 24px;
461
+ color: var(--text-muted);
462
+ }
463
+
464
+ .empty-state .icon {
465
+ font-size: 36px;
466
+ margin-bottom: 12px;
467
+ }
468
+
469
+ .empty-state p {
470
+ font-size: 14px;
471
+ }
472
+
473
+ /* ─── Utilities ─── */
474
+
475
+ .mt-4 { margin-top: 16px; }
476
+ .mt-6 { margin-top: 24px; }
477
+ .mb-4 { margin-bottom: 16px; }
478
+ .gap-4 { gap: 16px; }
479
+ .flex { display: flex; }
480
+ .flex-wrap { flex-wrap: wrap; }
481
+ .items-center { align-items: center; }
482
+ .justify-between { justify-content: space-between; }
483
+ .text-muted { color: var(--text-muted); }
484
+ .text-sm { font-size: 12px; }
485
+ .text-right { text-align: right; }
486
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
487
+
488
+ /* ─── HTMX loading indicator ─── */
489
+
490
+ .htmx-indicator {
491
+ display: none;
492
+ }
493
+
494
+ .htmx-request .htmx-indicator,
495
+ .htmx-request.htmx-indicator {
496
+ display: inline-block;
497
+ }
498
+
499
+ .spinner {
500
+ display: inline-block;
501
+ width: 16px;
502
+ height: 16px;
503
+ border: 2px solid var(--border);
504
+ border-top-color: var(--accent);
505
+ border-radius: 50%;
506
+ animation: spin 0.6s linear infinite;
507
+ }
508
+
509
+ @keyframes spin {
510
+ to { transform: rotate(360deg); }
511
+ }
512
+
513
+ /* ─── Scrollbar ─── */
514
+
515
+ ::-webkit-scrollbar {
516
+ width: 8px;
517
+ height: 8px;
518
+ }
519
+
520
+ ::-webkit-scrollbar-track {
521
+ background: var(--bg-primary);
522
+ }
523
+
524
+ ::-webkit-scrollbar-thumb {
525
+ background: var(--border);
526
+ border-radius: 4px;
527
+ }
528
+
529
+ ::-webkit-scrollbar-thumb:hover {
530
+ background: var(--border-light);
531
+ }
532
+
533
+ /* Token Consumption Chart */
534
+ .token-chart { display: flex; flex-direction: column; gap: 10px; }
535
+ .token-chart-row { display: flex; align-items: center; gap: 12px; }
536
+ .token-chart-label { width: 140px; flex-shrink: 0; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
537
+ .token-chart-bars { flex: 1; min-width: 0; }
538
+ .token-chart-bar-track { display: flex; height: 22px; background: var(--bg-tertiary); border-radius: 4px; overflow: hidden; }
539
+ .token-chart-bar { height: 100%; transition: width 0.4s ease; }
540
+ .token-chart-bar.prompt { background: var(--purple); }
541
+ .token-chart-bar.completion { background: var(--green); }
542
+ .token-chart-value { width: 160px; flex-shrink: 0; text-align: right; font-size: 13px; }
543
+
544
+ /* Stacked Bar Chart (24h) */
545
+ .stacked-chart { padding: 8px 0; }
546
+ .stacked-chart-bars { display: flex; align-items: flex-end; gap: 3px; height: 140px; }
547
+ .stacked-chart-col { flex: 1; display: flex; flex-direction: column; align-items: stretch; height: 100%; justify-content: flex-end; min-width: 0; }
548
+ .stacked-chart-stack { display: flex; flex-direction: column; border-radius: 3px 3px 0 0; overflow: hidden; min-height: 0; transition: height 0.3s ease; }
549
+ .stacked-seg { min-height: 1px; }
550
+ .stacked-chart-label { text-align: center; font-size: 9px; color: var(--text-secondary); margin-top: 4px; font-family: var(--font-mono); }
551
+
552
+ /* Filter Controls */
553
+ .btn-group { display: inline-flex; gap: 2px; }
554
+ .btn { padding: 4px 10px; background: var(--bg-tertiary); border: 1px solid var(--border); border-radius: 4px; color: var(--text-secondary); cursor: pointer; font-size: 12px; font-family: inherit; transition: all 0.15s; }
555
+ .btn:hover { background: var(--border); color: var(--text-primary); }
556
+ .btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
557
+ .btn-sm { padding: 3px 8px; font-size: 11px; }
558
+ .filter-select { padding: 4px 8px; background: var(--bg-tertiary); border: 1px solid var(--border); border-radius: 4px; color: var(--text-primary); font-size: 12px; font-family: inherit; cursor: pointer; }
559
+ .filter-select:focus { outline: none; border-color: var(--accent); }
560
+
561
+ /* ─── Browser Sessions List ─── */
562
+
563
+ .browser-sessions-list {
564
+ display: flex;
565
+ flex-direction: column;
566
+ gap: 8px;
567
+ }
568
+
569
+ .browser-session-card {
570
+ display: block;
571
+ background: var(--bg-card);
572
+ border: 1px solid var(--border);
573
+ border-left: 3px solid var(--border);
574
+ border-radius: var(--radius);
575
+ padding: 14px 18px;
576
+ text-decoration: none;
577
+ color: inherit;
578
+ transition: background 0.15s, border-color 0.15s;
579
+ }
580
+
581
+ .browser-session-card:hover {
582
+ background: var(--bg-tertiary);
583
+ border-color: var(--border-light);
584
+ }
585
+
586
+ .bsc-top {
587
+ display: flex;
588
+ justify-content: space-between;
589
+ align-items: center;
590
+ margin-bottom: 8px;
591
+ }
592
+
593
+ .bsc-status {
594
+ display: flex;
595
+ align-items: center;
596
+ gap: 8px;
597
+ }
598
+
599
+ .bsc-platform {
600
+ font-size: 11px;
601
+ color: var(--purple);
602
+ background: var(--purple-bg);
603
+ padding: 1px 7px;
604
+ border-radius: 10px;
605
+ font-weight: 500;
606
+ }
607
+
608
+ .bsc-meta {
609
+ display: flex;
610
+ align-items: center;
611
+ gap: 6px;
612
+ font-size: 12px;
613
+ color: var(--text-muted);
614
+ }
615
+
616
+ .bsc-sep {
617
+ color: var(--border-light);
618
+ }
619
+
620
+ .bsc-duration,
621
+ .bsc-steps,
622
+ .bsc-time {
623
+ font-family: var(--font-mono);
624
+ font-size: 11px;
625
+ }
626
+
627
+ .bsc-goal {
628
+ font-size: 13px;
629
+ color: var(--text-primary);
630
+ line-height: 1.5;
631
+ margin-bottom: 8px;
632
+ }
633
+
634
+ .bsc-bottom {
635
+ display: flex;
636
+ justify-content: space-between;
637
+ align-items: center;
638
+ }
639
+
640
+ .bsc-agent {
641
+ font-size: 12px;
642
+ font-weight: 500;
643
+ color: var(--accent);
644
+ }
645
+
646
+ .bsc-id {
647
+ font-size: 11px;
648
+ color: var(--text-muted);
649
+ }
650
+
651
+ /* ─── Browser Session Detail ─── */
652
+
653
+ .bsd-back {
654
+ display: inline-block;
655
+ color: var(--text-muted);
656
+ text-decoration: none;
657
+ font-size: 12px;
658
+ margin-bottom: 4px;
659
+ transition: color 0.15s;
660
+ }
661
+
662
+ .bsd-back:hover {
663
+ color: var(--accent);
664
+ }
665
+
666
+ .bsd-header {
667
+ background: var(--bg-card);
668
+ border: 1px solid var(--border);
669
+ border-left: 4px solid var(--border);
670
+ border-radius: var(--radius-lg);
671
+ padding: 20px 24px;
672
+ margin-bottom: 24px;
673
+ }
674
+
675
+ .bsd-header-top {
676
+ display: flex;
677
+ justify-content: space-between;
678
+ align-items: center;
679
+ margin-bottom: 12px;
680
+ }
681
+
682
+ .bsd-header-left {
683
+ display: flex;
684
+ align-items: center;
685
+ gap: 8px;
686
+ }
687
+
688
+ .bsd-platform-tag {
689
+ font-size: 11px;
690
+ color: var(--purple);
691
+ background: var(--purple-bg);
692
+ padding: 2px 8px;
693
+ border-radius: 10px;
694
+ font-weight: 500;
695
+ }
696
+
697
+ .bsd-agent-tag {
698
+ font-size: 11px;
699
+ color: var(--accent);
700
+ background: rgba(88, 166, 255, 0.12);
701
+ padding: 2px 8px;
702
+ border-radius: 10px;
703
+ font-weight: 500;
704
+ }
705
+
706
+ .bsd-id {
707
+ font-size: 11px;
708
+ color: var(--text-muted);
709
+ user-select: all;
710
+ }
711
+
712
+ .bsd-goal {
713
+ font-size: 14px;
714
+ color: var(--text-primary);
715
+ line-height: 1.6;
716
+ margin-bottom: 16px;
717
+ }
718
+
719
+ .bsd-stats {
720
+ display: flex;
721
+ gap: 32px;
722
+ flex-wrap: wrap;
723
+ }
724
+
725
+ .bsd-stat {
726
+ display: flex;
727
+ flex-direction: column;
728
+ gap: 2px;
729
+ }
730
+
731
+ .bsd-stat-label {
732
+ font-size: 11px;
733
+ color: var(--text-muted);
734
+ text-transform: uppercase;
735
+ letter-spacing: 0.5px;
736
+ }
737
+
738
+ .bsd-stat-value {
739
+ font-size: 13px;
740
+ color: var(--text-secondary);
741
+ }
742
+
743
+ /* ─── Steps Timeline ─── */
744
+
745
+ .bsd-timeline {
746
+ position: relative;
747
+ }
748
+
749
+ .bsd-step {
750
+ display: flex;
751
+ gap: 16px;
752
+ position: relative;
753
+ }
754
+
755
+ .bsd-step-connector {
756
+ display: flex;
757
+ flex-direction: column;
758
+ align-items: center;
759
+ width: 24px;
760
+ flex-shrink: 0;
761
+ padding-top: 18px;
762
+ }
763
+
764
+ .bsd-step-dot {
765
+ width: 12px;
766
+ height: 12px;
767
+ border-radius: 50%;
768
+ background: var(--border-light);
769
+ border: 2px solid var(--bg-primary);
770
+ z-index: 1;
771
+ flex-shrink: 0;
772
+ }
773
+
774
+ .bsd-step-line {
775
+ width: 2px;
776
+ flex: 1;
777
+ background: var(--border);
778
+ margin-top: 4px;
779
+ }
780
+
781
+ /* Step type colors */
782
+ .step-goto .bsd-step-dot { background: var(--accent); }
783
+ .step-act .bsd-step-dot { background: var(--yellow); }
784
+ .step-extract .bsd-step-dot { background: var(--green); }
785
+ .step-observe .bsd-step-dot { background: var(--purple); }
786
+ .step-agent .bsd-step-dot { background: var(--accent); }
787
+
788
+ .bsd-step-content {
789
+ flex: 1;
790
+ min-width: 0;
791
+ background: var(--bg-card);
792
+ border: 1px solid var(--border);
793
+ border-radius: var(--radius);
794
+ padding: 14px 18px;
795
+ margin-bottom: 12px;
796
+ }
797
+
798
+ .bsd-step-failed .bsd-step-content {
799
+ border-color: rgba(248, 81, 73, 0.3);
800
+ }
801
+
802
+ .bsd-step-header {
803
+ display: flex;
804
+ justify-content: space-between;
805
+ align-items: center;
806
+ margin-bottom: 8px;
807
+ }
808
+
809
+ .bsd-step-title {
810
+ display: flex;
811
+ align-items: center;
812
+ gap: 8px;
813
+ }
814
+
815
+ .bsd-step-icon {
816
+ font-size: 14px;
817
+ }
818
+
819
+ .step-goto .bsd-step-icon { color: var(--accent); }
820
+ .step-act .bsd-step-icon { color: var(--yellow); }
821
+ .step-extract .bsd-step-icon { color: var(--green); }
822
+ .step-observe .bsd-step-icon { color: var(--purple); }
823
+ .step-agent .bsd-step-icon { color: var(--accent); }
824
+
825
+ .bsd-step-type {
826
+ font-size: 12px;
827
+ font-weight: 600;
828
+ text-transform: uppercase;
829
+ letter-spacing: 0.3px;
830
+ color: var(--text-secondary);
831
+ }
832
+
833
+ .bsd-step-num {
834
+ font-size: 11px;
835
+ color: var(--text-muted);
836
+ }
837
+
838
+ .bsd-step-duration {
839
+ font-size: 11px;
840
+ color: var(--text-muted);
841
+ }
842
+
843
+ .bsd-step-instruction {
844
+ font-size: 13px;
845
+ color: var(--text-primary);
846
+ line-height: 1.5;
847
+ margin-bottom: 4px;
848
+ }
849
+
850
+ .bsd-step-result {
851
+ margin-top: 8px;
852
+ }
853
+
854
+ .bsd-step-message {
855
+ font-size: 12px;
856
+ color: var(--text-secondary);
857
+ line-height: 1.5;
858
+ padding: 8px 12px;
859
+ background: var(--bg-secondary);
860
+ border-radius: var(--radius);
861
+ border: 1px solid var(--border);
862
+ }
863
+
864
+ .bsd-step-message-error {
865
+ color: var(--red);
866
+ background: var(--red-bg);
867
+ border-color: rgba(248, 81, 73, 0.2);
868
+ }
869
+
870
+ .bsd-step-details {
871
+ margin-top: 8px;
872
+ }
873
+
874
+ .bsd-step-details summary {
875
+ font-size: 11px;
876
+ color: var(--text-muted);
877
+ cursor: pointer;
878
+ user-select: none;
879
+ }
880
+
881
+ .bsd-step-details summary:hover {
882
+ color: var(--text-secondary);
883
+ }
884
+
885
+ .bsd-step-details pre {
886
+ margin-top: 6px;
887
+ font-size: 11px;
888
+ background: var(--bg-primary);
889
+ border: 1px solid var(--border);
890
+ padding: 10px 14px;
891
+ border-radius: var(--radius);
892
+ overflow-x: auto;
893
+ max-height: 300px;
894
+ overflow-y: auto;
895
+ }
896
+
897
+ /* ─── Screenshots ─── */
898
+
899
+ .bsd-step-screenshot {
900
+ margin-top: 12px;
901
+ }
902
+
903
+ .bsd-step-screenshot img {
904
+ width: 100%;
905
+ max-width: 800px;
906
+ border-radius: var(--radius);
907
+ border: 1px solid var(--border);
908
+ cursor: pointer;
909
+ transition: opacity 0.15s, border-color 0.15s;
910
+ }
911
+
912
+ .bsd-step-screenshot img:hover {
913
+ border-color: var(--accent);
914
+ opacity: 0.92;
915
+ }
916
+
917
+ /* ─── Lightbox ─── */
918
+
919
+ .bsd-lightbox {
920
+ display: none;
921
+ position: fixed;
922
+ inset: 0;
923
+ z-index: 1000;
924
+ background: rgba(0, 0, 0, 0.88);
925
+ align-items: center;
926
+ justify-content: center;
927
+ cursor: pointer;
928
+ backdrop-filter: blur(4px);
929
+ }
930
+
931
+ .bsd-lightbox.active {
932
+ display: flex;
933
+ }
934
+
935
+ .bsd-lightbox img {
936
+ max-width: 92vw;
937
+ max-height: 92vh;
938
+ border-radius: var(--radius-lg);
939
+ box-shadow: 0 8px 40px rgba(0, 0, 0, 0.6);
940
+ cursor: default;
941
+ }
942
+
943
+ .bsd-lightbox-close {
944
+ position: absolute;
945
+ top: 20px;
946
+ right: 28px;
947
+ font-size: 24px;
948
+ color: var(--text-secondary);
949
+ cursor: pointer;
950
+ width: 36px;
951
+ height: 36px;
952
+ display: flex;
953
+ align-items: center;
954
+ justify-content: center;
955
+ border-radius: 50%;
956
+ background: var(--bg-secondary);
957
+ border: 1px solid var(--border);
958
+ transition: color 0.15s, background 0.15s;
959
+ }
960
+
961
+ .bsd-lightbox-close:hover {
962
+ color: var(--text-primary);
963
+ background: var(--bg-tertiary);
964
+ }
965
+
966
+ /* Lightbox navigation arrows */
967
+ .bsd-lightbox-nav {
968
+ position: absolute;
969
+ top: 50%;
970
+ transform: translateY(-50%);
971
+ background: var(--bg-secondary);
972
+ border: 1px solid var(--border);
973
+ color: var(--text-primary);
974
+ font-size: 28px;
975
+ width: 44px;
976
+ height: 64px;
977
+ display: flex;
978
+ align-items: center;
979
+ justify-content: center;
980
+ border-radius: var(--radius);
981
+ cursor: pointer;
982
+ transition: background 0.15s, color 0.15s;
983
+ z-index: 1001;
984
+ }
985
+ .bsd-lightbox-nav:hover {
986
+ background: var(--bg-tertiary);
987
+ color: var(--accent);
988
+ }
989
+ .bsd-lightbox-prev { left: 16px; }
990
+ .bsd-lightbox-next { right: 16px; }
991
+ .bsd-lightbox-info {
992
+ position: absolute;
993
+ bottom: 20px;
994
+ left: 50%;
995
+ transform: translateX(-50%);
996
+ background: var(--bg-secondary);
997
+ border: 1px solid var(--border);
998
+ padding: 6px 16px;
999
+ border-radius: 20px;
1000
+ font-size: 12px;
1001
+ color: var(--text-secondary);
1002
+ white-space: nowrap;
1003
+ max-width: 80vw;
1004
+ overflow: hidden;
1005
+ text-overflow: ellipsis;
1006
+ }
1007
+
1008
+ /* ─── URLs Visited ─── */
1009
+ .bsd-urls {
1010
+ display: flex;
1011
+ flex-wrap: wrap;
1012
+ align-items: center;
1013
+ gap: 6px;
1014
+ margin-bottom: 16px;
1015
+ }
1016
+ .bsd-urls-label {
1017
+ font-size: 11px;
1018
+ color: var(--text-muted);
1019
+ text-transform: uppercase;
1020
+ letter-spacing: 0.5px;
1021
+ }
1022
+ .bsd-url-chip {
1023
+ font-size: 11px;
1024
+ color: var(--accent);
1025
+ background: rgba(88, 166, 255, 0.08);
1026
+ border: 1px solid rgba(88, 166, 255, 0.2);
1027
+ padding: 2px 10px;
1028
+ border-radius: 12px;
1029
+ text-decoration: none;
1030
+ max-width: 500px;
1031
+ overflow: hidden;
1032
+ text-overflow: ellipsis;
1033
+ white-space: nowrap;
1034
+ display: inline-block;
1035
+ transition: background 0.15s, border-color 0.15s;
1036
+ }
1037
+ .bsd-url-chip:hover {
1038
+ background: rgba(88, 166, 255, 0.15);
1039
+ border-color: var(--accent);
1040
+ }
1041
+
1042
+ /* ─── Step URL display (for goto) ─── */
1043
+ .bsd-step-url {
1044
+ margin-bottom: 4px;
1045
+ }
1046
+ .bsd-url-link {
1047
+ font-size: 12px;
1048
+ color: var(--accent);
1049
+ text-decoration: none;
1050
+ padding: 4px 10px;
1051
+ background: rgba(88, 166, 255, 0.06);
1052
+ border: 1px solid rgba(88, 166, 255, 0.15);
1053
+ border-radius: var(--radius);
1054
+ display: inline-block;
1055
+ max-width: 100%;
1056
+ overflow: hidden;
1057
+ text-overflow: ellipsis;
1058
+ white-space: nowrap;
1059
+ transition: background 0.15s;
1060
+ }
1061
+ .bsd-url-link:hover {
1062
+ background: rgba(88, 166, 255, 0.12);
1063
+ }
1064
+
1065
+ /* ─── Extract result display ─── */
1066
+ .bsd-extract-result {
1067
+ background: var(--bg-secondary);
1068
+ border: 1px solid var(--border);
1069
+ border-radius: var(--radius);
1070
+ padding: 10px 14px;
1071
+ margin-bottom: 4px;
1072
+ }
1073
+ .bsd-extract-label {
1074
+ font-size: 10px;
1075
+ color: var(--green);
1076
+ text-transform: uppercase;
1077
+ letter-spacing: 0.5px;
1078
+ margin-bottom: 6px;
1079
+ font-weight: 600;
1080
+ }
1081
+ .bsd-extract-data {
1082
+ font-size: 12px;
1083
+ color: var(--text-primary);
1084
+ line-height: 1.6;
1085
+ }
1086
+ .bsd-kv-key {
1087
+ color: var(--text-muted);
1088
+ font-weight: 500;
1089
+ }
1090
+
1091
+ /* ─── Active step highlight (player) ─── */
1092
+ .bsd-step-active > .bsd-step-content {
1093
+ border-color: var(--accent);
1094
+ box-shadow: 0 0 0 1px rgba(88, 166, 255, 0.3);
1095
+ }
1096
+
1097
+ /* ─── Screenshot Player ─── */
1098
+ .bsd-player {
1099
+ background: var(--bg-card);
1100
+ border: 1px solid var(--border);
1101
+ border-radius: var(--radius-lg);
1102
+ overflow: hidden;
1103
+ margin-bottom: 24px;
1104
+ }
1105
+ .bsd-player-header {
1106
+ display: flex;
1107
+ justify-content: space-between;
1108
+ align-items: center;
1109
+ padding: 12px 18px;
1110
+ border-bottom: 1px solid var(--border);
1111
+ }
1112
+ .bsd-player-title {
1113
+ font-size: 12px;
1114
+ font-weight: 600;
1115
+ color: var(--text-secondary);
1116
+ text-transform: uppercase;
1117
+ letter-spacing: 0.5px;
1118
+ }
1119
+ .bsd-player-controls {
1120
+ display: flex;
1121
+ align-items: center;
1122
+ gap: 8px;
1123
+ }
1124
+ .bsd-player-btn {
1125
+ background: var(--bg-secondary);
1126
+ border: 1px solid var(--border);
1127
+ color: var(--text-primary);
1128
+ width: 32px;
1129
+ height: 28px;
1130
+ display: flex;
1131
+ align-items: center;
1132
+ justify-content: center;
1133
+ border-radius: var(--radius);
1134
+ cursor: pointer;
1135
+ font-size: 12px;
1136
+ transition: background 0.15s, border-color 0.15s;
1137
+ }
1138
+ .bsd-player-btn:hover {
1139
+ background: var(--bg-tertiary);
1140
+ border-color: var(--accent);
1141
+ }
1142
+ .bsd-player-counter {
1143
+ font-size: 12px;
1144
+ color: var(--text-muted);
1145
+ min-width: 60px;
1146
+ text-align: center;
1147
+ }
1148
+ .bsd-player-speed {
1149
+ background: var(--bg-secondary);
1150
+ border: 1px solid var(--border);
1151
+ color: var(--text-secondary);
1152
+ border-radius: var(--radius);
1153
+ padding: 3px 6px;
1154
+ font-size: 11px;
1155
+ cursor: pointer;
1156
+ }
1157
+ .bsd-player-viewport {
1158
+ position: relative;
1159
+ background: var(--bg-primary);
1160
+ display: flex;
1161
+ flex-direction: column;
1162
+ align-items: center;
1163
+ }
1164
+ .bsd-player-viewport img {
1165
+ max-width: 100%;
1166
+ max-height: 500px;
1167
+ object-fit: contain;
1168
+ }
1169
+ .bsd-player-caption {
1170
+ padding: 8px 18px;
1171
+ font-size: 12px;
1172
+ color: var(--text-secondary);
1173
+ text-align: center;
1174
+ width: 100%;
1175
+ background: var(--bg-secondary);
1176
+ border-top: 1px solid var(--border);
1177
+ }
1178
+ .bsd-player-progress {
1179
+ height: 3px;
1180
+ background: var(--bg-tertiary);
1181
+ }
1182
+ .bsd-player-bar {
1183
+ height: 100%;
1184
+ background: var(--accent);
1185
+ transition: width 0.3s ease;
1186
+ }
1187
+
1188
+ /* Log Table */
1189
+ .log-table { font-family: var(--font-mono); }
1190
+ .log-row:hover { background: var(--bg-tertiary); }
1191
+ .log-row.expanded td:first-child { color: var(--accent); }
1192
+ .log-detail-pre { margin: 0; font-size: 11px; line-height: 1.5; color: var(--text-secondary); white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; }