@threadlabs/looma 0.34.0 → 0.35.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 (88) hide show
  1. package/components/ui-badge/ui-badge.html +11 -3
  2. package/components/ui-button/ui-button.html +29 -4
  3. package/components/ui-card/ui-card.html +15 -13
  4. package/components/ui-checkbox/ui-checkbox.html +4 -2
  5. package/components/ui-dialog/ui-dialog.html +2 -0
  6. package/components/ui-icon-button/ui-icon-button.html +22 -8
  7. package/components/ui-input/ui-input.html +2 -1
  8. package/components/ui-input-group/ui-input-group.html +4 -1
  9. package/components/ui-light-editor/ui-light-editor.html +45 -0
  10. package/components/ui-light-editor/ui-light-editor.js +53 -0
  11. package/components/ui-menu/ui-menu.html +2 -0
  12. package/components/ui-number-input/ui-number-input.html +2 -1
  13. package/components/ui-number-input/ui-number-input.js +6 -3
  14. package/components/ui-popover/ui-popover.html +2 -0
  15. package/components/ui-select/ui-select.html +9 -7
  16. package/components/ui-switch/ui-switch.html +3 -0
  17. package/components/ui-textarea/ui-textarea.html +2 -1
  18. package/dist/index.js +24 -23
  19. package/docs/README.md +26 -2
  20. package/docs/catalog.json +566 -44
  21. package/docs/customizer-render.mjs +24 -11
  22. package/docs/customizer.js +67 -17
  23. package/docs/index.d.ts +4 -1
  24. package/docs/index.mjs +1 -1
  25. package/docs/render.mjs +1 -1
  26. package/docs/site.mjs +30 -20
  27. package/docs/theme-session.mjs +4 -2
  28. package/docs/theme.mjs +59 -7
  29. package/package.json +2 -2
  30. package/styles/ui-badge.css +11 -6
  31. package/styles/ui-button.css +29 -4
  32. package/styles/ui-card.css +9 -9
  33. package/styles/ui-checkbox.css +4 -2
  34. package/styles/ui-dialog.css +4 -0
  35. package/styles/ui-icon-button.css +22 -8
  36. package/styles/ui-input-group.css +4 -1
  37. package/styles/ui-input.css +2 -1
  38. package/styles/ui-light-editor.css +28 -0
  39. package/styles/ui-menu.css +2 -0
  40. package/styles/ui-popover.css +2 -0
  41. package/styles/ui-select.css +9 -7
  42. package/styles/ui-switch.css +3 -0
  43. package/styles/ui-textarea.css +2 -1
  44. package/theme-light.css +1 -0
  45. package/theme-system.css +43 -7
  46. package/tokens.css +4 -0
  47. package/vanilla/UiCard.d.ts +2 -1
  48. package/vanilla/UiCard.js +12 -12
  49. package/vanilla/UiLightEditor.d.ts +29 -0
  50. package/vanilla/UiLightEditor.js +102 -0
  51. package/vanilla/UiNumberInput.js +27 -20
  52. package/vanilla/index.js +1 -0
  53. package/vue/UiBadge.vue +29 -4
  54. package/vue/UiButton.vue +33 -4
  55. package/vue/UiCard.d.ts +8 -2
  56. package/vue/UiCard.vue +41 -17
  57. package/vue/UiCheckbox.vue +4 -2
  58. package/vue/UiDialog.vue +4 -0
  59. package/vue/UiIconButton.vue +26 -11
  60. package/vue/UiInput.vue +2 -1
  61. package/vue/UiInputGroup.vue +4 -1
  62. package/vue/UiLightEditor.d.ts +75 -0
  63. package/vue/UiLightEditor.js +2 -0
  64. package/vue/UiLightEditor.vue +402 -0
  65. package/vue/UiMenu.vue +2 -0
  66. package/vue/UiNumberInput.vue +32 -3
  67. package/vue/UiPopover.vue +2 -0
  68. package/vue/UiSelect.vue +16 -10
  69. package/vue/UiSwitch.vue +3 -0
  70. package/vue/UiTextarea.vue +2 -1
  71. package/vue/chunks/UiBadge.js +1 -1
  72. package/vue/chunks/UiButton.js +1 -1
  73. package/vue/chunks/UiCard.js +33 -5
  74. package/vue/chunks/UiCheckbox.js +1 -1
  75. package/vue/chunks/UiDialog.js +1 -1
  76. package/vue/chunks/UiIconButton.js +1 -1
  77. package/vue/chunks/UiInput.js +1 -1
  78. package/vue/chunks/UiInputGroup.js +1 -1
  79. package/vue/chunks/UiLightEditor.js +347 -0
  80. package/vue/chunks/UiMenu.js +1 -1
  81. package/vue/chunks/UiNumberInput.js +21 -8
  82. package/vue/chunks/UiPopover.js +1 -1
  83. package/vue/chunks/UiSelect.js +1 -1
  84. package/vue/chunks/UiSwitch.js +1 -1
  85. package/vue/chunks/UiTextarea.js +1 -1
  86. package/vue/components.css +306 -66
  87. package/vue/index.d.ts +1 -0
  88. package/vue/index.js +2 -1
@@ -392,9 +392,6 @@ svg {
392
392
  /* A count can keep its containing control's contrasting ink instead of reversing it.
393
393
  The faint fill preserves text contrast; a quiet boundary separates the count from its control. */
394
394
 
395
- /* Neutral reverses a subtle surface/ink pair rather than a strong tone. Keep its original
396
- surface ink: moving it toward dark-theme primary text would reduce overlay contrast. */
397
-
398
395
  /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
399
396
 
400
397
  /* A visible glyph needs fixed geometry, unlike a content-sized pill or a hidden-label dot. */
@@ -675,7 +672,34 @@ svg {
675
672
  box-shadow: none;
676
673
  }
677
674
  :scope[data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"]:where([data-hn-ui-badge]) {
678
- color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-surface)));
675
+ --_badge-outline-surface: var(
676
+ --ui-badge-surface,
677
+ var(--_badge-color-surface, color-mix(in srgb, var(--ui-surface-raised) 88%, transparent))
678
+ );
679
+ color: var(--ui-badge-text, var(--_badge-color-text, var(--ui-text-primary)));
680
+ }
681
+ :scope[data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"]:not([data-ui-badge-state~="shape=circle"]):where([data-hn-ui-badge]) {
682
+ border-color: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-outline-surface)));
683
+ }
684
+ :scope[data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"][data-ui-badge-state~="shape=circle"]:where([data-hn-ui-badge]) {
685
+ --_badge-outline-surface: var(
686
+ --ui-badge-surface,
687
+ var(
688
+ --_badge-color-surface,
689
+ light-dark(
690
+ color-mix(
691
+ in srgb,
692
+ var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%),
693
+ transparent
694
+ ),
695
+ color-mix(
696
+ in srgb,
697
+ var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%),
698
+ transparent
699
+ )
700
+ )
701
+ )
702
+ );
679
703
  }
