@linxiraos/pi-stats 1.0.1 → 1.0.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.
Files changed (71) hide show
  1. package/CHANGELOG.md +13 -3
  2. package/README.md +2 -1
  3. package/package.json +90 -92
  4. package/src/client/routes/ModelsRoute.tsx +13 -3
  5. package/src/client/routes/ProjectsRoute.tsx +14 -2
  6. package/src/client/styles.css +1 -1
  7. package/src/client/ui/MetricCluster.tsx +11 -1
  8. package/src/db.ts +104 -8
  9. package/src/index.ts +2 -1
  10. package/src/shared-types.ts +6 -1
  11. package/dist/client/index.css +0 -1
  12. package/dist/client/index.html +0 -24
  13. package/dist/client/index.js +0 -257
  14. package/dist/client/styles.css +0 -1695
  15. package/dist/types/aggregator.d.ts +0 -98
  16. package/dist/types/client/App.d.ts +0 -1
  17. package/dist/types/client/api.d.ts +0 -22
  18. package/dist/types/client/app/AppLayout.d.ts +0 -16
  19. package/dist/types/client/app/NavRail.d.ts +0 -7
  20. package/dist/types/client/app/RangeControl.d.ts +0 -7
  21. package/dist/types/client/app/SyncButton.d.ts +0 -14
  22. package/dist/types/client/app/ThemeToggle.d.ts +0 -1
  23. package/dist/types/client/app/TopBar.d.ts +0 -15
  24. package/dist/types/client/app/routes.d.ts +0 -12
  25. package/dist/types/client/components/AgentTokenShare.d.ts +0 -5
  26. package/dist/types/client/components/chart-shared.d.ts +0 -173
  27. package/dist/types/client/components/models-table-shared.d.ts +0 -175
  28. package/dist/types/client/components/range-meta.d.ts +0 -21
  29. package/dist/types/client/data/charts.d.ts +0 -1
  30. package/dist/types/client/data/formatters.d.ts +0 -8
  31. package/dist/types/client/data/useHashRoute.d.ts +0 -8
  32. package/dist/types/client/data/useResource.d.ts +0 -13
  33. package/dist/types/client/data/view-models.d.ts +0 -74
  34. package/dist/types/client/index.d.ts +0 -2
  35. package/dist/types/client/routes/BehaviorRoute.d.ts +0 -7
  36. package/dist/types/client/routes/CostsRoute.d.ts +0 -7
  37. package/dist/types/client/routes/ErrorsRoute.d.ts +0 -8
  38. package/dist/types/client/routes/GainRoute.d.ts +0 -7
  39. package/dist/types/client/routes/ModelsRoute.d.ts +0 -7
  40. package/dist/types/client/routes/OverviewRoute.d.ts +0 -8
  41. package/dist/types/client/routes/ProjectsRoute.d.ts +0 -7
  42. package/dist/types/client/routes/ProvidersRoute.d.ts +0 -7
  43. package/dist/types/client/routes/RequestsRoute.d.ts +0 -8
  44. package/dist/types/client/routes/ToolsRoute.d.ts +0 -7
  45. package/dist/types/client/routes/index.d.ts +0 -10
  46. package/dist/types/client/types.d.ts +0 -63
  47. package/dist/types/client/ui/AsyncBoundary.d.ts +0 -12
  48. package/dist/types/client/ui/DataTable.d.ts +0 -17
  49. package/dist/types/client/ui/EmptyState.d.ts +0 -7
  50. package/dist/types/client/ui/ErrorState.d.ts +0 -6
  51. package/dist/types/client/ui/JsonBlock.d.ts +0 -7
  52. package/dist/types/client/ui/MetricCluster.d.ts +0 -5
  53. package/dist/types/client/ui/Panel.d.ts +0 -7
  54. package/dist/types/client/ui/RequestDrawer.d.ts +0 -5
  55. package/dist/types/client/ui/SegmentedControl.d.ts +0 -12
  56. package/dist/types/client/ui/Skeleton.d.ts +0 -8
  57. package/dist/types/client/ui/StatusPill.d.ts +0 -7
  58. package/dist/types/client/ui/index.d.ts +0 -11
  59. package/dist/types/client/useSystemTheme.d.ts +0 -11
  60. package/dist/types/db.d.ts +0 -159
  61. package/dist/types/embedded-client.d.ts +0 -18
  62. package/dist/types/gain-aggregator.d.ts +0 -26
  63. package/dist/types/index.d.ts +0 -7
  64. package/dist/types/parser.d.ts +0 -53
  65. package/dist/types/port-conflict.d.ts +0 -14
  66. package/dist/types/server.d.ts +0 -12
  67. package/dist/types/shared-types.d.ts +0 -403
  68. package/dist/types/sync-worker.d.ts +0 -31
  69. package/dist/types/types.d.ts +0 -164
  70. package/dist/types/usage-windows.d.ts +0 -45
  71. package/dist/types/user-metrics.d.ts +0 -81
