@threadlabs/looma 0.34.0 → 0.35.1

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 (102) hide show
  1. package/components/ui-badge/ui-badge.html +11 -3
  2. package/components/ui-button/ui-button.html +29 -4
  3. package/components/ui-card/ui-card.html +15 -13
  4. package/components/ui-checkbox/ui-checkbox.html +4 -2
  5. package/components/ui-dialog/ui-dialog.html +2 -0
  6. package/components/ui-icon-button/ui-icon-button.html +22 -8
  7. package/components/ui-input/ui-input.html +2 -1
  8. package/components/ui-input-group/ui-input-group.html +4 -1
  9. package/components/ui-light-editor/ui-light-editor.html +45 -0
  10. package/components/ui-light-editor/ui-light-editor.js +53 -0
  11. package/components/ui-menu/ui-menu.html +2 -0
  12. package/components/ui-number-input/ui-number-input.html +2 -1
  13. package/components/ui-number-input/ui-number-input.js +6 -3
  14. package/components/ui-popover/ui-popover.html +2 -0
  15. package/components/ui-reel/ui-reel.html +2 -1
  16. package/components/ui-select/ui-select.html +9 -7
  17. package/components/ui-switch/ui-switch.html +3 -0
  18. package/components/ui-tabs/ui-tabs.html +2 -3
  19. package/components/ui-tabs/ui-tabs.js +0 -9
  20. package/components/ui-textarea/ui-textarea.html +2 -1
  21. package/components/ui-tooltip/ui-tooltip.html +2 -1
  22. package/dist/index.js +24 -23
  23. package/docs/README.md +29 -3
  24. package/docs/card.html +7 -6
  25. package/docs/catalog-view.mjs +2 -1
  26. package/docs/catalog.json +575 -53
  27. package/docs/customizer-render.mjs +31 -16
  28. package/docs/customizer.js +72 -19
  29. package/docs/index.d.ts +4 -1
  30. package/docs/index.mjs +1 -1
  31. package/docs/render.mjs +1 -1
  32. package/docs/site.mjs +33 -22
  33. package/docs/theme-session.mjs +4 -2
  34. package/docs/theme.mjs +61 -7
  35. package/package.json +2 -2
  36. package/styles/ui-badge.css +11 -6
  37. package/styles/ui-button.css +29 -4
  38. package/styles/ui-card.css +9 -9
  39. package/styles/ui-checkbox.css +4 -2
  40. package/styles/ui-dialog.css +4 -0
  41. package/styles/ui-icon-button.css +22 -8
  42. package/styles/ui-input-group.css +4 -1
  43. package/styles/ui-input.css +2 -1
  44. package/styles/ui-light-editor.css +28 -0
  45. package/styles/ui-menu.css +2 -0
  46. package/styles/ui-popover.css +2 -0
  47. package/styles/ui-select.css +9 -7
  48. package/styles/ui-switch.css +3 -0
  49. package/styles/ui-tabs.css +2 -3
  50. package/styles/ui-textarea.css +2 -1
  51. package/styles/ui-tooltip.css +2 -1
  52. package/theme-light.css +1 -0
  53. package/theme-system.css +43 -7
  54. package/tokens.css +5 -1
  55. package/vanilla/UiCard.d.ts +2 -1
  56. package/vanilla/UiCard.js +12 -12
  57. package/vanilla/UiLightEditor.d.ts +29 -0
  58. package/vanilla/UiLightEditor.js +102 -0
  59. package/vanilla/UiNumberInput.js +27 -20
  60. package/vanilla/index.js +1 -0
  61. package/vue/UiBadge.vue +29 -4
  62. package/vue/UiButton.vue +33 -4
  63. package/vue/UiCard.d.ts +8 -2
  64. package/vue/UiCard.vue +41 -17
  65. package/vue/UiCheckbox.vue +4 -2
  66. package/vue/UiDialog.vue +4 -0
  67. package/vue/UiIconButton.vue +26 -11
  68. package/vue/UiInput.vue +2 -1
  69. package/vue/UiInputGroup.vue +4 -1
  70. package/vue/UiLightEditor.d.ts +75 -0
  71. package/vue/UiLightEditor.js +2 -0
  72. package/vue/UiLightEditor.vue +402 -0
  73. package/vue/UiMenu.vue +2 -0
  74. package/vue/UiNumberInput.vue +32 -3
  75. package/vue/UiPopover.vue +2 -0
  76. package/vue/UiReel.vue +1 -1
  77. package/vue/UiSelect.vue +16 -10
  78. package/vue/UiSwitch.vue +3 -0
  79. package/vue/UiTabs.vue +2 -3
  80. package/vue/UiTextarea.vue +2 -1
  81. package/vue/UiTooltip.vue +2 -1
  82. package/vue/chunks/UiBadge.js +1 -1
  83. package/vue/chunks/UiButton.js +1 -1
  84. package/vue/chunks/UiCard.js +33 -5
  85. package/vue/chunks/UiCheckbox.js +1 -1
  86. package/vue/chunks/UiDialog.js +1 -1
  87. package/vue/chunks/UiIconButton.js +1 -1
  88. package/vue/chunks/UiInput.js +1 -1
  89. package/vue/chunks/UiInputGroup.js +1 -1
  90. package/vue/chunks/UiLightEditor.js +347 -0
  91. package/vue/chunks/UiMenu.js +1 -1
  92. package/vue/chunks/UiNumberInput.js +21 -8
  93. package/vue/chunks/UiPopover.js +1 -1
  94. package/vue/chunks/UiReel.js +2 -2
  95. package/vue/chunks/UiSelect.js +1 -1
  96. package/vue/chunks/UiSwitch.js +1 -1
  97. package/vue/chunks/UiTabs.js +1 -1
  98. package/vue/chunks/UiTextarea.js +1 -1
  99. package/vue/chunks/UiTooltip.js +1 -1
  100. package/vue/components.css +312 -71
  101. package/vue/index.d.ts +1 -0
  102. package/vue/index.js +2 -1
package/docs/catalog.json CHANGED
@@ -245,6 +245,11 @@
245
245
  "package": "@threadlabs/looma",
246
246
  "resource": "@threadlabs/looma/components/ui-input-group/ui-input-group.html"
247
247
  },
