@vonage/vivid 3.0.0-next.6 → 3.0.0-next.60

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 (161) hide show
  1. package/README.md +135 -4
  2. package/accordion/index.js +2 -4
  3. package/accordion-item/index.js +26 -20
  4. package/action-group/index.js +47 -0
  5. package/avatar/index.js +51 -0
  6. package/badge/index.js +14 -20
  7. package/banner/index.js +21 -86
  8. package/breadcrumb/index.js +20 -18
  9. package/breadcrumb-item/index.js +14 -11
  10. package/button/index.js +28 -661
  11. package/calendar/index.js +67 -25
  12. package/calendar-event/index.js +115 -0
  13. package/card/index.js +132 -0
  14. package/checkbox/index.js +180 -0
  15. package/dialog/index.js +279 -0
  16. package/divider/index.js +86 -0
  17. package/elevation/index.js +3 -31
  18. package/fab/index.js +100 -0
  19. package/focus/index.js +18 -3
  20. package/header/index.js +66 -0
  21. package/icon/index.js +9 -5
  22. package/index.js +45 -20
  23. package/layout/index.js +4 -6
  24. package/lib/accordion-item/accordion-item.d.ts +2 -2
  25. package/lib/accordion-item/index.d.ts +2 -1
  26. package/lib/action-group/action-group.d.ts +10 -0
  27. package/lib/{sidenav-item/sidenav-item.template.d.ts → action-group/action-group.template.d.ts} +2 -2
  28. package/lib/{sidenav-item → action-group}/index.d.ts +1 -2
  29. package/lib/avatar/avatar.d.ts +14 -0
  30. package/lib/avatar/avatar.template.d.ts +4 -0
  31. package/lib/avatar/index.d.ts +3 -0
  32. package/lib/badge/badge.d.ts +6 -6
  33. package/lib/badge/index.d.ts +1 -1
  34. package/lib/banner/banner.d.ts +1 -1
  35. package/lib/banner/banner.template.d.ts +0 -2
  36. package/lib/banner/index.d.ts +1 -0
  37. package/lib/breadcrumb/breadcrumb.template.d.ts +4 -0
  38. package/lib/breadcrumb-item/breadcrumb-item.d.ts +1 -1
  39. package/lib/breadcrumb-item/index.d.ts +1 -0
  40. package/lib/button/button.d.ts +6 -5
  41. package/lib/button/index.d.ts +2 -19
  42. package/lib/calendar/calendar.d.ts +3 -1
  43. package/lib/calendar/index.d.ts +0 -1
  44. package/lib/calendar-event/calendar-event.d.ts +14 -0
  45. package/lib/calendar-event/calendar-event.template.d.ts +4 -0
  46. package/lib/calendar-event/index.d.ts +2 -0
  47. package/lib/card/card.d.ts +10 -0
  48. package/lib/{text/text.template.d.ts → card/card.template.d.ts} +2 -2
  49. package/lib/card/index.d.ts +4 -0
  50. package/lib/checkbox/checkbox.d.ts +5 -0
  51. package/lib/checkbox/checkbox.template.d.ts +4 -0
  52. package/lib/checkbox/index.d.ts +4 -0
  53. package/lib/components.d.ts +22 -10
  54. package/lib/dialog/dialog.d.ts +20 -0
  55. package/lib/dialog/dialog.template.d.ts +4 -0
  56. package/lib/dialog/index.d.ts +5 -0
  57. package/lib/divider/divider.d.ts +3 -0
  58. package/lib/divider/divider.template.d.ts +4 -0
  59. package/lib/divider/index.d.ts +2 -0
  60. package/lib/elevation/elevation.d.ts +1 -0
  61. package/lib/elevation/index.d.ts +1 -1
  62. package/lib/enums.d.ts +12 -6
  63. package/lib/fab/fab.d.ts +13 -0
  64. package/lib/fab/fab.template.d.ts +4 -0
  65. package/lib/fab/index.d.ts +4 -0
  66. package/lib/focus/index.d.ts +1 -1
  67. package/lib/header/header.d.ts +5 -0
  68. package/lib/header/header.template.d.ts +4 -0
  69. package/lib/header/index.d.ts +3 -0
  70. package/lib/icon/icon.d.ts +4 -3
  71. package/lib/layout/index.d.ts +1 -1
  72. package/lib/layout/layout.d.ts +3 -3
  73. package/lib/menu/index.d.ts +11 -0
  74. package/lib/menu/menu.d.ts +7 -0
  75. package/lib/menu/menu.template.d.ts +3 -0
  76. package/lib/nav/index.d.ts +2 -0
  77. package/lib/nav/nav.d.ts +3 -0
  78. package/lib/nav/nav.template.d.ts +4 -0
  79. package/lib/nav-disclosure/index.d.ts +4 -0
  80. package/lib/nav-disclosure/nav-disclosure.d.ts +10 -0
  81. package/lib/nav-disclosure/nav-disclosure.template.d.ts +4 -0
  82. package/lib/nav-item/index.d.ts +4 -0
  83. package/lib/{sidenav-item/sidenav-item.d.ts → nav-item/nav-item.d.ts} +2 -2
  84. package/lib/nav-item/nav-item.template.d.ts +4 -0
  85. package/lib/{text → note}/index.d.ts +1 -1
  86. package/lib/note/note.d.ts +10 -0
  87. package/lib/note/note.template.d.ts +5 -0
  88. package/lib/popup/index.d.ts +1 -1
  89. package/lib/popup/popup.d.ts +3 -15
  90. package/lib/progress/progress.d.ts +1 -1
  91. package/lib/progress-ring/progress-ring.d.ts +2 -1
  92. package/lib/side-drawer/index.d.ts +1 -1
  93. package/lib/side-drawer/side-drawer.d.ts +4 -7
  94. package/lib/side-drawer/side-drawer.template.d.ts +2 -2
  95. package/lib/text-anchor/text-anchor.d.ts +1 -1
  96. package/lib/text-area/index.d.ts +3 -0
  97. package/lib/text-area/text-area.d.ts +9 -0
  98. package/lib/text-area/text-area.template.d.ts +4 -0
  99. package/lib/text-field/index.d.ts +4 -0
  100. package/lib/text-field/text-field.d.ts +16 -0
  101. package/lib/text-field/text-field.template.d.ts +5 -0
  102. package/lib/tooltip/tooltip.d.ts +2 -4
  103. package/menu/index.js +659 -0
  104. package/nav/index.js +17 -0
  105. package/nav-disclosure/index.js +88 -0
  106. package/nav-item/index.js +41 -0
  107. package/note/index.js +66 -0
  108. package/package.json +49 -8
  109. package/popup/index.js +19 -2082
  110. package/progress/index.js +35 -28
  111. package/progress-ring/index.js +9 -5
  112. package/shared/anchor.js +8 -1
  113. package/shared/aria-global.js +3 -40
  114. package/shared/base-progress.js +5 -0
  115. package/shared/button.js +199 -0
  116. package/shared/calendar-event.js +26 -0
  117. package/shared/dialog-polyfill.esm.js +858 -0
  118. package/shared/enums.js +79 -0
  119. package/shared/es.object.assign.js +7 -6
  120. package/shared/export.js +995 -0
  121. package/shared/focus.js +5 -0
  122. package/shared/focus2.js +11 -0
  123. package/shared/form-associated.js +554 -0
  124. package/shared/form-elements.js +298 -0
  125. package/shared/icon.js +533 -520
  126. package/shared/index.js +79 -56
  127. package/shared/index2.js +26 -12
  128. package/shared/index3.js +2113 -0
  129. package/shared/iterators.js +61 -0
  130. package/shared/object-keys.js +13 -0
  131. package/shared/patterns/focus.d.ts +3 -0
  132. package/shared/patterns/form-elements.d.ts +22 -0
  133. package/shared/patterns/index.d.ts +1 -0
  134. package/shared/ref.js +41 -0
  135. package/shared/text-anchor.js +2 -11
  136. package/shared/text-anchor.template.js +5 -2
  137. package/shared/to-string.js +51 -0
  138. package/shared/web.dom-collections.iterator.js +78 -1083
  139. package/side-drawer/index.js +50 -51
  140. package/styles/core/all.css +75 -0
  141. package/styles/core/theme.css +11 -0
  142. package/styles/core/typography.css +69 -0
  143. package/styles/fonts/SpeziaCompleteVariableItalicWeb.woff +0 -0
  144. package/styles/fonts/SpeziaCompleteVariableItalicWeb.woff2 +0 -0
  145. package/styles/fonts/SpeziaCompleteVariableUprightWeb.woff +0 -0
  146. package/styles/fonts/SpeziaCompleteVariableUprightWeb.woff2 +0 -0
  147. package/styles/fonts/SpeziaMonoCompleteVariableWeb.woff +0 -0
  148. package/styles/fonts/SpeziaMonoCompleteVariableWeb.woff2 +0 -0
  149. package/styles/fonts/spezia.css +12 -12
  150. package/styles/tokens/theme-dark.css +210 -0
  151. package/styles/tokens/theme-light.css +210 -0
  152. package/text-anchor/index.js +8 -1
  153. package/text-area/index.js +302 -0
  154. package/text-field/index.js +150 -0
  155. package/tooltip/index.js +19 -23
  156. package/lib/text/text.d.ts +0 -10
  157. package/shared/style-inject.es.js +0 -28
  158. package/sidenav-item/index.js +0 -38
  159. package/styles/themes/dark.css +0 -193
  160. package/styles/themes/light.css +0 -193
  161. package/text/index.js +0 -45
