@threadlabs/looma 0.33.1 → 0.34.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 (184) hide show
  1. package/components/shared/overlay.js +8 -2
  2. package/components/shared/surface-material.js +21 -0
  3. package/components/ui-button/ui-button.html +63 -47
  4. package/components/ui-card/ui-card.html +44 -2
  5. package/components/ui-curve-editor/curve.js +10 -0
  6. package/components/ui-curve-editor/ui-curve-editor.html +181 -0
  7. package/components/ui-curve-editor/ui-curve-editor.js +51 -0
  8. package/components/ui-dialog/ui-dialog.html +62 -1
  9. package/components/ui-dialog/ui-dialog.js +9 -1
  10. package/components/ui-icon-button/ui-icon-button.html +75 -23
  11. package/components/ui-menu/ui-menu.html +60 -0
  12. package/components/ui-menu/ui-menu.js +1 -1
  13. package/components/ui-number-input/arithmetic.js +47 -0
  14. package/components/ui-number-input/ui-number-input.html +62 -0
  15. package/components/ui-number-input/ui-number-input.js +44 -0
  16. package/components/ui-popover/ui-popover.html +64 -1
  17. package/components/ui-popover/ui-popover.js +1 -1
  18. package/components/ui-slider/ui-slider.html +84 -0
  19. package/components/ui-slider/ui-slider.js +29 -0
  20. package/components/ui-tabs/ui-tabs.html +6 -1
  21. package/components/ui-text/ui-text.html +31 -6
  22. package/components/ui-tooltip/ui-tooltip.html +60 -0
  23. package/components/ui-tooltip/ui-tooltip.js +1 -1
  24. package/dist/index.js +46 -43
  25. package/docs/README.md +34 -4
  26. package/docs/card.html +16 -2
  27. package/docs/card.js +17 -2
  28. package/docs/catalog.json +1154 -144
  29. package/docs/customizer-render.mjs +35 -9
  30. package/docs/customizer.js +83 -20
  31. package/docs/documentation.css +9 -1
  32. package/docs/index.d.ts +4 -2
  33. package/docs/index.mjs +1 -1
  34. package/docs/preview.js +2 -0
  35. package/docs/render.mjs +15 -6
  36. package/docs/site.mjs +50 -9
  37. package/docs/theme-session.mjs +51 -0
  38. package/docs/theme.mjs +134 -15
  39. package/docs/value-editors.mjs +33 -0
  40. package/package.json +2 -2
  41. package/styles/ui-button.css +45 -45
  42. package/styles/ui-card.css +47 -0
  43. package/styles/ui-curve-editor.css +109 -0
  44. package/styles/ui-dialog.css +132 -0
  45. package/styles/ui-icon-button.css +63 -20
  46. package/styles/ui-menu.css +72 -0
  47. package/styles/ui-number-input.css +34 -0
  48. package/styles/ui-popover.css +74 -0
  49. package/styles/ui-slider.css +53 -0
  50. package/styles/ui-tabs.css +6 -1
  51. package/styles/ui-text.css +23 -1
  52. package/styles/ui-tooltip.css +72 -0
  53. package/theme-system.css +26 -10
  54. package/tokens.css +8 -2
  55. package/vanilla/UiButton.d.ts +1 -0
  56. package/vanilla/UiButton.js +195 -130
  57. package/vanilla/UiCard.d.ts +1 -1
  58. package/vanilla/UiCard.js +1 -1
  59. package/vanilla/UiCurveEditor.d.ts +28 -0
  60. package/vanilla/UiCurveEditor.js +134 -0
  61. package/vanilla/UiIconButton.d.ts +2 -1
  62. package/vanilla/UiIconButton.js +58 -31
  63. package/vanilla/UiNumberInput.d.ts +33 -0
  64. package/vanilla/UiNumberInput.js +79 -0
  65. package/vanilla/UiSlider.d.ts +33 -0
  66. package/vanilla/UiSlider.js +125 -0
  67. package/vanilla/UiText.d.ts +2 -2
  68. package/vanilla/UiText.js +45 -11
  69. package/vanilla/index.js +3 -0
  70. package/vue/UiButton.d.ts +6 -0
  71. package/vue/UiButton.vue +155 -56
  72. package/vue/UiCard.d.ts +2 -2
  73. package/vue/UiCard.vue +55 -5
  74. package/vue/UiCurveEditor.d.ts +53 -0
  75. package/vue/UiCurveEditor.js +2 -0
  76. package/vue/UiCurveEditor.vue +427 -0
  77. package/vue/UiDialog.vue +177 -1
  78. package/vue/UiIconButton.d.ts +8 -2
  79. package/vue/UiIconButton.vue +164 -34
  80. package/vue/UiMenu.vue +89 -0
  81. package/vue/UiNumberInput.d.ts +83 -0
  82. package/vue/UiNumberInput.js +2 -0
  83. package/vue/UiNumberInput.vue +370 -0
  84. package/vue/UiPopover.vue +92 -1
  85. package/vue/UiSlider.d.ts +83 -0
  86. package/vue/UiSlider.js +2 -0
  87. package/vue/UiSlider.vue +412 -0
  88. package/vue/UiTabs.vue +6 -1
  89. package/vue/UiText.d.ts +7 -5
  90. package/vue/UiText.vue +104 -22
  91. package/vue/UiTooltip.vue +89 -0
  92. package/vue/chunks/UiActionBar.js +1 -1
  93. package/vue/chunks/UiAffordanceScope.js +2 -2
  94. package/vue/chunks/UiAvatar.js +2 -2
  95. package/vue/chunks/UiAvatarGroup.js +2 -2
  96. package/vue/chunks/UiBadge.js +2 -2
  97. package/vue/chunks/UiBreadcrumbItem.js +2 -2
  98. package/vue/chunks/UiBreadcrumbs.js +2 -2
  99. package/vue/chunks/UiButton.js +94 -11
  100. package/vue/chunks/UiCallout.js +2 -2
  101. package/vue/chunks/UiCard.js +6 -5
  102. package/vue/chunks/UiCheckbox.js +2 -2
  103. package/vue/chunks/UiCluster.js +2 -2
  104. package/vue/chunks/UiColorPicker.js +2 -2
  105. package/vue/chunks/UiCombobox.js +2 -2
  106. package/vue/chunks/UiContainer.js +2 -2
  107. package/vue/chunks/UiContextMenu.js +2 -2
  108. package/vue/chunks/UiCover.js +2 -2
  109. package/vue/chunks/UiCurveEditor.js +413 -0
  110. package/vue/chunks/UiDescriptionItem.js +2 -2
  111. package/vue/chunks/UiDescriptionList.js +2 -2
  112. package/vue/chunks/UiDialog.js +4 -4
  113. package/vue/chunks/UiDisclosure.js +2 -2
  114. package/vue/chunks/UiEditable.js +2 -2
  115. package/vue/chunks/UiEditorBlockActions.js +2 -2
  116. package/vue/chunks/UiEditorChipEditor.js +2 -2
  117. package/vue/chunks/UiEditorCodeLanguage.js +2 -2
  118. package/vue/chunks/UiEditorFootnoteEditor.js +2 -2
  119. package/vue/chunks/UiEditorImageToolbar.js +3 -3
  120. package/vue/chunks/UiEditorInsertTableGrid.js +2 -2
  121. package/vue/chunks/UiEditorLinkCard.js +3 -3
  122. package/vue/chunks/UiEditorLinkForm.js +3 -3
  123. package/vue/chunks/UiEditorMentionMenu.js +2 -2
  124. package/vue/chunks/UiEditorMentionMenuItem.js +2 -2
  125. package/vue/chunks/UiEditorSlashMenu.js +2 -2
  126. package/vue/chunks/UiEditorSlashMenuGroup.js +2 -2
  127. package/vue/chunks/UiEditorSlashMenuItem.js +2 -2
  128. package/vue/chunks/UiEditorSurface.js +2 -2
  129. package/vue/chunks/UiEditorTableContextMenu.js +2 -2
  130. package/vue/chunks/UiEditorTableOverlay.js +2 -2
  131. package/vue/chunks/UiEditorTableToolbar.js +2 -2
  132. package/vue/chunks/UiEditorToolbar.js +2 -2
  133. package/vue/chunks/UiFloatingActionButton.js +2 -2
  134. package/vue/chunks/UiFormField.js +2 -2
  135. package/vue/chunks/UiGrid.js +2 -2
  136. package/vue/chunks/UiIcon.js +2 -2
  137. package/vue/chunks/UiIconButton.js +77 -11
  138. package/vue/chunks/UiImage.js +2 -2
  139. package/vue/chunks/UiInput.js +2 -2
  140. package/vue/chunks/UiInputGroup.js +2 -2
  141. package/vue/chunks/UiList.js +2 -2
  142. package/vue/chunks/UiListItem.js +2 -2
  143. package/vue/chunks/UiListbox.js +2 -2
  144. package/vue/chunks/UiMenu.js +3 -3
  145. package/vue/chunks/UiMenuGroup.js +2 -2
  146. package/vue/chunks/UiMenuItem.js +2 -2
  147. package/vue/chunks/UiMeter.js +2 -2
  148. package/vue/chunks/UiNavItem.js +2 -2
  149. package/vue/chunks/UiNumberInput.js +390 -0
  150. package/vue/chunks/UiPageHeader.js +2 -2
  151. package/vue/chunks/UiPopover.js +4 -4
  152. package/vue/chunks/UiRadio.js +2 -2
  153. package/vue/chunks/UiRadioGroup.js +2 -2
  154. package/vue/chunks/UiReel.js +2 -2
  155. package/vue/chunks/UiScrollArea.js +2 -2
  156. package/vue/chunks/UiSearchResultRow.js +2 -2
  157. package/vue/chunks/UiSearchShell.js +2 -2
  158. package/vue/chunks/UiSection.js +2 -2
  159. package/vue/chunks/UiSelect.js +2 -2
  160. package/vue/chunks/UiSeparator.js +2 -2
  161. package/vue/chunks/UiSidebar.js +2 -2
  162. package/vue/chunks/UiSlider.js +396 -0
  163. package/vue/chunks/UiSpinner.js +2 -2
  164. package/vue/chunks/UiStack.js +2 -2
  165. package/vue/chunks/UiStatusMessage.js +2 -2
  166. package/vue/chunks/UiSwatch.js +2 -2
  167. package/vue/chunks/UiSwitch.js +2 -2
  168. package/vue/chunks/UiSwitcher.js +2 -2
  169. package/vue/chunks/UiTable.js +2 -2
  170. package/vue/chunks/UiTabs.js +3 -3
  171. package/vue/chunks/UiText.js +53 -12
  172. package/vue/chunks/UiTextarea.js +2 -2
  173. package/vue/chunks/UiToast.js +2 -2
  174. package/vue/chunks/UiToastRegion.js +2 -2
  175. package/vue/chunks/UiTooltip.js +3 -3
  176. package/vue/chunks/UiTopBar.js +1 -1
  177. package/vue/chunks/UiTree.js +2 -2
  178. package/vue/chunks/UiTreeItem.js +2 -2
  179. package/vue/chunks/_plugin-vue_export-helper.js +68 -2
  180. package/vue/chunks/props.js +24 -1
  181. package/vue/components.css +2215 -1203
  182. package/vue/editor/index.js +623 -211
  183. package/vue/index.d.ts +3 -0
  184. package/vue/index.js +5 -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",
