@threadlabs/looma 0.41.2 → 0.42.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 (97) hide show
  1. package/components/ui-button/ui-button.html +33 -12
  2. package/components/ui-button/ui-button.js +2 -2
  3. package/components/ui-callout/ui-callout.html +1 -1
  4. package/components/ui-card/ui-card.html +7 -7
  5. package/components/ui-checkbox/ui-checkbox.html +1 -1
  6. package/components/ui-dialog/ui-dialog.html +8 -10
  7. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
  8. package/components/ui-editor-mention-menu-item/ui-editor-mention-menu-item.html +1 -1
  9. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +1 -1
  10. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +2 -2
  11. package/components/ui-icon-button/ui-icon-button.html +45 -10
  12. package/components/ui-light-editor/ui-light-editor.html +1 -1
  13. package/components/ui-menu/ui-menu.html +8 -10
  14. package/components/ui-menu-item/ui-menu-item.html +1 -1
  15. package/components/ui-popover/ui-popover.html +9 -11
  16. package/components/ui-radio/ui-radio.html +53 -1
  17. package/components/ui-section/ui-section.html +1 -1
  18. package/components/ui-status-message/ui-status-message.html +1 -1
  19. package/components/ui-switch/ui-switch.html +5 -2
  20. package/components/ui-tabs/ui-tabs.html +3 -3
  21. package/components/ui-text/ui-text.html +2 -2
  22. package/components/ui-tooltip/ui-tooltip.html +8 -10
  23. package/dist/index.js +1 -1
  24. package/docs/README.md +5 -1
  25. package/docs/catalog.json +405 -33
  26. package/docs/customizer-render.mjs +9 -5
  27. package/docs/customizer.js +2 -0
  28. package/docs/fonts.mjs +1 -1
  29. package/docs/theme.mjs +136 -35
  30. package/package.json +1 -1
  31. package/styles/ui-button.css +33 -12
  32. package/styles/ui-callout.css +1 -1
  33. package/styles/ui-card.css +6 -6
  34. package/styles/ui-checkbox.css +1 -1
  35. package/styles/ui-dialog.css +17 -21
  36. package/styles/ui-editor-mention-menu-item.css +1 -1
  37. package/styles/ui-editor-mention-menu.css +1 -1
  38. package/styles/ui-editor-table-context-menu.css +1 -1
  39. package/styles/ui-editor-table-toolbar.css +2 -2
  40. package/styles/ui-icon-button.css +45 -10
  41. package/styles/ui-light-editor.css +2 -2
  42. package/styles/ui-menu-item.css +1 -1
  43. package/styles/ui-menu.css +9 -11
  44. package/styles/ui-popover.css +10 -12
  45. package/styles/ui-radio.css +62 -1
  46. package/styles/ui-section.css +1 -1
  47. package/styles/ui-status-message.css +1 -1
  48. package/styles/ui-switch.css +5 -2
  49. package/styles/ui-tabs.css +3 -3
  50. package/styles/ui-text.css +2 -2
  51. package/styles/ui-tooltip.css +9 -11
  52. package/theme-system.css +10 -8
  53. package/tokens.css +23 -0
  54. package/vue/UiButton.vue +45 -12
  55. package/vue/UiCallout.vue +1 -1
  56. package/vue/UiCard.vue +7 -13
  57. package/vue/UiCheckbox.vue +1 -1
  58. package/vue/UiDialog.vue +21 -45
  59. package/vue/UiEditorMentionMenu.vue +1 -1
  60. package/vue/UiEditorMentionMenuItem.vue +1 -1
  61. package/vue/UiEditorTableContextMenu.vue +1 -1
  62. package/vue/UiEditorTableToolbar.vue +2 -2
  63. package/vue/UiIconButton.vue +45 -10
  64. package/vue/UiLightEditor.vue +2 -2
  65. package/vue/UiMenu.vue +11 -21
  66. package/vue/UiMenuItem.vue +1 -1
  67. package/vue/UiPopover.vue +12 -22
  68. package/vue/UiRadio.vue +57 -1
  69. package/vue/UiSection.vue +1 -1
  70. package/vue/UiStatusMessage.vue +1 -1
  71. package/vue/UiSwitch.vue +5 -2
  72. package/vue/UiTabs.vue +3 -3
  73. package/vue/UiText.vue +2 -2
  74. package/vue/UiTooltip.vue +11 -21
  75. package/vue/chunks/UiButton.js +1 -1
  76. package/vue/chunks/UiCallout.js +1 -1
  77. package/vue/chunks/UiCard.js +2 -2
  78. package/vue/chunks/UiCheckbox.js +1 -1
  79. package/vue/chunks/UiDialog.js +1 -1
  80. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  81. package/vue/chunks/UiEditorMentionMenuItem.js +1 -1
  82. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  83. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  84. package/vue/chunks/UiIconButton.js +1 -1
  85. package/vue/chunks/UiLightEditor.js +1 -1
  86. package/vue/chunks/UiMenu.js +1 -1
  87. package/vue/chunks/UiMenuItem.js +1 -1
  88. package/vue/chunks/UiPopover.js +1 -1
  89. package/vue/chunks/UiRadio.js +1 -1
  90. package/vue/chunks/UiSection.js +1 -1
  91. package/vue/chunks/UiStatusMessage.js +1 -1
  92. package/vue/chunks/UiSwitch.js +1 -1
  93. package/vue/chunks/UiTabs.js +1 -1
  94. package/vue/chunks/UiText.js +1 -1
  95. package/vue/chunks/UiTooltip.js +1 -1
  96. package/vue/components.css +342 -233
  97. package/vue/editor/index.js +1 -1
