@agenttrace-io/dashboard 0.1.9

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,1018 @@
1
+ /* AgentTrace Dashboard — Complete UI Overhaul
2
+ Design System (exact per spec):
3
+ - Dark: #0a0a0c bg, #111113 surface, #16161a elevated, #242429 border
4
+ - Text: #e8e8eb primary, #9a9aa0 muted
5
+ - Accent: #3b82f6 / #60a5fa
6
+ - Success #22c55e, Warning #eab308, Error #ef4444
7
+ - 4px base spacing, 8px cards, 6px buttons, 999px badges
8
+ - System fonts only, 14px base
9
+ Pure vanilla, no external deps.
10
+ */
11
+
12
+ :root {
13
+ --bg: #0a0a0c;
14
+ --surface: #111113;
15
+ --surface-elev: #16161a;
16
+ --border: #242429;
17
+ --text: #e8e8eb;
18
+ --text-muted: #9a9aa0;
19
+ --accent: #3b82f6;
20
+ --accent-hover: #60a5fa;
21
+ --success: #22c55e;
22
+ --warning: #eab308;
23
+ --error: #ef4444;
24
+ --radius-card: 8px;
25
+ --radius-btn: 6px;
26
+ --radius-badge: 999px;
27
+ --space-1: 4px;
28
+ --space-2: 8px;
29
+ --space-3: 12px;
30
+ --space-4: 16px;
31
+ --space-5: 20px;
32
+ --space-6: 24px;
33
+ --space-7: 32px;
34
+ --font-sans:
35
+ system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
36
+ sans-serif;
37
+ --font-mono:
38
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
39
+ monospace;
40
+ }
41
+
42
+ *,
43
+ *::before,
44
+ *::after {
45
+ box-sizing: border-box;
46
+ }
47
+
48
+ html,
49
+ body {
50
+ margin: 0;
51
+ padding: 0;
52
+ background: var(--bg);
53
+ color: var(--text);
54
+ font-family: var(--font-sans);
55
+ font-size: 14px;
56
+ line-height: 1.6;
57
+ -webkit-font-smoothing: antialiased;
58
+ -moz-osx-font-smoothing: grayscale;
59
+ }
60
+
61
+ a {
62
+ color: var(--accent);
63
+ text-decoration: none;
64
+ }
65
+ a:hover {
66
+ text-decoration: underline;
67
+ }
68
+ a:focus-visible {
69
+ outline: 2px solid var(--accent);
70
+ outline-offset: 2px;
71
+ }
72
+
73
+ /* Topbar */
74
+ .topbar {
75
+ background: var(--surface);
76
+ border-bottom: 1px solid var(--border);
77
+ position: sticky;
78
+ top: 0;
79
+ z-index: 100;
80
+ }
81
+ .topbar-inner {
82
+ max-width: 1200px;
83
+ margin: 0 auto;
84
+ padding: var(--space-3) var(--space-6);
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: space-between;
88
+ gap: var(--space-4);
89
+ flex-wrap: wrap;
90
+ }
91
+ .brand {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: var(--space-3);
95
+ }
96
+ .brand-logo {
97
+ width: 22px;
98
+ height: 22px;
99
+ display: inline-flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ }
103
+ .brand h1 {
104
+ margin: 0;
105
+ font-size: 18px;
106
+ font-weight: 600;
107
+ letter-spacing: -0.3px;
108
+ }
109
+ .brand .subtitle {
110
+ font-size: 10px;
111
+ color: var(--text-muted);
112
+ text-transform: uppercase;
113
+ letter-spacing: 0.8px;
114
+ margin-left: 2px;
115
+ }
116
+ .top-actions {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: var(--space-2);
120
+ flex-wrap: wrap;
121
+ }
122
+ .version {
123
+ font-size: 11px;
124
+ color: var(--text-muted);
125
+ padding: 1px 8px;
126
+ border: 1px solid var(--border);
127
+ border-radius: var(--radius-badge);
128
+ background: var(--bg);
129
+ }
130
+
131
+ /* Container & Layout */
132
+ .container {
133
+ max-width: 1200px;
134
+ margin: 0 auto;
135
+ padding: var(--space-6);
136
+ }
137
+ .section {
138
+ margin-bottom: var(--space-6);
139
+ }
140
+
141
+ /* Stats */
142
+ .stats-grid {
143
+ display: grid;
144
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
145
+ gap: var(--space-3);
146
+ margin-bottom: var(--space-5);
147
+ }
148
+ .stat-card {
149
+ background: var(--surface);
150
+ border: 1px solid var(--border);
151
+ border-radius: var(--radius-card);
152
+ padding: var(--space-4) var(--space-5);
153
+ min-height: 92px;
154
+ display: flex;
155
+ flex-direction: column;
156
+ justify-content: center;
157
+ }
158
+ .stat-value {
159
+ font-size: 26px;
160
+ font-weight: 600;
161
+ line-height: 1.1;
162
+ font-variant-numeric: tabular-nums;
163
+ margin-bottom: 2px;
164
+ }
165
+ .stat-label {
166
+ font-size: 11px;
167
+ color: var(--text-muted);
168
+ text-transform: uppercase;
169
+ letter-spacing: 0.6px;
170
+ }
171
+ .stat-spark {
172
+ margin-top: 6px;
173
+ height: 28px;
174
+ }
175
+
176
+ /* Burn rate + Top agents row */
177
+ .side-by-side {
178
+ display: grid;
179
+ grid-template-columns: 1fr 1fr;
180
+ gap: var(--space-4);
181
+ margin-bottom: var(--space-5);
182
+ }
183
+ @media (max-width: 720px) {
184
+ .side-by-side {
185
+ grid-template-columns: 1fr;
186
+ }
187
+ }
188
+ .burn-card {
189
+ background: var(--surface);
190
+ border: 1px solid var(--border);
191
+ border-radius: var(--radius-card);
192
+ padding: var(--space-4) var(--space-5);
193
+ }
194
+ .burn-label {
195
+ font-size: 11px;
196
+ color: var(--text-muted);
197
+ text-transform: uppercase;
198
+ letter-spacing: 0.6px;
199
+ margin-bottom: 6px;
200
+ }
201
+ .burn-value {
202
+ font-size: 22px;
203
+ font-weight: 600;
204
+ font-variant-numeric: tabular-nums;
205
+ }
206
+ .burn-sub {
207
+ font-size: 12px;
208
+ color: var(--text-muted);
209
+ margin-top: 2px;
210
+ }
211
+ .top-agents {
212
+ background: var(--surface);
213
+ border: 1px solid var(--border);
214
+ border-radius: var(--radius-card);
215
+ padding: var(--space-4) var(--space-5);
216
+ }
217
+ .top-agents h3 {
218
+ margin: 0 0 8px;
219
+ font-size: 12px;
220
+ color: var(--text-muted);
221
+ text-transform: uppercase;
222
+ letter-spacing: 0.6px;
223
+ }
224
+ .top-agents-list {
225
+ font-size: 13px;
226
+ }
227
+ .top-agents-list .row {
228
+ display: flex;
229
+ justify-content: space-between;
230
+ padding: 3px 0;
231
+ border-bottom: 1px solid var(--border);
232
+ }
233
+ .top-agents-list .row:last-child {
234
+ border-bottom: none;
235
+ }
236
+ .top-agents-list .name {
237
+ font-family: var(--font-mono);
238
+ color: var(--accent);
239
+ max-width: 60%;
240
+ overflow: hidden;
241
+ text-overflow: ellipsis;
242
+ white-space: nowrap;
243
+ }
244
+ .top-agents-list .cost {
245
+ font-variant-numeric: tabular-nums;
246
+ color: var(--text-muted);
247
+ }
248
+
249
+ /* Toolbar */
250
+ .toolbar {
251
+ display: flex;
252
+ align-items: center;
253
+ gap: var(--space-3);
254
+ margin-bottom: var(--space-3);
255
+ flex-wrap: wrap;
256
+ }
257
+ .search-input {
258
+ background: var(--surface);
259
+ border: 1px solid var(--border);
260
+ border-radius: var(--radius-btn);
261
+ color: var(--text);
262
+ font-size: 13px;
263
+ padding: 7px 12px;
264
+ width: 260px;
265
+ max-width: 100%;
266
+ }
267
+ .search-input:focus {
268
+ outline: none;
269
+ border-color: var(--accent);
270
+ }
271
+ .search-input::placeholder {
272
+ color: var(--text-muted);
273
+ }
274
+ .filter-group {
275
+ display: flex;
276
+ background: var(--surface);
277
+ border: 1px solid var(--border);
278
+ border-radius: var(--radius-card);
279
+ overflow: hidden;
280
+ }
281
+ .filter-btn {
282
+ background: transparent;
283
+ color: var(--text);
284
+ border: none;
285
+ padding: 6px 14px;
286
+ font-size: 12px;
287
+ cursor: pointer;
288
+ border-right: 1px solid var(--border);
289
+ transition: background 0.08s ease;
290
+ }
291
+ .filter-btn:last-child {
292
+ border-right: none;
293
+ }
294
+ .filter-btn:hover {
295
+ background: var(--surface-elev);
296
+ }
297
+ .filter-btn.active {
298
+ background: var(--accent);
299
+ color: #fff;
300
+ font-weight: 500;
301
+ }
302
+ .date-range {
303
+ display: flex;
304
+ background: var(--surface);
305
+ border: 1px solid var(--border);
306
+ border-radius: var(--radius-card);
307
+ overflow: hidden;
308
+ }
309
+ .date-btn {
310
+ background: transparent;
311
+ color: var(--text);
312
+ border: none;
313
+ padding: 6px 12px;
314
+ font-size: 12px;
315
+ cursor: pointer;
316
+ border-right: 1px solid var(--border);
317
+ }
318
+ .date-btn:last-child {
319
+ border-right: none;
320
+ }
321
+ .date-btn:hover {
322
+ background: var(--surface-elev);
323
+ }
324
+ .date-btn.active {
325
+ background: var(--accent);
326
+ color: #fff;
327
+ }
328
+ .toolbar-spacer {
329
+ flex: 1;
330
+ }
331
+ .status-hint {
332
+ font-size: 12px;
333
+ color: var(--text-muted);
334
+ }
335
+
336
+ /* Panels */
337
+ .panel {
338
+ background: var(--surface);
339
+ border: 1px solid var(--border);
340
+ border-radius: var(--radius-card);
341
+ margin-bottom: var(--space-4);
342
+ overflow: hidden;
343
+ }
344
+ .panel-header {
345
+ padding: var(--space-3) var(--space-4);
346
+ border-bottom: 1px solid var(--border);
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: space-between;
350
+ background: var(--surface-elev);
351
+ gap: var(--space-2);
352
+ }
353
+ .panel-header h2 {
354
+ margin: 0;
355
+ font-size: 14px;
356
+ font-weight: 600;
357
+ }
358
+ .count-badge {
359
+ font-size: 11px;
360
+ padding: 1px 8px;
361
+ background: var(--bg);
362
+ border: 1px solid var(--border);
363
+ border-radius: var(--radius-badge);
364
+ color: var(--text-muted);
365
+ }
366
+ .run-name {
367
+ font-family: var(--font-mono);
368
+ color: var(--accent);
369
+ }
370
+
371
+ /* Lists */
372
+ .runs-list,
373
+ .traces-list {
374
+ padding: 2px 0;
375
+ }
376
+ .run-item,
377
+ .trace-item {
378
+ padding: var(--space-3) var(--space-4);
379
+ border-bottom: 1px solid var(--border);
380
+ cursor: pointer;
381
+ transition: background 0.06s ease;
382
+ display: block;
383
+ outline: none;
384
+ }
385
+ .run-item:last-child,
386
+ .trace-item:last-child {
387
+ border-bottom: none;
388
+ }
389
+ .run-item:hover,
390
+ .trace-item:hover {
391
+ background: var(--surface-elev);
392
+ }
393
+ .run-item:focus-visible,
394
+ .trace-item:focus-visible {
395
+ outline: 2px solid var(--accent);
396
+ outline-offset: -2px;
397
+ }
398
+ .run-item.selected,
399
+ .trace-item.selected {
400
+ background: rgba(59, 130, 246, 0.08);
401
+ border-left: 3px solid var(--accent);
402
+ padding-left: calc(var(--space-4) - 3px);
403
+ }
404
+
405
+ /* Run row */
406
+ .run-header {
407
+ display: flex;
408
+ align-items: center;
409
+ gap: var(--space-2);
410
+ margin-bottom: 4px;
411
+ flex-wrap: wrap;
412
+ }
413
+ .run-title {
414
+ font-weight: 500;
415
+ font-size: 14px;
416
+ }
417
+ .run-meta {
418
+ display: flex;
419
+ gap: 14px;
420
+ font-size: 12px;
421
+ color: var(--text-muted);
422
+ flex-wrap: wrap;
423
+ align-items: center;
424
+ }
425
+ .meta-item {
426
+ white-space: nowrap;
427
+ }
428
+ .cost-bar {
429
+ display: inline-block;
430
+ height: 3px;
431
+ background: var(--accent);
432
+ border-radius: 3px;
433
+ vertical-align: middle;
434
+ margin-left: 6px;
435
+ min-width: 2px;
436
+ max-width: 80px;
437
+ }
438
+
439
+ /* Badges */
440
+ .badge {
441
+ display: inline-block;
442
+ font-size: 10px;
443
+ font-weight: 600;
444
+ padding: 1px 8px;
445
+ border-radius: var(--radius-badge);
446
+ text-transform: uppercase;
447
+ letter-spacing: 0.5px;
448
+ border: 1px solid transparent;
449
+ }
450
+ .badge.success {
451
+ background: rgba(34, 197, 94, 0.12);
452
+ color: var(--success);
453
+ border-color: rgba(34, 197, 94, 0.25);
454
+ }
455
+ .badge.failure,
456
+ .badge.error {
457
+ background: rgba(239, 68, 68, 0.12);
458
+ color: var(--error);
459
+ border-color: rgba(239, 68, 68, 0.25);
460
+ }
461
+ .badge.running {
462
+ background: rgba(234, 179, 8, 0.12);
463
+ color: var(--warning);
464
+ border-color: rgba(234, 179, 8, 0.25);
465
+ }
466
+ .badge.timeout {
467
+ background: rgba(245, 158, 11, 0.12);
468
+ color: #f59e0b;
469
+ border-color: rgba(245, 158, 11, 0.25);
470
+ }
471
+
472
+ /* Trace / Details */
473
+ .trace-header {
474
+ display: flex;
475
+ align-items: center;
476
+ gap: 8px;
477
+ margin-bottom: 6px;
478
+ }
479
+ .trace-name {
480
+ font-weight: 500;
481
+ }
482
+ .trace-meta {
483
+ font-size: 12px;
484
+ color: var(--text-muted);
485
+ }
486
+
487
+ .trace-details {
488
+ padding: var(--space-2) 0 var(--space-4);
489
+ }
490
+ .detail-section {
491
+ margin: 10px 0;
492
+ }
493
+ .detail-section-header {
494
+ display: flex;
495
+ align-items: center;
496
+ justify-content: space-between;
497
+ padding: 4px 0;
498
+ cursor: pointer;
499
+ user-select: none;
500
+ }
501
+ .detail-section-header h4 {
502
+ margin: 0;
503
+ font-size: 12px;
504
+ color: var(--text-muted);
505
+ text-transform: uppercase;
506
+ letter-spacing: 0.6px;
507
+ }
508
+ .detail-section-header .chevron {
509
+ transition: transform 0.12s ease;
510
+ }
511
+ .detail-section.collapsed .detail-section-body {
512
+ display: none;
513
+ }
514
+ .detail-section.collapsed .chevron {
515
+ transform: rotate(-90deg);
516
+ }
517
+
518
+ .detail-row {
519
+ display: grid;
520
+ grid-template-columns: 110px 1fr;
521
+ gap: 8px;
522
+ margin: 4px 0;
523
+ font-size: 13px;
524
+ }
525
+ .detail-row .key {
526
+ color: var(--text-muted);
527
+ font-size: 12px;
528
+ }
529
+ .detail-row .value {
530
+ font-family: var(--font-mono);
531
+ word-break: break-all;
532
+ }
533
+
534
+ .json-block {
535
+ background: #0c0c0f;
536
+ border: 1px solid var(--border);
537
+ border-radius: 6px;
538
+ padding: 10px 12px;
539
+ margin: 6px 0;
540
+ font-size: 12px;
541
+ font-family: var(--font-mono);
542
+ white-space: pre-wrap;
543
+ max-height: 260px;
544
+ overflow: auto;
545
+ line-height: 1.45;
546
+ }
547
+ .json-block.collapsed {
548
+ max-height: 80px;
549
+ }
550
+ .json-toggle {
551
+ font-size: 11px;
552
+ color: var(--accent);
553
+ cursor: pointer;
554
+ margin-top: 2px;
555
+ display: inline-block;
556
+ }
557
+
558
+ .tool-call {
559
+ background: var(--bg);
560
+ border: 1px solid var(--border);
561
+ border-radius: 6px;
562
+ padding: 8px 10px;
563
+ margin: 6px 0;
564
+ font-size: 12px;
565
+ }
566
+ .tool-call .tool-header {
567
+ font-weight: 600;
568
+ margin-bottom: 2px;
569
+ display: flex;
570
+ gap: 6px;
571
+ align-items: center;
572
+ flex-wrap: wrap;
573
+ }
574
+ .tool-call .tool-header .badge {
575
+ font-size: 9px;
576
+ padding: 0 5px;
577
+ }
578
+
579
+ /* Buttons */
580
+ .btn {
581
+ font-family: inherit;
582
+ font-size: 13px;
583
+ padding: 7px 13px;
584
+ border-radius: var(--radius-btn);
585
+ border: 1px solid var(--border);
586
+ background: var(--surface-elev);
587
+ color: var(--text);
588
+ cursor: pointer;
589
+ transition:
590
+ background 0.08s ease,
591
+ border-color 0.08s ease;
592
+ display: inline-flex;
593
+ align-items: center;
594
+ gap: 6px;
595
+ }
596
+ .btn:hover {
597
+ border-color: var(--accent);
598
+ }
599
+ .btn:focus-visible {
600
+ outline: 2px solid var(--accent);
601
+ outline-offset: 1px;
602
+ }
603
+ .btn.btn-secondary {
604
+ background: transparent;
605
+ }
606
+ .btn.btn-ghost {
607
+ background: transparent;
608
+ border-color: transparent;
609
+ padding: 4px 8px;
610
+ color: var(--text-muted);
611
+ }
612
+ .btn.btn-ghost:hover {
613
+ color: var(--text);
614
+ background: var(--surface-elev);
615
+ }
616
+ .btn.btn-primary {
617
+ background: var(--accent);
618
+ color: #fff;
619
+ border-color: var(--accent);
620
+ }
621
+ .btn.btn-primary:hover {
622
+ background: var(--accent-hover);
623
+ }
624
+ .btn.spinning svg {
625
+ animation: spin 0.7s linear infinite;
626
+ }
627
+ @keyframes spin {
628
+ from {
629
+ transform: rotate(0deg);
630
+ }
631
+ to {
632
+ transform: rotate(360deg);
633
+ }
634
+ }
635
+
636
+ .export-group {
637
+ display: flex;
638
+ gap: 4px;
639
+ }
640
+
641
+ /* Empty & Loading */
642
+ .empty {
643
+ padding: var(--space-6);
644
+ text-align: center;
645
+ color: var(--text-muted);
646
+ font-size: 13px;
647
+ }
648
+ .empty .icon {
649
+ font-size: 28px;
650
+ margin-bottom: 8px;
651
+ opacity: 0.7;
652
+ }
653
+ .empty small {
654
+ display: block;
655
+ margin-top: 6px;
656
+ color: #777;
657
+ }
658
+
659
+ /* Skeleton */
660
+ .skeleton {
661
+ background: linear-gradient(
662
+ 90deg,
663
+ var(--surface) 25%,
664
+ var(--surface-elev) 50%,
665
+ var(--surface) 75%
666
+ );
667
+ background-size: 200% 100%;
668
+ animation: shimmer 1.2s infinite linear;
669
+ border-radius: 4px;
670
+ }
671
+ @keyframes shimmer {
672
+ 0% {
673
+ background-position: 200% 0;
674
+ }
675
+ 100% {
676
+ background-position: -200% 0;
677
+ }
678
+ }
679
+ .skeleton-line {
680
+ height: 14px;
681
+ margin: 8px 0;
682
+ }
683
+ .skeleton-stat {
684
+ height: 26px;
685
+ width: 70%;
686
+ }
687
+
688
+ /* Toasts */
689
+ .toast-container {
690
+ position: fixed;
691
+ bottom: 20px;
692
+ right: 20px;
693
+ z-index: 200;
694
+ display: flex;
695
+ flex-direction: column;
696
+ gap: 8px;
697
+ }
698
+ .toast {
699
+ background: var(--surface-elev);
700
+ border: 1px solid var(--border);
701
+ color: var(--text);
702
+ padding: 10px 14px;
703
+ border-radius: 8px;
704
+ font-size: 13px;
705
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
706
+ display: flex;
707
+ align-items: center;
708
+ gap: 10px;
709
+ max-width: 320px;
710
+ animation: toastIn 0.12s ease;
711
+ }
712
+ .toast.success {
713
+ border-color: rgba(34, 197, 94, 0.4);
714
+ }
715
+ .toast.error {
716
+ border-color: rgba(239, 68, 68, 0.4);
717
+ }
718
+ @keyframes toastIn {
719
+ from {
720
+ opacity: 0;
721
+ transform: translateY(6px);
722
+ }
723
+ to {
724
+ opacity: 1;
725
+ transform: translateY(0);
726
+ }
727
+ }
728
+
729
+ /* Footer */
730
+ .footer {
731
+ max-width: 1200px;
732
+ margin: 32px auto 16px;
733
+ padding: 0 24px;
734
+ font-size: 12px;
735
+ color: var(--text-muted);
736
+ text-align: center;
737
+ }
738
+
739
+ /* Responsive */
740
+ @media (max-width: 640px) {
741
+ .topbar-inner {
742
+ flex-direction: column;
743
+ align-items: flex-start;
744
+ }
745
+ .stats-grid {
746
+ grid-template-columns: repeat(2, 1fr);
747
+ }
748
+ .run-meta {
749
+ flex-direction: column;
750
+ gap: 2px;
751
+ }
752
+ .search-input {
753
+ width: 100%;
754
+ }
755
+ .container {
756
+ padding: 16px;
757
+ }
758
+ }
759
+
760
+ /* Scrollbars */
761
+ ::-webkit-scrollbar {
762
+ width: 8px;
763
+ height: 8px;
764
+ }
765
+ ::-webkit-scrollbar-track {
766
+ background: var(--bg);
767
+ }
768
+ ::-webkit-scrollbar-thumb {
769
+ background: var(--border);
770
+ border-radius: 4px;
771
+ }
772
+ ::-webkit-scrollbar-thumb:hover {
773
+ background: #3a3a40;
774
+ }
775
+
776
+ /* Usage page extras */
777
+ .nav-back {
778
+ font-size: 13px;
779
+ color: var(--text-muted);
780
+ margin-bottom: 8px;
781
+ display: inline-block;
782
+ }
783
+ .nav-back:hover {
784
+ color: var(--accent);
785
+ }
786
+ .usage-grid {
787
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
788
+ }
789
+ .live-dot {
790
+ display: inline-block;
791
+ width: 8px;
792
+ height: 8px;
793
+ background: var(--success);
794
+ border-radius: 50%;
795
+ margin-right: 6px;
796
+ box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.18);
797
+ vertical-align: middle;
798
+ animation: pulse 2s infinite;
799
+ }
800
+ .live-dot.off {
801
+ background: var(--text-muted);
802
+ box-shadow: none;
803
+ animation: none;
804
+ }
805
+ @keyframes pulse {
806
+ 0%,
807
+ 100% {
808
+ opacity: 1;
809
+ }
810
+ 50% {
811
+ opacity: 0.4;
812
+ }
813
+ }
814
+ .activity-feed {
815
+ max-height: 300px;
816
+ overflow: auto;
817
+ padding: 2px 0;
818
+ font-size: 12px;
819
+ }
820
+ .activity-item {
821
+ padding: 6px 14px;
822
+ border-bottom: 1px solid var(--border);
823
+ display: flex;
824
+ gap: 8px;
825
+ align-items: baseline;
826
+ font-family: var(--font-mono);
827
+ }
828
+ .activity-item:last-child {
829
+ border-bottom: none;
830
+ }
831
+ .activity-time {
832
+ color: var(--text-muted);
833
+ min-width: 68px;
834
+ font-size: 11px;
835
+ }
836
+ .activity-agent {
837
+ color: var(--accent);
838
+ font-weight: 600;
839
+ white-space: nowrap;
840
+ max-width: 140px;
841
+ overflow: hidden;
842
+ text-overflow: ellipsis;
843
+ }
844
+ .activity-action {
845
+ color: var(--text);
846
+ }
847
+ .activity-cost {
848
+ margin-left: auto;
849
+ color: var(--text-muted);
850
+ font-size: 11px;
851
+ white-space: nowrap;
852
+ }
853
+
854
+ .chart-panel {
855
+ padding: 12px 16px 16px;
856
+ }
857
+ .chart-title {
858
+ font-size: 11px;
859
+ color: var(--text-muted);
860
+ margin-bottom: 8px;
861
+ text-transform: uppercase;
862
+ letter-spacing: 0.5px;
863
+ }
864
+ .chart-container {
865
+ width: 100%;
866
+ height: 168px;
867
+ position: relative;
868
+ background: var(--bg);
869
+ border: 1px solid var(--border);
870
+ border-radius: 6px;
871
+ overflow: hidden;
872
+ }
873
+
874
+ .bar-chart {
875
+ display: flex;
876
+ align-items: flex-end;
877
+ justify-content: space-around;
878
+ height: 100%;
879
+ padding: 10px 14px 20px;
880
+ gap: 8px;
881
+ }
882
+ .bar {
883
+ background: var(--accent);
884
+ border-radius: 3px 3px 0 0;
885
+ min-width: 18px;
886
+ position: relative;
887
+ transition: height 0.2s ease;
888
+ }
889
+ .bar:hover {
890
+ filter: brightness(1.15);
891
+ }
892
+ .bar-label {
893
+ position: absolute;
894
+ bottom: -16px;
895
+ left: 50%;
896
+ transform: translateX(-50%);
897
+ font-size: 10px;
898
+ color: var(--text-muted);
899
+ white-space: nowrap;
900
+ max-width: 68px;
901
+ overflow: hidden;
902
+ text-overflow: ellipsis;
903
+ text-align: center;
904
+ }
905
+ .bar-value {
906
+ position: absolute;
907
+ top: -14px;
908
+ left: 50%;
909
+ transform: translateX(-50%);
910
+ font-size: 10px;
911
+ color: var(--text);
912
+ font-variant-numeric: tabular-nums;
913
+ }
914
+
915
+ .line-chart {
916
+ width: 100%;
917
+ height: 100%;
918
+ }
919
+ .line-chart text {
920
+ fill: var(--text-muted);
921
+ font-size: 10px;
922
+ }
923
+
924
+ .data-table {
925
+ width: 100%;
926
+ border-collapse: collapse;
927
+ font-size: 12px;
928
+ }
929
+ .data-table th,
930
+ .data-table td {
931
+ padding: 8px 12px;
932
+ text-align: left;
933
+ border-bottom: 1px solid var(--border);
934
+ }
935
+ .data-table th {
936
+ background: var(--surface-elev);
937
+ color: var(--text-muted);
938
+ font-weight: 500;
939
+ text-transform: uppercase;
940
+ font-size: 10px;
941
+ letter-spacing: 0.5px;
942
+ }
943
+ .data-table tr:last-child td {
944
+ border-bottom: none;
945
+ }
946
+ .data-table .num {
947
+ font-variant-numeric: tabular-nums;
948
+ text-align: right;
949
+ }
950
+ .data-table .cost {
951
+ color: var(--accent);
952
+ }
953
+ .data-table .agent {
954
+ color: var(--accent);
955
+ font-family: var(--font-mono);
956
+ }
957
+
958
+ .split {
959
+ display: grid;
960
+ grid-template-columns: 1fr 1fr;
961
+ gap: 16px;
962
+ }
963
+ @media (max-width: 900px) {
964
+ .split {
965
+ grid-template-columns: 1fr;
966
+ }
967
+ }
968
+
969
+ .sse-status {
970
+ font-size: 10px;
971
+ margin-right: 4px;
972
+ vertical-align: middle;
973
+ }
974
+ .sse-on {
975
+ color: var(--success);
976
+ }
977
+ .sse-off {
978
+ color: var(--text-muted);
979
+ }
980
+
981
+ .panel-footer-hint {
982
+ padding: 6px 16px;
983
+ border-top: 1px solid var(--border);
984
+ font-size: 11px;
985
+ color: var(--text-muted);
986
+ background: var(--surface-elev);
987
+ }
988
+ .panel-header-right {
989
+ display: flex;
990
+ align-items: center;
991
+ gap: 6px;
992
+ }
993
+
994
+ /* Projection */
995
+ .projection {
996
+ font-size: 12px;
997
+ color: var(--text-muted);
998
+ margin-top: 4px;
999
+ }
1000
+ .projection strong {
1001
+ color: var(--text);
1002
+ }
1003
+
1004
+ /* Focus ring for keyboard users */
1005
+ :focus-visible {
1006
+ outline: 2px solid var(--accent);
1007
+ outline-offset: 2px;
1008
+ }
1009
+
1010
+ /* Print friendliness (minimal) */
1011
+ @media print {
1012
+ .topbar,
1013
+ .toolbar,
1014
+ .btn,
1015
+ .footer {
1016
+ display: none !important;
1017
+ }
1018
+ }