@threadlabs/looma 0.41.1 → 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 (101) 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-site-header/ui-site-header.html +6 -2
  19. package/components/ui-status-message/ui-status-message.html +1 -1
  20. package/components/ui-switch/ui-switch.html +5 -2
  21. package/components/ui-tabs/ui-tabs.html +3 -3
  22. package/components/ui-text/ui-text.html +2 -2
  23. package/components/ui-tooltip/ui-tooltip.html +8 -10
  24. package/dist/index.js +1 -1
  25. package/docs/README.md +5 -1
  26. package/docs/catalog.json +410 -35
  27. package/docs/customizer-render.mjs +9 -5
  28. package/docs/customizer.js +2 -0
  29. package/docs/fonts.mjs +1 -1
  30. package/docs/theme.mjs +136 -35
  31. package/package.json +1 -1
  32. package/styles/ui-button.css +33 -12
  33. package/styles/ui-callout.css +1 -1
  34. package/styles/ui-card.css +6 -6
  35. package/styles/ui-checkbox.css +1 -1
  36. package/styles/ui-dialog.css +17 -21
  37. package/styles/ui-editor-mention-menu-item.css +1 -1
  38. package/styles/ui-editor-mention-menu.css +1 -1
  39. package/styles/ui-editor-table-context-menu.css +1 -1
  40. package/styles/ui-editor-table-toolbar.css +2 -2
  41. package/styles/ui-icon-button.css +45 -10
  42. package/styles/ui-light-editor.css +2 -2
  43. package/styles/ui-menu-item.css +1 -1
  44. package/styles/ui-menu.css +9 -11
  45. package/styles/ui-popover.css +10 -12
  46. package/styles/ui-radio.css +62 -1
  47. package/styles/ui-section.css +1 -1
  48. package/styles/ui-site-header.css +6 -2
  49. package/styles/ui-status-message.css +1 -1
  50. package/styles/ui-switch.css +5 -2
  51. package/styles/ui-tabs.css +3 -3
  52. package/styles/ui-text.css +2 -2
  53. package/styles/ui-tooltip.css +9 -11
  54. package/theme-system.css +10 -8
  55. package/tokens.css +23 -0
  56. package/vue/UiButton.vue +45 -12
  57. package/vue/UiCallout.vue +1 -1
  58. package/vue/UiCard.vue +7 -13
  59. package/vue/UiCheckbox.vue +1 -1
  60. package/vue/UiDialog.vue +21 -45
  61. package/vue/UiEditorMentionMenu.vue +1 -1
  62. package/vue/UiEditorMentionMenuItem.vue +1 -1
  63. package/vue/UiEditorTableContextMenu.vue +1 -1
  64. package/vue/UiEditorTableToolbar.vue +2 -2
  65. package/vue/UiIconButton.vue +45 -10
  66. package/vue/UiLightEditor.vue +2 -2
  67. package/vue/UiMenu.vue +11 -21
  68. package/vue/UiMenuItem.vue +1 -1
  69. package/vue/UiPopover.vue +12 -22
  70. package/vue/UiRadio.vue +57 -1
  71. package/vue/UiSection.vue +1 -1
  72. package/vue/UiSiteHeader.vue +6 -2
  73. package/vue/UiStatusMessage.vue +1 -1
  74. package/vue/UiSwitch.vue +5 -2
  75. package/vue/UiTabs.vue +3 -3
  76. package/vue/UiText.vue +2 -2
  77. package/vue/UiTooltip.vue +11 -21
  78. package/vue/chunks/UiButton.js +1 -1
  79. package/vue/chunks/UiCallout.js +1 -1
  80. package/vue/chunks/UiCard.js +2 -2
  81. package/vue/chunks/UiCheckbox.js +1 -1
  82. package/vue/chunks/UiDialog.js +1 -1
  83. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  84. package/vue/chunks/UiEditorMentionMenuItem.js +1 -1
  85. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  86. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  87. package/vue/chunks/UiIconButton.js +1 -1
  88. package/vue/chunks/UiLightEditor.js +1 -1
  89. package/vue/chunks/UiMenu.js +1 -1
  90. package/vue/chunks/UiMenuItem.js +1 -1
  91. package/vue/chunks/UiPopover.js +1 -1
  92. package/vue/chunks/UiRadio.js +1 -1
  93. package/vue/chunks/UiSection.js +1 -1
  94. package/vue/chunks/UiSiteHeader.js +1 -1
  95. package/vue/chunks/UiStatusMessage.js +1 -1
  96. package/vue/chunks/UiSwitch.js +1 -1
  97. package/vue/chunks/UiTabs.js +1 -1
  98. package/vue/chunks/UiText.js +1 -1
  99. package/vue/chunks/UiTooltip.js +1 -1
  100. package/vue/components.css +348 -235
  101. package/vue/editor/index.js +1 -1
