@vonage/vivid 3.48.0 → 3.49.0-preview.1

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 (182) hide show
  1. package/accordion/index.cjs +21 -0
  2. package/accordion-item/index.cjs +18 -0
  3. package/action-group/index.cjs +7 -0
  4. package/alert/index.cjs +30 -0
  5. package/appearance-ui/index.cjs +96 -0
  6. package/audio-player/index.cjs +34 -0
  7. package/avatar/index.cjs +11 -0
  8. package/badge/index.cjs +14 -0
  9. package/banner/index.cjs +29 -0
  10. package/breadcrumb/index.cjs +13 -0
  11. package/breadcrumb-item/index.cjs +22 -0
  12. package/button/index.cjs +25 -0
  13. package/calendar/index.cjs +9 -0
  14. package/calendar-event/index.cjs +9 -0
  15. package/card/index.cjs +14 -0
  16. package/checkbox/index.cjs +21 -0
  17. package/combobox/index.cjs +39 -0
  18. package/data-grid/index.cjs +18 -0
  19. package/date-picker/index.cjs +40 -0
  20. package/date-range-picker/index.cjs +40 -0
  21. package/dialog/index.cjs +31 -0
  22. package/divider/index.cjs +8 -0
  23. package/elevation/index.cjs +7 -0
  24. package/empty-state/index.cjs +12 -0
  25. package/fab/index.cjs +22 -0
  26. package/file-picker/index.cjs +30 -0
  27. package/focus/index.cjs +7 -0
  28. package/header/index.cjs +8 -0
  29. package/icon/index.cjs +10 -0
  30. package/index.cjs +296 -0
  31. package/layout/index.cjs +7 -0
  32. package/listbox/index.cjs +77 -0
  33. package/locales/en-GB.cjs +106 -0
  34. package/locales/en-US.cjs +106 -0
  35. package/locales/ja-JP.cjs +106 -0
  36. package/locales/zh-CN.cjs +106 -0
  37. package/menu/index.cjs +32 -0
  38. package/menu-item/index.cjs +22 -0
  39. package/nav/index.cjs +6 -0
  40. package/nav-disclosure/index.cjs +17 -0
  41. package/nav-item/index.cjs +22 -0
  42. package/note/index.cjs +16 -0
  43. package/number-field/index.cjs +33 -0
  44. package/option/index.cjs +23 -0
  45. package/package.json +20 -2
  46. package/pagination/index.cjs +28 -0
  47. package/popup/index.cjs +27 -0
  48. package/progress/index.cjs +9 -0
  49. package/progress-ring/index.cjs +9 -0
  50. package/radio/index.cjs +14 -0
  51. package/radio-group/index.cjs +14 -0
  52. package/select/index.cjs +38 -0
  53. package/selectable-box/index.cjs +25 -0
  54. package/shared/Reflector.cjs +67 -0
  55. package/shared/_has.cjs +62 -0
  56. package/shared/affix.cjs +64 -0
  57. package/shared/affix.js +8 -4
  58. package/shared/anchor.cjs +90 -0
  59. package/shared/anchored.cjs +78 -0
  60. package/shared/apply-mixins.cjs +25 -0
  61. package/shared/aria-global.cjs +74 -0
  62. package/shared/aria.cjs +11 -0
  63. package/shared/aria2.cjs +11 -0
  64. package/shared/base-progress.cjs +72 -0
  65. package/shared/breadcrumb-item.cjs +27 -0
  66. package/shared/button.cjs +202 -0
  67. package/shared/calendar-event.cjs +41 -0
  68. package/shared/children.cjs +61 -0
  69. package/shared/class-names.cjs +17 -0
  70. package/shared/definition.cjs +165 -0
  71. package/shared/definition10.cjs +102 -0
  72. package/shared/definition11.cjs +164 -0
  73. package/shared/definition11.js +38 -36
  74. package/shared/definition12.cjs +50 -0
  75. package/shared/definition13.cjs +779 -0
  76. package/shared/definition14.cjs +157 -0
  77. package/shared/definition15.cjs +249 -0
  78. package/shared/definition16.cjs +746 -0
  79. package/shared/definition17.cjs +1372 -0
  80. package/shared/definition18.cjs +175 -0
  81. package/shared/definition19.cjs +416 -0
  82. package/shared/definition2.cjs +232 -0
  83. package/shared/definition20.cjs +278 -0
  84. package/shared/definition21.cjs +83 -0
  85. package/shared/definition22.cjs +74 -0
  86. package/shared/definition23.cjs +106 -0
  87. package/shared/definition24.cjs +2392 -0
  88. package/shared/definition25.cjs +75 -0
  89. package/shared/definition26.cjs +39 -0
  90. package/shared/definition27.cjs +66 -0
  91. package/shared/definition28.cjs +849 -0
  92. package/shared/definition29.cjs +72 -0
  93. package/shared/definition3.cjs +72 -0
  94. package/shared/definition30.cjs +98 -0
  95. package/shared/definition31.cjs +37 -0
  96. package/shared/definition32.cjs +24 -0
  97. package/shared/definition33.cjs +64 -0
  98. package/shared/definition34.cjs +533 -0
  99. package/shared/definition35.cjs +295 -0
  100. package/shared/definition36.cjs +219 -0
  101. package/shared/definition37.cjs +109 -0
  102. package/shared/definition38.cjs +92 -0
  103. package/shared/definition39.cjs +448 -0
  104. package/shared/definition4.cjs +198 -0
  105. package/shared/definition40.cjs +49 -0
  106. package/shared/definition41.cjs +694 -0
  107. package/shared/definition42.cjs +152 -0
  108. package/shared/definition43.cjs +113 -0
  109. package/shared/definition44.cjs +607 -0
  110. package/shared/definition45.cjs +152 -0
  111. package/shared/definition46.cjs +166 -0
  112. package/shared/definition47.cjs +35 -0
  113. package/shared/definition48.cjs +98 -0
  114. package/shared/definition49.cjs +543 -0
  115. package/shared/definition5.cjs +199 -0
  116. package/shared/definition50.cjs +52 -0
  117. package/shared/definition51.cjs +150 -0
  118. package/shared/definition52.cjs +304 -0
  119. package/shared/definition53.cjs +309 -0
  120. package/shared/definition54.cjs +146 -0
  121. package/shared/definition55.cjs +128 -0
  122. package/shared/definition56.cjs +99 -0
  123. package/shared/definition57.cjs +310 -0
  124. package/shared/definition58.cjs +20 -0
  125. package/shared/definition59.cjs +51 -0
  126. package/shared/definition6.cjs +83 -0
  127. package/shared/definition60.cjs +1810 -0
  128. package/shared/definition7.cjs +72 -0
  129. package/shared/definition8.cjs +152 -0
  130. package/shared/definition9.cjs +69 -0
  131. package/shared/dialog-polyfill.esm.cjs +862 -0
  132. package/shared/direction.cjs +22 -0
  133. package/shared/dom.cjs +23 -0
  134. package/shared/enums.cjs +87 -0
  135. package/shared/focus.cjs +8 -0
  136. package/shared/focus2.cjs +11 -0
  137. package/shared/form-associated.cjs +470 -0
  138. package/shared/icon.cjs +237 -0
  139. package/shared/index.cjs +5061 -0
  140. package/shared/index2.cjs +231 -0
  141. package/shared/key-codes.cjs +115 -0
  142. package/shared/key-codes2.cjs +14 -0
  143. package/shared/listbox.cjs +1072 -0
  144. package/shared/localized.cjs +11 -0
  145. package/shared/numbers.cjs +38 -0
  146. package/shared/patterns/affix.d.ts +5 -1
  147. package/shared/presentationDate.cjs +6192 -0
  148. package/shared/radio.cjs +153 -0
  149. package/shared/ref.cjs +43 -0
  150. package/shared/repeat.cjs +767 -0
  151. package/shared/select.options.cjs +12 -0
  152. package/shared/slotted.cjs +123 -0
  153. package/shared/start-end.cjs +52 -0
  154. package/shared/strings.cjs +11 -0
  155. package/shared/text-anchor.cjs +33 -0
  156. package/shared/text-anchor.template.cjs +48 -0
  157. package/shared/text-field.cjs +5 -0
  158. package/shared/text-field2.cjs +228 -0
  159. package/shared/tree-item.cjs +154 -0
  160. package/shared/when.cjs +31 -0
  161. package/side-drawer/index.cjs +8 -0
  162. package/slider/index.cjs +16 -0
  163. package/split-button/index.cjs +20 -0
  164. package/styles/core/all.css +1 -1
  165. package/styles/core/theme.css +1 -1
  166. package/styles/core/typography.css +1 -1
  167. package/styles/tokens/theme-dark.css +4 -4
  168. package/styles/tokens/theme-light.css +4 -4
  169. package/styles/tokens/vivid-2-compat.css +1 -1
  170. package/switch/index.cjs +15 -0
  171. package/tab/index.cjs +17 -0
  172. package/tab-panel/index.cjs +6 -0
  173. package/tabs/index.cjs +24 -0
  174. package/tag/index.cjs +17 -0
  175. package/tag-group/index.cjs +7 -0
  176. package/text-anchor/index.cjs +24 -0
  177. package/text-area/index.cjs +25 -0
  178. package/text-field/index.cjs +27 -0
  179. package/toggletip/index.cjs +29 -0
  180. package/tooltip/index.cjs +29 -0
  181. package/tree-item/index.cjs +22 -0
  182. package/tree-view/index.cjs +14 -0
