@threadlabs/looma 0.33.1 → 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 (215) hide show
  1. package/components/shared/overlay.js +8 -2
  2. package/components/shared/surface-material.js +21 -0
  3. package/components/ui-badge/ui-badge.html +11 -3
  4. package/components/ui-button/ui-button.html +92 -51
  5. package/components/ui-card/ui-card.html +50 -6
  6. package/components/ui-checkbox/ui-checkbox.html +4 -2
  7. package/components/ui-curve-editor/curve.js +10 -0
  8. package/components/ui-curve-editor/ui-curve-editor.html +181 -0
  9. package/components/ui-curve-editor/ui-curve-editor.js +51 -0
  10. package/components/ui-dialog/ui-dialog.html +64 -1
  11. package/components/ui-dialog/ui-dialog.js +9 -1
  12. package/components/ui-icon-button/ui-icon-button.html +97 -31
  13. package/components/ui-input/ui-input.html +2 -1
  14. package/components/ui-input-group/ui-input-group.html +4 -1
  15. package/components/ui-light-editor/ui-light-editor.html +45 -0
  16. package/components/ui-light-editor/ui-light-editor.js +53 -0
  17. package/components/ui-menu/ui-menu.html +62 -0
  18. package/components/ui-menu/ui-menu.js +1 -1
  19. package/components/ui-number-input/arithmetic.js +47 -0
  20. package/components/ui-number-input/ui-number-input.html +63 -0
  21. package/components/ui-number-input/ui-number-input.js +47 -0
  22. package/components/ui-popover/ui-popover.html +66 -1
  23. package/components/ui-popover/ui-popover.js +1 -1
  24. package/components/ui-select/ui-select.html +9 -7
  25. package/components/ui-slider/ui-slider.html +84 -0
  26. package/components/ui-slider/ui-slider.js +29 -0
  27. package/components/ui-switch/ui-switch.html +3 -0
  28. package/components/ui-tabs/ui-tabs.html +6 -1
  29. package/components/ui-text/ui-text.html +31 -6
  30. package/components/ui-textarea/ui-textarea.html +2 -1
  31. package/components/ui-tooltip/ui-tooltip.html +60 -0
  32. package/components/ui-tooltip/ui-tooltip.js +1 -1
  33. package/dist/index.js +47 -43
  34. package/docs/README.md +59 -5
  35. package/docs/card.html +16 -2
  36. package/docs/card.js +17 -2
  37. package/docs/catalog.json +1640 -108
  38. package/docs/customizer-render.mjs +50 -11
  39. package/docs/customizer.js +137 -24
  40. package/docs/documentation.css +9 -1
  41. package/docs/index.d.ts +8 -3
  42. package/docs/index.mjs +1 -1
  43. package/docs/preview.js +2 -0
  44. package/docs/render.mjs +16 -7
  45. package/docs/site.mjs +78 -27
  46. package/docs/theme-session.mjs +53 -0
  47. package/docs/theme.mjs +189 -18
  48. package/docs/value-editors.mjs +33 -0
  49. package/package.json +2 -2
  50. package/styles/ui-badge.css +11 -6
  51. package/styles/ui-button.css +74 -49
  52. package/styles/ui-card.css +51 -4
  53. package/styles/ui-checkbox.css +4 -2
  54. package/styles/ui-curve-editor.css +109 -0
  55. package/styles/ui-dialog.css +136 -0
  56. package/styles/ui-icon-button.css +85 -28
  57. package/styles/ui-input-group.css +4 -1
  58. package/styles/ui-input.css +2 -1
  59. package/styles/ui-light-editor.css +28 -0
  60. package/styles/ui-menu.css +74 -0
  61. package/styles/ui-number-input.css +34 -0
  62. package/styles/ui-popover.css +76 -0
  63. package/styles/ui-select.css +9 -7
  64. package/styles/ui-slider.css +53 -0
  65. package/styles/ui-switch.css +3 -0
  66. package/styles/ui-tabs.css +6 -1
  67. package/styles/ui-text.css +23 -1
  68. package/styles/ui-textarea.css +2 -1
  69. package/styles/ui-tooltip.css +72 -0
  70. package/theme-light.css +1 -0
  71. package/theme-system.css +69 -17
  72. package/tokens.css +12 -2
  73. package/vanilla/UiButton.d.ts +1 -0
  74. package/vanilla/UiButton.js +195 -130
  75. package/vanilla/UiCard.d.ts +1 -0
  76. package/vanilla/UiCard.js +12 -12
  77. package/vanilla/UiCurveEditor.d.ts +28 -0
  78. package/vanilla/UiCurveEditor.js +134 -0
  79. package/vanilla/UiIconButton.d.ts +2 -1
  80. package/vanilla/UiIconButton.js +58 -31
  81. package/vanilla/UiLightEditor.d.ts +29 -0
  82. package/vanilla/UiLightEditor.js +102 -0
  83. package/vanilla/UiNumberInput.d.ts +33 -0
  84. package/vanilla/UiNumberInput.js +86 -0
  85. package/vanilla/UiSlider.d.ts +33 -0
  86. package/vanilla/UiSlider.js +125 -0
  87. package/vanilla/UiText.d.ts +2 -2
  88. package/vanilla/UiText.js +45 -11
  89. package/vanilla/index.js +4 -0
  90. package/vue/UiBadge.vue +29 -4
  91. package/vue/UiButton.d.ts +6 -0
  92. package/vue/UiButton.vue +188 -60
  93. package/vue/UiCard.d.ts +6 -0
  94. package/vue/UiCard.vue +80 -6
  95. package/vue/UiCheckbox.vue +4 -2
  96. package/vue/UiCurveEditor.d.ts +53 -0
  97. package/vue/UiCurveEditor.js +2 -0
  98. package/vue/UiCurveEditor.vue +427 -0
  99. package/vue/UiDialog.vue +181 -1
  100. package/vue/UiIconButton.d.ts +8 -2
  101. package/vue/UiIconButton.vue +190 -45
  102. package/vue/UiInput.vue +2 -1
  103. package/vue/UiInputGroup.vue +4 -1
  104. package/vue/UiLightEditor.d.ts +75 -0
  105. package/vue/UiLightEditor.js +2 -0
  106. package/vue/UiLightEditor.vue +402 -0
  107. package/vue/UiMenu.vue +91 -0
  108. package/vue/UiNumberInput.d.ts +83 -0
  109. package/vue/UiNumberInput.js +2 -0
  110. package/vue/UiNumberInput.vue +399 -0
  111. package/vue/UiPopover.vue +94 -1
  112. package/vue/UiSelect.vue +16 -10
  113. package/vue/UiSlider.d.ts +83 -0
  114. package/vue/UiSlider.js +2 -0
  115. package/vue/UiSlider.vue +412 -0
  116. package/vue/UiSwitch.vue +3 -0
  117. package/vue/UiTabs.vue +6 -1
  118. package/vue/UiText.d.ts +7 -5
  119. package/vue/UiText.vue +104 -22
  120. package/vue/UiTextarea.vue +2 -1
  121. package/vue/UiTooltip.vue +89 -0
  122. package/vue/chunks/UiActionBar.js +1 -1
  123. package/vue/chunks/UiAffordanceScope.js +2 -2
  124. package/vue/chunks/UiAvatar.js +2 -2
  125. package/vue/chunks/UiAvatarGroup.js +2 -2
  126. package/vue/chunks/UiBadge.js +3 -3
  127. package/vue/chunks/UiBreadcrumbItem.js +2 -2
  128. package/vue/chunks/UiBreadcrumbs.js +2 -2
  129. package/vue/chunks/UiButton.js +94 -11
  130. package/vue/chunks/UiCallout.js +2 -2
  131. package/vue/chunks/UiCard.js +34 -5
  132. package/vue/chunks/UiCheckbox.js +3 -3
  133. package/vue/chunks/UiCluster.js +2 -2
  134. package/vue/chunks/UiColorPicker.js +2 -2
  135. package/vue/chunks/UiCombobox.js +2 -2
  136. package/vue/chunks/UiContainer.js +2 -2
  137. package/vue/chunks/UiContextMenu.js +2 -2
  138. package/vue/chunks/UiCover.js +2 -2
  139. package/vue/chunks/UiCurveEditor.js +413 -0
  140. package/vue/chunks/UiDescriptionItem.js +2 -2
  141. package/vue/chunks/UiDescriptionList.js +2 -2
  142. package/vue/chunks/UiDialog.js +4 -4
  143. package/vue/chunks/UiDisclosure.js +2 -2
  144. package/vue/chunks/UiEditable.js +2 -2
  145. package/vue/chunks/UiEditorBlockActions.js +2 -2
  146. package/vue/chunks/UiEditorChipEditor.js +2 -2
  147. package/vue/chunks/UiEditorCodeLanguage.js +2 -2
  148. package/vue/chunks/UiEditorFootnoteEditor.js +2 -2
  149. package/vue/chunks/UiEditorImageToolbar.js +3 -3
  150. package/vue/chunks/UiEditorInsertTableGrid.js +2 -2
  151. package/vue/chunks/UiEditorLinkCard.js +3 -3
  152. package/vue/chunks/UiEditorLinkForm.js +3 -3
  153. package/vue/chunks/UiEditorMentionMenu.js +2 -2
  154. package/vue/chunks/UiEditorMentionMenuItem.js +2 -2
  155. package/vue/chunks/UiEditorSlashMenu.js +2 -2
  156. package/vue/chunks/UiEditorSlashMenuGroup.js +2 -2
  157. package/vue/chunks/UiEditorSlashMenuItem.js +2 -2
  158. package/vue/chunks/UiEditorSurface.js +2 -2
  159. package/vue/chunks/UiEditorTableContextMenu.js +2 -2
  160. package/vue/chunks/UiEditorTableOverlay.js +2 -2
  161. package/vue/chunks/UiEditorTableToolbar.js +2 -2
  162. package/vue/chunks/UiEditorToolbar.js +2 -2
  163. package/vue/chunks/UiFloatingActionButton.js +2 -2
  164. package/vue/chunks/UiFormField.js +2 -2
  165. package/vue/chunks/UiGrid.js +2 -2
  166. package/vue/chunks/UiIcon.js +2 -2
  167. package/vue/chunks/UiIconButton.js +77 -11
  168. package/vue/chunks/UiImage.js +2 -2
  169. package/vue/chunks/UiInput.js +3 -3
  170. package/vue/chunks/UiInputGroup.js +3 -3
  171. package/vue/chunks/UiLightEditor.js +347 -0
  172. package/vue/chunks/UiList.js +2 -2
  173. package/vue/chunks/UiListItem.js +2 -2
  174. package/vue/chunks/UiListbox.js +2 -2
  175. package/vue/chunks/UiMenu.js +3 -3
  176. package/vue/chunks/UiMenuGroup.js +2 -2
  177. package/vue/chunks/UiMenuItem.js +2 -2
  178. package/vue/chunks/UiMeter.js +2 -2
  179. package/vue/chunks/UiNavItem.js +2 -2
  180. package/vue/chunks/UiNumberInput.js +403 -0
  181. package/vue/chunks/UiPageHeader.js +2 -2
  182. package/vue/chunks/UiPopover.js +4 -4
  183. package/vue/chunks/UiRadio.js +2 -2
  184. package/vue/chunks/UiRadioGroup.js +2 -2
  185. package/vue/chunks/UiReel.js +2 -2
  186. package/vue/chunks/UiScrollArea.js +2 -2
  187. package/vue/chunks/UiSearchResultRow.js +2 -2
  188. package/vue/chunks/UiSearchShell.js +2 -2
  189. package/vue/chunks/UiSection.js +2 -2
  190. package/vue/chunks/UiSelect.js +3 -3
  191. package/vue/chunks/UiSeparator.js +2 -2
  192. package/vue/chunks/UiSidebar.js +2 -2
  193. package/vue/chunks/UiSlider.js +396 -0
  194. package/vue/chunks/UiSpinner.js +2 -2
  195. package/vue/chunks/UiStack.js +2 -2
  196. package/vue/chunks/UiStatusMessage.js +2 -2
  197. package/vue/chunks/UiSwatch.js +2 -2
  198. package/vue/chunks/UiSwitch.js +3 -3
  199. package/vue/chunks/UiSwitcher.js +2 -2
  200. package/vue/chunks/UiTable.js +2 -2
  201. package/vue/chunks/UiTabs.js +3 -3
  202. package/vue/chunks/UiText.js +53 -12
  203. package/vue/chunks/UiTextarea.js +3 -3
  204. package/vue/chunks/UiToast.js +2 -2
  205. package/vue/chunks/UiToastRegion.js +2 -2
  206. package/vue/chunks/UiTooltip.js +3 -3
  207. package/vue/chunks/UiTopBar.js +1 -1
  208. package/vue/chunks/UiTree.js +2 -2
  209. package/vue/chunks/UiTreeItem.js +2 -2
  210. package/vue/chunks/_plugin-vue_export-helper.js +68 -2
  211. package/vue/chunks/props.js +24 -1
  212. package/vue/components.css +3391 -2139
  213. package/vue/editor/index.js +623 -211
  214. package/vue/index.d.ts +4 -0
  215. package/vue/index.js +6 -2