@@ -197,12 +197,15 @@
197
197
  inset calc(-1 * var(--_ui-action-start)) -1px 0 light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.08))
198
198
  );
199
199
  --_ui-action-shadow: var(--_ui-action-edge), 0 1px 2px light-dark(rgb(0 0 0 / 0.10), rgb(0 0 0 / 0.20));
200
+ --_tone-border: var(--ui-accent-border, var(--ui-accent));
201
+ --_tone-hover-border: var(--ui-accent-hover-border, var(--ui-accent-hover));
202
+ --_tone-active-border: var(--ui-accent-active-border, var(--ui-accent-active));
200
203
  --_tone-highlight: var(--ui-accent-highlight, none);
201
204
  --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
202
205
  --_hue: var(--ui-accent);
203
206
  --_hue-hover: var(--ui-accent-hover);
204
207
  --_hue-active: var(--ui-accent-active);
205
- --_hue-text: var(--ui-accent-active);
208
+ --_hue-text: var(--ui-accent-subtle-text);
206
209
  --_on-hue: var(--ui-on-accent);
207
210
 
208
211
  --_tone: var(--_hue);
@@ -240,9 +243,9 @@
240
243
  min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md));
241
244
  border-style: solid;
242
245
  border-width: var(--ui-border-width);
243
- border-color: var(--ui-button-border, var(--_tone));
246
+ border-color: var(--ui-button-border, var(--_tone-text));
244
247
  border-radius: var(--ui-button-radius, var(--ui-action-radius, var(--ui-radius-md)));
245
- background-color: var(--ui-button-surface, oklch(from var(--_tone) l c h / 5%));
248
+ background-color: var(--ui-button-surface, oklch(from var(--_tone) l c h / calc(5% * var(--ui-tonal-opacity, 1))));
246
249
  color: var(--ui-button-text, var(--_tone-text));
247
250
  font: inherit;
248
251
  font-weight: var(--ui-font-medium);
@@ -385,8 +388,8 @@
385
388
  /* A link is never :enabled, so interactive states test "not unavailable" instead: for a button that
386
389
  is exactly :enabled, at the same specificity, and it also matches a link that can be followed. */
387
390
  :host:hover:not(:disabled, [aria-disabled="true"]) {
388
- border-color: var(--ui-button-hover-border, var(--_tone-hover));
389
- background-color: var(--ui-button-hover-surface, oklch(from var(--_tone) l c h / 12%));
391
+ border-color: var(--ui-button-hover-border, var(--_tone-text));
392
+ background-color: var(--ui-button-hover-surface, oklch(from var(--_tone) l c h / calc(12% * var(--ui-tonal-opacity, 1))));
390
393
  }
391
394
 
