@linxiraos/pi-stats 1.0.10 → 1.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.
Files changed (85) hide show
  1. package/CHANGELOG.md +2 -284
  2. package/LICENSE +22 -0
  3. package/README.md +4 -2
  4. package/package.json +91 -93
  5. package/src/aggregator.ts +16 -4
  6. package/src/client/app/NavRail.tsx +1 -1
  7. package/src/client/data/formatters.ts +13 -0
  8. package/src/client/data/view-models.ts +3 -0
  9. package/src/client/routes/CostsRoute.tsx +28 -10
  10. package/src/client/routes/ErrorsRoute.tsx +5 -5
  11. package/src/client/routes/ModelsRoute.tsx +3 -2
  12. package/src/client/routes/OverviewRoute.tsx +6 -6
  13. package/src/client/routes/ProjectsRoute.tsx +7 -5
  14. package/src/client/routes/ProvidersRoute.tsx +30 -5
  15. package/src/client/routes/RequestsRoute.tsx +5 -5
  16. package/src/client/routes/ToolsRoute.tsx +23 -11
  17. package/src/client/ui/MetricCluster.tsx +7 -3
  18. package/src/client/ui/RequestDrawer.tsx +3 -3
  19. package/src/db.ts +127 -35
  20. package/src/embedded-client.generated.txt +0 -1
  21. package/src/index.ts +10 -9
  22. package/src/server.ts +3 -2
  23. package/src/shared-types.ts +14 -1
  24. package/src/usage-windows.ts +104 -28
  25. package/dist/client/index.css +0 -1
  26. package/dist/client/index.html +0 -24
  27. package/dist/client/index.js +0 -257
  28. package/dist/client/styles.css +0 -1692
  29. package/dist/types/aggregator.d.ts +0 -98
  30. package/dist/types/client/App.d.ts +0 -1
  31. package/dist/types/client/api.d.ts +0 -22
  32. package/dist/types/client/app/AppLayout.d.ts +0 -16
  33. package/dist/types/client/app/NavRail.d.ts +0 -7
  34. package/dist/types/client/app/RangeControl.d.ts +0 -7
  35. package/dist/types/client/app/SyncButton.d.ts +0 -14
  36. package/dist/types/client/app/ThemeToggle.d.ts +0 -1
  37. package/dist/types/client/app/TopBar.d.ts +0 -15
  38. package/dist/types/client/app/routes.d.ts +0 -12
  39. package/dist/types/client/components/AgentTokenShare.d.ts +0 -5
  40. package/dist/types/client/components/chart-shared.d.ts +0 -173
  41. package/dist/types/client/components/models-table-shared.d.ts +0 -175
  42. package/dist/types/client/components/range-meta.d.ts +0 -21
  43. package/dist/types/client/data/charts.d.ts +0 -1
  44. package/dist/types/client/data/formatters.d.ts +0 -8
  45. package/dist/types/client/data/useHashRoute.d.ts +0 -8
  46. package/dist/types/client/data/useResource.d.ts +0 -13
  47. package/dist/types/client/data/view-models.d.ts +0 -74
  48. package/dist/types/client/index.d.ts +0 -2
  49. package/dist/types/client/routes/BehaviorRoute.d.ts +0 -7
  50. package/dist/types/client/routes/CostsRoute.d.ts +0 -7
  51. package/dist/types/client/routes/ErrorsRoute.d.ts +0 -8
  52. package/dist/types/client/routes/GainRoute.d.ts +0 -7
  53. package/dist/types/client/routes/ModelsRoute.d.ts +0 -7
  54. package/dist/types/client/routes/OverviewRoute.d.ts +0 -8
  55. package/dist/types/client/routes/ProjectsRoute.d.ts +0 -7
  56. package/dist/types/client/routes/ProvidersRoute.d.ts +0 -7
  57. package/dist/types/client/routes/RequestsRoute.d.ts +0 -8
  58. package/dist/types/client/routes/ToolsRoute.d.ts +0 -7
  59. package/dist/types/client/routes/index.d.ts +0 -10
  60. package/dist/types/client/types.d.ts +0 -63
  61. package/dist/types/client/ui/AsyncBoundary.d.ts +0 -12
  62. package/dist/types/client/ui/DataTable.d.ts +0 -17
  63. package/dist/types/client/ui/EmptyState.d.ts +0 -7
  64. package/dist/types/client/ui/ErrorState.d.ts +0 -6
  65. package/dist/types/client/ui/JsonBlock.d.ts +0 -7
  66. package/dist/types/client/ui/MetricCluster.d.ts +0 -5
  67. package/dist/types/client/ui/Panel.d.ts +0 -7
  68. package/dist/types/client/ui/RequestDrawer.d.ts +0 -5
  69. package/dist/types/client/ui/SegmentedControl.d.ts +0 -12
  70. package/dist/types/client/ui/Skeleton.d.ts +0 -8
  71. package/dist/types/client/ui/StatusPill.d.ts +0 -7
  72. package/dist/types/client/ui/index.d.ts +0 -11
  73. package/dist/types/client/useSystemTheme.d.ts +0 -11
  74. package/dist/types/db.d.ts +0 -159
  75. package/dist/types/embedded-client.d.ts +0 -18
  76. package/dist/types/gain-aggregator.d.ts +0 -26
  77. package/dist/types/index.d.ts +0 -17
  78. package/dist/types/parser.d.ts +0 -53
  79. package/dist/types/port-conflict.d.ts +0 -16
  80. package/dist/types/server.d.ts +0 -14
  81. package/dist/types/shared-types.d.ts +0 -408
  82. package/dist/types/sync-worker.d.ts +0 -31
  83. package/dist/types/types.d.ts +0 -164
  84. package/dist/types/usage-windows.d.ts +0 -45
  85. package/dist/types/user-metrics.d.ts +0 -81