248
+ {
249
+ "tag": "ui-light-editor",
250
+ "package": "@threadlabs/looma",
251
+ "resource": "@threadlabs/looma/components/ui-light-editor/ui-light-editor.html"
252
+ },
248
253
  {
249
254
  "tag": "ui-list",
250
255
  "package": "@threadlabs/looma",
@@ -438,7 +443,7 @@
438
443
  ],
439
444
  "schemaVersion": 1,
440
445
  "package": "@threadlabs/looma",
441
- "version": "0.34.0",
446
+ "version": "0.35.1",
442
447
  "groups": [
443
448
  {
444
449
  "id": "layout",
@@ -1155,6 +1160,12 @@
1155
1160
  "var(--ui-success-solid)",
1156
1161
  "var(--ui-warning-solid)",
1157
1162
  "var(--ui-info-solid)",
1163
+ "var(--ui-badge-surface, var(--_badge-color-surface, var(--_badge-surface)))",
1164
+ "var(--ui-badge-surface, var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent)))",
1165
+ "var(--ui-badge-surface, var(--_badge-color-surface, var(--_badge-count-surface)))",
1166
+ "var(--ui-badge-surface, color-mix(in srgb, currentColor 6%, transparent))",
1167
+ "var(--ui-badge-surface, var(--_badge-color-surface, color-mix(in srgb, var(--ui-surface-raised) 88%, transparent)))",
1168
+ "var(--ui-badge-surface, var(--_badge-color-surface, light-dark( color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%), transparent), color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%), transparent) )))",
1158
1169
  "var(--ui-text-secondary)",
1159
1170
  "var(--ui-accent-on-strong, var(--ui-text-on-accent))",
1160
1171
  "var(--ui-danger-on-strong, var(--ui-text-on-accent))",
@@ -1195,7 +1206,9 @@
1195
1206
  "light-dark( color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 66%), transparent), color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 56%), transparent) )"
1196
1207
  ],
1197
1208
  "fallbacks": [
1198
- "color-mix(in srgb, var(--_badge-text) 88%, transparent)"
1209
+ "color-mix(in srgb, var(--_badge-text) 88%, transparent)",
1210
+ "color-mix(in srgb, var(--ui-surface-raised) 88%, transparent)",
1211
+ "light-dark(\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%), transparent),\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%), transparent)\n )"
1199
1212
  ]
1200
1213
  },
1201
1214
  {
@@ -1215,23 +1228,12 @@
1215
1228
  "var(--ui-danger-subtle-text, var(--ui-danger-solid))",
1216
1229
  "var(--ui-success-subtle-text, var(--ui-success-solid))",
1217
1230
  "var(--ui-warning-subtle-text, var(--ui-warning-solid))",
1218
- "var(--ui-info-subtle-text, var(--ui-info-solid))",
1219
- "color-mix(in srgb, var(--ui-surface-subtle) 80%, var(--ui-surface-default))",
1220
- "var(--ui-accent-strong-surface, var(--ui-accent-solid))",
1221
- "var(--ui-danger-strong-surface, var(--ui-danger-solid))",
1222
- "var(--ui-success-strong-surface, var(--ui-success-solid))",
1223
- "var(--ui-warning-strong-surface, var(--ui-warning-solid))",
1224
- "var(--ui-info-strong-surface, var(--ui-info-solid))",
1225
- "color-mix(in srgb, var(--ui-accent-solid) 19%, var(--ui-surface-default))",
1226
- "color-mix(in srgb, var(--ui-danger-solid) 19%, var(--ui-surface-default))",
1227
- "color-mix(in srgb, var(--ui-success-solid) 19%, var(--ui-surface-default))",
1228
- "color-mix(in srgb, var(--ui-warning-solid) 19%, var(--ui-surface-default))",
1229
- "color-mix(in srgb, var(--ui-info-solid) 19%, var(--ui-surface-default))",
1230
- "var(--ui-surface-default)"
1231
+ "var(--ui-info-subtle-text, var(--ui-info-solid))"
1231
1232
  ],
1232
1233
  "fallbacks": [
1233
1234
  "color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary))",
1234
- "light-dark(color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)), var(--ui-text-primary))"
1235
+ "light-dark(color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)), var(--ui-text-primary))",
1236
+ "var(--ui-text-primary)"
1235
1237
  ]
1236
1238
  },
1237
1239
  {
@@ -1241,6 +1243,7 @@
1241
1243
  "var(--_badge-color-border, color-mix(in srgb, var(--_badge-text) 88%, transparent))",
1242
1244
  "var(--_badge-color-border, light-dark(color-mix(in srgb, var(--_badge-text) 88%, transparent), color-mix(in srgb, var(--_badge-text) 44%, transparent)))",
1243
1245
  "color-mix(in srgb, currentColor 20%, transparent)",
1246
+ "var(--_badge-color-border, var(--_badge-outline-surface))",
1244
1247
  "var(--_badge-color-border, var(--_badge-text))"
1245
1248
  ]
1246
1249
  },
@@ -1330,7 +1333,9 @@
1330
1333
  "var(--_badge-color-surface, var(--_badge-surface))",
1331
1334
  "var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent))",
1332
1335
  "var(--_badge-color-surface, var(--_badge-count-surface))",
1333
- "color-mix(in srgb, currentColor 6%, transparent)"
1336
+ "color-mix(in srgb, currentColor 6%, transparent)",
1337
+ "var(--_badge-color-surface, color-mix(in srgb, var(--ui-surface-raised) 88%, transparent))",
1338
+ "var(--_badge-color-surface, light-dark(\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 66%), transparent),\n color-mix(in srgb, var(--ui-surface-raised) var(--ui-badge-circle-opacity, 56%), transparent)\n ))"
1334
1339
  ]
1335
1340
  },
1336
1341
  {
@@ -1340,7 +1345,7 @@
1340
1345
  "var(--_badge-color-text, color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary)))",
1341
1346
  "var(--_badge-color-text, light-dark(color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)), var(--ui-text-primary)))",
1342
1347
  "inherit",
1343
- "var(--_badge-color-text, var(--_badge-surface))"
1348
+ "var(--_badge-color-text, var(--ui-text-primary))"
1344
1349
  ]
1345
1350
  }
1346
1351
  ],
@@ -1474,6 +1479,9 @@
1474
1479
  {
1475
1480
  "name": "--ui-surface-default"
1476
1481
  },
1482
+ {
1483
+ "name": "--ui-surface-raised"
1484
+ },
1477
1485
  {
1478
1486
  "name": "--ui-surface-subtle"
1479
1487
  },