@@ -1,1695 +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\(--accent-cyan\)\] {
440
- color: var(--accent-cyan);
441
- }
442
- .text-\[var\(--text-muted\)\] {
443
- color: var(--text-muted);
444
- }
445
- .text-\[var\(--text-primary\)\] {
446
- color: var(--text-primary);
447
- }
448
- .text-\[var\(--text-secondary\)\] {
449
- color: var(--text-secondary);
450
- }
451
- .uppercase {
452
- text-transform: uppercase;
453
- }
454
- .tabular-nums {
455
- --tw-numeric-spacing: tabular-nums;
456
- font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
457
- }
458
- .transition-colors {
459
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
460
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
461
- transition-duration: var(--tw-duration, var(--default-transition-duration));
462
- }
463
- @media (hover: hover) {
464
- .hover\:bg-\[var\(--bg-hover\)\]:hover {
465
- background-color: var(--bg-hover);
466
- }
467
- }
468
- @media (width >= 48rem) {
469
- .md\:grid-cols-3 {
470
- grid-template-columns: repeat(3, minmax(0, 1fr));
471
- }
472
- .md\:grid-cols-6 {
473
- grid-template-columns: repeat(6, minmax(0, 1fr));
474
- }
475
- }
476
- @media (width >= 64rem) {
477
- .lg\:col-span-2 {
478
- grid-column: span 2 / span 2;
479
- }
480
- .lg\:grid-cols-3 {
481
- grid-template-columns: repeat(3, minmax(0, 1fr));
482
- }
483
- }
484
- }
485
- :root {
486
- color-scheme: dark;
487
- --bg: #1a1a1a;
488
- --bg-panel: #242424;
489
- --bg-hover: #2e2e2e;
490
- --bg-selected: #383838;
491
- --bg-subtle: rgba(255,255,255,0.04);
492
- --border: #3a3a3a;
493
- --border-strong: rgba(255,255,255,0.13);
494
- --text: #e8e8e8;
495
- --text-muted: #9ca3af;
496
- --text-dim: #6b7280;
497
- --accent: #60a5fa;
498
- --accent-hover: #93c5fd;
499
- --accent-fg: #0f172a;
500
- --accent-muted: rgba(96,165,250,0.18);
501
- --link: #60a5fa;
502
- --success: #22c55e;
503
- --danger: #ef4444;
504
- --warning: #f59e0b;
505
- --page: var(--bg);
506
- --surface: var(--bg-panel);
507
- --surface-2: var(--bg-hover);
508
- --muted: var(--text-muted);
509
- --dim: var(--text-dim);
510
- --text-primary: var(--text);
511
- --text-secondary: var(--text-muted);
512
- --border-subtle: var(--border);
513
- --accent-red: var(--danger);
514
- --accent-green: var(--success);
515
- --accent-cyan: var(--link);
516
- --bg-elevated: var(--bg-hover);
517
- --radius-sm: 3px;
518
- --radius-md: 6px;
519
- --radius-lg: 8px;
520
- }
521
- @media (prefers-color-scheme: light) {
522
- :root:not([data-theme]) {
523
- color-scheme: light;
524
- --bg: #ffffff;
525
- --bg-panel: #f5f5f5;
526
- --bg-hover: #eeeeee;
527
- --bg-selected: #e8e8e8;
528
- --bg-subtle: rgba(0,0,0,0.03);
529
- --border: #e0e0e0;
530
- --border-strong: rgba(0,0,0,0.15);
531
- --text: #1a1a1a;
532
- --text-muted: #6b7280;
533
- --text-dim: #9ca3af;
534
- --accent: #2563eb;
535
- --accent-hover: #1d4ed8;
536
- --accent-fg: #ffffff;
537
- --accent-muted: rgba(37,99,235,0.14);
538
- --link: #2563eb;
539
- --success: #16a34a;
540
- --danger: #dc2626;
541
- --warning: #d97706;
542
- --page: var(--bg);
543
- --surface: var(--bg-panel);
544
- --surface-2: var(--bg-hover);
545
- --muted: var(--text-muted);
546
- --dim: var(--text-dim);
547
- }
548
- }
549
- [data-theme="light"] {
550
- color-scheme: light;
551
- --bg: #ffffff;
552
- --bg-panel: #f5f5f5;
553
- --bg-hover: #eeeeee;
554
- --bg-selected: #e8e8e8;
555
- --bg-subtle: rgba(0,0,0,0.03);
556
- --border: #e0e0e0;
557
- --border-strong: rgba(0,0,0,0.15);
558
- --text: #1a1a1a;
559
- --text-muted: #6b7280;
560
- --text-dim: #9ca3af;
561
- --accent: #2563eb;
562
- --accent-hover: #1d4ed8;
563
- --accent-fg: #ffffff;
564
- --accent-muted: rgba(37,99,235,0.14);
565
- --link: #2563eb;
566
- --success: #16a34a;
567
- --danger: #dc2626;
568
- --warning: #d97706;
569
- --page: var(--bg);
570
- --surface: var(--bg-panel);
571
- --surface-2: var(--bg-hover);
572
- --muted: var(--text-muted);
573
- --dim: var(--text-dim);
574
- }
575
- [data-theme="starfield"] {
576
- color-scheme: dark;
577
- --bg: #08090d;
578
- --bg-panel: #0d1117;
579
- --bg-hover: #161d2e;
580
- --bg-selected: #1a2540;
581
- --bg-subtle: rgba(217,155,38,0.05);
582
- --border: #1e2d45;
583
- --border-strong: rgba(217,155,38,0.2);
584
- --text: #e8eeff;
585
- --text-muted: #8fa3c0;
586
- --text-dim: #3d5070;
587
- --accent: #d99b26;
588
- --accent-hover: #f0b840;
589
- --accent-fg: #0f172a;
590
- --accent-muted: rgba(217,155,38,0.18);
591
- --link: #d99b26;
592
- --success: #22c55e;
593
- --danger: #c81d25;
594
- --warning: #e05a2b;
595
- --page: var(--bg);
596
- --surface: var(--bg-panel);
597
- --surface-2: var(--bg-hover);
598
- --muted: var(--text-muted);
599
- --dim: var(--text-dim);
600
- }
601
- @layer base {
602
- * {
603
- box-sizing: border-box;
604
- }
605
- html {
606
- -webkit-font-smoothing: antialiased;
607
- -moz-osx-font-smoothing: grayscale;
608
- }
609
- body {
610
- font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
611
- background: var(--page);
612
- color: var(--text);
613
- margin: 0;
614
- min-height: 100vh;
615
- }
616
- button:focus-visible, a:focus-visible, [tabindex]:focus-visible {
617
- outline: 2px solid var(--link);
618
- outline-offset: 2px;
619
- }
620
- }
621
- .stats-app-container {
622
- display: flex;
623
- min-height: 100vh;
624
- background: var(--page);
625
- color: var(--text);
626
- }
627
- .stats-nav-rail {
628
- width: 240px;
629
- background: var(--surface);
630
- border-right: 1px solid var(--border);
631
- display: flex;
632
- flex-direction: column;
633
- flex-shrink: 0;
634
- }
635
- .stats-desktop-nav {
636
- display: flex;
637
- }
638
- @media (max-width: 1023px) {
639
- .stats-desktop-nav {
640
- display: none;
641
- }
642
- }
643
- .stats-nav-rail-header {
644
- padding: 20px 24px;
645
- border-bottom: 1px solid var(--border);
646
- height: 56px;
647
- display: flex;
648
- align-items: center;
649
- }
650
- .stats-logo-container {
651
- display: flex;
652
- flex-direction: column;
653
- }
654
- .stats-logo-text {
655
- font-size: 14px;
656
- font-weight: 700;
657
- letter-spacing: 0.1em;
658
- color: var(--text);
659
- }
660
- .stats-logo-subtext {
661
- font-size: 10px;
662
- text-transform: uppercase;
663
- letter-spacing: 0.05em;
664
- color: var(--muted);
665
- }
666
- .stats-nav-rail-menu {
667
- flex: 1;
668
- padding: 16px 12px;
669
- display: flex;
670
- flex-direction: column;
671
- gap: 4px;
672
- }
673
- .stats-nav-rail-item {
674
- display: flex;
675
- align-items: center;
676
- gap: 12px;
677
- padding: 10px 16px;
678
- font-size: 13px;
679
- font-weight: 500;
680
- color: var(--muted);
681
- background: transparent;
682
- border: none;
683
- border-radius: var(--radius-md);
684
- cursor: pointer;
685
- text-align: left;
686
- transition: all 0.15s ease;
687
- }
688
- .stats-nav-rail-item:hover {
689
- color: var(--text);
690
- background: var(--surface-2);
691
- }
692
- .stats-nav-rail-item[data-active="true"] {
693
- color: var(--accent);
694
- background: var(--accent-muted);
695
- position: relative;
696
- }
697
- .stats-nav-rail-item[data-active="true"]::before {
698
- content: "";
699
- position: absolute;
700
- left: 0;
701
- top: 50%;
702
- height: 18px;
703
- width: 3px;
704
- border-radius: 0 3px 3px 0;
705
- background: var(--accent);
706
- transform: translateY(-50%);
707
- }
708
- .stats-nav-rail-item-icon {
709
- flex-shrink: 0;
710
- }
711
- .stats-nav-rail-footer {
712
- padding: 16px 24px;
713
- border-top: 1px solid var(--border);
714
- }
715
- .stats-version-tag {
716
- font-size: 11px;
717
- color: var(--dim);
718
- }
719
- .stats-main-pane {
720
- flex: 1;
721
- display: flex;
722
- flex-direction: column;
723
- min-width: 0;
724
- }
725
- .stats-top-bar {
726
- height: 56px;
727
- background: var(--surface);
728
- border-bottom: 1px solid var(--border);
729
- display: flex;
730
- align-items: center;
731
- justify-content: space-between;
732
- padding: 0 24px;
733
- }
734
- @media (max-width: 767px) {
735
- .stats-top-bar {
736
- padding: 0 16px;
737
- flex-wrap: wrap;
738
- height: auto;
739
- min-height: 56px;
740
- padding-top: 8px;
741
- padding-bottom: 8px;
742
- gap: 12px;
743
- }
744
- }
745
- .stats-top-bar-left {
746
- display: flex;
747
- align-items: center;
748
- gap: 12px;
749
- }
750
- .stats-mobile-menu-btn {
751
- display: none;
752
- background: transparent;
753
- border: none;
754
- color: var(--text);
755
- padding: 4px;
756
- cursor: pointer;
757
- }
758
- @media (max-width: 1023px) {
759
- .stats-mobile-menu-btn {
760
- display: inline-flex;
761
- align-items: center;
762
- justify-content: center;
763
- }
764
- }
765
- .stats-page-title {
766
- font-size: 16px;
767
- font-weight: 600;
768
- color: var(--text);
769
- margin: 0;
770
- }
771
- .stats-top-bar-right {
772
- display: flex;
773
- align-items: center;
774
- gap: 16px;
775
- }
776
- @media (max-width: 767px) {
777
- .stats-top-bar-right {
778
- width: 100%;
779
- justify-content: space-between;
780
- gap: 8px;
781
- }
782
- }
783
- .stats-top-bar-meta {
784
- display: flex;
785
- align-items: center;
786
- }
787
- .stats-last-updated {
788
- font-size: 11px;
789
- color: var(--dim);
790
- font-variant-numeric: tabular-nums;
791
- }
792
- .stats-content-area {
793
- flex: 1;
794
- overflow-y: auto;
795
- }
796
- .stats-content-inner {
797
- max-width: 1560px;
798
- margin: 0 auto;
799
- padding: 24px;
800
- display: flex;
801
- flex-direction: column;
802
- gap: 24px;
803
- }
804
- @media (max-width: 767px) {
805
- .stats-content-inner {
806
- padding: 16px;
807
- gap: 16px;
808
- }
809
- }
810
- .stats-mobile-drawer-overlay {
811
- position: fixed;
812
- inset: 0;
813
- background: rgba(0, 0, 0, 0.4);
814
- backdrop-filter: none;
815
- z-index: 100;
816
- }
817
- .stats-mobile-drawer {
818
- position: absolute;
819
- left: 0;
820
- top: 0;
821
- bottom: 0;
822
- width: 260px;
823
- background: var(--surface);
824
- border-right: 1px solid var(--border);
825
- display: flex;
826
- flex-direction: column;
827
- z-index: 101;
828
- animation: slideIn 0.2s ease-out;
829
- }
830
- @keyframes slideIn {
831
- from {
832
- transform: translateX(-100%);
833
- }
834
- to {
835
- transform: translateX(0);
836
- }
837
- }
838
- .stats-mobile-drawer-header {
839
- height: 56px;
840
- display: flex;
841
- align-items: center;
842
- justify-content: space-between;
843
- padding: 0 16px 0 24px;
844
- border-bottom: 1px solid var(--border);
845
- }
846
- .stats-mobile-nav {
847
- display: flex;
848
- height: calc(100% - 56px);
849
- }
850
- .stats-button {
851
- display: inline-flex;
852
- align-items: center;
853
- justify-content: center;
854
- gap: 8px;
855
- padding: 8px 14px;
856
- font-size: 13px;
857
- font-weight: 500;
858
- border-radius: var(--radius-md);
859
- border: 1px solid transparent;
860
- cursor: pointer;
861
- transition: all 0.15s ease;
862
- font-family: inherit;
863
- }
864
- .stats-button:active:not(:disabled) {
865
- transform: translateY(1px);
866
- }
867
- .stats-button-primary {
868
- background: var(--accent);
869
- color: var(--accent-fg);
870
- }
871
- .stats-button-primary:hover:not(:disabled) {
872
- opacity: 0.9;
873
- }
874
- .stats-button-primary:disabled {
875
- opacity: 0.5;
876
- cursor: not-allowed;
877
- }
878
- .stats-button-secondary {
879
- background: var(--surface-2);
880
- color: var(--text);
881
- border-color: var(--border);
882
- }
883
- .stats-button-secondary:hover:not(:disabled) {
884
- background: var(--border);
885
- }
886
- .stats-button-secondary:disabled {
887
- opacity: 0.5;
888
- cursor: not-allowed;
889
- }
890
- .stats-range-control {
891
- display: flex;
892
- background: var(--surface-2);
893
- border: 1px solid var(--border);
894
- border-radius: var(--radius-md);
895
- padding: 2px;
896
- }
897
- .stats-range-control-btn {
898
- padding: 4px 10px;
899
- font-size: 12px;
900
- font-weight: 500;
901
- color: var(--muted);
902
- background: transparent;
903
- border: none;
904
- border-radius: var(--radius-sm);
905
- cursor: pointer;
906
- transition: all 0.1s ease;
907
- }
908
- .stats-range-control-btn:hover {
909
- color: var(--text);
910
- }
911
- .stats-range-control-btn[data-active="true"] {
912
- color: var(--text);
913
- background: var(--surface);
914
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
915
- }
916
- .stats-sync-container {
917
- display: flex;
918
- align-items: center;
919
- gap: 12px;
920
- }
921
- .stats-sync-status-msg {
922
- font-size: 11px;
923
- font-variant-numeric: tabular-nums;
924
- max-width: 200px;
925
- white-space: nowrap;
926
- overflow: hidden;
927
- text-overflow: ellipsis;
928
- }
929
- .stats-sync-status-msg[data-type="success"] {
930
- color: var(--success);
931
- }
932
- .stats-sync-status-msg[data-type="error"] {
933
- color: var(--danger);
934
- }
935
- .stats-sync-icon {
936
- flex-shrink: 0;
937
- }
938
- .stats-spin {
939
- animation: spin 1s linear infinite;
940
- }
941
- @keyframes spin {
942
- to {
943
- transform: rotate(360deg);
944
- }
945
- }
946
- .stats-panel {
947
- background: var(--surface);
948
- border: 1px solid var(--border);
949
- border-radius: var(--radius-lg);
950
- display: flex;
951
- flex-direction: column;
952
- }
953
- .stats-panel-header {
954
- padding: 16px 20px;
955
- border-bottom: 1px solid var(--border);
956
- display: flex;
957
- align-items: center;
958
- justify-content: space-between;
959
- gap: 16px;
960
- }
961
- @media (max-width: 480px) {
962
- .stats-panel-header {
963
- flex-direction: column;
964
- align-items: flex-start;
965
- gap: 8px;
966
- }
967
- }
968
- .stats-panel-header-titles {
969
- display: flex;
970
- flex-direction: column;
971
- }
972
- .stats-panel-title {
973
- font-size: 14px;
974
- font-weight: 600;
975
- color: var(--text);
976
- margin: 0;
977
- }
978
- .stats-panel-subtitle {
979
- font-size: 12px;
980
- color: var(--muted);
981
- margin: 2px 0 0 0;
982
- }
983
- .stats-panel-actions {
984
- display: flex;
985
- align-items: center;
986
- gap: 12px;
987
- }
988
- .stats-panel-body {
989
- padding: 20px;
990
- }
991
- .stats-metric-cluster {
992
- display: flex;
993
- flex-direction: column;
994
- gap: 16px;
995
- }
996
- .stats-metric-primary-grid {
997
- display: grid;
998
- grid-template-columns: repeat(4, 1fr);
999
- gap: 16px;
1000
- }
1001
- @media (max-width: 1023px) {
1002
- .stats-metric-primary-grid {
1003
- grid-template-columns: repeat(2, 1fr);
1004
- }
1005
- }
1006
- @media (max-width: 480px) {
1007
- .stats-metric-primary-grid {
1008
- grid-template-columns: 1fr;
1009
- }
1010
- }
1011
- .stats-metric-secondary-grid {
1012
- display: grid;
1013
- grid-template-columns: repeat(8, 1fr);
1014
- gap: 12px;
1015
- }
1016
- @media (max-width: 1279px) {
1017
- .stats-metric-secondary-grid {
1018
- grid-template-columns: repeat(4, 1fr);
1019
- }
1020
- }
1021
- @media (max-width: 767px) {
1022
- .stats-metric-secondary-grid {
1023
- grid-template-columns: repeat(2, 1fr);
1024
- }
1025
- }
1026
- .stats-metric-card {
1027
- background: var(--surface);
1028
- border: 1px solid var(--border);
1029
- border-radius: var(--radius-lg);
1030
- padding: 16px;
1031
- display: flex;
1032
- flex-direction: column;
1033
- justify-content: space-between;
1034
- }
1035
- .stats-metric-card.primary {
1036
- padding: 20px 18px;
1037
- }
1038
- .stats-metric-card.primary .stats-metric-label {
1039
- color: var(--accent);
1040
- }
1041
- .stats-metric-card.secondary {
1042
- padding: 12px 14px;
1043
- }
1044
- .stats-metric-label {
1045
- font-size: 11px;
1046
- font-weight: 600;
1047
- text-transform: uppercase;
1048
- letter-spacing: 0.05em;
1049
- color: var(--muted);
1050
- margin-bottom: 8px;
1051
- }
1052
- .stats-metric-value {
1053
- font-size: 20px;
1054
- font-weight: 700;
1055
- color: var(--text);
1056
- font-variant-numeric: tabular-nums;
1057
- }
1058
- .stats-metric-card.secondary .stats-metric-value {
1059
- font-size: 15px;
1060
- font-weight: 600;
1061
- }
1062
- .stats-table-wrapper {
1063
- width: 100%;
1064
- }
1065
- .stats-table-container {
1066
- width: 100%;
1067
- overflow-x: auto;
1068
- }
1069
- .stats-table {
1070
- width: 100%;
1071
- border-collapse: collapse;
1072
- font-size: 13px;
1073
- font-variant-numeric: tabular-nums;
1074
- }
1075
- .stats-table-th {
1076
- font-size: 11px;
1077
- font-weight: 600;
1078
- text-transform: uppercase;
1079
- letter-spacing: 0.05em;
1080
- color: var(--muted);
1081
- padding: 12px 16px;
1082
- border-bottom: 2px solid var(--border);
1083
- }
1084
- .stats-table-td {
1085
- padding: 10px 16px;
1086
- border-bottom: 1px solid var(--border);
1087
- color: var(--text);
1088
- }
1089
- .stats-table-tr {
1090
- background: transparent;
1091
- }
1092
- .stats-table-tr-clickable {
1093
- cursor: pointer;
1094
- transition: background 0.12s ease, box-shadow 0.12s ease;
1095
- }
1096
- .stats-table-tr-clickable:hover {
1097
- background: var(--surface-2);
1098
- box-shadow: inset 2px 0 0 var(--accent);
1099
- }
1100
- .stats-text-left {
1101
- text-align: left;
1102
- }
1103
- .stats-text-right {
1104
- text-align: right;
1105
- }
1106
- .stats-table-empty {
1107
- padding: 40px;
1108
- text-align: center;
1109
- color: var(--muted);
1110
- font-size: 13px;
1111
- border: 1px dashed var(--border);
1112
- border-radius: var(--radius-lg);
1113
- }
1114
- .stats-progress-bar-track {
1115
- background: var(--surface-2);
1116
- border-radius: 999px;
1117
- overflow: hidden;
1118
- }
1119
- .stats-progress-bar-fill {
1120
- height: 100%;
1121
- border-radius: inherit;
1122
- transition: width 0.18s ease;
1123
- }
1124
- .stats-progress-bar-fill[data-variant="link"] {
1125
- background: var(--link);
1126
- }
1127
- .stats-progress-bar-fill[data-variant="success"] {
1128
- background: var(--success);
1129
- }
1130
- .stats-table-mobile-only {
1131
- display: none;
1132
- }
1133
- .stats-table-desktop-only {
1134
- width: 100%;
1135
- overflow-x: auto;
1136
- }
1137
- @media (max-width: 767px) {
1138
- .stats-table-desktop-only {
1139
- display: none;
1140
- }
1141
- .stats-table-mobile-only {
1142
- display: block;
1143
- }
1144
- }
1145
- .stats-table-mobile-list {
1146
- display: flex;
1147
- flex-direction: column;
1148
- gap: 12px;
1149
- }
1150
- .stats-table-mobile-card-wrapper {
1151
- background: var(--surface);
1152
- border: 1px solid var(--border);
1153
- border-radius: var(--radius-lg);
1154
- padding: 14px;
1155
- }
1156
- .stats-status-pill {
1157
- display: inline-flex;
1158
- align-items: center;
1159
- justify-content: center;
1160
- padding: 2px 8px;
1161
- font-size: 11px;
1162
- font-weight: 600;
1163
- border-radius: 100px;
1164
- line-height: 1.2;
1165
- }
1166
- .stats-status-pill[data-variant="success"] {
1167
- background: var(--success);
1168
- @supports (color: color-mix(in lab, red, red)) {
1169
- background: color-mix(in srgb, var(--success) 18%, transparent);
1170
- }
1171
- color: var(--success);
1172
- }
1173
- .stats-status-pill[data-variant="danger"] {
1174
- background: var(--danger);
1175
- @supports (color: color-mix(in lab, red, red)) {
1176
- background: color-mix(in srgb, var(--danger) 18%, transparent);
1177
- }
1178
- color: var(--danger);
1179
- }
1180
- .stats-status-pill[data-variant="warning"] {
1181
- background: var(--warning);
1182
- @supports (color: color-mix(in lab, red, red)) {
1183
- background: color-mix(in srgb, var(--warning) 18%, transparent);
1184
- }
1185
- color: var(--warning);
1186
- }
1187
- .stats-status-pill[data-variant="info"] {
1188
- background: var(--link);
1189
- @supports (color: color-mix(in lab, red, red)) {
1190
- background: color-mix(in srgb, var(--link) 18%, transparent);
1191
- }
1192
- color: var(--link);
1193
- }
1194
- .stats-status-pill[data-variant="default"] {
1195
- background: var(--surface-2);
1196
- color: var(--muted);
1197
- }
1198
- .stats-segmented-control {
1199
- display: flex;
1200
- background: var(--surface-2);
1201
- border: 1px solid var(--border);
1202
- border-radius: var(--radius-md);
1203
- padding: 2px;
1204
- gap: 2px;
1205
- }
1206
- .stats-segmented-control-btn {
1207
- padding: 6px 12px;
1208
- font-size: 12px;
1209
- font-weight: 500;
1210
- color: var(--muted);
1211
- background: transparent;
1212
- border: none;
1213
- border-radius: var(--radius-sm);
1214
- cursor: pointer;
1215
- transition: all 0.1s ease;
1216
- white-space: nowrap;
1217
- }
1218
- .stats-segmented-control-btn:hover {
1219
- color: var(--text);
1220
- }
1221
- .stats-segmented-control-btn[data-active="true"] {
1222
- color: var(--text);
1223
- background: var(--surface);
1224
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
1225
- }
1226
- .stats-drawer-overlay {
1227
- position: fixed;
1228
- inset: 0;
1229
- background: rgba(0, 0, 0, 0.5);
1230
- z-index: 100;
1231
- display: flex;
1232
- justify-content: flex-end;
1233
- }
1234
- .stats-drawer {
1235
- width: 600px;
1236
- max-width: 100%;
1237
- height: 100%;
1238
- background: var(--surface);
1239
- border-left: 1px solid var(--border);
1240
- display: flex;
1241
- flex-direction: column;
1242
- animation: drawerSlide 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1243
- box-shadow: -4px 0 24px rgba(0, 0, 0, 0.25);
1244
- }
1245
- @keyframes drawerSlide {
1246
- from {
1247
- transform: translateX(100%);
1248
- }
1249
- to {
1250
- transform: translateX(0);
1251
- }
1252
- }
1253
- .stats-drawer-header {
1254
- height: 56px;
1255
- border-bottom: 1px solid var(--border);
1256
- padding: 0 24px;
1257
- display: flex;
1258
- align-items: center;
1259
- justify-content: space-between;
1260
- background: var(--surface);
1261
- flex-shrink: 0;
1262
- }
1263
- .stats-drawer-header-left {
1264
- display: flex;
1265
- align-items: baseline;
1266
- gap: 12px;
1267
- }
1268
- .stats-drawer-title {
1269
- font-size: 15px;
1270
- font-weight: 600;
1271
- color: var(--text);
1272
- margin: 0;
1273
- }
1274
- .stats-drawer-id {
1275
- font-size: 11px;
1276
- color: var(--muted);
1277
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1278
- }
1279
- .stats-drawer-close-btn {
1280
- background: transparent;
1281
- border: none;
1282
- color: var(--muted);
1283
- cursor: pointer;
1284
- padding: 4px;
1285
- display: inline-flex;
1286
- align-items: center;
1287
- justify-content: center;
1288
- border-radius: var(--radius-sm);
1289
- transition: all 0.1s ease;
1290
- }
1291
- .stats-drawer-close-btn:hover {
1292
- color: var(--text);
1293
- background: var(--surface-2);
1294
- }
1295
- .stats-drawer-body {
1296
- flex: 1;
1297
- overflow-y: auto;
1298
- padding: 24px;
1299
- }
1300
- .stats-drawer-content {
1301
- display: flex;
1302
- flex-direction: column;
1303
- gap: 24px;
1304
- }
1305
- .stats-drawer-status-card {
1306
- background: var(--surface-2);
1307
- border: 1px solid var(--border);
1308
- border-radius: var(--radius-lg);
1309
- padding: 16px;
1310
- }
1311
- .stats-drawer-status-row {
1312
- display: flex;
1313
- justify-content: space-between;
1314
- align-items: flex-start;
1315
- gap: 16px;
1316
- }
1317
- .stats-drawer-model {
1318
- font-size: 16px;
1319
- font-weight: 700;
1320
- color: var(--text);
1321
- }
1322
- .stats-drawer-provider {
1323
- font-size: 12px;
1324
- color: var(--muted);
1325
- margin-top: 2px;
1326
- }
1327
- .stats-drawer-error-block {
1328
- margin-top: 14px;
1329
- border-top: 1px solid var(--border);
1330
- padding-top: 12px;
1331
- }
1332
- .stats-drawer-error-label {
1333
- font-size: 11px;
1334
- font-weight: 600;
1335
- text-transform: uppercase;
1336
- letter-spacing: 0.05em;
1337
- color: var(--danger);
1338
- margin-bottom: 4px;
1339
- }
1340
- .stats-drawer-error-text {
1341
- font-size: 12px;
1342
- color: var(--text);
1343
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1344
- white-space: pre-wrap;
1345
- word-break: break-all;
1346
- }
1347
- .stats-drawer-metrics-grid {
1348
- display: grid;
1349
- grid-template-columns: repeat(2, 1fr);
1350
- gap: 12px;
1351
- }
1352
- .stats-drawer-metric-card {
1353
- background: var(--surface);
1354
- border: 1px solid var(--border);
1355
- border-radius: var(--radius-lg);
1356
- padding: 14px;
1357
- display: flex;
1358
- flex-direction: column;
1359
- justify-content: center;
1360
- }
1361
- .stats-drawer-metric-label {
1362
- display: flex;
1363
- align-items: center;
1364
- gap: 6px;
1365
- font-size: 11px;
1366
- font-weight: 600;
1367
- text-transform: uppercase;
1368
- letter-spacing: 0.05em;
1369
- color: var(--muted);
1370
- margin-bottom: 6px;
1371
- }
1372
- .stats-drawer-metric-icon {
1373
- color: var(--dim);
1374
- }
1375
- .stats-drawer-metric-value {
1376
- font-size: 16px;
1377
- font-weight: 700;
1378
- color: var(--text);
1379
- font-variant-numeric: tabular-nums;
1380
- }
1381
- .stats-drawer-metric-sub {
1382
- font-size: 11px;
1383
- color: var(--muted);
1384
- margin-top: 2px;
1385
- font-variant-numeric: tabular-nums;
1386
- }
1387
- .stats-drawer-json-blocks {
1388
- display: flex;
1389
- flex-direction: column;
1390
- gap: 16px;
1391
- }
1392
- .stats-json-block {
1393
- border: 1px solid var(--border);
1394
- border-radius: var(--radius-lg);
1395
- background: var(--surface);
1396
- overflow: hidden;
1397
- }
1398
- .stats-json-block-header {
1399
- padding: 10px 16px;
1400
- background: var(--surface-2);
1401
- border-bottom: 1px solid var(--border);
1402
- display: flex;
1403
- justify-content: space-between;
1404
- align-items: center;
1405
- cursor: pointer;
1406
- user-select: none;
1407
- font-size: 12px;
1408
- font-weight: 600;
1409
- }
1410
- .stats-json-block-header:hover {
1411
- background: var(--border);
1412
- }
1413
- .stats-json-block-title {
1414
- color: var(--text);
1415
- }
1416
- .stats-json-block-toggle-indicator {
1417
- color: var(--muted);
1418
- }
1419
- .stats-json-block-content-wrapper {
1420
- padding: 16px;
1421
- background: var(--page);
1422
- overflow-x: auto;
1423
- }
1424
- .stats-json-block-content {
1425
- margin: 0;
1426
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1427
- font-size: 12px;
1428
- color: var(--text);
1429
- line-height: 1.5;
1430
- }
1431
- .stats-skeleton {
1432
- background: var(--surface-2);
1433
- position: relative;
1434
- overflow: hidden;
1435
- border-radius: var(--radius-sm);
1436
- }
1437
- .stats-skeleton[data-variant="text"] {
1438
- height: 14px;
1439
- margin-top: 4px;
1440
- margin-bottom: 4px;
1441
- }
1442
- .stats-skeleton[data-variant="circle"] {
1443
- border-radius: 50%;
1444
- }
1445
- .stats-skeleton::after {
1446
- content: "";
1447
- position: absolute;
1448
- inset: 0;
1449
- transform: translateX(-100%);
1450
- background: linear-gradient( 90deg, transparent 0%, rgba(255, 255, 255, 0.05) 50%, transparent 100% );
1451
- animation: shimmer 1.5s infinite;
1452
- }
1453
- @media (prefers-color-scheme: light) {
1454
- .stats-skeleton::after {
1455
- background: linear-gradient( 90deg, transparent 0%, rgba(0, 0, 0, 0.03) 50%, transparent 100% );
1456
- }
1457
- }
1458
- @keyframes shimmer {
1459
- 100% {
1460
- transform: translateX(100%);
1461
- }
1462
- }
1463
- @media (prefers-reduced-motion: reduce) {
1464
- .stats-skeleton::after {
1465
- animation: none;
1466
- }
1467
- }
1468
- .stats-boundary-skeleton {
1469
- padding: 20px;
1470
- border: 1px solid var(--border);
1471
- border-radius: var(--radius-lg);
1472
- background: var(--surface);
1473
- }
1474
- .stats-empty-state, .stats-error-state {
1475
- padding: 48px 24px;
1476
- display: flex;
1477
- flex-direction: column;
1478
- align-items: center;
1479
- justify-content: center;
1480
- text-align: center;
1481
- background: var(--surface);
1482
- border: 1px dashed var(--border);
1483
- border-radius: var(--radius-lg);
1484
- }
1485
- .stats-empty-state-message {
1486
- font-size: 13px;
1487
- color: var(--muted);
1488
- margin: 0;
1489
- }
1490
- .stats-error-state-content {
1491
- max-width: 360px;
1492
- }
1493
- .stats-error-state-title {
1494
- font-size: 14px;
1495
- font-weight: 600;
1496
- color: var(--text);
1497
- margin: 0 0 8px 0;
1498
- }
1499
- .stats-error-state-message {
1500
- font-size: 12px;
1501
- color: var(--danger);
1502
- margin: 0 0 16px 0;
1503
- word-break: break-word;
1504
- }
1505
- .stats-error-state-btn {
1506
- margin: 0 auto;
1507
- }
1508
- .stats-text-primary {
1509
- color: var(--text);
1510
- }
1511
- .stats-text-secondary {
1512
- color: var(--muted);
1513
- }
1514
- .stats-text-muted {
1515
- color: var(--dim);
1516
- }
1517
- .stats-text-warning {
1518
- color: var(--warning);
1519
- }
1520
- .stats-text-xs {
1521
- font-size: 12px;
1522
- }
1523
- .stats-font-medium {
1524
- font-weight: 500;
1525
- }
1526
- .stats-font-semibold {
1527
- font-weight: 600;
1528
- }
1529
- * {
1530
- scrollbar-width: thin;
1531
- scrollbar-color: var(--border-strong) transparent;
1532
- }
1533
- *::-webkit-scrollbar {
1534
- width: 10px;
1535
- height: 10px;
1536
- }
1537
- *::-webkit-scrollbar-track {
1538
- background: transparent;
1539
- }
1540
- *::-webkit-scrollbar-thumb {
1541
- background: var(--border-strong);
1542
- border: 2px solid transparent;
1543
- background-clip: padding-box;
1544
- border-radius: 999px;
1545
- }
1546
- *::-webkit-scrollbar-thumb:hover {
1547
- background: var(--dim);
1548
- border: 2px solid transparent;
1549
- background-clip: padding-box;
1550
- }
1551
- *::-webkit-scrollbar-corner {
1552
- background: transparent;
1553
- }
1554
- @media (prefers-reduced-motion: reduce) {
1555
- .stats-button, .stats-table-tr-clickable, .stats-nav-rail-item, .stats-range-control-btn, .stats-segmented-control-btn {
1556
- transition: none;
1557
- }
1558
- .stats-button:active:not(:disabled) {
1559
- transform: none;
1560
- }
1561
- .stats-mobile-drawer, .stats-drawer {
1562
- animation: none;
1563
- }
1564
- }
1565
- .stats-logo-container {
1566
- display: grid;
1567
- grid-template-columns: auto 1fr;
1568
- align-items: center;
1569
- column-gap: 10px;
1570
- }
1571
- .stats-logo-container::before {
1572
- content: "";
1573
- grid-row: 1 / 3;
1574
- width: 16px;
1575
- height: 16px;
1576
- border-radius: 4px;
1577
- background: linear-gradient(135deg, #1d4ed8 0%, #2563eb 50%, #60a5fa 100%);
1578
- }
1579
- .stats-logo-text, .stats-logo-subtext {
1580
- grid-column: 2;
1581
- }
1582
- .stats-json-actions {
1583
- display: flex;
1584
- align-items: center;
1585
- gap: 12px;
1586
- }
1587
- .stats-json-copy-btn {
1588
- display: inline-flex;
1589
- align-items: center;
1590
- gap: 5px;
1591
- font-size: 11px;
1592
- font-weight: 600;
1593
- color: var(--muted);
1594
- background: transparent;
1595
- border: 1px solid var(--border);
1596
- border-radius: var(--radius-sm);
1597
- padding: 3px 8px;
1598
- cursor: pointer;
1599
- font-family: inherit;
1600
- transition: color 0.12s ease, background 0.12s ease;
1601
- }
1602
- .stats-json-copy-btn:hover {
1603
- color: var(--text);
1604
- background: var(--surface-2);
1605
- }
1606
- .stats-empty-state-icon {
1607
- color: var(--dim);
1608
- margin-bottom: 12px;
1609
- }
1610
- @media (prefers-reduced-motion: reduce) {
1611
- .stats-json-copy-btn {
1612
- transition: none;
1613
- }
1614
- }
1615
- .stats-theme-toggle {
1616
- display: inline-flex;
1617
- align-items: center;
1618
- justify-content: center;
1619
- width: 32px;
1620
- height: 32px;
1621
- flex-shrink: 0;
1622
- border: 1px solid var(--border);
1623
- border-radius: var(--radius-md);
1624
- background: var(--surface);
1625
- color: var(--muted);
1626
- cursor: pointer;
1627
- transition: color 0.14s ease, background 0.14s ease, border-color 0.14s ease;
1628
- }
1629
- .stats-theme-toggle:hover {
1630
- color: var(--text);
1631
- border-color: var(--border-strong);
1632
- }
1633
- @media (prefers-reduced-motion: reduce) {
1634
- .stats-theme-toggle {
1635
- transition: none;
1636
- }
1637
- }
1638
- @property --tw-space-y-reverse {
1639
- syntax: "*";
1640
- inherits: false;
1641
- initial-value: 0;
1642
- }
1643
- @property --tw-border-style {
1644
- syntax: "*";
1645
- inherits: false;
1646
- initial-value: solid;
1647
- }
1648
- @property --tw-font-weight {
1649
- syntax: "*";
1650
- inherits: false;
1651
- }
1652
- @property --tw-tracking {
1653
- syntax: "*";
1654
- inherits: false;
1655
- }
1656
- @property --tw-ordinal {
1657
- syntax: "*";
1658
- inherits: false;
1659
- }
1660
- @property --tw-slashed-zero {
1661
- syntax: "*";
1662
- inherits: false;
1663
- }
1664
- @property --tw-numeric-figure {
1665
- syntax: "*";
1666
- inherits: false;
1667
- }
1668
- @property --tw-numeric-spacing {
1669
- syntax: "*";
1670
- inherits: false;
1671
- }
1672
- @property --tw-numeric-fraction {
1673
- syntax: "*";
1674
- inherits: false;
1675
- }
1676
- @keyframes spin {
1677
- to {
1678
- transform: rotate(360deg);
1679
- }
1680
- }
1681
- @layer properties {
1682
- @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
1683
- *, ::before, ::after, ::backdrop {
1684
- --tw-space-y-reverse: 0;
1685
- --tw-border-style: solid;
1686
- --tw-font-weight: initial;
1687
- --tw-tracking: initial;
1688
- --tw-ordinal: initial;
1689
- --tw-slashed-zero: initial;
1690
- --tw-numeric-figure: initial;
1691
- --tw-numeric-spacing: initial;
1692
- --tw-numeric-fraction: initial;
1693
- }
1694
- }
1695
- }