@vib-rato/stats 0.16.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 (69) hide show
  1. package/README.md +88 -0
  2. package/build.ts +84 -0
  3. package/dist/client/index.css +1 -0
  4. package/dist/client/index.html +13 -0
  5. package/dist/client/index.js +257 -0
  6. package/dist/client/styles.css +1141 -0
  7. package/dist/types/aggregator.d.ts +65 -0
  8. package/dist/types/client/App.d.ts +1 -0
  9. package/dist/types/client/api.d.ts +16 -0
  10. package/dist/types/client/components/BehaviorChart.d.ts +6 -0
  11. package/dist/types/client/components/BehaviorModelsTable.d.ts +7 -0
  12. package/dist/types/client/components/BehaviorSummary.d.ts +7 -0
  13. package/dist/types/client/components/ChartsContainer.d.ts +7 -0
  14. package/dist/types/client/components/CostChart.d.ts +6 -0
  15. package/dist/types/client/components/CostSummary.d.ts +6 -0
  16. package/dist/types/client/components/Header.d.ts +12 -0
  17. package/dist/types/client/components/ModelsTable.d.ts +8 -0
  18. package/dist/types/client/components/RequestDetail.d.ts +6 -0
  19. package/dist/types/client/components/RequestList.d.ts +8 -0
  20. package/dist/types/client/components/StatsGrid.d.ts +6 -0
  21. package/dist/types/client/components/chart-shared.d.ts +190 -0
  22. package/dist/types/client/components/models-table-shared.d.ts +195 -0
  23. package/dist/types/client/components/range-meta.d.ts +21 -0
  24. package/dist/types/client/index.d.ts +1 -0
  25. package/dist/types/client/types.d.ts +62 -0
  26. package/dist/types/client/useSystemTheme.d.ts +2 -0
  27. package/dist/types/compiled-client-assets.d.ts +3 -0
  28. package/dist/types/db.d.ts +93 -0
  29. package/dist/types/index.d.ts +5 -0
  30. package/dist/types/parser.d.ts +40 -0
  31. package/dist/types/server.d.ts +18 -0
  32. package/dist/types/shared-types.d.ts +192 -0
  33. package/dist/types/sync-worker.d.ts +31 -0
  34. package/dist/types/types.d.ts +120 -0
  35. package/dist/types/user-metrics.d.ts +72 -0
  36. package/package.json +92 -0
  37. package/src/aggregator.ts +454 -0
  38. package/src/client/App.tsx +221 -0
  39. package/src/client/api.ts +71 -0
  40. package/src/client/components/BehaviorChart.tsx +189 -0
  41. package/src/client/components/BehaviorModelsTable.tsx +342 -0
  42. package/src/client/components/BehaviorSummary.tsx +95 -0
  43. package/src/client/components/ChartsContainer.tsx +232 -0
  44. package/src/client/components/CostChart.tsx +171 -0
  45. package/src/client/components/CostSummary.tsx +53 -0
  46. package/src/client/components/Header.tsx +73 -0
  47. package/src/client/components/ModelsTable.tsx +265 -0
  48. package/src/client/components/RequestDetail.tsx +172 -0
  49. package/src/client/components/RequestList.tsx +73 -0
  50. package/src/client/components/StatsGrid.tsx +135 -0
  51. package/src/client/components/chart-shared.tsx +331 -0
  52. package/src/client/components/models-table-shared.tsx +275 -0
  53. package/src/client/components/range-meta.ts +72 -0
  54. package/src/client/css.d.ts +1 -0
  55. package/src/client/index.tsx +6 -0
  56. package/src/client/styles.css +318 -0
  57. package/src/client/types.ts +78 -0
  58. package/src/client/useSystemTheme.ts +31 -0
  59. package/src/compiled-client-assets.ts +96 -0
  60. package/src/db.ts +1100 -0
  61. package/src/embedded-client.generated.txt +7 -0
  62. package/src/index.ts +182 -0
  63. package/src/parser.ts +334 -0
  64. package/src/server.ts +332 -0
  65. package/src/shared-types.ts +204 -0
  66. package/src/sync-worker.ts +40 -0
  67. package/src/types.ts +125 -0
  68. package/src/user-metrics.ts +686 -0
  69. package/tailwind.config.js +54 -0
