@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
package/docs/catalog.json CHANGED
@@ -85,6 +85,11 @@
85
85
  "package": "@threadlabs/looma",
86
86
  "resource": "@threadlabs/looma/components/ui-cover/ui-cover.html"
87
87
  },
88
+ {
89
+ "tag": "ui-curve-editor",
90
+ "package": "@threadlabs/looma",
91
+ "resource": "@threadlabs/looma/components/ui-curve-editor/ui-curve-editor.html"
92
+ },
88
93
  {
89
94
  "tag": "ui-description-item",
90
95
  "package": "@threadlabs/looma",
@@ -240,6 +245,11 @@
240
245
  "package": "@threadlabs/looma",
241
246
  "resource": "@threadlabs/looma/components/ui-input-group/ui-input-group.html"
242
247
  },
248
+ {
249
+ "tag": "ui-light-editor",
250
+ "package": "@threadlabs/looma",
251
+ "resource": "@threadlabs/looma/components/ui-light-editor/ui-light-editor.html"
252
+ },
243
253
  {
244
254
  "tag": "ui-list",
245
255
  "package": "@threadlabs/looma",
@@ -280,6 +290,11 @@
280
290
  "package": "@threadlabs/looma",
281
291
  "resource": "@threadlabs/looma/components/ui-nav-item/ui-nav-item.html"
282
292
  },
293
+ {
294
+ "tag": "ui-number-input",
295
+ "package": "@threadlabs/looma",
296
+ "resource": "@threadlabs/looma/components/ui-number-input/ui-number-input.html"
297
+ },
283
298
  {
284
299
  "tag": "ui-page-header",
285
300
  "package": "@threadlabs/looma",
@@ -340,6 +355,11 @@
340
355
  "package": "@threadlabs/looma",
341
356
  "resource": "@threadlabs/looma/components/ui-sidebar/ui-sidebar.html"
342
357
  },
358
+ {
359
+ "tag": "ui-slider",
360
+ "package": "@threadlabs/looma",
361
+ "resource": "@threadlabs/looma/components/ui-slider/ui-slider.html"
362
+ },
343
363
  {
344
364
  "tag": "ui-spinner",
345
365
  "package": "@threadlabs/looma",
@@ -423,7 +443,7 @@
423
443
  ],
424
444
  "schemaVersion": 1,
425
445
  "package": "@threadlabs/looma",
426
- "version": "0.33.1",
446
+ "version": "0.35.0",
427
447
  "groups": [
428
448
  {
429
449
  "id": "layout",
@@ -1140,6 +1160,12 @@
1140
1160
  "var(--ui-success-solid)",
1141
1161
  "var(--ui-warning-solid)",
1142
1162
  "var(--ui-info-solid)",
1163
+ "var(--ui-badge-surface, var(--_badge-color-surface, var(--_badge-surface)))",
1164
+ "var(--ui-badge-surface, var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent)))",
1165
+ "var(--ui-badge-surface, var(--_badge-color-surface, var(--_badge-count-surface)))",
1166
+ "var(--ui-badge-surface, color-mix(in srgb, currentColor 6%, transparent))",
1167
+ "var(--ui-badge-surface, var(--_badge-color-surface, color-mix(in srgb, var(--ui-surface-raised) 88%, transparent)))",
1168
+ "var(--ui-badge-surface, var(--_badge-color-surface, light-dark( color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%), transparent), color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%), transparent) )))",
1143
1169
  "var(--ui-text-secondary)",
1144
1170
  "var(--ui-accent-on-strong, var(--ui-text-on-accent))",
1145
1171
  "var(--ui-danger-on-strong, var(--ui-text-on-accent))",
@@ -1180,7 +1206,9 @@
1180
1206
  "light-dark( color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 66%), transparent), color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 56%), transparent) )"
1181
1207
  ],
1182
1208
  "fallbacks": [
1183
- "color-mix(in srgb, var(--_badge-text) 88%, transparent)"
1209
+ "color-mix(in srgb, var(--_badge-text) 88%, transparent)",
1210
+ "color-mix(in srgb, var(--ui-surface-raised) 88%, transparent)",
1211
+ "light-dark(\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%), transparent),\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%), transparent)\n )"
1184
1212
  ]
1185
1213
  },
1186
1214
  {
@@ -1200,23 +1228,12 @@
1200
1228
  "var(--ui-danger-subtle-text, var(--ui-danger-solid))",
1201
1229
  "var(--ui-success-subtle-text, var(--ui-success-solid))",
1202
1230
  "var(--ui-warning-subtle-text, var(--ui-warning-solid))",
1203
- "var(--ui-info-subtle-text, var(--ui-info-solid))",
1204
- "color-mix(in srgb, var(--ui-surface-subtle) 80%, var(--ui-surface-default))",
1205
- "var(--ui-accent-strong-surface, var(--ui-accent-solid))",
1206
- "var(--ui-danger-strong-surface, var(--ui-danger-solid))",
1207
- "var(--ui-success-strong-surface, var(--ui-success-solid))",
1208
- "var(--ui-warning-strong-surface, var(--ui-warning-solid))",
1209
- "var(--ui-info-strong-surface, var(--ui-info-solid))",
1210
- "color-mix(in srgb, var(--ui-accent-solid) 19%, var(--ui-surface-default))",
1211
- "color-mix(in srgb, var(--ui-danger-solid) 19%, var(--ui-surface-default))",
1212
- "color-mix(in srgb, var(--ui-success-solid) 19%, var(--ui-surface-default))",
1213
- "color-mix(in srgb, var(--ui-warning-solid) 19%, var(--ui-surface-default))",
1214
- "color-mix(in srgb, var(--ui-info-solid) 19%, var(--ui-surface-default))",
1215
- "var(--ui-surface-default)"
1231
+ "var(--ui-info-subtle-text, var(--ui-info-solid))"
1216
1232
  ],
1217
1233
  "fallbacks": [
1218
1234
  "color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary))",
1219
- "light-dark(color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)), var(--ui-text-primary))"
1235
+ "light-dark(color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)), var(--ui-text-primary))",
1236
+ "var(--ui-text-primary)"
1220
1237
  ]
1221
1238
  },
1222
1239
  {
@@ -1226,6 +1243,7 @@
1226
1243
  "var(--_badge-color-border, color-mix(in srgb, var(--_badge-text) 88%, transparent))",
1227
1244
  "var(--_badge-color-border, light-dark(color-mix(in srgb, var(--_badge-text) 88%, transparent), color-mix(in srgb, var(--_badge-text) 44%, transparent)))",
1228
1245
  "color-mix(in srgb, currentColor 20%, transparent)",
1246
+ "var(--_badge-color-border, var(--_badge-outline-surface))",
1229
1247
  "var(--_badge-color-border, var(--_badge-text))"
1230
1248
  ]
1231
1249
  },
@@ -1315,7 +1333,9 @@
1315
1333
  "var(--_badge-color-surface, var(--_badge-surface))",
1316
1334
  "var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent))",
1317
1335
  "var(--_badge-color-surface, var(--_badge-count-surface))",
1318
- "color-mix(in srgb, currentColor 6%, transparent)"
1336
+ "color-mix(in srgb, currentColor 6%, transparent)",
1337
+ "var(--_badge-color-surface, color-mix(in srgb, var(--ui-surface-raised) 88%, transparent))",
1338
+ "var(--_badge-color-surface, light-dark(\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%), transparent),\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%), transparent)\n ))"
1319
1339
  ]
1320
1340
  },
1321
1341
  {
@@ -1325,7 +1345,7 @@
1325
1345
  "var(--_badge-color-text, color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary)))",
1326
1346
  "var(--_badge-color-text, light-dark(color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)), var(--ui-text-primary)))",
1327
1347
  "inherit",
1328
- "var(--_badge-color-text, var(--_badge-surface))"
1348
+ "var(--_badge-color-text, var(--ui-text-primary))"
1329
1349
  ]
1330
1350
  }
1331
1351
  ],
@@ -1459,6 +1479,9 @@
1459
1479
  {
1460
1480
  "name": "--ui-surface-default"
1461
1481
  },
1482
+ {
1483
+ "name": "--ui-surface-raised"
1484
+ },
1462
1485
  {
1463
1486
  "name": "--ui-surface-subtle"
1464
1487
  },
@@ -1917,7 +1940,8 @@
1917
1940
  {
1918
1941
  "name": "--ui-button-active-surface",
1919
1942
  "fallbacks": [
1920
- "oklch(from var(--_tone) l c h / 18%)"
1943
+ "oklch(from var(--_tone) l c h / 18%)",
1944
+ "var(--ui-neutral-active)"
1921
1945
  ]
1922
1946
  },
1923
1947
  {
@@ -1927,6 +1951,7 @@
1927
1951
  ],
1928
1952
  "fallbacks": [
1929
1953
  "var(--ui-border)",
1954
+ "var(--ui-control-border)",
1930
1955
  "var(--ui-control-border, var(--ui-border-strong))"
1931
1956
  ]
1932
1957
  },
@@ -1974,6 +1999,7 @@
1974
1999
  "name": "--ui-button-hover-surface",
1975
2000
  "fallbacks": [
1976
2001
  "oklch(from var(--_tone) l c h / 12%)",
2002
+ "var(--ui-neutral-hover)",
1977
2003
  "var(--ui-control-surface, var(--ui-surface-elevated))"
1978
2004
  ]
1979
2005
  },
@@ -2023,6 +2049,7 @@
2023
2049
  "name": "--ui-button-surface",
2024
2050
  "fallbacks": [
2025
2051
  "oklch(from var(--_tone) l c h / 5%)",
2052
+ "var(--ui-neutral-surface)",
2026
2053
  "var(--ui-control-surface, var(--ui-surface-elevated))"
2027
2054
  ]
2028
2055
  },
@@ -2032,6 +2059,7 @@
2032
2059
  "var(--_hue-text)"
2033
2060
  ],
2034
2061
  "fallbacks": [
2062
+ "var(--ui-text)",
2035
2063
  "var(--ui-text-primary)"
2036
2064
  ]
2037
2065
  },
@@ -2049,6 +2077,18 @@
2049
2077
  {
2050
2078
  "name": "--ui-accent-active"
2051
2079
  },
2080
+ {
2081
+ "name": "--ui-accent-glow",
2082
+ "fallbacks": [
2083
+ "0 0 transparent"
2084
+ ]
2085
+ },
2086
+ {
2087
+ "name": "--ui-accent-highlight",
2088
+ "fallbacks": [
2089
+ "none"
2090
+ ]
2091
+ },
2052
2092
  {
2053
2093
  "name": "--ui-accent-hover"
2054
2094
  },
@@ -2154,9 +2194,30 @@
2154
2194
  {
2155
2195
  "name": "--ui-danger"
2156
2196
  },
2197
+ {
2198
+ "name": "--ui-danger-active",
2199
+ "fallbacks": [
2200
+ "var(--ui-danger-hover)"
2201
+ ]
2202
+ },
2203
+ {
2204
+ "name": "--ui-danger-glow",
2205
+ "fallbacks": [
2206
+ "0 0 transparent"
2207
+ ]
2208
+ },
2209
+ {
2210
+ "name": "--ui-danger-highlight",
2211
+ "fallbacks": [
2212
+ "none"
2213
+ ]
2214
+ },
2157
2215
  {
2158
2216
  "name": "--ui-danger-hover"
2159
2217
  },
2218
+ {
2219
+ "name": "--ui-danger-subtle-text"
2220
+ },
2160
2221
  {
2161
2222
  "name": "--ui-disabled-border"
2162
2223
  },
@@ -2202,6 +2263,30 @@
2202
2263
  {
2203
2264
  "name": "--ui-info"
2204
2265
  },
2266
+ {
2267
+ "name": "--ui-info-active"
2268
+ },
2269
+ {
2270
+ "name": "--ui-info-glow",
2271
+ "fallbacks": [
2272
+ "0 0 transparent"
2273
+ ]
2274
+ },
2275
+ {
2276
+ "name": "--ui-info-highlight",
2277
+ "fallbacks": [
2278
+ "none"
2279
+ ]
2280
+ },
2281
+ {
2282
+ "name": "--ui-info-hover"
2283
+ },
2284
+ {
2285
+ "name": "--ui-info-on-strong"
2286
+ },
2287
+ {
2288
+ "name": "--ui-info-subtle-text"
2289
+ },
2205
2290
  {
2206
2291
  "name": "--ui-line-height-tight"
2207
2292
  },
@@ -2220,6 +2305,27 @@
2220
2305
  "var(--ui-motion-fast)"
2221
2306
  ]
2222
2307
  },
2308
+ {
2309
+ "name": "--ui-neutral-active"
2310
+ },
2311
+ {
2312
+ "name": "--ui-neutral-glow",
2313
+ "fallbacks": [
2314
+ "0 0 transparent"
2315
+ ]
2316
+ },
2317
+ {
2318
+ "name": "--ui-neutral-highlight",
2319
+ "fallbacks": [
2320
+ "none"
2321
+ ]
2322
+ },
2323
+ {
2324
+ "name": "--ui-neutral-hover"
2325
+ },
2326
+ {
2327
+ "name": "--ui-neutral-surface"
2328
+ },
2223
2329
  {
2224
2330
  "name": "--ui-on-accent"
2225
2331
  },
@@ -2265,12 +2371,42 @@
2265
2371
  {
2266
2372
  "name": "--ui-success"
2267
2373
  },
2374
+ {
2375
+ "name": "--ui-success-active"
2376
+ },
2377
+ {
2378
+ "name": "--ui-success-glow",
2379
+ "fallbacks": [
2380
+ "0 0 transparent"
2381
+ ]
2382
+ },
2383
+ {
2384
+ "name": "--ui-success-highlight",
2385
+ "fallbacks": [
2386
+ "none"
2387
+ ]
2388
+ },
2389
+ {
2390
+ "name": "--ui-success-hover"
2391
+ },
2392
+ {
2393
+ "name": "--ui-success-on-strong"
2394
+ },
2395
+ {
2396
+ "name": "--ui-success-subtle-text"
2397
+ },
2268
2398
  {
2269
2399
  "name": "--ui-surface"
2270
2400
  },
2271
2401
  {
2272
2402
  "name": "--ui-surface-elevated"
2273
2403
  },
2404
+ {
2405
+ "name": "--ui-surface-highlight",
2406
+ "fallbacks": [
2407
+ "none"
2408
+ ]
2409
+ },
2274
2410
  {
2275
2411
  "name": "--ui-text"
2276
2412
  },