@@ -573,6 +573,10 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
573
573
  /* Optional inherited action-group values keep text and icon actions under the same light.
574
574
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
575
575
  The shared theme supplies reflections and glow independently of the resting lift. */
576
+ --_solid-border: var(--ui-accent-border, var(--ui-accent-solid));
577
+ --_solid-hover-border: var(--ui-accent-hover-border, var(--ui-accent-hover));
578
+ --_solid-active-border: var(--ui-accent-active-border, var(--ui-accent-active));
579
+ --_solid-active-surface: var(--ui-accent-active, var(--ui-accent-hover));
576
580
  --_tone-highlight: var(--ui-accent-highlight, none);
577
581
  --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
578
582
  --_ui-action-start: 1px;
@@ -603,10 +607,14 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
603
607
  }
604
608
 
605
609
  :global(:scope[data-tone="accent"]:where([data-hn-ui-icon-button])) {
610
+ --_solid-border: var(--ui-accent-border, var(--ui-accent));
611
+ --_solid-hover-border: var(--ui-accent-hover-border, var(--ui-accent-hover));
612
+ --_solid-active-border: var(--ui-accent-active-border, var(--ui-accent-active));
613
+ --_solid-active-surface: var(--ui-accent-active, var(--ui-accent-hover));
606
614
  --_tone-highlight: var(--ui-accent-highlight, none);
607
615
  --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
608
- --_icon-button-border: var(--ui-accent-solid);
609
- --_icon-button-hover-border: var(--ui-accent-hover);
616
+ --_icon-button-border: var(--ui-accent-subtle-text);
617
+ --_icon-button-hover-border: var(--ui-accent-subtle-text);
610
618
  --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
611
619
  --_icon-button-outline-surface: color-mix(
612
620
  in srgb,
@@ -617,10 +625,14 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
617
625
  }
618
626
 
619
627
  :global(:scope[data-tone="danger"]:where([data-hn-ui-icon-button])) {
628
+ --_solid-border: var(--ui-danger-border, var(--ui-danger));
629
+ --_solid-hover-border: var(--ui-danger-hover-border, var(--ui-danger-hover));
630
+ --_solid-active-border: var(--ui-danger-active-border, var(--ui-danger-active));
631
+ --_solid-active-surface: var(--ui-danger-active, var(--ui-danger-hover));
620
632
  --_tone-highlight: var(--ui-danger-highlight, none);
621
633
  --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
622
- --_icon-button-border: var(--ui-danger);
623
- --_icon-button-hover-border: var(--ui-danger-hover);
634
+ --_icon-button-border: var(--ui-danger-subtle-text);
635
+ --_icon-button-hover-border: var(--ui-danger-subtle-text);
624
636
  --_icon-button-text: var(--ui-danger-subtle-text);
625
637
  --_icon-button-outline-surface: color-mix(
626
638
  in srgb,
@@ -634,10 +646,14 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
634
646
  }
635
647
 
636
648
  :global(:scope[data-tone="success"]:where([data-hn-ui-icon-button])) {
649
+ --_solid-border: var(--ui-success-border, var(--ui-success));
650
+ --_solid-hover-border: var(--ui-success-hover-border, var(--ui-success-hover));
651
+ --_solid-active-border: var(--ui-success-active-border, var(--ui-success-active));
652
+ --_solid-active-surface: var(--ui-success-active, var(--ui-success-hover));
637
653
  --_tone-highlight: var(--ui-success-highlight, none);
638
654
  --_tone-glow: var(--ui-success-glow, 0 0 transparent);
639
- --_icon-button-border: var(--ui-success);
640
- --_icon-button-hover-border: var(--ui-success-hover);
655
+ --_icon-button-border: var(--ui-success-subtle-text);
656
+ --_icon-button-hover-border: var(--ui-success-subtle-text);
641
657
  --_icon-button-text: var(--ui-success-subtle-text);
642
658
  --_icon-button-outline-surface: color-mix(
643
659
  in srgb,
@@ -651,10 +667,14 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
651
667
  }
652
668
 
653
669
  :global(:scope[data-tone="warning"]:where([data-hn-ui-icon-button])) {
670
+ --_solid-border: var(--ui-warning-border, var(--ui-warning));
671
+ --_solid-hover-border: var(--ui-warning-hover-border, var(--ui-warning-hover));
672
+ --_solid-active-border: var(--ui-warning-active-border, var(--ui-warning-active));
673
+ --_solid-active-surface: var(--ui-warning-active, var(--ui-warning-hover));
654
674
  --_tone-highlight: var(--ui-warning-highlight, none);
655
675
  --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
656
- --_icon-button-border: var(--ui-warning);
657
- --_icon-button-hover-border: var(--ui-warning-hover);
676
+ --_icon-button-border: var(--ui-warning-subtle-text);
677
+ --_icon-button-hover-border: var(--ui-warning-subtle-text);
658
678
  --_icon-button-text: var(--ui-warning-subtle-text);
659
679
  --_icon-button-outline-surface: color-mix(
660
680
  in srgb,
@@ -668,10 +688,14 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
668
688
  }
669
689
 
670
690
  :global(:scope[data-tone="info"]:where([data-hn-ui-icon-button])) {
691
+ --_solid-border: var(--ui-info-border, var(--ui-info));
692
+ --_solid-hover-border: var(--ui-info-hover-border, var(--ui-info-hover));
693
+ --_solid-active-border: var(--ui-info-active-border, var(--ui-info-active));
694
+ --_solid-active-surface: var(--ui-info-active, var(--ui-info-hover));
671
695
  --_tone-highlight: var(--ui-info-highlight, none);
672
696
  --_tone-glow: var(--ui-info-glow, 0 0 transparent);
673
- --_icon-button-border: var(--ui-info);
674
- --_icon-button-hover-border: var(--ui-info-hover);
697
+ --_icon-button-border: var(--ui-info-subtle-text);
698
+ --_icon-button-hover-border: var(--ui-info-subtle-text);
675
699
  --_icon-button-text: var(--ui-info-subtle-text);
676
700
  --_icon-button-outline-surface: color-mix(
677
701
  in srgb,
@@ -684,6 +708,10 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
684
708
  color: var(--_icon-button-text);
685
709
  }
686
710
  :global(:scope[data-tone="neutral"]:where([data-hn-ui-icon-button])) {
711
+ --_solid-border: var(--ui-neutral-border, var(--ui-neutral-surface));
712
+ --_solid-hover-border: var(--ui-neutral-hover-border, var(--ui-neutral-hover));
713
+ --_solid-active-border: var(--ui-neutral-active-border, var(--ui-neutral-active));
714
+ --_solid-active-surface: var(--ui-neutral-active, var(--ui-neutral-hover));
687
715
  --_tone-highlight: var(--ui-neutral-highlight, none);
688
716
  --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
689
717
  --_icon-button-outline-surface: transparent;
@@ -861,6 +889,7 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
861
889
  }
862
890
 
863
891
  :global(:scope[data-appearance="solid"]:where([data-hn-ui-icon-button])) {
892
+ border-color: var(--ui-icon-button-border, var(--_solid-border));
864
893
  background-color: var(
865
894
  --ui-icon-button-solid-surface,
866
895
  var(--_icon-button-solid-surface, var(--ui-accent-solid))
@@ -898,6 +927,7 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
898
927
  }
899
928
 
900
929
  :global(:scope[data-appearance="solid"]:hover:enabled:not([aria-disabled="true"]):where([data-hn-ui-icon-button])) {
930
+ border-color: var(--ui-icon-button-hover-border, var(--_solid-hover-border));
901
931
  background-color: var(
902
932
  --ui-icon-button-solid-hover-surface,
903
933
  var(--_icon-button-solid-hover-surface, var(--ui-accent-hover))
@@ -971,6 +1001,11 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
971
1001
  var(--ui-focus-halo);
972
1002
  }
973
1003
 
1004
+ :global(:scope[data-appearance="solid"]:active:enabled:not([aria-disabled="true"]):where([data-hn-ui-icon-button])) {
1005
+ background-color: var(--ui-icon-button-active-surface, var(--_solid-active-surface));
1006
+ border-color: var(--_solid-active-border);
1007
+ }
1008
+
974
1009
  :global(:scope:is(:scope[data-appearance="outline"], :scope[data-appearance="solid"]):active:enabled:not([aria-disabled="true"]):where([data-hn-ui-icon-button])) {
975
1010
  background-image: none;
976
1011
  box-shadow: var(--ui-pressed);
@@ -366,7 +366,7 @@ useComponentHost(() => import('../components/ui-light-editor/ui-light-editor.js'
366
366
  position: relative;
367
367
  z-index: 1;
368
368
  display: inline-flex !important;
369
- color: var(--ui-accent);
369
+ color: var(--ui-accent-subtle-text);
370
370
  font-size: var(--ui-font-size-lg);
371
371
  }
372
372
  :global(.source:where([data-hn-ui-light-editor])::after) {
@@ -479,7 +479,7 @@ useComponentHost(() => import('../components/ui-light-editor/ui-light-editor.js'
479
479
  position: relative;
480
480
  z-index: 1;
481
481
  display: inline-flex !important;
482
- color: var(--ui-accent);
482
+ color: var(--ui-accent-subtle-text);
483
483
  font-size: var(--ui-font-size-lg);
484
484
  }
485
485
  :global(.source:where(:not([data-hn], [data-slotted]:not([data-slotted~="ui-light-editor"]))):where(:scope, :scope
package/vue/UiMenu.vue CHANGED
@@ -353,7 +353,7 @@ useComponentHost(() => import('../components/ui-menu/ui-menu.js'), {
353
353
  /* Small follows its trigger down: an item's own hooks still win. */
354
354
 
355
355
  /* Purpose and measured size shape one shared separation lever. The content plane stays opaque;
356
- transparency, saturation and edge light belong to the surrounding decorative material. */
356
+ transparency, frosting and edge light belong to the surrounding decorative material. */
357
357
 
358
358
  @scope (.ui-menu) to ([data-hn]) {
359
359
  :global(:scope[data-ui-menu-state~="density=compact"]:where([data-hn-ui-menu])) {
@@ -427,21 +427,11 @@ useComponentHost(() => import('../components/ui-menu/ui-menu.js'), {
427
427
  overflow: auto;
428
428
  }
429
429
  :global(:scope:not([inline]) .surface:where([data-hn-ui-menu])) {
430
- --_ui-material-glassiness: calc(
431
- clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4)
432
- );
430
+ --_ui-material-glassiness: clamp(0, var(--ui-glassiness, 0), 1);
433
431
  --_ui-material-separation: clamp(0, var(--ui-surface-separation, 0), 1);
434
- --_ui-material-active: clamp(
435
- 0,
436
- calc((var(--_ui-material-glassiness) + var(--_ui-material-separation)) * 100000),
437
- 1
438
- );
432
+ --_ui-material-active: clamp(0, calc(var(--_ui-material-separation) * 100000), 1);
439
433
  --_ui-material-rim: calc(
440
- (
441
- var(--_ui-material-separation) + var(--_ui-material-glassiness) * 0.25
442
- ) *
443
- var(--_ui-material-scale, 0.28) *
444
- 8px
434
+ var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px
445
435
  );
446
436
  --_ui-material-content-color: var(
447
437
  --_ui-menu-surface,
@@ -484,12 +474,12 @@ useComponentHost(() => import('../components/ui-menu/ui-menu.js'), {
484
474
  var(--ui-elevation-overlay, var(--ui-shadow-lg))
485
475
  )
486
476
  );
487
- backdrop-filter: blur(
488
- calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 18px)
489
- ) saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 0.18));
490
477
  -webkit-backdrop-filter: blur(
491
- calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 18px)
492
- ) saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 0.18));
478
+ calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 32px)
479
+ );
480
+ backdrop-filter: blur(
481
+ calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 32px)
482
+ );
493
483
  }
494
484
 
495
485
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
@@ -501,8 +491,8 @@ useComponentHost(() => import('../components/ui-menu/ui-menu.js'), {
501
491
  @media (prefers-reduced-transparency: reduce) {
502
492
  :global(:scope:not([inline]) .surface:where([data-hn-ui-menu])) {
503
493
  background: var(--_ui-material-content-color);
504
- backdrop-filter: none;
505
494
  -webkit-backdrop-filter: none;
495
+ backdrop-filter: none;
506
496
  }
507
497
  }
508
498
 
@@ -511,8 +501,8 @@ useComponentHost(() => import('../components/ui-menu/ui-menu.js'), {
511
501
  background: Canvas;
512
502
  border-color: CanvasText;
513
503
  box-shadow: none;
514
- backdrop-filter: none;
515
504
  -webkit-backdrop-filter: none;
505
+ backdrop-filter: none;
516
506
  }
517
507
  }
518
508
 
@@ -453,7 +453,7 @@ useComponentHost(() => import('../components/ui-menu-item/ui-menu-item.js'), {
453
453
  }
454
454
 
455
455
  :global(:scope[data-ui-menu-item-state~="tone=danger"]:where([data-hn-ui-menu-item])) {
456
- color: var(--ui-danger);
456
+ color: var(--ui-danger-subtle-text);
457
457
  }
458
458
 
459
459
  :global(.label:where([data-hn-ui-menu-item])) {
package/vue/UiPopover.vue CHANGED
@@ -335,7 +335,7 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
335
335
  }
336
336
 
337
337
  /* Purpose and measured size shape one shared separation lever. The content plane stays opaque;
338
- transparency, saturation and edge light belong to the surrounding decorative material. */
338
+ transparency, frosting and edge light belong to the surrounding decorative material. */
339
339
 
340
340
  /* A toolbar or card can supply its own surface, including an unclipped shadow. */
341
341
 
@@ -378,21 +378,11 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
378
378
  );
379
379
  }
380
380
  :global(.surface:where([data-hn-ui-popover])) {
381
- --_ui-material-glassiness: calc(
382
- clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4)
383
- );
381
+ --_ui-material-glassiness: clamp(0, var(--ui-glassiness, 0), 1);
384
382
  --_ui-material-separation: clamp(0, var(--ui-surface-separation, 0), 1);
385
- --_ui-material-active: clamp(
386
- 0,
387
- calc((var(--_ui-material-glassiness) + var(--_ui-material-separation)) * 100000),
388
- 1
389
- );
383
+ --_ui-material-active: clamp(0, calc(var(--_ui-material-separation) * 100000), 1);
390
384
  --_ui-material-rim: calc(
391
- (
392
- var(--_ui-material-separation) + var(--_ui-material-glassiness) * 0.25
393
- ) *
394
- var(--_ui-material-scale, 0.55) *
395
- 8px
385
+ var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px
396
386
  );
397
387
  --_ui-material-content-color: var(
398
388
  --_ui-popover-surface,
@@ -435,12 +425,12 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
435
425
  var(--ui-elevation-overlay, var(--ui-shadow-lg))
436
426
  )
437
427
  );
438
- backdrop-filter: blur(
439
- calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 18px)
440
- ) saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 0.18));
441
428
  -webkit-backdrop-filter: blur(
442
- calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 18px)
443
- ) saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 0.18));
429
+ calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 32px)
430
+ );
431
+ backdrop-filter: blur(
432
+ calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 32px)
433
+ );
444
434
  }