@@ -0,0 +1,849 @@
1
+ 'use strict';
2
+
3
+ const index = require('./index.cjs');
4
+ const definition = require('./definition26.cjs');
5
+ const definition$1 = require('./definition58.cjs');
6
+ const affix = require('./affix.cjs');
7
+ const applyMixins = require('./apply-mixins.cjs');
8
+ const startEnd = require('./start-end.cjs');
9
+ const direction = require('./direction.cjs');
10
+ const keyCodes = require('./key-codes.cjs');
11
+ const icon = require('./icon.cjs');
12
+ const anchored = require('./anchored.cjs');
13
+ const dom = require('./dom.cjs');
14
+ const slotted = require('./slotted.cjs');
15
+ const when = require('./when.cjs');
16
+ const classNames = require('./class-names.cjs');
17
+
18
+ /**
19
+ * Menu items roles.
20
+ * @public
21
+ */
22
+ const MenuItemRole$1 = {
23
+ /**
24
+ * The menu item has a "menuitem" role
25
+ */
26
+ menuitem: "menuitem",
27
+ /**
28
+ * The menu item has a "menuitemcheckbox" role
29
+ */
30
+ menuitemcheckbox: "menuitemcheckbox",
31
+ /**
32
+ * The menu item has a "menuitemradio" role
33
+ */
34
+ menuitemradio: "menuitemradio",
35
+ };
36
+ /**
37
+ * @internal
38
+ */
39
+ const roleForMenuItem = {
40
+ [MenuItemRole$1.menuitem]: "menuitem",
41
+ [MenuItemRole$1.menuitemcheckbox]: "menuitemcheckbox",
42
+ [MenuItemRole$1.menuitemradio]: "menuitemradio",
43
+ };
44
+
45
+ /**
46
+ * A Switch Custom HTML Element.
47
+ * Implements {@link https://www.w3.org/TR/wai-aria-1.1/#menuitem | ARIA menuitem }, {@link https://www.w3.org/TR/wai-aria-1.1/#menuitemcheckbox | ARIA menuitemcheckbox}, or {@link https://www.w3.org/TR/wai-aria-1.1/#menuitemradio | ARIA menuitemradio }.
48
+ *
49
+ * @slot checked-indicator - The checked indicator
50
+ * @slot radio-indicator - The radio indicator
51
+ * @slot start - Content which can be provided before the menu item content
52
+ * @slot end - Content which can be provided after the menu item content
53
+ * @slot - The default slot for menu item content
54
+ * @slot expand-collapse-indicator - The expand/collapse indicator
55
+ * @slot submenu - Used to nest menu's within menu items
56
+ * @csspart input-container - The element representing the visual checked or radio indicator
57
+ * @csspart checkbox - The element wrapping the `menuitemcheckbox` indicator
58
+ * @csspart radio - The element wrapping the `menuitemradio` indicator
59
+ * @csspart content - The element wrapping the menu item content
60
+ * @csspart expand-collapse-glyph-container - The element wrapping the expand collapse element
61
+ * @csspart expand-collapse - The expand/collapse element
62
+ * @csspart submenu-region - The container for the submenu, used for positioning
63
+ * @fires expanded-change - Fires a custom 'expanded-change' event when the expanded state changes
64
+ * @fires change - Fires a custom 'change' event when a non-submenu item with a role of `menuitemcheckbox`, `menuitemradio`, or `menuitem` is invoked
65
+ *
66
+ * @public
67
+ */
68
+ let MenuItem$1 = class MenuItem extends index.FoundationElement {
69
+ constructor() {
70
+ super(...arguments);
71
+ /**
72
+ * The role of the element.
73
+ *
74
+ * @public
75
+ * @remarks
76
+ * HTML Attribute: role
77
+ */
78
+ this.role = MenuItemRole$1.menuitem;
79
+ /**
80
+ * @internal
81
+ */
82
+ this.hasSubmenu = false;
83
+ /**
84
+ * Track current direction to pass to the anchored region
85
+ *
86
+ * @internal
87
+ */
88
+ this.currentDirection = direction.Direction.ltr;
89
+ this.focusSubmenuOnLoad = false;
90
+ /**
91
+ * @internal
92
+ */
93
+ this.handleMenuItemKeyDown = (e) => {
94
+ if (e.defaultPrevented) {
95
+ return false;
96
+ }
97
+ switch (e.key) {
98
+ case keyCodes.keyEnter:
99
+ case keyCodes.keySpace:
100
+ this.invoke();
101
+ return false;
102
+ case keyCodes.keyArrowRight:
103
+ //open/focus on submenu
104
+ this.expandAndFocus();
105
+ return false;
106
+ case keyCodes.keyArrowLeft:
107
+ //close submenu
108
+ if (this.expanded) {
109
+ this.expanded = false;
110
+ this.focus();
111
+ return false;
112
+ }
113
+ }
114
+ return true;
115
+ };
116
+ /**
117
+ * @internal
118
+ */
119
+ this.handleMenuItemClick = (e) => {
120
+ if (e.defaultPrevented || this.disabled) {
121
+ return false;
122
+ }
123
+ this.invoke();
124
+ return false;
125
+ };
126
+ /**
127
+ * @internal
128
+ */
129
+ this.submenuLoaded = () => {
130
+ if (!this.focusSubmenuOnLoad) {
131
+ return;
132
+ }
133
+ this.focusSubmenuOnLoad = false;
134
+ if (this.hasSubmenu) {
135
+ this.submenu.focus();
136
+ this.setAttribute("tabindex", "-1");
137
+ }
138
+ };
139
+ /**
140
+ * @internal
141
+ */
142
+ this.handleMouseOver = (e) => {
143
+ if (this.disabled || !this.hasSubmenu || this.expanded) {
144
+ return false;
145
+ }
146
+ this.expanded = true;
147
+ return false;
148
+ };
149
+ /**
150
+ * @internal
151
+ */
152
+ this.handleMouseOut = (e) => {
153
+ if (!this.expanded || this.contains(document.activeElement)) {
154
+ return false;
155
+ }
156
+ this.expanded = false;
157
+ return false;
158
+ };
159
+ /**
160
+ * @internal
161
+ */
162
+ this.expandAndFocus = () => {
163
+ if (!this.hasSubmenu) {
164
+ return;
165
+ }
166
+ this.focusSubmenuOnLoad = true;
167
+ this.expanded = true;
168
+ };
169
+ /**
170
+ * @internal
171
+ */
172
+ this.invoke = () => {
173
+ if (this.disabled) {
174
+ return;
175
+ }
176
+ switch (this.role) {
177
+ case MenuItemRole$1.menuitemcheckbox:
178
+ this.checked = !this.checked;
179
+ break;
180
+ case MenuItemRole$1.menuitem:
181
+ // update submenu
182
+ this.updateSubmenu();
183
+ if (this.hasSubmenu) {
184
+ this.expandAndFocus();
185
+ }
186
+ else {
187
+ this.$emit("change");
188
+ }
189
+ break;
190
+ case MenuItemRole$1.menuitemradio:
191
+ if (!this.checked) {
192
+ this.checked = true;
193
+ }
194
+ break;
195
+ }
196
+ };
197
+ /**
198
+ * Gets the submenu element if any
199
+ *
200
+ * @internal
201
+ */
202
+ this.updateSubmenu = () => {
203
+ this.submenu = this.domChildren().find((element) => {
204
+ return element.getAttribute("role") === "menu";
205
+ });
206
+ this.hasSubmenu = this.submenu === undefined ? false : true;
207
+ };
208
+ }
209
+ expandedChanged(oldValue) {
210
+ if (this.$fastController.isConnected) {
211
+ if (this.submenu === undefined) {
212
+ return;
213
+ }
214
+ if (this.expanded === false) {
215
+ this.submenu.collapseExpandedItem();
216
+ }
217
+ else {
218
+ this.currentDirection = direction.getDirection(this);
219
+ }
220
+ this.$emit("expanded-change", this, { bubbles: false });
221
+ }
222
+ }
223
+ checkedChanged(oldValue, newValue) {
224
+ if (this.$fastController.isConnected) {
225
+ this.$emit("change");
226
+ }
227
+ }
228
+ /**
229
+ * @internal
230
+ */
231
+ connectedCallback() {
232
+ super.connectedCallback();
233
+ index.DOM.queueUpdate(() => {
234
+ this.updateSubmenu();
235
+ });
236
+ if (!this.startColumnCount) {
237
+ this.startColumnCount = 1;
238
+ }
239
+ this.observer = new MutationObserver(this.updateSubmenu);
240
+ }
241
+ /**
242
+ * @internal
243
+ */
244
+ disconnectedCallback() {
245
+ super.disconnectedCallback();
246
+ this.submenu = undefined;
247
+ if (this.observer !== undefined) {
248
+ this.observer.disconnect();
249
+ this.observer = undefined;
250
+ }
251
+ }
252
+ /**
253
+ * get an array of valid DOM children
254
+ */
255
+ domChildren() {
256
+ return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
257
+ }
258
+ };
259
+ index.__decorate([
260
+ index.attr({ mode: "boolean" })
261
+ ], MenuItem$1.prototype, "disabled", void 0);
262
+ index.__decorate([
263
+ index.attr({ mode: "boolean" })
264
+ ], MenuItem$1.prototype, "expanded", void 0);
265
+ index.__decorate([
266
+ index.observable
267
+ ], MenuItem$1.prototype, "startColumnCount", void 0);
268
+ index.__decorate([
269
+ index.attr
270
+ ], MenuItem$1.prototype, "role", void 0);
271
+ index.__decorate([
272
+ index.attr({ mode: "boolean" })
273
+ ], MenuItem$1.prototype, "checked", void 0);
274
+ index.__decorate([
275
+ index.observable
276
+ ], MenuItem$1.prototype, "submenuRegion", void 0);
277
+ index.__decorate([
278
+ index.observable
279
+ ], MenuItem$1.prototype, "hasSubmenu", void 0);
280
+ index.__decorate([
281
+ index.observable
282
+ ], MenuItem$1.prototype, "currentDirection", void 0);
283
+ index.__decorate([
284
+ index.observable
285
+ ], MenuItem$1.prototype, "submenu", void 0);
286
+ applyMixins.applyMixins(MenuItem$1, startEnd.StartEnd);
287
+
288
+ /**
289
+ * A Menu Custom HTML Element.
290
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#menu | ARIA menu }.
291
+ *
292
+ * @slot - The default slot for the menu items
293
+ *
294
+ * @public
295
+ */
296
+ let Menu$1 = class Menu extends index.FoundationElement {
297
+ constructor() {
298
+ super(...arguments);
299
+ this.expandedItem = null;
300
+ /**
301
+ * The index of the focusable element in the items array
302
+ * defaults to -1
303
+ */
304
+ this.focusIndex = -1;
305
+ /**
306
+ * @internal
307
+ */
308
+ this.isNestedMenu = () => {
309
+ return (this.parentElement !== null &&
310
+ dom.isHTMLElement(this.parentElement) &&
311
+ this.parentElement.getAttribute("role") === "menuitem");
312
+ };
313
+ /**
314
+ * if focus is moving out of the menu, reset to a stable initial state
315
+ * @internal
316
+ */
317
+ this.handleFocusOut = (e) => {
318
+ if (!this.contains(e.relatedTarget) && this.menuItems !== undefined) {
319
+ this.collapseExpandedItem();
320
+ // find our first focusable element
321
+ const focusIndex = this.menuItems.findIndex(this.isFocusableElement);
322
+ // set the current focus index's tabindex to -1
323
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
324
+ // set the first focusable element tabindex to 0
325
+ this.menuItems[focusIndex].setAttribute("tabindex", "0");
326
+ // set the focus index
327
+ this.focusIndex = focusIndex;
328
+ }
329
+ };
330
+ this.handleItemFocus = (e) => {
331
+ const targetItem = e.target;
332
+ if (this.menuItems !== undefined &&
333
+ targetItem !== this.menuItems[this.focusIndex]) {
334
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
335
+ this.focusIndex = this.menuItems.indexOf(targetItem);
336
+ targetItem.setAttribute("tabindex", "0");
337
+ }
338
+ };
339
+ this.handleExpandedChanged = (e) => {
340
+ if (e.defaultPrevented ||
341
+ e.target === null ||
342
+ this.menuItems === undefined ||
343
+ this.menuItems.indexOf(e.target) < 0) {
344
+ return;
345
+ }
346
+ e.preventDefault();
347
+ const changedItem = e.target;
348
+ // closing an expanded item without opening another
349
+ if (this.expandedItem !== null &&
350
+ changedItem === this.expandedItem &&
351
+ changedItem.expanded === false) {
352
+ this.expandedItem = null;
353
+ return;
354
+ }
355
+ if (changedItem.expanded) {
356
+ if (this.expandedItem !== null && this.expandedItem !== changedItem) {
357
+ this.expandedItem.expanded = false;
358
+ }
359
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
360
+ this.expandedItem = changedItem;
361
+ this.focusIndex = this.menuItems.indexOf(changedItem);
362
+ changedItem.setAttribute("tabindex", "0");
363
+ }
364
+ };
365
+ this.removeItemListeners = () => {
366
+ if (this.menuItems !== undefined) {
367
+ this.menuItems.forEach((item) => {
368
+ item.removeEventListener("expanded-change", this.handleExpandedChanged);
369
+ item.removeEventListener("focus", this.handleItemFocus);
370
+ });
371
+ }
372
+ };
373
+ this.setItems = () => {
374
+ const newItems = this.domChildren();
375
+ this.removeItemListeners();
376
+ this.menuItems = newItems;
377
+ const menuItems = this.menuItems.filter(this.isMenuItemElement);
378
+ // if our focus index is not -1 we have items
379
+ if (menuItems.length) {
380
+ this.focusIndex = 0;
381
+ }
382
+ function elementIndent(el) {
383
+ const role = el.getAttribute("role");
384
+ const startSlot = el.querySelector("[slot=start]");
385
+ if (role !== MenuItemRole$1.menuitem && startSlot === null) {
386
+ return 1;
387
+ }
388
+ else if (role === MenuItemRole$1.menuitem && startSlot !== null) {
389
+ return 1;
390
+ }
391
+ else if (role !== MenuItemRole$1.menuitem && startSlot !== null) {
392
+ return 2;
393
+ }
394
+ else {
395
+ return 0;
396
+ }
397
+ }
398
+ const indent = menuItems.reduce((accum, current) => {
399
+ const elementValue = elementIndent(current);
400
+ return accum > elementValue ? accum : elementValue;
401
+ }, 0);
402
+ menuItems.forEach((item, index) => {
403
+ item.setAttribute("tabindex", index === 0 ? "0" : "-1");
404
+ item.addEventListener("expanded-change", this.handleExpandedChanged);
405
+ item.addEventListener("focus", this.handleItemFocus);
406
+ if (item instanceof MenuItem$1) {
407
+ item.startColumnCount = indent;
408
+ }
409
+ });
410
+ };
411
+ /**
412
+ * handle change from child element
413
+ */
414
+ this.changeHandler = (e) => {
415
+ if (this.menuItems === undefined) {
416
+ return;
417
+ }
418
+ const changedMenuItem = e.target;
419
+ const changeItemIndex = this.menuItems.indexOf(changedMenuItem);
420
+ if (changeItemIndex === -1) {
421
+ return;
422
+ }
423
+ if (changedMenuItem.role === "menuitemradio" &&
424
+ changedMenuItem.checked === true) {
425
+ for (let i = changeItemIndex - 1; i >= 0; --i) {
426
+ const item = this.menuItems[i];
427
+ const role = item.getAttribute("role");
428
+ if (role === MenuItemRole$1.menuitemradio) {
429
+ item.checked = false;
430
+ }
431
+ if (role === "separator") {
432
+ break;
433
+ }
434
+ }
435
+ const maxIndex = this.menuItems.length - 1;
436
+ for (let i = changeItemIndex + 1; i <= maxIndex; ++i) {
437
+ const item = this.menuItems[i];
438
+ const role = item.getAttribute("role");
439
+ if (role === MenuItemRole$1.menuitemradio) {
440
+ item.checked = false;
441
+ }
442
+ if (role === "separator") {
443
+ break;
444
+ }
445
+ }
446
+ }
447
+ };
448
+ /**
449
+ * check if the item is a menu item
450
+ */
451
+ this.isMenuItemElement = (el) => {
452
+ return (dom.isHTMLElement(el) &&
453
+ Menu.focusableElementRoles.hasOwnProperty(el.getAttribute("role")));
454
+ };
455
+ /**
456
+ * check if the item is focusable
457
+ */
458
+ this.isFocusableElement = (el) => {
459
+ return this.isMenuItemElement(el);
460
+ };
461
+ }
462
+ itemsChanged(oldValue, newValue) {
463
+ // only update children after the component is connected and
464
+ // the setItems has run on connectedCallback
465
+ // (menuItems is undefined until then)
466
+ if (this.$fastController.isConnected && this.menuItems !== undefined) {
467
+ this.setItems();
468
+ }
469
+ }
470
+ /**
471
+ * @internal
472
+ */
473
+ connectedCallback() {
474
+ super.connectedCallback();
475
+ index.DOM.queueUpdate(() => {
476
+ // wait until children have had a chance to
477
+ // connect before setting/checking their props/attributes
478
+ this.setItems();
479
+ });
480
+ this.addEventListener("change", this.changeHandler);
481
+ }
482
+ /**
483
+ * @internal
484
+ */
485
+ disconnectedCallback() {
486
+ super.disconnectedCallback();
487
+ this.removeItemListeners();
488
+ this.menuItems = undefined;
489
+ this.removeEventListener("change", this.changeHandler);
490
+ }
491
+ /**
492
+ * Focuses the first item in the menu.
493
+ *
494
+ * @public
495
+ */
496
+ focus() {
497
+ this.setFocus(0, 1);
498
+ }
499
+ /**
500
+ * Collapses any expanded menu items.
501
+ *
502
+ * @public
503
+ */
504
+ collapseExpandedItem() {
505
+ if (this.expandedItem !== null) {
506
+ this.expandedItem.expanded = false;
507
+ this.expandedItem = null;
508
+ }
509
+ }
510
+ /**
511
+ * @internal
512
+ */
513
+ handleMenuKeyDown(e) {
514
+ if (e.defaultPrevented || this.menuItems === undefined) {
515
+ return;
516
+ }
517
+ switch (e.key) {
518
+ case keyCodes.keyArrowDown:
519
+ // go forward one index
520
+ this.setFocus(this.focusIndex + 1, 1);
521
+ return;
522
+ case keyCodes.keyArrowUp:
523
+ // go back one index
524
+ this.setFocus(this.focusIndex - 1, -1);
525
+ return;
526
+ case keyCodes.keyEnd:
527
+ // set focus on last item
528
+ this.setFocus(this.menuItems.length - 1, -1);
529
+ return;
530
+ case keyCodes.keyHome:
531
+ // set focus on first item
532
+ this.setFocus(0, 1);
533
+ return;
534
+ default:
535
+ // if we are not handling the event, do not prevent default
536
+ return true;
537
+ }
538
+ }
539
+ /**
540
+ * get an array of valid DOM children
541
+ */
542
+ domChildren() {
543
+ return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
544
+ }
545
+ setFocus(focusIndex, adjustment) {
546
+ if (this.menuItems === undefined) {
547
+ return;
548
+ }
549
+ while (focusIndex >= 0 && focusIndex < this.menuItems.length) {
550
+ const child = this.menuItems[focusIndex];
551
+ if (this.isFocusableElement(child)) {
552
+ // change the previous index to -1
553
+ if (this.focusIndex > -1 &&
554
+ this.menuItems.length >= this.focusIndex - 1) {
555
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
556
+ }
557
+ // update the focus index
558
+ this.focusIndex = focusIndex;
559
+ // update the tabindex of next focusable element
560
+ child.setAttribute("tabindex", "0");
561
+ // focus the element
562
+ child.focus();
563
+ break;
564
+ }
565
+ focusIndex += adjustment;
566
+ }
567
+ }
568
+ };
569
+ Menu$1.focusableElementRoles = roleForMenuItem;
570
+ index.__decorate([
571
+ index.observable
572
+ ], Menu$1.prototype, "items", void 0);
573
+
574
+ const styles = ":host(:focus-visible){outline:none}:host([disabled]){pointer-events:none}.base{display:flex;box-sizing:border-box;align-items:center;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);gap:12px;inline-size:100%;padding-block:2px;padding-inline:16px}.base{--_appearance-color-text: var(--_connotation-color-primary);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:where(:hover,.hover):where(:not(:disabled,.disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-primary);--_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-primary);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base:where(.selected,[aria-current]):where(:not(:disabled,.disabled)){--_appearance-color-text: var(--_connotation-color-primary);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.base:where(.selected,[aria-current]):where(:hover,.hover):where(:not(:disabled,.disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-primary);--_appearance-color-fill: var(--_connotation-color-pale);--_appearance-color-outline: transparent}.base{--_connotation-color-primary: var(--vvd-menu-item-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-menu-item-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-menu-item-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-faint: var(--vvd-menu-item-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-menu-item-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-menu-item-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-dim: var(--vvd-menu-item-accent-dim, var(--vvd-color-neutral-200))}.base:not(.two-lines){min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)))}.base.two-lines{min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)) + 1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2)))}@supports (user-select: none){.base{user-select:none}}.base:not(.disabled){cursor:pointer}:host(:not([role=presentation]):focus-visible) .base{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));--focus-stroke-gap-color: transparent;border-radius:8px}.icon{flex-shrink:0;font-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2))/2);line-height:1}.action,.decorative{display:flex;place-content:center}.action{color:var(--_appearance-color-text)}.base.trailing .action,.base.has-meta .action{order:2}.base:not(.disabled) .decorative{color:var(--vvd-color-neutral-600)}.base.disabled .decorative{color:var(--vvd-color-neutral-200)}.base.has-meta .decorative{order:1}.chevron{order:3}.text{display:flex;overflow:hidden;flex-direction:column;margin-inline-end:auto}.text-primary,.text-secondary{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;color:var(--_appearance-color-text);font:var(--vvd-typography-base)}.text-primary{-webkit-line-clamp:var(--text-primary-line-clamp, 1)}.base.two-lines .text-primary{font:var(--vvd-typography-base-bold)}.text-secondary{-webkit-line-clamp:var(--text-secondary-line-clamp, 1)}.base.two-lines .text-secondary{color:var(--vvd-color-neutral-600)}\n";
575
+
576
+ var __defProp$1 = Object.defineProperty;
577
+ var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
578
+ var __decorateClass$1 = (decorators, target, key, kind) => {
579
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
580
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
581
+ if (decorator = decorators[i])
582
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
583
+ if (kind && result)
584
+ __defProp$1(target, key, result);
585
+ return result;
586
+ };
587
+ const MenuItemRole = {
588
+ ...MenuItemRole$1,
589
+ presentation: "presentation"
590
+ };
591
+ var CheckAppearance = /* @__PURE__ */ ((CheckAppearance2) => {
592
+ CheckAppearance2["Normal"] = "normal";
593
+ CheckAppearance2["TickOnly"] = "tick-only";
594
+ return CheckAppearance2;
595
+ })(CheckAppearance || {});
596
+ class MenuItem extends MenuItem$1 {
597
+ constructor() {
598
+ super();
599
+ this.checkTrailing = false;
600
+ this.#submenuArray = [];
601
+ this.updateSubmenu = () => this.#updateSubmenu();
602
+ this.addEventListener("expanded-change", this.#expandedChange);
603
+ }
604
+ #submenuArray;
605
+ /**
606
+ *
607
+ *
608
+ * @internal
609
+ */
610
+ slottedSubmenuChanged(_oldValue, newValue) {
611
+ this.#submenuArray = newValue;
612
+ }
613
+ #updateSubmenu() {
614
+ for (const submenu of this.#submenuArray) {
615
+ this.submenu = submenu;
616
+ this.submenu.anchor = this;
617
+ this.submenu.placement = "right-start";
618
+ this.submenu.collapseExpandedItem = () => this.#collapseExpandedItem();
619
+ }
620
+ this.hasSubmenu = this.submenu === void 0 ? false : true;
621
+ }
622
+ #collapseExpandedItem() {
623
+ this.expanded = false;
624
+ }
625
+ #expandedChange() {
626
+ if (this.hasSubmenu) {
627
+ this.submenu.open = this.expanded;
628
+ }
629
+ }
630
+ }
631
+ __decorateClass$1([
632
+ index.attr
633
+ ], MenuItem.prototype, "text", 2);
634
+ __decorateClass$1([
635
+ index.attr({ attribute: "text-secondary" })
636
+ ], MenuItem.prototype, "textSecondary", 2);
637
+ __decorateClass$1([
638
+ index.attr({ mode: "boolean", attribute: "check-trailing" })
639
+ ], MenuItem.prototype, "checkTrailing", 2);
640
+ __decorateClass$1([
641
+ index.attr({ attribute: "check-appearance" })
642
+ ], MenuItem.prototype, "checkedAppearance", 2);
643
+ __decorateClass$1([
644
+ index.observable
645
+ ], MenuItem.prototype, "metaSlottedContent", 2);
646
+ __decorateClass$1([
647
+ index.observable
648
+ ], MenuItem.prototype, "trailingMetaSlottedContent", 2);
649
+ __decorateClass$1([
650
+ index.observable
651
+ ], MenuItem.prototype, "slottedSubmenu", 2);
652
+ applyMixins.applyMixins(MenuItem, affix.AffixIcon);
653
+
654
+ var __defProp = Object.defineProperty;
655
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
656
+ var __decorateClass = (decorators, target, key, kind) => {
657
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
658
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
659
+ if (decorator = decorators[i])
660
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
661
+ if (kind && result)
662
+ __defProp(target, key, result);
663
+ return result;
664
+ };
665
+ exports.Menu = class Menu extends Menu$1 {
666
+ constructor() {
667
+ super();
668
+ this.ariaLabel = null;
669
+ this.placement = "bottom";
670
+ this.autoDismiss = false;
671
+ this.open = false;
672
+ this.#openIfClosed = () => {
673
+ if (!this.open)
674
+ index.DOM.queueUpdate(() => this.open = true);
675
+ };
676
+ this.#updateClickOutsideListener = () => {
677
+ document.removeEventListener("click", this.#closeOnClickOutside);
678
+ if (this.autoDismiss && this.isConnected) {
679
+ document.addEventListener("click", this.#closeOnClickOutside);
680
+ }
681
+ };
682
+ this.#closeOnClickOutside = (e) => {
683
+ if (!this.contains(e.target))
684
+ this.open = false;
685
+ };
686
+ const handleFocusOut = this.handleFocusOut;
687
+ this.handleFocusOut = (e) => {
688
+ const privates = this;
689
+ const isSafeToCallSuper = privates.menuItems.some(privates.isFocusableElement);
690
+ if (!isSafeToCallSuper) {
691
+ return;
692
+ }
693
+ handleFocusOut(e);
694
+ };
695
+ }
696
+ autoDismissChanged(oldValue) {
697
+ if (oldValue === void 0)
698
+ return;
699
+ this.#updateClickOutsideListener();
700
+ }
701
+ openChanged(_, newValue) {
702
+ newValue ? this.$emit("open", void 0, { bubbles: false }) : this.$emit("close", void 0, { bubbles: false });
703
+ if (this._anchorEl) {
704
+ this.#updateAnchor(this._anchorEl);
705
+ }
706
+ }
707
+ connectedCallback() {
708
+ super.connectedCallback();
709
+ this.#updateClickOutsideListener();
710
+ }
711
+ disconnectedCallback() {
712
+ super.disconnectedCallback();
713
+ this.#updateClickOutsideListener();
714
+ }
715
+ /**
716
+ * @internal
717
+ */
718
+ _anchorElChanged(oldValue, newValue) {
719
+ if (oldValue)
720
+ this.#cleanupAnchor(oldValue);
721
+ if (newValue)
722
+ this.#setupAnchor(newValue);
723
+ }
724
+ #setupAnchor(a) {
725
+ a.addEventListener("click", this.#openIfClosed, true);
726
+ a.setAttribute("aria-haspopup", "menu");
727
+ this.#updateAnchor(a);
728
+ }
729
+ #updateAnchor(a) {
730
+ a.setAttribute("aria-expanded", this.open.toString());
731
+ }
732
+ #cleanupAnchor(a) {
733
+ a.removeEventListener("click", this.#openIfClosed, true);
734
+ a.removeAttribute("aria-hasPopup");
735
+ a.removeAttribute("aria-expanded");
736
+ }
737
+ #openIfClosed;
738
+ #updateClickOutsideListener;
739
+ #closeOnClickOutside;
740
+ };
741
+ __decorateClass([
742
+ index.attr({ attribute: "aria-label" })
743
+ ], exports.Menu.prototype, "ariaLabel", 2);
744
+ __decorateClass([
745
+ index.attr({ mode: "fromView" })
746
+ ], exports.Menu.prototype, "placement", 2);
747
+ __decorateClass([
748
+ index.attr({ mode: "boolean", attribute: "auto-dismiss" })
749
+ ], exports.Menu.prototype, "autoDismiss", 2);
750
+ __decorateClass([
751
+ index.attr({ mode: "boolean" })
752
+ ], exports.Menu.prototype, "open", 2);
753
+ __decorateClass([
754
+ index.observable
755
+ ], exports.Menu.prototype, "headerSlottedContent", 2);
756
+ __decorateClass([
757
+ index.observable
758
+ ], exports.Menu.prototype, "actionItemsSlottedContent", 2);
759
+ exports.Menu = __decorateClass([
760
+ anchored.anchored
761
+ ], exports.Menu);
762
+
763
+ const getIndicatorIcon = (x) => {
764
+ if (x.checkedAppearance === CheckAppearance.TickOnly) {
765
+ return x.checked ? "check-line" : "";
766
+ }
767
+ const iconType = x.role === MenuItemRole.menuitemcheckbox ? "checkbox" : "radio";
768
+ const iconStatus = x.checked ? "checked" : "unchecked";
769
+ return `${iconType}-${iconStatus}-2-line`;
770
+ };
771
+ const getClasses = ({
772
+ disabled,
773
+ checked,
774
+ role,
775
+ text: text2,
776
+ textSecondary,
777
+ icon,
778
+ metaSlottedContent,
779
+ checkTrailing
780
+ }) => classNames.classNames(
781
+ "base",
782
+ ["disabled", Boolean(disabled)],
783
+ ["selected", role !== MenuItemRole.menuitem && Boolean(checked)],
784
+ ["trailing", role !== MenuItemRole.menuitem && (checkTrailing || Boolean(icon))],
785
+ ["item-checkbox", role === MenuItemRole.menuitemcheckbox],
786
+ ["item-radio", role === MenuItemRole.menuitemradio],
787
+ ["two-lines", Boolean(text2?.length) && Boolean(textSecondary?.length)],
788
+ ["has-meta", Boolean(metaSlottedContent?.length)]
789
+ );
790
+ function handleClick(x, { event }) {
791
+ x.handleMenuItemClick(event);
792
+ return x.role === MenuItemRole.presentation;
793
+ }
794
+ function checkIndicator(context) {
795
+ const iconTag = context.tagFor(icon.Icon);
796
+ return index.html`${when.when(
797
+ (x) => x.role === MenuItemRole.menuitemcheckbox || x.role === MenuItemRole.menuitemradio,
798
+ index.html`<span class="action"><${iconTag} class="icon" name="${(x) => getIndicatorIcon(x)}"></${iconTag}></span>`
799
+ )}`;
800
+ }
801
+ function text() {
802
+ return index.html`${when.when(
803
+ (x) => x.text || x.textSecondary,
804
+ index.html`<span class="text">
805
+ ${when.when((x) => x.text, index.html`<span class="text-primary">${(x) => x.text}</span>`)}
806
+ ${when.when((x) => x.textSecondary, index.html`<span class="text-secondary">${(x) => x.textSecondary}</span>`)}
807
+ </span>`
808
+ )}`;
809
+ }
810
+ const MenuItemTemplate = (context) => {
811
+ const affixIconTemplate = affix.affixIconTemplateFactory(context);
812
+ const iconTag = context.tagFor(icon.Icon);
813
+ return index.html`
814
+ <template
815
+ role="${(x) => x.role ? x.role : MenuItemRole.menuitem}"
816
+ aria-haspopup="${(x) => x.hasSubmenu ? "menu" : void 0}"
817
+ aria-checked="${(x) => x.role !== MenuItemRole.menuitem ? x.checked : void 0}"
818
+ aria-disabled="${(x) => x.disabled}"
819
+ aria-expanded="${(x) => x.expanded}"
820
+ @keydown="${(x, c) => x.handleMenuItemKeyDown(c.event)}"
821
+ @click="${handleClick}"
822
+ @mouseover="${(x, c) => x.handleMouseOver(c.event)}"
823
+ @mouseout="${(x, c) => x.handleMouseOut(c.event)}"
824
+ >
825
+ <div class="${getClasses}">
826
+ <slot name="meta" ${slotted.slotted("metaSlottedContent")}></slot>
827
+ ${checkIndicator(context)}
828
+ ${when.when((x) => x.icon, index.html`<span class="decorative">${(x) => affixIconTemplate(x.icon)}</span>`)}
829
+ ${text()}
830
+ <slot name="trailing-meta" ${slotted.slotted("trailingMetaSlottedContent")}></slot>
831
+ ${when.when((x) => x.hasSubmenu, index.html`<${iconTag} class="chevron" name="chevron-right-line"></${iconTag}>`)}
832
+ </div>
833
+ <slot name="submenu" ${slotted.slotted({ property: "slottedSubmenu", filter: slotted.elements(context.tagFor(exports.Menu)) })}></slot>
834
+ </template>
835
+ `;
836
+ };
837
+
838
+ const menuItemDefinition = MenuItem.compose({
839
+ baseName: "menu-item",
840
+ template: MenuItemTemplate,
841
+ styles
842
+ });
843
+ const menuItemRegistries = [menuItemDefinition(), ...definition.iconRegistries, ...definition$1.focusRegistries];
844
+ const registerMenuItem = index.registerFactory(menuItemRegistries);
845
+
846
+ exports.MenuItemRole = MenuItemRole;
847
+ exports.menuItemDefinition = menuItemDefinition;
848
+ exports.menuItemRegistries = menuItemRegistries;
849
+ exports.registerMenuItem = registerMenuItem;