392
395
  :host[data-appearance="card"][data-tone="neutral"] {
@@ -406,13 +409,13 @@
406
409
  /* Pressed reads as pressed in: the highlight goes, and the shadow moves inside. */
407
410
  :host:active:not(:disabled, [aria-disabled="true"]) {
408
411
  scale: var(--ui-press-scale, 1);
409
- background-color: var(--ui-button-active-surface, oklch(from var(--_tone) l c h / 18%));
412
+ background-color: var(--ui-button-active-surface, oklch(from var(--_tone) l c h / calc(18% * var(--ui-tonal-opacity, 1))));
410
413
  background-image: none;
411
414
  box-shadow: var(--ui-pressed);
412
415
  }
413
416
 
414
417
  :host[data-appearance="solid"], :host[data-appearance="danger"] {
415
- border-color: var(--_tone);
418
+ border-color: var(--ui-button-border, var(--_tone-border));
416
419
  background-color: var(--_tone);
417
420
  color: var(--_on-tone);
418
421
  background-image: var(--_tone-highlight);
@@ -421,14 +424,15 @@
421
424
  var(--_tone-glow);
422
425
  }
423
426
 
424
- :is(:host[data-appearance="solid"], :host[data-appearance="danger"]):hover:not(:disabled, [aria-disabled="true"]) {
427
+ :host[data-appearance="solid"]:hover:not(:disabled, [aria-disabled="true"]),
428
+ :host[data-appearance="danger"]:hover:not(:disabled, [aria-disabled="true"]) {
425
429
  background-color: var(--_tone-hover);
426
- border-color: var(--_tone-hover);
430
+ border-color: var(--ui-button-hover-border, var(--_tone-hover-border));
427
431
  }
428
432
 
429
433
  :is(:host[data-appearance="solid"], :host[data-appearance="danger"]):active:not(:disabled, [aria-disabled="true"]) {
430
434
  background-color: var(--_tone-active);
431
- border-color: var(--_tone-active);
435
+ border-color: var(--_tone-active-border);
432
436
  background-image: none;
433
437
  box-shadow: var(--ui-pressed);
434
438
  }
@@ -436,6 +440,9 @@
436
440
  /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
437
441
  destructive secondary action, not a special case. */
438
442
  :host[data-tone="neutral"] {
443
+ --_tone-border: var(--ui-neutral-border, var(--ui-neutral-surface));
444
+ --_tone-hover-border: var(--ui-neutral-hover-border, var(--ui-neutral-hover));
445
+ --_tone-active-border: var(--ui-neutral-active-border, var(--ui-neutral-active));
439
446
  --_tone-highlight: var(--ui-neutral-highlight, none);
440
447
  --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
441
448
  --_hue: var(--ui-text);
@@ -446,7 +453,7 @@
446
453
  }
447
454
 
448
455
  :host[data-tone="neutral"][data-appearance="solid"] {
449
- border-color: var(--ui-button-border, var(--ui-control-border));
456
+ border-color: var(--ui-button-border, var(--_tone-border));
450
457
  background-color: var(--ui-button-surface, var(--ui-neutral-surface));
451
458
  color: var(--ui-button-text, var(--ui-text));
452
459
  }
@@ -463,13 +470,18 @@
463
470
  background-color: var(--ui-button-active-surface, var(--ui-neutral-active));
464
471
  }
465
472
  :host[data-tone="neutral"][data-appearance="solid"]:hover:not(:disabled, [aria-disabled="true"]) {
473
+ border-color: var(--ui-button-hover-border, var(--_tone-hover-border));
466
474
  background-color: var(--ui-button-hover-surface, var(--ui-neutral-hover));
467
475
  }
468
476
  :host[data-tone="neutral"][data-appearance="solid"]:active:not(:disabled, [aria-disabled="true"]) {
477
+ border-color: var(--_tone-active-border);
469
478
  background-color: var(--ui-button-active-surface, var(--ui-neutral-active));
470
479
  }
471
480
 
472
481
  :host[data-tone="danger"], :host[data-appearance="danger"] {
482
+ --_tone-border: var(--ui-danger-border, var(--ui-danger));
483
+ --_tone-hover-border: var(--ui-danger-hover-border, var(--ui-danger-hover));
484
+ --_tone-active-border: var(--ui-danger-active-border, var(--ui-danger-active));
473
485
  --_tone-highlight: var(--ui-danger-highlight, none);
474
486
  --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
475
487
  --_hue: var(--ui-danger);
@@ -480,6 +492,9 @@
480
492
  }
481
493
 
482
494
  :host[data-tone="success"] {
495
+ --_tone-border: var(--ui-success-border, var(--ui-success));
496
+ --_tone-hover-border: var(--ui-success-hover-border, var(--ui-success-hover));
497
+ --_tone-active-border: var(--ui-success-active-border, var(--ui-success-active));
483
498
  --_tone-highlight: var(--ui-success-highlight, none);
484
499
  --_tone-glow: var(--ui-success-glow, 0 0 transparent);
485
500
  --_hue: var(--ui-success);
@@ -490,6 +505,9 @@
490
505
  }
491
506
 
492
507
  :host[data-tone="warning"] {
508
+ --_tone-border: var(--ui-warning-border, var(--ui-warning));
509
+ --_tone-hover-border: var(--ui-warning-hover-border, var(--ui-warning-hover));
510
+ --_tone-active-border: var(--ui-warning-active-border, var(--ui-warning-active));
493
511
  --_tone-highlight: var(--ui-warning-highlight, none);
494
512
  --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
495
513
  --_hue: var(--ui-warning);
@@ -500,6 +518,9 @@
500
518
  }
501
519
 
502
520
  :host[data-tone="info"] {
521
+ --_tone-border: var(--ui-info-border, var(--ui-info));
522
+ --_tone-hover-border: var(--ui-info-hover-border, var(--ui-info-hover));
523
+ --_tone-active-border: var(--ui-info-active-border, var(--ui-info-active));
503
524
  --_tone-highlight: var(--ui-info-highlight, none);
504
525
  --_tone-glow: var(--ui-info-glow, 0 0 transparent);
505
526
  --_hue: var(--ui-info);
@@ -545,7 +566,7 @@
545
566
 
546
567
  /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
547
568
  :host[data-appearance="ghost"]:hover:not(:disabled, [aria-disabled="true"]) {
548
- background-color: var(--ui-button-ghost-hover-surface, oklch(from var(--_tone) l c h / 10%));
569
+ background-color: var(--ui-button-ghost-hover-surface, oklch(from var(--_tone) l c h / calc(10% * var(--ui-tonal-opacity, 1))));
549
570
  border-color: transparent;
550
571
  }
551
572
 
@@ -1,7 +1,7 @@
1
- // Loading actions retain focus but cannot activate, navigate, submit, or notify click consumers.
1
+ // Disabled or loading actions cannot activate, navigate, submit, or notify click consumers.
2
2
  export function connect(host) {
3
3
  const onClick = (event) => {
4
- if (!host.props.loading.value && !host.props.pending.value) return;
4
+ if (!host.props.disabled.value && !host.props.loading.value && !host.props.pending.value) return;
5
5
  event.preventDefault();
6
6
  event.stopImmediatePropagation();
7
7
  };
@@ -216,7 +216,7 @@
216
216
 
217
217
  /* A link in the callout's text is underlined, so it reads as a link by more than colour. */
218
218
  .content :slotted(a) {
219
- color: var(--ui-accent-active);
219
+ color: var(--ui-accent-subtle-text);
220
220
  text-decoration: underline;
221
221
  text-decoration-thickness: 0.06em;
222
222
  text-underline-offset: 0.18em;
@@ -7,7 +7,7 @@
7
7
  elevated adds a subtle lift above the page, for a view's one card, such as sign-in. Treatment independently controls decorative material.</prop>
8
8
  <prop name="treatment" type="keyword" values="standard, expressive" default="standard"
9
9
  >How much of the theme's decorative material the surface expresses. standard preserves its restrained treatment; expressive uses the full material
10
- treatment. This does not add elevation or require glass.</prop>
10
+ 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.</prop>
11
11
  <prop name="padding" type="keyword" values="xs, sm, md, lg" default="md"
12
12
  >The space inside the card: xs is compact (0.5rem), sm is snug (0.75rem), md is the default (1.5rem), and lg is roomy (2rem).</prop>
13
13
  <prop name="tone" type="keyword" values="neutral, accent, info, success, warning, danger" default="neutral"
@@ -68,9 +68,9 @@
68
68
  }
69
69
 
70
70
  :host([treatment="expressive"]) {
71
- --_ui-panel-glass: calc(clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4));
71
+ --_ui-panel-glass: clamp(0, var(--ui-glassiness, 0), 1);
72
72
  --_ui-panel-separation: clamp(0, var(--ui-surface-separation, 0), 1);
73
- --_ui-panel-rim: calc((var(--_ui-panel-separation) + var(--_ui-panel-glass) * 0.25) * 0.65 * 8px);
73
+ --_ui-panel-rim: calc(var(--_ui-panel-separation) * 8px);
74
74
  border-width: calc(var(--ui-border-width) + var(--_ui-panel-rim));
75
75
  border-color: transparent;
76
76
  background:
@@ -82,8 +82,8 @@
82
82
  var(--_ui-card-elevation),
83
83
  var(--ui-material-glow, 0 0 transparent),
84
84
  inset 0 0 0 var(--ui-border-width) var(--ui-material-edge, var(--ui-border-strong));
85
- backdrop-filter: blur(calc(var(--_ui-panel-glass) * 0.65 * 18px)) saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
86
- -webkit-backdrop-filter: blur(calc(var(--_ui-panel-glass) * 0.65 * 18px)) saturate(calc(1 + var(--_ui-panel-glass) * 0.65 * 0.18));
85
+ -webkit-backdrop-filter: blur(calc(var(--_ui-panel-glass) * 32px));
86
+ backdrop-filter: blur(calc(var(--_ui-panel-glass) * 32px));
87
87
  }
88
88
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
89
89
  :host([treatment="expressive"]) {
@@ -95,8 +95,8 @@
95
95
  background: var(--_ui-card-surface);
96
96
  border-width: var(--ui-border-width);
97
97
  border-color: var(--ui-border-strong);
98
- backdrop-filter: none;
99
98
  -webkit-backdrop-filter: none;
99
+ backdrop-filter: none;
100
100
  }
101
101
  }
102
102
  @media (forced-colors: active) {
@@ -105,8 +105,8 @@
105
105
  color: CanvasText;
106
106
  border: var(--ui-border-width) solid CanvasText;
107
107
  box-shadow: none;
108
- backdrop-filter: none;
109
108
  -webkit-backdrop-filter: none;
109
+ backdrop-filter: none;
110
110
  }
111
111
  }
