@letsprogram/ng-oat 0.1.4 → 0.1.6

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.
@@ -28,6 +28,10 @@
28
28
  -webkit-font-smoothing: antialiased;
29
29
  }
30
30
 
31
+ main {
32
+ padding-block-start: var(--space-8);
33
+ }
34
+
31
35
  img, picture, video, canvas, svg {
32
36
  max-width: 100%;
33
37
  }
@@ -38,7 +42,9 @@
38
42
 
39
43
  h1, h2, h3, h4, h5, h6 {
40
44
  font-weight: var(--font-semibold);
41
- line-height: 1.25;
45
+ line-height: var(--leading-tight);
46
+ text-wrap: balance;
47
+ letter-spacing: var(--tracking-tight);
42
48
 
43
49
  &:first-child {
44
50
  margin-block-start: 0;
@@ -76,6 +82,9 @@
76
82
  }
77
83
 
78
84
  p {
85
+ font-size: var(--text-regular);
86
+ line-height: var(--leading-normal);
87
+ text-wrap: pretty;
79
88
  margin-block-end: var(--space-4);
80
89
 
81
90
  &:last-child {
@@ -179,6 +188,96 @@
179
188
  opacity: 0.5;
180
189
  cursor: not-allowed;
181
190
  }
191
+
192
+ /* ── Prose — long-form rich-text content ───────────────────────────── */
193
+ .prose {
194
+ --prose-body: var(--foreground);
195
+ --prose-heading: var(--foreground);
196
+ --prose-muted: var(--muted-foreground);
197
+ --prose-link: var(--primary);
198
+
199
+ font-size: var(--text-regular);
200
+ line-height: var(--leading-relaxed);
201
+ color: var(--prose-body);
202
+ max-width: 65ch;
203
+
204
+ > * + * {
205
+ margin-block-start: var(--space-5);
206
+ }
207
+
208
+ h1, h2, h3, h4, h5, h6 {
209
+ color: var(--prose-heading);
210
+ letter-spacing: var(--tracking-tight);
211
+ }
212
+
213
+ h1 { margin-block-start: 0; }
214
+ h2 { margin-block-start: var(--space-10); }
215
+ h3 { margin-block-start: var(--space-8); }
216
+ h4, h5, h6 { margin-block-start: var(--space-6); }
217
+
218
+ a {
219
+ color: var(--prose-link);
220
+ text-decoration-color: rgb(from var(--prose-link) r g b / 0.4);
221
+ text-underline-offset: 3px;
222
+ transition: text-decoration-color var(--transition-fast);
223
+
224
+ &:hover {
225
+ text-decoration-color: currentColor;
226
+ }
227
+ }
228
+
229
+ p {
230
+ text-wrap: pretty;
231
+ }
232
+
233
+ :is(ul, ol) {
234
+ padding-inline-start: var(--space-6);
235
+ }
236
+
237
+ li {
238
+ margin-block-end: var(--space-2);
239
+ }
240
+
241
+ blockquote {
242
+ border-inline-start: 3px solid var(--border);
243
+ padding-inline-start: var(--space-5);
244
+ color: var(--prose-muted);
245
+ font-style: italic;
246
+ }
247
+
248
+ img, video {
249
+ border-radius: var(--radius-medium);
250
+ }
251
+
252
+ code {
253
+ font-size: 0.875em;
254
+ }
255
+
256
+ pre {
257
+ font-size: var(--text-7);
258
+ line-height: var(--leading-relaxed);
259
+ }
260
+
261
+ hr {
262
+ margin-block: var(--space-8);
263
+ }
264
+
265
+ table {
266
+ font-size: var(--text-7);
267
+ }
268
+
269
+ figcaption {
270
+ text-align: center;
271
+ font-size: var(--text-7);
272
+ color: var(--prose-muted);
273
+ margin-block-start: var(--space-2);
274
+ }
275
+ }
276
+
277
+ /* Prose width variants */
278
+ .prose-sm { max-width: 45ch; font-size: var(--text-7); }
279
+ .prose-lg { max-width: 75ch; }
280
+ .prose-full { max-width: none; }
182
281
  }
183
282
  @layer theme {
184
283
  :root {
@@ -207,46 +306,70 @@
207
306
  --input: light-dark(#d4d4d8, #52525b);
208
307
  --ring: light-dark(#574747, #d4d4d8);
209
308
 
210
- /* ==================== */
309
+ /* ── Breakpoints ──────────────────────────────────────────────────────── */
310
+ --breakpoint-sm: 640px;
311
+ --breakpoint-md: 768px;
312
+ --breakpoint-lg: 1024px;
313
+ --breakpoint-xl: 1280px;
314
+
315
+ /* ── Spacing (fluid) ─────────────────────────────────────────────────── */
211
316
  --space-1: 0.25rem;
212
317
  --space-2: 0.5rem;
213
- --space-3: 0.75rem;
214
- --space-4: 1rem;
215
- --space-5: 1.25rem;
216
- --space-6: 1.5rem;
217
- --space-8: 2rem;
218
- --space-10: 2.5rem;
318
+ --space-3: clamp(0.5rem, 1.5vw, 0.75rem);
319
+ --space-4: clamp(0.5rem, 2vw, 1rem);
320
+ --space-5: clamp(0.75rem, 2.5vw, 1.25rem);
321
+ --space-6: clamp(0.75rem, 3vw, 1.5rem);
322
+ --space-8: clamp(1rem, 4vw, 2rem);
323
+ --space-10: clamp(1.5rem, 5vw, 2.5rem);
219
324
  --space-12: 3rem;
220
325
  --space-14: 3.5rem;
221
326
  --space-16: 4rem;
222
327
  --space-18: 4.5rem;
223
328
 
329
+ /* ── Border radius (fluid) ───────────────────────────────────────────── */
224
330
  --radius-small: 0.125rem;
225
- --radius-medium: 0.375rem;
226
- --radius-large: 0.75rem;
331
+ --radius-medium: clamp(0.25rem, 0.8vw, 0.375rem);
332
+ --radius-large: clamp(0.5rem, 1.5vw, 0.75rem);
227
333
  --radius-full: 9999px;
228
334
 
229
335
  --bar-height: 0.5rem;
230
336
 
337
+ /* ── Fonts ────────────────────────────────────────────────────────────── */
231
338
  --font-sans: system-ui, sans-serif;
232
339
  --font-mono: ui-monospace, Consolas, monospace;
233
340
 
341
+ /* ── Typography (fluid clamp) ────────────────────────────────────────── */
234
342
  --text-1: clamp(1.75rem, 1.5rem + 1.1vw, 2.25rem);
235
343
  --text-2: clamp(1.5rem, 1.3rem + 0.8vw, 1.875rem);
236
344
  --text-3: clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem);
237
345
  --text-4: clamp(1.125rem, 1.05rem + 0.3vw, 1.25rem);
238
- --text-5: 1.125rem;
346
+ --text-5: clamp(1rem, 1rem + 0.3vw, 1.125rem);
239
347
  --text-6: 1rem;
240
- --text-7: 0.875rem;
241
- --text-8: 0.75rem;
242
- --text-regular: var(--text-6);
243
-
244
- --leading-normal: 1.5;
245
-
348
+ --text-7: clamp(0.8125rem, 0.8rem + 0.2vw, 0.875rem);
349
+ --text-8: clamp(0.6875rem, 0.65rem + 0.2vw, 0.75rem);
350
+ --text-regular: clamp(1rem, 1rem + 0.15vw, 1.125rem);
351
+
352
+ /* ── Line-height ─────────────────────────────────────────────────────── */
353
+ --leading-none: 1;
354
+ --leading-tight: 1.25;
355
+ --leading-snug: 1.375;
356
+ --leading-normal: clamp(1.5, 1.45 + 0.3vw, 1.6);
357
+ --leading-relaxed: 1.625;
358
+ --leading-loose: 2;
359
+
360
+ /* ── Letter-spacing ──────────────────────────────────────────────────── */
361
+ --tracking-tighter: -0.05em;
362
+ --tracking-tight: -0.025em;
363
+ --tracking-normal: 0em;
364
+ --tracking-wide: 0.025em;
365
+ --tracking-wider: 0.05em;
366
+ --tracking-widest: 0.1em;
367
+
368
+ /* ── Font weight ─────────────────────────────────────────────────────── */
246
369
  --font-normal: 400;
247
370
  --font-medium: 500;
248
371
  --font-semibold: 600;
249
- --font-bold: 600;
372
+ --font-bold: 700;
250
373
 
251
374
  --shadow-small: 0 1px 2px 0 rgb(0 0 0 / 0.05);
252
375
  --shadow-medium: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
@@ -318,149 +441,6 @@
318
441
  }
319
442
  }
320
443
  }
321
- @layer base {
322
- :is(button, [type=submit], [type=reset], [type=button], a.button), ::file-selector-button {
323
- --_hov: color-mix(in srgb, var(--primary), white 25%);
324
-
325
- display: inline-flex;
326
- align-items: center;
327
- justify-content: center;
328
- gap: var(--space-2);
329
- padding: var(--space-2) var(--space-4);
330
- font-size: var(--text-7);
331
- font-weight: var(--font-medium);
332
- line-height: var(--leading-normal);
333
- white-space: nowrap;
334
- text-decoration: none;
335
- background-color: var(--primary);
336
- color: var(--primary-foreground);
337
- border-radius: var(--radius-medium);
338
- border: 1px solid;
339
- border-color: rgb(from #fff r g b / 0.15) rgb(from #000 r g b / 0.2) rgb(from #000 r g b / 0.2) rgb(from #fff r g b / 0.15);
340
- transition: background-color var(--transition-fast), opacity var(--transition-fast), transform var(--transition-fast);
341
-
342
- &:not(:disabled) {
343
- cursor: pointer;
344
- }
345
-
346
- &:hover:not(:disabled) {
347
- background-color: var(--_hov);
348
- }
349
-
350
- &:active:not(:disabled) {
351
- transform: translate(1px, 1px);
352
- }
353
-
354
- &[data-variant="secondary"] {
355
- --_hov: color-mix(in srgb, var(--secondary), black 10%);
356
- background-color: var(--secondary);
357
- color: var(--secondary-foreground);
358
- border-color: rgb(from #fff r g b / 0.5) rgb(from #000 r g b / 0.1) rgb(from #000 r g b / 0.1) rgb(from #fff r g b / 0.5);
359
- }
360
-
361
- &[data-variant="danger"] {
362
- --_hov: color-mix(in srgb, var(--danger), black 15%);
363
- background-color: var(--danger);
364
- color: var(--danger-foreground);
365
- }
366
-
367
- &:is(.outline, .ghost) {
368
- --_hov: var(--accent);
369
- background-color: transparent;
370
- color: var(--foreground);
371
-
372
- &[data-variant="danger"] {
373
- --_hov: color-mix(in srgb, var(--danger), transparent 90%);
374
- color: var(--danger);
375
- }
376
-
377
- &[data-variant="secondary"] {
378
- --_hov: color-mix(in srgb, var(--secondary), transparent 80%);
379
- color: var(--secondary-foreground);
380
- }
381
- }
382
-
383
- &.outline {
384
- border-color: var(--border);
385
-
386
- &[data-variant="danger"] {
387
- border-color: var(--danger);
388
- }
389
-
390
- &[data-variant="secondary"] {
391
- border-color: var(--secondary);
392
- }
393
- }
394
-
395
- &.ghost {
396
- /* Same as .outline but no border. */
397
- border-color: transparent;
398
- }
399
-
400
- &.small {
401
- padding: var(--space-1) var(--space-3);
402
- font-size: var(--text-8);
403
- }
404
-
405
- &.large {
406
- height: 3rem;
407
- padding: 0 var(--space-6);
408
- font-size: var(--text-regular);
409
- }
410
-
411
- &.icon {
412
- width: 2.5rem;
413
- padding: 0;
414
-
415
- &.small {
416
- width: 2rem;
417
- }
418
-
419
- &.large {
420
- width: 3rem;
421
- }
422
- }
423
- }
424
-
425
- ::file-selector-button {
426
- background-color: transparent;
427
- color: var(--foreground);
428
- border: 1px solid var(--border);
429
- }
430
- ::file-selector-button:hover {
431
- /* pseudoelement:hover can't be nested and has to be a separate block. */
432
- background-color: var(--accent);
433
- }
434
- }
435
-
436
- @layer components {
437
- menu.buttons {
438
- list-style-type: none;
439
- padding-inline-start: 0;
440
- display: inline-flex;
441
-
442
- /* In menu.buttons, <li> children are expected to have just one child, which is a button/or a.button */
443
- & > li {
444
- &:first-child > * {
445
- border-start-start-radius: var(--radius-medium);
446
- border-end-start-radius: var(--radius-medium);
447
- }
448
-
449
- &:last-child > * {
450
- border-start-end-radius: var(--radius-medium);
451
- border-end-end-radius: var(--radius-medium);
452
- }
453
-
454
- & > * {
455
- border-radius: 0;
456
- }
457
-
458
- &:not(:last-child) > * {
459
- border-inline-end: 1px solid rgb(from var(--primary-foreground) r g b / 0.2);
460
- }
461
- }
462
- }
463
- }
464
444
  @layer base {
465
445
  label {
466
446
  display: block;
@@ -664,7 +644,7 @@
664
644
  & > :is(input, textarea, select) {
665
645
  flex: 1;
666
646
  margin-block-start: 0;
667
-
647
+
668
648
  &:not(:focus) {
669
649
  border-inline-end-color: transparent;
670
650
  }
@@ -675,7 +655,7 @@
675
655
  &:first-child {
676
656
  border-radius: var(--radius-medium) 0 0 var(--radius-medium);
677
657
  }
678
-
658
+
679
659
  &:last-child {
680
660
  border-radius: 0 var(--radius-medium) var(--radius-medium) 0;
681
661
  }
@@ -719,240 +699,145 @@
719
699
  }
720
700
  }
721
701
  @layer base {
722
- /* Container to get horizontal scroll on small screens. */
723
- .table {
724
- min-width: 320px;
725
- width: 100%;
726
- overflow-x: auto;
727
- }
702
+ :is(button, [type=submit], [type=reset], [type=button], a.button), ::file-selector-button {
703
+ --_hov: color-mix(in srgb, var(--primary), white 25%);
728
704
 
729
- table {
730
- border-collapse: collapse;
731
- width: 100%;
705
+ display: inline-flex;
706
+ align-items: center;
707
+ justify-content: center;
708
+ gap: var(--space-2);
709
+ padding: var(--space-2) var(--space-4);
732
710
  font-size: var(--text-7);
733
- }
734
-
735
- thead {
736
- border-bottom: 1px solid var(--border);
737
- }
738
-
739
- th, td {
740
- overflow-wrap: break-word;
741
- }
742
-
743
- th {
744
- padding: var(--space-3) var(--space-2);
745
- text-align: start;
746
711
  font-weight: var(--font-medium);
747
- color: var(--muted-foreground);
748
- }
749
-
750
- td {
751
- padding: var(--space-3) var(--space-2);
752
- }
712
+ line-height: var(--leading-normal);
713
+ white-space: nowrap;
714
+ text-decoration: none;
715
+ background-color: var(--primary);
716
+ color: var(--primary-foreground);
717
+ border-radius: var(--radius-medium);
718
+ border: 1px solid;
719
+ border-color: rgb(from #fff r g b / 0.15) rgb(from #000 r g b / 0.2) rgb(from #000 r g b / 0.2) rgb(from #fff r g b / 0.15);
720
+ transition: background-color var(--transition-fast), opacity var(--transition-fast), transform var(--transition-fast);
753
721
 
754
- tbody tr {
755
- border-bottom: 1px solid var(--border);
756
- transition: background-color var(--transition-fast);
722
+ &:not(:disabled) {
723
+ cursor: pointer;
724
+ }
757
725
 
758
- &:last-child {
759
- border-bottom: none;
726
+ &:hover:not(:disabled) {
727
+ background-color: var(--_hov);
760
728
  }
761
729
 
762
- &:hover {
763
- background-color: rgb(from var(--muted) r g b / 0.5);
764
- }
765
- }
766
- }
767
- @layer base {
768
- progress {
769
- appearance: none;
770
- width: 100%;
771
- height: var(--bar-height);
772
- border: none;
773
- border-radius: var(--radius-full);
774
- overflow: hidden;
775
- background-color: var(--muted);
776
-
777
- &::-webkit-progress-bar {
778
- background-color: var(--muted);
779
- border-radius: var(--radius-full);
780
- }
781
-
782
- &::-webkit-progress-value {
783
- background-color: var(--primary);
784
- border-radius: var(--radius-full);
785
- transition: width var(--transition);
730
+ &:active:not(:disabled) {
731
+ transform: translate(1px, 1px);
786
732
  }
787
733
 
788
- &::-moz-progress-bar {
789
- background-color: var(--primary);
790
- border-radius: var(--radius-full);
734
+ &[data-variant="secondary"] {
735
+ --_hov: color-mix(in srgb, var(--secondary), black 10%);
736
+ background-color: var(--secondary);
737
+ color: var(--secondary-foreground);
738
+ border-color: rgb(from #fff r g b / 0.5) rgb(from #000 r g b / 0.1) rgb(from #000 r g b / 0.1) rgb(from #fff r g b / 0.5);
791
739
  }
792
- }
793
-
794
- meter {
795
- appearance: none;
796
- width: 100%;
797
- height: var(--bar-height);
798
- border: none;
799
- border-radius: var(--radius-full);
800
- overflow: hidden;
801
- background: var(--muted);
802
740
 
803
- &::-webkit-meter-bar {
804
- background: var(--muted);
805
- border: none;
806
- border-radius: var(--radius-full);
807
- height: var(--bar-height);
741
+ &[data-variant="danger"] {
742
+ --_hov: color-mix(in srgb, var(--danger), black 15%);
743
+ background-color: var(--danger);
744
+ color: var(--danger-foreground);
808
745
  }
809
746
 
810
- &::-webkit-meter-optimum-value,
811
- &::-webkit-meter-suboptimum-value,
812
- &::-webkit-meter-even-less-good-value {
813
- border-radius: var(--radius-full);
814
- }
747
+ &:is(.outline, .ghost) {
748
+ --_hov: var(--accent);
749
+ background-color: transparent;
750
+ color: var(--foreground);
815
751
 
816
- &::-webkit-meter-optimum-value {
817
- background: var(--success);
818
- }
752
+ &[data-variant="danger"] {
753
+ --_hov: color-mix(in srgb, var(--danger), transparent 90%);
754
+ color: var(--danger);
755
+ }
819
756
 
820
- &::-webkit-meter-suboptimum-value {
821
- background: var(--warning);
757
+ &[data-variant="secondary"] {
758
+ --_hov: color-mix(in srgb, var(--secondary), transparent 80%);
759
+ color: var(--secondary-foreground);
760
+ }
822
761
  }
823
762
 
824
- &::-webkit-meter-even-less-good-value {
825
- background: var(--danger);
826
- }
763
+ &.outline {
764
+ border-color: var(--border);
827
765
 
828
- &::-moz-meter-bar {
829
- background: var(--success);
830
- border-radius: var(--radius-full);
831
- }
766
+ &[data-variant="danger"] {
767
+ border-color: var(--danger);
768
+ }
832
769
 
833
- &:-moz-meter-sub-optimum::-moz-meter-bar {
834
- background: var(--warning);
770
+ &[data-variant="secondary"] {
771
+ border-color: var(--secondary);
772
+ }
835
773
  }
836
774
 
837
- &:-moz-meter-sub-sub-optimum::-moz-meter-bar {
838
- background: var(--danger);
839
- }
840
- }
841
- }
842
- @layer components {
843
- [aria-busy="true"] {
844
- &::before {
845
- content: "";
846
- display: inline-block;
847
- inset: 0;
848
- margin: auto;
849
- width: 1.5rem;
850
- height: 1.5rem;
851
- border: 2px solid var(--muted);
852
- border-top-color: var(--primary);
853
- border-radius: var(--radius-full);
854
- animation: spin 1s linear infinite;
855
- text-align: center;
775
+ &.ghost {
776
+ /* Same as .outline but no border. */
777
+ border-color: transparent;
856
778
  }
857
779
 
858
- &[data-spinner~="small"]::before {
859
- width: 1rem;
860
- height: 1rem;
780
+ &.small {
781
+ padding: var(--space-1) var(--space-3);
782
+ font-size: var(--text-8);
861
783
  }
862
784
 
863
- &[data-spinner~="large"]::before {
864
- width: 2rem;
865
- height: 2rem;
866
- border-width: 3px;
785
+ &.large {
786
+ height: 3rem;
787
+ padding: 0 var(--space-6);
788
+ font-size: var(--text-regular);
867
789
  }
868
790
 
869
- &[data-spinner~="overlay"] {
870
- position: relative;
871
-
872
- > * {
873
- opacity: 0.3;
791
+ &.icon {
792
+ width: 2.5rem;
793
+ padding: 0;
874
794
 
875
- /* "disable" all elements in the container while it's busy */
876
- pointer-events: none;
795
+ &.small {
796
+ width: 2rem;
877
797
  }
878
798
 
879
- &::before {
880
- position: absolute;
881
- inset: 0;
882
- margin: auto;
883
- z-index: 1;
799
+ &.large {
800
+ width: 3rem;
884
801
  }
885
802
  }
886
803
  }
887
804
 
888
- @keyframes spin {
889
- to {
890
- transform: rotate(360deg);
891
- }
892
- }
893
- }
894
- @layer components {
895
- :root {
896
- --grid-cols: 12;
897
- --grid-gap: 1.5rem;
898
- --container-max: 1280px;
899
- --container-pad: 1rem;
900
- }
901
-
902
- .container {
903
- width: 100%;
904
- max-width: var(--container-max);
905
- margin-inline: auto;
906
- padding-inline: var(--container-pad);
805
+ ::file-selector-button {
806
+ background-color: transparent;
807
+ color: var(--foreground);
808
+ border: 1px solid var(--border);
907
809
  }
908
-
909
- .row {
910
- display: grid;
911
- grid-template-columns: repeat(var(--grid-cols), 1fr);
912
- gap: var(--grid-gap);
913
- width: 100%;
810
+ ::file-selector-button:hover {
811
+ /* pseudoelement:hover can't be nested and has to be a separate block. */
812
+ background-color: var(--accent);
914
813
  }
814
+ }
915
815
 
916
- /* Column spans using CSS custom property */
917
- .col, [class*="col-"] { grid-column-end: span var(--span, var(--grid-cols)); }
816
+ @layer components {
817
+ menu.buttons {
818
+ list-style-type: none;
819
+ padding-inline-start: 0;
820
+ display: inline-flex;
918
821
 
919
- .col-1 { --span: 1; }
920
- .col-2 { --span: 2; }
921
- .col-3 { --span: 3; }
922
- .col-4 { --span: 4; }
923
- .col-5 { --span: 5; }
924
- .col-6 { --span: 6; }
925
- .col-7 { --span: 7; }
926
- .col-8 { --span: 8; }
927
- .col-9 { --span: 9; }
928
- .col-10 { --span: 10; }
929
- .col-11 { --span: 11; }
930
- .col-12 { --span: 12; }
822
+ /* In menu.buttons, <li> children are expected to have just one child, which is a button/or a.button */
823
+ & > li {
824
+ &:first-child > * {
825
+ border-start-start-radius: var(--radius-medium);
826
+ border-end-start-radius: var(--radius-medium);
827
+ }
931
828
 
932
- /* Offsets via grid-column-start */
933
- .offset-1 { grid-column-start: 2; }
934
- .offset-2 { grid-column-start: 3; }
935
- .offset-3 { grid-column-start: 4; }
936
- .offset-4 { grid-column-start: 5; }
937
- .offset-5 { grid-column-start: 6; }
938
- .offset-6 { grid-column-start: 7; }
829
+ &:last-child > * {
830
+ border-start-end-radius: var(--radius-medium);
831
+ border-end-end-radius: var(--radius-medium);
832
+ }
939
833
 
940
- .col-end {
941
- grid-column-start: span var(--span, 1);
942
- grid-column-end: -1;
943
- }
834
+ & > * {
835
+ border-radius: 0;
836
+ }
944
837
 
945
- /* Responsive: stack on mobile */
946
- @media (max-width: 768px) {
947
- .row {
948
- --grid-cols: 4;
949
- --grid-gap: 1rem;
950
- }
951
- .col, [class*="col-"] {
952
- --span: 4;
953
- }
954
- [class*="offset-"] {
955
- grid-column-start: auto;
838
+ &:not(:last-child) > * {
839
+ border-inline-end: 1px solid rgb(from var(--primary-foreground) r g b / 0.2);
840
+ }
956
841
  }
957
842
  }
958
843
  }
@@ -966,58 +851,41 @@
966
851
  padding: var(--space-6);
967
852
  overflow: hidden;
968
853
  }
969
- }
970
- @layer components {
971
- [role="alert"] {
972
- position: relative;
854
+
855
+ .card-header {
973
856
  display: flex;
974
- gap: var(--space-3);
975
- padding: var(--space-4) var(--space-6);
976
- background-color: var(--background);
977
- border: 1px solid var(--border);
978
- border-radius: var(--radius-medium);
857
+ flex-direction: column;
858
+ gap: var(--space-1);
859
+ margin-block-end: var(--space-4);
860
+ }
861
+
862
+ .card-title {
863
+ font-size: var(--text-4);
864
+ font-weight: var(--font-semibold);
865
+ line-height: var(--leading-tight);
866
+ letter-spacing: var(--tracking-tight);
867
+ margin: 0;
868
+ }
869
+
870
+ .card-description {
979
871
  font-size: var(--text-7);
872
+ color: var(--muted-foreground);
873
+ line-height: var(--leading-normal);
874
+ margin: 0;
875
+ }
980
876
 
981
- &[data-variant] {
982
- border: none;
983
- }
877
+ .card-content {
878
+ font-size: var(--text-regular);
879
+ line-height: var(--leading-normal);
880
+ }
984
881
 
985
- &[data-variant="error"],
986
- &[data-variant="danger"] {
987
- color: var(--danger);
988
- background-color: light-dark(
989
- color-mix(in srgb, var(--danger) 8%, transparent),
990
- color-mix(in srgb, var(--danger) 20%, transparent)
991
- );
992
-
993
- & a {
994
- color: var(--danger);
995
- }
996
- }
997
-
998
- &[data-variant="success"] {
999
- color: var(--success);
1000
- background-color: light-dark(
1001
- color-mix(in srgb, var(--success) 8%, transparent),
1002
- color-mix(in srgb, var(--success) 20%, transparent)
1003
- );
1004
-
1005
- & a {
1006
- color: var(--success);
1007
- }
1008
- }
1009
-
1010
- &[data-variant="warning"] {
1011
- color: var(--warning);
1012
- background-color: light-dark(
1013
- color-mix(in srgb, var(--warning) 8%, transparent),
1014
- color-mix(in srgb, var(--warning) 20%, transparent)
1015
- );
1016
-
1017
- & a {
1018
- color: var(--warning);
1019
- }
1020
- }
882
+ .card-footer {
883
+ display: flex;
884
+ align-items: center;
885
+ gap: var(--space-2);
886
+ margin-block-start: var(--space-4);
887
+ padding-block-start: var(--space-4);
888
+ border-top: 1px solid var(--border);
1021
889
  }
1022
890
  }
1023
891
  @layer components {
@@ -1128,49 +996,59 @@
1128
996
  }
1129
997
 
1130
998
  details > *:not(summary) {
1131
- margin: var(--space-4);
999
+ margin: clamp(var(--space-2), 3vw, var(--space-4));
1132
1000
  }
1133
1001
  }
1134
1002
  @layer components {
1135
- [role="tablist"] {
1136
- display: inline-flex;
1137
- align-items: center;
1138
- gap: var(--space-1);
1139
- padding: var(--space-1);
1140
- background-color: var(--muted);
1003
+ [role="alert"] {
1004
+ position: relative;
1005
+ display: flex;
1006
+ gap: var(--space-3);
1007
+ padding: var(--space-4) clamp(var(--space-3), 3vw, var(--space-6));
1008
+ background-color: var(--background);
1009
+ border: 1px solid var(--border);
1141
1010
  border-radius: var(--radius-medium);
1142
- }
1143
-
1144
- [role="tab"] {
1145
- display: inline-flex;
1146
- align-items: center;
1147
- justify-content: center;
1148
- padding: var(--space-2) var(--space-3);
1149
1011
  font-size: var(--text-7);
1150
- font-weight: var(--font-medium);
1151
- white-space: nowrap;
1152
- background-color: transparent;
1153
- color: var(--foreground);
1154
- border: none;
1155
- border-radius: calc(var(--radius-medium) - 2px);
1156
- cursor: pointer;
1157
- transition: background-color var(--transition-fast), color var(--transition-fast);
1158
1012
 
1159
- &:hover {
1160
- color: var(--muted-foreground);
1013
+ &[data-variant] {
1014
+ border: none;
1161
1015
  }
1162
1016
 
1163
- &[aria-selected="true"] {
1164
- background-color: var(--background);
1165
- box-shadow: var(--shadow-small);
1017
+ &[data-variant="error"],
1018
+ &[data-variant="danger"] {
1019
+ color: var(--danger);
1020
+ background-color: light-dark(
1021
+ color-mix(in srgb, var(--danger) 8%, transparent),
1022
+ color-mix(in srgb, var(--danger) 20%, transparent)
1023
+ );
1024
+
1025
+ & a {
1026
+ color: var(--danger);
1027
+ }
1166
1028
  }
1167
- }
1168
1029
 
1169
- [role="tabpanel"] {
1170
- padding: var(--space-4) 0;
1030
+ &[data-variant="success"] {
1031
+ color: var(--success);
1032
+ background-color: light-dark(
1033
+ color-mix(in srgb, var(--success) 8%, transparent),
1034
+ color-mix(in srgb, var(--success) 20%, transparent)
1035
+ );
1171
1036
 
1172
- &:focus-visible {
1173
- outline: none;
1037
+ & a {
1038
+ color: var(--success);
1039
+ }
1040
+ }
1041
+
1042
+ &[data-variant="warning"] {
1043
+ color: var(--warning);
1044
+ background-color: light-dark(
1045
+ color-mix(in srgb, var(--warning) 8%, transparent),
1046
+ color-mix(in srgb, var(--warning) 20%, transparent)
1047
+ );
1048
+
1049
+ & a {
1050
+ color: var(--warning);
1051
+ }
1174
1052
  }
1175
1053
  }
1176
1054
  }
@@ -1269,6 +1147,7 @@
1269
1147
  margin: 0;
1270
1148
  /* padding: var(--space-1); */
1271
1149
  min-width: 12rem;
1150
+ max-width: min(20rem, calc(100vw - var(--space-8)));
1272
1151
  background-color: var(--background);
1273
1152
  border: 1px solid var(--border);
1274
1153
  border-radius: var(--radius-medium);
@@ -1317,125 +1196,266 @@
1317
1196
  }
1318
1197
  }
1319
1198
  @layer components {
1320
- .toast-container {
1321
- position: fixed;
1322
- display: flex;
1323
- flex-direction: column;
1324
- pointer-events: none;
1325
- margin: 0;
1326
- padding: 0;
1327
- border: none;
1328
- background: transparent;
1199
+ :root {
1200
+ --grid-cols: 12;
1201
+ --grid-gap: 1.5rem;
1202
+ --container-max: 1280px;
1203
+ --container-pad: clamp(0.75rem, 4vw, 2rem);
1204
+ }
1329
1205
 
1330
- overflow: visible;
1206
+ .container {
1207
+ width: 100%;
1208
+ max-width: var(--container-max);
1209
+ margin-inline: auto;
1210
+ padding-inline: var(--container-pad);
1211
+ }
1331
1212
 
1332
- &::backdrop {
1333
- display: none;
1334
- }
1213
+ /* ── Classic .row grid (12-column) ─────────────────────────────────────── */
1214
+ .row {
1215
+ display: grid;
1216
+ grid-template-columns: repeat(var(--grid-cols), 1fr);
1217
+ gap: var(--grid-gap);
1218
+ width: 100%;
1219
+ }
1335
1220
 
1336
- &[data-placement="top-left"] {
1337
- inset: var(--space-4) auto auto var(--space-4);
1338
- }
1221
+ /* Column spans using CSS custom property */
1222
+ .col, [class*="col-"] { grid-column-end: span var(--span, var(--grid-cols)); }
1223
+
1224
+ .col-1 { --span: 1; }
1225
+ .col-2 { --span: 2; }
1226
+ .col-3 { --span: 3; }
1227
+ .col-4 { --span: 4; }
1228
+ .col-5 { --span: 5; }
1229
+ .col-6 { --span: 6; }
1230
+ .col-7 { --span: 7; }
1231
+ .col-8 { --span: 8; }
1232
+ .col-9 { --span: 9; }
1233
+ .col-10 { --span: 10; }
1234
+ .col-11 { --span: 11; }
1235
+ .col-12 { --span: 12; }
1339
1236
 
1340
- &[data-placement="top-center"] {
1341
- inset: var(--space-4) auto auto 50%;
1342
- transform: translateX(-50%);
1343
- }
1237
+ /* Offsets via grid-column-start */
1238
+ .offset-1 { grid-column-start: 2; }
1239
+ .offset-2 { grid-column-start: 3; }
1240
+ .offset-3 { grid-column-start: 4; }
1241
+ .offset-4 { grid-column-start: 5; }
1242
+ .offset-5 { grid-column-start: 6; }
1243
+ .offset-6 { grid-column-start: 7; }
1344
1244
 
1345
- &[data-placement="top-right"] {
1346
- inset: var(--space-4) var(--space-4) auto auto;
1347
- }
1245
+ .col-end {
1246
+ grid-column-start: span var(--span, 1);
1247
+ grid-column-end: -1;
1248
+ }
1348
1249
 
1349
- &[data-placement="bottom-left"] {
1350
- inset: auto auto var(--space-4) var(--space-4);
1351
- flex-direction: column-reverse;
1352
- }
1250
+ /* ── .grid — container-query auto-responsive grid ──────────────────────── */
1251
+ .grid {
1252
+ container-type: inline-size;
1253
+ display: grid;
1254
+ gap: var(--grid-gap);
1255
+ width: 100%;
1256
+ grid-template-columns: 1fr;
1257
+ }
1353
1258
 
1354
- &[data-placement="bottom-center"] {
1355
- inset: auto auto var(--space-4) 50%;
1356
- transform: translateX(-50%);
1357
- flex-direction: column-reverse;
1358
- }
1259
+ /* Fluid auto-fit variant: equal-width columns that wrap automatically */
1260
+ .grid-auto {
1261
+ container-type: inline-size;
1262
+ display: grid;
1263
+ gap: var(--grid-gap);
1264
+ width: 100%;
1265
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
1266
+ }
1359
1267
 
1360
- &[data-placement="bottom-right"] {
1361
- inset: auto var(--space-4) var(--space-4) auto;
1362
- flex-direction: column-reverse;
1363
- }
1268
+ /* Container-query breakpoints for .grid children */
1269
+ @container (min-width: 640px) {
1270
+ .grid { grid-template-columns: repeat(2, 1fr); }
1271
+ }
1272
+ @container (min-width: 1024px) {
1273
+ .grid { grid-template-columns: repeat(var(--grid-cols, 12), 1fr); }
1274
+ .grid > * { grid-column: span var(--span, 1); }
1364
1275
  }
1365
1276
 
1366
- .toast {
1367
- --transition: 300ms;
1368
- --transition-in: calc(var(--transition) - 50ms);
1277
+ /* Allow explicit column count override on .grid: .grid.cols-2, .grid.cols-3, etc. */
1278
+ .grid.cols-2 { --grid-cols: 2; }
1279
+ .grid.cols-3 { --grid-cols: 3; }
1280
+ .grid.cols-4 { --grid-cols: 4; }
1369
1281
 
1370
- padding: var(--space-5) var(--space-4);
1371
- max-width: 28rem;
1372
- min-width: 20rem;
1373
- pointer-events: auto;
1374
- background-color: var(--card);
1375
- border: 1px solid var(--border);
1376
- border-inline-start-width: var(--space-1);
1377
- border-inline-start-style: solid;
1378
- border-radius: var(--radius-medium);
1379
- box-shadow: var(--shadow-small);
1380
- transition: opacity var(--transition-in), transform var(--transition-in), margin var(--transition-in);
1381
- line-height: 1;
1282
+ @container (min-width: 640px) {
1283
+ .grid.cols-2, .grid.cols-3, .grid.cols-4 {
1284
+ grid-template-columns: repeat(2, 1fr);
1285
+ }
1286
+ }
1287
+ @container (min-width: 1024px) {
1288
+ .grid.cols-2 { grid-template-columns: repeat(2, 1fr); }
1289
+ .grid.cols-3 { grid-template-columns: repeat(3, 1fr); }
1290
+ .grid.cols-4 { grid-template-columns: repeat(4, 1fr); }
1291
+ }
1382
1292
 
1383
- .toast-title {
1384
- font-weight: 600;
1385
- margin: 0 0 var(--space-3) 0;
1293
+ /* ── Responsive .row breakpoints (media queries) ───────────────────────── */
1294
+ /* Mobile: stack to single column */
1295
+ @media (max-width: 639px) {
1296
+ .row {
1297
+ --grid-cols: 1;
1298
+ --grid-gap: 1rem;
1386
1299
  }
1387
- .toast-message {
1388
- color: var(--muted-foreground);
1300
+ .col, [class*="col-"] {
1301
+ --span: 1;
1389
1302
  }
1390
-
1391
- &[data-variant="success"] {
1392
- border-inline-start-color: var(--success);
1393
- .toast-title {
1394
- color: var(--success);
1395
- }
1303
+ [class*="offset-"] {
1304
+ grid-column-start: auto;
1396
1305
  }
1306
+ }
1397
1307
 
1398
- &[data-variant="danger"] {
1399
- border-inline-start-color: var(--danger);
1400
- .toast-title {
1401
- color: var(--danger);
1402
- }
1308
+ /* Small: 2-column grid */
1309
+ @media (min-width: 640px) and (max-width: 767px) {
1310
+ .row {
1311
+ --grid-cols: 4;
1312
+ --grid-gap: 1rem;
1403
1313
  }
1404
-
1405
- &[data-variant="warning"] {
1406
- border-inline-start-color: var(--warning);
1407
- .toast-title {
1408
- color: var(--warning);
1409
- }
1314
+ .col, [class*="col-"] {
1315
+ --span: 4;
1316
+ }
1317
+ [class*="offset-"] {
1318
+ grid-column-start: auto;
1410
1319
  }
1320
+ }
1411
1321
 
1412
- & > [data-close] {
1413
- margin-inline-start: auto;
1414
- background: none;
1415
- border: none;
1416
- padding: 0;
1417
- cursor: pointer;
1418
- opacity: 0.5;
1322
+ /* ── Responsive column classes (media queries for power users) ─────────── */
1323
+ /* sm: 640px+ */
1324
+ @media (min-width: 640px) {
1325
+ .sm\:col-1 { --span: 1; }
1326
+ .sm\:col-2 { --span: 2; }
1327
+ .sm\:col-3 { --span: 3; }
1328
+ .sm\:col-4 { --span: 4; }
1329
+ .sm\:col-5 { --span: 5; }
1330
+ .sm\:col-6 { --span: 6; }
1331
+ .sm\:col-7 { --span: 7; }
1332
+ .sm\:col-8 { --span: 8; }
1333
+ .sm\:col-9 { --span: 9; }
1334
+ .sm\:col-10 { --span: 10; }
1335
+ .sm\:col-11 { --span: 11; }
1336
+ .sm\:col-12 { --span: 12; }
1337
+ }
1338
+
1339
+ /* md: 768px+ */
1340
+ @media (min-width: 768px) {
1341
+ .md\:col-1 { --span: 1; }
1342
+ .md\:col-2 { --span: 2; }
1343
+ .md\:col-3 { --span: 3; }
1344
+ .md\:col-4 { --span: 4; }
1345
+ .md\:col-5 { --span: 5; }
1346
+ .md\:col-6 { --span: 6; }
1347
+ .md\:col-7 { --span: 7; }
1348
+ .md\:col-8 { --span: 8; }
1349
+ .md\:col-9 { --span: 9; }
1350
+ .md\:col-10 { --span: 10; }
1351
+ .md\:col-11 { --span: 11; }
1352
+ .md\:col-12 { --span: 12; }
1353
+ }
1354
+
1355
+ /* lg: 1024px+ */
1356
+ @media (min-width: 1024px) {
1357
+ .lg\:col-1 { --span: 1; }
1358
+ .lg\:col-2 { --span: 2; }
1359
+ .lg\:col-3 { --span: 3; }
1360
+ .lg\:col-4 { --span: 4; }
1361
+ .lg\:col-5 { --span: 5; }
1362
+ .lg\:col-6 { --span: 6; }
1363
+ .lg\:col-7 { --span: 7; }
1364
+ .lg\:col-8 { --span: 8; }
1365
+ .lg\:col-9 { --span: 9; }
1366
+ .lg\:col-10 { --span: 10; }
1367
+ .lg\:col-11 { --span: 11; }
1368
+ .lg\:col-12 { --span: 12; }
1369
+ }
1370
+
1371
+ /* xl: 1280px+ */
1372
+ @media (min-width: 1280px) {
1373
+ .xl\:col-1 { --span: 1; }
1374
+ .xl\:col-2 { --span: 2; }
1375
+ .xl\:col-3 { --span: 3; }
1376
+ .xl\:col-4 { --span: 4; }
1377
+ .xl\:col-5 { --span: 5; }
1378
+ .xl\:col-6 { --span: 6; }
1379
+ .xl\:col-7 { --span: 7; }
1380
+ .xl\:col-8 { --span: 8; }
1381
+ .xl\:col-9 { --span: 9; }
1382
+ .xl\:col-10 { --span: 10; }
1383
+ .xl\:col-11 { --span: 11; }
1384
+ .xl\:col-12 { --span: 12; }
1385
+ }
1386
+ }
1387
+ @layer base {
1388
+ progress {
1389
+ appearance: none;
1390
+ width: 100%;
1391
+ height: var(--bar-height);
1392
+ border: none;
1393
+ border-radius: var(--radius-full);
1394
+ overflow: hidden;
1395
+ background-color: var(--muted);
1419
1396
 
1420
- &:hover {
1421
- opacity: 1;
1422
- }
1397
+ &::-webkit-progress-bar {
1398
+ background-color: var(--muted);
1399
+ border-radius: var(--radius-full);
1423
1400
  }
1424
1401
 
1425
- margin: var(--space-2) 0;
1402
+ &::-webkit-progress-value {
1403
+ background-color: var(--primary);
1404
+ border-radius: var(--radius-full);
1405
+ transition: width var(--transition);
1406
+ }
1426
1407
 
1427
- &[data-entering] {
1428
- opacity: 0;
1429
- transform: translateY(-1rem);
1408
+ &::-moz-progress-bar {
1409
+ background-color: var(--primary);
1410
+ border-radius: var(--radius-full);
1430
1411
  }
1412
+ }
1431
1413
 
1432
- &[data-exiting] {
1433
- opacity: 0;
1434
- margin: 0;
1435
- padding-block: 0;
1436
- max-height: 0;
1437
- overflow: hidden;
1438
- transition: opacity var(--transition), margin var(--transition), padding var(--transition), max-height var(--transition);
1414
+ meter {
1415
+ appearance: none;
1416
+ width: 100%;
1417
+ height: var(--bar-height);
1418
+ border: none;
1419
+ border-radius: var(--radius-full);
1420
+ overflow: hidden;
1421
+ background: var(--muted);
1422
+
1423
+ &::-webkit-meter-bar {
1424
+ background: var(--muted);
1425
+ border: none;
1426
+ border-radius: var(--radius-full);
1427
+ height: var(--bar-height);
1428
+ }
1429
+
1430
+ &::-webkit-meter-optimum-value,
1431
+ &::-webkit-meter-suboptimum-value,
1432
+ &::-webkit-meter-even-less-good-value {
1433
+ border-radius: var(--radius-full);
1434
+ }
1435
+
1436
+ &::-webkit-meter-optimum-value {
1437
+ background: var(--success);
1438
+ }
1439
+
1440
+ &::-webkit-meter-suboptimum-value {
1441
+ background: var(--warning);
1442
+ }
1443
+
1444
+ &::-webkit-meter-even-less-good-value {
1445
+ background: var(--danger);
1446
+ }
1447
+
1448
+ &::-moz-meter-bar {
1449
+ background: var(--success);
1450
+ border-radius: var(--radius-full);
1451
+ }
1452
+
1453
+ &:-moz-meter-sub-optimum::-moz-meter-bar {
1454
+ background: var(--warning);
1455
+ }
1456
+
1457
+ &:-moz-meter-sub-sub-optimum::-moz-meter-bar {
1458
+ background: var(--danger);
1439
1459
  }
1440
1460
  }
1441
1461
  }
@@ -1448,6 +1468,10 @@
1448
1468
  min-height: 100dvh;
1449
1469
  gap: var(--space-4);
1450
1470
 
1471
+ > main {
1472
+ min-width: 0;
1473
+ }
1474
+
1451
1475
  &:has(nav[data-topnav]) {
1452
1476
  --topnav-offset: var(--space-12);
1453
1477
 
@@ -1456,12 +1480,6 @@
1456
1480
  }
1457
1481
  }
1458
1482
 
1459
- > main {
1460
- min-width: 0;
1461
- margin-block-start: var(--topnav-offset);
1462
- padding-block-start: var(--space-8);
1463
- }
1464
-
1465
1483
  > aside[data-sidebar] {
1466
1484
  position: sticky;
1467
1485
  top: var(--topnav-offset);
@@ -1526,150 +1544,437 @@
1526
1544
  > ul { margin-inline-start: var(--space-4); padding: var(--space-1) 0; }
1527
1545
  }
1528
1546
 
1529
- summary {
1530
- justify-content: flex-start;
1531
- padding: var(--space-2) var(--space-3);
1532
- border-radius: var(--radius-small);
1547
+ summary {
1548
+ justify-content: flex-start;
1549
+ padding: var(--space-2) var(--space-3);
1550
+ border-radius: var(--radius-small);
1551
+
1552
+ &::after {
1553
+ width: 0.75rem;
1554
+ height: 0.75rem;
1555
+ margin-inline-start: auto;
1556
+ }
1557
+ }
1558
+ }
1559
+ }
1560
+ }
1561
+
1562
+ nav[data-topnav] {
1563
+ position: fixed;
1564
+ inset: 0 0 auto;
1565
+ z-index: 5;
1566
+ min-height: var(--space-12);
1567
+ display: flex;
1568
+ align-items: center;
1569
+ gap: var(--space-3);
1570
+ padding: var(--space-2) var(--space-4);
1571
+ background-color: var(--background);
1572
+ border-bottom: 1px solid var(--border);
1573
+ box-shadow: var(--shadow-small);
1574
+
1575
+ a {
1576
+ text-decoration: none;
1577
+ }
1578
+ }
1579
+
1580
+ nav[data-topnav] ~ main {
1581
+ margin-block-start: var(--space-12);
1582
+ }
1583
+
1584
+ :is([data-sidebar-toggle], [data-sidebar-header]) {
1585
+ display: none;
1586
+ }
1587
+
1588
+ [data-sidebar-toggle] {
1589
+ padding: 0 var(--space-1);
1590
+ background: none;
1591
+ border: 1px solid var(--border);
1592
+ border-radius: var(--radius-small);
1593
+ }
1594
+
1595
+ @media (min-width: 769px) {
1596
+ [data-sidebar-layout="always"] {
1597
+ transition: grid-template-columns var(--transition);
1598
+
1599
+ [data-sidebar-toggle] {
1600
+ display: inline-block;
1601
+ }
1602
+
1603
+ > aside[data-sidebar] {
1604
+ transform: translateX(0);
1605
+ opacity: 1;
1606
+ transition: transform var(--transition), opacity var(--transition), visibility var(--transition);
1607
+ }
1608
+
1609
+ &[data-sidebar-open] {
1610
+ grid-template-columns: 0px 1fr;
1611
+ gap: 0;
1612
+
1613
+ > aside[data-sidebar] {
1614
+ overflow: hidden;
1615
+ min-width: 0;
1616
+ transform: translateX(-100%);
1617
+ opacity: 0;
1618
+ visibility: hidden;
1619
+ border-inline-end: none;
1620
+ }
1621
+ }
1622
+ }
1623
+ }
1624
+
1625
+ @media (max-width: 768px) {
1626
+ [data-sidebar-layout] {
1627
+ grid-template-columns: 1fr;
1628
+
1629
+ > aside[data-sidebar] {
1630
+ position: fixed;
1631
+ left: 0;
1632
+ width: min(16rem, 80vw);
1633
+ transform: translateX(-100%);
1634
+ transition: transform var(--transition);
1635
+ box-shadow: var(--shadow-large);
1636
+ }
1637
+
1638
+ &[data-sidebar-open] > aside[data-sidebar] {
1639
+ transform: translateX(0);
1640
+ }
1641
+ }
1642
+ [data-sidebar-toggle] { display: inline-block; }
1643
+
1644
+ [data-sidebar-header] {
1645
+ display: flex;
1646
+ align-items: center;
1647
+ gap: var(--space-3);
1648
+ padding: var(--space-3) var(--space-4);
1649
+ border-bottom: 1px solid var(--border);
1650
+ }
1651
+ }
1652
+ }
1653
+ @layer components {
1654
+ [role="status"].skeleton {
1655
+ --_c: light-dark(
1656
+ color-mix(in srgb, var(--muted) 30%, white),
1657
+ color-mix(in srgb, var(--muted) 90%, var(--foreground))
1658
+ );
1659
+
1660
+ margin-block-end: var(--space-3);
1661
+ background: var(--muted);
1662
+ border-radius: var(--radius-medium);
1663
+ animation: anim 2s infinite;
1664
+ background-size: 200% 100%;
1665
+ background-image: linear-gradient(
1666
+ 90deg,
1667
+ var(--muted) 0%,
1668
+ var(--_c) 50%,
1669
+ var(--muted) 100%
1670
+ );
1671
+
1672
+ &.box {
1673
+ width: 4rem;
1674
+ height: 4rem;
1675
+ }
1676
+
1677
+ &.line {
1678
+ height: 1rem;
1679
+ width: 100%;
1680
+ }
1681
+ }
1682
+
1683
+ [role="status"].skeleton:last-child {
1684
+ margin-block-end: 0;
1685
+ }
1686
+
1687
+ @keyframes anim {
1688
+ from { background-position: 200% 0; }
1689
+ to { background-position: -200% 0; }
1690
+ }
1691
+ }
1692
+ @layer components {
1693
+ [aria-busy="true"] {
1694
+ &::before {
1695
+ content: "";
1696
+ display: inline-block;
1697
+ inset: 0;
1698
+ margin: auto;
1699
+ width: 1.5rem;
1700
+ height: 1.5rem;
1701
+ border: 2px solid var(--muted);
1702
+ border-top-color: var(--primary);
1703
+ border-radius: var(--radius-full);
1704
+ animation: spin 1s linear infinite;
1705
+ text-align: center;
1706
+ }
1707
+
1708
+ &[data-spinner~="small"]::before {
1709
+ width: 1rem;
1710
+ height: 1rem;
1711
+ }
1712
+
1713
+ &[data-spinner~="large"]::before {
1714
+ width: 2rem;
1715
+ height: 2rem;
1716
+ border-width: 3px;
1717
+ }
1718
+
1719
+ &[data-spinner~="overlay"] {
1720
+ position: relative;
1721
+
1722
+ > * {
1723
+ opacity: 0.3;
1724
+
1725
+ /* "disable" all elements in the container while it's busy */
1726
+ pointer-events: none;
1727
+ }
1728
+
1729
+ &::before {
1730
+ position: absolute;
1731
+ inset: 0;
1732
+ margin: auto;
1733
+ z-index: 1;
1734
+ }
1735
+ }
1736
+ }
1737
+
1738
+ @keyframes spin {
1739
+ to {
1740
+ transform: rotate(360deg);
1741
+ }
1742
+ }
1743
+ }
1744
+ @layer base {
1745
+ /* Container to get horizontal scroll on small screens. */
1746
+ .table {
1747
+ min-width: 320px;
1748
+ width: 100%;
1749
+ overflow-x: auto;
1750
+ }
1751
+
1752
+ table {
1753
+ border-collapse: collapse;
1754
+ width: 100%;
1755
+ font-size: var(--text-7);
1756
+ }
1757
+
1758
+ thead {
1759
+ border-bottom: 1px solid var(--border);
1760
+ }
1761
+
1762
+ th, td {
1763
+ overflow-wrap: break-word;
1764
+ }
1765
+
1766
+ th {
1767
+ padding: var(--space-3) var(--space-2);
1768
+ text-align: start;
1769
+ font-weight: var(--font-medium);
1770
+ color: var(--muted-foreground);
1771
+ }
1772
+
1773
+ td {
1774
+ padding: var(--space-3) var(--space-2);
1775
+ }
1776
+
1777
+ tbody tr {
1778
+ border-bottom: 1px solid var(--border);
1779
+ transition: background-color var(--transition-fast);
1780
+
1781
+ &:last-child {
1782
+ border-bottom: none;
1783
+ }
1784
+
1785
+ &:hover {
1786
+ background-color: rgb(from var(--muted) r g b / 0.5);
1787
+ }
1788
+ }
1789
+ }
1790
+ @layer components {
1791
+ [role="tablist"] {
1792
+ display: inline-flex;
1793
+ align-items: center;
1794
+ gap: var(--space-1);
1795
+ padding: var(--space-1);
1796
+ background-color: var(--muted);
1797
+ border-radius: var(--radius-medium);
1798
+ max-width: 100%;
1799
+ overflow-x: auto;
1800
+ -webkit-overflow-scrolling: touch;
1801
+ scrollbar-width: none;
1802
+
1803
+ &::-webkit-scrollbar {
1804
+ display: none;
1805
+ }
1806
+ }
1807
+
1808
+ [role="tab"] {
1809
+ display: inline-flex;
1810
+ align-items: center;
1811
+ justify-content: center;
1812
+ padding: var(--space-2) var(--space-3);
1813
+ font-size: var(--text-7);
1814
+ font-weight: var(--font-medium);
1815
+ white-space: nowrap;
1816
+ background-color: transparent;
1817
+ color: var(--foreground);
1818
+ border: none;
1819
+ border-radius: calc(var(--radius-medium) - 2px);
1820
+ cursor: pointer;
1821
+ transition: background-color var(--transition-fast), color var(--transition-fast);
1822
+
1823
+ &:hover {
1824
+ color: var(--muted-foreground);
1825
+ }
1533
1826
 
1534
- &::after {
1535
- width: 0.75rem;
1536
- height: 0.75rem;
1537
- margin-inline-start: auto;
1538
- }
1539
- }
1540
- }
1827
+ &[aria-selected="true"] {
1828
+ background-color: var(--background);
1829
+ box-shadow: var(--shadow-small);
1541
1830
  }
1542
1831
  }
1543
1832
 
1544
- nav[data-topnav] {
1833
+ [role="tabpanel"] {
1834
+ padding: var(--space-4) 0;
1835
+
1836
+ &:focus-visible {
1837
+ outline: none;
1838
+ }
1839
+ }
1840
+ }
1841
+ @layer components {
1842
+ .toast-container {
1545
1843
  position: fixed;
1546
- inset: 0 0 auto;
1547
- z-index: 5;
1548
- min-height: var(--space-12);
1549
1844
  display: flex;
1550
- align-items: center;
1551
- gap: var(--space-3);
1552
- padding: var(--space-2) var(--space-4);
1553
- background-color: var(--background);
1554
- border-bottom: 1px solid var(--border);
1555
- box-shadow: var(--shadow-small);
1845
+ flex-direction: column;
1846
+ pointer-events: none;
1847
+ margin: 0;
1848
+ padding: 0;
1849
+ border: none;
1850
+ background: transparent;
1556
1851
 
1557
- a {
1558
- text-decoration: none;
1852
+ overflow: visible;
1853
+
1854
+ &::backdrop {
1855
+ display: none;
1559
1856
  }
1560
- }
1561
1857
 
1562
- :is([data-sidebar-toggle], [data-sidebar-header]) {
1563
- display: none;
1564
- }
1858
+ &[data-placement="top-left"] {
1859
+ inset: var(--space-4) auto auto var(--space-4);
1860
+ }
1565
1861
 
1566
- [data-sidebar-toggle] {
1567
- padding: 0 var(--space-1);
1568
- background: none;
1569
- border: 1px solid var(--border);
1570
- border-radius: var(--radius-small);
1571
- }
1862
+ &[data-placement="top-center"] {
1863
+ inset: var(--space-4) auto auto 50%;
1864
+ transform: translateX(-50%);
1865
+ }
1572
1866
 
1573
- @media (min-width: 769px) {
1574
- [data-sidebar-layout="always"] {
1575
- transition: grid-template-columns var(--transition);
1867
+ &[data-placement="top-right"] {
1868
+ inset: var(--space-4) var(--space-4) auto auto;
1869
+ }
1576
1870
 
1577
- [data-sidebar-toggle] {
1578
- display: inline-block;
1871
+ /* Stack full-width on narrow screens */
1872
+ @media (max-width: 639px) {
1873
+ &[data-placement="top-left"],
1874
+ &[data-placement="top-right"] {
1875
+ inset: var(--space-4) var(--space-2) auto var(--space-2);
1579
1876
  }
1580
-
1581
- > aside[data-sidebar] {
1582
- transform: translateX(0);
1583
- opacity: 1;
1584
- transition: transform var(--transition), opacity var(--transition), visibility var(--transition);
1877
+ &[data-placement="bottom-left"],
1878
+ &[data-placement="bottom-right"] {
1879
+ inset: auto var(--space-2) var(--space-4) var(--space-2);
1585
1880
  }
1881
+ }
1586
1882
 
1587
- &[data-sidebar-open] {
1588
- grid-template-columns: 0px 1fr;
1589
- gap: 0;
1883
+ &[data-placement="bottom-left"] {
1884
+ inset: auto auto var(--space-4) var(--space-4);
1885
+ flex-direction: column-reverse;
1886
+ }
1590
1887
 
1591
- > aside[data-sidebar] {
1592
- overflow: hidden;
1593
- min-width: 0;
1594
- transform: translateX(-100%);
1595
- opacity: 0;
1596
- visibility: hidden;
1597
- border-inline-end: none;
1598
- }
1599
- }
1888
+ &[data-placement="bottom-center"] {
1889
+ inset: auto auto var(--space-4) 50%;
1890
+ transform: translateX(-50%);
1891
+ flex-direction: column-reverse;
1892
+ }
1893
+
1894
+ &[data-placement="bottom-right"] {
1895
+ inset: auto var(--space-4) var(--space-4) auto;
1896
+ flex-direction: column-reverse;
1600
1897
  }
1601
1898
  }
1602
1899
 
1603
- @media (max-width: 768px) {
1604
- [data-sidebar-layout] {
1605
- grid-template-columns: 1fr;
1900
+ .toast {
1901
+ --transition: 300ms;
1902
+ --transition-in: calc(var(--transition) - 50ms);
1606
1903
 
1607
- > aside[data-sidebar] {
1608
- position: fixed;
1609
- left: 0;
1610
- width: 16rem;
1611
- transform: translateX(-100%);
1612
- transition: transform var(--transition);
1613
- box-shadow: var(--shadow-large);
1904
+ padding: var(--space-5) var(--space-4);
1905
+ max-width: min(28rem, calc(100vw - var(--space-8)));
1906
+ min-width: min(20rem, calc(100vw - var(--space-8)));
1907
+ pointer-events: auto;
1908
+ background-color: var(--card);
1909
+ border: 1px solid var(--border);
1910
+ border-inline-start-width: var(--space-1);
1911
+ border-inline-start-style: solid;
1912
+ border-radius: var(--radius-medium);
1913
+ box-shadow: var(--shadow-small);
1914
+ transition: opacity var(--transition-in), transform var(--transition-in), margin var(--transition-in);
1915
+ line-height: 1;
1916
+
1917
+ .toast-title {
1918
+ font-weight: var(--font-semibold);
1919
+ font-size: var(--text-7);
1920
+ line-height: var(--leading-tight);
1921
+ margin: 0 0 var(--space-2) 0;
1922
+ }
1923
+ .toast-message {
1924
+ color: var(--muted-foreground);
1925
+ font-size: var(--text-7);
1926
+ line-height: var(--leading-normal);
1927
+ }
1928
+
1929
+ &[data-variant="success"] {
1930
+ border-inline-start-color: var(--success);
1931
+ .toast-title {
1932
+ color: var(--success);
1614
1933
  }
1934
+ }
1615
1935
 
1616
- &[data-sidebar-open] > aside[data-sidebar] {
1617
- transform: translateX(0);
1936
+ &[data-variant="danger"] {
1937
+ border-inline-start-color: var(--danger);
1938
+ .toast-title {
1939
+ color: var(--danger);
1618
1940
  }
1619
1941
  }
1620
- [data-sidebar-toggle] { display: inline-block; }
1621
1942
 
1622
- [data-sidebar-header] {
1623
- display: flex;
1624
- align-items: center;
1625
- gap: var(--space-3);
1626
- padding: var(--space-3) var(--space-4);
1627
- border-bottom: 1px solid var(--border);
1943
+ &[data-variant="warning"] {
1944
+ border-inline-start-color: var(--warning);
1945
+ .toast-title {
1946
+ color: var(--warning);
1947
+ }
1628
1948
  }
1629
- }
1630
- }
1631
- @layer components {
1632
- [role="status"].skeleton {
1633
- --_c: light-dark(
1634
- color-mix(in srgb, var(--muted) 30%, white),
1635
- color-mix(in srgb, var(--muted) 90%, var(--foreground))
1636
- );
1637
1949
 
1638
- margin-block-end: var(--space-3);
1639
- background: var(--muted);
1640
- border-radius: var(--radius-medium);
1641
- animation: anim 2s infinite;
1642
- background-size: 200% 100%;
1643
- background-image: linear-gradient(
1644
- 90deg,
1645
- var(--muted) 0%,
1646
- var(--_c) 50%,
1647
- var(--muted) 100%
1648
- );
1950
+ & > [data-close] {
1951
+ margin-inline-start: auto;
1952
+ background: none;
1953
+ border: none;
1954
+ padding: 0;
1955
+ cursor: pointer;
1956
+ opacity: 0.5;
1649
1957
 
1650
- &.box {
1651
- width: 4rem;
1652
- height: 4rem;
1958
+ &:hover {
1959
+ opacity: 1;
1960
+ }
1653
1961
  }
1654
1962
 
1655
- &.line {
1656
- height: 1rem;
1657
- width: 100%;
1658
- }
1659
- &.circle {
1660
- width: 3rem;
1661
- height: 3rem;
1662
- border-radius: var(--radius-full);
1663
- }
1664
- }
1963
+ margin: var(--space-2) 0;
1665
1964
 
1666
- [role="status"].skeleton:last-child {
1667
- margin-block-end: 0;
1668
- }
1965
+ &[data-entering] {
1966
+ opacity: 0;
1967
+ transform: translateY(-1rem);
1968
+ }
1669
1969
 
1670
- @keyframes anim {
1671
- from { background-position: 200% 0; }
1672
- to { background-position: -200% 0; }
1970
+ &[data-exiting] {
1971
+ opacity: 0;
1972
+ margin: 0;
1973
+ padding-block: 0;
1974
+ max-height: 0;
1975
+ overflow: hidden;
1976
+ transition: opacity var(--transition), margin var(--transition), padding var(--transition), max-height var(--transition);
1977
+ }
1673
1978
  }
1674
1979
  }
1675
1980
  @layer components {
@@ -1719,8 +2024,6 @@
1719
2024
  transform: translateX(-50%) translateY(0);
1720
2025
  }
1721
2026
  }
1722
-
1723
- /* ── Avatar ───────────────────────────────────────────────────────── */
1724
2027
  @layer components {
1725
2028
  .avatar {
1726
2029
  --avatar-size: 40px;
@@ -1763,8 +2066,6 @@
1763
2066
  margin-inline-start: calc(var(--avatar-size) * -0.3);
1764
2067
  }
1765
2068
  }
1766
-
1767
- /* ── File Upload ──────────────────────────────────────────────────── */
1768
2069
  @layer components {
1769
2070
  .file-upload {
1770
2071
  display: flex;
@@ -1802,7 +2103,9 @@
1802
2103
  }
1803
2104
 
1804
2105
  .file-upload-text {
2106
+ font-size: var(--text-regular);
1805
2107
  font-weight: var(--font-medium);
2108
+ line-height: var(--leading-normal);
1806
2109
  }
1807
2110
 
1808
2111
  .file-upload-hint {
@@ -1866,8 +2169,6 @@
1866
2169
  height: 1rem;
1867
2170
  }
1868
2171
  }
1869
-
1870
- /* ── Input OTP ────────────────────────────────────────────────────── */
1871
2172
  @layer components {
1872
2173
  .otp-group {
1873
2174
  display: inline-flex;
@@ -1912,8 +2213,6 @@
1912
2213
  font-weight: var(--font-semibold);
1913
2214
  }
1914
2215
  }
1915
-
1916
- /* ── Search Input ─────────────────────────────────────────────────── */
1917
2216
  @layer components {
1918
2217
  .search-input {
1919
2218
  position: relative;
@@ -1928,7 +2227,7 @@
1928
2227
  pointer-events: none;
1929
2228
  display: inline-flex;
1930
2229
  align-items: center;
1931
- z-index: 2;
2230
+ z-index: 1;
1932
2231
  }
1933
2232
 
1934
2233
  .search-input-icon svg {
@@ -1994,12 +2293,11 @@
1994
2293
  line-height: 1;
1995
2294
  }
1996
2295
 
2296
+ /* Hide shortcut when clear button is visible */
1997
2297
  .search-input.has-value .search-input-shortcut {
1998
2298
  display: none;
1999
2299
  }
2000
2300
  }
2001
-
2002
- /* ── Separator ────────────────────────────────────────────────────── */
2003
2301
  @layer components {
2004
2302
  .separator-vertical {
2005
2303
  border-top: none;
@@ -2025,8 +2323,6 @@
2025
2323
  border-top: 1px solid var(--border);
2026
2324
  }
2027
2325
  }
2028
-
2029
- /* ── Toggle / Toggle Group ────────────────────────────────────────── */
2030
2326
  @layer components {
2031
2327
  .toggle {
2032
2328
  display: inline-flex;
@@ -2077,6 +2373,7 @@
2077
2373
  font-size: var(--text-5);
2078
2374
  }
2079
2375
 
2376
+ /* Toggle group */
2080
2377
  .toggle-group {
2081
2378
  display: inline-flex;
2082
2379
  }
@@ -2097,8 +2394,6 @@
2097
2394
  border-end-end-radius: var(--radius-medium);
2098
2395
  }
2099
2396
  }
2100
-
2101
- /* ── Chips ─────────────────────────────────────────────────────────── */
2102
2397
  @layer components {
2103
2398
  .chip {
2104
2399
  display: inline-flex;
@@ -2117,6 +2412,7 @@
2117
2412
  transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
2118
2413
  }
2119
2414
 
2415
+ /* Interactive / selectable chip */
2120
2416
  .chip.interactive {
2121
2417
  cursor: pointer;
2122
2418
  }
@@ -2142,6 +2438,7 @@
2142
2438
  background: color-mix(in srgb, var(--primary) 90%, transparent);
2143
2439
  }
2144
2440
 
2441
+ /* Variants */
2145
2442
  .chip.secondary {
2146
2443
  background: var(--secondary);
2147
2444
  color: var(--secondary-foreground);
@@ -2185,9 +2482,11 @@
2185
2482
  border-color: transparent;
2186
2483
  }
2187
2484
 
2485
+ /* Sizes */
2188
2486
  .chip-sm {
2189
2487
  padding: 0 var(--space-2);
2190
- font-size: calc(var(--text-8) - 1px);
2488
+ font-size: var(--text-8);
2489
+ line-height: var(--leading-tight);
2191
2490
  }
2192
2491
 
2193
2492
  .chip-lg {
@@ -2195,6 +2494,7 @@
2195
2494
  font-size: var(--text-7);
2196
2495
  }
2197
2496
 
2497
+ /* Disabled */
2198
2498
  .chip:disabled,
2199
2499
  .chip[aria-disabled="true"] {
2200
2500
  opacity: 0.5;
@@ -2202,6 +2502,7 @@
2202
2502
  cursor: not-allowed;
2203
2503
  }
2204
2504
 
2505
+ /* Remove / dismiss button inside a chip */
2205
2506
  .chip-dismiss {
2206
2507
  display: inline-flex;
2207
2508
  align-items: center;
@@ -2227,6 +2528,7 @@
2227
2528
  height: 0.75rem;
2228
2529
  }
2229
2530
 
2531
+ /* Chip avatar/icon slot */
2230
2532
  .chip-icon {
2231
2533
  display: inline-flex;
2232
2534
  align-items: center;
@@ -2240,6 +2542,7 @@
2240
2542
  border-radius: var(--radius-full);
2241
2543
  }
2242
2544
 
2545
+ /* Chip group / input wrapper */
2243
2546
  .chip-group {
2244
2547
  display: flex;
2245
2548
  flex-wrap: wrap;
@@ -2277,8 +2580,6 @@
2277
2580
  padding: 0;
2278
2581
  }
2279
2582
  }
2280
-
2281
- /* ── Carousel ──────────────────────────────────────────────────────── */
2282
2583
  @layer components {
2283
2584
  .carousel {
2284
2585
  position: relative;
@@ -2311,6 +2612,7 @@
2311
2612
  position: relative;
2312
2613
  }
2313
2614
 
2615
+ /* Slide-in animation for active slides */
2314
2616
  .carousel-slide img {
2315
2617
  width: 100%;
2316
2618
  height: 100%;
@@ -2329,6 +2631,7 @@
2329
2631
  opacity: 1;
2330
2632
  }
2331
2633
 
2634
+ /* Caption slide-up animation */
2332
2635
  .carousel-caption {
2333
2636
  position: absolute;
2334
2637
  bottom: 0;
@@ -2359,6 +2662,7 @@
2359
2662
  opacity: 0.9;
2360
2663
  }
2361
2664
 
2665
+ /* Navigation arrows */
2362
2666
  .carousel-prev,
2363
2667
  .carousel-next {
2364
2668
  position: absolute;
@@ -2423,6 +2727,7 @@
2423
2727
  height: 1.25rem;
2424
2728
  }
2425
2729
 
2730
+ /* Dot indicators */
2426
2731
  .carousel-dots {
2427
2732
  display: flex;
2428
2733
  justify-content: center;
@@ -2460,12 +2765,12 @@
2460
2765
  outline-offset: 2px;
2461
2766
  }
2462
2767
 
2768
+ /* Overlay dots */
2463
2769
  .carousel-dots.overlay {
2464
2770
  position: absolute;
2465
2771
  bottom: var(--space-3);
2466
2772
  left: 0;
2467
2773
  right: 0;
2468
- opacity: 0.6;
2469
2774
  }
2470
2775
 
2471
2776
  .carousel-dots.overlay .carousel-dot {
@@ -2476,6 +2781,7 @@
2476
2781
  background: var(--primary-foreground);
2477
2782
  }
2478
2783
 
2784
+ /* Aspect ratios */
2479
2785
  .carousel.ratio-16-9 .carousel-slide { aspect-ratio: 16 / 9; }
2480
2786
  .carousel.ratio-4-3 .carousel-slide { aspect-ratio: 4 / 3; }
2481
2787
  .carousel.ratio-1-1 .carousel-slide { aspect-ratio: 1 / 1; }
@@ -2577,6 +2883,7 @@
2577
2883
  display: none;
2578
2884
  }
2579
2885
 
2886
+ /* Product card inside carousel */
2580
2887
  .product-card {
2581
2888
  flex: 0 0 auto;
2582
2889
  scroll-snap-align: start;
@@ -2685,6 +2992,7 @@
2685
2992
  stroke: #f59e0b;
2686
2993
  }
2687
2994
 
2995
+ /* Responsive: narrower cards on mobile */
2688
2996
  @media (max-width: 768px) {
2689
2997
  .product-card {
2690
2998
  width: 200px;
@@ -2695,20 +3003,114 @@
2695
3003
  }
2696
3004
  }
2697
3005
  }
2698
-
2699
3006
  @layer utilities {
3007
+ /* ── Text alignment ──────────────────────────────────────────────────── */
2700
3008
  .align-left { text-align: start; }
2701
3009
  .align-center { text-align: center; }
2702
3010
  .align-right { text-align: end; }
3011
+
3012
+ .text-left { text-align: start; }
3013
+ .text-center { text-align: center; }
3014
+ .text-right { text-align: end; }
3015
+
3016
+ /* ── Text colors ─────────────────────────────────────────────────────── */
2703
3017
  .text-light { color: var(--muted-foreground); }
2704
3018
  .text-lighter { color: var(--faint-foreground); }
2705
-
3019
+ .text-danger { color: var(--danger); }
3020
+ .text-success { color: var(--success); }
3021
+ .text-warning { color: var(--warning); }
3022
+ .text-primary { color: var(--primary); }
3023
+ .text-muted { color: var(--muted-foreground); }
3024
+
3025
+ /* ── Text sizes (maps to theme tokens) ───────────────────────────────── */
3026
+ .text-1 { font-size: var(--text-1); }
3027
+ .text-2 { font-size: var(--text-2); }
3028
+ .text-3 { font-size: var(--text-3); }
3029
+ .text-4 { font-size: var(--text-4); }
3030
+ .text-5 { font-size: var(--text-5); }
3031
+ .text-6 { font-size: var(--text-6); }
3032
+ .text-7 { font-size: var(--text-7); }
3033
+ .text-8 { font-size: var(--text-8); }
3034
+
3035
+ .text-small { font-size: var(--text-7); }
3036
+ .text-xs { font-size: var(--text-8); }
3037
+ .text-regular { font-size: var(--text-regular); }
3038
+
3039
+ /* ── Font weight ─────────────────────────────────────────────────────── */
3040
+ .font-normal { font-weight: var(--font-normal); }
3041
+ .font-medium { font-weight: var(--font-medium); }
3042
+ .font-semibold { font-weight: var(--font-semibold); }
3043
+ .font-bold { font-weight: var(--font-bold); }
3044
+
3045
+ /* ── Font family ─────────────────────────────────────────────────────── */
3046
+ .font-sans { font-family: var(--font-sans); }
3047
+ .font-mono { font-family: var(--font-mono); }
3048
+
3049
+ /* ── Line-height ─────────────────────────────────────────────────────── */
3050
+ .leading-none { line-height: var(--leading-none); }
3051
+ .leading-tight { line-height: var(--leading-tight); }
3052
+ .leading-snug { line-height: var(--leading-snug); }
3053
+ .leading-normal { line-height: var(--leading-normal); }
3054
+ .leading-relaxed { line-height: var(--leading-relaxed); }
3055
+ .leading-loose { line-height: var(--leading-loose); }
3056
+
3057
+ /* ── Letter-spacing ──────────────────────────────────────────────────── */
3058
+ .tracking-tighter { letter-spacing: var(--tracking-tighter); }
3059
+ .tracking-tight { letter-spacing: var(--tracking-tight); }
3060
+ .tracking-normal { letter-spacing: var(--tracking-normal); }
3061
+ .tracking-wide { letter-spacing: var(--tracking-wide); }
3062
+ .tracking-wider { letter-spacing: var(--tracking-wider); }
3063
+ .tracking-widest { letter-spacing: var(--tracking-widest); }
3064
+
3065
+ /* ── Text transform ──────────────────────────────────────────────────── */
3066
+ .uppercase { text-transform: uppercase; }
3067
+ .lowercase { text-transform: lowercase; }
3068
+ .capitalize { text-transform: capitalize; }
3069
+ .normal-case { text-transform: none; }
3070
+
3071
+ /* ── Text decoration ─────────────────────────────────────────────────── */
3072
+ .underline { text-decoration-line: underline; }
3073
+ .overline { text-decoration-line: overline; }
3074
+ .line-through { text-decoration-line: line-through; }
3075
+ .no-underline { text-decoration-line: none; }
3076
+
3077
+ /* ── Text wrapping ───────────────────────────────────────────────────── */
3078
+ .text-balance { text-wrap: balance; }
3079
+ .text-pretty { text-wrap: pretty; }
3080
+ .text-nowrap { text-wrap: nowrap; }
3081
+
3082
+ /* ── White-space ─────────────────────────────────────────────────────── */
3083
+ .whitespace-normal { white-space: normal; }
3084
+ .whitespace-nowrap { white-space: nowrap; }
3085
+ .whitespace-pre { white-space: pre; }
3086
+ .whitespace-pre-line { white-space: pre-line; }
3087
+ .whitespace-pre-wrap { white-space: pre-wrap; }
3088
+
3089
+ /* ── Line clamp (multi-line truncation) ──────────────────────────────── */
3090
+ .line-clamp-1 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; overflow: hidden; }
3091
+ .line-clamp-2 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
3092
+ .line-clamp-3 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }
3093
+ .line-clamp-4 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden; }
3094
+ .line-clamp-none { display: block; -webkit-box-orient: initial; -webkit-line-clamp: none; overflow: visible; }
3095
+
3096
+ /* ── Word break ──────────────────────────────────────────────────────── */
3097
+ .break-normal { overflow-wrap: normal; word-break: normal; }
3098
+ .break-words { overflow-wrap: break-word; }
3099
+ .break-all { word-break: break-all; }
3100
+
3101
+ /* ── Flexbox ─────────────────────────────────────────────────────────── */
2706
3102
  .flex { display: flex; }
2707
3103
  .flex-col { flex-direction: column; }
3104
+ .flex-row { flex-direction: row; }
3105
+ .flex-wrap { flex-wrap: wrap; }
3106
+ .flex-1 { flex: 1; }
2708
3107
  .items-center { align-items: center; }
3108
+ .items-start { align-items: flex-start; }
3109
+ .items-end { align-items: flex-end; }
2709
3110
  .justify-center { justify-content: center; }
2710
3111
  .justify-between { justify-content: space-between; }
2711
3112
  .justify-end { justify-content: flex-end; }
3113
+ .justify-start { justify-content: flex-start; }
2712
3114
 
2713
3115
  /* Bootstrap inspired. */
2714
3116
  .hstack {
@@ -2729,24 +3131,199 @@
2729
3131
  gap: var(--space-3);
2730
3132
  }
2731
3133
 
3134
+ /* ── Gap ──────────────────────────────────────────────────────────────── */
2732
3135
  .gap-1 { gap: var(--space-1); }
2733
3136
  .gap-2 { gap: var(--space-2); }
3137
+ .gap-3 { gap: var(--space-3); }
2734
3138
  .gap-4 { gap: var(--space-4); }
3139
+ .gap-6 { gap: var(--space-6); }
3140
+ .gap-8 { gap: var(--space-8); }
2735
3141
 
3142
+ /* ── Margin ──────────────────────────────────────────────────────────── */
3143
+ .mt-0 { margin-block-start: 0; }
2736
3144
  .mt-2 { margin-block-start: var(--space-2); }
2737
3145
  .mt-4 { margin-block-start: var(--space-4); }
2738
3146
  .mt-6 { margin-block-start: var(--space-6); }
3147
+ .mt-8 { margin-block-start: var(--space-8); }
2739
3148
 
3149
+ .mb-0 { margin-block-end: 0; }
2740
3150
  .mb-2 { margin-block-end: var(--space-2); }
2741
3151
  .mb-4 { margin-block-end: var(--space-4); }
2742
3152
  .mb-6 { margin-block-end: var(--space-6); }
3153
+ .mb-8 { margin-block-end: var(--space-8); }
3154
+
3155
+ /* ── Padding ─────────────────────────────────────────────────────────── */
3156
+ .p-0 { padding: 0; }
3157
+ .p-2 { padding: var(--space-2); }
2743
3158
  .p-4 { padding: var(--space-4); }
3159
+ .p-6 { padding: var(--space-6); }
3160
+ .p-8 { padding: var(--space-8); }
3161
+
3162
+ .px-2 { padding-inline: var(--space-2); }
3163
+ .px-4 { padding-inline: var(--space-4); }
3164
+ .py-2 { padding-block: var(--space-2); }
3165
+ .py-4 { padding-block: var(--space-4); }
2744
3166
 
3167
+ /* ── Width ───────────────────────────────────────────────────────────── */
2745
3168
  .w-100 { width: 100%; }
3169
+ .w-auto { width: auto; }
3170
+ .max-w-sm { max-width: 24rem; }
3171
+ .max-w-md { max-width: 28rem; }
3172
+ .max-w-lg { max-width: 32rem; }
3173
+ .max-w-xl { max-width: 36rem; }
3174
+
3175
+ /* ── Display ─────────────────────────────────────────────────────────── */
3176
+ .d-none { display: none; }
3177
+ .d-block { display: block; }
3178
+ .d-flex { display: flex; }
3179
+ .d-grid { display: grid; }
3180
+ .d-inline { display: inline; }
3181
+ .d-inline-block { display: inline-block; }
3182
+ .d-inline-flex { display: inline-flex; }
3183
+
3184
+ /* ── Overflow ─────────────────────────────────────────────────────────── */
3185
+ .overflow-auto { overflow: auto; }
3186
+ .overflow-hidden { overflow: hidden; }
3187
+ .overflow-x-auto { overflow-x: auto; }
3188
+
3189
+ /* ── Misc ─────────────────────────────────────────────────────────────── */
3190
+ .truncate {
3191
+ overflow: hidden;
3192
+ text-overflow: ellipsis;
3193
+ white-space: nowrap;
3194
+ }
3195
+
3196
+ .sr-only {
3197
+ position: absolute;
3198
+ width: 1px;
3199
+ height: 1px;
3200
+ padding: 0;
3201
+ margin: -1px;
3202
+ overflow: hidden;
3203
+ clip: rect(0, 0, 0, 0);
3204
+ white-space: nowrap;
3205
+ border-width: 0;
3206
+ }
2746
3207
 
2747
3208
  :is(ul, ol, a).unstyled {
2748
3209
  list-style: none;
2749
3210
  text-decoration: none;
2750
3211
  padding: 0;
2751
3212
  }
3213
+
3214
+ /* ── Responsive display utilities (media queries) ────────────────────── */
3215
+ @media (max-width: 639px) {
3216
+ .sm\:d-none { display: none; }
3217
+ .hide-mobile { display: none; }
3218
+ }
3219
+ @media (min-width: 640px) {
3220
+ .sm\:d-block { display: block; }
3221
+ .sm\:d-flex { display: flex; }
3222
+ .sm\:d-grid { display: grid; }
3223
+ .sm\:d-none { display: none; }
3224
+ .sm\:flex-row { flex-direction: row; }
3225
+ .sm\:flex-col { flex-direction: column; }
3226
+ .show-mobile { display: none; }
3227
+ }
3228
+ @media (min-width: 768px) {
3229
+ .md\:d-block { display: block; }
3230
+ .md\:d-flex { display: flex; }
3231
+ .md\:d-grid { display: grid; }
3232
+ .md\:d-none { display: none; }
3233
+ .md\:flex-row { flex-direction: row; }
3234
+ .md\:flex-col { flex-direction: column; }
3235
+ }
3236
+ @media (min-width: 1024px) {
3237
+ .lg\:d-block { display: block; }
3238
+ .lg\:d-flex { display: flex; }
3239
+ .lg\:d-grid { display: grid; }
3240
+ .lg\:d-none { display: none; }
3241
+ .lg\:flex-row { flex-direction: row; }
3242
+ .lg\:flex-col { flex-direction: column; }
3243
+ }
3244
+ @media (min-width: 1280px) {
3245
+ .xl\:d-block { display: block; }
3246
+ .xl\:d-flex { display: flex; }
3247
+ .xl\:d-grid { display: grid; }
3248
+ .xl\:d-none { display: none; }
3249
+ }
3250
+
3251
+ /* ── Responsive text alignment ───────────────────────────────────────── */
3252
+ @media (min-width: 640px) {
3253
+ .sm\:text-left { text-align: start; }
3254
+ .sm\:text-center { text-align: center; }
3255
+ .sm\:text-right { text-align: end; }
3256
+ }
3257
+ @media (min-width: 768px) {
3258
+ .md\:text-left { text-align: start; }
3259
+ .md\:text-center { text-align: center; }
3260
+ .md\:text-right { text-align: end; }
3261
+ }
3262
+ @media (min-width: 1024px) {
3263
+ .lg\:text-left { text-align: start; }
3264
+ .lg\:text-center { text-align: center; }
3265
+ .lg\:text-right { text-align: end; }
3266
+ }
3267
+
3268
+ /* ── Responsive text sizes ─────────────────────────────────────────── */
3269
+ @media (min-width: 640px) {
3270
+ .sm\:text-1 { font-size: var(--text-1); }
3271
+ .sm\:text-2 { font-size: var(--text-2); }
3272
+ .sm\:text-3 { font-size: var(--text-3); }
3273
+ .sm\:text-4 { font-size: var(--text-4); }
3274
+ .sm\:text-5 { font-size: var(--text-5); }
3275
+ .sm\:text-6 { font-size: var(--text-6); }
3276
+ .sm\:text-7 { font-size: var(--text-7); }
3277
+ .sm\:text-8 { font-size: var(--text-8); }
3278
+ }
3279
+ @media (min-width: 768px) {
3280
+ .md\:text-1 { font-size: var(--text-1); }
3281
+ .md\:text-2 { font-size: var(--text-2); }
3282
+ .md\:text-3 { font-size: var(--text-3); }
3283
+ .md\:text-4 { font-size: var(--text-4); }
3284
+ .md\:text-5 { font-size: var(--text-5); }
3285
+ .md\:text-6 { font-size: var(--text-6); }
3286
+ .md\:text-7 { font-size: var(--text-7); }
3287
+ .md\:text-8 { font-size: var(--text-8); }
3288
+ }
3289
+ @media (min-width: 1024px) {
3290
+ .lg\:text-1 { font-size: var(--text-1); }
3291
+ .lg\:text-2 { font-size: var(--text-2); }
3292
+ .lg\:text-3 { font-size: var(--text-3); }
3293
+ .lg\:text-4 { font-size: var(--text-4); }
3294
+ .lg\:text-5 { font-size: var(--text-5); }
3295
+ .lg\:text-6 { font-size: var(--text-6); }
3296
+ .lg\:text-7 { font-size: var(--text-7); }
3297
+ .lg\:text-8 { font-size: var(--text-8); }
3298
+ }
3299
+
3300
+ /* ── Responsive gap ──────────────────────────────────────────────────── */
3301
+ @media (min-width: 640px) {
3302
+ .sm\:gap-2 { gap: var(--space-2); }
3303
+ .sm\:gap-4 { gap: var(--space-4); }
3304
+ .sm\:gap-6 { gap: var(--space-6); }
3305
+ .sm\:gap-8 { gap: var(--space-8); }
3306
+ }
3307
+ @media (min-width: 768px) {
3308
+ .md\:gap-2 { gap: var(--space-2); }
3309
+ .md\:gap-4 { gap: var(--space-4); }
3310
+ .md\:gap-6 { gap: var(--space-6); }
3311
+ .md\:gap-8 { gap: var(--space-8); }
3312
+ }
3313
+
3314
+ /* ── Responsive padding ──────────────────────────────────────────────── */
3315
+ @media (min-width: 640px) {
3316
+ .sm\:p-4 { padding: var(--space-4); }
3317
+ .sm\:p-6 { padding: var(--space-6); }
3318
+ .sm\:p-8 { padding: var(--space-8); }
3319
+ .sm\:px-4 { padding-inline: var(--space-4); }
3320
+ .sm\:px-6 { padding-inline: var(--space-6); }
3321
+ }
3322
+ @media (min-width: 768px) {
3323
+ .md\:p-4 { padding: var(--space-4); }
3324
+ .md\:p-6 { padding: var(--space-6); }
3325
+ .md\:p-8 { padding: var(--space-8); }
3326
+ .md\:px-4 { padding-inline: var(--space-4); }
3327
+ .md\:px-6 { padding-inline: var(--space-6); }
3328
+ }
2752
3329
  }