@@ -2282,6 +2418,30 @@
2282
2418
  },
2283
2419
  {
2284
2420
  "name": "--ui-warning"
2421
+ },
2422
+ {
2423
+ "name": "--ui-warning-active"
2424
+ },
2425
+ {
2426
+ "name": "--ui-warning-glow",
2427
+ "fallbacks": [
2428
+ "0 0 transparent"
2429
+ ]
2430
+ },
2431
+ {
2432
+ "name": "--ui-warning-highlight",
2433
+ "fallbacks": [
2434
+ "none"
2435
+ ]
2436
+ },
2437
+ {
2438
+ "name": "--ui-warning-hover"
2439
+ },
2440
+ {
2441
+ "name": "--ui-warning-on-strong"
2442
+ },
2443
+ {
2444
+ "name": "--ui-warning-subtle-text"
2285
2445
  }
2286
2446
  ]
2287
2447
  },
@@ -2335,6 +2495,20 @@
2335
2495
  "type": "boolean",
2336
2496
  "default": false
2337
2497
  },
2498
+ {
2499
+ "name": "preset",
2500
+ "property": "preset",
2501
+ "description": "A shortcut that sets appearance and tone together: primary is solid accent, standard is solid neutral, quiet is ghost neutral, and destructive is solid danger. A named preset takes precedence over variant and tone. Leave it at none to choose variant and tone independently.",
2502
+ "type": "keyword",
2503
+ "default": "none",
2504
+ "options": [
2505
+ "none",
2506
+ "primary",
2507
+ "standard",
2508
+ "quiet",
2509
+ "destructive"
2510
+ ]
2511
+ },
2338
2512
  {
2339
2513
  "name": "rel",
2340
2514
  "property": "rel",
@@ -2466,6 +2640,19 @@
2466
2640
  "type": "boolean",
2467
2641
  "default": false
2468
2642
  },
2643
+ {
2644
+ "name": "preset",
2645
+ "description": "A shortcut that sets appearance and tone together: primary is solid accent, standard is solid neutral, quiet is ghost neutral, and destructive is solid danger. A named preset takes precedence over variant and tone. Leave it at none to choose variant and tone independently.",
2646
+ "type": "\"none\" | \"primary\" | \"standard\" | \"quiet\" | \"destructive\"",
2647
+ "default": "none",
2648
+ "options": [
2649
+ "none",
2650
+ "primary",
2651
+ "standard",
2652
+ "quiet",
2653
+ "destructive"
2654
+ ]
2655
+ },
2469
2656
  {
2470
2657
  "name": "rel",
2471
2658
  "description": "The link's relationship to its destination, as on a native link. Only meaningful with as=\"a\".",
@@ -2587,8 +2774,8 @@
2587
2774
  "id": "@threadlabs/looma/ui-button/02-variant",
2588
2775
  "name": "02-variant",
2589
2776
  "title": "variant",
2590
- "description": "Solid, outline (the default), ghost, and danger cover the common emphasis and intent levels.",
2591
- "markup": "<ui-cluster gap=\"s\">\n <ui-button variant=\"solid\">Solid</ui-button>\n <ui-button variant=\"outline\">Outline</ui-button>\n <ui-button variant=\"ghost\">Ghost</ui-button>\n <ui-button variant=\"danger\">Danger</ui-button>\n</ui-cluster>",
2777
+ "description": "Appearance sets emphasis independently from tone: solid neutral is a standard action, and danger can be an outline. Named presets combine those shared choices.",
2778
+ "markup": "<ui-cluster gap=\"s\">\n <ui-button variant=\"solid\">Solid</ui-button>\n <ui-button variant=\"outline\">Outline</ui-button>\n <ui-button variant=\"ghost\">Ghost</ui-button>\n <ui-button variant=\"danger\">Danger</ui-button>\n <ui-button variant=\"solid\" tone=\"neutral\">Solid neutral</ui-button>\n <ui-button variant=\"outline\" tone=\"danger\">Danger outline</ui-button>\n <ui-button preset=\"primary\">Primary</ui-button>\n <ui-button preset=\"standard\">Standard</ui-button>\n <ui-button preset=\"quiet\">Quiet</ui-button>\n <ui-button preset=\"destructive\">Destructive</ui-button>\n</ui-cluster>",
2592
2779
  "resizable": false,
2593
2780
  "bindings": "",
2594
2781
  "frameworks": {}
@@ -2692,6 +2879,16 @@
2692
2879
  "resizable": false,
2693
2880
  "bindings": "",
2694
2881
  "frameworks": {}
2882
+ },
2883
+ {
2884
+ "id": "@threadlabs/looma/ui-button/12-tones",
2885
+ "name": "12-tones",
2886
+ "title": "Appearance and tone",
2887
+ "description": "Appearance controls emphasis; tone expresses intent. The same six tones work as solid, outline and quiet actions, including solid neutral. Icon actions use the same palette.",
2888
+ "markup": "<ui-stack>\n <ui-cluster>\n <ui-button variant=\"solid\" tone=\"accent\">Send memo</ui-button>\n <ui-button variant=\"solid\" tone=\"neutral\">File notes</ui-button>\n <ui-button variant=\"solid\" tone=\"danger\">Delete draft</ui-button>\n <ui-button variant=\"solid\" tone=\"success\">Approve leave</ui-button>\n <ui-button variant=\"solid\" tone=\"warning\">Review route</ui-button>\n <ui-button variant=\"solid\" tone=\"info\">See briefing</ui-button>\n </ui-cluster>\n <ui-cluster>\n <ui-button variant=\"outline\" tone=\"accent\">Send memo</ui-button>\n <ui-button variant=\"outline\" tone=\"neutral\">File notes</ui-button>\n <ui-button variant=\"outline\" tone=\"danger\">Delete draft</ui-button>\n <ui-button variant=\"outline\" tone=\"success\">Approve leave</ui-button>\n <ui-button variant=\"outline\" tone=\"warning\">Review route</ui-button>\n <ui-button variant=\"outline\" tone=\"info\">See briefing</ui-button>\n </ui-cluster>\n <ui-cluster>\n <ui-button variant=\"ghost\" tone=\"accent\">Send memo</ui-button>\n <ui-button variant=\"ghost\" tone=\"neutral\">File notes</ui-button>\n <ui-button variant=\"ghost\" tone=\"danger\">Delete draft</ui-button>\n <ui-button variant=\"ghost\" tone=\"success\">Approve leave</ui-button>\n <ui-button variant=\"ghost\" tone=\"warning\">Review route</ui-button>\n <ui-button variant=\"ghost\" tone=\"info\">See briefing</ui-button>\n </ui-cluster>\n <ui-cluster>\n <ui-icon-button preset=\"primary\" match-button label=\"Send memo\"><ui-icon name=\"check\"></ui-icon></ui-icon-button>\n <ui-icon-button preset=\"standard\" match-button label=\"File notes\"><ui-icon name=\"check\"></ui-icon></ui-icon-button>\n <ui-icon-button preset=\"destructive\" match-button label=\"Delete draft\"><ui-icon name=\"check\"></ui-icon></ui-icon-button>\n <ui-icon-button variant=\"solid\" tone=\"success\" match-button label=\"Approve leave\"><ui-icon name=\"check\"></ui-icon></ui-icon-button>\n <ui-icon-button variant=\"solid\" tone=\"warning\" match-button label=\"Review route\"><ui-icon name=\"check\"></ui-icon></ui-icon-button>\n <ui-icon-button variant=\"solid\" tone=\"info\" match-button label=\"See briefing\"><ui-icon name=\"check\"></ui-icon></ui-icon-button>\n </ui-cluster>\n</ui-stack>",
2889
+ "resizable": false,
2890
+ "bindings": "",
2891
+ "frameworks": {}
2695
2892
  }
2696
2893
  ]
2697
2894
  },
@@ -2967,7 +3164,7 @@
2967
3164
  "tag": "ui-card",
2968
3165
  "package": "@threadlabs/looma",
2969
3166
  "root": "div",
2970
- "description": "A surface that groups content, with even space between its children. `outlined` (the default) is a bordered panel; `subtle` is a quiet filled one for supporting details; `elevated` floats a view's one card, such as sign-in. `padding` is `sm`, `md`, or `lg`. For a titled group of settings, use a Section with `variant=\"card\"`.",
3167
+ "description": "A surface that groups content with shared spacing and corners. Choose outlined, subtle or elevated; standard or expressive treatment independently follows the theme's material. Tones change colour without changing geometry.",
2971
3168
  "designTokens": {
2972
3169
  "sources": [
2973
3170
  "packages/looma/src/components/ui-card/ui-card.html"
@@ -2977,9 +3174,6 @@
2977
3174
  {
2978
3175
  "name": "--ui-accent"
2979
3176
  },
2980
- {
2981
- "name": "--ui-accent-line-width"
2982
- },
2983
3177
  {
2984
3178
  "name": "--ui-border-default"
2985
3179
  },
@@ -2998,9 +3192,33 @@
2998
3192
  {
2999
3193
  "name": "--ui-danger-soft"
3000
3194
  },
3195
+ {
3196
+ "name": "--ui-glassiness",
3197
+ "fallbacks": [
3198
+ "0"
3199
+ ]
3200
+ },
3001
3201
  {
3002
3202
  "name": "--ui-info"
3003
3203
  },
3204
+ {
3205
+ "name": "--ui-material-edge",
3206
+ "fallbacks": [
3207
+ "var(--ui-border-strong)"
3208
+ ]
3209
+ },
3210
+ {
3211
+ "name": "--ui-material-glass",
3212
+ "fallbacks": [
3213
+ "var(--ui-surface-raised)"
3214
+ ]
3215
+ },
3216
+ {
3217
+ "name": "--ui-material-glow",
3218
+ "fallbacks": [
3219
+ "0 0 transparent"
3220
+ ]
3221
+ },
3004
3222
  {
3005
3223
  "name": "--ui-radius-lg"
3006
3224
  },
@@ -3031,12 +3249,24 @@
3031
3249
  {
3032
3250
  "name": "--ui-surface-default"
3033
3251
  },
3252
+ {
3253
+ "name": "--ui-surface-highlight",
3254
+ "fallbacks": [
3255
+ "linear-gradient(transparent, transparent)"
3256
+ ]
3257
+ },
3034
3258
  {
3035
3259
  "name": "--ui-surface-muted"
3036
3260
  },
3037
3261
  {
3038
3262
  "name": "--ui-surface-raised"
3039
3263
  },
3264
+ {
3265
+ "name": "--ui-surface-separation",
3266
+ "fallbacks": [
3267
+ "0"
3268
+ ]
3269
+ },
3040
3270
  {
3041
3271
  "name": "--ui-text-primary"
3042
3272
  },
@@ -3088,7 +3318,7 @@
3088
3318
  {
3089
3319
  "name": "tone",
3090
3320
  "property": "tone",
3091
- "description": "accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Row highlights follow the surface hue; action controls retain their own intent.",
3321
+ "description": "accent, info, success, warning and danger add a quiet semantic surface without changing card geometry. Row highlights follow the surface hue; action controls retain their own intent.",
3092
3322
  "type": "keyword",
3093
3323
  "default": "neutral",
3094
3324
  "options": [
@@ -3100,10 +3330,21 @@
3100
3330
  "danger"
3101
3331
  ]
3102
3332
  },
3333
+ {
3334
+ "name": "treatment",
3335
+ "property": "treatment",
3336
+ "description": "How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material treatment. This does not add elevation or require glass.",
3337
+ "type": "keyword",
3338
+ "default": "standard",
3339
+ "options": [
3340
+ "standard",
3341
+ "expressive"
3342
+ ]
3343
+ },
3103
3344
  {
3104
3345
  "name": "variant",
3105
3346
  "property": "variant",
3106
- "description": "The surface. outlined is a bordered panel on the page; subtle is a quiet filled one with no border, for supporting details set apart from the flow; elevated floats above the page with a shadow, for a view's one card, such as sign-in.",
3347
+ "description": "The surface. outlined is a bordered panel on the page; subtle is a quiet filled one with no border, for supporting details set apart from the flow; elevated adds a subtle lift above the page, for a view's one card, such as sign-in. Treatment independently controls decorative material.",
3107
3348
  "type": "keyword",
3108
3349
  "default": "outlined",
3109
3350
  "options": [
@@ -3152,7 +3393,7 @@
3152
3393
  },
3153
3394
  {
3154
3395
  "name": "tone",
3155
- "description": "accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Row highlights follow the surface hue; action controls retain their own intent.",
3396
+ "description": "accent, info, success, warning and danger add a quiet semantic surface without changing card geometry. Row highlights follow the surface hue; action controls retain their own intent.",
3156
3397
  "type": "\"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"danger\"",
3157
3398
  "default": "neutral",
3158
3399
  "options": [
@@ -3164,9 +3405,19 @@
3164
3405
  "danger"
3165
3406
  ]
3166
3407
  },
3408
+ {
3409
+ "name": "treatment",
3410
+ "description": "How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material treatment. This does not add elevation or require glass.",
3411
+ "type": "\"standard\" | \"expressive\"",
3412
+ "default": "standard",
3413
+ "options": [
3414
+ "standard",
3415
+ "expressive"
3416
+ ]
3417
+ },
3167
3418
  {
3168
3419
  "name": "variant",
3169
- "description": "The surface. outlined is a bordered panel on the page; subtle is a quiet filled one with no border, for supporting details set apart from the flow; elevated floats above the page with a shadow, for a view's one card, such as sign-in.",
3420
+ "description": "The surface. outlined is a bordered panel on the page; subtle is a quiet filled one with no border, for supporting details set apart from the flow; elevated adds a subtle lift above the page, for a view's one card, such as sign-in. Treatment independently controls decorative material.",
3170
3421
  "type": "\"outlined\" | \"subtle\" | \"elevated\"",
3171
3422
  "default": "outlined",
3172
3423
  "options": [
@@ -3206,7 +3457,7 @@
3206
3457
  "id": "@threadlabs/looma/ui-card/02-danger",
3207
3458
  "name": "02-danger",
3208
3459
  "title": "Danger",
3209
- "description": "tone=\"danger\" tints a consequential section and draws a strong leading edge around its action.",
3460
+ "description": "tone=\"danger\" tints a consequential section while retaining the same corners and border geometry as other cards.",
3210
3461
  "markup": "<ui-card tone=\"danger\">\n <ui-text weight=\"semibold\">Delete this site</ui-text>\n <ui-text tone=\"secondary\" size=\"sm\">Everything in it is deleted for everyone.</ui-text>\n <ui-cluster><ui-button variant=\"solid\" tone=\"danger\">Delete site</ui-button></ui-cluster>\n</ui-card>",
3211
3462
  "resizable": false,
3212
3463
  "bindings": "",
@@ -3221,6 +3472,16 @@
3221
3472
  "resizable": false,
3222
3473
  "bindings": "",
3223
3474
  "frameworks": {}
3475
+ },
3476
+ {
3477
+ "id": "@threadlabs/looma/ui-card/04-expressive-surface",
3478
+ "name": "04-expressive-surface",
3479
+ "title": "Expressive surface",
3480
+ "description": "Expressive treatment uses the theme's material independently of elevation. Bookish catches light through a frosted rim; a matte theme stays opaque. Ordinary elevated cards retain their subtle lift.",
3481
+ "markup": "<ui-card variant=\"elevated\" treatment=\"expressive\">\n <ui-text variant=\"eyebrow\" tone=\"secondary\">Fellowship office</ui-text>\n <ui-text variant=\"heading\" as=\"h2\">Second breakfast briefing</ui-text>\n <ui-text>Sam has prepared the agenda. Frodo is bringing the maps, and Sméagol has volunteered to take minutes.</ui-text>\n <ui-cluster><ui-button preset=\"primary\">Join briefing</ui-button><ui-button preset=\"quiet\">Read agenda</ui-button></ui-cluster>\n</ui-card>",
3482
+ "resizable": false,
3483
+ "bindings": "",
3484
+ "frameworks": {}
3224
3485
  }
3225
3486
  ]
3226
3487
  },
@@ -3255,6 +3516,12 @@
3255
3516
  }
3256
3517
  ],
