@vonage/vivid 3.24.0 → 3.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/accordion/index.js +0 -1
  2. package/accordion-item/index.js +0 -1
  3. package/alert/index.js +0 -1
  4. package/avatar/index.js +0 -1
  5. package/badge/index.js +0 -1
  6. package/banner/index.js +0 -1
  7. package/breadcrumb-item/index.js +0 -1
  8. package/button/index.js +0 -1
  9. package/card/index.js +0 -1
  10. package/checkbox/index.js +0 -1
  11. package/combobox/index.js +0 -1
  12. package/custom-elements.json +82 -10
  13. package/data-grid/index.js +7 -2
  14. package/dialog/index.js +0 -1
  15. package/empty-state/index.js +0 -1
  16. package/fab/index.js +0 -1
  17. package/icon/index.js +0 -1
  18. package/index.js +27 -29
  19. package/lib/action-group/action-group.d.ts +1 -1
  20. package/lib/avatar/avatar.d.ts +1 -1
  21. package/lib/checkbox/checkbox.d.ts +0 -1
  22. package/lib/components.d.ts +0 -2
  23. package/lib/data-grid/data-grid-cell.d.ts +14 -1
  24. package/lib/data-grid/data-grid.d.ts +4 -0
  25. package/lib/data-grid/data-grid.options.d.ts +7 -0
  26. package/lib/dialog/dialog.d.ts +1 -0
  27. package/lib/listbox/listbox.d.ts +1 -1
  28. package/lib/menu/menu.d.ts +0 -1
  29. package/lib/menu-item/menu-item.d.ts +6 -0
  30. package/lib/menu-item/menu-item.template.d.ts +2 -3
  31. package/lib/number-field/number-field.d.ts +1 -1
  32. package/lib/select/select.d.ts +1 -1
  33. package/lib/text-field/text-field.d.ts +1 -1
  34. package/listbox/index.js +56 -11
  35. package/menu/index.js +2 -3
  36. package/menu-item/index.js +2 -2
  37. package/nav/index.js +1 -1
  38. package/nav-disclosure/index.js +1 -2
  39. package/nav-item/index.js +1 -2
  40. package/note/index.js +1 -2
  41. package/number-field/index.js +1 -2
  42. package/option/index.js +0 -1
  43. package/package.json +1 -1
  44. package/pagination/index.js +1 -2
  45. package/popup/index.js +0 -1
  46. package/progress/index.js +1 -1
  47. package/radio/index.js +1 -1
  48. package/radio-group/index.js +1 -1
  49. package/select/index.js +1 -2
  50. package/shared/definition.js +1 -1
  51. package/shared/definition10.js +1 -1
  52. package/shared/definition11.js +1 -1
  53. package/shared/definition12.js +1 -1
  54. package/shared/definition14.js +1 -1
  55. package/shared/definition15.js +1 -1
  56. package/shared/definition16.js +2 -2
  57. package/shared/definition17.js +1 -1
  58. package/shared/definition18.js +1 -1
  59. package/shared/definition19.js +1 -1
  60. package/shared/definition2.js +1 -1
  61. package/shared/definition21.js +1 -1
  62. package/shared/definition22.js +76 -21
  63. package/shared/definition23.js +5 -4
  64. package/shared/definition24.js +1 -1
  65. package/shared/definition25.js +1 -1
  66. package/shared/definition26.js +1 -1
  67. package/shared/definition27.js +1 -1
  68. package/shared/definition29.js +368 -48
  69. package/shared/definition30.js +301 -298
  70. package/shared/definition31.js +14 -366
  71. package/shared/definition32.js +70 -13
  72. package/shared/definition33.js +25 -64
  73. package/shared/definition34.js +39 -27
  74. package/shared/definition35.js +431 -31
  75. package/shared/definition36.js +214 -430
  76. package/shared/definition37.js +70 -209
  77. package/shared/definition38.js +33 -81
  78. package/shared/definition39.js +423 -32
  79. package/shared/definition4.js +1 -1
  80. package/shared/definition40.js +586 -358
  81. package/shared/definition41.js +73 -648
  82. package/shared/definition42.js +584 -70
  83. package/shared/definition43.js +81 -538
  84. package/shared/definition44.js +52 -127
  85. package/shared/definition45.js +16 -56
  86. package/shared/definition46.js +485 -17
  87. package/shared/definition47.js +99 -477
  88. package/shared/definition48.js +19 -114
  89. package/shared/definition49.js +276 -19
  90. package/shared/definition5.js +1 -1
  91. package/shared/definition50.js +89 -245
  92. package/shared/definition51.js +629 -109
  93. package/shared/definition52.js +86 -601
  94. package/shared/definition53.js +68 -112
  95. package/shared/definition54.js +294 -69
  96. package/shared/definition6.js +1 -1
  97. package/shared/definition7.js +1 -1
  98. package/shared/definition8.js +2 -2
  99. package/shared/definition9.js +1 -1
  100. package/shared/es.object.assign.js +1 -1
  101. package/shared/es.regexp.to-string.js +1 -1
  102. package/shared/es.string.includes.js +1 -1
  103. package/shared/form-elements.js +1 -1
  104. package/shared/icon.js +17 -13
  105. package/shared/index.js +1 -1
  106. package/shared/patterns/form-elements/form-elements.d.ts +4 -4
  107. package/shared/string-trim.js +1 -1
  108. package/shared/text-field.js +1 -1
  109. package/shared/to-string.js +1 -1
  110. package/side-drawer/index.js +1 -1
  111. package/slider/index.js +1 -1
  112. package/styles/core/all.css +1 -1
  113. package/styles/core/theme.css +1 -1
  114. package/styles/core/typography.css +1 -1
  115. package/styles/tokens/theme-dark.css +4 -4
  116. package/styles/tokens/theme-light.css +4 -4
  117. package/switch/index.js +1 -2
  118. package/tab/index.js +1 -2
  119. package/tab-panel/index.js +1 -1
  120. package/tabs/index.js +3 -4
  121. package/tag/index.js +1 -2
  122. package/tag-group/index.js +1 -1
  123. package/text-anchor/index.js +0 -1
  124. package/text-area/index.js +1 -2
  125. package/text-field/index.js +3 -2
  126. package/toggletip/index.js +1 -2
  127. package/tooltip/index.js +1 -2
  128. package/tree-item/index.js +1 -2
  129. package/tree-view/index.js +1 -1
  130. package/vivid.api.json +19 -210
  131. package/shared/definition55.js +0 -305
  132. package/shared/engine-is-node.js +0 -8