112
112
 
@@ -153,7 +153,7 @@
153
153
  border-color: var(--ui-accent-solid);
154
154
  background-color: var(--ui-accent-solid);
155
155
  background-image: var(--ui-accent-highlight, none);
156
- box-shadow: var(--ui-control-inset);
156
+ box-shadow: none;
157
157
  }
158
158
 
159
159
  /* The SVG's painted bounds are centred in its viewBox, including its round stroke.
@@ -112,12 +112,12 @@
112
112
  }
113
113
 
114
114
  /* Purpose and measured size shape one shared separation lever. The content plane stays opaque;
115
- transparency, saturation and edge light belong to the surrounding decorative material. */
115
+ transparency, frosting and edge light belong to the surrounding decorative material. */
116
116
  :host {
117
- --_ui-material-glassiness: calc(clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4));
117
+ --_ui-material-glassiness: clamp(0, var(--ui-glassiness, 0), 1);
118
118
  --_ui-material-separation: clamp(0, var(--ui-surface-separation, 0), 1);
119
- --_ui-material-active: clamp(0, calc((var(--_ui-material-glassiness) + var(--_ui-material-separation)) * 100000), 1);
120
- --_ui-material-rim: calc((var(--_ui-material-separation) + var(--_ui-material-glassiness) * 0.25) * var(--_ui-material-scale, 1) * 8px);
119
+ --_ui-material-active: clamp(0, calc(var(--_ui-material-separation) * 100000), 1);
120
+ --_ui-material-rim: calc(var(--_ui-material-separation) * var(--_ui-material-scale, 1) * 8px);
121
121
  --_ui-material-content-color: var(--ui-dialog-surface, var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated))));