@@ -0,0 +1,1141 @@
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
+ --color-white: #fff;
12
+ --spacing: 0.25rem;
13
+ --text-xs: 0.75rem;
14
+ --text-xs--line-height: calc(1 / 0.75);
15
+ --text-sm: 0.875rem;
16
+ --text-sm--line-height: calc(1.25 / 0.875);
17
+ --text-lg: 1.125rem;
18
+ --text-lg--line-height: calc(1.75 / 1.125);
19
+ --text-xl: 1.25rem;
20
+ --text-xl--line-height: calc(1.75 / 1.25);
21
+ --text-2xl: 1.5rem;
22
+ --text-2xl--line-height: calc(2 / 1.5);
23
+ --font-weight-medium: 500;
24
+ --font-weight-semibold: 600;
25
+ --font-weight-bold: 700;
26
+ --tracking-wide: 0.025em;
27
+ --tracking-wider: 0.05em;
28
+ --radius-sm: 0.25rem;
29
+ --radius-md: 0.375rem;
30
+ --radius-lg: 0.5rem;
31
+ --blur-sm: 8px;
32
+ --default-transition-duration: 150ms;
33
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
34
+ --default-font-family: var(--font-sans);
35
+ --default-mono-font-family: var(--font-mono);
36
+ }
37
+ }
38
+ @layer base {
39
+ *, ::after, ::before, ::backdrop, ::file-selector-button {
40
+ box-sizing: border-box;
41
+ margin: 0;
42
+ padding: 0;
43
+ border: 0 solid;
44
+ }
45
+ html, :host {
46
+ line-height: 1.5;
47
+ -webkit-text-size-adjust: 100%;
48
+ tab-size: 4;
49
+ 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");
50
+ font-feature-settings: var(--default-font-feature-settings, normal);
51
+ font-variation-settings: var(--default-font-variation-settings, normal);
52
+ -webkit-tap-highlight-color: transparent;
53
+ }
54
+ hr {
55
+ height: 0;
56
+ color: inherit;
57
+ border-top-width: 1px;
58
+ }
59
+ abbr:where([title]) {
60
+ -webkit-text-decoration: underline dotted;
61
+ text-decoration: underline dotted;
62
+ }
63
+ h1, h2, h3, h4, h5, h6 {
64
+ font-size: inherit;
65
+ font-weight: inherit;
66
+ }
67
+ a {
68
+ color: inherit;
69
+ -webkit-text-decoration: inherit;
70
+ text-decoration: inherit;
71
+ }
72
+ b, strong {
73
+ font-weight: bolder;
74
+ }
75
+ code, kbd, samp, pre {
76
+ font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
77
+ font-feature-settings: var(--default-mono-font-feature-settings, normal);
78
+ font-variation-settings: var(--default-mono-font-variation-settings, normal);
79
+ font-size: 1em;
80
+ }
81
+ small {
82
+ font-size: 80%;
83
+ }
84
+ sub, sup {
85
+ font-size: 75%;
86
+ line-height: 0;
87
+ position: relative;
88
+ vertical-align: baseline;
89
+ }
90
+ sub {
91
+ bottom: -0.25em;
92
+ }
93
+ sup {
94
+ top: -0.5em;
95
+ }
96
+ table {
97
+ text-indent: 0;
98
+ border-color: inherit;
99
+ border-collapse: collapse;
100
+ }
101
+ :-moz-focusring:where(:not(iframe)) {
102
+ outline: auto;
103
+ }
104
+ progress {
105
+ vertical-align: baseline;
106
+ }
107
+ summary {
108
+ display: list-item;
109
+ }
110
+ ol, ul, menu {
111
+ list-style: none;
112
+ }
113
+ img, svg, video, canvas, audio, iframe, embed, object {
114
+ display: block;
115
+ vertical-align: middle;
116
+ }
117
+ img, video {
118
+ max-width: 100%;
119
+ height: auto;
120
+ }
121
+ button, input, select, optgroup, textarea, ::file-selector-button {
122
+ font: inherit;
123
+ font-feature-settings: inherit;
124
+ font-variation-settings: inherit;
125
+ letter-spacing: inherit;
126
+ color: inherit;
127
+ border-radius: 0;
128
+ background-color: transparent;
129
+ opacity: 1;
130
+ }
131
+ :where(select:is([multiple], [size])) optgroup {
132
+ font-weight: bolder;
133
+ }
134
+ :where(select:is([multiple], [size])) optgroup option {
135
+ padding-inline-start: 20px;
136
+ }
137
+ ::file-selector-button {
138
+ margin-inline-end: 4px;
139
+ }
140
+ ::placeholder {
141
+ opacity: 1;
142
+ }
143
+ @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
144
+ ::placeholder {
145
+ color: currentcolor;
146
+ @supports (color: color-mix(in lab, red, red)) {
147
+ color: color-mix(in oklab, currentcolor 50%, transparent);
148
+ }
149
+ }
150
+ }
151
+ textarea {
152
+ resize: vertical;
153
+ }
154
+ ::-webkit-search-decoration {
155
+ -webkit-appearance: none;
156
+ }
157
+ ::-webkit-date-and-time-value {
158
+ min-height: 1lh;
159
+ text-align: inherit;
160
+ }
161
+ ::-webkit-datetime-edit {
162
+ display: inline-flex;
163
+ }
164
+ ::-webkit-datetime-edit-fields-wrapper {
165
+ padding: 0;
166
+ }
167
+ ::-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 {
168
+ padding-block: 0;
169
+ }
170
+ ::-webkit-calendar-picker-indicator {
171
+ line-height: 1;
172
+ }
173
+ :-moz-ui-invalid {
174
+ box-shadow: none;
175
+ }
176
+ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
177
+ appearance: button;
178
+ }
179
+ ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
180
+ height: auto;
181
+ }
182
+ [hidden]:where(:not([hidden="until-found"])) {
183
+ display: none !important;
184
+ }
185
+ }
186
+ @layer utilities {
187
+ .fixed {
188
+ position: fixed;
189
+ }
190
+ .sticky {
191
+ position: sticky;
192
+ }
193
+ .inset-0 {
194
+ inset: 0px;
195
+ }
196
+ .top-0 {
197
+ top: 0px;
198
+ }
199
+ .z-10 {
200
+ z-index: 10;
201
+ }
202
+ .z-\[100\] {
203
+ z-index: 100;
204
+ }
205
+ .mx-auto {
206
+ margin-inline: auto;
207
+ }
208
+ .mt-0\.5 {
209
+ margin-top: calc(var(--spacing) * 0.5);
210
+ }
211
+ .mt-1 {
212
+ margin-top: var(--spacing);
213
+ }
214
+ .mb-1 {
215
+ margin-bottom: var(--spacing);
216
+ }
217
+ .mb-2 {
218
+ margin-bottom: calc(var(--spacing) * 2);
219
+ }
220
+ .mb-3 {
221
+ margin-bottom: calc(var(--spacing) * 3);
222
+ }
223
+ .mb-4 {
224
+ margin-bottom: calc(var(--spacing) * 4);
225
+ }
226
+ .mb-8 {
227
+ margin-bottom: calc(var(--spacing) * 8);
228
+ }
229
+ .flex {
230
+ display: flex;
231
+ }
232
+ .grid {
233
+ display: grid;
234
+ }
235
+ .table-row {
236
+ display: table-row;
237
+ }
238
+ .h-5 {
239
+ height: calc(var(--spacing) * 5);
240
+ }
241
+ .h-8 {
242
+ height: calc(var(--spacing) * 8);
243
+ }
244
+ .h-10 {
245
+ height: calc(var(--spacing) * 10);
246
+ }
247
+ .h-\[200px\] {
248
+ height: 200px;
249
+ }
250
+ .h-\[280px\] {
251
+ height: 280px;
252
+ }
253
+ .h-\[calc\(100vh-140px\)\] {
254
+ height: calc(100vh - 140px);
255
+ }
256
+ .h-full {
257
+ height: 100%;
258
+ }
259
+ .max-h-\[calc\(100vh-300px\)\] {
260
+ max-height: calc(100vh - 300px);
261
+ }
262
+ .min-h-\[180px\] {
263
+ min-height: 180px;
264
+ }
265
+ .min-h-\[320px\] {
266
+ min-height: 320px;
267
+ }
268
+ .min-h-screen {
269
+ min-height: 100vh;
270
+ }
271
+ .w-5 {
272
+ width: calc(var(--spacing) * 5);
273
+ }
274
+ .w-8 {
275
+ width: calc(var(--spacing) * 8);
276
+ }
277
+ .w-10 {
278
+ width: calc(var(--spacing) * 10);
279
+ }
280
+ .w-\[600px\] {
281
+ width: 600px;
282
+ }
283
+ .w-full {
284
+ width: 100%;
285
+ }
286
+ .max-w-\[1600px\] {
287
+ max-width: 1600px;
288
+ }
289
+ .max-w-full {
290
+ max-width: 100%;
291
+ }
292
+ .flex-1 {
293
+ flex: 1;
294
+ }
295
+ .cursor-pointer {
296
+ cursor: pointer;
297
+ }
298
+ .grid-cols-1 {
299
+ grid-template-columns: repeat(1, minmax(0, 1fr));
300
+ }
301
+ .grid-cols-2 {
302
+ grid-template-columns: repeat(2, minmax(0, 1fr));
303
+ }
304
+ .flex-col {
305
+ flex-direction: column;
306
+ }
307
+ .flex-wrap {
308
+ flex-wrap: wrap;
309
+ }
310
+ .items-center {
311
+ align-items: center;
312
+ }
313
+ .justify-between {
314
+ justify-content: space-between;
315
+ }
316
+ .justify-center {
317
+ justify-content: center;
318
+ }
319
+ .justify-end {
320
+ justify-content: flex-end;
321
+ }
322
+ .gap-2 {
323
+ gap: calc(var(--spacing) * 2);
324
+ }
325
+ .gap-3 {
326
+ gap: calc(var(--spacing) * 3);
327
+ }
328
+ .gap-4 {
329
+ gap: calc(var(--spacing) * 4);
330
+ }
331
+ .gap-6 {
332
+ gap: calc(var(--spacing) * 6);
333
+ }
334
+ :where(.space-y-1 > :not(:last-child)) {
335
+ --tw-space-y-reverse: 0;
336
+ margin-block-start: calc(var(--spacing) * var(--tw-space-y-reverse));
337
+ margin-block-end: calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)));
338
+ }
339
+ :where(.space-y-4 > :not(:last-child)) {
340
+ --tw-space-y-reverse: 0;
341
+ margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
342
+ margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
343
+ }
344
+ :where(.space-y-6 > :not(:last-child)) {
345
+ --tw-space-y-reverse: 0;
346
+ margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));
347
+ margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
348
+ }
349
+ .truncate {
350
+ overflow: hidden;
351
+ text-overflow: ellipsis;
352
+ white-space: nowrap;
353
+ }
354
+ .overflow-auto {
355
+ overflow: auto;
356
+ }
357
+ .overflow-hidden {
358
+ overflow: hidden;
359
+ }
360
+ .overflow-x-auto {
361
+ overflow-x: auto;
362
+ }
363
+ .overflow-y-auto {
364
+ overflow-y: auto;
365
+ }
366
+ .rounded-\[var\(--radius-md\)\] {
367
+ border-radius: var(--radius-md);
368
+ }
369
+ .rounded-\[var\(--radius-sm\)\] {
370
+ border-radius: var(--radius-sm);
371
+ }
372
+ .rounded-full {
373
+ border-radius: calc(infinity * 1px);
374
+ }
375
+ .border {
376
+ border-style: var(--tw-border-style);
377
+ border-width: 1px;
378
+ }
379
+ .border-2 {
380
+ border-style: var(--tw-border-style);
381
+ border-width: 2px;
382
+ }
383
+ .border-t {
384
+ border-top-style: var(--tw-border-style);
385
+ border-top-width: 1px;
386
+ }
387
+ .border-b {
388
+ border-bottom-style: var(--tw-border-style);
389
+ border-bottom-width: 1px;
390
+ }
391
+ .border-l {
392
+ border-left-style: var(--tw-border-style);
393
+ border-left-width: 1px;
394
+ }
395
+ .border-none {
396
+ --tw-border-style: none;
397
+ border-style: none;
398
+ }
399
+ .border-\[var\(--border-default\)\] {
400
+ border-color: var(--border-default);
401
+ }
402
+ .border-\[var\(--border-subtle\)\] {
403
+ border-color: var(--border-subtle);
404
+ }
405
+ .border-t-\[var\(--accent-cyan\)\] {
406
+ border-top-color: var(--accent-cyan);
407
+ }
408
+ .bg-\[var\(--bg-elevated\)\] {
409
+ background-color: var(--bg-elevated);
410
+ }
411
+ .bg-\[var\(--bg-overlay\)\] {
412
+ background-color: var(--bg-overlay);
413
+ }
414
+ .bg-\[var\(--bg-page\)\] {
415
+ background-color: var(--bg-page);
416
+ }
417
+ .bg-\[var\(--bg-page\)\]\/95 {
418
+ background-color: var(--bg-page);
419
+ @supports (color: color-mix(in lab, red, red)) {
420
+ background-color: color-mix(in oklab, var(--bg-page) 95%, transparent);
421
+ }
422
+ }
423
+ .bg-\[var\(--bg-surface\)\] {
424
+ background-color: var(--bg-surface);
425
+ }
426
+ .bg-transparent {
427
+ background-color: transparent;
428
+ }
429
+ .bg-gradient-to-br {
430
+ --tw-gradient-position: to bottom right in oklab;
431
+ background-image: linear-gradient(var(--tw-gradient-stops));
432
+ }
433
+ .bg-\[image\:var\(--brand-gradient\)\] {
434
+ background-image: var(--brand-gradient);
435
+ }
436
+ .from-\[var\(--accent-pink\)\]\/20 {
437
+ --tw-gradient-from: var(--accent-pink);
438
+ @supports (color: color-mix(in lab, red, red)) {
439
+ --tw-gradient-from: color-mix(in oklab, var(--accent-pink) 20%, transparent);
440
+ }
441
+ --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
442
+ }
443
+ .to-\[var\(--accent-cyan\)\]\/20 {
444
+ --tw-gradient-to: var(--accent-cyan);
445
+ @supports (color: color-mix(in lab, red, red)) {
446
+ --tw-gradient-to: color-mix(in oklab, var(--accent-cyan) 20%, transparent);
447
+ }
448
+ --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
449
+ }
450
+ .p-0\.5 {
451
+ padding: calc(var(--spacing) * 0.5);
452
+ }
453
+ .p-1 {
454
+ padding: var(--spacing);
455
+ }
456
+ .p-2 {
457
+ padding: calc(var(--spacing) * 2);
458
+ }
459
+ .p-4 {
460
+ padding: calc(var(--spacing) * 4);
461
+ }
462
+ .p-5 {
463
+ padding: calc(var(--spacing) * 5);
464
+ }
465
+ .p-6 {
466
+ padding: calc(var(--spacing) * 6);
467
+ }
468
+ .px-4 {
469
+ padding-inline: calc(var(--spacing) * 4);
470
+ }
471
+ .px-5 {
472
+ padding-inline: calc(var(--spacing) * 5);
473
+ }
474
+ .px-6 {
475
+ padding-inline: calc(var(--spacing) * 6);
476
+ }
477
+ .px-8 {
478
+ padding-inline: calc(var(--spacing) * 8);
479
+ }
480
+ .py-3 {
481
+ padding-block: calc(var(--spacing) * 3);
482
+ }
483
+ .py-4 {
484
+ padding-block: calc(var(--spacing) * 4);
485
+ }
486
+ .py-6 {
487
+ padding-block: calc(var(--spacing) * 6);
488
+ }
489
+ .py-8 {
490
+ padding-block: calc(var(--spacing) * 8);
491
+ }
492
+ .py-12 {
493
+ padding-block: calc(var(--spacing) * 12);
494
+ }
495
+ .pb-6 {
496
+ padding-bottom: calc(var(--spacing) * 6);
497
+ }
498
+ .text-center {
499
+ text-align: center;
500
+ }
501
+ .text-left {
502
+ text-align: left;
503
+ }
504
+ .text-right {
505
+ text-align: right;
506
+ }
507
+ .font-mono {
508
+ font-family: var(--font-mono);
509
+ }
510
+ .text-2xl {
511
+ font-size: var(--text-2xl);
512
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
513
+ }
514
+ .text-lg {
515
+ font-size: var(--text-lg);
516
+ line-height: var(--tw-leading, var(--text-lg--line-height));
517
+ }
518
+ .text-sm {
519
+ font-size: var(--text-sm);
520
+ line-height: var(--tw-leading, var(--text-sm--line-height));
521
+ }
522
+ .text-xl {
523
+ font-size: var(--text-xl);
524
+ line-height: var(--tw-leading, var(--text-xl--line-height));
525
+ }
526
+ .text-xs {
527
+ font-size: var(--text-xs);
528
+ line-height: var(--tw-leading, var(--text-xs--line-height));
529
+ }
530
+ .font-bold {
531
+ --tw-font-weight: var(--font-weight-bold);
532
+ font-weight: var(--font-weight-bold);
533
+ }
534
+ .font-medium {
535
+ --tw-font-weight: var(--font-weight-medium);
536
+ font-weight: var(--font-weight-medium);
537
+ }
538
+ .font-semibold {
539
+ --tw-font-weight: var(--font-weight-semibold);
540
+ font-weight: var(--font-weight-semibold);
541
+ }
542
+ .tracking-wide {
543
+ --tw-tracking: var(--tracking-wide);
544
+ letter-spacing: var(--tracking-wide);
545
+ }
546
+ .tracking-wider {
547
+ --tw-tracking: var(--tracking-wider);
548
+ letter-spacing: var(--tracking-wider);
549
+ }
550
+ .text-\[var\(--accent-cyan\)\] {
551
+ color: var(--accent-cyan);
552
+ }
553
+ .text-\[var\(--accent-green\)\] {
554
+ color: var(--accent-green);
555
+ }
556
+ .text-\[var\(--accent-red\)\] {
557
+ color: var(--accent-red);
558
+ }
559
+ .text-\[var\(--text-muted\)\] {
560
+ color: var(--text-muted);
561
+ }
562
+ .text-\[var\(--text-primary\)\] {
563
+ color: var(--text-primary);
564
+ }
565
+ .text-\[var\(--text-secondary\)\] {
566
+ color: var(--text-secondary);
567
+ }
568
+ .text-white {
569
+ color: var(--color-white);
570
+ }
571
+ .uppercase {
572
+ text-transform: uppercase;
573
+ }
574
+ .shadow-lg {
575
+ --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
576
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
577
+ }
578
+ .backdrop-blur {
579
+ --tw-backdrop-blur: blur(8px);
580
+ -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
581
+ backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
582
+ }
583
+ .backdrop-blur-sm {
584
+ --tw-backdrop-blur: blur(var(--blur-sm));
585
+ -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
586
+ backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
587
+ }
588
+ .transition-colors {
589
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
590
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
591
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
592
+ }
593
+ .transition-transform {
594
+ transition-property: transform, translate, scale, rotate;
595
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
596
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
597
+ }
598
+ @media (hover: hover) {
599
+ .group-hover\:scale-110:is(:where(.group):hover *) {
600
+ --tw-scale-x: 110%;
601
+ --tw-scale-y: 110%;
602
+ --tw-scale-z: 110%;
603
+ scale: var(--tw-scale-x) var(--tw-scale-y);
604
+ }
605
+ }
606
+ .last\:border-b-0:last-child {
607
+ border-bottom-style: var(--tw-border-style);
608
+ border-bottom-width: 0px;
609
+ }
610
+ @media (hover: hover) {
611
+ .hover\:bg-\[var\(--bg-hover\)\]:hover {
612
+ background-color: var(--bg-hover);
613
+ }
614
+ .hover\:text-\[var\(--text-primary\)\]:hover {
615
+ color: var(--text-primary);
616
+ }
617
+ }
618
+ @media (width >= 40rem) {
619
+ .sm\:grid-cols-3 {
620
+ grid-template-columns: repeat(3, minmax(0, 1fr));
621
+ }
622
+ .sm\:grid-cols-6 {
623
+ grid-template-columns: repeat(6, minmax(0, 1fr));
624
+ }
625
+ .sm\:flex-row {
626
+ flex-direction: row;
627
+ }
628
+ .sm\:items-center {
629
+ align-items: center;
630
+ }
631
+ }
632
+ @media (width >= 64rem) {
633
+ .lg\:grid-cols-2 {
634
+ grid-template-columns: repeat(2, minmax(0, 1fr));
635
+ }
636
+ .lg\:grid-cols-3 {
637
+ grid-template-columns: repeat(3, minmax(0, 1fr));
638
+ }
639
+ }
640
+ @media (width >= 80rem) {
641
+ .xl\:grid-cols-9 {
642
+ grid-template-columns: repeat(9, minmax(0, 1fr));
643
+ }
644
+ }
645
+ }
646
+ :root {
647
+ color-scheme: light;
648
+ --bg-page: #f8fafc;
649
+ --bg-surface: #ffffff;
650
+ --bg-elevated: #f1f5f9;
651
+ --bg-hover: rgba(15, 23, 42, 0.04);
652
+ --bg-active: rgba(15, 23, 42, 0.08);
653
+ --border-subtle: rgba(15, 23, 42, 0.08);
654
+ --border-default: rgba(15, 23, 42, 0.14);
655
+ --text-primary: #0f172a;
656
+ --text-secondary: #334155;
657
+ --text-muted: #64748b;
658
+ --accent-pink: #002f6d;
659
+ --accent-pink-glow: rgba(0, 47, 109, 0.28);
660
+ --accent-cyan: #4f6fa3;
661
+ --accent-cyan-glow: rgba(79, 111, 163, 0.24);
662
+ --accent-violet: #7a8ca8;
663
+ --accent-green: #16a34a;
664
+ --accent-amber: #d97706;
665
+ --accent-red: #dc2626;
666
+ --tab-active-highlight: inset 0 1px 0 rgba(15, 23, 42, 0.08);
667
+ --radius-sm: 6px;
668
+ --radius-md: 10px;
669
+ --radius-lg: 14px;
670
+ --brand-blue: #002f6d;
671
+ --brand-gray: #bcbec0;
672
+ --brand-gradient: linear-gradient(120deg, #003d96 0%, #002f6d 55%, #002d5c 100%);
673
+ --font-title: "NanumSquare", "NanumSquareRound", "Nanum Gothic", -apple-system, "Apple SD Gothic Neo",
674
+ "Malgun Gothic", "Segoe UI", sans-serif;
675
+ --font-body: "KoPubDotum", "KoPub Dotum", "KoPubWorldDotum", "Nanum Gothic", -apple-system, "Apple SD Gothic Neo",
676
+ "Malgun Gothic", "Segoe UI", sans-serif;
677
+ }
678
+ @media (prefers-color-scheme: dark) {
679
+ :root {
680
+ color-scheme: dark;
681
+ --bg-page: #0b1220;
682
+ --bg-surface: #101a2e;
683
+ --bg-elevated: #16233d;
684
+ --bg-hover: rgba(255, 255, 255, 0.03);
685
+ --bg-active: rgba(255, 255, 255, 0.06);
686
+ --border-subtle: rgba(127, 166, 230, 0.12);
687
+ --border-default: rgba(127, 166, 230, 0.2);
688
+ --text-primary: #f8fafc;
689
+ --text-secondary: #94a3b8;
690
+ --text-muted: #64748b;
691
+ --accent-pink: #7fa6e6;
692
+ --accent-pink-glow: rgba(127, 166, 230, 0.35);
693
+ --accent-cyan: #8fb3e8;
694
+ --accent-cyan-glow: rgba(143, 179, 232, 0.3);
695
+ --accent-violet: #a9b7cc;
696
+ --accent-green: #4ade80;
697
+ --accent-amber: #fbbf24;
698
+ --accent-red: #f87171;
699
+ --tab-active-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.05);
700
+ }
701
+ }
702
+ @layer base {
703
+ * {
704
+ box-sizing: border-box;
705
+ }
706
+ html {
707
+ -webkit-font-smoothing: antialiased;
708
+ -moz-osx-font-smoothing: grayscale;
709
+ }
710
+ body {
711
+ font-family: var(--font-body);
712
+ background: var(--bg-page);
713
+ color: var(--text-primary);
714
+ margin: 0;
715
+ min-height: 100vh;
716
+ }
717
+ h1, h2, h3, .title {
718
+ font-family: var(--font-title);
719
+ }
720
+ ::-webkit-scrollbar {
721
+ width: 8px;
722
+ height: 8px;
723
+ }
724
+ ::-webkit-scrollbar-track {
725
+ background: transparent;
726
+ }
727
+ ::-webkit-scrollbar-thumb {
728
+ background: var(--border-default);
729
+ border-radius: 4px;
730
+ }
731
+ ::-webkit-scrollbar-thumb:hover {
732
+ background: var(--text-muted);
733
+ }
734
+ }
735
+ @layer components {
736
+ .surface {
737
+ background: var(--bg-surface);
738
+ border: 1px solid var(--border-subtle);
739
+ border-radius: var(--radius-lg);
740
+ }
741
+ .surface-elevated {
742
+ background: var(--bg-elevated);
743
+ border: 1px solid var(--border-default);
744
+ border-radius: var(--radius-lg);
745
+ }
746
+ .btn {
747
+ display: inline-flex;
748
+ align-items: center;
749
+ justify-content: center;
750
+ gap: 8px;
751
+ padding: 8px 16px;
752
+ font-size: 14px;
753
+ font-weight: 500;
754
+ border-radius: var(--radius-md);
755
+ border: none;
756
+ cursor: pointer;
757
+ transition: all 0.15s ease;
758
+ }
759
+ .btn-primary {
760
+ background: var(--brand-gradient);
761
+ color: white;
762
+ box-shadow: 0 0 20px var(--accent-pink-glow);
763
+ }
764
+ .btn-primary:hover {
765
+ transform: translateY(-1px);
766
+ box-shadow: 0 4px 24px var(--accent-pink-glow);
767
+ }
768
+ .btn-primary:disabled {
769
+ opacity: 0.6;
770
+ cursor: not-allowed;
771
+ transform: none;
772
+ }
773
+ .btn-secondary {
774
+ background: var(--bg-elevated);
775
+ color: var(--text-primary);
776
+ border: 1px solid var(--border-default);
777
+ }
778
+ .btn-secondary:hover {
779
+ background: var(--bg-hover);
780
+ border-color: var(--border-default);
781
+ }
782
+ .tab-btn {
783
+ padding: 6px 16px;
784
+ font-size: 14px;
785
+ font-weight: 500;
786
+ color: var(--text-muted);
787
+ background: transparent;
788
+ border: none;
789
+ border-radius: var(--radius-md);
790
+ cursor: pointer;
791
+ transition: all 0.15s ease;
792
+ }
793
+ .tab-btn:hover {
794
+ color: var(--text-primary);
795
+ background: var(--bg-hover);
796
+ }
797
+ .tab-btn.active {
798
+ color: var(--text-primary);
799
+ background: var(--bg-elevated);
800
+ box-shadow: var(--tab-active-highlight);
801
+ }
802
+ .stat-card {
803
+ background: var(--bg-surface);
804
+ border: 1px solid var(--border-subtle);
805
+ border-radius: var(--radius-lg);
806
+ padding: 20px;
807
+ transition: all 0.2s ease;
808
+ }
809
+ .stat-card:hover {
810
+ border-color: var(--border-default);
811
+ background: var(--bg-elevated);
812
+ }
813
+ .badge {
814
+ display: inline-flex;
815
+ align-items: center;
816
+ padding: 3px 10px;
817
+ font-size: 12px;
818
+ font-weight: 500;
819
+ border-radius: 100px;
820
+ }
821
+ .badge-success {
822
+ background: rgba(74, 222, 128, 0.15);
823
+ color: var(--accent-green);
824
+ }
825
+ .badge-error {
826
+ background: rgba(248, 113, 113, 0.15);
827
+ color: var(--accent-red);
828
+ }
829
+ .badge-info {
830
+ background: rgba(143, 179, 232, 0.15);
831
+ color: var(--accent-cyan);
832
+ }
833
+ .badge-warning {
834
+ background: rgba(251, 191, 36, 0.15);
835
+ color: var(--accent-amber);
836
+ }
837
+ .table-header {
838
+ font-size: 11px;
839
+ font-weight: 600;
840
+ text-transform: uppercase;
841
+ letter-spacing: 0.05em;
842
+ color: var(--text-muted);
843
+ }
844
+ .table-row {
845
+ transition: background 0.15s ease;
846
+ }
847
+ .table-row:hover {
848
+ background: var(--bg-hover);
849
+ }
850
+ .gradient-text {
851
+ background: linear-gradient(135deg, var(--accent-pink) 0%, var(--accent-cyan) 100%);
852
+ -webkit-background-clip: text;
853
+ -webkit-text-fill-color: transparent;
854
+ background-clip: text;
855
+ }
856
+ .gradient-border {
857
+ position: relative;
858
+ }
859
+ .gradient-border::before {
860
+ content: '';
861
+ position: absolute;
862
+ inset: 0;
863
+ padding: 1px;
864
+ border-radius: inherit;
865
+ background: linear-gradient(135deg, var(--accent-pink), var(--accent-cyan));
866
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
867
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
868
+ -webkit-mask-composite: xor;
869
+ mask-composite: exclude;
870
+ pointer-events: none;
871
+ }
872
+ .glow-pink {
873
+ box-shadow: 0 0 30px var(--accent-pink-glow);
874
+ }
875
+ .glow-cyan {
876
+ box-shadow: 0 0 30px var(--accent-cyan-glow);
877
+ }
878
+ }
879
+ @layer utilities {
880
+ .text-balance {
881
+ text-wrap: balance;
882
+ }
883
+ .animate-fade-in {
884
+ animation: fadeIn 0.3s ease-out;
885
+ }
886
+ .animate-slide-up {
887
+ animation: slideUp 0.3s ease-out;
888
+ }
889
+ @keyframes fadeIn {
890
+ from {
891
+ opacity: 0;
892
+ }
893
+ to {
894
+ opacity: 1;
895
+ }
896
+ }
897
+ @keyframes slideUp {
898
+ from {
899
+ opacity: 0;
900
+ transform: translateY(10px);
901
+ }
902
+ to {
903
+ opacity: 1;
904
+ transform: translateY(0);
905
+ }
906
+ }
907
+ .spin {
908
+ animation: spin 1s linear infinite;
909
+ }
910
+ @keyframes spin {
911
+ to {
912
+ transform: rotate(360deg);
913
+ }
914
+ }
915
+ }
916
+ @property --tw-space-y-reverse {
917
+ syntax: "*";
918
+ inherits: false;
919
+ initial-value: 0;
920
+ }
921
+ @property --tw-border-style {
922
+ syntax: "*";
923
+ inherits: false;
924
+ initial-value: solid;
925
+ }
926
+ @property --tw-gradient-position {
927
+ syntax: "*";
928
+ inherits: false;
929
+ }
930
+ @property --tw-gradient-from {
931
+ syntax: "<color>";
932
+ inherits: false;
933
+ initial-value: #0000;
934
+ }
935
+ @property --tw-gradient-via {
936
+ syntax: "<color>";
937
+ inherits: false;
938
+ initial-value: #0000;
939
+ }
940
+ @property --tw-gradient-to {
941
+ syntax: "<color>";
942
+ inherits: false;
943
+ initial-value: #0000;
944
+ }
945
+ @property --tw-gradient-stops {
946
+ syntax: "*";
947
+ inherits: false;
948
+ }
949
+ @property --tw-gradient-via-stops {
950
+ syntax: "*";
951
+ inherits: false;
952
+ }
953
+ @property --tw-gradient-from-position {
954
+ syntax: "<length-percentage>";
955
+ inherits: false;
956
+ initial-value: 0%;
957
+ }
958
+ @property --tw-gradient-via-position {
959
+ syntax: "<length-percentage>";
960
+ inherits: false;
961
+ initial-value: 50%;
962
+ }
963
+ @property --tw-gradient-to-position {
964
+ syntax: "<length-percentage>";
965
+ inherits: false;
966
+ initial-value: 100%;
967
+ }
968
+ @property --tw-font-weight {
969
+ syntax: "*";
970
+ inherits: false;
971
+ }
972
+ @property --tw-tracking {
973
+ syntax: "*";
974
+ inherits: false;
975
+ }
976
+ @property --tw-shadow {
977
+ syntax: "*";
978
+ inherits: false;
979
+ initial-value: 0 0 #0000;
980
+ }
981
+ @property --tw-shadow-color {
982
+ syntax: "*";
983
+ inherits: false;
984
+ }
985
+ @property --tw-shadow-alpha {
986
+ syntax: "<percentage>";
987
+ inherits: false;
988
+ initial-value: 100%;
989
+ }
990
+ @property --tw-inset-shadow {
991
+ syntax: "*";
992
+ inherits: false;
993
+ initial-value: 0 0 #0000;
994
+ }
995
+ @property --tw-inset-shadow-color {
996
+ syntax: "*";
997
+ inherits: false;
998
+ }
999
+ @property --tw-inset-shadow-alpha {
1000
+ syntax: "<percentage>";
1001
+ inherits: false;
1002
+ initial-value: 100%;
1003
+ }
1004
+ @property --tw-ring-color {
1005
+ syntax: "*";
1006
+ inherits: false;
1007
+ }
1008
+ @property --tw-ring-shadow {
1009
+ syntax: "*";
1010
+ inherits: false;
1011
+ initial-value: 0 0 #0000;
1012
+ }
1013
+ @property --tw-inset-ring-color {
1014
+ syntax: "*";
1015
+ inherits: false;
1016
+ }
1017
+ @property --tw-inset-ring-shadow {
1018
+ syntax: "*";
1019
+ inherits: false;
1020
+ initial-value: 0 0 #0000;
1021
+ }
1022
+ @property --tw-ring-inset {
1023
+ syntax: "*";
1024
+ inherits: false;
1025
+ }
1026
+ @property --tw-ring-offset-width {
1027
+ syntax: "<length>";
1028
+ inherits: false;
1029
+ initial-value: 0px;
1030
+ }
1031
+ @property --tw-ring-offset-color {
1032
+ syntax: "*";
1033
+ inherits: false;
1034
+ initial-value: #fff;
1035
+ }
1036
+ @property --tw-ring-offset-shadow {
1037
+ syntax: "*";
1038
+ inherits: false;
1039
+ initial-value: 0 0 #0000;
1040
+ }
1041
+ @property --tw-backdrop-blur {
1042
+ syntax: "*";
1043
+ inherits: false;
1044
+ }
1045
+ @property --tw-backdrop-brightness {
1046
+ syntax: "*";
1047
+ inherits: false;
1048
+ }
1049
+ @property --tw-backdrop-contrast {
1050
+ syntax: "*";
1051
+ inherits: false;
1052
+ }
1053
+ @property --tw-backdrop-grayscale {
1054
+ syntax: "*";
1055
+ inherits: false;
1056
+ }
1057
+ @property --tw-backdrop-hue-rotate {
1058
+ syntax: "*";
1059
+ inherits: false;
1060
+ }
1061
+ @property --tw-backdrop-invert {
1062
+ syntax: "*";
1063
+ inherits: false;
1064
+ }
1065
+ @property --tw-backdrop-opacity {
1066
+ syntax: "*";
1067
+ inherits: false;
1068
+ }
1069
+ @property --tw-backdrop-saturate {
1070
+ syntax: "*";
1071
+ inherits: false;
1072
+ }
1073
+ @property --tw-backdrop-sepia {
1074
+ syntax: "*";
1075
+ inherits: false;
1076
+ }
1077
+ @property --tw-scale-x {
1078
+ syntax: "*";
1079
+ inherits: false;
1080
+ initial-value: 1;
1081
+ }
1082
+ @property --tw-scale-y {
1083
+ syntax: "*";
1084
+ inherits: false;
1085
+ initial-value: 1;
1086
+ }
1087
+ @property --tw-scale-z {
1088
+ syntax: "*";
1089
+ inherits: false;
1090
+ initial-value: 1;
1091
+ }
1092
+ @keyframes spin {
1093
+ to {
1094
+ transform: rotate(360deg);
1095
+ }
1096
+ }
1097
+ @layer properties {
1098
+ @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
1099
+ *, ::before, ::after, ::backdrop {
1100
+ --tw-space-y-reverse: 0;
1101
+ --tw-border-style: solid;
1102
+ --tw-gradient-position: initial;
1103
+ --tw-gradient-from: #0000;
1104
+ --tw-gradient-via: #0000;
1105
+ --tw-gradient-to: #0000;
1106
+ --tw-gradient-stops: initial;
1107
+ --tw-gradient-via-stops: initial;
1108
+ --tw-gradient-from-position: 0%;
1109
+ --tw-gradient-via-position: 50%;
1110
+ --tw-gradient-to-position: 100%;
1111
+ --tw-font-weight: initial;
1112
+ --tw-tracking: initial;
1113
+ --tw-shadow: 0 0 #0000;
1114
+ --tw-shadow-color: initial;
1115
+ --tw-shadow-alpha: 100%;
1116
+ --tw-inset-shadow: 0 0 #0000;
1117
+ --tw-inset-shadow-color: initial;
1118
+ --tw-inset-shadow-alpha: 100%;
1119
+ --tw-ring-color: initial;
1120
+ --tw-ring-shadow: 0 0 #0000;
1121
+ --tw-inset-ring-color: initial;
1122
+ --tw-inset-ring-shadow: 0 0 #0000;
1123
+ --tw-ring-inset: initial;
1124
+ --tw-ring-offset-width: 0px;
1125
+ --tw-ring-offset-color: #fff;
1126
+ --tw-ring-offset-shadow: 0 0 #0000;
1127
+ --tw-backdrop-blur: initial;
1128
+ --tw-backdrop-brightness: initial;
1129
+ --tw-backdrop-contrast: initial;
1130
+ --tw-backdrop-grayscale: initial;
1131
+ --tw-backdrop-hue-rotate: initial;
1132
+ --tw-backdrop-invert: initial;
1133
+ --tw-backdrop-opacity: initial;
1134
+ --tw-backdrop-saturate: initial;
1135
+ --tw-backdrop-sepia: initial;
1136
+ --tw-scale-x: 1;
1137
+ --tw-scale-y: 1;
1138
+ --tw-scale-z: 1;
1139
+ }
1140
+ }
1141
+ }