@threadlabs/looma 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/components/ui-badge/ui-badge.html +11 -3
  2. package/components/ui-button/ui-button.html +29 -4
  3. package/components/ui-card/ui-card.html +15 -13
  4. package/components/ui-checkbox/ui-checkbox.html +4 -2
  5. package/components/ui-dialog/ui-dialog.html +2 -0
  6. package/components/ui-icon-button/ui-icon-button.html +22 -8
  7. package/components/ui-input/ui-input.html +2 -1
  8. package/components/ui-input-group/ui-input-group.html +4 -1
  9. package/components/ui-light-editor/ui-light-editor.html +45 -0
  10. package/components/ui-light-editor/ui-light-editor.js +53 -0
  11. package/components/ui-menu/ui-menu.html +2 -0
  12. package/components/ui-number-input/ui-number-input.html +2 -1
  13. package/components/ui-number-input/ui-number-input.js +6 -3
  14. package/components/ui-popover/ui-popover.html +2 -0
  15. package/components/ui-select/ui-select.html +9 -7
  16. package/components/ui-switch/ui-switch.html +3 -0
  17. package/components/ui-textarea/ui-textarea.html +2 -1
  18. package/dist/index.js +24 -23
  19. package/docs/README.md +26 -2
  20. package/docs/catalog.json +566 -44
  21. package/docs/customizer-render.mjs +24 -11
  22. package/docs/customizer.js +67 -17
  23. package/docs/index.d.ts +4 -1
  24. package/docs/index.mjs +1 -1
  25. package/docs/render.mjs +1 -1
  26. package/docs/site.mjs +30 -20
  27. package/docs/theme-session.mjs +4 -2
  28. package/docs/theme.mjs +59 -7
  29. package/package.json +2 -2
  30. package/styles/ui-badge.css +11 -6
  31. package/styles/ui-button.css +29 -4
  32. package/styles/ui-card.css +9 -9
  33. package/styles/ui-checkbox.css +4 -2
  34. package/styles/ui-dialog.css +4 -0
  35. package/styles/ui-icon-button.css +22 -8
  36. package/styles/ui-input-group.css +4 -1
  37. package/styles/ui-input.css +2 -1
  38. package/styles/ui-light-editor.css +28 -0
  39. package/styles/ui-menu.css +2 -0
  40. package/styles/ui-popover.css +2 -0
  41. package/styles/ui-select.css +9 -7
  42. package/styles/ui-switch.css +3 -0
  43. package/styles/ui-textarea.css +2 -1
  44. package/theme-light.css +1 -0
  45. package/theme-system.css +43 -7
  46. package/tokens.css +4 -0
  47. package/vanilla/UiCard.d.ts +2 -1
  48. package/vanilla/UiCard.js +12 -12
  49. package/vanilla/UiLightEditor.d.ts +29 -0
  50. package/vanilla/UiLightEditor.js +102 -0
  51. package/vanilla/UiNumberInput.js +27 -20
  52. package/vanilla/index.js +1 -0
  53. package/vue/UiBadge.vue +29 -4
  54. package/vue/UiButton.vue +33 -4
  55. package/vue/UiCard.d.ts +8 -2
  56. package/vue/UiCard.vue +41 -17
  57. package/vue/UiCheckbox.vue +4 -2
  58. package/vue/UiDialog.vue +4 -0
  59. package/vue/UiIconButton.vue +26 -11
  60. package/vue/UiInput.vue +2 -1
  61. package/vue/UiInputGroup.vue +4 -1
  62. package/vue/UiLightEditor.d.ts +75 -0
  63. package/vue/UiLightEditor.js +2 -0
  64. package/vue/UiLightEditor.vue +402 -0
  65. package/vue/UiMenu.vue +2 -0
  66. package/vue/UiNumberInput.vue +32 -3
  67. package/vue/UiPopover.vue +2 -0
  68. package/vue/UiSelect.vue +16 -10
  69. package/vue/UiSwitch.vue +3 -0
  70. package/vue/UiTextarea.vue +2 -1
  71. package/vue/chunks/UiBadge.js +1 -1
  72. package/vue/chunks/UiButton.js +1 -1
  73. package/vue/chunks/UiCard.js +33 -5
  74. package/vue/chunks/UiCheckbox.js +1 -1
  75. package/vue/chunks/UiDialog.js +1 -1
  76. package/vue/chunks/UiIconButton.js +1 -1
  77. package/vue/chunks/UiInput.js +1 -1
  78. package/vue/chunks/UiInputGroup.js +1 -1
  79. package/vue/chunks/UiLightEditor.js +347 -0
  80. package/vue/chunks/UiMenu.js +1 -1
  81. package/vue/chunks/UiNumberInput.js +21 -8
  82. package/vue/chunks/UiPopover.js +1 -1
  83. package/vue/chunks/UiSelect.js +1 -1
  84. package/vue/chunks/UiSwitch.js +1 -1
  85. package/vue/chunks/UiTextarea.js +1 -1
  86. package/vue/components.css +306 -66
  87. package/vue/index.d.ts +1 -0
  88. package/vue/index.js +2 -1