package/menu/index.js ADDED
@@ -0,0 +1,659 @@
1
+ import { P as Popup } from '../shared/index3.js';
2
+ import { F as FoundationElement, D as DOM, _ as __decorate, a as attr, o as observable, b as __metadata, h as html, d as designSystem } from '../shared/index.js';
3
+ import '../shared/web.dom-collections.iterator.js';
4
+ import { S as StartEnd } from '../shared/aria-global.js';
5
+ import { a as applyMixins } from '../shared/apply-mixins.js';
6
+ import { a as keyArrowLeft, b as keyArrowRight, k as keySpace, c as keyEnter, d as keyHome, e as keyEnd, f as keyArrowUp, g as keyArrowDown } from '../shared/form-associated.js';
7
+ import { s as slotted } from '../shared/slotted.js';
8
+ import '../shared/index2.js';
9
+ import '../shared/class-names.js';
10
+ import '../button/index.js';
11
+ import '../icon/index.js';
12
+ import '../shared/icon.js';
13
+ import '../shared/export.js';
14
+ import '../shared/iterators.js';
15
+ import '../shared/to-string.js';
16
+ import '../shared/_has.js';
17
+ import '../shared/when.js';
18
+ import '../focus/index.js';
19
+ import '../shared/focus.js';
20
+ import '../shared/affix.js';
21
+ import '../shared/button.js';
22
+ import '../shared/focus2.js';
23
+ import '../shared/ref.js';
24
+ import '../shared/object-keys.js';
25
+ import '../shared/es.object.assign.js';
26
+
27
+ /**
28
+ * A test that ensures that all arguments are HTML Elements
29
+ */
30
+ function isHTMLElement(...args) {
31
+ return args.every((arg) => arg instanceof HTMLElement);
32
+ }
33
+
34
+ /**
35
+ * Expose ltr and rtl strings
36
+ */
37
+ var Direction;
38
+ (function (Direction) {
39
+ Direction["ltr"] = "ltr";
40
+ Direction["rtl"] = "rtl";
41
+ })(Direction || (Direction = {}));
42
+
43
+ /**
44
+ * a method to determine the current localization direction of the view
45
+ * @param rootNode - the HTMLElement to begin the query from, usually "this" when used in a component controller
46
+ * @public
47
+ */
48
+ const getDirection = (rootNode) => {
49
+ const dirNode = rootNode.closest("[dir]");
50
+ return dirNode !== null && dirNode.dir === "rtl" ? Direction.rtl : Direction.ltr;
51
+ };
52
+
53
+ /**
54
+ * Menu items roles.
55
+ * @public
56
+ */
57
+ const MenuItemRole = {
58
+ /**
59
+ * The menu item has a "menuitem" role
60
+ */
61
+ menuitem: "menuitem",
62
+ /**
63
+ * The menu item has a "menuitemcheckbox" role
64
+ */
65
+ menuitemcheckbox: "menuitemcheckbox",
66
+ /**
67
+ * The menu item has a "menuitemradio" role
68
+ */
69
+ menuitemradio: "menuitemradio",
70
+ };
71
+ /**
72
+ * @internal
73
+ */
74
+ const roleForMenuItem = {
75
+ [MenuItemRole.menuitem]: "menuitem",
76
+ [MenuItemRole.menuitemcheckbox]: "menuitemcheckbox",
77
+ [MenuItemRole.menuitemradio]: "menuitemradio",
78
+ };
79
+
80
+ /**
81
+ * A Switch Custom HTML Element.
82
+ * 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 }.
83
+ *
84
+ * @slot checked-indicator - The checked indicator
85
+ * @slot radio-indicator - The radio indicator
86
+ * @slot start - Content which can be provided before the menu item content
87
+ * @slot end - Content which can be provided after the menu item content
88
+ * @slot - The default slot for menu item content
89
+ * @slot expand-collapse-indicator - The expand/collapse indicator
90
+ * @slot submenu - Used to nest menu's within menu items
91
+ * @csspart input-container - The element representing the visual checked or radio indicator
92
+ * @csspart checkbox - The element wrapping the `menuitemcheckbox` indicator
93
+ * @csspart radio - The element wrapping the `menuitemradio` indicator
94
+ * @csspart content - The element wrapping the menu item content
95
+ * @csspart expand-collapse-glyph-container - The element wrapping the expand collapse element
96
+ * @csspart expand-collapse - The expand/collapse element
97
+ * @csspart submenu-region - The container for the submenu, used for positioning
98
+ * @fires expanded-change - Fires a custom 'expanded-change' event when the expanded state changes
99
+ * @fires change - Fires a custom 'change' event when a non-submenu item with a role of `menuitemcheckbox`, `menuitemradio`, or `menuitem` is invoked
100
+ *
101
+ * @public
102
+ */
103
+ class MenuItem extends FoundationElement {
104
+ constructor() {
105
+ super(...arguments);
106
+ /**
107
+ * The role of the element.
108
+ *
109
+ * @public
110
+ * @remarks
111
+ * HTML Attribute: role
112
+ */
113
+ this.role = MenuItemRole.menuitem;
114
+ /**
115
+ * @internal
116
+ */
117
+ this.hasSubmenu = false;
118
+ /**
119
+ * Track current direction to pass to the anchored region
120
+ *
121
+ * @internal
122
+ */
123
+ this.currentDirection = Direction.ltr;
124
+ this.focusSubmenuOnLoad = false;
125
+ /**
126
+ * @internal
127
+ */
128
+ this.handleMenuItemKeyDown = (e) => {
129
+ if (e.defaultPrevented) {
130
+ return false;
131
+ }
132
+ switch (e.key) {
133
+ case keyEnter:
134
+ case keySpace:
135
+ this.invoke();
136
+ return false;
137
+ case keyArrowRight:
138
+ //open/focus on submenu
139
+ this.expandAndFocus();
140
+ return false;
141
+ case keyArrowLeft:
142
+ //close submenu
143
+ if (this.expanded) {
144
+ this.expanded = false;
145
+ this.focus();
146
+ return false;
147
+ }
148
+ }
149
+ return true;
150
+ };
151
+ /**
152
+ * @internal
153
+ */
154
+ this.handleMenuItemClick = (e) => {
155
+ if (e.defaultPrevented || this.disabled) {
156
+ return false;
157
+ }
158
+ this.invoke();
159
+ return false;
160
+ };
161
+ /**
162
+ * @internal
163
+ */
164
+ this.submenuLoaded = () => {
165
+ if (!this.focusSubmenuOnLoad) {
166
+ return;
167
+ }
168
+ this.focusSubmenuOnLoad = false;
169
+ if (this.hasSubmenu) {
170
+ this.submenu.focus();
171
+ this.setAttribute("tabindex", "-1");
172
+ }
173
+ };
174
+ /**
175
+ * @internal
176
+ */
177
+ this.handleMouseOver = (e) => {
178
+ if (this.disabled || !this.hasSubmenu || this.expanded) {
179
+ return false;
180
+ }
181
+ this.expanded = true;
182
+ return false;
183
+ };
184
+ /**
185
+ * @internal
186
+ */
187
+ this.handleMouseOut = (e) => {
188
+ if (!this.expanded || this.contains(document.activeElement)) {
189
+ return false;
190
+ }
191
+ this.expanded = false;
192
+ return false;
193
+ };
194
+ /**
195
+ * @internal
196
+ */
197
+ this.expandAndFocus = () => {
198
+ if (!this.hasSubmenu) {
199
+ return;
200
+ }
201
+ this.focusSubmenuOnLoad = true;
202
+ this.expanded = true;
203
+ };
204
+ /**
205
+ * @internal
206
+ */
207
+ this.invoke = () => {
208
+ if (this.disabled) {
209
+ return;
210
+ }
211
+ switch (this.role) {
212
+ case MenuItemRole.menuitemcheckbox:
213
+ this.checked = !this.checked;
214
+ break;
215
+ case MenuItemRole.menuitem:
216
+ // update submenu
217
+ this.updateSubmenu();
218
+ if (this.hasSubmenu) {
219
+ this.expandAndFocus();
220
+ }
221
+ else {
222
+ this.$emit("change");
223
+ }
224
+ break;
225
+ case MenuItemRole.menuitemradio:
226
+ if (!this.checked) {
227
+ this.checked = true;
228
+ }
229
+ break;
230
+ }
231
+ };
232
+ /**
233
+ * Gets the submenu element if any
234
+ *
235
+ * @internal
236
+ */
237
+ this.updateSubmenu = () => {
238
+ this.submenu = this.domChildren().find((element) => {
239
+ return element.getAttribute("role") === "menu";
240
+ });
241
+ this.hasSubmenu = this.submenu === undefined ? false : true;
242
+ };
243
+ }
244
+ expandedChanged(oldValue) {
245
+ if (this.$fastController.isConnected) {
246
+ if (this.submenu === undefined) {
247
+ return;
248
+ }
249
+ if (this.expanded === false) {
250
+ this.submenu.collapseExpandedItem();
251
+ }
252
+ else {
253
+ this.currentDirection = getDirection(this);
254
+ }
255
+ this.$emit("expanded-change", this, { bubbles: false });
256
+ }
257
+ }
258
+ checkedChanged(oldValue, newValue) {
259
+ if (this.$fastController.isConnected) {
260
+ this.$emit("change");
261
+ }
262
+ }
263
+ /**
264
+ * @internal
265
+ */
266
+ connectedCallback() {
267
+ super.connectedCallback();
268
+ DOM.queueUpdate(() => {
269
+ this.updateSubmenu();
270
+ });
271
+ if (!this.startColumnCount) {
272
+ this.startColumnCount = 1;
273
+ }
274
+ this.observer = new MutationObserver(this.updateSubmenu);
275
+ }
276
+ /**
277
+ * @internal
278
+ */
279
+ disconnectedCallback() {
280
+ super.disconnectedCallback();
281
+ this.submenu = undefined;
282
+ if (this.observer !== undefined) {
283
+ this.observer.disconnect();
284
+ this.observer = undefined;
285
+ }
286
+ }
287
+ /**
288
+ * get an array of valid DOM children
289
+ */
290
+ domChildren() {
291
+ return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
292
+ }
293
+ }
294
+ __decorate([
295
+ attr({ mode: "boolean" })
296
+ ], MenuItem.prototype, "disabled", void 0);
297
+ __decorate([
298
+ attr({ mode: "boolean" })
299
+ ], MenuItem.prototype, "expanded", void 0);
300
+ __decorate([
301
+ observable
302
+ ], MenuItem.prototype, "startColumnCount", void 0);
303
+ __decorate([
304
+ attr
305
+ ], MenuItem.prototype, "role", void 0);
306
+ __decorate([
307
+ attr({ mode: "boolean" })
308
+ ], MenuItem.prototype, "checked", void 0);
309
+ __decorate([
310
+ observable
311
+ ], MenuItem.prototype, "submenuRegion", void 0);
312
+ __decorate([
313
+ observable
314
+ ], MenuItem.prototype, "hasSubmenu", void 0);
315
+ __decorate([
316
+ observable
317
+ ], MenuItem.prototype, "currentDirection", void 0);
318
+ __decorate([
319
+ observable
320
+ ], MenuItem.prototype, "submenu", void 0);
321
+ applyMixins(MenuItem, StartEnd);
322
+
323
+ /**
324
+ * A Menu Custom HTML Element.
325
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#menu | ARIA menu }.
326
+ *
327
+ * @slot - The default slot for the menu items
328
+ *
329
+ * @public
330
+ */
331
+ class Menu$1 extends FoundationElement {
332
+ constructor() {
333
+ super(...arguments);
334
+ this.expandedItem = null;
335
+ /**
336
+ * The index of the focusable element in the items array
337
+ * defaults to -1
338
+ */
339
+ this.focusIndex = -1;
340
+ /**
341
+ * @internal
342
+ */
343
+ this.isNestedMenu = () => {
344
+ return (this.parentElement !== null &&
345
+ isHTMLElement(this.parentElement) &&
346
+ this.parentElement.getAttribute("role") === "menuitem");
347
+ };
348
+ /**
349
+ * if focus is moving out of the menu, reset to a stable initial state
350
+ * @internal
351
+ */
352
+ this.handleFocusOut = (e) => {
353
+ if (!this.contains(e.relatedTarget) && this.menuItems !== undefined) {
354
+ this.collapseExpandedItem();
355
+ // find our first focusable element
356
+ const focusIndex = this.menuItems.findIndex(this.isFocusableElement);
357
+ // set the current focus index's tabindex to -1
358
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
359
+ // set the first focusable element tabindex to 0
360
+ this.menuItems[focusIndex].setAttribute("tabindex", "0");
361
+ // set the focus index
362
+ this.focusIndex = focusIndex;
363
+ }
364
+ };
365
+ this.handleItemFocus = (e) => {
366
+ const targetItem = e.target;
367
+ if (this.menuItems !== undefined &&
368
+ targetItem !== this.menuItems[this.focusIndex]) {
369
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
370
+ this.focusIndex = this.menuItems.indexOf(targetItem);
371
+ targetItem.setAttribute("tabindex", "0");
372
+ }
373
+ };
374
+ this.handleExpandedChanged = (e) => {
375
+ if (e.defaultPrevented ||
376
+ e.target === null ||
377
+ this.menuItems === undefined ||
378
+ this.menuItems.indexOf(e.target) < 0) {
379
+ return;
380
+ }
381
+ e.preventDefault();
382
+ const changedItem = e.target;
383
+ // closing an expanded item without opening another
384
+ if (this.expandedItem !== null &&
385
+ changedItem === this.expandedItem &&
386
+ changedItem.expanded === false) {
387
+ this.expandedItem = null;
388
+ return;
389
+ }
390
+ if (changedItem.expanded) {
391
+ if (this.expandedItem !== null && this.expandedItem !== changedItem) {
392
+ this.expandedItem.expanded = false;
393
+ }
394
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
395
+ this.expandedItem = changedItem;
396
+ this.focusIndex = this.menuItems.indexOf(changedItem);
397
+ changedItem.setAttribute("tabindex", "0");
398
+ }
399
+ };
400
+ this.removeItemListeners = () => {
401
+ if (this.menuItems !== undefined) {
402
+ this.menuItems.forEach((item) => {
403
+ item.removeEventListener("expanded-change", this.handleExpandedChanged);
404
+ item.removeEventListener("focus", this.handleItemFocus);
405
+ });
406
+ }
407
+ };
408
+ this.setItems = () => {
409
+ const newItems = this.domChildren();
410
+ this.removeItemListeners();
411
+ this.menuItems = newItems;
412
+ const menuItems = this.menuItems.filter(this.isMenuItemElement);
413
+ // if our focus index is not -1 we have items
414
+ if (menuItems.length) {
415
+ this.focusIndex = 0;
416
+ }
417
+ function elementIndent(el) {
418
+ const role = el.getAttribute("role");
419
+ const startSlot = el.querySelector("[slot=start]");
420
+ if (role !== MenuItemRole.menuitem && startSlot === null) {
421
+ return 1;
422
+ }
423
+ else if (role === MenuItemRole.menuitem && startSlot !== null) {
424
+ return 1;
425
+ }
426
+ else if (role !== MenuItemRole.menuitem && startSlot !== null) {
427
+ return 2;
428
+ }
429
+ else {
430
+ return 0;
431
+ }
432
+ }
433
+ const indent = menuItems.reduce((accum, current) => {
434
+ const elementValue = elementIndent(current);
435
+ return accum > elementValue ? accum : elementValue;
436
+ }, 0);
437
+ menuItems.forEach((item, index) => {
438
+ item.setAttribute("tabindex", index === 0 ? "0" : "-1");
439
+ item.addEventListener("expanded-change", this.handleExpandedChanged);
440
+ item.addEventListener("focus", this.handleItemFocus);
441
+ if (item instanceof MenuItem) {
442
+ item.startColumnCount = indent;
443
+ }
444
+ });
445
+ };
446
+ /**
447
+ * handle change from child element
448
+ */
449
+ this.changeHandler = (e) => {
450
+ if (this.menuItems === undefined) {
451
+ return;
452
+ }
453
+ const changedMenuItem = e.target;
454
+ const changeItemIndex = this.menuItems.indexOf(changedMenuItem);
455
+ if (changeItemIndex === -1) {
456
+ return;
457
+ }
458
+ if (changedMenuItem.role === "menuitemradio" &&
459
+ changedMenuItem.checked === true) {
460
+ for (let i = changeItemIndex - 1; i >= 0; --i) {
461
+ const item = this.menuItems[i];
462
+ const role = item.getAttribute("role");
463
+ if (role === MenuItemRole.menuitemradio) {
464
+ item.checked = false;
465
+ }
466
+ if (role === "separator") {
467
+ break;
468
+ }
469
+ }
470
+ const maxIndex = this.menuItems.length - 1;
471
+ for (let i = changeItemIndex + 1; i <= maxIndex; ++i) {
472
+ const item = this.menuItems[i];
473
+ const role = item.getAttribute("role");
474
+ if (role === MenuItemRole.menuitemradio) {
475
+ item.checked = false;
476
+ }
477
+ if (role === "separator") {
478
+ break;
479
+ }
480
+ }
481
+ }
482
+ };
483
+ /**
484
+ * check if the item is a menu item
485
+ */
486
+ this.isMenuItemElement = (el) => {
487
+ return (isHTMLElement(el) &&
488
+ Menu$1.focusableElementRoles.hasOwnProperty(el.getAttribute("role")));
489
+ };
490
+ /**
491
+ * check if the item is focusable
492
+ */
493
+ this.isFocusableElement = (el) => {
494
+ return this.isMenuItemElement(el);
495
+ };
496
+ }
497
+ itemsChanged(oldValue, newValue) {
498
+ // only update children after the component is connected and
499
+ // the setItems has run on connectedCallback
500
+ // (menuItems is undefined until then)
501
+ if (this.$fastController.isConnected && this.menuItems !== undefined) {
502
+ this.setItems();
503
+ }
504
+ }
505
+ /**
506
+ * @internal
507
+ */
508
+ connectedCallback() {
509
+ super.connectedCallback();
510
+ DOM.queueUpdate(() => {
511
+ // wait until children have had a chance to
512
+ // connect before setting/checking their props/attributes
513
+ this.setItems();
514
+ });
515
+ this.addEventListener("change", this.changeHandler);
516
+ }
517
+ /**
518
+ * @internal
519
+ */
520
+ disconnectedCallback() {
521
+ super.disconnectedCallback();
522
+ this.removeItemListeners();
523
+ this.menuItems = undefined;
524
+ this.removeEventListener("change", this.changeHandler);
525
+ }
526
+ /**
527
+ * Focuses the first item in the menu.
528
+ *
529
+ * @public
530
+ */
531
+ focus() {
532
+ this.setFocus(0, 1);
533
+ }
534
+ /**
535
+ * Collapses any expanded menu items.
536
+ *
537
+ * @public
538
+ */
539
+ collapseExpandedItem() {
540
+ if (this.expandedItem !== null) {
541
+ this.expandedItem.expanded = false;
542
+ this.expandedItem = null;
543
+ }
544
+ }
545
+ /**
546
+ * @internal
547
+ */
548
+ handleMenuKeyDown(e) {
549
+ if (e.defaultPrevented || this.menuItems === undefined) {
550
+ return;
551
+ }
552
+ switch (e.key) {
553
+ case keyArrowDown:
554
+ // go forward one index
555
+ this.setFocus(this.focusIndex + 1, 1);
556
+ return;
557
+ case keyArrowUp:
558
+ // go back one index
559
+ this.setFocus(this.focusIndex - 1, -1);
560
+ return;
561
+ case keyEnd:
562
+ // set focus on last item
563
+ this.setFocus(this.menuItems.length - 1, -1);
564
+ return;
565
+ case keyHome:
566
+ // set focus on first item
567
+ this.setFocus(0, 1);
568
+ return;
569
+ default:
570
+ // if we are not handling the event, do not prevent default
571
+ return true;
572
+ }
573
+ }
574
+ /**
575
+ * get an array of valid DOM children
576
+ */
577
+ domChildren() {
578
+ return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
579
+ }
580
+ setFocus(focusIndex, adjustment) {
581
+ if (this.menuItems === undefined) {
582
+ return;
583
+ }
584
+ while (focusIndex >= 0 && focusIndex < this.menuItems.length) {
585
+ const child = this.menuItems[focusIndex];
586
+ if (this.isFocusableElement(child)) {
587
+ // change the previous index to -1
588
+ if (this.focusIndex > -1 &&
589
+ this.menuItems.length >= this.focusIndex - 1) {
590
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
591
+ }
592
+ // update the focus index
593
+ this.focusIndex = focusIndex;
594
+ // update the tabindex of next focusable element
595
+ child.setAttribute("tabindex", "0");
596
+ // focus the element
597
+ child.focus();
598
+ break;
599
+ }
600
+ focusIndex += adjustment;
601
+ }
602
+ }
603
+ }
604
+ Menu$1.focusableElementRoles = roleForMenuItem;
605
+ __decorate([
606
+ observable
607
+ ], Menu$1.prototype, "items", void 0);
608
+
609
+ var css_248z = ".base {\n padding-block: 8px;\n}";
610
+
611
+ class Menu extends Menu$1 {
612
+ constructor() {
613
+ super(...arguments);
614
+ this.open = false;
615
+ }
616
+
617
+ }
618
+
619
+ __decorate([attr({
620
+ mode: 'boolean'
621
+ }), __metadata("design:type", Object)], Menu.prototype, "open", void 0);
622
+
623
+ __decorate([attr, __metadata("design:type", String)], Menu.prototype, "placement", void 0);
624
+
625
+ __decorate([attr, __metadata("design:type", String)], Menu.prototype, "anchor", void 0);
626
+
627
+ let _ = t => t,
628
+ _t;
629
+ const MenuTemplate = context => {
630
+ const popupTag = context.tagFor(Popup);
631
+ return html(_t || (_t = _`
632
+ <template
633
+ slot="${0}"
634
+ >
635
+ <${0}
636
+ placement=${0}
637
+ open=${0}
638
+ anchor=${0}
639
+ >
640
+ <div
641
+ class="base"
642
+ role="menu"
643
+ @keydown="${0}"
644
+ @focusout="${0}"
645
+ >
646
+ <slot ${0}></slot>
647
+ </div>
648
+ </${0}>
649
+ </template>`), x => x.slot || x.isNestedMenu() ? 'submenu' : void 0, popupTag, x => x.placement, x => x.open, x => x.anchor, (x, c) => x.handleMenuKeyDown(c.event), (x, c) => x.handleFocusOut(c.event), slotted('items'), popupTag);
650
+ };
651
+
652
+ const vividMenu = Menu.compose({
653
+ baseName: 'menu',
654
+ template: MenuTemplate,
655
+ styles: css_248z
656
+ });
657
+ designSystem.register(vividMenu());
658
+
659
+ export { vividMenu };
package/nav/index.js ADDED
@@ -0,0 +1,17 @@
1
+ import { F as FoundationElement, h as html, d as designSystem } from '../shared/index.js';
2
+
3
+ class Nav extends FoundationElement {}
4
+
5
+ let _ = t => t,
6
+ _t;
7
+ const NavTemplate = () => html(_t || (_t = _`
8
+ <nav><slot></slot></nav>
9
+ `));
10
+
11
+ const vividNav = Nav.compose({
12
+ baseName: 'nav',
13
+ template: NavTemplate
14
+ });
15
+ designSystem.register(vividNav());
16
+
17
+ export { vividNav };