@@ -84,7 +84,7 @@
84
84
  :scope:where([data-component~="ui-button"]) {
85
85
  /* Optional inherited action-group values keep text and icon actions under the same light.
86
86
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
87
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
87
+ The shared theme supplies reflections and glow independently of the resting lift. */
88
88
  --_ui-action-start: 1px;
89
89
  --_ui-action-edge: var(
90
90
  --ui-action-edge,
@@ -92,6 +92,8 @@
92
92
  inset calc(-1 * var(--_ui-action-start)) -1px 0 light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.08))
93
93
  );
94
94
  --_ui-action-shadow: var(--_ui-action-edge), 0 1px 2px light-dark(rgb(0 0 0 / 0.10), rgb(0 0 0 / 0.20));
95
+ --_tone-highlight: var(--ui-accent-highlight, none);
96
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
95
97
  --_hue: var(--ui-accent);
96
98
  --_hue-hover: var(--ui-accent-hover);
97
99
  --_hue-active: var(--ui-accent-active);
@@ -142,8 +144,8 @@
142
144
  white-space: var(--ui-button-white-space, inherit);
143
145
  line-height: var(--ui-line-height-tight);
144
146
  padding: var(--ui-control-inset-block-md, var(--ui-space-2)) var(--ui-action-inset-md, var(--ui-space-3)) !important;
