@vonage/vivid 5.28.1 → 5.29.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 (86) hide show
  1. package/bundled/definition17.cjs +1 -1
  2. package/bundled/definition17.js +1 -1
  3. package/bundled/definition18.cjs +1 -1
  4. package/bundled/definition18.js +1 -1
  5. package/bundled/definition25.cjs +4 -4
  6. package/bundled/definition25.js +4 -4
  7. package/bundled/definition5.cjs +1 -1
  8. package/bundled/definition5.js +1 -1
  9. package/bundled/numberConverter.cjs +1 -1
  10. package/bundled/numberConverter.js +1 -1
  11. package/bundled/picker-field.template.cjs +5 -3
  12. package/bundled/picker-field.template.js +20 -17
  13. package/bundled/vivid-element.cjs +1 -1
  14. package/bundled/vivid-element.js +1 -1
  15. package/color-picker/index.cjs +1 -1
  16. package/color-picker/index.js +1 -1
  17. package/custom-elements.json +508 -334
  18. package/empty-state/index.cjs +2 -2
  19. package/empty-state/index.js +3 -3
  20. package/lib/date-picker/date-picker.d.ts +4 -0
  21. package/lib/date-range-picker/date-range-picker.d.ts +2 -0
  22. package/lib/date-time-picker/date-time-picker.d.ts +4 -0
  23. package/lib/empty-state/definition.d.ts +1 -1
  24. package/lib/empty-state/empty-state.d.ts +3 -1
  25. package/lib/number-field/definition.d.ts +1 -1
  26. package/lib/number-field/number-field.d.ts +3 -1
  27. package/lib/rich-text-editor/rte/features/suggest.d.ts +7 -1
  28. package/lib/time-picker/time-picker.d.ts +2 -0
  29. package/listbox/index.cjs +1 -1
  30. package/listbox/index.js +1 -1
  31. package/locales/de-DE.cjs +1 -1
  32. package/locales/de-DE.js +1 -1
  33. package/locales/en-GB.cjs +1 -1
  34. package/locales/en-GB.js +1 -1
  35. package/locales/ja-JP.cjs +1 -1
  36. package/locales/ja-JP.js +1 -1
  37. package/locales/zh-CN.cjs +1 -1
  38. package/locales/zh-CN.js +1 -1
  39. package/number-field/index.cjs +16 -14
  40. package/number-field/index.js +49 -31
  41. package/package.json +16 -16
  42. package/rich-text-editor/index.cjs +14 -14
  43. package/rich-text-editor/index.js +1818 -1789
  44. package/shared/picker-field/mixins/calendar-picker.d.ts +1 -0
  45. package/shared/picker-field/mixins/calendar-picker.template.d.ts +1 -0
  46. package/shared/picker-field/mixins/min-max-calendar-picker.d.ts +1 -0
  47. package/shared/picker-field/mixins/single-date-picker.d.ts +1 -0
  48. package/shared/picker-field/mixins/single-value-picker.d.ts +1 -0
  49. package/shared/picker-field/mixins/time-selection-picker.d.ts +1 -0
  50. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +2 -0
  51. package/shared/picker-field/picker-field.d.ts +38 -31
  52. package/tabs/index.cjs +1 -1
  53. package/tabs/index.js +1 -1
  54. package/unbundled/definition16.cjs +1 -1
  55. package/unbundled/definition16.js +1 -1
  56. package/unbundled/definition2.cjs +4 -4
  57. package/unbundled/definition2.js +4 -4
  58. package/unbundled/definition28.cjs +5 -1
  59. package/unbundled/definition28.js +5 -1
  60. package/unbundled/definition29.cjs +1 -1
  61. package/unbundled/definition29.js +1 -1
  62. package/unbundled/definition30.cjs +1 -1
  63. package/unbundled/definition30.js +1 -1
  64. package/unbundled/definition42.cjs +3 -2
  65. package/unbundled/definition42.js +3 -2
  66. package/unbundled/definition50.cjs +1 -1
  67. package/unbundled/definition50.js +1 -1
  68. package/unbundled/definition55.cjs +41 -8
  69. package/unbundled/definition55.js +41 -8
  70. package/unbundled/definition6.cjs +1 -1
  71. package/unbundled/definition6.js +1 -1
  72. package/unbundled/definition63.cjs +43 -19
  73. package/unbundled/definition63.js +38 -14
  74. package/unbundled/definition76.cjs +1 -1
  75. package/unbundled/definition76.js +1 -1
  76. package/unbundled/en-US.cjs +1 -1
  77. package/unbundled/en-US.js +1 -1
  78. package/unbundled/numberConverter.cjs +1 -1
  79. package/unbundled/numberConverter.js +1 -1
  80. package/unbundled/picker-field.template.cjs +6 -1
  81. package/unbundled/picker-field.template.js +6 -1
  82. package/unbundled/vivid-element.cjs +1 -1
  83. package/unbundled/vivid-element.js +1 -1
  84. package/video-player/index.cjs +1 -1
  85. package/video-player/index.js +1 -1
  86. package/vivid.api.json +158 -3
@@ -21,7 +21,7 @@ const require_definition$4 = require("./definition36.cjs");
21
21
  let _microsoft_fast_element = require("@microsoft/fast-element");
22
22
  let _microsoft_fast_web_utilities = require("@microsoft/fast-web-utilities");
23
23
  //#region src/lib/number-field/number-field.scss?inline