@@ -1932,7 +1940,8 @@
1932
1940
  {
1933
1941
  "name": "--ui-button-active-surface",
1934
1942
  "fallbacks": [
1935
- "oklch(from var(--_tone) l c h / 18%)"
1943
+ "oklch(from var(--_tone) l c h / 18%)",
1944
+ "var(--ui-neutral-active)"
1936
1945
  ]
1937
1946
  },
1938
1947
  {
@@ -1942,6 +1951,7 @@
1942
1951
  ],
1943
1952
  "fallbacks": [
1944
1953
  "var(--ui-border)",
1954
+ "var(--ui-control-border)",
1945
1955
  "var(--ui-control-border, var(--ui-border-strong))"
1946
1956
  ]
1947
1957
  },
@@ -1989,6 +1999,7 @@
1989
1999
  "name": "--ui-button-hover-surface",
1990
2000
  "fallbacks": [
1991
2001
  "oklch(from var(--_tone) l c h / 12%)",
2002
+ "var(--ui-neutral-hover)",
1992
2003
  "var(--ui-control-surface, var(--ui-surface-elevated))"
1993
2004
  ]
1994
2005
  },
@@ -2038,6 +2049,7 @@
2038
2049
  "name": "--ui-button-surface",
2039
2050
  "fallbacks": [
2040
2051
  "oklch(from var(--_tone) l c h / 5%)",
2052
+ "var(--ui-neutral-surface)",
2041
2053
  "var(--ui-control-surface, var(--ui-surface-elevated))"
2042
2054
  ]
2043
2055
  },
@@ -2047,6 +2059,7 @@
2047
2059
  "var(--_hue-text)"
2048
2060
  ],
2049
2061
  "fallbacks": [
2062
+ "var(--ui-text)",
2050
2063
  "var(--ui-text-primary)"
2051
2064
  ]
2052
2065
  },
@@ -2064,6 +2077,18 @@
2064
2077
  {
2065
2078
  "name": "--ui-accent-active"
2066
2079
  },
2080
+ {
2081
+ "name": "--ui-accent-glow",
2082
+ "fallbacks": [
2083
+ "0 0 transparent"
2084
+ ]
2085
+ },
2086
+ {
2087
+ "name": "--ui-accent-highlight",
2088
+ "fallbacks": [
2089
+ "none"
2090
+ ]
2091
+ },
2067
2092
  {
2068
2093
  "name": "--ui-accent-hover"
2069
2094
  },
@@ -2175,6 +2200,18 @@
2175
2200
  "var(--ui-danger-hover)"
2176
2201
  ]
2177
2202
  },
2203
+ {
2204
+ "name": "--ui-danger-glow",
2205
+ "fallbacks": [
2206
+ "0 0 transparent"
2207
+ ]
2208
+ },
2209
+ {
2210
+ "name": "--ui-danger-highlight",
2211
+ "fallbacks": [
2212
+ "none"
2213
+ ]
2214
+ },
2178
2215
  {
2179
2216
  "name": "--ui-danger-hover"
2180
2217
  },
@@ -2229,6 +2266,18 @@
2229
2266
  {
2230
2267
  "name": "--ui-info-active"
2231
2268
  },
2269
+ {
2270
+ "name": "--ui-info-glow",
2271
+ "fallbacks": [
2272
+ "0 0 transparent"
2273
+ ]
2274
+ },
2275
+ {
2276
+ "name": "--ui-info-highlight",
2277
+ "fallbacks": [
2278
+ "none"
2279
+ ]
2280
+ },
2232
2281
  {
2233
2282
  "name": "--ui-info-hover"
2234
2283
  },
@@ -2256,6 +2305,27 @@
2256
2305
  "var(--ui-motion-fast)"
2257
2306
  ]
2258
2307
  },
2308
+ {
2309
+ "name": "--ui-neutral-active"
2310
+ },
2311
+ {
2312
+ "name": "--ui-neutral-glow",
2313
+ "fallbacks": [
2314
+ "0 0 transparent"
2315
+ ]
2316
+ },
2317
+ {
2318
+ "name": "--ui-neutral-highlight",
2319
+ "fallbacks": [
2320
+ "none"
2321
+ ]
2322
+ },
2323
+ {
2324
+ "name": "--ui-neutral-hover"
2325
+ },
2326
+ {
2327
+ "name": "--ui-neutral-surface"
2328
+ },
2259
2329
  {
2260
2330
  "name": "--ui-on-accent"
2261
2331
  },
@@ -2304,6 +2374,18 @@
2304
2374
  {
2305
2375
  "name": "--ui-success-active"
2306
2376
  },
2377
+ {
2378
+ "name": "--ui-success-glow",
2379
+ "fallbacks": [
2380
+ "0 0 transparent"
2381
+ ]
2382
+ },
2383
+ {
2384
+ "name": "--ui-success-highlight",
2385
+ "fallbacks": [
2386
+ "none"
2387
+ ]
2388
+ },
2307
2389
  {
2308
2390
  "name": "--ui-success-hover"
2309
2391
  },
@@ -2319,6 +2401,12 @@
2319
2401
  {
2320
2402
  "name": "--ui-surface-elevated"
2321
2403
  },
2404
+ {
2405
+ "name": "--ui-surface-highlight",
2406
+ "fallbacks": [
2407
+ "none"
2408
+ ]
2409
+ },
2322
2410
  {
2323
2411
  "name": "--ui-text"
2324
2412
  },
@@ -2334,6 +2422,18 @@
2334
2422
  {
2335
2423
  "name": "--ui-warning-active"
2336
2424
  },
2425
+ {
2426
+ "name": "--ui-warning-glow",
2427
+ "fallbacks": [
2428
+ "0 0 transparent"
2429
+ ]
2430
+ },
2431
+ {
2432
+ "name": "--ui-warning-highlight",
2433
+ "fallbacks": [
2434
+ "none"
2435
+ ]
2436
+ },
2337
2437
  {
2338
2438
  "name": "--ui-warning-hover"
2339
2439
  },
@@ -3064,7 +3164,7 @@
3064
3164
  "tag": "ui-card",
3065
3165
  "package": "@threadlabs/looma",