3257
3518
  "shared": [
3519
+ {
3520
+ "name": "--ui-accent-highlight",
3521
+ "fallbacks": [
3522
+ "none"
3523
+ ]
3524
+ },
3258
3525
  {
3259
3526
  "name": "--ui-accent-solid"
3260
3527
  },
@@ -3360,6 +3627,12 @@
3360
3627
  {
3361
3628
  "name": "--ui-surface-default"
3362
3629
  },
3630
+ {
3631
+ "name": "--ui-surface-highlight",
3632
+ "fallbacks": [
3633
+ "none"
3634
+ ]
3635
+ },
3363
3636
  {
3364
3637
  "name": "--ui-text-on-accent"
3365
3638
  },
@@ -3556,7 +3829,7 @@
3556
3829
  "name": "01-default",
3557
3830
  "title": "Default",
3558
3831
  "description": "With no state properties supplied, Checkbox starts unchecked and enabled.",
3559
- "markup": "<ui-checkbox>Checkbox</ui-checkbox>",
3832
+ "markup": "<ui-checkbox>Notify Sam</ui-checkbox>",
3560
3833
  "resizable": false,
3561
3834
  "bindings": "",
3562
3835
  "frameworks": {}
@@ -4168,7 +4441,7 @@
4168
4441
  "name": "01-shapes-and-sizes",
4169
4442
  "title": "Shapes and shared sizes",
4170
4443
  "description": "Square by default, circular with round. Each swatch matches the adjacent field. Click again or press Escape to close.",
4171
- "markup": "<ui-stack>\n <ui-cluster wrap=\"nowrap\"><ui-color-picker size=\"sm\" value=\"#7c3aed\" label=\"Small colour\"></ui-color-picker><ui-input\n size=\"sm\"\n value=\"#7c3aed\"\n aria-label=\"Small field\"\n ></ui-input></ui-cluster>\n <ui-cluster wrap=\"nowrap\"><ui-color-picker value=\"#16a34a\" label=\"Medium colour\"></ui-color-picker><ui-input\n value=\"#16a34a\"\n aria-label=\"Medium field\"\n ></ui-input></ui-cluster>\n <ui-cluster wrap=\"nowrap\"><ui-color-picker size=\"lg\" round value=\"#2563eb\" label=\"Large circular colour\"></ui-color-picker><ui-input\n size=\"lg\"\n value=\"#2563eb\"\n aria-label=\"Large field\"\n ></ui-input></ui-cluster>\n</ui-stack>",
4444
+ "markup": "<ui-stack>\n <ui-cluster wrap=\"nowrap\"><ui-color-picker size=\"sm\" value=\"#7c3aed\" label=\"Frodo’s calendar colour\"></ui-color-picker><ui-input\n size=\"sm\"\n value=\"#7c3aed\"\n aria-label=\"Frodo’s calendar hex\"\n ></ui-input></ui-cluster>\n <ui-cluster wrap=\"nowrap\"><ui-color-picker value=\"#16a34a\" label=\"Sam’s desk colour\"></ui-color-picker><ui-input\n value=\"#16a34a\"\n aria-label=\"Sam’s desk hex\"\n ></ui-input></ui-cluster>\n <ui-cluster wrap=\"nowrap\"><ui-color-picker size=\"lg\" round value=\"#2563eb\" label=\"Sméagol’s badge colour\"></ui-color-picker><ui-input\n size=\"lg\"\n value=\"#2563eb\"\n aria-label=\"Sméagol’s badge hex\"\n ></ui-input></ui-cluster>\n</ui-stack>",
4172
4445
  "resizable": false,
4173
4446
  "bindings": "",
4174
4447
  "frameworks": {}
@@ -5968,7 +6241,7 @@
5968
6241
  "name": "01-default",
5969
6242
  "title": "Default",
5970
6243
  "description": "With no properties supplied, Container caps its column at a 65ch measure, centers it in the available space, and pads it with default gutters.",
5971
- "markup": "<ui-container>\n <div>Default 65ch measure</div>\n</ui-container>",
6244
+ "markup": "<ui-container>\n <ui-card padding=\"sm\">The Fellowship office memo stays within a readable 65ch measure.</ui-card>\n</ui-container>",
5972
6245
  "resizable": false,
5973
6246
  "bindings": "",
5974
6247
  "frameworks": {}
@@ -6364,21 +6637,54 @@
6364
6637
  ]
6365
6638
  },