@@ -280,6 +285,11 @@
280
285
  "package": "@threadlabs/looma",
281
286
  "resource": "@threadlabs/looma/components/ui-nav-item/ui-nav-item.html"
282
287
  },
288
+ {
289
+ "tag": "ui-number-input",
290
+ "package": "@threadlabs/looma",
291
+ "resource": "@threadlabs/looma/components/ui-number-input/ui-number-input.html"
292
+ },
283
293
  {
284
294
  "tag": "ui-page-header",
285
295
  "package": "@threadlabs/looma",
@@ -340,6 +350,11 @@
340
350
  "package": "@threadlabs/looma",
341
351
  "resource": "@threadlabs/looma/components/ui-sidebar/ui-sidebar.html"
342
352
  },
353
+ {
354
+ "tag": "ui-slider",
355
+ "package": "@threadlabs/looma",
356
+ "resource": "@threadlabs/looma/components/ui-slider/ui-slider.html"
357
+ },
343
358
  {
344
359
  "tag": "ui-spinner",
345
360
  "package": "@threadlabs/looma",
@@ -423,7 +438,7 @@
423
438
  ],
424
439
  "schemaVersion": 1,
425
440
  "package": "@threadlabs/looma",
426
- "version": "0.33.1",
441
+ "version": "0.34.0",
427
442
  "groups": [
428
443
  {
429
444
  "id": "layout",
@@ -2154,9 +2169,18 @@
2154
2169
  {
2155
2170
  "name": "--ui-danger"
2156
2171
  },
2172
+ {
2173
+ "name": "--ui-danger-active",
2174
+ "fallbacks": [
2175
+ "var(--ui-danger-hover)"
2176
+ ]
2177
+ },
2157
2178
  {
2158
2179
  "name": "--ui-danger-hover"
2159
2180
  },
2181
+ {
2182
+ "name": "--ui-danger-subtle-text"
2183
+ },
2160
2184
  {
2161
2185
  "name": "--ui-disabled-border"
2162
2186
  },
@@ -2202,6 +2226,18 @@
2202
2226
  {
2203
2227
  "name": "--ui-info"
2204
2228
  },
2229
+ {
2230
+ "name": "--ui-info-active"
2231
+ },
2232
+ {
2233
+ "name": "--ui-info-hover"
2234
+ },
2235
+ {
2236
+ "name": "--ui-info-on-strong"
2237
+ },
2238
+ {
2239
+ "name": "--ui-info-subtle-text"
2240
+ },
2205
2241
  {
2206
2242
  "name": "--ui-line-height-tight"
2207
2243
  },
@@ -2265,6 +2301,18 @@
2265
2301
  {
2266
2302
  "name": "--ui-success"
2267
2303
  },
2304
+ {
2305
+ "name": "--ui-success-active"
2306
+ },
2307
+ {
2308
+ "name": "--ui-success-hover"
2309
+ },
2310
+ {
2311
+ "name": "--ui-success-on-strong"
2312
+ },
2313
+ {
2314
+ "name": "--ui-success-subtle-text"
2315
+ },
2268
2316
  {
2269
2317
  "name": "--ui-surface"
2270
2318
  },
@@ -2282,6 +2330,18 @@
2282
2330
  },
2283
2331
  {
2284
2332
  "name": "--ui-warning"
2333
+ },
2334
+ {
2335
+ "name": "--ui-warning-active"
2336
+ },
2337
+ {
2338
+ "name": "--ui-warning-hover"
2339
+ },
2340
+ {
2341
+ "name": "--ui-warning-on-strong"
2342
+ },
2343
+ {
2344
+ "name": "--ui-warning-subtle-text"
2285
2345
  }
2286
2346
  ]
2287
2347
  },
@@ -2335,6 +2395,20 @@
2335
2395
  "type": "boolean",
2336
2396
  "default": false
2337
2397
  },
2398
+ {
2399
+ "name": "preset",
2400
+ "property": "preset",
2401
+ "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.",
2402
+ "type": "keyword",
2403
+ "default": "none",
2404
+ "options": [
2405
+ "none",
2406
+ "primary",
2407
+ "standard",
2408
+ "quiet",
2409
+ "destructive"
2410
+ ]
2411
+ },
2338
2412
  {
2339
2413
  "name": "rel",
2340
2414
  "property": "rel",
@@ -2466,6 +2540,19 @@
2466
2540
  "type": "boolean",
2467
2541
  "default": false
2468
2542
  },
2543
+ {
2544
+ "name": "preset",
2545
+ "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.",
2546
+ "type": "\"none\" | \"primary\" | \"standard\" | \"quiet\" | \"destructive\"",
2547
+ "default": "none",
2548
+ "options": [
2549
+ "none",
2550
+ "primary",
2551
+ "standard",
2552
+ "quiet",
2553
+ "destructive"
2554
+ ]
2555
+ },
2469
2556
  {
2470
2557
  "name": "rel",
2471
2558
  "description": "The link's relationship to its destination, as on a native link. Only meaningful with as=\"a\".",
@@ -2587,8 +2674,8 @@
2587
2674
  "id": "@threadlabs/looma/ui-button/02-variant",
2588
2675
  "name": "02-variant",
2589
2676
  "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>",
2677
+ "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.",
2678
+ "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
2679
  "resizable": false,
2593
2680
  "bindings": "",
2594
2681
  "frameworks": {}
@@ -2692,6 +2779,16 @@
2692
2779
  "resizable": false,
2693
2780
  "bindings": "",
2694
2781
  "frameworks": {}
2782
+ },
2783
+ {
2784
+ "id": "@threadlabs/looma/ui-button/12-tones",
2785
+ "name": "12-tones",
2786
+ "title": "Appearance and tone",
2787
+ "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.",
2788
+ "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>",
2789
+ "resizable": false,
2790
+ "bindings": "",
2791
+ "frameworks": {}
2695
2792
  }
2696
2793
  ]
2697
2794
  },
@@ -2967,7 +3064,7 @@
2967
3064
  "tag": "ui-card",
2968
3065
  "package": "@threadlabs/looma",
2969
3066
  "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\"`.",
3067
+ "description": "A surface that groups content with shared spacing, corners and material. Choose outlined, subtle, elevated or glass; content stays readable as the surrounding material changes.",
2971
3068
  "designTokens": {
2972
3069
  "sources": [
2973
3070
  "packages/looma/src/components/ui-card/ui-card.html"
@@ -2998,9 +3095,27 @@
2998
3095
  {
2999
3096
  "name": "--ui-danger-soft"
3000
3097
  },
3098
+ {
3099
+ "name": "--ui-glassiness",
3100
+ "fallbacks": [
3101
+ "0"
3102
+ ]
3103
+ },
3001
3104
  {
3002
3105
  "name": "--ui-info"
3003
3106
  },
3107
+ {
3108
+ "name": "--ui-material-edge",
3109
+ "fallbacks": [
3110
+ "var(--ui-border-strong)"
3111
+ ]
3112
+ },
3113
+ {
3114
+ "name": "--ui-material-glass",
3115
+ "fallbacks": [
3116
+ "var(--ui-surface-raised)"
3117
+ ]
3118
+ },
3004
3119
  {
3005
3120
  "name": "--ui-radius-lg"
3006
3121
  },
@@ -3037,6 +3152,12 @@
3037
3152
  {
3038
3153
  "name": "--ui-surface-raised"
3039
3154
  },
3155
+ {
3156
+ "name": "--ui-surface-separation",
3157
+ "fallbacks": [
3158
+ "0"
3159
+ ]
3160
+ },
3040
3161
  {
3041
3162
  "name": "--ui-text-primary"
3042
3163
  },
@@ -3103,13 +3224,14 @@
3103
3224
  {
3104
3225
  "name": "variant",
3105
3226
  "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.",
3227
+ "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. glass frames an opaque readable content plane with frosted material; shared glassiness and surface separation govern its treatment.",
3107
3228
  "type": "keyword",
3108
3229
  "default": "outlined",
3109
3230
  "options": [
3110
3231
  "outlined",
3111
3232
  "subtle",
3112
- "elevated"
3233
+ "elevated",
3234
+ "glass"
3113
3235
  ]
3114
3236
  }
3115
3237
  ],
@@ -3166,13 +3288,14 @@
3166
3288
  },
3167
3289
  {
3168
3290
  "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.",
3170
- "type": "\"outlined\" | \"subtle\" | \"elevated\"",
3291
+ "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. glass frames an opaque readable content plane with frosted material; shared glassiness and surface separation govern its treatment.",
3292
+ "type": "\"outlined\" | \"subtle\" | \"elevated\" | \"glass\"",
3171
3293
  "default": "outlined",
3172
3294
  "options": [
3173
3295
  "outlined",
3174
3296
  "subtle",
3175
- "elevated"
3297
+ "elevated",
3298
+ "glass"
3176
3299
  ]
3177
3300
  }
3178
3301
  ],