145
- background-image: none;
146
- box-shadow: var(--ui-button-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
147
+ background-image: var(--ui-surface-highlight, none);
148
+ box-shadow: var(--ui-button-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))), var(--_tone-glow);
147
149
  cursor: pointer;
148
150
  transition:
149
151
  scale var(--ui-motion-press, var(--ui-motion-fast)) var(--ui-motion-ease),
@@ -167,7 +169,7 @@
167
169
 
168
170
  /* A count is an adornment, not another line of label text. Keep the standard control height
169
171
  with enough inset for a 24px mark; large content can still grow the button naturally. */
170
- :scope:where([data-component~="ui-button"]):not([variant="link"]):has(.badge:not(:empty)) {
172
+ :scope:where([data-component~="ui-button"]):not([data-appearance="link"]):has(.badge:not(:empty)) {
171
173
  padding-block: var(--ui-space-0-5) !important;
172
174
  }
173
175
 
@@ -212,7 +214,7 @@
212
214
 
213
215
  /* Card actions inherit Button's palette and behavior; only their shared layout changes.
214
216
  The icon may contain any decorative composition. Empty icons remove their column. */
215
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=card"] {
217
+ :scope:where([data-component~="ui-button"])[data-appearance="card"] {
216
218
  display: grid !important;
217
219
  grid-template-columns: auto minmax(0, 1fr) auto;
218
220
  align-content: center !important;
@@ -225,10 +227,10 @@
225
227
  box-shadow: none;
226
228
  background-image: none;
227
229
  }
228
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=card"][data-ui-button-state~="size=lg"] {
230
+ :scope:where([data-component~="ui-button"])[data-appearance="card"][size="lg"] {
229
231
  min-block-size: max(var(--ui-control-min-block-size), var(--ui-control-size-lg));
230
232
  }
231
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=card"]:has(.card-icon:empty) {
233
+ :scope:where([data-component~="ui-button"])[data-appearance="card"]:has(.card-icon:empty) {
232
234
  grid-template-columns: minmax(0, 1fr) auto;
233
235
  }
234
236
  .card-icon {
@@ -255,11 +257,11 @@
255
257
  }
256
258
 
257
259
  /* A neutral card encloses content quietly; ordinary outlines keep their action-tone edge. */
258
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=card"][data-ui-button-state~="tone=neutral"] {
260
+ :scope:where([data-component~="ui-button"])[data-appearance="card"][data-tone="neutral"] {
259
261
  border-color: var(--ui-button-border, var(--ui-border));
260
262
  }
261
263
 
262
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=card"][data-ui-button-state~="tone=neutral"]:hover:not(:disabled, [aria-disabled="true"]) {
264
+ :scope:where([data-component~="ui-button"])[data-appearance="card"][data-tone="neutral"]:hover:not(:disabled, [aria-disabled="true"]) {
263
265
  border-color: var(--ui-button-hover-border, var(--ui-border-strong));
264
266
  }
265
267
 
@@ -271,19 +273,20 @@
271
273
  box-shadow: var(--ui-pressed);
272
274
  }