6366
6639
  {
6367
- "tag": "ui-description-item",
6640
+ "tag": "ui-curve-editor",
6368
6641
  "package": "@threadlabs/looma",
6369
- "root": "div",
6370
- "description": "One `term` and its value (the content) in a Description List, laid out by the list. See [Description List](/components/ui-description-list).",
6642
+ "root": "span",
6643
+ "description": "Draggable cubic Bézier handles with keyboard and bounded exact coordinate editing.",
6371
6644
  "designTokens": {
6372
6645
  "sources": [
6373
- "packages/looma/src/components/ui-description-item/ui-description-item.html"
6646
+ "packages/looma/src/components/ui-curve-editor/ui-curve-editor.html"
6374
6647
  ],
6375
6648
  "component": [],
6376
6649
  "shared": [
6377
6650
  {
6378
- "name": "--ui-border-default"
6651
+ "name": "--ui-accent-solid"
6379
6652
  },
6380
6653
  {
6381
- "name": "--ui-font-medium"
6654
+ "name": "--ui-border-width"
6655
+ },
6656
+ {
6657
+ "name": "--ui-control-border"
6658
+ },
6659
+ {
6660
+ "name": "--ui-control-focus",
6661
+ "fallbacks": [
6662
+ "var(--ui-accent-solid)"
6663
+ ]
6664
+ },
6665
+ {
6666
+ "name": "--ui-control-min-block-size"
6667
+ },
6668
+ {
6669
+ "name": "--ui-control-surface",
6670
+ "fallbacks": [
6671
+ "var(--ui-surface)"
6672
+ ]
6673
+ },
6674
+ {
6675
+ "name": "--ui-field-radius",
6676
+ "fallbacks": [
6677
+ "var(--ui-radius-md)"
6678
+ ]
6679
+ },
6680
+ {
6681
+ "name": "--ui-focus-width"
6682
+ },
6683
+ {
6684
+ "name": "--ui-font-mono",
6685
+ "fallbacks": [
6686
+ "monospace"
6687
+ ]
6382
6688
  },
6383
6689
  {
6384
6690
  "name": "--ui-font-size-sm"
@@ -6386,24 +6692,189 @@
6386
6692
  {
6387
6693
  "name": "--ui-radius-md"
6388
6694
  },
6695
+ {
6696
+ "name": "--ui-shadow-xs"
6697
+ },
6389
6698
  {
6390
6699
  "name": "--ui-space-1"
6391
6700
  },
6392
6701
  {
6393
- "name": "--ui-space-6"
6702
+ "name": "--ui-space-2"
6394
6703
  },
6395
6704
  {
6396
- "name": "--ui-text-muted"
6705
+ "name": "--ui-space-3"
6397
6706
  },
6398
6707
  {
6399
- "name": "--ui-text-primary"
6400
- }
6401
- ]
6402
- },
6403
- "attributes": [
6404
- {
6405
- "name": "term",
6406
- "property": "term",
6708
+ "name": "--ui-space-4"
6709
+ },
6710
+ {
6711
+ "name": "--ui-surface"
6712
+ },
6713
+ {
6714
+ "name": "--ui-surface-raised"
6715
+ },
6716
+ {
6717
+ "name": "--ui-text-primary"
6718
+ }
6719
+ ]
6720
+ },
6721
+ "attributes": [
6722
+ {
6723
+ "name": "disabled",
6724
+ "property": "disabled",
6725
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
6726
+ "type": "boolean",
6727
+ "default": false
6728
+ },
6729
+ {
6730
+ "name": "label",
6731
+ "property": "label",
6732
+ "description": "Accessible name for the editing control.",
6733
+ "type": "string",
6734
+ "default": "Value"
6735
+ },
6736
+ {
6737
+ "name": "size",
6738
+ "property": "size",
6739
+ "description": "Shared field and button height.",
6740
+ "type": "keyword",
6741
+ "default": "md",
6742
+ "options": [
6743
+ "sm",
6744
+ "md",
6745
+ "lg"
6746
+ ]
6747
+ },
6748
+ {
6749
+ "name": "value",
6750
+ "property": "value",
6751
+ "description": "CSS cubic-bezier or a standard easing keyword. X stays within 0–1; Y is bounded to -1–2 for a limited overshoot.",
6752
+ "type": "string",
6753
+ "default": "cubic-bezier(0.25, 0.1, 0.25, 1)"
6754
+ }
6755
+ ],
6756
+ "properties": [
6757
+ {
6758
+ "name": "disabled",
6759
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
6760
+ "type": "boolean",
6761
+ "default": false
6762
+ },
6763
+ {
6764
+ "name": "label",
6765
+ "description": "Accessible name for the editing control.",
6766
+ "type": "string",
6767
+ "default": "Value"
6768
+ },
6769
+ {
6770
+ "name": "size",
6771
+ "description": "Shared field and button height.",
6772
+ "type": "\"sm\" | \"md\" | \"lg\"",
6773
+ "default": "md",
6774
+ "options": [
6775
+ "sm",
6776
+ "md",
6777
+ "lg"
6778
+ ]
6779
+ },
6780
+ {
6781
+ "name": "value",
6782
+ "description": "CSS cubic-bezier or a standard easing keyword. X stays within 0–1; Y is bounded to -1–2 for a limited overshoot.",
6783
+ "type": "string",
6784
+ "default": "cubic-bezier(0.25, 0.1, 0.25, 1)"
6785
+ }
6786
+ ],
6787
+ "events": [
6788
+ {
6789
+ "name": "change",
6790
+ "detailType": "{ readonly value: string }",
6791
+ "detailSchema": "object",
6792
+ "fields": [
6793
+ {
6794
+ "path": "value",
6795
+ "type": "string",
6796
+ "required": true
6797
+ }
6798
+ ],
6799
+ "detailDocs": "Emitted when a toggleable control changes checked state."
6800
+ },
6801
+ {
6802
+ "name": "input",
6803
+ "detailType": "{ readonly value: string }",
6804
+ "detailSchema": "object",
6805
+ "fields": [
6806
+ {
6807
+ "path": "value",
6808
+ "type": "string",
6809
+ "required": true
6810
+ }
6811
+ ],
6812
+ "detailDocs": "Emitted with the declared detail payload."
6813
+ }
6814
+ ],
6815
+ "slots": [],
6816
+ "group": "forms",
6817
+ "id": "@threadlabs/looma/ui-curve-editor",
6818
+ "title": "Curve Editor",
6819
+ "resource": "@threadlabs/looma/components/ui-curve-editor/ui-curve-editor.html",
6820
+ "targets": [
6821
+ "html-next",
6822
+ "vue"
6823
+ ],
6824
+ "examples": [
6825
+ {
6826
+ "id": "@threadlabs/looma/ui-curve-editor/01-editing",
6827
+ "name": "01-editing",
6828
+ "title": "Exact and visual editing",
6829
+ "description": "Draggable cubic Bézier handles with keyboard and bounded exact coordinate editing.",
6830
+ "markup": "<ui-curve-editor label=\"Fellowship office motion\" value=\"cubic-bezier(0.25, 0.1, 0.25, 1)\"></ui-curve-editor>",
6831
+ "resizable": false,
6832
+ "bindings": "",
6833
+ "frameworks": {}
6834
+ }
6835
+ ]
6836
+ },
6837
+ {
6838
+ "tag": "ui-description-item",
6839
+ "package": "@threadlabs/looma",
6840
+ "root": "div",
6841
+ "description": "One `term` and its value (the content) in a Description List, laid out by the list. See [Description List](/components/ui-description-list).",
6842
+ "designTokens": {
6843
+ "sources": [
6844
+ "packages/looma/src/components/ui-description-item/ui-description-item.html"
6845
+ ],
6846
+ "component": [],
6847
+ "shared": [
6848
+ {
6849
+ "name": "--ui-border-default"
6850
+ },
6851
+ {
6852
+ "name": "--ui-font-medium"
6853
+ },
6854
+ {
6855
+ "name": "--ui-font-size-sm"
6856
+ },
6857
+ {
6858
+ "name": "--ui-radius-md"
6859
+ },
6860
+ {
6861
+ "name": "--ui-space-1"
6862
+ },
6863
+ {
6864
+ "name": "--ui-space-6"
6865
+ },
6866
+ {
6867
+ "name": "--ui-text-muted"
6868
+ },
6869
+ {
6870
+ "name": "--ui-text-primary"
6871
+ }
6872
+ ]
6873
+ },
6874
+ "attributes": [
6875
+ {
6876
+ "name": "term",
6877
+ "property": "term",
6407
6878
  "description": "What the value is, such as \"Invited by\". The value is the item's content.",
6408
6879
  "type": "string",
6409
6880
  "default": ""
@@ -6645,7 +7116,8 @@
6645
7116
  {
6646
7117
  "name": "--ui-dialog-border",
6647
7118
  "fallbacks": [
6648
- "var(--ui-overlay-border, var(--ui-border-strong))"
7119
+ "var(--ui-overlay-border, var(--ui-border-strong))",
7120
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
6649
7121
  ]
6650
7122
  },
6651
7123
  {
@@ -6670,13 +7142,15 @@
6670
7142
  {
6671
7143
  "name": "--ui-dialog-shadow",
6672
7144
  "fallbacks": [
6673
- "var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)))"
7145
+ "var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)))",
7146
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-dialog, var(--ui-shadow-xl))\n )"
6674
7147
  ]
6675
7148
  },
6676
7149
  {
6677
7150
  "name": "--ui-dialog-surface",
6678
7151
  "fallbacks": [
6679
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
7152
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
7153
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
6680
7154
  ]
6681
7155
  },
6682
7156
  {
@@ -6717,9 +7191,39 @@
6717
7191
  {
6718
7192
  "name": "--ui-font-size-lg"
6719
7193
  },
7194
+ {
7195
+ "name": "--ui-glassiness",
7196
+ "fallbacks": [
7197
+ "0"
7198
+ ]
7199
+ },
6720
7200
  {
6721
7201
  "name": "--ui-line-height-tight"
6722
7202
  },
7203
+ {
7204
+ "name": "--ui-material-content",
7205
+ "fallbacks": [
7206
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
7207
+ ]
7208
+ },
7209
+ {
7210
+ "name": "--ui-material-edge",
7211
+ "fallbacks": [
7212
+ "var(--ui-border-strong)"
7213
+ ]
7214
+ },
7215
+ {
7216
+ "name": "--ui-material-glass",
7217
+ "fallbacks": [
7218
+ "var(--ui-surface-elevated)"
7219
+ ]
7220
+ },
7221
+ {
7222
+ "name": "--ui-material-glow",
7223
+ "fallbacks": [
7224
+ "0 0 transparent"
7225
+ ]
7226
+ },
6723
7227
  {
6724
7228
  "name": "--ui-motion-base"
6725
7229
  },
@@ -6747,7 +7251,8 @@
6747
7251
  {
6748
7252
  "name": "--ui-overlay-shadow",
6749
7253
  "fallbacks": [
6750
- "var(--ui-elevation-dialog, var(--ui-shadow-xl))"
7254
+ "var(--ui-elevation-dialog, var(--ui-shadow-xl))",
7255
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-dialog, var(--ui-shadow-xl))"
6751
7256
  ]
6752
7257
  },
6753
7258
  {
@@ -6783,9 +7288,21 @@
6783
7288
  {
6784
7289
  "name": "--ui-surface-elevated"
6785
7290
  },
7291
+ {
7292
+ "name": "--ui-surface-highlight",
7293
+ "fallbacks": [
7294
+ "linear-gradient(transparent, transparent)"
7295
+ ]
7296
+ },
6786
7297
  {
6787
7298
  "name": "--ui-surface-muted"
6788
7299
  },
7300
+ {
7301
+ "name": "--ui-surface-separation",
7302
+ "fallbacks": [
7303
+ "0"
7304
+ ]
7305
+ },
6789
7306
  {
6790
7307
  "name": "--ui-text-primary"
6791
7308
  },
@@ -6850,7 +7367,7 @@
6850
7367
  {
6851
7368
  "name": "size",
6852
7369
  "property": "size",
6853
- "description": "Choose a compact, standard, wide, or viewport-filling dialog.",
7370
+ "description": "Choose a compact, standard, wide, or viewport-filling dialog. Shared surface separation adapts to dialog purpose and rendered size.",
6854
7371
  "type": "keyword",
6855
7372
  "default": "md",
6856
7373
  "options": [
@@ -6909,7 +7426,7 @@
6909
7426
  },
6910
7427
  {
6911
7428
  "name": "size",
6912
- "description": "Choose a compact, standard, wide, or viewport-filling dialog.",
7429
+ "description": "Choose a compact, standard, wide, or viewport-filling dialog. Shared surface separation adapts to dialog purpose and rendered size.",
6913
7430
  "type": "\"sm\" | \"md\" | \"lg\" | \"fullscreen\"",
6914
7431
  "default": "md",
6915
7432
  "options": [
@@ -7012,7 +7529,7 @@
7012
7529
  "name": "01-default",
7013
7530
  "title": "Default",
7014
7531
  "description": "Without modal a dialog is non-modal, like native show(): the rest of the page stays usable and the header close button is its exit. Label becomes the header title beside that button. Buttons in the actions slot sit right-aligned in the footer, secondary first and primary last; native command=\"close\" closes the dialog.",
7015
- "markup": "<ui-button id=\"open-confirmation\">Open dialog</ui-button>\n<ui-dialog id=\"confirmation-dialog\" for=\"open-confirmation\" label=\"Publish changes?\">\n <p>Your edits will be visible to everyone with access to this project.</p>\n <ui-button slot=\"actions\" commandfor=\"confirmation-dialog\" command=\"close\">Cancel</ui-button>\n <ui-button slot=\"actions\" variant=\"solid\" commandfor=\"confirmation-dialog\" command=\"close\">Publish</ui-button>\n</ui-dialog>",
7532
+ "markup": "<ui-button id=\"open-confirmation\">Review Fellowship memo</ui-button>\n<ui-dialog id=\"confirmation-dialog\" for=\"open-confirmation\" label=\"Send Fellowship memo?\">\n <p>Frodo and Sam will receive the updated route. Sméagol is keeping the meeting notes.</p>\n <ui-button slot=\"actions\" commandfor=\"confirmation-dialog\" command=\"close\">Keep draft</ui-button>\n <ui-button slot=\"actions\" variant=\"solid\" commandfor=\"confirmation-dialog\" command=\"close\">Send memo</ui-button>\n</ui-dialog>",
7016
7533
  "resizable": false,
7017
7534
  "bindings": "",
7018
7535
  "frameworks": {}
@@ -7061,7 +7578,7 @@
7061
7578
  "id": "@threadlabs/looma/ui-dialog/06-sizes",
7062
7579
  "name": "06-sizes",
7063
7580
  "title": "Sizes",
7064
- "description": "Use size for a common width. --ui-dialog-max-width is the one-off width escape hatch. This dialog is non-modal, so the rest of the page remains interactive.",
7581
+ "description": "Choose a common width with size. Glassiness and surface separation follow the shared theme; dialog purpose and rendered size determine the material treatment automatically. This dialog is non-modal, so the rest of the page remains interactive.",
7065
7582
  "markup": "<ui-button id=\"open-wide-dialog\">Open wide dialog</ui-button>\n<ui-dialog id=\"wide-dialog\" for=\"open-wide-dialog\" size=\"lg\" label=\"Reference details\">\n <p>Keep the rest of the page available while reviewing these details.</p>\n <ui-button slot=\"actions\" commandfor=\"wide-dialog\" command=\"close\">Done</ui-button>\n</ui-dialog>",
7066
7583
  "resizable": false,
7067
7584
  "bindings": "",
@@ -11767,7 +12284,7 @@
11767
12284
  "name": "01-default",
11768
12285
  "title": "Default",
11769
12286
  "description": "With no properties supplied, Grid uses its default gap and minimum column size.",
11770
- "markup": "<ui-grid>\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n</ui-grid>",
12287
+ "markup": "<ui-grid>\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n</ui-grid>",
11771
12288
  "resizable": false,
11772
12289
  "bindings": "",
11773
12290
  "frameworks": {}
@@ -11777,7 +12294,7 @@
11777
12294
  "name": "02-gap-and-minimum-column-width",
11778
12295
  "title": "Gap and minimum column width",
11779
12296
  "description": "Gap controls spacing while min controls the intrinsic wrap point for columns.",
11780
- "markup": "<ui-grid gap=\"xs\" min=\"sm\">\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n <span>Four</span>\n</ui-grid>",
12297
+ "markup": "<ui-grid gap=\"xs\" min=\"sm\">\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n <ui-card padding=\"sm\">Merry</ui-card>\n</ui-grid>",
11781
12298
  "resizable": false,
11782
12299
  "bindings": "",
11783
12300
  "frameworks": {}
@@ -11934,6 +12451,18 @@
11934
12451
  }
11935
12452
  ],
11936
12453
  "shared": [
12454
+ {
12455
+ "name": "--ui-accent-glow",
12456
+ "fallbacks": [
12457
+ "0 0 transparent"
12458
+ ]
12459
+ },
12460
+ {
12461
+ "name": "--ui-accent-highlight",
12462
+ "fallbacks": [
12463
+ "none"
12464
+ ]
12465
+ },
11937
12466
  {
11938
12467
  "name": "--ui-accent-hover"
11939
12468
  },
@@ -12012,6 +12541,30 @@
12012
12541
  {
12013
12542
  "name": "--ui-control-size-sm"
12014
12543
  },
12544
+ {
12545
+ "name": "--ui-danger"
12546
+ },
12547
+ {
12548
+ "name": "--ui-danger-glow",
12549
+ "fallbacks": [
12550
+ "0 0 transparent"
12551
+ ]
12552
+ },
12553
+ {
12554
+ "name": "--ui-danger-highlight",
12555
+ "fallbacks": [
12556
+ "none"
12557
+ ]
12558
+ },
12559
+ {
12560
+ "name": "--ui-danger-hover"
12561
+ },
12562
+ {
12563
+ "name": "--ui-danger-on-strong"
12564
+ },
12565
+ {
12566
+ "name": "--ui-danger-subtle-text"
12567
+ },
12015
12568
  {
12016
12569
  "name": "--ui-disabled-border"
12017
12570
  },
@@ -12039,6 +12592,30 @@
12039
12592
  {
12040
12593
  "name": "--ui-icon-size-sm"
12041
12594
  },
12595
+ {
12596
+ "name": "--ui-info"
12597
+ },
12598
+ {
12599
+ "name": "--ui-info-glow",
12600
+ "fallbacks": [
12601
+ "0 0 transparent"
12602
+ ]
12603
+ },
12604
+ {
12605
+ "name": "--ui-info-highlight",
12606
+ "fallbacks": [
12607
+ "none"
12608
+ ]
12609
+ },
12610
+ {
12611
+ "name": "--ui-info-hover"
12612
+ },
12613
+ {
12614
+ "name": "--ui-info-on-strong"
12615
+ },
12616
+ {
12617
+ "name": "--ui-info-subtle-text"
12618
+ },
12042
12619
  {
12043
12620
  "name": "--ui-motion-base"
12044
12621
  },
@@ -12054,6 +12631,24 @@
12054
12631
  "var(--ui-motion-fast)"
12055
12632
  ]
12056
12633
  },
12634
+ {
12635
+ "name": "--ui-neutral-glow",
12636
+ "fallbacks": [
12637
+ "0 0 transparent"
12638
+ ]
12639
+ },
12640
+ {
12641
+ "name": "--ui-neutral-highlight",
12642
+ "fallbacks": [
12643
+ "none"
12644
+ ]
12645
+ },
12646
+ {
12647
+ "name": "--ui-neutral-hover"
12648
+ },
12649
+ {
12650
+ "name": "--ui-neutral-surface"
12651
+ },
12057
12652
  {
12058
12653
  "name": "--ui-press-scale",
12059
12654
  "fallbacks": [
@@ -12070,16 +12665,73 @@
12070
12665
  "name": "--ui-radius-round"
12071
12666
  },
12072
12667
  {
12073
- "name": "--ui-surface-default"
12074
- },
12075
- {
12076
- "name": "--ui-text-on-accent"
12668
+ "name": "--ui-success"
12077
12669
  },
12078
12670
  {
12079
- "name": "--ui-text-primary"
12671
+ "name": "--ui-success-glow",
12672
+ "fallbacks": [
12673
+ "0 0 transparent"
12674
+ ]
12675
+ },
12676
+ {
12677
+ "name": "--ui-success-highlight",
12678
+ "fallbacks": [
12679
+ "none"
12680
+ ]
12681
+ },
12682
+ {
12683
+ "name": "--ui-success-hover"
12684
+ },
12685
+ {
12686
+ "name": "--ui-success-on-strong"
12687
+ },
12688
+ {
12689
+ "name": "--ui-success-subtle-text"
12690
+ },
12691
+ {
12692
+ "name": "--ui-surface-default"
12693
+ },
12694
+ {
12695
+ "name": "--ui-surface-highlight",
12696
+ "fallbacks": [
12697
+ "none"
12698
+ ]
12699
+ },
12700
+ {
12701
+ "name": "--ui-text"
12702
+ },
12703
+ {
12704
+ "name": "--ui-text-on-accent"
12705
+ },
12706
+ {
12707
+ "name": "--ui-text-primary"
12080
12708
  },
12081
12709
  {
12082
12710
  "name": "--ui-text-secondary"
12711
+ },
12712
+ {
12713
+ "name": "--ui-warning"
12714
+ },
12715
+ {
12716
+ "name": "--ui-warning-glow",
12717
+ "fallbacks": [
12718
+ "0 0 transparent"
12719
+ ]
12720
+ },
12721
+ {
12722
+ "name": "--ui-warning-highlight",
12723
+ "fallbacks": [
12724
+ "none"
12725
+ ]
12726
+ },
12727
+ {
12728
+ "name": "--ui-warning-hover"
12729
+ },
12730
+ {
12731
+ "name": "--ui-warning-on-strong"
12732
+ },
12733
+ {
12734
+ "name": "--ui-warning-subtle-text"
12083
12735
  }
12084
12736
  ]
12085
12737
  },
@@ -12136,6 +12788,20 @@
12136
12788
  "type": "boolean",
12137
12789
  "default": false
12138
12790
  },
12791
+ {
12792
+ "name": "preset",
12793
+ "property": "preset",
12794
+ "description": "The same shortcuts as Button: primary is solid accent, standard is solid neutral, quiet is ghost neutral, and destructive is solid danger. A named preset wins over variant and tone; none preserves independent choices.",
12795
+ "type": "keyword",
12796
+ "default": "none",
12797
+ "options": [
12798
+ "none",
12799
+ "primary",
12800
+ "standard",
12801
+ "quiet",
12802
+ "destructive"
12803
+ ]
12804
+ },
12139
12805
  {
12140
12806
  "name": "revealed",
12141
12807
  "property": "revealed",
@@ -12165,11 +12831,17 @@
12165
12831
  {
12166
12832
  "name": "tone",
12167
12833
  "property": "tone",
12168
- "description": "Colour for every variant. When omitted, ghost and outline keep their neutral appearance and solid keeps its accent fill. Set accent for a coloured action or neutral for a quiet one. Native aria-pressed=\"true\" keeps an outline toggle visibly pressed; the consumer owns that state.",
12834
+ "description": "Colour for every variant. auto preserves the existing variant-specific default. When omitted, ghost and outline keep their neutral appearance and solid keeps its accent fill. Set accent for a coloured action or neutral for a quiet one. danger, success, warning and info share Button's intent colors. Native aria-pressed=\"true\" keeps an outline toggle visibly pressed; the consumer owns that state.",
12169
12835
  "type": "keyword",
12836
+ "default": "auto",
12170
12837
  "options": [
12838
+ "auto",
12171
12839
  "accent",
12172
- "neutral"
12840
+ "neutral",
12841
+ "danger",
12842
+ "success",
12843
+ "warning",
12844
+ "info"
12173
12845
  ]
12174
12846
  },
12175
12847
  {
@@ -12231,6 +12903,19 @@
12231
12903
  "type": "boolean",
12232
12904
  "default": false
12233
12905
  },
12906
+ {
12907
+ "name": "preset",
12908
+ "description": "The same shortcuts as Button: primary is solid accent, standard is solid neutral, quiet is ghost neutral, and destructive is solid danger. A named preset wins over variant and tone; none preserves independent choices.",
12909
+ "type": "\"none\" | \"primary\" | \"standard\" | \"quiet\" | \"destructive\"",
12910
+ "default": "none",
12911
+ "options": [
12912
+ "none",
12913
+ "primary",
12914
+ "standard",
12915
+ "quiet",
12916
+ "destructive"
12917
+ ]
12918
+ },
12234
12919
  {
12235
12920
  "name": "revealed",
12236
12921
  "description": "Keeps an anticipatory button visible while its context is active, such as a selected block or an open popup. It does not imply a pressed or expanded state.",
@@ -12256,11 +12941,17 @@
12256
12941
  },
12257
12942
  {
12258
12943
  "name": "tone",
12259
- "description": "Colour for every variant. When omitted, ghost and outline keep their neutral appearance and solid keeps its accent fill. Set accent for a coloured action or neutral for a quiet one. Native aria-pressed=\"true\" keeps an outline toggle visibly pressed; the consumer owns that state.",
12260
- "type": "\"accent\" | \"neutral\"",
12944
+ "description": "Colour for every variant. auto preserves the existing variant-specific default. When omitted, ghost and outline keep their neutral appearance and solid keeps its accent fill. Set accent for a coloured action or neutral for a quiet one. danger, success, warning and info share Button's intent colors. Native aria-pressed=\"true\" keeps an outline toggle visibly pressed; the consumer owns that state.",
12945
+ "type": "\"auto\" | \"accent\" | \"neutral\" | \"danger\" | \"success\" | \"warning\" | \"info\"",
12946
+ "default": "auto",
12261
12947
  "options": [
12948
+ "auto",
12262
12949
  "accent",
12263
- "neutral"
12950
+ "neutral",
12951
+ "danger",
12952
+ "success",
12953
+ "warning",
12954
+ "info"
12264
12955
  ]
12265
12956
  },
12266
12957
  {
@@ -12832,6 +13523,12 @@
12832
13523
  {
12833
13524
  "name": "--ui-surface-elevated"
12834
13525
  },
13526
+ {
13527
+ "name": "--ui-surface-highlight",
13528
+ "fallbacks": [
13529
+ "none"
13530
+ ]
13531
+ },
12835
13532
  {
12836
13533
  "name": "--ui-surface-muted"
12837
13534
  },
@@ -12996,7 +13693,7 @@
12996
13693
  "name": "01-default",
12997
13694
  "title": "Default",
12998
13695
  "description": "With no value or state properties supplied, Input exposes an empty, editable native control.",
12999
- "markup": "<ui-input type=\"text\" aria-label=\"Text\" placeholder=\"Enter text\"> </ui-input>",
13696
+ "markup": "<ui-input type=\"text\" aria-label=\"Office search\" placeholder=\"Search Fellowship office\"> </ui-input>",
13000
13697
  "resizable": false,
13001
13698
  "bindings": "",
13002
13699
  "frameworks": {}
@@ -13181,6 +13878,12 @@
13181
13878
  {
13182
13879
  "name": "--ui-surface-elevated"
13183
13880
  },
13881
+ {
13882
+ "name": "--ui-surface-highlight",
13883
+ "fallbacks": [
13884
+ "none"
13885
+ ]
13886
+ },
13184
13887
  {
13185
13888
  "name": "--ui-surface-muted"
13186
13889
  },
@@ -13365,6 +14068,229 @@
13365
14068
  }
13366
14069
  ]
13367
14070
  },
