@vonage/vivid 4.5.0 → 4.7.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 (173) hide show
  1. package/custom-elements.json +947 -79
  2. package/elevation/index.cjs +1 -1
  3. package/elevation/index.js +1 -1
  4. package/index.cjs +62 -56
  5. package/index.js +20 -19
  6. package/lib/components.d.ts +1 -0
  7. package/lib/dialog/dialog.d.ts +0 -1
  8. package/lib/menu/menu.d.ts +2 -1
  9. package/lib/number-field/number-field.d.ts +3 -1
  10. package/lib/searchable-select/definition.d.ts +4 -0
  11. package/lib/searchable-select/locale.d.ts +9 -0
  12. package/lib/searchable-select/option-tag.d.ts +14 -0
  13. package/lib/searchable-select/option-tag.template.d.ts +4 -0
  14. package/lib/searchable-select/searchable-select.d.ts +29 -0
  15. package/lib/searchable-select/searchable-select.form-associated.d.ts +10 -0
  16. package/lib/searchable-select/searchable-select.template.d.ts +4 -0
  17. package/lib/select/select.d.ts +3 -1
  18. package/lib/tab/locale.d.ts +3 -0
  19. package/lib/tab/tab.d.ts +5 -1
  20. package/lib/tag/definition.d.ts +1 -0
  21. package/lib/text-field/text-field.d.ts +3 -1
  22. package/locales/de-DE.cjs +24 -0
  23. package/locales/de-DE.js +24 -0
  24. package/locales/en-GB.cjs +24 -0
  25. package/locales/en-GB.js +24 -0
  26. package/locales/en-US.cjs +24 -0
  27. package/locales/en-US.js +24 -0
  28. package/locales/ja-JP.cjs +24 -0
  29. package/locales/ja-JP.js +24 -0
  30. package/locales/zh-CN.cjs +24 -0
  31. package/locales/zh-CN.js +24 -0
  32. package/package.json +1 -1
  33. package/popup/index.cjs +1 -1
  34. package/popup/index.js +1 -1
  35. package/searchable-select/index.cjs +5 -0
  36. package/searchable-select/index.js +3 -0
  37. package/select/index.cjs +1 -1
  38. package/select/index.js +1 -1
  39. package/selectable-box/index.cjs +1 -1
  40. package/selectable-box/index.js +1 -1
  41. package/shared/definition11.cjs +1 -1
  42. package/shared/definition11.js +1 -1
  43. package/shared/definition14.cjs +1 -1
  44. package/shared/definition14.js +1 -1
  45. package/shared/definition16.cjs +1 -1
  46. package/shared/definition16.js +1 -1
  47. package/shared/definition18.cjs +2 -2
  48. package/shared/definition18.js +2 -2
  49. package/shared/definition19.cjs +2 -2
  50. package/shared/definition19.js +2 -2
  51. package/shared/definition20.cjs +14 -34
  52. package/shared/definition20.js +14 -34
  53. package/shared/definition21.cjs +2 -19
  54. package/shared/definition21.js +2 -19
  55. package/shared/definition26.cjs +1 -1
  56. package/shared/definition26.js +1 -1
  57. package/shared/definition29.cjs +4 -0
  58. package/shared/definition29.js +4 -0
  59. package/shared/definition30.cjs +2 -1
  60. package/shared/definition30.js +2 -1
  61. package/shared/definition35.cjs +12 -7
  62. package/shared/definition35.js +12 -7
  63. package/shared/definition36.cjs +50 -207
  64. package/shared/definition36.js +51 -207
  65. package/shared/definition4.cjs +1 -1
  66. package/shared/definition4.js +1 -1
  67. package/shared/definition42.cjs +1 -1
  68. package/shared/definition42.js +1 -1
  69. package/shared/definition43.cjs +1018 -647
  70. package/shared/definition43.js +1014 -644
  71. package/shared/definition44.cjs +723 -112
  72. package/shared/definition44.js +722 -111
  73. package/shared/definition45.cjs +121 -80
  74. package/shared/definition45.js +119 -78
  75. package/shared/definition46.cjs +81 -614
  76. package/shared/definition46.js +80 -612
  77. package/shared/definition47.cjs +608 -114
  78. package/shared/definition47.js +606 -113
  79. package/shared/definition48.cjs +116 -134
  80. package/shared/definition48.js +115 -133
  81. package/shared/definition49.cjs +149 -19
  82. package/shared/definition49.js +148 -18
  83. package/shared/definition5.cjs +1 -1
  84. package/shared/definition5.js +1 -1
  85. package/shared/definition50.cjs +21 -82
  86. package/shared/definition50.js +20 -81
  87. package/shared/definition51.cjs +77 -539
  88. package/shared/definition51.js +76 -538
  89. package/shared/definition52.cjs +568 -28
  90. package/shared/definition52.js +567 -27
  91. package/shared/definition53.cjs +28 -123
  92. package/shared/definition53.js +26 -122
  93. package/shared/definition54.cjs +115 -295
  94. package/shared/definition54.js +114 -294
  95. package/shared/definition55.cjs +251 -311
  96. package/shared/definition55.js +251 -311
  97. package/shared/definition56.cjs +299 -780
  98. package/shared/definition56.js +298 -779
  99. package/shared/definition57.cjs +800 -102
  100. package/shared/definition57.js +799 -101
  101. package/shared/definition58.cjs +92 -63
  102. package/shared/definition58.js +91 -62
  103. package/shared/definition59.cjs +117 -75
  104. package/shared/definition59.js +116 -74
  105. package/shared/definition60.cjs +70 -285
  106. package/shared/definition60.js +71 -286
  107. package/shared/definition61.cjs +274 -66146
  108. package/shared/definition61.js +273 -66145
  109. package/shared/definition62.cjs +66160 -27
  110. package/shared/definition62.js +66158 -25
  111. package/shared/definition63.cjs +24 -1952
  112. package/shared/definition63.js +23 -1950
  113. package/shared/definition64.cjs +1976 -0
  114. package/shared/definition64.js +1971 -0
  115. package/shared/listbox-option.cjs +204 -0
  116. package/shared/listbox-option.js +201 -0
  117. package/shared/listbox.cjs +3 -3
  118. package/shared/listbox.js +1 -1
  119. package/shared/localization/Locale.d.ts +4 -0
  120. package/shared/presentationDate.cjs +2 -2
  121. package/shared/presentationDate.js +2 -2
  122. package/shared/scrollIntoView.cjs +51 -0
  123. package/shared/scrollIntoView.js +49 -0
  124. package/shared/slider.template.cjs +1 -1
  125. package/shared/slider.template.js +1 -1
  126. package/shared/text-field.cjs +1 -1
  127. package/shared/text-field.js +1 -1
  128. package/shared/utils/scrollIntoView.d.ts +1 -0
  129. package/side-drawer/index.cjs +1 -1
  130. package/side-drawer/index.js +1 -1
  131. package/slider/index.cjs +1 -1
  132. package/slider/index.js +1 -1
  133. package/split-button/index.cjs +1 -1
  134. package/split-button/index.js +1 -1
  135. package/styles/core/all.css +1 -1
  136. package/styles/core/theme.css +1 -1
  137. package/styles/core/typography.css +1 -1
  138. package/styles/tokens/theme-dark.css +4 -4
  139. package/styles/tokens/theme-light.css +4 -4
  140. package/styles/tokens/vivid-2-compat.css +1 -1
  141. package/switch/index.cjs +1 -1
  142. package/switch/index.js +1 -1
  143. package/tab/index.cjs +1 -1
  144. package/tab/index.js +1 -1
  145. package/tab-panel/index.cjs +1 -1
  146. package/tab-panel/index.js +1 -1
  147. package/tabs/index.cjs +1 -1
  148. package/tabs/index.js +1 -1
  149. package/tag/index.cjs +1 -1
  150. package/tag/index.js +1 -1
  151. package/tag-group/index.cjs +1 -1
  152. package/tag-group/index.js +1 -1
  153. package/text-area/index.cjs +1 -1
  154. package/text-area/index.js +1 -1
  155. package/text-field/index.cjs +1 -1
  156. package/text-field/index.js +1 -1
  157. package/time-picker/index.cjs +1 -1
  158. package/time-picker/index.js +1 -1
  159. package/toggletip/index.cjs +1 -1
  160. package/toggletip/index.js +1 -1
  161. package/tooltip/index.cjs +1 -1
  162. package/tooltip/index.js +1 -1
  163. package/tree-item/index.cjs +1 -1
  164. package/tree-item/index.js +1 -1
  165. package/tree-view/index.cjs +1 -1
  166. package/tree-view/index.js +1 -1
  167. package/video-player/index.cjs +1 -1
  168. package/video-player/index.js +1 -1
  169. package/vivid.api.json +295 -0
  170. package/api-extractor.json +0 -25
  171. package/shared/dialog-polyfill.esm.cjs +0 -862
  172. package/shared/dialog-polyfill.esm.js +0 -858
  173. package/tsdoc-metadata.json +0 -11