122
122
  --_ui-material-rim-color: color-mix(in srgb, var(--ui-material-glass, var(--ui-surface-elevated)) calc(var(--_ui-material-active) * 100%), transparent);
123
123
  background:
@@ -142,10 +142,8 @@
142
142
  var(--ui-elevation-dialog, var(--ui-shadow-xl))
143
143
  )
144
144
  );
145
- backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 1) * 18px))
146
- saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 1) * 0.18));
147
- -webkit-backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 1) * 18px))
148
- saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 1) * 0.18));
145
+ -webkit-backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 1) * 32px));
146
+ backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 1) * 32px));
149
147
  }
150
148
 
151
149
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
@@ -157,8 +155,8 @@
157
155
  @media (prefers-reduced-transparency: reduce) {
158
156
  :host {
159
157
  background: var(--_ui-material-content-color);
160
- backdrop-filter: none;
161
158
  -webkit-backdrop-filter: none;
159
+ backdrop-filter: none;
162
160
  }
163
161
  }
164
162
 
@@ -167,8 +165,8 @@
167
165
  background: Canvas;
168
166
  border-color: CanvasText;
169
167
  box-shadow: none;
170
- backdrop-filter: none;
171
168
  -webkit-backdrop-filter: none;
169
+ backdrop-filter: none;
172
170
  }
173
171
  }
174
172
 
@@ -147,7 +147,7 @@
147
147
  width: 32px;
148
148
  height: 32px;
149
149
  flex: 0 0 auto;
150
- color: var(--ui-accent-active, var(--ui-accent-solid));
150
+ color: var(--ui-accent-subtle-text);
151
151
  background: var(--ui-accent-soft, var(--ui-accent-subtle));
152
152
  border-radius: var(--ui-radius-round);
153
153
  font-size: var(--ui-font-size-xs);
@@ -44,7 +44,7 @@
44
44
  inline-size: 32px;
45
45
  block-size: 32px;
46
46
  flex: 0 0 auto;
47
- color: var(--ui-accent-active);
47
+ color: var(--ui-accent-subtle-text);
48
48
  background: var(--ui-accent-soft);
49
49
  border-radius: var(--ui-radius-round);
50
50
  font-size: var(--ui-font-size-xs);
@@ -141,7 +141,7 @@
141
141
  }
142
142
 
143
143
  :host button.danger {
144
- color: var(--ui-danger);
144
+ color: var(--ui-danger-subtle-text);
145
145
  }
146
146
 
147
147
  /* Swatches wrap like words: the row asks for the menu's full width, and a narrower menu fits fewer. */
@@ -193,7 +193,7 @@
193
193
 
194
194
  :host button.active {
195
195
  background: var(--ui-accent-soft, var(--ui-accent-subtle));
196
- color: var(--ui-accent-active);
196
+ color: var(--ui-accent-subtle-text);
197
197
  }
198
198
 
199
199
  .group button {
@@ -210,7 +210,7 @@
210
210
  }
211
211
 
212
212
  :host button.danger {
213
- color: var(--ui-danger);
213
+ color: var(--ui-danger-subtle-text);
214
214
  }
215
215
 
216
216
  :host {
@@ -133,6 +133,10 @@
133
133
  /* Optional inherited action-group values keep text and icon actions under the same light.
134
134
  One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
135
135
  The shared theme supplies reflections and glow independently of the resting lift. */
136
+ --_solid-border: var(--ui-accent-border, var(--ui-accent-solid));
137
+ --_solid-hover-border: var(--ui-accent-hover-border, var(--ui-accent-hover));
138
+ --_solid-active-border: var(--ui-accent-active-border, var(--ui-accent-active));
139
+ --_solid-active-surface: var(--ui-accent-active, var(--ui-accent-hover));
136
140
  --_tone-highlight: var(--ui-accent-highlight, none);
137
141
  --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
138
142
  --_ui-action-start: 1px;
@@ -155,20 +159,28 @@
155
159
  }
156
160
 
