llmflow 0.3.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.
@@ -0,0 +1,1152 @@
1
+ /* CSS Custom Properties for theming */
2
+ :root {
3
+ /* Light theme (default) */
4
+ --bg-primary: #f3f4f6;
5
+ --bg-secondary: #fff;
6
+ --bg-tertiary: #f9fafb;
7
+ --bg-hover: #f9fafb;
8
+ --bg-selected: #eff6ff;
9
+
10
+ --border-primary: #e5e7eb;
11
+ --border-secondary: #d1d5db;
12
+ --border-light: #f3f4f6;
13
+
14
+ --text-primary: #111827;
15
+ --text-secondary: #374151;
16
+ --text-tertiary: #6b7280;
17
+ --text-muted: #9ca3af;
18
+
19
+ --accent-primary: #2563eb;
20
+ --accent-hover: #1d4ed8;
21
+
22
+ --success: #059669;
23
+ --error: #dc2626;
24
+ --warning: #f59e0b;
25
+
26
+ /* Span badge colors */
27
+ --span-llm-bg: #dcfce7;
28
+ --span-llm-text: #166534;
29
+ --span-trace-bg: #dbeafe;
30
+ --span-trace-text: #1e40af;
31
+ --span-agent-bg: #fef3c7;
32
+ --span-agent-text: #92400e;
33
+ --span-chain-bg: #f3e8ff;
34
+ --span-chain-text: #7c3aed;
35
+ --span-tool-bg: #fce7f3;
36
+ --span-tool-text: #be185d;
37
+ --span-retrieval-bg: #cffafe;
38
+ --span-retrieval-text: #0e7490;
39
+ --span-embedding-bg: #e0e7ff;
40
+ --span-embedding-text: #4338ca;
41
+ --span-custom-bg: #f3f4f6;
42
+ --span-custom-text: #4b5563;
43
+ }
44
+
45
+ [data-theme="dark"] {
46
+ /* Vercel-inspired dark theme - almost black */
47
+ --bg-primary: #000000;
48
+ --bg-secondary: #0a0a0a;
49
+ --bg-tertiary: #171717;
50
+ --bg-hover: #1a1a1a;
51
+ --bg-selected: #1c1c1c;
52
+
53
+ --border-primary: #262626;
54
+ --border-secondary: #404040;
55
+ --border-light: #171717;
56
+
57
+ --text-primary: #fafafa;
58
+ --text-secondary: #a1a1aa;
59
+ --text-tertiary: #71717a;
60
+ --text-muted: #52525b;
61
+
62
+ --accent-primary: #3b82f6;
63
+ --accent-hover: #60a5fa;
64
+
65
+ --success: #22c55e;
66
+ --error: #ef4444;
67
+ --warning: #eab308;
68
+
69
+ /* Span badge colors - muted for dark bg */
70
+ --span-llm-bg: #14532d;
71
+ --span-llm-text: #86efac;
72
+ --span-trace-bg: #1e3a8a;
73
+ --span-trace-text: #93c5fd;
74
+ --span-agent-bg: #78350f;
75
+ --span-agent-text: #fcd34d;
76
+ --span-chain-bg: #4c1d95;
77
+ --span-chain-text: #c4b5fd;
78
+ --span-tool-bg: #831843;
79
+ --span-tool-text: #f9a8d4;
80
+ --span-retrieval-bg: #164e63;
81
+ --span-retrieval-text: #67e8f9;
82
+ --span-embedding-bg: #312e81;
83
+ --span-embedding-text: #a5b4fc;
84
+ --span-custom-bg: #27272a;
85
+ --span-custom-text: #d4d4d8;
86
+ }
87
+
88
+ * {
89
+ margin: 0;
90
+ padding: 0;
91
+ box-sizing: border-box;
92
+ }
93
+
94
+ html, body {
95
+ height: 100%;
96
+ }
97
+
98
+ body {
99
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
100
+ background: var(--bg-primary);
101
+ color: var(--text-primary);
102
+ font-size: 13px;
103
+ line-height: 1.4;
104
+ transition: background 0.2s, color 0.2s;
105
+ }
106
+
107
+ .container {
108
+ height: 100%;
109
+ display: flex;
110
+ flex-direction: column;
111
+ padding: 8px;
112
+ }
113
+
114
+ /* Header */
115
+ header {
116
+ background: var(--bg-secondary);
117
+ border: 1px solid var(--border-primary);
118
+ border-radius: 4px;
119
+ padding: 8px 12px;
120
+ margin-bottom: 8px;
121
+ }
122
+
123
+ .header-row {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ gap: 16px;
128
+ }
129
+
130
+ .header-left {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 16px;
134
+ }
135
+
136
+ h1 {
137
+ font-size: 16px;
138
+ font-weight: 600;
139
+ color: var(--text-primary);
140
+ }
141
+
142
+ h1.logo {
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 8px;
146
+ }
147
+
148
+ .logo-icon {
149
+ width: 20px;
150
+ height: 20px;
151
+ color: var(--accent-primary);
152
+ }
153
+
154
+ /* Theme toggle */
155
+ .theme-toggle {
156
+ background: none;
157
+ border: none;
158
+ cursor: pointer;
159
+ padding: 4px;
160
+ border-radius: 4px;
161
+ color: var(--text-tertiary);
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ transition: background 0.2s, color 0.2s;
166
+ }
167
+
168
+ .theme-toggle:hover {
169
+ background: var(--bg-tertiary);
170
+ color: var(--text-primary);
171
+ }
172
+
173
+ .theme-toggle svg {
174
+ width: 18px;
175
+ height: 18px;
176
+ }
177
+
178
+ .theme-toggle .icon-sun {
179
+ display: none;
180
+ }
181
+
182
+ .theme-toggle .icon-moon {
183
+ display: block;
184
+ }
185
+
186
+ [data-theme="dark"] .theme-toggle .icon-sun {
187
+ display: block;
188
+ }
189
+
190
+ [data-theme="dark"] .theme-toggle .icon-moon {
191
+ display: none;
192
+ }
193
+
194
+ .status-dot {
195
+ width: 8px;
196
+ height: 8px;
197
+ border-radius: 50%;
198
+ background: var(--text-muted);
199
+ display: inline-block;
200
+ margin-left: 4px;
201
+ transition: background 0.3s;
202
+ }
203
+
204
+ .status-dot.connected {
205
+ background: #22c55e;
206
+ box-shadow: 0 0 4px #22c55e;
207
+ }
208
+
209
+ .status-dot.disconnected {
210
+ background: var(--warning);
211
+ animation: pulse 1.5s infinite;
212
+ }
213
+
214
+ @keyframes pulse {
215
+ 0%, 100% { opacity: 1; }
216
+ 50% { opacity: 0.4; }
217
+ }
218
+
219
+ .stats-bar {
220
+ display: flex;
221
+ gap: 24px;
222
+ }
223
+
224
+ .stat {
225
+ display: flex;
226
+ flex-direction: column;
227
+ align-items: flex-end;
228
+ }
229
+
230
+ .stat-value {
231
+ font-size: 16px;
232
+ font-weight: 600;
233
+ color: var(--accent-primary);
234
+ }
235
+
236
+ .stat-label {
237
+ font-size: 10px;
238
+ color: var(--text-tertiary);
239
+ text-transform: uppercase;
240
+ }
241
+
242
+ /* Main content */
243
+ main {
244
+ flex: 1;
245
+ display: flex;
246
+ flex-direction: column;
247
+ min-height: 0;
248
+ }
249
+
250
+ /* Tabs */
251
+ .tabs {
252
+ display: flex;
253
+ gap: 4px;
254
+ margin-bottom: 8px;
255
+ }
256
+
257
+ .tab {
258
+ padding: 6px 12px;
259
+ background: var(--border-primary);
260
+ border: none;
261
+ border-radius: 4px;
262
+ cursor: pointer;
263
+ font-size: 12px;
264
+ color: var(--text-secondary);
265
+ transition: background 0.2s, color 0.2s;
266
+ }
267
+
268
+ .tab.active {
269
+ background: var(--accent-primary);
270
+ color: white;
271
+ }
272
+
273
+ .tab:hover:not(.active) {
274
+ background: var(--border-secondary);
275
+ }
276
+
277
+ /* Tab content */
278
+ .tab-content {
279
+ display: none;
280
+ flex: 1;
281
+ min-height: 0;
282
+ }
283
+
284
+ .tab-content.active {
285
+ display: flex;
286
+ flex-direction: column;
287
+ }
288
+
289
+ /* Filter bar */
290
+ .filter-bar {
291
+ display: flex;
292
+ gap: 8px;
293
+ padding: 8px;
294
+ background: var(--bg-secondary);
295
+ border: 1px solid var(--border-primary);
296
+ border-radius: 4px;
297
+ margin-bottom: 8px;
298
+ }
299
+
300
+ .filter-bar input,
301
+ .filter-bar select {
302
+ padding: 6px 8px;
303
+ border: 1px solid var(--border-secondary);
304
+ border-radius: 4px;
305
+ font-size: 12px;
306
+ background: var(--bg-secondary);
307
+ color: var(--text-primary);
308
+ transition: background 0.2s, border-color 0.2s;
309
+ }
310
+
311
+ .filter-bar input {
312
+ width: 200px;
313
+ }
314
+
315
+ .filter-bar input:focus,
316
+ .filter-bar select:focus {
317
+ outline: none;
318
+ border-color: var(--accent-primary);
319
+ }
320
+
321
+ .filter-bar input::placeholder {
322
+ color: var(--text-muted);
323
+ }
324
+
325
+ .btn-secondary {
326
+ padding: 6px 12px;
327
+ background: var(--bg-tertiary);
328
+ border: 1px solid var(--border-secondary);
329
+ border-radius: 4px;
330
+ font-size: 12px;
331
+ cursor: pointer;
332
+ color: var(--text-secondary);
333
+ transition: background 0.2s;
334
+ }
335
+
336
+ .btn-secondary:hover {
337
+ background: var(--border-primary);
338
+ }
339
+
340
+ /* Split layout */
341
+ .split-layout {
342
+ flex: 1;
343
+ display: flex;
344
+ gap: 8px;
345
+ min-height: 0;
346
+ }
347
+
348
+ .panel-left {
349
+ flex: 0 0 50%;
350
+ min-width: 400px;
351
+ background: var(--bg-secondary);
352
+ border: 1px solid var(--border-primary);
353
+ border-radius: 4px;
354
+ overflow: auto;
355
+ resize: horizontal;
356
+ }
357
+
358
+ .panel-right {
359
+ flex: 1;
360
+ background: var(--bg-secondary);
361
+ border: 1px solid var(--border-primary);
362
+ border-radius: 4px;
363
+ display: flex;
364
+ flex-direction: column;
365
+ overflow: hidden;
366
+ }
367
+
368
+ /* Table */
369
+ table {
370
+ width: 100%;
371
+ border-collapse: collapse;
372
+ }
373
+
374
+ th {
375
+ position: sticky;
376
+ top: 0;
377
+ background: var(--bg-tertiary);
378
+ text-align: left;
379
+ padding: 8px;
380
+ font-size: 11px;
381
+ font-weight: 600;
382
+ color: var(--text-tertiary);
383
+ text-transform: uppercase;
384
+ border-bottom: 1px solid var(--border-primary);
385
+ }
386
+
387
+ td {
388
+ padding: 6px 8px;
389
+ border-bottom: 1px solid var(--border-light);
390
+ font-size: 12px;
391
+ }
392
+
393
+ tr.trace-row {
394
+ cursor: pointer;
395
+ }
396
+
397
+ tr.trace-row:hover {
398
+ background: var(--bg-hover);
399
+ }
400
+
401
+ tr.trace-row.selected {
402
+ background: var(--bg-selected);
403
+ }
404
+
405
+ .empty-state {
406
+ color: var(--text-muted);
407
+ font-style: italic;
408
+ padding: 16px;
409
+ text-align: center;
410
+ }
411
+
412
+ /* Status */
413
+ .status-success {
414
+ color: var(--success);
415
+ font-weight: 500;
416
+ }
417
+
418
+ .status-error {
419
+ color: var(--error);
420
+ font-weight: 500;
421
+ }
422
+
423
+ /* Badges */
424
+ .span-badge {
425
+ display: inline-block;
426
+ padding: 2px 6px;
427
+ border-radius: 3px;
428
+ font-size: 10px;
429
+ font-weight: 600;
430
+ text-transform: uppercase;
431
+ }
432
+
433
+ .span-llm { background: var(--span-llm-bg); color: var(--span-llm-text); }
434
+ .span-trace { background: var(--span-trace-bg); color: var(--span-trace-text); }
435
+ .span-agent { background: var(--span-agent-bg); color: var(--span-agent-text); }
436
+ .span-chain { background: var(--span-chain-bg); color: var(--span-chain-text); }
437
+ .span-tool { background: var(--span-tool-bg); color: var(--span-tool-text); }
438
+ .span-retrieval { background: var(--span-retrieval-bg); color: var(--span-retrieval-text); }
439
+ .span-embedding { background: var(--span-embedding-bg); color: var(--span-embedding-text); }
440
+ .span-custom { background: var(--span-custom-bg); color: var(--span-custom-text); }
441
+
442
+ /* Severity badges for logs */
443
+ .severity-badge {
444
+ display: inline-block;
445
+ padding: 2px 6px;
446
+ border-radius: 3px;
447
+ font-size: 10px;
448
+ font-weight: 600;
449
+ text-transform: uppercase;
450
+ min-width: 45px;
451
+ text-align: center;
452
+ }
453
+
454
+ .severity-trace { background: var(--span-custom-bg); color: var(--span-custom-text); }
455
+ .severity-debug { background: var(--span-trace-bg); color: var(--span-trace-text); }
456
+ .severity-info { background: var(--span-llm-bg); color: var(--span-llm-text); }
457
+ .severity-warn { background: var(--span-agent-bg); color: var(--span-agent-text); }
458
+ .severity-error { background: #fee2e2; color: #dc2626; }
459
+ .severity-fatal { background: #fecaca; color: #991b1b; }
460
+
461
+ [data-theme="dark"] .severity-error { background: #7f1d1d; color: #fca5a5; }
462
+ [data-theme="dark"] .severity-fatal { background: #450a0a; color: #f87171; }
463
+
464
+ /* Log body preview */
465
+ .log-body-preview {
466
+ max-width: 300px;
467
+ overflow: hidden;
468
+ text-overflow: ellipsis;
469
+ white-space: nowrap;
470
+ color: var(--text-secondary);
471
+ }
472
+
473
+ /* Event badge */
474
+ .event-badge {
475
+ display: inline-block;
476
+ padding: 2px 6px;
477
+ background: var(--bg-tertiary);
478
+ color: var(--text-secondary);
479
+ border-radius: 3px;
480
+ font-size: 11px;
481
+ font-family: monospace;
482
+ }
483
+
484
+ /* Service badge */
485
+ .service-badge {
486
+ display: inline-block;
487
+ padding: 2px 6px;
488
+ background: var(--span-chain-bg);
489
+ color: var(--span-chain-text);
490
+ border-radius: 3px;
491
+ font-size: 11px;
492
+ }
493
+
494
+ /* Metric type badges */
495
+ .metric-badge {
496
+ display: inline-block;
497
+ padding: 2px 6px;
498
+ border-radius: 3px;
499
+ font-size: 10px;
500
+ font-weight: 600;
501
+ text-transform: uppercase;
502
+ }
503
+
504
+ .metric-sum { background: var(--span-llm-bg); color: var(--span-llm-text); }
505
+ .metric-gauge { background: var(--span-trace-bg); color: var(--span-trace-text); }
506
+ .metric-histogram { background: var(--span-chain-bg); color: var(--span-chain-text); }
507
+
508
+ /* Metrics layout */
509
+ .metrics-layout {
510
+ display: flex;
511
+ flex-direction: column;
512
+ gap: 12px;
513
+ flex: 1;
514
+ min-height: 0;
515
+ }
516
+
517
+ .metrics-summary {
518
+ display: grid;
519
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
520
+ gap: 8px;
521
+ }
522
+
523
+ .metric-card {
524
+ background: var(--bg-secondary);
525
+ border: 1px solid var(--border-primary);
526
+ border-radius: 4px;
527
+ padding: 10px 12px;
528
+ }
529
+
530
+ .metric-card-header {
531
+ display: flex;
532
+ justify-content: space-between;
533
+ align-items: center;
534
+ margin-bottom: 6px;
535
+ }
536
+
537
+ .metric-card-name {
538
+ font-size: 12px;
539
+ font-weight: 600;
540
+ color: var(--text-primary);
541
+ overflow: hidden;
542
+ text-overflow: ellipsis;
543
+ white-space: nowrap;
544
+ flex: 1;
545
+ }
546
+
547
+ .metric-card-value {
548
+ font-size: 18px;
549
+ font-weight: 700;
550
+ color: var(--accent-primary);
551
+ }
552
+
553
+ .metric-card-meta {
554
+ display: flex;
555
+ justify-content: space-between;
556
+ font-size: 10px;
557
+ color: var(--text-tertiary);
558
+ }
559
+
560
+ .metrics-table-container {
561
+ flex: 1;
562
+ background: var(--bg-secondary);
563
+ border: 1px solid var(--border-primary);
564
+ border-radius: 4px;
565
+ overflow: auto;
566
+ }
567
+
568
+ .metric-name-cell {
569
+ font-family: monospace;
570
+ font-size: 11px;
571
+ }
572
+
573
+ .metric-value {
574
+ font-weight: 600;
575
+ color: var(--accent-primary);
576
+ }
577
+
578
+ .model-badge {
579
+ display: inline-block;
580
+ padding: 2px 6px;
581
+ background: var(--bg-tertiary);
582
+ color: var(--text-secondary);
583
+ border-radius: 3px;
584
+ font-size: 11px;
585
+ }
586
+
587
+ /* Detail panel */
588
+ .detail-header {
589
+ padding: 10px 12px;
590
+ border-bottom: 1px solid var(--border-primary);
591
+ display: flex;
592
+ align-items: baseline;
593
+ justify-content: space-between;
594
+ }
595
+
596
+ .detail-header h2 {
597
+ font-size: 14px;
598
+ font-weight: 600;
599
+ }
600
+
601
+ .detail-meta {
602
+ font-size: 11px;
603
+ color: var(--text-tertiary);
604
+ }
605
+
606
+ .detail-body {
607
+ flex: 1;
608
+ overflow: auto;
609
+ padding: 12px;
610
+ }
611
+
612
+ .detail-section {
613
+ margin-bottom: 16px;
614
+ }
615
+
616
+ .detail-section h3 {
617
+ font-size: 11px;
618
+ font-weight: 600;
619
+ color: var(--text-tertiary);
620
+ text-transform: uppercase;
621
+ margin-bottom: 6px;
622
+ }
623
+
624
+ pre {
625
+ background: var(--bg-tertiary);
626
+ border: 1px solid var(--border-primary);
627
+ border-radius: 4px;
628
+ padding: 8px;
629
+ font-size: 11px;
630
+ line-height: 1.4;
631
+ overflow-x: auto;
632
+ white-space: pre-wrap;
633
+ word-break: break-word;
634
+ color: var(--text-primary);
635
+ }
636
+
637
+ /* Span tree */
638
+ .span-tree {
639
+ font-size: 12px;
640
+ }
641
+
642
+ .span-node {
643
+ padding: 6px 0;
644
+ border-bottom: 1px solid var(--border-light);
645
+ }
646
+
647
+ .span-node:last-child {
648
+ border-bottom: none;
649
+ }
650
+
651
+ .span-node-header {
652
+ display: flex;
653
+ align-items: center;
654
+ gap: 8px;
655
+ }
656
+
657
+ .span-node-meta {
658
+ font-size: 11px;
659
+ color: var(--text-tertiary);
660
+ }
661
+
662
+ .span-node-children {
663
+ margin-left: 16px;
664
+ border-left: 1px solid var(--border-primary);
665
+ padding-left: 12px;
666
+ }
667
+
668
+ /* Model stats grid */
669
+ .model-grid {
670
+ display: grid;
671
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
672
+ gap: 12px;
673
+ padding: 12px;
674
+ background: var(--bg-secondary);
675
+ border: 1px solid var(--border-primary);
676
+ border-radius: 4px;
677
+ }
678
+
679
+ .model-card {
680
+ background: var(--bg-tertiary);
681
+ border: 1px solid var(--border-primary);
682
+ border-radius: 4px;
683
+ padding: 12px;
684
+ }
685
+
686
+ .model-card h4 {
687
+ font-size: 13px;
688
+ font-weight: 600;
689
+ color: var(--accent-primary);
690
+ margin-bottom: 8px;
691
+ }
692
+
693
+ .model-stat {
694
+ display: flex;
695
+ justify-content: space-between;
696
+ font-size: 12px;
697
+ margin-bottom: 4px;
698
+ }
699
+
700
+ .model-stat-label {
701
+ color: var(--text-tertiary);
702
+ }
703
+
704
+ .model-stat-value {
705
+ font-weight: 500;
706
+ }
707
+
708
+ /* Scrollbar styling for dark mode */
709
+ [data-theme="dark"] ::-webkit-scrollbar {
710
+ width: 8px;
711
+ height: 8px;
712
+ }
713
+
714
+ [data-theme="dark"] ::-webkit-scrollbar-track {
715
+ background: var(--bg-secondary);
716
+ }
717
+
718
+ [data-theme="dark"] ::-webkit-scrollbar-thumb {
719
+ background: var(--border-secondary);
720
+ border-radius: 4px;
721
+ }
722
+
723
+ [data-theme="dark"] ::-webkit-scrollbar-thumb:hover {
724
+ background: var(--text-muted);
725
+ }
726
+
727
+ /* ==================== Timeline ==================== */
728
+
729
+ .timeline-list {
730
+ padding: 8px;
731
+ }
732
+
733
+ .timeline-item {
734
+ display: flex;
735
+ align-items: flex-start;
736
+ gap: 12px;
737
+ padding: 10px 12px;
738
+ border-bottom: 1px solid var(--border-light);
739
+ cursor: pointer;
740
+ transition: background 0.15s;
741
+ }
742
+
743
+ .timeline-item:hover {
744
+ background: var(--bg-hover);
745
+ }
746
+
747
+ .timeline-item.selected {
748
+ background: var(--bg-selected);
749
+ }
750
+
751
+ .timeline-item-icon {
752
+ width: 28px;
753
+ height: 28px;
754
+ border-radius: 6px;
755
+ display: flex;
756
+ align-items: center;
757
+ justify-content: center;
758
+ flex-shrink: 0;
759
+ font-size: 12px;
760
+ }
761
+
762
+ .timeline-item-content {
763
+ flex: 1;
764
+ min-width: 0;
765
+ }
766
+
767
+ .timeline-item-header {
768
+ display: flex;
769
+ align-items: center;
770
+ gap: 8px;
771
+ margin-bottom: 4px;
772
+ }
773
+
774
+ .timeline-item-title {
775
+ font-weight: 600;
776
+ font-size: 12px;
777
+ color: var(--text-primary);
778
+ white-space: nowrap;
779
+ overflow: hidden;
780
+ text-overflow: ellipsis;
781
+ }
782
+
783
+ .timeline-item-time {
784
+ font-size: 11px;
785
+ color: var(--text-tertiary);
786
+ white-space: nowrap;
787
+ }
788
+
789
+ .timeline-item-body {
790
+ font-size: 11px;
791
+ color: var(--text-secondary);
792
+ white-space: nowrap;
793
+ overflow: hidden;
794
+ text-overflow: ellipsis;
795
+ }
796
+
797
+ .timeline-item-meta {
798
+ display: flex;
799
+ gap: 8px;
800
+ margin-top: 4px;
801
+ font-size: 10px;
802
+ color: var(--text-muted);
803
+ }
804
+
805
+ /* Tool badges */
806
+ .tool-badge {
807
+ display: inline-flex;
808
+ align-items: center;
809
+ gap: 4px;
810
+ padding: 2px 6px;
811
+ border-radius: 3px;
812
+ font-size: 10px;
813
+ font-weight: 600;
814
+ }
815
+
816
+ /* Claude Code - Purple */
817
+ .tool-claude-code,
818
+ .timeline-item-icon.tool-claude-code {
819
+ background: #f3e8ff;
820
+ color: #7c3aed;
821
+ }
822
+ [data-theme="dark"] .tool-claude-code,
823
+ [data-theme="dark"] .timeline-item-icon.tool-claude-code {
824
+ background: #4c1d95;
825
+ color: #c4b5fd;
826
+ }
827
+
828
+ /* Codex CLI - Green */
829
+ .tool-codex-cli,
830
+ .timeline-item-icon.tool-codex-cli {
831
+ background: #dcfce7;
832
+ color: #16a34a;
833
+ }
834
+ [data-theme="dark"] .tool-codex-cli,
835
+ [data-theme="dark"] .timeline-item-icon.tool-codex-cli {
836
+ background: #14532d;
837
+ color: #86efac;
838
+ }
839
+
840
+ /* Gemini CLI - Blue */
841
+ .tool-gemini-cli,
842
+ .timeline-item-icon.tool-gemini-cli {
843
+ background: #dbeafe;
844
+ color: #2563eb;
845
+ }
846
+ [data-theme="dark"] .tool-gemini-cli,
847
+ [data-theme="dark"] .timeline-item-icon.tool-gemini-cli {
848
+ background: #1e3a8a;
849
+ color: #93c5fd;
850
+ }
851
+
852
+ /* Aider - Orange */
853
+ .tool-aider,
854
+ .timeline-item-icon.tool-aider {
855
+ background: #fef3c7;
856
+ color: #d97706;
857
+ }
858
+ [data-theme="dark"] .tool-aider,
859
+ [data-theme="dark"] .timeline-item-icon.tool-aider {
860
+ background: #78350f;
861
+ color: #fcd34d;
862
+ }
863
+
864
+ /* Proxy (default/other) - Gray */
865
+ .tool-proxy,
866
+ .timeline-item-icon.tool-proxy {
867
+ background: var(--bg-tertiary);
868
+ color: var(--text-secondary);
869
+ }
870
+
871
+ /* Type icons */
872
+ .type-icon {
873
+ width: 14px;
874
+ height: 14px;
875
+ }
876
+
877
+ /* Type badges */
878
+ .type-badge {
879
+ display: inline-block;
880
+ padding: 1px 4px;
881
+ border-radius: 2px;
882
+ font-size: 9px;
883
+ font-weight: 600;
884
+ text-transform: uppercase;
885
+ }
886
+
887
+ .type-trace { background: var(--span-llm-bg); color: var(--span-llm-text); }
888
+ .type-log { background: var(--span-agent-bg); color: var(--span-agent-text); }
889
+ .type-metric { background: var(--span-trace-bg); color: var(--span-trace-text); }
890
+
891
+ /* Related logs in detail panel */
892
+ .related-log-item {
893
+ padding: 8px;
894
+ background: var(--bg-tertiary);
895
+ border: 1px solid var(--border-primary);
896
+ border-radius: 4px;
897
+ margin-bottom: 6px;
898
+ font-size: 11px;
899
+ }
900
+
901
+ .related-log-header {
902
+ display: flex;
903
+ justify-content: space-between;
904
+ margin-bottom: 4px;
905
+ }
906
+
907
+ .related-log-body {
908
+ color: var(--text-secondary);
909
+ white-space: pre-wrap;
910
+ word-break: break-word;
911
+ }
912
+
913
+ /* ==================== Analytics Tab ==================== */
914
+
915
+ .analytics-controls {
916
+ display: flex;
917
+ gap: 12px;
918
+ padding: 12px;
919
+ background: var(--bg-secondary);
920
+ border: 1px solid var(--border-primary);
921
+ border-radius: 4px;
922
+ margin-bottom: 12px;
923
+ }
924
+
925
+ .analytics-grid {
926
+ display: grid;
927
+ grid-template-columns: repeat(2, 1fr);
928
+ gap: 12px;
929
+ }
930
+
931
+ .analytics-card {
932
+ background: var(--bg-secondary);
933
+ border: 1px solid var(--border-primary);
934
+ border-radius: 4px;
935
+ overflow: hidden;
936
+ }
937
+
938
+ .analytics-card-wide {
939
+ grid-column: span 2;
940
+ }
941
+
942
+ .analytics-card-header {
943
+ padding: 12px 16px;
944
+ border-bottom: 1px solid var(--border-primary);
945
+ background: var(--bg-tertiary);
946
+ }
947
+
948
+ .analytics-card-header h3 {
949
+ font-size: 13px;
950
+ font-weight: 600;
951
+ color: var(--text-primary);
952
+ margin: 0;
953
+ }
954
+
955
+ .analytics-subtitle {
956
+ font-size: 11px;
957
+ color: var(--text-tertiary);
958
+ margin-top: 2px;
959
+ display: block;
960
+ }
961
+
962
+ .analytics-card-body {
963
+ padding: 16px;
964
+ min-height: 180px;
965
+ }
966
+
967
+ /* Bar Chart (vertical) */
968
+ .bar-chart {
969
+ display: flex;
970
+ flex-direction: column;
971
+ height: 160px;
972
+ }
973
+
974
+ .bar-chart-bars {
975
+ display: flex;
976
+ align-items: flex-end;
977
+ gap: 2px;
978
+ flex: 1;
979
+ padding-bottom: 8px;
980
+ }
981
+
982
+ .bar-group {
983
+ display: flex;
984
+ flex-direction: column;
985
+ align-items: center;
986
+ justify-content: flex-end;
987
+ height: 100%;
988
+ position: relative;
989
+ }
990
+
991
+ .bar {
992
+ width: 100%;
993
+ border-radius: 2px 2px 0 0;
994
+ position: absolute;
995
+ bottom: 0;
996
+ transition: height 0.3s ease;
997
+ }
998
+
999
+ .bar-total {
1000
+ background: var(--accent-primary);
1001
+ opacity: 0.3;
1002
+ }
1003
+
1004
+ .bar-prompt {
1005
+ background: var(--accent-primary);
1006
+ }
1007
+
1008
+ .bar-chart-legend {
1009
+ display: flex;
1010
+ gap: 16px;
1011
+ justify-content: center;
1012
+ padding-top: 8px;
1013
+ border-top: 1px solid var(--border-light);
1014
+ }
1015
+
1016
+ .legend-item {
1017
+ display: flex;
1018
+ align-items: center;
1019
+ gap: 6px;
1020
+ font-size: 11px;
1021
+ color: var(--text-tertiary);
1022
+ }
1023
+
1024
+ .legend-dot {
1025
+ width: 10px;
1026
+ height: 10px;
1027
+ border-radius: 2px;
1028
+ }
1029
+
1030
+ .legend-total {
1031
+ background: var(--accent-primary);
1032
+ opacity: 0.3;
1033
+ }
1034
+
1035
+ .legend-prompt {
1036
+ background: var(--accent-primary);
1037
+ }
1038
+
1039
+ /* Horizontal Bar Chart */
1040
+ .horizontal-bar-chart {
1041
+ display: flex;
1042
+ flex-direction: column;
1043
+ gap: 8px;
1044
+ }
1045
+
1046
+ .h-bar-row {
1047
+ display: grid;
1048
+ grid-template-columns: 100px 1fr 60px;
1049
+ align-items: center;
1050
+ gap: 8px;
1051
+ }
1052
+
1053
+ .h-bar-label {
1054
+ overflow: hidden;
1055
+ text-overflow: ellipsis;
1056
+ white-space: nowrap;
1057
+ }
1058
+
1059
+ .h-bar-track {
1060
+ height: 18px;
1061
+ background: var(--bg-tertiary);
1062
+ border-radius: 3px;
1063
+ overflow: hidden;
1064
+ }
1065
+
1066
+ .h-bar-fill {
1067
+ height: 100%;
1068
+ background: var(--accent-primary);
1069
+ border-radius: 3px;
1070
+ transition: width 0.3s ease;
1071
+ }
1072
+
1073
+ .h-bar-fill.tool-claude-code { background: #7c3aed; }
1074
+ .h-bar-fill.tool-codex-cli { background: #16a34a; }
1075
+ .h-bar-fill.tool-gemini-cli { background: #2563eb; }
1076
+ .h-bar-fill.tool-aider { background: #d97706; }
1077
+ .h-bar-fill.tool-proxy { background: var(--text-muted); }
1078
+
1079
+ [data-theme="dark"] .h-bar-fill.tool-claude-code { background: #a78bfa; }
1080
+ [data-theme="dark"] .h-bar-fill.tool-codex-cli { background: #4ade80; }
1081
+ [data-theme="dark"] .h-bar-fill.tool-gemini-cli { background: #60a5fa; }
1082
+ [data-theme="dark"] .h-bar-fill.tool-aider { background: #fbbf24; }
1083
+
1084
+ .h-bar-value {
1085
+ font-size: 12px;
1086
+ font-weight: 500;
1087
+ color: var(--text-primary);
1088
+ text-align: right;
1089
+ }
1090
+
1091
+ .chart-total {
1092
+ text-align: right;
1093
+ font-size: 12px;
1094
+ color: var(--text-tertiary);
1095
+ margin-top: 12px;
1096
+ padding-top: 8px;
1097
+ border-top: 1px solid var(--border-light);
1098
+ }
1099
+
1100
+ /* Summary Table */
1101
+ .summary-table {
1102
+ width: 100%;
1103
+ border-collapse: collapse;
1104
+ font-size: 12px;
1105
+ }
1106
+
1107
+ .summary-table th {
1108
+ text-align: left;
1109
+ padding: 8px;
1110
+ background: var(--bg-tertiary);
1111
+ color: var(--text-tertiary);
1112
+ font-weight: 500;
1113
+ border-bottom: 1px solid var(--border-primary);
1114
+ }
1115
+
1116
+ .summary-table td {
1117
+ padding: 8px;
1118
+ border-bottom: 1px solid var(--border-light);
1119
+ color: var(--text-secondary);
1120
+ }
1121
+
1122
+ .summary-table tr:hover td {
1123
+ background: var(--bg-hover);
1124
+ }
1125
+
1126
+ .daily-summary-table {
1127
+ max-height: 320px;
1128
+ overflow-y: auto;
1129
+ }
1130
+
1131
+ /* Chart container */
1132
+ .chart-container {
1133
+ min-height: 140px;
1134
+ display: flex;
1135
+ flex-direction: column;
1136
+ justify-content: center;
1137
+ }
1138
+
1139
+ /* Responsive adjustments */
1140
+ @media (max-width: 900px) {
1141
+ .analytics-grid {
1142
+ grid-template-columns: 1fr;
1143
+ }
1144
+
1145
+ .analytics-card-wide {
1146
+ grid-column: span 1;
1147
+ }
1148
+
1149
+ .h-bar-row {
1150
+ grid-template-columns: 80px 1fr 50px;
1151
+ }
1152
+ }