@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.
- package/accordion/index.js +0 -1
- package/accordion-item/index.js +0 -1
- package/alert/index.js +0 -1
- package/avatar/index.js +0 -1
- package/badge/index.js +0 -1
- package/banner/index.js +0 -1
- package/breadcrumb-item/index.js +0 -1
- package/button/index.js +0 -1
- package/card/index.js +0 -1
- package/checkbox/index.js +0 -1
- package/combobox/index.js +0 -1
- package/custom-elements.json +82 -10
- package/data-grid/index.js +7 -2
- package/dialog/index.js +0 -1
- package/empty-state/index.js +0 -1
- package/fab/index.js +0 -1
- package/icon/index.js +0 -1
- package/index.js +27 -29
- package/lib/action-group/action-group.d.ts +1 -1
- package/lib/avatar/avatar.d.ts +1 -1
- package/lib/checkbox/checkbox.d.ts +0 -1
- package/lib/components.d.ts +0 -2
- package/lib/data-grid/data-grid-cell.d.ts +14 -1
- package/lib/data-grid/data-grid.d.ts +4 -0
- package/lib/data-grid/data-grid.options.d.ts +7 -0
- package/lib/dialog/dialog.d.ts +1 -0
- package/lib/listbox/listbox.d.ts +1 -1
- package/lib/menu/menu.d.ts +0 -1
- package/lib/menu-item/menu-item.d.ts +6 -0
- package/lib/menu-item/menu-item.template.d.ts +2 -3
- package/lib/number-field/number-field.d.ts +1 -1
- package/lib/select/select.d.ts +1 -1
- package/lib/text-field/text-field.d.ts +1 -1
- package/listbox/index.js +56 -11
- package/menu/index.js +2 -3
- package/menu-item/index.js +2 -2
- package/nav/index.js +1 -1
- package/nav-disclosure/index.js +1 -2
- package/nav-item/index.js +1 -2
- package/note/index.js +1 -2
- package/number-field/index.js +1 -2
- package/option/index.js +0 -1
- package/package.json +1 -1
- package/pagination/index.js +1 -2
- package/popup/index.js +0 -1
- package/progress/index.js +1 -1
- package/radio/index.js +1 -1
- package/radio-group/index.js +1 -1
- package/select/index.js +1 -2
- package/shared/definition.js +1 -1
- package/shared/definition10.js +1 -1
- package/shared/definition11.js +1 -1
- package/shared/definition12.js +1 -1
- package/shared/definition14.js +1 -1
- package/shared/definition15.js +1 -1
- package/shared/definition16.js +2 -2
- package/shared/definition17.js +1 -1
- package/shared/definition18.js +1 -1
- package/shared/definition19.js +1 -1
- package/shared/definition2.js +1 -1
- package/shared/definition21.js +1 -1
- package/shared/definition22.js +76 -21
- package/shared/definition23.js +5 -4
- package/shared/definition24.js +1 -1
- package/shared/definition25.js +1 -1
- package/shared/definition26.js +1 -1
- package/shared/definition27.js +1 -1
- package/shared/definition29.js +368 -48
- package/shared/definition30.js +301 -298
- package/shared/definition31.js +14 -366
- package/shared/definition32.js +70 -13
- package/shared/definition33.js +25 -64
- package/shared/definition34.js +39 -27
- package/shared/definition35.js +431 -31
- package/shared/definition36.js +214 -430
- package/shared/definition37.js +70 -209
- package/shared/definition38.js +33 -81
- package/shared/definition39.js +423 -32
- package/shared/definition4.js +1 -1
- package/shared/definition40.js +586 -358
- package/shared/definition41.js +73 -648
- package/shared/definition42.js +584 -70
- package/shared/definition43.js +81 -538
- package/shared/definition44.js +52 -127
- package/shared/definition45.js +16 -56
- package/shared/definition46.js +485 -17
- package/shared/definition47.js +99 -477
- package/shared/definition48.js +19 -114
- package/shared/definition49.js +276 -19
- package/shared/definition5.js +1 -1
- package/shared/definition50.js +89 -245
- package/shared/definition51.js +629 -109
- package/shared/definition52.js +86 -601
- package/shared/definition53.js +68 -112
- package/shared/definition54.js +294 -69
- package/shared/definition6.js +1 -1
- package/shared/definition7.js +1 -1
- package/shared/definition8.js +2 -2
- package/shared/definition9.js +1 -1
- package/shared/es.object.assign.js +1 -1
- package/shared/es.regexp.to-string.js +1 -1
- package/shared/es.string.includes.js +1 -1
- package/shared/form-elements.js +1 -1
- package/shared/icon.js +17 -13
- package/shared/index.js +1 -1
- package/shared/patterns/form-elements/form-elements.d.ts +4 -4
- package/shared/string-trim.js +1 -1
- package/shared/text-field.js +1 -1
- package/shared/to-string.js +1 -1
- package/side-drawer/index.js +1 -1
- package/slider/index.js +1 -1
- package/styles/core/all.css +1 -1
- package/styles/core/theme.css +1 -1
- package/styles/core/typography.css +1 -1
- package/styles/tokens/theme-dark.css +4 -4
- package/styles/tokens/theme-light.css +4 -4
- package/switch/index.js +1 -2
- package/tab/index.js +1 -2
- package/tab-panel/index.js +1 -1
- package/tabs/index.js +3 -4
- package/tag/index.js +1 -2
- package/tag-group/index.js +1 -1
- package/text-anchor/index.js +0 -1
- package/text-area/index.js +1 -2
- package/text-field/index.js +3 -2
- package/toggletip/index.js +1 -2
- package/tooltip/index.js +1 -2
- package/tree-item/index.js +1 -2
- package/tree-view/index.js +1 -1
- package/vivid.api.json +19 -210
- package/shared/definition55.js +0 -305
- package/shared/engine-is-node.js +0 -8
package/shared/definition30.js
CHANGED
|
@@ -1,191 +1,225 @@
|
|
|
1
|
-
import { F as FoundationElement, Y as DOM, _ as __decorate,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
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 {
|
|
13
|
+
import { c as classNames } from './class-names.js';
|
|
8
14
|
|
|
9
15
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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
|
|
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
|
|
65
|
+
class MenuItem$1 extends FoundationElement {
|
|
18
66
|
constructor() {
|
|
19
67
|
super(...arguments);
|
|
20
|
-
this.expandedItem = null;
|
|
21
68
|
/**
|
|
22
|
-
* The
|
|
23
|
-
*
|
|
69
|
+
* The role of the element.
|
|
70
|
+
*
|
|
71
|
+
* @public
|
|
72
|
+
* @remarks
|
|
73
|
+
* HTML Attribute: role
|
|
24
74
|
*/
|
|
25
|
-
this.
|
|
75
|
+
this.role = MenuItemRole$1.menuitem;
|
|
26
76
|
/**
|
|
27
77
|
* @internal
|
|
28
78
|
*/
|
|
29
|
-
this.
|
|
30
|
-
return (this.parentElement !== null &&
|
|
31
|
-
isHTMLElement(this.parentElement) &&
|
|
32
|
-
this.parentElement.getAttribute("role") === "menuitem");
|
|
33
|
-
};
|
|
79
|
+
this.hasSubmenu = false;
|
|
34
80
|
/**
|
|
35
|
-
*
|
|
81
|
+
* Track current direction to pass to the anchored region
|
|
82
|
+
*
|
|
36
83
|
* @internal
|
|
37
84
|
*/
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return;
|
|
113
|
+
/**
|
|
114
|
+
* @internal
|
|
115
|
+
*/
|
|
116
|
+
this.handleMenuItemClick = (e) => {
|
|
117
|
+
if (e.defaultPrevented || this.disabled) {
|
|
118
|
+
return false;
|
|
66
119
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
120
|
+
this.invoke();
|
|
121
|
+
return false;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
this.submenuLoaded = () => {
|
|
127
|
+
if (!this.focusSubmenuOnLoad) {
|
|
74
128
|
return;
|
|
75
129
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
*
|
|
157
|
+
* @internal
|
|
134
158
|
*/
|
|
135
|
-
this.
|
|
136
|
-
if (this.
|
|
159
|
+
this.expandAndFocus = () => {
|
|
160
|
+
if (!this.hasSubmenu) {
|
|
137
161
|
return;
|
|
138
162
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
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
|
-
*
|
|
171
|
-
|
|
172
|
-
|
|
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.
|
|
180
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
this.
|
|
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
|
-
|
|
198
|
-
// connect before setting/checking their props/attributes
|
|
199
|
-
this.setItems();
|
|
231
|
+
this.updateSubmenu();
|
|
200
232
|
});
|
|
201
|
-
|
|
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.
|
|
209
|
-
this.
|
|
210
|
-
|
|
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
|
-
|
|
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
|
-
],
|
|
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
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
347
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
|
373
|
-
baseName: 'menu',
|
|
374
|
-
template:
|
|
375
|
+
const menuItemDefinition = MenuItem.compose({
|
|
376
|
+
baseName: 'menu-item',
|
|
377
|
+
template: MenuItemTemplate,
|
|
375
378
|
styles: css_248z
|
|
376
379
|
});
|
|
377
|
-
const
|
|
378
|
-
const
|
|
380
|
+
const menuItemRegistries = [menuItemDefinition(), ...iconRegistries, ...focusRegistries];
|
|
381
|
+
const registerMenuItem = registerFactory(menuItemRegistries);
|
|
379
382
|
|
|
380
|
-
export {
|
|
383
|
+
export { MenuItem$1 as M, MenuItemRole$1 as a, registerMenuItem as b, menuItemDefinition as c, menuItemRegistries as m, roleForMenuItem as r };
|