@linxiraos/pi-stats 1.0.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 (126) hide show
  1. package/CHANGELOG.md +276 -0
  2. package/README.md +82 -0
  3. package/build.ts +95 -0
  4. package/dist/client/index.css +1 -0
  5. package/dist/client/index.html +24 -0
  6. package/dist/client/index.js +257 -0
  7. package/dist/client/styles.css +1695 -0
  8. package/dist/types/aggregator.d.ts +98 -0
  9. package/dist/types/client/App.d.ts +1 -0
  10. package/dist/types/client/api.d.ts +22 -0
  11. package/dist/types/client/app/AppLayout.d.ts +16 -0
  12. package/dist/types/client/app/NavRail.d.ts +7 -0
  13. package/dist/types/client/app/RangeControl.d.ts +7 -0
  14. package/dist/types/client/app/SyncButton.d.ts +14 -0
  15. package/dist/types/client/app/ThemeToggle.d.ts +1 -0
  16. package/dist/types/client/app/TopBar.d.ts +15 -0
  17. package/dist/types/client/app/routes.d.ts +12 -0
  18. package/dist/types/client/components/AgentTokenShare.d.ts +5 -0
  19. package/dist/types/client/components/chart-shared.d.ts +173 -0
  20. package/dist/types/client/components/models-table-shared.d.ts +175 -0
  21. package/dist/types/client/components/range-meta.d.ts +21 -0
  22. package/dist/types/client/data/charts.d.ts +1 -0
  23. package/dist/types/client/data/formatters.d.ts +8 -0
  24. package/dist/types/client/data/useHashRoute.d.ts +8 -0
  25. package/dist/types/client/data/useResource.d.ts +13 -0
  26. package/dist/types/client/data/view-models.d.ts +74 -0
  27. package/dist/types/client/index.d.ts +2 -0
  28. package/dist/types/client/routes/BehaviorRoute.d.ts +7 -0
  29. package/dist/types/client/routes/CostsRoute.d.ts +7 -0
  30. package/dist/types/client/routes/ErrorsRoute.d.ts +8 -0
  31. package/dist/types/client/routes/GainRoute.d.ts +7 -0
  32. package/dist/types/client/routes/ModelsRoute.d.ts +7 -0
  33. package/dist/types/client/routes/OverviewRoute.d.ts +8 -0
  34. package/dist/types/client/routes/ProjectsRoute.d.ts +7 -0
  35. package/dist/types/client/routes/ProvidersRoute.d.ts +7 -0
  36. package/dist/types/client/routes/RequestsRoute.d.ts +8 -0
  37. package/dist/types/client/routes/ToolsRoute.d.ts +7 -0
  38. package/dist/types/client/routes/index.d.ts +10 -0
  39. package/dist/types/client/types.d.ts +63 -0
  40. package/dist/types/client/ui/AsyncBoundary.d.ts +12 -0
  41. package/dist/types/client/ui/DataTable.d.ts +17 -0
  42. package/dist/types/client/ui/EmptyState.d.ts +7 -0
  43. package/dist/types/client/ui/ErrorState.d.ts +6 -0
  44. package/dist/types/client/ui/JsonBlock.d.ts +7 -0
  45. package/dist/types/client/ui/MetricCluster.d.ts +5 -0
  46. package/dist/types/client/ui/Panel.d.ts +7 -0
  47. package/dist/types/client/ui/RequestDrawer.d.ts +5 -0
  48. package/dist/types/client/ui/SegmentedControl.d.ts +12 -0
  49. package/dist/types/client/ui/Skeleton.d.ts +8 -0
  50. package/dist/types/client/ui/StatusPill.d.ts +7 -0
  51. package/dist/types/client/ui/index.d.ts +11 -0
  52. package/dist/types/client/useSystemTheme.d.ts +11 -0
  53. package/dist/types/db.d.ts +159 -0
  54. package/dist/types/embedded-client.d.ts +18 -0
  55. package/dist/types/gain-aggregator.d.ts +26 -0
  56. package/dist/types/index.d.ts +7 -0
  57. package/dist/types/parser.d.ts +53 -0
  58. package/dist/types/port-conflict.d.ts +14 -0
  59. package/dist/types/server.d.ts +12 -0
  60. package/dist/types/shared-types.d.ts +403 -0
  61. package/dist/types/sync-worker.d.ts +31 -0
  62. package/dist/types/types.d.ts +164 -0
  63. package/dist/types/usage-windows.d.ts +45 -0
  64. package/dist/types/user-metrics.d.ts +81 -0
  65. package/package.json +94 -0
  66. package/src/aggregator.ts +615 -0
  67. package/src/client/App.tsx +112 -0
  68. package/src/client/api.ts +118 -0
  69. package/src/client/app/AppLayout.tsx +93 -0
  70. package/src/client/app/NavRail.tsx +44 -0
  71. package/src/client/app/RangeControl.tsx +39 -0
  72. package/src/client/app/SyncButton.tsx +75 -0
  73. package/src/client/app/ThemeToggle.tsx +37 -0
  74. package/src/client/app/TopBar.tsx +73 -0
  75. package/src/client/app/routes.ts +86 -0
  76. package/src/client/components/AgentTokenShare.tsx +68 -0
  77. package/src/client/components/chart-shared.tsx +257 -0
  78. package/src/client/components/models-table-shared.tsx +255 -0
  79. package/src/client/components/range-meta.ts +73 -0
  80. package/src/client/css.d.ts +1 -0
  81. package/src/client/data/charts.ts +14 -0
  82. package/src/client/data/formatters.ts +45 -0
  83. package/src/client/data/useHashRoute.ts +88 -0
  84. package/src/client/data/useResource.ts +154 -0
  85. package/src/client/data/view-models.ts +259 -0
  86. package/src/client/index.tsx +10 -0
  87. package/src/client/routes/BehaviorRoute.tsx +623 -0
  88. package/src/client/routes/CostsRoute.tsx +234 -0
  89. package/src/client/routes/ErrorsRoute.tsx +118 -0
  90. package/src/client/routes/GainRoute.tsx +226 -0
  91. package/src/client/routes/ModelsRoute.tsx +430 -0
  92. package/src/client/routes/OverviewRoute.tsx +342 -0
  93. package/src/client/routes/ProjectsRoute.tsx +163 -0
  94. package/src/client/routes/ProvidersRoute.tsx +492 -0
  95. package/src/client/routes/RequestsRoute.tsx +123 -0
  96. package/src/client/routes/ToolsRoute.tsx +463 -0
  97. package/src/client/routes/index.ts +10 -0
  98. package/src/client/styles.css +1384 -0
  99. package/src/client/types.ts +80 -0
  100. package/src/client/ui/AsyncBoundary.tsx +54 -0
  101. package/src/client/ui/DataTable.tsx +122 -0
  102. package/src/client/ui/EmptyState.tsx +16 -0
  103. package/src/client/ui/ErrorState.tsx +25 -0
  104. package/src/client/ui/JsonBlock.tsx +75 -0
  105. package/src/client/ui/MetricCluster.tsx +78 -0
  106. package/src/client/ui/Panel.tsx +24 -0
  107. package/src/client/ui/RequestDrawer.tsx +208 -0
  108. package/src/client/ui/SegmentedControl.tsx +36 -0
  109. package/src/client/ui/Skeleton.tsx +17 -0
  110. package/src/client/ui/StatusPill.tsx +15 -0
  111. package/src/client/ui/index.ts +11 -0
  112. package/src/client/useSystemTheme.ts +87 -0
  113. package/src/db.ts +1702 -0
  114. package/src/embedded-client.generated.txt +0 -0
  115. package/src/embedded-client.ts +26 -0
  116. package/src/gain-aggregator.ts +311 -0
  117. package/src/index.ts +194 -0
  118. package/src/parser.ts +499 -0
  119. package/src/port-conflict.ts +263 -0
  120. package/src/server.ts +396 -0
  121. package/src/shared-types.ts +432 -0
  122. package/src/sync-worker.ts +40 -0
  123. package/src/types.ts +171 -0
  124. package/src/usage-windows.ts +304 -0
  125. package/src/user-metrics.ts +695 -0
  126. package/tailwind.config.js +40 -0
@@ -0,0 +1,1695 @@
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
+ }