opui-css 4.0.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/MIGRATING.md +23 -1
  3. package/README.md +2 -3
  4. package/components/AGENTS.md +20 -19
  5. package/components/Accordion/Accordion.astro +3 -3
  6. package/components/Anchor/Anchor.astro +2 -2
  7. package/components/Avatar/Avatar.astro +2 -8
  8. package/components/Badge/Badge.astro +12 -7
  9. package/components/Button/Button.astro +1 -1
  10. package/components/ButtonGroup/ButtonGroup.astro +1 -1
  11. package/components/Callout/Callout.astro +3 -3
  12. package/components/Card/Card.astro +5 -7
  13. package/components/Checkbox/Checkbox.astro +6 -6
  14. package/components/Chip/Chip.astro +5 -5
  15. package/components/ClassicSelect/ClassicSelect.astro +6 -6
  16. package/components/DescriptionList/Description.astro +1 -1
  17. package/components/DescriptionList/DescriptionList.astro +2 -2
  18. package/components/DescriptionList/Item.astro +1 -1
  19. package/components/DescriptionList/Term.astro +1 -1
  20. package/components/Dialog/Dialog.astro +5 -7
  21. package/components/Divider/Divider.astro +4 -1
  22. package/components/Drawer/Drawer.astro +5 -5
  23. package/components/Drawer/DrawerFooter.astro +1 -1
  24. package/components/Drawer/DrawerHeader.astro +1 -1
  25. package/components/FieldDescription/FieldDescription.astro +1 -1
  26. package/components/FieldGroup/FieldGroup.astro +1 -1
  27. package/components/FieldLegend/FieldLegend.astro +1 -1
  28. package/components/FieldSet/FieldSet.astro +1 -1
  29. package/components/Form/Form.astro +1 -1
  30. package/components/IconButton/IconButton.astro +1 -1
  31. package/components/List/List.astro +5 -5
  32. package/components/ListItem/ListItem.astro +12 -12
  33. package/components/Progress/Progress.astro +1 -1
  34. package/components/Radio/Radio.astro +5 -5
  35. package/components/Range/Range.astro +8 -8
  36. package/components/Select/Select.astro +13 -13
  37. package/components/Switch/Switch.astro +8 -8
  38. package/components/Table/Table.astro +4 -1
  39. package/components/Tabs/Tabs.astro +1 -1
  40. package/components/Tabs/TabsItem.astro +1 -1
  41. package/components/Tabs/TabsPanel.astro +1 -1
  42. package/components/Tabs/TabsTab.astro +1 -1
  43. package/components/TextField/TextField.astro +13 -13
  44. package/components/Textarea/Textarea.astro +13 -13
  45. package/components/Toast/Toast.astro +6 -6
  46. package/components/ToggleButton/ToggleButton.astro +3 -3
  47. package/components/ToggleGroup/ToggleGroup.astro +3 -3
  48. package/components/Tooltip/Tooltip.astro +1 -1
  49. package/core/utils.css +4 -4
  50. package/css/components/accordion.css +11 -11
  51. package/css/components/anchor.css +3 -3
  52. package/css/components/avatar.css +5 -5
  53. package/css/components/badge.css +14 -14
  54. package/css/components/button-group.css +16 -16
  55. package/css/components/button.css +12 -12
  56. package/css/components/callout.css +9 -9
  57. package/css/components/card.css +12 -12
  58. package/css/components/checkbox.css +13 -13
  59. package/css/components/chip.css +5 -5
  60. package/css/components/description-list.css +11 -8
  61. package/css/components/dialog.css +3 -3
  62. package/css/components/divider.css +4 -4
  63. package/css/components/drawer.css +21 -21
  64. package/css/components/form.css +18 -18
  65. package/css/components/icon-button.css +9 -9
  66. package/css/components/link.css +1 -1
  67. package/css/components/list.css +29 -29
  68. package/css/components/progress.css +4 -4
  69. package/css/components/radio.css +10 -10
  70. package/css/components/range.css +31 -31
  71. package/css/components/select.css +4 -4
  72. package/css/components/spinner.css +1 -1
  73. package/css/components/switch.css +23 -23
  74. package/css/components/table.css +3 -3
  75. package/css/components/tabs.css +14 -8
  76. package/css/components/text-field.css +47 -47
  77. package/css/components/text-input.css +7 -7
  78. package/css/components/textarea.css +3 -3
  79. package/css/components/toast.css +12 -12
  80. package/css/components/toggle-button.css +6 -6
  81. package/css/components/toggle-group.css +10 -10
  82. package/css/components/tooltip.css +6 -6
  83. package/css/components/typography.css +30 -30
  84. package/css/js/toast.js +7 -7
  85. package/css/theme.css +8 -8
  86. package/dist/opui.components.css +407 -398
  87. package/dist/opui.components.css.map +1 -1
  88. package/dist/opui.css +419 -410
  89. package/dist/opui.css.map +1 -1
  90. package/package.json +1 -1
@@ -5,7 +5,7 @@
5
5
  /*** Root components (no dependencies) */
6
6
 