3066
3166
  "root": "div",
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.",
3167
+ "description": "A surface that groups content with shared spacing and corners. Choose outlined, subtle or elevated; standard or expressive treatment independently follows the theme's material. Tones change colour without changing geometry.",
3068
3168
  "designTokens": {
3069
3169
  "sources": [
3070
3170
  "packages/looma/src/components/ui-card/ui-card.html"
@@ -3074,9 +3174,6 @@
3074
3174
  {
3075
3175
  "name": "--ui-accent"
3076
3176
  },
3077
- {
3078
- "name": "--ui-accent-line-width"
3079
- },
3080
3177
  {
3081
3178
  "name": "--ui-border-default"
3082
3179
  },
@@ -3116,6 +3213,12 @@
3116
3213
  "var(--ui-surface-raised)"
3117
3214
  ]
3118
3215
  },
3216
+ {
3217
+ "name": "--ui-material-glow",
3218
+ "fallbacks": [
3219
+ "0 0 transparent"
3220
+ ]
3221
+ },
3119
3222
  {
3120
3223
  "name": "--ui-radius-lg"
3121
3224
  },
@@ -3146,6 +3249,12 @@
3146
3249
  {
3147
3250
  "name": "--ui-surface-default"
3148
3251
  },
3252
+ {
3253
+ "name": "--ui-surface-highlight",
3254
+ "fallbacks": [
3255
+ "linear-gradient(transparent, transparent)"
3256
+ ]
3257
+ },
3149
3258
  {
3150
3259
  "name": "--ui-surface-muted"
3151
3260
  },
@@ -3209,7 +3318,7 @@
3209
3318
  {
3210
3319
  "name": "tone",
3211
3320
  "property": "tone",
3212
- "description": "accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Row highlights follow the surface hue; action controls retain their own intent.",
3321
+ "description": "accent, info, success, warning and danger add a quiet semantic surface without changing card geometry. Row highlights follow the surface hue; action controls retain their own intent.",
3213
3322
  "type": "keyword",
3214
3323
  "default": "neutral",
3215
3324
  "options": [
@@ -3221,17 +3330,27 @@
3221
3330
  "danger"
3222
3331
  ]
3223
3332
  },
3333
+ {
3334
+ "name": "treatment",
3335
+ "property": "treatment",
3336
+ "description": "How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material treatment. This does not add elevation or require glass.",
3337
+ "type": "keyword",
3338
+ "default": "standard",
3339
+ "options": [
3340
+ "standard",
3341
+ "expressive"
3342
+ ]
3343
+ },
3224
3344
  {
3225
3345
  "name": "variant",
3226
3346
  "property": "variant",
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.",
3347
+ "description": "The surface. outlined is a bordered panel on the page; subtle is a quiet filled one with no border, for supporting details set apart from the flow; elevated adds a subtle lift above the page, for a view's one card, such as sign-in. Treatment independently controls decorative material.",
3228
3348
  "type": "keyword",
3229
3349
  "default": "outlined",
3230
3350
  "options": [
3231
3351
  "outlined",
3232
3352
  "subtle",
3233
- "elevated",
3234
- "glass"
3353
+ "elevated"
3235
3354
  ]
3236
3355
  }
3237
3356
  ],
@@ -3274,7 +3393,7 @@
3274
3393
  },
3275
3394
  {
3276
3395
  "name": "tone",
3277
- "description": "accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Row highlights follow the surface hue; action controls retain their own intent.",
3396
+ "description": "accent, info, success, warning and danger add a quiet semantic surface without changing card geometry. Row highlights follow the surface hue; action controls retain their own intent.",
3278
3397
  "type": "\"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"danger\"",
3279
3398
  "default": "neutral",
3280
3399
  "options": [
@@ -3286,16 +3405,25 @@
3286
3405
  "danger"
3287
3406
  ]
3288
3407
  },
3408
+ {
3409
+ "name": "treatment",
3410
+ "description": "How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material treatment. This does not add elevation or require glass.",
3411
+ "type": "\"standard\" | \"expressive\"",
3412
+ "default": "standard",
3413
+ "options": [
3414
+ "standard",
3415
+ "expressive"
3416
+ ]
3417
+ },
3289
3418
  {
3290
3419
  "name": "variant",
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\"",
3420
+ "description": "The surface. outlined is a bordered panel on the page; subtle is a quiet filled one with no border, for supporting details set apart from the flow; elevated adds a subtle lift above the page, for a view's one card, such as sign-in. Treatment independently controls decorative material.",
3421
+ "type": "\"outlined\" | \"subtle\" | \"elevated\"",
3293
3422
  "default": "outlined",
3294
3423
  "options": [
3295
3424
  "outlined",
3296
3425
  "subtle",
3297
- "elevated",
3298
- "glass"
3426
+ "elevated"
3299
3427
  ]
3300
3428
  }
3301
3429
  ],
@@ -3329,7 +3457,7 @@
3329
3457
  "id": "@threadlabs/looma/ui-card/02-danger",
3330
3458
  "name": "02-danger",
3331
3459
  "title": "Danger",
3332
- "description": "tone=\"danger\" tints a consequential section and draws a strong leading edge around its action.",
3460
+ "description": "tone=\"danger\" tints a consequential section while retaining the same corners and border geometry as other cards.",
3333
3461
  "markup": "<ui-card tone=\"danger\">\n <ui-text weight=\"semibold\">Delete this site</ui-text>\n <ui-text tone=\"secondary\" size=\"sm\">Everything in it is deleted for everyone.</ui-text>\n <ui-cluster><ui-button variant=\"solid\" tone=\"danger\">Delete site</ui-button></ui-cluster>\n</ui-card>",
3334
3462
  "resizable": false,
3335
3463
  "bindings": "",
@@ -3346,11 +3474,11 @@
3346
3474
  "frameworks": {}
3347
3475
  },
3348
3476
  {
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>",
3477
+ "id": "@threadlabs/looma/ui-card/04-expressive-surface",
3478
+ "name": "04-expressive-surface",
3479
+ "title": "Expressive surface",
3480
+ "description": "Expressive treatment uses the theme's material independently of elevation. Bookish catches light through a frosted rim; a matte theme stays opaque. Ordinary elevated cards retain their subtle lift.",
3481
+ "markup": "<ui-card variant=\"elevated\" treatment=\"expressive\">\n <ui-text variant=\"eyebrow\" tone=\"secondary\">Fellowship office</ui-text>\n <ui-text variant=\"heading\" as=\"h2\">Second breakfast briefing</ui-text>\n <ui-text>Sam has prepared the agenda. Frodo is bringing the maps, and Sméagol has volunteered to take minutes.</ui-text>\n <ui-cluster><ui-button preset=\"primary\">Join briefing</ui-button><ui-button preset=\"quiet\">Read agenda</ui-button></ui-cluster>\n</ui-card>",
3354
3482
  "resizable": false,
3355
3483
  "bindings": "",
3356
3484
  "frameworks": {}
@@ -3388,6 +3516,12 @@
3388
3516
  }