14071
+ {
14072
+ "tag": "ui-light-editor",
14073
+ "package": "@threadlabs/looma",
14074
+ "root": "span",
14075
+ "description": "Position a shared light source with a draggable, keyboard-operable handle and exact bounded coordinates. The position is relative to each illuminated surface.",
14076
+ "designTokens": {
14077
+ "sources": [
14078
+ "packages/looma/src/components/ui-light-editor/ui-light-editor.html"
14079
+ ],
14080
+ "component": [],
14081
+ "shared": [
14082
+ {
14083
+ "name": "--ui-accent"
14084
+ },
14085
+ {
14086
+ "name": "--ui-border"
14087
+ },
14088
+ {
14089
+ "name": "--ui-border-width"
14090
+ },
14091
+ {
14092
+ "name": "--ui-control-border"
14093
+ },
14094
+ {
14095
+ "name": "--ui-control-min-block-size"
14096
+ },
14097
+ {
14098
+ "name": "--ui-disabled-border"
14099
+ },
14100
+ {
14101
+ "name": "--ui-disabled-surface"
14102
+ },
14103
+ {
14104
+ "name": "--ui-field-radius",
14105
+ "fallbacks": [
14106
+ "var(--ui-radius-md)"
14107
+ ]
14108
+ },
14109
+ {
14110
+ "name": "--ui-focus-ring"
14111
+ },
14112
+ {
14113
+ "name": "--ui-focus-width"
14114
+ },
14115
+ {
14116
+ "name": "--ui-font-size-sm"
14117
+ },
14118
+ {
14119
+ "name": "--ui-neutral-surface",
14120
+ "fallbacks": [
14121
+ "var(--ui-surface)"
14122
+ ]
14123
+ },
14124
+ {
14125
+ "name": "--ui-radius-md"
14126
+ },
14127
+ {
14128
+ "name": "--ui-shadow-sm"
14129
+ },
14130
+ {
14131
+ "name": "--ui-space-1"
14132
+ },
14133
+ {
14134
+ "name": "--ui-space-2"
14135
+ },
14136
+ {
14137
+ "name": "--ui-space-3"
14138
+ },
14139
+ {
14140
+ "name": "--ui-surface"
14141
+ },
14142
+ {
14143
+ "name": "--ui-surface-raised"
14144
+ },
14145
+ {
14146
+ "name": "--ui-text-secondary"
14147
+ }
14148
+ ]
14149
+ },
14150
+ "attributes": [
14151
+ {
14152
+ "name": "disabled",
14153
+ "property": "disabled",
14154
+ "description": "Prevents pointer, keyboard and exact edits.",
14155
+ "type": "boolean",
14156
+ "default": false
14157
+ },
14158
+ {
14159
+ "name": "label",
14160
+ "property": "label",
14161
+ "description": "Accessible name for the position editor.",
14162
+ "type": "string",
14163
+ "default": "Light position"
14164
+ },
14165
+ {
14166
+ "name": "size",
14167
+ "property": "size",
14168
+ "description": "Sets both coordinate fields to the shared small, medium or large control height.",
14169
+ "type": "keyword",
14170
+ "default": "md",
14171
+ "options": [
14172
+ "sm",
14173
+ "md",
14174
+ "lg"
14175
+ ]
14176
+ },
14177
+ {
14178
+ "name": "x",
14179
+ "property": "x",
14180
+ "description": "Horizontal source position from 0 (left) to 1 (right), relative to every surface.",
14181
+ "type": "number",
14182
+ "default": 0.5
14183
+ },
14184
+ {
14185
+ "name": "y",
14186
+ "property": "y",
14187
+ "description": "Vertical source position from 0 (top) to 1 (bottom), relative to every surface.",
14188
+ "type": "number",
14189
+ "default": 0
14190
+ }
14191
+ ],
14192
+ "properties": [
14193
+ {
14194
+ "name": "disabled",
14195
+ "description": "Prevents pointer, keyboard and exact edits.",
14196
+ "type": "boolean",
14197
+ "default": false
14198
+ },
14199
+ {
14200
+ "name": "label",
14201
+ "description": "Accessible name for the position editor.",
14202
+ "type": "string",
14203
+ "default": "Light position"
14204
+ },
14205
+ {
14206
+ "name": "size",
14207
+ "description": "Sets both coordinate fields to the shared small, medium or large control height.",
14208
+ "type": "\"sm\" | \"md\" | \"lg\"",
14209
+ "default": "md",
14210
+ "options": [
14211
+ "sm",
14212
+ "md",
14213
+ "lg"
14214
+ ]
14215
+ },
14216
+ {
14217
+ "name": "x",
14218
+ "description": "Horizontal source position from 0 (left) to 1 (right), relative to every surface.",
14219
+ "type": "number",
14220
+ "default": 0.5
14221
+ },
14222
+ {
14223
+ "name": "y",
14224
+ "description": "Vertical source position from 0 (top) to 1 (bottom), relative to every surface.",
14225
+ "type": "number",
14226
+ "default": 0
14227
+ }
14228
+ ],
14229
+ "events": [
14230
+ {
14231
+ "name": "change",
14232
+ "detailType": "{ readonly x: number; readonly y: number }",
14233
+ "detailSchema": "object",
14234
+ "fields": [
14235
+ {
14236
+ "path": "x",
14237
+ "type": "number",
14238
+ "required": true
14239
+ },
14240
+ {
14241
+ "path": "y",
14242
+ "type": "number",
14243
+ "required": true
14244
+ }
14245
+ ],
14246
+ "detailDocs": "Emitted when a toggleable control changes checked state."
14247
+ },
14248
+ {
14249
+ "name": "input",
14250
+ "detailType": "{ readonly x: number; readonly y: number }",
14251
+ "detailSchema": "object",
14252
+ "fields": [
14253
+ {
14254
+ "path": "x",
14255
+ "type": "number",
14256
+ "required": true
14257
+ },
14258
+ {
14259
+ "path": "y",
14260
+ "type": "number",
14261
+ "required": true
14262
+ }
14263
+ ],
14264
+ "detailDocs": "Emitted with the declared detail payload."
14265
+ }
14266
+ ],
14267
+ "slots": [
14268
+ {
14269
+ "name": "default",
14270
+ "description": "Default child content."
14271
+ }
14272
+ ],
14273
+ "group": "forms",
14274
+ "id": "@threadlabs/looma/ui-light-editor",
14275
+ "title": "Light Editor",
14276
+ "resource": "@threadlabs/looma/components/ui-light-editor/ui-light-editor.html",
14277
+ "targets": [
14278
+ "html-next",
14279
+ "vue"
14280
+ ],
14281
+ "examples": [
14282
+ {
14283
+ "id": "@threadlabs/looma/ui-light-editor/01-position",
14284
+ "name": "01-position",
14285
+ "title": "Light position",
14286
+ "description": "Move the source with a pointer, touch, arrow keys or exact coordinates. The source describes a position relative to every illuminated surface.",
14287
+ "markup": "<ui-light-editor label=\"Fellowship office light\" x=\"0.5\" y=\"0\"></ui-light-editor>",
14288
+ "resizable": false,
14289
+ "bindings": "",
14290
+ "frameworks": {}
14291
+ }
14292
+ ]
14293
+ },
13368
14294
  {
13369
14295
  "tag": "ui-list",
13370
14296
  "package": "@threadlabs/looma",
@@ -14191,7 +15117,8 @@
14191
15117
  {
14192
15118
  "name": "--ui-menu-border",
14193
15119
  "fallbacks": [
14194
- "var(--ui-overlay-border, var(--ui-border-strong))"
15120
+ "var(--ui-overlay-border, var(--ui-border-strong))",
15121
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
14195
15122
  ]
14196
15123
  },
14197
15124
  {
@@ -14203,13 +15130,15 @@
14203
15130
  {
14204
15131
  "name": "--ui-menu-shadow",
14205
15132
  "fallbacks": [
14206
- "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))"
15133
+ "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))",
15134
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))\n )"
14207
15135
  ]
14208
15136
  },
14209
15137
  {
14210
15138
  "name": "--ui-menu-surface",
14211
15139
  "fallbacks": [
14212
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
15140
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
15141
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
14213
15142
  ]
14214
15143
  },
14215
15144
  {
@@ -14241,6 +15170,36 @@
14241
15170
  {
14242
15171
  "name": "--ui-font-size-xs"
14243
15172
  },
15173
+ {
15174
+ "name": "--ui-glassiness",
15175
+ "fallbacks": [
15176
+ "0"
15177
+ ]
15178
+ },
15179
+ {
15180
+ "name": "--ui-material-content",
15181
+ "fallbacks": [
15182
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
15183
+ ]
15184
+ },
15185
+ {
15186
+ "name": "--ui-material-edge",
15187
+ "fallbacks": [
15188
+ "var(--ui-border-strong)"
15189
+ ]
15190
+ },
15191
+ {
15192
+ "name": "--ui-material-glass",
15193
+ "fallbacks": [
15194
+ "var(--ui-surface-elevated)"
15195
+ ]
15196
+ },
15197
+ {
15198
+ "name": "--ui-material-glow",
15199
+ "fallbacks": [
15200
+ "0 0 transparent"
15201
+ ]
15202
+ },
14244
15203
  {
14245
15204
  "name": "--ui-motion-ease"
14246
15205
  },
@@ -14262,7 +15221,8 @@
14262
15221
  {
14263
15222
  "name": "--ui-overlay-shadow",
14264
15223
  "fallbacks": [
14265
- "var(--ui-elevation-overlay, var(--ui-shadow-lg))"
15224
+ "var(--ui-elevation-overlay, var(--ui-shadow-lg))",
15225
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))"
14266
15226
  ]