@@ -1,191 +1,225 @@
1
- import { F as FoundationElement, Y as DOM, _ as __decorate, o as observable, V as __classPrivateFieldGet, a as attr, b as __metadata, h as html, r as registerFactory } from './index.js';
2
- import { P as Popup, p as popupRegistries } from './definition20.js';
3
- import { M as MenuItem, a as MenuItemRole, r as roleForMenuItem, m as menuItemRegistries } from './definition31.js';
4
- import { i as isHTMLElement } from './dom.js';
5
- import { a as keyHome, k as keyEnd, c as keyArrowUp, b as keyArrowDown } from './key-codes.js';
1
+ import { F as FoundationElement, Y as DOM, _ as __decorate, a as attr, o as observable, b as __metadata, h as html, r as registerFactory } from './index.js';
2
+ import { i as iconRegistries } from './definition3.js';
3
+ import { f as focusRegistries } from './definition4.js';
4
+ import './es.object.assign.js';
5
+ import { b as AffixIcon, a as affixIconTemplateFactory } from './affix.js';
6
+ import { S as StartEnd } from './start-end.js';
7
+ import { D as Direction, g as getDirection } from './direction.js';
8
+ import { a as applyMixins } from './apply-mixins.js';
9
+ import { i as keyArrowLeft, h as keyArrowRight, e as keySpace, d as keyEnter } from './key-codes.js';
10
+ import { f as focusTemplateFactory } from './focus2.js';
11
+ import { w as when } from './when.js';
6
12
  import { s as slotted } from './slotted.js';
7
- import { r as ref } from './ref.js';
13
+ import { c as classNames } from './class-names.js';
8
14
 
9
15
  /**
10
- * A Menu Custom HTML Element.
11
- * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#menu | ARIA menu }.
16
+ * Menu items roles.
17
+ * @public
18
+ */
19
+ const MenuItemRole$1 = {
20
+ /**
21
+ * The menu item has a "menuitem" role
22
+ */
23
+ menuitem: "menuitem",
24
+ /**
25
+ * The menu item has a "menuitemcheckbox" role
26
+ */
27
+ menuitemcheckbox: "menuitemcheckbox",
28
+ /**
29
+ * The menu item has a "menuitemradio" role
30
+ */
31
+ menuitemradio: "menuitemradio",
32
+ };
33
+ /**
34
+ * @internal
35
+ */
36
+ const roleForMenuItem = {
37
+ [MenuItemRole$1.menuitem]: "menuitem",
38
+ [MenuItemRole$1.menuitemcheckbox]: "menuitemcheckbox",
39
+ [MenuItemRole$1.menuitemradio]: "menuitemradio",
40
+ };
41
+
42
+ /**
43
+ * A Switch Custom HTML Element.
44
+ * 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 }.
12
45
  *
13
- * @slot - The default slot for the menu items
46
+ * @slot checked-indicator - The checked indicator
47
+ * @slot radio-indicator - The radio indicator
48
+ * @slot start - Content which can be provided before the menu item content
49
+ * @slot end - Content which can be provided after the menu item content
50
+ * @slot - The default slot for menu item content
51
+ * @slot expand-collapse-indicator - The expand/collapse indicator
52
+ * @slot submenu - Used to nest menu's within menu items
53
+ * @csspart input-container - The element representing the visual checked or radio indicator
54
+ * @csspart checkbox - The element wrapping the `menuitemcheckbox` indicator
55
+ * @csspart radio - The element wrapping the `menuitemradio` indicator
56
+ * @csspart content - The element wrapping the menu item content
57
+ * @csspart expand-collapse-glyph-container - The element wrapping the expand collapse element
58
+ * @csspart expand-collapse - The expand/collapse element
59
+ * @csspart submenu-region - The container for the submenu, used for positioning
60
+ * @fires expanded-change - Fires a custom 'expanded-change' event when the expanded state changes
61
+ * @fires change - Fires a custom 'change' event when a non-submenu item with a role of `menuitemcheckbox`, `menuitemradio`, or `menuitem` is invoked
14
62
  *
15
63
  * @public
16
64
  */