445
435
 
446
436
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
@@ -452,8 +442,8 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
452
442
  @media (prefers-reduced-transparency: reduce) {
453
443
  :global(.surface:where([data-hn-ui-popover])) {
454
444
  background: var(--_ui-material-content-color);
455
- backdrop-filter: none;
456
445
  -webkit-backdrop-filter: none;
446
+ backdrop-filter: none;
457
447
  }
458
448
  }
459
449
 
@@ -462,8 +452,8 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
462
452
  background: Canvas;
463
453
  border-color: CanvasText;
464
454
  box-shadow: none;
465
- backdrop-filter: none;
466
455
  -webkit-backdrop-filter: none;
456
+ backdrop-filter: none;
467
457
  }
468
458
  }
469
459
  :global(:scope[data-ui-popover-state~="bare"] .surface:where([data-hn-ui-popover])) {
@@ -472,8 +462,8 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
472
462
  border: 0;
473
463
  background: transparent;
474
464
  box-shadow: none;
475
- backdrop-filter: none;
476
465
  -webkit-backdrop-filter: none;
466
+ backdrop-filter: none;
477
467
  }
478
468
 
479
469
  :global(:scope:not([data-ui-popover-state~="internalOpen"]):where([data-hn-ui-popover])) {
package/vue/UiRadio.vue CHANGED
@@ -303,6 +303,9 @@ useComponentHost(() => import('../components/ui-radio/ui-radio.js'), {
303
303
 
304
304
  /* The label, and under it an optional line saying what the choice means. */
305
305
 
306
+ /* The native radio retains grouping, validation and keyboard behavior.
307
+ Its empty well recedes; the filled selection and its dot stay crisp. */
308
+
306
309
  /* A sized choice keeps its box and aligns instead: the label takes that size's field type size,
307
310
  and the first line centres in that control height, so the label shares a row's baseline.
308
311
  Multi-line labels and descriptions still grow downward from that first line. */
@@ -361,9 +364,36 @@ useComponentHost(() => import('../components/ui-radio/ui-radio.js'), {
361
364
  inline-size: var(--_ui-radio-size, 1.125rem);
362
365
  block-size: var(--_ui-radio-size, 1.125rem);
363
366
  margin: max(0px, calc((1lh - var(--_ui-radio-size, 1.125rem)) / 2)) 0 0 !important;
364
- accent-color: var(--ui-accent-solid);
367
+ -webkit-appearance: none;
368
+ appearance: none;
369
+ position: relative;
370
+ border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
371
+ border-radius: var(--ui-radius-round);
372
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
373
+ background-image: var(--ui-surface-highlight, none);
374
+ box-shadow: var(--ui-control-inset);
365
375
  cursor: pointer;
366
376
  }
377
+ :global(input:where([data-hn-ui-radio])::after) {
378
+ content: "";
379
+ position: absolute;
380
+ inset: 28%;
381
+ border-radius: var(--ui-radius-round);
382
+ background-color: var(--ui-text-on-accent);
383
+ opacity: 0;
384
+ transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
385
+ }
386
+
387
+ :global(input:checked:where([data-hn-ui-radio])) {
388
+ background-color: var(--ui-accent-solid);
389
+ background-image: var(--ui-accent-highlight, none);
390
+ border-color: var(--ui-accent-solid);
391
+ box-shadow: none;
392
+ }
393
+
394
+ :global(input:checked:where([data-hn-ui-radio])::after) {
395
+ opacity: 1;
396
+ }
367
397
 
368
398
  :global(input:focus-visible:where([data-hn-ui-radio])) {
369
399
  outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
@@ -378,8 +408,34 @@ useComponentHost(() => import('../components/ui-radio/ui-radio.js'), {
378
408
  color: var(--ui-disabled-text);
379
409
  }
380
410
  :global(:scope[data-ui-radio-state~="disabled"] input:where([data-hn-ui-radio])) {
411
+ border-color: var(--ui-disabled-border);
412
+ background-color: var(--ui-disabled-surface);
413
+ background-image: none;
414
+ box-shadow: none;
381
415
  cursor: not-allowed;
382
416
  }
417
+
418
+ :global(:scope[data-ui-radio-state~="disabled"] input:where([data-hn-ui-radio])::after) {
419
+ background-color: var(--ui-disabled-text);
420
+ }
421
+
422
+ @media (prefers-reduced-motion: reduce) {
423
+ :global(input:where([data-hn-ui-radio])::after) {
424
+ transition: none;
425
+ }
426
+ }
427
+
428
+ @media (forced-colors: active) {
429
+ :global(input:where([data-hn-ui-radio])) {
430
+ -webkit-appearance: auto;
431
+ appearance: auto;
432
+ background: none;
433
+ box-shadow: none;
434
+ }
435
+ :global(input:where([data-hn-ui-radio])::after) {
436
+ display: none !important;
437
+ }
438
+ }
383
439
  :global(:scope[data-ui-radio-state~="size=sm"]:where([data-hn-ui-radio])) {
384
440
  --_font: var(--ui-font-size-sm);
385
441
  --_row: var(--ui-control-size-sm);
package/vue/UiSection.vue CHANGED
@@ -219,7 +219,7 @@ const hostState = computed(() =>
219
219
  }
220
220
 
221
221
  :global(:scope[data-ui-section-state~="tone=danger"] .heading:where([data-hn-ui-section])) {
222
- color: var(--ui-danger);
222
+ color: var(--ui-danger-subtle-text);
223
223
  }
224
224
 
225
225
  :global(.description:where([data-hn-ui-section])) {
@@ -187,7 +187,7 @@ const hostState = computed(() =>
187
187
  }
188
188
 
189
189
  :global(:scope[data-ui-status-message-state~="kind=error"]:where([data-hn-ui-status-message])) {
190
- color: var(--ui-danger);
190
+ color: var(--ui-danger-subtle-text);
191
191
  }
192
192
 
193
193
  :global(:scope[data-ui-status-message-state~="layout=panel"]:where([data-hn-ui-status-message])) {
package/vue/UiSwitch.vue CHANGED
@@ -392,7 +392,8 @@ useComponentHost(() => import('../components/ui-switch/ui-switch.js'), {
392
392
  width: var(--_thumb);
393
393
  height: var(--_thumb);
394
394
  border-radius: var(--ui-radius-round);
395
- background: var(--ui-text-secondary);
395
+ background-color: var(--ui-text-secondary);
396
+ background-image: var(--ui-knob-highlight, none);
396
397
  box-shadow: var(--ui-shadow-xs);
397
398
  transition:
398
399
  transform var(--ui-motion-base) var(--ui-motion-ease),
@@ -407,7 +408,8 @@ useComponentHost(() => import('../components/ui-switch/ui-switch.js'), {
407
408
 
408
409
  :global(input:checked:where([data-hn-ui-switch])::after) {
409
410
  transform: translateX(calc(var(--_ui-switch-track-width) - var(--_ui-switch-track-height)));
410
- background: var(--ui-text-on-accent);
411
+ background-color: var(--ui-text-on-accent);
412
+ background-image: var(--ui-knob-on-accent-highlight, none);
411
413
  }
412
414
 
413
415
  :global(input:focus-visible:where([data-hn-ui-switch])) {
@@ -432,6 +434,7 @@ useComponentHost(() => import('../components/ui-switch/ui-switch.js'), {
432
434
 
433
435
  :global(:scope[data-ui-switch-state~="disabled"] input:where([data-hn-ui-switch])::after) {
434
436
  background-color: var(--ui-disabled-text);
437
+ background-image: none;
435
438
  box-shadow: none;
436
439
  }
437
440
 
package/vue/UiTabs.vue CHANGED
@@ -448,8 +448,8 @@ useComponentHost(() => import('../components/ui-tabs/ui-tabs.js'), {
448
448
  }
449
449
  :global(.list button[aria-selected="true"]:where([data-hn-ui-tabs])),
450
450
  :global(.list > :where(:not([data-hn-ui-tabs])):is(button[slot="tab"][aria-selected="true"])) {
451
- color: var(--ui-accent-solid);
452
- border-block-end-color: var(--ui-accent-solid);
451
+ color: var(--ui-accent-subtle-text);
452
+ border-block-end-color: var(--ui-accent-subtle-text);
453
453
  }
454
454
  :global(.list button:focus-visible:where([data-hn-ui-tabs])),
455
455
  :global(.list > :where(:not([data-hn-ui-tabs])):is(button[slot="tab"]:focus-visible)) {
@@ -495,7 +495,7 @@ useComponentHost(() => import('../components/ui-tabs/ui-tabs.js'), {
495
495
  :global(:scope[data-ui-tabs-state~="orientation=vertical"]
496
496
  .list
497
497
  > :where(:not([data-hn-ui-tabs])):is(button[slot="tab"][aria-selected="true"])) {
498
- border-inline-end-color: var(--ui-accent-solid);
498
+ border-inline-end-color: var(--ui-accent-subtle-text);
499
499
  }
500
500
 
501
501
  @media (prefers-reduced-motion: reduce) {
package/vue/UiText.vue CHANGED
@@ -719,7 +719,7 @@ const hostState = computed(() =>
719
719
  color: var(--ui-text-muted);
720
720
  }
721
721
  :global(:scope[data-ui-text-state~="tone=accent"]:where([data-hn-ui-text])) {
722
- color: var(--ui-accent-active);
722
+ color: var(--ui-accent-subtle-text);
723
723
  }
724
724
  :global(:scope[data-ui-text-state~="tone=danger"]:where([data-hn-ui-text])) {
725
725
  color: var(--ui-danger-subtle-text);
@@ -777,7 +777,7 @@ const hostState = computed(() =>
777
777
  font-family: var(--ui-font-family-mono);
778
778
  }
779
779
  :global(:scope :where(:not([data-hn-ui-text])):is(a)) {
780
- color: var(--ui-accent-active);
780
+ color: var(--ui-accent-subtle-text);
781
781
  text-decoration: underline;
782
782
  text-decoration-thickness: 0.06em;
783
783
  text-underline-offset: 0.18em;
package/vue/UiTooltip.vue CHANGED
@@ -390,7 +390,7 @@ useComponentHost(() => import('../components/ui-tooltip/ui-tooltip.js'), {
390
390
  /* The label and the shortcut sit side by side, a gap apart, with the label wrapping on its own. */
391
391
 
392
392
  /* Purpose and measured size shape one shared separation lever. The content plane stays opaque;
393
- transparency, saturation and edge light belong to the surrounding decorative material. */
393
+ transparency, frosting and edge light belong to the surrounding decorative material. */
394
394
 
395
395
  /* A keyboard shortcut follows the label after a thin divider, smaller and quieter, as menus show
396
396
  it. The label stays first in the description, so a screen reader hears the name, then the keys. */
@@ -456,21 +456,11 @@ useComponentHost(() => import('../components/ui-tooltip/ui-tooltip.js'), {
456
456
  );
457
457
  }
458
458
  :global(.surface:where([data-hn-ui-tooltip])) {
459
- --_ui-material-glassiness: calc(
460
- clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4)
461
- );
459
+ --_ui-material-glassiness: clamp(0, var(--ui-glassiness, 0), 1);
462
460
  --_ui-material-separation: clamp(0, var(--ui-surface-separation, 0), 1);
463
- --_ui-material-active: clamp(
464
- 0,
465
- calc((var(--_ui-material-glassiness) + var(--_ui-material-separation)) * 100000),
466
- 1
467
- );
461
+ --_ui-material-active: clamp(0, calc(var(--_ui-material-separation) * 100000), 1);
468
462
  --_ui-material-rim: calc(
469
- (
470
- var(--_ui-material-separation) + var(--_ui-material-glassiness) * 0.25
471
- ) *
472
- var(--_ui-material-scale, 0.08) *
473
- 8px
463
+ var(--_ui-material-separation) * var(--_ui-material-scale, 0.08) * 8px
474
464
  );
475
465
  --_ui-material-content-color: var(
476
466
  --_ui-tooltip-surface,
@@ -511,12 +501,12 @@ useComponentHost(() => import('../components/ui-tooltip/ui-tooltip.js'), {
511
501
  var(--ui-elevation-tooltip, var(--ui-shadow-md))
512
502
  )
513
503
  );
514
- backdrop-filter: blur(
515
- calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.08) * 18px)
516
- ) saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.08) * 0.18));
517
504
  -webkit-backdrop-filter: blur(
518
- calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.08) * 18px)
519
- ) saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.08) * 0.18));
505
+ calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.08) * 32px)
506
+ );
507
+ backdrop-filter: blur(
508
+ calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.08) * 32px)
509
+ );
520
510
  }
521
511
 
522
512
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
@@ -528,8 +518,8 @@ useComponentHost(() => import('../components/ui-tooltip/ui-tooltip.js'), {
528
518
  @media (prefers-reduced-transparency: reduce) {
529
519
  :global(.surface:where([data-hn-ui-tooltip])) {
530
520
  background: var(--_ui-material-content-color);
531
- backdrop-filter: none;
532
521
  -webkit-backdrop-filter: none;
522
+ backdrop-filter: none;
533
523
  }
534
524
  }
535
525
 
@@ -538,8 +528,8 @@ useComponentHost(() => import('../components/ui-tooltip/ui-tooltip.js'), {
538
528
  background: Canvas;
539
529
  border-color: CanvasText;
540
530
  box-shadow: none;
541
- backdrop-filter: none;
542
531
  -webkit-backdrop-filter: none;
532
+ backdrop-filter: none;
543
533
  }
544
534
  }
545
535
  :global(.shortcut:where([data-hn-ui-tooltip])) {
@@ -874,6 +874,6 @@ var UiButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
874
874
  }]]);
875
875
  };
876
876
  }
877
- }), [["__scopeId", "data-v-872bcd48"]]);
877
+ }), [["__scopeId", "data-v-26648489"]]);
878
878
  //#endregion
879
879
  export { UiButton_default as t };
@@ -297,6 +297,6 @@ var UiCallout_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
297
297
  }]]);