3389
3517
  ],
3390
3518
  "shared": [
3519
+ {
3520
+ "name": "--ui-accent-highlight",
3521
+ "fallbacks": [
3522
+ "none"
3523
+ ]
3524
+ },
3391
3525
  {
3392
3526
  "name": "--ui-accent-solid"
3393
3527
  },
@@ -3493,6 +3627,12 @@
3493
3627
  {
3494
3628
  "name": "--ui-surface-default"
3495
3629
  },
3630
+ {
3631
+ "name": "--ui-surface-highlight",
3632
+ "fallbacks": [
3633
+ "none"
3634
+ ]
3635
+ },
3496
3636
  {
3497
3637
  "name": "--ui-text-on-accent"
3498
3638
  },
@@ -7003,7 +7143,7 @@
7003
7143
  "name": "--ui-dialog-shadow",
7004
7144
  "fallbacks": [
7005
7145
  "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 )"
7146
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-dialog, var(--ui-shadow-xl))\n )"
7007
7147
  ]
7008
7148
  },
7009
7149
  {
@@ -7078,6 +7218,12 @@
7078
7218
  "var(--ui-surface-elevated)"
7079
7219
  ]
7080
7220
  },
7221
+ {
7222
+ "name": "--ui-material-glow",
7223
+ "fallbacks": [
7224
+ "0 0 transparent"
7225
+ ]
7226
+ },
7081
7227
  {
7082
7228
  "name": "--ui-motion-base"
7083
7229
  },
@@ -7106,7 +7252,7 @@
7106
7252
  "name": "--ui-overlay-shadow",
7107
7253
  "fallbacks": [
7108
7254
  "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))"
7255
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-dialog, var(--ui-shadow-xl))"
7110
7256
  ]
7111
7257
  },
7112
7258
  {
@@ -7142,6 +7288,12 @@
7142
7288
  {
7143
7289
  "name": "--ui-surface-elevated"
7144
7290
  },
7291
+ {
7292
+ "name": "--ui-surface-highlight",
7293
+ "fallbacks": [
7294
+ "linear-gradient(transparent, transparent)"
7295
+ ]
7296
+ },
7145
7297
  {
7146
7298
  "name": "--ui-surface-muted"
7147
7299
  },
@@ -12299,6 +12451,18 @@
12299
12451
  }
12300
12452
  ],
12301
12453
  "shared": [
12454
+ {
12455
+ "name": "--ui-accent-glow",
12456
+ "fallbacks": [
12457
+ "0 0 transparent"
12458
+ ]
12459
+ },
12460
+ {
12461
+ "name": "--ui-accent-highlight",
12462
+ "fallbacks": [
12463
+ "none"
12464
+ ]
12465
+ },
12302
12466
  {
12303
12467
  "name": "--ui-accent-hover"
12304
12468
  },
@@ -12380,6 +12544,18 @@
12380
12544
  {
12381
12545
  "name": "--ui-danger"
12382
12546
  },
12547
+ {
12548
+ "name": "--ui-danger-glow",
12549
+ "fallbacks": [
12550
+ "0 0 transparent"
12551
+ ]
12552
+ },
12553
+ {
12554
+ "name": "--ui-danger-highlight",
12555
+ "fallbacks": [
12556
+ "none"
12557
+ ]
12558
+ },
12383
12559
  {
12384
12560
  "name": "--ui-danger-hover"
12385
12561
  },
@@ -12419,6 +12595,18 @@
12419
12595
  {
12420
12596
  "name": "--ui-info"
12421
12597
  },
12598
+ {
12599
+ "name": "--ui-info-glow",
12600
+ "fallbacks": [
12601
+ "0 0 transparent"
12602
+ ]
12603
+ },
12604
+ {
12605
+ "name": "--ui-info-highlight",
12606
+ "fallbacks": [
12607
+ "none"
12608
+ ]
12609
+ },
12422
12610
  {
12423
12611
  "name": "--ui-info-hover"
12424
12612
  },
@@ -12443,6 +12631,24 @@
12443
12631
  "var(--ui-motion-fast)"
12444
12632
  ]
12445
12633
  },
12634
+ {
12635
+ "name": "--ui-neutral-glow",
12636
+ "fallbacks": [
12637
+ "0 0 transparent"
12638
+ ]
12639
+ },
12640
+ {
12641
+ "name": "--ui-neutral-highlight",
12642
+ "fallbacks": [
12643
+ "none"
12644
+ ]
12645
+ },
12646
+ {
12647
+ "name": "--ui-neutral-hover"
12648
+ },
12649
+ {
12650
+ "name": "--ui-neutral-surface"
12651
+ },
12446
12652
  {
12447
12653
  "name": "--ui-press-scale",
12448
12654
  "fallbacks": [
@@ -12461,6 +12667,18 @@
12461
12667
  {
12462
12668
  "name": "--ui-success"
12463
12669
  },
12670
+ {
12671
+ "name": "--ui-success-glow",
12672
+ "fallbacks": [
12673
+ "0 0 transparent"
12674
+ ]
12675
+ },
12676
+ {
12677
+ "name": "--ui-success-highlight",
12678
+ "fallbacks": [
12679
+ "none"
12680
+ ]
12681
+ },
12464
12682
  {
12465
12683
  "name": "--ui-success-hover"
12466
12684
  },
@@ -12473,6 +12691,15 @@
12473
12691
  {
12474
12692
  "name": "--ui-surface-default"
12475
12693
  },
12694
+ {
12695
+ "name": "--ui-surface-highlight",
12696
+ "fallbacks": [
12697
+ "none"
12698
+ ]
12699
+ },
12700
+ {
12701
+ "name": "--ui-text"
12702
+ },
12476
12703
  {
12477
12704
  "name": "--ui-text-on-accent"
12478
12705
  },
@@ -12485,6 +12712,18 @@
12485
12712
  {
12486
12713
  "name": "--ui-warning"
12487
12714
  },
12715
+ {
12716
+ "name": "--ui-warning-glow",
12717
+ "fallbacks": [
12718
+ "0 0 transparent"
12719
+ ]
12720
+ },
12721
+ {
12722
+ "name": "--ui-warning-highlight",
12723
+ "fallbacks": [
12724
+ "none"
12725
+ ]
12726
+ },
12488
12727
  {
12489
12728
  "name": "--ui-warning-hover"
12490
12729
  },
@@ -13284,6 +13523,12 @@
13284
13523
  {
13285
13524
  "name": "--ui-surface-elevated"
13286
13525
  },
13526
+ {
13527
+ "name": "--ui-surface-highlight",
13528
+ "fallbacks": [
13529
+ "none"
13530
+ ]
13531
+ },
13287
13532
  {
13288
13533
  "name": "--ui-surface-muted"
13289
13534
  },
@@ -13633,6 +13878,12 @@
13633
13878
  {
13634
13879
  "name": "--ui-surface-elevated"
13635
13880
  },
13881
+ {
13882
+ "name": "--ui-surface-highlight",
13883
+ "fallbacks": [
13884
+ "none"
13885
+ ]
13886
+ },
13636
13887
  {
13637
13888
  "name": "--ui-surface-muted"
13638
13889
  },
@@ -13817,6 +14068,229 @@
13817
14068
  }
13818
14069
  ]
