speedpatrol 0.1.0 → 0.1.2

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/src/ui/style.css CHANGED
@@ -1,4 +1,7 @@
1
- /* Dark first. Values are the dataviz reference palette: surfaces, ink, one series hue, the status set. */
1
+ /*
2
+ * Dark first. Values are the dataviz reference palette: surfaces, ink, one series hue, the status set.
3
+ * The theme comes from data-theme on <html>: the user's choice, or else the system setting (index.html).
4
+ */
2
5
  :root {
3
6
  color-scheme: dark;
4
7
  --page: #0d0d0d;
@@ -19,26 +22,26 @@
19
22
  --critical: #d03b3b;
20
23
  --critical-text: #e66767;
21
24
  --link: #6da7ec;
25
+ --warning-text: #fab219;
22
26
  --mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
23
27
  }
24
- @media (prefers-color-scheme: light) {
25
- :root {
26
- color-scheme: light;
27
- --page: #f9f9f7;
28
- --surface: #fcfcfb;
29
- --surface-2: #f3f2ee;
30
- --text: #0b0b0b;
31
- --text-2: #52514e;
32
- --muted: #898781;
33
- --grid: #e1e0d9;
34
- --axis: #c3c2b7;
35
- --border: rgba(11, 11, 11, 0.1);
36
- --series: #2a78d6;
37
- --series-wash: rgba(42, 120, 214, 0.12);
38
- --good-text: #006300;
39
- --critical-text: #b42f2f;
40
- --link: #1c5cab;
41
- }
28
+ :root[data-theme="light"] {
29
+ color-scheme: light;
30
+ --page: #f9f9f7;
31
+ --surface: #fcfcfb;
32
+ --surface-2: #f3f2ee;
33
+ --text: #0b0b0b;
34
+ --text-2: #52514e;
35
+ --muted: #898781;
36
+ --grid: #e1e0d9;
37
+ --axis: #c3c2b7;
38
+ --border: rgba(11, 11, 11, 0.1);
39
+ --series: #2a78d6;
40
+ --series-wash: rgba(42, 120, 214, 0.12);
41
+ --good-text: #006300;
42
+ --critical-text: #b42f2f;
43
+ --warning-text: #8a5a00;
44
+ --link: #1c5cab;
42
45
  }
43
46
 
44
47
  * {
@@ -100,12 +103,6 @@ code,
100
103
  .brand:hover {
101
104
  text-decoration: none;
102
105
  }
103
- .brand-name {
104
- color: var(--text-2);
105
- }
106
- .brand-sep {
107
- color: var(--muted);
108
- }
109
106
  .mark {
110
107
  width: 14px;
111
108
  height: 14px;
@@ -113,81 +110,108 @@ code,
113
110
  background: linear-gradient(135deg, var(--series) 0 55%, transparent 55%), var(--surface-2);
114
111
  box-shadow: inset 0 0 0 1px var(--border);
115
112
  }
116
- .meta {
113
+ .tabs {
117
114
  display: flex;
118
- gap: 1.25rem;
119
- font-size: 12.5px;
120
- color: var(--text-2);
115
+ gap: 2px;
121
116
  min-width: 0;
122
- overflow: hidden;
117
+ overflow-x: auto;
123
118
  }
124
- .meta span {
119
+ .tabs a {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ gap: 0.4rem;
123
+ padding: 5px 10px;
124
+ border-radius: 6px;
125
+ color: var(--text-2);
126
+ font-size: 13px;
125
127
  white-space: nowrap;
126
- overflow: hidden;
127
- text-overflow: ellipsis;
128
128
  }
129
- .meta .label {
130
- color: var(--muted);
131
- margin-right: 0.35rem;
129
+ .tabs a:hover {
130
+ background: var(--surface-2);
131
+ color: var(--text);
132
+ text-decoration: none;
132
133
  }
133
- .live {
134
- margin-left: auto;
135
- display: inline-flex;
134
+ .tabs a.active {
135
+ background: var(--surface-2);
136
+ color: var(--text);
137
+ font-weight: 600;
138
+ box-shadow: inset 0 0 0 1px var(--border);
139
+ }
140
+ .tab-badge {
141
+ min-width: 18px;
142
+ padding: 0 5px;
143
+ border-radius: 999px;
144
+ font-size: 11px;
145
+ font-weight: 600;
146
+ line-height: 17px;
147
+ text-align: center;
148
+ font-variant-numeric: tabular-nums;
149
+ color: #fff;
150
+ }
151
+ .tab-badge.tone-fail {
152
+ background: var(--critical);
153
+ }
154
+ .tab-badge.tone-warn {
155
+ background: var(--warning);
156
+ color: #1a1400;
157
+ }
158
+ .tools {
159
+ display: flex;
136
160
  align-items: center;
137
- gap: 0.4rem;
161
+ gap: 6px;
162
+ margin-left: auto;
163
+ }
164
+ .icon-chip,
165
+ .icon-button {
166
+ display: inline-grid;
167
+ place-items: center;
168
+ width: 28px;
169
+ height: 28px;
170
+ border-radius: 999px;
171
+ border: 1px solid var(--border);
172
+ background: none;
138
173
  color: var(--muted);
139
- font-size: 11px;
140
- text-transform: uppercase;
141
- letter-spacing: 0.06em;
174
+ padding: 0;
175
+ }
176
+ .icon-chip[hidden] {
177
+ display: none;
178
+ }
179
+ .icon-button {
180
+ cursor: pointer;
181
+ }
182
+ .icon-button:hover {
183
+ color: var(--text);
184
+ background: var(--surface-2);
185
+ }
186
+ .icon-chip.state-running {
187
+ color: var(--series);
188
+ border-color: color-mix(in srgb, var(--series) 50%, transparent);
189
+ }
190
+ .icon-chip.state-stopped,
191
+ .icon-chip.state-failed {
192
+ color: var(--serious);
193
+ border-color: color-mix(in srgb, var(--serious) 50%, transparent);
194
+ }
195
+ .live {
196
+ display: inline-grid;
197
+ place-items: center;
198
+ width: 28px;
199
+ height: 28px;
142
200
  }
143
201
  .live::before {
144
202
  content: "";
145
- width: 7px;
146
- height: 7px;
203
+ width: 8px;
204
+ height: 8px;
147
205
  border-radius: 50%;
148
206
  background: var(--good);
207
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--good) 22%, transparent);
149
208
  }
150
209
  .live.offline::before {
151
210
  background: var(--critical);
211
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--critical) 22%, transparent);
152
212
  }
153
213
 
154
- /* ---------- agents ---------- */
155
- .agents {
156
- display: grid;
157
- grid-template-columns: repeat(5, minmax(0, 1fr));
158
- gap: 10px;
159
- padding: 14px 1.25rem 0;
160
- }
161
- .agent {
162
- background: var(--surface);
163
- border: 1px solid var(--border);
164
- border-radius: 10px;
165
- padding: 10px 12px;
166
- min-width: 0;
167
- }
168
- .agent-head {
169
- display: flex;
170
- align-items: center;
171
- justify-content: space-between;
172
- gap: 0.5rem;
173
- }
174
- .agent-role {
175
- font-weight: 600;
176
- text-transform: capitalize;
177
- }
178
- .agent-detail {
179
- font-size: 12.5px;
180
- color: var(--text-2);
181
- margin-top: 4px;
182
- white-space: nowrap;
183
- overflow: hidden;
184
- text-overflow: ellipsis;
185
- }
186
- .agent-when {
187
- font-size: 11.5px;
188
- color: var(--muted);
189
- margin-top: 2px;
190
- }
214
+ /* ---------- agent state ---------- */
191
215
  .state {
192
216
  display: inline-flex;
193
217
  align-items: center;
@@ -235,7 +259,7 @@ main {
235
259
  }
236
260
  .grid {
237
261
  display: grid;
238
- grid-template-columns: minmax(0, 1fr) 360px;
262
+ grid-template-columns: minmax(0, 1fr) 380px;
239
263
  gap: 14px;
240
264
  align-items: start;
241
265
  }
@@ -273,18 +297,6 @@ main {
273
297
  .panel-body {
274
298
  padding: 0 14px 14px;
275
299
  }
276
- .empty {
277
- padding: 18px 14px 20px;
278
- color: var(--text-2);
279
- font-size: 13px;
280
- }
281
- .empty code {
282
- background: var(--surface-2);
283
- border: 1px solid var(--border);
284
- border-radius: 5px;
285
- padding: 1px 6px;
286
- color: var(--text);
287
- }
288
300
 
289
301
  /* ---------- tables ---------- */
290
302
  table {
@@ -419,54 +431,6 @@ td.wrap {
419
431
  display: block;
420
432
  }
421
433
 
422
- /* ---------- activity ---------- */
423
- .feed {
424
- list-style: none;
425
- margin: 0;
426
- padding: 0 14px 10px;
427
- max-height: 820px;
428
- overflow: auto;
429
- }
430
- .feed li {
431
- display: grid;
432
- grid-template-columns: 10px minmax(0, 1fr);
433
- gap: 10px;
434
- padding: 8px 0;
435
- border-bottom: 1px solid var(--grid);
436
- }
437
- .feed li:last-child {
438
- border-bottom: 0;
439
- }
440
- .feed .dot {
441
- width: 7px;
442
- height: 7px;
443
- border-radius: 50%;
444
- margin-top: 6px;
445
- background: var(--muted);
446
- }
447
- .feed .dot.start,
448
- .feed .dot.tool-call {
449
- background: var(--series);
450
- }
451
- .feed .dot.finish {
452
- background: var(--good);
453
- }
454
- .feed .dot.error {
455
- background: var(--critical);
456
- }
457
- .feed .what {
458
- font-size: 13px;
459
- }
460
- .feed .who {
461
- font-size: 11.5px;
462
- color: var(--muted);
463
- }
464
- .feed .who b {
465
- font-weight: 500;
466
- color: var(--text-2);
467
- text-transform: capitalize;
468
- }
469
-
470
434
  /* ---------- detail ---------- */
471
435
  .crumbs {
472
436
  font-size: 12.5px;
@@ -493,20 +457,9 @@ td.wrap {
493
457
  font-size: 12.5px;
494
458
  color: var(--text-2);
495
459
  }
496
- .hero {
497
- display: flex;
498
- align-items: baseline;
499
- gap: 0.75rem;
500
- padding: 4px 14px 0;
501
- }
502
- .hero .value {
503
- font-size: 32px;
504
- font-weight: 600;
505
- letter-spacing: -0.01em;
506
- }
507
460
  .multiples {
508
461
  display: grid;
509
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
462
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
510
463
  gap: 14px;
511
464
  }
512
465
  .multiples .panel-head {
@@ -589,7 +542,7 @@ td.wrap {
589
542
  border-radius: 1px;
590
543
  background: var(--series);
591
544
  }
592
- .key .band {
545
+ .key .band-key {
593
546
  width: 14px;
594
547
  height: 9px;
595
548
  border-radius: 2px;
@@ -630,11 +583,518 @@ td.wrap {
630
583
  font-size: 12px;
631
584
  }
632
585
 
586
+ /* ---------- shared parts ---------- */
587
+ :focus-visible {
588
+ outline: 2px solid var(--series);
589
+ outline-offset: 2px;
590
+ border-radius: 4px;
591
+ }
592
+ .sr-only {
593
+ position: absolute;
594
+ width: 1px;
595
+ height: 1px;
596
+ overflow: hidden;
597
+ clip-path: inset(50%);
598
+ white-space: nowrap;
599
+ }
600
+ .nowrap {
601
+ white-space: nowrap;
602
+ }
603
+ td.truncate {
604
+ max-width: 0;
605
+ width: 100%;
606
+ overflow: hidden;
607
+ text-overflow: ellipsis;
608
+ white-space: nowrap;
609
+ }
610
+ .count {
611
+ color: var(--muted);
612
+ font-weight: 500;
613
+ font-variant-numeric: tabular-nums;
614
+ }
615
+
616
+ /* The numbers band: one row of stats, the first one wider on the Overview. */
617
+ .band {
618
+ display: grid;
619
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
620
+ gap: 1px;
621
+ background: var(--border);
622
+ border: 1px solid var(--border);
623
+ border-radius: 10px;
624
+ overflow: hidden;
625
+ margin-bottom: 14px;
626
+ }
627
+ .band.confidence {
628
+ grid-template-columns: minmax(240px, 1.4fr) repeat(4, minmax(150px, 1fr));
629
+ }
630
+ .stat {
631
+ display: flex;
632
+ flex-direction: column;
633
+ gap: 2px;
634
+ min-width: 0;
635
+ padding: 11px 14px 12px;
636
+ background: var(--surface);
637
+ color: var(--text);
638
+ }
639
+ a.stat:hover {
640
+ background: var(--surface-2);
641
+ text-decoration: none;
642
+ }
643
+ .stat-label {
644
+ color: var(--muted);
645
+ font-size: 11px;
646
+ font-weight: 600;
647
+ letter-spacing: 0.04em;
648
+ text-transform: uppercase;
649
+ }
650
+ .stat-value {
651
+ display: flex;
652
+ align-items: center;
653
+ gap: 6px;
654
+ font-size: 20px;
655
+ font-weight: 600;
656
+ line-height: 1.25;
657
+ font-variant-numeric: tabular-nums;
658
+ overflow-wrap: anywhere;
659
+ }
660
+ .stat-value svg {
661
+ flex: none;
662
+ width: 17px;
663
+ height: 17px;
664
+ }
665
+ .stat-note {
666
+ display: -webkit-box;
667
+ -webkit-box-orient: vertical;
668
+ -webkit-line-clamp: 2;
669
+ overflow: hidden;
670
+ color: var(--text-2);
671
+ font-size: 12px;
672
+ }
673
+ .tone-fail .stat-value,
674
+ .tone-icon.tone-fail {
675
+ color: var(--critical-text);
676
+ }
677
+ .tone-warn .stat-value,
678
+ .tone-icon.tone-warn {
679
+ color: var(--warning-text);
680
+ }
681
+ .tone-pass .stat-value,
682
+ .tone-icon.tone-pass {
683
+ color: var(--good-text);
684
+ }
685
+ .tone-info .stat-value {
686
+ color: var(--text);
687
+ }
688
+ .tone-icon {
689
+ display: inline-grid;
690
+ place-items: center;
691
+ flex: none;
692
+ width: 18px;
693
+ height: 18px;
694
+ }
695
+
696
+ /* The one empty state: a title, why it is empty now, and one next step. */
697
+ .empty-state {
698
+ max-width: 34rem;
699
+ margin: 0 auto;
700
+ padding: 28px 16px 32px;
701
+ text-align: center;
702
+ }
703
+ .empty-state.compact {
704
+ max-width: none;
705
+ margin: 0;
706
+ padding: 14px;
707
+ text-align: left;
708
+ }
709
+ .empty-state h3 {
710
+ margin: 0 0 4px;
711
+ font-size: 14px;
712
+ }
713
+ .empty-state p {
714
+ margin: 0;
715
+ text-wrap: pretty;
716
+ color: var(--text-2);
717
+ font-size: 13px;
718
+ }
719
+ .empty-state .command,
720
+ .empty-state .button {
721
+ margin-top: 12px;
722
+ }
723
+ .empty-state:not(.compact) .command {
724
+ margin-inline: auto;
725
+ }
726
+ .command {
727
+ display: flex;
728
+ align-items: center;
729
+ gap: 10px;
730
+ width: fit-content;
731
+ max-width: 100%;
732
+ margin-top: 8px;
733
+ padding: 4px 4px 4px 10px;
734
+ background: var(--surface-2);
735
+ border: 1px solid var(--border);
736
+ border-radius: 6px;
737
+ }
738
+ .command code {
739
+ overflow-wrap: anywhere;
740
+ color: var(--text);
741
+ }
742
+ .copy,
743
+ .button,
744
+ .chip {
745
+ font: inherit;
746
+ cursor: pointer;
747
+ border: 1px solid var(--border);
748
+ border-radius: 5px;
749
+ background: var(--surface);
750
+ color: var(--text-2);
751
+ }
752
+ .copy {
753
+ flex: none;
754
+ padding: 2px 9px;
755
+ font-size: 12px;
756
+ }
757
+ .copy:hover,
758
+ .button:hover,
759
+ .chip:hover {
760
+ color: var(--text);
761
+ background: var(--surface-2);
762
+ }
763
+ .button {
764
+ padding: 4px 12px;
765
+ font-size: 13px;
766
+ }
767
+
768
+ /* Filters: chips with counts, then a search box. */
769
+ .filters {
770
+ display: flex;
771
+ flex-wrap: wrap;
772
+ align-items: center;
773
+ gap: 8px 12px;
774
+ padding: 0 14px 10px;
775
+ }
776
+ .chips {
777
+ display: flex;
778
+ flex-wrap: wrap;
779
+ gap: 6px;
780
+ }
781
+ .chip {
782
+ padding: 3px 10px;
783
+ font-size: 12.5px;
784
+ border-radius: 999px;
785
+ }
786
+ .chip.active {
787
+ background: var(--surface-2);
788
+ color: var(--text);
789
+ border-color: color-mix(in srgb, var(--text) 35%, transparent);
790
+ }
791
+ .search {
792
+ margin-left: auto;
793
+ width: 240px;
794
+ padding: 4px 10px;
795
+ font: inherit;
796
+ font-size: 13px;
797
+ color: var(--text);
798
+ background: var(--page);
799
+ border: 1px solid var(--border);
800
+ border-radius: 6px;
801
+ }
802
+ .search::placeholder {
803
+ color: var(--muted);
804
+ }
805
+
806
+ /* ---------- overview ---------- */
807
+ .attention {
808
+ list-style: none;
809
+ margin: 0;
810
+ padding: 0 14px 6px;
811
+ }
812
+ .attention-row {
813
+ display: flex;
814
+ gap: 10px;
815
+ padding: 10px 0;
816
+ border-top: 1px solid var(--grid);
817
+ }
818
+ .attention-row:first-child {
819
+ border-top: 0;
820
+ }
821
+ .attention-row .tone-icon {
822
+ margin-top: 1px;
823
+ }
824
+ .grow {
825
+ flex: 1;
826
+ min-width: 0;
827
+ }
828
+ .attention-title {
829
+ font-weight: 600;
830
+ }
831
+ .attention-title a {
832
+ color: var(--text);
833
+ }
834
+ .attention-detail {
835
+ color: var(--text-2);
836
+ font-size: 13px;
837
+ }
838
+ .all-clear {
839
+ display: flex;
840
+ align-items: center;
841
+ gap: 8px;
842
+ margin: 0;
843
+ padding: 4px 14px 14px;
844
+ color: var(--text-2);
845
+ }
846
+ .agent-list {
847
+ list-style: none;
848
+ margin: 0;
849
+ padding: 0 14px 8px;
850
+ }
851
+ .agent-row {
852
+ display: grid;
853
+ grid-template-columns: 96px minmax(0, 1fr);
854
+ gap: 0 10px;
855
+ padding: 7px 0;
856
+ border-top: 1px solid var(--grid);
857
+ font-size: 13px;
858
+ }
859
+ .agent-row:first-child {
860
+ border-top: 0;
861
+ }
862
+ .agent-row .state {
863
+ font-size: 13px;
864
+ font-weight: 600;
865
+ color: var(--text);
866
+ }
867
+ .agent-detail {
868
+ overflow: hidden;
869
+ text-overflow: ellipsis;
870
+ white-space: nowrap;
871
+ color: var(--text-2);
872
+ }
873
+ .agent-when {
874
+ grid-column: 2;
875
+ color: var(--muted);
876
+ font-size: 12px;
877
+ }
878
+ table.compact td {
879
+ padding: 7px 14px;
880
+ }
881
+ .callout {
882
+ display: flex;
883
+ align-items: center;
884
+ gap: 10px;
885
+ margin-bottom: 14px;
886
+ padding: 10px 14px;
887
+ background: var(--surface);
888
+ border: 1px solid var(--border);
889
+ border-left: 3px solid var(--warning);
890
+ border-radius: 8px;
891
+ font-size: 13px;
892
+ }
893
+ .callout.tone-fail {
894
+ border-left-color: var(--critical);
895
+ }
896
+ .callout .tone-icon.tone-fail,
897
+ .callout.tone-fail > .tone-icon {
898
+ color: var(--critical-text);
899
+ }
900
+ .callout.tone-warn > .tone-icon {
901
+ color: var(--warning-text);
902
+ }
903
+
904
+ /* ---------- groups and rows ---------- */
905
+ tr.group-row th {
906
+ padding: 14px 14px 6px;
907
+ font-size: 12px;
908
+ font-weight: 600;
909
+ color: var(--text-2);
910
+ background: none;
911
+ text-transform: none;
912
+ }
913
+ tbody:first-of-type tr.group-row th {
914
+ padding-top: 8px;
915
+ }
916
+ .group-head {
917
+ margin: 0;
918
+ padding: 12px 14px 6px;
919
+ font-size: 12px;
920
+ font-weight: 600;
921
+ color: var(--text-2);
922
+ }
923
+ .problem {
924
+ display: inline-flex;
925
+ align-items: center;
926
+ gap: 0.35rem;
927
+ font-size: 12px;
928
+ white-space: nowrap;
929
+ }
930
+ .problem i {
931
+ font-style: normal;
932
+ font-size: 10px;
933
+ }
934
+ .problem.tone-fail {
935
+ color: var(--critical-text);
936
+ }
937
+ .problem.tone-warn {
938
+ color: var(--warning-text);
939
+ }
940
+ .rows {
941
+ list-style: none;
942
+ margin: 0;
943
+ padding: 0;
944
+ }
945
+ .row {
946
+ border-top: 1px solid var(--grid);
947
+ }
948
+ .row-toggle {
949
+ display: flex;
950
+ align-items: center;
951
+ gap: 12px;
952
+ padding: 9px 14px;
953
+ color: var(--text);
954
+ }
955
+ .row-toggle:hover {
956
+ background: var(--surface-2);
957
+ text-decoration: none;
958
+ }
959
+ .row-toggle > svg {
960
+ flex: none;
961
+ color: var(--muted);
962
+ transition: transform 0.12s ease;
963
+ }
964
+ .row.open .row-toggle > svg {
965
+ transform: rotate(90deg);
966
+ }
967
+ .row.open .row-toggle {
968
+ background: var(--surface-2);
969
+ }
970
+ .row-main {
971
+ display: flex;
972
+ flex-direction: column;
973
+ flex: 1;
974
+ min-width: 0;
975
+ }
976
+ .row-title,
977
+ .row-meta {
978
+ overflow: hidden;
979
+ text-overflow: ellipsis;
980
+ white-space: nowrap;
981
+ }
982
+ .row-meta {
983
+ color: var(--muted);
984
+ font-size: 12px;
985
+ }
986
+ .row-stats {
987
+ font-size: 12px;
988
+ white-space: nowrap;
989
+ }
990
+ .row-status {
991
+ flex: none;
992
+ width: 92px;
993
+ }
994
+ .row-detail {
995
+ padding: 4px 14px 16px 42px;
996
+ font-size: 13px;
997
+ }
998
+ .row-detail h4 {
999
+ margin: 14px 0 4px;
1000
+ font-size: 12.5px;
1001
+ }
1002
+ .row-detail p {
1003
+ margin: 4px 0;
1004
+ }
1005
+ .row-detail .analysis {
1006
+ padding: 0;
1007
+ }
1008
+ .facts-list {
1009
+ display: flex;
1010
+ flex-wrap: wrap;
1011
+ gap: 8px 28px;
1012
+ margin: 6px 0 4px;
1013
+ }
1014
+ .facts-list dt {
1015
+ color: var(--muted);
1016
+ font-size: 11px;
1017
+ text-transform: uppercase;
1018
+ letter-spacing: 0.04em;
1019
+ }
1020
+ .facts-list dd {
1021
+ margin: 0;
1022
+ }
1023
+ .plain-list {
1024
+ list-style: none;
1025
+ margin: 0;
1026
+ padding: 0 14px 12px;
1027
+ }
1028
+ .plain-list li {
1029
+ padding: 4px 0;
1030
+ }
1031
+ .row-detail .plain-list {
1032
+ padding: 0;
1033
+ }
1034
+ tr.failed-row td {
1035
+ background: color-mix(in srgb, var(--critical) 6%, transparent);
1036
+ }
1037
+ .fail-text {
1038
+ color: var(--critical-text);
1039
+ font-size: 12px;
1040
+ white-space: normal;
1041
+ }
1042
+ .timeline {
1043
+ list-style: none;
1044
+ margin: 6px 0 0;
1045
+ padding: 0;
1046
+ }
1047
+ .timeline li {
1048
+ display: grid;
1049
+ grid-template-columns: 10px 96px minmax(0, 1fr);
1050
+ gap: 10px;
1051
+ padding: 6px 0;
1052
+ border-top: 1px solid var(--grid);
1053
+ }
1054
+ .timeline li:first-child {
1055
+ border-top: 0;
1056
+ }
1057
+ .timeline .dot {
1058
+ width: 7px;
1059
+ height: 7px;
1060
+ border-radius: 50%;
1061
+ margin-top: 7px;
1062
+ background: var(--muted);
1063
+ }
1064
+ .timeline .dot.start,
1065
+ .timeline .dot.tool-call {
1066
+ background: var(--series);
1067
+ }
1068
+ .timeline .dot.finish {
1069
+ background: var(--good);
1070
+ }
1071
+ .timeline .dot.error {
1072
+ background: var(--critical);
1073
+ }
1074
+ .t-time {
1075
+ white-space: nowrap;
1076
+ color: var(--muted);
1077
+ font-size: 11.5px;
1078
+ padding-top: 2px;
1079
+ }
1080
+
633
1081
  @media (max-width: 1100px) {
634
1082
  .grid {
635
1083
  grid-template-columns: minmax(0, 1fr);
636
1084
  }
637
- .agents {
638
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1085
+ /* The Overview band has five stats: the status on its own row, then four. */
1086
+ .band.confidence {
1087
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1088
+ }
1089
+ .band.confidence .stat:first-child {
1090
+ grid-column: 1 / -1;
1091
+ }
1092
+ /* A wide table scrolls inside its panel, not the page. */
1093
+ .panel {
1094
+ overflow-x: auto;
1095
+ }
1096
+ .topbar {
1097
+ flex-wrap: wrap;
1098
+ gap: 0.75rem;
639
1099
  }
640
1100
  }