opui-css 4.1.0 → 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 +29 -0
  2. package/MIGRATING.md +23 -1
  3. package/README.md +1 -1
  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 +3 -3
  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 +3 -3
  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
package/dist/opui.css CHANGED
@@ -1264,11 +1264,11 @@
1264
1264
  @layer theme {
1265
1265
 
1266
1266
  /* 1. Color scheme */
1267
- .light {
1267
+ .ui-light {
1268
1268
  --color-scheme: light;
1269
1269
  }
1270
1270
 
1271
- .dark {
1271
+ .ui-dark {
1272
1272
  --color-scheme: dark;
1273
1273
  }
1274
1274
 
@@ -1324,7 +1324,7 @@
1324
1324
  --border-width: 1px;
1325
1325
 
1326
1326
  /* 9. Focus ring — components consume these and may override locally
1327
- (e.g. .button.filled { --focus-ring-offset: 3px; }, .checkbox { --focus-ring-offset: 0; }) */
1327
+ (e.g. .ui-button.ui-filled { --focus-ring-offset: 3px; }, .ui-checkbox { --focus-ring-offset: 0; }) */
1328
1328
  --focus-ring-color: var(--primary);
1329
1329
  --focus-ring-width: 2px;
1330
1330
  --focus-ring-offset: 2px;
@@ -1368,24 +1368,24 @@
1368
1368
  }
1369
1369
 
1370
1370
  /* 14. Severity scope classes — re-source the palette inside these contexts.
1371
- Authoring `<div class="warning">` paints the entire subtree warning-orange.
1371
+ Authoring `<div class="ui-warning">` paints the entire subtree warning-orange.
1372
1372
  Non-severity tokens (--primary, --neutral) deliberately have no scope class. */
1373
- :where(.critical, [data-invalid], del) {
1373
+ :where(.ui-critical, [data-invalid], del) {
1374
1374
  --palette-source: oklch(0.58 0.21 var(--hue-red));
1375
1375
  --palette-hue-rotate-by: 1;
1376
1376
  }
1377
1377
 
1378
- :where(.info, abbr, dfn) {
1378
+ :where(.ui-info, abbr, dfn) {
1379
1379
  --palette-source: oklch(0.58 0.21 var(--hue-blue));
1380
1380
  --palette-hue-rotate-by: 1;
1381
1381
  }
1382
1382
 
1383
- :where(.success, ins) {
1383
+ :where(.ui-success, ins) {
1384
1384
  --palette-source: oklch(0.58 0.21 var(--hue-green));
1385
1385
  --palette-hue-rotate-by: 1;
1386
1386
  }
1387
1387
 
1388
- :where(.warning) {
1388
+ :where(.ui-warning) {
1389
1389
  --palette-source: oklch(0.58 0.21 var(--hue-orange));
1390
1390
  --palette-hue-rotate-by: 1;
1391
1391
  }
@@ -1400,7 +1400,7 @@
1400
1400
  /*** Root components (no dependencies) */
1401
1401
 
1402
1402
  @layer components.root {
1403
- :where(.button) {
1403
+ :where(.ui-button) {
1404
1404
  --_color: light-dark(var(--color-16), var(--color-1));
1405
1405
  --_color-contrast: light-dark(var(--color-1), var(--color-16));
1406
1406
  --_color-tonal: var(--surface-tonal);
@@ -1455,8 +1455,8 @@
1455
1455
  contrast text, and hover/active strategy are identical.
1456
1456
  The .critical scope class in theme.css redirects --palette-source so
1457
1457
  --color-6 below becomes a tint of the active color. */
1458
- &.critical,
1459
- &.primary {
1458
+ &.ui-critical,
1459
+ &.ui-primary {
1460
1460
  --_color-contrast: var(--gray-1);
1461
1461
  --_color-tonal: var(--color-6);
1462
1462
  --_accent-tonal-contrast: var(--text-primary-contrast);
@@ -1470,11 +1470,11 @@
1470
1470
  --_outlined-active-bg-color: oklch(from var(--_accent) calc(l - 0.1) c h);
1471
1471
  }
1472
1472
 
1473
- &.critical {
1473
+ &.ui-critical {
1474
1474
  --_color: var(--critical);
1475
1475
  }
1476
1476
 
1477
- &.primary {
1477
+ &.ui-primary {
1478
1478
  --_color: var(--primary);
1479
1479
  }
1480
1480
 
@@ -1502,7 +1502,7 @@
1502
1502
 
1503
1503
 
1504
1504
  /* Icons / Keyboard */
1505
- &:where(:has(svg), &.icon-only) {
1505
+ &:where(:has(svg), &.ui-icon-only) {
1506
1506
  gap: 1ex;
1507
1507
 
1508
1508
  svg {
@@ -1523,27 +1523,27 @@
1523
1523
 
1524
1524
  /* Sizes — heights aliased from the shared --control-size scale.
1525
1525
  Override --button-size-* in a parent scope to resize an entire region. */
1526
- &.x-small {
1526
+ &.ui-x-small {
1527
1527
  --_min-height: var(--button-size-x-small);
1528
1528
  --_font-size: var(--font-size-0);
1529
1529
  padding-block: 0;
1530
1530
  padding-inline: .5ex;
1531
1531
  }
1532
1532
 
1533
- &.small {
1533
+ &.ui-small {
1534
1534
  --_min-height: var(--button-size-small);
1535
1535
  --_font-size: var(--font-size-05);
1536
1536
  padding-block: 0;
1537
1537
  padding-inline: .75ex;
1538
1538
  }
1539
1539
 
1540
- &.large {
1540
+ &.ui-large {
1541
1541
  --_min-height: var(--button-size-large);
1542
1542
  padding-inline: 4ex;
1543
1543
  }
1544
1544
 
1545
1545
  /* Variants */
1546
- &.outlined {
1546
+ &.ui-outlined {
1547
1547
  --_bg-color: transparent;
1548
1548
  --_border-color: var(--_accent);
1549
1549
  --_text-color: var(--_accent);
@@ -1563,7 +1563,7 @@
1563
1563
  }
1564
1564
  }
1565
1565
 
1566
- &.tonal {
1566
+ &.ui-tonal {
1567
1567
  --_bg-color: var(--_accent-tonal);
1568
1568
  --_text-color: var(--_accent-tonal-contrast);
1569
1569
 
@@ -1580,7 +1580,7 @@
1580
1580
  }
1581
1581
  }
1582
1582
 
1583
- &.filled {
1583
+ &.ui-filled {
1584
1584
  --_bg-color: var(--_accent);
1585
1585
  --_text-color: var(--_accent-contrast);
1586
1586
 
@@ -1616,7 +1616,7 @@
1616
1616
  }
1617
1617
 
1618
1618
  @layer components.root {
1619
- :where(.callout) {
1619
+ :where(.ui-callout) {
1620
1620
  --_bg-color: var(--surface-tonal);
1621
1621
  --_border-color: var(--surface-tonal);
1622
1622
  --_color: var(--text-primary);
@@ -1644,11 +1644,11 @@
1644
1644
  padding: var(--_padding);
1645
1645
  position: relative;
1646
1646
 
1647
- &.critical,
1648
- &.info,
1649
- &.neutral,
1650
- &.success,
1651
- &.warning {
1647
+ &.ui-critical,
1648
+ &.ui-info,
1649
+ &.ui-neutral,
1650
+ &.ui-success,
1651
+ &.ui-warning {
1652
1652
  --_bg-color: light-dark(oklch(from var(--color-2) l c h / 20%), oklch(from var(--color-6) l c h / 5%));
1653
1653
  --_border-color: light-dark(var(--color-5), var(--color-11));
1654
1654
  --_color: light-dark(var(--color-16), var(--color-1));
@@ -1660,7 +1660,7 @@
1660
1660
  --_outlined-icon-color: var(--color-9);
1661
1661
  }
1662
1662
 
1663
- &.outlined {
1663
+ &.ui-outlined {
1664
1664
  --_bg-color: var(--_outlined-bg-color);
1665
1665
  --_border-color: var(--_outlined-border-color);
1666
1666
  --_color: var(--_outlined-color);
@@ -1677,7 +1677,7 @@
1677
1677
  z-index: -1;
1678
1678
  }
1679
1679
 
1680
- &>.content {
1680
+ &>.ui-content {
1681
1681
  display: grid;
1682
1682
  font-size: var(--_font-size);
1683
1683
  gap: var(--_content-gap);
@@ -1701,7 +1701,7 @@
1701
1701
  /* Links
1702
1702
  * Can't make sure contrast will be acceptable (yet) so we use the current text color instead.
1703
1703
  */
1704
- &:not(.outlined) {
1704
+ &:not(.ui-outlined) {
1705
1705
  a[href] {
1706
1706
  color: inherit;
1707
1707
 
@@ -1726,7 +1726,7 @@
1726
1726
  }
1727
1727
 
1728
1728
  @layer components.root {
1729
- :where(.icon-button) {
1729
+ :where(.ui-icon-button) {
1730
1730
  --_color: light-dark(var(--color-16), var(--color-1));
1731
1731
  --_color-contrast: light-dark(var(--color-1), var(--color-16));
1732
1732
  --_color-tonal: var(--surface-tonal);
@@ -1794,8 +1794,8 @@
1794
1794
  contrast text, and hover/active strategy are identical.
1795
1795
  The .critical scope class in theme.css redirects --palette-source so
1796
1796
  --color-6 below becomes a tint of the active color. */
1797
- &.critical,
1798
- &.primary {
1797
+ &.ui-critical,
1798
+ &.ui-primary {
1799
1799
  --_color-contrast: var(--gray-1);
1800
1800
  --_color-tonal: var(--color-6);
1801
1801
  --_accent-tonal-contrast: var(--text-primary-contrast);
@@ -1809,11 +1809,11 @@
1809
1809
  --_outlined-active-bg-color: oklch(from var(--_accent) calc(l - 0.1) c h);
1810
1810
  }
1811
1811
 
1812
- &.critical {
1812
+ &.ui-critical {
1813
1813
  --_color: var(--critical);
1814
1814
  }
1815
1815
 
1816
- &.primary {
1816
+ &.ui-primary {
1817
1817
  --_color: var(--primary);
1818
1818
  }
1819
1819
 
@@ -1834,7 +1834,7 @@
1834
1834
  }
1835
1835
 
1836
1836
  /* Size */
1837
- &.small {
1837
+ &.ui-small {
1838
1838
  block-size: var(--size-4);
1839
1839
  inline-size: var(--size-4);
1840
1840
 
@@ -1845,18 +1845,18 @@
1845
1845
  }
1846
1846
 
1847
1847
  /* Variants */
1848
- &.outlined {
1848
+ &.ui-outlined {
1849
1849
  --_bg-color: transparent;
1850
1850
  --_border-color: var(--_accent);
1851
1851
  --_text-color: var(--_accent);
1852
1852
  }
1853
1853
 
1854
- &.tonal {
1854
+ &.ui-tonal {
1855
1855
  --_bg-color: var(--_accent-tonal);
1856
1856
  --_text-color: var(--_accent-tonal-contrast);
1857
1857
  }
1858
1858
 
1859
- &.filled {
1859
+ &.ui-filled {
1860
1860
  --_bg-color: var(--_accent);
1861
1861
  --_interaction-active-color: var(--_filled-active-bg-color);
1862
1862
  --_interaction-hover-color: var(--_filled-hover-bg-color);
@@ -1866,7 +1866,7 @@
1866
1866
  }
1867
1867
 
1868
1868
  @layer components.root {
1869
- :where(.tabs) {
1869
+ :where(.ui-tabs) {
1870
1870
  --_accent-color: var(--primary);
1871
1871
  --_bg-color: transparent;
1872
1872
 
@@ -1876,8 +1876,8 @@
1876
1876
  gap: 0 var(--size-1);
1877
1877
  position: relative;
1878
1878
 
1879
- &>.tab-input[type="radio"] {
1880
- /* utils > .sr-only */
1879
+ &>.ui-tab-input[type="radio"] {
1880
+ /* utils > .ui-sr-only */
1881
1881
  /* TODO: use mixin for this when available */
1882
1882
  block-size: 1px;
1883
1883
  clip-path: inset(50%);
@@ -1889,19 +1889,23 @@
1889
1889
  &:checked {
1890
1890
 
1891
1891
  /* Checked Tab */
1892
- &+[role="tab"] {
1892
+ &+[role="tab"],
1893
+ &+.ui-tab-label {
1893
1894
  border-block-end-color: var(--_accent-color);
1894
1895
  color: var(--_accent-color);
1895
1896
 
1896
1897
  /* Checked Panel */
1897
- &+[role="tabpanel"] {
1898
+ &+[role="tabpanel"],
1899
+ &+.ui-tab-panel {
1898
1900
  display: block;
1899
1901
  }
1900
1902
  }
1901
1903
  }
1902
1904
 
1903
1905
  &:focus-visible {
1904
- &+[role="tab"] {
1906
+
1907
+ &+[role="tab"],
1908
+ &+.ui-tab-label {
1905
1909
  --focus-ring-color: var(--text-muted);
1906
1910
  --focus-ring-offset: calc(-1 * var(--size-2));
1907
1911
  outline: var(--focus-ring-width) var(--focus-ring-style) var(--focus-ring-color);
@@ -1911,7 +1915,8 @@
1911
1915
  }
1912
1916
 
1913
1917
  /* Tab */
1914
- &>[role="tab"] {
1918
+ &>[role="tab"],
1919
+ &>.ui-tab-label {
1915
1920
  align-items: center;
1916
1921
  background-color: transparent;
1917
1922
  border-bottom: 2px solid transparent;
@@ -1935,7 +1940,8 @@
1935
1940
  }
1936
1941
 
1937
1942
  /* Tab Panel */
1938
- &>[role="tabpanel"] {
1943
+ &>[role="tabpanel"],
1944
+ &>.ui-tab-panel {
1939
1945
  display: none;
1940
1946
  inline-size: 100%;
1941
1947
  order: 2;
@@ -1944,7 +1950,7 @@
1944
1950
  }
1945
1951
 
1946
1952
  @layer components.root {
1947
- :where(.toggle-group) {
1953
+ :where(.ui-toggle-group) {
1948
1954
  --_bg-color: var(--surface-default);
1949
1955
  --_border-color: var(--border-color);
1950
1956
  --_border-radius: var(--button-border-radius);
@@ -1957,27 +1963,27 @@
1957
1963
  overflow: hidden;
1958
1964
 
1959
1965
  /* Sizes */
1960
- &.small {
1961
- .toggle-button {
1966
+ &.ui-small {
1967
+ .ui-toggle-button {
1962
1968
  --_size: var(--field-size-small);
1963
1969
  }
1964
1970
  }
1965
1971
 
1966
- &.x-small {
1967
- .toggle-button {
1972
+ &.ui-x-small {
1973
+ .ui-toggle-button {
1968
1974
  --_size: var(--field-size-x-small);
1969
1975
  }
1970
1976
  }
1971
1977
 
1972
1978
  /* Toggle button */
1973
- .toggle-button {
1979
+ .ui-toggle-button {
1974
1980
  border: 0;
1975
1981
  border-radius: 0;
1976
1982
  margin: 0;
1977
1983
  }
1978
1984
 
1979
- &:not(.vertical) {
1980
- .toggle-button {
1985
+ &:not(.ui-vertical) {
1986
+ .ui-toggle-button {
1981
1987
  border-inline-end: 1px solid var(--_border-color);
1982
1988
 
1983
1989
  &:last-of-type {
@@ -1986,10 +1992,10 @@
1986
1992
  }
1987
1993
  }
1988
1994
 
1989
- &.vertical {
1995
+ &.ui-vertical {
1990
1996
  flex-direction: column;
1991
1997
 
1992
- .toggle-button {
1998
+ .ui-toggle-button {
1993
1999
  border-block-end: 1px solid var(--_border-color);
1994
2000
 
1995
2001
  &:last-of-type {
@@ -2005,7 +2011,7 @@
2005
2011
  */
2006
2012
 
2007
2013
  @layer components.root {
2008
- :where(.toggle-button) {
2014
+ :where(.ui-toggle-button) {
2009
2015
  --_button-bg-color: transparent;
2010
2016
  --_size: var(--field-size);
2011
2017
  --_svg-size: var(--size-4);
@@ -2030,7 +2036,7 @@
2030
2036
 
2031
2037
  input[type="checkbox"],
2032
2038
  input[type="radio"] {
2033
- /* utils.css > .sr-only */
2039
+ /* utils.css > .ui-sr-only */
2034
2040
  block-size: 1px;
2035
2041
  clip-path: inset(50%);
2036
2042
  inline-size: 1px;
@@ -2041,7 +2047,7 @@
2041
2047
 
2042
2048
  /* Element states */
2043
2049
  @media (pointer: fine) {
2044
- &:hover:not(.disabled) {
2050
+ &:hover:not(.ui-disabled) {
2045
2051
  --_button-bg-color: light-dark(oklch(0% 0 0 / 0.04), oklch(100% 0 0 / 0.08));
2046
2052
  }
2047
2053
  }
@@ -2054,7 +2060,7 @@
2054
2060
  }
2055
2061
 
2056
2062
  /* Disabled */
2057
- &.disabled {
2063
+ &.ui-disabled {
2058
2064
  border-color: color-mix(in oklch, var(--border-color) 50%, transparent);
2059
2065
  color: color-mix(in oklch, var(--text-primary) 30%, transparent);
2060
2066
  cursor: not-allowed;
@@ -2079,25 +2085,25 @@
2079
2085
  }
2080
2086
 
2081
2087
  /* Sizes */
2082
- &.small {
2088
+ &.ui-small {
2083
2089
  --_size: var(--field-size-small);
2084
2090
  }
2085
2091
 
2086
- &.x-small {
2092
+ &.ui-x-small {
2087
2093
  --_size: var(--field-size-x-small);
2088
2094
  }
2089
2095
  }
2090
2096
  }
2091
2097
 
2092
2098
  @layer components.root {
2093
- :where(.anchor) {
2099
+ :where(.ui-anchor) {
2094
2100
  anchor-name: --anchor;
2095
2101
  anchor-scope: --anchor;
2096
2102
  display: inline-block;
2097
2103
  inline-size: fit-content;
2098
2104
 
2099
2105
  /* Always-visible */
2100
- &>.anchor-floating:not([popover]) {
2106
+ &>.ui-anchor-floating:not([popover]) {
2101
2107
  block-size: max-content;
2102
2108
  inline-size: max-content;
2103
2109
  position: absolute;
@@ -2107,7 +2113,7 @@
2107
2113
  }
2108
2114
 
2109
2115
  /* Hover-triggered */
2110
- &>.anchor-floating[popover] {
2116
+ &>.ui-anchor-floating[popover] {
2111
2117
  inset: unset;
2112
2118
  margin: 0;
2113
2119
  position: absolute;
@@ -2118,7 +2124,7 @@
2118
2124
  }
2119
2125
 
2120
2126
  @layer components.root {
2121
- :where(.avatar) {
2127
+ :where(.ui-avatar) {
2122
2128
  --_bg-color: var(--primary);
2123
2129
  --_color: var(--color-1);
2124
2130
  --_width: 40px;
@@ -2152,15 +2158,15 @@
2152
2158
  position: absolute;
2153
2159
  }
2154
2160
 
2155
- &.squared {
2161
+ &.ui-squared {
2156
2162
  border-radius: 0;
2157
2163
  }
2158
2164
 
2159
- &.rounded {
2165
+ &.ui-rounded {
2160
2166
  border-radius: var(--radius-2);
2161
2167
  }
2162
2168
 
2163
- &.squircle {
2169
+ &.ui-squircle {
2164
2170
  border-radius: var(--radius-3);
2165
2171
 
2166
2172
  @supports (corner-shape: squircle) {
@@ -2176,7 +2182,7 @@
2176
2182
 
2177
2183
  display: flex;
2178
2184
 
2179
- .avatar {
2185
+ .ui-avatar {
2180
2186
  box-shadow: 0 0 0 2px var(--_outline-color);
2181
2187
  margin-inline-end: calc(-1 * var(--_margin));
2182
2188
  }
@@ -2184,7 +2190,7 @@
2184
2190
  }
2185
2191
 
2186
2192
  @layer components.root {
2187
- :where(.card) {
2193
+ :where(.ui-card) {
2188
2194
  --_bg-tonal: var(--surface-tonal);
2189
2195
  --_bg-elevated: var(--surface-elevated);
2190
2196
  --_bg-surface: var(--surface-default);
@@ -2216,30 +2222,30 @@
2216
2222
  position: relative;
2217
2223
 
2218
2224
  /* Variants */
2219
- &.text {
2225
+ &.ui-text {
2220
2226
  --_card-bg-color: transparent;
2221
2227
  --_card-border-color: transparent;
2222
2228
  --_card-border-width: 0;
2223
2229
  --_card-shadow: none;
2224
2230
  }
2225
2231
 
2226
- &.tonal {
2232
+ &.ui-tonal {
2227
2233
  --_card-bg-color: var(--_bg-tonal);
2228
2234
  --_card-border-width: 1px;
2229
2235
  }
2230
2236
 
2231
- &.elevated {
2237
+ &.ui-elevated {
2232
2238
  --_card-bg-color: var(--_bg-elevated);
2233
2239
  --_card-shadow: var(--_shadow-elevated);
2234
2240
  }
2235
2241
 
2236
- &.outlined {
2242
+ &.ui-outlined {
2237
2243
  --_card-bg-color: var(--_bg-surface);
2238
2244
  --_card-border-color: var(--_border-color);
2239
2245
  --_card-border-width: 1px;
2240
2246
  }
2241
2247
 
2242
- &> :where(hgroup, .content) {
2248
+ &> :where(hgroup, .ui-content) {
2243
2249
  padding-inline: var(--size-3);
2244
2250
 
2245
2251
  &:last-child {
@@ -2267,31 +2273,31 @@
2267
2273
  }
2268
2274
 
2269
2275
  /* Content */
2270
- &>.content:where(:only-child, :first-child) {
2276
+ &>.ui-content:where(:only-child, :first-child) {
2271
2277
  padding-block: var(--size-3) var(--size-4);
2272
2278
  }
2273
2279
 
2274
2280
  /* Actions */
2275
- &>.actions {
2281
+ &>.ui-actions {
2276
2282
  display: flex;
2277
2283
  gap: var(--size-2);
2278
2284
  margin-block: var(--size-2) 0;
2279
2285
  padding-block-end: var(--size-2);
2280
2286
  padding-inline: var(--size-3);
2281
2287
 
2282
- &:has(.button:first-child[class="button"]) {
2288
+ &:has(.ui-button:first-child[class="ui-button"]) {
2283
2289
  padding-inline: var(--size-1) var(--size-3);
2284
2290
  }
2285
2291
 
2286
- &:has(.button:not([class="button"])) {
2292
+ &:has(.ui-button:not([class="ui-button"])) {
2287
2293
  padding-block-end: var(--size-2);
2288
2294
  }
2289
2295
 
2290
2296
  /* Alignment */
2291
- &.align-end {
2297
+ &.ui-align-end {
2292
2298
  justify-content: end;
2293
2299
 
2294
- &:has(.button:first-child[class="button"]) {
2300
+ &:has(.ui-button:first-child[class="ui-button"]) {
2295
2301
  padding-inline: var(--size-3) var(--size-1);
2296
2302
  }
2297
2303
  }
@@ -2302,7 +2308,7 @@
2302
2308
  }
2303
2309
 
2304
2310
  @layer components.root {
2305
- :where(.chip) {
2311
+ :where(.ui-chip) {
2306
2312
  --_bg-color: var(--surface-tonal);
2307
2313
  --_border-color: var(--border-color);
2308
2314
  --_color: var(--text-primary);
@@ -2320,12 +2326,12 @@
2320
2326
  text-decoration: none;
2321
2327
 
2322
2328
  /* Variants */
2323
- &.tonal {
2329
+ &.ui-tonal {
2324
2330
  --_bg-color: var(--surface-tonal);
2325
2331
  --_color: var(--text-primary);
2326
2332
  }
2327
2333
 
2328
- &.outlined {
2334
+ &.ui-outlined {
2329
2335
  --_bg-color: var(--surface-default);
2330
2336
  --_color: var(--text-primary);
2331
2337
  }
@@ -2354,11 +2360,11 @@
2354
2360
  }
2355
2361
 
2356
2362
  /* Sizes */
2357
- &.small {
2363
+ &.ui-small {
2358
2364
  block-size: var(--size-5);
2359
2365
  }
2360
2366
 
2361
- &.multiline {
2367
+ &.ui-multiline {
2362
2368
  block-size: auto;
2363
2369
  }
2364
2370
 
@@ -2390,7 +2396,7 @@
2390
2396
  }
2391
2397
 
2392
2398
  @layer components.root {
2393
- :where(.description-list) {
2399
+ :where(.ui-description-list) {
2394
2400
  --_border-style: solid;
2395
2401
  --_border-width: 1px;
2396
2402
 
@@ -2399,17 +2405,18 @@
2399
2405
  margin: 0;
2400
2406
  padding: 0;
2401
2407
 
2402
- &.dotted {
2408
+ &.ui-dotted {
2403
2409
  --_border-style: dotted;
2404
2410
  --_border-width: 2px;
2405
2411
  }
2406
2412
 
2407
- .item {
2413
+ .ui-item {
2408
2414
  display: grid;
2409
2415
  margin: 0;
2410
2416
  padding: 0;
2411
2417
 
2412
- dt {
2418
+ dt,
2419
+ .ui-term {
2413
2420
  display: block;
2414
2421
  font-weight: 700;
2415
2422
  overflow: hidden;
@@ -2424,13 +2431,14 @@
2424
2431
  @container (width > 45ch) {
2425
2432
  gap: var(--size-1);
2426
2433
 
2427
- .item {
2434
+ .ui-item {
2428
2435
  align-items: baseline;
2429
2436
  display: grid;
2430
2437
  gap: var(--size-1);
2431
2438
  grid-template-columns: 1fr auto;
2432
2439
 
2433
- dt {
2440
+ dt,
2441
+ .ui-term {
2434
2442
  inline-size: max-content;
2435
2443
 
2436
2444
  &::after {
@@ -2444,10 +2452,11 @@
2444
2452
  }
2445
2453
  }
2446
2454
 
2447
- &.bordered .item {
2455
+ &.ui-bordered .ui-item {
2448
2456
  grid-template-columns: auto 1fr auto;
2449
2457
 
2450
- dt {
2458
+ dt,
2459
+ .ui-term {
2451
2460
  order: 0;
2452
2461
  }
2453
2462
 
@@ -2468,28 +2477,28 @@
2468
2477
  }
2469
2478
 
2470
2479
  @layer components.root {
2471
- :where(hr) {
2480
+ :where(.ui-divider) {
2472
2481
  background-color: var(--border-color);
2473
2482
  block-size: var(--border-size-1);
2474
2483
  margin-block: var(--size-fluid-3);
2475
2484
 
2476
2485
  /* Border color */
2477
- &.border-filled {
2486
+ &.ui-border-filled {
2478
2487
  background-color: var(--surface-filled);
2479
2488
  }
2480
2489
 
2481
- &.border-primary {
2490
+ &.ui-border-primary {
2482
2491
  background-color: var(--primary);
2483
2492
  }
2484
2493
 
2485
- &.border-tonal {
2494
+ &.ui-border-tonal {
2486
2495
  background-color: var(--surface-tonal);
2487
2496
  }
2488
2497
  }
2489
2498
  }
2490
2499
 
2491
2500
  @layer components.root {
2492
- :where(.link) {
2501
+ :where(.ui-link) {
2493
2502
  color: var(--primary);
2494
2503
  cursor: pointer;
2495
2504
  font-weight: 700;
@@ -2511,7 +2520,7 @@
2511
2520
  }
2512
2521
 
2513
2522
  @layer components.root {
2514
- :where(table) {
2523
+ :where(.ui-table) {
2515
2524
  --_table-border-radius: var(--border-radius);
2516
2525
 
2517
2526
  border-collapse: separate;
@@ -2645,7 +2654,7 @@
2645
2654
  }
2646
2655
 
2647
2656
  /* Spacious */
2648
- &.spacious {
2657
+ &.ui-spacious {
2649
2658
 
2650
2659
  th,
2651
2660
  td {
@@ -2667,7 +2676,7 @@
2667
2676
  }
2668
2677
 
2669
2678
  /* Dense */
2670
- &.dense {
2679
+ &.ui-dense {
2671
2680
 
2672
2681
  th,
2673
2682
  td {
@@ -2691,7 +2700,7 @@
2691
2700
  }
2692
2701
 
2693
2702
  @layer components.root {
2694
- :where(progress) {
2703
+ :where(.ui-progress) {
2695
2704
  --_accent-color: var(--primary);
2696
2705
  --_bg-color: var(--surface-tonal);
2697
2706
 
@@ -2707,15 +2716,15 @@
2707
2716
  vertical-align: baseline;
2708
2717
 
2709
2718
  /* Color */
2710
- &.filled {
2719
+ &.ui-filled {
2711
2720
  --_bg-color: var(--surface-filled);
2712
2721
  }
2713
2722
 
2714
- &.default {
2723
+ &.ui-default {
2715
2724
  --_bg-color: var(--surface-default);
2716
2725
  }
2717
2726
 
2718
- &.tonal {
2727
+ &.ui-tonal {
2719
2728
  --_bg-color: var(--surface-tonal);
2720
2729
  }
2721
2730
 
@@ -2812,7 +2821,7 @@
2812
2821
  vertical-align: -0.14em;
2813
2822
  }
2814
2823
 
2815
- &:not(button.button):not(:empty) {
2824
+ &:not(button.ui-button):not(:empty) {
2816
2825
  &::before {
2817
2826
  margin-inline-end: 0.5em;
2818
2827
  }
@@ -2827,7 +2836,7 @@
2827
2836
  }
2828
2837
 
2829
2838
  @layer components.root {
2830
- label.checkbox {
2839
+ label.ui-checkbox {
2831
2840
  --_input-size: var(--size-4);
2832
2841
 
2833
2842
  align-items: center;
@@ -2855,7 +2864,7 @@
2855
2864
 
2856
2865
  /* Required dot */
2857
2866
  &:has(:invalid) {
2858
- .label:after {
2867
+ .ui-label:after {
2859
2868
  color: var(--red);
2860
2869
  content: "*";
2861
2870
  inset: 0 -0.25ex auto auto;
@@ -2864,7 +2873,7 @@
2864
2873
  }
2865
2874
 
2866
2875
  /* Label */
2867
- .label {
2876
+ .ui-label {
2868
2877
  color: var(--text-primary);
2869
2878
  font-size: var(--font-size-05);
2870
2879
  grid-column: 2;
@@ -2874,7 +2883,7 @@
2874
2883
  }
2875
2884
 
2876
2885
  /* End text */
2877
- :where(.end-text) {
2886
+ :where(.ui-end-text) {
2878
2887
  color: var(--text-muted);
2879
2888
  font-size: var(--font-size-0);
2880
2889
  grid-column: 2;
@@ -2884,14 +2893,14 @@
2884
2893
  }
2885
2894
 
2886
2895
  /* Spread layout */
2887
- &.spread {
2896
+ &.ui-spread {
2888
2897
  align-items: center;
2889
2898
  column-gap: var(--size-4);
2890
2899
  grid-auto-flow: unset;
2891
2900
  grid-template-columns: 1fr auto;
2892
2901
  inline-size: 100%;
2893
2902
 
2894
- .label {
2903
+ .ui-label {
2895
2904
  font-weight: 600;
2896
2905
  grid-column: 1;
2897
2906
  grid-row: 1;
@@ -2903,18 +2912,18 @@
2903
2912
  grid-row: 1;
2904
2913
  }
2905
2914
 
2906
- :where(.end-text) {
2915
+ :where(.ui-end-text) {
2907
2916
  grid-column: 1;
2908
2917
  grid-row: 2;
2909
2918
  }
2910
2919
  }
2911
2920
 
2912
2921
  /* Stacked layout */
2913
- &.stack {
2922
+ &.ui-stack {
2914
2923
  justify-items: center;
2915
2924
  grid-auto-columns: unset;
2916
2925
 
2917
- .label {
2926
+ .ui-label {
2918
2927
  grid-column: 1/-1;
2919
2928
  grid-row: 2;
2920
2929
  margin-block-start: var(--size-1);
@@ -2926,7 +2935,7 @@
2926
2935
  }
2927
2936
  }
2928
2937
 
2929
- .end-text {
2938
+ .ui-end-text {
2930
2939
  grid-column: 1/-1;
2931
2940
  grid-row: 3;
2932
2941
  }
@@ -2985,13 +2994,13 @@
2985
2994
  }
2986
2995
 
2987
2996
  /* Sizes */
2988
- &.small {
2997
+ &.ui-small {
2989
2998
  input[type="checkbox"] {
2990
2999
  --_input-size: var(--size-3);
2991
3000
  }
2992
3001
  }
2993
3002
 
2994
- &.large {
3003
+ &.ui-large {
2995
3004
  input[type="checkbox"] {
2996
3005
  --_input-size: var(--size-5);
2997
3006
  }
@@ -3002,7 +3011,7 @@
3002
3011
  &:has(:user-invalid) {
3003
3012
  --palette-source: oklch(0.58 0.21 var(--hue-red));
3004
3013
 
3005
- :where(.end-text) {
3014
+ :where(.ui-end-text) {
3006
3015
  color: var(--primary);
3007
3016
  }
3008
3017
  }
@@ -3033,7 +3042,7 @@
3033
3042
  }
3034
3043
 
3035
3044
  @layer components.root {
3036
- label.radio {
3045
+ label.ui-radio {
3037
3046
  --_input-size: 1.125rem;
3038
3047
  --_indicator-size: 50%;
3039
3048
 
@@ -3062,7 +3071,7 @@
3062
3071
 
3063
3072
  /* Required dot */
3064
3073
  &:has(:invalid) {
3065
- .label:after {
3074
+ .ui-label:after {
3066
3075
  color: var(--red);
3067
3076
  content: "*";
3068
3077
  inset: 0 -0.25ex auto auto;
@@ -3071,7 +3080,7 @@
3071
3080
  }
3072
3081
 
3073
3082
  /* Label */
3074
- .label {
3083
+ .ui-label {
3075
3084
  color: var(--text-primary);
3076
3085
  font-size: var(--font-size-05);
3077
3086
  grid-column: 2;
@@ -3081,7 +3090,7 @@
3081
3090
  }
3082
3091
 
3083
3092
  /* End text */
3084
- :where(.end-text) {
3093
+ :where(.ui-end-text) {
3085
3094
  color: var(--text-muted);
3086
3095
  font-size: var(--font-size-0);
3087
3096
  grid-column: 2;
@@ -3091,11 +3100,11 @@
3091
3100
  }
3092
3101
 
3093
3102
  /* Stacked layout */
3094
- &.stack {
3103
+ &.ui-stack {
3095
3104
  grid-auto-columns: unset;
3096
3105
  justify-items: center;
3097
3106
 
3098
- .label {
3107
+ .ui-label {
3099
3108
  grid-column: 1/-1;
3100
3109
  grid-row: 2;
3101
3110
  margin-block-start: var(--size-1);
@@ -3107,7 +3116,7 @@
3107
3116
  }
3108
3117
  }
3109
3118
 
3110
- .end-text {
3119
+ .ui-end-text {
3111
3120
  grid-column: 1/-1;
3112
3121
  grid-row: 3;
3113
3122
  }
@@ -3156,14 +3165,14 @@
3156
3165
  }
3157
3166
 
3158
3167
  /* Sizes */
3159
- &.small {
3168
+ &.ui-small {
3160
3169
  input[type="radio"] {
3161
3170
  --_input-size: var(--size-3);
3162
3171
 
3163
3172
  }
3164
3173
  }
3165
3174
 
3166
- &.large {
3175
+ &.ui-large {
3167
3176
  input[type="radio"] {
3168
3177
  --_input-size: var(--size-4);
3169
3178
 
@@ -3175,7 +3184,7 @@
3175
3184
  &:has(:user-invalid) {
3176
3185
  --palette-source: oklch(0.58 0.21 var(--hue-red));
3177
3186
 
3178
- :where(.end-text) {
3187
+ :where(.ui-end-text) {
3179
3188
  color: var(--primary);
3180
3189
  }
3181
3190
  }
@@ -3206,7 +3215,7 @@
3206
3215
  }
3207
3216
 
3208
3217
  @layer components.root {
3209
- :where(.range) {
3218
+ :where(.ui-range) {
3210
3219
  display: grid;
3211
3220
  gap: var(--size-1) 0;
3212
3221
  /* Two-column base so the optional .value cell can sit next to the
@@ -3215,7 +3224,7 @@
3215
3224
  grid-template-columns: 1fr auto;
3216
3225
  position: relative;
3217
3226
 
3218
- .label {
3227
+ .ui-label {
3219
3228
  color: var(--text-primary);
3220
3229
  font-size: var(--font-size-05);
3221
3230
  font-weight: 600;
@@ -3225,7 +3234,7 @@
3225
3234
 
3226
3235
  /* Live current-value readout. Pairs with the <output> element
3227
3236
  rendered by the Range component (or hand-written .value markup). */
3228
- :where(.value) {
3237
+ :where(.ui-value) {
3229
3238
  color: var(--text-muted);
3230
3239
  font-size: var(--font-size-0);
3231
3240
  font-variant-numeric: tabular-nums;
@@ -3236,7 +3245,7 @@
3236
3245
  text-align: end;
3237
3246
  }
3238
3247
 
3239
- .start-text {
3248
+ .ui-start-text {
3240
3249
  color: var(--text-muted);
3241
3250
  font-size: var(--font-size-0);
3242
3251
  grid-column: 1/-1;
@@ -3244,7 +3253,7 @@
3244
3253
  line-height: 1.5;
3245
3254
  }
3246
3255
 
3247
- :where(.end-text) {
3256
+ :where(.ui-end-text) {
3248
3257
  color: var(--text-muted);
3249
3258
  font-size: var(--font-size-0);
3250
3259
  grid-column: 1/-1;
@@ -3278,40 +3287,40 @@
3278
3287
  opacity: 0.64;
3279
3288
  user-select: none;
3280
3289
 
3281
- .label,
3282
- .value,
3283
- .start-text,
3284
- .end-text {
3290
+ .ui-label,
3291
+ .ui-value,
3292
+ .ui-start-text,
3293
+ .ui-end-text {
3285
3294
  cursor: not-allowed;
3286
3295
  }
3287
3296
  }
3288
3297
 
3289
3298
  /* Color */
3290
- &.filled input[type="range"] {
3299
+ &.ui-filled input[type="range"] {
3291
3300
  --_track-color: var(--surface-filled);
3292
3301
  }
3293
3302
 
3294
- &.default input[type="range"] {
3303
+ &.ui-default input[type="range"] {
3295
3304
  --_track-color: var(--surface-default);
3296
3305
  }
3297
3306
 
3298
- &.tonal input[type="range"] {
3307
+ &.ui-tonal input[type="range"] {
3299
3308
  --_track-color: var(--surface-tonal);
3300
3309
  }
3301
3310
 
3302
3311
  /* Orientation */
3303
- &.spread {
3312
+ &.ui-spread {
3304
3313
  align-items: center;
3305
3314
  column-gap: var(--size-4);
3306
3315
  container-type: inline-size;
3307
3316
  grid-template-columns: 1fr auto;
3308
3317
 
3309
- .label {
3318
+ .ui-label {
3310
3319
  grid-column: 1;
3311
3320
  grid-row: 1;
3312
3321
  }
3313
3322
 
3314
- .start-text {
3323
+ .ui-start-text {
3315
3324
  color: var(--text-muted);
3316
3325
  display: block;
3317
3326
  font-size: var(--font-size-0);
@@ -3330,12 +3339,12 @@
3330
3339
  /* In spread mode, the value sits below the slider in col 2
3331
3340
  (where end-text would normally land). When end-text is also
3332
3341
  present it shifts down a row to avoid collision. */
3333
- :where(.value) {
3342
+ :where(.ui-value) {
3334
3343
  grid-column: 2;
3335
3344
  grid-row: 2;
3336
3345
  }
3337
3346
 
3338
- :where(.end-text) {
3347
+ :where(.ui-end-text) {
3339
3348
  grid-column: 2;
3340
3349
  grid-row: 2;
3341
3350
  text-align: end;
@@ -3348,15 +3357,15 @@
3348
3357
 
3349
3358
  /* When both datalist and end-text exist, push end-text below the datalist
3350
3359
  so they don't collide on the same grid cell. */
3351
- &:has(datalist) :where(.end-text) {
3360
+ &:has(datalist) :where(.ui-end-text) {
3352
3361
  grid-row: 3;
3353
3362
  }
3354
3363
 
3355
- &:has(.value) :where(.end-text) {
3364
+ &:has(.ui-value) :where(.ui-end-text) {
3356
3365
  grid-row: 3;
3357
3366
  }
3358
3367
 
3359
- &:has(.value):has(datalist) :where(.end-text) {
3368
+ &:has(.ui-value):has(datalist) :where(.ui-end-text) {
3360
3369
  grid-row: 4;
3361
3370
  }
3362
3371
 
@@ -3367,20 +3376,20 @@
3367
3376
  grid-column: 1/-1;
3368
3377
  }
3369
3378
 
3370
- .label {
3379
+ .ui-label {
3371
3380
  grid-row: 1;
3372
3381
  }
3373
3382
 
3374
3383
  /* Share row 1 with the label: the label's text stays left-aligned
3375
3384
  in its full-width cell, while the value shrinks to fit and
3376
3385
  right-aligns. Visually reads as a "[name ........ value]" row. */
3377
- :where(.value) {
3386
+ :where(.ui-value) {
3378
3387
  grid-row: 1;
3379
3388
  justify-self: end;
3380
3389
  text-align: end;
3381
3390
  }
3382
3391
 
3383
- .start-text {
3392
+ .ui-start-text {
3384
3393
  grid-row: 2;
3385
3394
  }
3386
3395
 
@@ -3394,7 +3403,7 @@
3394
3403
  grid-row: 4;
3395
3404
  }
3396
3405
 
3397
- :where(.end-text) {
3406
+ :where(.ui-end-text) {
3398
3407
  grid-row: 5;
3399
3408
  text-align: start;
3400
3409
  }
@@ -3407,9 +3416,9 @@
3407
3416
  --_thumb-bg: var(--color-9);
3408
3417
  --_thumb-highlight-color: oklch(from var(--color-9) 70% 100% h / 20%);
3409
3418
 
3410
- .start-text,
3411
- .end-text,
3412
- .value {
3419
+ .ui-start-text,
3420
+ .ui-end-text,
3421
+ .ui-value {
3413
3422
  color: var(--color-9);
3414
3423
  }
3415
3424
  }
@@ -3481,7 +3490,7 @@
3481
3490
  transition: box-shadow 0.1s ease;
3482
3491
  }
3483
3492
 
3484
- .fieldset-item:focus-within & {
3493
+ .ui-fieldset-item:focus-within & {
3485
3494
  border-color: var(--gray-14);
3486
3495
  }
3487
3496
  }
@@ -3501,14 +3510,14 @@
3501
3510
  transition: box-shadow 0.1s ease;
3502
3511
  }
3503
3512
 
3504
- .fieldset-item:focus-within & {
3513
+ .ui-fieldset-item:focus-within & {
3505
3514
  border-color: var(--gray-14);
3506
3515
  }
3507
3516
  }
3508
3517
 
3509
3518
  /* Element state */
3510
- .range:has(:user-invalid) &,
3511
- .range[data-invalid] & {
3519
+ .ui-range:has(:user-invalid) &,
3520
+ .ui-range[data-invalid] & {
3512
3521
  --_track-fill-color: var(--color-9);
3513
3522
  }
3514
3523
 
@@ -3544,7 +3553,7 @@
3544
3553
  }
3545
3554
 
3546
3555
  @layer components.root {
3547
- :where(.switch) {
3556
+ :where(.ui-switch) {
3548
3557
  --_accent-color: var(--primary);
3549
3558
  --_accent-contrast: var(--primary-contrast);
3550
3559
 
@@ -3653,28 +3662,28 @@
3653
3662
  }
3654
3663
 
3655
3664
  /* Icons */
3656
- &:has(.icon-checked, .icon-unchecked) {
3665
+ &:has(.ui-icon-checked, .ui-icon-unchecked) {
3657
3666
  [role="switch"] {
3658
3667
  grid-column: 1 / -1;
3659
3668
  grid-row: 1;
3660
3669
  }
3661
3670
 
3662
3671
  &:has([role="switch"]:checked) {
3663
- .icon-unchecked {
3672
+ .ui-icon-unchecked {
3664
3673
  display: none;
3665
3674
  }
3666
3675
 
3667
- .icon-checked {
3676
+ .ui-icon-checked {
3668
3677
  display: block;
3669
3678
  }
3670
3679
  }
3671
3680
 
3672
- .icon-checked {
3681
+ .ui-icon-checked {
3673
3682
  display: none;
3674
3683
  }
3675
3684
 
3676
- .icon-unchecked,
3677
- .icon-checked {
3685
+ .ui-icon-unchecked,
3686
+ .ui-icon-checked {
3678
3687
  grid-column: 1;
3679
3688
  grid-row: 1;
3680
3689
  pointer-events: none;
@@ -3686,18 +3695,18 @@
3686
3695
  }
3687
3696
  }
3688
3697
 
3689
- .icon-unchecked {
3698
+ .ui-icon-unchecked {
3690
3699
  margin-inline-start: calc(var(--_track-width) - var(--_dot-size) - var(--size-1));
3691
3700
  }
3692
3701
 
3693
- .icon-checked {
3702
+ .ui-icon-checked {
3694
3703
  margin-inline-start: var(--size-1);
3695
3704
  }
3696
3705
  }
3697
3706
 
3698
3707
  /* Required dot */
3699
3708
  &:has(:invalid) {
3700
- .label:after {
3709
+ .ui-label:after {
3701
3710
  color: var(--red);
3702
3711
  content: "*";
3703
3712
  inset: 0 -0.25ex auto auto;
@@ -3717,7 +3726,7 @@
3717
3726
  }
3718
3727
 
3719
3728
  /* Label */
3720
- .label {
3729
+ .ui-label {
3721
3730
  color: var(--text-primary);
3722
3731
  font-size: var(--font-size-05);
3723
3732
  grid-column: 2;
@@ -3729,7 +3738,7 @@
3729
3738
  }
3730
3739
 
3731
3740
  /* End text */
3732
- :where(.end-text) {
3741
+ :where(.ui-end-text) {
3733
3742
  color: var(--text-muted);
3734
3743
  font-size: var(--font-size-0);
3735
3744
  grid-column: 2;
@@ -3739,21 +3748,21 @@
3739
3748
  }
3740
3749
 
3741
3750
  /* Size */
3742
- &.small {
3751
+ &.ui-small {
3743
3752
  --_dot-size: 0.75rem;
3744
3753
  --_track-height: var(--size-4);
3745
3754
  --_track-width: 2.5rem;
3746
3755
  }
3747
3756
 
3748
3757
  /* Spread layout */
3749
- &.spread {
3758
+ &.ui-spread {
3750
3759
  align-items: center;
3751
3760
  column-gap: var(--size-4);
3752
3761
  grid-auto-flow: unset;
3753
3762
  grid-template-columns: 1fr auto;
3754
3763
  inline-size: 100%;
3755
3764
 
3756
- .label {
3765
+ .ui-label {
3757
3766
  font-weight: 600;
3758
3767
  grid-column: 1;
3759
3768
  grid-row: 1;
@@ -3765,34 +3774,34 @@
3765
3774
  grid-row: 1;
3766
3775
  }
3767
3776
 
3768
- &:has(.icon-checked, .icon-unchecked) {
3777
+ &:has(.ui-icon-checked, .ui-icon-unchecked) {
3769
3778
 
3770
3779
  input[role="switch"],
3771
- .icon-checked,
3772
- .icon-unchecked {
3780
+ .ui-icon-checked,
3781
+ .ui-icon-unchecked {
3773
3782
  grid-column: 2;
3774
3783
  }
3775
3784
  }
3776
3785
 
3777
- :where(.end-text) {
3786
+ :where(.ui-end-text) {
3778
3787
  grid-column: 1;
3779
3788
  grid-row: 2;
3780
3789
  }
3781
3790
  }
3782
3791
 
3783
3792
  /* Stacked layout */
3784
- &.stack {
3793
+ &.ui-stack {
3785
3794
  grid-auto-columns: unset;
3786
3795
  justify-items: center;
3787
3796
 
3788
- .label {
3797
+ .ui-label {
3789
3798
  grid-column: 1/-1;
3790
3799
  grid-row: 2;
3791
3800
  margin-block-start: var(--size-1);
3792
3801
  padding-inline: 1ex;
3793
3802
  }
3794
3803
 
3795
- .end-text {
3804
+ .ui-end-text {
3796
3805
  grid-column: 1/-1;
3797
3806
  grid-row: 3;
3798
3807
  }
@@ -3805,7 +3814,7 @@
3805
3814
  outline: 2px solid var(--color-9);
3806
3815
  }
3807
3816
 
3808
- .end-text {
3817
+ .ui-end-text {
3809
3818
  color: var(--color-9);
3810
3819
  }
3811
3820
  }
@@ -3843,7 +3852,7 @@
3843
3852
  /* > .toast:nth-last-child(n + 6) { display: none; } */
3844
3853
  }
3845
3854
 
3846
- :where(.toast) {
3855
+ :where(.ui-toast) {
3847
3856
  --_anim-enter: 0.3s;
3848
3857
  --_anim-exit: 0.3s;
3849
3858
 
@@ -3871,11 +3880,11 @@
3871
3880
  animation-play-state: paused;
3872
3881
  }
3873
3882
 
3874
- &.exiting {
3883
+ &.ui-exiting {
3875
3884
  animation: toast-exit var(--_anim-exit) var(--ease-in-3) forwards;
3876
3885
  }
3877
3886
 
3878
- .icon {
3887
+ .ui-icon {
3879
3888
  background: no-repeat center / contain;
3880
3889
  block-size: var(--size-4);
3881
3890
  flex-shrink: 0;
@@ -3883,25 +3892,25 @@
3883
3892
  }
3884
3893
 
3885
3894
  /* Hide the icon slot when there's no severity to render against. */
3886
- &:not([data-severity]) .icon {
3895
+ &:not([data-severity]) .ui-icon {
3887
3896
  display: none;
3888
3897
  }
3889
3898
 
3890
- .content {
3899
+ .ui-content {
3891
3900
  font-size: var(--font-size-05);
3892
3901
  word-break: break-word;
3893
3902
  }
3894
3903
 
3895
- .title {
3904
+ .ui-title {
3896
3905
  font-weight: 600;
3897
3906
  }
3898
3907
 
3899
- .description {
3908
+ .ui-description {
3900
3909
  color: oklch(from currentColor l c h / 75%);
3901
3910
  font-size: var(--font-size-0);
3902
3911
  }
3903
3912
 
3904
- .close-button {
3913
+ .ui-close-button {
3905
3914
  background: none;
3906
3915
  border: none;
3907
3916
  color: inherit;
@@ -3918,19 +3927,19 @@
3918
3927
  }
3919
3928
 
3920
3929
  /* Severity icons via CSS data URIs — keeps icon assets out of JS strings. */
3921
- &[data-severity="success"] .icon {
3930
+ &[data-severity="success"] .ui-icon {
3922
3931
  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>");
3923
3932
  }
3924
3933
 
3925
- &[data-severity="info"] .icon {
3934
+ &[data-severity="info"] .ui-icon {
3926
3935
  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>");
3927
3936
  }
3928
3937
 
3929
- &[data-severity="warning"] .icon {
3938
+ &[data-severity="warning"] .ui-icon {
3930
3939
  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>");
3931
3940
  }
3932
3941
 
3933
- &[data-severity="critical"] .icon {
3942
+ &[data-severity="critical"] .ui-icon {
3934
3943
  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>");
3935
3944
  }
3936
3945
  }
@@ -3976,60 +3985,60 @@
3976
3985
 
3977
3986
  @layer components.root {
3978
3987
 
3979
- :where(.p) {
3988
+ :where(.ui-p) {
3980
3989
  text-wrap: pretty;
3981
3990
 
3982
- &.small {
3991
+ &.ui-small {
3983
3992
  font-size: var(--font-size-1);
3984
3993
  }
3985
3994
 
3986
- &.large {
3995
+ &.ui-large {
3987
3996
  font-size: var(--font-size-3);
3988
3997
  }
3989
3998
  }
3990
3999
 
3991
- :where(.h1, .h2, .h3, .h4, .h5, .h6) {
4000
+ :where(.ui-h1, .ui-h2, .ui-h3, .ui-h4, .ui-h5, .ui-h6) {
3992
4001
  color: var(--text-primary);
3993
4002
  font-weight: 700;
3994
4003
  text-wrap: pretty;
3995
4004
  }
3996
4005
 
3997
- :where(.h1) {
4006
+ :where(.ui-h1) {
3998
4007
  font-size: var(--font-size-h1, var(--font-size-7));
3999
4008
  letter-spacing: -0.02em;
4000
4009
  line-height: 1.15;
4001
4010
  }
4002
4011
 
4003
- :where(.h2) {
4012
+ :where(.ui-h2) {
4004
4013
  font-size: var(--font-size-h2, var(--font-size-5, 2rem));
4005
4014
  letter-spacing: -0.02em;
4006
4015
  line-height: 1.2;
4007
4016
  }
4008
4017
 
4009
- :where(.h3) {
4018
+ :where(.ui-h3) {
4010
4019
  font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
4011
4020
  letter-spacing: -0.01em;
4012
4021
  line-height: 1.167;
4013
4022
  }
4014
4023
 
4015
- :where(.h4) {
4024
+ :where(.ui-h4) {
4016
4025
  font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
4017
4026
  letter-spacing: -0.01em;
4018
4027
  line-height: 1.235;
4019
4028
  }
4020
4029
 
4021
- :where(.h5) {
4030
+ :where(.ui-h5) {
4022
4031
  font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
4023
4032
  line-height: 1.334;
4024
4033
  }
4025
4034
 
4026
- :where(.h6) {
4035
+ :where(.ui-h6) {
4027
4036
  font-size: var(--font-size-h6, var(--font-size-1, 1rem));
4028
4037
  line-height: 1;
4029
4038
  }
4030
4039
 
4031
4040
  /** Overline */
4032
- :where(.overline) {
4041
+ :where(.ui-overline) {
4033
4042
  color: light-dark(oklch(from var(--text-muted) calc(l * 1.25) c h),
4034
4043
  oklch(from var(--text-muted) calc(l * 0.75) c h));
4035
4044
  font-size: var(--font-size-0);
@@ -4038,7 +4047,7 @@
4038
4047
  text-transform: uppercase;
4039
4048
  }
4040
4049
 
4041
- :where(.hgroup) {
4050
+ :where(.ui-hgroup) {
4042
4051
  &>p {
4043
4052
  margin: 0;
4044
4053
  }
@@ -4070,7 +4079,7 @@
4070
4079
  }
4071
4080
 
4072
4081
  /** Caption */
4073
- :where(.caption) {
4082
+ :where(.ui-caption) {
4074
4083
  color: var(--text-muted);
4075
4084
  font-size: var(--font-size-0);
4076
4085
  line-height: 1.6;
@@ -4079,7 +4088,7 @@
4079
4088
 
4080
4089
 
4081
4090
  /* Inline text elements — class utilities (work anywhere) */
4082
- :where(.u, .abbr, .dfn) {
4091
+ :where(.ui-u, .ui-abbr, .ui-dfn) {
4083
4092
  text-decoration: underline;
4084
4093
  text-underline-offset: 1px;
4085
4094
 
@@ -4088,7 +4097,7 @@
4088
4097
  }
4089
4098
  }
4090
4099
 
4091
- :where(.abbr, .dfn) {
4100
+ :where(.ui-abbr, .ui-dfn) {
4092
4101
  font-style: normal;
4093
4102
  text-decoration: var(--color-9) underline dotted;
4094
4103
 
@@ -4102,21 +4111,21 @@
4102
4111
  }
4103
4112
  }
4104
4113
 
4105
- :where(.sup) {
4114
+ :where(.ui-sup) {
4106
4115
  font-size: 0.5em;
4107
4116
  vertical-align: super;
4108
4117
  }
4109
4118
 
4110
- :where(p, span).small {
4119
+ :where(p, span).ui-small {
4111
4120
  font-size: max(0.5em, var(--font-size-0, 0.75rem));
4112
4121
  }
4113
4122
 
4114
- :where(.cite) {
4123
+ :where(.ui-cite) {
4115
4124
  font-style: italic;
4116
4125
  }
4117
4126
 
4118
4127
  /* Code */
4119
- :where(.kbd) {
4128
+ :where(.ui-kbd) {
4120
4129
  font-family: var(--font-mono);
4121
4130
  background-color: var(--text-muted);
4122
4131
  border-color: var(--text-muted);
@@ -4127,34 +4136,34 @@
4127
4136
  word-break: break-word;
4128
4137
  }
4129
4138
 
4130
- :where(.mark) {
4139
+ :where(.ui-mark) {
4131
4140
  border-radius: var(--radius-2);
4132
4141
  box-decoration-break: clone;
4133
4142
  padding: .1ex .3ex;
4134
4143
  vertical-align: baseline;
4135
4144
  }
4136
4145
 
4137
- :where(.s) {
4146
+ :where(.ui-s) {
4138
4147
  text-decoration: line-through;
4139
4148
  }
4140
4149
 
4141
- :where(.sub) {
4150
+ :where(.ui-sub) {
4142
4151
  font-size: 0.75em;
4143
4152
  vertical-align: sub;
4144
4153
  }
4145
4154
 
4146
- :where(.del) {
4155
+ :where(.ui-del) {
4147
4156
  color: var(--color-9);
4148
4157
  text-decoration: line-through;
4149
4158
  }
4150
4159
 
4151
- :where(.ins) {
4160
+ :where(.ui-ins) {
4152
4161
  color: var(--color-9);
4153
4162
  text-decoration: underline;
4154
4163
  text-underline-offset: 1px;
4155
4164
  }
4156
4165
 
4157
- :where(.var) {
4166
+ :where(.ui-var) {
4158
4167
  font-family: var(--font-mono);
4159
4168
  background-color: var(--text-muted);
4160
4169
  border-color: var(--text-muted);
@@ -4165,12 +4174,12 @@
4165
4174
  word-break: break-word;
4166
4175
  }
4167
4176
 
4168
- :where(.samp) {
4177
+ :where(.ui-samp) {
4169
4178
  font-family: var(--font-mono);
4170
4179
  }
4171
4180
 
4172
4181
  /* Blockquote */
4173
- :where(.blockquote) {
4182
+ :where(.ui-blockquote) {
4174
4183
  border-inline-start: var(--border-size-3) solid currentColor;
4175
4184
  padding-block: var(--size-3);
4176
4185
  padding-inline: var(--size-4);
@@ -4190,7 +4199,7 @@
4190
4199
  }
4191
4200
 
4192
4201
  /* Code block */
4193
- :where(pre.code-block) {
4202
+ :where(pre.ui-code-block) {
4194
4203
  background-color: var(--color-15);
4195
4204
  border-radius: var(--border-radius);
4196
4205
  color: var(--color-1);
@@ -4219,7 +4228,7 @@
4219
4228
  /* Rich text */
4220
4229
 
4221
4230
  @layer components.extended {
4222
- @scope (.rich-text) to (.not-rich-text) {
4231
+ @scope (.ui-rich-text) to (.ui-not-rich-text) {
4223
4232
  a {
4224
4233
  color: var(--primary);
4225
4234
  cursor: pointer;
@@ -4352,7 +4361,7 @@
4352
4361
  }
4353
4362
 
4354
4363
  /** Overline */
4355
- :is(.overline, hgroup p:first-of-type:first-child) {
4364
+ :is(.ui-overline, hgroup p:first-of-type:first-child) {
4356
4365
  color: light-dark(oklch(from var(--text-muted) calc(l * 1.25) c h),
4357
4366
  oklch(from var(--text-muted) calc(l * 0.75) c h));
4358
4367
  font-size: var(--font-size-0);
@@ -4564,7 +4573,7 @@
4564
4573
  /*** Extended components (has dependencies) */
4565
4574
 
4566
4575
  @layer components.extended {
4567
- :where(.badge) {
4576
+ :where(.ui-badge) {
4568
4577
  --_anchor-tx: -50%;
4569
4578
  --_anchor-ty: 50%;
4570
4579
  --_badge-inset: auto auto 100% 100%;
@@ -4580,14 +4589,14 @@
4580
4589
 
4581
4590
  /* Floating wrapper: traditional inset-based positioning so this works
4582
4591
  in browsers without position-area support (Firefox, older Safari). */
4583
- &>.anchor-floating:not([popover]) {
4592
+ &>.ui-anchor-floating:not([popover]) {
4584
4593
  inset: var(--_badge-inset);
4585
4594
  position-anchor: auto;
4586
4595
  position-area: none;
4587
4596
  }
4588
4597
 
4589
4598
  /* Indicator */
4590
- &>.anchor-floating>.badge-indicator {
4599
+ &>.ui-anchor-floating>.ui-badge-indicator {
4591
4600
  background-color: var(--_bg-color);
4592
4601
  block-size: var(--_size);
4593
4602
  border: 2px solid var(--_border-color);
@@ -4606,57 +4615,57 @@
4606
4615
  }
4607
4616
 
4608
4617
  /* Colors */
4609
- &.critical {
4618
+ &.ui-critical {
4610
4619
  --_bg-color: var(--critical);
4611
4620
  --_border-color: var(--critical);
4612
4621
  }
4613
4622
 
4614
- &.success {
4623
+ &.ui-success {
4615
4624
  --_bg-color: var(--success);
4616
4625
  --_border-color: var(--success);
4617
4626
  }
4618
4627
 
4619
- &.info {
4628
+ &.ui-info {
4620
4629
  --_bg-color: var(--info);
4621
4630
  --_border-color: var(--info);
4622
4631
  }
4623
4632
 
4624
- &.warning {
4633
+ &.ui-warning {
4625
4634
  --_bg-color: var(--warning);
4626
4635
  --_border-color: var(--warning);
4627
4636
  }
4628
4637
 
4629
- &.neutral {
4638
+ &.ui-neutral {
4630
4639
  --_bg-color: var(--neutral);
4631
4640
  --_border-color: var(--neutral);
4632
4641
  }
4633
4642
 
4634
4643
  /* Alignment */
4635
- &.start-start {
4644
+ &.ui-start-start {
4636
4645
  --_anchor-tx: 50%;
4637
4646
  --_anchor-ty: 50%;
4638
4647
  --_badge-inset: auto 100% 100% auto;
4639
4648
  }
4640
4649
 
4641
- &.end-start {
4650
+ &.ui-end-start {
4642
4651
  --_anchor-tx: 50%;
4643
4652
  --_anchor-ty: -50%;
4644
4653
  --_badge-inset: 100% 100% auto auto;
4645
4654
  }
4646
4655
 
4647
- &.end-end {
4656
+ &.ui-end-end {
4648
4657
  --_anchor-tx: -50%;
4649
4658
  --_anchor-ty: -50%;
4650
4659
  --_badge-inset: 100% auto auto 100%;
4651
4660
  }
4652
4661
 
4653
4662
  /* Dot */
4654
- &.dot {
4663
+ &.ui-dot {
4655
4664
  --_anchor-tx: calc((var(--_dot-size) - 2px) * -1);
4656
4665
  --_anchor-ty: var(--_dot-size);
4657
4666
  }
4658
4667
 
4659
- &.dot>.anchor-floating>.badge-indicator {
4668
+ &.ui-dot>.ui-anchor-floating>.ui-badge-indicator {
4660
4669
  block-size: var(--_dot-size);
4661
4670
  inline-size: var(--_dot-size);
4662
4671
  min-inline-size: var(--_dot-size);
@@ -4664,7 +4673,7 @@
4664
4673
  }
4665
4674
 
4666
4675
  /* Visibility */
4667
- &.invisible>.anchor-floating>.badge-indicator {
4676
+ &.ui-invisible>.ui-anchor-floating>.ui-badge-indicator {
4668
4677
  opacity: 0;
4669
4678
  pointer-events: none;
4670
4679
  }
@@ -4672,7 +4681,7 @@
4672
4681
  }
4673
4682
 
4674
4683
  @layer components.extended {
4675
- :where([role="group"].button-group) {
4684
+ :where([role="group"].ui-button-group) {
4676
4685
  --_border-radius: var(--button-border-radius);
4677
4686
 
4678
4687
  border-radius: var(--_border-radius);
@@ -4687,11 +4696,11 @@
4687
4696
  --_divider-color: light-dark(oklch(from var(--_accent-tonal) calc(l - 0.1) c h),
4688
4697
  oklch(from var(--_accent-tonal) calc(l + 0.1) c h));
4689
4698
 
4690
- &.outlined {
4699
+ &.ui-outlined {
4691
4700
  --_divider-color: var(--_border-color);
4692
4701
  }
4693
4702
 
4694
- &.filled {
4703
+ &.ui-filled {
4695
4704
  --_divider-color: currentColor;
4696
4705
  }
4697
4706
 
@@ -4702,8 +4711,8 @@
4702
4711
  /* Color inheritance from Button Group — shared interaction model.
4703
4712
  The .critical scope class in theme.css redirects --palette-source so
4704
4713
  --color-6 below becomes a tint of the active color. */
4705
- :where(.button-group.critical,
4706
- .button-group.primary) & {
4714
+ :where(.ui-button-group.ui-critical,
4715
+ .ui-button-group.ui-primary) & {
4707
4716
  --_color-contrast: var(--gray-1);
4708
4717
  --_color-tonal: var(--color-6);
4709
4718
  --_accent-tonal-contrast: var(--text-primary-contrast);
@@ -4714,26 +4723,26 @@
4714
4723
  --_outlined-active-bg-color: oklch(from var(--_accent) calc(l - 0.1) c h);
4715
4724
  }
4716
4725
 
4717
- :where(.button-group.critical) & {
4726
+ :where(.ui-button-group.ui-critical) & {
4718
4727
  --_color: var(--critical);
4719
4728
  }
4720
4729
 
4721
- :where(.button-group.primary) & {
4730
+ :where(.ui-button-group.ui-primary) & {
4722
4731
  --_color: var(--primary);
4723
4732
  }
4724
4733
 
4725
- :where(.button-group.small) & {
4734
+ :where(.ui-button-group.ui-small) & {
4726
4735
  --_min-height: 1.875rem;
4727
4736
  padding-block: 0;
4728
4737
  padding-inline: 1ex;
4729
4738
  }
4730
4739
 
4731
- :where(.button-group.large) & {
4740
+ :where(.ui-button-group.ui-large) & {
4732
4741
  --_min-height: 2.875rem;
4733
4742
  padding-inline: 4ex;
4734
4743
  }
4735
4744
 
4736
- :where(.button-group.outlined) & {
4745
+ :where(.ui-button-group.ui-outlined) & {
4737
4746
  --_border-color: var(--_accent);
4738
4747
  --_divider-color: var(--_accent);
4739
4748
 
@@ -4752,7 +4761,7 @@
4752
4761
  }
4753
4762
  }
4754
4763
 
4755
- :where(.button-group.tonal) & {
4764
+ :where(.ui-button-group.ui-tonal) & {
4756
4765
  --_bg-color: var(--_accent-tonal);
4757
4766
  --_text-color: var(--_accent-tonal-contrast);
4758
4767
 
@@ -4769,13 +4778,13 @@
4769
4778
  }
4770
4779
  }
4771
4780
 
4772
- :where(.button-group.filled) & {
4781
+ :where(.ui-button-group.ui-filled) & {
4773
4782
  --_bg-color: var(--_accent);
4774
4783
  --_text-color: var(--_accent-contrast);
4775
4784
  --_divider-color: currentColor;
4776
4785
 
4777
- :where(.button-group.critical,
4778
- .button-group.primary) & {
4786
+ :where(.ui-button-group.ui-critical,
4787
+ .ui-button-group.ui-primary) & {
4779
4788
  --_divider-color: light-dark(oklch(from var(--_accent) calc(l - 0.1) c h),
4780
4789
  oklch(from var(--_accent) calc(l + 0.1) c h));
4781
4790
  }
@@ -4792,7 +4801,7 @@
4792
4801
  }
4793
4802
  }
4794
4803
 
4795
- &:not(.vertical) {
4804
+ &:not(.ui-vertical) {
4796
4805
  button {
4797
4806
  &:first-of-type {
4798
4807
  border-end-start-radius: var(--_border-radius);
@@ -4817,7 +4826,7 @@
4817
4826
  }
4818
4827
  }
4819
4828
 
4820
- &.vertical {
4829
+ &.ui-vertical {
4821
4830
  flex-direction: column;
4822
4831
 
4823
4832
  button {
@@ -4852,7 +4861,7 @@
4852
4861
  }
4853
4862
 
4854
4863
  @layer components.extended {
4855
- :where(details.accordion) {
4864
+ :where(details.ui-accordion) {
4856
4865
  --_actions-gap: var(--size-1);
4857
4866
  --_actions-margin-block-start: var(--size-3);
4858
4867
  --_actions-padding-block-end: var(--size-1);
@@ -4879,14 +4888,14 @@
4879
4888
  margin-inline: var(--_margin-inline);
4880
4889
  transition: all var(--_transition) ease-out;
4881
4890
 
4882
- &.elevated {
4891
+ &.ui-elevated {
4883
4892
  --_bg-color: var(--surface-elevated);
4884
4893
  --_margin-inline: 0;
4885
4894
  --_padding-inline: var(--size-3);
4886
4895
  --_shadow: var(--shadow-3);
4887
4896
  }
4888
4897
 
4889
- &.outlined {
4898
+ &.ui-outlined {
4890
4899
  --_bg-color: var(--surface-default);
4891
4900
  --_border-color: var(--border-color);
4892
4901
  --_border-width: 1px;
@@ -4894,7 +4903,7 @@
4894
4903
  --_padding-inline: var(--size-3);
4895
4904
  }
4896
4905
 
4897
- &.tonal {
4906
+ &.ui-tonal {
4898
4907
  --_bg-color: var(--surface-tonal);
4899
4908
  --_margin-inline: 0;
4900
4909
  --_padding-inline: var(--size-3);
@@ -4951,13 +4960,13 @@
4951
4960
  rotate: 180deg;
4952
4961
  }
4953
4962
 
4954
- &>.content {
4963
+ &>.ui-content {
4955
4964
  margin-block-start: 0;
4956
4965
  padding-block: var(--_content-padding-block);
4957
4966
  padding-inline: var(--_content-padding-inline);
4958
4967
  }
4959
4968
 
4960
- &>.actions {
4969
+ &>.ui-actions {
4961
4970
  display: flex;
4962
4971
  gap: var(--_actions-gap);
4963
4972
  justify-content: end;
@@ -4968,7 +4977,7 @@
4968
4977
  }
4969
4978
 
4970
4979
  /* Accordion group */
4971
- :where(.card[role="group"]:has(details.accordion)) {
4980
+ :where(.ui-card[role="group"]:has(details.ui-accordion)) {
4972
4981
  --_group-radius: var(--border-radius);
4973
4982
  --_gutter-color: var(--border-color);
4974
4983
  --_item-padding-inline: var(--size-3);
@@ -4976,18 +4985,18 @@
4976
4985
 
4977
4986
  display: block;
4978
4987
 
4979
- &.card {
4980
- &:not(.tonal, .outlined, .elevated) {
4988
+ &.ui-card {
4989
+ &:not(.ui-tonal, .ui-outlined, .ui-elevated) {
4981
4990
  --_item-summary-padding-inline: 0;
4982
4991
  }
4983
4992
  }
4984
4993
 
4985
- &>.content {
4994
+ &>.ui-content {
4986
4995
  margin-block: 0;
4987
4996
  padding: 0;
4988
4997
  }
4989
4998
 
4990
- &>details.accordion {
4999
+ &>details.ui-accordion {
4991
5000
  --_border-color: transparent;
4992
5001
  --_border-width: 0;
4993
5002
  --_margin-inline: 0;
@@ -5032,10 +5041,10 @@
5032
5041
  Lists meant to be used stand-alone or as part of Select elements
5033
5042
 
5034
5043
  Intended use-case:
5035
- - ul.list > li
5036
- - .select > .list > option
5044
+ - ul.ui-list > li
5045
+ - .ui-select > .ui-list > option
5037
5046
  */
5038
- :where(.list) {
5047
+ :where(.ui-list) {
5039
5048
  --_bg-color: var(--surface-filled);
5040
5049
  --_bg-color-hover: oklch(from var(--primary) l c h / 15%);
5041
5050
 
@@ -5053,20 +5062,20 @@ Lists meant to be used stand-alone or as part of Select elements
5053
5062
  }
5054
5063
 
5055
5064
  /* Background color */
5056
- &.transparent {
5065
+ &.ui-transparent {
5057
5066
  --_bg-color: transparent;
5058
5067
  }
5059
5068
 
5060
- &.default {
5069
+ &.ui-default {
5061
5070
  --_bg-color: var(--surface-default);
5062
5071
  }
5063
5072
 
5064
- &.tonal {
5073
+ &.ui-tonal {
5065
5074
  --_bg-color: var(--surface-tonal);
5066
5075
  }
5067
5076
 
5068
5077
  /* Borders on all list items */
5069
- &.bordered {
5078
+ &.ui-bordered {
5070
5079
  :where(li + li, option + option) {
5071
5080
  margin-block-start: var(--size-3);
5072
5081
 
@@ -5085,13 +5094,13 @@ Lists meant to be used stand-alone or as part of Select elements
5085
5094
  }
5086
5095
 
5087
5096
  /* Dense - less gaps and spacing */
5088
- &.dense {
5097
+ &.ui-dense {
5089
5098
  :where(li, option) {
5090
5099
  gap: var(--size-2);
5091
5100
  min-block-size: var(--size-7);
5092
5101
  padding: var(--size-1) var(--size-2);
5093
5102
 
5094
- &.border-top {
5103
+ &.ui-border-top {
5095
5104
  margin-block-start: var(--size-2);
5096
5105
 
5097
5106
  &::before {
@@ -5113,29 +5122,29 @@ Lists meant to be used stand-alone or as part of Select elements
5113
5122
 
5114
5123
  /* Checkbox / Radio */
5115
5124
  &>label {
5116
- .end {
5125
+ .ui-end {
5117
5126
  padding-inline-end: 0.125rem;
5118
5127
  }
5119
5128
 
5120
- &:where(.checkbox, .radio) {
5129
+ &:where(.ui-checkbox, .ui-radio) {
5121
5130
  --_input-size: var(--size-3);
5122
5131
  }
5123
5132
  }
5124
5133
 
5125
5134
  /* Leading and trailing content */
5126
- .start,
5127
- .end {
5128
- .avatar {
5135
+ .ui-start,
5136
+ .ui-end {
5137
+ .ui-avatar {
5129
5138
  max-inline-size: var(--size-6);
5130
5139
  }
5131
5140
 
5132
- .icon-button,
5141
+ .ui-icon-button,
5133
5142
  svg {
5134
5143
  max-inline-size: var(--size-4);
5135
5144
  }
5136
5145
 
5137
- .checkbox,
5138
- .radio {
5146
+ .ui-checkbox,
5147
+ .ui-radio {
5139
5148
  --_input-size: var(--size-3);
5140
5149
  }
5141
5150
  }
@@ -5143,7 +5152,7 @@ Lists meant to be used stand-alone or as part of Select elements
5143
5152
  }
5144
5153
 
5145
5154
  /* Gutterless */
5146
- &.gutterless {
5155
+ &.ui-gutterless {
5147
5156
  :where(li, option) {
5148
5157
  padding-inline: 0;
5149
5158
 
@@ -5248,20 +5257,20 @@ Lists meant to be used stand-alone or as part of Select elements
5248
5257
 
5249
5258
  /* Checkbox / Radio / Switch */
5250
5259
  &>label {
5251
- &:where(.checkbox, .radio, .switch) {
5260
+ &:where(.ui-checkbox, .ui-radio, .ui-switch) {
5252
5261
  display: flex;
5253
5262
  }
5254
5263
 
5255
- .end {
5264
+ .ui-end {
5256
5265
  padding-inline-end: var(--size-1);
5257
5266
  }
5258
5267
 
5259
- &:where(.checkbox, .radio) {
5268
+ &:where(.ui-checkbox, .ui-radio) {
5260
5269
  inline-size: 100%;
5261
5270
  }
5262
5271
 
5263
5272
  /* Switches look comically big in lists, so it's better to use a smaller variant */
5264
- &.switch {
5273
+ &.ui-switch {
5265
5274
  --_dot-size: 0.75rem;
5266
5275
  --_track-height: var(--size-4);
5267
5276
  --_track-width: 2.5rem;
@@ -5274,7 +5283,7 @@ Lists meant to be used stand-alone or as part of Select elements
5274
5283
  }
5275
5284
 
5276
5285
  /* Border between list items */
5277
- &.border-top {
5286
+ &.ui-border-top {
5278
5287
  margin-block-start: var(--size-3);
5279
5288
 
5280
5289
  &::before {
@@ -5289,7 +5298,7 @@ Lists meant to be used stand-alone or as part of Select elements
5289
5298
  }
5290
5299
 
5291
5300
  /* Text */
5292
- .text {
5301
+ .ui-text {
5293
5302
  flex: 1;
5294
5303
  line-height: 1.6;
5295
5304
 
@@ -5305,7 +5314,7 @@ Lists meant to be used stand-alone or as part of Select elements
5305
5314
  }
5306
5315
 
5307
5316
  /* Leading content */
5308
- .start {
5317
+ .ui-start {
5309
5318
  align-items: center;
5310
5319
  align-self: center;
5311
5320
  display: grid;
@@ -5333,7 +5342,7 @@ Lists meant to be used stand-alone or as part of Select elements
5333
5342
  }
5334
5343
 
5335
5344
  /* Trailing content */
5336
- .end {
5345
+ .ui-end {
5337
5346
  align-items: center;
5338
5347
  display: flex;
5339
5348
  font-size: var(--font-size-0);
@@ -5358,13 +5367,13 @@ Lists meant to be used stand-alone or as part of Select elements
5358
5367
  }
5359
5368
 
5360
5369
  /* Inset */
5361
- &.inset {
5362
- .text {
5370
+ &.ui-inset {
5371
+ .ui-text {
5363
5372
  padding-inline-start: calc(var(--size-5) + var(--size-3));
5364
5373
  }
5365
5374
 
5366
5375
  /* Safety measure so it won't look bad if there for some reason should exist a leading element inside. */
5367
- .start {
5376
+ .ui-start {
5368
5377
  display: none;
5369
5378
  }
5370
5379
  }
@@ -5373,7 +5382,7 @@ Lists meant to be used stand-alone or as part of Select elements
5373
5382
  }
5374
5383
 
5375
5384
  @layer components.extended {
5376
- :where(.dialog) {
5385
+ :where(.ui-dialog) {
5377
5386
  inline-size: 100%;
5378
5387
  inset: 0;
5379
5388
  margin: auto;
@@ -5408,7 +5417,7 @@ Lists meant to be used stand-alone or as part of Select elements
5408
5417
  pointer-events: all;
5409
5418
  }
5410
5419
 
5411
- .actions {
5420
+ .ui-actions {
5412
5421
  justify-content: end;
5413
5422
  padding-inline: var(--size-3) var(--size-1);
5414
5423
  }
@@ -5435,14 +5444,14 @@ Lists meant to be used stand-alone or as part of Select elements
5435
5444
  }
5436
5445
  }
5437
5446
 
5438
- :where(html:has(.dialog[open])) {
5447
+ :where(html:has(.ui-dialog[open])) {
5439
5448
  block-size: 100%;
5440
5449
  overflow: hidden;
5441
5450
  }
5442
5451
  }
5443
5452
 
5444
5453
  @layer components.root {
5445
- :where(dialog.drawer) {
5454
+ :where(dialog.ui-drawer) {
5446
5455
  --_backdrop-bg-color: transparent;
5447
5456
  --_backdrop-blur: blur(2px);
5448
5457
  --_bg-color: var(--surface-default);
@@ -5486,11 +5495,11 @@ Lists meant to be used stand-alone or as part of Select elements
5486
5495
  opacity var(--_transition-duration) var(--_transition-timing);
5487
5496
  }
5488
5497
 
5489
- &.backdrop-transparent {
5498
+ &.ui-backdrop-transparent {
5490
5499
  --_backdrop-blur: none;
5491
5500
  }
5492
5501
 
5493
- .header {
5502
+ .ui-header {
5494
5503
  align-items: center;
5495
5504
  border-block-end: var(--_border-width) solid var(--_border-color);
5496
5505
  display: flex;
@@ -5501,18 +5510,18 @@ Lists meant to be used stand-alone or as part of Select elements
5501
5510
  margin: 0;
5502
5511
  }
5503
5512
 
5504
- :where(.icon-button) {
5513
+ :where(.ui-icon-button) {
5505
5514
  margin-inline-start: auto;
5506
5515
  }
5507
5516
  }
5508
5517
 
5509
- .content {
5518
+ .ui-content {
5510
5519
  flex: 1;
5511
5520
  overflow-y: auto;
5512
5521
  padding: var(--_content-padding);
5513
5522
  }
5514
5523
 
5515
- .footer {
5524
+ .ui-footer {
5516
5525
  border-block-start: var(--_border-width) solid var(--_border-color);
5517
5526
  display: flex;
5518
5527
  gap: var(--_footer-gap);
@@ -5520,48 +5529,48 @@ Lists meant to be used stand-alone or as part of Select elements
5520
5529
  padding: var(--_footer-padding);
5521
5530
  }
5522
5531
 
5523
- &.inline-start,
5524
- &.inline-end {
5532
+ &.ui-inline-start,
5533
+ &.ui-inline-end {
5525
5534
  block-size: 100dvb;
5526
5535
  inline-size: var(--_inline-size);
5527
5536
  inset-block: 0;
5528
5537
  max-block-size: 100%;
5529
5538
  }
5530
5539
 
5531
- &.inline-start {
5540
+ &.ui-inline-start {
5532
5541
  border-inline-end: var(--_border-width) solid var(--_border-color);
5533
5542
  inset-inline-end: auto;
5534
5543
  inset-inline-start: 0;
5535
5544
  translate: -100% 0;
5536
5545
  }
5537
5546
 
5538
- &.inline-end {
5547
+ &.ui-inline-end {
5539
5548
  border-inline-start: var(--_border-width) solid var(--_border-color);
5540
5549
  inset-inline-end: 0;
5541
5550
  inset-inline-start: auto;
5542
5551
  translate: 100% 0;
5543
5552
 
5544
- .footer {
5553
+ .ui-footer {
5545
5554
  justify-content: start;
5546
5555
  }
5547
5556
  }
5548
5557
 
5549
- &.block-start,
5550
- &.block-end {
5558
+ &.ui-block-start,
5559
+ &.ui-block-end {
5551
5560
  block-size: var(--_block-size);
5552
5561
  inline-size: 100dvi;
5553
5562
  inset-inline: 0;
5554
5563
  max-block-size: 80dvb;
5555
5564
  }
5556
5565
 
5557
- &.block-start {
5566
+ &.ui-block-start {
5558
5567
  border-block-end: var(--_border-width) solid var(--_border-color);
5559
5568
  inset-block-end: auto;
5560
5569
  inset-block-start: 0;
5561
5570
  translate: 0 -100%;
5562
5571
  }
5563
5572
 
5564
- &.block-end {
5573
+ &.ui-block-end {
5565
5574
  border-block-start: var(--_border-width) solid var(--_border-color);
5566
5575
  inset-block-end: 0;
5567
5576
  inset-block-start: auto;
@@ -5580,29 +5589,29 @@ Lists meant to be used stand-alone or as part of Select elements
5580
5589
  opacity: 0;
5581
5590
  }
5582
5591
 
5583
- &.inline-start {
5592
+ &.ui-inline-start {
5584
5593
  translate: -100% 0;
5585
5594
  }
5586
5595
 
5587
- &.inline-end {
5596
+ &.ui-inline-end {
5588
5597
  translate: 100% 0;
5589
5598
  }
5590
5599
 
5591
- &.block-start {
5600
+ &.ui-block-start {
5592
5601
  translate: 0 -100%;
5593
5602
  }
5594
5603
 
5595
- &.block-end {
5604
+ &.ui-block-end {
5596
5605
  translate: 0 100%;
5597
5606
  }
5598
5607
  }
5599
5608
  }
5600
5609
  }
5601
5610
 
5602
- /* Scroll-lock is provided by the shared `.scroll-lock` utility in core/utils.css.
5611
+ /* Scroll-lock is provided by the shared `.ui-scroll-lock` utility in core/utils.css.
5603
5612
  This carve-out re-enables page scrolling when a transparent-backdrop drawer is
5604
5613
  open on wide viewports (where the drawer doesn't visually cover the page). */
5605
- html:has(dialog.drawer.scroll-lock[open].backdrop-transparent) {
5614
+ html:has(dialog.ui-drawer.ui-scroll-lock[open].ui-backdrop-transparent) {
5606
5615
  overflow: unset;
5607
5616
  overscroll-behavior: auto;
5608
5617
 
@@ -5616,7 +5625,7 @@ Lists meant to be used stand-alone or as part of Select elements
5616
5625
  @layer components.extended {
5617
5626
 
5618
5627
  /* Form */
5619
- :where(.form) {
5628
+ :where(.ui-form) {
5620
5629
  display: grid;
5621
5630
  gap: var(--size-8);
5622
5631
 
@@ -5626,7 +5635,7 @@ Lists meant to be used stand-alone or as part of Select elements
5626
5635
  }
5627
5636
 
5628
5637
  /* Fieldset */
5629
- :where(.fieldset) {
5638
+ :where(.ui-fieldset) {
5630
5639
  all: unset;
5631
5640
  border: 0;
5632
5641
  border-radius: 0;
@@ -5637,20 +5646,20 @@ Lists meant to be used stand-alone or as part of Select elements
5637
5646
  padding: 0;
5638
5647
 
5639
5648
  /* Legend */
5640
- :where(legend, .legend) {
5649
+ :where(legend, .ui-legend) {
5641
5650
  all: unset;
5642
5651
  color: var(--text-primary);
5643
5652
  font-weight: 600;
5644
5653
  margin-block-end: var(--size-3);
5645
5654
  padding: 0;
5646
5655
 
5647
- &:has(+ :where(.field-description)) {
5656
+ &:has(+ :where(.ui-field-description)) {
5648
5657
  margin-block-end: 0;
5649
5658
  }
5650
5659
  }
5651
5660
 
5652
5661
  /* Field description / supporting text */
5653
- :where(.field-description) {
5662
+ :where(.ui-field-description) {
5654
5663
  color: var(--text-muted);
5655
5664
  font-size: var(--font-size-05);
5656
5665
  line-height: var(--font-lineheight-3);
@@ -5661,13 +5670,13 @@ Lists meant to be used stand-alone or as part of Select elements
5661
5670
  }
5662
5671
 
5663
5672
  /* End text */
5664
- :where(.end-text) {
5673
+ :where(.ui-end-text) {
5665
5674
  color: var(--text-muted);
5666
5675
  font-size: var(--font-size-0);
5667
5676
  line-height: var(--font-lineheight-3);
5668
5677
  }
5669
5678
 
5670
- &:has(.text-field.row) {
5679
+ &:has(.ui-text-field.ui-row) {
5671
5680
  row-gap: var(--size-7);
5672
5681
  }
5673
5682
 
@@ -5678,26 +5687,26 @@ Lists meant to be used stand-alone or as part of Select elements
5678
5687
 
5679
5688
  input,
5680
5689
  label,
5681
- .label {
5690
+ .ui-label {
5682
5691
  cursor: not-allowed;
5683
5692
  }
5684
5693
  }
5685
5694
 
5686
5695
  /* Error / validation */
5687
5696
  &[data-invalid] {
5688
- :where(.end-text) {
5697
+ :where(.ui-end-text) {
5689
5698
  color: var(--primary);
5690
5699
  }
5691
5700
 
5692
- :where(.checkbox, .radio, .switch) {
5701
+ :where(.ui-checkbox, .ui-radio, .ui-switch) {
5693
5702
  --palette-source: oklch(0.58 0.21 var(--hue-red));
5694
5703
 
5695
- :where(.end-text) {
5704
+ :where(.ui-end-text) {
5696
5705
  color: var(--primary);
5697
5706
  }
5698
5707
  }
5699
5708
 
5700
- :where(.switch) {
5709
+ :where(.ui-switch) {
5701
5710
  input {
5702
5711
  border-radius: var(--radius-round);
5703
5712
  outline: 2px solid var(--primary);
@@ -5707,7 +5716,7 @@ Lists meant to be used stand-alone or as part of Select elements
5707
5716
 
5708
5717
  /* Required */
5709
5718
  &:has(:invalid) {
5710
- :where(legend, .legend) {
5719
+ :where(legend, .ui-legend) {
5711
5720
  padding-inline-end: 1ex;
5712
5721
  position: relative;
5713
5722
 
@@ -5722,18 +5731,18 @@ Lists meant to be used stand-alone or as part of Select elements
5722
5731
  }
5723
5732
 
5724
5733
  /* Field group */
5725
- :where(.field-group) {
5734
+ :where(.ui-field-group) {
5726
5735
  display: flex;
5727
5736
  flex-direction: column;
5728
5737
  gap: var(--size-4);
5729
5738
 
5730
5739
  /* If it only has checkboxes, radios, or switches */
5731
- &:has(> :where(.checkbox, .radio, .switch)):not(:has(> :not(.checkbox, .radio, .switch))) {
5740
+ &:has(> :where(.ui-checkbox, .ui-radio, .ui-switch)):not(:has(> :not(.ui-checkbox, .ui-radio, .ui-switch))) {
5732
5741
  gap: var(--size-2);
5733
5742
  }
5734
5743
 
5735
5744
  /* If it only has buttons */
5736
- &:has(.button):not(:has(*:not(.button))) {
5745
+ &:has(.ui-button):not(:has(*:not(.ui-button))) {
5737
5746
  align-items: center;
5738
5747
  flex-direction: row;
5739
5748
  gap: var(--size-2);
@@ -5749,11 +5758,11 @@ Lists meant to be used stand-alone or as part of Select elements
5749
5758
  }
5750
5759
 
5751
5760
  /* Directions */
5752
- &.row {
5761
+ &.ui-row {
5753
5762
  flex-direction: row;
5754
5763
  flex-wrap: wrap;
5755
5764
 
5756
- &:has(> :where(.checkbox, .radio, .switch)) {
5765
+ &:has(> :where(.ui-checkbox, .ui-radio, .ui-switch)) {
5757
5766
  gap: var(--size-4);
5758
5767
  }
5759
5768
  }
@@ -5766,7 +5775,7 @@ Lists meant to be used stand-alone or as part of Select elements
5766
5775
  - Common styling for input, textarea and select
5767
5776
  - Form related styles such as: label, supporting text, error handling
5768
5777
  */
5769
- :where(.text-field, .textarea, .select) {
5778
+ :where(.ui-text-field, .ui-textarea, .ui-select) {
5770
5779
  --_accent-color: var(--primary);
5771
5780
  --_bg-color: var(--surface-default);
5772
5781
  --_border-color: var(--field-border-color);
@@ -5782,7 +5791,7 @@ Lists meant to be used stand-alone or as part of Select elements
5782
5791
  position: relative;
5783
5792
 
5784
5793
  /* Field - the actual input with a border around it */
5785
- .field {
5794
+ .ui-field {
5786
5795
  background-color: var(--_bg-color);
5787
5796
  border: var(--field-border-width) solid var(--_border-color);
5788
5797
  border-radius: var(--field-border-radius);
@@ -5801,7 +5810,7 @@ Lists meant to be used stand-alone or as part of Select elements
5801
5810
  }
5802
5811
  }
5803
5812
 
5804
- :where(.field) :where(input, textarea, select) {
5813
+ :where(.ui-field) :where(input, textarea, select) {
5805
5814
  background: transparent;
5806
5815
  border: 0;
5807
5816
  color: var(--text-primary);
@@ -5820,8 +5829,8 @@ Lists meant to be used stand-alone or as part of Select elements
5820
5829
  }
5821
5830
 
5822
5831
  /* Affixes */
5823
- .prefix,
5824
- .suffix {
5832
+ .ui-prefix,
5833
+ .ui-suffix {
5825
5834
  align-items: center;
5826
5835
  color: var(--_label-color);
5827
5836
  display: inline-flex;
@@ -5829,16 +5838,16 @@ Lists meant to be used stand-alone or as part of Select elements
5829
5838
  white-space: nowrap;
5830
5839
  }
5831
5840
 
5832
- .prefix {
5841
+ .ui-prefix {
5833
5842
  grid-area: prefix;
5834
5843
  }
5835
5844
 
5836
- .suffix {
5845
+ .ui-suffix {
5837
5846
  grid-area: suffix;
5838
5847
  }
5839
5848
 
5840
- .header,
5841
- .footer {
5849
+ .ui-header,
5850
+ .ui-footer {
5842
5851
  align-items: center;
5843
5852
  color: var(--_label-color);
5844
5853
  display: flex;
@@ -5847,30 +5856,30 @@ Lists meant to be used stand-alone or as part of Select elements
5847
5856
  padding: var(--size-1) var(--_field-padding-inline);
5848
5857
  }
5849
5858
 
5850
- .header {
5859
+ .ui-header {
5851
5860
  border-block-end: 1px solid var(--_border-color);
5852
5861
  grid-area: header;
5853
5862
  }
5854
5863
 
5855
- .footer {
5864
+ .ui-footer {
5856
5865
  border-block-start: 1px solid var(--_border-color);
5857
5866
  grid-area: footer;
5858
5867
  }
5859
5868
 
5860
5869
  /* Remove padding on the input when affixes are next to it */
5861
- .field:has(> .prefix) :where(input, textarea, select) {
5870
+ .ui-field:has(> .ui-prefix) :where(input, textarea, select) {
5862
5871
  padding-inline-start: 0;
5863
5872
  }
5864
5873
 
5865
- .field:has(> .suffix) :where(input, textarea, select) {
5874
+ .ui-field:has(> .ui-suffix) :where(input, textarea, select) {
5866
5875
  padding-inline-end: 0;
5867
5876
  }
5868
5877
 
5869
5878
  /* Textarea - keep affix aligned with the first line */
5870
- &.textarea .field {
5879
+ &.ui-textarea .ui-field {
5871
5880
 
5872
- .prefix,
5873
- .suffix {
5881
+ .ui-prefix,
5882
+ .ui-suffix {
5874
5883
  align-self: start;
5875
5884
  padding-block: var(--_field-padding-block);
5876
5885
  }
@@ -5878,7 +5887,7 @@ Lists meant to be used stand-alone or as part of Select elements
5878
5887
 
5879
5888
  /* Required/Invalid */
5880
5889
  &:has(:invalid) {
5881
- .label:after {
5890
+ .ui-label:after {
5882
5891
  color: var(--red);
5883
5892
  content: "*";
5884
5893
  margin: -0.25em auto auto 0.25em;
@@ -5913,7 +5922,7 @@ Lists meant to be used stand-alone or as part of Select elements
5913
5922
  }
5914
5923
 
5915
5924
  /* Variants */
5916
- &.filled {
5925
+ &.ui-filled {
5917
5926
  input {
5918
5927
 
5919
5928
  &::-webkit-file-upload-button,
@@ -5928,7 +5937,7 @@ Lists meant to be used stand-alone or as part of Select elements
5928
5937
  }
5929
5938
 
5930
5939
  /* Sizes */
5931
- &.small {
5940
+ &.ui-small {
5932
5941
  input {
5933
5942
  font-size: var(--font-size-05);
5934
5943
 
@@ -5943,7 +5952,7 @@ Lists meant to be used stand-alone or as part of Select elements
5943
5952
 
5944
5953
  /* Autosuggest */
5945
5954
  &:has(input[list]) {
5946
- .label {
5955
+ .ui-label {
5947
5956
  /* Make sure chevron is visible */
5948
5957
  inline-size: calc(100% - var(--size-6));
5949
5958
  }
@@ -5951,7 +5960,7 @@ Lists meant to be used stand-alone or as part of Select elements
5951
5960
 
5952
5961
  /* Select */
5953
5962
  &:has(select) {
5954
- .label {
5963
+ .ui-label {
5955
5964
  /* Make sure chevron is visible */
5956
5965
  inline-size: calc(100% - var(--size-6));
5957
5966
 
@@ -5979,7 +5988,7 @@ Lists meant to be used stand-alone or as part of Select elements
5979
5988
 
5980
5989
  /* Input - color */
5981
5990
  &:has(input[type="color"]) {
5982
- .field {
5991
+ .ui-field {
5983
5992
  block-size: var(--_height);
5984
5993
  inline-size: var(--_height);
5985
5994
  min-block-size: 0;
@@ -6007,21 +6016,21 @@ Lists meant to be used stand-alone or as part of Select elements
6007
6016
  /* Element states */
6008
6017
  &:hover {
6009
6018
  &:not([data-invalid]) {
6010
- .field {
6019
+ .ui-field {
6011
6020
  border-color: var(--text-primary);
6012
6021
  }
6013
6022
  }
6014
6023
  }
6015
6024
 
6016
6025
  &:focus-within {
6017
- .field {
6026
+ .ui-field {
6018
6027
  border-color: var(--_accent-color);
6019
6028
  outline-offset: -2px;
6020
6029
  }
6021
6030
  }
6022
6031
 
6023
6032
  /* Label */
6024
- .label {
6033
+ .ui-label {
6025
6034
  color: var(--text-primary);
6026
6035
  font-size: var(--font-size-05);
6027
6036
  font-weight: 600;
@@ -6031,7 +6040,7 @@ Lists meant to be used stand-alone or as part of Select elements
6031
6040
  }
6032
6041
 
6033
6042
  /* End text */
6034
- :where(.end-text) {
6043
+ :where(.ui-end-text) {
6035
6044
  color: var(--_end-text-color);
6036
6045
  font-size: var(--font-size-0);
6037
6046
  grid-column: 1/-1;
@@ -6040,10 +6049,10 @@ Lists meant to be used stand-alone or as part of Select elements
6040
6049
  }
6041
6050
 
6042
6051
  /* Auto-fit */
6043
- &.auto-fit {
6052
+ &.ui-auto-fit {
6044
6053
  inline-size: auto;
6045
6054
 
6046
- .field {
6055
+ .ui-field {
6047
6056
  inline-size: auto;
6048
6057
  }
6049
6058
 
@@ -6067,7 +6076,7 @@ Lists meant to be used stand-alone or as part of Select elements
6067
6076
  /*
6068
6077
  * Variant: Filled
6069
6078
  */
6070
- &.filled {
6079
+ &.ui-filled {
6071
6080
  --_bg-color: var(--surface-tonal);
6072
6081
 
6073
6082
  &:not(:has([disabled], :has(input[type="color"]))) {
@@ -6090,7 +6099,7 @@ Lists meant to be used stand-alone or as part of Select elements
6090
6099
  display: none;
6091
6100
  }
6092
6101
 
6093
- .field {
6102
+ .ui-field {
6094
6103
  cursor: not-allowed;
6095
6104
  }
6096
6105
 
@@ -6102,9 +6111,9 @@ Lists meant to be used stand-alone or as part of Select elements
6102
6111
  }
6103
6112
  }
6104
6113
 
6105
- .label,
6106
- .start-text,
6107
- .end-text {
6114
+ .ui-label,
6115
+ .ui-start-text,
6116
+ .ui-end-text {
6108
6117
  cursor: not-allowed;
6109
6118
  }
6110
6119
  }
@@ -6125,31 +6134,31 @@ Lists meant to be used stand-alone or as part of Select elements
6125
6134
  }
6126
6135
 
6127
6136
  /* Sizes */
6128
- &.small {
6137
+ &.ui-small {
6129
6138
  --_field-padding-block: var(--size-2);
6130
6139
  --_height: var(--field-size-small);
6131
6140
 
6132
6141
  &:has(input[type="color"]) {
6133
- .label {
6142
+ .ui-label {
6134
6143
  line-height: 1.5;
6135
6144
  }
6136
6145
  }
6137
6146
  }
6138
6147
 
6139
6148
  /* Orientation */
6140
- &.spread {
6149
+ &.ui-spread {
6141
6150
  align-items: start;
6142
6151
  column-gap: var(--size-4);
6143
6152
  container-type: inline-size;
6144
6153
  grid-template-columns: 1fr auto;
6145
6154
 
6146
- .label {
6155
+ .ui-label {
6147
6156
  font-weight: 600;
6148
6157
  grid-column: 1;
6149
6158
  grid-row: 1;
6150
6159
  }
6151
6160
 
6152
- .start-text {
6161
+ .ui-start-text {
6153
6162
  color: var(--_end-text-color);
6154
6163
  font-size: var(--font-size-0);
6155
6164
  grid-column: 1;
@@ -6157,16 +6166,16 @@ Lists meant to be used stand-alone or as part of Select elements
6157
6166
  line-height: 1.5;
6158
6167
  }
6159
6168
 
6160
- .field {
6169
+ .ui-field {
6161
6170
  align-self: start;
6162
6171
  grid-column: 2;
6163
6172
  grid-row: 1 / span 2;
6164
6173
  }
6165
6174
 
6166
- .field:has(textarea) {
6175
+ .ui-field:has(textarea) {
6167
6176
  grid-row: 1 / span 3;
6168
6177
 
6169
- +.end-text {
6178
+ +.ui-end-text {
6170
6179
  grid-row: 4;
6171
6180
  }
6172
6181
  }
@@ -6175,7 +6184,7 @@ Lists meant to be used stand-alone or as part of Select elements
6175
6184
  min-inline-size: 30ch;
6176
6185
  }
6177
6186
 
6178
- :where(.end-text) {
6187
+ :where(.ui-end-text) {
6179
6188
  grid-column: 2;
6180
6189
  text-align: end;
6181
6190
  }
@@ -6185,23 +6194,23 @@ Lists meant to be used stand-alone or as part of Select elements
6185
6194
  column-gap: 0;
6186
6195
  grid-template-columns: 1fr;
6187
6196
 
6188
- .label {
6197
+ .ui-label {
6189
6198
  grid-column: 1;
6190
6199
  grid-row: 1;
6191
6200
  }
6192
6201
 
6193
- .start-text {
6202
+ .ui-start-text {
6194
6203
  grid-column: 1;
6195
6204
  grid-row: 2;
6196
6205
  }
6197
6206
 
6198
- .field,
6199
- .field:has(textarea) {
6207
+ .ui-field,
6208
+ .ui-field:has(textarea) {
6200
6209
  grid-column: 1;
6201
6210
  grid-row: 3;
6202
6211
  }
6203
6212
 
6204
- :where(.end-text) {
6213
+ :where(.ui-end-text) {
6205
6214
  grid-column: 1;
6206
6215
  grid-row: 4;
6207
6216
  text-align: start;
@@ -6212,7 +6221,7 @@ Lists meant to be used stand-alone or as part of Select elements
6212
6221
  }
6213
6222
 
6214
6223
  @layer components.extended {
6215
- :where(.select select) {
6224
+ :where(.ui-select select) {
6216
6225
  position: relative;
6217
6226
 
6218
6227
  /* Default arrow */
@@ -6277,7 +6286,7 @@ Lists meant to be used stand-alone or as part of Select elements
6277
6286
  }
6278
6287
  }
6279
6288
 
6280
- .list {
6289
+ .ui-list {
6281
6290
  --_bg-color: var(--surface-filled);
6282
6291
  border: var(--field-border-width) solid var(--field-border-color);
6283
6292
  border-radius: var(--field-border-radius);
@@ -6332,10 +6341,10 @@ Lists meant to be used stand-alone or as part of Select elements
6332
6341
  }
6333
6342
  }
6334
6343
 
6335
- :where(.select:has(select)) {
6344
+ :where(.ui-select:has(select)) {
6336
6345
 
6337
6346
  /* Size */
6338
- &.small {
6347
+ &.ui-small {
6339
6348
  button {
6340
6349
  padding-inline: var(--size-2) var(--size-7);
6341
6350
 
@@ -6383,7 +6392,7 @@ Lists meant to be used stand-alone or as part of Select elements
6383
6392
 
6384
6393
  @layer components.extended {
6385
6394
 
6386
- :where(.text-field:has( :where(input[type="date"],
6395
+ :where(.ui-text-field:has( :where(input[type="date"],
6387
6396
  input[type="datetime-local"],
6388
6397
  input[type="email"],
6389
6398
  input[type="month"],
@@ -6397,7 +6406,7 @@ Lists meant to be used stand-alone or as part of Select elements
6397
6406
  input[type="week"]))) {
6398
6407
 
6399
6408
  /* Sizes */
6400
- &.small {
6409
+ &.ui-small {
6401
6410
  input {
6402
6411
  padding-inline: var(--size-2);
6403
6412
  }
@@ -6405,8 +6414,8 @@ Lists meant to be used stand-alone or as part of Select elements
6405
6414
  }
6406
6415
 
6407
6416
  /* Autosuggest */
6408
- :where(.text-field:has(input[list])) {
6409
- .field {
6417
+ :where(.ui-text-field:has(input[list])) {
6418
+ .ui-field {
6410
6419
  position: relative;
6411
6420
  }
6412
6421
 
@@ -6422,7 +6431,7 @@ Lists meant to be used stand-alone or as part of Select elements
6422
6431
  padding-inline-end: var(--size-8);
6423
6432
  }
6424
6433
 
6425
- .field::after {
6434
+ .ui-field::after {
6426
6435
  block-size: 0;
6427
6436
  border-block-start: 5px solid;
6428
6437
  border-inline: 5px solid transparent;
@@ -6434,12 +6443,12 @@ Lists meant to be used stand-alone or as part of Select elements
6434
6443
  translate: 0 -50%;
6435
6444
  }
6436
6445
 
6437
- &.small {
6446
+ &.ui-small {
6438
6447
  input[list] {
6439
6448
  padding-inline-end: var(--size-7);
6440
6449
  }
6441
6450
 
6442
- .field::after {
6451
+ .ui-field::after {
6443
6452
  inset-inline-end: var(--size-2);
6444
6453
  }
6445
6454
  }
@@ -6447,7 +6456,7 @@ Lists meant to be used stand-alone or as part of Select elements
6447
6456
  }
6448
6457
 
6449
6458
  @layer components.extended {
6450
- :where(.textarea) {
6459
+ :where(.ui-textarea) {
6451
6460
  textarea {
6452
6461
  block-size: auto;
6453
6462
  field-sizing: content;
@@ -6456,14 +6465,14 @@ Lists meant to be used stand-alone or as part of Select elements
6456
6465
  }
6457
6466
 
6458
6467
  /* Size */
6459
- &.small {
6468
+ &.ui-small {
6460
6469
  textarea {
6461
6470
  min-block-size: var(--size-9);
6462
6471
  }
6463
6472
  }
6464
6473
 
6465
6474
  /* Auto-fit */
6466
- &.auto-fit {
6475
+ &.ui-auto-fit {
6467
6476
  textarea {
6468
6477
  resize: both;
6469
6478
  }
@@ -6472,12 +6481,12 @@ Lists meant to be used stand-alone or as part of Select elements
6472
6481
  }
6473
6482
 
6474
6483
  @layer components.extended {
6475
- :where(.tooltip) {
6484
+ :where(.ui-tooltip) {
6476
6485
  --_tooltip-bg: light-dark(var(--gray-13), var(--gray-3));
6477
6486
  --_tooltip-color: light-dark(var(--gray-1), var(--gray-15));
6478
6487
  --_tooltip-offset: var(--size-2);
6479
6488
 
6480
- &>.anchor-floating {
6489
+ &>.ui-anchor-floating {
6481
6490
  background-color: var(--_tooltip-bg);
6482
6491
  border-radius: var(--radius-2);
6483
6492
  color: var(--_tooltip-color);
@@ -6499,15 +6508,15 @@ Lists meant to be used stand-alone or as part of Select elements
6499
6508
  /* Optional arrow pointing from the tooltip toward the trigger.
6500
6509
  Anchored to the same --anchor so it flips together with the
6501
6510
  tooltip when position-try-fallbacks kicks in. */
6502
- &.with-arrow {
6511
+ &.ui-with-arrow {
6503
6512
  --_arrow-size: var(--size-2);
6504
6513
 
6505
- &>.anchor-floating {
6514
+ &>.ui-anchor-floating {
6506
6515
  /* Reserve space so the arrow doesn't overlap the trigger. */
6507
6516
  --_tooltip-offset: calc(var(--size-2) + var(--_arrow-size) / 2);
6508
6517
  }
6509
6518
 
6510
- &>.anchor-floating::before {
6519
+ &>.ui-anchor-floating::before {
6511
6520
  background-color: var(--_tooltip-bg);
6512
6521
  block-size: var(--_arrow-size);
6513
6522
  content: "";
@@ -6521,7 +6530,7 @@ Lists meant to be used stand-alone or as part of Select elements
6521
6530
  }
6522
6531
 
6523
6532
  /* Fade */
6524
- &>.anchor-floating[popover] {
6533
+ &>.ui-anchor-floating[popover] {
6525
6534
  opacity: 0;
6526
6535
  transition:
6527
6536
  display 0.15s allow-discrete,
@@ -6547,7 +6556,7 @@ Lists meant to be used stand-alone or as part of Select elements
6547
6556
  Screen-reader only
6548
6557
  When you visibly want to hide an element but make it accessible for screen readers.
6549
6558
  */
6550
- .sr-only {
6559
+ .ui-sr-only {
6551
6560
  block-size: 1px;
6552
6561
  clip-path: inset(50%);
6553
6562
  inline-size: 1px;
@@ -6558,17 +6567,17 @@ When you visibly want to hide an element but make it accessible for screen reade
6558
6567
 
6559
6568
  /*
6560
6569
  Scroll-lock
6561
- Add `.scroll-lock` to any element that uses the [open] attribute (native <dialog>,
6570
+ Add `.ui-scroll-lock` to any element that uses the [open] attribute (native <dialog>,
6562
6571
  <details>, or any custom element). When that element is open, the page is locked.
6563
6572
  */
6564
- html:has(.scroll-lock[open]) {
6573
+ html:has(.ui-scroll-lock[open]) {
6565
6574
  overflow: clip;
6566
6575
  overscroll-behavior: contain;
6567
6576
  scrollbar-gutter: stable;
6568
6577
  }
6569
6578
 
6570
6579
  /* Hover and active effect for checkbox, radio and icon buttons */
6571
- :where(.checkbox input, .radio input, .icon-button) {
6580
+ :where(.ui-checkbox input, .ui-radio input, .ui-icon-button) {
6572
6581
  --isLTR: 1;
6573
6582
  --isRTL: -1;
6574
6583