14267
15227
  },
14268
15228
  {
@@ -14291,6 +15251,21 @@
14291
15251
  },
14292
15252
  {
14293
15253
  "name": "--ui-surface-elevated"
15254
+ },
15255
+ {
15256
+ "name": "--ui-surface-highlight",
15257
+ "fallbacks": [
15258
+ "linear-gradient(transparent, transparent)"
15259
+ ]
15260
+ },
15261
+ {
15262
+ "name": "--ui-surface-separation",
15263
+ "fallbacks": [
15264
+ "0"
15265
+ ]
15266
+ },
15267
+ {
15268
+ "name": "--ui-text-primary"
14294
15269
  }
14295
15270
  ]
14296
15271
  },
@@ -15653,6 +16628,203 @@
15653
16628
  }
15654
16629
  ]
15655
16630
  },
16631
+ {
16632
+ "tag": "ui-number-input",
16633
+ "package": "@threadlabs/looma",
16634
+ "root": "span",
16635
+ "description": "Bounded exact number and unit editing with safe arithmetic, stepping and keyboard controls.",
16636
+ "designTokens": {
16637
+ "sources": [
16638
+ "packages/looma/src/components/ui-number-input/ui-number-input.html"
16639
+ ],
16640
+ "component": [],
16641
+ "shared": [
16642
+ {
16643
+ "name": "--ui-space-1"
16644
+ }
16645
+ ]
16646
+ },
16647
+ "attributes": [
16648
+ {
16649
+ "name": "disabled",
16650
+ "property": "disabled",
16651
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
16652
+ "type": "boolean",
16653
+ "default": false
16654
+ },
16655
+ {
16656
+ "name": "label",
16657
+ "property": "label",
16658
+ "description": "Accessible name for the editing control.",
16659
+ "type": "string",
16660
+ "default": "Value"
16661
+ },
16662
+ {
16663
+ "name": "max",
16664
+ "property": "max",
16665
+ "description": "Inclusive upper bound applied to every editing path.",
16666
+ "type": "number",
16667
+ "default": 1000000
16668
+ },
16669
+ {
16670
+ "name": "min",
16671
+ "property": "min",
16672
+ "description": "Inclusive lower bound applied to typing, arithmetic, stepping and external values.",
16673
+ "type": "number",
16674
+ "default": -1000000
16675
+ },
16676
+ {
16677
+ "name": "name",
16678
+ "property": "name",
16679
+ "description": "Optional form field name.",
16680
+ "type": "string",
16681
+ "default": ""
16682
+ },
16683
+ {
16684
+ "name": "size",
16685
+ "property": "size",
16686
+ "description": "Shared field and button height.",
16687
+ "type": "keyword",
16688
+ "default": "md",
16689
+ "options": [
16690
+ "sm",
16691
+ "md",
16692
+ "lg"
16693
+ ]
16694
+ },
16695
+ {
16696
+ "name": "step",
16697
+ "property": "step",
16698
+ "description": "Positive increment used by arrows and step buttons; Shift multiplies it by ten.",
16699
+ "type": "number",
16700
+ "default": 1
16701
+ },
16702
+ {
16703
+ "name": "unit",
16704
+ "property": "unit",
16705
+ "description": "One accepted unit, such as px, rem, ms or %. Bare numbers use this unit. No automatic unit conversion.",
16706
+ "type": "string",
16707
+ "default": ""
16708
+ },
16709
+ {
16710
+ "name": "value",
16711
+ "property": "value",
16712
+ "description": "Exact value. Arithmetic is calculated on Enter or blur; the resulting value includes unit. Invalid expressions stay visible and expose invalid state.",
16713
+ "type": "string",
16714
+ "default": "0"
16715
+ }
16716
+ ],
16717
+ "properties": [
16718
+ {
16719
+ "name": "disabled",
16720
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
16721
+ "type": "boolean",
16722
+ "default": false
16723
+ },
16724
+ {
16725
+ "name": "label",
16726
+ "description": "Accessible name for the editing control.",
16727
+ "type": "string",
16728
+ "default": "Value"
16729
+ },
16730
+ {
16731
+ "name": "max",
16732
+ "description": "Inclusive upper bound applied to every editing path.",
16733
+ "type": "number",
16734
+ "default": 1000000
16735
+ },
16736
+ {
16737
+ "name": "min",
16738
+ "description": "Inclusive lower bound applied to typing, arithmetic, stepping and external values.",
16739
+ "type": "number",
16740
+ "default": -1000000
16741
+ },
16742
+ {
16743
+ "name": "name",
16744
+ "description": "Optional form field name.",
16745
+ "type": "string",
16746
+ "default": ""
16747
+ },
16748
+ {
16749
+ "name": "size",
16750
+ "description": "Shared field and button height.",
16751
+ "type": "\"sm\" | \"md\" | \"lg\"",
16752
+ "default": "md",
16753
+ "options": [
16754
+ "sm",
16755
+ "md",
16756
+ "lg"
16757
+ ]
16758
+ },
16759
+ {
16760
+ "name": "step",
16761
+ "description": "Positive increment used by arrows and step buttons; Shift multiplies it by ten.",
16762
+ "type": "number",
16763
+ "default": 1
16764
+ },
16765
+ {
16766
+ "name": "unit",
16767
+ "description": "One accepted unit, such as px, rem, ms or %. Bare numbers use this unit. No automatic unit conversion.",
16768
+ "type": "string",
16769
+ "default": ""
16770
+ },
16771
+ {
16772
+ "name": "value",
16773
+ "description": "Exact value. Arithmetic is calculated on Enter or blur; the resulting value includes unit. Invalid expressions stay visible and expose invalid state.",
16774
+ "type": "string",
16775
+ "default": "0"
16776
+ }
16777
+ ],
16778
+ "events": [
16779
+ {
16780
+ "name": "change",
16781
+ "detailType": "{ readonly value: string }",
16782
+ "detailSchema": "object",
16783
+ "fields": [
16784
+ {
16785
+ "path": "value",
16786
+ "type": "string",
16787
+ "required": true
16788
+ }
16789
+ ],
16790
+ "detailDocs": "Emitted when a toggleable control changes checked state."
16791
+ },
16792
+ {
16793
+ "name": "input",
16794
+ "detailType": "{ readonly value: string }",
16795
+ "detailSchema": "object",
16796
+ "fields": [
16797
+ {
16798
+ "path": "value",
16799
+ "type": "string",
16800
+ "required": true
16801
+ }
16802
+ ],
16803
+ "detailDocs": "Emitted with the declared detail payload."
16804
+ }
16805
+ ],
16806
+ "slots": [],
16807
+ "group": "forms",
16808
+ "id": "@threadlabs/looma/ui-number-input",
16809
+ "title": "Number Input",
16810
+ "resource": "@threadlabs/looma/components/ui-number-input/ui-number-input.html",
16811
+ "targets": [
16812
+ "html-next",
16813
+ "vue"
16814
+ ],
16815
+ "examples": [
16816
+ {
16817
+ "id": "@threadlabs/looma/ui-number-input/01-editing",
16818
+ "name": "01-editing",
16819
+ "title": "Exact and visual editing",
16820
+ "description": "Bounded exact number and unit editing with safe arithmetic, stepping and keyboard controls.",
16821
+ "markup": "<ui-number-input label=\"Frodo’s desk spacing\" value=\"16px\" unit=\"px\" min=\"8\" max=\"40\" step=\"1\"></ui-number-input>",
16822
+ "resizable": false,
16823
+ "bindings": "",
16824
+ "frameworks": {}
16825
+ }
16826
+ ]
16827
+ },
15656
16828
  {
15657
16829
  "tag": "ui-page-header",
15658
16830
  "package": "@threadlabs/looma",
@@ -15809,7 +16981,8 @@
15809
16981
  {
15810
16982
  "name": "--ui-popover-border",
15811
16983
  "fallbacks": [
15812
- "var(--ui-overlay-border, var(--ui-border-strong))"
16984
+ "var(--ui-overlay-border, var(--ui-border-strong))",
16985
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
15813
16986
  ]
15814
16987
  },
15815
16988
  {
@@ -15827,13 +17000,15 @@
15827
17000
  {
15828
17001
  "name": "--ui-popover-shadow",
15829
17002
  "fallbacks": [
15830
- "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))"
17003
+ "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))",
17004
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))\n )"
15831
17005
  ]
15832
17006
  },
15833
17007
  {
15834
17008
  "name": "--ui-popover-surface",
15835
17009
  "fallbacks": [
15836
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
17010
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
17011
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
15837
17012
  ]
15838
17013
  },
15839
17014
  {
@@ -15856,6 +17031,36 @@
15856
17031
  "var(--ui-shadow-lg)"
15857
17032
  ]
15858
17033
  },
17034
+ {
17035
+ "name": "--ui-glassiness",
17036
+ "fallbacks": [
17037
+ "0"
17038
+ ]
17039
+ },
17040
+ {
17041
+ "name": "--ui-material-content",
17042
+ "fallbacks": [
17043
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
17044
+ ]
17045
+ },
17046
+ {
17047
+ "name": "--ui-material-edge",
17048
+ "fallbacks": [
17049
+ "var(--ui-border-strong)"
17050
+ ]
17051
+ },
17052
+ {
17053
+ "name": "--ui-material-glass",
17054
+ "fallbacks": [
17055
+ "var(--ui-surface-elevated)"
17056
+ ]
17057
+ },
17058
+ {
17059
+ "name": "--ui-material-glow",
17060
+ "fallbacks": [
17061
+ "0 0 transparent"
17062
+ ]
17063
+ },
15859
17064
  {
15860
17065
  "name": "--ui-motion-ease"
15861
17066
  },
@@ -15877,7 +17082,8 @@
15877
17082
  {
15878
17083
  "name": "--ui-overlay-shadow",
15879
17084
  "fallbacks": [
15880
- "var(--ui-elevation-overlay, var(--ui-shadow-lg))"
17085
+ "var(--ui-elevation-overlay, var(--ui-shadow-lg))",
17086
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))"
15881
17087
  ]
15882
17088
  },
15883
17089
  {
@@ -15900,6 +17106,21 @@
15900
17106
  },
15901
17107
  {
15902
17108
  "name": "--ui-surface-elevated"
17109
+ },
17110
+ {
17111
+ "name": "--ui-surface-highlight",
17112
+ "fallbacks": [
17113
+ "linear-gradient(transparent, transparent)"
17114
+ ]
17115
+ },
17116
+ {
17117
+ "name": "--ui-surface-separation",
17118
+ "fallbacks": [
17119
+ "0"
17120
+ ]
17121
+ },
17122
+ {
17123
+ "name": "--ui-text-primary"
15903
17124
  }
15904
17125
  ]
15905
17126
  },