273
275
 
274
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=solid"], :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=danger"] {
276
+ :scope:where([data-component~="ui-button"])[data-appearance="solid"], :scope:where([data-component~="ui-button"])[data-appearance="danger"] {
275
277
  border-color: var(--_tone);
276
278
  background-color: var(--_tone);
277
279
  color: var(--_on-tone);
278
- box-shadow: var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
280
+ background-image: var(--_tone-highlight);
281
+ box-shadow: var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))), var(--_tone-glow);
279
282
  }
280
283
 
281
- :is(:scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=solid"], :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=danger"]):hover:not(:disabled, [aria-disabled="true"]) {
284
+ :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"]) {
282
285
  background-color: var(--_tone-hover);
283
286
  border-color: var(--_tone-hover);
284
287
  }
285
288
 
286
- :is(:scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=solid"], :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=danger"]):active:not(:disabled, [aria-disabled="true"]) {
289
+ :is(:scope:where([data-component~="ui-button"])[data-appearance="solid"], :scope:where([data-component~="ui-button"])[data-appearance="danger"]):active:not(:disabled, [aria-disabled="true"]) {
287
290
  background-color: var(--_tone-active);
288
291
  border-color: var(--_tone-active);
289
292
  background-image: none;
@@ -292,7 +295,9 @@
292
295
 
293
296
  /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
294
297
  destructive secondary action, not a special case. */
295
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="tone=neutral"] {
298
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"] {
299
+ --_tone-highlight: var(--ui-neutral-highlight, none);
300
+ --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
296
301
  --_hue: var(--ui-text);
297
302
  --_hue-hover: var(--ui-text);
298
303
  --_hue-active: var(--ui-text);
@@ -300,40 +305,60 @@
300
305
  --_on-hue: var(--ui-surface);
301
306
  }
302
307
 
303
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="tone=danger"], :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=danger"] {
308
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"][data-appearance="solid"] {
309
+ border-color: var(--ui-button-border, var(--ui-control-border));
310
+ background-color: var(--ui-button-surface, var(--ui-neutral-surface));
311
+ color: var(--ui-button-text, var(--ui-text));
312
+ }
313
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"][data-appearance="solid"]:hover:not(:disabled, [aria-disabled="true"]) {
314
+ background-color: var(--ui-button-hover-surface, var(--ui-neutral-hover));
315
+ }
316
+ :scope:where([data-component~="ui-button"])[data-tone="neutral"][data-appearance="solid"]:active:not(:disabled, [aria-disabled="true"]) {
317
+ background-color: var(--ui-button-active-surface, var(--ui-neutral-active));
318
+ }
319
+
320
+ :scope:where([data-component~="ui-button"])[data-tone="danger"], :scope:where([data-component~="ui-button"])[data-appearance="danger"] {
321
+ --_tone-highlight: var(--ui-danger-highlight, none);
322
+ --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
304
323
  --_hue: var(--ui-danger);
305
324
  --_hue-hover: var(--ui-danger-hover);
306
- --_hue-active: var(--ui-danger-hover);
307
- --_hue-text: var(--ui-danger-hover);
325
+ --_hue-active: var(--ui-danger-active, var(--ui-danger-hover));
326
+ --_hue-text: var(--ui-danger-subtle-text);
308
327
  --_on-hue: var(--ui-on-danger);
309
328
  }