680
704
  :scope[data-ui-badge-state~="variant=outline"]:where([data-hn-ui-badge]) {
681
705
  --_badge-surface: var(--ui-surface-default);
@@ -1134,7 +1158,7 @@ svg,.arc {
1134
1158
  :scope:where([data-hn-ui-button]) {
1135
1159
  /* Optional inherited action-group values keep text and icon actions under the same light.
1136
1160
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
1137
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
1161
+ The shared theme supplies reflections and glow independently of the resting lift. */
1138
1162
  --_ui-action-start: 1px;
1139
1163
  --_ui-action-edge: var(
1140
1164
  --ui-action-edge,
@@ -1150,6 +1174,8 @@ svg,.arc {
1150
1174
  --_ui-action-shadow:
1151
1175
  var(--_ui-action-edge),
1152
1176
  0 1px 2px light-dark(rgb(0 0 0 / 0.10), rgb(0 0 0 / 0.20));
1177
+ --_tone-highlight: var(--ui-accent-highlight, none);
1178
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
1153
1179
  --_hue: var(--ui-accent);
1154
1180
  --_hue-hover: var(--ui-accent-hover);
1155
1181
  --_hue-active: var(--ui-accent-active);
@@ -1197,8 +1223,10 @@ svg,.arc {
1197
1223
  line-height: var(--ui-line-height-tight);
1198
1224
  padding: var(--ui-control-inset-block-md, var(--ui-space-2))
1199
1225
  var(--ui-action-inset-md, var(--ui-space-3)) !important;
1200
- background-image: none;
1201
- box-shadow: var(--ui-button-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
1226
+ background-image: var(--ui-surface-highlight, none);
1227
+ box-shadow:
1228
+ var(--ui-button-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
1229
+ var(--_tone-glow);
1202
1230
  cursor: pointer;
1203
1231
  transition:
1204
1232
  scale var(--ui-motion-press, var(--ui-motion-fast)) var(--ui-motion-ease),
@@ -1307,7 +1335,10 @@ svg,.arc {
1307
1335
  border-color: var(--_tone);
1308
1336
  background-color: var(--_tone);
1309
1337
  color: var(--_on-tone);
1310
- box-shadow: var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
1338
+ background-image: var(--_tone-highlight);
1339
+ box-shadow:
1340
+ var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
1341
+ var(--_tone-glow);
1311
1342
  }
1312
1343
  :is(:scope[data-appearance="solid"], :scope[data-appearance="danger"]):hover:not(:disabled, [aria-disabled="true"]):where([data-hn-ui-button]) {
1313
1344
  background-color: var(--_tone-hover);
@@ -1320,13 +1351,28 @@ svg,.arc {
1320
1351
  box-shadow: var(--ui-pressed);
1321
1352
  }
1322
1353
  :scope[data-tone="neutral"]:where([data-hn-ui-button]) {
1354
+ --_tone-highlight: var(--ui-neutral-highlight, none);
1355
+ --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
1323
1356
  --_hue: var(--ui-text);
1324
1357
  --_hue-hover: var(--ui-text);
1325
1358
  --_hue-active: var(--ui-text);
1326
1359
  --_hue-text: var(--ui-text);
1327
1360
  --_on-hue: var(--ui-surface);
1328
1361
  }
1362
+ :scope[data-tone="neutral"][data-appearance="solid"]:where([data-hn-ui-button]) {
1363
+ border-color: var(--ui-button-border, var(--ui-control-border));
1364
+ background-color: var(--ui-button-surface, var(--ui-neutral-surface));
1365
+ color: var(--ui-button-text, var(--ui-text));
1366
+ }
1367
+ :scope[data-tone="neutral"][data-appearance="solid"]:hover:not(:disabled, [aria-disabled="true"]):where([data-hn-ui-button]) {
1368
+ background-color: var(--ui-button-hover-surface, var(--ui-neutral-hover));
1369
+ }
1370
+ :scope[data-tone="neutral"][data-appearance="solid"]:active:not(:disabled, [aria-disabled="true"]):where([data-hn-ui-button]) {
1371
+ background-color: var(--ui-button-active-surface, var(--ui-neutral-active));
1372
+ }
1329
1373
  :scope[data-tone="danger"]:where([data-hn-ui-button]),:scope[data-appearance="danger"]:where([data-hn-ui-button]) {
1374
+ --_tone-highlight: var(--ui-danger-highlight, none);
1375
+ --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
1330
1376
  --_hue: var(--ui-danger);
1331
1377
  --_hue-hover: var(--ui-danger-hover);
1332
1378
  --_hue-active: var(--ui-danger-active, var(--ui-danger-hover));
@@ -1334,6 +1380,8 @@ svg,.arc {
1334
1380
  --_on-hue: var(--ui-on-danger);
1335
1381
  }
1336
1382
  :scope[data-tone="success"]:where([data-hn-ui-button]) {
1383
+ --_tone-highlight: var(--ui-success-highlight, none);
1384
+ --_tone-glow: var(--ui-success-glow, 0 0 transparent);
1337
1385
  --_hue: var(--ui-success);
1338
1386
  --_hue-hover: var(--ui-success-hover);
1339
1387
  --_hue-active: var(--ui-success-active);
@@ -1341,6 +1389,8 @@ svg,.arc {
1341
1389
  --_on-hue: var(--ui-success-on-strong);
1342
1390
  }
1343
1391
  :scope[data-tone="warning"]:where([data-hn-ui-button]) {
1392
+ --_tone-highlight: var(--ui-warning-highlight, none);
1393
+ --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
1344
1394
  --_hue: var(--ui-warning);
1345
1395
  --_hue-hover: var(--ui-warning-hover);
1346
1396
  --_hue-active: var(--ui-warning-active);
@@ -1348,6 +1398,8 @@ svg,.arc {
1348
1398
  --_on-hue: var(--ui-warning-on-strong);
1349
1399
  }
1350
1400
  :scope[data-tone="info"]:where([data-hn-ui-button]) {
1401
+ --_tone-highlight: var(--ui-info-highlight, none);
1402
+ --_tone-glow: var(--ui-info-glow, 0 0 transparent);
1351
1403
  --_hue: var(--ui-info);
1352
1404
  --_hue-hover: var(--ui-info-hover);
1353
1405
  --_hue-active: var(--ui-info-active);
@@ -1684,6 +1736,7 @@ html[data-ui-input-modality="touch"]
1684
1736
  @scope (.ui-card) to ([data-hn]) {
1685
1737
  :scope:where([data-hn-ui-card]) {
1686
1738
  --_ui-card-surface: var(--ui-surface-raised);
1739
+ --_ui-card-elevation: 0 0 0 transparent;
1687
1740
  --_ui-selection-context-surface: initial;
1688
1741
  --_ui-selection-context-border: initial;
1689
1742
  --_ui-selection-context-text: initial;
@@ -1714,10 +1767,11 @@ html[data-ui-input-modality="touch"]
1714
1767
  --_ui-card-surface: var(--ui-surface-muted);
1715
1768
  }
1716
1769
  :scope[data-ui-card-state~="variant=elevated"]:where([data-hn-ui-card]) {
1770
+ --_ui-card-elevation: var(--ui-shadow-lg);
1717
1771
  border-color: var(--ui-border-subtle);
1718
1772
  box-shadow: var(--ui-shadow-lg);
1719
1773
  }
1720
- :scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card]) {
1774
+ :scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card]) {
1721
1775
  --_ui-panel-glass: clamp(0, var(--ui-glassiness, 0), 1);
1722
1776
  --_ui-panel-separation: clamp(0, var(--ui-surface-separation, 0), 1);
1723
1777
  --_ui-panel-rim: calc(
@@ -1726,6 +1780,7 @@ html[data-ui-input-modality="touch"]
1726
1780
  border-width: calc(var(--ui-border-width) + var(--_ui-panel-rim));
1727
1781
  border-color: transparent;
1728
1782
  background:
1783
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
1729
1784
  linear-gradient(var(--_ui-card-surface), var(--_ui-card-surface)) padding-box,
1730
1785
  linear-gradient(
1731
1786
  var(--ui-material-glass, var(--ui-surface-raised)),
@@ -1733,7 +1788,8 @@ html[data-ui-input-modality="touch"]
1733
1788
  ) border-box,
1734
1789
  var(--_ui-card-surface) padding-box;
1735
1790
  box-shadow:
1736
- var(--ui-shadow-lg),
1791
+ var(--_ui-card-elevation),
1792
+ var(--ui-material-glow, 0 0 transparent),
1737
1793
  inset 0 0 0 var(--ui-border-width) var(--ui-material-edge, var(--ui-border-strong));
1738
1794
  backdrop-filter: blur(calc(var(--_ui-panel-glass) * 0.65 * 18px))
1739
1795
  saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
@@ -1741,12 +1797,12 @@ html[data-ui-input-modality="touch"]
1741
1797
  saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
1742
1798
  }
1743
1799
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
1744
- :scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card]) {
1800
+ :scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card]) {
1745
1801
  background: var(--_ui-card-surface);
1746
1802
  }
1747
1803
  }
1748
1804
  @media (prefers-reduced-transparency: reduce) {
1749
- :scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card]) {
1805
+ :scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card]) {
1750
1806
  background: var(--_ui-card-surface);
1751
1807
  border-width: var(--ui-border-width);
1752
1808
  border-color: var(--ui-border-strong);
@@ -1755,7 +1811,7 @@ html[data-ui-input-modality="touch"]
1755
1811
  }
1756
1812
  }
1757
1813
  @media (forced-colors: active) {
1758
- :scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card]) {
1814
+ :scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card]) {
1759
1815
  background: Canvas;
1760
1816
  color: CanvasText;
1761
1817
  border: var(--ui-border-width) solid CanvasText;
@@ -1785,10 +1841,6 @@ html[data-ui-input-modality="touch"]
1785
1841
  }
1786
1842
  :scope[data-ui-card-state~="tone=danger"]:where([data-hn-ui-card]) {
1787
1843
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
1788
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
1789
- /* An accent edge keeps the corners on its side straight. */
1790
- border-start-start-radius: 0;
1791
- border-end-start-radius: 0;
1792
1844
  --_ui-card-surface: var(--ui-danger-soft);
1793
1845
  }
1794
1846
  :scope[data-ui-card-state~="tone=accent"]:where([data-hn-ui-card]),:scope[data-ui-card-state~="tone=info"]:where([data-hn-ui-card]),:scope[data-ui-card-state~="tone=success"]:where([data-hn-ui-card]),:scope[data-ui-card-state~="tone=warning"]:where([data-hn-ui-card]),:scope[data-ui-card-state~="tone=danger"]:where([data-hn-ui-card]) {
@@ -1836,7 +1888,7 @@ html[data-ui-input-modality="touch"]
1836
1888
  /* The label, and under it an optional line saying what the choice means. */
1837
1889
 
1838
1890
  /* Centre the tick's box and lift it slightly for the rotated check shape. */
1839
- @keyframes ui-checkbox-check-0e08e52b {
1891
+ @keyframes ui-checkbox-check-4950a023 {
1840
1892
  from {
1841
1893
  opacity: 0;
1842
1894
  transform: translateY(calc(var(--_ui-checkbox-size) * -0.09 / 1.125)) rotate(45deg) scale(0.55);
@@ -1924,7 +1976,8 @@ input:where([data-hn-ui-checkbox]) {
1924
1976
  margin: max(0px, calc((1lh - var(--_ui-checkbox-size, 1.125rem)) / 2)) 0 0 !important;
1925
1977
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
1926
1978
  border-radius: min(var(--ui-radius-sm), calc(var(--_ui-checkbox-size, 1.125rem) / 4));
1927
- background: var(--ui-control-surface, var(--ui-surface-default));
1979
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
1980
+ background-image: var(--ui-surface-highlight, none);
1928
1981
  box-shadow: var(--ui-control-inset);
1929
1982
  cursor: pointer;
1930
1983
  transition:
@@ -1940,7 +1993,8 @@ input:where([data-hn-ui-checkbox])::after {
1940
1993
  }
1941
1994
  input:checked:where([data-hn-ui-checkbox]),input:indeterminate:where([data-hn-ui-checkbox]) {
1942
1995
  border-color: var(--ui-accent-solid);
1943
- background: var(--ui-accent-solid);
1996
+ background-color: var(--ui-accent-solid);
1997
+ background-image: var(--ui-accent-highlight, none);
1944
1998
  box-shadow: var(--ui-control-inset);
1945
1999
  }
1946
2000
  input:checked:where([data-hn-ui-checkbox])::after {
@@ -1956,7 +2010,7 @@ input:checked:where([data-hn-ui-checkbox])::after {
1956
2010
  calc(var(--_ui-checkbox-size) * 0.125 / 1.125) 0;
1957
2011
  opacity: 1;
1958
2012
  transform: translateY(calc(var(--_ui-checkbox-size) * -0.09 / 1.125)) rotate(45deg);
1959
- animation: ui-checkbox-check-0e08e52b var(--ui-motion-base) var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
2013
+ animation: ui-checkbox-check-4950a023 var(--ui-motion-base) var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
1960
2014
  }
1961
2015
  input:indeterminate:where([data-hn-ui-checkbox])::after {
1962
2016
  inset: 50% calc(var(--_ui-checkbox-size) * 0.23 / 1.125) auto;
@@ -2204,10 +2258,11 @@ input:focus-visible:where([data-hn-ui-checkbox]) {
2204
2258
  --ui-input-radius,
2205
2259
  var(--_ui-default-input-radius, var(--ui-field-radius, var(--ui-radius-md)))
2206
2260
  );
2207
- background: var(
2261
+ background-color: var(
2208
2262
  --ui-input-surface,
2209
2263
  var(--_ui-default-input-surface, var(--ui-control-surface, var(--ui-surface-elevated)))
2210
2264
  );
2265
+ background-image: var(--_ui-default-input-highlight, var(--ui-surface-highlight, none));
2211
2266
  color: var(--ui-text-primary);
2212
2267
  font: inherit;
2213
2268
  line-height: var(--ui-line-height-tight);
@@ -3761,7 +3816,9 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3761
3816
  :scope:where([data-hn-ui-icon-button]) {
3762
3817
  /* Optional inherited action-group values keep text and icon actions under the same light.
3763
3818
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
3764
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
3819
+ The shared theme supplies reflections and glow independently of the resting lift. */
3820
+ --_tone-highlight: var(--ui-accent-highlight, none);
3821
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
3765
3822
  --_ui-action-start: 1px;
3766
3823
  --_ui-action-edge: var(
3767
3824
  --ui-action-edge,
@@ -3788,6 +3845,8 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3788
3845
  --_ui-action-start: -1px;
3789
3846
  }
3790
3847
  :scope[data-tone="accent"]:where([data-hn-ui-icon-button]) {
3848
+ --_tone-highlight: var(--ui-accent-highlight, none);
3849
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
3791
3850
  --_icon-button-border: var(--ui-accent-solid);
3792
3851
  --_icon-button-hover-border: var(--ui-accent-hover);
3793
3852
  --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
@@ -3799,6 +3858,8 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3799
3858
  color: var(--_icon-button-text);
3800
3859
  }
3801
3860
  :scope[data-tone="danger"]:where([data-hn-ui-icon-button]) {
3861
+ --_tone-highlight: var(--ui-danger-highlight, none);
3862
+ --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
3802
3863
  --_icon-button-border: var(--ui-danger);
3803
3864
  --_icon-button-hover-border: var(--ui-danger-hover);
3804
3865
  --_icon-button-text: var(--ui-danger-subtle-text);
@@ -3813,6 +3874,8 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3813
3874
  color: var(--_icon-button-text);
3814
3875
  }
3815
3876
  :scope[data-tone="success"]:where([data-hn-ui-icon-button]) {
3877
+ --_tone-highlight: var(--ui-success-highlight, none);
3878
+ --_tone-glow: var(--ui-success-glow, 0 0 transparent);
3816
3879
  --_icon-button-border: var(--ui-success);
3817
3880
  --_icon-button-hover-border: var(--ui-success-hover);
3818
3881
  --_icon-button-text: var(--ui-success-subtle-text);
@@ -3827,6 +3890,8 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3827
3890
  color: var(--_icon-button-text);
3828
3891
  }
3829
3892
  :scope[data-tone="warning"]:where([data-hn-ui-icon-button]) {
3893
+ --_tone-highlight: var(--ui-warning-highlight, none);
3894
+ --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
3830
3895
  --_icon-button-border: var(--ui-warning);
3831
3896
  --_icon-button-hover-border: var(--ui-warning-hover);
3832
3897
  --_icon-button-text: var(--ui-warning-subtle-text);
@@ -3841,6 +3906,8 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3841
3906
  color: var(--_icon-button-text);
3842
3907
  }
3843
3908
  :scope[data-tone="info"]:where([data-hn-ui-icon-button]) {
3909
+ --_tone-highlight: var(--ui-info-highlight, none);
3910
+ --_tone-glow: var(--ui-info-glow, 0 0 transparent);
3844
3911
  --_icon-button-border: var(--ui-info);
3845
3912
  --_icon-button-hover-border: var(--ui-info-hover);
3846
3913
  --_icon-button-text: var(--ui-info-subtle-text);
@@ -3855,9 +3922,11 @@ button:where(:scope, :scope *):where([data-hn-ui-combobox]) {
3855
3922
  color: var(--_icon-button-text);
3856
3923
  }
3857
3924
  :scope[data-tone="neutral"]:where([data-hn-ui-icon-button]) {
3858
- --_icon-button-solid-surface: var(--ui-text-primary);
3859
- --_icon-button-solid-hover-surface: var(--ui-text-primary);
3860
- --_icon-button-solid-text: var(--ui-surface-default);
3925
+ --_tone-highlight: var(--ui-neutral-highlight, none);
3926
+ --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
3927
+ --_icon-button-solid-surface: var(--ui-neutral-surface);
3928
+ --_icon-button-solid-hover-surface: var(--ui-neutral-hover);
3929
+ --_icon-button-solid-text: var(--ui-text);
3861
3930
  }
3862
3931
  :scope[data-ui-icon-button-state~="anticipatory"]:where([data-hn-ui-icon-button]) {
3863
3932
  position: relative;
@@ -4013,24 +4082,25 @@ html[data-ui-input-modality="touch"] :scope:where([data-hn-ui-icon-button])::aft
4013
4082
  --ui-icon-button-outline-surface,
4014
4083
  var(--_icon-button-outline-surface, var(--ui-surface-default))
4015
4084
  );
4016
- background-image: none;
4085
+ background-image: var(--ui-surface-highlight, none);
4017
4086
  color: var(--ui-icon-button-outline-text, var(--_icon-button-text, var(--ui-text-primary)));
4018
- box-shadow: var(--ui-action-shadow, var(--_ui-action-shadow));
4087
+ box-shadow:
4088
+ var(--ui-action-shadow, var(--_ui-action-shadow)),
4089
+ var(--_tone-glow);
4019
4090
  }
4020
4091
  :scope[data-appearance="solid"]:where([data-hn-ui-icon-button]) {
4021
4092
  background-color: var(
4022
4093
  --ui-icon-button-solid-surface,
4023
4094
  var(--_icon-button-solid-surface, var(--ui-accent-solid))
4024
4095
  );
4025
- background-image: none;
4096
+ background-image: var(--_tone-highlight);
4026
4097
  color: var(
4027
4098
  --ui-icon-button-solid-text,
4028
4099
  var(--_icon-button-solid-text, var(--ui-text-on-accent))
4029
4100
  );
4030
- box-shadow: var(
4031
- --ui-icon-button-solid-shadow,
4032
- var(--ui-action-shadow, var(--_ui-action-shadow))
4033
- );
4101
+ box-shadow:
4102
+ var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
4103
+ var(--_tone-glow);
4034
4104
  }
4035
4105
  :scope:hover:enabled:not([aria-disabled="true"]):where([data-hn-ui-icon-button]) {
4036
4106
  /* Derived from the text colour so the ghost hover shows on any background. */
@@ -4514,13 +4584,13 @@ dd:where([data-hn-ui-description-item]) {
4514
4584
  /* A CSS-drawn X. */
4515
4585
 
4516
4586
  /* A touch target, like Button on coarse pointers. */
4517
- @keyframes ui-dialog-enter-ea8be62a {
4587
+ @keyframes ui-dialog-enter-0eef3ecb {
4518
4588
  from {
4519
4589
  opacity: 0;
4520
4590
  transform: scale(0.96);
4521
4591
  }
4522
4592
  }
4523
- @keyframes ui-dialog-backdrop-enter-ea8be62a {
4593
+ @keyframes ui-dialog-backdrop-enter-0eef3ecb {
4524
4594
  from {
4525
4595
  background-color: transparent;
4526
4596
  }
@@ -4588,6 +4658,7 @@ from {
4588
4658
  transparent
4589
4659
  );
4590
4660
  background:
4661
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
4591
4662
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color))
4592
4663
  padding-box,
4593
4664
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
@@ -4610,6 +4681,7 @@ from {
4610
4681
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(
4611
4682
  var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px
4612
4683
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
4684
+ var(--ui-material-glow, 0 0 transparent),
4613
4685
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(
4614
4686
  --ui-material-edge,
4615
4687
  var(--ui-border-strong)
@@ -4651,7 +4723,7 @@ from {
4651
4723
  pointer-events: auto;
4652
4724
  opacity: 1;
4653
4725
  transform: scale(1);
4654
- animation: ui-dialog-enter-ea8be62a var(--ui-dialog-duration, var(--ui-motion-base))
4726
+ animation: ui-dialog-enter-0eef3ecb var(--ui-dialog-duration, var(--ui-motion-base))
4655
4727
  var(--ui-motion-ease);
4656
4728
  }
4657
4729
  :scope[data-ui-dialog-state~="size=sm"]:where([data-hn-ui-dialog]) {
@@ -4772,7 +4844,7 @@ footer:empty:where([data-hn-ui-dialog]) {
4772
4844
  }
4773
4845
  :scope[open]:modal:where([data-hn-ui-dialog])::backdrop {
4774
4846
  background-color: var(--ui-overlay-backdrop);
4775
- animation: ui-dialog-backdrop-enter-ea8be62a var(--_ui-dialog-duration, var(--ui-motion-base))
4847
+ animation: ui-dialog-backdrop-enter-0eef3ecb var(--_ui-dialog-duration, var(--ui-motion-base))
4776
4848
  var(--ui-motion-ease);
4777
4849
  }
4778
4850
  :scope[open][data-ui-backdrop-hidden]:where([data-hn-ui-dialog])::backdrop {
@@ -4844,6 +4916,7 @@ footer:empty:where([data-hn-ui-dialog]) {
4844
4916
  transparent
4845
4917
  );
4846
4918
  background:
4919
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
4847
4920
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color))
4848
4921
  padding-box,
4849
4922
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
@@ -4866,6 +4939,7 @@ footer:empty:where([data-hn-ui-dialog]) {
4866
4939
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(
4867
4940
  var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px
4868
4941
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
4942
+ var(--ui-material-glow, 0 0 transparent),
4869
4943
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(
4870
4944
  --ui-material-edge,
4871
4945
  var(--ui-border-strong)
@@ -4907,7 +4981,7 @@ footer:empty:where([data-hn-ui-dialog]) {
4907
4981
  pointer-events: auto;
4908
4982
  opacity: 1;
4909
4983
  transform: scale(1);
4910
- animation: ui-dialog-enter-ea8be62a var(--ui-dialog-duration, var(--ui-motion-base))
4984
+ animation: ui-dialog-enter-0eef3ecb var(--ui-dialog-duration, var(--ui-motion-base))
4911
4985
  var(--ui-motion-ease);
4912
4986
  }
4913
4987
  :where(.ui-dialog)[data-ui-dialog-state~="size=sm"]:where(:scope, :not([data-hn], [data-slotted]:not([data-slotted~="ui-dialog"]))):where([data-hn-ui-dialog]) {
@@ -5036,7 +5110,7 @@ footer:empty:where(:scope, :scope *):where([data-hn-ui-dialog]) {
5036
5110
  }
5037
5111
  :where(.ui-dialog)[open]:modal:where(:scope, :not([data-hn], [data-slotted]:not([data-slotted~="ui-dialog"]))):where([data-hn-ui-dialog])::backdrop {
5038
5112
  background-color: var(--ui-overlay-backdrop);
5039
- animation: ui-dialog-backdrop-enter-ea8be62a var(--_ui-dialog-duration, var(--ui-motion-base))
5113
+ animation: ui-dialog-backdrop-enter-0eef3ecb var(--_ui-dialog-duration, var(--ui-motion-base))
5040
5114
  var(--ui-motion-ease);
5041
5115
  }
5042
5116
  :where(.ui-dialog)[open][data-ui-backdrop-hidden]:where(:scope, :not([data-hn], [data-slotted]:not([data-slotted~="ui-dialog"]))):where([data-hn-ui-dialog])::backdrop {
@@ -5481,6 +5555,7 @@ footer:empty:where(:scope, :scope *):where([data-hn-ui-dialog]) {
5481
5555
  transparent
5482
5556
  );
5483
5557
  background:
5558
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
5484
5559
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color))
5485
5560
  padding-box,
5486
5561
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
@@ -5503,6 +5578,7 @@ footer:empty:where(:scope, :scope *):where([data-hn-ui-dialog]) {
5503
5578
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px) calc(
5504
5579
  var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 24px
5505
5580
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
5581
+ var(--ui-material-glow, 0 0 transparent),
5506
5582
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(
5507
5583
  --ui-material-edge,
5508
5584
  var(--ui-border-strong)
@@ -6085,6 +6161,7 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
6085
6161
  --_ui-default-input-focus-outline: none;
6086
6162
  --_ui-default-input-radius: 0;
6087
6163
  --_ui-default-input-surface: transparent;
6164
+ --_ui-default-input-highlight: none;
6088
6165
  --_ui-default-textarea-border-width: 0;
6089
6166
  --_ui-default-textarea-border: transparent;
6090
6167
  --_ui-default-textarea-border-hover: transparent;
@@ -6096,6 +6173,7 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
6096
6173
  --_ui-default-textarea-focus-outline: none;
6097
6174
  --_ui-default-textarea-radius: 0;
6098
6175
  --_ui-default-textarea-surface: transparent;
6176
+ --_ui-default-textarea-highlight: none;
6099
6177
 
6100
6178
  display: flex !important;
6101
6179
  align-items: stretch !important;
@@ -6106,7 +6184,8 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
6106
6184
  /* The frame reads the shared control tokens with a lone Input's fallbacks, so the two match. */
6107
6185
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
6108
6186
  border-radius: var(--ui-input-group-radius, var(--ui-field-radius, var(--ui-radius-md)));
6109
- background: var(--ui-control-surface, var(--ui-surface-elevated));
6187
+ background-color: var(--ui-control-surface, var(--ui-surface-elevated));
6188
+ background-image: var(--ui-surface-highlight, none);
6110
6189
  box-shadow: var(--ui-control-inset);
6111
6190
  overflow: hidden;
6112
6191
  /* A press anywhere in the frame focuses the input. */
@@ -6333,10 +6412,11 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
6333
6412
  --ui-textarea-radius,
6334
6413
  var(--_ui-default-textarea-radius, var(--ui-field-radius, var(--ui-radius-md)))
6335
6414
  );
6336
- background: var(
6415
+ background-color: var(
6337
6416
  --ui-textarea-surface,
6338
6417
  var(--_ui-default-textarea-surface, var(--ui-control-surface, var(--ui-surface-elevated)))
6339
6418
  );
6419
+ background-image: var(--_ui-default-textarea-highlight, var(--ui-surface-highlight, none));
6340
6420
  color: var(--ui-text-primary);
6341
6421
  font: inherit;
6342
6422
  line-height: var(--ui-line-height-md);
@@ -6701,6 +6781,7 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
6701
6781
  transparent
6702
6782
  );
6703
6783
  background:
6784
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
6704
6785
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color))
6705
6786
  padding-box,
6706
6787
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
@@ -6723,6 +6804,7 @@ legend.sr-only:where([data-hn-ui-radio-group]) {
6723
6804
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px) calc(
6724
6805
  var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 24px
6725
6806
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
6807
+ var(--ui-material-glow, 0 0 transparent),
6726
6808
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(
6727
6809
  --ui-material-edge,
6728
6810
  var(--ui-border-strong)
@@ -8511,6 +8593,109 @@ ul:where([data-hn-ui-editor-slash-menu-group]) {
8511
8593
  }
8512
8594
  }
8513
8595
 
8596
+ @scope (.ui-light-editor) to ([data-hn]) {
8597
+ :scope:where([data-hn-ui-light-editor]) {
8598
+ display: grid !important;
8599
+ gap: var(--ui-space-3) !important;
8600
+ min-inline-size: 0;
8601
+ padding: 0 !important;
8602
+ margin: 0 !important;
8603
+ }
8604
+ .stage:where([data-hn-ui-light-editor]) {
8605
+ box-sizing: border-box !important;
8606
+ display: block !important;
8607
+ block-size: 13rem;
8608
+ padding: calc(var(--ui-control-min-block-size) / 2) !important;
8609
+ border: var(--ui-border-width) solid var(--ui-control-border);
8610
+ border-radius: var(--ui-field-radius, var(--ui-radius-md));
8611
+ background: var(--ui-neutral-surface, var(--ui-surface));
8612
+ }
8613
+ .plane:where([data-hn-ui-light-editor]) {
8614
+ position: relative;
8615
+ display: block !important;
8616
+ inline-size: 100%;
8617
+ block-size: 100%;
8618
+ }
8619
+ svg:where([data-hn-ui-light-editor]) {
8620
+ inline-size: 100%;
8621
+ block-size: 100%;
8622
+ overflow: visible;
8623
+ }
8624
+ path:where([data-hn-ui-light-editor]) {
8625
+ fill: none;
8626
+ stroke: var(--ui-border);
8627
+ stroke-width: 1;
8628
+ vector-effect: non-scaling-stroke;
8629
+ }
8630
+ .specimen:where([data-hn-ui-light-editor]) {
8631
+ position: absolute;
8632
+ inset: 0;
8633
+ display: grid !important;
8634
+ place-items: center !important;
8635
+ }
8636
+ .source:where([data-hn-ui-light-editor]) {
8637
+ position: absolute;
8638
+ left: 50%;
8639
+ top: 0;
8640
+ translate: -50% -50%;
8641
+ display: grid !important;
8642
+ place-items: center !important;
8643
+ inline-size: max(2rem, var(--ui-control-min-block-size));
8644
+ block-size: max(2rem, var(--ui-control-min-block-size));
8645
+ padding: 0 !important;
8646
+ margin: 0 !important;
8647
+ border: 0;
8648
+ border-radius: 50%;
8649
+ background: transparent;
8650
+ cursor: grab;
8651
+ touch-action: none;
8652
+ }
8653
+ .source:where([data-hn-ui-light-editor])::after {
8654
+ content: "";
8655
+ inline-size: 1rem;
8656
+ block-size: 1rem;
8657
+ border: var(--ui-border-width) solid var(--ui-accent);
8658
+ border-radius: 50%;
8659
+ background: var(--ui-surface-raised);
8660
+ box-shadow:
8661
+ 0 0 0 var(--ui-space-2) color-mix(in srgb, var(--ui-accent) 12%, transparent),
8662
+ var(--ui-shadow-sm);
8663
+ }
8664
+ .source:active:where([data-hn-ui-light-editor]) {
8665
+ cursor: grabbing;
8666
+ }
8667
+ .source:focus-visible:where([data-hn-ui-light-editor]) {
8668
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
8669
+ outline-offset: var(--ui-space-1);
8670
+ }
8671
+ .source:disabled:where([data-hn-ui-light-editor]) {
8672
+ cursor: not-allowed;
8673
+ }
8674
+ .source:disabled:where([data-hn-ui-light-editor])::after {
8675
+ background: var(--ui-disabled-surface);
8676
+ border-color: var(--ui-disabled-border);
8677
+ box-shadow: none;
8678
+ }
8679
+ .coordinates:where([data-hn-ui-light-editor]) {
8680
+ display: grid !important;
8681
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
8682
+ gap: var(--ui-space-2) !important;
8683
+ }
8684
+ .hint:where([data-hn-ui-light-editor]) {
8685
+ font-size: var(--ui-font-size-sm);
8686
+ color: var(--ui-text-secondary);
8687
+ }
8688
+ @media (forced-colors: active) {
8689
+ .source:where([data-hn-ui-light-editor])::after {
8690
+ background: Canvas;
8691
+ border-color: CanvasText;
8692
+ }
8693
+ .source:focus-visible:where([data-hn-ui-light-editor]) {
8694
+ outline-color: Highlight;
8695
+ }
8696
+ }
8697
+ }
8698
+
8514
8699
  /* This component's hooks style the element they are set on, and never a nested one. */
8515
8700
  @property --ui-list-gap {
8516
8701
  syntax: "*";
@@ -9893,7 +10078,7 @@ dialog:where([data-hn-ui-search-shell]) {
9893
10078
  var(--ui-control-surface, var(--ui-surface-elevated))
9894
10079
  );
9895
10080
  color: var(--ui-text-primary);
9896
- color-scheme: light dark;
10081
+ color-scheme: inherit;
9897
10082
  font: inherit;
9898
10083
  line-height: var(--ui-line-height-tight);
9899
10084
  box-shadow: var(--ui-select-shadow, var(--ui-shadow-sm));
@@ -9903,15 +10088,18 @@ dialog:where([data-hn-ui-search-shell]) {
9903
10088
  background-color var(--ui-motion-fast) var(--ui-motion-ease);
9904
10089
  }
9905
10090
  :scope:where([data-hn-ui-select]) {
10091
+ --_ui-select-highlight: var(--ui-surface-highlight, linear-gradient(transparent, transparent));
9906
10092
  appearance: none;
9907
10093
  padding-inline-end: calc(var(--ui-space-3) + 1.5rem) !important;
9908
- background-image: var(
9909
- --ui-select-chevron,
9910
- url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235c5c58' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")
9911
- );
10094
+ background-image:
10095
+ var(
10096
+ --ui-select-chevron,
10097
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235c5c58' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")
10098
+ ),
10099
+ var(--_ui-select-highlight);
9912
10100
  background-repeat: no-repeat;
9913
- background-position: right var(--ui-space-3) center;
9914
- background-size: 1.125rem 1.125rem;
10101
+ background-position: right var(--ui-space-3) center, center;
10102
+ background-size: 1.125rem 1.125rem, 100% 100%;
9915
10103
  }
9916
10104
  :scope:hover:not(:focus):not(:disabled):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])):where([data-hn-ui-select]) {
9917
10105
  border-color: var(
@@ -9943,6 +10131,7 @@ dialog:where([data-hn-ui-search-shell]) {
9943
10131
  );
9944
10132
  }
9945
10133
  :scope:disabled:where([data-hn-ui-select]) {
10134
+ --_ui-select-highlight: none;
9946
10135
  background-color: var(--ui-control-surface-disabled, var(--ui-surface-muted));
9947
10136
  color: var(--ui-disabled-text);
9948
10137
  box-shadow: none;
@@ -9953,15 +10142,17 @@ dialog:where([data-hn-ui-search-shell]) {
9953
10142
  padding: var(--ui-control-inset-block-sm, var(--ui-space-1)) var(--ui-space-2) !important;
9954
10143
  padding-inline-end: calc(var(--ui-space-2) + var(--ui-icon-size-sm) + var(--ui-space-1))
9955
10144
  !important;
9956
- background-position: right var(--ui-space-2) center;
9957
- background-size: var(--ui-icon-size-sm) var(--ui-icon-size-sm);
10145
+ background-position: right var(--ui-space-2) center, center;
10146
+ background-size:
10147
+ var(--ui-icon-size-sm) var(--ui-icon-size-sm),
10148
+ 100% 100%;
9958
10149
  font-size: var(--ui-font-size-sm);
9959
10150
  }
9960
10151
  :scope[data-ui-select-state~="size=lg"]:where([data-hn-ui-select]) {
9961
10152
  min-block-size: var(--ui-control-size-lg);
9962
10153
  padding: var(--ui-control-inset-block-lg, var(--ui-space-3)) var(--ui-space-4) !important;
9963
10154
  padding-inline-end: calc(var(--ui-space-4) + 1.5rem) !important;
9964
- background-position: right var(--ui-space-4) center;
10155
+ background-position: right var(--ui-space-4) center, center;
9965
10156
  font-size: var(--ui-font-size-md);
9966
10157
  }
9967
10158
  @media (pointer: coarse) {
@@ -10418,6 +10609,7 @@ input:where([data-hn-ui-switch]) {
10418
10609
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
10419
10610
  border-radius: var(--ui-radius-round);
10420
10611
  background-color: var(--ui-control-surface, var(--ui-surface-default));
10612
+ background-image: var(--ui-surface-highlight, none);
10421
10613
  box-shadow: var(--ui-control-inset);
10422
10614
  cursor: pointer;
10423
10615
  transition:
@@ -10441,6 +10633,7 @@ input:where([data-hn-ui-switch])::after {
10441
10633
  }
10442
10634
  input:checked:where([data-hn-ui-switch]) {
10443
10635
  background-color: var(--ui-accent-solid);
10636
+ background-image: var(--ui-accent-highlight, none);
10444
10637
  border-color: var(--ui-accent-solid);
10445
10638
  }
10446
10639
  input:checked:where([data-hn-ui-switch])::after {
@@ -10461,6 +10654,7 @@ input:focus-visible:where([data-hn-ui-switch]) {
10461
10654
  :scope[data-ui-switch-state~="disabled"] input:where([data-hn-ui-switch]) {
10462
10655
  border-color: var(--ui-disabled-border);
10463
10656
  background-color: var(--ui-disabled-surface);
10657
+ background-image: none;
10464
10658
  box-shadow: none;
10465
10659
  cursor: not-allowed;
10466
10660
  }
@@ -13335,7 +13529,7 @@ html[data-ui-input-modality="touch"]
13335
13529
  :scope:where([data-component~="ui-button"]) {
13336
13530
  /* Optional inherited action-group values keep text and icon actions under the same light.
13337
13531
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
13338
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
13532
+ The shared theme supplies reflections and glow independently of the resting lift. */
13339
13533
  --_ui-action-start: 1px;
13340
13534
  --_ui-action-edge: var(
13341
13535
  --ui-action-edge,
@@ -13343,6 +13537,8 @@ html[data-ui-input-modality="touch"]
13343
13537
  inset calc(-1 * var(--_ui-action-start)) -1px 0 light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.08))
13344
13538
  );
13345
13539
  --_ui-action-shadow: var(--_ui-action-edge), 0 1px 2px light-dark(rgb(0 0 0 / 0.10), rgb(0 0 0 / 0.20));
13540
+ --_tone-highlight: var(--ui-accent-highlight, none);
13541
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
13346
13542
  --_hue: var(--ui-accent);
13347
13543
  --_hue-hover: var(--ui-accent-hover);
13348
13544
  --_hue-active: var(--ui-accent-active);
@@ -13393,8 +13589,8 @@ html[data-ui-input-modality="touch"]
13393
13589
  white-space: var(--ui-button-white-space, inherit);
13394
13590
  line-height: var(--ui-line-height-tight);
13395
13591
  padding: var(--ui-control-inset-block-md, var(--ui-space-2)) var(--ui-action-inset-md, var(--ui-space-3)) !important;
13396
- background-image: none;
13397
- box-shadow: var(--ui-button-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
13592
+ background-image: var(--ui-surface-highlight, none);
13593
+ box-shadow: var(--ui-button-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))), var(--_tone-glow);
13398
13594
  cursor: pointer;
13399
13595
  transition:
13400
13596
  scale var(--ui-motion-press, var(--ui-motion-fast)) var(--ui-motion-ease),
@@ -13526,7 +13722,8 @@ html[data-ui-input-modality="touch"]
13526
13722
  border-color: var(--_tone);
13527
13723
  background-color: var(--_tone);
13528
13724
  color: var(--_on-tone);
13529
- box-shadow: var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
13725
+ background-image: var(--_tone-highlight);
13726
+ box-shadow: var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))), var(--_tone-glow);
13530
13727
  }
13531
13728
 
13532
13729
  :is(:scope:where([data-component~="ui-button"])[data-appearance="solid"], :scope:where([data-component~="ui-button"])[data-appearance="danger"]):hover:not(:disabled, [aria-disabled="true"]) {
@@ -13544,6 +13741,8 @@ html[data-ui-input-modality="touch"]
13544
13741
  /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
13545
13742
  destructive secondary action, not a special case. */
13546
13743
  :scope:where([data-component~="ui-button"])[data-tone="neutral"] {
13744
+ --_tone-highlight: var(--ui-neutral-highlight, none);
13745
+ --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
13547
13746
  --_hue: var(--ui-text);
13548
13747
  --_hue-hover: var(--ui-text);
13549
13748
  --_hue-active: var(--ui-text);
@@ -13551,7 +13750,21 @@ html[data-ui-input-modality="touch"]
13551
13750
  --_on-hue: var(--ui-surface);
13552
13751
  }
13553
13752
 
13753
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"][data-appearance="solid"] {
13754
+ border-color: var(--ui-button-border, var(--ui-control-border));
13755
+ background-color: var(--ui-button-surface, var(--ui-neutral-surface));
13756
+ color: var(--ui-button-text, var(--ui-text));
13757
+ }
13758
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"][data-appearance="solid"]:hover:not(:disabled, [aria-disabled="true"]) {
13759
+ background-color: var(--ui-button-hover-surface, var(--ui-neutral-hover));
13760
+ }
13761
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"][data-appearance="solid"]:active:not(:disabled, [aria-disabled="true"]) {
13762
+ background-color: var(--ui-button-active-surface, var(--ui-neutral-active));
13763
+ }
13764
+
13554
13765
  :scope:where([data-component~="ui-button"])[data-tone="danger"], :scope:where([data-component~="ui-button"])[data-appearance="danger"] {
13766
+ --_tone-highlight: var(--ui-danger-highlight, none);
13767
+ --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
13555
13768
  --_hue: var(--ui-danger);
13556
13769
  --_hue-hover: var(--ui-danger-hover);
13557
13770
  --_hue-active: var(--ui-danger-active, var(--ui-danger-hover));
@@ -13560,6 +13773,8 @@ html[data-ui-input-modality="touch"]
13560
13773
  }
13561
13774
 
13562
13775
  :scope:where([data-component~="ui-button"])[data-tone="success"] {
13776
+ --_tone-highlight: var(--ui-success-highlight, none);
13777
+ --_tone-glow: var(--ui-success-glow, 0 0 transparent);
13563
13778
  --_hue: var(--ui-success);
13564
13779
  --_hue-hover: var(--ui-success-hover);
13565
13780
  --_hue-active: var(--ui-success-active);
@@ -13568,6 +13783,8 @@ html[data-ui-input-modality="touch"]
13568
13783
  }
13569
13784
 
13570
13785
  :scope:where([data-component~="ui-button"])[data-tone="warning"] {
13786
+ --_tone-highlight: var(--ui-warning-highlight, none);
13787
+ --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
13571
13788
  --_hue: var(--ui-warning);
13572
13789
  --_hue-hover: var(--ui-warning-hover);
13573
13790
  --_hue-active: var(--ui-warning-active);
@@ -13576,6 +13793,8 @@ html[data-ui-input-modality="touch"]
13576
13793
  }
13577
13794
 
13578
13795
  :scope:where([data-component~="ui-button"])[data-tone="info"] {
13796
+ --_tone-highlight: var(--ui-info-highlight, none);
13797
+ --_tone-glow: var(--ui-info-glow, 0 0 transparent);
13579
13798
  --_hue: var(--ui-info);
13580
13799
  --_hue-hover: var(--ui-info-hover);
13581
13800
  --_hue-active: var(--ui-info-active);
@@ -14210,7 +14429,9 @@ html[data-ui-input-modality="touch"]
14210
14429
  :scope:where([data-component~="ui-icon-button"]) {
14211
14430
  /* Optional inherited action-group values keep text and icon actions under the same light.
14212
14431
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
14213
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
14432
+ The shared theme supplies reflections and glow independently of the resting lift. */
14433
+ --_tone-highlight: var(--ui-accent-highlight, none);
14434
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
14214
14435
  --_ui-action-start: 1px;
14215
14436
  --_ui-action-edge: var(
14216
14437
  --ui-action-edge,
@@ -14231,6 +14452,8 @@ html[data-ui-input-modality="touch"]
14231
14452
  }
14232
14453
 
14233
14454
  :scope:where([data-component~="ui-icon-button"])[data-tone="accent"] {
14455
+ --_tone-highlight: var(--ui-accent-highlight, none);
14456
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
14234
14457
  --_icon-button-border: var(--ui-accent-solid);
14235
14458
  --_icon-button-hover-border: var(--ui-accent-hover);
14236
14459
  --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
@@ -14239,6 +14462,8 @@ html[data-ui-input-modality="touch"]
14239
14462
  }
14240
14463
 
14241
14464
  :scope:where([data-component~="ui-icon-button"])[data-tone="danger"] {
14465
+ --_tone-highlight: var(--ui-danger-highlight, none);
14466
+ --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
14242
14467
  --_icon-button-border: var(--ui-danger);
14243
14468
  --_icon-button-hover-border: var(--ui-danger-hover);
14244
14469
  --_icon-button-text: var(--ui-danger-subtle-text);
@@ -14250,6 +14475,8 @@ html[data-ui-input-modality="touch"]
14250
14475
  }
14251
14476
 
14252
14477
  :scope:where([data-component~="ui-icon-button"])[data-tone="success"] {
14478
+ --_tone-highlight: var(--ui-success-highlight, none);
14479
+ --_tone-glow: var(--ui-success-glow, 0 0 transparent);
14253
14480
  --_icon-button-border: var(--ui-success);
14254
14481
  --_icon-button-hover-border: var(--ui-success-hover);
14255
14482
  --_icon-button-text: var(--ui-success-subtle-text);
@@ -14261,6 +14488,8 @@ html[data-ui-input-modality="touch"]
14261
14488
  }
14262
14489
 
14263
14490
  :scope:where([data-component~="ui-icon-button"])[data-tone="warning"] {
14491
+ --_tone-highlight: var(--ui-warning-highlight, none);
14492
+ --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
14264
14493
  --_icon-button-border: var(--ui-warning);
14265
14494
  --_icon-button-hover-border: var(--ui-warning-hover);
14266
14495
  --_icon-button-text: var(--ui-warning-subtle-text);
@@ -14272,6 +14501,8 @@ html[data-ui-input-modality="touch"]
14272
14501
  }
14273
14502
 
14274
14503
  :scope:where([data-component~="ui-icon-button"])[data-tone="info"] {
14504
+ --_tone-highlight: var(--ui-info-highlight, none);
14505
+ --_tone-glow: var(--ui-info-glow, 0 0 transparent);
14275
14506
  --_icon-button-border: var(--ui-info);
14276
14507
  --_icon-button-hover-border: var(--ui-info-hover);
14277
14508
  --_icon-button-text: var(--ui-info-subtle-text);
@@ -14284,9 +14515,11 @@ html[data-ui-input-modality="touch"]
14284
14515
 
14285
14516
  /* Omitted tone retains the existing accent solid; explicit neutral is additive. */
14286
14517
  :scope:where([data-component~="ui-icon-button"])[data-tone="neutral"] {
14287
- --_icon-button-solid-surface: var(--ui-text-primary);
14288
- --_icon-button-solid-hover-surface: var(--ui-text-primary);
14289
- --_icon-button-solid-text: var(--ui-surface-default);
14518
+ --_tone-highlight: var(--ui-neutral-highlight, none);
14519
+ --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
14520
+ --_icon-button-solid-surface: var(--ui-neutral-surface);
14521
+ --_icon-button-solid-hover-surface: var(--ui-neutral-hover);
14522
+ --_icon-button-solid-text: var(--ui-text);
14290
14523
  }
14291
14524
 
14292
14525
  :scope:where([data-component~="ui-icon-button"])[data-ui-icon-button-state~="anticipatory"] {
@@ -14454,16 +14687,16 @@ html[data-ui-input-modality="touch"]
14454
14687
  :scope:where([data-component~="ui-icon-button"])[data-appearance="outline"] {
14455
14688
  border-color: var(--ui-icon-button-border, var(--_icon-button-border, var(--ui-control-border, var(--ui-border-strong))));
14456
14689
  background-color: var(--ui-icon-button-outline-surface, var(--_icon-button-outline-surface, var(--ui-surface-default)));
14457
- background-image: none;
14690
+ background-image: var(--ui-surface-highlight, none);
14458
14691
  color: var(--ui-icon-button-outline-text, var(--_icon-button-text, var(--ui-text-primary)));
14459
- box-shadow: var(--ui-action-shadow, var(--_ui-action-shadow));
14692
+ box-shadow: var(--ui-action-shadow, var(--_ui-action-shadow)), var(--_tone-glow);
14460
14693
  }
14461
14694
 
14462
14695
  :scope:where([data-component~="ui-icon-button"])[data-appearance="solid"] {
14463
14696
  background-color: var(--ui-icon-button-solid-surface, var(--_icon-button-solid-surface, var(--ui-accent-solid)));
14464
- background-image: none;
14697
+ background-image: var(--_tone-highlight);
14465
14698
  color: var(--ui-icon-button-solid-text, var(--_icon-button-solid-text, var(--ui-text-on-accent)));
14466
- box-shadow: var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
14699
+ box-shadow: var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))), var(--_tone-glow);
14467
14700
  }
14468
14701
 
14469
14702
  :scope:where([data-component~="ui-icon-button"]):hover:enabled:not([aria-disabled="true"]) {
@@ -14849,6 +15082,7 @@ html[data-ui-input-modality="touch"]
14849
15082
  --_ui-material-content-color: var(--_ui-menu-surface, var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated))));
14850
15083
  --_ui-material-rim-color: color-mix(in srgb, var(--ui-material-glass, var(--ui-surface-elevated)) calc(var(--_ui-material-active) * 100%), transparent);
14851
15084
  background:
15085
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
14852
15086
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color)) padding-box,
14853
15087
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
14854
15088
  var(--_ui-material-content-color) padding-box;
@@ -14864,6 +15098,7 @@ html[data-ui-input-modality="touch"]
14864
15098
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px) calc(
14865
15099
  var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 24px
14866
15100
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
15101
+ var(--ui-material-glow, 0 0 transparent),
14867
15102
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),
14868
15103
  var(--ui-elevation-overlay, var(--ui-shadow-lg))
14869
15104
  )
@@ -15251,6 +15486,7 @@ html[data-ui-input-modality="touch"]
15251
15486
  --_ui-material-content-color: var(--_ui-popover-surface, var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated))));
15252
15487
  --_ui-material-rim-color: color-mix(in srgb, var(--ui-material-glass, var(--ui-surface-elevated)) calc(var(--_ui-material-active) * 100%), transparent);
15253
15488
  background:
15489
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
15254
15490
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color)) padding-box,
15255
15491
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
15256
15492
  var(--_ui-material-content-color) padding-box;
@@ -15266,6 +15502,7 @@ html[data-ui-input-modality="touch"]
15266
15502
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px) calc(
15267
15503
  var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 24px
15268
15504
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
15505
+ var(--ui-material-glow, 0 0 transparent),
15269
15506
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),
15270
15507
  var(--ui-elevation-overlay, var(--ui-shadow-lg))
15271
15508
  )
@@ -16060,7 +16297,8 @@ html[data-ui-input-modality="touch"]
16060
16297
  margin: max(0px, calc((1lh - var(--_ui-checkbox-size, 1.125rem)) / 2)) 0 0 !important;
16061
16298
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
16062
16299
  border-radius: min(var(--ui-radius-sm), calc(var(--_ui-checkbox-size, 1.125rem) / 4));
16063
- background: var(--ui-control-surface, var(--ui-surface-default));
16300
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
16301
+ background-image: var(--ui-surface-highlight, none);
16064
16302
  box-shadow: var(--ui-control-inset);
16065
16303
  cursor: pointer;
16066
16304
  transition:
@@ -16079,7 +16317,8 @@ html[data-ui-input-modality="touch"]
16079
16317
  input:checked,
16080
16318
  input:indeterminate {
16081
16319
  border-color: var(--ui-accent-solid);
16082
- background: var(--ui-accent-solid);
16320
+ background-color: var(--ui-accent-solid);
16321
+ background-image: var(--ui-accent-highlight, none);
16083
16322
  box-shadow: var(--ui-control-inset);
16084
16323
  }
16085
16324
 
@@ -16508,7 +16747,8 @@ html[data-ui-input-modality="touch"]
16508
16747
  border: var(--ui-input-border-width, var(--_ui-default-input-border-width, var(--ui-border-width))) solid
16509
16748
  var(--ui-input-border, var(--_ui-default-input-border, var(--ui-control-border, var(--ui-border-strong))));
16510
16749
  border-radius: var(--ui-input-radius, var(--_ui-default-input-radius, var(--ui-field-radius, var(--ui-radius-md))));
16511
- background: var(--ui-input-surface, var(--_ui-default-input-surface, var(--ui-control-surface, var(--ui-surface-elevated))));
16750
+ background-color: var(--ui-input-surface, var(--_ui-default-input-surface, var(--ui-control-surface, var(--ui-surface-elevated))));
16751
+ background-image: var(--_ui-default-input-highlight, var(--ui-surface-highlight, none));
16512
16752
  color: var(--ui-text-primary);
16513
16753
  font: inherit;
16514
16754
  line-height: var(--ui-line-height-tight);