298
298
  };
299
299
  }
300
- }), [["__scopeId", "data-v-15314c87"]]);
300
+ }), [["__scopeId", "data-v-7d8e0649"]]);
301
301
  //#endregion
302
302
  export { UiCallout_default as t };
@@ -127,7 +127,7 @@ var UiCard_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
127
127
  },
128
128
  required: false,
129
129
  target: { attribute: "treatment" },
130
- description: "How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material\n treatment. This does not add elevation or require glass.",
130
+ description: "How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material\n treatment. Its glass rim can transmit and frost the surrounding scene while content remains opaque. Surface separation controls the rim, independently of frosting. This does not add elevation or require glass.",
131
131
  values: ["standard", "expressive"],
132
132
  default: "standard"
133
133
  },
@@ -298,6 +298,6 @@ var UiCard_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
298
298
  }]]);
299
299
  };
300
300
  }
301
- }), [["__scopeId", "data-v-2944b075"]]);
301
+ }), [["__scopeId", "data-v-b628f494"]]);
302
302
  //#endregion
303
303
  export { UiCard_default as t };
@@ -356,6 +356,6 @@ var UiCheckbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
356
356
  }]]);
357
357
  };
358
358
  }
359
- }), [["__scopeId", "data-v-570a9f0b"]]);
359
+ }), [["__scopeId", "data-v-36f1c10d"]]);
360
360
  //#endregion