package/vue/UiCard.vue CHANGED
@@ -51,17 +51,26 @@ const propValidityContract = {
51
51
  required: false,
52
52
  target: { attribute: 'tone' },
53
53
  description:
54
- 'accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Row highlights follow the\n surface hue; action controls retain their own intent.',
54
+ 'accent, info, success, warning and danger add a quiet semantic surface without changing card geometry. Row highlights follow the\n surface hue; action controls retain their own intent.',
55
55
  values: ['neutral', 'accent', 'info', 'success', 'warning', 'danger'],
56
56
  default: 'neutral',
57
57
  },
58
+ treatment: {
59
+ type: { kind: 'terminal', name: 'keyword' },
60
+ required: false,
61
+ target: { attribute: 'treatment' },
62
+ description:
63
+ 'How much of the theme\'s decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material treatment.\n This does not add elevation or require glass.',
64
+ values: ['standard', 'expressive'],
65
+ default: 'standard',
66
+ },
58
67
  variant: {
59
68
  type: { kind: 'terminal', name: 'keyword' },
60
69
  required: false,
61
70
  target: { attribute: 'variant' },
62
71
  description:
63
- '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;\n 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;\n shared glassiness and surface separation govern its treatment.',
64
- values: ['outlined', 'subtle', 'elevated', 'glass'],
72
+ '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;\n elevated adds a subtle lift above the page, for a view\'s one card, such as sign-in. Treatment independently controls decorative material.',
73
+ values: ['outlined', 'subtle', 'elevated'],
65
74
  default: 'outlined',
66
75
  },
67
76
  },
@@ -75,9 +84,8 @@ const props = defineProps({
75
84
  'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger' | null
76
85
  >,
77
86
  },
78
- variant: {
79
- type: null as unknown as PropType<'outlined' | 'subtle' | 'elevated' | 'glass' | null>,
80
- },
87
+ treatment: { type: null as unknown as PropType<'standard' | 'expressive' | null> },
88
+ variant: { type: null as unknown as PropType<'outlined' | 'subtle' | 'elevated' | null> },
81
89
  [BINDING_INPUTS_PROP]: { type: null as unknown as PropType<InputBindings> },
82
90
  })