@@ -3,207 +3,12 @@
3
3
  const index = require('./index.cjs');
4
4
  const definition = require('./definition27.cjs');
5
5
  const affix = require('./affix.cjs');
6
- const ariaGlobal = require('./aria-global.cjs');
7
- const startEnd = require('./start-end.cjs');
6
+ const listboxOption = require('./listbox-option.cjs');
8
7
  const applyMixins = require('./apply-mixins.cjs');
9
- const dom = require('./dom.cjs');
8
+ const icon = require('./icon.cjs');
10
9
  const when = require('./when.cjs');
11
10
  const classNames = require('./class-names.cjs');
12
11
 
13
- /**
14
- * Determines if the element is a {@link (ListboxOption:class)}
15
- *
16
- * @param element - the element to test.
17
- * @public
18
- */
19
- function isListboxOption(el) {
20
- return (dom.isHTMLElement(el) &&
21
- (el.getAttribute("role") === "option" ||
22
- el instanceof HTMLOptionElement));
23
- }
24
- /**
25
- * An Option Custom HTML Element.
26
- * Implements {@link https://www.w3.org/TR/wai-aria-1.1/#option | ARIA option }.
27
- *
28
- * @slot start - Content which can be provided before the listbox option content
29
- * @slot end - Content which can be provided after the listbox option content
30
- * @slot - The default slot for listbox option content
31
- * @csspart content - Wraps the listbox option content
32
- *
33
- * @public
34
- */
35
- let ListboxOption$1 = class ListboxOption extends index.FoundationElement {
36
- constructor(text, value, defaultSelected, selected) {
37
- super();
38
- /**
39
- * The defaultSelected state of the option.
40
- * @public
41
- */
42
- this.defaultSelected = false;
43
- /**
44
- * Tracks whether the "selected" property has been changed.
45
- * @internal
46
- */
47
- this.dirtySelected = false;
48
- /**
49
- * The checked state of the control.
50
- *
51
- * @public
52
- */
53
- this.selected = this.defaultSelected;
54
- /**
55
- * Track whether the value has been changed from the initial value
56
- */
57
- this.dirtyValue = false;
58
- if (text) {
59
- this.textContent = text;
60
- }
61
- if (value) {
62
- this.initialValue = value;
63
- }
64
- if (defaultSelected) {
65
- this.defaultSelected = defaultSelected;
66
- }
67
- if (selected) {
68
- this.selected = selected;
69
- }
70
- this.proxy = new Option(`${this.textContent}`, this.initialValue, this.defaultSelected, this.selected);
71
- this.proxy.disabled = this.disabled;
72
- }
73
- /**
74
- * Updates the ariaChecked property when the checked property changes.
75
- *
76
- * @param prev - the previous checked value
77
- * @param next - the current checked value
78
- *
79
- * @public
80
- */
81
- checkedChanged(prev, next) {
82
- if (typeof next === "boolean") {
83
- this.ariaChecked = next ? "true" : "false";
84
- return;
85
- }
86
- this.ariaChecked = null;
87
- }
88
- /**
89
- * Updates the proxy's text content when the default slot changes.
90
- * @param prev - the previous content value
91
- * @param next - the current content value
92
- *
93
- * @internal
94
- */
95
- contentChanged(prev, next) {
96
- if (this.proxy instanceof HTMLOptionElement) {
97
- this.proxy.textContent = this.textContent;
98
- }
99
- this.$emit("contentchange", null, { bubbles: true });
100
- }
101
- defaultSelectedChanged() {
102
- if (!this.dirtySelected) {
103
- this.selected = this.defaultSelected;
104
- if (this.proxy instanceof HTMLOptionElement) {
105
- this.proxy.selected = this.defaultSelected;
106
- }
107
- }
108
- }
109
- disabledChanged(prev, next) {
110
- this.ariaDisabled = this.disabled ? "true" : "false";
111
- if (this.proxy instanceof HTMLOptionElement) {
112
- this.proxy.disabled = this.disabled;
113
- }
114
- }
115
- selectedAttributeChanged() {
116
- this.defaultSelected = this.selectedAttribute;
117
- if (this.proxy instanceof HTMLOptionElement) {
118
- this.proxy.defaultSelected = this.defaultSelected;
119
- }
120
- }
121
- selectedChanged() {
122
- this.ariaSelected = this.selected ? "true" : "false";
123
- if (!this.dirtySelected) {
124
- this.dirtySelected = true;
125
- }
126
- if (this.proxy instanceof HTMLOptionElement) {
127
- this.proxy.selected = this.selected;
128
- }
129
- }
130
- initialValueChanged(previous, next) {
131
- // If the value is clean and the component is connected to the DOM
132
- // then set value equal to the attribute value.
133
- if (!this.dirtyValue) {
134
- this.value = this.initialValue;
135
- this.dirtyValue = false;
136
- }
137
- }
138
- get label() {
139
- var _a;
140
- return (_a = this.value) !== null && _a !== void 0 ? _a : this.text;
141
- }
142
- get text() {
143
- var _a, _b;
144
- return (_b = (_a = this.textContent) === null || _a === void 0 ? void 0 : _a.replace(/\s+/g, " ").trim()) !== null && _b !== void 0 ? _b : "";
145
- }
146
- set value(next) {
147
- const newValue = `${next !== null && next !== void 0 ? next : ""}`;
148
- this._value = newValue;
149
- this.dirtyValue = true;
150
- if (this.proxy instanceof HTMLOptionElement) {
151
- this.proxy.value = newValue;
152
- }
153
- index.Observable.notify(this, "value");
154
- }
155
- get value() {
156
- var _a;
157
- index.Observable.track(this, "value");
158
- return (_a = this._value) !== null && _a !== void 0 ? _a : this.text;
159
- }
160
- get form() {
161
- return this.proxy ? this.proxy.form : null;
162
- }
163
- };
164
- index.__decorate([
165
- index.observable
166
- ], ListboxOption$1.prototype, "checked", void 0);
167
- index.__decorate([
168
- index.observable
169
- ], ListboxOption$1.prototype, "content", void 0);
170
- index.__decorate([
171
- index.observable
172
- ], ListboxOption$1.prototype, "defaultSelected", void 0);
173
- index.__decorate([
174
- index.attr({ mode: "boolean" })
175
- ], ListboxOption$1.prototype, "disabled", void 0);
176
- index.__decorate([
177
- index.attr({ attribute: "selected", mode: "boolean" })
178
- ], ListboxOption$1.prototype, "selectedAttribute", void 0);
179
- index.__decorate([
180
- index.observable
181
- ], ListboxOption$1.prototype, "selected", void 0);
182
- index.__decorate([
183
- index.attr({ attribute: "value", mode: "fromView" })
184
- ], ListboxOption$1.prototype, "initialValue", void 0);
185
- /**
186
- * States and properties relating to the ARIA `option` role.
187
- *
188
- * @public
189
- */
190
- class DelegatesARIAListboxOption {
191
- }
192
- index.__decorate([
193
- index.observable
194
- ], DelegatesARIAListboxOption.prototype, "ariaChecked", void 0);
195
- index.__decorate([
196
- index.observable
197
- ], DelegatesARIAListboxOption.prototype, "ariaPosInSet", void 0);
198
- index.__decorate([
199
- index.observable
200
- ], DelegatesARIAListboxOption.prototype, "ariaSelected", void 0);
201
- index.__decorate([
202
- index.observable
203
- ], DelegatesARIAListboxOption.prototype, "ariaSetSize", void 0);
204
- applyMixins.applyMixins(DelegatesARIAListboxOption, ariaGlobal.ARIAGlobalStatesAndProperties);
205
- applyMixins.applyMixins(ListboxOption$1, startEnd.StartEnd, DelegatesARIAListboxOption);
206
-
207
12
  var __defProp = Object.defineProperty;