@@ -3221,6 +3344,16 @@
3221
3344
  "resizable": false,
3222
3345
  "bindings": "",
3223
3346
  "frameworks": {}
3347
+ },
3348
+ {
3349
+ "id": "@threadlabs/looma/ui-card/04-glass",
3350
+ "name": "04-glass",
3351
+ "title": "Glass panel",
3352
+ "description": "Glassiness and surface separation shape the frame while the content plane stays readable. Choose Bookish in the customizer to see the frosted edge.",
3353
+ "markup": "<ui-card variant=\"glass\">\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>",
3354
+ "resizable": false,
3355
+ "bindings": "",
3356
+ "frameworks": {}
3224
3357
  }
3225
3358
  ]
3226
3359
  },
@@ -3556,7 +3689,7 @@
3556
3689
  "name": "01-default",
3557
3690
  "title": "Default",
3558
3691
  "description": "With no state properties supplied, Checkbox starts unchecked and enabled.",
3559
- "markup": "<ui-checkbox>Checkbox</ui-checkbox>",
3692
+ "markup": "<ui-checkbox>Notify Sam</ui-checkbox>",
3560
3693
  "resizable": false,
3561
3694
  "bindings": "",
3562
3695
  "frameworks": {}
@@ -4168,7 +4301,7 @@
4168
4301
  "name": "01-shapes-and-sizes",
4169
4302
  "title": "Shapes and shared sizes",
4170
4303
  "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>",
4304
+ "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
4305
  "resizable": false,
4173
4306
  "bindings": "",
4174
4307
  "frameworks": {}
@@ -5968,7 +6101,7 @@
5968
6101
  "name": "01-default",
5969
6102
  "title": "Default",
5970
6103
  "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>",
6104
+ "markup": "<ui-container>\n <ui-card padding=\"sm\">The Fellowship office memo stays within a readable 65ch measure.</ui-card>\n</ui-container>",
5972
6105
  "resizable": false,
5973
6106
  "bindings": "",
5974
6107
  "frameworks": {}
@@ -6364,21 +6497,54 @@
6364
6497
  ]
6365
6498
  },