310
329
 
311
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="tone=success"] {
330
+ :scope:where([data-component~="ui-button"])[data-tone="success"] {
331
+ --_tone-highlight: var(--ui-success-highlight, none);
332
+ --_tone-glow: var(--ui-success-glow, 0 0 transparent);
312
333
  --_hue: var(--ui-success);
313
- --_hue-hover: color-mix(in srgb, var(--ui-success) 85%, #000);
314
- --_hue-active: color-mix(in srgb, var(--ui-success) 75%, #000);
315
- --_hue-text: color-mix(in srgb, var(--ui-success) 85%, #000);
316
- --_on-hue: var(--ui-surface);
334
+ --_hue-hover: var(--ui-success-hover);
335
+ --_hue-active: var(--ui-success-active);
336
+ --_hue-text: var(--ui-success-subtle-text);
337
+ --_on-hue: var(--ui-success-on-strong);
317
338
  }
318
339
 
319
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="tone=warning"] {
340
+ :scope:where([data-component~="ui-button"])[data-tone="warning"] {
341
+ --_tone-highlight: var(--ui-warning-highlight, none);
342
+ --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
320
343
  --_hue: var(--ui-warning);
321
- --_hue-hover: color-mix(in srgb, var(--ui-warning) 85%, #000);
322
- --_hue-active: color-mix(in srgb, var(--ui-warning) 75%, #000);
323
- --_hue-text: color-mix(in srgb, var(--ui-warning) 85%, #000);
324
- --_on-hue: var(--ui-surface);
344
+ --_hue-hover: var(--ui-warning-hover);
345
+ --_hue-active: var(--ui-warning-active);
346
+ --_hue-text: var(--ui-warning-subtle-text);
347
+ --_on-hue: var(--ui-warning-on-strong);
325
348
  }
326
349
 
327
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="tone=info"] {
350
+ :scope:where([data-component~="ui-button"])[data-tone="info"] {
351
+ --_tone-highlight: var(--ui-info-highlight, none);
352
+ --_tone-glow: var(--ui-info-glow, 0 0 transparent);
328
353
  --_hue: var(--ui-info);
329
- --_hue-hover: color-mix(in srgb, var(--ui-info) 85%, #000);
330
- --_hue-active: color-mix(in srgb, var(--ui-info) 75%, #000);
331
- --_hue-text: color-mix(in srgb, var(--ui-info) 85%, #000);
332
- --_on-hue: var(--ui-surface);
354
+ --_hue-hover: var(--ui-info-hover);
355
+ --_hue-active: var(--ui-info-active);
356
+ --_hue-text: var(--ui-info-subtle-text);
357
+ --_on-hue: var(--ui-info-on-strong);
333
358
  }
334
359
 
335
360
  /* A value picker is a field, with Select's quiet edge and resting lift. */
336
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=field"] {
361
+ :scope:where([data-component~="ui-button"])[data-appearance="field"] {
337
362
  --_ui-field-shadow: var(--ui-shadow-sm);
338
363
  border-color: var(--ui-button-border, var(--ui-control-border, var(--ui-border-strong)));
339
364
  border-radius: var(--ui-button-radius, var(--ui-field-radius, var(--ui-radius-md)));
@@ -343,23 +368,23 @@
343
368
  box-shadow: var(--ui-button-shadow, var(--_ui-field-shadow));
344
369
  }
345
370
 
346
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=field"]:hover:not(:disabled, [aria-disabled="true"]) {
371
+ :scope:where([data-component~="ui-button"])[data-appearance="field"]:hover:not(:disabled, [aria-disabled="true"]) {
347
372
  border-color: var(--ui-button-hover-border, var(--ui-control-border-hover, var(--ui-text-secondary)));
348
373
  background-color: var(--ui-button-hover-surface, var(--ui-control-surface, var(--ui-surface-elevated)));
349
374
  }
350
375
 
351
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=field"]:is(:active, [aria-expanded="true"]):not(:disabled, [aria-disabled="true"]) {
376
+ :scope:where([data-component~="ui-button"])[data-appearance="field"]:is(:active, [aria-expanded="true"]):not(:disabled, [aria-disabled="true"]) {
352
377
  --_ui-field-shadow: var(--ui-pressed);
353
378
  }
354
379
 
355
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=field"]:focus-visible {
380
+ :scope:where([data-component~="ui-button"])[data-appearance="field"]:focus-visible {
356
381
  border-color: var(--ui-control-focus, var(--ui-accent-solid));
357
382
  box-shadow:
358
383
  var(--ui-button-shadow, var(--_ui-field-shadow)),
359
384
  var(--ui-control-focus-halo-shadow);
360
385
  }
361
386
 
362
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=ghost"] {
387
+ :scope:where([data-component~="ui-button"])[data-appearance="ghost"] {
363
388
  border-color: transparent;
364
389
  background: transparent;
365
390
  box-shadow: none;
@@ -367,14 +392,14 @@
367
392
  }
368
393
 
369
394
  /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
370
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=ghost"]:hover:not(:disabled, [aria-disabled="true"]) {
395
+ :scope:where([data-component~="ui-button"])[data-appearance="ghost"]:hover:not(:disabled, [aria-disabled="true"]) {
371
396
  background-color: var(--ui-button-ghost-hover-surface, oklch(from var(--_tone) l c h / 10%));
372
397
  border-color: transparent;
373
398
  }
374
399
 
375
400
  /* Pressed, or holding its menu open, a ghost button sinks slightly: a light surface with a faint
376
401
  edge and a soft inner shadow. Lighter than hover, so an open menu's trigger never reads as heavy. */
377
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=ghost"]:is(:active, [aria-expanded="true"]):not(:disabled, [aria-disabled="true"]) {
402
+ :scope:where([data-component~="ui-button"])[data-appearance="ghost"]:is(:active, [aria-expanded="true"]):not(:disabled, [aria-disabled="true"]) {
378
403
  background-color: var(--ui-button-ghost-active-surface, color-mix(in oklch, var(--ui-surface), var(--_tone) 3%));
379
404
  border-color: transparent;
380
405
  box-shadow: inset 0 0 0 1px oklch(from var(--_tone) l c h / 10%), inset 0 1px 2px oklch(from var(--_tone) l c h / 8%);
@@ -388,13 +413,13 @@
388
413
  var(--ui-focus-halo);
389
414
  }
390
415
 
391
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=solid"]:focus-visible {
416
+ :scope:where([data-component~="ui-button"])[data-appearance="solid"]:focus-visible {
392
417
  box-shadow:
393
418
  var(--ui-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
394
419
  var(--ui-focus-halo);
395
420
  }
396
421
 
397
- :is(:scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=ghost"], :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"], :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=card"]):focus-visible {
422
+ :is(:scope:where([data-component~="ui-button"])[data-appearance="ghost"], :scope:where([data-component~="ui-button"])[data-appearance="link"], :scope:where([data-component~="ui-button"])[data-appearance="card"]):focus-visible {
398
423
  box-shadow: var(--ui-focus-halo);
399
424
  }
400
425
 
@@ -416,7 +441,7 @@
416
441
  }
417
442
 
418
443
  /* Ghost keeps no border, but gains the same neutral surface as other disabled buttons. */
419
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=ghost"]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
444
+ :scope:where([data-component~="ui-button"])[data-appearance="ghost"]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
420
445
  background-color: var(--ui-disabled-surface);
421
446
  border-color: transparent;
422
447
  }
@@ -433,12 +458,12 @@
433
458
  a link-style one keeps its text size, so a standalone one ("See all" under a list) needs the
434
459
  area. xs sits inside a line of text the same way, so it keeps its size and gains the area too.
435
460
  Only these need it: a hit area on every button would reach over its neighbours. */
436
- html[data-ui-input-modality="touch"] :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"],
461
+ html[data-ui-input-modality="touch"] :scope:where([data-component~="ui-button"])[data-appearance="link"],
437
462
  html[data-ui-input-modality="touch"] :scope:where([data-component~="ui-button"])[data-ui-button-state~="size=xs"] {
438
463
  position: relative;
439
464
  }
440
465
 
441
- html[data-ui-input-modality="touch"] :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"]::after,
466
+ html[data-ui-input-modality="touch"] :scope:where([data-component~="ui-button"])[data-appearance="link"]::after,
442
467
  html[data-ui-input-modality="touch"] :scope:where([data-component~="ui-button"])[data-ui-button-state~="size=xs"]::after {
443
468
  position: absolute;
444
469
  inset: 50% auto auto 50%;
@@ -450,7 +475,7 @@
450
475
 
451
476
  /* Link: an inline text action. No box, padding, or minimum height (inline targets are exempt under
452
477
  WCAG 2.5.8); the inherited font; an underline that strengthens on hover; a visible focus ring. */
453
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"] {
478
+ :scope:where([data-component~="ui-button"])[data-appearance="link"] {
454
479
  display: inline !important;
455
480
  min-block-size: 0;
456
481
  padding: 0 !important;
@@ -467,24 +492,24 @@
467
492
  transition: color var(--ui-motion-fast) var(--ui-motion-ease), text-decoration-color var(--ui-motion-fast) var(--ui-motion-ease);
468
493
  }
469
494
 
470
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"]:hover:not(:disabled, [aria-disabled="true"]) {
495
+ :scope:where([data-component~="ui-button"])[data-appearance="link"]:hover:not(:disabled, [aria-disabled="true"]) {
471
496
  color: var(--ui-button-link-hover-text, var(--ui-text-primary));
472
497
  text-decoration-color: currentColor;
473
498
  background: none;
474
499
  transform: none;
475
500
  }
476
501
 
477
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"]:active:not(:disabled, [aria-disabled="true"]) {
502
+ :scope:where([data-component~="ui-button"])[data-appearance="link"]:active:not(:disabled, [aria-disabled="true"]) {
478
503
  background: none;
479
504
  transform: none;
480
505
  }
481
506
 
482
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
507
+ :scope:where([data-component~="ui-button"])[data-appearance="link"]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
483
508
  background: none;
484
509
  border-color: transparent;
485
510
  }
486
511
 
487
- :scope:where([data-component~="ui-button"])[data-ui-button-state~="variant=link"]:focus-visible {
512
+ :scope:where([data-component~="ui-button"])[data-appearance="link"]:focus-visible {
488
513
  box-shadow: none;
489
514
  /* Fallback keeps the ring if the token is missing: an unresolved var() would void the outline. */
490
515
  outline: var(--ui-focus-width) solid var(--ui-focus-ring);
@@ -11,6 +11,7 @@
11
11
  needs no layout of its own. */
12
12
  :scope:where([data-component~="ui-card"]) {
13
13
  --_ui-card-surface: var(--ui-surface-raised);
14
+ --_ui-card-elevation: 0 0 0 transparent;
14
15
  --_ui-selection-context-surface: initial;
15
16
  --_ui-selection-context-border: initial;
16
17
  --_ui-selection-context-text: initial;
@@ -45,10 +46,54 @@
45
46
  }
46
47
 
47
48
  :scope:where([data-component~="ui-card"])[data-ui-card-state~="variant=elevated"] {
49
+ --_ui-card-elevation: var(--ui-shadow-lg);
48
50
  border-color: var(--ui-border-subtle);
49
51
  box-shadow: var(--ui-shadow-lg);
50
52
  }
51
53
 
54
+ :scope:where([data-component~="ui-card"])[data-ui-card-state~="treatment=expressive"] {
55
+ --_ui-panel-glass: clamp(0, var(--ui-glassiness, 0), 1);
56
+ --_ui-panel-separation: clamp(0, var(--ui-surface-separation, 0), 1);
57
+ --_ui-panel-rim: calc((var(--_ui-panel-separation) + var(--_ui-panel-glass) * 0.25) * 0.65 * 8px);
58
+ border-width: calc(var(--ui-border-width) + var(--_ui-panel-rim));
59
+ border-color: transparent;
60
+ background:
61
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
62
+ linear-gradient(var(--_ui-card-surface), var(--_ui-card-surface)) padding-box,
63
+ linear-gradient(var(--ui-material-glass, var(--ui-surface-raised)), var(--ui-material-glass, var(--ui-surface-raised))) border-box,
64
+ var(--_ui-card-surface) padding-box;
65
+ box-shadow:
66
+ var(--_ui-card-elevation),
67
+ var(--ui-material-glow, 0 0 transparent),
68
+ inset 0 0 0 var(--ui-border-width) var(--ui-material-edge, var(--ui-border-strong));
69
+ backdrop-filter: blur(calc(var(--_ui-panel-glass) * 0.65 * 18px)) saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
70
+ -webkit-backdrop-filter: blur(calc(var(--_ui-panel-glass) * 0.65 * 18px)) saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
71
+ }
72
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
73
+ :scope:where([data-component~="ui-card"])[data-ui-card-state~="treatment=expressive"] {
74
+ background: var(--_ui-card-surface);
75
+ }
76
+ }
77
+ @media (prefers-reduced-transparency: reduce) {
78
+ :scope:where([data-component~="ui-card"])[data-ui-card-state~="treatment=expressive"] {
79
+ background: var(--_ui-card-surface);
80
+ border-width: var(--ui-border-width);
81
+ border-color: var(--ui-border-strong);
82
+ backdrop-filter: none;
83
+ -webkit-backdrop-filter: none;
84
+ }
85
+ }
86
+ @media (forced-colors: active) {
87
+ :scope:where([data-component~="ui-card"])[data-ui-card-state~="treatment=expressive"] {
88
+ background: Canvas;
89
+ color: CanvasText;
90
+ border: var(--ui-border-width) solid CanvasText;
91
+ box-shadow: none;
92
+ backdrop-filter: none;
93
+ -webkit-backdrop-filter: none;
94
+ }
95
+ }
96
+
52
97
  :scope:where([data-component~="ui-card"])[data-ui-card-state~="tone=accent"] {
53
98
  border-color: color-mix(in srgb, var(--ui-accent) 25%, var(--ui-border-default));
54
99
  --_ui-card-surface: color-mix(in srgb, var(--ui-accent) 6%, var(--ui-surface-default));
@@ -75,10 +120,6 @@
75
120
 
76
121
  :scope:where([data-component~="ui-card"])[data-ui-card-state~="tone=danger"] {
77
122
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
78
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
79
- /* An accent edge keeps the corners on its side straight. */
80
- border-start-start-radius: 0;
81
- border-end-start-radius: 0;
82
123
  --_ui-card-surface: var(--ui-danger-soft);
83
124
  }
84
125
 
@@ -116,6 +157,12 @@
116
157
  @scope ([data-component~="ui-card"]) to ([data-component]) {
117
158
  /* A surface that groups content. Its children stack with even space between them, so a card
118
159
  needs no layout of its own. */
160
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
161
+ }
162
+ @media (prefers-reduced-transparency: reduce) {
163
+ }
164
+ @media (forced-colors: active) {
165
+ }
119
166
 
120
167
  /* A colored panel shades rows in its own hue, without changing button intent. */
121
168
 
@@ -91,7 +91,8 @@
91
91
  margin: max(0px, calc((1lh - var(--_ui-checkbox-size, 1.125rem)) / 2)) 0 0 !important;
92
92
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
93
93
  border-radius: min(var(--ui-radius-sm), calc(var(--_ui-checkbox-size, 1.125rem) / 4));
94
- background: var(--ui-control-surface, var(--ui-surface-default));
94
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
95
+ background-image: var(--ui-surface-highlight, none);
95
96
  box-shadow: var(--ui-control-inset);
96
97
  cursor: pointer;
97
98
  transition:
@@ -110,7 +111,8 @@
110
111
  input:checked,
111
112
  input:indeterminate {
112
113
  border-color: var(--ui-accent-solid);
113
- background: var(--ui-accent-solid);
114
+ background-color: var(--ui-accent-solid);
115
+ background-image: var(--ui-accent-highlight, none);
114
116
  box-shadow: var(--ui-control-inset);
115
117
  }
116
118
 
@@ -0,0 +1,109 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.69. Do not edit. */
2
+ @supports (-moz-appearance: none) {
3
+ :where([data-component], [data-slotted]) { --html-next-scope-owner: boundary; }
4
+ :where([data-slotted]:not([data-component])) { --html-next-scope-owner: projected !important; }
5
+ }
6
+ @supports (-moz-appearance: none) {
7
+ [data-component~="ui-curve-editor"] { --html-next-scope-owner: "ui-curve-editor" !important; }
8
+ }
9
+ @scope ([data-component~="ui-curve-editor"]) to ([data-component], [data-slotted]) {
10
+ :scope:where([data-component~="ui-curve-editor"]) {
11
+ display: grid !important;
12
+ gap: var(--ui-space-3) !important;
13
+ margin: 0 !important;
14
+ padding: 0 !important;
15
+ min-inline-size: 0;
16
+ }
17
+ .plot-frame {
18
+ box-sizing: border-box !important;
19
+ display: block !important;
20
+ block-size: 12rem;
21
+ padding: max(var(--ui-space-4), 0.75rem, calc(var(--ui-control-min-block-size) / 2)) !important;
22
+ margin: 0 !important;
23
+ border: var(--ui-border-width) solid var(--ui-control-border);
24
+ border-radius: var(--ui-field-radius, var(--ui-radius-md));
25
+ background: var(--ui-control-surface, var(--ui-surface));
26
+ }
27
+ .plot {
28
+ position: relative;
29
+ display: block !important;
30
+ inline-size: 100%;
31
+ block-size: 100%;
32
+ }
33
+ svg {
34
+ inline-size: 100%;
35
+ block-size: 100%;
36
+ overflow: visible;
37
+ }
38
+ path {
39
+ fill: none;
40
+ stroke: var(--ui-accent-solid);
41
+ stroke-width: 2;
42
+ vector-effect: non-scaling-stroke;
43
+ }
44
+ .guide {
45
+ stroke: var(--ui-control-border);
46
+ stroke-width: 1;
47
+ }
48
+ .handle {
49
+ position: absolute;
50
+ left: 25%;
51
+ top: 63.333%;
52
+ translate: -50% -50%;
53
+ inline-size: max(1.5rem, var(--ui-control-min-block-size));
54
+ block-size: max(1.5rem, var(--ui-control-min-block-size));
55
+ border: 0;
56
+ border-radius: 50%;
57
+ background: transparent;
58
+ color: var(--ui-text-primary);
59
+ touch-action: none;
60
+ cursor: grab;
61
+ padding: 0 !important;
62
+ margin: 0 !important;
63
+ }
64
+ .second {
65
+ top: 33.333%;
66
+ }
67
+ .handle:where(:not([data-component], [data-slotted]))::after {
68
+ content: "";
69
+ position: absolute;
70
+ inset: 25%;
71
+ border: var(--ui-border-width) solid var(--ui-accent-solid);
72
+ background: var(--ui-surface-raised);
73
+ border-radius: 50%;
74
+ box-shadow: var(--ui-shadow-xs);
75
+ }
76
+ .handle:where(:not([data-component], [data-slotted]))::before {
77
+ content: "";
78
+ position: absolute;
79
+ inset: 40%;
80
+ background: var(--ui-accent-solid);
81
+ border-radius: 50%;
82
+ z-index: 1;
83
+ }
84
+ .handle:focus-visible {
85
+ outline: var(--ui-focus-width) solid var(--ui-control-focus, var(--ui-accent-solid));
86
+ outline-offset: var(--ui-space-1);
87
+ }
88
+ .handle:disabled {
89
+ cursor: not-allowed;
90
+ }
91
+ .coordinates {
92
+ display: grid !important;
93
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
94
+ gap: var(--ui-space-2) !important;
95
+ }
96
+ .coordinate {
97
+ display: grid !important;
98
+ gap: var(--ui-space-1) !important;
99
+ font-size: var(--ui-font-size-sm);
100
+ }
101
+ output {
102
+ overflow-wrap: anywhere;
103
+ font-family: var(--ui-font-mono, monospace);
104
+ font-size: var(--ui-font-size-sm);
105
+ }
106
+ :scope:where([data-component~="ui-curve-editor"])[hidden] {
107
+ display: none !important;
108
+ }
109
+ }