13819
14070
  },
14071
+ {
14072
+ "tag": "ui-light-editor",
14073
+ "package": "@threadlabs/looma",
14074
+ "root": "span",
14075
+ "description": "Position a shared light source with a draggable, keyboard-operable handle and exact bounded coordinates. The position is relative to each illuminated surface.",
14076
+ "designTokens": {
14077
+ "sources": [
14078
+ "packages/looma/src/components/ui-light-editor/ui-light-editor.html"
14079
+ ],
14080
+ "component": [],
14081
+ "shared": [
14082
+ {
14083
+ "name": "--ui-accent"
14084
+ },
14085
+ {
14086
+ "name": "--ui-border"
14087
+ },
14088
+ {
14089
+ "name": "--ui-border-width"
14090
+ },
14091
+ {
14092
+ "name": "--ui-control-border"
14093
+ },
14094
+ {
14095
+ "name": "--ui-control-min-block-size"
14096
+ },
14097
+ {
14098
+ "name": "--ui-disabled-border"
14099
+ },
14100
+ {
14101
+ "name": "--ui-disabled-surface"
14102
+ },
14103
+ {
14104
+ "name": "--ui-field-radius",
14105
+ "fallbacks": [
14106
+ "var(--ui-radius-md)"
14107
+ ]
14108
+ },
14109
+ {
14110
+ "name": "--ui-focus-ring"
14111
+ },
14112
+ {
14113
+ "name": "--ui-focus-width"
14114
+ },
14115
+ {
14116
+ "name": "--ui-font-size-sm"
14117
+ },
14118
+ {
14119
+ "name": "--ui-neutral-surface",
14120
+ "fallbacks": [
14121
+ "var(--ui-surface)"
14122
+ ]
14123
+ },
14124
+ {
14125
+ "name": "--ui-radius-md"
14126
+ },
14127
+ {
14128
+ "name": "--ui-shadow-sm"
14129
+ },
14130
+ {
14131
+ "name": "--ui-space-1"
14132
+ },
14133
+ {
14134
+ "name": "--ui-space-2"
14135
+ },
14136
+ {
14137
+ "name": "--ui-space-3"
14138
+ },
14139
+ {
14140
+ "name": "--ui-surface"
14141
+ },
14142
+ {
14143
+ "name": "--ui-surface-raised"
14144
+ },
14145
+ {
14146
+ "name": "--ui-text-secondary"
14147
+ }
14148
+ ]
14149
+ },
14150
+ "attributes": [
14151
+ {
14152
+ "name": "disabled",
14153
+ "property": "disabled",
14154
+ "description": "Prevents pointer, keyboard and exact edits.",
14155
+ "type": "boolean",
14156
+ "default": false
14157
+ },
14158
+ {
14159
+ "name": "label",
14160
+ "property": "label",
14161
+ "description": "Accessible name for the position editor.",
14162
+ "type": "string",
14163
+ "default": "Light position"
14164
+ },
14165
+ {
14166
+ "name": "size",
14167
+ "property": "size",
14168
+ "description": "Sets both coordinate fields to the shared small, medium or large control height.",
14169
+ "type": "keyword",
14170
+ "default": "md",
14171
+ "options": [
14172
+ "sm",
14173
+ "md",
14174
+ "lg"
14175
+ ]
14176
+ },
14177
+ {
14178
+ "name": "x",
14179
+ "property": "x",
14180
+ "description": "Horizontal source position from 0 (left) to 1 (right), relative to every surface.",
14181
+ "type": "number",
14182
+ "default": 0.5
14183
+ },
14184
+ {
14185
+ "name": "y",
14186
+ "property": "y",
14187
+ "description": "Vertical source position from 0 (top) to 1 (bottom), relative to every surface.",
14188
+ "type": "number",
14189
+ "default": 0
14190
+ }
14191
+ ],
14192
+ "properties": [
14193
+ {
14194
+ "name": "disabled",
14195
+ "description": "Prevents pointer, keyboard and exact edits.",
14196
+ "type": "boolean",
14197
+ "default": false
14198
+ },
14199
+ {
14200
+ "name": "label",
14201
+ "description": "Accessible name for the position editor.",
14202
+ "type": "string",
14203
+ "default": "Light position"
14204
+ },
14205
+ {
14206
+ "name": "size",
14207
+ "description": "Sets both coordinate fields to the shared small, medium or large control height.",
14208
+ "type": "\"sm\" | \"md\" | \"lg\"",
14209
+ "default": "md",
14210
+ "options": [
14211
+ "sm",
14212
+ "md",
14213
+ "lg"
14214
+ ]
14215
+ },
14216
+ {
14217
+ "name": "x",
14218
+ "description": "Horizontal source position from 0 (left) to 1 (right), relative to every surface.",
14219
+ "type": "number",
14220
+ "default": 0.5
14221
+ },
14222
+ {
14223
+ "name": "y",
14224
+ "description": "Vertical source position from 0 (top) to 1 (bottom), relative to every surface.",
14225
+ "type": "number",
14226
+ "default": 0
14227
+ }
14228
+ ],
14229
+ "events": [
14230
+ {
14231
+ "name": "change",
14232
+ "detailType": "{ readonly x: number; readonly y: number }",
14233
+ "detailSchema": "object",
14234
+ "fields": [
14235
+ {
14236
+ "path": "x",
14237
+ "type": "number",
14238
+ "required": true
14239
+ },
14240
+ {
14241
+ "path": "y",
14242
+ "type": "number",
14243
+ "required": true
14244
+ }
14245
+ ],
14246
+ "detailDocs": "Emitted when a toggleable control changes checked state."
14247
+ },
14248
+ {
14249
+ "name": "input",
14250
+ "detailType": "{ readonly x: number; readonly y: number }",
14251
+ "detailSchema": "object",
14252
+ "fields": [
14253
+ {
14254
+ "path": "x",
14255
+ "type": "number",
14256
+ "required": true
14257
+ },
14258
+ {
14259
+ "path": "y",
14260
+ "type": "number",
14261
+ "required": true
14262
+ }
14263
+ ],
14264
+ "detailDocs": "Emitted with the declared detail payload."
14265
+ }
14266
+ ],
14267
+ "slots": [
14268
+ {
14269
+ "name": "default",
14270
+ "description": "Default child content."
14271
+ }
14272
+ ],
14273
+ "group": "forms",
14274
+ "id": "@threadlabs/looma/ui-light-editor",
14275
+ "title": "Light Editor",
14276
+ "resource": "@threadlabs/looma/components/ui-light-editor/ui-light-editor.html",
14277
+ "targets": [
14278
+ "html-next",
14279
+ "vue"
14280
+ ],
14281
+ "examples": [
14282
+ {
14283
+ "id": "@threadlabs/looma/ui-light-editor/01-position",
14284
+ "name": "01-position",
14285
+ "title": "Light position",
14286
+ "description": "Move the source with a pointer, touch, arrow keys or exact coordinates. The source describes a position relative to every illuminated surface.",
14287
+ "markup": "<ui-light-editor label=\"Fellowship office light\" x=\"0.5\" y=\"0\"></ui-light-editor>",
14288
+ "resizable": false,
14289
+ "bindings": "",
14290
+ "frameworks": {}
14291
+ }
14292
+ ]
14293
+ },
13820
14294
  {
13821
14295
  "tag": "ui-list",
13822
14296
  "package": "@threadlabs/looma",
@@ -14657,7 +15131,7 @@
14657
15131
  "name": "--ui-menu-shadow",
14658
15132
  "fallbacks": [
14659
15133
  "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 )"
15134
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))\n )"
14661
15135
  ]
