jeopi-stats 16.2.13

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