157
161
  :host[data-tone="accent"] {
162
+ --_solid-border: var(--ui-accent-border, var(--ui-accent));
163
+ --_solid-hover-border: var(--ui-accent-hover-border, var(--ui-accent-hover));
164
+ --_solid-active-border: var(--ui-accent-active-border, var(--ui-accent-active));
165
+ --_solid-active-surface: var(--ui-accent-active, var(--ui-accent-hover));
158
166
  --_tone-highlight: var(--ui-accent-highlight, none);
159
167
  --_tone-glow: var(--ui-accent-glow, 0 0 transparent);
160
- --_icon-button-border: var(--ui-accent-solid);
161
- --_icon-button-hover-border: var(--ui-accent-hover);
168
+ --_icon-button-border: var(--ui-accent-subtle-text);
169
+ --_icon-button-hover-border: var(--ui-accent-subtle-text);
162
170
  --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
163
171
  --_icon-button-outline-surface: color-mix(in srgb, var(--ui-accent-solid) 5%, var(--ui-surface-default));
164
172
  color: var(--_icon-button-text);
165
173
  }
166
174
 
167
175
  :host[data-tone="danger"] {
176
+ --_solid-border: var(--ui-danger-border, var(--ui-danger));
177
+ --_solid-hover-border: var(--ui-danger-hover-border, var(--ui-danger-hover));
178
+ --_solid-active-border: var(--ui-danger-active-border, var(--ui-danger-active));
179
+ --_solid-active-surface: var(--ui-danger-active, var(--ui-danger-hover));
168
180
  --_tone-highlight: var(--ui-danger-highlight, none);
169
181
  --_tone-glow: var(--ui-danger-glow, 0 0 transparent);
170
- --_icon-button-border: var(--ui-danger);
171
- --_icon-button-hover-border: var(--ui-danger-hover);
182
+ --_icon-button-border: var(--ui-danger-subtle-text);
183
+ --_icon-button-hover-border: var(--ui-danger-subtle-text);
172
184
  --_icon-button-text: var(--ui-danger-subtle-text);
173
185
  --_icon-button-outline-surface: color-mix(in srgb, var(--ui-danger) 5%, var(--ui-surface-default));
174
186
  --_icon-button-solid-surface: var(--ui-danger);
@@ -178,10 +190,14 @@
178
190
  }
179
191
 
180
192
  :host[data-tone="success"] {
193
+ --_solid-border: var(--ui-success-border, var(--ui-success));
194
+ --_solid-hover-border: var(--ui-success-hover-border, var(--ui-success-hover));
195
+ --_solid-active-border: var(--ui-success-active-border, var(--ui-success-active));
196
+ --_solid-active-surface: var(--ui-success-active, var(--ui-success-hover));
181
197
  --_tone-highlight: var(--ui-success-highlight, none);
182
198
  --_tone-glow: var(--ui-success-glow, 0 0 transparent);
183
- --_icon-button-border: var(--ui-success);
184
- --_icon-button-hover-border: var(--ui-success-hover);
199
+ --_icon-button-border: var(--ui-success-subtle-text);
200
+ --_icon-button-hover-border: var(--ui-success-subtle-text);
185
201
  --_icon-button-text: var(--ui-success-subtle-text);
186
202
  --_icon-button-outline-surface: color-mix(in srgb, var(--ui-success) 5%, var(--ui-surface-default));
187
203
  --_icon-button-solid-surface: var(--ui-success);
@@ -191,10 +207,14 @@
191
207
  }
192
208
 
193
209
  :host[data-tone="warning"] {
210
+ --_solid-border: var(--ui-warning-border, var(--ui-warning));
211
+ --_solid-hover-border: var(--ui-warning-hover-border, var(--ui-warning-hover));
212
+ --_solid-active-border: var(--ui-warning-active-border, var(--ui-warning-active));
213
+ --_solid-active-surface: var(--ui-warning-active, var(--ui-warning-hover));
194
214
  --_tone-highlight: var(--ui-warning-highlight, none);
195
215
  --_tone-glow: var(--ui-warning-glow, 0 0 transparent);
196
- --_icon-button-border: var(--ui-warning);
197
- --_icon-button-hover-border: var(--ui-warning-hover);
216
+ --_icon-button-border: var(--ui-warning-subtle-text);
217
+ --_icon-button-hover-border: var(--ui-warning-subtle-text);
198
218
  --_icon-button-text: var(--ui-warning-subtle-text);
199
219
  --_icon-button-outline-surface: color-mix(in srgb, var(--ui-warning) 5%, var(--ui-surface-default));
200
220
  --_icon-button-solid-surface: var(--ui-warning);
@@ -204,10 +224,14 @@
204
224
  }
205
225
 
