@vonage/vivid 3.0.0-next.13 → 3.0.0-next.130

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 (296) hide show
  1. package/README.md +160 -33
  2. package/accordion/index.js +4 -60
  3. package/accordion-item/index.js +14 -118
  4. package/action-group/index.js +5 -0
  5. package/avatar/index.js +11 -0
  6. package/badge/index.js +9 -53
  7. package/banner/index.js +20 -218
  8. package/breadcrumb/index.js +7 -96
  9. package/breadcrumb-item/index.js +15 -46
  10. package/button/index.js +19 -763
  11. package/calendar/index.js +5 -1520
  12. package/calendar-event/index.js +9 -0
  13. package/card/index.js +10 -133
  14. package/checkbox/index.js +16 -0
  15. package/combobox/index.js +33 -0
  16. package/custom-elements.json +5570 -0
  17. package/dialog/index.js +24 -0
  18. package/divider/index.js +6 -0
  19. package/elevation/index.js +4 -30
  20. package/fab/index.js +22 -0
  21. package/focus/index.js +4 -2
  22. package/header/index.js +6 -0
  23. package/icon/index.js +8 -36
  24. package/index.js +70 -26
  25. package/layout/index.js +4 -52
  26. package/lib/accordion/definition.d.ts +1 -0
  27. package/lib/accordion/index.d.ts +1 -2
  28. package/lib/accordion-item/definition.d.ts +1 -0
  29. package/lib/accordion-item/index.d.ts +1 -3
  30. package/lib/action-group/action-group.d.ts +10 -0
  31. package/lib/{sidenav-item/sidenav-item.template.d.ts → action-group/action-group.template.d.ts} +2 -2
  32. package/lib/action-group/definition.d.ts +1 -0
  33. package/lib/action-group/index.d.ts +1 -0
  34. package/lib/avatar/avatar.d.ts +15 -0
  35. package/lib/avatar/avatar.template.d.ts +4 -0
  36. package/lib/avatar/definition.d.ts +1 -0
  37. package/lib/avatar/index.d.ts +1 -0
  38. package/lib/badge/badge.d.ts +2 -4
  39. package/lib/badge/definition.d.ts +3 -0
  40. package/lib/badge/index.d.ts +1 -3
  41. package/lib/banner/banner.d.ts +1 -1
  42. package/lib/banner/banner.template.d.ts +0 -2
  43. package/lib/banner/definition.d.ts +1 -0
  44. package/lib/banner/index.d.ts +1 -2
  45. package/lib/breadcrumb/breadcrumb.template.d.ts +4 -0
  46. package/lib/breadcrumb/definition.d.ts +1 -0
  47. package/lib/breadcrumb/index.d.ts +1 -2
  48. package/lib/breadcrumb-item/definition.d.ts +1 -0
  49. package/lib/breadcrumb-item/index.d.ts +1 -3
  50. package/lib/button/button.d.ts +3 -3
  51. package/lib/button/definition.d.ts +1 -0
  52. package/lib/button/index.d.ts +1 -21
  53. package/lib/calendar/calendar.d.ts +3 -1
  54. package/lib/calendar/definition.d.ts +1 -0
  55. package/lib/calendar/index.d.ts +1 -3
  56. package/lib/calendar-event/calendar-event.d.ts +14 -0
  57. package/lib/calendar-event/calendar-event.template.d.ts +4 -0
  58. package/lib/calendar-event/definition.d.ts +1 -0
  59. package/lib/calendar-event/index.d.ts +1 -0
  60. package/lib/card/card.d.ts +2 -2
  61. package/lib/card/definition.d.ts +1 -0
  62. package/lib/card/index.d.ts +1 -5
  63. package/lib/checkbox/checkbox.d.ts +5 -0
  64. package/lib/checkbox/checkbox.template.d.ts +4 -0
  65. package/lib/checkbox/definition.d.ts +1 -0
  66. package/lib/checkbox/index.d.ts +1 -0
  67. package/lib/combobox/combobox.d.ts +14 -0
  68. package/lib/combobox/combobox.template.d.ts +4 -0
  69. package/lib/combobox/definition.d.ts +3 -0
  70. package/lib/combobox/index.d.ts +1 -0
  71. package/lib/components.d.ts +40 -16
  72. package/lib/dialog/definition.d.ts +1 -0
  73. package/lib/dialog/dialog.d.ts +23 -0
  74. package/lib/dialog/dialog.template.d.ts +4 -0
  75. package/lib/dialog/index.d.ts +1 -0
  76. package/lib/divider/definition.d.ts +1 -0
  77. package/lib/divider/divider.d.ts +3 -0
  78. package/lib/divider/divider.template.d.ts +4 -0
  79. package/lib/divider/index.d.ts +1 -0
  80. package/lib/elevation/definition.d.ts +1 -0
  81. package/lib/elevation/elevation.d.ts +1 -0
  82. package/lib/elevation/index.d.ts +1 -2
  83. package/lib/enums.d.ts +14 -6
  84. package/lib/fab/definition.d.ts +3 -0
  85. package/lib/fab/fab.d.ts +13 -0
  86. package/lib/fab/fab.template.d.ts +4 -0
  87. package/lib/fab/index.d.ts +1 -0
  88. package/lib/focus/definition.d.ts +3 -0
  89. package/lib/focus/index.d.ts +1 -2
  90. package/lib/{sidenav-item/index.d.ts → header/definition.d.ts} +2 -2
  91. package/lib/header/header.d.ts +5 -0
  92. package/lib/header/header.template.d.ts +4 -0
  93. package/lib/header/index.d.ts +1 -0
  94. package/lib/icon/definition.d.ts +3 -0
  95. package/lib/icon/icon.d.ts +5 -7
  96. package/lib/icon/index.d.ts +1 -2
  97. package/lib/layout/definition.d.ts +3 -0
  98. package/lib/layout/index.d.ts +1 -2
  99. package/lib/layout/layout.d.ts +4 -4
  100. package/lib/listbox/definition.d.ts +3 -0
  101. package/lib/listbox/index.d.ts +1 -0
  102. package/lib/listbox/listbox.d.ts +6 -0
  103. package/lib/listbox/listbox.template.d.ts +4 -0
  104. package/lib/menu/definition.d.ts +11 -0
  105. package/lib/menu/index.d.ts +1 -0
  106. package/lib/menu/menu.d.ts +10 -0
  107. package/lib/menu/menu.template.d.ts +3 -0
  108. package/lib/menu-item/definition.d.ts +3 -0
  109. package/lib/menu-item/index.d.ts +1 -0
  110. package/lib/menu-item/menu-item.d.ts +7 -0
  111. package/lib/menu-item/menu-item.template.d.ts +5 -0
  112. package/lib/nav/definition.d.ts +3 -0
  113. package/lib/nav/index.d.ts +1 -0
  114. package/lib/nav/nav.d.ts +3 -0
  115. package/lib/nav/nav.template.d.ts +4 -0
  116. package/lib/nav-disclosure/definition.d.ts +3 -0
  117. package/lib/nav-disclosure/index.d.ts +1 -0
  118. package/lib/nav-disclosure/nav-disclosure.d.ts +10 -0
  119. package/lib/nav-disclosure/nav-disclosure.template.d.ts +4 -0
  120. package/lib/nav-item/definition.d.ts +3 -0
  121. package/lib/nav-item/index.d.ts +1 -0
  122. package/lib/{sidenav-item/sidenav-item.d.ts → nav-item/nav-item.d.ts} +2 -2
  123. package/lib/nav-item/nav-item.template.d.ts +4 -0
  124. package/lib/note/definition.d.ts +3 -0
  125. package/lib/note/index.d.ts +1 -0
  126. package/lib/note/note.d.ts +10 -0
  127. package/lib/{text/text.template.d.ts → note/note.template.d.ts} +2 -2
  128. package/lib/number-field/definition.d.ts +4 -0
  129. package/lib/number-field/index.d.ts +1 -0
  130. package/lib/number-field/number-field.d.ts +14 -0
  131. package/lib/number-field/number-field.template.d.ts +4 -0
  132. package/lib/option/definition.d.ts +3 -0
  133. package/lib/option/index.d.ts +1 -0
  134. package/lib/option/option.d.ts +9 -0
  135. package/lib/option/option.template.d.ts +4 -0
  136. package/lib/popup/definition.d.ts +4 -0
  137. package/lib/popup/index.d.ts +1 -4
  138. package/lib/popup/popup.d.ts +8 -4
  139. package/lib/progress/definition.d.ts +3 -0
  140. package/lib/progress/index.d.ts +1 -2
  141. package/lib/progress/progress.d.ts +1 -1
  142. package/lib/progress-ring/definition.d.ts +3 -0
  143. package/lib/progress-ring/index.d.ts +1 -2
  144. package/lib/progress-ring/progress-ring.d.ts +2 -1
  145. package/lib/radio/definition.d.ts +3 -0
  146. package/lib/radio/index.d.ts +1 -0
  147. package/lib/radio/radio.d.ts +4 -0
  148. package/lib/radio/radio.template.d.ts +4 -0
  149. package/lib/radio-group/definition.d.ts +11 -0
  150. package/lib/radio-group/index.d.ts +1 -0
  151. package/lib/radio-group/radio-group.d.ts +4 -0
  152. package/lib/radio-group/radio-group.template.d.ts +4 -0
  153. package/lib/side-drawer/definition.d.ts +3 -0
  154. package/lib/side-drawer/index.d.ts +1 -2
  155. package/lib/side-drawer/side-drawer.d.ts +3 -2
  156. package/lib/slider/definition.d.ts +3 -0
  157. package/lib/slider/index.d.ts +1 -0
  158. package/lib/slider/slider.d.ts +4 -0
  159. package/lib/slider/slider.template.d.ts +4 -0
  160. package/lib/switch/definition.d.ts +3 -0
  161. package/lib/switch/index.d.ts +1 -0
  162. package/lib/switch/switch.d.ts +7 -0
  163. package/lib/switch/switch.template.d.ts +4 -0
  164. package/lib/text-anchor/definition.d.ts +3 -0
  165. package/lib/text-anchor/index.d.ts +1 -2
  166. package/lib/text-area/definition.d.ts +3 -0
  167. package/lib/text-area/index.d.ts +1 -0
  168. package/lib/text-area/text-area.d.ts +9 -0
  169. package/lib/text-area/text-area.template.d.ts +4 -0
  170. package/lib/text-field/definition.d.ts +3 -0
  171. package/lib/text-field/index.d.ts +1 -0
  172. package/lib/text-field/text-field.d.ts +14 -0
  173. package/lib/text-field/text-field.template.d.ts +4 -0
  174. package/lib/tooltip/definition.d.ts +3 -0
  175. package/lib/tooltip/index.d.ts +1 -3
  176. package/lib/tooltip/tooltip.d.ts +6 -6
  177. package/listbox/index.js +25 -0
  178. package/menu/index.js +30 -0
  179. package/menu-item/index.js +20 -0
  180. package/nav/index.js +4 -0
  181. package/nav-disclosure/index.js +17 -0
  182. package/nav-item/index.js +22 -0
  183. package/note/index.js +15 -0
  184. package/number-field/index.js +459 -0
  185. package/option/index.js +20 -0
  186. package/package.json +22 -11
  187. package/popup/index.js +21 -2062
  188. package/progress/index.js +6 -98
  189. package/progress-ring/index.js +6 -75
  190. package/radio/index.js +12 -0
  191. package/radio-group/index.js +11 -0
  192. package/shared/affix.js +2 -8
  193. package/shared/anchor.js +11 -3
  194. package/shared/apply-mixins.js +5 -4
  195. package/shared/aria-global.js +2 -86
  196. package/shared/aria.js +9 -0
  197. package/shared/base-progress.js +6 -1
  198. package/shared/breadcrumb-item.js +2 -2
  199. package/shared/button.js +200 -0
  200. package/shared/calendar-event.js +19 -0
  201. package/shared/definition.js +53 -0
  202. package/shared/definition10.js +99 -0
  203. package/shared/definition11.js +48 -0
  204. package/shared/definition12.js +1523 -0
  205. package/shared/definition13.js +111 -0
  206. package/shared/definition14.js +114 -0
  207. package/shared/definition15.js +32 -0
  208. package/shared/definition16.js +172 -0
  209. package/shared/definition17.js +734 -0
  210. package/shared/definition18.js +1644 -0
  211. package/shared/definition19.js +261 -0
  212. package/shared/definition2.js +106 -0
  213. package/shared/definition20.js +223 -0
  214. package/shared/definition21.js +78 -0
  215. package/shared/definition22.js +87 -0
  216. package/shared/definition23.js +58 -0
  217. package/shared/definition24.js +44 -0
  218. package/shared/definition25.js +58 -0
  219. package/shared/definition26.js +348 -0
  220. package/shared/definition27.js +351 -0
  221. package/shared/definition28.js +21 -0
  222. package/shared/definition29.js +75 -0
  223. package/shared/definition3.js +29 -0
  224. package/shared/definition30.js +31 -0
  225. package/shared/definition31.js +56 -0
  226. package/shared/definition32.js +94 -0
  227. package/shared/definition33.js +77 -0
  228. package/shared/definition34.js +45 -0
  229. package/shared/definition35.js +435 -0
  230. package/shared/definition36.js +86 -0
  231. package/shared/definition37.js +592 -0
  232. package/shared/definition38.js +147 -0
  233. package/shared/definition39.js +280 -0
  234. package/shared/definition4.js +19 -0
  235. package/shared/definition40.js +119 -0
  236. package/shared/definition41.js +77 -0
  237. package/shared/definition5.js +38 -0
  238. package/shared/definition6.js +60 -0
  239. package/shared/definition7.js +45 -0
  240. package/shared/definition8.js +113 -0
  241. package/shared/definition9.js +107 -0
  242. package/shared/design-system/index.d.ts +1 -1
  243. package/shared/dialog-polyfill.esm.js +858 -0
  244. package/shared/direction.js +20 -0
  245. package/shared/dom.js +8 -0
  246. package/shared/enums.js +70 -0
  247. package/shared/es.object.assign.js +2 -3
  248. package/shared/es.regexp.to-string.js +59 -0
  249. package/shared/focus.js +5 -0
  250. package/shared/focus2.js +11 -0
  251. package/shared/form-associated.js +466 -0
  252. package/shared/form-elements.js +121 -0
  253. package/shared/icon.js +538 -567
  254. package/shared/index.js +1664 -83
  255. package/shared/key-codes.js +97 -0
  256. package/shared/listbox.js +1002 -0
  257. package/shared/numbers.js +25 -0
  258. package/shared/patterns/affix.d.ts +1 -1
  259. package/shared/patterns/focus.d.ts +3 -0
  260. package/shared/patterns/form-elements/form-elements.d.ts +31 -0
  261. package/shared/patterns/form-elements/index.d.ts +1 -0
  262. package/shared/patterns/index.d.ts +2 -0
  263. package/shared/radio.js +127 -0
  264. package/shared/ref.js +41 -0
  265. package/shared/slotted.js +1 -1
  266. package/shared/start-end.js +50 -0
  267. package/shared/string-trim.js +40 -0
  268. package/shared/text-anchor.js +0 -2
  269. package/shared/text-anchor.template.js +6 -5
  270. package/shared/text-field.js +3 -0
  271. package/shared/text-field2.js +225 -0
  272. package/shared/to-string.js +51 -0
  273. package/side-drawer/index.js +5 -81
  274. package/slider/index.js +17 -0
  275. package/styles/core/all.css +83 -0
  276. package/styles/core/theme.css +11 -0
  277. package/styles/core/typography.css +77 -0
  278. package/styles/tokens/theme-dark.css +228 -0
  279. package/styles/tokens/theme-light.css +228 -0
  280. package/switch/index.js +17 -0
  281. package/text-anchor/index.js +11 -6
  282. package/text-area/index.js +23 -0
  283. package/text-field/index.js +24 -0
  284. package/tooltip/index.js +18 -55
  285. package/vivid.api.json +3275 -0
  286. package/lib/text/index.d.ts +0 -2
  287. package/lib/text/text.d.ts +0 -10
  288. package/shared/index2.js +0 -21
  289. package/shared/object-set-prototype-of.js +0 -1009
  290. package/shared/style-inject.es.js +0 -28
  291. package/shared/web.dom-collections.iterator.js +0 -473
  292. package/sidenav-item/index.js +0 -39
  293. package/styles/fonts/spezia.css +0 -23
  294. package/styles/themes/dark.css +0 -205
  295. package/styles/themes/light.css +0 -205
  296. package/text/index.js +0 -46