24
- var number_field_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}:host{display:inline-block}.base{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_text-field-border-radius:8px;--_text-field-pill-border-radius:24px;grid-template-columns:min-content 1fr max-content;align-items:center;gap:4px;width:100%;display:inline-grid}.base.size-condensed{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8)) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_text-field-border-radius:4px}.base{user-select:none}.base:not(.disabled){--_low-ink-color:var(--vvd-color-neutral-600)}.base.disabled{--_low-ink-color:var(--_appearance-color-text)}.label:not(slot),.label::slotted(label){font:var(--vvd-typography-base);grid-area:1/1/auto/4;box-sizing:initial!important;padding:initial!important;margin:initial!important;color:var(--vvd-color-canvas-text)!important}.char-count+.label:not(slot),.char-count+.label::slotted(label){grid-column:1/3}.char-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.label-wrapper{grid-area:1/1/auto/4}.char-count+.label-wrapper{grid-column:1/3}.fieldset{background-color:var(--_appearance-color-fill);font:var(--vvd-typography-base);grid-column:1/4;align-items:center;padding-block:0;transition:color .2s,background-color .2s;display:flex;position:relative}.fieldset:after{border-radius:inherit;block-size:100%;box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);content:\"\";pointer-events:none;inline-size:100%;transition:box-shadow .2s;display:block;position:absolute}.fieldset:focus-visible{outline:none}.base>.fieldset{block-size:var(--_text-field-block-size)}.base:not(.shape-pill) .fieldset{border-radius:var(--_text-field-border-radius)}.base.shape-pill .fieldset{border-radius:var(--_text-field-pill-border-radius)}.wrapper{border-radius:inherit;block-size:100%;inline-size:100%}.control{border-radius:inherit;text-align:start}.control:not(slot),.control::slotted(input){font:inherit;text-align:inherit;outline:#0000;box-sizing:border-box!important;border-radius:inherit!important;width:100%!important;margin:initial!important;appearance:none!important;block-size:100%!important;color:inherit!important;padding-block:0!important;padding-inline:var(--_text-field-gutter-start) var(--_text-field-gutter-end)!important;background-color:#0000!important;border:0!important}.control:not(slot,:focus),.control::slotted(input:not(:focus)){text-overflow:ellipsis!important}.control:not(slot):disabled,.control::slotted(input:disabled){cursor:not-allowed!important;opacity:1!important;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control:not(slot)::placeholder{opacity:1!important;-webkit-text-fill-color:var(--_low-ink-color)!important}.control::slotted(input:-webkit-autofill),.control:not(slot):-webkit-autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control::slotted(input:autofill),.control:not(slot):autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.has-icon .control:not(slot),.has-icon .control::slotted(input){padding-inline-start:calc(var(--_text-field-icon-size) + var(--_text-field-gutter-start) * 2)!important}.icon{z-index:1;color:var(--_low-ink-color);font-size:var(--_text-field-icon-size);line-height:1;position:absolute;inset-block-start:50%;inset-inline-start:calc(100% + var(--_text-field-gutter-start));transform:translateY(-50%)}.leading-items-wrapper{position:relative}.base.no-leading .leading-items-wrapper{display:none}.action-items-wrapper{margin-inline-end:4px}.base:not(.action-items) .action-items-wrapper{display:none}@supports selector(:has(*)){.base:not(.has-activedescendant) .fieldset:has(.wrapper .control:focus-within):after{--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}@supports not selector(:has(*)){.base:not(.has-activedescendant) .wrapper:focus-within:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent;z-index:1;border-radius:inherit;content:\"\";pointer-events:none;display:block;position:absolute;inset:0}}:host([internal-part]) .fieldset{font:var(--vvd-typography-heading-4);background-color:#0000;line-height:1.1}:host([internal-part]) .fieldset:not(:focus-within):after{block-size:1px;inset-block-end:0}@supports selector(:has(*)){:host([internal-part]) .fieldset:has(.action-items-wrapper:focus-within):after{block-size:1px;inset-block-end:0}}:host([internal-part]) .control{text-align:center}slot[name=_mirrored-helper-text]{display:none}.base{--_text-field-gutter-end:70px}.control::-webkit-outer-spin-button,.control::-webkit-inner-spin-button{appearance:none}.control-buttons{z-index:1;display:flex;position:absolute;right:3px}.readonly .control-buttons,.disabled .control-buttons{pointer-events:none}.control-buttons .divider{margin-block:8px}.control-buttons>*{flex-shrink:0}";
24
+ var number_field_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}:host{display:inline-block}.base{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_text-field-border-radius:8px;--_text-field-pill-border-radius:24px;grid-template-columns:min-content 1fr max-content;align-items:center;gap:4px;width:100%;display:inline-grid}.base.size-condensed{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8)) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_text-field-border-radius:4px}.base{user-select:none}.base:not(.disabled){--_low-ink-color:var(--vvd-color-neutral-600)}.base.disabled{--_low-ink-color:var(--_appearance-color-text)}.label:not(slot),.label::slotted(label){font:var(--vvd-typography-base);grid-area:1/1/auto/4;box-sizing:initial!important;padding:initial!important;margin:initial!important;color:var(--vvd-color-canvas-text)!important}.char-count+.label:not(slot),.char-count+.label::slotted(label){grid-column:1/3}.char-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.label-wrapper{grid-area:1/1/auto/4}.char-count+.label-wrapper{grid-column:1/3}.fieldset{background-color:var(--_appearance-color-fill);font:var(--vvd-typography-base);grid-column:1/4;align-items:center;padding-block:0;transition:color .2s,background-color .2s;display:flex;position:relative}.fieldset:after{border-radius:inherit;block-size:100%;box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);content:\"\";pointer-events:none;inline-size:100%;transition:box-shadow .2s;display:block;position:absolute}.fieldset:focus-visible{outline:none}.base>.fieldset{block-size:var(--_text-field-block-size)}.base:not(.shape-pill) .fieldset{border-radius:var(--_text-field-border-radius)}.base.shape-pill .fieldset{border-radius:var(--_text-field-pill-border-radius)}.wrapper{border-radius:inherit;block-size:100%;inline-size:100%}.control{border-radius:inherit;text-align:start}.control:not(slot),.control::slotted(input){font:inherit;text-align:inherit;outline:#0000;box-sizing:border-box!important;border-radius:inherit!important;width:100%!important;margin:initial!important;appearance:none!important;block-size:100%!important;color:inherit!important;padding-block:0!important;padding-inline:var(--_text-field-gutter-start) var(--_text-field-gutter-end)!important;background-color:#0000!important;border:0!important}.control:not(slot,:focus),.control::slotted(input:not(:focus)){text-overflow:ellipsis!important}.control:not(slot):disabled,.control::slotted(input:disabled){cursor:not-allowed!important;opacity:1!important;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control:not(slot)::placeholder{opacity:1!important;-webkit-text-fill-color:var(--_low-ink-color)!important}.control::slotted(input:-webkit-autofill),.control:not(slot):-webkit-autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control::slotted(input:autofill),.control:not(slot):autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.has-icon .control:not(slot),.has-icon .control::slotted(input){padding-inline-start:calc(var(--_text-field-icon-size) + var(--_text-field-gutter-start) * 2)!important}.icon{z-index:1;color:var(--_low-ink-color);font-size:var(--_text-field-icon-size);line-height:1;position:absolute;inset-block-start:50%;inset-inline-start:calc(100% + var(--_text-field-gutter-start));transform:translateY(-50%)}.leading-items-wrapper{position:relative}.base.no-leading .leading-items-wrapper{display:none}.action-items-wrapper{margin-inline-end:4px}.base:not(.action-items) .action-items-wrapper{display:none}@supports selector(:has(*)){.base:not(.has-activedescendant) .fieldset:has(.wrapper .control:focus-within):after{--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}@supports not selector(:has(*)){.base:not(.has-activedescendant) .wrapper:focus-within:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent;z-index:1;border-radius:inherit;content:\"\";pointer-events:none;display:block;position:absolute;inset:0}}:host([internal-part]) .fieldset{font:var(--vvd-typography-heading-4);background-color:#0000;line-height:1.1}:host([internal-part]) .fieldset:not(:focus-within):after{block-size:1px;inset-block-end:0}@supports selector(:has(*)){:host([internal-part]) .fieldset:has(.action-items-wrapper:focus-within):after{block-size:1px;inset-block-end:0}}:host([internal-part]) .control{text-align:center}slot[name=_mirrored-helper-text]{display:none}.base{--_text-field-gutter-end:70px}.base.no-steppers{--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5)}.base.no-steppers.size-condensed{--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2)}.control::-webkit-outer-spin-button,.control::-webkit-inner-spin-button{appearance:none}.control-buttons{z-index:1;display:flex;position:absolute;right:3px}.control-buttons[hidden]{display:none}.readonly .control-buttons,.disabled .control-buttons{pointer-events:none}.control-buttons .divider{margin-block:8px}.control-buttons>*{flex-shrink:0}";
25
25
  //#endregion
26
26
  //#region src/lib/number-field/number-field.ts
27
27
  var numberFieldAppearance = require_component_enum.componentEnum(["fieldset", "ghost"], "fieldset");
@@ -29,12 +29,26 @@ var STEP_DIRECTION = {
29
29
  up: 1,
30
30
  down: -1
31
31
  };
32
+ /** The default step used for arrow key stepping when `step="any"` is set, matching native `<input type="number">` behavior. */
33
+ var ANY_STEP_FALLBACK = 1;
32
34
  function makeStep(element, direction) {
35
+ const step = element._numericStep;
33
36
  const value = parseFloat(element.value);
34
- const stepUpValue = !isNaN(value) ? value + direction * element.step : element.min > 0 ? element.min : element.max < 0 ? element.max : !element.min ? direction * element.step : 0;
37
+ const stepUpValue = !isNaN(value) ? value + direction * step : element.min > 0 ? element.min : element.max < 0 ? element.max : !element.min ? direction * step : 0;
35
38
  element.value = Number(stepUpValue.toFixed(12)).toString();
36
39
  element._updatedValueAnnouncement = element.locale.numberField.updatedValueAnnouncement(element._presentationValue);
37
40
  }