361
361
  export { UiCheckbox_default as t };
@@ -362,6 +362,6 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
362
362
  }]]);
363
363
  };
364
364
  }
365
- }), [["__scopeId", "data-v-45428506"]]);
365
+ }), [["__scopeId", "data-v-d8d3c50b"]]);
366
366
  //#endregion
367
367
  export { UiDialog_default as t };
@@ -613,6 +613,6 @@ var UiEditorMentionMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
613
613
  }]]);
614
614
  };
615
615
  }
616
- }), [["__scopeId", "data-v-0f0b9571"]]);
616
+ }), [["__scopeId", "data-v-54879c45"]]);
617
617
  //#endregion
618
618
  export { UiEditorMentionMenu_default as t };
@@ -135,6 +135,6 @@ var UiEditorMentionMenuItem_default = /*#__PURE__*/ _plugin_vue_export_helper_de
135
135
  }]]);
136
136
  };
137
137
  }
138
- }), [["__scopeId", "data-v-9ff3165a"]]);
138
+ }), [["__scopeId", "data-v-9537bb4e"]]);
139
139
  //#endregion
140
140
  export { UiEditorMentionMenuItem_default as t };
@@ -495,6 +495,6 @@ var UiEditorTableContextMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_d
495
495
  }]]);
496
496
  };
497
497
  }
498
- }), [["__scopeId", "data-v-3fc801ab"]]);
498
+ }), [["__scopeId", "data-v-08c865b7"]]);
499
499
  //#endregion
500
500
  export { UiEditorTableContextMenu_default as t };
@@ -702,6 +702,6 @@ var UiEditorTableToolbar_default = /*#__PURE__*/ _plugin_vue_export_helper_defau
702
702
  }]]);
703
703
  };
704
704
  }
705
- }), [["__scopeId", "data-v-a0455015"]]);
705
+ }), [["__scopeId", "data-v-1103cb89"]]);
706
706
  //#endregion
707
707
  export { UiEditorTableToolbar_default as t };
@@ -462,6 +462,6 @@ var UiIconButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
462
462
  }]]);
463
463
  };
464
464
  }
465
- }), [["__scopeId", "data-v-d48cf3c9"]]);
465
+ }), [["__scopeId", "data-v-919cca1c"]]);
466
466
  //#endregion
467
467
  export { UiIconButton_default as t };