@@ -1,1692 +0,0 @@
1
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties;
3
- @layer theme, base, components, utilities;
4
- @layer theme {
5
- :root, :host {
6
- --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
7
- "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
8
- "Segoe UI Symbol", "Noto Color Emoji";
9
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
10
- "Courier New", monospace;
11
- --spacing: 0.25rem;
12
- --text-xs: 0.75rem;
13
- --text-xs--line-height: calc(1 / 0.75);
14
- --text-sm: 0.875rem;
15
- --text-sm--line-height: calc(1.25 / 0.875);
16
- --text-lg: 1.125rem;
17
- --text-lg--line-height: calc(1.75 / 1.125);
18
- --text-2xl: 1.5rem;
19
- --text-2xl--line-height: calc(2 / 1.5);
20
- --font-weight-medium: 500;
21
- --font-weight-semibold: 600;
22
- --font-weight-bold: 700;
23
- --tracking-wider: 0.05em;
24
- --radius-sm: 0.25rem;
25
- --radius-md: 0.375rem;
26
- --radius-lg: 0.5rem;
27
- --default-transition-duration: 150ms;
28
- --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
29
- --default-font-family: var(--font-sans);
30
- --default-mono-font-family: var(--font-mono);
31
- }
32
- }
33
- @layer base {
34
- *, ::after, ::before, ::backdrop, ::file-selector-button {
35
- box-sizing: border-box;
36
- margin: 0;
37
- padding: 0;
38
- border: 0 solid;
39
- }
40
- html, :host {
41
- line-height: 1.5;
42
- -webkit-text-size-adjust: 100%;
43
- tab-size: 4;
44
- font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
45
- font-feature-settings: var(--default-font-feature-settings, normal);
46
- font-variation-settings: var(--default-font-variation-settings, normal);
47
- -webkit-tap-highlight-color: transparent;
48
- }
49
- hr {
50
- height: 0;
51
- color: inherit;
52
- border-top-width: 1px;
53
- }
54
- abbr:where([title]) {
55
- -webkit-text-decoration: underline dotted;
56
- text-decoration: underline dotted;
57
- }
58
- h1, h2, h3, h4, h5, h6 {
59
- font-size: inherit;
60
- font-weight: inherit;
61
- }
62
- a {
63
- color: inherit;
64
- -webkit-text-decoration: inherit;
65
- text-decoration: inherit;
66
- }
67
- b, strong {
68
- font-weight: bolder;
69
- }
70
- code, kbd, samp, pre {
71
- font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
72
- font-feature-settings: var(--default-mono-font-feature-settings, normal);
73
- font-variation-settings: var(--default-mono-font-variation-settings, normal);
74
- font-size: 1em;
75
- }
76
- small {
77
- font-size: 80%;
78
- }
79
- sub, sup {
80
- font-size: 75%;
81
- line-height: 0;
82
- position: relative;
83
- vertical-align: baseline;
84
- }
85
- sub {
86
- bottom: -0.25em;
87
- }
88
- sup {
89
- top: -0.5em;
90
- }
91
- table {
92
- text-indent: 0;
93
- border-color: inherit;
94
- border-collapse: collapse;
95
- }
96
- :-moz-focusring:where(:not(iframe)) {
97
- outline: auto;
98
- }
99
- progress {
100
- vertical-align: baseline;
101
- }
102
- summary {
103
- display: list-item;
104
- }
105
- ol, ul, menu {
106
- list-style: none;
107
- }
108
- img, svg, video, canvas, audio, iframe, embed, object {
109
- display: block;
110
- vertical-align: middle;
111
- }
112
- img, video {
113
- max-width: 100%;
114
- height: auto;
115
- }
116
- button, input, select, optgroup, textarea, ::file-selector-button {
117
- font: inherit;
118
- font-feature-settings: inherit;
119
- font-variation-settings: inherit;
120
- letter-spacing: inherit;
121
- color: inherit;
122
- border-radius: 0;
123
- background-color: transparent;
124
- opacity: 1;
125
- }
126
- :where(select:is([multiple], [size])) optgroup {
127
- font-weight: bolder;
128
- }
129
- :where(select:is([multiple], [size])) optgroup option {
130
- padding-inline-start: 20px;
131
- }
132
- ::file-selector-button {
133
- margin-inline-end: 4px;
134
- }
135
- ::placeholder {
136
- opacity: 1;
137
- }
138
- @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
139
- ::placeholder {
140
- color: currentcolor;
141
- @supports (color: color-mix(in lab, red, red)) {
142
- color: color-mix(in oklab, currentcolor 50%, transparent);
143
- }
144
- }
145
- }
146
- textarea {
147
- resize: vertical;
148
- }
149
- ::-webkit-search-decoration {
150
- -webkit-appearance: none;
151
- }
152
- ::-webkit-date-and-time-value {
153
- min-height: 1lh;
154
- text-align: inherit;
155
- }
156
- ::-webkit-datetime-edit {
157
- display: inline-flex;
158
- }
159
- ::-webkit-datetime-edit-fields-wrapper {
160
- padding: 0;
161
- }
162
- ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
163
- padding-block: 0;
164
- }
165
- ::-webkit-calendar-picker-indicator {
166
- line-height: 1;
167
- }
168
- :-moz-ui-invalid {
169
- box-shadow: none;
170
- }
171
- button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
172
- appearance: button;
173
- }
174
- ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
175
- height: auto;
176
- }
177
- [hidden]:where(:not([hidden="until-found"])) {
178
- display: none !important;
179
- }
180
- }
181
- @layer utilities {
182
- .mt-0\.5 {
183
- margin-top: calc(var(--spacing) * 0.5);
184
- }
185
- .mt-1 {
186
- margin-top: var(--spacing);
187
- }
188
- .mt-2 {
189
- margin-top: calc(var(--spacing) * 2);
190
- }
191
- .mb-1 {
192
- margin-bottom: var(--spacing);
193
- }
194
- .mb-2 {
195
- margin-bottom: calc(var(--spacing) * 2);
196
- }
197
- .mb-4 {
198
- margin-bottom: calc(var(--spacing) * 4);
199
- }
200
- .ml-auto {
201
- margin-left: auto;
202
- }
203
- .flex {
204
- display: flex;
205
- }
206
- .grid {
207
- display: grid;
208
- }
209
- .h-1 {
210
- height: var(--spacing);
211
- }
212
- .h-2\.5 {
213
- height: calc(var(--spacing) * 2.5);
214
- }
215
- .h-3 {
216
- height: calc(var(--spacing) * 3);
217
- }
218
- .h-10 {
219
- height: calc(var(--spacing) * 10);
220
- }
221
- .h-\[200px\] {
222
- height: 200px;
223
- }
224
- .h-\[260px\] {
225
- height: 260px;
226
- }
227
- .h-\[280px\] {
228
- height: 280px;
229
- }
230
- .h-\[300px\] {
231
- height: 300px;
232
- }
233
- .h-full {
234
- height: 100%;
235
- }
236
- .max-h-\[280px\] {
237
- max-height: 280px;
238
- }
239
- .max-h-\[calc\(100vh-300px\)\] {
240
- max-height: calc(100vh - 300px);
241
- }
242
- .w-2\.5 {
243
- width: calc(var(--spacing) * 2.5);
244
- }
245
- .w-24 {
246
- width: calc(var(--spacing) * 24);
247
- }
248
- .w-full {
249
- width: 100%;
250
- }
251
- .max-w-\[280px\] {
252
- max-width: 280px;
253
- }
254
- .max-w-\[440px\] {
255
- max-width: 440px;
256
- }
257
- .min-w-0 {
258
- min-width: 0px;
259
- }
260
- .flex-1 {
261
- flex: 1;
262
- }
263
- .flex-shrink-0 {
264
- flex-shrink: 0;
265
- }
266
- .cursor-pointer {
267
- cursor: pointer;
268
- }
269
- .grid-cols-1 {
270
- grid-template-columns: repeat(1, minmax(0, 1fr));
271
- }
272
- .grid-cols-2 {
273
- grid-template-columns: repeat(2, minmax(0, 1fr));
274
- }
275
- .flex-wrap {
276
- flex-wrap: wrap;
277
- }
278
- .items-baseline {
279
- align-items: baseline;
280
- }
281
- .items-center {
282
- align-items: center;
283
- }
284
- .items-start {
285
- align-items: flex-start;
286
- }
287
- .justify-between {
288
- justify-content: space-between;
289
- }
290
- .justify-center {
291
- justify-content: center;
292
- }
293
- .gap-2 {
294
- gap: calc(var(--spacing) * 2);
295
- }
296
- .gap-3 {
297
- gap: calc(var(--spacing) * 3);
298
- }
299
- .gap-4 {
300
- gap: calc(var(--spacing) * 4);
301
- }
302
- .gap-6 {
303
- gap: calc(var(--spacing) * 6);
304
- }
305
- :where(.space-y-0\.5 > :not(:last-child)) {
306
- --tw-space-y-reverse: 0;
307
- margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));
308
- margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));
309
- }
310
- :where(.space-y-1 > :not(:last-child)) {
311
- --tw-space-y-reverse: 0;
312
- margin-block-start: calc(var(--spacing) * var(--tw-space-y-reverse));
313
- margin-block-end: calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)));
314
- }
315
- :where(.space-y-2 > :not(:last-child)) {
316
- --tw-space-y-reverse: 0;
317
- margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));
318
- margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
319
- }
320
- :where(.space-y-4 > :not(:last-child)) {
321
- --tw-space-y-reverse: 0;
322
- margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
323
- margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
324
- }
325
- :where(.space-y-6 > :not(:last-child)) {
326
- --tw-space-y-reverse: 0;
327
- margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));
328
- margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
329
- }
330
- .truncate {
331
- overflow: hidden;
332
- text-overflow: ellipsis;
333
- white-space: nowrap;
334
- }
335
- .overflow-hidden {
336
- overflow: hidden;
337
- }
338
- .overflow-x-auto {
339
- overflow-x: auto;
340
- }
341
- .overflow-y-auto {
342
- overflow-y: auto;
343
- }
344
- .rounded {
345
- border-radius: 0.25rem;
346
- }
347
- .rounded-full {
348
- border-radius: calc(infinity * 1px);
349
- }
350
- .border-t {
351
- border-top-style: var(--tw-border-style);
352
- border-top-width: 1px;
353
- }
354
- .border-b {
355
- border-bottom-style: var(--tw-border-style);
356
- border-bottom-width: 1px;
357
- }
358
- .border-none {
359
- --tw-border-style: none;
360
- border-style: none;
361
- }
362
- .border-\[var\(--border-subtle\)\] {
363
- border-color: var(--border-subtle);
364
- }
365
- .bg-\[var\(--bg-elevated\)\] {
366
- background-color: var(--bg-elevated);
367
- }
368
- .bg-transparent {
369
- background-color: transparent;
370
- }
371
- .p-2 {
372
- padding: calc(var(--spacing) * 2);
373
- }
374
- .px-4 {
375
- padding-inline: calc(var(--spacing) * 4);
376
- }
377
- .px-5 {
378
- padding-inline: calc(var(--spacing) * 5);
379
- }
380
- .py-3 {
381
- padding-block: calc(var(--spacing) * 3);
382
- }
383
- .py-4 {
384
- padding-block: calc(var(--spacing) * 4);
385
- }
386
- .py-8 {
387
- padding-block: calc(var(--spacing) * 8);
388
- }
389
- .pr-2 {
390
- padding-right: calc(var(--spacing) * 2);
391
- }
392
- .text-center {
393
- text-align: center;
394
- }
395
- .text-left {
396
- text-align: left;
397
- }
398
- .text-right {
399
- text-align: right;
400
- }
401
- .font-mono {
402
- font-family: var(--font-mono);
403
- }
404
- .text-2xl {
405
- font-size: var(--text-2xl);
406
- line-height: var(--tw-leading, var(--text-2xl--line-height));
407
- }
408
- .text-lg {
409
- font-size: var(--text-lg);
410
- line-height: var(--tw-leading, var(--text-lg--line-height));
411
- }
412
- .text-sm {
413
- font-size: var(--text-sm);
414
- line-height: var(--tw-leading, var(--text-sm--line-height));
415
- }
416
- .text-xs {
417
- font-size: var(--text-xs);
418
- line-height: var(--tw-leading, var(--text-xs--line-height));
419
- }
420
- .font-bold {
421
- --tw-font-weight: var(--font-weight-bold);
422
- font-weight: var(--font-weight-bold);
423
- }
424
- .font-medium {
425
- --tw-font-weight: var(--font-weight-medium);
426
- font-weight: var(--font-weight-medium);
427
- }
428
- .font-semibold {
429
- --tw-font-weight: var(--font-weight-semibold);
430
- font-weight: var(--font-weight-semibold);
431
- }
432
- .tracking-wider {
433
- --tw-tracking: var(--tracking-wider);
434
- letter-spacing: var(--tracking-wider);
435
- }
436
- .whitespace-nowrap {
437
- white-space: nowrap;
438
- }
439
- .text-\[var\(--text-muted\)\] {
440
- color: var(--text-muted);
441
- }
442
- .text-\[var\(--text-primary\)\] {
443
- color: var(--text-primary);
444
- }
445
- .text-\[var\(--text-secondary\)\] {
446
- color: var(--text-secondary);
447
- }
448
- .uppercase {
449
- text-transform: uppercase;
450
- }
451
- .tabular-nums {
452
- --tw-numeric-spacing: tabular-nums;
453
- font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
454
- }
455
- .transition-colors {
456
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
457
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
458
- transition-duration: var(--tw-duration, var(--default-transition-duration));
459
- }
460
- @media (hover: hover) {
461
- .hover\:bg-\[var\(--bg-hover\)\]:hover {
462
- background-color: var(--bg-hover);
463
- }
464
- }
465
- @media (width >= 48rem) {
466
- .md\:grid-cols-3 {
467
- grid-template-columns: repeat(3, minmax(0, 1fr));
468
- }
469
- .md\:grid-cols-6 {
470
- grid-template-columns: repeat(6, minmax(0, 1fr));
471
- }
472
- }
473
- @media (width >= 64rem) {
474
- .lg\:col-span-2 {
475
- grid-column: span 2 / span 2;
476
- }
477
- .lg\:grid-cols-3 {
478
- grid-template-columns: repeat(3, minmax(0, 1fr));
479
- }
480
- }
481
- }
482
- :root {
483
- color-scheme: dark;
484
- --bg: #1a1a1a;
485
- --bg-panel: #242424;
486
- --bg-hover: #2e2e2e;
487
- --bg-selected: #383838;
488
- --bg-subtle: rgba(255,255,255,0.04);
489
- --border: #3a3a3a;
490
- --border-strong: rgba(255,255,255,0.13);
491
- --text: #e8e8e8;
492
- --text-muted: #9ca3af;
493
- --text-dim: #6b7280;
494
- --accent: #60a5fa;
495
- --accent-hover: #93c5fd;
496
- --accent-fg: #0f172a;
497
- --accent-muted: rgba(96,165,250,0.18);
498
- --link: #60a5fa;
499
- --success: #22c55e;
500
- --danger: #ef4444;
501
- --warning: #f59e0b;
502
- --page: var(--bg);
503
- --surface: var(--bg-panel);
504
- --surface-2: var(--bg-hover);
505
- --muted: var(--text-muted);
506
- --dim: var(--text-dim);
507
- --text-primary: var(--text);
508
- --text-secondary: var(--text-muted);
509
- --border-subtle: var(--border);
510
- --accent-red: var(--danger);
511
- --accent-green: var(--success);
512
- --accent-cyan: var(--link);
513
- --bg-elevated: var(--bg-hover);
514
- --radius-sm: 3px;
515
- --radius-md: 6px;
516
- --radius-lg: 8px;
517
- }
518
- @media (prefers-color-scheme: light) {
519
- :root:not([data-theme]) {
520
- color-scheme: light;
521
- --bg: #ffffff;
522
- --bg-panel: #f5f5f5;
523
- --bg-hover: #eeeeee;
524
- --bg-selected: #e8e8e8;
525
- --bg-subtle: rgba(0,0,0,0.03);
526
- --border: #e0e0e0;
527
- --border-strong: rgba(0,0,0,0.15);
528
- --text: #1a1a1a;
529
- --text-muted: #6b7280;
530
- --text-dim: #9ca3af;
531
- --accent: #2563eb;
532
- --accent-hover: #1d4ed8;
533
- --accent-fg: #ffffff;
534
- --accent-muted: rgba(37,99,235,0.14);
535
- --link: #2563eb;
536
- --success: #16a34a;
537
- --danger: #dc2626;
538
- --warning: #d97706;
539
- --page: var(--bg);
540
- --surface: var(--bg-panel);
541
- --surface-2: var(--bg-hover);
542
- --muted: var(--text-muted);
543
- --dim: var(--text-dim);
544
- }
545
- }
546
- [data-theme="light"] {
547
- color-scheme: light;
548
- --bg: #ffffff;
549
- --bg-panel: #f5f5f5;
550
- --bg-hover: #eeeeee;
551
- --bg-selected: #e8e8e8;
552
- --bg-subtle: rgba(0,0,0,0.03);
553
- --border: #e0e0e0;
554
- --border-strong: rgba(0,0,0,0.15);
555
- --text: #1a1a1a;
556
- --text-muted: #6b7280;
557
- --text-dim: #9ca3af;
558
- --accent: #2563eb;
559
- --accent-hover: #1d4ed8;
560
- --accent-fg: #ffffff;
561
- --accent-muted: rgba(37,99,235,0.14);
562
- --link: #2563eb;
563
- --success: #16a34a;
564
- --danger: #dc2626;
565
- --warning: #d97706;
566
- --page: var(--bg);
567
- --surface: var(--bg-panel);
568
- --surface-2: var(--bg-hover);
569
- --muted: var(--text-muted);
570
- --dim: var(--text-dim);
571
- }
572
- [data-theme="starfield"] {
573
- color-scheme: dark;
574
- --bg: #08090d;
575
- --bg-panel: #0d1117;
576
- --bg-hover: #161d2e;
577
- --bg-selected: #1a2540;
578
- --bg-subtle: rgba(217,155,38,0.05);
579
- --border: #1e2d45;
580
- --border-strong: rgba(217,155,38,0.2);
581
- --text: #e8eeff;
582
- --text-muted: #8fa3c0;
583
- --text-dim: #3d5070;
584
- --accent: #d99b26;
585
- --accent-hover: #f0b840;
586
- --accent-fg: #0f172a;
587
- --accent-muted: rgba(217,155,38,0.18);
588
- --link: #d99b26;
589
- --success: #22c55e;
590
- --danger: #c81d25;
591
- --warning: #e05a2b;
592
- --page: var(--bg);
593
- --surface: var(--bg-panel);
594
- --surface-2: var(--bg-hover);
595
- --muted: var(--text-muted);
596
- --dim: var(--text-dim);
597
- }
598
- @layer base {
599
- * {
600
- box-sizing: border-box;
601
- }
602
- html {
603
- -webkit-font-smoothing: antialiased;
604
- -moz-osx-font-smoothing: grayscale;
605
- }
606
- body {
607
- font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
608
- background: var(--page);
609
- color: var(--text);
610
- margin: 0;
611
- min-height: 100vh;
612
- }
613
- button:focus-visible, a:focus-visible, [tabindex]:focus-visible {
614
- outline: 2px solid var(--link);
615
- outline-offset: 2px;
616
- }
617
- }
618
- .stats-app-container {
619
- display: flex;
620
- min-height: 100vh;
621
- background: var(--page);
622
- color: var(--text);
623
- }
624
- .stats-nav-rail {
625
- width: 240px;
626
- background: var(--surface);
627
- border-right: 1px solid var(--border);
628
- display: flex;
629
- flex-direction: column;
630
- flex-shrink: 0;
631
- }
632
- .stats-desktop-nav {
633
- display: flex;
634
- }
635
- @media (max-width: 1023px) {
636
- .stats-desktop-nav {
637
- display: none;
638
- }
639
- }
640
- .stats-nav-rail-header {
641
- padding: 20px 24px;
642
- border-bottom: 1px solid var(--border);
643
- height: 56px;
644
- display: flex;
645
- align-items: center;
646
- }
647
- .stats-logo-container {
648
- display: flex;
649
- flex-direction: column;
650
- }
651
- .stats-logo-text {
652
- font-size: 14px;
653
- font-weight: 700;
654
- letter-spacing: 0.1em;
655
- color: var(--text);
656
- }
657
- .stats-logo-subtext {
658
- font-size: 10px;
659
- text-transform: uppercase;
660
- letter-spacing: 0.05em;
661
- color: var(--muted);
662
- }
663
- .stats-nav-rail-menu {
664
- flex: 1;
665
- padding: 16px 12px;
666
- display: flex;
667
- flex-direction: column;
668
- gap: 4px;
669
- }
670
- .stats-nav-rail-item {
671
- display: flex;
672
- align-items: center;
673
- gap: 12px;
674
- padding: 10px 16px;
675
- font-size: 13px;
676
- font-weight: 500;
677
- color: var(--muted);
678
- background: transparent;
679
- border: none;
680
- border-radius: var(--radius-md);
681
- cursor: pointer;
682
- text-align: left;
683
- transition: all 0.15s ease;
684
- }
685
- .stats-nav-rail-item:hover {
686
- color: var(--text);
687
- background: var(--surface-2);
688
- }
689
- .stats-nav-rail-item[data-active="true"] {
690
- color: var(--accent);
691
- background: var(--accent-muted);
692
- position: relative;
693
- }
694
- .stats-nav-rail-item[data-active="true"]::before {
695
- content: "";
696
- position: absolute;
697
- left: 0;
698
- top: 50%;
699
- height: 18px;
700
- width: 3px;
701
- border-radius: 0 3px 3px 0;
702
- background: var(--accent);
703
- transform: translateY(-50%);
704
- }
705
- .stats-nav-rail-item-icon {
706
- flex-shrink: 0;
707
- }
708
- .stats-nav-rail-footer {
709
- padding: 16px 24px;
710
- border-top: 1px solid var(--border);
711
- }
712
- .stats-version-tag {
713
- font-size: 11px;
714
- color: var(--dim);
715
- }
716
- .stats-main-pane {
717
- flex: 1;
718
- display: flex;
719
- flex-direction: column;
720
- min-width: 0;
721
- }
722
- .stats-top-bar {
723
- height: 56px;
724
- background: var(--surface);
725
- border-bottom: 1px solid var(--border);
726
- display: flex;
727
- align-items: center;
728
- justify-content: space-between;
729
- padding: 0 24px;
730
- }
731
- @media (max-width: 767px) {
732
- .stats-top-bar {
733
- padding: 0 16px;
734
- flex-wrap: wrap;
735
- height: auto;
736
- min-height: 56px;
737
- padding-top: 8px;
738
- padding-bottom: 8px;
739
- gap: 12px;
740
- }
741
- }
742
- .stats-top-bar-left {
743
- display: flex;
744
- align-items: center;
745
- gap: 12px;
746
- }
747
- .stats-mobile-menu-btn {
748
- display: none;
749
- background: transparent;
750
- border: none;
751
- color: var(--text);
752
- padding: 4px;
753
- cursor: pointer;
754
- }
755
- @media (max-width: 1023px) {
756
- .stats-mobile-menu-btn {
757
- display: inline-flex;
758
- align-items: center;
759
- justify-content: center;
760
- }
761
- }
762
- .stats-page-title {
763
- font-size: 16px;
764
- font-weight: 600;
765
- color: var(--text);
766
- margin: 0;
767
- }
768
- .stats-top-bar-right {
769
- display: flex;
770
- align-items: center;
771
- gap: 16px;
772
- }
773
- @media (max-width: 767px) {
774
- .stats-top-bar-right {
775
- width: 100%;
776
- justify-content: space-between;
777
- gap: 8px;
778
- }
779
- }
780
- .stats-top-bar-meta {
781
- display: flex;
782
- align-items: center;
783
- }
784
- .stats-last-updated {
785
- font-size: 11px;
786
- color: var(--dim);
787
- font-variant-numeric: tabular-nums;
788
- }
789
- .stats-content-area {
790
- flex: 1;
791
- overflow-y: auto;
792
- }
793
- .stats-content-inner {
794
- max-width: 1560px;
795
- margin: 0 auto;
796
- padding: 24px;
797
- display: flex;
798
- flex-direction: column;
799
- gap: 24px;
800
- }
801
- @media (max-width: 767px) {
802
- .stats-content-inner {
803
- padding: 16px;
804
- gap: 16px;
805
- }
806
- }
807
- .stats-mobile-drawer-overlay {
808
- position: fixed;
809
- inset: 0;
810
- background: rgba(0, 0, 0, 0.4);
811
- backdrop-filter: none;
812
- z-index: 100;
813
- }
814
- .stats-mobile-drawer {
815
- position: absolute;
816
- left: 0;
817
- top: 0;
818
- bottom: 0;
819
- width: 260px;
820
- background: var(--surface);
821
- border-right: 1px solid var(--border);
822
- display: flex;
823
- flex-direction: column;
824
- z-index: 101;
825
- animation: slideIn 0.2s ease-out;
826
- }
827
- @keyframes slideIn {
828
- from {
829
- transform: translateX(-100%);
830
- }
831
- to {
832
- transform: translateX(0);
833
- }
834
- }
835
- .stats-mobile-drawer-header {
836
- height: 56px;
837
- display: flex;
838
- align-items: center;
839
- justify-content: space-between;
840
- padding: 0 16px 0 24px;
841
- border-bottom: 1px solid var(--border);
842
- }
843
- .stats-mobile-nav {
844
- display: flex;
845
- height: calc(100% - 56px);
846
- }
847
- .stats-button {
848
- display: inline-flex;
849
- align-items: center;
850
- justify-content: center;
851
- gap: 8px;
852
- padding: 8px 14px;
853
- font-size: 13px;
854
- font-weight: 500;
855
- border-radius: var(--radius-md);
856
- border: 1px solid transparent;
857
- cursor: pointer;
858
- transition: all 0.15s ease;
859
- font-family: inherit;
860
- }
861
- .stats-button:active:not(:disabled) {
862
- transform: translateY(1px);
863
- }
864
- .stats-button-primary {
865
- background: var(--accent);
866
- color: var(--accent-fg);
867
- }
868
- .stats-button-primary:hover:not(:disabled) {
869
- opacity: 0.9;
870
- }
871
- .stats-button-primary:disabled {
872
- opacity: 0.5;
873
- cursor: not-allowed;
874
- }
875
- .stats-button-secondary {
876
- background: var(--surface-2);
877
- color: var(--text);
878
- border-color: var(--border);
879
- }
880
- .stats-button-secondary:hover:not(:disabled) {
881
- background: var(--border);
882
- }
883
- .stats-button-secondary:disabled {
884
- opacity: 0.5;
885
- cursor: not-allowed;
886
- }
887
- .stats-range-control {
888
- display: flex;
889
- background: var(--surface-2);
890
- border: 1px solid var(--border);
891
- border-radius: var(--radius-md);
892
- padding: 2px;
893
- }
894
- .stats-range-control-btn {
895
- padding: 4px 10px;
896
- font-size: 12px;
897
- font-weight: 500;
898
- color: var(--muted);
899
- background: transparent;
900
- border: none;
901
- border-radius: var(--radius-sm);
902
- cursor: pointer;
903
- transition: all 0.1s ease;
904
- }
905
- .stats-range-control-btn:hover {
906
- color: var(--text);
907
- }
908
- .stats-range-control-btn[data-active="true"] {
909
- color: var(--text);
910
- background: var(--surface);
911
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
912
- }
913
- .stats-sync-container {
914
- display: flex;
915
- align-items: center;
916
- gap: 12px;
917
- }
918
- .stats-sync-status-msg {
919
- font-size: 11px;
920
- font-variant-numeric: tabular-nums;
921
- max-width: 200px;
922
- white-space: nowrap;
923
- overflow: hidden;
924
- text-overflow: ellipsis;
925
- }
926
- .stats-sync-status-msg[data-type="success"] {
927
- color: var(--success);
928
- }
929
- .stats-sync-status-msg[data-type="error"] {
930
- color: var(--danger);
931
- }
932
- .stats-sync-icon {
933
- flex-shrink: 0;
934
- }
935
- .stats-spin {
936
- animation: spin 1s linear infinite;
937
- }
938
- @keyframes spin {
939
- to {
940
- transform: rotate(360deg);
941
- }
942
- }
943
- .stats-panel {
944
- background: var(--surface);
945
- border: 1px solid var(--border);
946
- border-radius: var(--radius-lg);
947
- display: flex;
948
- flex-direction: column;
949
- }
950
- .stats-panel-header {
951
- padding: 16px 20px;
952
- border-bottom: 1px solid var(--border);
953
- display: flex;
954
- align-items: center;
955
- justify-content: space-between;
956
- gap: 16px;
957
- }
958
- @media (max-width: 480px) {
959
- .stats-panel-header {
960
- flex-direction: column;
961
- align-items: flex-start;
962
- gap: 8px;
963
- }
964
- }
965
- .stats-panel-header-titles {
966
- display: flex;
967
- flex-direction: column;
968
- }
969
- .stats-panel-title {
970
- font-size: 14px;
971
- font-weight: 600;
972
- color: var(--text);
973
- margin: 0;
974
- }
975
- .stats-panel-subtitle {
976
- font-size: 12px;
977
- color: var(--muted);
978
- margin: 2px 0 0 0;
979
- }
980
- .stats-panel-actions {
981
- display: flex;
982
- align-items: center;
983
- gap: 12px;
984
- }
985
- .stats-panel-body {
986
- padding: 20px;
987
- }
988
- .stats-metric-cluster {
989
- display: flex;
990
- flex-direction: column;
991
- gap: 16px;
992
- }
993
- .stats-metric-primary-grid {
994
- display: grid;
995
- grid-template-columns: repeat(5, minmax(0, 1fr));
996
- gap: 16px;
997
- }
998
- @media (max-width: 1023px) {
999
- .stats-metric-primary-grid {
1000
- grid-template-columns: repeat(2, 1fr);
1001
- }
1002
- }
1003
- @media (max-width: 480px) {
1004
- .stats-metric-primary-grid {
1005
- grid-template-columns: 1fr;
1006
- }
1007
- }
1008
- .stats-metric-secondary-grid {
1009
- display: grid;
1010
- grid-template-columns: repeat(8, 1fr);
1011
- gap: 12px;
1012
- }
1013
- @media (max-width: 1279px) {
1014
- .stats-metric-secondary-grid {
1015
- grid-template-columns: repeat(4, 1fr);
1016
- }
1017
- }
1018
- @media (max-width: 767px) {
1019
- .stats-metric-secondary-grid {
1020
- grid-template-columns: repeat(2, 1fr);
1021
- }
1022
- }
1023
- .stats-metric-card {
1024
- background: var(--surface);
1025
- border: 1px solid var(--border);
1026
- border-radius: var(--radius-lg);
1027
- padding: 16px;
1028
- display: flex;
1029
- flex-direction: column;
1030
- justify-content: space-between;
1031
- }
1032
- .stats-metric-card.primary {
1033
- padding: 20px 18px;
1034
- }
1035
- .stats-metric-card.primary .stats-metric-label {
1036
- color: var(--accent);
1037
- }
1038
- .stats-metric-card.secondary {
1039
- padding: 12px 14px;
1040
- }
1041
- .stats-metric-label {
1042
- font-size: 11px;
1043
- font-weight: 600;
1044
- text-transform: uppercase;
1045
- letter-spacing: 0.05em;
1046
- color: var(--muted);
1047
- margin-bottom: 8px;
1048
- }
1049
- .stats-metric-value {
1050
- font-size: 20px;
1051
- font-weight: 700;
1052
- color: var(--text);
1053
- font-variant-numeric: tabular-nums;
1054
- }
1055
- .stats-metric-card.secondary .stats-metric-value {
1056
- font-size: 15px;
1057
- font-weight: 600;
1058
- }
1059
- .stats-table-wrapper {
1060
- width: 100%;
1061
- }
1062
- .stats-table-container {
1063
- width: 100%;
1064
- overflow-x: auto;
1065
- }
1066
- .stats-table {
1067
- width: 100%;
1068
- border-collapse: collapse;
1069
- font-size: 13px;
1070
- font-variant-numeric: tabular-nums;
1071
- }
1072
- .stats-table-th {
1073
- font-size: 11px;
1074
- font-weight: 600;
1075
- text-transform: uppercase;
1076
- letter-spacing: 0.05em;
1077
- color: var(--muted);
1078
- padding: 12px 16px;
1079
- border-bottom: 2px solid var(--border);
1080
- }
1081
- .stats-table-td {
1082
- padding: 10px 16px;
1083
- border-bottom: 1px solid var(--border);
1084
- color: var(--text);
1085
- }
1086
- .stats-table-tr {
1087
- background: transparent;
1088
- }
1089
- .stats-table-tr-clickable {
1090
- cursor: pointer;
1091
- transition: background 0.12s ease, box-shadow 0.12s ease;
1092
- }
1093
- .stats-table-tr-clickable:hover {
1094
- background: var(--surface-2);
1095
- box-shadow: inset 2px 0 0 var(--accent);
1096
- }
1097
- .stats-text-left {
1098
- text-align: left;
1099
- }
1100
- .stats-text-right {
1101
- text-align: right;
1102
- }
1103
- .stats-table-empty {
1104
- padding: 40px;
1105
- text-align: center;
1106
- color: var(--muted);
1107
- font-size: 13px;
1108
- border: 1px dashed var(--border);
1109
- border-radius: var(--radius-lg);
1110
- }
1111
- .stats-progress-bar-track {
1112
- background: var(--surface-2);
1113
- border-radius: 999px;
1114
- overflow: hidden;
1115
- }
1116
- .stats-progress-bar-fill {
1117
- height: 100%;
1118
- border-radius: inherit;
1119
- transition: width 0.18s ease;
1120
- }
1121
- .stats-progress-bar-fill[data-variant="link"] {
1122
- background: var(--link);
1123
- }
1124
- .stats-progress-bar-fill[data-variant="success"] {
1125
- background: var(--success);
1126
- }
1127
- .stats-table-mobile-only {
1128
- display: none;
1129
- }
1130
- .stats-table-desktop-only {
1131
- width: 100%;
1132
- overflow-x: auto;
1133
- }
1134
- @media (max-width: 767px) {
1135
- .stats-table-desktop-only {
1136
- display: none;
1137
- }
1138
- .stats-table-mobile-only {
1139
- display: block;
1140
- }
1141
- }
1142
- .stats-table-mobile-list {
1143
- display: flex;
1144
- flex-direction: column;
1145
- gap: 12px;
1146
- }
1147
- .stats-table-mobile-card-wrapper {
1148
- background: var(--surface);
1149
- border: 1px solid var(--border);
1150
- border-radius: var(--radius-lg);
1151
- padding: 14px;
1152
- }
1153
- .stats-status-pill {
1154
- display: inline-flex;
1155
- align-items: center;
1156
- justify-content: center;
1157
- padding: 2px 8px;
1158
- font-size: 11px;
1159
- font-weight: 600;
1160
- border-radius: 100px;
1161
- line-height: 1.2;
1162
- }
1163
- .stats-status-pill[data-variant="success"] {
1164
- background: var(--success);
1165
- @supports (color: color-mix(in lab, red, red)) {
1166
- background: color-mix(in srgb, var(--success) 18%, transparent);
1167
- }
1168
- color: var(--success);
1169
- }
1170
- .stats-status-pill[data-variant="danger"] {
1171
- background: var(--danger);
1172
- @supports (color: color-mix(in lab, red, red)) {
1173
- background: color-mix(in srgb, var(--danger) 18%, transparent);
1174
- }
1175
- color: var(--danger);
1176
- }
1177
- .stats-status-pill[data-variant="warning"] {
1178
- background: var(--warning);
1179
- @supports (color: color-mix(in lab, red, red)) {
1180
- background: color-mix(in srgb, var(--warning) 18%, transparent);
1181
- }
1182
- color: var(--warning);
1183
- }
1184
- .stats-status-pill[data-variant="info"] {
1185
- background: var(--link);
1186
- @supports (color: color-mix(in lab, red, red)) {
1187
- background: color-mix(in srgb, var(--link) 18%, transparent);
1188
- }
1189
- color: var(--link);
1190
- }
1191
- .stats-status-pill[data-variant="default"] {
1192
- background: var(--surface-2);
1193
- color: var(--muted);
1194
- }
1195
- .stats-segmented-control {
1196
- display: flex;
1197
- background: var(--surface-2);
1198
- border: 1px solid var(--border);
1199
- border-radius: var(--radius-md);
1200
- padding: 2px;
1201
- gap: 2px;
1202
- }
1203
- .stats-segmented-control-btn {
1204
- padding: 6px 12px;
1205
- font-size: 12px;
1206
- font-weight: 500;
1207
- color: var(--muted);
1208
- background: transparent;
1209
- border: none;
1210
- border-radius: var(--radius-sm);
1211
- cursor: pointer;
1212
- transition: all 0.1s ease;
1213
- white-space: nowrap;
1214
- }
1215
- .stats-segmented-control-btn:hover {
1216
- color: var(--text);
1217
- }
1218
- .stats-segmented-control-btn[data-active="true"] {
1219
- color: var(--text);
1220
- background: var(--surface);
1221
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
1222
- }
1223
- .stats-drawer-overlay {
1224
- position: fixed;
1225
- inset: 0;
1226
- background: rgba(0, 0, 0, 0.5);
1227
- z-index: 100;
1228
- display: flex;
1229
- justify-content: flex-end;
1230
- }
1231
- .stats-drawer {
1232
- width: 600px;
1233
- max-width: 100%;
1234
- height: 100%;
1235
- background: var(--surface);
1236
- border-left: 1px solid var(--border);
1237
- display: flex;
1238
- flex-direction: column;
1239
- animation: drawerSlide 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1240
- box-shadow: -4px 0 24px rgba(0, 0, 0, 0.25);
1241
- }
1242
- @keyframes drawerSlide {
1243
- from {
1244
- transform: translateX(100%);
1245
- }
1246
- to {
1247
- transform: translateX(0);
1248
- }
1249
- }
1250
- .stats-drawer-header {
1251
- height: 56px;
1252
- border-bottom: 1px solid var(--border);
1253
- padding: 0 24px;
1254
- display: flex;
1255
- align-items: center;
1256
- justify-content: space-between;
1257
- background: var(--surface);
1258
- flex-shrink: 0;
1259
- }
1260
- .stats-drawer-header-left {
1261
- display: flex;
1262
- align-items: baseline;
1263
- gap: 12px;
1264
- }
1265
- .stats-drawer-title {
1266
- font-size: 15px;
1267
- font-weight: 600;
1268
- color: var(--text);
1269
- margin: 0;
1270
- }
1271
- .stats-drawer-id {
1272
- font-size: 11px;
1273
- color: var(--muted);
1274
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1275
- }
1276
- .stats-drawer-close-btn {
1277
- background: transparent;
1278
- border: none;
1279
- color: var(--muted);
1280
- cursor: pointer;
1281
- padding: 4px;
1282
- display: inline-flex;
1283
- align-items: center;
1284
- justify-content: center;
1285
- border-radius: var(--radius-sm);
1286
- transition: all 0.1s ease;
1287
- }
1288
- .stats-drawer-close-btn:hover {
1289
- color: var(--text);
1290
- background: var(--surface-2);
1291
- }
1292
- .stats-drawer-body {
1293
- flex: 1;
1294
- overflow-y: auto;
1295
- padding: 24px;
1296
- }
1297
- .stats-drawer-content {
1298
- display: flex;
1299
- flex-direction: column;
1300
- gap: 24px;
1301
- }
1302
- .stats-drawer-status-card {
1303
- background: var(--surface-2);
1304
- border: 1px solid var(--border);
1305
- border-radius: var(--radius-lg);
1306
- padding: 16px;
1307
- }
1308
- .stats-drawer-status-row {
1309
- display: flex;
1310
- justify-content: space-between;
1311
- align-items: flex-start;
1312
- gap: 16px;
1313
- }
1314
- .stats-drawer-model {
1315
- font-size: 16px;
1316
- font-weight: 700;
1317
- color: var(--text);
1318
- }
1319
- .stats-drawer-provider {
1320
- font-size: 12px;
1321
- color: var(--muted);
1322
- margin-top: 2px;
1323
- }
1324
- .stats-drawer-error-block {
1325
- margin-top: 14px;
1326
- border-top: 1px solid var(--border);
1327
- padding-top: 12px;
1328
- }
1329
- .stats-drawer-error-label {
1330
- font-size: 11px;
1331
- font-weight: 600;
1332
- text-transform: uppercase;
1333
- letter-spacing: 0.05em;
1334
- color: var(--danger);
1335
- margin-bottom: 4px;
1336
- }
1337
- .stats-drawer-error-text {
1338
- font-size: 12px;
1339
- color: var(--text);
1340
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1341
- white-space: pre-wrap;
1342
- word-break: break-all;
1343
- }
1344
- .stats-drawer-metrics-grid {
1345
- display: grid;
1346
- grid-template-columns: repeat(2, 1fr);
1347
- gap: 12px;
1348
- }
1349
- .stats-drawer-metric-card {
1350
- background: var(--surface);
1351
- border: 1px solid var(--border);
1352
- border-radius: var(--radius-lg);
1353
- padding: 14px;
1354
- display: flex;
1355
- flex-direction: column;
1356
- justify-content: center;
1357
- }
1358
- .stats-drawer-metric-label {
1359
- display: flex;
1360
- align-items: center;
1361
- gap: 6px;
1362
- font-size: 11px;
1363
- font-weight: 600;
1364
- text-transform: uppercase;
1365
- letter-spacing: 0.05em;
1366
- color: var(--muted);
1367
- margin-bottom: 6px;
1368
- }
1369
- .stats-drawer-metric-icon {
1370
- color: var(--dim);
1371
- }
1372
- .stats-drawer-metric-value {
1373
- font-size: 16px;
1374
- font-weight: 700;
1375
- color: var(--text);
1376
- font-variant-numeric: tabular-nums;
1377
- }
1378
- .stats-drawer-metric-sub {
1379
- font-size: 11px;
1380
- color: var(--muted);
1381
- margin-top: 2px;
1382
- font-variant-numeric: tabular-nums;
1383
- }
1384
- .stats-drawer-json-blocks {
1385
- display: flex;
1386
- flex-direction: column;
1387
- gap: 16px;
1388
- }
1389
- .stats-json-block {
1390
- border: 1px solid var(--border);
1391
- border-radius: var(--radius-lg);
1392
- background: var(--surface);
1393
- overflow: hidden;
1394
- }
1395
- .stats-json-block-header {
1396
- padding: 10px 16px;
1397
- background: var(--surface-2);
1398
- border-bottom: 1px solid var(--border);
1399
- display: flex;
1400
- justify-content: space-between;
1401
- align-items: center;
1402
- cursor: pointer;
1403
- user-select: none;
1404
- font-size: 12px;
1405
- font-weight: 600;
1406
- }
1407
- .stats-json-block-header:hover {
1408
- background: var(--border);
1409
- }
1410
- .stats-json-block-title {
1411
- color: var(--text);
1412
- }
1413
- .stats-json-block-toggle-indicator {
1414
- color: var(--muted);
1415
- }
1416
- .stats-json-block-content-wrapper {
1417
- padding: 16px;
1418
- background: var(--page);
1419
- overflow-x: auto;
1420
- }
1421
- .stats-json-block-content {
1422
- margin: 0;
1423
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1424
- font-size: 12px;
1425
- color: var(--text);
1426
- line-height: 1.5;
1427
- }
1428
- .stats-skeleton {
1429
- background: var(--surface-2);
1430
- position: relative;
1431
- overflow: hidden;
1432
- border-radius: var(--radius-sm);
1433
- }
1434
- .stats-skeleton[data-variant="text"] {
1435
- height: 14px;
1436
- margin-top: 4px;
1437
- margin-bottom: 4px;
1438
- }
1439
- .stats-skeleton[data-variant="circle"] {
1440
- border-radius: 50%;
1441
- }
1442
- .stats-skeleton::after {
1443
- content: "";
1444
- position: absolute;
1445
- inset: 0;
1446
- transform: translateX(-100%);
1447
- background: linear-gradient( 90deg, transparent 0%, rgba(255, 255, 255, 0.05) 50%, transparent 100% );
1448
- animation: shimmer 1.5s infinite;
1449
- }
1450
- @media (prefers-color-scheme: light) {
1451
- .stats-skeleton::after {
1452
- background: linear-gradient( 90deg, transparent 0%, rgba(0, 0, 0, 0.03) 50%, transparent 100% );
1453
- }
1454
- }
1455
- @keyframes shimmer {
1456
- 100% {
1457
- transform: translateX(100%);
1458
- }
1459
- }
1460
- @media (prefers-reduced-motion: reduce) {
1461
- .stats-skeleton::after {
1462
- animation: none;
1463
- }
1464
- }
1465
- .stats-boundary-skeleton {
1466
- padding: 20px;
1467
- border: 1px solid var(--border);
1468
- border-radius: var(--radius-lg);
1469
- background: var(--surface);
1470
- }
1471
- .stats-empty-state, .stats-error-state {
1472
- padding: 48px 24px;
1473
- display: flex;
1474
- flex-direction: column;
1475
- align-items: center;
1476
- justify-content: center;
1477
- text-align: center;
1478
- background: var(--surface);
1479
- border: 1px dashed var(--border);
1480
- border-radius: var(--radius-lg);
1481
- }
1482
- .stats-empty-state-message {
1483
- font-size: 13px;
1484
- color: var(--muted);
1485
- margin: 0;
1486
- }
1487
- .stats-error-state-content {
1488
- max-width: 360px;
1489
- }
1490
- .stats-error-state-title {
1491
- font-size: 14px;
1492
- font-weight: 600;
1493
- color: var(--text);
1494
- margin: 0 0 8px 0;
1495
- }
1496
- .stats-error-state-message {
1497
- font-size: 12px;
1498
- color: var(--danger);
1499
- margin: 0 0 16px 0;
1500
- word-break: break-word;
1501
- }
1502
- .stats-error-state-btn {
1503
- margin: 0 auto;
1504
- }
1505
- .stats-text-primary {
1506
- color: var(--text);
1507
- }
1508
- .stats-text-secondary {
1509
- color: var(--muted);
1510
- }
1511
- .stats-text-muted {
1512
- color: var(--dim);
1513
- }
1514
- .stats-text-warning {
1515
- color: var(--warning);
1516
- }
1517
- .stats-text-xs {
1518
- font-size: 12px;
1519
- }
1520
- .stats-font-medium {
1521
- font-weight: 500;
1522
- }
1523
- .stats-font-semibold {
1524
- font-weight: 600;
1525
- }
1526
- * {
1527
- scrollbar-width: thin;
1528
- scrollbar-color: var(--border-strong) transparent;
1529
- }
1530
- *::-webkit-scrollbar {
1531
- width: 10px;
1532
- height: 10px;
1533
- }
1534
- *::-webkit-scrollbar-track {
1535
- background: transparent;
1536
- }
1537
- *::-webkit-scrollbar-thumb {
1538
- background: var(--border-strong);
1539
- border: 2px solid transparent;
1540
- background-clip: padding-box;
1541
- border-radius: 999px;
1542
- }
1543
- *::-webkit-scrollbar-thumb:hover {
1544
- background: var(--dim);
1545
- border: 2px solid transparent;
1546
- background-clip: padding-box;
1547
- }
1548
- *::-webkit-scrollbar-corner {
1549
- background: transparent;
1550
- }
1551
- @media (prefers-reduced-motion: reduce) {
1552
- .stats-button, .stats-table-tr-clickable, .stats-nav-rail-item, .stats-range-control-btn, .stats-segmented-control-btn {
1553
- transition: none;
1554
- }
1555
- .stats-button:active:not(:disabled) {
1556
- transform: none;
1557
- }
1558
- .stats-mobile-drawer, .stats-drawer {
1559
- animation: none;
1560
- }
1561
- }
1562
- .stats-logo-container {
1563
- display: grid;
1564
- grid-template-columns: auto 1fr;
1565
- align-items: center;
1566
- column-gap: 10px;
1567
- }
1568
- .stats-logo-container::before {
1569
- content: "";
1570
- grid-row: 1 / 3;
1571
- width: 16px;
1572
- height: 16px;
1573
- border-radius: 4px;
1574
- background: linear-gradient(135deg, #1d4ed8 0%, #2563eb 50%, #60a5fa 100%);
1575
- }
1576
- .stats-logo-text, .stats-logo-subtext {
1577
- grid-column: 2;
1578
- }
1579
- .stats-json-actions {
1580
- display: flex;
1581
- align-items: center;
1582
- gap: 12px;
1583
- }
1584
- .stats-json-copy-btn {
1585
- display: inline-flex;
1586
- align-items: center;
1587
- gap: 5px;
1588
- font-size: 11px;
1589
- font-weight: 600;
1590
- color: var(--muted);
1591
- background: transparent;
1592
- border: 1px solid var(--border);
1593
- border-radius: var(--radius-sm);
1594
- padding: 3px 8px;
1595
- cursor: pointer;
1596
- font-family: inherit;
1597
- transition: color 0.12s ease, background 0.12s ease;
1598
- }
1599
- .stats-json-copy-btn:hover {
1600
- color: var(--text);
1601
- background: var(--surface-2);
1602
- }
1603
- .stats-empty-state-icon {
1604
- color: var(--dim);
1605
- margin-bottom: 12px;
1606
- }
1607
- @media (prefers-reduced-motion: reduce) {
1608
- .stats-json-copy-btn {
1609
- transition: none;
1610
- }
1611
- }
1612
- .stats-theme-toggle {
1613
- display: inline-flex;
1614
- align-items: center;
1615
- justify-content: center;
1616
- width: 32px;
1617
- height: 32px;
1618
- flex-shrink: 0;
1619
- border: 1px solid var(--border);
1620
- border-radius: var(--radius-md);
1621
- background: var(--surface);
1622
- color: var(--muted);
1623
- cursor: pointer;
1624
- transition: color 0.14s ease, background 0.14s ease, border-color 0.14s ease;
1625
- }
1626
- .stats-theme-toggle:hover {
1627
- color: var(--text);
1628
- border-color: var(--border-strong);
1629
- }
1630
- @media (prefers-reduced-motion: reduce) {
1631
- .stats-theme-toggle {
1632
- transition: none;
1633
- }
1634
- }
1635
- @property --tw-space-y-reverse {
1636
- syntax: "*";
1637
- inherits: false;
1638
- initial-value: 0;
1639
- }
1640
- @property --tw-border-style {
1641
- syntax: "*";
1642
- inherits: false;
1643
- initial-value: solid;
1644
- }
1645
- @property --tw-font-weight {
1646
- syntax: "*";
1647
- inherits: false;
1648
- }
1649
- @property --tw-tracking {
1650
- syntax: "*";
1651
- inherits: false;
1652
- }
1653
- @property --tw-ordinal {
1654
- syntax: "*";
1655
- inherits: false;
1656
- }
1657
- @property --tw-slashed-zero {
1658
- syntax: "*";
1659
- inherits: false;
1660
- }
1661
- @property --tw-numeric-figure {
1662
- syntax: "*";
1663
- inherits: false;
1664
- }
1665
- @property --tw-numeric-spacing {
1666
- syntax: "*";
1667
- inherits: false;
1668
- }
1669
- @property --tw-numeric-fraction {
1670
- syntax: "*";
1671
- inherits: false;
1672
- }
1673
- @keyframes spin {
1674
- to {
1675
- transform: rotate(360deg);
1676
- }
1677
- }
1678
- @layer properties {
1679
- @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
1680
- *, ::before, ::after, ::backdrop {
1681
- --tw-space-y-reverse: 0;
1682
- --tw-border-style: solid;
1683
- --tw-font-weight: initial;
1684
- --tw-tracking: initial;
1685
- --tw-ordinal: initial;
1686
- --tw-slashed-zero: initial;
1687
- --tw-numeric-figure: initial;
1688
- --tw-numeric-spacing: initial;
1689
- --tw-numeric-fraction: initial;
1690
- }
1691
- }
1692
- }