208
13
  var __decorateClass = (decorators, target, key, kind) => {
209
14
  var result = void 0 ;
@@ -213,7 +18,13 @@ var __decorateClass = (decorators, target, key, kind) => {
213
18
  if (result) __defProp(target, key, result);
214
19
  return result;
215
20
  };
216
- class ListboxOption extends ListboxOption$1 {
21
+ class ListboxOption extends listboxOption.ListboxOption {
22
+ constructor() {
23
+ super(...arguments);
24
+ this._highlighted = false;
25
+ this._displayCheckmark = false;
26
+ this._matchedRange = null;
27
+ }
217
28
  // #region overrides base class accessor
218
29
  set text(value) {
219
30
  this._text = value;
@@ -227,7 +38,12 @@ class ListboxOption extends ListboxOption$1 {
227
38
  set label(value) {
228
39
  this._label = value;
229
40
  }
230
- // #endregion overrides
41
+ /**
42
+ * @internal
43
+ */
44
+ get _matchedRangeSafe() {
45
+ return this._matchedRange ?? { from: 0, to: 0 };
46
+ }
231
47
  }
232
48
  __decorateClass([
233
49
  index.attr({
@@ -239,17 +55,28 @@ __decorateClass([
239
55
  attribute: "label"
240
56
  })
241
57
  ], ListboxOption.prototype, "_label");
58
+ __decorateClass([
59
+ index.observable
60
+ ], ListboxOption.prototype, "_highlighted");
61
+ __decorateClass([
62
+ index.observable
63
+ ], ListboxOption.prototype, "_displayCheckmark");
64
+ __decorateClass([
65
+ index.observable
66
+ ], ListboxOption.prototype, "_matchedRange");
242
67
  applyMixins.applyMixins(ListboxOption, affix.AffixIconWithTrailing);
243
68
 
244
- const getClasses = ({ icon, disabled, selected, checked }) => classNames.classNames(
69
+ const getClasses = (x) => classNames.classNames(
245
70
  "base",
246
- ["disabled", disabled],
247
- ["selected", Boolean(selected)],
248
- ["active", Boolean(checked)],
249
- ["icon", Boolean(icon)]
71
+ ["disabled", x.disabled],
72
+ ["selected", Boolean(x.selected)],
73
+ ["hover", Boolean(x._highlighted)],
74
+ ["active", Boolean(x.checked)],
75
+ ["icon", Boolean(x.icon)]
250
76
  );
251
77
  const ListboxOptionTemplate = (context) => {
252
78
  const affixIconTemplate = affix.affixIconTemplateFactory(context);
79
+ const iconTag = context.tagFor(icon.Icon);
253
80
  return index.html`
254
81
  <template
255
82
  aria-checked="${(x) => x.ariaChecked}"
@@ -261,13 +88,30 @@ const ListboxOptionTemplate = (context) => {
261
88
  >
262
89
  <div class="${getClasses}">
263
90
  ${(x) => affixIconTemplate(x.icon, affix.IconWrapper.Slot)}
264
- ${when.when((x) => x.text, index.html`<div class="text">${(x) => x.text}</div>`)}
91
+ ${when.when(
92
+ (x) => x.text,
93
+ index.html`<div class="text">
94
+ ${when.when(
95
+ (x) => x._matchedRange,
96
+ index.html`${(x) => x.text.slice(0, x._matchedRangeSafe.from)}<span class="match"
97
+ >${(x) => x.text.slice(
98
+ x._matchedRangeSafe.from,
99
+ x._matchedRangeSafe.to
100
+ )}</span
101
+ >`
102
+ )}${(x) => x.text.slice(x._matchedRangeSafe.to)}
103
+ </div>`
104
+ )}
105
+ ${when.when(
106
+ (x) => x._displayCheckmark && x.selected,
107
+ index.html`<${iconTag} class="checkmark" name="check-line"></${iconTag}>`
108
+ )}
265
109
  </div>
266
110
  </template>
267
111
  `;
268
112
  };
269
113
 
270
- const styles = ":host([disabled]){cursor:not-allowed}.base{--_connotation-color-primary: var(--vvd-option-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-option-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-option-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-firm: var(--vvd-option-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-option-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-option-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-option-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-dim: var(--vvd-option-accent-dim, var(--vvd-color-neutral-200))}.base{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.base:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.base{display:flex;box-sizing:border-box;align-items:center;border-radius:8px;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_option-appearance-color-text, var(--_appearance-color-text));font:var(--vvd-typography-base);gap:12px;hyphens:auto;inline-size:100%;min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)));padding-inline:16px;vertical-align:middle;word-break:break-word}@supports (user-select: none){.base{user-select:none}}.base:not(.disabled){cursor:pointer}.base.disabled{pointer-events:none}.base .text{font:var(--vvd-typography-base)}:host([aria-checked=true]) .base{--focus-stroke-color: var(--vvd-color-neutral-500);--focus-stroke-gap-color: transparent;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}slot[name=icon]{font-size:20px;line-height:1}.base:not(.disabled,.selected) slot[name=icon]{color:var(--vvd-color-neutral-600)}";
114
+ const styles = ":host([disabled]){cursor:not-allowed}.base{--_connotation-color-primary: var(--vvd-option-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-option-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-option-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-firm: var(--vvd-option-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-option-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-option-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-option-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-dim: var(--vvd-option-accent-dim, var(--vvd-color-neutral-200))}.base{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.base:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.base{display:flex;box-sizing:border-box;align-items:center;border-radius:8px;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_option-appearance-color-text, var(--_appearance-color-text));font:var(--vvd-typography-base);gap:12px;hyphens:auto;inline-size:100%;min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)));padding-inline:16px;vertical-align:middle;word-break:break-word}@supports (user-select: none){.base{user-select:none}}.base:not(.disabled){cursor:pointer}.base.disabled{pointer-events:none}:host([aria-checked=true]) .base{--focus-stroke-color: var(--vvd-color-neutral-500);--focus-stroke-gap-color: transparent;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.text{font:var(--vvd-typography-base)}.match{color:var(--vvd-color-cta-600);font:var(--vvd-typography-base-bold)}slot[name=icon]{font-size:20px;line-height:1}.base:not(.disabled,.selected) slot[name=icon]{color:var(--vvd-color-neutral-600)}.checkmark{margin-left:auto;font-size:20px}";
271
115
 
272
116
  const listboxOptionDefinition = ListboxOption.compose({
273
117
  baseName: "option",
@@ -281,7 +125,6 @@ const listboxOptionRegistries = [
281
125
  const registerOption = index.registerFactory(listboxOptionRegistries);
282
126
 
283
127
  exports.ListboxOption = ListboxOption;
284
- exports.isListboxOption = isListboxOption;
285
128
  exports.listboxOptionDefinition = listboxOptionDefinition;
286
129
  exports.listboxOptionRegistries = listboxOptionRegistries;
287
130
  exports.registerOption = registerOption;
@@ -1,207 +1,12 @@
1
- import { F as FoundationElement, O as Observable, _ as __decorate, o as observable, a as attr, h as html, r as registerFactory } from './index.js';
1
+ import { a as attr, o as observable, h as html, r as registerFactory } from './index.js';
2
2
  import { a as iconRegistries } from './definition27.js';
3
3
  import { b as AffixIconWithTrailing, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
4
- import { A as ARIAGlobalStatesAndProperties } from './aria-global.js';
5
- import { S as StartEnd } from './start-end.js';
4
+ import { L as ListboxOption$1 } from './listbox-option.js';
6
5
  import { a as applyMixins } from './apply-mixins.js';
7
- import { i as isHTMLElement } from './dom.js';
6
+ import { I as Icon } from './icon.js';
8
7
  import { w as when } from './when.js';
9
8
  import { c as classNames } from './class-names.js';
10
9
 
11
- /**
12
- * Determines if the element is a {@link (ListboxOption:class)}
13
- *
14
- * @param element - the element to test.
15
- * @public
16
- */
17
- function isListboxOption(el) {
18
- return (isHTMLElement(el) &&
19
- (el.getAttribute("role") === "option" ||
20
- el instanceof HTMLOptionElement));
21
- }
22
- /**
23
- * An Option Custom HTML Element.
24
- * Implements {@link https://www.w3.org/TR/wai-aria-1.1/#option | ARIA option }.
25
- *
26
- * @slot start - Content which can be provided before the listbox option content
27
- * @slot end - Content which can be provided after the listbox option content
28
- * @slot - The default slot for listbox option content
29
- * @csspart content - Wraps the listbox option content
30
- *
31
- * @public
32
- */
33
- let ListboxOption$1 = class ListboxOption extends FoundationElement {
34
- constructor(text, value, defaultSelected, selected) {
35
- super();
36
- /**
37
- * The defaultSelected state of the option.
38
- * @public
39
- */
40
- this.defaultSelected = false;
41
- /**
42
- * Tracks whether the "selected" property has been changed.
43
- * @internal
44
- */
45
- this.dirtySelected = false;
46
- /**
47
- * The checked state of the control.
48
- *
49
- * @public
50
- */
51
- this.selected = this.defaultSelected;
52
- /**
53
- * Track whether the value has been changed from the initial value
54
- */
55
- this.dirtyValue = false;
56
- if (text) {
57
- this.textContent = text;
58
- }
59
- if (value) {
60
- this.initialValue = value;
61
- }
62
- if (defaultSelected) {
63
- this.defaultSelected = defaultSelected;
64
- }
65
- if (selected) {
66
- this.selected = selected;
67
- }
68
- this.proxy = new Option(`${this.textContent}`, this.initialValue, this.defaultSelected, this.selected);
69
- this.proxy.disabled = this.disabled;
70
- }
71
- /**
72
- * Updates the ariaChecked property when the checked property changes.
73
- *
74
- * @param prev - the previous checked value
75
- * @param next - the current checked value
76
- *
77
- * @public
78
- */
79
- checkedChanged(prev, next) {
80
- if (typeof next === "boolean") {
81
- this.ariaChecked = next ? "true" : "false";
82
- return;
83
- }
84
- this.ariaChecked = null;
85
- }
86
- /**
87
- * Updates the proxy's text content when the default slot changes.
88
- * @param prev - the previous content value
89
- * @param next - the current content value
90
- *
91
- * @internal
92
- */
93
- contentChanged(prev, next) {
94
- if (this.proxy instanceof HTMLOptionElement) {
95
- this.proxy.textContent = this.textContent;
96
- }
97
- this.$emit("contentchange", null, { bubbles: true });
98
- }
99
- defaultSelectedChanged() {
100
- if (!this.dirtySelected) {
101
- this.selected = this.defaultSelected;
102
- if (this.proxy instanceof HTMLOptionElement) {
103
- this.proxy.selected = this.defaultSelected;
104
- }
105
- }
106
- }
107
- disabledChanged(prev, next) {
108
- this.ariaDisabled = this.disabled ? "true" : "false";
109
- if (this.proxy instanceof HTMLOptionElement) {
110
- this.proxy.disabled = this.disabled;
111
- }
112
- }
113
- selectedAttributeChanged() {
114
- this.defaultSelected = this.selectedAttribute;
115
- if (this.proxy instanceof HTMLOptionElement) {
116
- this.proxy.defaultSelected = this.defaultSelected;
117
- }
118
- }
119
- selectedChanged() {
120
- this.ariaSelected = this.selected ? "true" : "false";
121
- if (!this.dirtySelected) {
122
- this.dirtySelected = true;
123
- }
124
- if (this.proxy instanceof HTMLOptionElement) {
125
- this.proxy.selected = this.selected;
126
- }
127
- }
128
- initialValueChanged(previous, next) {
129
- // If the value is clean and the component is connected to the DOM
130
- // then set value equal to the attribute value.
131
- if (!this.dirtyValue) {
132
- this.value = this.initialValue;
133
- this.dirtyValue = false;
134
- }
135
- }
136
- get label() {
137
- var _a;
138
- return (_a = this.value) !== null && _a !== void 0 ? _a : this.text;
139
- }
140
- get text() {
141
- var _a, _b;
142
- return (_b = (_a = this.textContent) === null || _a === void 0 ? void 0 : _a.replace(/\s+/g, " ").trim()) !== null && _b !== void 0 ? _b : "";
143
- }
144
- set value(next) {
145
- const newValue = `${next !== null && next !== void 0 ? next : ""}`;
146
- this._value = newValue;
147
- this.dirtyValue = true;
148
- if (this.proxy instanceof HTMLOptionElement) {
149
- this.proxy.value = newValue;
150
- }
151
- Observable.notify(this, "value");
152
- }
153
- get value() {
154
- var _a;
155
- Observable.track(this, "value");
156
- return (_a = this._value) !== null && _a !== void 0 ? _a : this.text;
157
- }
158
- get form() {
159
- return this.proxy ? this.proxy.form : null;
160
- }
161
- };
162
- __decorate([
163
- observable
164
- ], ListboxOption$1.prototype, "checked", void 0);
165
- __decorate([
166
- observable
167
- ], ListboxOption$1.prototype, "content", void 0);
168
- __decorate([
169
- observable
170
- ], ListboxOption$1.prototype, "defaultSelected", void 0);
171
- __decorate([
172
- attr({ mode: "boolean" })
173
- ], ListboxOption$1.prototype, "disabled", void 0);
174
- __decorate([
175
- attr({ attribute: "selected", mode: "boolean" })
176
- ], ListboxOption$1.prototype, "selectedAttribute", void 0);
177
- __decorate([
178
- observable
179
- ], ListboxOption$1.prototype, "selected", void 0);
180
- __decorate([
181
- attr({ attribute: "value", mode: "fromView" })
182
- ], ListboxOption$1.prototype, "initialValue", void 0);
183
- /**
184
- * States and properties relating to the ARIA `option` role.
185
- *
186
- * @public
187
- */
188
- class DelegatesARIAListboxOption {
189
- }
190
- __decorate([
191
- observable
192
- ], DelegatesARIAListboxOption.prototype, "ariaChecked", void 0);
193
- __decorate([
194
- observable
195
- ], DelegatesARIAListboxOption.prototype, "ariaPosInSet", void 0);
196
- __decorate([
197
- observable
198
- ], DelegatesARIAListboxOption.prototype, "ariaSelected", void 0);
199
- __decorate([
200
- observable
201
- ], DelegatesARIAListboxOption.prototype, "ariaSetSize", void 0);
202
- applyMixins(DelegatesARIAListboxOption, ARIAGlobalStatesAndProperties);
203
- applyMixins(ListboxOption$1, StartEnd, DelegatesARIAListboxOption);
204
-
205
10
  var __defProp = Object.defineProperty;
206
11
  var __decorateClass = (decorators, target, key, kind) => {
207
12
  var result = void 0 ;
@@ -212,6 +17,12 @@ var __decorateClass = (decorators, target, key, kind) => {
212
17
  return result;
213
18
  };
214
19
  class ListboxOption extends ListboxOption$1 {
20
+ constructor() {
21
+ super(...arguments);
22
+ this._highlighted = false;
23
+ this._displayCheckmark = false;
24
+ this._matchedRange = null;
25
+ }
215
26
  // #region overrides base class accessor
216
27
  set text(value) {
217
28
  this._text = value;
@@ -225,7 +36,12 @@ class ListboxOption extends ListboxOption$1 {
225
36
  set label(value) {
226
37
  this._label = value;
227
38
  }
228
- // #endregion overrides
39
+ /**
40
+ * @internal
41
+ */
42
+ get _matchedRangeSafe() {
43
+ return this._matchedRange ?? { from: 0, to: 0 };
44
+ }
229
45
  }
230
46
  __decorateClass([
231
47
  attr({
@@ -237,17 +53,28 @@ __decorateClass([
237
53
  attribute: "label"
238
54
  })
239
55
  ], ListboxOption.prototype, "_label");
56
+ __decorateClass([
57
+ observable
58
+ ], ListboxOption.prototype, "_highlighted");
59
+ __decorateClass([
60
+ observable
61
+ ], ListboxOption.prototype, "_displayCheckmark");
62
+ __decorateClass([
63
+ observable
64
+ ], ListboxOption.prototype, "_matchedRange");
240
65
  applyMixins(ListboxOption, AffixIconWithTrailing);
241
66
 
242
- const getClasses = ({ icon, disabled, selected, checked }) => classNames(
67
+ const getClasses = (x) => classNames(
243
68
  "base",
244
- ["disabled", disabled],
245
- ["selected", Boolean(selected)],
246
- ["active", Boolean(checked)],
247
- ["icon", Boolean(icon)]
69
+ ["disabled", x.disabled],
70
+ ["selected", Boolean(x.selected)],
71
+ ["hover", Boolean(x._highlighted)],
72
+ ["active", Boolean(x.checked)],
73
+ ["icon", Boolean(x.icon)]
248
74
  );
249
75
  const ListboxOptionTemplate = (context) => {
250
76
  const affixIconTemplate = affixIconTemplateFactory(context);
77
+ const iconTag = context.tagFor(Icon);
251
78
  return html`
252
79
  <template
253
80
  aria-checked="${(x) => x.ariaChecked}"
@@ -259,13 +86,30 @@ const ListboxOptionTemplate = (context) => {
259
86
  >
260
87
  <div class="${getClasses}">
261
88
  ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
262
- ${when((x) => x.text, html`<div class="text">${(x) => x.text}</div>`)}
89
+ ${when(
90
+ (x) => x.text,
91
+ html`<div class="text">
92
+ ${when(
93
+ (x) => x._matchedRange,
94
+ html`${(x) => x.text.slice(0, x._matchedRangeSafe.from)}<span class="match"
95
+ >${(x) => x.text.slice(
96
+ x._matchedRangeSafe.from,
97
+ x._matchedRangeSafe.to
98
+ )}</span
99
+ >`
100
+ )}${(x) => x.text.slice(x._matchedRangeSafe.to)}
101
+ </div>`
102
+ )}
103
+ ${when(
104
+ (x) => x._displayCheckmark && x.selected,
105
+ html`<${iconTag} class="checkmark" name="check-line"></${iconTag}>`
106
+ )}
263
107
  </div>
264
108
  </template>
265
109
  `;
266
110
  };
267
111
 
268
- const styles = ":host([disabled]){cursor:not-allowed}.base{--_connotation-color-primary: var(--vvd-option-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-option-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-option-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-firm: var(--vvd-option-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-option-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-option-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-option-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-dim: var(--vvd-option-accent-dim, var(--vvd-color-neutral-200))}.base{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.base:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.base{display:flex;box-sizing:border-box;align-items:center;border-radius:8px;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_option-appearance-color-text, var(--_appearance-color-text));font:var(--vvd-typography-base);gap:12px;hyphens:auto;inline-size:100%;min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)));padding-inline:16px;vertical-align:middle;word-break:break-word}@supports (user-select: none){.base{user-select:none}}.base:not(.disabled){cursor:pointer}.base.disabled{pointer-events:none}.base .text{font:var(--vvd-typography-base)}:host([aria-checked=true]) .base{--focus-stroke-color: var(--vvd-color-neutral-500);--focus-stroke-gap-color: transparent;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}slot[name=icon]{font-size:20px;line-height:1}.base:not(.disabled,.selected) slot[name=icon]{color:var(--vvd-color-neutral-600)}";
112
+ const styles = ":host([disabled]){cursor:not-allowed}.base{--_connotation-color-primary: var(--vvd-option-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-option-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-option-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-firm: var(--vvd-option-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-option-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-option-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-option-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-dim: var(--vvd-option-accent-dim, var(--vvd-color-neutral-200))}.base{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.base:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.base{display:flex;box-sizing:border-box;align-items:center;border-radius:8px;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_option-appearance-color-text, var(--_appearance-color-text));font:var(--vvd-typography-base);gap:12px;hyphens:auto;inline-size:100%;min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)));padding-inline:16px;vertical-align:middle;word-break:break-word}@supports (user-select: none){.base{user-select:none}}.base:not(.disabled){cursor:pointer}.base.disabled{pointer-events:none}:host([aria-checked=true]) .base{--focus-stroke-color: var(--vvd-color-neutral-500);--focus-stroke-gap-color: transparent;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.text{font:var(--vvd-typography-base)}.match{color:var(--vvd-color-cta-600);font:var(--vvd-typography-base-bold)}slot[name=icon]{font-size:20px;line-height:1}.base:not(.disabled,.selected) slot[name=icon]{color:var(--vvd-color-neutral-600)}.checkmark{margin-left:auto;font-size:20px}";
269
113
 
270
114
  const listboxOptionDefinition = ListboxOption.compose({
271
115
  baseName: "option",
@@ -278,4 +122,4 @@ const listboxOptionRegistries = [
278
122
  ];
279
123
  const registerOption = registerFactory(listboxOptionRegistries);
280
124
 
281
- export { ListboxOption as L, listboxOptionRegistries as a, isListboxOption as i, listboxOptionDefinition as l, registerOption as r };
125
+ export { ListboxOption as L, listboxOptionRegistries as a, listboxOptionDefinition as l, registerOption as r };
@@ -2,7 +2,7 @@
2
2
 
3
3
  const index = require('./index.cjs');
4
4
  const definition$2 = require('./definition11.cjs');
5
- const definition = require('./definition62.cjs');
5
+ const definition = require('./definition63.cjs');
6
6
  const definition$1 = require('./definition27.cjs');
7
7
  const enums = require('./enums.cjs');
8
8
  const affix = require('./affix.cjs');
@@ -1,6 +1,6 @@
1
1
  import { F as FoundationElement, a as attr, n as nullableNumberConverter, h as html, r as registerFactory } from './index.js';
2
2
  import { a as buttonRegistries } from './definition11.js';
3
- import { E as Elevation, e as elevationRegistries } from './definition62.js';
3
+ import { E as Elevation, e as elevationRegistries } from './definition63.js';
4
4
  import { a as iconRegistries } from './definition27.js';
5
5
  import { C as Connotation } from './enums.js';
6
6
  import { A as AffixIcon, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const index = require('./index.cjs');
4
- const definition = require('./definition63.cjs');
4
+ const definition = require('./definition64.cjs');
5
5
  const keyCodes = require('./key-codes2.cjs');
6
6
  const formAssociated = require('./form-associated.cjs');
7
7
  const slider_template = require('./slider.template.cjs');
@@ -1,5 +1,5 @@
1
1
  import { F as FoundationElement, o as observable, a as attr, n as nullableNumberConverter, h as html, r as registerFactory } from './index.js';
2
- import { P as Popup, a as PlacementStrategy, p as popupRegistries } from './definition63.js';
2
+ import { P as Popup, a as PlacementStrategy, p as popupRegistries } from './definition64.js';
3
3
  import { e as keyHome, f as keyEnd, d as keyArrowUp, k as keyArrowLeft, c as keyArrowDown, a as keyArrowRight } from './key-codes2.js';
4
4
  import { F as FormAssociated } from './form-associated.js';
5
5
  import { l as limit, g as getMarkersTemplate } from './slider.template.js';