@f0rbit/ui 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1582 @@
1
+ @layer reset, tokens, components, utilities;
2
+
3
+ /* ===== tokens.css ===== */
4
+
5
+ @layer tokens {
6
+ :root {
7
+ --bg: oklch(97% 0.02 290);
8
+ --bg-alt: oklch(96% 0.01 290);
9
+ --border: oklch(91% 0.01 290);
10
+
11
+ --fg: oklch(1% 0.02 290);
12
+ --fg-muted: oklch(25% 0.02 290);
13
+ --fg-subtle: oklch(35% 0.02 290);
14
+ --fg-faint: oklch(50% 0.03 290);
15
+
16
+ --accent: oklch(46% 0.015 300);
17
+ --accent-fg: var(--bg);
18
+
19
+ --success: oklch(0.95 0.05 150);
20
+ --success-fg: oklch(0.35 0.15 150);
21
+ --error: oklch(0.95 0.05 20);
22
+ --error-fg: oklch(0.45 0.15 20);
23
+ --warning: oklch(0.95 0.08 85);
24
+ --warning-fg: oklch(0.45 0.15 85);
25
+ --info: oklch(0.95 0.05 240);
26
+ --info-fg: oklch(0.4 0.15 240);
27
+
28
+ --font: "neue-haas-grotesk-text", "Inter", Helvetica, sans-serif;
29
+ --font-mono: ui-monospace, "SF Mono", Menlo, monospace;
30
+ --font-semibold: 600;
31
+
32
+ --text-xs: 0.75rem;
33
+ --text-xs-lh: 1rem;
34
+ --text-sm: 0.875rem;
35
+ --text-sm-lh: 1.25rem;
36
+ --text-base: 1rem;
37
+ --text-base-lh: 1.5rem;
38
+ --text-lg: 1.125rem;
39
+ --text-lg-lh: 1.75rem;
40
+ --text-xl: 1.25rem;
41
+ --text-xl-lh: 1.75rem;
42
+ --text-2xl: 1.5rem;
43
+ --text-2xl-lh: 2rem;
44
+ --text-3xl: 1.875rem;
45
+ --text-3xl-lh: 2.25rem;
46
+ --text-4xl: 2.25rem;
47
+ --text-4xl-lh: 2.5rem;
48
+
49
+ --leading-normal: 1.5;
50
+
51
+ --space-xs: 0.25rem;
52
+ --space-sm: 0.35rem;
53
+ --space-md: 0.75rem;
54
+ --space-lg: 1.5rem;
55
+ --space-xl: 2.5rem;
56
+
57
+ --radius: 0.25rem;
58
+ --radius-lg: 0.5rem;
59
+
60
+ --shadow: 0 1px 3px rgb(0 0 0 / 0.1);
61
+ --shadow-lg: 0 10px 25px rgb(0 0 0 / 0.15);
62
+
63
+ --transition: 150ms ease;
64
+
65
+ --hover-filter: brightness(0.8);
66
+ }
67
+
68
+ /* Dark mode: system preference or explicit data-theme */
69
+ @media (prefers-color-scheme: dark) {
70
+ :root:not([data-theme="light"]) {
71
+ --bg: oklch(21% 0.015 280);
72
+ --bg-alt: oklch(27% 0.02 290);
73
+ --border: oklch(32% 0.02 290);
74
+
75
+ --fg: oklch(100% 0 0);
76
+ --fg-muted: oklch(85% 0.02 290);
77
+ --fg-subtle: oklch(75% 0.02 290);
78
+ --fg-faint: oklch(60% 0.03 290);
79
+
80
+ --accent: oklch(70% 0.035 280);
81
+
82
+ --success: oklch(0.35 0.05 150);
83
+ --success-fg: oklch(0.85 0.1 150);
84
+ --error: oklch(0.35 0.05 20);
85
+ --error-fg: oklch(0.85 0.1 20);
86
+ --warning: oklch(0.35 0.08 85);
87
+ --warning-fg: oklch(0.85 0.12 85);
88
+ --info: oklch(0.35 0.05 240);
89
+ --info-fg: oklch(0.85 0.1 240);
90
+
91
+ --shadow: 0 1px 3px rgb(0 0 0 / 0.3);
92
+ --shadow-lg: 0 10px 25px rgb(0 0 0 / 0.4);
93
+
94
+ --hover-filter: brightness(1.2);
95
+ }
96
+ }
97
+
98
+ /* Explicit dark theme override */
99
+ :root[data-theme="dark"] {
100
+ --bg: oklch(21% 0.015 280);
101
+ --bg-alt: oklch(27% 0.02 290);
102
+ --border: oklch(32% 0.02 290);
103
+
104
+ --fg: oklch(100% 0 0);
105
+ --fg-muted: oklch(85% 0.02 290);
106
+ --fg-subtle: oklch(75% 0.02 290);
107
+ --fg-faint: oklch(60% 0.03 290);
108
+
109
+ --accent: oklch(70% 0.035 280);
110
+
111
+ --success: oklch(0.35 0.05 150);
112
+ --success-fg: oklch(0.85 0.1 150);
113
+ --error: oklch(0.35 0.05 20);
114
+ --error-fg: oklch(0.85 0.1 20);
115
+ --warning: oklch(0.35 0.08 85);
116
+ --warning-fg: oklch(0.85 0.12 85);
117
+ --info: oklch(0.35 0.05 240);
118
+ --info-fg: oklch(0.85 0.1 240);
119
+
120
+ --shadow: 0 1px 3px rgb(0 0 0 / 0.3);
121
+ --shadow-lg: 0 10px 25px rgb(0 0 0 / 0.4);
122
+
123
+ --hover-filter: brightness(1.2);
124
+ }
125
+ }
126
+
127
+
128
+ /* ===== reset.css ===== */
129
+
130
+ @layer reset {
131
+ *,
132
+ *::before,
133
+ *::after {
134
+ box-sizing: border-box;
135
+ }
136
+
137
+ * {
138
+ margin: 0;
139
+ }
140
+
141
+ body {
142
+ line-height: var(--leading-normal, 1.5);
143
+ -webkit-font-smoothing: antialiased;
144
+ font-family: var(--font);
145
+ background: var(--bg);
146
+ color: var(--fg-muted);
147
+ }
148
+
149
+ img,
150
+ picture,
151
+ video,
152
+ canvas,
153
+ svg {
154
+ display: block;
155
+ max-width: 100%;
156
+ }
157
+
158
+ input,
159
+ button,
160
+ textarea,
161
+ select {
162
+ font: inherit;
163
+ font-size: var(--text-sm);
164
+ line-height: var(--text-sm-lh);
165
+ }
166
+
167
+ p,
168
+ h1,
169
+ h2,
170
+ h3,
171
+ h4,
172
+ h5,
173
+ h6 {
174
+ overflow-wrap: break-word;
175
+ }
176
+
177
+ h1,
178
+ h2,
179
+ h3,
180
+ h4,
181
+ h5,
182
+ h6 {
183
+ color: var(--fg);
184
+ font-weight: var(--font-semibold, 600);
185
+ }
186
+
187
+ a {
188
+ color: var(--accent);
189
+ text-decoration: none;
190
+ transition: filter var(--transition);
191
+ }
192
+
193
+ a:hover {
194
+ filter: var(--hover-filter);
195
+ }
196
+
197
+ ul,
198
+ ol {
199
+ list-style: none;
200
+ padding: 0;
201
+ }
202
+
203
+ table {
204
+ border-collapse: collapse;
205
+ border-spacing: 0;
206
+ }
207
+
208
+ :focus-visible {
209
+ outline: 2px solid var(--accent);
210
+ outline-offset: 2px;
211
+ }
212
+
213
+ @media (prefers-reduced-motion: reduce) {
214
+ *,
215
+ *::before,
216
+ *::after {
217
+ animation-duration: 0.01ms !important;
218
+ animation-iteration-count: 1 !important;
219
+ transition-duration: 0.01ms !important;
220
+ }
221
+ }
222
+ }
223
+
224
+
225
+ /* ===== utilities.css ===== */
226
+
227
+ @layer utilities {
228
+ .stack {
229
+ display: flex;
230
+ flex-direction: column;
231
+ gap: var(--stack-gap, var(--space-md));
232
+ }
233
+
234
+ .stack-sm {
235
+ --stack-gap: var(--space-sm);
236
+ }
237
+
238
+ .stack-lg {
239
+ --stack-gap: var(--space-lg);
240
+ }
241
+
242
+ .row {
243
+ display: flex;
244
+ flex-direction: row;
245
+ align-items: center;
246
+ gap: var(--row-gap, var(--space-sm));
247
+ }
248
+
249
+ .row-sm {
250
+ --row-gap: var(--space-xs);
251
+ }
252
+
253
+ .row-lg {
254
+ --row-gap: var(--space-md);
255
+ }
256
+
257
+ .row-between {
258
+ justify-content: space-between;
259
+ }
260
+
261
+ .row-end {
262
+ justify-content: flex-end;
263
+ }
264
+
265
+ .row-start {
266
+ align-items: flex-start;
267
+ }
268
+
269
+ .cluster {
270
+ display: flex;
271
+ flex-wrap: wrap;
272
+ gap: var(--space-sm);
273
+ align-items: center;
274
+ }
275
+
276
+ .center {
277
+ max-width: var(--center-width, 65ch);
278
+ margin-inline: auto;
279
+ padding-inline: var(--space-md);
280
+ }
281
+
282
+ .center-narrow {
283
+ --center-width: 45ch;
284
+ }
285
+
286
+ .center-wide {
287
+ --center-width: 90ch;
288
+ }
289
+
290
+ .grid {
291
+ display: grid;
292
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-min, 250px), 1fr));
293
+ gap: var(--space-md);
294
+ }
295
+
296
+ .grid-2 {
297
+ grid-template-columns: repeat(2, 1fr);
298
+ }
299
+
300
+ .grid-3 {
301
+ grid-template-columns: repeat(3, 1fr);
302
+ }
303
+
304
+ .grid-4 {
305
+ grid-template-columns: repeat(4, 1fr);
306
+ }
307
+
308
+ .text-primary {
309
+ color: var(--fg);
310
+ }
311
+
312
+ .text-muted {
313
+ color: var(--fg-muted);
314
+ }
315
+
316
+ .text-subtle {
317
+ color: var(--fg-subtle);
318
+ }
319
+
320
+ .text-faint {
321
+ color: var(--fg-faint);
322
+ }
323
+
324
+ .text-accent {
325
+ color: var(--accent);
326
+ }
327
+
328
+ .text-xs {
329
+ font-size: var(--text-xs);
330
+ line-height: var(--text-xs-lh);
331
+ }
332
+
333
+ .text-sm {
334
+ font-size: var(--text-sm);
335
+ line-height: var(--text-sm-lh);
336
+ }
337
+
338
+ .text-base {
339
+ font-size: var(--text-base);
340
+ line-height: var(--text-base-lh);
341
+ }
342
+
343
+ .text-lg {
344
+ font-size: var(--text-lg);
345
+ line-height: var(--text-lg-lh);
346
+ }
347
+
348
+ .text-xl {
349
+ font-size: var(--text-xl);
350
+ line-height: var(--text-xl-lh);
351
+ }
352
+
353
+ .text-2xl {
354
+ font-size: var(--text-2xl);
355
+ line-height: var(--text-2xl-lh);
356
+ }
357
+
358
+ .text-3xl {
359
+ font-size: var(--text-3xl);
360
+ line-height: var(--text-3xl-lh);
361
+ }
362
+
363
+ .text-4xl {
364
+ font-size: var(--text-4xl);
365
+ line-height: var(--text-4xl-lh);
366
+ }
367
+
368
+ .font-medium {
369
+ font-weight: 500;
370
+ }
371
+
372
+ .font-bold {
373
+ font-weight: 700;
374
+ }
375
+
376
+ .font-mono {
377
+ font-family: var(--font-mono);
378
+ }
379
+
380
+ .truncate {
381
+ overflow: hidden;
382
+ text-overflow: ellipsis;
383
+ white-space: nowrap;
384
+ }
385
+
386
+ .list {
387
+ padding-left: var(--space-lg);
388
+ }
389
+
390
+ .list li {
391
+ position: relative;
392
+ padding-left: var(--space-sm);
393
+ margin-bottom: var(--space-xs);
394
+ }
395
+
396
+ .list li::marker {
397
+ color: var(--fg-faint);
398
+ }
399
+
400
+ .list li:last-child {
401
+ margin-bottom: 0;
402
+ }
403
+
404
+ ul.list {
405
+ list-style-type: disc;
406
+ }
407
+
408
+ ul.list ul {
409
+ list-style-type: circle;
410
+ margin-top: var(--space-xs);
411
+ padding-left: var(--space-lg);
412
+ }
413
+
414
+ ul.list ul ul {
415
+ list-style-type: square;
416
+ }
417
+
418
+ ol.list {
419
+ list-style-type: decimal;
420
+ }
421
+
422
+ ol.list ol {
423
+ list-style-type: lower-alpha;
424
+ margin-top: var(--space-xs);
425
+ padding-left: var(--space-lg);
426
+ }
427
+
428
+ ol.list ol ol {
429
+ list-style-type: lower-roman;
430
+ }
431
+
432
+ .list li > ul,
433
+ .list li > ol {
434
+ margin-top: var(--space-xs);
435
+ }
436
+
437
+ .sr-only {
438
+ position: absolute;
439
+ width: 1px;
440
+ height: 1px;
441
+ padding: 0;
442
+ margin: -1px;
443
+ overflow: hidden;
444
+ clip: rect(0, 0, 0, 0);
445
+ border: 0;
446
+ }
447
+
448
+ .hidden {
449
+ display: none;
450
+ }
451
+
452
+ .hover-reveal {
453
+ opacity: 0;
454
+ transition: opacity var(--transition);
455
+ }
456
+
457
+ *:hover > .hover-reveal,
458
+ *:focus-within > .hover-reveal {
459
+ opacity: 1;
460
+ }
461
+
462
+ .interactive {
463
+ --_hover-border: var(--hover-border, var(--fg-faint));
464
+ transition: border-color var(--transition);
465
+ }
466
+
467
+ .interactive:hover {
468
+ border-color: var(--_hover-border);
469
+ }
470
+
471
+ .interactive-color {
472
+ --_hover-color: var(--hover-color, var(--fg));
473
+ transition: color var(--transition);
474
+ }
475
+
476
+ .interactive-color:hover {
477
+ color: var(--_hover-color);
478
+ }
479
+
480
+ @keyframes spin {
481
+ to {
482
+ transform: rotate(360deg);
483
+ }
484
+ }
485
+
486
+ @keyframes pulse {
487
+ 50% {
488
+ opacity: 0.5;
489
+ }
490
+ }
491
+
492
+ @keyframes fade-in {
493
+ from {
494
+ opacity: 0;
495
+ }
496
+ }
497
+
498
+ .animate-spin {
499
+ animation: spin 1s linear infinite;
500
+ }
501
+
502
+ .animate-pulse {
503
+ animation: pulse 2s ease-in-out infinite;
504
+ }
505
+
506
+ @media (prefers-reduced-motion: reduce) {
507
+ .animate-spin,
508
+ .animate-pulse {
509
+ animation: none;
510
+ }
511
+ }
512
+
513
+ @media (max-width: 768px) {
514
+ .hide-mobile {
515
+ display: none;
516
+ }
517
+
518
+ .grid-2,
519
+ .grid-3,
520
+ .grid-4 {
521
+ grid-template-columns: 1fr;
522
+ }
523
+ }
524
+ }
525
+
526
+
527
+ /* ===== components.css ===== */
528
+
529
+ @layer components {
530
+ .btn {
531
+ display: inline-flex;
532
+ align-items: center;
533
+ justify-content: center;
534
+ gap: var(--space-sm);
535
+ padding: var(--space-sm) var(--space-md);
536
+ font-size: var(--text-sm);
537
+ font-weight: 500;
538
+ line-height: var(--text-sm-lh);
539
+ border-radius: var(--radius);
540
+ border: 1px solid var(--border);
541
+ cursor: pointer;
542
+ transition: background var(--transition), border-color var(--transition), color var(--transition), filter var(--transition);
543
+ white-space: nowrap;
544
+ padding-bottom: calc(var(--space-sm) - 2px);
545
+ background: transparent;
546
+ color: var(--accent);
547
+ }
548
+
549
+ .btn:hover:not(:disabled) {
550
+ border-color: var(--fg-faint);
551
+ }
552
+
553
+ .btn:disabled {
554
+ opacity: 0.5;
555
+ cursor: not-allowed;
556
+ }
557
+
558
+ .btn-secondary {
559
+ background: var(--bg-alt);
560
+ color: var(--fg-muted);
561
+ border-color: var(--border);
562
+ }
563
+
564
+ .btn-secondary:hover:not(:disabled) {
565
+ border-color: var(--fg-faint);
566
+ }
567
+
568
+ .btn-ghost {
569
+ background: transparent;
570
+ color: var(--fg-muted);
571
+ border-color: transparent;
572
+ }
573
+
574
+ .btn-ghost:hover:not(:disabled) {
575
+ border-color: var(--border);
576
+ }
577
+
578
+ .btn-danger {
579
+ background: var(--error);
580
+ color: var(--error-fg);
581
+ }
582
+
583
+ .btn-icon {
584
+ padding: var(--space-sm);
585
+ aspect-ratio: 1;
586
+ }
587
+
588
+ .btn-sm {
589
+ padding: var(--space-xs) var(--space-sm);
590
+ font-size: var(--text-xs);
591
+ }
592
+
593
+ .btn-lg {
594
+ padding: var(--space-sm) var(--space-lg);
595
+ font-size: var(--text-base);
596
+ line-height: var(--text-base-lh);
597
+ }
598
+
599
+ .badge {
600
+ display: inline-flex;
601
+ align-items: center;
602
+ gap: var(--space-xs);
603
+ padding: 2px var(--space-sm);
604
+ font-size: var(--text-xs);
605
+ font-weight: 500;
606
+ border-radius: 9999px;
607
+ background: var(--bg-alt);
608
+ color: var(--fg-muted);
609
+ border: 1px solid var(--border);
610
+ }
611
+
612
+ .badge-success {
613
+ background: var(--success);
614
+ color: var(--success-fg);
615
+ border-color: transparent;
616
+ }
617
+
618
+ .badge-error {
619
+ background: var(--error);
620
+ color: var(--error-fg);
621
+ border-color: transparent;
622
+ }
623
+
624
+ .badge-warning {
625
+ background: var(--warning);
626
+ color: var(--warning-fg);
627
+ border-color: transparent;
628
+ }
629
+
630
+ .badge-info {
631
+ background: var(--info);
632
+ color: var(--info-fg);
633
+ border-color: transparent;
634
+ }
635
+
636
+ .badge-accent {
637
+ background: var(--accent);
638
+ color: var(--accent-fg);
639
+ border-color: transparent;
640
+ }
641
+
642
+ .card {
643
+ background: var(--bg);
644
+ border: 1px solid var(--border);
645
+ border-radius: var(--radius-lg);
646
+ padding: var(--space-md);
647
+ box-shadow: var(--shadow);
648
+ }
649
+
650
+ .card-flat {
651
+ box-shadow: none;
652
+ }
653
+
654
+ .card-icon {
655
+ color: var(--fg-muted);
656
+ line-height: 0;
657
+ }
658
+
659
+ .card-interactive {
660
+ cursor: pointer;
661
+ transition: border-color var(--transition), box-shadow var(--transition);
662
+ }
663
+
664
+ .card-interactive:hover {
665
+ border-color: var(--fg-faint);
666
+ box-shadow: var(--shadow-lg);
667
+ }
668
+
669
+ .card-header {
670
+ display: flex;
671
+ align-items: center;
672
+ justify-content: space-between;
673
+ margin-bottom: var(--space-sm);
674
+ }
675
+
676
+ .card-title {
677
+ font-size: var(--text-base);
678
+ line-height: var(--text-base-lh);
679
+ font-weight: 600;
680
+ color: var(--fg);
681
+ margin: 0;
682
+ }
683
+
684
+ .card-description {
685
+ font-size: var(--text-sm);
686
+ line-height: var(--text-sm-lh);
687
+ color: var(--fg-subtle);
688
+ margin: 0;
689
+ }
690
+
691
+ .card-content {
692
+ /* Content wrapper - card already provides padding */
693
+ }
694
+
695
+ .card-footer {
696
+ display: flex;
697
+ justify-content: flex-end;
698
+ gap: var(--space-sm);
699
+ margin-top: var(--space-md);
700
+ padding-top: var(--space-md);
701
+ border-top: 1px solid var(--border);
702
+ }
703
+
704
+ .input,
705
+ .textarea,
706
+ .select {
707
+ display: block;
708
+ width: 100%;
709
+ padding: var(--space-sm);
710
+ font-size: var(--text-sm);
711
+ color: var(--fg);
712
+ background: var(--bg-alt);
713
+ border: 1px solid var(--border);
714
+ border-radius: var(--radius);
715
+ transition: border-color var(--transition);
716
+ }
717
+
718
+ .input::placeholder,
719
+ .textarea::placeholder {
720
+ color: var(--fg-faint);
721
+ }
722
+
723
+ .input:focus,
724
+ .textarea:focus,
725
+ .select:focus {
726
+ outline: none;
727
+ border-color: var(--accent);
728
+ }
729
+
730
+ .input:disabled,
731
+ .textarea:disabled,
732
+ .select:disabled {
733
+ opacity: 0.5;
734
+ cursor: not-allowed;
735
+ }
736
+
737
+ .input-error {
738
+ border-color: var(--error-fg);
739
+ }
740
+
741
+ .textarea {
742
+ min-height: 80px;
743
+ resize: vertical;
744
+ }
745
+
746
+ .select {
747
+ appearance: none;
748
+ padding-right: var(--space-lg);
749
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
750
+ background-repeat: no-repeat;
751
+ background-position: right var(--space-sm) center;
752
+ }
753
+
754
+ .label {
755
+ display: block;
756
+ font-size: var(--text-sm);
757
+ font-weight: 500;
758
+ color: var(--fg-muted);
759
+ margin-bottom: var(--space-xs);
760
+ }
761
+
762
+ .form-error {
763
+ font-size: var(--text-sm);
764
+ color: var(--error-fg);
765
+ }
766
+
767
+ .overlay {
768
+ position: fixed;
769
+ inset: 0;
770
+ background: rgb(0 0 0 / 0.5);
771
+ display: flex;
772
+ align-items: center;
773
+ justify-content: center;
774
+ padding: var(--space-md);
775
+ z-index: 100;
776
+ }
777
+
778
+ .modal {
779
+ position: relative;
780
+ margin: 0;
781
+ background: var(--bg);
782
+ border: 1px solid var(--border);
783
+ border-radius: var(--radius-lg);
784
+ box-shadow: var(--shadow-lg);
785
+ width: 100%;
786
+ max-width: 480px;
787
+ max-height: calc(100vh - var(--space-xl));
788
+ overflow: hidden;
789
+ display: flex;
790
+ flex-direction: column;
791
+ }
792
+
793
+ .modal-header {
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: space-between;
797
+ padding: var(--space-md);
798
+ border-bottom: 1px solid var(--border);
799
+ }
800
+
801
+ .modal-title {
802
+ font-size: var(--text-lg);
803
+ line-height: var(--text-lg-lh);
804
+ font-weight: 600;
805
+ color: var(--fg);
806
+ margin: 0;
807
+ }
808
+
809
+ .modal-close {
810
+ padding: var(--space-xs);
811
+ color: var(--fg-faint);
812
+ background: transparent;
813
+ border: 1px solid transparent;
814
+ border-radius: var(--radius);
815
+ cursor: pointer;
816
+ transition: border-color var(--transition), color var(--transition);
817
+ }
818
+
819
+ .modal-close:hover {
820
+ color: var(--fg);
821
+ border-color: var(--border);
822
+ }
823
+
824
+ .modal-body {
825
+ padding: var(--space-md);
826
+ overflow-y: auto;
827
+ }
828
+
829
+ .modal-footer {
830
+ display: flex;
831
+ justify-content: flex-end;
832
+ gap: var(--space-sm);
833
+ padding: var(--space-md);
834
+ border-top: 1px solid var(--border);
835
+ }
836
+
837
+ .stat {
838
+ display: flex;
839
+ flex-direction: column;
840
+ align-items: center;
841
+ text-align: center;
842
+ padding: var(--space-md);
843
+ border: 1px solid var(--border);
844
+ border-radius: var(--radius);
845
+ }
846
+
847
+ .stat-value {
848
+ font-size: var(--text-xl);
849
+ line-height: var(--text-xl-lh);
850
+ font-weight: 600;
851
+ color: var(--fg);
852
+ }
853
+
854
+ .stat-label {
855
+ font-size: var(--text-xs);
856
+ color: var(--fg-faint);
857
+ }
858
+
859
+ .status {
860
+ display: inline-flex;
861
+ align-items: center;
862
+ gap: var(--space-xs);
863
+ font-size: var(--text-xs);
864
+ padding: 2px var(--space-sm);
865
+ border-radius: 9999px;
866
+ background: var(--bg-alt);
867
+ border: 1px solid var(--border);
868
+ }
869
+
870
+ .status-dot {
871
+ width: 6px;
872
+ height: 6px;
873
+ border-radius: 50%;
874
+ background: currentColor;
875
+ }
876
+
877
+ .status-active {
878
+ color: var(--success-fg);
879
+ }
880
+
881
+ .status-inactive {
882
+ color: var(--fg-faint);
883
+ }
884
+
885
+ .status-error {
886
+ color: var(--error-fg);
887
+ }
888
+
889
+ .status-pending {
890
+ color: var(--warning-fg);
891
+ }
892
+
893
+ .empty {
894
+ display: flex;
895
+ flex-direction: column;
896
+ align-items: center;
897
+ text-align: center;
898
+ padding: var(--space-xl) var(--space-md);
899
+ color: var(--fg-faint);
900
+ }
901
+
902
+ .empty-icon {
903
+ margin-bottom: var(--space-md);
904
+ opacity: 0.5;
905
+ }
906
+
907
+ .empty-title {
908
+ font-size: var(--text-lg);
909
+ line-height: var(--text-lg-lh);
910
+ font-weight: 500;
911
+ color: var(--fg-muted);
912
+ margin-bottom: var(--space-sm);
913
+ }
914
+
915
+ .empty-description {
916
+ font-size: var(--text-sm);
917
+ line-height: var(--text-sm-lh);
918
+ max-width: 400px;
919
+ margin-bottom: var(--space-md);
920
+ }
921
+
922
+ .spinner {
923
+ width: 16px;
924
+ height: 16px;
925
+ border: 2px solid var(--border);
926
+ border-top-color: var(--accent);
927
+ border-radius: 50%;
928
+ animation: spin 0.8s linear infinite;
929
+ }
930
+
931
+ .spinner-sm {
932
+ width: 12px;
933
+ height: 12px;
934
+ border-width: 1.5px;
935
+ }
936
+
937
+ .spinner-lg {
938
+ width: 24px;
939
+ height: 24px;
940
+ border-width: 3px;
941
+ }
942
+
943
+ .chevron {
944
+ transition: transform var(--transition);
945
+ color: var(--fg-faint);
946
+ }
947
+
948
+ .chevron.active {
949
+ transform: rotate(90deg);
950
+ }
951
+
952
+ .chevron-down {
953
+ transform: rotate(90deg);
954
+ }
955
+
956
+ .chevron-down.active {
957
+ transform: rotate(180deg);
958
+ }
959
+
960
+ .dropdown-menu {
961
+ position: absolute;
962
+ top: calc(100% + var(--space-xs));
963
+ right: 0;
964
+ min-width: 100%;
965
+ background: var(--bg);
966
+ border: 1px solid var(--border);
967
+ border-radius: var(--radius-lg);
968
+ box-shadow: var(--shadow-lg);
969
+ padding: var(--space-xs) 0;
970
+ z-index: 100;
971
+ }
972
+
973
+ .dropdown-item {
974
+ display: flex;
975
+ align-items: center;
976
+ gap: var(--space-sm);
977
+ width: 100%;
978
+ padding: var(--space-sm);
979
+ padding-left: calc(var(--space-sm) + 2px);
980
+ font-size: var(--text-sm);
981
+ color: var(--fg-muted);
982
+ background: transparent;
983
+ border: none;
984
+ border-left: 2px solid transparent;
985
+ cursor: pointer;
986
+ text-align: left;
987
+ transition: border-color var(--transition), color var(--transition);
988
+ }
989
+
990
+ .dropdown-item:hover {
991
+ border-left-color: var(--accent);
992
+ color: var(--fg);
993
+ }
994
+
995
+ .dropdown {
996
+ position: relative;
997
+ display: inline-block;
998
+ }
999
+
1000
+ .dropdown-trigger {
1001
+ display: inline-flex;
1002
+ }
1003
+
1004
+ .dropdown-item.active {
1005
+ color: var(--fg);
1006
+ font-weight: 500;
1007
+ }
1008
+
1009
+ .dropdown-divider {
1010
+ height: 1px;
1011
+ background: var(--border);
1012
+ margin: var(--space-xs) 0;
1013
+ }
1014
+
1015
+ .clamp {
1016
+ display: flex;
1017
+ flex-direction: column;
1018
+ gap: var(--space-xs);
1019
+ }
1020
+
1021
+ .clamp-content {
1022
+ line-height: 1.5;
1023
+ }
1024
+
1025
+ .clamp-clamped {
1026
+ display: -webkit-box;
1027
+ -webkit-line-clamp: var(--clamp-lines, 3);
1028
+ -webkit-box-orient: vertical;
1029
+ overflow: hidden;
1030
+ }
1031
+
1032
+ .clamp-toggle {
1033
+ background: none;
1034
+ border: none;
1035
+ padding: 0;
1036
+ font-size: var(--text-sm);
1037
+ color: var(--accent);
1038
+ cursor: pointer;
1039
+ width: fit-content;
1040
+ transition: filter var(--transition);
1041
+ }
1042
+
1043
+ .clamp-toggle:hover {
1044
+ filter: var(--hover-filter);
1045
+ }
1046
+
1047
+ .collapsible {
1048
+ display: flex;
1049
+ flex-direction: column;
1050
+ }
1051
+
1052
+ .collapsible-trigger {
1053
+ display: flex;
1054
+ align-items: center;
1055
+ justify-content: space-between;
1056
+ gap: var(--space-sm);
1057
+ width: 100%;
1058
+ padding: var(--space-sm) 0;
1059
+ background: none;
1060
+ border: none;
1061
+ cursor: pointer;
1062
+ font-size: var(--text-sm);
1063
+ font-weight: 500;
1064
+ color: var(--fg-muted);
1065
+ text-align: left;
1066
+ transition: color var(--transition);
1067
+ }
1068
+
1069
+ .collapsible-trigger:hover {
1070
+ color: var(--fg);
1071
+ }
1072
+
1073
+ .collapsible-chevron {
1074
+ flex-shrink: 0;
1075
+ color: var(--fg-faint);
1076
+ transition: transform var(--transition);
1077
+ }
1078
+
1079
+ .collapsible-chevron.active {
1080
+ transform: rotate(90deg);
1081
+ }
1082
+
1083
+ .collapsible-content {
1084
+ padding: var(--space-sm) 0;
1085
+ }
1086
+
1087
+ /* Shared vertical connector pattern - used by Stepper and Timeline */
1088
+ .vertical-connector {
1089
+ position: absolute;
1090
+ left: 16px;
1091
+ top: 32px;
1092
+ bottom: 0;
1093
+ width: 1px;
1094
+ background: var(--border);
1095
+ }
1096
+
1097
+ .vertical-connector-item:last-child .vertical-connector {
1098
+ display: none;
1099
+ }
1100
+
1101
+ .vertical-indicator {
1102
+ display: flex;
1103
+ align-items: center;
1104
+ justify-content: center;
1105
+ width: 32px;
1106
+ height: 32px;
1107
+ flex-shrink: 0;
1108
+ position: relative;
1109
+ z-index: 1;
1110
+ }
1111
+
1112
+ .vertical-content {
1113
+ display: flex;
1114
+ flex-direction: column;
1115
+ gap: 2px;
1116
+ padding-bottom: var(--space-md);
1117
+ min-width: 0;
1118
+ flex: 1;
1119
+ }
1120
+
1121
+ .vertical-connector-item:last-child .vertical-content {
1122
+ padding-bottom: 0;
1123
+ }
1124
+
1125
+ .stepper {
1126
+ display: flex;
1127
+ }
1128
+
1129
+ .stepper-horizontal {
1130
+ flex-direction: row;
1131
+ align-items: flex-start;
1132
+ }
1133
+
1134
+ .stepper-vertical {
1135
+ flex-direction: column;
1136
+ }
1137
+
1138
+ .step {
1139
+ display: flex;
1140
+ align-items: flex-start;
1141
+ gap: var(--space-sm);
1142
+ flex: 1;
1143
+ position: relative;
1144
+ }
1145
+
1146
+ .stepper-vertical .step {
1147
+ flex-direction: row;
1148
+ }
1149
+
1150
+ .stepper-horizontal .step {
1151
+ flex-direction: column;
1152
+ align-items: center;
1153
+ text-align: center;
1154
+ }
1155
+
1156
+ .step-indicator {
1157
+ display: flex;
1158
+ align-items: center;
1159
+ justify-content: center;
1160
+ width: 32px;
1161
+ height: 32px;
1162
+ flex-shrink: 0;
1163
+ border-radius: 50%;
1164
+ font-size: var(--text-sm);
1165
+ line-height: var(--text-sm-lh);
1166
+ background: transparent;
1167
+ color: var(--fg-faint);
1168
+ border: 1px solid var(--border);
1169
+ }
1170
+
1171
+ .step-current .step-indicator {
1172
+ color: var(--accent);
1173
+ border-color: var(--accent);
1174
+ }
1175
+
1176
+ .step-completed .step-indicator {
1177
+ color: var(--success-fg);
1178
+ border-color: var(--success);
1179
+ }
1180
+
1181
+ .step-connector {
1182
+ position: absolute;
1183
+ background: var(--border);
1184
+ }
1185
+
1186
+ .stepper-horizontal .step-connector {
1187
+ top: 16px;
1188
+ left: calc(50% + 16px);
1189
+ right: calc(-50% + 16px);
1190
+ height: 1px;
1191
+ }
1192
+
1193
+ .stepper-horizontal .step:last-child .step-connector {
1194
+ display: none;
1195
+ }
1196
+
1197
+ .step-completed .step-connector {
1198
+ background: var(--success);
1199
+ }
1200
+
1201
+ .step-content {
1202
+ width: 100%;
1203
+ padding-top: var(--space-sm);
1204
+ }
1205
+
1206
+ .step-title {
1207
+ font-size: var(--text-sm);
1208
+ line-height: var(--text-sm-lh);
1209
+ font-weight: 500;
1210
+ color: var(--fg);
1211
+ }
1212
+
1213
+ .step-current .step-title {
1214
+ color: var(--fg);
1215
+ }
1216
+
1217
+ .step-completed .step-title {
1218
+ color: var(--fg-muted);
1219
+ }
1220
+
1221
+ .step-upcoming .step-title {
1222
+ color: var(--fg-faint);
1223
+ }
1224
+
1225
+ .step-description {
1226
+ font-size: var(--text-sm);
1227
+ line-height: var(--text-sm-lh);
1228
+ color: var(--fg-muted);
1229
+ }
1230
+
1231
+ /* Tabs */
1232
+ .tabs {
1233
+ display: flex;
1234
+ flex-direction: column;
1235
+ }
1236
+
1237
+ .tab-list {
1238
+ display: flex;
1239
+ gap: 0;
1240
+ border-bottom: 1px solid var(--border);
1241
+ position: relative;
1242
+ }
1243
+
1244
+ .tab {
1245
+ padding: var(--space-sm) var(--space-md);
1246
+ background: transparent;
1247
+ border: 1px solid transparent;
1248
+ border-bottom: none;
1249
+ cursor: pointer;
1250
+ font-size: var(--text-sm);
1251
+ color: var(--fg-muted);
1252
+ border-radius: var(--radius) var(--radius) 0 0;
1253
+ margin-bottom: -1px !important;
1254
+ transition: color var(--transition), border-color var(--transition);
1255
+ }
1256
+
1257
+ .tab:hover {
1258
+ color: var(--fg-subtle);
1259
+ }
1260
+
1261
+ .tab.active {
1262
+ background: var(--bg);
1263
+ border-color: var(--border);
1264
+ border-bottom-color: var(--bg);
1265
+ color: var(--fg);
1266
+ }
1267
+
1268
+ .tab-panel {
1269
+ padding: var(--space-md) 0;
1270
+ }
1271
+
1272
+ /* Checkbox */
1273
+ .checkbox {
1274
+ display: inline-flex;
1275
+ align-items: flex-start;
1276
+ gap: var(--space-sm);
1277
+ cursor: pointer;
1278
+ user-select: none;
1279
+ }
1280
+
1281
+ .checkbox-disabled {
1282
+ opacity: 0.5;
1283
+ cursor: not-allowed;
1284
+ }
1285
+
1286
+ .checkbox-input {
1287
+ position: absolute;
1288
+ opacity: 0;
1289
+ width: 0;
1290
+ height: 0;
1291
+ pointer-events: none;
1292
+ }
1293
+
1294
+ .checkbox-box {
1295
+ display: flex;
1296
+ align-items: center;
1297
+ justify-content: center;
1298
+ width: 1.125em;
1299
+ height: 1.125em;
1300
+ flex-shrink: 0;
1301
+ border: 1px solid var(--border);
1302
+ border-radius: var(--radius);
1303
+ background: var(--bg-alt);
1304
+ transition: border-color var(--transition), background var(--transition);
1305
+ }
1306
+
1307
+ .checkbox:hover:not(.checkbox-disabled) .checkbox-box {
1308
+ border-color: var(--fg-faint);
1309
+ }
1310
+
1311
+ .checkbox-input:focus-visible + .checkbox-box {
1312
+ outline: 2px solid var(--accent);
1313
+ outline-offset: 2px;
1314
+ }
1315
+
1316
+ .checkbox-input:checked + .checkbox-box {
1317
+ background: var(--accent);
1318
+ border-color: var(--accent);
1319
+ }
1320
+
1321
+ .checkbox-check {
1322
+ width: 0.75em;
1323
+ height: 0.75em;
1324
+ color: var(--accent-fg);
1325
+ opacity: 0;
1326
+ transform: scale(0.8);
1327
+ transition: opacity var(--transition), transform var(--transition);
1328
+ }
1329
+
1330
+ .checkbox-input:checked + .checkbox-box .checkbox-check {
1331
+ opacity: 1;
1332
+ transform: scale(1);
1333
+ }
1334
+
1335
+ .checkbox-indeterminate {
1336
+ width: 0.5em;
1337
+ height: 0.125em;
1338
+ background: var(--accent-fg);
1339
+ border-radius: 1px;
1340
+ opacity: 0;
1341
+ position: absolute;
1342
+ transition: opacity var(--transition);
1343
+ }
1344
+
1345
+ .checkbox-input:indeterminate + .checkbox-box {
1346
+ background: var(--accent);
1347
+ border-color: var(--accent);
1348
+ }
1349
+
1350
+ .checkbox-input:indeterminate + .checkbox-box .checkbox-check {
1351
+ opacity: 0;
1352
+ }
1353
+
1354
+ .checkbox-input:indeterminate + .checkbox-box .checkbox-indeterminate {
1355
+ opacity: 1;
1356
+ }
1357
+
1358
+ .checkbox-content {
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ gap: 2px;
1362
+ padding-top: 1px;
1363
+ }
1364
+
1365
+ .checkbox-label {
1366
+ font-size: var(--text-sm);
1367
+ line-height: var(--text-sm-lh);
1368
+ color: var(--fg);
1369
+ }
1370
+
1371
+ .checkbox-description {
1372
+ font-size: var(--text-xs);
1373
+ line-height: var(--text-xs-lh);
1374
+ color: var(--fg-muted);
1375
+ }
1376
+
1377
+ /* Toggle */
1378
+ .toggle {
1379
+ display: inline-flex;
1380
+ align-items: flex-start;
1381
+ gap: var(--space-sm);
1382
+ cursor: pointer;
1383
+ }
1384
+
1385
+ .toggle-disabled {
1386
+ opacity: 0.5;
1387
+ cursor: not-allowed;
1388
+ }
1389
+
1390
+ .toggle-input {
1391
+ position: absolute;
1392
+ opacity: 0;
1393
+ width: 0;
1394
+ height: 0;
1395
+ pointer-events: none;
1396
+ }
1397
+
1398
+ .toggle-track {
1399
+ position: relative;
1400
+ width: 2.5em;
1401
+ height: 1.375em;
1402
+ background: var(--border);
1403
+ border-radius: 9999px;
1404
+ flex-shrink: 0;
1405
+ transition: background var(--transition);
1406
+ }
1407
+
1408
+ .toggle-knob {
1409
+ position: absolute;
1410
+ top: 0.125em;
1411
+ left: 0.125em;
1412
+ width: 1.125em;
1413
+ height: 1.125em;
1414
+ background: var(--bg);
1415
+ border-radius: 50%;
1416
+ box-shadow: 0 1px 3px rgb(0 0 0 / 0.2);
1417
+ transition: transform var(--transition);
1418
+ }
1419
+
1420
+ .toggle-input:checked + .toggle-track {
1421
+ background: var(--accent);
1422
+ }
1423
+
1424
+ .toggle-input:checked + .toggle-track .toggle-knob {
1425
+ transform: translateX(1.125em);
1426
+ }
1427
+
1428
+ .toggle-input:focus-visible + .toggle-track {
1429
+ outline: 2px solid var(--accent);
1430
+ outline-offset: 2px;
1431
+ }
1432
+
1433
+ .toggle-content {
1434
+ display: flex;
1435
+ flex-direction: column;
1436
+ gap: 2px;
1437
+ padding-top: 2px;
1438
+ }
1439
+
1440
+ .toggle-label {
1441
+ font-size: var(--text-sm);
1442
+ line-height: var(--text-sm-lh);
1443
+ font-weight: 500;
1444
+ color: var(--fg);
1445
+ }
1446
+
1447
+ .toggle-description {
1448
+ font-size: var(--text-sm);
1449
+ line-height: var(--text-sm-lh);
1450
+ color: var(--fg-muted);
1451
+ }
1452
+
1453
+ /* Toggle small variant */
1454
+ .toggle-sm .toggle-track {
1455
+ width: 2em;
1456
+ height: 1.125em;
1457
+ }
1458
+
1459
+ .toggle-sm .toggle-knob {
1460
+ width: 0.875em;
1461
+ height: 0.875em;
1462
+ }
1463
+
1464
+ .toggle-sm .toggle-input:checked + .toggle-track .toggle-knob {
1465
+ transform: translateX(0.875em);
1466
+ }
1467
+
1468
+ /* FormField */
1469
+ .form-field {
1470
+ display: flex;
1471
+ flex-direction: column;
1472
+ gap: var(--space-xs);
1473
+ }
1474
+
1475
+ .form-field-label {
1476
+ display: block;
1477
+ font-size: var(--text-sm);
1478
+ font-weight: 500;
1479
+ color: var(--fg-muted);
1480
+ }
1481
+
1482
+ .form-field-required {
1483
+ color: var(--error-fg);
1484
+ margin-left: var(--space-xs);
1485
+ }
1486
+
1487
+ .form-field-description {
1488
+ font-size: var(--text-xs);
1489
+ line-height: var(--text-xs-lh);
1490
+ color: var(--fg-faint);
1491
+ }
1492
+
1493
+ .form-field-error {
1494
+ font-size: var(--text-sm);
1495
+ color: var(--error-fg);
1496
+ }
1497
+
1498
+ /* Timeline */
1499
+ .timeline {
1500
+ display: flex;
1501
+ flex-direction: column;
1502
+ }
1503
+
1504
+ .timeline-item {
1505
+ display: flex;
1506
+ gap: var(--space-sm);
1507
+ position: relative;
1508
+ }
1509
+
1510
+ .timeline-indicator {
1511
+ color: var(--fg-muted);
1512
+ }
1513
+
1514
+ .timeline-dot {
1515
+ width: 10px;
1516
+ height: 10px;
1517
+ border-radius: 50%;
1518
+ background: var(--border);
1519
+ border: 2px solid var(--bg);
1520
+ box-shadow: 0 0 0 2px var(--border);
1521
+ }
1522
+
1523
+ .timeline-content {
1524
+ padding-top: var(--space-xs);
1525
+ }
1526
+
1527
+ .timeline-title {
1528
+ font-size: var(--text-sm);
1529
+ line-height: var(--text-sm-lh);
1530
+ font-weight: 500;
1531
+ color: var(--fg);
1532
+ }
1533
+
1534
+ .timeline-description {
1535
+ font-size: var(--text-sm);
1536
+ line-height: var(--text-sm-lh);
1537
+ color: var(--fg-muted);
1538
+ }
1539
+
1540
+ .timeline-timestamp {
1541
+ font-size: var(--text-xs);
1542
+ line-height: var(--text-xs-lh);
1543
+ color: var(--fg-faint);
1544
+ }
1545
+
1546
+ /* Timeline variants */
1547
+ .timeline-item-success .timeline-indicator {
1548
+ color: var(--success-fg);
1549
+ }
1550
+
1551
+ .timeline-item-success .timeline-dot {
1552
+ background: var(--success);
1553
+ box-shadow: 0 0 0 2px var(--success);
1554
+ }
1555
+
1556
+ .timeline-item-error .timeline-indicator {
1557
+ color: var(--error-fg);
1558
+ }
1559
+
1560
+ .timeline-item-error .timeline-dot {
1561
+ background: var(--error);
1562
+ box-shadow: 0 0 0 2px var(--error);
1563
+ }
1564
+
1565
+ .timeline-item-warning .timeline-indicator {
1566
+ color: var(--warning-fg);
1567
+ }
1568
+
1569
+ .timeline-item-warning .timeline-dot {
1570
+ background: var(--warning);
1571
+ box-shadow: 0 0 0 2px var(--warning);
1572
+ }
1573
+
1574
+ .timeline-item-info .timeline-indicator {
1575
+ color: var(--info-fg);
1576
+ }
1577
+
1578
+ .timeline-item-info .timeline-dot {
1579
+ background: var(--info);
1580
+ box-shadow: 0 0 0 2px var(--info);
1581
+ }
1582
+ }