7
7
  @layer components.root {
8
- :where(.button) {
8
+ :where(.ui-button) {
9
9
  --_color: light-dark(var(--color-16), var(--color-1));
10
10
  --_color-contrast: light-dark(var(--color-1), var(--color-16));
11
11
  --_color-tonal: var(--surface-tonal);
@@ -60,8 +60,8 @@
60
60
  contrast text, and hover/active strategy are identical.
61
61
  The .critical scope class in theme.css redirects --palette-source so
62
62
  --color-6 below becomes a tint of the active color. */
63
- &.critical,
64
- &.primary {
63
+ &.ui-critical,
64
+ &.ui-primary {
65
65
  --_color-contrast: var(--gray-1);
66
66
  --_color-tonal: var(--color-6);
67
67
  --_accent-tonal-contrast: var(--text-primary-contrast);
@@ -75,11 +75,11 @@
75
75
  --_outlined-active-bg-color: oklch(from var(--_accent) calc(l - 0.1) c h);
76
76
  }
77
77
 
78
- &.critical {
78
+ &.ui-critical {
79
79
  --_color: var(--critical);
80
80
  }
81
81
 
82
- &.primary {
82
+ &.ui-primary {
83
83
  --_color: var(--primary);
84
84
  }
85
85
 
@@ -107,7 +107,7 @@
107
107
 
108
108
 
109
109
  /* Icons / Keyboard */
110
- &:where(:has(svg), &.icon-only) {
110
+ &:where(:has(svg), &.ui-icon-only) {
111
111
  gap: 1ex;
112
112
 
113
113
  svg {
@@ -128,27 +128,27 @@
128
128
 
129
129
  /* Sizes — heights aliased from the shared --control-size scale.
130
130
  Override --button-size-* in a parent scope to resize an entire region. */
131
- &.x-small {
131
+ &.ui-x-small {
132
132
  --_min-height: var(--button-size-x-small);
133
133
  --_font-size: var(--font-size-0);
134
134
  padding-block: 0;
135
135
  padding-inline: .5ex;
136
136
  }
137
137
 
138
- &.small {
138
+ &.ui-small {
139
139
  --_min-height: var(--button-size-small);
140
140
  --_font-size: var(--font-size-05);
141
141
  padding-block: 0;
142
142
  padding-inline: .75ex;
143
143
  }
144
144
 
145
- &.large {
145
+ &.ui-large {
146
146
  --_min-height: var(--button-size-large);
147
147
  padding-inline: 4ex;
148
148
  }
149
149
 
150
150
  /* Variants */
151
- &.outlined {
151
+ &.ui-outlined {
152
152
  --_bg-color: transparent;
153
153
  --_border-color: var(--_accent);
154
154
  --_text-color: var(--_accent);
@@ -168,7 +168,7 @@
168
168
  }
169
169
  }
170
170
 
171
- &.tonal {
171
+ &.ui-tonal {
172
172
  --_bg-color: var(--_accent-tonal);
173
173
  --_text-color: var(--_accent-tonal-contrast);
174
174
 
@@ -185,7 +185,7 @@
185
185
  }
186
186
  }
187
187
 
188
- &.filled {
188
+ &.ui-filled {
189
189
  --_bg-color: var(--_accent);
190
190
  --_text-color: var(--_accent-contrast);
191
191
 
@@ -221,7 +221,7 @@
221
221
  }
222
222
 
223
223
  @layer components.root {
224
- :where(.callout) {
224
+ :where(.ui-callout) {
225
225
  --_bg-color: var(--surface-tonal);
226
226
  --_border-color: var(--surface-tonal);
227
227
  --_color: var(--text-primary);
@@ -249,11 +249,11 @@
249
249
  padding: var(--_padding);
250
250
  position: relative;
251
251
 
252
- &.critical,
253
- &.info,
254
- &.neutral,
255
- &.success,
256
- &.warning {
252
+ &.ui-critical,
253
+ &.ui-info,
254
+ &.ui-neutral,
255
+ &.ui-success,
256
+ &.ui-warning {
257
257
  --_bg-color: light-dark(oklch(from var(--color-2) l c h / 20%), oklch(from var(--color-6) l c h / 5%));
258
258
  --_border-color: light-dark(var(--color-5), var(--color-11));
259
259
  --_color: light-dark(var(--color-16), var(--color-1));
@@ -265,7 +265,7 @@
265
265
  --_outlined-icon-color: var(--color-9);
266
266
  }
267
267
 
268
- &.outlined {
268
+ &.ui-outlined {
269
269
  --_bg-color: var(--_outlined-bg-color);
270
270
  --_border-color: var(--_outlined-border-color);
271
271
  --_color: var(--_outlined-color);
@@ -282,7 +282,7 @@
282
282
  z-index: -1;
283
283
  }
284
284
 
285
- &>.content {
285
+ &>.ui-content {
286
286
  display: grid;
287
287
  font-size: var(--_font-size);
288
288
  gap: var(--_content-gap);
@@ -306,7 +306,7 @@
306
306
  /* Links
307
307
  * Can't make sure contrast will be acceptable (yet) so we use the current text color instead.
308
308
  */
309
- &:not(.outlined) {
309
+ &:not(.ui-outlined) {
310
310
  a[href] {
311
311
  color: inherit;
312
312
 
@@ -331,7 +331,7 @@
331
331
  }
332
332
 
333
333
  @layer components.root {
334
- :where(.icon-button) {
334
+ :where(.ui-icon-button) {
335
335
  --_color: light-dark(var(--color-16), var(--color-1));
336
336
  --_color-contrast: light-dark(var(--color-1), var(--color-16));
337
337
  --_color-tonal: var(--surface-tonal);
@@ -399,8 +399,8 @@
399
399
  contrast text, and hover/active strategy are identical.
400
400
  The .critical scope class in theme.css redirects --palette-source so
401
401
  --color-6 below becomes a tint of the active color. */
402
- &.critical,
403
- &.primary {
402
+ &.ui-critical,
403
+ &.ui-primary {
404
404
  --_color-contrast: var(--gray-1);
405
405
  --_color-tonal: var(--color-6);
406
406
  --_accent-tonal-contrast: var(--text-primary-contrast);
@@ -414,11 +414,11 @@
414
414
  --_outlined-active-bg-color: oklch(from var(--_accent) calc(l - 0.1) c h);
415
415
  }
416
416
 
417
- &.critical {
417
+ &.ui-critical {
418
418
  --_color: var(--critical);
419
419
  }
420
420
 
421
- &.primary {
421
+ &.ui-primary {
422
422
  --_color: var(--primary);
423
423
  }
424
424
 
@@ -439,7 +439,7 @@
439
439
  }
440
440
 
441
441
  /* Size */
442
- &.small {
442
+ &.ui-small {
443
443
  block-size: var(--size-4);
444
444
  inline-size: var(--size-4);
445
445
 
@@ -450,18 +450,18 @@
450
450
  }
451
451
 
452
452
  /* Variants */
453
- &.outlined {
453
+ &.ui-outlined {
454
454
  --_bg-color: transparent;
455
455
  --_border-color: var(--_accent);
456
456
  --_text-color: var(--_accent);
457
457
  }
458
458
 
459
- &.tonal {
459
+ &.ui-tonal {
460
460
  --_bg-color: var(--_accent-tonal);
461
461
  --_text-color: var(--_accent-tonal-contrast);
462
462
  }
463
463
 
464
- &.filled {
464
+ &.ui-filled {
465
465
  --_bg-color: var(--_accent);
466
466
  --_interaction-active-color: var(--_filled-active-bg-color);
467
467
  --_interaction-hover-color: var(--_filled-hover-bg-color);
@@ -471,7 +471,7 @@
471
471
  }
472
472
 
473
473
  @layer components.root {
474
- :where(.tabs) {
474
+ :where(.ui-tabs) {
475
475
  --_accent-color: var(--primary);
476
476
  --_bg-color: transparent;
477
477
 
@@ -481,8 +481,8 @@
481
481
  gap: 0 var(--size-1);
482
482
  position: relative;
483
483
 
484
- &>.tab-input[type="radio"] {
485
- /* utils > .sr-only */
484
+ &>.ui-tab-input[type="radio"] {
485
+ /* utils > .ui-sr-only */
486
486
  /* TODO: use mixin for this when available */
487
487
  block-size: 1px;
488
488
  clip-path: inset(50%);
@@ -494,19 +494,23 @@
494
494
  &:checked {
495
495
 
496
496
  /* Checked Tab */
497
- &+[role="tab"] {
497
+ &+[role="tab"],
498
+ &+.ui-tab-label {
498
499
  border-block-end-color: var(--_accent-color);
499
500
  color: var(--_accent-color);
500
501
 
501
502
  /* Checked Panel */
502
- &+[role="tabpanel"] {
503
+ &+[role="tabpanel"],
504
+ &+.ui-tab-panel {
503
505
  display: block;
504
506
  }
505
507
  }
506
508
  }
507
509
 
508
510
  &:focus-visible {
509
- &+[role="tab"] {
511
+
512
+ &+[role="tab"],
513
+ &+.ui-tab-label {
510
514
  --focus-ring-color: var(--text-muted);
511
515
  --focus-ring-offset: calc(-1 * var(--size-2));
512
516
  outline: var(--focus-ring-width) var(--focus-ring-style) var(--focus-ring-color);
@@ -516,7 +520,8 @@
516
520
  }
517
521
 
518
522
  /* Tab */
519
- &>[role="tab"] {
523
+ &>[role="tab"],
524
+ &>.ui-tab-label {
520
525
  align-items: center;
521
526
  background-color: transparent;
522
527
  border-bottom: 2px solid transparent;
@@ -540,7 +545,8 @@
540
545
  }
541
546
 
542
547
  /* Tab Panel */
543
- &>[role="tabpanel"] {
548
+ &>[role="tabpanel"],
549
+ &>.ui-tab-panel {
544
550
  display: none;
545
551
  inline-size: 100%;
546
552
  order: 2;
@@ -549,7 +555,7 @@
549
555
  }
550
556
 
551
557
  @layer components.root {
552
- :where(.toggle-group) {
558
+ :where(.ui-toggle-group) {
553
559
  --_bg-color: var(--surface-default);
554
560
  --_border-color: var(--border-color);
555
561
  --_border-radius: var(--button-border-radius);
@@ -562,27 +568,27 @@
562
568
  overflow: hidden;
563
569
 
564
570
  /* Sizes */
565
- &.small {
566
- .toggle-button {
571
+ &.ui-small {
572
+ .ui-toggle-button {
567
573
  --_size: var(--field-size-small);
568
574
  }
569
575
  }
570
576
 
571
- &.x-small {
572
- .toggle-button {
577
+ &.ui-x-small {
578
+ .ui-toggle-button {
573
579
  --_size: var(--field-size-x-small);
574
580
  }
575
581
  }
576
582
 
577
583
  /* Toggle button */
578
- .toggle-button {
584
+ .ui-toggle-button {
579
585
  border: 0;
580
586
  border-radius: 0;
581
587
  margin: 0;
582
588
  }
583
589
 
584
- &:not(.vertical) {
585
- .toggle-button {
590
+ &:not(.ui-vertical) {
591
+ .ui-toggle-button {
586
592
  border-inline-end: 1px solid var(--_border-color);
587
593
 
588
594
  &:last-of-type {
@@ -591,10 +597,10 @@
591
597
  }
592
598
  }
593
599
 
594
- &.vertical {
600
+ &.ui-vertical {
595
601
  flex-direction: column;
596
602
 
597
- .toggle-button {
603
+ .ui-toggle-button {
598
604
  border-block-end: 1px solid var(--_border-color);
599
605
 
600
606
  &:last-of-type {
@@ -610,7 +616,7 @@
610
616
  */
611
617
 
612
618
  @layer components.root {
613
- :where(.toggle-button) {
619
+ :where(.ui-toggle-button) {
614
620
  --_button-bg-color: transparent;
615
621
  --_size: var(--field-size);
616
622
  --_svg-size: var(--size-4);
@@ -635,7 +641,7 @@
635
641
 
636
642
  input[type="checkbox"],
637
643
  input[type="radio"] {
638
- /* utils.css > .sr-only */
644
+ /* utils.css > .ui-sr-only */
639
645
  block-size: 1px;
640
646
  clip-path: inset(50%);
641
647
  inline-size: 1px;
@@ -646,7 +652,7 @@
646
652
 
647
653
  /* Element states */
648
654
  @media (pointer: fine) {
649
- &:hover:not(.disabled) {
655
+ &:hover:not(.ui-disabled) {
650
656
  --_button-bg-color: light-dark(oklch(0% 0 0 / 0.04), oklch(100% 0 0 / 0.08));
651
657
  }
652
658
  }
@@ -659,7 +665,7 @@
659
665
  }
660
666
 
661
667
  /* Disabled */
662
- &.disabled {
668
+ &.ui-disabled {
663
669
  border-color: color-mix(in oklch, var(--border-color) 50%, transparent);
664
670
  color: color-mix(in oklch, var(--text-primary) 30%, transparent);
665
671
  cursor: not-allowed;
@@ -684,25 +690,25 @@
684
690
  }
685
691
 
686
692
  /* Sizes */
687
- &.small {
693
+ &.ui-small {
688
694
  --_size: var(--field-size-small);
689
695
  }
690
696
 
691
- &.x-small {
697
+ &.ui-x-small {
692
698
  --_size: var(--field-size-x-small);
693
699
  }
694
700
  }
695
701
  }
696
702
 
697
703
  @layer components.root {
698
- :where(.anchor) {
704
+ :where(.ui-anchor) {
699
705
  anchor-name: --anchor;
700
706
  anchor-scope: --anchor;
701
707
  display: inline-block;
702
708
  inline-size: fit-content;
703
709
 
704
710
  /* Always-visible */
705
- &>.anchor-floating:not([popover]) {
711
+ &>.ui-anchor-floating:not([popover]) {
706
712
  block-size: max-content;
707
713
  inline-size: max-content;
708
714
  position: absolute;
@@ -712,7 +718,7 @@
712
718
  }
713
719
 
714
720
  /* Hover-triggered */
715
- &>.anchor-floating[popover] {
721
+ &>.ui-anchor-floating[popover] {
716
722
  inset: unset;
717
723
  margin: 0;
718
724
  position: absolute;
@@ -723,7 +729,7 @@
723
729
  }
724
730
 
725
731
  @layer components.root {
726
- :where(.avatar) {
732
+ :where(.ui-avatar) {
727
733
  --_bg-color: var(--primary);
728
734
  --_color: var(--color-1);
729
735
  --_width: 40px;
@@ -757,15 +763,15 @@
757
763
  position: absolute;
758
764
  }
759
765
 
760
- &.squared {
766
+ &.ui-squared {
761
767
  border-radius: 0;
762
768
  }
763
769
 
764
- &.rounded {
770
+ &.ui-rounded {
765
771
  border-radius: var(--radius-2);
766
772
  }
767
773
 
768
- &.squircle {
774
+ &.ui-squircle {
769
775
  border-radius: var(--radius-3);
770
776
 
771
777
  @supports (corner-shape: squircle) {
@@ -781,7 +787,7 @@
781
787
 
782
788
  display: flex;
783
789
 
784
- .avatar {
790
+ .ui-avatar {
785
791
  box-shadow: 0 0 0 2px var(--_outline-color);
786
792
  margin-inline-end: calc(-1 * var(--_margin));
787
793
  }
@@ -789,7 +795,7 @@
789
795
  }
790
796
 
791
797
  @layer components.root {
792
- :where(.card) {
798
+ :where(.ui-card) {
793
799
  --_bg-tonal: var(--surface-tonal);
794
800
  --_bg-elevated: var(--surface-elevated);
795
801
  --_bg-surface: var(--surface-default);
@@ -821,30 +827,30 @@
821
827
  position: relative;
822
828
 
823
829
  /* Variants */
824
- &.text {
830
+ &.ui-text {
825
831
  --_card-bg-color: transparent;
826
832
  --_card-border-color: transparent;
827
833
  --_card-border-width: 0;
828
834
  --_card-shadow: none;
829
835
  }
830
836
 
831
- &.tonal {
837
+ &.ui-tonal {
832
838
  --_card-bg-color: var(--_bg-tonal);
833
839
  --_card-border-width: 1px;
834
840
  }
835
841
 
836
- &.elevated {
842
+ &.ui-elevated {
837
843
  --_card-bg-color: var(--_bg-elevated);
838
844
  --_card-shadow: var(--_shadow-elevated);
839
845
  }
840
846
 
841
- &.outlined {
847
+ &.ui-outlined {
842
848
  --_card-bg-color: var(--_bg-surface);
843
849
  --_card-border-color: var(--_border-color);
844
850
  --_card-border-width: 1px;
845
851
  }
846
852
 
847
- &> :where(hgroup, .content) {
853
+ &> :where(hgroup, .ui-content) {
848
854
  padding-inline: var(--size-3);
849
855
 
850
856
  &:last-child {
@@ -872,31 +878,31 @@
872
878
  }
873
879
 
874
880
  /* Content */
875
- &>.content:where(:only-child, :first-child) {
881
+ &>.ui-content:where(:only-child, :first-child) {
876
882
  padding-block: var(--size-3) var(--size-4);
877
883
  }
878
884
 
879
885
  /* Actions */
880
- &>.actions {
886
+ &>.ui-actions {
881
887
  display: flex;
882
888
  gap: var(--size-2);
883
889
  margin-block: var(--size-2) 0;
884
890
  padding-block-end: var(--size-2);
885
891
  padding-inline: var(--size-3);
886
892
 
887
- &:has(.button:first-child[class="button"]) {
893
+ &:has(.ui-button:first-child[class="ui-button"]) {
888
894
  padding-inline: var(--size-1) var(--size-3);
889
895
  }
890
896
 
891
- &:has(.button:not([class="button"])) {
897
+ &:has(.ui-button:not([class="ui-button"])) {
892
898
  padding-block-end: var(--size-2);
893
899
  }
894
900
 
895
901
  /* Alignment */
896
- &.align-end {
902
+ &.ui-align-end {
897
903
  justify-content: end;
898
904
 
899
- &:has(.button:first-child[class="button"]) {
905
+ &:has(.ui-button:first-child[class="ui-button"]) {
900
906
  padding-inline: var(--size-3) var(--size-1);
901
907
  }
902
908
  }
@@ -907,7 +913,7 @@
907
913
  }
908
914
 
909
915
  @layer components.root {
910
- :where(.chip) {
916
+ :where(.ui-chip) {
911
917
  --_bg-color: var(--surface-tonal);
912
918
  --_border-color: var(--border-color);
913
919
  --_color: var(--text-primary);
@@ -925,12 +931,12 @@
925
931
  text-decoration: none;
926
932
 
927
933
  /* Variants */
928
- &.tonal {
934
+ &.ui-tonal {
929
935
  --_bg-color: var(--surface-tonal);
930
936
  --_color: var(--text-primary);
931
937
  }
932
938
 
933
- &.outlined {
939
+ &.ui-outlined {
934
940
  --_bg-color: var(--surface-default);
935
941
  --_color: var(--text-primary);
936
942
  }
@@ -959,11 +965,11 @@
959
965
  }
960
966
 
961
967
  /* Sizes */
962
- &.small {
968
+ &.ui-small {
963
969
  block-size: var(--size-5);
964
970
  }
965
971
 
966
- &.multiline {
972
+ &.ui-multiline {
967
973
  block-size: auto;
968
974
  }
969
975
 
@@ -995,7 +1001,7 @@
995
1001
  }
996
1002
 
997
1003
  @layer components.root {
998
- :where(.description-list) {
1004
+ :where(.ui-description-list) {
999
1005
  --_border-style: solid;
1000
1006
  --_border-width: 1px;
1001
1007
 
@@ -1004,17 +1010,18 @@
1004
1010
  margin: 0;
1005
1011
  padding: 0;
1006
1012
 
1007
- &.dotted {
1013
+ &.ui-dotted {
1008
1014
  --_border-style: dotted;
1009
1015
  --_border-width: 2px;
1010
1016
  }
1011
1017
 
1012
- .item {
1018
+ .ui-item {
1013
1019
  display: grid;
1014
1020
  margin: 0;
1015
1021
  padding: 0;
1016
1022
 
1017
- dt {
1023
+ dt,
1024
+ .ui-term {
1018
1025
  display: block;
1019
1026
  font-weight: 700;
1020
1027
  overflow: hidden;
@@ -1029,13 +1036,14 @@
1029
1036
  @container (width > 45ch) {
1030
1037
  gap: var(--size-1);
1031
1038
 
1032
- .item {
1039
+ .ui-item {
1033
1040
  align-items: baseline;
1034
1041
  display: grid;
1035
1042
  gap: var(--size-1);
1036
1043
  grid-template-columns: 1fr auto;
1037
1044
 
1038
- dt {
1045
+ dt,
1046
+ .ui-term {
1039
1047
  inline-size: max-content;
1040
1048
 
1041
1049
  &::after {
@@ -1049,10 +1057,11 @@
1049
1057
  }
1050
1058
  }
1051
1059
 
1052
- &.bordered .item {
1060
+ &.ui-bordered .ui-item {
1053
1061
  grid-template-columns: auto 1fr auto;
1054
1062
 
1055
- dt {
1063
+ dt,
1064
+ .ui-term {
1056
1065
  order: 0;
1057
1066
  }
1058
1067
 
@@ -1073,28 +1082,28 @@
1073
1082
  }
1074
1083
 
1075
1084
  @layer components.root {
1076
- :where(hr) {
1085
+ :where(.ui-divider) {
1077
1086
  background-color: var(--border-color);
1078
1087
  block-size: var(--border-size-1);
1079
1088
  margin-block: var(--size-fluid-3);
1080
1089
 
1081
1090
  /* Border color */
1082
- &.border-filled {
1091
+ &.ui-border-filled {
1083
1092
  background-color: var(--surface-filled);
1084
1093
  }
1085
1094
 
1086
- &.border-primary {
1095
+ &.ui-border-primary {
1087
1096
  background-color: var(--primary);
1088
1097
  }
1089
1098
 
1090
- &.border-tonal {
1099
+ &.ui-border-tonal {
1091
1100
  background-color: var(--surface-tonal);
1092
1101
  }
1093
1102
  }
1094
1103
  }
1095
1104
 
1096
1105
  @layer components.root {
1097
- :where(.link) {
1106
+ :where(.ui-link) {
1098
1107
  color: var(--primary);
1099
1108
  cursor: pointer;
1100
1109
  font-weight: 700;
@@ -1116,7 +1125,7 @@
1116
1125
  }
1117
1126
 
1118
1127
  @layer components.root {
1119
- :where(table) {
1128
+ :where(.ui-table) {
1120
1129
  --_table-border-radius: var(--border-radius);
1121
1130
 
1122
1131
  border-collapse: separate;
@@ -1250,7 +1259,7 @@
1250
1259
  }
1251
1260
 
1252
1261
  /* Spacious */
1253
- &.spacious {
1262
+ &.ui-spacious {
1254
1263
 
1255
1264
  th,
1256
1265
  td {
@@ -1272,7 +1281,7 @@
1272
1281
  }
1273
1282
 
1274
1283
  /* Dense */
1275
- &.dense {
1284
+ &.ui-dense {
1276
1285
 
1277
1286
  th,
1278
1287
  td {
@@ -1296,7 +1305,7 @@
1296
1305
  }
1297
1306
 
1298
1307
  @layer components.root {
1299
- :where(progress) {
1308
+ :where(.ui-progress) {
1300
1309
  --_accent-color: var(--primary);
1301
1310
  --_bg-color: var(--surface-tonal);
1302
1311
 
@@ -1312,15 +1321,15 @@
1312
1321
  vertical-align: baseline;
1313
1322
 
1314
1323
  /* Color */
1315
- &.filled {
1324
+ &.ui-filled {
1316
1325
  --_bg-color: var(--surface-filled);
1317
1326
  }
1318
1327
 
1319
- &.default {
1328
+ &.ui-default {
1320
1329
  --_bg-color: var(--surface-default);
1321
1330
  }
1322
1331
 
1323
- &.tonal {
1332
+ &.ui-tonal {
1324
1333
  --_bg-color: var(--surface-tonal);
1325
1334
  }
1326
1335
 
@@ -1417,7 +1426,7 @@
1417
1426
  vertical-align: -0.14em;
1418
1427
  }
1419
1428
 
1420
- &:not(button.button):not(:empty) {
1429
+ &:not(button.ui-button):not(:empty) {
1421
1430
  &::before {
1422
1431
  margin-inline-end: 0.5em;
1423
1432
  }
@@ -1432,7 +1441,7 @@
1432
1441
  }
1433
1442
 
1434
1443
  @layer components.root {
1435
- label.checkbox {
1444
+ label.ui-checkbox {
1436
1445
  --_input-size: var(--size-4);
1437
1446
 
1438
1447
  align-items: center;
@@ -1460,7 +1469,7 @@
1460
1469
 
1461
1470
  /* Required dot */
1462
1471
  &:has(:invalid) {
1463
- .label:after {
1472
+ .ui-label:after {
1464
1473
  color: var(--red);
1465
1474
  content: "*";
1466
1475
  inset: 0 -0.25ex auto auto;
@@ -1469,7 +1478,7 @@
1469
1478
  }
1470
1479
 
1471
1480
  /* Label */
1472
- .label {
1481
+ .ui-label {
1473
1482
  color: var(--text-primary);
1474
1483
  font-size: var(--font-size-05);
1475
1484
  grid-column: 2;
@@ -1479,7 +1488,7 @@
1479
1488
  }
1480
1489
 
1481
1490
  /* End text */
1482
- :where(.end-text) {
1491
+ :where(.ui-end-text) {
1483
1492
  color: var(--text-muted);
1484
1493
  font-size: var(--font-size-0);
1485
1494
  grid-column: 2;
@@ -1489,14 +1498,14 @@
1489
1498
  }
1490
1499
 
1491
1500
  /* Spread layout */
1492
- &.spread {
1501
+ &.ui-spread {
1493
1502
  align-items: center;
1494
1503
  column-gap: var(--size-4);
1495
1504
  grid-auto-flow: unset;
1496
1505
  grid-template-columns: 1fr auto;
1497
1506
  inline-size: 100%;
1498
1507
 
1499
- .label {
1508
+ .ui-label {
1500
1509
  font-weight: 600;
1501
1510
  grid-column: 1;
1502
1511
  grid-row: 1;
@@ -1508,18 +1517,18 @@
1508
1517
  grid-row: 1;
1509
1518
  }
1510
1519
 
1511
- :where(.end-text) {
1520
+ :where(.ui-end-text) {
1512
1521
  grid-column: 1;
1513
1522
  grid-row: 2;
1514
1523
  }
1515
1524
  }
1516
1525
 
1517
1526
  /* Stacked layout */
1518
- &.stack {
1527
+ &.ui-stack {
1519
1528
  justify-items: center;
1520
1529
  grid-auto-columns: unset;
1521
1530
 
1522
- .label {
1531
+ .ui-label {
1523
1532
  grid-column: 1/-1;
1524
1533
  grid-row: 2;
1525
1534
  margin-block-start: var(--size-1);
@@ -1531,7 +1540,7 @@
1531
1540
  }
1532
1541
  }
1533
1542
 
1534
- .end-text {
1543
+ .ui-end-text {
1535
1544
  grid-column: 1/-1;
1536
1545
  grid-row: 3;
1537
1546
  }
@@ -1590,13 +1599,13 @@
1590
1599
  }
1591
1600
 
1592
1601
  /* Sizes */
1593
- &.small {
1602
+ &.ui-small {
1594
1603
  input[type="checkbox"] {
1595
1604
  --_input-size: var(--size-3);
1596
1605
  }
1597
1606
  }
1598
1607
 
1599
- &.large {
1608
+ &.ui-large {
1600
1609
  input[type="checkbox"] {
1601
1610
  --_input-size: var(--size-5);
1602
1611
  }
@@ -1607,7 +1616,7 @@
1607
1616
  &:has(:user-invalid) {
1608
1617
  --palette-source: oklch(0.58 0.21 var(--hue-red));
1609
1618
 
1610
- :where(.end-text) {
1619
+ :where(.ui-end-text) {
1611
1620
  color: var(--primary);
1612
1621
  }
1613
1622
  }
@@ -1638,7 +1647,7 @@
1638
1647
  }
1639
1648
 
1640
1649
  @layer components.root {
1641
- label.radio {
1650
+ label.ui-radio {
1642
1651
  --_input-size: 1.125rem;
1643
1652
  --_indicator-size: 50%;
1644
1653
 
@@ -1667,7 +1676,7 @@
1667
1676
 
1668
1677
  /* Required dot */
1669
1678
  &:has(:invalid) {
1670
- .label:after {
1679
+ .ui-label:after {
1671
1680
  color: var(--red);
1672
1681
  content: "*";
1673
1682
  inset: 0 -0.25ex auto auto;
@@ -1676,7 +1685,7 @@
1676
1685
  }
1677
1686
 
1678
1687
  /* Label */
1679
- .label {
1688
+ .ui-label {
1680
1689
  color: var(--text-primary);
1681
1690
  font-size: var(--font-size-05);
1682
1691
  grid-column: 2;
@@ -1686,7 +1695,7 @@
1686
1695
  }
1687
1696
 
1688
1697
  /* End text */
1689
- :where(.end-text) {
1698
+ :where(.ui-end-text) {
1690
1699
  color: var(--text-muted);
1691
1700
  font-size: var(--font-size-0);
1692
1701
  grid-column: 2;
@@ -1696,11 +1705,11 @@
1696
1705
  }
1697
1706
 
1698
1707
  /* Stacked layout */
1699
- &.stack {
1708
+ &.ui-stack {
1700
1709
  grid-auto-columns: unset;
1701
1710
  justify-items: center;
1702
1711
 
1703
- .label {
1712
+ .ui-label {
1704
1713
  grid-column: 1/-1;
1705
1714
  grid-row: 2;
1706
1715
  margin-block-start: var(--size-1);
@@ -1712,7 +1721,7 @@
1712
1721
  }
1713
1722
  }
1714
1723
 
1715
- .end-text {
1724
+ .ui-end-text {
1716
1725
  grid-column: 1/-1;
1717
1726
  grid-row: 3;
1718
1727
  }
@@ -1761,14 +1770,14 @@
1761
1770
  }
1762
1771
 
1763
1772
  /* Sizes */
1764
- &.small {
1773
+ &.ui-small {
1765
1774
  input[type="radio"] {
1766
1775
  --_input-size: var(--size-3);
1767
1776
 
1768
1777
  }
1769
1778
  }
1770
1779
 
1771
- &.large {
1780
+ &.ui-large {
1772
1781
  input[type="radio"] {
1773
1782
  --_input-size: var(--size-4);
1774
1783
 
@@ -1780,7 +1789,7 @@
1780
1789
  &:has(:user-invalid) {
1781
1790
  --palette-source: oklch(0.58 0.21 var(--hue-red));
1782
1791
 
1783
- :where(.end-text) {
1792
+ :where(.ui-end-text) {
1784
1793
  color: var(--primary);
1785
1794
  }
1786
1795
  }
@@ -1811,7 +1820,7 @@
1811
1820
  }
1812
1821
 
1813
1822
  @layer components.root {
1814
- :where(.range) {
1823
+ :where(.ui-range) {
1815
1824
  display: grid;
1816
1825
  gap: var(--size-1) 0;
1817
1826
  /* Two-column base so the optional .value cell can sit next to the
@@ -1820,7 +1829,7 @@
1820
1829
  grid-template-columns: 1fr auto;
1821
1830
  position: relative;
1822
1831
 
1823
- .label {
1832
+ .ui-label {
1824
1833
  color: var(--text-primary);
1825
1834
  font-size: var(--font-size-05);
1826
1835
  font-weight: 600;
@@ -1830,7 +1839,7 @@
1830
1839
 
1831
1840
  /* Live current-value readout. Pairs with the <output> element
1832
1841
  rendered by the Range component (or hand-written .value markup). */
1833
- :where(.value) {
1842
+ :where(.ui-value) {
1834
1843
  color: var(--text-muted);
1835
1844
  font-size: var(--font-size-0);
1836
1845
  font-variant-numeric: tabular-nums;
@@ -1841,7 +1850,7 @@
1841
1850
  text-align: end;
1842
1851
  }
1843
1852
 
1844
- .start-text {
1853
+ .ui-start-text {
1845
1854
  color: var(--text-muted);
1846
1855
  font-size: var(--font-size-0);
1847
1856
  grid-column: 1/-1;
@@ -1849,7 +1858,7 @@
1849
1858
  line-height: 1.5;
1850
1859
  }
1851
1860
 
1852
- :where(.end-text) {
1861
+ :where(.ui-end-text) {
1853
1862
  color: var(--text-muted);
1854
1863
  font-size: var(--font-size-0);
1855
1864
  grid-column: 1/-1;
@@ -1883,40 +1892,40 @@
1883
1892
  opacity: 0.64;
1884
1893
  user-select: none;
1885
1894
 
1886
- .label,
1887
- .value,
1888
- .start-text,
1889
- .end-text {
1895
+ .ui-label,
1896
+ .ui-value,
1897
+ .ui-start-text,
1898
+ .ui-end-text {
1890
1899
  cursor: not-allowed;
1891
1900
  }
1892
1901
  }
1893
1902
 
1894
1903
  /* Color */
1895
- &.filled input[type="range"] {
1904
+ &.ui-filled input[type="range"] {
1896
1905
  --_track-color: var(--surface-filled);
1897
1906
  }
1898
1907
 
1899
- &.default input[type="range"] {
1908
+ &.ui-default input[type="range"] {
1900
1909
  --_track-color: var(--surface-default);
1901
1910
  }
1902
1911
 
1903
- &.tonal input[type="range"] {
1912
+ &.ui-tonal input[type="range"] {
1904
1913
  --_track-color: var(--surface-tonal);
1905
1914
  }
1906
1915
 
1907
1916
  /* Orientation */
1908
- &.spread {
1917
+ &.ui-spread {
1909
1918
  align-items: center;
1910
1919
  column-gap: var(--size-4);
1911
1920
  container-type: inline-size;
1912
1921
  grid-template-columns: 1fr auto;
1913
1922
 
1914
- .label {
1923
+ .ui-label {
1915
1924
  grid-column: 1;
1916
1925
  grid-row: 1;
1917
1926
  }
1918
1927
 
1919
- .start-text {
1928
+ .ui-start-text {
1920
1929
  color: var(--text-muted);
1921
1930
  display: block;
1922
1931
  font-size: var(--font-size-0);
@@ -1935,12 +1944,12 @@
1935
1944
  /* In spread mode, the value sits below the slider in col 2
1936
1945
  (where end-text would normally land). When end-text is also
1937
1946
  present it shifts down a row to avoid collision. */
1938
- :where(.value) {
1947
+ :where(.ui-value) {
1939
1948
  grid-column: 2;
1940
1949
  grid-row: 2;
1941
1950
  }
1942
1951
 
1943
- :where(.end-text) {
1952
+ :where(.ui-end-text) {
1944
1953
  grid-column: 2;
1945
1954
  grid-row: 2;
1946
1955
  text-align: end;
@@ -1953,15 +1962,15 @@
1953
1962
 
1954
1963
  /* When both datalist and end-text exist, push end-text below the datalist
1955
1964
  so they don't collide on the same grid cell. */
1956
- &:has(datalist) :where(.end-text) {
1965
+ &:has(datalist) :where(.ui-end-text) {
1957
1966
  grid-row: 3;
1958
1967
  }
1959
1968
 
1960
- &:has(.value) :where(.end-text) {
1969
+ &:has(.ui-value) :where(.ui-end-text) {
1961
1970
  grid-row: 3;
1962
1971
  }
1963
1972
 
1964
- &:has(.value):has(datalist) :where(.end-text) {
1973
+ &:has(.ui-value):has(datalist) :where(.ui-end-text) {
1965
1974
  grid-row: 4;
1966
1975
  }
1967
1976
 
@@ -1972,20 +1981,20 @@
1972
1981
  grid-column: 1/-1;
1973
1982
  }
1974
1983
 
1975
- .label {
1984
+ .ui-label {
1976
1985
  grid-row: 1;
1977
1986
  }
1978
1987
 
1979
1988
  /* Share row 1 with the label: the label's text stays left-aligned
1980
1989
  in its full-width cell, while the value shrinks to fit and
1981
1990
  right-aligns. Visually reads as a "[name ........ value]" row. */
1982
- :where(.value) {
1991
+ :where(.ui-value) {
1983
1992
  grid-row: 1;
1984
1993
  justify-self: end;
1985
1994
  text-align: end;
1986
1995
  }
1987
1996
 
1988
- .start-text {
1997
+ .ui-start-text {
1989
1998
  grid-row: 2;
1990
1999
  }
1991
2000
 
@@ -1999,7 +2008,7 @@
1999
2008
  grid-row: 4;
2000
2009
  }
2001
2010
 
2002
- :where(.end-text) {
2011
+ :where(.ui-end-text) {
2003
2012
  grid-row: 5;
2004
2013
  text-align: start;
2005
2014
  }
@@ -2012,9 +2021,9 @@
2012
2021
  --_thumb-bg: var(--color-9);
2013
2022
  --_thumb-highlight-color: oklch(from var(--color-9) 70% 100% h / 20%);
2014
2023
 
2015
- .start-text,
2016
- .end-text,
2017
- .value {
2024
+ .ui-start-text,
2025
+ .ui-end-text,
2026
+ .ui-value {
2018
2027
  color: var(--color-9);
2019
2028
  }
2020
2029
  }
@@ -2086,7 +2095,7 @@
2086
2095
  transition: box-shadow 0.1s ease;
2087
2096
  }
2088
2097
 
2089
- .fieldset-item:focus-within & {
2098
+ .ui-fieldset-item:focus-within & {
2090
2099
  border-color: var(--gray-14);
2091
2100
  }
2092
2101
  }
@@ -2106,14 +2115,14 @@
2106
2115
  transition: box-shadow 0.1s ease;
2107
2116
  }
2108
2117
 
2109
- .fieldset-item:focus-within & {
2118
+ .ui-fieldset-item:focus-within & {
2110
2119
  border-color: var(--gray-14);
2111
2120
  }
2112
2121
  }
2113
2122
 
2114
2123
  /* Element state */
2115
- .range:has(:user-invalid) &,
2116
- .range[data-invalid] & {
2124
+ .ui-range:has(:user-invalid) &,
2125
+ .ui-range[data-invalid] & {
2117
2126
  --_track-fill-color: var(--color-9);
2118
2127
  }
2119
2128
 
@@ -2149,7 +2158,7 @@
2149
2158
  }
2150
2159
 
2151
2160
  @layer components.root {
2152
- :where(.switch) {
2161
+ :where(.ui-switch) {
2153
2162
  --_accent-color: var(--primary);
2154
2163
  --_accent-contrast: var(--primary-contrast);
2155
2164
 
@@ -2258,28 +2267,28 @@
2258
2267
  }
2259
2268
 
2260
2269
  /* Icons */
2261
- &:has(.icon-checked, .icon-unchecked) {
2270
+ &:has(.ui-icon-checked, .ui-icon-unchecked) {
2262
2271
  [role="switch"] {
2263
2272
  grid-column: 1 / -1;
2264
2273
  grid-row: 1;
2265
2274
  }
2266
2275
 
2267
2276
  &:has([role="switch"]:checked) {
2268
- .icon-unchecked {
2277
+ .ui-icon-unchecked {
2269
2278
  display: none;
2270
2279
  }
2271
2280
 
2272
- .icon-checked {
2281
+ .ui-icon-checked {
2273
2282
  display: block;
2274
2283
  }
2275
2284
  }
2276
2285
 
2277
- .icon-checked {
2286
+ .ui-icon-checked {
2278
2287
  display: none;
2279
2288
  }
2280
2289
 
2281
- .icon-unchecked,
2282
- .icon-checked {
2290
+ .ui-icon-unchecked,
2291
+ .ui-icon-checked {
2283
2292
  grid-column: 1;
2284
2293
  grid-row: 1;
2285
2294
  pointer-events: none;
@@ -2291,18 +2300,18 @@
2291
2300
  }
2292
2301
  }
2293
2302
 
2294
- .icon-unchecked {
2303
+ .ui-icon-unchecked {
2295
2304
  margin-inline-start: calc(var(--_track-width) - var(--_dot-size) - var(--size-1));
2296
2305
  }
2297
2306
 
2298
- .icon-checked {
2307
+ .ui-icon-checked {
2299
2308
  margin-inline-start: var(--size-1);
2300
2309
  }
2301
2310
  }
2302
2311
 
2303
2312
  /* Required dot */
2304
2313
  &:has(:invalid) {
2305
- .label:after {
2314
+ .ui-label:after {
2306
2315
  color: var(--red);
2307
2316
  content: "*";
2308
2317
  inset: 0 -0.25ex auto auto;
@@ -2322,7 +2331,7 @@
2322
2331
  }
2323
2332
 
2324
2333
  /* Label */
2325
- .label {
2334
+ .ui-label {
2326
2335
  color: var(--text-primary);
2327
2336
  font-size: var(--font-size-05);
2328
2337
  grid-column: 2;
@@ -2334,7 +2343,7 @@
2334
2343
  }
2335
2344
 
2336
2345
  /* End text */
2337
- :where(.end-text) {
2346
+ :where(.ui-end-text) {
2338
2347
  color: var(--text-muted);
2339
2348
  font-size: var(--font-size-0);
2340
2349
  grid-column: 2;
@@ -2344,21 +2353,21 @@
2344
2353
  }
2345
2354
 
2346
2355
  /* Size */
2347
- &.small {
2356
+ &.ui-small {
2348
2357
  --_dot-size: 0.75rem;
2349
2358
  --_track-height: var(--size-4);
2350
2359
  --_track-width: 2.5rem;
2351
2360
  }
2352
2361
 
2353
2362
  /* Spread layout */
2354
- &.spread {
2363
+ &.ui-spread {
2355
2364
  align-items: center;
2356
2365
  column-gap: var(--size-4);
2357
2366
  grid-auto-flow: unset;
2358
2367
  grid-template-columns: 1fr auto;
2359
2368
  inline-size: 100%;
2360
2369
 
2361
- .label {
2370
+ .ui-label {
2362
2371
  font-weight: 600;
2363
2372
  grid-column: 1;
2364
2373
  grid-row: 1;
@@ -2370,34 +2379,34 @@
2370
2379
  grid-row: 1;
2371
2380
  }
2372
2381
 
2373
- &:has(.icon-checked, .icon-unchecked) {
2382
+ &:has(.ui-icon-checked, .ui-icon-unchecked) {
2374
2383
 
2375
2384
  input[role="switch"],
2376
- .icon-checked,
2377
- .icon-unchecked {
2385
+ .ui-icon-checked,
2386
+ .ui-icon-unchecked {
2378
2387
  grid-column: 2;
2379
2388
  }
2380
2389
  }
2381
2390
 
2382
- :where(.end-text) {
2391
+ :where(.ui-end-text) {
2383
2392
  grid-column: 1;
2384
2393
  grid-row: 2;
2385
2394
  }
2386
2395
  }
2387
2396
 
2388
2397
  /* Stacked layout */
2389
- &.stack {
2398
+ &.ui-stack {
2390
2399
  grid-auto-columns: unset;
2391
2400
  justify-items: center;
2392
2401
 
2393
- .label {
2402
+ .ui-label {
2394
2403
  grid-column: 1/-1;
2395
2404
  grid-row: 2;
2396
2405
  margin-block-start: var(--size-1);
2397
2406
  padding-inline: 1ex;
2398
2407
  }
2399
2408
 
2400
- .end-text {
2409
+ .ui-end-text {
2401
2410
  grid-column: 1/-1;
2402
2411
  grid-row: 3;
2403
2412
  }
@@ -2410,7 +2419,7 @@
2410
2419
  outline: 2px solid var(--color-9);
2411
2420
  }
2412
2421
 
2413
- .end-text {
2422
+ .ui-end-text {
2414
2423
  color: var(--color-9);
2415
2424
  }
2416
2425
  }
@@ -2448,7 +2457,7 @@
2448
2457
  /* > .toast:nth-last-child(n + 6) { display: none; } */
2449
2458
  }
2450
2459
 
2451
- :where(.toast) {
2460
+ :where(.ui-toast) {
2452
2461
  --_anim-enter: 0.3s;
2453
2462
  --_anim-exit: 0.3s;
2454
2463
 
@@ -2476,11 +2485,11 @@
2476
2485
  animation-play-state: paused;
2477
2486
  }
2478
2487
 
2479
- &.exiting {
2488
+ &.ui-exiting {
2480
2489
  animation: toast-exit var(--_anim-exit) var(--ease-in-3) forwards;
2481
2490
  }
2482
2491
 
2483
- .icon {
2492
+ .ui-icon {
2484
2493
  background: no-repeat center / contain;
2485
2494
  block-size: var(--size-4);
2486
2495
  flex-shrink: 0;
@@ -2488,25 +2497,25 @@
2488
2497
  }
2489
2498
 
2490
2499
  /* Hide the icon slot when there's no severity to render against. */
2491
- &:not([data-severity]) .icon {
2500
+ &:not([data-severity]) .ui-icon {
2492
2501
  display: none;
2493
2502
  }
2494
2503
 
2495
- .content {
2504
+ .ui-content {
2496
2505
  font-size: var(--font-size-05);
2497
2506
  word-break: break-word;
2498
2507
  }
2499
2508
 
2500
- .title {
2509
+ .ui-title {
2501
2510
  font-weight: 600;
2502
2511
  }
2503
2512
 
2504
- .description {
2513
+ .ui-description {
2505
2514
  color: oklch(from currentColor l c h / 75%);
2506
2515
  font-size: var(--font-size-0);
2507
2516
  }
2508
2517
 
2509
- .close-button {
2518
+ .ui-close-button {
2510
2519
  background: none;
2511
2520
  border: none;
2512
2521
  color: inherit;
@@ -2523,19 +2532,19 @@
2523
2532
  }
2524
2533
 
2525
2534
  /* Severity icons via CSS data URIs — keeps icon assets out of JS strings. */
2526
- &[data-severity="success"] .icon {
2535
+ &[data-severity="success"] .ui-icon {
2527
2536
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%2322c55e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M22 11.08V12a10 10 0 1 1-5.93-9.14'/><path d='m9 11 3 3L22 4'/></svg>");
2528
2537
  }
2529
2538
 
2530
- &[data-severity="info"] .icon {
2539
+ &[data-severity="info"] .ui-icon {
2531
2540
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%233b82f6' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M12 16v-4'/><path d='M12 8h.01'/></svg>");
2532
2541
  }
2533
2542
 
2534
- &[data-severity="warning"] .icon {
2543
+ &[data-severity="warning"] .ui-icon {
2535
2544
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23f59e0b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3'/><path d='M12 9v4'/><path d='M12 17h.01'/></svg>");
2536
2545
  }
2537
2546
 
2538
- &[data-severity="critical"] .icon {
2547
+ &[data-severity="critical"] .ui-icon {
2539
2548
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23ef4444' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='m15 9-6 6'/><path d='m9 9 6 6'/></svg>");
2540
2549
  }
2541
2550
  }
@@ -2581,60 +2590,60 @@
2581
2590
 
2582
2591
  @layer components.root {
2583
2592
 
2584
- :where(.p) {
2593
+ :where(.ui-p) {
2585
2594
  text-wrap: pretty;
2586
2595
 
2587
- &.small {
2596
+ &.ui-small {
2588
2597
  font-size: var(--font-size-1);
2589
2598
  }
2590
2599
 
2591
- &.large {
2600
+ &.ui-large {
2592
2601
  font-size: var(--font-size-3);
2593
2602
  }
2594
2603
  }
2595
2604
 
2596
- :where(.h1, .h2, .h3, .h4, .h5, .h6) {
2605
+ :where(.ui-h1, .ui-h2, .ui-h3, .ui-h4, .ui-h5, .ui-h6) {
2597
2606
  color: var(--text-primary);
2598
2607
  font-weight: 700;
2599
2608
  text-wrap: pretty;
2600
2609
  }
2601
2610
 
2602
- :where(.h1) {
2611
+ :where(.ui-h1) {
2603
2612
  font-size: var(--font-size-h1, var(--font-size-7));
2604
2613
  letter-spacing: -0.02em;
2605
2614
  line-height: 1.15;
2606
2615
  }
2607
2616
 
2608
- :where(.h2) {
2617
+ :where(.ui-h2) {
2609
2618
  font-size: var(--font-size-h2, var(--font-size-5, 2rem));
2610
2619
  letter-spacing: -0.02em;
2611
2620
  line-height: 1.2;
2612
2621
  }
2613
2622
 
2614
- :where(.h3) {
2623
+ :where(.ui-h3) {
2615
2624
  font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
2616
2625
  letter-spacing: -0.01em;
2617
2626
  line-height: 1.167;
2618
2627
  }
2619
2628
 
2620
- :where(.h4) {
2629
+ :where(.ui-h4) {
2621
2630
  font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
2622
2631
  letter-spacing: -0.01em;
2623
2632
  line-height: 1.235;
2624
2633
  }
2625
2634
 
2626
- :where(.h5) {
2635
+ :where(.ui-h5) {
2627
2636
  font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
2628
2637
  line-height: 1.334;
2629
2638
  }
2630
2639
 
2631
- :where(.h6) {
2640
+ :where(.ui-h6) {
2632
2641
  font-size: var(--font-size-h6, var(--font-size-1, 1rem));
2633
2642
  line-height: 1;
2634
2643
  }
2635
2644
 
2636
2645
  /** Overline */
2637
- :where(.overline) {
2646
+ :where(.ui-overline) {
2638
2647
  color: light-dark(oklch(from var(--text-muted) calc(l * 1.25) c h),
2639
2648
  oklch(from var(--text-muted) calc(l * 0.75) c h));
2640
2649
  font-size: var(--font-size-0);
@@ -2643,7 +2652,7 @@
2643
2652
  text-transform: uppercase;
2644
2653
  }
2645
2654
 
2646
- :where(.hgroup) {
2655
+ :where(.ui-hgroup) {
2647
2656
  &>p {
2648
2657
  margin: 0;
2649
2658
  }
@@ -2675,7 +2684,7 @@
2675
2684
  }
2676
2685
 
2677
2686
  /** Caption */
2678
- :where(.caption) {
2687
+ :where(.ui-caption) {
2679
2688
  color: var(--text-muted);
2680
2689
  font-size: var(--font-size-0);
2681
2690
  line-height: 1.6;
@@ -2684,7 +2693,7 @@
2684
2693
 
2685
2694
 
2686
2695
  /* Inline text elements — class utilities (work anywhere) */
2687
- :where(.u, .abbr, .dfn) {
2696
+ :where(.ui-u, .ui-abbr, .ui-dfn) {
2688
2697
  text-decoration: underline;
2689
2698
  text-underline-offset: 1px;
2690
2699
 
@@ -2693,7 +2702,7 @@
2693
2702
  }
2694
2703
  }
2695
2704
 
2696
- :where(.abbr, .dfn) {
2705
+ :where(.ui-abbr, .ui-dfn) {
2697
2706
  font-style: normal;
2698
2707
  text-decoration: var(--color-9) underline dotted;
2699
2708
 
@@ -2707,21 +2716,21 @@
2707
2716
  }
2708
2717
  }
2709
2718
 
2710
- :where(.sup) {
2719
+ :where(.ui-sup) {
2711
2720
  font-size: 0.5em;
2712
2721
  vertical-align: super;
2713
2722
  }
2714
2723
 
2715
- :where(p, span).small {
2724
+ :where(p, span).ui-small {
2716
2725
  font-size: max(0.5em, var(--font-size-0, 0.75rem));
2717
2726
  }
2718
2727
 
2719
- :where(.cite) {
2728
+ :where(.ui-cite) {
2720
2729
  font-style: italic;
2721
2730
  }
2722
2731
 
2723
2732
  /* Code */
2724
- :where(.kbd) {
2733
+ :where(.ui-kbd) {
2725
2734
  font-family: var(--font-mono);
2726
2735
  background-color: var(--text-muted);
2727
2736
  border-color: var(--text-muted);
@@ -2732,34 +2741,34 @@
2732
2741
  word-break: break-word;
2733
2742
  }
2734
2743
 
2735
- :where(.mark) {
2744
+ :where(.ui-mark) {
2736
2745
  border-radius: var(--radius-2);
2737
2746
  box-decoration-break: clone;
2738
2747
  padding: .1ex .3ex;
2739
2748
  vertical-align: baseline;
2740
2749
  }
2741
2750
 
2742
- :where(.s) {
2751
+ :where(.ui-s) {
2743
2752
  text-decoration: line-through;
2744
2753
  }
2745
2754
 
2746
- :where(.sub) {
2755
+ :where(.ui-sub) {
2747
2756
  font-size: 0.75em;
2748
2757
  vertical-align: sub;
2749
2758
  }
2750
2759
 
2751
- :where(.del) {
2760
+ :where(.ui-del) {
2752
2761
  color: var(--color-9);
2753
2762
  text-decoration: line-through;
2754
2763
  }
2755
2764
 
2756
- :where(.ins) {
2765
+ :where(.ui-ins) {
2757
2766
  color: var(--color-9);
2758
2767
  text-decoration: underline;
2759
2768
  text-underline-offset: 1px;
2760
2769
  }
2761
2770
 
2762
- :where(.var) {
2771
+ :where(.ui-var) {
2763
2772
  font-family: var(--font-mono);
2764
2773
  background-color: var(--text-muted);
2765
2774
  border-color: var(--text-muted);
@@ -2770,12 +2779,12 @@
2770
2779
  word-break: break-word;
2771
2780
  }
2772
2781
 
2773
- :where(.samp) {
2782
+ :where(.ui-samp) {
2774
2783
  font-family: var(--font-mono);
2775
2784
  }
2776
2785
 
2777
2786
  /* Blockquote */
2778
- :where(.blockquote) {
2787
+ :where(.ui-blockquote) {
2779
2788
  border-inline-start: var(--border-size-3) solid currentColor;
2780
2789
  padding-block: var(--size-3);
2781
2790
  padding-inline: var(--size-4);
@@ -2795,7 +2804,7 @@
2795
2804
  }
2796
2805
 
2797
2806
  /* Code block */
2798
- :where(pre.code-block) {
2807
+ :where(pre.ui-code-block) {
2799
2808
  background-color: var(--color-15);
2800
2809
  border-radius: var(--border-radius);
2801
2810
  color: var(--color-1);
@@ -2824,7 +2833,7 @@
2824
2833
  /* Rich text */
2825
2834
 
2826
2835
  @layer components.extended {
2827
- @scope (.rich-text) to (.not-rich-text) {
2836
+ @scope (.ui-rich-text) to (.ui-not-rich-text) {
2828
2837
  a {
2829
2838
  color: var(--primary);
2830
2839
  cursor: pointer;
@@ -2957,7 +2966,7 @@
2957
2966
  }
2958
2967
 
2959
2968
  /** Overline */
2960
- :is(.overline, hgroup p:first-of-type:first-child) {
2969
+ :is(.ui-overline, hgroup p:first-of-type:first-child) {
2961
2970
  color: light-dark(oklch(from var(--text-muted) calc(l * 1.25) c h),
2962
2971
  oklch(from var(--text-muted) calc(l * 0.75) c h));
2963
2972
  font-size: var(--font-size-0);
@@ -3169,7 +3178,7 @@
3169
3178
  /*** Extended components (has dependencies) */
3170
3179
 
3171
3180
  @layer components.extended {
3172
- :where(.badge) {
3181
+ :where(.ui-badge) {
3173
3182
  --_anchor-tx: -50%;
3174
3183
  --_anchor-ty: 50%;
3175
3184
  --_badge-inset: auto auto 100% 100%;
@@ -3185,14 +3194,14 @@
3185
3194
 
3186
3195
  /* Floating wrapper: traditional inset-based positioning so this works
3187
3196
  in browsers without position-area support (Firefox, older Safari). */
3188
- &>.anchor-floating:not([popover]) {
3197
+ &>.ui-anchor-floating:not([popover]) {
3189
3198
  inset: var(--_badge-inset);
3190
3199
  position-anchor: auto;
3191
3200
  position-area: none;
3192
3201
  }
3193
3202
 
3194
3203
  /* Indicator */
3195
- &>.anchor-floating>.badge-indicator {
3204
+ &>.ui-anchor-floating>.ui-badge-indicator {
3196
3205
  background-color: var(--_bg-color);
3197
3206
  block-size: var(--_size);
3198
3207
  border: 2px solid var(--_border-color);
@@ -3211,57 +3220,57 @@
3211
3220
  }
3212
3221
 
3213
3222
  /* Colors */
3214
- &.critical {
3223
+ &.ui-critical {
3215
3224
  --_bg-color: var(--critical);
3216
3225
  --_border-color: var(--critical);
3217
3226
  }
3218
3227
 
3219
- &.success {
3228
+ &.ui-success {
3220
3229
  --_bg-color: var(--success);
3221
3230
  --_border-color: var(--success);
3222
3231
  }
3223
3232
 
3224
- &.info {
3233
+ &.ui-info {
3225
3234
  --_bg-color: var(--info);
3226
3235
  --_border-color: var(--info);
3227
3236
  }
3228
3237
 
3229
- &.warning {
3238
+ &.ui-warning {
3230
3239
  --_bg-color: var(--warning);
3231
3240
  --_border-color: var(--warning);
3232
3241
  }
3233
3242
 
3234
- &.neutral {
3243
+ &.ui-neutral {
3235
3244
  --_bg-color: var(--neutral);
3236
3245
  --_border-color: var(--neutral);
3237
3246
  }
3238
3247
 
3239
3248
  /* Alignment */
3240
- &.start-start {
3249
+ &.ui-start-start {
3241
3250
  --_anchor-tx: 50%;
3242
3251
  --_anchor-ty: 50%;
3243
3252
  --_badge-inset: auto 100% 100% auto;
3244
3253
  }
3245
3254
 
3246
- &.end-start {
3255
+ &.ui-end-start {
3247
3256
  --_anchor-tx: 50%;
3248
3257
  --_anchor-ty: -50%;
3249
3258
  --_badge-inset: 100% 100% auto auto;
3250
3259
  }
3251
3260
 
3252
- &.end-end {
3261
+ &.ui-end-end {
3253
3262
  --_anchor-tx: -50%;
3254
3263
  --_anchor-ty: -50%;
3255
3264
  --_badge-inset: 100% auto auto 100%;
3256
3265
  }
3257
3266
 
3258
3267
  /* Dot */
3259
- &.dot {
3268
+ &.ui-dot {
3260
3269
  --_anchor-tx: calc((var(--_dot-size) - 2px) * -1);
3261
3270
  --_anchor-ty: var(--_dot-size);
3262
3271
  }
3263
3272
 
3264
- &.dot>.anchor-floating>.badge-indicator {
3273
+ &.ui-dot>.ui-anchor-floating>.ui-badge-indicator {
3265
3274
  block-size: var(--_dot-size);
3266
3275
  inline-size: var(--_dot-size);
3267
3276
  min-inline-size: var(--_dot-size);
@@ -3269,7 +3278,7 @@
3269
3278
  }
3270
3279
 
3271
3280
  /* Visibility */
3272
- &.invisible>.anchor-floating>.badge-indicator {
3281
+ &.ui-invisible>.ui-anchor-floating>.ui-badge-indicator {
3273
3282
  opacity: 0;
3274
3283
  pointer-events: none;
3275
3284
  }
@@ -3277,7 +3286,7 @@
3277
3286
  }
3278
3287
 
3279
3288
  @layer components.extended {
3280
- :where([role="group"].button-group) {
3289
+ :where([role="group"].ui-button-group) {
3281
3290
  --_border-radius: var(--button-border-radius);
3282
3291
 
3283
3292
  border-radius: var(--_border-radius);
@@ -3292,11 +3301,11 @@
3292
3301
  --_divider-color: light-dark(oklch(from var(--_accent-tonal) calc(l - 0.1) c h),
3293
3302
  oklch(from var(--_accent-tonal) calc(l + 0.1) c h));
3294
3303
 
3295
- &.outlined {
3304
+ &.ui-outlined {
3296
3305
  --_divider-color: var(--_border-color);
3297
3306
  }
3298
3307
 
3299
- &.filled {
3308
+ &.ui-filled {
3300
3309
  --_divider-color: currentColor;
3301
3310
  }
3302
3311
 
@@ -3307,8 +3316,8 @@
3307
3316
  /* Color inheritance from Button Group — shared interaction model.
3308
3317
  The .critical scope class in theme.css redirects --palette-source so
3309
3318
  --color-6 below becomes a tint of the active color. */
3310
- :where(.button-group.critical,
3311
- .button-group.primary) & {
3319
+ :where(.ui-button-group.ui-critical,
3320
+ .ui-button-group.ui-primary) & {
3312
3321
  --_color-contrast: var(--gray-1);
3313
3322
  --_color-tonal: var(--color-6);
3314
3323
  --_accent-tonal-contrast: var(--text-primary-contrast);
@@ -3319,26 +3328,26 @@
3319
3328
  --_outlined-active-bg-color: oklch(from var(--_accent) calc(l - 0.1) c h);
3320
3329
  }
3321
3330
 
3322
- :where(.button-group.critical) & {
3331
+ :where(.ui-button-group.ui-critical) & {
3323
3332
  --_color: var(--critical);
3324
3333
  }
3325
3334
 
3326
- :where(.button-group.primary) & {
3335
+ :where(.ui-button-group.ui-primary) & {
3327
3336
  --_color: var(--primary);
3328
3337
  }
3329
3338
 
3330
- :where(.button-group.small) & {
3339
+ :where(.ui-button-group.ui-small) & {
3331
3340
  --_min-height: 1.875rem;
3332
3341
  padding-block: 0;
3333
3342
  padding-inline: 1ex;
3334
3343
  }
3335
3344
 
3336
- :where(.button-group.large) & {
3345
+ :where(.ui-button-group.ui-large) & {
3337
3346
  --_min-height: 2.875rem;
3338
3347
  padding-inline: 4ex;
3339
3348
  }
3340
3349
 
3341
- :where(.button-group.outlined) & {
3350
+ :where(.ui-button-group.ui-outlined) & {
3342
3351
  --_border-color: var(--_accent);
3343
3352
  --_divider-color: var(--_accent);
3344
3353
 
@@ -3357,7 +3366,7 @@
3357
3366
  }
3358
3367
  }
3359
3368
 
3360
- :where(.button-group.tonal) & {
3369
+ :where(.ui-button-group.ui-tonal) & {
3361
3370
  --_bg-color: var(--_accent-tonal);
3362
3371
  --_text-color: var(--_accent-tonal-contrast);
3363
3372
 
@@ -3374,13 +3383,13 @@
3374
3383
  }
3375
3384
  }
3376
3385
 
3377
- :where(.button-group.filled) & {
3386
+ :where(.ui-button-group.ui-filled) & {
3378
3387
  --_bg-color: var(--_accent);
3379
3388
  --_text-color: var(--_accent-contrast);
3380
3389
  --_divider-color: currentColor;
3381
3390
 
3382
- :where(.button-group.critical,
3383
- .button-group.primary) & {
3391
+ :where(.ui-button-group.ui-critical,
3392
+ .ui-button-group.ui-primary) & {
3384
3393
  --_divider-color: light-dark(oklch(from var(--_accent) calc(l - 0.1) c h),
3385
3394
  oklch(from var(--_accent) calc(l + 0.1) c h));
3386
3395
  }
@@ -3397,7 +3406,7 @@
3397
3406
  }
3398
3407
  }
3399
3408
 
3400
- &:not(.vertical) {
3409
+ &:not(.ui-vertical) {
3401
3410
  button {
3402
3411
  &:first-of-type {
3403
3412
  border-end-start-radius: var(--_border-radius);
@@ -3422,7 +3431,7 @@
3422
3431
  }
3423
3432
  }
3424
3433
 
3425
- &.vertical {
3434
+ &.ui-vertical {
3426
3435
  flex-direction: column;
3427
3436
 
3428
3437
  button {
@@ -3457,7 +3466,7 @@
3457
3466
  }
3458
3467
 
3459
3468
  @layer components.extended {
3460
- :where(details.accordion) {
3469
+ :where(details.ui-accordion) {
3461
3470
  --_actions-gap: var(--size-1);
3462
3471
  --_actions-margin-block-start: var(--size-3);
3463
3472
  --_actions-padding-block-end: var(--size-1);
@@ -3484,14 +3493,14 @@
3484
3493
  margin-inline: var(--_margin-inline);
3485
3494
  transition: all var(--_transition) ease-out;
3486
3495
 
3487
- &.elevated {
3496
+ &.ui-elevated {
3488
3497
  --_bg-color: var(--surface-elevated);
3489
3498
  --_margin-inline: 0;
3490
3499
  --_padding-inline: var(--size-3);
3491
3500
  --_shadow: var(--shadow-3);
3492
3501
  }
3493
3502
 
3494
- &.outlined {
3503
+ &.ui-outlined {
3495
3504
  --_bg-color: var(--surface-default);
3496
3505
  --_border-color: var(--border-color);
3497
3506
  --_border-width: 1px;
@@ -3499,7 +3508,7 @@
3499
3508
  --_padding-inline: var(--size-3);
3500
3509
  }
3501
3510
 
3502
- &.tonal {
3511
+ &.ui-tonal {
3503
3512
  --_bg-color: var(--surface-tonal);
3504
3513
  --_margin-inline: 0;
3505
3514
  --_padding-inline: var(--size-3);
@@ -3556,13 +3565,13 @@
3556
3565
  rotate: 180deg;
3557
3566
  }
3558
3567
 
3559
- &>.content {
3568
+ &>.ui-content {
3560
3569
  margin-block-start: 0;
3561
3570
  padding-block: var(--_content-padding-block);
3562
3571
  padding-inline: var(--_content-padding-inline);
3563
3572
  }
3564
3573
 
3565
- &>.actions {
3574
+ &>.ui-actions {
3566
3575
  display: flex;
3567
3576
  gap: var(--_actions-gap);
3568
3577
  justify-content: end;
@@ -3573,7 +3582,7 @@
3573
3582
  }
3574
3583
 
3575
3584
  /* Accordion group */
3576
- :where(.card[role="group"]:has(details.accordion)) {
3585
+ :where(.ui-card[role="group"]:has(details.ui-accordion)) {
3577
3586
  --_group-radius: var(--border-radius);
3578
3587
  --_gutter-color: var(--border-color);
3579
3588
  --_item-padding-inline: var(--size-3);
@@ -3581,18 +3590,18 @@
3581
3590
 
3582
3591
  display: block;
3583
3592
 
3584
- &.card {
3585
- &:not(.tonal, .outlined, .elevated) {
3593
+ &.ui-card {
3594
+ &:not(.ui-tonal, .ui-outlined, .ui-elevated) {
3586
3595
  --_item-summary-padding-inline: 0;
3587
3596
  }
3588
3597
  }
3589
3598
 
3590
- &>.content {
3599
+ &>.ui-content {
3591
3600
  margin-block: 0;
3592
3601
  padding: 0;
3593
3602
  }
3594
3603
 
3595
- &>details.accordion {
3604
+ &>details.ui-accordion {
3596
3605
  --_border-color: transparent;
3597
3606
  --_border-width: 0;
3598
3607
  --_margin-inline: 0;
@@ -3637,10 +3646,10 @@
3637
3646
  Lists meant to be used stand-alone or as part of Select elements
3638
3647
 
3639
3648
  Intended use-case:
3640
- - ul.list > li
3641
- - .select > .list > option
3649
+ - ul.ui-list > li
3650
+ - .ui-select > .ui-list > option
3642
3651
  */
3643
- :where(.list) {
3652
+ :where(.ui-list) {
3644
3653
  --_bg-color: var(--surface-filled);
3645
3654
  --_bg-color-hover: oklch(from var(--primary) l c h / 15%);
3646
3655
 
@@ -3658,20 +3667,20 @@ Lists meant to be used stand-alone or as part of Select elements
3658
3667
  }
3659
3668
 
3660
3669
  /* Background color */
3661
- &.transparent {
3670
+ &.ui-transparent {
3662
3671
  --_bg-color: transparent;
3663
3672
  }
3664
3673
 
3665
- &.default {
3674
+ &.ui-default {
3666
3675
  --_bg-color: var(--surface-default);
3667
3676
  }
3668
3677
 
3669
- &.tonal {
3678
+ &.ui-tonal {
3670
3679
  --_bg-color: var(--surface-tonal);
3671
3680
  }
3672
3681
 
3673
3682
  /* Borders on all list items */
3674
- &.bordered {
3683
+ &.ui-bordered {
3675
3684
  :where(li + li, option + option) {
3676
3685
  margin-block-start: var(--size-3);
3677
3686
 
@@ -3690,13 +3699,13 @@ Lists meant to be used stand-alone or as part of Select elements
3690
3699
  }
3691
3700
 
3692
3701
  /* Dense - less gaps and spacing */
3693
- &.dense {
3702
+ &.ui-dense {
3694
3703
  :where(li, option) {
3695
3704
  gap: var(--size-2);
3696
3705
  min-block-size: var(--size-7);
3697
3706
  padding: var(--size-1) var(--size-2);
3698
3707
 
3699
- &.border-top {
3708
+ &.ui-border-top {
3700
3709
  margin-block-start: var(--size-2);
3701
3710
 
3702
3711
  &::before {
@@ -3718,29 +3727,29 @@ Lists meant to be used stand-alone or as part of Select elements
3718
3727
 
3719
3728
  /* Checkbox / Radio */
3720
3729
  &>label {
3721
- .end {
3730
+ .ui-end {
3722
3731
  padding-inline-end: 0.125rem;
3723
3732
  }
3724
3733
 
3725
- &:where(.checkbox, .radio) {
3734
+ &:where(.ui-checkbox, .ui-radio) {
3726
3735
  --_input-size: var(--size-3);
3727
3736
  }
3728
3737
  }
3729
3738
 
3730
3739
  /* Leading and trailing content */
3731
- .start,
3732
- .end {
3733
- .avatar {
3740
+ .ui-start,
3741
+ .ui-end {
3742
+ .ui-avatar {
3734
3743
  max-inline-size: var(--size-6);
3735
3744
  }
3736
3745
 
3737
- .icon-button,
3746
+ .ui-icon-button,
3738
3747
  svg {
3739
3748
  max-inline-size: var(--size-4);
3740
3749
  }
3741
3750
 
3742
- .checkbox,
3743
- .radio {
3751
+ .ui-checkbox,
3752
+ .ui-radio {
3744
3753
  --_input-size: var(--size-3);
3745
3754
  }
3746
3755
  }
@@ -3748,7 +3757,7 @@ Lists meant to be used stand-alone or as part of Select elements
3748
3757
  }
3749
3758
 
3750
3759
  /* Gutterless */
3751
- &.gutterless {
3760
+ &.ui-gutterless {
3752
3761
  :where(li, option) {
3753
3762
  padding-inline: 0;
3754
3763
 
@@ -3853,20 +3862,20 @@ Lists meant to be used stand-alone or as part of Select elements
3853
3862
 
3854
3863
  /* Checkbox / Radio / Switch */
3855
3864
  &>label {
3856
- &:where(.checkbox, .radio, .switch) {
3865
+ &:where(.ui-checkbox, .ui-radio, .ui-switch) {
3857
3866
  display: flex;
3858
3867
  }
3859
3868
 
3860
- .end {
3869
+ .ui-end {
3861
3870
  padding-inline-end: var(--size-1);
3862
3871
  }
3863
3872
 
3864
- &:where(.checkbox, .radio) {
3873
+ &:where(.ui-checkbox, .ui-radio) {
3865
3874
  inline-size: 100%;
3866
3875
  }
3867
3876
 
3868
3877
  /* Switches look comically big in lists, so it's better to use a smaller variant */
3869
- &.switch {
3878
+ &.ui-switch {
3870
3879
  --_dot-size: 0.75rem;
3871
3880
  --_track-height: var(--size-4);
3872
3881
  --_track-width: 2.5rem;
@@ -3879,7 +3888,7 @@ Lists meant to be used stand-alone or as part of Select elements
3879
3888
  }
3880
3889
 
3881
3890
  /* Border between list items */
3882
- &.border-top {
3891
+ &.ui-border-top {
3883
3892
  margin-block-start: var(--size-3);
3884
3893
 
3885
3894
  &::before {
@@ -3894,7 +3903,7 @@ Lists meant to be used stand-alone or as part of Select elements
3894
3903
  }
3895
3904
 
3896
3905
  /* Text */
3897
- .text {
3906
+ .ui-text {
3898
3907
  flex: 1;
3899
3908
  line-height: 1.6;
3900
3909
 
@@ -3910,7 +3919,7 @@ Lists meant to be used stand-alone or as part of Select elements
3910
3919
  }
3911
3920
 
3912
3921
  /* Leading content */
3913
- .start {
3922
+ .ui-start {
3914
3923
  align-items: center;
3915
3924
  align-self: center;
3916
3925
  display: grid;
@@ -3938,7 +3947,7 @@ Lists meant to be used stand-alone or as part of Select elements
3938
3947
  }
3939
3948
 
3940
3949
  /* Trailing content */
3941
- .end {
3950
+ .ui-end {
3942
3951
  align-items: center;
3943
3952
  display: flex;
3944
3953
  font-size: var(--font-size-0);
@@ -3963,13 +3972,13 @@ Lists meant to be used stand-alone or as part of Select elements
3963
3972
  }
3964
3973
 
3965
3974
  /* Inset */
3966
- &.inset {
3967
- .text {
3975
+ &.ui-inset {
3976
+ .ui-text {
3968
3977
  padding-inline-start: calc(var(--size-5) + var(--size-3));
3969
3978
  }
3970
3979
 
3971
3980
  /* Safety measure so it won't look bad if there for some reason should exist a leading element inside. */
3972
- .start {
3981
+ .ui-start {
3973
3982
  display: none;
3974
3983
  }
3975
3984
  }
@@ -3978,7 +3987,7 @@ Lists meant to be used stand-alone or as part of Select elements
3978
3987
  }
3979
3988
 
3980
3989
  @layer components.extended {
3981
- :where(.dialog) {
3990
+ :where(.ui-dialog) {
3982
3991
  inline-size: 100%;
3983
3992
  inset: 0;
3984
3993
  margin: auto;
@@ -4013,7 +4022,7 @@ Lists meant to be used stand-alone or as part of Select elements
4013
4022
  pointer-events: all;
4014
4023
  }
4015
4024
 
4016
- .actions {
4025
+ .ui-actions {
4017
4026
  justify-content: end;
4018
4027
  padding-inline: var(--size-3) var(--size-1);
4019
4028
  }
@@ -4040,14 +4049,14 @@ Lists meant to be used stand-alone or as part of Select elements
4040
4049
  }
4041
4050
  }
4042
4051
 
4043
- :where(html:has(.dialog[open])) {
4052
+ :where(html:has(.ui-dialog[open])) {
4044
4053
  block-size: 100%;
4045
4054
  overflow: hidden;
4046
4055
  }
4047
4056
  }
4048
4057
 
4049
4058
  @layer components.root {
4050
- :where(dialog.drawer) {
4059
+ :where(dialog.ui-drawer) {
4051
4060
  --_backdrop-bg-color: transparent;
4052
4061
  --_backdrop-blur: blur(2px);
4053
4062
  --_bg-color: var(--surface-default);
@@ -4091,11 +4100,11 @@ Lists meant to be used stand-alone or as part of Select elements
4091
4100
  opacity var(--_transition-duration) var(--_transition-timing);
4092
4101
  }
4093
4102
 
4094
- &.backdrop-transparent {
4103
+ &.ui-backdrop-transparent {
4095
4104
  --_backdrop-blur: none;
4096
4105
  }
4097
4106
 
4098
- .header {
4107
+ .ui-header {
4099
4108
  align-items: center;
4100
4109
  border-block-end: var(--_border-width) solid var(--_border-color);
4101
4110
  display: flex;
@@ -4106,18 +4115,18 @@ Lists meant to be used stand-alone or as part of Select elements
4106
4115
  margin: 0;
4107
4116
  }
4108
4117
 
4109
- :where(.icon-button) {
4118
+ :where(.ui-icon-button) {
4110
4119
  margin-inline-start: auto;
4111
4120
  }
4112
4121
  }
4113
4122
 
4114
- .content {
4123
+ .ui-content {
4115
4124
  flex: 1;
4116
4125
  overflow-y: auto;
4117
4126
  padding: var(--_content-padding);
4118
4127
  }
4119
4128
 
4120
- .footer {
4129
+ .ui-footer {
4121
4130
  border-block-start: var(--_border-width) solid var(--_border-color);
4122
4131
  display: flex;
4123
4132
  gap: var(--_footer-gap);
@@ -4125,48 +4134,48 @@ Lists meant to be used stand-alone or as part of Select elements
4125
4134
  padding: var(--_footer-padding);
4126
4135
  }
4127
4136
 
4128
- &.inline-start,
4129
- &.inline-end {
4137
+ &.ui-inline-start,
4138
+ &.ui-inline-end {
4130
4139
  block-size: 100dvb;
4131
4140
  inline-size: var(--_inline-size);
4132
4141
  inset-block: 0;
4133
4142
  max-block-size: 100%;
4134
4143
  }
4135
4144
 
4136
- &.inline-start {
4145
+ &.ui-inline-start {
4137
4146
  border-inline-end: var(--_border-width) solid var(--_border-color);
4138
4147
  inset-inline-end: auto;
4139
4148
  inset-inline-start: 0;
4140
4149
  translate: -100% 0;
4141
4150
  }
4142
4151
 
4143
- &.inline-end {
4152
+ &.ui-inline-end {
4144
4153
  border-inline-start: var(--_border-width) solid var(--_border-color);
4145
4154
  inset-inline-end: 0;
4146
4155
  inset-inline-start: auto;
4147
4156
  translate: 100% 0;
4148
4157
 
4149
- .footer {
4158
+ .ui-footer {
4150
4159
  justify-content: start;
4151
4160
  }
4152
4161
  }
4153
4162
 
4154
- &.block-start,
4155
- &.block-end {
4163
+ &.ui-block-start,
4164
+ &.ui-block-end {
4156
4165
  block-size: var(--_block-size);
4157
4166
  inline-size: 100dvi;
4158
4167
  inset-inline: 0;
4159
4168
  max-block-size: 80dvb;
4160
4169
  }
4161
4170
 
4162
- &.block-start {
4171
+ &.ui-block-start {
4163
4172
  border-block-end: var(--_border-width) solid var(--_border-color);
4164
4173
  inset-block-end: auto;
4165
4174
  inset-block-start: 0;
4166
4175
  translate: 0 -100%;
4167
4176
  }
4168
4177
 
4169
- &.block-end {
4178
+ &.ui-block-end {
4170
4179
  border-block-start: var(--_border-width) solid var(--_border-color);
4171
4180
  inset-block-end: 0;
4172
4181
  inset-block-start: auto;
@@ -4185,29 +4194,29 @@ Lists meant to be used stand-alone or as part of Select elements
4185
4194
  opacity: 0;
4186
4195
  }
4187
4196
 
4188
- &.inline-start {
4197
+ &.ui-inline-start {
4189
4198
  translate: -100% 0;
4190
4199
  }
4191
4200
 
4192
- &.inline-end {
4201
+ &.ui-inline-end {
4193
4202
  translate: 100% 0;
4194
4203
  }
4195
4204
 
4196
- &.block-start {
4205
+ &.ui-block-start {
4197
4206
  translate: 0 -100%;
4198
4207
  }
4199
4208
 
4200
- &.block-end {
4209
+ &.ui-block-end {
4201
4210
  translate: 0 100%;
4202
4211
  }
4203
4212
  }
4204
4213
  }
4205
4214
  }
4206
4215
 
4207
- /* Scroll-lock is provided by the shared `.scroll-lock` utility in core/utils.css.
4216
+ /* Scroll-lock is provided by the shared `.ui-scroll-lock` utility in core/utils.css.
4208
4217
  This carve-out re-enables page scrolling when a transparent-backdrop drawer is
4209
4218
  open on wide viewports (where the drawer doesn't visually cover the page). */
4210
- html:has(dialog.drawer.scroll-lock[open].backdrop-transparent) {
4219
+ html:has(dialog.ui-drawer.ui-scroll-lock[open].ui-backdrop-transparent) {
4211
4220
  overflow: unset;
4212
4221
  overscroll-behavior: auto;
4213
4222
 
@@ -4221,7 +4230,7 @@ Lists meant to be used stand-alone or as part of Select elements
4221
4230
  @layer components.extended {
4222
4231
 
4223
4232
  /* Form */
4224
- :where(.form) {
4233
+ :where(.ui-form) {
4225
4234
  display: grid;
4226
4235
  gap: var(--size-8);
4227
4236
 
@@ -4231,7 +4240,7 @@ Lists meant to be used stand-alone or as part of Select elements
4231
4240
  }
4232
4241
 
4233
4242
  /* Fieldset */
4234
- :where(.fieldset) {
4243
+ :where(.ui-fieldset) {
4235
4244
  all: unset;
4236
4245
  border: 0;
4237
4246
  border-radius: 0;
@@ -4242,20 +4251,20 @@ Lists meant to be used stand-alone or as part of Select elements
4242
4251
  padding: 0;
4243
4252
 
4244
4253
  /* Legend */
4245
- :where(legend, .legend) {
4254
+ :where(legend, .ui-legend) {
4246
4255
  all: unset;
4247
4256
  color: var(--text-primary);
4248
4257
  font-weight: 600;
4249
4258
  margin-block-end: var(--size-3);
4250
4259
  padding: 0;
4251
4260
 
4252
- &:has(+ :where(.field-description)) {
4261
+ &:has(+ :where(.ui-field-description)) {
4253
4262
  margin-block-end: 0;
4254
4263
  }
4255
4264
  }
4256
4265
 
4257
4266
  /* Field description / supporting text */
4258
- :where(.field-description) {
4267
+ :where(.ui-field-description) {
4259
4268
  color: var(--text-muted);
4260
4269
  font-size: var(--font-size-05);
4261
4270
  line-height: var(--font-lineheight-3);
@@ -4266,13 +4275,13 @@ Lists meant to be used stand-alone or as part of Select elements
4266
4275
  }
4267
4276
 
4268
4277
  /* End text */
4269
- :where(.end-text) {
4278
+ :where(.ui-end-text) {
4270
4279
  color: var(--text-muted);
4271
4280
  font-size: var(--font-size-0);
4272
4281
  line-height: var(--font-lineheight-3);
4273
4282
  }
4274
4283
 
4275
- &:has(.text-field.row) {
4284
+ &:has(.ui-text-field.ui-row) {
4276
4285
  row-gap: var(--size-7);
4277
4286
  }
4278
4287
 
@@ -4283,26 +4292,26 @@ Lists meant to be used stand-alone or as part of Select elements
4283
4292
 
4284
4293
  input,
4285
4294
  label,
4286
- .label {
4295
+ .ui-label {
4287
4296
  cursor: not-allowed;
4288
4297
  }
4289
4298
  }
4290
4299
 
4291
4300
  /* Error / validation */
4292
4301
  &[data-invalid] {
4293
- :where(.end-text) {
4302
+ :where(.ui-end-text) {
4294
4303
  color: var(--primary);
4295
4304
  }
4296
4305
 
4297
- :where(.checkbox, .radio, .switch) {
4306
+ :where(.ui-checkbox, .ui-radio, .ui-switch) {
4298
4307
  --palette-source: oklch(0.58 0.21 var(--hue-red));
4299
4308
 
4300
- :where(.end-text) {
4309
+ :where(.ui-end-text) {
4301
4310
  color: var(--primary);
4302
4311
  }
4303
4312
  }
4304
4313
 
4305
- :where(.switch) {
4314
+ :where(.ui-switch) {
4306
4315
  input {
4307
4316
  border-radius: var(--radius-round);
4308
4317
  outline: 2px solid var(--primary);
@@ -4312,7 +4321,7 @@ Lists meant to be used stand-alone or as part of Select elements
4312
4321
 
4313
4322
  /* Required */
4314
4323
  &:has(:invalid) {
4315
- :where(legend, .legend) {
4324
+ :where(legend, .ui-legend) {
4316
4325
  padding-inline-end: 1ex;
4317
4326
  position: relative;
4318
4327
 
@@ -4327,18 +4336,18 @@ Lists meant to be used stand-alone or as part of Select elements
4327
4336
  }
4328
4337
 
4329
4338
  /* Field group */
4330
- :where(.field-group) {
4339
+ :where(.ui-field-group) {
4331
4340
  display: flex;
4332
4341
  flex-direction: column;
4333
4342
  gap: var(--size-4);
4334
4343
 
4335
4344
  /* If it only has checkboxes, radios, or switches */
4336
- &:has(> :where(.checkbox, .radio, .switch)):not(:has(> :not(.checkbox, .radio, .switch))) {
4345
+ &:has(> :where(.ui-checkbox, .ui-radio, .ui-switch)):not(:has(> :not(.ui-checkbox, .ui-radio, .ui-switch))) {
4337
4346
  gap: var(--size-2);
4338
4347
  }
4339
4348
 
4340
4349
  /* If it only has buttons */
4341
- &:has(.button):not(:has(*:not(.button))) {
4350
+ &:has(.ui-button):not(:has(*:not(.ui-button))) {
4342
4351
  align-items: center;
4343
4352
  flex-direction: row;
4344
4353
  gap: var(--size-2);
@@ -4354,11 +4363,11 @@ Lists meant to be used stand-alone or as part of Select elements
4354
4363
  }
4355
4364
 
4356
4365
  /* Directions */
4357
- &.row {
4366
+ &.ui-row {
4358
4367
  flex-direction: row;
4359
4368
  flex-wrap: wrap;
4360
4369
 
4361
- &:has(> :where(.checkbox, .radio, .switch)) {
4370
+ &:has(> :where(.ui-checkbox, .ui-radio, .ui-switch)) {
4362
4371
  gap: var(--size-4);
4363
4372
  }
4364
4373
  }
@@ -4371,7 +4380,7 @@ Lists meant to be used stand-alone or as part of Select elements
4371
4380
  - Common styling for input, textarea and select
4372
4381
  - Form related styles such as: label, supporting text, error handling
4373
4382
  */
4374
- :where(.text-field, .textarea, .select) {
4383
+ :where(.ui-text-field, .ui-textarea, .ui-select) {
4375
4384
  --_accent-color: var(--primary);
4376
4385
  --_bg-color: var(--surface-default);
4377
4386
  --_border-color: var(--field-border-color);
@@ -4387,7 +4396,7 @@ Lists meant to be used stand-alone or as part of Select elements
4387
4396
  position: relative;
4388
4397
 
4389
4398
  /* Field - the actual input with a border around it */
4390
- .field {
4399
+ .ui-field {
4391
4400
  background-color: var(--_bg-color);
4392
4401
  border: var(--field-border-width) solid var(--_border-color);
4393
4402
  border-radius: var(--field-border-radius);
@@ -4406,7 +4415,7 @@ Lists meant to be used stand-alone or as part of Select elements
4406
4415
  }
4407
4416
  }
4408
4417
 
4409
- :where(.field) :where(input, textarea, select) {
4418
+ :where(.ui-field) :where(input, textarea, select) {
4410
4419
  background: transparent;
4411
4420
  border: 0;
4412
4421
  color: var(--text-primary);
@@ -4425,8 +4434,8 @@ Lists meant to be used stand-alone or as part of Select elements
4425
4434
  }
4426
4435
 
4427
4436
  /* Affixes */
4428
- .prefix,
4429
- .suffix {
4437
+ .ui-prefix,
4438
+ .ui-suffix {
4430
4439
  align-items: center;
4431
4440
  color: var(--_label-color);
4432
4441
  display: inline-flex;
@@ -4434,16 +4443,16 @@ Lists meant to be used stand-alone or as part of Select elements
4434
4443
  white-space: nowrap;
4435
4444
  }
4436
4445
 
4437
- .prefix {
4446
+ .ui-prefix {
4438
4447
  grid-area: prefix;
4439
4448
  }
4440
4449
 
4441
- .suffix {
4450
+ .ui-suffix {
4442
4451
  grid-area: suffix;
4443
4452
  }
4444
4453
 
4445
- .header,
4446
- .footer {
4454
+ .ui-header,
4455
+ .ui-footer {
4447
4456
  align-items: center;
4448
4457
  color: var(--_label-color);
4449
4458
  display: flex;
@@ -4452,30 +4461,30 @@ Lists meant to be used stand-alone or as part of Select elements
4452
4461
  padding: var(--size-1) var(--_field-padding-inline);
4453
4462
  }
4454
4463
 
4455
- .header {
4464
+ .ui-header {
4456
4465
  border-block-end: 1px solid var(--_border-color);
4457
4466
  grid-area: header;
4458
4467
  }
4459
4468
 
4460
- .footer {
4469
+ .ui-footer {
4461
4470
  border-block-start: 1px solid var(--_border-color);
4462
4471
  grid-area: footer;
4463
4472
  }
4464
4473
 
4465
4474
  /* Remove padding on the input when affixes are next to it */
4466
- .field:has(> .prefix) :where(input, textarea, select) {
4475
+ .ui-field:has(> .ui-prefix) :where(input, textarea, select) {
4467
4476
  padding-inline-start: 0;
4468
4477
  }
4469
4478
 
4470
- .field:has(> .suffix) :where(input, textarea, select) {
4479
+ .ui-field:has(> .ui-suffix) :where(input, textarea, select) {
4471
4480
  padding-inline-end: 0;
4472
4481
  }
4473
4482
 
4474
4483
  /* Textarea - keep affix aligned with the first line */
4475
- &.textarea .field {
4484
+ &.ui-textarea .ui-field {
4476
4485
 
4477
- .prefix,
4478
- .suffix {
4486
+ .ui-prefix,
4487
+ .ui-suffix {
4479
4488
  align-self: start;
4480
4489
  padding-block: var(--_field-padding-block);
4481
4490
  }
@@ -4483,7 +4492,7 @@ Lists meant to be used stand-alone or as part of Select elements
4483
4492
 
4484
4493
  /* Required/Invalid */
4485
4494
  &:has(:invalid) {
4486
- .label:after {
4495
+ .ui-label:after {
4487
4496
  color: var(--red);
4488
4497
  content: "*";
4489
4498
  margin: -0.25em auto auto 0.25em;
@@ -4518,7 +4527,7 @@ Lists meant to be used stand-alone or as part of Select elements
4518
4527
  }
4519
4528
 
4520
4529
  /* Variants */
4521
- &.filled {
4530
+ &.ui-filled {
4522
4531
  input {
4523
4532
 
4524
4533
  &::-webkit-file-upload-button,
@@ -4533,7 +4542,7 @@ Lists meant to be used stand-alone or as part of Select elements
4533
4542
  }
4534
4543
 
4535
4544
  /* Sizes */
4536
- &.small {
4545
+ &.ui-small {
4537
4546
  input {
4538
4547
  font-size: var(--font-size-05);
4539
4548
 
@@ -4548,7 +4557,7 @@ Lists meant to be used stand-alone or as part of Select elements
4548
4557
 
4549
4558
  /* Autosuggest */
4550
4559
  &:has(input[list]) {
4551
- .label {
4560
+ .ui-label {
4552
4561
  /* Make sure chevron is visible */
4553
4562
  inline-size: calc(100% - var(--size-6));
4554
4563
  }
@@ -4556,7 +4565,7 @@ Lists meant to be used stand-alone or as part of Select elements
4556
4565
 
4557
4566
  /* Select */
4558
4567
  &:has(select) {
4559
- .label {
4568
+ .ui-label {
4560
4569
  /* Make sure chevron is visible */
4561
4570
  inline-size: calc(100% - var(--size-6));
4562
4571
 
@@ -4584,7 +4593,7 @@ Lists meant to be used stand-alone or as part of Select elements
4584
4593
 
4585
4594
  /* Input - color */
4586
4595
  &:has(input[type="color"]) {
4587
- .field {
4596
+ .ui-field {
4588
4597
  block-size: var(--_height);
4589
4598
  inline-size: var(--_height);
4590
4599
  min-block-size: 0;
@@ -4612,21 +4621,21 @@ Lists meant to be used stand-alone or as part of Select elements
4612
4621
  /* Element states */
4613
4622
  &:hover {
4614
4623
  &:not([data-invalid]) {
4615
- .field {
4624
+ .ui-field {
4616
4625
  border-color: var(--text-primary);
4617
4626
  }
4618
4627
  }
4619
4628
  }
4620
4629
 
4621
4630
  &:focus-within {
4622
- .field {
4631
+ .ui-field {
4623
4632
  border-color: var(--_accent-color);
4624
4633
  outline-offset: -2px;
4625
4634
  }
4626
4635
  }
4627
4636
 
4628
4637
  /* Label */
4629
- .label {
4638
+ .ui-label {
4630
4639
  color: var(--text-primary);
4631
4640
  font-size: var(--font-size-05);
4632
4641
  font-weight: 600;
@@ -4636,7 +4645,7 @@ Lists meant to be used stand-alone or as part of Select elements
4636
4645
  }
4637
4646
 
4638
4647
  /* End text */
4639
- :where(.end-text) {
4648
+ :where(.ui-end-text) {
4640
4649
  color: var(--_end-text-color);
4641
4650
  font-size: var(--font-size-0);
4642
4651
  grid-column: 1/-1;
@@ -4645,10 +4654,10 @@ Lists meant to be used stand-alone or as part of Select elements
4645
4654
  }
4646
4655
 
4647
4656
  /* Auto-fit */
4648
- &.auto-fit {
4657
+ &.ui-auto-fit {
4649
4658
  inline-size: auto;
4650
4659
 
4651
- .field {
4660
+ .ui-field {
4652
4661
  inline-size: auto;
4653
4662
  }
4654
4663
 
@@ -4672,7 +4681,7 @@ Lists meant to be used stand-alone or as part of Select elements
4672
4681
  /*
4673
4682
  * Variant: Filled
4674
4683
  */
4675
- &.filled {
4684
+ &.ui-filled {
4676
4685
  --_bg-color: var(--surface-tonal);
4677
4686
 
4678
4687
  &:not(:has([disabled], :has(input[type="color"]))) {
@@ -4695,7 +4704,7 @@ Lists meant to be used stand-alone or as part of Select elements
4695
4704
  display: none;
4696
4705
  }
4697
4706
 
4698
- .field {
4707
+ .ui-field {
4699
4708
  cursor: not-allowed;
4700
4709
  }
4701
4710
 
@@ -4707,9 +4716,9 @@ Lists meant to be used stand-alone or as part of Select elements
4707
4716
  }
4708
4717
  }
4709
4718
 
4710
- .label,
4711
- .start-text,
4712
- .end-text {
4719
+ .ui-label,
4720
+ .ui-start-text,
4721
+ .ui-end-text {
4713
4722
  cursor: not-allowed;
4714
4723
  }
4715
4724
  }
@@ -4730,31 +4739,31 @@ Lists meant to be used stand-alone or as part of Select elements
4730
4739
  }
4731
4740
 
4732
4741
  /* Sizes */
4733
- &.small {
4742
+ &.ui-small {
4734
4743
  --_field-padding-block: var(--size-2);
4735
4744
  --_height: var(--field-size-small);
4736
4745
 
4737
4746
  &:has(input[type="color"]) {
4738
- .label {
4747
+ .ui-label {
4739
4748
  line-height: 1.5;
4740
4749
  }
4741
4750
  }
4742
4751
  }
4743
4752
 
4744
4753
  /* Orientation */
4745
- &.spread {
4754
+ &.ui-spread {
4746
4755
  align-items: start;
4747
4756
  column-gap: var(--size-4);
4748
4757
  container-type: inline-size;
4749
4758
  grid-template-columns: 1fr auto;
4750
4759
 
4751
- .label {
4760
+ .ui-label {
4752
4761
  font-weight: 600;
4753
4762
  grid-column: 1;
4754
4763
  grid-row: 1;
4755
4764
  }
4756
4765
 
4757
- .start-text {
4766
+ .ui-start-text {
4758
4767
  color: var(--_end-text-color);
4759
4768
  font-size: var(--font-size-0);
4760
4769
  grid-column: 1;
@@ -4762,16 +4771,16 @@ Lists meant to be used stand-alone or as part of Select elements
4762
4771
  line-height: 1.5;
4763
4772
  }
4764
4773
 
4765
- .field {
4774
+ .ui-field {
4766
4775
  align-self: start;
4767
4776
  grid-column: 2;
4768
4777
  grid-row: 1 / span 2;
4769
4778
  }
4770
4779
 
4771
- .field:has(textarea) {
4780
+ .ui-field:has(textarea) {
4772
4781
  grid-row: 1 / span 3;
4773
4782
 
4774
- +.end-text {
4783
+ +.ui-end-text {
4775
4784
  grid-row: 4;
4776
4785
  }
4777
4786
  }
@@ -4780,7 +4789,7 @@ Lists meant to be used stand-alone or as part of Select elements
4780
4789
  min-inline-size: 30ch;
4781
4790
  }
4782
4791
 
4783
- :where(.end-text) {
4792
+ :where(.ui-end-text) {
4784
4793
  grid-column: 2;
4785
4794
  text-align: end;
4786
4795
  }
@@ -4790,23 +4799,23 @@ Lists meant to be used stand-alone or as part of Select elements
4790
4799
  column-gap: 0;
4791
4800
  grid-template-columns: 1fr;
4792
4801
 
4793
- .label {
4802
+ .ui-label {
4794
4803
  grid-column: 1;
4795
4804
  grid-row: 1;
4796
4805
  }
4797
4806
 
4798
- .start-text {
4807
+ .ui-start-text {
4799
4808
  grid-column: 1;
4800
4809
  grid-row: 2;
4801
4810
  }
4802
4811
 
4803
- .field,
4804
- .field:has(textarea) {
4812
+ .ui-field,
4813
+ .ui-field:has(textarea) {
4805
4814
  grid-column: 1;
4806
4815
  grid-row: 3;
4807
4816
  }
4808
4817
 
4809
- :where(.end-text) {
4818
+ :where(.ui-end-text) {
4810
4819
  grid-column: 1;
4811
4820
  grid-row: 4;
4812
4821
  text-align: start;
@@ -4817,7 +4826,7 @@ Lists meant to be used stand-alone or as part of Select elements
4817
4826
  }
4818
4827
 
4819
4828
  @layer components.extended {
4820
- :where(.select select) {
4829
+ :where(.ui-select select) {
4821
4830
  position: relative;
4822
4831
 
4823
4832
  /* Default arrow */
@@ -4882,7 +4891,7 @@ Lists meant to be used stand-alone or as part of Select elements
4882
4891
  }
4883
4892
  }
4884
4893
 
4885
- .list {
4894
+ .ui-list {
4886
4895
  --_bg-color: var(--surface-filled);
4887
4896
  border: var(--field-border-width) solid var(--field-border-color);
4888
4897
  border-radius: var(--field-border-radius);
@@ -4937,10 +4946,10 @@ Lists meant to be used stand-alone or as part of Select elements
4937
4946
  }
4938
4947
  }
4939
4948
 
4940
- :where(.select:has(select)) {
4949
+ :where(.ui-select:has(select)) {
4941
4950
 
4942
4951
  /* Size */
4943
- &.small {
4952
+ &.ui-small {
4944
4953
  button {
4945
4954
  padding-inline: var(--size-2) var(--size-7);
4946
4955
 
@@ -4988,7 +4997,7 @@ Lists meant to be used stand-alone or as part of Select elements
4988
4997
 
4989
4998
  @layer components.extended {
4990
4999
 
4991
- :where(.text-field:has( :where(input[type="date"],
5000
+ :where(.ui-text-field:has( :where(input[type="date"],
4992
5001
  input[type="datetime-local"],
4993
5002
  input[type="email"],
4994
5003
  input[type="month"],
@@ -5002,7 +5011,7 @@ Lists meant to be used stand-alone or as part of Select elements
5002
5011
  input[type="week"]))) {
5003
5012
 
5004
5013
  /* Sizes */
5005
- &.small {
5014
+ &.ui-small {
5006
5015
  input {
5007
5016
  padding-inline: var(--size-2);
5008
5017
  }
@@ -5010,8 +5019,8 @@ Lists meant to be used stand-alone or as part of Select elements
5010
5019
  }
5011
5020
 
5012
5021
  /* Autosuggest */
5013
- :where(.text-field:has(input[list])) {
5014
- .field {
5022
+ :where(.ui-text-field:has(input[list])) {
5023
+ .ui-field {
5015
5024
  position: relative;
5016
5025
  }
5017
5026
 
@@ -5027,7 +5036,7 @@ Lists meant to be used stand-alone or as part of Select elements
5027
5036
  padding-inline-end: var(--size-8);
5028
5037
  }
5029
5038
 
5030
- .field::after {
5039
+ .ui-field::after {
5031
5040
  block-size: 0;
5032
5041
  border-block-start: 5px solid;
5033
5042
  border-inline: 5px solid transparent;
@@ -5039,12 +5048,12 @@ Lists meant to be used stand-alone or as part of Select elements
5039
5048
  translate: 0 -50%;
5040
5049
  }
5041
5050
 
5042
- &.small {
5051
+ &.ui-small {
5043
5052
  input[list] {
5044
5053
  padding-inline-end: var(--size-7);
5045
5054
  }
5046
5055
 
5047
- .field::after {
5056
+ .ui-field::after {
5048
5057
  inset-inline-end: var(--size-2);
5049
5058
  }
5050
5059
  }
@@ -5052,7 +5061,7 @@ Lists meant to be used stand-alone or as part of Select elements
5052
5061
  }
5053
5062
 
5054
5063
  @layer components.extended {
5055
- :where(.textarea) {
5064
+ :where(.ui-textarea) {
5056
5065
  textarea {
5057
5066
  block-size: auto;
5058
5067
  field-sizing: content;
@@ -5061,14 +5070,14 @@ Lists meant to be used stand-alone or as part of Select elements
5061
5070
  }
5062
5071
 
5063
5072
  /* Size */
5064
- &.small {
5073
+ &.ui-small {
5065
5074
  textarea {
5066
5075
  min-block-size: var(--size-9);
5067
5076
  }
5068
5077
  }
5069
5078
 
5070
5079
  /* Auto-fit */
5071
- &.auto-fit {
5080
+ &.ui-auto-fit {
5072
5081
  textarea {
5073
5082
  resize: both;
5074
5083
  }
@@ -5077,12 +5086,12 @@ Lists meant to be used stand-alone or as part of Select elements
5077
5086
  }
5078
5087
 
5079
5088
  @layer components.extended {
5080
- :where(.tooltip) {
5089
+ :where(.ui-tooltip) {
5081
5090
  --_tooltip-bg: light-dark(var(--gray-13), var(--gray-3));
5082
5091
  --_tooltip-color: light-dark(var(--gray-1), var(--gray-15));
5083
5092
  --_tooltip-offset: var(--size-2);
5084
5093
 
5085
- &>.anchor-floating {
5094
+ &>.ui-anchor-floating {
5086
5095
  background-color: var(--_tooltip-bg);
5087
5096
  border-radius: var(--radius-2);
5088
5097
  color: var(--_tooltip-color);
@@ -5104,15 +5113,15 @@ Lists meant to be used stand-alone or as part of Select elements
5104
5113
  /* Optional arrow pointing from the tooltip toward the trigger.
5105
5114
  Anchored to the same --anchor so it flips together with the
5106
5115
  tooltip when position-try-fallbacks kicks in. */
5107
- &.with-arrow {
5116
+ &.ui-with-arrow {
5108
5117
  --_arrow-size: var(--size-2);
5109
5118
 
5110
- &>.anchor-floating {
5119
+ &>.ui-anchor-floating {
5111
5120
  /* Reserve space so the arrow doesn't overlap the trigger. */
5112
5121
  --_tooltip-offset: calc(var(--size-2) + var(--_arrow-size) / 2);
5113
5122
  }
5114
5123
 
5115
- &>.anchor-floating::before {
5124
+ &>.ui-anchor-floating::before {
5116
5125
  background-color: var(--_tooltip-bg);
5117
5126
  block-size: var(--_arrow-size);
5118
5127
  content: "";
@@ -5126,7 +5135,7 @@ Lists meant to be used stand-alone or as part of Select elements
5126
5135
  }
5127
5136
 
5128
5137
  /* Fade */
5129
- &>.anchor-floating[popover] {
5138
+ &>.ui-anchor-floating[popover] {
5130
5139
  opacity: 0;
5131
5140
  transition:
5132
5141
  display 0.15s allow-discrete,