14662
15136
  },
14663
15137
  {
@@ -14720,6 +15194,12 @@
14720
15194
  "var(--ui-surface-elevated)"
14721
15195
  ]
14722
15196
  },
15197
+ {
15198
+ "name": "--ui-material-glow",
15199
+ "fallbacks": [
15200
+ "0 0 transparent"
15201
+ ]
15202
+ },
14723
15203
  {
14724
15204
  "name": "--ui-motion-ease"
14725
15205
  },
@@ -14742,7 +15222,7 @@
14742
15222
  "name": "--ui-overlay-shadow",
14743
15223
  "fallbacks": [
14744
15224
  "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))"
15225
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))"
14746
15226
  ]
14747
15227
  },
14748
15228
  {
@@ -14772,6 +15252,12 @@
14772
15252
  {
14773
15253
  "name": "--ui-surface-elevated"
14774
15254
  },
15255
+ {
15256
+ "name": "--ui-surface-highlight",
15257
+ "fallbacks": [
15258
+ "linear-gradient(transparent, transparent)"
15259
+ ]
15260
+ },
14775
15261
  {
14776
15262
  "name": "--ui-surface-separation",
14777
15263
  "fallbacks": [
@@ -16515,7 +17001,7 @@
16515
17001
  "name": "--ui-popover-shadow",
16516
17002
  "fallbacks": [
16517
17003
  "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 )"
17004
+ "var(\n --ui-overlay-shadow,\n 0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))\n )"
16519
17005
  ]
16520
17006
  },
16521
17007
  {
@@ -16569,6 +17055,12 @@
16569
17055
  "var(--ui-surface-elevated)"
16570
17056
  ]
16571
17057
  },
17058
+ {
17059
+ "name": "--ui-material-glow",
17060
+ "fallbacks": [
17061
+ "0 0 transparent"
17062
+ ]
17063
+ },
16572
17064
  {
16573
17065
  "name": "--ui-motion-ease"
16574
17066
  },
@@ -16591,7 +17083,7 @@
16591
17083
  "name": "--ui-overlay-shadow",
16592
17084
  "fallbacks": [
16593
17085
  "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))"
17086
+ "0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px) calc(\n var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 24px\n ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),\n var(--ui-material-glow, 0 0 transparent),\n inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(--ui-material-edge, var(--ui-border-strong)),\n var(--ui-elevation-overlay, var(--ui-shadow-lg))"
16595
17087
  ]
16596
17088
  },