41
+ /** Allows `step` to be a finite number, or the string `"any"` which disables the native step constraint. */
42
+ var stepConverter = {
43
+ toView(value) {
44
+ if (value === "any") return "any";
45
+ return _microsoft_fast_element.nullableNumberConverter.toView(value);
46
+ },
47
+ fromView(value) {
48
+ if (typeof value === "string" && value.trim().toLowerCase() === "any") return "any";
49
+ return _microsoft_fast_element.nullableNumberConverter.fromView(value);
50
+ }
51
+ };
38
52
  var buildNumberPatterns = (decimalSeparator) => {
39
53
  const ds = decimalSeparator.source;
40
54
  return {
@@ -71,6 +85,7 @@ var NumberField = class extends require_with_contextual_help.WithContextualHelp(
71
85
  this.readOnly = false;
72
86
  this.autofocus = false;
73
87
  this.step = 1;
88
+ this.noSteppers = false;
74
89
  this.isUserInput = false;
75
90
  this._presentationValue = "";
76
91
  this._updatedValueAnnouncement = "";
@@ -79,7 +94,19 @@ var NumberField = class extends require_with_contextual_help.WithContextualHelp(
79
94
  }
80
95
  /** @internal */
81
96
  stepChanged(_, next) {
82
- this.proxy.setAttribute("step", Number.isFinite(next) ? next.toString() : "");
97
+ this.proxy.setAttribute("step", next === "any" ? "any" : Number.isFinite(next) ? next.toString() : "");
98
+ this.validate();
99
+ }
100
+ /** @internal */
101
+ get _hasSteppers() {
102
+ return !this.noSteppers && this.step !== "any";
103
+ }
104
+ /**
105
+ * The step used by the stepper buttons and arrow keys. Falls back to `1` when `step` is `"any"`.
106
+ * @internal
107
+ */
108
+ get _numericStep() {
109
+ return this.step === "any" ? ANY_STEP_FALLBACK : this.step;
83
110
  }
84
111
  /**
85
112
  * Ensures that the max is greater than the min and that the value
@@ -221,7 +248,11 @@ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: _mic
221
248
  require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: _microsoft_fast_element.nullableNumberConverter })], NumberField.prototype, "minlength", void 0);
222
249
  require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: _microsoft_fast_element.nullableNumberConverter })], NumberField.prototype, "size", void 0);
223
250
  require_decorate.__decorate([(0, _microsoft_fast_element.attr)()], NumberField.prototype, "scale", void 0);
224
- require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: _microsoft_fast_element.nullableNumberConverter })], NumberField.prototype, "step", void 0);
251
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: stepConverter })], NumberField.prototype, "step", void 0);
252
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({
253
+ attribute: "no-steppers",
254
+ mode: "boolean"
255
+ })], NumberField.prototype, "noSteppers", void 0);
225
256
  require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: _microsoft_fast_element.nullableNumberConverter })], NumberField.prototype, "max", void 0);
226
257
  require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ converter: _microsoft_fast_element.nullableNumberConverter })], NumberField.prototype, "min", void 0);
227
258
  require_decorate.__decorate([_microsoft_fast_element.observable], NumberField.prototype, "defaultSlottedNodes", void 0);
@@ -250,10 +281,12 @@ function numberControlButtons(context) {
250
281
  const buttonTag = context.tagFor(require_definition$1.Button);
251
282
  const dividerTag = context.tagFor(require_divider.Divider);
252
283
  return _microsoft_fast_element.html`
253
- <div class="control-buttons" ?inert="${(x) => x.disabled || x.readOnly}">
284
+ <div class="control-buttons"
285
+ ?hidden="${(x) => !x._hasSteppers}"
286
+ ?inert="${(x) => x.disabled || x.readOnly}">
254
287
  <${buttonTag} id="subtract" icon="minus-line"
255
288
  ?disabled="${(x) => x.disabled || x.readOnly}"
256
- aria-label=${(x) => x.decrementButtonAriaLabel || x.locale.numberField.decrementButtonLabel(x.step)}
289
+ aria-label=${(x) => x.decrementButtonAriaLabel || x.locale.numberField.decrementButtonLabel(x._numericStep)}
257
290
  shape="${setControlButtonShape}"
258
291
  type="button"
259
292
  size="${(x) => x.scale === "condensed" ? "super-condensed" : "condensed"}"
@@ -262,7 +295,7 @@ function numberControlButtons(context) {
262
295
  <${dividerTag} class="divider" orientation="vertical"></${dividerTag}>
263
296
  <${buttonTag} id="add" icon="plus-line"
264
297
  ?disabled="${(x) => x.disabled || x.readOnly}"
265
- aria-label=${(x) => x.incrementButtonAriaLabel || x.locale.numberField.incrementButtonLabel(x.step)}
298
+ aria-label=${(x) => x.incrementButtonAriaLabel || x.locale.numberField.incrementButtonLabel(x._numericStep)}
266
299
  shape="${setControlButtonShape}"
267
300
  type="button"
268
301
  size="${(x) => x.scale === "condensed" ? "super-condensed" : "condensed"}"
@@ -274,7 +307,7 @@ function numberControlButtons(context) {
274
307
  var NumberFieldTemplate = (context) => {
275
308
  const visuallyHiddenTag = context.tagFor(require_definition$2.VisuallyHidden);
276
309
  return _microsoft_fast_element.html`
277
- <div class="base ${(x) => (0, _microsoft_fast_web_utilities.classNames)(`connotation-accent`, `appearance-${numberFieldAppearance.parse(x.appearance)}`, "with-idle", "with-hover", "with-disabled", "with-readonly", "with-error", "with-success", ["error", Boolean(x.errorValidationMessage)], ["disabled", x.disabled], ["has-value", Boolean(x.value)], ["readonly", x.readOnly], ["placeholder", Boolean(x.placeholder)], [`shape-${x.shape}`, Boolean(x.shape)], ["no-label", !x.label], ["success", !!x.successText], [`size-${x.scale}`, Boolean(x.scale)])}">
310
+ <div class="base ${(x) => (0, _microsoft_fast_web_utilities.classNames)(`connotation-accent`, `appearance-${numberFieldAppearance.parse(x.appearance)}`, "with-idle", "with-hover", "with-disabled", "with-readonly", "with-error", "with-success", ["error", Boolean(x.errorValidationMessage)], ["disabled", x.disabled], ["has-value", Boolean(x.value)], ["readonly", x.readOnly], ["placeholder", Boolean(x.placeholder)], [`shape-${x.shape}`, Boolean(x.shape)], ["no-label", !x.label], ["success", !!x.successText], [`size-${x.scale}`, Boolean(x.scale)], ["no-steppers", !x._hasSteppers])}">
278
311
  <div class="label-wrapper" ?hidden=${(x) => !x.label && !x._hasContextualHelp}>
279
312
  ${(0, _microsoft_fast_element.when)((x) => x.label, renderLabel())}
280
313
  <slot name="contextual-help" ${(0, _microsoft_fast_element.slotted)("_contextualHelpSlottedContent")}></slot>
@@ -21,7 +21,7 @@ import { t as dividerDefinition } from "./definition36.js";
21
21
  import { Updates, attr, html, nullableNumberConverter, observable, ref, slotted, when } from "@microsoft/fast-element";
22
22
  import { classNames, keyArrowDown, keyArrowUp } from "@microsoft/fast-web-utilities";
23
23
  //#region src/lib/number-field/number-field.scss?inline
24
- var number_field_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}:host{display:inline-block}.base{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_text-field-border-radius:8px;--_text-field-pill-border-radius:24px;grid-template-columns:min-content 1fr max-content;align-items:center;gap:4px;width:100%;display:inline-grid}.base.size-condensed{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8)) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_text-field-border-radius:4px}.base{user-select:none}.base:not(.disabled){--_low-ink-color:var(--vvd-color-neutral-600)}.base.disabled{--_low-ink-color:var(--_appearance-color-text)}.label:not(slot),.label::slotted(label){font:var(--vvd-typography-base);grid-area:1/1/auto/4;box-sizing:initial!important;padding:initial!important;margin:initial!important;color:var(--vvd-color-canvas-text)!important}.char-count+.label:not(slot),.char-count+.label::slotted(label){grid-column:1/3}.char-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.label-wrapper{grid-area:1/1/auto/4}.char-count+.label-wrapper{grid-column:1/3}.fieldset{background-color:var(--_appearance-color-fill);font:var(--vvd-typography-base);grid-column:1/4;align-items:center;padding-block:0;transition:color .2s,background-color .2s;display:flex;position:relative}.fieldset:after{border-radius:inherit;block-size:100%;box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);content:\"\";pointer-events:none;inline-size:100%;transition:box-shadow .2s;display:block;position:absolute}.fieldset:focus-visible{outline:none}.base>.fieldset{block-size:var(--_text-field-block-size)}.base:not(.shape-pill) .fieldset{border-radius:var(--_text-field-border-radius)}.base.shape-pill .fieldset{border-radius:var(--_text-field-pill-border-radius)}.wrapper{border-radius:inherit;block-size:100%;inline-size:100%}.control{border-radius:inherit;text-align:start}.control:not(slot),.control::slotted(input){font:inherit;text-align:inherit;outline:#0000;box-sizing:border-box!important;border-radius:inherit!important;width:100%!important;margin:initial!important;appearance:none!important;block-size:100%!important;color:inherit!important;padding-block:0!important;padding-inline:var(--_text-field-gutter-start) var(--_text-field-gutter-end)!important;background-color:#0000!important;border:0!important}.control:not(slot,:focus),.control::slotted(input:not(:focus)){text-overflow:ellipsis!important}.control:not(slot):disabled,.control::slotted(input:disabled){cursor:not-allowed!important;opacity:1!important;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control:not(slot)::placeholder{opacity:1!important;-webkit-text-fill-color:var(--_low-ink-color)!important}.control::slotted(input:-webkit-autofill),.control:not(slot):-webkit-autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control::slotted(input:autofill),.control:not(slot):autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.has-icon .control:not(slot),.has-icon .control::slotted(input){padding-inline-start:calc(var(--_text-field-icon-size) + var(--_text-field-gutter-start) * 2)!important}.icon{z-index:1;color:var(--_low-ink-color);font-size:var(--_text-field-icon-size);line-height:1;position:absolute;inset-block-start:50%;inset-inline-start:calc(100% + var(--_text-field-gutter-start));transform:translateY(-50%)}.leading-items-wrapper{position:relative}.base.no-leading .leading-items-wrapper{display:none}.action-items-wrapper{margin-inline-end:4px}.base:not(.action-items) .action-items-wrapper{display:none}@supports selector(:has(*)){.base:not(.has-activedescendant) .fieldset:has(.wrapper .control:focus-within):after{--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}@supports not selector(:has(*)){.base:not(.has-activedescendant) .wrapper:focus-within:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent;z-index:1;border-radius:inherit;content:\"\";pointer-events:none;display:block;position:absolute;inset:0}}:host([internal-part]) .fieldset{font:var(--vvd-typography-heading-4);background-color:#0000;line-height:1.1}:host([internal-part]) .fieldset:not(:focus-within):after{block-size:1px;inset-block-end:0}@supports selector(:has(*)){:host([internal-part]) .fieldset:has(.action-items-wrapper:focus-within):after{block-size:1px;inset-block-end:0}}:host([internal-part]) .control{text-align:center}slot[name=_mirrored-helper-text]{display:none}.base{--_text-field-gutter-end:70px}.control::-webkit-outer-spin-button,.control::-webkit-inner-spin-button{appearance:none}.control-buttons{z-index:1;display:flex;position:absolute;right:3px}.readonly .control-buttons,.disabled .control-buttons{pointer-events:none}.control-buttons .divider{margin-block:8px}.control-buttons>*{flex-shrink:0}";
24
+ var number_field_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}:host{display:inline-block}.base{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_text-field-border-radius:8px;--_text-field-pill-border-radius:24px;grid-template-columns:min-content 1fr max-content;align-items:center;gap:4px;width:100%;display:inline-grid}.base.size-condensed{--_text-field-gutter-start:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2);--_text-field-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8)) / 2);--_text-field-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_text-field-border-radius:4px}.base{user-select:none}.base:not(.disabled){--_low-ink-color:var(--vvd-color-neutral-600)}.base.disabled{--_low-ink-color:var(--_appearance-color-text)}.label:not(slot),.label::slotted(label){font:var(--vvd-typography-base);grid-area:1/1/auto/4;box-sizing:initial!important;padding:initial!important;margin:initial!important;color:var(--vvd-color-canvas-text)!important}.char-count+.label:not(slot),.char-count+.label::slotted(label){grid-column:1/3}.char-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.label-wrapper{grid-area:1/1/auto/4}.char-count+.label-wrapper{grid-column:1/3}.fieldset{background-color:var(--_appearance-color-fill);font:var(--vvd-typography-base);grid-column:1/4;align-items:center;padding-block:0;transition:color .2s,background-color .2s;display:flex;position:relative}.fieldset:after{border-radius:inherit;block-size:100%;box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);content:\"\";pointer-events:none;inline-size:100%;transition:box-shadow .2s;display:block;position:absolute}.fieldset:focus-visible{outline:none}.base>.fieldset{block-size:var(--_text-field-block-size)}.base:not(.shape-pill) .fieldset{border-radius:var(--_text-field-border-radius)}.base.shape-pill .fieldset{border-radius:var(--_text-field-pill-border-radius)}.wrapper{border-radius:inherit;block-size:100%;inline-size:100%}.control{border-radius:inherit;text-align:start}.control:not(slot),.control::slotted(input){font:inherit;text-align:inherit;outline:#0000;box-sizing:border-box!important;border-radius:inherit!important;width:100%!important;margin:initial!important;appearance:none!important;block-size:100%!important;color:inherit!important;padding-block:0!important;padding-inline:var(--_text-field-gutter-start) var(--_text-field-gutter-end)!important;background-color:#0000!important;border:0!important}.control:not(slot,:focus),.control::slotted(input:not(:focus)){text-overflow:ellipsis!important}.control:not(slot):disabled,.control::slotted(input:disabled){cursor:not-allowed!important;opacity:1!important;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control:not(slot)::placeholder{opacity:1!important;-webkit-text-fill-color:var(--_low-ink-color)!important}.control::slotted(input:-webkit-autofill),.control:not(slot):-webkit-autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.control::slotted(input:autofill),.control:not(slot):autofill{-webkit-box-shadow:0 0 0 1000px var(--_appearance-color-fill) inset;-webkit-text-fill-color:var(--_appearance-color-text)!important}.has-icon .control:not(slot),.has-icon .control::slotted(input){padding-inline-start:calc(var(--_text-field-icon-size) + var(--_text-field-gutter-start) * 2)!important}.icon{z-index:1;color:var(--_low-ink-color);font-size:var(--_text-field-icon-size);line-height:1;position:absolute;inset-block-start:50%;inset-inline-start:calc(100% + var(--_text-field-gutter-start));transform:translateY(-50%)}.leading-items-wrapper{position:relative}.base.no-leading .leading-items-wrapper{display:none}.action-items-wrapper{margin-inline-end:4px}.base:not(.action-items) .action-items-wrapper{display:none}@supports selector(:has(*)){.base:not(.has-activedescendant) .fieldset:has(.wrapper .control:focus-within):after{--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}@supports not selector(:has(*)){.base:not(.has-activedescendant) .wrapper:focus-within:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent;z-index:1;border-radius:inherit;content:\"\";pointer-events:none;display:block;position:absolute;inset:0}}:host([internal-part]) .fieldset{font:var(--vvd-typography-heading-4);background-color:#0000;line-height:1.1}:host([internal-part]) .fieldset:not(:focus-within):after{block-size:1px;inset-block-end:0}@supports selector(:has(*)){:host([internal-part]) .fieldset:has(.action-items-wrapper:focus-within):after{block-size:1px;inset-block-end:0}}:host([internal-part]) .control{text-align:center}slot[name=_mirrored-helper-text]{display:none}.base{--_text-field-gutter-end:70px}.base.no-steppers{--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5)}.base.no-steppers.size-condensed{--_text-field-gutter-end:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2)}.control::-webkit-outer-spin-button,.control::-webkit-inner-spin-button{appearance:none}.control-buttons{z-index:1;display:flex;position:absolute;right:3px}.control-buttons[hidden]{display:none}.readonly .control-buttons,.disabled .control-buttons{pointer-events:none}.control-buttons .divider{margin-block:8px}.control-buttons>*{flex-shrink:0}";
25
25
  //#endregion
26
26
  //#region src/lib/number-field/number-field.ts
27
27
  var numberFieldAppearance = componentEnum(["fieldset", "ghost"], "fieldset");
@@ -29,12 +29,26 @@ var STEP_DIRECTION = {
29
29
  up: 1,
30
30
  down: -1
31
31
  };
32
+ /** The default step used for arrow key stepping when `step="any"` is set, matching native `<input type="number">` behavior. */
33
+ var ANY_STEP_FALLBACK = 1;
32
34
  function makeStep(element, direction) {
35
+ const step = element._numericStep;
33
36
  const value = parseFloat(element.value);
34
- const stepUpValue = !isNaN(value) ? value + direction * element.step : element.min > 0 ? element.min : element.max < 0 ? element.max : !element.min ? direction * element.step : 0;
37
+ const stepUpValue = !isNaN(value) ? value + direction * step : element.min > 0 ? element.min : element.max < 0 ? element.max : !element.min ? direction * step : 0;
35
38
  element.value = Number(stepUpValue.toFixed(12)).toString();
36
39
  element._updatedValueAnnouncement = element.locale.numberField.updatedValueAnnouncement(element._presentationValue);
37
40
  }
41
+ /** Allows `step` to be a finite number, or the string `"any"` which disables the native step constraint. */
42
+ var stepConverter = {
43
+ toView(value) {
44
+ if (value === "any") return "any";
45
+ return nullableNumberConverter.toView(value);
46
+ },
47
+ fromView(value) {
48
+ if (typeof value === "string" && value.trim().toLowerCase() === "any") return "any";
49
+ return nullableNumberConverter.fromView(value);
50
+ }
51
+ };
38
52
  var buildNumberPatterns = (decimalSeparator) => {
39
53
  const ds = decimalSeparator.source;
40
54
  return {
@@ -71,6 +85,7 @@ var NumberField = class extends WithContextualHelp(WithFeedback(WithErrorText(Wi
71
85
  this.readOnly = false;
72
86
  this.autofocus = false;
73
87
  this.step = 1;
88
+ this.noSteppers = false;
74
89
  this.isUserInput = false;
75
90
  this._presentationValue = "";
76
91
  this._updatedValueAnnouncement = "";
@@ -79,7 +94,19 @@ var NumberField = class extends WithContextualHelp(WithFeedback(WithErrorText(Wi
79
94
  }
80
95
  /** @internal */
81
96
  stepChanged(_, next) {
82
- this.proxy.setAttribute("step", Number.isFinite(next) ? next.toString() : "");
97
+ this.proxy.setAttribute("step", next === "any" ? "any" : Number.isFinite(next) ? next.toString() : "");
98
+ this.validate();
99
+ }
100
+ /** @internal */
101
+ get _hasSteppers() {
102
+ return !this.noSteppers && this.step !== "any";
103
+ }
104
+ /**
105
+ * The step used by the stepper buttons and arrow keys. Falls back to `1` when `step` is `"any"`.
106
+ * @internal
107
+ */
108
+ get _numericStep() {
109
+ return this.step === "any" ? ANY_STEP_FALLBACK : this.step;
83
110
  }
84
111
  /**
85
112
  * Ensures that the max is greater than the min and that the value
@@ -221,7 +248,11 @@ __decorate([attr({ converter: nullableNumberConverter })], NumberField.prototype
221
248
  __decorate([attr({ converter: nullableNumberConverter })], NumberField.prototype, "minlength", void 0);
222
249
  __decorate([attr({ converter: nullableNumberConverter })], NumberField.prototype, "size", void 0);
223
250
  __decorate([attr()], NumberField.prototype, "scale", void 0);
224
- __decorate([attr({ converter: nullableNumberConverter })], NumberField.prototype, "step", void 0);
251
+ __decorate([attr({ converter: stepConverter })], NumberField.prototype, "step", void 0);
252
+ __decorate([attr({
253
+ attribute: "no-steppers",
254
+ mode: "boolean"
255
+ })], NumberField.prototype, "noSteppers", void 0);
225
256
  __decorate([attr({ converter: nullableNumberConverter })], NumberField.prototype, "max", void 0);
226
257
  __decorate([attr({ converter: nullableNumberConverter })], NumberField.prototype, "min", void 0);
227
258
  __decorate([observable], NumberField.prototype, "defaultSlottedNodes", void 0);
@@ -250,10 +281,12 @@ function numberControlButtons(context) {
250
281
  const buttonTag = context.tagFor(Button);
251
282
  const dividerTag = context.tagFor(Divider);
252
283
  return html`
253
- <div class="control-buttons" ?inert="${(x) => x.disabled || x.readOnly}">
284
+ <div class="control-buttons"
285
+ ?hidden="${(x) => !x._hasSteppers}"
286
+ ?inert="${(x) => x.disabled || x.readOnly}">
254
287
  <${buttonTag} id="subtract" icon="minus-line"
255
288
  ?disabled="${(x) => x.disabled || x.readOnly}"
256
- aria-label=${(x) => x.decrementButtonAriaLabel || x.locale.numberField.decrementButtonLabel(x.step)}
289
+ aria-label=${(x) => x.decrementButtonAriaLabel || x.locale.numberField.decrementButtonLabel(x._numericStep)}
257
290
  shape="${setControlButtonShape}"
258
291
  type="button"
259
292
  size="${(x) => x.scale === "condensed" ? "super-condensed" : "condensed"}"
@@ -262,7 +295,7 @@ function numberControlButtons(context) {
262
295
  <${dividerTag} class="divider" orientation="vertical"></${dividerTag}>
263
296
  <${buttonTag} id="add" icon="plus-line"
264
297
  ?disabled="${(x) => x.disabled || x.readOnly}"
265
- aria-label=${(x) => x.incrementButtonAriaLabel || x.locale.numberField.incrementButtonLabel(x.step)}
298
+ aria-label=${(x) => x.incrementButtonAriaLabel || x.locale.numberField.incrementButtonLabel(x._numericStep)}
266
299
  shape="${setControlButtonShape}"
267
300
  type="button"
268
301
  size="${(x) => x.scale === "condensed" ? "super-condensed" : "condensed"}"
@@ -274,7 +307,7 @@ function numberControlButtons(context) {
274
307
  var NumberFieldTemplate = (context) => {
275
308
  const visuallyHiddenTag = context.tagFor(VisuallyHidden);
276
309
  return html`
277
- <div class="base ${(x) => classNames(`connotation-accent`, `appearance-${numberFieldAppearance.parse(x.appearance)}`, "with-idle", "with-hover", "with-disabled", "with-readonly", "with-error", "with-success", ["error", Boolean(x.errorValidationMessage)], ["disabled", x.disabled], ["has-value", Boolean(x.value)], ["readonly", x.readOnly], ["placeholder", Boolean(x.placeholder)], [`shape-${x.shape}`, Boolean(x.shape)], ["no-label", !x.label], ["success", !!x.successText], [`size-${x.scale}`, Boolean(x.scale)])}">
310
+ <div class="base ${(x) => classNames(`connotation-accent`, `appearance-${numberFieldAppearance.parse(x.appearance)}`, "with-idle", "with-hover", "with-disabled", "with-readonly", "with-error", "with-success", ["error", Boolean(x.errorValidationMessage)], ["disabled", x.disabled], ["has-value", Boolean(x.value)], ["readonly", x.readOnly], ["placeholder", Boolean(x.placeholder)], [`shape-${x.shape}`, Boolean(x.shape)], ["no-label", !x.label], ["success", !!x.successText], [`size-${x.scale}`, Boolean(x.scale)], ["no-steppers", !x._hasSteppers])}">
278
311
  <div class="label-wrapper" ?hidden=${(x) => !x.label && !x._hasContextualHelp}>
279
312
  ${when((x) => x.label, renderLabel())}
280
313
  <slot name="contextual-help" ${slotted("_contextualHelpSlottedContent")}></slot>
@@ -92,7 +92,7 @@ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({
92
92
  require_decorate.__decorate([_microsoft_fast_element.attr], Button.prototype, "label", void 0);
93
93
  //#endregion
94
94
  //#region src/lib/button/button.scss?inline
95
- var button_default = ".chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host{--_vvd-button-accent-firm-wrapper:var(--vvd-button-accent-firm);--_vvd-button-cta-firm-wrapper:var(--vvd-button-cta-firm);--_vvd-button-success-firm-wrapper:var(--vvd-button-success-firm);--_vvd-button-alert-firm-wrapper:var(--vvd-button-alert-firm);--_vvd-button-announcement-firm-wrapper:var(--vvd-button-announcement-firm)}.control:not(.appearance-ghost-light,.appearance-filled,.appearance-outlined){--vvd-button-accent-firm:var(--_vvd-button-accent-firm-wrapper,var(--vvd-button-accent-primary));--vvd-button-cta-firm:var(--_vvd-button-cta-firm-wrapper,var(--vvd-button-cta-primary));--vvd-button-success-firm:var(--_vvd-button-success-firm-wrapper,var(--vvd-button-success-primary));--vvd-button-alert-firm:var(--_vvd-button-alert-firm-wrapper,var(--vvd-button-alert-primary));--vvd-button-announcement-firm:var(--_vvd-button-announcement-firm-wrapper,var(--vvd-button-announcement-primary))}:host{display:inline-block}.control{--focus-stroke-gap-color:transparent;box-sizing:border-box;border-radius:var(--_button-border-radius);background-color:var(--_appearance-color-fill);block-size:var(--_button-block-size);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);justify-content:space-between;align-items:center;gap:var(--_button-icon-gap);vertical-align:middle;border:0;margin:0;text-decoration:none;display:inline-flex}.control .text{-webkit-line-clamp:var(--button-line-clamp,1);text-align:start;-webkit-box-orient:vertical;max-inline-size:100%;display:-webkit-box;overflow:hidden}.control:not(.icon-only){inline-size:100%}.control:not(.disabled){cursor:var(--button-cursor,pointer)}.control.disabled{cursor:not-allowed}.control{user-select:none}.control:not(.stacked).size-super-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control:not(.stacked).size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-super-condensed:not(.icon-only){padding-inline:8px}.control:not(.stacked).size-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:8px;--_button-chevron-size:12px}.control:not(.stacked).size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-condensed:not(.icon-only){padding-inline:12px}.control:not(.stacked).size-expanded{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control:not(.stacked).size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-expanded:not(.icon-only){padding-inline:20px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed){--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control:not(.shape-pill){--_button-border-radius:8px}.control:not(.shape-pill).size-condensed:not(.stacked),.control:not(.shape-pill).size-super-condensed:not(.stacked){--_button-border-radius:4px}.control.shape-pill:not(.icon-only,.stacked.size-super-condensed,.stacked.size-condensed,.stacked.normal){--_button-border-radius:24px}.control.shape-pill.stacked.size-condensed,.control.shape-pill.stacked.size-super-condensed{--_button-border-radius:16px}.control.shape-pill.stacked.size-normal{--_button-border-radius:20px}.control.shape-pill.icon-only{--_button-border-radius:50%}.control.stacked.size-super-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));--_button-block-size:calc(var(--stacked-size) + 20px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control.stacked.size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-super-condensed:not(.icon-only){padding-inline:16px}.control.stacked.size-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_button-block-size:calc(var(--stacked-size) + 24px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:6px;--_button-chevron-size:12px}.control.stacked.size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-condensed:not(.icon-only){padding-inline:12px}.control.stacked.size-expanded{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));--_button-block-size:calc(var(--stacked-size) + 32px);font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control.stacked.size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-expanded:not(.icon-only){padding-inline:20px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed){--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_button-block-size:calc(var(--stacked-size) + 28px);font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control.appearance-filled{--focus-stroke-gap-color:transparent}.control.appearance-filled:focus-visible{outline:none;position:relative}.control.appearance-filled:focus-visible:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));border-radius:var(--focus-border-radius,inherit);block-size:calc(100% + var(--focus-block-size-addition,4px));content:\"\";inline-size:calc(100% + var(--focus-block-size-addition,4px));display:block;position:absolute;inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}.control:not(.appearance-filled):focus-visible{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}slot[name=icon]{line-height:1}.icon-trailing slot[name=icon]{order:1;display:flex}.control.stacked slot[name=icon]{font-size:calc(var(--stacked-size) / 2)}.control:not(.stacked) slot[name=icon]{font-size:calc(var(--_button-block-size) / 2)}.chevron{font-size:var(--_button-chevron-size)}.content{justify-content:center;align-items:center;gap:var(--_button-icon-gap);flex:1;display:flex;overflow:hidden}.control.stacked .content{flex-direction:column}:host([dropdown-indicator]) .content{justify-content:var(--button-content-alignment,flex-start);text-align:start}:host([dropdown-indicator][stacked]) .content{align-items:var(--button-content-alignment,flex-start);justify-content:center}.pending-no-icon{position:absolute}.pending-no-icon+.text{visibility:hidden}:host([icon-trailing][pending]) .pending{order:1}.sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
95
+ var button_default = ".chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host{--_vvd-button-accent-firm-wrapper:var(--vvd-button-accent-firm);--_vvd-button-cta-firm-wrapper:var(--vvd-button-cta-firm);--_vvd-button-success-firm-wrapper:var(--vvd-button-success-firm);--_vvd-button-alert-firm-wrapper:var(--vvd-button-alert-firm);--_vvd-button-announcement-firm-wrapper:var(--vvd-button-announcement-firm)}.control:not(.appearance-ghost-light,.appearance-filled,.appearance-outlined){--vvd-button-accent-firm:var(--_vvd-button-accent-firm-wrapper,var(--vvd-button-accent-primary));--vvd-button-cta-firm:var(--_vvd-button-cta-firm-wrapper,var(--vvd-button-cta-primary));--vvd-button-success-firm:var(--_vvd-button-success-firm-wrapper,var(--vvd-button-success-primary));--vvd-button-alert-firm:var(--_vvd-button-alert-firm-wrapper,var(--vvd-button-alert-primary));--vvd-button-announcement-firm:var(--_vvd-button-announcement-firm-wrapper,var(--vvd-button-announcement-primary))}:host{display:inline-block}.control{--focus-stroke-gap-color:transparent;box-sizing:border-box;border-radius:var(--_button-border-radius);background-color:var(--_appearance-color-fill);block-size:var(--_button-block-size);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);justify-content:space-between;align-items:center;gap:var(--_button-icon-gap);vertical-align:middle;border:0;margin:0;text-decoration:none;display:inline-flex}.control .text{-webkit-line-clamp:var(--button-line-clamp,1);text-align:start;-webkit-box-orient:vertical;max-inline-size:100%;display:-webkit-box;overflow:hidden}.control:not(.icon-only){inline-size:100%}.control:not(.disabled){cursor:var(--button-cursor,pointer)}.control.disabled{cursor:not-allowed}.control.disabled.appearance-ghost{color:var(--_picker-field-disabled-icon-color,var(--_appearance-color-text))}.control{user-select:none}.control:not(.stacked).size-super-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control:not(.stacked).size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-super-condensed:not(.icon-only){padding-inline:8px}.control:not(.stacked).size-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:8px;--_button-chevron-size:12px}.control:not(.stacked).size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-condensed:not(.icon-only){padding-inline:12px}.control:not(.stacked).size-expanded{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control:not(.stacked).size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-expanded:not(.icon-only){padding-inline:20px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed){--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control:not(.shape-pill){--_button-border-radius:8px}.control:not(.shape-pill).size-condensed:not(.stacked),.control:not(.shape-pill).size-super-condensed:not(.stacked){--_button-border-radius:4px}.control.shape-pill:not(.icon-only,.stacked.size-super-condensed,.stacked.size-condensed,.stacked.normal){--_button-border-radius:24px}.control.shape-pill.stacked.size-condensed,.control.shape-pill.stacked.size-super-condensed{--_button-border-radius:16px}.control.shape-pill.stacked.size-normal{--_button-border-radius:20px}.control.shape-pill.icon-only{--_button-border-radius:50%}.control.stacked.size-super-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));--_button-block-size:calc(var(--stacked-size) + 20px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control.stacked.size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-super-condensed:not(.icon-only){padding-inline:16px}.control.stacked.size-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_button-block-size:calc(var(--stacked-size) + 24px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:6px;--_button-chevron-size:12px}.control.stacked.size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-condensed:not(.icon-only){padding-inline:12px}.control.stacked.size-expanded{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));--_button-block-size:calc(var(--stacked-size) + 32px);font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control.stacked.size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-expanded:not(.icon-only){padding-inline:20px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed){--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_button-block-size:calc(var(--stacked-size) + 28px);font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control.appearance-filled{--focus-stroke-gap-color:transparent}.control.appearance-filled:focus-visible{outline:none;position:relative}.control.appearance-filled:focus-visible:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));border-radius:var(--focus-border-radius,inherit);block-size:calc(100% + var(--focus-block-size-addition,4px));content:\"\";inline-size:calc(100% + var(--focus-block-size-addition,4px));display:block;position:absolute;inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}.control:not(.appearance-filled):focus-visible{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}slot[name=icon]{line-height:1}.icon-trailing slot[name=icon]{order:1;display:flex}.control.stacked slot[name=icon]{font-size:calc(var(--stacked-size) / 2)}.control:not(.stacked) slot[name=icon]{font-size:calc(var(--_button-block-size) / 2)}.chevron{font-size:var(--_button-chevron-size)}.content{justify-content:center;align-items:center;gap:var(--_button-icon-gap);flex:1;display:flex;overflow:hidden}.control.stacked .content{flex-direction:column}:host([dropdown-indicator]) .content{justify-content:var(--button-content-alignment,flex-start);text-align:start}:host([dropdown-indicator][stacked]) .content{align-items:var(--button-content-alignment,flex-start);justify-content:center}.pending-no-icon{position:absolute}.pending-no-icon+.text{visibility:hidden}:host([icon-trailing][pending]) .pending{order:1}.sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
96
96
  //#endregion
97
97
  //#region src/shared/patterns/chevron.ts
98
98
  var chevronTemplateFactory = (context) => {
@@ -92,7 +92,7 @@ __decorate([attr({
92
92
  __decorate([attr], Button.prototype, "label", void 0);
93
93
  //#endregion
94
94
  //#region src/lib/button/button.scss?inline
95
- var button_default = ".chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host{--_vvd-button-accent-firm-wrapper:var(--vvd-button-accent-firm);--_vvd-button-cta-firm-wrapper:var(--vvd-button-cta-firm);--_vvd-button-success-firm-wrapper:var(--vvd-button-success-firm);--_vvd-button-alert-firm-wrapper:var(--vvd-button-alert-firm);--_vvd-button-announcement-firm-wrapper:var(--vvd-button-announcement-firm)}.control:not(.appearance-ghost-light,.appearance-filled,.appearance-outlined){--vvd-button-accent-firm:var(--_vvd-button-accent-firm-wrapper,var(--vvd-button-accent-primary));--vvd-button-cta-firm:var(--_vvd-button-cta-firm-wrapper,var(--vvd-button-cta-primary));--vvd-button-success-firm:var(--_vvd-button-success-firm-wrapper,var(--vvd-button-success-primary));--vvd-button-alert-firm:var(--_vvd-button-alert-firm-wrapper,var(--vvd-button-alert-primary));--vvd-button-announcement-firm:var(--_vvd-button-announcement-firm-wrapper,var(--vvd-button-announcement-primary))}:host{display:inline-block}.control{--focus-stroke-gap-color:transparent;box-sizing:border-box;border-radius:var(--_button-border-radius);background-color:var(--_appearance-color-fill);block-size:var(--_button-block-size);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);justify-content:space-between;align-items:center;gap:var(--_button-icon-gap);vertical-align:middle;border:0;margin:0;text-decoration:none;display:inline-flex}.control .text{-webkit-line-clamp:var(--button-line-clamp,1);text-align:start;-webkit-box-orient:vertical;max-inline-size:100%;display:-webkit-box;overflow:hidden}.control:not(.icon-only){inline-size:100%}.control:not(.disabled){cursor:var(--button-cursor,pointer)}.control.disabled{cursor:not-allowed}.control{user-select:none}.control:not(.stacked).size-super-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control:not(.stacked).size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-super-condensed:not(.icon-only){padding-inline:8px}.control:not(.stacked).size-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:8px;--_button-chevron-size:12px}.control:not(.stacked).size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-condensed:not(.icon-only){padding-inline:12px}.control:not(.stacked).size-expanded{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control:not(.stacked).size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-expanded:not(.icon-only){padding-inline:20px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed){--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control:not(.shape-pill){--_button-border-radius:8px}.control:not(.shape-pill).size-condensed:not(.stacked),.control:not(.shape-pill).size-super-condensed:not(.stacked){--_button-border-radius:4px}.control.shape-pill:not(.icon-only,.stacked.size-super-condensed,.stacked.size-condensed,.stacked.normal){--_button-border-radius:24px}.control.shape-pill.stacked.size-condensed,.control.shape-pill.stacked.size-super-condensed{--_button-border-radius:16px}.control.shape-pill.stacked.size-normal{--_button-border-radius:20px}.control.shape-pill.icon-only{--_button-border-radius:50%}.control.stacked.size-super-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));--_button-block-size:calc(var(--stacked-size) + 20px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control.stacked.size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-super-condensed:not(.icon-only){padding-inline:16px}.control.stacked.size-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_button-block-size:calc(var(--stacked-size) + 24px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:6px;--_button-chevron-size:12px}.control.stacked.size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-condensed:not(.icon-only){padding-inline:12px}.control.stacked.size-expanded{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));--_button-block-size:calc(var(--stacked-size) + 32px);font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control.stacked.size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-expanded:not(.icon-only){padding-inline:20px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed){--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_button-block-size:calc(var(--stacked-size) + 28px);font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control.appearance-filled{--focus-stroke-gap-color:transparent}.control.appearance-filled:focus-visible{outline:none;position:relative}.control.appearance-filled:focus-visible:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));border-radius:var(--focus-border-radius,inherit);block-size:calc(100% + var(--focus-block-size-addition,4px));content:\"\";inline-size:calc(100% + var(--focus-block-size-addition,4px));display:block;position:absolute;inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}.control:not(.appearance-filled):focus-visible{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}slot[name=icon]{line-height:1}.icon-trailing slot[name=icon]{order:1;display:flex}.control.stacked slot[name=icon]{font-size:calc(var(--stacked-size) / 2)}.control:not(.stacked) slot[name=icon]{font-size:calc(var(--_button-block-size) / 2)}.chevron{font-size:var(--_button-chevron-size)}.content{justify-content:center;align-items:center;gap:var(--_button-icon-gap);flex:1;display:flex;overflow:hidden}.control.stacked .content{flex-direction:column}:host([dropdown-indicator]) .content{justify-content:var(--button-content-alignment,flex-start);text-align:start}:host([dropdown-indicator][stacked]) .content{align-items:var(--button-content-alignment,flex-start);justify-content:center}.pending-no-icon{position:absolute}.pending-no-icon+.text{visibility:hidden}:host([icon-trailing][pending]) .pending{order:1}.sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
95
+ var button_default = ".chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host{--_vvd-button-accent-firm-wrapper:var(--vvd-button-accent-firm);--_vvd-button-cta-firm-wrapper:var(--vvd-button-cta-firm);--_vvd-button-success-firm-wrapper:var(--vvd-button-success-firm);--_vvd-button-alert-firm-wrapper:var(--vvd-button-alert-firm);--_vvd-button-announcement-firm-wrapper:var(--vvd-button-announcement-firm)}.control:not(.appearance-ghost-light,.appearance-filled,.appearance-outlined){--vvd-button-accent-firm:var(--_vvd-button-accent-firm-wrapper,var(--vvd-button-accent-primary));--vvd-button-cta-firm:var(--_vvd-button-cta-firm-wrapper,var(--vvd-button-cta-primary));--vvd-button-success-firm:var(--_vvd-button-success-firm-wrapper,var(--vvd-button-success-primary));--vvd-button-alert-firm:var(--_vvd-button-alert-firm-wrapper,var(--vvd-button-alert-primary));--vvd-button-announcement-firm:var(--_vvd-button-announcement-firm-wrapper,var(--vvd-button-announcement-primary))}:host{display:inline-block}.control{--focus-stroke-gap-color:transparent;box-sizing:border-box;border-radius:var(--_button-border-radius);background-color:var(--_appearance-color-fill);block-size:var(--_button-block-size);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);justify-content:space-between;align-items:center;gap:var(--_button-icon-gap);vertical-align:middle;border:0;margin:0;text-decoration:none;display:inline-flex}.control .text{-webkit-line-clamp:var(--button-line-clamp,1);text-align:start;-webkit-box-orient:vertical;max-inline-size:100%;display:-webkit-box;overflow:hidden}.control:not(.icon-only){inline-size:100%}.control:not(.disabled){cursor:var(--button-cursor,pointer)}.control.disabled{cursor:not-allowed}.control.disabled.appearance-ghost{color:var(--_picker-field-disabled-icon-color,var(--_appearance-color-text))}.control{user-select:none}.control:not(.stacked).size-super-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control:not(.stacked).size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-super-condensed:not(.icon-only){padding-inline:8px}.control:not(.stacked).size-condensed{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:8px;--_button-chevron-size:12px}.control:not(.stacked).size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-condensed:not(.icon-only){padding-inline:12px}.control:not(.stacked).size-expanded{--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control:not(.stacked).size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked).size-expanded:not(.icon-only){padding-inline:20px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed){--_button-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control:not(.stacked):not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control:not(.shape-pill){--_button-border-radius:8px}.control:not(.shape-pill).size-condensed:not(.stacked),.control:not(.shape-pill).size-super-condensed:not(.stacked){--_button-border-radius:4px}.control.shape-pill:not(.icon-only,.stacked.size-super-condensed,.stacked.size-condensed,.stacked.normal){--_button-border-radius:24px}.control.shape-pill.stacked.size-condensed,.control.shape-pill.stacked.size-super-condensed{--_button-border-radius:16px}.control.shape-pill.stacked.size-normal{--_button-border-radius:20px}.control.shape-pill.icon-only{--_button-border-radius:50%}.control.stacked.size-super-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));--_button-block-size:calc(var(--stacked-size) + 20px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:4px;--_button-chevron-size:10px}.control.stacked.size-super-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-super-condensed:not(.icon-only){padding-inline:16px}.control.stacked.size-condensed{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_button-block-size:calc(var(--stacked-size) + 24px);font:var(--vvd-typography-base-condensed-bold);--_button-icon-gap:6px;--_button-chevron-size:12px}.control.stacked.size-condensed.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-condensed:not(.icon-only){padding-inline:12px}.control.stacked.size-expanded{--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) + 8));--_button-block-size:calc(var(--stacked-size) + 32px);font:var(--vvd-typography-base-extended-bold);--_button-icon-gap:10px;--_button-chevron-size:16px}.control.stacked.size-expanded.icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked.size-expanded:not(.icon-only){padding-inline:20px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed){--stacked-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_button-block-size:calc(var(--stacked-size) + 28px);font:var(--vvd-typography-base-bold);--_button-icon-gap:8px;--_button-chevron-size:16px}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed).icon-only{padding-inline:calc(var(--_button-block-size) / 4)}.control.stacked:not(.size-condensed,.size-expanded,.size-super-condensed):not(.icon-only){padding-inline:16px}.control.appearance-filled{--focus-stroke-gap-color:transparent}.control.appearance-filled:focus-visible{outline:none;position:relative}.control.appearance-filled:focus-visible:after{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));border-radius:var(--focus-border-radius,inherit);block-size:calc(100% + var(--focus-block-size-addition,4px));content:\"\";inline-size:calc(100% + var(--focus-block-size-addition,4px));display:block;position:absolute;inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}.control:not(.appearance-filled):focus-visible{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}slot[name=icon]{line-height:1}.icon-trailing slot[name=icon]{order:1;display:flex}.control.stacked slot[name=icon]{font-size:calc(var(--stacked-size) / 2)}.control:not(.stacked) slot[name=icon]{font-size:calc(var(--_button-block-size) / 2)}.chevron{font-size:var(--_button-chevron-size)}.content{justify-content:center;align-items:center;gap:var(--_button-icon-gap);flex:1;display:flex;overflow:hidden}.control.stacked .content{flex-direction:column}:host([dropdown-indicator]) .content{justify-content:var(--button-content-alignment,flex-start);text-align:start}:host([dropdown-indicator][stacked]) .content{align-items:var(--button-content-alignment,flex-start);justify-content:center}.pending-no-icon{position:absolute}.pending-no-icon+.text{visibility:hidden}:host([icon-trailing][pending]) .pending{order:1}.sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
96
96
  //#endregion
97
97
  //#region src/shared/patterns/chevron.ts
98
98
  var chevronTemplateFactory = (context) => {
@@ -14,9 +14,11 @@ const require_definition$5 = require("./definition26.cjs");
14
14
  const require_definition$6 = require("./definition27.cjs");
15
15
  const require_option = require("./option.cjs");
16
16
  const require_definition$7 = require("./definition29.cjs");
17
- const require_definition$8 = require("./definition36.cjs");
17
+ const require_optgroup = require("./optgroup.cjs");
18
+ const require_definition$8 = require("./definition30.cjs");
19
+ const require_definition$9 = require("./definition36.cjs");
18
20
  const require_slottable_request = require("./slottable-request.cjs");
19
- const require_definition$9 = require("./definition64.cjs");
21
+ const require_definition$10 = require("./definition64.cjs");
20
22
  let _microsoft_fast_element = require("@microsoft/fast-element");
21
23
  let _microsoft_fast_web_utilities = require("@microsoft/fast-web-utilities");
22
24
  let prosemirror_model = require("prosemirror-model");
@@ -1095,7 +1097,7 @@ var createOption = (ctx, props) => {
1095
1097
  };
1096
1098
  var createSelect = (ctx, props) => {
1097
1099
  const disabled = () => Boolean(ctx.evalProp(ctx.props.disabled));
1098
- const select = ctx.rte.createComponent(require_definition$9.Select);
1100
+ const select = ctx.rte.createComponent(require_definition$10.Select);
1099
1101
  select.setAttribute("data-class", "ui-select");
1100
1102
  ctx.bindToEl(select, {
1101
1103
  placeholder: " ",
@@ -3382,6 +3384,7 @@ var RteKeyboardShortcutsFeature = require_slottable_request.featureFacade(RteKey
3382
3384
  var suggest_style_default = ".suggest-popover{flex-direction:column;gap:2px;max-block-size:408px;min-inline-size:128px;max-inline-size:248px;padding:4px;display:flex}.suggest-loading-widget{vertical-align:middle;white-space:normal;align-items:center;margin-inline-start:2px;display:inline-flex}.suggest-empty-message{color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);text-align:center;justify-content:center;align-items:center;min-block-size:40px;display:flex}";
3383
3385
  //#endregion
3384
3386
  //#region src/lib/rich-text-editor/rte/features/suggest.ts
3387
+ var isSuggestionGroup = (entry) => "suggestions" in entry;
3385
3388
  var isPopoverOpen = (state) => Boolean(state?.suggestions && !state.dismissed);
3386
3389
  var popoverShowsResults = (state) => isPopoverOpen(state) && state.suggestions.items.length > 0;
3387
3390
  function findMatch(state, regex) {
@@ -3420,7 +3423,7 @@ var RteSuggestFeatureImpl = class extends require_slottable_request.RteFeatureIm
3420
3423
  dispatch({
3421
3424
  type: "load",
3422
3425
  generation: gen,
3423
- suggestions
3426
+ entries: suggestions
3424
3427
  });
3425
3428
  }
3426
3429
  constructor(featureId, options) {
@@ -3462,16 +3465,20 @@ var RteSuggestFeatureImpl = class extends require_slottable_request.RteFeatureIm
3462
3465
  };
3463
3466
  const action = tr.getMeta(this.pluginKey);
3464
3467
  if (prevState && action) switch (action.type) {
3465
- case "load": return {
3466
- ...prevState,
3467
- suggestions: {
3468
- generation: action.generation,
3469
- items: action.suggestions,
3470
- selectedIndex: 0,
3471
- visibleFocus: false
3472
- },
3473
- loadingDecoration: loadingDecoration(false)
3474
- };
3468
+ case "load": {
3469
+ const entries = action.entries.filter((entry) => !isSuggestionGroup(entry) || entry.suggestions.length > 0);
3470
+ return {
3471
+ ...prevState,
3472
+ suggestions: {
3473
+ generation: action.generation,
3474
+ entries,
3475
+ items: entries.flatMap((entry) => isSuggestionGroup(entry) ? entry.suggestions : [entry]),
3476
+ selectedIndex: 0,
3477
+ visibleFocus: false
3478
+ },
3479
+ loadingDecoration: loadingDecoration(false)
3480
+ };
3481
+ }
3475
3482
  case "navigate": {
3476
3483
  /* v8 ignore next 3 -- defensive: navigate is only dispatched after results are loaded @preserve */
3477
3484
  if (!prevState.suggestions?.items.length) return prevState;
@@ -3560,15 +3567,17 @@ var RteSuggestFeatureImpl = class extends require_slottable_request.RteFeatureIm
3560
3567
  }));
3561
3568
  return;
3562
3569
  }
3563
- for (const [index, suggestion] of suggestions.items.entries()) {
3570
+ const createOption = (suggestion, index, scrollTarget) => {
3564
3571
  const item = rte.createComponent(require_option.ListboxOption);
3565
3572
  item.text = suggestion.text;
3566
3573
  item.textSecondary = suggestion.textSecondary;
3574
+ item.icon = suggestion.icon;
3567
3575
  if (index === suggestions.selectedIndex) {
3568
3576
  item.selected = true;
3569
3577
  if (suggestions.visibleFocus) item._highlighted = true;
3578
+ const target = scrollTarget ?? item;
3570
3579
  queueMicrotask(() => {
3571
- item.scrollIntoView({ block: "nearest" });
3580
+ target.scrollIntoView({ block: "nearest" });
3572
3581
  });
3573
3582
  }
3574
3583
  item.addEventListener("click", (e) => {
@@ -3576,7 +3585,21 @@ var RteSuggestFeatureImpl = class extends require_slottable_request.RteFeatureIm
3576
3585
  e.stopPropagation();
3577
3586
  this.selectSuggestion(view, suggestState, suggestion);
3578
3587
  });
3579
- content.appendChild(item);
3588
+ return item;
3589
+ };
3590
+ let index = 0;
3591
+ for (const entry of suggestions.entries) {
3592
+ if (!isSuggestionGroup(entry)) {
3593
+ content.appendChild(createOption(entry, index++));
3594
+ continue;
3595
+ }
3596
+ const group = rte.createComponent(require_optgroup.Optgroup);
3597
+ const label = document.createElement("span");
3598
+ label.slot = "label";
3599
+ label.textContent = entry.label;
3600
+ group.appendChild(label);
3601
+ for (const [i, suggestion] of entry.suggestions.entries()) group.appendChild(createOption(suggestion, index++, i === 0 ? group : void 0));
3602
+ content.appendChild(group);
3580
3603
  }
3581
3604
  };
3582
3605
  return {
@@ -3671,9 +3694,10 @@ var RteCharacterCountFeature = require_slottable_request.featureFacade(RteCharac
3671
3694
  //#endregion
3672
3695
  //#region src/lib/rich-text-editor/definition.ts
3673
3696
  var richTextEditorDefinition = require_vivid_element.defineVividComponent("rich-text-editor", RichTextEditor, RichTextEditorTemplate, [
3674
- require_definition$8.dividerDefinition,
3675
- require_definition$9.selectDefinition,
3697
+ require_definition$9.dividerDefinition,
3698
+ require_definition$10.selectDefinition,
3676
3699
  require_definition$7.listboxOptionDefinition,
3700
+ require_definition$8.optgroupDefinition,
3677
3701
  require_definition$1.buttonDefinition,
3678
3702
  require_definition$6.tooltipDefinition,
3679
3703
  require_definition$4.menuDefinition,
@@ -13,6 +13,8 @@ import { n as textFieldDefinition, r as TextField } from "./definition26.js";
13
13
  import { n as tooltipDefinition, r as Tooltip } from "./definition27.js";
14
14
  import { t as ListboxOption } from "./option.js";
15
15
  import { t as listboxOptionDefinition } from "./definition29.js";
16
+ import { t as Optgroup } from "./optgroup.js";
17
+ import { t as optgroupDefinition } from "./definition30.js";
16
18
  import { t as dividerDefinition } from "./definition36.js";
17
19
  import { a as featureFacade, c as impl, i as contributionPriority, n as removeSymbol, o as getFeatureImpl, r as RteFeatureImpl, s as sortedContributions, t as dispatchSlottableRequest } from "./slottable-request.js";
18
20
  import { n as selectDefinition, r as Select } from "./definition64.js";
@@ -3380,6 +3382,7 @@ var RteKeyboardShortcutsFeature = featureFacade(RteKeyboardShortcutsFeatureImpl)
3380
3382
  var suggest_style_default = ".suggest-popover{flex-direction:column;gap:2px;max-block-size:408px;min-inline-size:128px;max-inline-size:248px;padding:4px;display:flex}.suggest-loading-widget{vertical-align:middle;white-space:normal;align-items:center;margin-inline-start:2px;display:inline-flex}.suggest-empty-message{color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);text-align:center;justify-content:center;align-items:center;min-block-size:40px;display:flex}";
3381
3383
  //#endregion
3382
3384
  //#region src/lib/rich-text-editor/rte/features/suggest.ts
3385
+ var isSuggestionGroup = (entry) => "suggestions" in entry;
3383
3386
  var isPopoverOpen = (state) => Boolean(state?.suggestions && !state.dismissed);
3384
3387
  var popoverShowsResults = (state) => isPopoverOpen(state) && state.suggestions.items.length > 0;
3385
3388
  function findMatch(state, regex) {
@@ -3418,7 +3421,7 @@ var RteSuggestFeatureImpl = class extends RteFeatureImpl {
3418
3421
  dispatch({
3419
3422
  type: "load",
3420
3423
  generation: gen,
3421
- suggestions
3424
+ entries: suggestions
3422
3425
  });
3423
3426
  }
3424
3427
  constructor(featureId, options) {
@@ -3460,16 +3463,20 @@ var RteSuggestFeatureImpl = class extends RteFeatureImpl {
3460
3463
  };
3461
3464
  const action = tr.getMeta(this.pluginKey);
3462
3465
  if (prevState && action) switch (action.type) {
3463
- case "load": return {
3464
- ...prevState,
3465
- suggestions: {
3466
- generation: action.generation,
3467
- items: action.suggestions,
3468
- selectedIndex: 0,
3469
- visibleFocus: false
3470
- },
3471
- loadingDecoration: loadingDecoration(false)
3472
- };
3466
+ case "load": {
3467
+ const entries = action.entries.filter((entry) => !isSuggestionGroup(entry) || entry.suggestions.length > 0);
3468
+ return {
3469
+ ...prevState,
3470
+ suggestions: {
3471
+ generation: action.generation,
3472
+ entries,
3473
+ items: entries.flatMap((entry) => isSuggestionGroup(entry) ? entry.suggestions : [entry]),
3474
+ selectedIndex: 0,
3475
+ visibleFocus: false
3476
+ },
3477
+ loadingDecoration: loadingDecoration(false)
3478
+ };
3479
+ }
3473
3480
  case "navigate": {
3474
3481
  /* v8 ignore next 3 -- defensive: navigate is only dispatched after results are loaded @preserve */
3475
3482
  if (!prevState.suggestions?.items.length) return prevState;
@@ -3558,15 +3565,17 @@ var RteSuggestFeatureImpl = class extends RteFeatureImpl {
3558
3565
  }));
3559
3566
  return;
3560
3567
  }
3561
- for (const [index, suggestion] of suggestions.items.entries()) {
3568
+ const createOption = (suggestion, index, scrollTarget) => {
3562
3569
  const item = rte.createComponent(ListboxOption);
3563
3570
  item.text = suggestion.text;
3564
3571
  item.textSecondary = suggestion.textSecondary;
3572
+ item.icon = suggestion.icon;
3565
3573
  if (index === suggestions.selectedIndex) {
3566
3574
  item.selected = true;
3567
3575
  if (suggestions.visibleFocus) item._highlighted = true;
3576
+ const target = scrollTarget ?? item;
3568
3577
  queueMicrotask(() => {
3569
- item.scrollIntoView({ block: "nearest" });
3578
+ target.scrollIntoView({ block: "nearest" });
3570
3579
  });
3571
3580
  }
3572
3581
  item.addEventListener("click", (e) => {
@@ -3574,7 +3583,21 @@ var RteSuggestFeatureImpl = class extends RteFeatureImpl {
3574
3583
  e.stopPropagation();
3575
3584
  this.selectSuggestion(view, suggestState, suggestion);
3576
3585
  });
3577
- content.appendChild(item);
3586
+ return item;
3587
+ };
3588
+ let index = 0;
3589
+ for (const entry of suggestions.entries) {
3590
+ if (!isSuggestionGroup(entry)) {
3591
+ content.appendChild(createOption(entry, index++));
3592
+ continue;
3593
+ }
3594
+ const group = rte.createComponent(Optgroup);
3595
+ const label = document.createElement("span");
3596
+ label.slot = "label";
3597
+ label.textContent = entry.label;
3598
+ group.appendChild(label);
3599
+ for (const [i, suggestion] of entry.suggestions.entries()) group.appendChild(createOption(suggestion, index++, i === 0 ? group : void 0));
3600
+ content.appendChild(group);
3578
3601
  }
3579
3602
  };
3580
3603
  return {
@@ -3672,6 +3695,7 @@ var richTextEditorDefinition = defineVividComponent("rich-text-editor", RichText
3672
3695
  dividerDefinition,
3673
3696
  selectDefinition,
3674
3697
  listboxOptionDefinition,
3698
+ optgroupDefinition,
3675
3699
  buttonDefinition,
3676
3700
  tooltipDefinition,
3677
3701
  menuDefinition,