@@ -0,0 +1,1002 @@
1
+ import { F as FoundationElement, V as Observable, _ as __decorate, a as attr, N as observable, U as DOM, Z as nullableNumberConverter, b as __metadata } from './index.js';
2
+ import { i as isListboxOption } from './definition19.js';
3
+ import { A as ARIAGlobalStatesAndProperties } from './aria-global.js';
4
+ import { a as applyMixins } from './apply-mixins.js';
5
+ import { a as keySpace, b as keyEscape, k as keyEnter, c as keyTab, d as keyEnd, e as keyArrowUp, f as keyArrowDown, g as keyHome } from './key-codes.js';
6
+ import { i as inRange } from './numbers.js';
7
+
8
+ /**
9
+ * Returns the index of the last element in the array where predicate is true, and -1 otherwise.
10
+ *
11
+ * @param array - the array to test
12
+ * @param predicate - find calls predicate once for each element of the array, in descending order, until it finds one where predicate returns true. If such an element is found, findLastIndex immediately returns that element index. Otherwise, findIndex returns -1.
13
+ */
14
+ function findLastIndex(array, predicate) {
15
+ let k = array.length;
16
+ while (k--) {
17
+ if (predicate(array[k], k, array)) {
18
+ return k;
19
+ }
20
+ }
21
+ return -1;
22
+ }
23
+
24
+ let uniqueIdCounter = 0;
25
+ /**
26
+ * Generates a unique ID based on incrementing a counter.
27
+ */
28
+ function uniqueId(prefix = "") {
29
+ return `${prefix}${uniqueIdCounter++}`;
30
+ }
31
+
32
+ /**
33
+ * A Listbox Custom HTML Element.
34
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#listbox | ARIA listbox }.
35
+ *
36
+ * @slot - The default slot for the listbox options
37
+ *
38
+ * @public
39
+ */
40
+ class Listbox$1 extends FoundationElement {
41
+ constructor() {
42
+ super(...arguments);
43
+ /**
44
+ * The internal unfiltered list of selectable options.
45
+ *
46
+ * @internal
47
+ */
48
+ this._options = [];
49
+ /**
50
+ * The index of the selected option.
51
+ *
52
+ * @public
53
+ */
54
+ this.selectedIndex = -1;
55
+ /**
56
+ * A collection of the selected options.
57
+ *
58
+ * @public
59
+ */
60
+ this.selectedOptions = [];
61
+ /**
62
+ * A standard `click` event creates a `focus` event before firing, so a
63
+ * `mousedown` event is used to skip that initial focus.
64
+ *
65
+ * @internal
66
+ */
67
+ this.shouldSkipFocus = false;
68
+ /**
69
+ * The current typeahead buffer string.
70
+ *
71
+ * @internal
72
+ */
73
+ this.typeaheadBuffer = "";
74
+ /**
75
+ * Flag for the typeahead timeout expiration.
76
+ *
77
+ * @internal
78
+ */
79
+ this.typeaheadExpired = true;
80
+ /**
81
+ * The timeout ID for the typeahead handler.
82
+ *
83
+ * @internal
84
+ */
85
+ this.typeaheadTimeout = -1;
86
+ }
87
+ /**
88
+ * The first selected option.
89
+ *
90
+ * @internal
91
+ */
92
+ get firstSelectedOption() {
93
+ var _a;
94
+ return (_a = this.selectedOptions[0]) !== null && _a !== void 0 ? _a : null;
95
+ }
96
+ /**
97
+ * Returns true if there is one or more selectable option.
98
+ *
99
+ * @internal
100
+ */
101
+ get hasSelectableOptions() {
102
+ return this.options.length > 0 && !this.options.every(o => o.disabled);
103
+ }
104
+ /**
105
+ * The number of options.
106
+ *
107
+ * @public
108
+ */
109
+ get length() {
110
+ var _a, _b;
111
+ return (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
112
+ }
113
+ /**
114
+ * The list of options.
115
+ *
116
+ * @public
117
+ */
118
+ get options() {
119
+ Observable.track(this, "options");
120
+ return this._options;
121
+ }
122
+ set options(value) {
123
+ this._options = value;
124
+ Observable.notify(this, "options");
125
+ }
126
+ /**
127
+ * Flag for the typeahead timeout expiration.
128
+ *
129
+ * @deprecated use `Listbox.typeaheadExpired`
130
+ * @internal
131
+ */
132
+ get typeAheadExpired() {
133
+ return this.typeaheadExpired;
134
+ }
135
+ set typeAheadExpired(value) {
136
+ this.typeaheadExpired = value;
137
+ }
138
+ /**
139
+ * Handle click events for listbox options.
140
+ *
141
+ * @internal
142
+ */
143
+ clickHandler(e) {
144
+ const captured = e.target.closest(`option,[role=option]`);
145
+ if (captured && !captured.disabled) {
146
+ this.selectedIndex = this.options.indexOf(captured);
147
+ return true;
148
+ }
149
+ }
150
+ /**
151
+ * Ensures that the provided option is focused and scrolled into view.
152
+ *
153
+ * @param optionToFocus - The option to focus
154
+ * @internal
155
+ */
156
+ focusAndScrollOptionIntoView(optionToFocus = this.firstSelectedOption) {
157
+ // To ensure that the browser handles both `focus()` and `scrollIntoView()`, the
158
+ // timing here needs to guarantee that they happen on different frames. Since this
159
+ // function is typically called from the `openChanged` observer, `DOM.queueUpdate`
160
+ // causes the calls to be grouped into the same frame. To prevent this,
161
+ // `requestAnimationFrame` is used instead of `DOM.queueUpdate`.
162
+ if (this.contains(document.activeElement) && optionToFocus !== null) {
163
+ optionToFocus.focus();
164
+ requestAnimationFrame(() => {
165
+ optionToFocus.scrollIntoView({ block: "nearest" });
166
+ });
167
+ }
168
+ }
169
+ /**
170
+ * Handles `focusin` actions for the component. When the component receives focus,
171
+ * the list of selected options is refreshed and the first selected option is scrolled
172
+ * into view.
173
+ *
174
+ * @internal
175
+ */
176
+ focusinHandler(e) {
177
+ if (!this.shouldSkipFocus && e.target === e.currentTarget) {
178
+ this.setSelectedOptions();
179
+ this.focusAndScrollOptionIntoView();
180
+ }
181
+ this.shouldSkipFocus = false;
182
+ }
183
+ /**
184
+ * Returns the options which match the current typeahead buffer.
185
+ *
186
+ * @internal
187
+ */
188
+ getTypeaheadMatches() {
189
+ const pattern = this.typeaheadBuffer.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
190
+ const re = new RegExp(`^${pattern}`, "gi");
191
+ return this.options.filter((o) => o.text.trim().match(re));
192
+ }
193
+ /**
194
+ * Determines the index of the next option which is selectable, if any.
195
+ *
196
+ * @param prev - the previous selected index
197
+ * @param next - the next index to select
198
+ *
199
+ * @internal
200
+ */
201
+ getSelectableIndex(prev = this.selectedIndex, next) {
202
+ const direction = prev > next ? -1 : prev < next ? 1 : 0;
203
+ const potentialDirection = prev + direction;
204
+ let nextSelectableOption = null;
205
+ switch (direction) {
206
+ case -1: {
207
+ nextSelectableOption = this.options.reduceRight((nextSelectableOption, thisOption, index) => !nextSelectableOption &&
208
+ !thisOption.disabled &&
209
+ index < potentialDirection
210
+ ? thisOption
211
+ : nextSelectableOption, nextSelectableOption);
212
+ break;
213
+ }
214
+ case 1: {
215
+ nextSelectableOption = this.options.reduce((nextSelectableOption, thisOption, index) => !nextSelectableOption &&
216
+ !thisOption.disabled &&
217
+ index > potentialDirection
218
+ ? thisOption
219
+ : nextSelectableOption, nextSelectableOption);
220
+ break;
221
+ }
222
+ }
223
+ return this.options.indexOf(nextSelectableOption);
224
+ }
225
+ /**
226
+ * Handles external changes to child options.
227
+ *
228
+ * @param source - the source object
229
+ * @param propertyName - the property
230
+ *
231
+ * @internal
232
+ */
233
+ handleChange(source, propertyName) {
234
+ switch (propertyName) {
235
+ case "selected": {
236
+ if (Listbox$1.slottedOptionFilter(source)) {
237
+ this.selectedIndex = this.options.indexOf(source);
238
+ }
239
+ this.setSelectedOptions();
240
+ break;
241
+ }
242
+ }
243
+ }
244
+ /**
245
+ * Moves focus to an option whose label matches characters typed by the user.
246
+ * Consecutive keystrokes are batched into a buffer of search text used
247
+ * to match against the set of options. If `TYPE_AHEAD_TIMEOUT_MS` passes
248
+ * between consecutive keystrokes, the search restarts.
249
+ *
250
+ * @param key - the key to be evaluated
251
+ *
252
+ * @internal
253
+ */
254
+ handleTypeAhead(key) {
255
+ if (this.typeaheadTimeout) {
256
+ window.clearTimeout(this.typeaheadTimeout);
257
+ }
258
+ this.typeaheadTimeout = window.setTimeout(() => (this.typeaheadExpired = true), Listbox$1.TYPE_AHEAD_TIMEOUT_MS);
259
+ if (key.length > 1) {
260
+ return;
261
+ }
262
+ this.typeaheadBuffer = `${this.typeaheadExpired ? "" : this.typeaheadBuffer}${key}`;
263
+ }
264
+ /**
265
+ * Handles `keydown` actions for listbox navigation and typeahead.
266
+ *
267
+ * @internal
268
+ */
269
+ keydownHandler(e) {
270
+ if (this.disabled) {
271
+ return true;
272
+ }
273
+ this.shouldSkipFocus = false;
274
+ const key = e.key;
275
+ switch (key) {
276
+ // Select the first available option
277
+ case keyHome: {
278
+ if (!e.shiftKey) {
279
+ e.preventDefault();
280
+ this.selectFirstOption();
281
+ }
282
+ break;
283
+ }
284
+ // Select the next selectable option
285
+ case keyArrowDown: {
286
+ if (!e.shiftKey) {
287
+ e.preventDefault();
288
+ this.selectNextOption();
289
+ }
290
+ break;
291
+ }
292
+ // Select the previous selectable option
293
+ case keyArrowUp: {
294
+ if (!e.shiftKey) {
295
+ e.preventDefault();
296
+ this.selectPreviousOption();
297
+ }
298
+ break;
299
+ }
300
+ // Select the last available option
301
+ case keyEnd: {
302
+ e.preventDefault();
303
+ this.selectLastOption();
304
+ break;
305
+ }
306
+ case keyTab: {
307
+ this.focusAndScrollOptionIntoView();
308
+ return true;
309
+ }
310
+ case keyEnter:
311
+ case keyEscape: {
312
+ return true;
313
+ }
314
+ case keySpace: {
315
+ if (this.typeaheadExpired) {
316
+ return true;
317
+ }
318
+ }
319
+ // Send key to Typeahead handler
320
+ default: {
321
+ if (key.length === 1) {
322
+ this.handleTypeAhead(`${key}`);
323
+ }
324
+ return true;
325
+ }
326
+ }
327
+ }
328
+ /**
329
+ * Prevents `focusin` events from firing before `click` events when the
330
+ * element is unfocused.
331
+ *
332
+ * @internal
333
+ */
334
+ mousedownHandler(e) {
335
+ this.shouldSkipFocus = !this.contains(document.activeElement);
336
+ return true;
337
+ }
338
+ /**
339
+ * Switches between single-selection and multi-selection mode.
340
+ *
341
+ * @param prev - the previous value of the `multiple` attribute
342
+ * @param next - the next value of the `multiple` attribute
343
+ *
344
+ * @internal
345
+ */
346
+ multipleChanged(prev, next) {
347
+ this.ariaMultiSelectable = next ? "true" : null;
348
+ }
349
+ /**
350
+ * Updates the list of selected options when the `selectedIndex` changes.
351
+ *
352
+ * @param prev - the previous selected index value
353
+ * @param next - the current selected index value
354
+ *
355
+ * @internal
356
+ */
357
+ selectedIndexChanged(prev, next) {
358
+ var _a;
359
+ if (!this.hasSelectableOptions) {
360
+ this.selectedIndex = -1;
361
+ return;
362
+ }
363
+ if (((_a = this.options[this.selectedIndex]) === null || _a === void 0 ? void 0 : _a.disabled) && typeof prev === "number") {
364
+ const selectableIndex = this.getSelectableIndex(prev, next);
365
+ const newNext = selectableIndex > -1 ? selectableIndex : prev;
366
+ this.selectedIndex = newNext;
367
+ if (next === newNext) {
368
+ this.selectedIndexChanged(next, newNext);
369
+ }
370
+ return;
371
+ }
372
+ this.setSelectedOptions();
373
+ }
374
+ /**
375
+ * Updates the selectedness of each option when the list of selected options changes.
376
+ *
377
+ * @param prev - the previous list of selected options
378
+ * @param next - the current list of selected options
379
+ *
380
+ * @internal
381
+ */
382
+ selectedOptionsChanged(prev, next) {
383
+ var _a;
384
+ const filteredNext = next.filter(Listbox$1.slottedOptionFilter);
385
+ (_a = this.options) === null || _a === void 0 ? void 0 : _a.forEach(o => {
386
+ const notifier = Observable.getNotifier(o);
387
+ notifier.unsubscribe(this, "selected");
388
+ o.selected = filteredNext.includes(o);
389
+ notifier.subscribe(this, "selected");
390
+ });
391
+ }
392
+ /**
393
+ * Moves focus to the first selectable option.
394
+ *
395
+ * @public
396
+ */
397
+ selectFirstOption() {
398
+ var _a, _b;
399
+ if (!this.disabled) {
400
+ this.selectedIndex = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.findIndex(o => !o.disabled)) !== null && _b !== void 0 ? _b : -1;
401
+ }
402
+ }
403
+ /**
404
+ * Moves focus to the last selectable option.
405
+ *
406
+ * @internal
407
+ */
408
+ selectLastOption() {
409
+ if (!this.disabled) {
410
+ this.selectedIndex = findLastIndex(this.options, o => !o.disabled);
411
+ }
412
+ }
413
+ /**
414
+ * Moves focus to the next selectable option.
415
+ *
416
+ * @internal
417
+ */
418
+ selectNextOption() {
419
+ if (!this.disabled && this.selectedIndex < this.options.length - 1) {
420
+ this.selectedIndex += 1;
421
+ }
422
+ }
423
+ /**
424
+ * Moves focus to the previous selectable option.
425
+ *
426
+ * @internal
427
+ */
428
+ selectPreviousOption() {
429
+ if (!this.disabled && this.selectedIndex > 0) {
430
+ this.selectedIndex = this.selectedIndex - 1;
431
+ }
432
+ }
433
+ /**
434
+ * Updates the selected index to match the first selected option.
435
+ *
436
+ * @internal
437
+ */
438
+ setDefaultSelectedOption() {
439
+ var _a, _b;
440
+ this.selectedIndex = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.findIndex(el => el.defaultSelected)) !== null && _b !== void 0 ? _b : -1;
441
+ }
442
+ /**
443
+ * Sets an option as selected and gives it focus.
444
+ *
445
+ * @public
446
+ */
447
+ setSelectedOptions() {
448
+ var _a, _b, _c;
449
+ if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.length) {
450
+ this.selectedOptions = [this.options[this.selectedIndex]];
451
+ this.ariaActiveDescendant = (_c = (_b = this.firstSelectedOption) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : "";
452
+ this.focusAndScrollOptionIntoView();
453
+ }
454
+ }
455
+ /**
456
+ * Updates the list of options and resets the selected option when the slotted option content changes.
457
+ *
458
+ * @param prev - the previous list of slotted options
459
+ * @param next - the current list of slotted options
460
+ *
461
+ * @internal
462
+ */
463
+ slottedOptionsChanged(prev, next) {
464
+ this.options = next.reduce((options, item) => {
465
+ if (isListboxOption(item)) {
466
+ options.push(item);
467
+ }
468
+ return options;
469
+ }, []);
470
+ const setSize = `${this.options.length}`;
471
+ this.options.forEach((option, index) => {
472
+ if (!option.id) {
473
+ option.id = uniqueId("option-");
474
+ }
475
+ option.ariaPosInSet = `${index + 1}`;
476
+ option.ariaSetSize = setSize;
477
+ });
478
+ if (this.$fastController.isConnected) {
479
+ this.setSelectedOptions();
480
+ this.setDefaultSelectedOption();
481
+ }
482
+ }
483
+ /**
484
+ * Updates the filtered list of options when the typeahead buffer changes.
485
+ *
486
+ * @param prev - the previous typeahead buffer value
487
+ * @param next - the current typeahead buffer value
488
+ *
489
+ * @internal
490
+ */
491
+ typeaheadBufferChanged(prev, next) {
492
+ if (this.$fastController.isConnected) {
493
+ const typeaheadMatches = this.getTypeaheadMatches();
494
+ if (typeaheadMatches.length) {
495
+ const selectedIndex = this.options.indexOf(typeaheadMatches[0]);
496
+ if (selectedIndex > -1) {
497
+ this.selectedIndex = selectedIndex;
498
+ }
499
+ }
500
+ this.typeaheadExpired = false;
501
+ }
502
+ }
503
+ }
504
+ /**
505
+ * A static filter to include only selectable options.
506
+ *
507
+ * @param n - element to filter
508
+ * @public
509
+ */
510
+ Listbox$1.slottedOptionFilter = (n) => isListboxOption(n) && !n.hidden;
511
+ /**
512
+ * Typeahead timeout in milliseconds.
513
+ *
514
+ * @internal
515
+ */
516
+ Listbox$1.TYPE_AHEAD_TIMEOUT_MS = 1000;
517
+ __decorate([
518
+ attr({ mode: "boolean" })
519
+ ], Listbox$1.prototype, "disabled", void 0);
520
+ __decorate([
521
+ observable
522
+ ], Listbox$1.prototype, "selectedIndex", void 0);
523
+ __decorate([
524
+ observable
525
+ ], Listbox$1.prototype, "selectedOptions", void 0);
526
+ __decorate([
527
+ observable
528
+ ], Listbox$1.prototype, "slottedOptions", void 0);
529
+ __decorate([
530
+ observable
531
+ ], Listbox$1.prototype, "typeaheadBuffer", void 0);
532
+ /**
533
+ * Includes ARIA states and properties relating to the ARIA listbox role
534
+ *
535
+ * @public
536
+ */
537
+ class DelegatesARIAListbox {
538
+ }
539
+ __decorate([
540
+ observable
541
+ ], DelegatesARIAListbox.prototype, "ariaActiveDescendant", void 0);
542
+ __decorate([
543
+ observable
544
+ ], DelegatesARIAListbox.prototype, "ariaDisabled", void 0);
545
+ __decorate([
546
+ observable
547
+ ], DelegatesARIAListbox.prototype, "ariaExpanded", void 0);
548
+ __decorate([
549
+ observable
550
+ ], DelegatesARIAListbox.prototype, "ariaMultiSelectable", void 0);
551
+ applyMixins(DelegatesARIAListbox, ARIAGlobalStatesAndProperties);
552
+ applyMixins(Listbox$1, DelegatesARIAListbox);
553
+
554
+ /**
555
+ * A Listbox Custom HTML Element.
556
+ * Implements the {@link https://w3c.github.io/aria/#listbox | ARIA listbox }.
557
+ *
558
+ * @public
559
+ */
560
+ class ListboxElement extends Listbox$1 {
561
+ constructor() {
562
+ super(...arguments);
563
+ /**
564
+ * The index of the most recently checked option.
565
+ *
566
+ * @internal
567
+ * @remarks
568
+ * Multiple-selection mode only.
569
+ */
570
+ this.activeIndex = -1;
571
+ /**
572
+ * The start index when checking a range of options.
573
+ *
574
+ * @internal
575
+ */
576
+ this.rangeStartIndex = -1;
577
+ }
578
+ /**
579
+ * Returns the last checked option.
580
+ *
581
+ * @internal
582
+ */
583
+ get activeOption() {
584
+ return this.options[this.activeIndex];
585
+ }
586
+ /**
587
+ * Returns the list of checked options.
588
+ *
589
+ * @internal
590
+ */
591
+ get checkedOptions() {
592
+ var _a;
593
+ return (_a = this.options) === null || _a === void 0 ? void 0 : _a.filter(o => o.checked);
594
+ }
595
+ /**
596
+ * Returns the index of the first selected option.
597
+ *
598
+ * @internal
599
+ */
600
+ get firstSelectedOptionIndex() {
601
+ return this.options.indexOf(this.firstSelectedOption);
602
+ }
603
+ /**
604
+ * Updates the `ariaActiveDescendant` property when the active index changes.
605
+ *
606
+ * @param prev - the previous active index
607
+ * @param next - the next active index
608
+ *
609
+ * @internal
610
+ */
611
+ activeIndexChanged(prev, next) {
612
+ var _a, _b;
613
+ this.ariaActiveDescendant = (_b = (_a = this.options[next]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : "";
614
+ this.focusAndScrollOptionIntoView();
615
+ }
616
+ /**
617
+ * Toggles the checked state for the currently active option.
618
+ *
619
+ * @remarks
620
+ * Multiple-selection mode only.
621
+ *
622
+ * @internal
623
+ */
624
+ checkActiveIndex() {
625
+ if (!this.multiple) {
626
+ return;
627
+ }
628
+ const activeItem = this.activeOption;
629
+ if (activeItem) {
630
+ activeItem.checked = true;
631
+ }
632
+ }
633
+ /**
634
+ * Sets the active index to the first option and marks it as checked.
635
+ *
636
+ * @remarks
637
+ * Multi-selection mode only.
638
+ *
639
+ * @param preserveChecked - mark all options unchecked before changing the active index
640
+ *
641
+ * @internal
642
+ */
643
+ checkFirstOption(preserveChecked = false) {
644
+ if (preserveChecked) {
645
+ if (this.rangeStartIndex === -1) {
646
+ this.rangeStartIndex = this.activeIndex + 1;
647
+ }
648
+ this.options.forEach((o, i) => {
649
+ o.checked = inRange(i, this.rangeStartIndex);
650
+ });
651
+ }
652
+ else {
653
+ this.uncheckAllOptions();
654
+ }
655
+ this.activeIndex = 0;
656
+ this.checkActiveIndex();
657
+ }
658
+ /**
659
+ * Decrements the active index and sets the matching option as checked.
660
+ *
661
+ * @remarks
662
+ * Multi-selection mode only.
663
+ *
664
+ * @param preserveChecked - mark all options unchecked before changing the active index
665
+ *
666
+ * @internal
667
+ */
668
+ checkLastOption(preserveChecked = false) {
669
+ if (preserveChecked) {
670
+ if (this.rangeStartIndex === -1) {
671
+ this.rangeStartIndex = this.activeIndex;
672
+ }
673
+ this.options.forEach((o, i) => {
674
+ o.checked = inRange(i, this.rangeStartIndex, this.options.length);
675
+ });
676
+ }
677
+ else {
678
+ this.uncheckAllOptions();
679
+ }
680
+ this.activeIndex = this.options.length - 1;
681
+ this.checkActiveIndex();
682
+ }
683
+ /**
684
+ * @override
685
+ * @internal
686
+ */
687
+ connectedCallback() {
688
+ super.connectedCallback();
689
+ this.addEventListener("focusout", this.focusoutHandler);
690
+ }
691
+ /**
692
+ * @override
693
+ * @internal
694
+ */
695
+ disconnectedCallback() {
696
+ this.removeEventListener("focusout", this.focusoutHandler);
697
+ super.disconnectedCallback();
698
+ }
699
+ /**
700
+ * Increments the active index and marks the matching option as checked.
701
+ *
702
+ * @remarks
703
+ * Multiple-selection mode only.
704
+ *
705
+ * @param preserveChecked - mark all options unchecked before changing the active index
706
+ *
707
+ * @internal
708
+ */
709
+ checkNextOption(preserveChecked = false) {
710
+ if (preserveChecked) {
711
+ if (this.rangeStartIndex === -1) {
712
+ this.rangeStartIndex = this.activeIndex;
713
+ }
714
+ this.options.forEach((o, i) => {
715
+ o.checked = inRange(i, this.rangeStartIndex, this.activeIndex + 1);
716
+ });
717
+ }
718
+ else {
719
+ this.uncheckAllOptions();
720
+ }
721
+ this.activeIndex += this.activeIndex < this.options.length - 1 ? 1 : 0;
722
+ this.checkActiveIndex();
723
+ }
724
+ /**
725
+ * Decrements the active index and marks the matching option as checked.
726
+ *
727
+ * @remarks
728
+ * Multiple-selection mode only.
729
+ *
730
+ * @param preserveChecked - mark all options unchecked before changing the active index
731
+ *
732
+ * @internal
733
+ */
734
+ checkPreviousOption(preserveChecked = false) {
735
+ if (preserveChecked) {
736
+ if (this.rangeStartIndex === -1) {
737
+ this.rangeStartIndex = this.activeIndex;
738
+ }
739
+ if (this.checkedOptions.length === 1) {
740
+ this.rangeStartIndex += 1;
741
+ }
742
+ this.options.forEach((o, i) => {
743
+ o.checked = inRange(i, this.activeIndex, this.rangeStartIndex);
744
+ });
745
+ }
746
+ else {
747
+ this.uncheckAllOptions();
748
+ }
749
+ this.activeIndex -= this.activeIndex > 0 ? 1 : 0;
750
+ this.checkActiveIndex();
751
+ }
752
+ /**
753
+ * Handles click events for listbox options.
754
+ *
755
+ * @param e - the event object
756
+ *
757
+ * @override
758
+ * @internal
759
+ */
760
+ clickHandler(e) {
761
+ var _a;
762
+ if (!this.multiple) {
763
+ return super.clickHandler(e);
764
+ }
765
+ const captured = (_a = e.target) === null || _a === void 0 ? void 0 : _a.closest(`[role=option]`);
766
+ if (!captured || captured.disabled) {
767
+ return;
768
+ }
769
+ this.uncheckAllOptions();
770
+ this.activeIndex = this.options.indexOf(captured);
771
+ this.checkActiveIndex();
772
+ this.toggleSelectedForAllCheckedOptions();
773
+ return true;
774
+ }
775
+ /**
776
+ * @override
777
+ * @internal
778
+ */
779
+ focusAndScrollOptionIntoView() {
780
+ super.focusAndScrollOptionIntoView(this.activeOption);
781
+ }
782
+ /**
783
+ * In multiple-selection mode:
784
+ * If any options are selected, the first selected option is checked when
785
+ * the listbox receives focus. If no options are selected, the first
786
+ * selectable option is checked.
787
+ *
788
+ * @override
789
+ * @internal
790
+ */
791
+ focusinHandler(e) {
792
+ if (!this.multiple) {
793
+ return super.focusinHandler(e);
794
+ }
795
+ if (!this.shouldSkipFocus && e.target === e.currentTarget) {
796
+ this.uncheckAllOptions();
797
+ if (this.activeIndex === -1) {
798
+ this.activeIndex =
799
+ this.firstSelectedOptionIndex !== -1
800
+ ? this.firstSelectedOptionIndex
801
+ : 0;
802
+ }
803
+ this.checkActiveIndex();
804
+ this.setSelectedOptions();
805
+ this.focusAndScrollOptionIntoView();
806
+ }
807
+ this.shouldSkipFocus = false;
808
+ }
809
+ /**
810
+ * Unchecks all options when the listbox loses focus.
811
+ *
812
+ * @internal
813
+ */
814
+ focusoutHandler(e) {
815
+ if (this.multiple) {
816
+ this.uncheckAllOptions();
817
+ }
818
+ }
819
+ /**
820
+ * Handles keydown actions for listbox navigation and typeahead
821
+ *
822
+ * @override
823
+ * @internal
824
+ */
825
+ keydownHandler(e) {
826
+ if (!this.multiple) {
827
+ return super.keydownHandler(e);
828
+ }
829
+ if (this.disabled) {
830
+ return true;
831
+ }
832
+ const { key, shiftKey } = e;
833
+ this.shouldSkipFocus = false;
834
+ switch (key) {
835
+ // Select the first available option
836
+ case keyHome: {
837
+ this.checkFirstOption(shiftKey);
838
+ return;
839
+ }
840
+ // Select the next selectable option
841
+ case keyArrowDown: {
842
+ this.checkNextOption(shiftKey);
843
+ return;
844
+ }
845
+ // Select the previous selectable option
846
+ case keyArrowUp: {
847
+ this.checkPreviousOption(shiftKey);
848
+ return;
849
+ }
850
+ // Select the last available option
851
+ case keyEnd: {
852
+ this.checkLastOption(shiftKey);
853
+ return;
854
+ }
855
+ case keyTab: {
856
+ this.focusAndScrollOptionIntoView();
857
+ return true;
858
+ }
859
+ case keyEscape: {
860
+ this.uncheckAllOptions();
861
+ this.checkActiveIndex();
862
+ return true;
863
+ }
864
+ case keySpace: {
865
+ e.preventDefault();
866
+ if (this.typeAheadExpired) {
867
+ this.toggleSelectedForAllCheckedOptions();
868
+ return;
869
+ }
870
+ }
871
+ // Send key to Typeahead handler
872
+ default: {
873
+ if (key.length === 1) {
874
+ this.handleTypeAhead(`${key}`);
875
+ }
876
+ return true;
877
+ }
878
+ }
879
+ }
880
+ /**
881
+ * Prevents `focusin` events from firing before `click` events when the
882
+ * element is unfocused.
883
+ *
884
+ * @override
885
+ * @internal
886
+ */
887
+ mousedownHandler(e) {
888
+ if (e.offsetX >= 0 && e.offsetX <= this.scrollWidth) {
889
+ return super.mousedownHandler(e);
890
+ }
891
+ }
892
+ /**
893
+ * Switches between single-selection and multi-selection mode.
894
+ *
895
+ * @internal
896
+ */
897
+ multipleChanged(prev, next) {
898
+ var _a;
899
+ this.ariaMultiSelectable = next ? "true" : null;
900
+ (_a = this.options) === null || _a === void 0 ? void 0 : _a.forEach(o => {
901
+ o.checked = next ? false : undefined;
902
+ });
903
+ this.setSelectedOptions();
904
+ }
905
+ /**
906
+ * Sets an option as selected and gives it focus.
907
+ *
908
+ * @override
909
+ * @public
910
+ */
911
+ setSelectedOptions() {
912
+ if (!this.multiple) {
913
+ super.setSelectedOptions();
914
+ return;
915
+ }
916
+ if (this.$fastController.isConnected && this.options) {
917
+ this.selectedOptions = this.options.filter(o => o.selected);
918
+ this.focusAndScrollOptionIntoView();
919
+ }
920
+ }
921
+ /**
922
+ * Ensures the size is a positive integer when the property is updated.
923
+ *
924
+ * @param prev - the previous size value
925
+ * @param next - the current size value
926
+ *
927
+ * @internal
928
+ */
929
+ sizeChanged(prev, next) {
930
+ var _a;
931
+ const size = Math.max(0, parseInt((_a = next === null || next === void 0 ? void 0 : next.toFixed()) !== null && _a !== void 0 ? _a : "", 10));
932
+ if (size !== next) {
933
+ DOM.queueUpdate(() => {
934
+ this.size = size;
935
+ });
936
+ }
937
+ }
938
+ /**
939
+ * Toggles the selected state of the provided options. If any provided items
940
+ * are in an unselected state, all items are set to selected. If every
941
+ * provided item is selected, they are all unselected.
942
+ *
943
+ * @internal
944
+ */
945
+ toggleSelectedForAllCheckedOptions() {
946
+ const enabledCheckedOptions = this.checkedOptions.filter(o => !o.disabled);
947
+ const force = !enabledCheckedOptions.every(o => o.selected);
948
+ enabledCheckedOptions.forEach(o => (o.selected = force));
949
+ this.selectedIndex = this.options.indexOf(enabledCheckedOptions[enabledCheckedOptions.length - 1]);
950
+ this.setSelectedOptions();
951
+ }
952
+ /**
953
+ * @override
954
+ * @internal
955
+ */
956
+ typeaheadBufferChanged(prev, next) {
957
+ if (!this.multiple) {
958
+ super.typeaheadBufferChanged(prev, next);
959
+ return;
960
+ }
961
+ if (this.$fastController.isConnected) {
962
+ const typeaheadMatches = this.getTypeaheadMatches();
963
+ const activeIndex = this.options.indexOf(typeaheadMatches[0]);
964
+ if (activeIndex > -1) {
965
+ this.activeIndex = activeIndex;
966
+ this.uncheckAllOptions();
967
+ this.checkActiveIndex();
968
+ }
969
+ this.typeAheadExpired = false;
970
+ }
971
+ }
972
+ /**
973
+ * Unchecks all options.
974
+ *
975
+ * @remarks
976
+ * Multiple-selection mode only.
977
+ *
978
+ * @param preserveChecked - reset the rangeStartIndex
979
+ *
980
+ * @internal
981
+ */
982
+ uncheckAllOptions(preserveChecked = false) {
983
+ this.options.forEach(o => (o.checked = this.multiple ? false : undefined));
984
+ if (!preserveChecked) {
985
+ this.rangeStartIndex = -1;
986
+ }
987
+ }
988
+ }
989
+ __decorate([
990
+ observable
991
+ ], ListboxElement.prototype, "activeIndex", void 0);
992
+ __decorate([
993
+ attr({ mode: "boolean" })
994
+ ], ListboxElement.prototype, "multiple", void 0);
995
+ __decorate([
996
+ attr({ converter: nullableNumberConverter })
997
+ ], ListboxElement.prototype, "size", void 0);
998
+
999
+ class Listbox extends ListboxElement {}
1000
+ __decorate([attr, __metadata("design:type", String)], Listbox.prototype, "appearance", void 0);
1001
+
1002
+ export { DelegatesARIAListbox as D, Listbox$1 as L, Listbox as a, ListboxElement as b, uniqueId as u };