17
- class Menu$1 extends FoundationElement {
65
+ class MenuItem$1 extends FoundationElement {
18
66
  constructor() {
19
67
  super(...arguments);
20
- this.expandedItem = null;
21
68
  /**
22
- * The index of the focusable element in the items array
23
- * defaults to -1
69
+ * The role of the element.
70
+ *
71
+ * @public
72
+ * @remarks
73
+ * HTML Attribute: role
24
74
  */
25
- this.focusIndex = -1;
75
+ this.role = MenuItemRole$1.menuitem;
26
76
  /**
27
77
  * @internal
28
78
  */
29
- this.isNestedMenu = () => {
30
- return (this.parentElement !== null &&
31
- isHTMLElement(this.parentElement) &&
32
- this.parentElement.getAttribute("role") === "menuitem");
33
- };
79
+ this.hasSubmenu = false;
34
80
  /**
35
- * if focus is moving out of the menu, reset to a stable initial state
81
+ * Track current direction to pass to the anchored region
82
+ *
36
83
  * @internal
37
84
  */
38
- this.handleFocusOut = (e) => {
39
- if (!this.contains(e.relatedTarget) && this.menuItems !== undefined) {
40
- this.collapseExpandedItem();
41
- // find our first focusable element
42
- const focusIndex = this.menuItems.findIndex(this.isFocusableElement);
43
- // set the current focus index's tabindex to -1
44
- this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
45
- // set the first focusable element tabindex to 0
46
- this.menuItems[focusIndex].setAttribute("tabindex", "0");
47
- // set the focus index
48
- this.focusIndex = focusIndex;
85
+ this.currentDirection = Direction.ltr;
86
+ this.focusSubmenuOnLoad = false;
87
+ /**
88
+ * @internal
89
+ */
90
+ this.handleMenuItemKeyDown = (e) => {
91
+ if (e.defaultPrevented) {
92
+ return false;
49
93
  }
50
- };
51
- this.handleItemFocus = (e) => {
52
- const targetItem = e.target;
53
- if (this.menuItems !== undefined &&
54
- targetItem !== this.menuItems[this.focusIndex]) {
55
- this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
56
- this.focusIndex = this.menuItems.indexOf(targetItem);
57
- targetItem.setAttribute("tabindex", "0");
94
+ switch (e.key) {
95
+ case keyEnter:
96
+ case keySpace:
97
+ this.invoke();
98
+ return false;
99
+ case keyArrowRight:
100
+ //open/focus on submenu
101
+ this.expandAndFocus();
102
+ return false;
103
+ case keyArrowLeft:
104
+ //close submenu
105
+ if (this.expanded) {
106
+ this.expanded = false;
107
+ this.focus();
108
+ return false;
109
+ }
58
110
  }
111
+ return true;
59
112
  };
60
- this.handleExpandedChanged = (e) => {
61
- if (e.defaultPrevented ||
62
- e.target === null ||
63
- this.menuItems === undefined ||
64
- this.menuItems.indexOf(e.target) < 0) {
65
- return;
113
+ /**
114
+ * @internal
115
+ */
116
+ this.handleMenuItemClick = (e) => {
117
+ if (e.defaultPrevented || this.disabled) {
118
+ return false;
66
119
  }
67
- e.preventDefault();
68
- const changedItem = e.target;
69
- // closing an expanded item without opening another
70
- if (this.expandedItem !== null &&
71
- changedItem === this.expandedItem &&
72
- changedItem.expanded === false) {
73
- this.expandedItem = null;
120
+ this.invoke();
121
+ return false;
122
+ };
123
+ /**
124
+ * @internal
125
+ */
126
+ this.submenuLoaded = () => {
127
+ if (!this.focusSubmenuOnLoad) {
74
128
  return;
75
129
  }
76
- if (changedItem.expanded) {
77
- if (this.expandedItem !== null && this.expandedItem !== changedItem) {
78
- this.expandedItem.expanded = false;
79
- }
80
- this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
81
- this.expandedItem = changedItem;
82
- this.focusIndex = this.menuItems.indexOf(changedItem);
83
- changedItem.setAttribute("tabindex", "0");
130
+ this.focusSubmenuOnLoad = false;
131
+ if (this.hasSubmenu) {
132
+ this.submenu.focus();
133
+ this.setAttribute("tabindex", "-1");
84
134
  }
85
135
  };
86
- this.removeItemListeners = () => {
87
- if (this.menuItems !== undefined) {
88
- this.menuItems.forEach((item) => {
89
- item.removeEventListener("expanded-change", this.handleExpandedChanged);
90
- item.removeEventListener("focus", this.handleItemFocus);
91
- });
136
+ /**
137
+ * @internal
138
+ */
139
+ this.handleMouseOver = (e) => {
140
+ if (this.disabled || !this.hasSubmenu || this.expanded) {
141
+ return false;
92
142
  }
143
+ this.expanded = true;
144
+ return false;
93
145
  };
94
- this.setItems = () => {
95
- const newItems = this.domChildren();
96
- this.removeItemListeners();
97
- this.menuItems = newItems;
98
- const menuItems = this.menuItems.filter(this.isMenuItemElement);
99
- // if our focus index is not -1 we have items
100
- if (menuItems.length) {
101
- this.focusIndex = 0;
102
- }
103
- function elementIndent(el) {
104
- const role = el.getAttribute("role");
105
- const startSlot = el.querySelector("[slot=start]");
106
- if (role !== MenuItemRole.menuitem && startSlot === null) {
107
- return 1;
108
- }
109
- else if (role === MenuItemRole.menuitem && startSlot !== null) {
110
- return 1;
111
- }
112
- else if (role !== MenuItemRole.menuitem && startSlot !== null) {
113
- return 2;
114
- }
115
- else {
116
- return 0;
117
- }
146
+ /**
147
+ * @internal
148
+ */
149
+ this.handleMouseOut = (e) => {
150
+ if (!this.expanded || this.contains(document.activeElement)) {
151
+ return false;
118
152
  }
119
- const indent = menuItems.reduce((accum, current) => {
120
- const elementValue = elementIndent(current);
121
- return accum > elementValue ? accum : elementValue;
122
- }, 0);
123
- menuItems.forEach((item, index) => {
124
- item.setAttribute("tabindex", index === 0 ? "0" : "-1");
125
- item.addEventListener("expanded-change", this.handleExpandedChanged);
126
- item.addEventListener("focus", this.handleItemFocus);
127
- if (item instanceof MenuItem) {
128
- item.startColumnCount = indent;
129
- }
130
- });
153
+ this.expanded = false;
154
+ return false;
131
155
  };
132
156
  /**
133
- * handle change from child element
157
+ * @internal
134
158
  */
135
- this.changeHandler = (e) => {
136
- if (this.menuItems === undefined) {
159
+ this.expandAndFocus = () => {
160
+ if (!this.hasSubmenu) {
137
161
  return;
138
162
  }
139
- const changedMenuItem = e.target;
140
- const changeItemIndex = this.menuItems.indexOf(changedMenuItem);
141
- if (changeItemIndex === -1) {
163
+ this.focusSubmenuOnLoad = true;
164
+ this.expanded = true;
165
+ };
166
+ /**
167
+ * @internal
168
+ */
169
+ this.invoke = () => {
170
+ if (this.disabled) {
142
171
  return;
143
172
  }
144
- if (changedMenuItem.role === "menuitemradio" &&
145
- changedMenuItem.checked === true) {
146
- for (let i = changeItemIndex - 1; i >= 0; --i) {
147
- const item = this.menuItems[i];
148
- const role = item.getAttribute("role");
149
- if (role === MenuItemRole.menuitemradio) {
150
- item.checked = false;
151
- }
152
- if (role === "separator") {
153
- break;
173
+ switch (this.role) {
174
+ case MenuItemRole$1.menuitemcheckbox:
175
+ this.checked = !this.checked;
176
+ break;
177
+ case MenuItemRole$1.menuitem:
178
+ // update submenu
179
+ this.updateSubmenu();
180
+ if (this.hasSubmenu) {
181
+ this.expandAndFocus();
154
182
  }
155
- }
156
- const maxIndex = this.menuItems.length - 1;
157
- for (let i = changeItemIndex + 1; i <= maxIndex; ++i) {
158
- const item = this.menuItems[i];
159
- const role = item.getAttribute("role");
160
- if (role === MenuItemRole.menuitemradio) {
161
- item.checked = false;
183
+ else {
184
+ this.$emit("change");
162
185
  }
163
- if (role === "separator") {
164
- break;
186
+ break;
187
+ case MenuItemRole$1.menuitemradio:
188
+ if (!this.checked) {
189
+ this.checked = true;
165
190
  }
166
- }
191
+ break;
167
192
  }
168
193
  };
169
194
  /**
170
- * check if the item is a menu item
171
- */
172
- this.isMenuItemElement = (el) => {
173
- return (isHTMLElement(el) &&
174
- Menu$1.focusableElementRoles.hasOwnProperty(el.getAttribute("role")));
175
- };
176
- /**
177
- * check if the item is focusable
195
+ * Gets the submenu element if any
196
+ *
197
+ * @internal
178
198
  */
179
- this.isFocusableElement = (el) => {
180
- return this.isMenuItemElement(el);
199
+ this.updateSubmenu = () => {
200
+ this.submenu = this.domChildren().find((element) => {
201
+ return element.getAttribute("role") === "menu";
202
+ });
203
+ this.hasSubmenu = this.submenu === undefined ? false : true;
181
204
  };
182
205
  }
183
- itemsChanged(oldValue, newValue) {
184
- // only update children after the component is connected and
185
- // the setItems has run on connectedCallback
186
- // (menuItems is undefined until then)
187
- if (this.$fastController.isConnected && this.menuItems !== undefined) {
188
- this.setItems();
206
+ expandedChanged(oldValue) {
207
+ if (this.$fastController.isConnected) {
208
+ if (this.submenu === undefined) {
209
+ return;
210
+ }
211
+ if (this.expanded === false) {
212
+ this.submenu.collapseExpandedItem();
213
+ }
214
+ else {
215
+ this.currentDirection = getDirection(this);
216
+ }
217
+ this.$emit("expanded-change", this, { bubbles: false });
218
+ }
219
+ }
220
+ checkedChanged(oldValue, newValue) {
221
+ if (this.$fastController.isConnected) {
222
+ this.$emit("change");
189
223
  }
190
224
  }
191
225
  /**
@@ -194,67 +228,22 @@ class Menu$1 extends FoundationElement {
194
228
  connectedCallback() {
195
229
  super.connectedCallback();
196
230
  DOM.queueUpdate(() => {
197
- // wait until children have had a chance to
198
- // connect before setting/checking their props/attributes
199
- this.setItems();
231
+ this.updateSubmenu();
200
232
  });
201
- this.addEventListener("change", this.changeHandler);
233
+ if (!this.startColumnCount) {
234
+ this.startColumnCount = 1;
235
+ }
236
+ this.observer = new MutationObserver(this.updateSubmenu);
202
237
  }
203
238
  /**
204
239
  * @internal
205
240
  */
206
241
  disconnectedCallback() {
207
242
  super.disconnectedCallback();
208
- this.removeItemListeners();
209
- this.menuItems = undefined;
210
- this.removeEventListener("change", this.changeHandler);
211
- }
212
- /**
213
- * Focuses the first item in the menu.
214
- *
215
- * @public
216
- */
217
- focus() {
218
- this.setFocus(0, 1);
219
- }
220
- /**
221
- * Collapses any expanded menu items.
222
- *
223
- * @public
224
- */
225
- collapseExpandedItem() {
226
- if (this.expandedItem !== null) {
227
- this.expandedItem.expanded = false;
228
- this.expandedItem = null;
229
- }
230
- }
231
- /**
232
- * @internal
233
- */
234
- handleMenuKeyDown(e) {
235
- if (e.defaultPrevented || this.menuItems === undefined) {
236
- return;
237
- }
238
- switch (e.key) {
239
- case keyArrowDown:
240
- // go forward one index
241
- this.setFocus(this.focusIndex + 1, 1);
242
- return;
243
- case keyArrowUp:
244
- // go back one index
245
- this.setFocus(this.focusIndex - 1, -1);
246
- return;
247
- case keyEnd:
248
- // set focus on last item
249
- this.setFocus(this.menuItems.length - 1, -1);
250
- return;
251
- case keyHome:
252
- // set focus on first item
253
- this.setFocus(0, 1);
254
- return;
255
- default:
256
- // if we are not handling the event, do not prevent default
257
- return true;
243
+ this.submenu = undefined;
244
+ if (this.observer !== undefined) {
245
+ this.observer.disconnect();
246
+ this.observer = undefined;
258
247
  }
259
248
  }
260
249
  /**
@@ -263,118 +252,132 @@ class Menu$1 extends FoundationElement {
263
252
  domChildren() {
264
253
  return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
265
254
  }
266
- setFocus(focusIndex, adjustment) {
267
- if (this.menuItems === undefined) {
268
- return;
269
- }
270
- while (focusIndex >= 0 && focusIndex < this.menuItems.length) {
271
- const child = this.menuItems[focusIndex];
272
- if (this.isFocusableElement(child)) {
273
- // change the previous index to -1
274
- if (this.focusIndex > -1 &&
275
- this.menuItems.length >= this.focusIndex - 1) {
276
- this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
277
- }
278
- // update the focus index
279
- this.focusIndex = focusIndex;
280
- // update the tabindex of next focusable element
281
- child.setAttribute("tabindex", "0");
282
- // focus the element
283
- child.focus();
284
- break;
285
- }
286
- focusIndex += adjustment;
287
- }
288
- }
289
255
  }
290
- Menu$1.focusableElementRoles = roleForMenuItem;
256
+ __decorate([
257
+ attr({ mode: "boolean" })
258
+ ], MenuItem$1.prototype, "disabled", void 0);
259
+ __decorate([
260
+ attr({ mode: "boolean" })
261
+ ], MenuItem$1.prototype, "expanded", void 0);
291
262
  __decorate([
292
263
  observable
293
- ], Menu$1.prototype, "items", void 0);
264
+ ], MenuItem$1.prototype, "startColumnCount", void 0);
265
+ __decorate([
266
+ attr
267
+ ], MenuItem$1.prototype, "role", void 0);
268
+ __decorate([
269
+ attr({ mode: "boolean" })
270
+ ], MenuItem$1.prototype, "checked", void 0);
271
+ __decorate([
272
+ observable
273
+ ], MenuItem$1.prototype, "submenuRegion", void 0);
274
+ __decorate([
275
+ observable
276
+ ], MenuItem$1.prototype, "hasSubmenu", void 0);
277
+ __decorate([
278
+ observable
279
+ ], MenuItem$1.prototype, "currentDirection", void 0);
280
+ __decorate([
281
+ observable
282
+ ], MenuItem$1.prototype, "submenu", void 0);
283
+ applyMixins(MenuItem$1, StartEnd);
294
284
 
295
- var css_248z = ".base {\n max-block-size: var(--menu-block-size, 408px);\n max-inline-size: var(--menu-max-inline-size, 100%);\n min-inline-size: var(--menu-min-inline-size);\n overflow-x: hidden;\n overflow-y: auto;\n padding-block: 8px;\n}";
285
+ var css_248z = "/**\n * Do not edit directly\n * Generated on Tue, 25 Jul 2023 07:38:24 GMT\n */\n@supports selector(:focus-visible) {\n :host(:focus) {\n outline: none;\n }\n}\n.base {\n position: relative;\n display: flex;\n box-sizing: border-box;\n align-items: center;\n background-color: var(--_appearance-color-fill);\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n gap: 12px;\n inline-size: 100%;\n padding-block: 2px;\n padding-inline: 16px;\n}\n.base {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: transparent;\n}\n.base:where(:disabled, .disabled) {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base:where(:active, .active):where(:not(:disabled, .disabled)) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-soft);\n --_appearance-color-outline: transparent;\n}\n.base:where(.selected, [aria-current]):where(:not(:disabled, .disabled, :hover, .hover)) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-dim);\n --_appearance-color-outline: transparent;\n}\n.base:where(.selected, [aria-current]):where(:hover, .hover) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-pale);\n --_appearance-color-outline: transparent;\n}\n.base {\n /* @cssprop [--vvd-menu-item-accent-primary=var(--vvd-color-canvas-text)] */\n --_connotation-color-primary: var(--vvd-menu-item-accent-primary, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-menu-item-accent-primary-text=var(--vvd-color-canvas)] */\n --_connotation-color-primary-text: var(--vvd-menu-item-accent-primary-text, var(--vvd-color-canvas));\n /* @cssprop [--vvd-menu-item-accent-primary-increment=var(--vvd-color-neutral-800)] */\n --_connotation-color-primary-increment: var(--vvd-menu-item-accent-primary-increment, var(--vvd-color-neutral-800));\n /* @cssprop [--vvd-menu-item-accent-faint=var(--vvd-color-neutral-50)] */\n --_connotation-color-faint: var(--vvd-menu-item-accent-faint, var(--vvd-color-neutral-50));\n /* @cssprop [--vvd-menu-item-accent-soft=var(--vvd-color-neutral-100)] */\n --_connotation-color-soft: var(--vvd-menu-item-accent-soft, var(--vvd-color-neutral-100));\n /* @cssprop [--vvd-menu-item-accent-pale=var(--vvd-color-neutral-300)] */\n --_connotation-color-pale: var(--vvd-menu-item-accent-pale, var(--vvd-color-neutral-300));\n /* @cssprop [--vvd-menu-item-accent-dim=var(--vvd-color-neutral-200)] */\n --_connotation-color-dim: var(--vvd-menu-item-accent-dim, var(--vvd-color-neutral-200));\n}\n.base:not(.two-lines) {\n min-block-size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2)));\n}\n.base.two-lines {\n min-block-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2))) + calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) - 16)));\n}\n@supports (user-select: none) {\n .base {\n user-select: none;\n }\n}\n.base:not(.disabled) {\n cursor: pointer;\n}\n.base.disabled {\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.focus-indicator {\n border-radius: 6px;\n}\n:host(:not(:focus-visible)) .focus-indicator {\n display: none;\n}\n\n.icon {\n flex-shrink: 0;\n font-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2))) / 2);\n line-height: 1;\n}\n\n.action,\n.decorative {\n display: flex;\n place-content: center;\n}\n\n.action {\n color: var(--_appearance-color-text);\n}\n.base.trailing .action {\n order: 1;\n margin-inline-start: auto;\n}\n\n.base:not(.disabled) .decorative {\n color: var(--vvd-color-neutral-600);\n}\n.base.disabled .decorative {\n color: var(--vvd-color-neutral-200);\n}\n.base.has-meta .decorative {\n order: 1;\n margin-inline-start: auto;\n}\n\n.text {\n display: flex;\n overflow: hidden;\n flex-direction: column;\n}\n\n.text-primary,\n.text-secondary {\n /* stylelint-disable value-no-vendor-prefix */\n display: -webkit-box;\n /* stylelint-enable value-no-vendor-prefix */\n overflow: hidden;\n -webkit-box-orient: vertical;\n color: var(--_appearance-color-text);\n font: var(--vvd-typography-base);\n}\n\n.text-primary {\n -webkit-line-clamp: var(--text-primary-line-clamp, 1);\n}\n.base.two-lines .text-primary {\n font: var(--vvd-typography-base-bold);\n}\n\n.text-secondary {\n -webkit-line-clamp: var(--text-secondary-line-clamp, 1);\n}\n.base.two-lines .text-secondary {\n color: var(--vvd-color-neutral-600);\n}";
296
286
 
297
- var _Menu_dismissOnClickOutside;
298
- class Menu extends Menu$1 {
299
- constructor() {
300
- super(...arguments);
301
- _Menu_dismissOnClickOutside.set(this, e => {
302
- const popup = this._popup;
303
- if (popup.open && !this.contains(e.target)) {
304
- popup.open = false;
305
- }
306
- });
307
- this.open = false;
308
- this.autoDismiss = false;
309
- this.popupOpenChanged = () => {
310
- this.open = this._popup.open;
311
- };
312
- }
313
- anchorChanged(prevAnchor, newAnchor) {
314
- const prevAnchorEl = document.getElementById(prevAnchor);
315
- const newAnchorEl = document.getElementById(newAnchor);
316
- prevAnchorEl === null || prevAnchorEl === void 0 ? void 0 : prevAnchorEl.removeAttribute('aria-haspopup');
317
- newAnchorEl === null || newAnchorEl === void 0 ? void 0 : newAnchorEl.setAttribute('aria-haspopup', 'menu');
318
- }
319
- autoDismissChanged() {
320
- if (this.autoDismiss) {
321
- document.addEventListener('click', __classPrivateFieldGet(this, _Menu_dismissOnClickOutside, "f"));
322
- } else {
323
- document.removeEventListener('click', __classPrivateFieldGet(this, _Menu_dismissOnClickOutside, "f"));
324
- }
325
- }
326
- disconnectedCallback() {
327
- super.disconnectedCallback();
328
- if (this.autoDismiss) {
329
- document.removeEventListener('click', __classPrivateFieldGet(this, _Menu_dismissOnClickOutside, "f"));
330
- }
331
- }
332
- }
333
- _Menu_dismissOnClickOutside = new WeakMap();
334
- __decorate([attr({
335
- mode: 'boolean'
336
- }), __metadata("design:type", Object)], Menu.prototype, "open", void 0);
337
- __decorate([attr, __metadata("design:type", String)], Menu.prototype, "placement", void 0);
338
- __decorate([attr, __metadata("design:type", String)], Menu.prototype, "anchor", void 0);
287
+ const MenuItemRole = Object.assign(Object.assign({}, MenuItemRole$1), {
288
+ 'presentation': 'presentation'
289
+ });
290
+ class MenuItem extends MenuItem$1 {}
291
+ __decorate([attr, __metadata("design:type", String)], MenuItem.prototype, "text", void 0);
339
292
  __decorate([attr({
340
- mode: 'boolean',
341
- attribute: 'auto-dismiss'
342
- }), __metadata("design:type", Object)], Menu.prototype, "autoDismiss", void 0);
293
+ attribute: 'text-secondary'
294
+ }), __metadata("design:type", String)], MenuItem.prototype, "textSecondary", void 0);
295
+ __decorate([observable, __metadata("design:type", Array)], MenuItem.prototype, "metaSlottedContent", void 0);
296
+ applyMixins(MenuItem, AffixIcon);
343
297
 
344
298
  let _ = t => t,
345
- _t;
346
- const MenuTemplate = context => {
347
- const popupTag = context.tagFor(Popup);
299
+ _t,
300
+ _t2,
301
+ _t3,
302
+ _t4,
303
+ _t5,
304
+ _t6,
305
+ _t7,
306
+ _t8,
307
+ _t9;
308
+ const getCheckIcon = (affixIconTemplate, x, iconType) => {
309
+ const iconStatus = x.checked ? 'checked' : 'unchecked';
310
+ const icon = `${iconType}-${iconStatus}-line`;
311
+ return affixIconTemplate(icon);
312
+ };
313
+ const getClasses = ({
314
+ disabled,
315
+ checked,
316
+ expanded,
317
+ role,
318
+ text,
319
+ textSecondary,
320
+ icon,
321
+ metaSlottedContent
322
+ }) => classNames('base', ['disabled', Boolean(disabled)], ['selected', role !== MenuItemRole.menuitem && Boolean(checked)], ['trailing', role !== MenuItemRole.menuitem && Boolean(icon)], ['expanded', Boolean(expanded)], ['item-checkbox', role === MenuItemRole.menuitemcheckbox], ['item-radio', role === MenuItemRole.menuitemradio], ['two-lines', Boolean(text === null || text === void 0 ? void 0 : text.length) && Boolean(textSecondary === null || textSecondary === void 0 ? void 0 : textSecondary.length)], ['has-meta', Boolean(metaSlottedContent === null || metaSlottedContent === void 0 ? void 0 : metaSlottedContent.length)]);
323
+ function handleClick(x, {
324
+ event
325
+ }) {
326
+ x.handleMenuItemClick(event);
327
+ return x.role === MenuItemRole.presentation;
328
+ }
329
+ const MenuItemTemplate = (context, definition) => {
330
+ const affixIconTemplate = affixIconTemplateFactory(context);
331
+ const focusTemplate = focusTemplateFactory(context);
348
332
  return html(_t || (_t = _`
349
- <template
350
- slot="${0}"
351
- >
352
- <${0}
353
- :placement=${0}
354
- :open=${0}
355
- :anchor=${0}
356
- @vwc-popup:open="${0}"
357
- @vwc-popup:close="${0}"
333
+ <template
334
+ aria-checked="${0}"
335
+ aria-disabled="${0}"
336
+ aria-expanded="${0}"
337
+ @keydown="${0}"
338
+ @click="${0}"
339
+ @mouseover="${0}"
340
+ @mouseout="${0}"
341
+ >
342
+ <div class="${0}">
343
+
344
+ ${0}
345
+ ${0}
346
+ ${0}
347
+ ${0}
348
+
349
+ ${0}
350
+
351
+ ${0}
352
+
353
+ ${0}
354
+
355
+
356
+
357
+ </div>
358
+ </template>
359
+ `), x => x.role !== MenuItemRole.menuitem ? x.checked : void 0, x => x.disabled, x => x.expanded, (x, c) => x.handleMenuItemKeyDown(c.event), handleClick, (x, c) => x.handleMouseOver(c.event), (x, c) => x.handleMouseOut(c.event), getClasses, when(x => x.hasSubmenu, html(_t2 || (_t2 = _`
360
+ <div
361
+ class="expand-collapse-glyph-container"
362
+ >
363
+ <span class="expand-collapse">
364
+ <slot name="expand-collapse-indicator">
365
+ ${0}
366
+ </slot>
367
+ </span>
368
+ </div>
369
+ `), definition.expandCollapseGlyph || '')), () => focusTemplate, when(x => x.role !== MenuItemRole.menuitemcheckbox && x.role !== MenuItemRole.menuitemradio, html(_t3 || (_t3 = _`<slot name="meta" ${0}></slot>`), slotted('metaSlottedContent'))), when(x => x.role === MenuItemRole.menuitemcheckbox, html(_t4 || (_t4 = _`<span class="action">${0}</span>`), x => getCheckIcon(affixIconTemplate, x, 'checkbox'))), when(x => x.role === MenuItemRole.menuitemradio, html(_t5 || (_t5 = _`<span class="action">${0}</span>`), x => getCheckIcon(affixIconTemplate, x, 'radio'))), when(x => x.icon, html(_t6 || (_t6 = _`<span class="decorative">${0}</span>`), x => affixIconTemplate(x.icon))), when(x => x.text || x.textSecondary, html(_t7 || (_t7 = _`<span class="text">
370
+ ${0}
358
371
  ${0}
359
- >
360
- <div
361
- class="base"
362
- role="menu"
363
- @keydown="${0}"
364
- @focusout="${0}"
365
- >
366
- <slot ${0}></slot>
367
- </div>
368
- </${0}>
369
- </template>`), x => x.slot || x.isNestedMenu() ? 'submenu' : void 0, popupTag, x => x.placement, x => x.open, x => x.anchor, x => x.popupOpenChanged(), x => x.popupOpenChanged(), ref('_popup'), (x, c) => x.handleMenuKeyDown(c.event), (x, c) => x.handleFocusOut(c.event), slotted('items'), popupTag);
372
+ </span>`), when(x => x.text, html(_t8 || (_t8 = _`<span class="text-primary">${0}</span>`), x => x.text)), when(x => x.textSecondary, html(_t9 || (_t9 = _`<span class="text-secondary">${0}</span>`), x => x.textSecondary)))));
370
373
  };
371
374
 
372
- const menuDefinition = Menu.compose({
373
- baseName: 'menu',
374
- template: MenuTemplate,
375
+ const menuItemDefinition = MenuItem.compose({
376
+ baseName: 'menu-item',
377
+ template: MenuItemTemplate,
375
378
  styles: css_248z
376
379
  });
377
- const menuRegistries = [menuDefinition(), ...popupRegistries, ...menuItemRegistries];
378
- const registerMenu = registerFactory(menuRegistries);
380
+ const menuItemRegistries = [menuItemDefinition(), ...iconRegistries, ...focusRegistries];
381
+ const registerMenuItem = registerFactory(menuItemRegistries);
379
382
 
380
- export { menuRegistries as a, menuDefinition as m, registerMenu as r };
383
+ export { MenuItem$1 as M, MenuItemRole$1 as a, registerMenuItem as b, menuItemDefinition as c, menuItemRegistries as m, roleForMenuItem as r };