6366
6499
  {
6367
- "tag": "ui-description-item",
6500
+ "tag": "ui-curve-editor",
6368
6501
  "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).",
6502
+ "root": "span",
6503
+ "description": "Draggable cubic Bézier handles with keyboard and bounded exact coordinate editing.",
6371
6504
  "designTokens": {
6372
6505
  "sources": [
6373
- "packages/looma/src/components/ui-description-item/ui-description-item.html"
6506
+ "packages/looma/src/components/ui-curve-editor/ui-curve-editor.html"
6374
6507
  ],
6375
6508
  "component": [],
6376
6509
  "shared": [
6377
6510
  {
6378
- "name": "--ui-border-default"
6511
+ "name": "--ui-accent-solid"
6379
6512
  },
6380
6513
  {
6381
- "name": "--ui-font-medium"
6514
+ "name": "--ui-border-width"
6515
+ },
6516
+ {
6517
+ "name": "--ui-control-border"
6518
+ },
6519
+ {
6520
+ "name": "--ui-control-focus",
6521
+ "fallbacks": [
6522
+ "var(--ui-accent-solid)"
6523
+ ]
6524
+ },
6525
+ {
6526
+ "name": "--ui-control-min-block-size"
6527
+ },
6528
+ {
6529
+ "name": "--ui-control-surface",
6530
+ "fallbacks": [
6531
+ "var(--ui-surface)"
6532
+ ]
6533
+ },
6534
+ {
6535
+ "name": "--ui-field-radius",
6536
+ "fallbacks": [
6537
+ "var(--ui-radius-md)"
6538
+ ]
6539
+ },
6540
+ {
6541
+ "name": "--ui-focus-width"
6542
+ },
6543
+ {
6544
+ "name": "--ui-font-mono",
6545
+ "fallbacks": [
6546
+ "monospace"
6547
+ ]
6382
6548
  },
6383
6549
  {
6384
6550
  "name": "--ui-font-size-sm"
@@ -6386,14 +6552,26 @@
6386
6552
  {
6387
6553
  "name": "--ui-radius-md"
6388
6554
  },
6555
+ {
6556
+ "name": "--ui-shadow-xs"
6557
+ },
6389
6558
  {
6390
6559
  "name": "--ui-space-1"
6391
6560
  },
6392
6561
  {
6393
- "name": "--ui-space-6"
6562
+ "name": "--ui-space-2"
6394
6563
  },
6395
6564
  {
6396
- "name": "--ui-text-muted"
6565
+ "name": "--ui-space-3"
6566
+ },
6567
+ {
6568
+ "name": "--ui-space-4"
6569
+ },
6570
+ {
6571
+ "name": "--ui-surface"
6572
+ },
6573
+ {
6574
+ "name": "--ui-surface-raised"
6397
6575
  },
6398
6576
  {
6399
6577
  "name": "--ui-text-primary"
@@ -6402,54 +6580,114 @@
6402
6580
  },
6403
6581
  "attributes": [
6404
6582
  {
6405
- "name": "term",
6406
- "property": "term",
6407
- "description": "What the value is, such as \"Invited by\". The value is the item's content.",
6583
+ "name": "disabled",
6584
+ "property": "disabled",
6585
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
6586
+ "type": "boolean",
6587
+ "default": false
6588
+ },
6589
+ {
6590
+ "name": "label",
6591
+ "property": "label",
6592
+ "description": "Accessible name for the editing control.",
6408
6593
  "type": "string",
6409
- "default": ""
6594
+ "default": "Value"
6595
+ },
6596
+ {
6597
+ "name": "size",
6598
+ "property": "size",
6599
+ "description": "Shared field and button height.",
6600
+ "type": "keyword",
6601
+ "default": "md",
6602
+ "options": [
6603
+ "sm",
6604
+ "md",
6605
+ "lg"
6606
+ ]
6607
+ },
6608
+ {
6609
+ "name": "value",
6610
+ "property": "value",
6611
+ "description": "CSS cubic-bezier or a standard easing keyword. X stays within 0–1; Y is bounded to -1–2 for a limited overshoot.",
6612
+ "type": "string",
6613
+ "default": "cubic-bezier(0.25, 0.1, 0.25, 1)"
6410
6614
  }
6411
6615
  ],
6412
6616
  "properties": [
6413
6617
  {
6414
- "name": "term",
6415
- "description": "What the value is, such as \"Invited by\". The value is the item's content.",
6618
+ "name": "disabled",
6619
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
6620
+ "type": "boolean",
6621
+ "default": false
6622
+ },
6623
+ {
6624
+ "name": "label",
6625
+ "description": "Accessible name for the editing control.",
6416
6626
  "type": "string",
6417
- "default": ""
6627
+ "default": "Value"
6628
+ },
6629
+ {
6630
+ "name": "size",
6631
+ "description": "Shared field and button height.",
6632
+ "type": "\"sm\" | \"md\" | \"lg\"",
6633
+ "default": "md",
6634
+ "options": [
6635
+ "sm",
6636
+ "md",
6637
+ "lg"
6638
+ ]
6639
+ },
6640
+ {
6641
+ "name": "value",
6642
+ "description": "CSS cubic-bezier or a standard easing keyword. X stays within 0–1; Y is bounded to -1–2 for a limited overshoot.",
6643
+ "type": "string",
6644
+ "default": "cubic-bezier(0.25, 0.1, 0.25, 1)"
6418
6645
  }
6419
6646
  ],
6420
- "events": [],
6421
- "slots": [
6647
+ "events": [
6422
6648
  {
6423
- "name": "default",
6424
- "description": "Default child content."
6649
+ "name": "change",
6650
+ "detailType": "{ readonly value: string }",
6651
+ "detailSchema": "object",
6652
+ "fields": [
6653
+ {
6654
+ "path": "value",
6655
+ "type": "string",
6656
+ "required": true
6657
+ }
6658
+ ],
6659
+ "detailDocs": "Emitted when a toggleable control changes checked state."
6660
+ },
6661
+ {
6662
+ "name": "input",
6663
+ "detailType": "{ readonly value: string }",
6664
+ "detailSchema": "object",
6665
+ "fields": [
6666
+ {
6667
+ "path": "value",
6668
+ "type": "string",
6669
+ "required": true
6670
+ }
6671
+ ],
6672
+ "detailDocs": "Emitted with the declared detail payload."
6425
6673
  }
6426
6674
  ],
6427
- "group": "display",
6428
- "navigationParent": "ui-description-list",
6429
- "id": "@threadlabs/looma/ui-description-item",
6430
- "title": "Description Item",
6431
- "resource": "@threadlabs/looma/components/ui-description-item/ui-description-item.html",
6675
+ "slots": [],
6676
+ "group": "forms",
6677
+ "id": "@threadlabs/looma/ui-curve-editor",
6678
+ "title": "Curve Editor",
6679
+ "resource": "@threadlabs/looma/components/ui-curve-editor/ui-curve-editor.html",
6432
6680
  "targets": [
6433
6681
  "html-next",
6434
6682
  "vue"
6435
6683
  ],
6436
6684
  "examples": [
6437
6685
  {
6438
- "id": "@threadlabs/looma/ui-description-item/01-default",
6439
- "name": "01-default",
6440
- "title": "Default",
6441
- "description": "A term and its value, laid out by the list around it.",
6442
- "markup": "<ui-description-list>\n <ui-description-item term=\"Plan\">Pro</ui-description-item>\n</ui-description-list>",
6443
- "resizable": false,
6444
- "bindings": "",
6445
- "frameworks": {}
6446
- },
6447
- {
6448
- "id": "@threadlabs/looma/ui-description-item/02-tile",
6449
- "name": "02-tile",
6450
- "title": "As a tile",
6451
- "description": "In a tiles list, the term sits above its value on a tile of its own.",
6452
- "markup": "<ui-description-list layout=\"tiles\">\n <ui-description-item term=\"Members\">8</ui-description-item>\n</ui-description-list>",
6686
+ "id": "@threadlabs/looma/ui-curve-editor/01-editing",
6687
+ "name": "01-editing",
6688
+ "title": "Exact and visual editing",
6689
+ "description": "Draggable cubic Bézier handles with keyboard and bounded exact coordinate editing.",
6690
+ "markup": "<ui-curve-editor label=\"Fellowship office motion\" value=\"cubic-bezier(0.25, 0.1, 0.25, 1)\"></ui-curve-editor>",
6453
6691
  "resizable": false,
6454
6692
  "bindings": "",
6455
6693
  "frameworks": {}
@@ -6457,24 +6695,117 @@
6457
6695
  ]
6458
6696
  },
6459
6697
  {
6460
- "tag": "ui-description-list",
6698
+ "tag": "ui-description-item",
6461
6699
  "package": "@threadlabs/looma",
6462
- "root": "dl",
6463
- "description": "Named values: each `ui-description-item` is a `term` and its value, rendered as a `<dl>` of `<div><dt/><dd/></div>` groups. `layout=\"rows\"` lines terms up in one column and values in the next, for a short summary; `layout=\"stacked\"` sets every term above its value, for a narrow space such as a side panel or a popover; `layout=\"grid\"` sets the pairs in columns, term above value, for facts to scan across; `layout=\"tiles\"` sets each pair on its own tile, for figures to compare. `columns` (`2`, `3`, or `4`) caps how many columns grid and tiles set, and `density=\"compact\"` sets the pairs close together. A rows list does not stack on its own; choose `stacked` where it will be narrow. A value can hold code ([Text](/components/ui-text) `variant=\"code\"`), a [Badge](/components/ui-badge), or a long identifier, which wraps rather than overflowing.",
6700
+ "root": "div",
6701
+ "description": "One `term` and its value (the content) in a Description List, laid out by the list. See [Description List](/components/ui-description-list).",
6464
6702
  "designTokens": {
6465
6703
  "sources": [
6466
- "packages/looma/src/components/ui-description-list/ui-description-list.html"
6704
+ "packages/looma/src/components/ui-description-item/ui-description-item.html"
6467
6705
  ],
6468
6706
  "component": [],
6469
6707
  "shared": [
6470
6708
  {
6471
- "name": "--ui-border-strong"
6709
+ "name": "--ui-border-default"
6472
6710
  },
6473
6711
  {
6474
- "name": "--ui-border-width"
6712
+ "name": "--ui-font-medium"
6475
6713
  },
6476
6714
  {
6477
- "name": "--ui-font-size-lg"
6715
+ "name": "--ui-font-size-sm"
6716
+ },
6717
+ {
6718
+ "name": "--ui-radius-md"
6719
+ },
6720
+ {
6721
+ "name": "--ui-space-1"
6722
+ },
6723
+ {
6724
+ "name": "--ui-space-6"
6725
+ },
6726
+ {
6727
+ "name": "--ui-text-muted"
6728
+ },
6729
+ {
6730
+ "name": "--ui-text-primary"
6731
+ }
6732
+ ]
6733
+ },
6734
+ "attributes": [
6735
+ {
6736
+ "name": "term",
6737
+ "property": "term",
6738
+ "description": "What the value is, such as \"Invited by\". The value is the item's content.",
6739
+ "type": "string",
6740
+ "default": ""
6741
+ }
6742
+ ],
6743
+ "properties": [
6744
+ {
6745
+ "name": "term",
6746
+ "description": "What the value is, such as \"Invited by\". The value is the item's content.",
6747
+ "type": "string",
6748
+ "default": ""
6749
+ }
6750
+ ],
6751
+ "events": [],
6752
+ "slots": [
6753
+ {
6754
+ "name": "default",
6755
+ "description": "Default child content."
6756
+ }
6757
+ ],
6758
+ "group": "display",
6759
+ "navigationParent": "ui-description-list",
6760
+ "id": "@threadlabs/looma/ui-description-item",
6761
+ "title": "Description Item",
6762
+ "resource": "@threadlabs/looma/components/ui-description-item/ui-description-item.html",
6763
+ "targets": [
6764
+ "html-next",
6765
+ "vue"
6766
+ ],
6767
+ "examples": [
6768
+ {
6769
+ "id": "@threadlabs/looma/ui-description-item/01-default",
6770
+ "name": "01-default",
6771
+ "title": "Default",
6772
+ "description": "A term and its value, laid out by the list around it.",
6773
+ "markup": "<ui-description-list>\n <ui-description-item term=\"Plan\">Pro</ui-description-item>\n</ui-description-list>",
6774
+ "resizable": false,
6775
+ "bindings": "",
6776
+ "frameworks": {}
6777
+ },
6778
+ {
6779
+ "id": "@threadlabs/looma/ui-description-item/02-tile",
6780
+ "name": "02-tile",
6781
+ "title": "As a tile",
6782
+ "description": "In a tiles list, the term sits above its value on a tile of its own.",
6783
+ "markup": "<ui-description-list layout=\"tiles\">\n <ui-description-item term=\"Members\">8</ui-description-item>\n</ui-description-list>",
6784
+ "resizable": false,
6785
+ "bindings": "",
6786
+ "frameworks": {}
6787
+ }
6788
+ ]
6789
+ },
6790
+ {
6791
+ "tag": "ui-description-list",
6792
+ "package": "@threadlabs/looma",
6793
+ "root": "dl",
6794
+ "description": "Named values: each `ui-description-item` is a `term` and its value, rendered as a `<dl>` of `<div><dt/><dd/></div>` groups. `layout=\"rows\"` lines terms up in one column and values in the next, for a short summary; `layout=\"stacked\"` sets every term above its value, for a narrow space such as a side panel or a popover; `layout=\"grid\"` sets the pairs in columns, term above value, for facts to scan across; `layout=\"tiles\"` sets each pair on its own tile, for figures to compare. `columns` (`2`, `3`, or `4`) caps how many columns grid and tiles set, and `density=\"compact\"` sets the pairs close together. A rows list does not stack on its own; choose `stacked` where it will be narrow. A value can hold code ([Text](/components/ui-text) `variant=\"code\"`), a [Badge](/components/ui-badge), or a long identifier, which wraps rather than overflowing.",
6795
+ "designTokens": {
6796
+ "sources": [
6797
+ "packages/looma/src/components/ui-description-list/ui-description-list.html"
6798
+ ],
6799
+ "component": [],
6800
+ "shared": [
6801
+ {
6802
+ "name": "--ui-border-strong"
6803
+ },
6804
+ {
6805
+ "name": "--ui-border-width"
6806
+ },
6807
+ {
6808
+ "name": "--ui-font-size-lg"
6478
6809
  },
6479
6810
  {
6480
6811
  "name": "--ui-space-1"
@@ -6645,7 +6976,8 @@
6645
6976
  {
6646
6977
  "name": "--ui-dialog-border",
6647
6978
  "fallbacks": [
6648
- "var(--ui-overlay-border, var(--ui-border-strong))"
6979
+ "var(--ui-overlay-border, var(--ui-border-strong))",
6980
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
6649
6981
  ]
6650
6982
  },
6651
6983
  {
@@ -6670,13 +7002,15 @@
6670
7002
  {
6671
7003
  "name": "--ui-dialog-shadow",
6672
7004
  "fallbacks": [
6673
- "var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)))"
7005
+ "var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)))",
7006
+ "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 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
7007
  ]
6675
7008
  },
6676
7009
  {
6677
7010
  "name": "--ui-dialog-surface",
6678
7011
  "fallbacks": [
6679
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
7012
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
7013
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
6680
7014
  ]
6681
7015
  },
6682
7016
  {
@@ -6717,9 +7051,33 @@
6717
7051
  {
6718
7052
  "name": "--ui-font-size-lg"
6719
7053
  },
7054
+ {
7055
+ "name": "--ui-glassiness",
7056
+ "fallbacks": [
7057
+ "0"
7058
+ ]
7059
+ },
6720
7060
  {
6721
7061
  "name": "--ui-line-height-tight"
6722
7062
  },
7063
+ {
7064
+ "name": "--ui-material-content",
7065
+ "fallbacks": [
7066
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
7067
+ ]
7068
+ },
7069
+ {
7070
+ "name": "--ui-material-edge",
7071
+ "fallbacks": [
7072
+ "var(--ui-border-strong)"
7073
+ ]
7074
+ },
7075
+ {
7076
+ "name": "--ui-material-glass",
7077
+ "fallbacks": [
7078
+ "var(--ui-surface-elevated)"
7079
+ ]
7080
+ },
6723
7081
  {
6724
7082
  "name": "--ui-motion-base"
6725
7083
  },
@@ -6747,7 +7105,8 @@
6747
7105
  {
6748
7106
  "name": "--ui-overlay-shadow",
6749
7107
  "fallbacks": [
6750
- "var(--ui-elevation-dialog, var(--ui-shadow-xl))"
7108
+ "var(--ui-elevation-dialog, var(--ui-shadow-xl))",
7109
+ "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 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
7110
  ]
6752
7111
  },
6753
7112
  {
@@ -6786,6 +7145,12 @@
6786
7145
  {
6787
7146
  "name": "--ui-surface-muted"
6788
7147
  },
7148
+ {
7149
+ "name": "--ui-surface-separation",
7150
+ "fallbacks": [
7151
+ "0"
7152
+ ]
7153
+ },
6789
7154
  {
6790
7155
  "name": "--ui-text-primary"
6791
7156
  },
@@ -6850,7 +7215,7 @@
6850
7215
  {
6851
7216
  "name": "size",
6852
7217
  "property": "size",
6853
- "description": "Choose a compact, standard, wide, or viewport-filling dialog.",
7218
+ "description": "Choose a compact, standard, wide, or viewport-filling dialog. Shared surface separation adapts to dialog purpose and rendered size.",
6854
7219
  "type": "keyword",
6855
7220
  "default": "md",
6856
7221
  "options": [
@@ -6909,7 +7274,7 @@
6909
7274
  },
6910
7275
  {
6911
7276
  "name": "size",
6912
- "description": "Choose a compact, standard, wide, or viewport-filling dialog.",
7277
+ "description": "Choose a compact, standard, wide, or viewport-filling dialog. Shared surface separation adapts to dialog purpose and rendered size.",
6913
7278
  "type": "\"sm\" | \"md\" | \"lg\" | \"fullscreen\"",
6914
7279
  "default": "md",
6915
7280
  "options": [
@@ -7012,7 +7377,7 @@
7012
7377
  "name": "01-default",
7013
7378
  "title": "Default",
7014
7379
  "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>",
7380
+ "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
7381
  "resizable": false,
7017
7382
  "bindings": "",
7018
7383
  "frameworks": {}
@@ -7061,7 +7426,7 @@
7061
7426
  "id": "@threadlabs/looma/ui-dialog/06-sizes",
7062
7427
  "name": "06-sizes",
7063
7428
  "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.",
7429
+ "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
7430
  "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
7431
  "resizable": false,
7067
7432
  "bindings": "",
@@ -11767,7 +12132,7 @@
11767
12132
  "name": "01-default",
11768
12133
  "title": "Default",
11769
12134
  "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>",
12135
+ "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
12136
  "resizable": false,
11772
12137
  "bindings": "",
11773
12138
  "frameworks": {}
@@ -11777,7 +12142,7 @@
11777
12142
  "name": "02-gap-and-minimum-column-width",
11778
12143
  "title": "Gap and minimum column width",
11779
12144
  "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>",
12145
+ "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
12146
  "resizable": false,
11782
12147
  "bindings": "",
11783
12148
  "frameworks": {}
@@ -12012,6 +12377,18 @@
12012
12377
  {
12013
12378
  "name": "--ui-control-size-sm"
12014
12379
  },
12380
+ {
12381
+ "name": "--ui-danger"
12382
+ },
12383
+ {
12384
+ "name": "--ui-danger-hover"
12385
+ },
12386
+ {
12387
+ "name": "--ui-danger-on-strong"
12388
+ },
12389
+ {
12390
+ "name": "--ui-danger-subtle-text"
12391
+ },
12015
12392
  {
12016
12393
  "name": "--ui-disabled-border"
12017
12394
  },
@@ -12039,6 +12416,18 @@
12039
12416
  {
12040
12417
  "name": "--ui-icon-size-sm"
12041
12418
  },
12419
+ {
12420
+ "name": "--ui-info"
12421
+ },
12422
+ {
12423
+ "name": "--ui-info-hover"
12424
+ },
12425
+ {
12426
+ "name": "--ui-info-on-strong"
12427
+ },
12428
+ {
12429
+ "name": "--ui-info-subtle-text"
12430
+ },
12042
12431
  {
12043
12432
  "name": "--ui-motion-base"
12044
12433
  },
@@ -12069,6 +12458,18 @@
12069
12458
  {
12070
12459
  "name": "--ui-radius-round"
12071
12460
  },
12461
+ {
12462
+ "name": "--ui-success"
12463
+ },
12464
+ {
12465
+ "name": "--ui-success-hover"
12466
+ },
12467
+ {
12468
+ "name": "--ui-success-on-strong"
12469
+ },
12470
+ {
12471
+ "name": "--ui-success-subtle-text"
12472
+ },
12072
12473
  {
12073
12474
  "name": "--ui-surface-default"
12074
12475
  },
@@ -12080,6 +12481,18 @@
12080
12481
  },
12081
12482
  {
12082
12483
  "name": "--ui-text-secondary"
12484
+ },
12485
+ {
12486
+ "name": "--ui-warning"
12487
+ },
12488
+ {
12489
+ "name": "--ui-warning-hover"
12490
+ },
12491
+ {
12492
+ "name": "--ui-warning-on-strong"
12493
+ },
12494
+ {
12495
+ "name": "--ui-warning-subtle-text"
12083
12496
  }
12084
12497
  ]
12085
12498
  },
@@ -12136,6 +12549,20 @@
12136
12549
  "type": "boolean",
12137
12550
  "default": false
12138
12551
  },
12552
+ {
12553
+ "name": "preset",
12554
+ "property": "preset",
12555
+ "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.",
12556
+ "type": "keyword",
12557
+ "default": "none",
12558
+ "options": [
12559
+ "none",
12560
+ "primary",
12561
+ "standard",
12562
+ "quiet",
12563
+ "destructive"
12564
+ ]
12565
+ },
12139
12566
  {
12140
12567
  "name": "revealed",
12141
12568
  "property": "revealed",
@@ -12165,11 +12592,17 @@
12165
12592
  {
12166
12593
  "name": "tone",
12167
12594
  "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.",
12595
+ "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
12596
  "type": "keyword",
12597
+ "default": "auto",
12170
12598
  "options": [
12599
+ "auto",
12171
12600
  "accent",
12172
- "neutral"
12601
+ "neutral",
12602
+ "danger",
12603
+ "success",
12604
+ "warning",
12605
+ "info"
12173
12606
  ]
12174
12607
  },
12175
12608
  {
@@ -12231,6 +12664,19 @@
12231
12664
  "type": "boolean",
12232
12665
  "default": false
12233
12666
  },
12667
+ {
12668
+ "name": "preset",
12669
+ "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.",
12670
+ "type": "\"none\" | \"primary\" | \"standard\" | \"quiet\" | \"destructive\"",
12671
+ "default": "none",
12672
+ "options": [
12673
+ "none",
12674
+ "primary",
12675
+ "standard",
12676
+ "quiet",
12677
+ "destructive"
12678
+ ]
12679
+ },
12234
12680
  {
12235
12681
  "name": "revealed",
12236
12682
  "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 +12702,17 @@
12256
12702
  },
12257
12703
  {
12258
12704
  "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\"",
12705
+ "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.",
12706
+ "type": "\"auto\" | \"accent\" | \"neutral\" | \"danger\" | \"success\" | \"warning\" | \"info\"",
12707
+ "default": "auto",
12261
12708
  "options": [
12709
+ "auto",
12262
12710
  "accent",
12263
- "neutral"
12711
+ "neutral",
12712
+ "danger",
12713
+ "success",
12714
+ "warning",
12715
+ "info"
12264
12716
  ]
12265
12717
  },
12266
12718
  {
@@ -12996,7 +13448,7 @@
12996
13448
  "name": "01-default",
12997
13449
  "title": "Default",
12998
13450
  "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>",
13451
+ "markup": "<ui-input type=\"text\" aria-label=\"Office search\" placeholder=\"Search Fellowship office\"> </ui-input>",
13000
13452
  "resizable": false,
13001
13453
  "bindings": "",
13002
13454
  "frameworks": {}
@@ -14191,7 +14643,8 @@
14191
14643
  {
14192
14644
  "name": "--ui-menu-border",
14193
14645
  "fallbacks": [
14194
- "var(--ui-overlay-border, var(--ui-border-strong))"
14646
+ "var(--ui-overlay-border, var(--ui-border-strong))",
14647
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
14195
14648
  ]
14196
14649
  },
14197
14650
  {
@@ -14203,13 +14656,15 @@
14203
14656
  {
14204
14657
  "name": "--ui-menu-shadow",
14205
14658
  "fallbacks": [
14206
- "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))"
14659
+ "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))",
14660
+ "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 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
14661
  ]
14208
14662
  },
14209
14663
  {
14210
14664
  "name": "--ui-menu-surface",
14211
14665
  "fallbacks": [
14212
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
14666
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
14667
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
14213
14668
  ]
14214
14669
  },
14215
14670
  {
@@ -14241,6 +14696,30 @@
14241
14696
  {
14242
14697
  "name": "--ui-font-size-xs"
14243
14698
  },
14699
+ {
14700
+ "name": "--ui-glassiness",
14701
+ "fallbacks": [
14702
+ "0"
14703
+ ]
14704
+ },
14705
+ {
14706
+ "name": "--ui-material-content",
14707
+ "fallbacks": [
14708
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
14709
+ ]
14710
+ },
14711
+ {
14712
+ "name": "--ui-material-edge",
14713
+ "fallbacks": [
14714
+ "var(--ui-border-strong)"
14715
+ ]
14716
+ },
14717
+ {
14718
+ "name": "--ui-material-glass",
14719
+ "fallbacks": [
14720
+ "var(--ui-surface-elevated)"
14721
+ ]
14722
+ },
14244
14723
  {
14245
14724
  "name": "--ui-motion-ease"
14246
14725
  },
@@ -14262,7 +14741,8 @@
14262
14741
  {
14263
14742
  "name": "--ui-overlay-shadow",
14264
14743
  "fallbacks": [
14265
- "var(--ui-elevation-overlay, var(--ui-shadow-lg))"
14744
+ "var(--ui-elevation-overlay, var(--ui-shadow-lg))",
14745
+ "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 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
14746
  ]
14267
14747
  },
14268
14748
  {
@@ -14291,6 +14771,15 @@
14291
14771
  },
14292
14772
  {
14293
14773
  "name": "--ui-surface-elevated"
14774
+ },
14775
+ {
14776
+ "name": "--ui-surface-separation",
14777
+ "fallbacks": [
14778
+ "0"
14779
+ ]
14780
+ },
14781
+ {
14782
+ "name": "--ui-text-primary"
14294
14783
  }
14295
14784
  ]
14296
14785
  },
@@ -15654,45 +16143,242 @@
15654
16143
  ]
15655
16144
  },
15656
16145
  {
15657
- "tag": "ui-page-header",
16146
+ "tag": "ui-number-input",
15658
16147
  "package": "@threadlabs/looma",
15659
- "root": "header",
15660
- "description": "The top of a view: its one `h1`, with an optional icon or mark before it (`leading`), a short `eyebrow` above it, a `description` under it, and the view's own `actions` at the end. Every view titles itself the same way, at the same size. `align=\"center\"` stacks it centred, for a standalone card such as sign-in.",
16148
+ "root": "span",
16149
+ "description": "Bounded exact number and unit editing with safe arithmetic, stepping and keyboard controls.",
15661
16150
  "designTokens": {
15662
16151
  "sources": [
15663
- "packages/looma/src/components/ui-page-header/ui-page-header.html"
16152
+ "packages/looma/src/components/ui-number-input/ui-number-input.html"
15664
16153
  ],
15665
16154
  "component": [],
15666
16155
  "shared": [
15667
16156
  {
15668
- "name": "--ui-font-bold",
15669
- "fallbacks": [
15670
- "700"
15671
- ]
15672
- },
15673
- {
15674
- "name": "--ui-font-display",
15675
- "fallbacks": [
15676
- "inherit"
15677
- ]
15678
- },
15679
- {
15680
- "name": "--ui-font-semibold"
15681
- },
15682
- {
15683
- "name": "--ui-font-size-2xl"
15684
- },
15685
- {
15686
- "name": "--ui-font-size-md"
15687
- },
15688
- {
15689
- "name": "--ui-font-size-xs"
15690
- },
15691
- {
15692
- "name": "--ui-line-height"
15693
- },
15694
- {
15695
- "name": "--ui-line-height-tight"
16157
+ "name": "--ui-space-1"
16158
+ }
16159
+ ]
16160
+ },
16161
+ "attributes": [
16162
+ {
16163
+ "name": "disabled",
16164
+ "property": "disabled",
16165
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
16166
+ "type": "boolean",
16167
+ "default": false
16168
+ },
16169
+ {
16170
+ "name": "label",
16171
+ "property": "label",
16172
+ "description": "Accessible name for the editing control.",
16173
+ "type": "string",
16174
+ "default": "Value"
16175
+ },
16176
+ {
16177
+ "name": "max",
16178
+ "property": "max",
16179
+ "description": "Inclusive upper bound applied to every editing path.",
16180
+ "type": "number",
16181
+ "default": 1000000
16182
+ },
16183
+ {
16184
+ "name": "min",
16185
+ "property": "min",
16186
+ "description": "Inclusive lower bound applied to typing, arithmetic, stepping and external values.",
16187
+ "type": "number",
16188
+ "default": -1000000
16189
+ },
16190
+ {
16191
+ "name": "name",
16192
+ "property": "name",
16193
+ "description": "Optional form field name.",
16194
+ "type": "string",
16195
+ "default": ""
16196
+ },
16197
+ {
16198
+ "name": "size",
16199
+ "property": "size",
16200
+ "description": "Shared field and button height.",
16201
+ "type": "keyword",
16202
+ "default": "md",
16203
+ "options": [
16204
+ "sm",
16205
+ "md",
16206
+ "lg"
16207
+ ]
16208
+ },
16209
+ {
16210
+ "name": "step",
16211
+ "property": "step",
16212
+ "description": "Positive increment used by arrows and step buttons; Shift multiplies it by ten.",
16213
+ "type": "number",
16214
+ "default": 1
16215
+ },
16216
+ {
16217
+ "name": "unit",
16218
+ "property": "unit",
16219
+ "description": "One accepted unit, such as px, rem, ms or %. Bare numbers use this unit. No automatic unit conversion.",
16220
+ "type": "string",
16221
+ "default": ""
16222
+ },
16223
+ {
16224
+ "name": "value",
16225
+ "property": "value",
16226
+ "description": "Exact value. Arithmetic is calculated on Enter or blur; the resulting value includes unit. Invalid expressions stay visible and expose invalid state.",
16227
+ "type": "string",
16228
+ "default": "0"
16229
+ }
16230
+ ],
16231
+ "properties": [
16232
+ {
16233
+ "name": "disabled",
16234
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
16235
+ "type": "boolean",
16236
+ "default": false
16237
+ },
16238
+ {
16239
+ "name": "label",
16240
+ "description": "Accessible name for the editing control.",
16241
+ "type": "string",
16242
+ "default": "Value"
16243
+ },
16244
+ {
16245
+ "name": "max",
16246
+ "description": "Inclusive upper bound applied to every editing path.",
16247
+ "type": "number",
16248
+ "default": 1000000
16249
+ },
16250
+ {
16251
+ "name": "min",
16252
+ "description": "Inclusive lower bound applied to typing, arithmetic, stepping and external values.",
16253
+ "type": "number",
16254
+ "default": -1000000
16255
+ },
16256
+ {
16257
+ "name": "name",
16258
+ "description": "Optional form field name.",
16259
+ "type": "string",
16260
+ "default": ""
16261
+ },
16262
+ {
16263
+ "name": "size",
16264
+ "description": "Shared field and button height.",
16265
+ "type": "\"sm\" | \"md\" | \"lg\"",
16266
+ "default": "md",
16267
+ "options": [
16268
+ "sm",
16269
+ "md",
16270
+ "lg"
16271
+ ]
16272
+ },
16273
+ {
16274
+ "name": "step",
16275
+ "description": "Positive increment used by arrows and step buttons; Shift multiplies it by ten.",
16276
+ "type": "number",
16277
+ "default": 1
16278
+ },
16279
+ {
16280
+ "name": "unit",
16281
+ "description": "One accepted unit, such as px, rem, ms or %. Bare numbers use this unit. No automatic unit conversion.",
16282
+ "type": "string",
16283
+ "default": ""
16284
+ },
16285
+ {
16286
+ "name": "value",
16287
+ "description": "Exact value. Arithmetic is calculated on Enter or blur; the resulting value includes unit. Invalid expressions stay visible and expose invalid state.",
16288
+ "type": "string",
16289
+ "default": "0"
16290
+ }
16291
+ ],
16292
+ "events": [
16293
+ {
16294
+ "name": "change",
16295
+ "detailType": "{ readonly value: string }",
16296
+ "detailSchema": "object",
16297
+ "fields": [
16298
+ {
16299
+ "path": "value",
16300
+ "type": "string",
16301
+ "required": true
16302
+ }
16303
+ ],
16304
+ "detailDocs": "Emitted when a toggleable control changes checked state."
16305
+ },
16306
+ {
16307
+ "name": "input",
16308
+ "detailType": "{ readonly value: string }",
16309
+ "detailSchema": "object",
16310
+ "fields": [
16311
+ {
16312
+ "path": "value",
16313
+ "type": "string",
16314
+ "required": true
16315
+ }
16316
+ ],
16317
+ "detailDocs": "Emitted with the declared detail payload."
16318
+ }
16319
+ ],
16320
+ "slots": [],
16321
+ "group": "forms",
16322
+ "id": "@threadlabs/looma/ui-number-input",
16323
+ "title": "Number Input",
16324
+ "resource": "@threadlabs/looma/components/ui-number-input/ui-number-input.html",
16325
+ "targets": [
16326
+ "html-next",
16327
+ "vue"
16328
+ ],
16329
+ "examples": [
16330
+ {
16331
+ "id": "@threadlabs/looma/ui-number-input/01-editing",
16332
+ "name": "01-editing",
16333
+ "title": "Exact and visual editing",
16334
+ "description": "Bounded exact number and unit editing with safe arithmetic, stepping and keyboard controls.",
16335
+ "markup": "<ui-number-input label=\"Frodo’s desk spacing\" value=\"16px\" unit=\"px\" min=\"8\" max=\"40\" step=\"1\"></ui-number-input>",
16336
+ "resizable": false,
16337
+ "bindings": "",
16338
+ "frameworks": {}
16339
+ }
16340
+ ]
16341
+ },
16342
+ {
16343
+ "tag": "ui-page-header",
16344
+ "package": "@threadlabs/looma",
16345
+ "root": "header",
16346
+ "description": "The top of a view: its one `h1`, with an optional icon or mark before it (`leading`), a short `eyebrow` above it, a `description` under it, and the view's own `actions` at the end. Every view titles itself the same way, at the same size. `align=\"center\"` stacks it centred, for a standalone card such as sign-in.",
16347
+ "designTokens": {
16348
+ "sources": [
16349
+ "packages/looma/src/components/ui-page-header/ui-page-header.html"
16350
+ ],
16351
+ "component": [],
16352
+ "shared": [
16353
+ {
16354
+ "name": "--ui-font-bold",
16355
+ "fallbacks": [
16356
+ "700"
16357
+ ]
16358
+ },
16359
+ {
16360
+ "name": "--ui-font-display",
16361
+ "fallbacks": [
16362
+ "inherit"
16363
+ ]
16364
+ },
16365
+ {
16366
+ "name": "--ui-font-semibold"
16367
+ },
16368
+ {
16369
+ "name": "--ui-font-size-2xl"
16370
+ },
16371
+ {
16372
+ "name": "--ui-font-size-md"
16373
+ },
16374
+ {
16375
+ "name": "--ui-font-size-xs"
16376
+ },
16377
+ {
16378
+ "name": "--ui-line-height"
16379
+ },
16380
+ {
16381
+ "name": "--ui-line-height-tight"
15696
16382
  },
15697
16383
  {
15698
16384
  "name": "--ui-space-1"
@@ -15809,7 +16495,8 @@
15809
16495
  {
15810
16496
  "name": "--ui-popover-border",
15811
16497
  "fallbacks": [
15812
- "var(--ui-overlay-border, var(--ui-border-strong))"
16498
+ "var(--ui-overlay-border, var(--ui-border-strong))",
16499
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
15813
16500
  ]
15814
16501
  },
15815
16502
  {
@@ -15827,13 +16514,15 @@
15827
16514
  {
15828
16515
  "name": "--ui-popover-shadow",
15829
16516
  "fallbacks": [
15830
- "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))"
16517
+ "var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))",
16518
+ "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 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
16519
  ]
15832
16520
  },
15833
16521
  {
15834
16522
  "name": "--ui-popover-surface",
15835
16523
  "fallbacks": [
15836
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
16524
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
16525
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
15837
16526
  ]
15838
16527
  },
15839
16528
  {
@@ -15856,6 +16545,30 @@
15856
16545
  "var(--ui-shadow-lg)"
15857
16546
  ]
15858
16547
  },
16548
+ {
16549
+ "name": "--ui-glassiness",
16550
+ "fallbacks": [
16551
+ "0"
16552
+ ]
16553
+ },
16554
+ {
16555
+ "name": "--ui-material-content",
16556
+ "fallbacks": [
16557
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
16558
+ ]
16559
+ },
16560
+ {
16561
+ "name": "--ui-material-edge",
16562
+ "fallbacks": [
16563
+ "var(--ui-border-strong)"
16564
+ ]
16565
+ },
16566
+ {
16567
+ "name": "--ui-material-glass",
16568
+ "fallbacks": [
16569
+ "var(--ui-surface-elevated)"
16570
+ ]
16571
+ },
15859
16572
  {
15860
16573
  "name": "--ui-motion-ease"
15861
16574
  },
@@ -15877,7 +16590,8 @@
15877
16590
  {
15878
16591
  "name": "--ui-overlay-shadow",
15879
16592
  "fallbacks": [
15880
- "var(--ui-elevation-overlay, var(--ui-shadow-lg))"
16593
+ "var(--ui-elevation-overlay, var(--ui-shadow-lg))",
16594
+ "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 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
16595
  ]
15882
16596
  },
15883
16597
  {
@@ -15900,6 +16614,15 @@
15900
16614
  },
15901
16615
  {
15902
16616
  "name": "--ui-surface-elevated"
16617
+ },
16618
+ {
16619
+ "name": "--ui-surface-separation",
16620
+ "fallbacks": [
16621
+ "0"
16622
+ ]
16623
+ },
16624
+ {
16625
+ "name": "--ui-text-primary"
15903
16626
  }
15904
16627
  ]
15905
16628
  },
@@ -15949,7 +16672,7 @@
15949
16672
  {
15950
16673
  "name": "size",
15951
16674
  "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.",
16675
+ "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
16676
  "type": "keyword",
15954
16677
  "default": "content",
15955
16678
  "options": [
@@ -16001,7 +16724,7 @@
16001
16724
  },
16002
16725
  {
16003
16726
  "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.",
16727
+ "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
16728
  "type": "\"content\" | \"sm\" | \"md\" | \"lg\"",
16006
16729
  "default": "content",
16007
16730
  "options": [
@@ -16102,7 +16825,7 @@
16102
16825
  "name": "01-trigger-binding",
16103
16826
  "title": "Trigger binding",
16104
16827
  "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>",
16828
+ "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
16829
  "resizable": false,
16107
16830
  "bindings": "",
16108
16831
  "frameworks": {}
@@ -16811,7 +17534,7 @@
16811
17534
  "name": "01-default",
16812
17535
  "title": "Default",
16813
17536
  "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>",
17537
+ "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
17538
  "resizable": false,
16816
17539
  "bindings": "",
16817
17540
  "frameworks": {}
@@ -16821,7 +17544,7 @@
16821
17544
  "name": "02-gap-item-width-and-snap",
16822
17545
  "title": "Gap, item width, and snap",
16823
17546
  "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>",
17547
+ "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
17548
  "resizable": false,
16826
17549
  "bindings": "",
16827
17550
  "frameworks": {}
@@ -16983,7 +17706,7 @@
16983
17706
  "name": "01-default",
16984
17707
  "title": "Default",
16985
17708
  "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>",
17709
+ "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
17710
  "resizable": false,
16988
17711
  "bindings": "",
16989
17712
  "frameworks": {}
@@ -18620,9 +19343,9 @@
18620
19343
  "id": "@threadlabs/looma/ui-sidebar/01-app-shell",
18621
19344
  "name": "01-app-shell",
18622
19345
  "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,
19346
+ "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.",
19347
+ "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>",
19348
+ "resizable": true,
18626
19349
  "bindings": "",
18627
19350
  "frameworks": {}
18628
19351
  },
@@ -18631,7 +19354,234 @@
18631
19354
  "name": "02-end-side-resizable",
18632
19355
  "title": "End side, resizable",
18633
19356
  "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>",
19357
+ "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>",
19358
+ "resizable": true,
19359
+ "bindings": "",
19360
+ "frameworks": {}
19361
+ }
19362
+ ]
19363
+ },
19364
+ {
19365
+ "tag": "ui-slider",
19366
+ "package": "@threadlabs/looma",
19367
+ "root": "span",
19368
+ "description": "Native accessible range paired with bounded exact number and unit editing.",
19369
+ "designTokens": {
19370
+ "sources": [
19371
+ "packages/looma/src/components/ui-slider/ui-slider.html"
19372
+ ],
19373
+ "component": [],
19374
+ "shared": [
19375
+ {
19376
+ "name": "--ui-accent-solid"
19377
+ },
19378
+ {
19379
+ "name": "--ui-control-focus",
19380
+ "fallbacks": [
19381
+ "var(--ui-accent-solid)"
19382
+ ]
19383
+ },
19384
+ {
19385
+ "name": "--ui-control-min-block-size"
19386
+ },
19387
+ {
19388
+ "name": "--ui-control-size-lg"
19389
+ },
19390
+ {
19391
+ "name": "--ui-control-size-md"
19392
+ },
19393
+ {
19394
+ "name": "--ui-control-size-sm"
19395
+ },
19396
+ {
19397
+ "name": "--ui-focus-width"
19398
+ },
19399
+ {
19400
+ "name": "--ui-radius-sm"
19401
+ },
19402
+ {
19403
+ "name": "--ui-space-1"
19404
+ },
19405
+ {
19406
+ "name": "--ui-space-2"
19407
+ }
19408
+ ]
19409
+ },
19410
+ "attributes": [
19411
+ {
19412
+ "name": "disabled",
19413
+ "property": "disabled",
19414
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
19415
+ "type": "boolean",
19416
+ "default": false
19417
+ },
19418
+ {
19419
+ "name": "label",
19420
+ "property": "label",
19421
+ "description": "Accessible name for the editing control.",
19422
+ "type": "string",
19423
+ "default": "Value"
19424
+ },
19425
+ {
19426
+ "name": "max",
19427
+ "property": "max",
19428
+ "description": "Inclusive upper bound for dragging, keyboard steps and exact entry.",
19429
+ "type": "number",
19430
+ "default": 100
19431
+ },
19432
+ {
19433
+ "name": "min",
19434
+ "property": "min",
19435
+ "description": "Inclusive lower bound for dragging, keyboard steps and exact entry.",
19436
+ "type": "number",
19437
+ "default": 0
19438
+ },
19439
+ {
19440
+ "name": "name",
19441
+ "property": "name",
19442
+ "description": "Optional numeric form field name.",
19443
+ "type": "string",
19444
+ "default": ""
19445
+ },
19446
+ {
19447
+ "name": "size",
19448
+ "property": "size",
19449
+ "description": "Shared field and button height.",
19450
+ "type": "keyword",
19451
+ "default": "md",
19452
+ "options": [
19453
+ "sm",
19454
+ "md",
19455
+ "lg"
19456
+ ]
19457
+ },
19458
+ {
19459
+ "name": "step",
19460
+ "property": "step",
19461
+ "description": "Positive native range and exact entry increment.",
19462
+ "type": "number",
19463
+ "default": 1
19464
+ },
19465
+ {
19466
+ "name": "unit",
19467
+ "property": "unit",
19468
+ "description": "Unit shown by the exact editor.",
19469
+ "type": "string",
19470
+ "default": ""
19471
+ },
19472
+ {
19473
+ "name": "value",
19474
+ "property": "value",
19475
+ "description": "Current numeric value. Native range and exact entry share bounds.",
19476
+ "type": "number",
19477
+ "default": 0
19478
+ }
19479
+ ],
19480
+ "properties": [
19481
+ {
19482
+ "name": "disabled",
19483
+ "description": "Prevents typing, stepping and pointer or keyboard changes while keeping the value visible.",
19484
+ "type": "boolean",
19485
+ "default": false
19486
+ },
19487
+ {
19488
+ "name": "label",
19489
+ "description": "Accessible name for the editing control.",
19490
+ "type": "string",
19491
+ "default": "Value"
19492
+ },
19493
+ {
19494
+ "name": "max",
19495
+ "description": "Inclusive upper bound for dragging, keyboard steps and exact entry.",
19496
+ "type": "number",
19497
+ "default": 100
19498
+ },
19499
+ {
19500
+ "name": "min",
19501
+ "description": "Inclusive lower bound for dragging, keyboard steps and exact entry.",
19502
+ "type": "number",
19503
+ "default": 0
19504
+ },
19505
+ {
19506
+ "name": "name",
19507
+ "description": "Optional numeric form field name.",
19508
+ "type": "string",
19509
+ "default": ""
19510
+ },
19511
+ {
19512
+ "name": "size",
19513
+ "description": "Shared field and button height.",
19514
+ "type": "\"sm\" | \"md\" | \"lg\"",
19515
+ "default": "md",
19516
+ "options": [
19517
+ "sm",
19518
+ "md",
19519
+ "lg"
19520
+ ]
19521
+ },
19522
+ {
19523
+ "name": "step",
19524
+ "description": "Positive native range and exact entry increment.",
19525
+ "type": "number",
19526
+ "default": 1
19527
+ },
19528
+ {
19529
+ "name": "unit",
19530
+ "description": "Unit shown by the exact editor.",
19531
+ "type": "string",
19532
+ "default": ""
19533
+ },
19534
+ {
19535
+ "name": "value",
19536
+ "description": "Current numeric value. Native range and exact entry share bounds.",
19537
+ "type": "number",
19538
+ "default": 0
19539
+ }
19540
+ ],
19541
+ "events": [
19542
+ {
19543
+ "name": "change",
19544
+ "detailType": "{ readonly value: number }",
19545
+ "detailSchema": "object",
19546
+ "fields": [
19547
+ {
19548
+ "path": "value",
19549
+ "type": "number",
19550
+ "required": true
19551
+ }
19552
+ ],
19553
+ "detailDocs": "Emitted when a toggleable control changes checked state."
19554
+ },
19555
+ {
19556
+ "name": "input",
19557
+ "detailType": "{ readonly value: number }",
19558
+ "detailSchema": "object",
19559
+ "fields": [
19560
+ {
19561
+ "path": "value",
19562
+ "type": "number",
19563
+ "required": true
19564
+ }
19565
+ ],
19566
+ "detailDocs": "Emitted with the declared detail payload."
19567
+ }
19568
+ ],
19569
+ "slots": [],
19570
+ "group": "forms",
19571
+ "id": "@threadlabs/looma/ui-slider",
19572
+ "title": "Slider",
19573
+ "resource": "@threadlabs/looma/components/ui-slider/ui-slider.html",
19574
+ "targets": [
19575
+ "html-next",
19576
+ "vue"
19577
+ ],
19578
+ "examples": [
19579
+ {
19580
+ "id": "@threadlabs/looma/ui-slider/01-editing",
19581
+ "name": "01-editing",
19582
+ "title": "Exact and visual editing",
19583
+ "description": "Native accessible range paired with bounded exact number and unit editing.",
19584
+ "markup": "<ui-slider label=\"Sam’s focus time\" value=\"25\" min=\"5\" max=\"60\" step=\"5\" unit=\"min\"></ui-slider>",
18635
19585
  "resizable": false,
18636
19586
  "bindings": "",
18637
19587
  "frameworks": {}
@@ -18896,7 +19846,7 @@
18896
19846
  "name": "01-default",
18897
19847
  "title": "Default",
18898
19848
  "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>",
19849
+ "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
19850
  "resizable": false,
18901
19851
  "bindings": "",
18902
19852
  "frameworks": {}
@@ -18906,7 +19856,7 @@
18906
19856
  "name": "02-gap-xl-and-align-center",
18907
19857
  "title": "gap=\"xl\" and align=\"center\"",
18908
19858
  "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>",
19859
+ "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
19860
  "resizable": false,
18911
19861
  "bindings": "",
18912
19862
  "frameworks": {}
@@ -19496,7 +20446,7 @@
19496
20446
  "name": "01-default",
19497
20447
  "title": "Default",
19498
20448
  "description": "With checked omitted, Switch starts off and enabled.",
19499
- "markup": "<ui-switch>Switch</ui-switch>",
20449
+ "markup": "<ui-switch>Frodo is available</ui-switch>",
19500
20450
  "resizable": false,
19501
20451
  "bindings": "",
19502
20452
  "frameworks": {}
@@ -19698,7 +20648,7 @@
19698
20648
  "name": "01-default",
19699
20649
  "title": "Default",
19700
20650
  "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>",
20651
+ "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
20652
  "resizable": true,
19703
20653
  "bindings": "",
19704
20654
  "frameworks": {}
@@ -19708,7 +20658,7 @@
19708
20658
  "name": "02-gap-threshold-and-alignment",
19709
20659
  "title": "Gap, threshold, and alignment",
19710
20660
  "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>",
20661
+ "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
20662
  "resizable": true,
19713
20663
  "bindings": "",
19714
20664
  "frameworks": {}
@@ -19904,6 +20854,12 @@
19904
20854
  "packages/looma/src/components/ui-tabs/ui-tabs.html"
19905
20855
  ],
19906
20856
  "component": [
20857
+ {
20858
+ "name": "--ui-tabs-panel-padding",
20859
+ "fallbacks": [
20860
+ "var(--ui-space-4)"
20861
+ ]
20862
+ },
19907
20863
  {
19908
20864
  "name": "--ui-tabs-tab-min-block-size",
19909
20865
  "declarations": [
@@ -20233,7 +21189,7 @@
20233
21189
  "tag": "ui-text",
20234
21190
  "package": "@threadlabs/looma",
20235
21191
  "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.",
21192
+ "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
21193
  "designTokens": {
20238
21194
  "sources": [
20239
21195
  "packages/looma/src/components/ui-text/ui-text.html"
@@ -20259,7 +21215,8 @@
20259
21215
  {
20260
21216
  "name": "--ui-font-display",
20261
21217
  "fallbacks": [
20262
- "inherit"
21218
+ "inherit",
21219
+ "var(--ui-font-family-sans)"
20263
21220
  ]
20264
21221
  },
20265
21222
  {
@@ -20280,6 +21237,9 @@
20280
21237
  {
20281
21238
  "name": "--ui-font-semibold"
20282
21239
  },
21240
+ {
21241
+ "name": "--ui-font-size-2xl"
21242
+ },
20283
21243
  {
20284
21244
  "name": "--ui-font-size-lg"
20285
21245
  },
@@ -20289,6 +21249,9 @@
20289
21249
  {
20290
21250
  "name": "--ui-font-size-sm"
20291
21251
  },
21252
+ {
21253
+ "name": "--ui-font-size-xl"
21254
+ },
20292
21255
  {
20293
21256
  "name": "--ui-font-size-xs"
20294
21257
  },
@@ -20301,6 +21264,9 @@
20301
21264
  {
20302
21265
  "name": "--ui-line-height-relaxed"
20303
21266
  },
21267
+ {
21268
+ "name": "--ui-line-height-tight"
21269
+ },
20304
21270
  {
20305
21271
  "name": "--ui-success-subtle-text"
20306
21272
  },
@@ -20324,7 +21290,7 @@
20324
21290
  {
20325
21291
  "name": "as",
20326
21292
  "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.",
21293
+ "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
21294
  "type": "keyword",
20329
21295
  "default": "p",
20330
21296
  "options": [
@@ -20334,6 +21300,7 @@
20334
21300
  "small",
20335
21301
  "strong",
20336
21302
  "label",
21303
+ "h1",
20337
21304
  "h2",
20338
21305
  "h3",
20339
21306
  "h4",
@@ -20407,11 +21374,15 @@
20407
21374
  {
20408
21375
  "name": "variant",
20409
21376
  "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.",
21377
+ "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
21378
  "type": "keyword",
20412
21379
  "default": "body",
20413
21380
  "options": [
20414
21381
  "body",
21382
+ "display",
21383
+ "heading",
21384
+ "label",
21385
+ "caption",
20415
21386
  "eyebrow",
20416
21387
  "code"
20417
21388
  ]
@@ -20454,8 +21425,8 @@
20454
21425
  },
20455
21426
  {
20456
21427
  "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\"",
21428
+ "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.",
21429
+ "type": "\"p\" | \"span\" | \"div\" | \"small\" | \"strong\" | \"label\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"",
20459
21430
  "default": "p",
20460
21431
  "options": [
20461
21432
  "p",
@@ -20464,6 +21435,7 @@
20464
21435
  "small",
20465
21436
  "strong",
20466
21437
  "label",
21438
+ "h1",
20467
21439
  "h2",
20468
21440
  "h3",
20469
21441
  "h4",
@@ -20530,11 +21502,15 @@
20530
21502
  },
20531
21503
  {
20532
21504
  "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\"",
21505
+ "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.",
21506
+ "type": "\"body\" | \"display\" | \"heading\" | \"label\" | \"caption\" | \"eyebrow\" | \"code\"",
20535
21507
  "default": "body",
20536
21508
  "options": [
20537
21509
  "body",
21510
+ "display",
21511
+ "heading",
21512
+ "label",
21513
+ "caption",
20538
21514
  "eyebrow",
20539
21515
  "code"
20540
21516
  ]
@@ -20591,9 +21567,9 @@
20591
21567
  {
20592
21568
  "id": "@threadlabs/looma/ui-text/02-variants",
20593
21569
  "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>",
21570
+ "title": "Typography roles",
21571
+ "description": "One shared type family gives the Fellowship office titles, section headings, labels, captions and eyebrows. Choose document heading levels separately from visual roles.",
21572
+ "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
21573
  "resizable": false,
20598
21574
  "bindings": "",
20599
21575
  "frameworks": {}
@@ -21600,7 +22576,8 @@
21600
22576
  {
21601
22577
  "name": "--ui-tooltip-border",
21602
22578
  "fallbacks": [
21603
- "var(--ui-overlay-border, var(--ui-border-strong))"
22579
+ "var(--ui-overlay-border, var(--ui-border-strong))",
22580
+ "color-mix(in oklab, var(--ui-overlay-border, var(--ui-border-strong)) calc((1 - var(--_ui-material-active)) * 100%), transparent)"
21604
22581
  ]
21605
22582
  },
21606
22583
  {
@@ -21630,13 +22607,15 @@
21630
22607
  {
21631
22608
  "name": "--ui-tooltip-shadow",
21632
22609
  "fallbacks": [
21633
- "var(--ui-overlay-shadow, var(--ui-elevation-tooltip, var(--ui-shadow-md)))"
22610
+ "var(--ui-overlay-shadow, var(--ui-elevation-tooltip, var(--ui-shadow-md)))",
22611
+ "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
22612
  ]
21635
22613
  },
21636
22614
  {
21637
22615
  "name": "--ui-tooltip-surface",
21638
22616
  "fallbacks": [
21639
- "var(--ui-overlay-surface, var(--ui-surface-elevated))"
22617
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))",
22618
+ "var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated)))"
21640
22619
  ]
21641
22620
  },
21642
22621
  {
@@ -21671,9 +22650,33 @@
21671
22650
  {
21672
22651
  "name": "--ui-font-size-xs"
21673
22652
  },
22653
+ {
22654
+ "name": "--ui-glassiness",
22655
+ "fallbacks": [
22656
+ "0"
22657
+ ]
22658
+ },
21674
22659
  {
21675
22660
  "name": "--ui-line-height-tight"
21676
22661
  },
22662
+ {
22663
+ "name": "--ui-material-content",
22664
+ "fallbacks": [
22665
+ "var(--ui-overlay-surface, var(--ui-surface-elevated))"
22666
+ ]
22667
+ },
22668
+ {
22669
+ "name": "--ui-material-edge",
22670
+ "fallbacks": [
22671
+ "var(--ui-border-strong)"
22672
+ ]
22673
+ },
22674
+ {
22675
+ "name": "--ui-material-glass",
22676
+ "fallbacks": [
22677
+ "var(--ui-surface-elevated)"
22678
+ ]
22679
+ },
21677
22680
  {
21678
22681
  "name": "--ui-motion-ease"
21679
22682
  },
@@ -21695,7 +22698,8 @@
21695
22698
  {
21696
22699
  "name": "--ui-overlay-shadow",
21697
22700
  "fallbacks": [
21698
- "var(--ui-elevation-tooltip, var(--ui-shadow-md))"
22701
+ "var(--ui-elevation-tooltip, var(--ui-shadow-md))",
22702
+ "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
22703
  ]
21700
22704
  },
21701
22705
  {
@@ -21722,6 +22726,12 @@
21722
22726
  {
21723
22727
  "name": "--ui-surface-elevated"
21724
22728
  },
22729
+ {
22730
+ "name": "--ui-surface-separation",
22731
+ "fallbacks": [
22732
+ "0"
22733
+ ]
22734
+ },
21725
22735
  {
21726
22736
  "name": "--ui-text-primary"
21727
22737
  }