206
226
  :host[data-tone="info"] {
227
+ --_solid-border: var(--ui-info-border, var(--ui-info));
228
+ --_solid-hover-border: var(--ui-info-hover-border, var(--ui-info-hover));
229
+ --_solid-active-border: var(--ui-info-active-border, var(--ui-info-active));
230
+ --_solid-active-surface: var(--ui-info-active, var(--ui-info-hover));
207
231
  --_tone-highlight: var(--ui-info-highlight, none);
208
232
  --_tone-glow: var(--ui-info-glow, 0 0 transparent);
209
- --_icon-button-border: var(--ui-info);
210
- --_icon-button-hover-border: var(--ui-info-hover);
233
+ --_icon-button-border: var(--ui-info-subtle-text);
234
+ --_icon-button-hover-border: var(--ui-info-subtle-text);
211
235
  --_icon-button-text: var(--ui-info-subtle-text);
212
236
  --_icon-button-outline-surface: color-mix(in srgb, var(--ui-info) 5%, var(--ui-surface-default));
213
237
  --_icon-button-solid-surface: var(--ui-info);
@@ -218,6 +242,10 @@
218
242
 
219
243
  /* Neutral actions share the same quiet surface and border roles as fields. */
220
244
  :host[data-tone="neutral"] {
245
+ --_solid-border: var(--ui-neutral-border, var(--ui-neutral-surface));
246
+ --_solid-hover-border: var(--ui-neutral-hover-border, var(--ui-neutral-hover));
247
+ --_solid-active-border: var(--ui-neutral-active-border, var(--ui-neutral-active));
248
+ --_solid-active-surface: var(--ui-neutral-active, var(--ui-neutral-hover));
221
249
  --_tone-highlight: var(--ui-neutral-highlight, none);
222
250
  --_tone-glow: var(--ui-neutral-glow, 0 0 transparent);
223
251
  --_icon-button-outline-surface: transparent;
@@ -394,6 +422,7 @@
394
422
  }
395
423
 
396
424
  :host[data-appearance="solid"] {
425
+ border-color: var(--ui-icon-button-border, var(--_solid-border));
397
426
  background-color: var(--ui-icon-button-solid-surface, var(--_icon-button-solid-surface, var(--ui-accent-solid)));
398
427
  background-image: var(--_tone-highlight);
399
428
  color: var(--ui-icon-button-solid-text, var(--_icon-button-solid-text, var(--ui-text-on-accent)));
@@ -419,6 +448,7 @@
419
448
  }
420
449
 
421
450
  :host[data-appearance="solid"]:hover:enabled:not([aria-disabled="true"]) {
451
+ border-color: var(--ui-icon-button-hover-border, var(--_solid-hover-border));
422
452
  background-color: var(--ui-icon-button-solid-hover-surface, var(--_icon-button-solid-hover-surface, var(--ui-accent-hover)));
423
453
  }
424
454
 
@@ -480,6 +510,11 @@
480
510
  var(--ui-focus-halo);
481
511
  }
482
512
 
513
+ :host[data-appearance="solid"]:active:enabled:not([aria-disabled="true"]) {
514
+ background-color: var(--ui-icon-button-active-surface, var(--_solid-active-surface));
515
+ border-color: var(--_solid-active-border);
516
+ }
517
+
483
518
  :host:is(:host[data-appearance="outline"], :host[data-appearance="solid"]):active:enabled:not([aria-disabled="true"]) {
484
519
  background-image: none;
485
520
  box-shadow: var(--ui-pressed);
@@ -117,7 +117,7 @@
117
117
  position: relative;
118
118
  z-index: 1;
119
119
  display: inline-flex !important;
120
- color: var(--ui-accent);
120
+ color: var(--ui-accent-subtle-text);
121
121
  font-size: var(--ui-font-size-lg);
122
122
  }
123
123
  .source::after {
@@ -127,12 +127,12 @@
127
127
  }
128
128
 
129
129
  /* Purpose and measured size shape one shared separation lever. The content plane stays opaque;
130
- transparency, saturation and edge light belong to the surrounding decorative material. */
130
+ transparency, frosting and edge light belong to the surrounding decorative material. */
131
131
  :host:not([inline]) .surface {
132
- --_ui-material-glassiness: calc(clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4));
132
+ --_ui-material-glassiness: clamp(0, var(--ui-glassiness, 0), 1);
133
133
  --_ui-material-separation: clamp(0, var(--ui-surface-separation, 0), 1);
134
- --_ui-material-active: clamp(0, calc((var(--_ui-material-glassiness) + var(--_ui-material-separation)) * 100000), 1);
135
- --_ui-material-rim: calc((var(--_ui-material-separation) + var(--_ui-material-glassiness) * 0.25) * var(--_ui-material-scale, 0.28) * 8px);
134
+ --_ui-material-active: clamp(0, calc(var(--_ui-material-separation) * 100000), 1);
135
+ --_ui-material-rim: calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.28) * 8px);
136
136
  --_ui-material-content-color: var(--_ui-menu-surface, var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated))));