@@ -15949,7 +17170,7 @@
15949
17170
  {
15950
17171
  "name": "size",
15951
17172
  "property": "size",
15952
- "description": "Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content.",
17173
+ "description": "Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content. Shared surface separation adapts to popover purpose and rendered size.",
15953
17174
  "type": "keyword",
15954
17175
  "default": "content",
15955
17176
  "options": [
@@ -16001,7 +17222,7 @@
16001
17222
  },
16002
17223
  {
16003
17224
  "name": "size",
16004
- "description": "Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content.",
17225
+ "description": "Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content. Shared surface separation adapts to popover purpose and rendered size.",
16005
17226
  "type": "\"content\" | \"sm\" | \"md\" | \"lg\"",
16006
17227
  "default": "content",
16007
17228
  "options": [
@@ -16102,7 +17323,7 @@
16102
17323
  "name": "01-trigger-binding",
16103
17324
  "title": "Trigger binding",
16104
17325
  "description": "The for property connects Popover to the Looma button that toggles it.",
16105
- "markup": "<ui-button id=\"popover-trigger\" variant=\"ghost\">Open popover</ui-button>\n<ui-popover id=\"example-popover\" for=\"popover-trigger\">Popover content.</ui-popover>",
17326
+ "markup": "<ui-button id=\"popover-trigger\" variant=\"ghost\">Office briefing</ui-button>\n<ui-popover id=\"example-popover\" for=\"popover-trigger\">Sam has booked the quiet room. Frodo is bringing the maps.</ui-popover>",
16106
17327
  "resizable": false,
16107
17328
  "bindings": "",
16108
17329
  "frameworks": {}
@@ -16811,7 +18032,7 @@
16811
18032
  "name": "01-default",
16812
18033
  "title": "Default",
16813
18034
  "description": "With no layout properties supplied, Reel uses its base gap, item width, and snap behavior.",
16814
- "markup": "<ui-reel item-width=\"sm\" aria-label=\"Items\">\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n <span>Four</span>\n</ui-reel>",
18035
+ "markup": "<ui-reel item-width=\"sm\" aria-label=\"Items\">\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n <ui-card padding=\"sm\">Merry</ui-card>\n</ui-reel>",
16815
18036
  "resizable": false,
16816
18037
  "bindings": "",
16817
18038
  "frameworks": {}
@@ -16821,7 +18042,7 @@
16821
18042
  "name": "02-gap-item-width-and-snap",
16822
18043
  "title": "Gap, item width, and snap",
16823
18044
  "description": "These three properties control spacing, each child's basis, and the scroll snap position.",
16824
- "markup": "<ui-reel gap=\"m\" item-width=\"md\" snap=\"center\" aria-label=\"Items\">\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n <span>Four</span>\n</ui-reel>",
18045
+ "markup": "<ui-reel gap=\"m\" item-width=\"md\" snap=\"center\" aria-label=\"Items\">\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n <ui-card padding=\"sm\">Merry</ui-card>\n</ui-reel>",
16825
18046
  "resizable": false,
16826
18047
  "bindings": "",
16827
18048
  "frameworks": {}
@@ -16983,7 +18204,7 @@
16983
18204
  "name": "01-default",
16984
18205
  "title": "Default",
16985
18206
  "description": "A vertical area scrolls its content. The bottom edge fades while more is below; scroll down and the top fades too, and each fade lifts once that edge has nothing past it.",
16986
- "markup": "<ui-scroll-area style=\"block-size: 10rem\">\n <p>One</p>\n <p>Two</p>\n <p>Three</p>\n <p>Four</p>\n <p>Five</p>\n <p>Six</p>\n <p>Seven</p>\n <p>Eight</p>\n</ui-scroll-area>",
18207
+ "markup": "<ui-scroll-area style=\"block-size: 10rem\">\n <ui-stack gap=\"s\">\n <ui-card padding=\"sm\">Frodo — quarterly quest planning</ui-card>\n <ui-card padding=\"sm\">Sam — office garden rota</ui-card>\n <ui-card padding=\"sm\">Sméagol — lost property</ui-card>\n <ui-card padding=\"sm\">Merry — second breakfast</ui-card>\n <ui-card padding=\"sm\">Pippin — meeting room bookings</ui-card>\n <ui-card padding=\"sm\">Aragorn — team check-in</ui-card>\n <ui-card padding=\"sm\">Gimli — facilities requests</ui-card>\n <ui-card padding=\"sm\">Legolas — desk plants</ui-card>\n </ui-stack>\n</ui-scroll-area>",
16987
18208
  "resizable": false,
16988
18209
  "bindings": "",
16989
18210
  "frameworks": {}
@@ -17968,6 +19189,12 @@
17968
19189
  {
17969
19190
  "name": "--ui-surface-elevated"
17970
19191
  },
19192
+ {
19193
+ "name": "--ui-surface-highlight",
19194
+ "fallbacks": [
19195
+ "linear-gradient(transparent, transparent)"
19196
+ ]
19197
+ },
17971
19198
  {
17972
19199
  "name": "--ui-surface-muted"
17973
19200
  },
@@ -18620,9 +19847,9 @@
18620
19847
  "id": "@threadlabs/looma/ui-sidebar/01-app-shell",
18621
19848
  "name": "01-app-shell",
18622
19849
  "title": "App shell",
18623
- "description": "The sidebar is the panel only; the page places it beside its main content. The button toggles it with commandfor and command=\"--toggle\": docked it collapses, and below the breakpoint (48rem by default) it opens as a drawer. Each open and close is one toggle event, whose detail gives open, mode, and trigger; as a drawer the popover's own toggle event, which has no detail, reaches the panel too.",
18624
- "markup": "<div class=\"demo-app-shell\">\n <ui-sidebar id=\"sidebar-nav\" aria-label=\"Workspace\">\n <nav class=\"demo-app-nav\">\n <strong>Workspace</strong>\n <a href=\"#inbox\">Inbox</a>\n <a href=\"#projects\">Projects</a>\n <a href=\"#settings\">Settings</a>\n </nav>\n </ui-sidebar>\n <main class=\"demo-app-main\">\n <ui-icon-button commandfor=\"sidebar-nav\" command=\"--toggle\" label=\"Toggle sidebar\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n </ui-icon-button>\n <p>Main content sits beside the sidebar and fills the remaining space.</p>\n </main>\n</div>",
18625
- "resizable": false,
19850
+ "description": "The sidebar is the panel only; the page places it beside its main content. The button toggles it with commandfor and command=\"--toggle\": docked it collapses, and below the breakpoint (40rem in this example) it opens as a drawer. Each open and close is one toggle event, whose detail gives open, mode, and trigger; as a drawer the popover's own toggle event, which has no detail, reaches the panel too.",
19851
+ "markup": "<ui-cluster wrap=\"nowrap\" align=\"stretch\" gap=\"m\">\n <ui-sidebar breakpoint=\"sm\" id=\"sidebar-nav\" aria-label=\"Workspace\">\n <ui-stack gap=\"s\" role=\"navigation\" aria-label=\"Office sections\">\n <ui-text variant=\"eyebrow\">Fellowship office</ui-text>\n <ui-nav-item href=\"#inbox\" current=\"true\">Inbox</ui-nav-item>\n <ui-nav-item href=\"#projects\">Quest planning</ui-nav-item>\n <ui-nav-item href=\"#settings\">Office settings</ui-nav-item>\n </ui-stack>\n </ui-sidebar>\n <ui-stack fill role=\"main\">\n <ui-icon-button commandfor=\"sidebar-nav\" command=\"--toggle\" label=\"Toggle sidebar\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n </ui-icon-button>\n <ui-card padding=\"sm\">Frodo and Sam’s team updates sit beside the office navigation.</ui-card>\n </ui-stack>\n</ui-cluster>",
19852
+ "resizable": true,
18626
19853
  "bindings": "",
18627
19854
  "frameworks": {}
18628
19855
  },
@@ -18631,7 +19858,234 @@
18631
19858
  "name": "02-end-side-resizable",
18632
19859
  "title": "End side, resizable",
18633
19860
  "description": "side=\"end\" puts the panel on the end edge. resizable adds a handle on its inner edge: drag it, or focus it and use the arrow keys, Home, and End, within min-width and max-width. Double-click resets the width.",
18634
- "markup": "<div class=\"demo-app-shell\">\n <main class=\"demo-app-main\">\n <p>Main content comes first when the sidebar is on the end side.</p>\n </main>\n <ui-sidebar side=\"end\" width=\"260\" resizable min-width=\"200\" max-width=\"380\" aria-label=\"Details\">\n <div class=\"demo-app-nav\">\n <strong>Details</strong>\n <p>Drag the inner edge, or focus it and use the arrow keys.</p>\n </div>\n </ui-sidebar>\n</div>",
19861
+ "markup": "<ui-cluster wrap=\"nowrap\" align=\"stretch\" gap=\"m\">\n <ui-stack fill role=\"main\">\n <ui-card padding=\"sm\">The Fellowship office memo comes first, with its details alongside.</ui-card>\n </ui-stack>\n <ui-sidebar breakpoint=\"sm\" side=\"end\" width=\"260\" resizable min-width=\"200\" max-width=\"380\" aria-label=\"Details\">\n <ui-stack gap=\"s\">\n <ui-text variant=\"eyebrow\">Memo details</ui-text>\n <p>Drag the inner edge, or focus it and use the arrow keys.</p>\n </ui-stack>\n </ui-sidebar>\n</ui-cluster>",
19862
+ "resizable": true,
19863
+ "bindings": "",
19864
+ "frameworks": {}
19865
+ }
19866
+ ]
19867
+ },
19868
+ {
19869
+ "tag": "ui-slider",
19870
+ "package": "@threadlabs/looma",
19871
+ "root": "span",
19872
+ "description": "Native accessible range paired with bounded exact number and unit editing.",
19873
+ "designTokens": {
19874
+ "sources": [
19875
+ "packages/looma/src/components/ui-slider/ui-slider.html"
19876
+ ],
19877
+ "component": [],
19878
+ "shared": [
19879
+ {
19880
+ "name": "--ui-accent-solid"
19881
+ },
19882
+ {
19883
+ "name": "--ui-control-focus",
19884
+ "fallbacks": [
19885
+ "var(--ui-accent-solid)"
19886
+ ]
19887
+ },
19888
+ {
19889
+ "name": "--ui-control-min-block-size"
19890
+ },
19891
+ {
19892
+ "name": "--ui-control-size-lg"
19893
+ },
19894
+ {
19895
+ "name": "--ui-control-size-md"
19896
+ },
19897
+ {
19898
+ "name": "--ui-control-size-sm"
19899
+ },
19900
+ {
19901
+ "name": "--ui-focus-width"
19902
+ },
19903
+ {
19904
+ "name": "--ui-radius-sm"
19905
+ },
19906
+ {
19907
+ "name": "--ui-space-1"
19908
+ },
19909
+ {
19910
+ "name": "--ui-space-2"
19911
+ }
19912
+ ]
19913
+ },
19914
+ "attributes": [
19915
+ {
19916
+ "name": "disabled",
19917
+ "property": "disabled",
19918
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
19919
+ "type": "boolean",
19920
+ "default": false
19921
+ },
19922
+ {
19923
+ "name": "label",
19924
+ "property": "label",
19925
+ "description": "Accessible name for the editing control.",
19926
+ "type": "string",
19927
+ "default": "Value"
19928
+ },
19929
+ {
19930
+ "name": "max",
19931
+ "property": "max",
19932
+ "description": "Inclusive upper bound for dragging, keyboard steps and exact entry.",
19933
+ "type": "number",
19934
+ "default": 100
19935
+ },
19936
+ {
19937
+ "name": "min",
19938
+ "property": "min",
19939
+ "description": "Inclusive lower bound for dragging, keyboard steps and exact entry.",
19940
+ "type": "number",
19941
+ "default": 0
19942
+ },
19943
+ {
19944
+ "name": "name",
19945
+ "property": "name",
19946
+ "description": "Optional numeric form field name.",
19947
+ "type": "string",
19948
+ "default": ""
19949
+ },
19950
+ {
19951
+ "name": "size",
19952
+ "property": "size",
19953
+ "description": "Shared field and button height.",
19954
+ "type": "keyword",
19955
+ "default": "md",
19956
+ "options": [
19957
+ "sm",
19958
+ "md",
19959
+ "lg"
19960
+ ]
19961
+ },
19962
+ {
19963
+ "name": "step",
19964
+ "property": "step",
19965
+ "description": "Positive native range and exact entry increment.",
19966
+ "type": "number",
19967
+ "default": 1
19968
+ },
19969
+ {
19970
+ "name": "unit",
19971
+ "property": "unit",
19972
+ "description": "Unit shown by the exact editor.",
19973
+ "type": "string",
19974
+ "default": ""
19975
+ },
19976
+ {
19977
+ "name": "value",
19978
+ "property": "value",
19979
+ "description": "Current numeric value. Native range and exact entry share bounds.",
19980
+ "type": "number",
19981
+ "default": 0
19982
+ }
19983
+ ],
19984
+ "properties": [
19985
+ {
19986
+ "name": "disabled",
19987
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
19988
+ "type": "boolean",
19989
+ "default": false
19990
+ },
19991
+ {
19992
+ "name": "label",
19993
+ "description": "Accessible name for the editing control.",
19994
+ "type": "string",
19995
+ "default": "Value"
19996
+ },
19997
+ {
19998
+ "name": "max",
19999
+ "description": "Inclusive upper bound for dragging, keyboard steps and exact entry.",
20000
+ "type": "number",
20001
+ "default": 100
20002
+ },
20003
+ {
20004
+ "name": "min",
20005
+ "description": "Inclusive lower bound for dragging, keyboard steps and exact entry.",
20006
+ "type": "number",
20007
+ "default": 0
20008
+ },
20009
+ {
20010
+ "name": "name",
20011
+ "description": "Optional numeric form field name.",
20012
+ "type": "string",
20013
+ "default": ""
20014
+ },
20015
+ {
20016
+ "name": "size",
20017
+ "description": "Shared field and button height.",
20018
+ "type": "\"sm\" | \"md\" | \"lg\"",
20019
+ "default": "md",
20020
+ "options": [
20021
+ "sm",
20022
+ "md",
20023
+ "lg"
20024
+ ]
20025
+ },
20026
+ {
20027
+ "name": "step",
20028
+ "description": "Positive native range and exact entry increment.",
20029
+ "type": "number",
20030
+ "default": 1
20031
+ },
20032
+ {
20033
+ "name": "unit",
20034
+ "description": "Unit shown by the exact editor.",
20035
+ "type": "string",
20036
+ "default": ""
20037
+ },
20038
+ {
20039
+ "name": "value",
20040
+ "description": "Current numeric value. Native range and exact entry share bounds.",
20041
+ "type": "number",
20042
+ "default": 0
20043
+ }
20044
+ ],
20045
+ "events": [
20046
+ {
20047
+ "name": "change",
20048
+ "detailType": "{ readonly value: number }",
20049
+ "detailSchema": "object",
20050
+ "fields": [
20051
+ {
20052
+ "path": "value",
20053
+ "type": "number",
20054
+ "required": true
20055
+ }
20056
+ ],
20057
+ "detailDocs": "Emitted when a toggleable control changes checked state."
20058
+ },
20059
+ {
20060
+ "name": "input",
20061
+ "detailType": "{ readonly value: number }",
20062
+ "detailSchema": "object",
20063
+ "fields": [
20064
+ {
20065
+ "path": "value",
20066
+ "type": "number",
20067
+ "required": true
20068
+ }
20069
+ ],
20070
+ "detailDocs": "Emitted with the declared detail payload."
20071
+ }
20072
+ ],
20073
+ "slots": [],
20074
+ "group": "forms",
20075
+ "id": "@threadlabs/looma/ui-slider",
20076
+ "title": "Slider",
20077
+ "resource": "@threadlabs/looma/components/ui-slider/ui-slider.html",
20078
+ "targets": [
20079
+ "html-next",
20080
+ "vue"
20081
+ ],
20082
+ "examples": [
20083
+ {
20084
+ "id": "@threadlabs/looma/ui-slider/01-editing",
20085
+ "name": "01-editing",
20086
+ "title": "Exact and visual editing",
20087
+ "description": "Native accessible range paired with bounded exact number and unit editing.",
20088
+ "markup": "<ui-slider label=\"Sam’s focus time\" value=\"25\" min=\"5\" max=\"60\" step=\"5\" unit=\"min\"></ui-slider>",
18635
20089
  "resizable": false,
18636
20090
  "bindings": "",
18637
20091
  "frameworks": {}
@@ -18896,7 +20350,7 @@
18896
20350
  "name": "01-default",
18897
20351
  "title": "Default",
18898
20352
  "description": "With no properties supplied, Stack uses its default gap, alignment, and distribution.",
18899
- "markup": "<ui-stack>\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n</ui-stack>",
20353
+ "markup": "<ui-stack>\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n</ui-stack>",
18900
20354
  "resizable": false,
18901
20355
  "bindings": "",
18902
20356
  "frameworks": {}
@@ -18906,7 +20360,7 @@
18906
20360
  "name": "02-gap-xl-and-align-center",
18907
20361
  "title": "gap=\"xl\" and align=\"center\"",
18908
20362
  "description": "The extra-large gap visibly increases vertical space; center alignment returns the bounded children to their intrinsic widths.",
18909
- "markup": "<ui-stack gap=\"xl\" align=\"center\">\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n</ui-stack>",
20363
+ "markup": "<ui-stack gap=\"xl\" align=\"center\">\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n</ui-stack>",
18910
20364
  "resizable": false,
18911
20365
  "bindings": "",
18912
20366
  "frameworks": {}
@@ -19249,6 +20703,12 @@
19249
20703
  }
19250
20704
  ],
19251
20705
  "shared": [
20706
+ {
20707
+ "name": "--ui-accent-highlight",
20708
+ "fallbacks": [
20709
+ "none"
20710
+ ]
20711
+ },
19252
20712
  {
19253
20713
  "name": "--ui-accent-solid"
19254
20714
  },
@@ -19339,6 +20799,12 @@
19339
20799
  {
19340
20800
  "name": "--ui-surface-default"
19341
20801
  },
20802
+ {
20803
+ "name": "--ui-surface-highlight",
20804
+ "fallbacks": [
20805
+ "none"
20806
+ ]
20807
+ },
19342
20808
  {
19343
20809
  "name": "--ui-text-on-accent"
19344
20810
  },
@@ -19496,7 +20962,7 @@
19496
20962
  "name": "01-default",
19497
20963
  "title": "Default",
19498
20964
  "description": "With checked omitted, Switch starts off and enabled.",
19499
- "markup": "<ui-switch>Switch</ui-switch>",
20965
+ "markup": "<ui-switch>Frodo is available</ui-switch>",
19500
20966
  "resizable": false,
19501
20967
  "bindings": "",
19502
20968
  "frameworks": {}
@@ -19698,7 +21164,7 @@
19698
21164
  "name": "01-default",
19699
21165
  "title": "Default",
19700
21166
  "description": "With no properties supplied, Switcher uses its default gap, threshold, and alignment.",
19701
- "markup": "<ui-switcher>\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n</ui-switcher>",
21167
+ "markup": "<ui-switcher>\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n</ui-switcher>",
19702
21168
  "resizable": true,
19703
21169
  "bindings": "",
19704
21170
  "frameworks": {}
@@ -19708,7 +21174,7 @@
19708
21174
  "name": "02-gap-threshold-and-alignment",
19709
21175
  "title": "Gap, threshold, and alignment",
19710
21176
  "description": "Threshold sets the intrinsic switch point while gap and alignment control the resulting layout.",
19711
- "markup": "<ui-switcher gap=\"m\" threshold=\"md\" align=\"stretch\">\n <span>One</span>\n <span>Two</span>\n <span>Three</span>\n</ui-switcher>",
21177
+ "markup": "<ui-switcher gap=\"m\" threshold=\"md\" align=\"stretch\">\n <ui-card padding=\"sm\">Frodo</ui-card>\n <ui-card padding=\"sm\">Sam</ui-card>\n <ui-card padding=\"sm\">Sméagol</ui-card>\n</ui-switcher>",
19712
21178
  "resizable": true,
19713
21179
  "bindings": "",
19714
21180
  "frameworks": {}
@@ -19904,6 +21370,12 @@
19904
21370
  "packages/looma/src/components/ui-tabs/ui-tabs.html"
19905
21371
  ],
19906
21372
  "component": [
21373
+ {
21374
+ "name": "--ui-tabs-panel-padding",
21375
+ "fallbacks": [
21376
+ "var(--ui-space-4)"
21377
+ ]
21378
+ },
19907
21379
  {
19908
21380
  "name": "--ui-tabs-tab-min-block-size",
19909
21381
  "declarations": [
@@ -20233,7 +21705,7 @@
20233
21705
  "tag": "ui-text",
20234
21706
  "package": "@threadlabs/looma",
20235
21707
  "root": "p",
20236
- "description": "Running text on the type scale, in a tone that says what it is: default for content, `secondary` for supporting prose, `muted` for metadata and hints, `info` for something moving forward normally, `warning` for something that needs attention, `danger` for an error, `success` to confirm one. The words must carry the meaning too, since colour alone does not. `variant=\"eyebrow\"` is a short uppercase label that names a group; `variant=\"code\"` sets a value to read exactly, such as an address. A view never styles text of its own: it picks a size and a tone. A link inside Text is underlined, so it reads as a link by more than its colour.",
21708
+ "description": "Text roles for body copy, display titles, headings, labels, captions, eyebrows and code. Choose the document element independently from its visual role; shared typography and semantic tones keep text consistent.",
20237
21709
  "designTokens": {
20238
21710
  "sources": [
20239
21711
  "packages/looma/src/components/ui-text/ui-text.html"
@@ -20259,7 +21731,8 @@
20259
21731
  {
20260
21732
  "name": "--ui-font-display",
20261
21733
  "fallbacks": [
20262
- "inherit"
21734
+ "inherit",
21735
+ "var(--ui-font-family-sans)"
20263
21736
  ]
20264
21737
  },
20265
21738
  {
@@ -20280,6 +21753,9 @@
20280
21753
  {
20281
21754
  "name": "--ui-font-semibold"
20282
21755
  },
21756
+ {
21757
+ "name": "--ui-font-size-2xl"
21758
+ },
20283
21759
  {
20284
21760
  "name": "--ui-font-size-lg"
20285
21761
  },
@@ -20289,6 +21765,9 @@
20289
21765
  {
20290
21766
  "name": "--ui-font-size-sm"
20291
21767
  },
21768
+ {
21769
+ "name": "--ui-font-size-xl"
21770
+ },
20292
21771
  {
20293
21772
  "name": "--ui-font-size-xs"
20294
21773
  },
@@ -20301,6 +21780,9 @@
20301
21780
  {
20302
21781
  "name": "--ui-line-height-relaxed"
20303
21782
  },
21783
+ {
21784
+ "name": "--ui-line-height-tight"
21785
+ },
20304
21786
  {
20305
21787
  "name": "--ui-success-subtle-text"
20306
21788
  },
@@ -20324,7 +21806,7 @@
20324
21806
  {
20325
21807
  "name": "as",
20326
21808
  "property": "as",
20327
- "description": "The native element the text renders: a paragraph by default, inline span, small, or strong within a line, a div for a block, a label for a control, or a heading, h2 to h6, below a Page Header's h1 and a Section's h2. A heading takes its size and weight from size and weight, like any other text.",
21809
+ "description": "The native element the text renders: a paragraph by default, inline span, small, or strong within a line, a div for a block, a label for a control, or a heading, h1 to h6. Choose its document level independently from its visual variant. The default body variant keeps the existing size and weight behavior.",
20328
21810
  "type": "keyword",
20329
21811
  "default": "p",
20330
21812
  "options": [
@@ -20334,6 +21816,7 @@
20334
21816
  "small",
20335
21817
  "strong",
20336
21818
  "label",
21819
+ "h1",
20337
21820
  "h2",
20338
21821
  "h3",
20339
21822
  "h4",
@@ -20407,11 +21890,15 @@
20407
21890
  {
20408
21891
  "name": "variant",
20409
21892
  "property": "variant",
20410
- "description": "body is running text. eyebrow is a short, uppercase, tracked label that names what follows, such as a group of links; code sets a value to copy or read exactly, such as an address, in the monospace face.",
21893
+ "description": "body is running text. display is a page title, heading names a section, label identifies a control, and caption is supporting text. These roles set their shared type scale, weight and leading; pair heading or display with an appropriate as heading element. eyebrow is a short, uppercase, tracked label that names what follows, such as a group of links; code sets a value to copy or read exactly, such as an address, in the monospace face.",
20411
21894
  "type": "keyword",
20412
21895
  "default": "body",
20413
21896
  "options": [
20414
21897
  "body",
21898
+ "display",
21899
+ "heading",
21900
+ "label",
21901
+ "caption",
20415
21902
  "eyebrow",
20416
21903
  "code"
20417
21904
  ]
@@ -20454,8 +21941,8 @@
20454
21941
  },
20455
21942
  {
20456
21943
  "name": "as",
20457
- "description": "The native element the text renders: a paragraph by default, inline span, small, or strong within a line, a div for a block, a label for a control, or a heading, h2 to h6, below a Page Header's h1 and a Section's h2. A heading takes its size and weight from size and weight, like any other text.",
20458
- "type": "\"p\" | \"span\" | \"div\" | \"small\" | \"strong\" | \"label\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"",
21944
+ "description": "The native element the text renders: a paragraph by default, inline span, small, or strong within a line, a div for a block, a label for a control, or a heading, h1 to h6. Choose its document level independently from its visual variant. The default body variant keeps the existing size and weight behavior.",
21945
+ "type": "\"p\" | \"span\" | \"div\" | \"small\" | \"strong\" | \"label\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"",
20459
21946
  "default": "p",
20460
21947
  "options": [
20461
21948
  "p",
@@ -20464,6 +21951,7 @@
20464
21951
  "small",
20465
21952
  "strong",
20466
21953
  "label",
21954
+ "h1",
20467
21955
  "h2",
20468
21956
  "h3",
20469
21957
  "h4",
@@ -20530,11 +22018,15 @@
20530
22018
  },
20531
22019
  {
20532
22020
  "name": "variant",
20533
- "description": "body is running text. eyebrow is a short, uppercase, tracked label that names what follows, such as a group of links; code sets a value to copy or read exactly, such as an address, in the monospace face.",
20534
- "type": "\"body\" | \"eyebrow\" | \"code\"",
22021
+ "description": "body is running text. display is a page title, heading names a section, label identifies a control, and caption is supporting text. These roles set their shared type scale, weight and leading; pair heading or display with an appropriate as heading element. eyebrow is a short, uppercase, tracked label that names what follows, such as a group of links; code sets a value to copy or read exactly, such as an address, in the monospace face.",
22022
+ "type": "\"body\" | \"display\" | \"heading\" | \"label\" | \"caption\" | \"eyebrow\" | \"code\"",
20535
22023
  "default": "body",
20536
22024
  "options": [
20537
22025
  "body",
22026
+ "display",
22027
+ "heading",
22028
+ "label",
22029
+ "caption",
20538
22030
  "eyebrow",
20539
22031
  "code"
20540
22032
  ]
@@ -20591,9 +22083,9 @@
20591
22083
  {
20592
22084
  "id": "@threadlabs/looma/ui-text/02-variants",
20593
22085
  "name": "02-variants",
20594
- "title": "Eyebrow and code",
20595
- "description": "An eyebrow names a group of things; code sets a value to read exactly, such as an address.",
20596
- "markup": "<ui-stack gap=\"xs\">\n <ui-text variant=\"eyebrow\" tone=\"muted\">Workspace</ui-text>\n <ui-text variant=\"code\" tone=\"secondary\" size=\"sm\">acme.example.com</ui-text>\n</ui-stack>",
22086
+ "title": "Typography roles",
22087
+ "description": "One shared type family gives the Fellowship office titles, section headings, labels, captions and eyebrows. Choose document heading levels separately from visual roles.",
22088
+ "markup": "<ui-stack gap=\"sm\">\n <ui-text variant=\"eyebrow\" tone=\"secondary\">Fellowship office</ui-text>\n <ui-text variant=\"display\" as=\"h1\">There and back by Friday</ui-text>\n <ui-text variant=\"heading\" as=\"h2\">This week's expedition</ui-text>\n <ui-text>Frodo and Sam are reviewing the route. Sméagol has booked the quiet meeting room.</ui-text>\n <ui-text variant=\"label\">Next stand-up</ui-text>\n <ui-text variant=\"caption\" tone=\"secondary\">Tuesday, after second breakfast</ui-text>\n <ui-text variant=\"code\" tone=\"secondary\" size=\"sm\">fellowship.example.com</ui-text>\n</ui-stack>",
20597
22089
  "resizable": false,
20598
22090
  "bindings": "",
20599
22091
  "frameworks": {}
@@ -20791,6 +22283,12 @@
20791
22283
  {
20792
22284
  "name": "--ui-surface-elevated"
20793
22285
  },
22286
+ {
22287
+ "name": "--ui-surface-highlight",
22288
+ "fallbacks": [
22289
+ "none"
22290
+ ]
22291
+ },
20794
22292
  {
20795
22293
  "name": "--ui-surface-muted"
20796
22294
  },
@@ -21600,7 +23098,8 @@
21600
23098
  {
21601
23099
  "name": "--ui-tooltip-border",
21602
23100
  "fallbacks": [
21603
- "var(--ui-overlay-border, var(--ui-border-strong))"
23101
+ "var(--ui-overlay-border, var(--ui-border-strong))",
23102
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
21604
23103
  ]
21605
23104
  },
21606
23105
  {
@@ -21630,13 +23129,15 @@
21630
23129
  {
21631
23130
  "name": "--ui-tooltip-shadow",
21632
23131
  "fallbacks": [
21633
- "var(--ui-overlay-shadow, var(--ui-elevation-tooltip, var(--ui-shadow-md)))"
23132
+ "var(--ui-overlay-shadow, var(--ui-elevation-tooltip, var(--ui-shadow-md)))",
23133
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.08) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.08) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-tooltip, var(--ui-shadow-md))\n )"
21634
23134
  ]
21635
23135
  },
21636
23136
  {
21637
23137
  "name": "--ui-tooltip-surface",
21638
23138
  "fallbacks": [
21639
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
23139
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
23140
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
21640
23141
  ]
21641
23142
  },
21642
23143
  {
@@ -21671,9 +23172,33 @@
21671
23172
  {
21672
23173
  "name": "--ui-font-size-xs"
21673
23174
  },
23175
+ {
23176
+ "name": "--ui-glassiness",
23177
+ "fallbacks": [
23178
+ "0"
23179
+ ]
23180
+ },
21674
23181
  {
21675
23182
  "name": "--ui-line-height-tight"
21676
23183
  },
23184
+ {
23185
+ "name": "--ui-material-content",
23186
+ "fallbacks": [
23187
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
23188
+ ]
23189
+ },
23190
+ {
23191
+ "name": "--ui-material-edge",
23192
+ "fallbacks": [
23193
+ "var(--ui-border-strong)"
23194
+ ]
23195
+ },
23196
+ {
23197
+ "name": "--ui-material-glass",
23198
+ "fallbacks": [
23199
+ "var(--ui-surface-elevated)"
23200
+ ]
23201
+ },
21677
23202
  {
21678
23203
  "name": "--ui-motion-ease"
21679
23204
  },
@@ -21695,7 +23220,8 @@
21695
23220
  {
21696
23221
  "name": "--ui-overlay-shadow",
21697
23222
  "fallbacks": [
21698
- "var(--ui-elevation-tooltip, var(--ui-shadow-md))"
23223
+ "var(--ui-elevation-tooltip, var(--ui-shadow-md))",
23224
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.08) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.08) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-tooltip, var(--ui-shadow-md))"
21699
23225
  ]
21700
23226
  },
21701
23227
  {
@@ -21722,6 +23248,12 @@
21722
23248
  {
21723
23249
  "name": "--ui-surface-elevated"
21724
23250
  },
23251
+ {
23252
+ "name": "--ui-surface-separation",
23253
+ "fallbacks": [
23254
+ "0"
23255
+ ]
23256
+ },
21725
23257
  {
21726
23258
  "name": "--ui-text-primary"
21727
23259
  }