83
91
  const acceptedProps: Record<string, unknown> = {
@@ -85,6 +93,7 @@ const acceptedProps: Record<string, unknown> = {
85
93
  padding: 'md',
86
94
  size: 'content',
87
95
  tone: 'neutral',
96
+ treatment: 'standard',
88
97
  variant: 'outlined',
89
98
  }
90
99
  const inputTracking = vuePropInputs(acceptedProps, {
@@ -92,6 +101,7 @@ const inputTracking = vuePropInputs(acceptedProps, {
92
101
  padding: 'md',
93
102
  size: 'content',
94
103
  tone: 'neutral',
104
+ treatment: 'standard',
95
105
  variant: 'outlined',
96
106
  }, (name, value, source, values) => {
97
107
  switch (name) {
@@ -103,6 +113,8 @@ const inputTracking = vuePropInputs(acceptedProps, {
103
113
  return checkPropInput(value, { kind: 'terminal', name: 'keyword' }, true, true)
104
114
  case 'tone':
105
115
  return checkPropInput(value, { kind: 'terminal', name: 'keyword' }, true, true)
116
+ case 'treatment':
117
+ return checkPropInput(value, { kind: 'terminal', name: 'keyword' }, true, true)
106
118
  case 'variant':
107
119
  return checkPropInput(value, { kind: 'terminal', name: 'keyword' }, true, true)
108
120
  default:
@@ -135,11 +147,16 @@ const checkedProps = computed(() => {
135
147
  props['tone'],
136
148
  props[BINDING_INPUTS_PROP],
137
149
  ) as 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger',
138
- variant: propInputs.value<'outlined' | 'subtle' | 'elevated' | 'glass' | null>(
150
+ treatment: propInputs.value<'standard' | 'expressive' | null>(
151
+ 'treatment',
152
+ props['treatment'],
153
+ props[BINDING_INPUTS_PROP],
154
+ ) as 'standard' | 'expressive',
155
+ variant: propInputs.value<'outlined' | 'subtle' | 'elevated' | null>(
139
156
  'variant',
140
157
  props['variant'],
141
158
  props[BINDING_INPUTS_PROP],
142
- ) as 'outlined' | 'subtle' | 'elevated' | 'glass',
159
+ ) as 'outlined' | 'subtle' | 'elevated',
143
160
  })
144
161
  })
145
162
  const inputStatus = (name: string, handlesError: boolean) => {
@@ -174,6 +191,9 @@ const hostState = computed(() =>
174
191
  checkedProps.value.variant && 'variant',
175
192
  checkedProps.value.variant != null
176
193
  && `variant=${encodeURIComponent(checkedProps.value.variant)}`,
194
+ checkedProps.value.treatment && 'treatment',
195
+ checkedProps.value.treatment != null
196
+ && `treatment=${encodeURIComponent(checkedProps.value.treatment)}`,
177
197
  checkedProps.value.tone && 'tone',
178
198
  checkedProps.value.tone != null && `tone=${encodeURIComponent(checkedProps.value.tone)}`,
179
199
  checkedProps.value.size && 'size',
@@ -194,6 +214,7 @@ const hostState = computed(() =>
194
214
  :data-ui-card-prop-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
195
215
  :data-ui-card-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
196
216
  :data-ui-card-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
217
+ :data-ui-card-prop-treatment="reflectedProp('treatment', 'treatment', checkedProps.treatment, undefined, false)"
197
218
  :data-ui-card-prop-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
198
219
  :data-ui-card-state="hostState || undefined"
199
220
  ref="@html-next/root"
@@ -211,6 +232,7 @@ const hostState = computed(() =>
211
232
  :data-ui-card-prop-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
212
233
  :data-ui-card-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
213
234
  :data-ui-card-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
235
+ :data-ui-card-prop-treatment="reflectedProp('treatment', 'treatment', checkedProps.treatment, undefined, false)"
214
236
  :data-ui-card-prop-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
215
237
  :data-ui-card-state="hostState || undefined"
216
238
  ref="@html-next/root"
@@ -228,6 +250,7 @@ const hostState = computed(() =>
228
250
  :data-ui-card-prop-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
229
251
  :data-ui-card-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
230
252
  :data-ui-card-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
253
+ :data-ui-card-prop-treatment="reflectedProp('treatment', 'treatment', checkedProps.treatment, undefined, false)"
231
254
  :data-ui-card-prop-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
232
255
  :data-ui-card-state="hostState || undefined"
233
256
  ref="@html-next/root"
@@ -245,6 +268,7 @@ const hostState = computed(() =>
245
268
  :data-ui-card-prop-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
246
269
  :data-ui-card-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
247
270
  :data-ui-card-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
271
+ :data-ui-card-prop-treatment="reflectedProp('treatment', 'treatment', checkedProps.treatment, undefined, false)"
248
272
  :data-ui-card-prop-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
249
273
  :data-ui-card-state="hostState || undefined"
250
274
  ref="@html-next/root"
@@ -264,6 +288,7 @@ const hostState = computed(() =>
264
288
  @scope (.ui-card) to ([data-hn]) {
265
289
  :global(:scope:where([data-hn-ui-card])) {
266
290
  --_ui-card-surface: var(--ui-surface-raised);
291
+ --_ui-card-elevation: 0 0 0 transparent;
267
292
  --_ui-selection-context-surface: initial;
268
293
  --_ui-selection-context-border: initial;
269
294
  --_ui-selection-context-text: initial;
@@ -298,11 +323,12 @@ const hostState = computed(() =>
298
323
  }
299
324
 
300
325
  :global(:scope[data-ui-card-state~="variant=elevated"]:where([data-hn-ui-card])) {
326
+ --_ui-card-elevation: var(--ui-shadow-lg);
301
327
  border-color: var(--ui-border-subtle);
302
328
  box-shadow: var(--ui-shadow-lg);
303
329
  }
304
330
 
305
- :global(:scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card])) {
331
+ :global(:scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card])) {
306
332
  --_ui-panel-glass: clamp(0, var(--ui-glassiness, 0), 1);
307
333
  --_ui-panel-separation: clamp(0, var(--ui-surface-separation, 0), 1);
308
334
  --_ui-panel-rim: calc(
@@ -311,6 +337,7 @@ const hostState = computed(() =>
311
337
  border-width: calc(var(--ui-border-width) + var(--_ui-panel-rim));
312
338
  border-color: transparent;
313
339
  background:
340
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
314
341
  linear-gradient(var(--_ui-card-surface), var(--_ui-card-surface)) padding-box,
315
342
  linear-gradient(
316
343
  var(--ui-material-glass, var(--ui-surface-raised)),
@@ -318,7 +345,8 @@ const hostState = computed(() =>
318
345
  ) border-box,
319
346
  var(--_ui-card-surface) padding-box;
320
347
  box-shadow:
321
- var(--ui-shadow-lg),
348
+ var(--_ui-card-elevation),
349
+ var(--ui-material-glow, 0 0 transparent),
322
350
  inset 0 0 0 var(--ui-border-width) var(--ui-material-edge, var(--ui-border-strong));
323
351
  backdrop-filter: blur(calc(var(--_ui-panel-glass) * 0.65 * 18px))
324
352
  saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
@@ -326,12 +354,12 @@ const hostState = computed(() =>
326
354
  saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
327
355
  }
328
356
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
329
- :global(:scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card])) {
357
+ :global(:scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card])) {
330
358
  background: var(--_ui-card-surface);
331
359
  }
332
360
  }
333
361
  @media (prefers-reduced-transparency: reduce) {
334
- :global(:scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card])) {
362
+ :global(:scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card])) {
335
363
  background: var(--_ui-card-surface);
336
364
  border-width: var(--ui-border-width);
337
365
  border-color: var(--ui-border-strong);
@@ -340,7 +368,7 @@ const hostState = computed(() =>
340
368
  }
341
369
  }
342
370
  @media (forced-colors: active) {
343
- :global(:scope[data-ui-card-state~="variant=glass"]:where([data-hn-ui-card])) {
371
+ :global(:scope[data-ui-card-state~="treatment=expressive"]:where([data-hn-ui-card])) {
344
372
  background: Canvas;
345
373
  color: CanvasText;
346
374
  border: var(--ui-border-width) solid CanvasText;
@@ -376,10 +404,6 @@ const hostState = computed(() =>
376
404
 
377
405
  :global(:scope[data-ui-card-state~="tone=danger"]:where([data-hn-ui-card])) {
378
406
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
379
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
380
- /* An accent edge keeps the corners on its side straight. */
381
- border-start-start-radius: 0;
382
- border-end-start-radius: 0;
383
407
  --_ui-card-surface: var(--ui-danger-soft);
384
408
  }
385
409
  :global(:scope[data-ui-card-state~="tone=accent"]:where([data-hn-ui-card])),
@@ -472,7 +472,8 @@ useComponentHost(() => import('../components/ui-checkbox/ui-checkbox.js'), {
472
472
  margin: max(0px, calc((1lh - var(--_ui-checkbox-size, 1.125rem)) / 2)) 0 0 !important;
473
473
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
474
474
  border-radius: min(var(--ui-radius-sm), calc(var(--_ui-checkbox-size, 1.125rem) / 4));
475
- background: var(--ui-control-surface, var(--ui-surface-default));
475
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
476
+ background-image: var(--ui-surface-highlight, none);
476
477
  box-shadow: var(--ui-control-inset);
477
478
  cursor: pointer;
478
479
  transition:
@@ -491,7 +492,8 @@ useComponentHost(() => import('../components/ui-checkbox/ui-checkbox.js'), {
491
492
  :global(input:checked:where([data-hn-ui-checkbox])),
492
493
  :global(input:indeterminate:where([data-hn-ui-checkbox])) {
493
494
  border-color: var(--ui-accent-solid);
494
- background: var(--ui-accent-solid);
495
+ background-color: var(--ui-accent-solid);
496
+ background-image: var(--ui-accent-highlight, none);
495
497
  box-shadow: var(--ui-control-inset);
496
498
  }
497
499
  :global(input:checked:where([data-hn-ui-checkbox])::after) {
package/vue/UiDialog.vue CHANGED
@@ -452,6 +452,7 @@ useComponentHost(() => import('../components/ui-dialog/ui-dialog.js'), {
452
452
  transparent
453
453
  );
454
454
  background:
455
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
455
456
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color))
456
457
  padding-box,
457
458
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
@@ -474,6 +475,7 @@ useComponentHost(() => import('../components/ui-dialog/ui-dialog.js'), {
474
475
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(
475
476
  var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px
476
477
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
478
+ var(--ui-material-glow, 0 0 transparent),
477
479
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(
478
480
  --ui-material-edge,
479
481
  var(--ui-border-strong)
@@ -729,6 +731,7 @@ useComponentHost(() => import('../components/ui-dialog/ui-dialog.js'), {
729
731
  transparent
730
732
  );
731
733
  background:
734
+ var(--ui-surface-highlight, linear-gradient(transparent, transparent)) padding-box,
732
735
  linear-gradient(var(--_ui-material-content-color), var(--_ui-material-content-color))
733
736
  padding-box,
734
737
  linear-gradient(var(--_ui-material-rim-color), var(--_ui-material-rim-color)) border-box,
@@ -751,6 +754,7 @@ useComponentHost(() => import('../components/ui-dialog/ui-dialog.js'), {
751
754
  0 calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px) calc(
752
755
  var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 24px
753
756
  ) color-mix(in oklab, var(--ui-text-primary) 15%, transparent),
757
+ var(--ui-material-glow, 0 0 transparent),
754
758
  inset 0 0 0 calc(var(--_ui-material-active) * var(--ui-border-width)) var(
755
759
  --ui-material-edge,
756
760
  var(--ui-border-strong)
@@ -577,7 +577,9 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
577
577
  :global(:scope:where([data-hn-ui-icon-button])) {
578
578
  /* Optional inherited action-group values keep text and icon actions under the same light.
579
579
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
580
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
580
+ The shared theme supplies reflections and glow independently of the resting lift. */
581
+ --_tone-highlight: var(--ui-accent-highlight, none);
582
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
581
583
  --_ui-action-start: 1px;
582
584
  --_ui-action-edge: var(
583
585
  --ui-action-edge,
@@ -606,6 +608,8 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
606
608
  }
607
609
 
608
610
  :global(:scope[data-tone="accent"]:where([data-hn-ui-icon-button])) {
611
+ --_tone-highlight: var(--ui-accent-highlight, none);
612
+ --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
609
613
  --_icon-button-border: var(--ui-accent-solid);
610
614
  --_icon-button-hover-border: var(--ui-accent-hover);
611
615
  --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
@@ -618,6 +622,8 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
618
622
  }
619
623
 
620
624
  :global(:scope[data-tone="danger"]:where([data-hn-ui-icon-button])) {
625
+ --_tone-highlight: var(--ui-danger-highlight, none);
626
+ --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
621
627
  --_icon-button-border: var(--ui-danger);
622
628
  --_icon-button-hover-border: var(--ui-danger-hover);
623
629
  --_icon-button-text: var(--ui-danger-subtle-text);
@@ -633,6 +639,8 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
633
639
  }
634
640
 
635
641
  :global(:scope[data-tone="success"]:where([data-hn-ui-icon-button])) {
642
+ --_tone-highlight: var(--ui-success-highlight, none);
643
+ --_tone-glow: var(--ui-success-glow, 0 0 transparent);
636
644
  --_icon-button-border: var(--ui-success);
637
645
  --_icon-button-hover-border: var(--ui-success-hover);
638
646
  --_icon-button-text: var(--ui-success-subtle-text);
@@ -648,6 +656,8 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
648
656
  }
649
657
 
650
658
  :global(:scope[data-tone="warning"]:where([data-hn-ui-icon-button])) {
659
+ --_tone-highlight: var(--ui-warning-highlight, none);
660
+ --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
651
661
  --_icon-button-border: var(--ui-warning);
652
662
  --_icon-button-hover-border: var(--ui-warning-hover);
653
663
  --_icon-button-text: var(--ui-warning-subtle-text);
@@ -663,6 +673,8 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
663
673
  }
664
674
 
665
675
  :global(:scope[data-tone="info"]:where([data-hn-ui-icon-button])) {
676
+ --_tone-highlight: var(--ui-info-highlight, none);
677
+ --_tone-glow: var(--ui-info-glow, 0 0 transparent);
666
678
  --_icon-button-border: var(--ui-info);
667
679
  --_icon-button-hover-border: var(--ui-info-hover);
668
680
  --_icon-button-text: var(--ui-info-subtle-text);
@@ -677,9 +689,11 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
677
689
  color: var(--_icon-button-text);
678
690
  }
679
691
  :global(:scope[data-tone="neutral"]:where([data-hn-ui-icon-button])) {
680
- --_icon-button-solid-surface: var(--ui-text-primary);
681
- --_icon-button-solid-hover-surface: var(--ui-text-primary);
682
- --_icon-button-solid-text: var(--ui-surface-default);
692
+ --_tone-highlight: var(--ui-neutral-highlight, none);
693
+ --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
694
+ --_icon-button-solid-surface: var(--ui-neutral-surface);
695
+ --_icon-button-solid-hover-surface: var(--ui-neutral-hover);
696
+ --_icon-button-solid-text: var(--ui-text);
683
697
  }
684
698
 
685
699
  :global(:scope[data-ui-icon-button-state~="anticipatory"]:where([data-hn-ui-icon-button])) {
@@ -854,9 +868,11 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
854
868
  --ui-icon-button-outline-surface,
855
869
  var(--_icon-button-outline-surface, var(--ui-surface-default))
856
870
  );
857
- background-image: none;
871
+ background-image: var(--ui-surface-highlight, none);
858
872
  color: var(--ui-icon-button-outline-text, var(--_icon-button-text, var(--ui-text-primary)));
859
- box-shadow: var(--ui-action-shadow, var(--_ui-action-shadow));
873
+ box-shadow:
874
+ var(--ui-action-shadow, var(--_ui-action-shadow)),
875
+ var(--_tone-glow);
860
876
  }
861
877
 
862
878
  :global(:scope[data-appearance="solid"]:where([data-hn-ui-icon-button])) {
@@ -864,15 +880,14 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
864
880
  --ui-icon-button-solid-surface,
865
881
  var(--_icon-button-solid-surface, var(--ui-accent-solid))
866
882
  );
867
- background-image: none;
883
+ background-image: var(--_tone-highlight);
868
884
  color: var(
869
885
  --ui-icon-button-solid-text,
870
886
  var(--_icon-button-solid-text, var(--ui-text-on-accent))
871
887
  );
872
- box-shadow: var(
873
- --ui-icon-button-solid-shadow,
874
- var(--ui-action-shadow, var(--_ui-action-shadow))
875
- );
888
+ box-shadow:
889
+ var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
890
+ var(--_tone-glow);
876
891
  }
877
892
 
878
893
  :global(:scope:hover:enabled:not([aria-disabled="true"]):where([data-hn-ui-icon-button])) {
package/vue/UiInput.vue CHANGED
@@ -581,10 +581,11 @@ useComponentHost(() => import('../components/ui-input/ui-input.js'), {
581
581
  --ui-input-radius,
582
582
  var(--_ui-default-input-radius, var(--ui-field-radius, var(--ui-radius-md)))
583
583
  );
584
- background: var(
584
+ background-color: var(
585
585
  --ui-input-surface,
586
586
  var(--_ui-default-input-surface, var(--ui-control-surface, var(--ui-surface-elevated)))
587
587
  );
588
+ background-image: var(--_ui-default-input-highlight, var(--ui-surface-highlight, none));
588
589
  color: var(--ui-text-primary);
589
590
  font: inherit;
590
591
  line-height: var(--ui-line-height-tight);
@@ -279,6 +279,7 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
279
279
  --_ui-default-input-focus-outline: none;
280
280
  --_ui-default-input-radius: 0;
281
281
  --_ui-default-input-surface: transparent;
282
+ --_ui-default-input-highlight: none;
282
283
  --_ui-default-textarea-border-width: 0;
283
284
  --_ui-default-textarea-border: transparent;
284
285
  --_ui-default-textarea-border-hover: transparent;
@@ -290,6 +291,7 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
290
291
  --_ui-default-textarea-focus-outline: none;
291
292
  --_ui-default-textarea-radius: 0;
292
293
  --_ui-default-textarea-surface: transparent;
294
+ --_ui-default-textarea-highlight: none;
293
295
 
294
296
  display: flex !important;
295
297
  align-items: stretch !important;
@@ -300,7 +302,8 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
300
302
  /* The frame reads the shared control tokens with a lone Input's fallbacks, so the two match. */
301
303
  border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
302
304
  border-radius: var(--ui-input-group-radius, var(--ui-field-radius, var(--ui-radius-md)));
303
- background: var(--ui-control-surface, var(--ui-surface-elevated));
305
+ background-color: var(--ui-control-surface, var(--ui-surface-elevated));
306
+ background-image: var(--ui-surface-highlight, none);
304
307
  box-shadow: var(--ui-control-inset);
305
308
  overflow: hidden;
306
309
  /* A press anywhere in the frame focuses the input. */
@@ -0,0 +1,75 @@
1
+ import type { PropType } from 'vue';
2
+ import { type InputBindings } from './props.js';
3
+ declare var __VLS_1: {};
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_1) => any;
6
+ };
7
+ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ disabled: {
9
+ type: PropType<boolean | null>;
10
+ };
11
+ label: {
12
+ type: PropType<string | null>;
13
+ };
14
+ size: {
15
+ type: PropType<"sm" | "md" | "lg" | null>;
16
+ };
17
+ x: {
18
+ type: PropType<number | null>;
19
+ };
20
+ y: {
21
+ type: PropType<number | null>;
22
+ };
23
+ "\0htmlNextInputStatus": {
24
+ type: PropType<InputBindings>;
25
+ };
26
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
27
+ input: (event: CustomEvent<{
28
+ readonly x: number;
29
+ readonly y: number;
30
+ }>) => any;
31
+ change: (event: CustomEvent<{
32
+ readonly x: number;
33
+ readonly y: number;
34
+ }>) => any;
35
+ "update:x": (value: number) => any;
36
+ "update:y": (value: number) => any;
37
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
38
+ disabled: {
39
+ type: PropType<boolean | null>;
40
+ };
41
+ label: {
42
+ type: PropType<string | null>;
43
+ };
44
+ size: {
45
+ type: PropType<"sm" | "md" | "lg" | null>;
46
+ };
47
+ x: {
48
+ type: PropType<number | null>;
49
+ };
50
+ y: {
51
+ type: PropType<number | null>;
52
+ };
53
+ "\0htmlNextInputStatus": {
54
+ type: PropType<InputBindings>;
55
+ };
56
+ }>> & Readonly<{
57
+ onInput?: ((event: CustomEvent<{
58
+ readonly x: number;
59
+ readonly y: number;
60
+ }>) => any) | undefined;
61
+ onChange?: ((event: CustomEvent<{
62
+ readonly x: number;
63
+ readonly y: number;
64
+ }>) => any) | undefined;
65
+ "onUpdate:x"?: ((value: number) => any) | undefined;
66
+ "onUpdate:y"?: ((value: number) => any) | undefined;
67
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
68
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
69
+ declare const _default: typeof __VLS_export;
70
+ export default _default;
71
+ type __VLS_WithSlots<T, S> = T & {
72
+ new (): {
73
+ $slots: S;
74
+ };
75
+ };
@@ -0,0 +1,2 @@
1
+ import { t as UiLightEditor_default } from "./chunks/UiLightEditor.js";
2
+ export { UiLightEditor_default as default };