137
137
  --_ui-material-rim-color: color-mix(in srgb, var(--ui-material-glass, var(--ui-surface-elevated)) calc(var(--_ui-material-active) * 100%), transparent);
138
138
  background:
@@ -157,10 +157,8 @@
157
157
  var(--ui-elevation-overlay, var(--ui-shadow-lg))
158
158
  )
159
159
  );
160
- backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 18px))
161
- saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 0.18));
162
- -webkit-backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 18px))
163
- saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 0.18));
160
+ -webkit-backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 32px));
161
+ backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.28) * 32px));
164
162
  }
165
163
 
166
164
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
@@ -172,8 +170,8 @@
172
170
  @media (prefers-reduced-transparency: reduce) {
173
171
  :host:not([inline]) .surface {
174
172
  background: var(--_ui-material-content-color);
175
- backdrop-filter: none;
176
173
  -webkit-backdrop-filter: none;
174
+ backdrop-filter: none;
177
175
  }
178
176
  }
179
177
 
@@ -182,8 +180,8 @@
182
180
  background: Canvas;
183
181
  border-color: CanvasText;
184
182
  box-shadow: none;
185
- backdrop-filter: none;
186
183
  -webkit-backdrop-filter: none;
184
+ backdrop-filter: none;
187
185
  }
188
186
  }
189
187
 
@@ -114,7 +114,7 @@
114
114
  }
115
115
 
116
116
  :host([tone="danger"]) {
117
- color: var(--ui-danger);
117
+ color: var(--ui-danger-subtle-text);
118
118
  }
119
119
 
120
120
  .label {
@@ -98,12 +98,12 @@
98
98
  }
99
99
 
100
100
  /* Purpose and measured size shape one shared separation lever. The content plane stays opaque;
101
- transparency, saturation and edge light belong to the surrounding decorative material. */
101
+ transparency, frosting and edge light belong to the surrounding decorative material. */
102
102
  .surface {
103
- --_ui-material-glassiness: calc(clamp(0, var(--ui-glassiness, 0), 1) + 2 * pow(clamp(0, var(--ui-glassiness, 0), 1), 4));
103
+ --_ui-material-glassiness: clamp(0, var(--ui-glassiness, 0), 1);
104
104
  --_ui-material-separation: clamp(0, var(--ui-surface-separation, 0), 1);
105
- --_ui-material-active: clamp(0, calc((var(--_ui-material-glassiness) + var(--_ui-material-separation)) * 100000), 1);
106
- --_ui-material-rim: calc((var(--_ui-material-separation) + var(--_ui-material-glassiness) * 0.25) * var(--_ui-material-scale, 0.55) * 8px);
105
+ --_ui-material-active: clamp(0, calc(var(--_ui-material-separation) * 100000), 1);
106
+ --_ui-material-rim: calc(var(--_ui-material-separation) * var(--_ui-material-scale, 0.55) * 8px);
107
107
  --_ui-material-content-color: var(--_ui-popover-surface, var(--ui-material-content, var(--ui-overlay-surface, var(--ui-surface-elevated))));
108
108
  --_ui-material-rim-color: color-mix(in srgb, var(--ui-material-glass, var(--ui-surface-elevated)) calc(var(--_ui-material-active) * 100%), transparent);
109
109
  background:
@@ -128,10 +128,8 @@
128
128
  var(--ui-elevation-overlay, var(--ui-shadow-lg))
129
129
  )
130
130
  );
131
- backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 18px))
132
- saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 0.18));
133
- -webkit-backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 18px))
134
- saturate(calc(1 + var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 0.18));
131
+ -webkit-backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 32px));
132
+ backdrop-filter: blur(calc(var(--_ui-material-glassiness) * var(--_ui-material-scale, 0.55) * 32px));
135
133
  }
136
134
 
137
135
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
@@ -143,8 +141,8 @@
143
141
  @media (prefers-reduced-transparency: reduce) {
144
142
  .surface {
145
143
  background: var(--_ui-material-content-color);
146
- backdrop-filter: none;
147
144
  -webkit-backdrop-filter: none;
145
+ backdrop-filter: none;
148
146
  }
149
147
  }
150
148
 
@@ -153,8 +151,8 @@
153
151
  background: Canvas;
154
152
  border-color: CanvasText;
155
153
  box-shadow: none;
156
- backdrop-filter: none;
157
154
  -webkit-backdrop-filter: none;
155
+ backdrop-filter: none;
158
156
  }
159
157
  }
160
158
 
@@ -165,8 +163,8 @@
165
163
  border: 0;
166
164
  background: transparent;
167
165
  box-shadow: none;
168
- backdrop-filter: none;
169
166
  -webkit-backdrop-filter: none;
167
+ backdrop-filter: none;
170
168
  }
171
169
 
172
170
  :host(:not(:state(internalOpen))) {