16597
17089
  {
@@ -16615,6 +17107,12 @@
16615
17107
  {
16616
17108
  "name": "--ui-surface-elevated"
16617
17109
  },
17110
+ {
17111
+ "name": "--ui-surface-highlight",
17112
+ "fallbacks": [
17113
+ "linear-gradient(transparent, transparent)"
17114
+ ]
17115
+ },
16618
17116
  {
16619
17117
  "name": "--ui-surface-separation",
16620
17118
  "fallbacks": [
@@ -17472,7 +17970,7 @@
17472
17970
  {
17473
17971
  "name": "snap",
17474
17972
  "property": "snap",
17475
- "description": "Snaps scrolling to items: start comes to rest with an item's start edge at the reel's start, and center with an item centred in the reel. Unset, the reel scrolls freely.",
17973
+ "description": "Snaps scrolling to items: start comes to rest with an item's start edge at the reel's start, and center with an item centred in the reel. Unset, the reel scrolls freely. Wrap a component item in a plain element when snapping: the wrapper receives snap alignment while the component keeps ownership of its root styles.",
17476
17974
  "type": "keyword",
17477
17975
  "options": [
17478
17976
  "start",
@@ -17505,7 +18003,7 @@
17505
18003
  },
17506
18004
  {
17507
18005
  "name": "snap",
17508
- "description": "Snaps scrolling to items: start comes to rest with an item's start edge at the reel's start, and center with an item centred in the reel. Unset, the reel scrolls freely.",
18006
+ "description": "Snaps scrolling to items: start comes to rest with an item's start edge at the reel's start, and center with an item centred in the reel. Unset, the reel scrolls freely. Wrap a component item in a plain element when snapping: the wrapper receives snap alignment while the component keeps ownership of its root styles.",
17509
18007
  "type": "\"start\" | \"center\"",
17510
18008
  "options": [
17511
18009
  "start",
@@ -17533,8 +18031,8 @@
17533
18031
  "id": "@threadlabs/looma/ui-reel/01-default",
17534
18032
  "name": "01-default",
17535
18033
  "title": "Default",
17536
- "description": "With no layout properties supplied, Reel uses its base gap, item width, and snap behavior.",
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>",
18034
+ "description": "Scroll through the office desks. Small fixed-width items overflow the preview and scroll freely.",
18035
+ "markup": "<ui-reel item-width=\"sm\" aria-label=\"Fellowship office desks\">\n <div><ui-card padding=\"sm\">Frodo</ui-card></div>\n <div><ui-card padding=\"sm\">Sam</ui-card></div>\n <div><ui-card padding=\"sm\">Sméagol</ui-card></div>\n <div><ui-card padding=\"sm\">Merry</ui-card></div>\n <div><ui-card padding=\"sm\">Pippin</ui-card></div>\n <div><ui-card padding=\"sm\">Gandalf</ui-card></div>\n <div><ui-card padding=\"sm\">Aragorn</ui-card></div>\n <div><ui-card padding=\"sm\">Legolas</ui-card></div>\n</ui-reel>",
17538
18036
  "resizable": false,
17539
18037
  "bindings": "",
17540
18038
  "frameworks": {}
@@ -17543,8 +18041,8 @@
17543
18041
  "id": "@threadlabs/looma/ui-reel/02-gap-item-width-and-snap",
17544
18042
  "name": "02-gap-item-width-and-snap",
17545
18043
  "title": "Gap, item width, and snap",
17546
- "description": "These three properties control spacing, each child's basis, and the scroll snap position.",
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>",
18044
+ "description": "Scroll the office desks sideways: medium-width items snap to the center when you release.",
18045
+ "markup": "<ui-reel gap=\"m\" item-width=\"md\" snap=\"center\" aria-label=\"Fellowship office desks\">\n <div><ui-card padding=\"sm\">Frodo</ui-card></div>\n <div><ui-card padding=\"sm\">Sam</ui-card></div>\n <div><ui-card padding=\"sm\">Sméagol</ui-card></div>\n <div><ui-card padding=\"sm\">Merry</ui-card></div>\n <div><ui-card padding=\"sm\">Pippin</ui-card></div>\n <div><ui-card padding=\"sm\">Gandalf</ui-card></div>\n <div><ui-card padding=\"sm\">Aragorn</ui-card></div>\n <div><ui-card padding=\"sm\">Legolas</ui-card></div>\n</ui-reel>",
17548
18046
  "resizable": false,
17549
18047
  "bindings": "",
17550
18048
  "frameworks": {}
@@ -18691,6 +19189,12 @@
18691
19189
  {
18692
19190
  "name": "--ui-surface-elevated"
18693
19191
  },
19192
+ {
19193
+ "name": "--ui-surface-highlight",
19194
+ "fallbacks": [
19195
+ "linear-gradient(transparent, transparent)"
19196
+ ]
19197
+ },
18694
19198
  {
18695
19199
  "name": "--ui-surface-muted"
18696
19200
  },
@@ -18969,8 +19473,8 @@
18969
19473
  "id": "@threadlabs/looma/ui-separator/01-default-horizontal",
18970
19474
  "name": "01-default-horizontal",
18971
19475
  "title": "Default horizontal",
18972
- "description": "With orientation omitted, Separator renders horizontally.",
18973
- "markup": "<div>\n <span>Above</span>\n <ui-separator> </ui-separator>\n <span>Below</span>\n</div>",
19476
+ "description": "Stack supplies breathing room around a horizontal divider.",
19477
+ "markup": "<ui-stack gap=\"s\">\n <span>Above</span>\n <ui-separator> </ui-separator>\n <span>Below</span>\n</ui-stack>",
18974
19478
  "resizable": false,
18975
19479
  "bindings": "",
18976
19480
  "frameworks": {}
@@ -18980,7 +19484,7 @@
18980
19484
  "name": "02-orientation-vertical",
18981
19485
  "title": "orientation=\"vertical\"",
18982
19486
  "description": "Vertical orientation divides inline content; the parent supplies the row layout and height.",
18983
- "markup": "<div style=\"display: flex; align-items: center; height: 3rem; gap: 1rem\">\n <span>Before</span>\n <ui-separator orientation=\"vertical\"> </ui-separator>\n <span>After</span>\n</div>",
19487
+ "markup": "<ui-cluster gap=\"s\">\n <span>Before</span>\n <ui-separator orientation=\"vertical\"> </ui-separator>\n <span>After</span>\n</ui-cluster>",
18984
19488
  "resizable": false,
18985
19489
  "bindings": "",
18986
19490
  "frameworks": {}
@@ -20199,6 +20703,12 @@
20199
20703
  }
20200
20704
  ],
20201
20705
  "shared": [
20706
+ {
20707
+ "name": "--ui-accent-highlight",
20708
+ "fallbacks": [
20709
+ "none"
20710
+ ]
20711
+ },
20202
20712
  {
20203
20713
  "name": "--ui-accent-solid"
20204
20714
  },
@@ -20289,6 +20799,12 @@
20289
20799
  {
20290
20800
  "name": "--ui-surface-default"
20291
20801
  },
20802
+ {
20803
+ "name": "--ui-surface-highlight",
20804
+ "fallbacks": [
20805
+ "none"
20806
+ ]
20807
+ },
20292
20808
  {
20293
20809
  "name": "--ui-text-on-accent"
20294
20810
  },
@@ -21767,6 +22283,12 @@
21767
22283
  {
21768
22284
  "name": "--ui-surface-elevated"
21769
22285
  },
22286
+ {
22287
+ "name": "--ui-surface-highlight",
22288
+ "fallbacks": [
22289
+ "none"
22290
+ ]
22291
+ },
21770
22292
  {
21771
22293
  "name": "--ui-surface-muted"
21772
22294
  },