@spectrum-web-components/menu 0.33.1-overlay.41 → 0.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +222 -475
- package/package.json +9 -9
- package/src/Menu.d.ts +7 -16
- package/src/Menu.dev.js +65 -160
- package/src/Menu.dev.js.map +2 -2
- package/src/Menu.js +3 -7
- package/src/Menu.js.map +3 -3
- package/src/MenuGroup.d.ts +2 -0
- package/src/MenuGroup.dev.js +10 -6
- package/src/MenuGroup.dev.js.map +2 -2
- package/src/MenuGroup.js +5 -3
- package/src/MenuGroup.js.map +3 -3
- package/src/MenuItem.d.ts +22 -24
- package/src/MenuItem.dev.js +170 -131
- package/src/MenuItem.dev.js.map +3 -3
- package/src/MenuItem.js +15 -35
- package/src/MenuItem.js.map +3 -3
- package/src/menu-item.css.dev.js +1 -1
- package/src/menu-item.css.dev.js.map +1 -1
- package/src/menu-item.css.js +1 -1
- package/src/menu-item.css.js.map +1 -1
- package/src/menu.css.dev.js +1 -1
- package/src/menu.css.dev.js.map +1 -1
- package/src/menu.css.js +1 -1
- package/src/menu.css.js.map +1 -1
- package/stories/submenu.stories.js +21 -28
- package/stories/submenu.stories.js.map +3 -3
- package/test/menu-group.test.js +1 -14
- package/test/menu-group.test.js.map +2 -2
- package/test/menu-selects.test.js +1 -3
- package/test/menu-selects.test.js.map +2 -2
- package/test/menu.test.js +0 -7
- package/test/menu.test.js.map +2 -2
- package/test/submenu.test.js +83 -198
- package/test/submenu.test.js.map +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/menu",
|
|
3
|
-
"version": "0.33.1
|
|
3
|
+
"version": "0.33.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -85,13 +85,13 @@
|
|
|
85
85
|
],
|
|
86
86
|
"dependencies": {
|
|
87
87
|
"@lit-labs/observers": "^2.0.0",
|
|
88
|
-
"@spectrum-web-components/action-button": "^0.33.
|
|
89
|
-
"@spectrum-web-components/base": "^0.33.
|
|
90
|
-
"@spectrum-web-components/divider": "^0.33.
|
|
91
|
-
"@spectrum-web-components/icon": "^0.33.
|
|
92
|
-
"@spectrum-web-components/icons-ui": "^0.33.
|
|
93
|
-
"@spectrum-web-components/overlay": "^0.33.
|
|
94
|
-
"@spectrum-web-components/shared": "^0.33.
|
|
88
|
+
"@spectrum-web-components/action-button": "^0.33.0",
|
|
89
|
+
"@spectrum-web-components/base": "^0.33.0",
|
|
90
|
+
"@spectrum-web-components/divider": "^0.33.0",
|
|
91
|
+
"@spectrum-web-components/icon": "^0.33.0",
|
|
92
|
+
"@spectrum-web-components/icons-ui": "^0.33.0",
|
|
93
|
+
"@spectrum-web-components/overlay": "^0.33.0",
|
|
94
|
+
"@spectrum-web-components/shared": "^0.33.0"
|
|
95
95
|
},
|
|
96
96
|
"devDependencies": {
|
|
97
97
|
"@spectrum-css/menu": "^4.0.34"
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
"./sp-*.js",
|
|
103
103
|
"./**/*.dev.js"
|
|
104
104
|
],
|
|
105
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "641a47a495d6782567e6733aa6102bca0dee4e93"
|
|
106
106
|
}
|
package/src/Menu.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export interface MenuChildItem {
|
|
|
22
22
|
*/
|
|
23
23
|
export declare class Menu extends SpectrumElement {
|
|
24
24
|
static get styles(): CSSResultArray;
|
|
25
|
-
|
|
25
|
+
isSubmenu: boolean;
|
|
26
26
|
label: string;
|
|
27
27
|
ignore: boolean;
|
|
28
28
|
selects: undefined | 'inherit' | 'single' | 'multiple';
|
|
@@ -51,7 +51,7 @@ export declare class Menu extends SpectrumElement {
|
|
|
51
51
|
private resolvedRole?;
|
|
52
52
|
/**
|
|
53
53
|
* When a descendant `<sp-menu-item>` element is added or updated it will dispatch
|
|
54
|
-
* this event to announce its presence in the DOM. During the
|
|
54
|
+
* this event to announce its presence in the DOM. During the capture phase the first
|
|
55
55
|
* Menu based element that the event encounters will manage the focus state of the
|
|
56
56
|
* dispatching `<sp-menu-item>` element.
|
|
57
57
|
* @param event
|
|
@@ -59,7 +59,7 @@ export declare class Menu extends SpectrumElement {
|
|
|
59
59
|
private onFocusableItemAddedOrUpdated;
|
|
60
60
|
/**
|
|
61
61
|
* When a descendant `<sp-menu-item>` element is added or updated it will dispatch
|
|
62
|
-
* this event to announce its presence in the DOM. During the
|
|
62
|
+
* this event to announce its presence in the DOM. During the bubble phase the first
|
|
63
63
|
* Menu based element that the event encounters that does not inherit selection will
|
|
64
64
|
* manage the selection state of the dispatching `<sp-menu-item>` element.
|
|
65
65
|
* @param event
|
|
@@ -69,39 +69,30 @@ export declare class Menu extends SpectrumElement {
|
|
|
69
69
|
private removeChildItem;
|
|
70
70
|
constructor();
|
|
71
71
|
focus({ preventScroll }?: FocusOptions): void;
|
|
72
|
-
private
|
|
72
|
+
private onClick;
|
|
73
73
|
handleFocusin(event: FocusEvent): void;
|
|
74
74
|
startListeningToKeyboard(): void;
|
|
75
75
|
handleFocusout(event: FocusEvent): void;
|
|
76
76
|
stopListeningToKeyboard(): void;
|
|
77
|
-
private descendentOverlays;
|
|
78
|
-
protected handleDescendentOverlayOpened(event: Event): void;
|
|
79
|
-
protected handleDescendentOverlayClosed(event: Event): void;
|
|
80
|
-
handleSubmenuClosed: (event: Event) => void;
|
|
81
|
-
handleSubmenuOpened: (event: Event) => void;
|
|
82
77
|
selectOrToggleItem(targetItem: MenuItem): Promise<void>;
|
|
83
78
|
protected navigateWithinMenu(event: KeyboardEvent): void;
|
|
84
|
-
protected navigateBetweenRelatedMenus(
|
|
79
|
+
protected navigateBetweenRelatedMenus(code: string): void;
|
|
85
80
|
handleKeydown(event: KeyboardEvent): void;
|
|
86
81
|
focusMenuItemByOffset(offset: number): MenuItem;
|
|
87
82
|
private prepareToCleanUp;
|
|
88
|
-
private _hasUpdatedSelectedItemIndex;
|
|
89
83
|
updateSelectedItemIndex(): void;
|
|
90
84
|
private _willUpdateItems;
|
|
91
85
|
private handleItemsChanged;
|
|
92
|
-
private updateCache;
|
|
93
86
|
private updateItemFocus;
|
|
94
|
-
closeDescendentOverlays(): void;
|
|
95
87
|
private forwardFocusVisibleToItem;
|
|
96
|
-
private handleSlotchange;
|
|
97
|
-
protected renderMenuItemSlot(): TemplateResult;
|
|
98
88
|
render(): TemplateResult;
|
|
89
|
+
private _notFirstUpdated;
|
|
99
90
|
protected firstUpdated(changed: PropertyValues): void;
|
|
100
91
|
protected updated(changes: PropertyValues<this>): void;
|
|
101
92
|
protected selectsChanged(): void;
|
|
102
93
|
connectedCallback(): void;
|
|
94
|
+
disconnectedCallback(): void;
|
|
103
95
|
protected childItemsUpdated: Promise<unknown[]>;
|
|
104
96
|
protected cacheUpdated: Promise<void>;
|
|
105
|
-
protected resolveCacheUpdated: () => void;
|
|
106
97
|
protected getUpdateComplete(): Promise<boolean>;
|
|
107
98
|
}
|
package/src/Menu.dev.js
CHANGED
|
@@ -26,6 +26,7 @@ function elementIsOrContains(el, isOrContains) {
|
|
|
26
26
|
export class Menu extends SpectrumElement {
|
|
27
27
|
constructor() {
|
|
28
28
|
super();
|
|
29
|
+
this.isSubmenu = false;
|
|
29
30
|
this.label = "";
|
|
30
31
|
this.ignore = false;
|
|
31
32
|
this.value = "";
|
|
@@ -36,43 +37,9 @@ export class Menu extends SpectrumElement {
|
|
|
36
37
|
this.focusedItemIndex = 0;
|
|
37
38
|
this.focusInItemIndex = 0;
|
|
38
39
|
this.selectedItemsMap = /* @__PURE__ */ new Map();
|
|
39
|
-
this.descendentOverlays = /* @__PURE__ */ new Map();
|
|
40
|
-
this.handleSubmenuClosed = (event) => {
|
|
41
|
-
event.stopPropagation();
|
|
42
|
-
const target = event.composedPath()[0];
|
|
43
|
-
target.dispatchEvent(
|
|
44
|
-
new Event("sp-menu-submenu-closed", {
|
|
45
|
-
bubbles: true,
|
|
46
|
-
composed: true
|
|
47
|
-
})
|
|
48
|
-
);
|
|
49
|
-
};
|
|
50
|
-
this.handleSubmenuOpened = (event) => {
|
|
51
|
-
event.stopPropagation();
|
|
52
|
-
const target = event.composedPath()[0];
|
|
53
|
-
target.dispatchEvent(
|
|
54
|
-
new Event("sp-menu-submenu-opened", {
|
|
55
|
-
bubbles: true,
|
|
56
|
-
composed: true
|
|
57
|
-
})
|
|
58
|
-
);
|
|
59
|
-
const focusedItem = this.childItems[this.focusedItemIndex];
|
|
60
|
-
if (focusedItem) {
|
|
61
|
-
focusedItem.focused = false;
|
|
62
|
-
}
|
|
63
|
-
const openedItem = event.composedPath().find((el) => this.childItemSet.has(el));
|
|
64
|
-
if (!openedItem)
|
|
65
|
-
return;
|
|
66
|
-
const openedItemIndex = this.childItems.indexOf(openedItem);
|
|
67
|
-
this.focusedItemIndex = openedItemIndex;
|
|
68
|
-
this.focusInItemIndex = openedItemIndex;
|
|
69
|
-
};
|
|
70
|
-
this._hasUpdatedSelectedItemIndex = false;
|
|
71
40
|
this._willUpdateItems = false;
|
|
41
|
+
this._notFirstUpdated = false;
|
|
72
42
|
this.cacheUpdated = Promise.resolve();
|
|
73
|
-
this.resolveCacheUpdated = () => {
|
|
74
|
-
return;
|
|
75
|
-
};
|
|
76
43
|
this.addEventListener(
|
|
77
44
|
"sp-menu-item-added-or-updated",
|
|
78
45
|
this.onSelectableItemAddedOrUpdated
|
|
@@ -84,18 +51,13 @@ export class Menu extends SpectrumElement {
|
|
|
84
51
|
capture: true
|
|
85
52
|
}
|
|
86
53
|
);
|
|
87
|
-
this.addEventListener("
|
|
54
|
+
this.addEventListener("sp-menu-item-removed", this.removeChildItem);
|
|
55
|
+
this.addEventListener("click", this.onClick);
|
|
88
56
|
this.addEventListener("focusin", this.handleFocusin);
|
|
89
|
-
this.addEventListener("focusout", this.handleFocusout);
|
|
90
|
-
this.addEventListener("sp-opened", this.handleSubmenuOpened);
|
|
91
|
-
this.addEventListener("sp-closed", this.handleSubmenuClosed);
|
|
92
57
|
}
|
|
93
58
|
static get styles() {
|
|
94
59
|
return [menuStyles];
|
|
95
60
|
}
|
|
96
|
-
get isSubmenu() {
|
|
97
|
-
return this.slot === "submenu";
|
|
98
|
-
}
|
|
99
61
|
get childItems() {
|
|
100
62
|
if (!this.cachedChildItems) {
|
|
101
63
|
this.cachedChildItems = this.updateCachedMenuItems();
|
|
@@ -140,37 +102,17 @@ export class Menu extends SpectrumElement {
|
|
|
140
102
|
}
|
|
141
103
|
/**
|
|
142
104
|
* When a descendant `<sp-menu-item>` element is added or updated it will dispatch
|
|
143
|
-
* this event to announce its presence in the DOM. During the
|
|
105
|
+
* this event to announce its presence in the DOM. During the capture phase the first
|
|
144
106
|
* Menu based element that the event encounters will manage the focus state of the
|
|
145
107
|
* dispatching `<sp-menu-item>` element.
|
|
146
108
|
* @param event
|
|
147
109
|
*/
|
|
148
110
|
onFocusableItemAddedOrUpdated(event) {
|
|
149
|
-
event.menuCascade.set(this, {
|
|
150
|
-
hadFocusRoot: !!event.item.menuData.focusRoot,
|
|
151
|
-
ancestorWithSelects: event.currentAncestorWithSelects
|
|
152
|
-
});
|
|
153
|
-
if (this.selects) {
|
|
154
|
-
event.currentAncestorWithSelects = this;
|
|
155
|
-
}
|
|
156
|
-
event.item.menuData.focusRoot = event.item.menuData.focusRoot || this;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* When a descendant `<sp-menu-item>` element is added or updated it will dispatch
|
|
160
|
-
* this event to announce its presence in the DOM. During the BUBBLE phase the first
|
|
161
|
-
* Menu based element that the event encounters that does not inherit selection will
|
|
162
|
-
* manage the selection state of the dispatching `<sp-menu-item>` element.
|
|
163
|
-
* @param event
|
|
164
|
-
*/
|
|
165
|
-
onSelectableItemAddedOrUpdated(event) {
|
|
166
111
|
var _a, _b;
|
|
167
|
-
|
|
168
|
-
if (!cascadeData)
|
|
169
|
-
return;
|
|
170
|
-
event.item.menuData.parentMenu = event.item.menuData.parentMenu || this;
|
|
171
|
-
if (cascadeData.hadFocusRoot && !this.ignore) {
|
|
112
|
+
if (event.item.menuData.focusRoot && !this.ignore) {
|
|
172
113
|
this.tabIndex = -1;
|
|
173
114
|
}
|
|
115
|
+
event.focusRoot = this;
|
|
174
116
|
this.addChildItem(event.item);
|
|
175
117
|
if (this.selects === "inherit") {
|
|
176
118
|
this.resolvedSelects = "inherit";
|
|
@@ -179,33 +121,34 @@ export class Menu extends SpectrumElement {
|
|
|
179
121
|
} else if (this.selects) {
|
|
180
122
|
this.resolvedRole = this.ignore ? "none" : this.getAttribute("role") || void 0;
|
|
181
123
|
this.resolvedSelects = this.selects;
|
|
124
|
+
event.currentAncestorWithSelects = this;
|
|
182
125
|
} else {
|
|
183
126
|
this.resolvedRole = this.ignore ? "none" : this.getAttribute("role") || void 0;
|
|
184
127
|
this.resolvedSelects = this.resolvedRole === "none" ? "ignore" : "none";
|
|
185
128
|
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* When a descendant `<sp-menu-item>` element is added or updated it will dispatch
|
|
132
|
+
* this event to announce its presence in the DOM. During the bubble phase the first
|
|
133
|
+
* Menu based element that the event encounters that does not inherit selection will
|
|
134
|
+
* manage the selection state of the dispatching `<sp-menu-item>` element.
|
|
135
|
+
* @param event
|
|
136
|
+
*/
|
|
137
|
+
onSelectableItemAddedOrUpdated(event) {
|
|
186
138
|
const selects = this.resolvedSelects === "single" || this.resolvedSelects === "multiple";
|
|
187
|
-
event.item.menuData.cleanupSteps.push(
|
|
188
|
-
(item) => this.removeChildItem(item)
|
|
189
|
-
);
|
|
190
139
|
if ((selects || !this.selects && this.resolvedSelects !== "ignore") && !event.item.menuData.selectionRoot) {
|
|
191
140
|
event.item.setRole(this.childRole);
|
|
192
|
-
event.
|
|
193
|
-
if (event.item.selected) {
|
|
194
|
-
this.selectedItemsMap.set(event.item, true);
|
|
195
|
-
this.selectedItems = [...this.selectedItems, event.item];
|
|
196
|
-
this.selected = [...this.selected, event.item.value];
|
|
197
|
-
this.value = this.selected.join(this.valueSeparator);
|
|
198
|
-
}
|
|
141
|
+
event.selectionRoot = this;
|
|
199
142
|
}
|
|
200
143
|
}
|
|
201
144
|
addChildItem(item) {
|
|
202
145
|
this.childItemSet.add(item);
|
|
203
146
|
this.handleItemsChanged();
|
|
204
147
|
}
|
|
205
|
-
async removeChildItem(
|
|
206
|
-
this.childItemSet.delete(item);
|
|
148
|
+
async removeChildItem(event) {
|
|
149
|
+
this.childItemSet.delete(event.item);
|
|
207
150
|
this.cachedChildItems = void 0;
|
|
208
|
-
if (item.focused) {
|
|
151
|
+
if (event.item.focused) {
|
|
209
152
|
this.handleItemsChanged();
|
|
210
153
|
await this.updateComplete;
|
|
211
154
|
this.focus();
|
|
@@ -223,12 +166,12 @@ export class Menu extends SpectrumElement {
|
|
|
223
166
|
}
|
|
224
167
|
this.focusMenuItemByOffset(0);
|
|
225
168
|
super.focus({ preventScroll });
|
|
226
|
-
const selectedItem = this.
|
|
169
|
+
const selectedItem = this.querySelector("[selected]");
|
|
227
170
|
if (selectedItem && !preventScroll) {
|
|
228
171
|
selectedItem.scrollIntoView({ block: "nearest" });
|
|
229
172
|
}
|
|
230
173
|
}
|
|
231
|
-
|
|
174
|
+
onClick(event) {
|
|
232
175
|
if (event.defaultPrevented) {
|
|
233
176
|
return;
|
|
234
177
|
}
|
|
@@ -260,18 +203,18 @@ export class Menu extends SpectrumElement {
|
|
|
260
203
|
}
|
|
261
204
|
handleFocusin(event) {
|
|
262
205
|
var _a;
|
|
263
|
-
const
|
|
206
|
+
const isOrContainsRelatedTarget = elementIsOrContains(
|
|
264
207
|
this,
|
|
265
208
|
event.relatedTarget
|
|
266
209
|
);
|
|
267
|
-
if (this.childItems.some(
|
|
210
|
+
if (isOrContainsRelatedTarget || this.childItems.some(
|
|
268
211
|
(childItem) => childItem.menuData.focusRoot !== this
|
|
269
212
|
)) {
|
|
270
213
|
return;
|
|
271
214
|
}
|
|
272
215
|
const activeElement = this.getRootNode().activeElement;
|
|
273
216
|
const selectionRoot = ((_a = this.childItems[this.focusedItemIndex]) == null ? void 0 : _a.menuData.selectionRoot) || this;
|
|
274
|
-
if (activeElement !== selectionRoot || !
|
|
217
|
+
if (activeElement !== selectionRoot || !isOrContainsRelatedTarget) {
|
|
275
218
|
selectionRoot.focus({ preventScroll: true });
|
|
276
219
|
if (activeElement && this.focusedItemIndex === 0) {
|
|
277
220
|
const offset = this.childItems.findIndex(
|
|
@@ -286,32 +229,27 @@ export class Menu extends SpectrumElement {
|
|
|
286
229
|
}
|
|
287
230
|
startListeningToKeyboard() {
|
|
288
231
|
this.addEventListener("keydown", this.handleKeydown);
|
|
232
|
+
this.addEventListener("focusout", this.handleFocusout);
|
|
289
233
|
}
|
|
290
234
|
handleFocusout(event) {
|
|
291
235
|
if (elementIsOrContains(this, event.relatedTarget)) {
|
|
236
|
+
event.composedPath()[0].focused = false;
|
|
292
237
|
return;
|
|
293
238
|
}
|
|
294
239
|
this.stopListeningToKeyboard();
|
|
295
|
-
this.childItems.
|
|
240
|
+
if (event.target === this && this.childItems.some(
|
|
241
|
+
(childItem) => childItem.menuData.focusRoot === this
|
|
242
|
+
)) {
|
|
243
|
+
const focusedItem = this.childItems[this.focusedItemIndex];
|
|
244
|
+
if (focusedItem) {
|
|
245
|
+
focusedItem.focused = false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
296
248
|
this.removeAttribute("aria-activedescendant");
|
|
297
249
|
}
|
|
298
250
|
stopListeningToKeyboard() {
|
|
299
251
|
this.removeEventListener("keydown", this.handleKeydown);
|
|
300
|
-
|
|
301
|
-
handleDescendentOverlayOpened(event) {
|
|
302
|
-
const target = event.composedPath()[0];
|
|
303
|
-
if (!target.overlayElement)
|
|
304
|
-
return;
|
|
305
|
-
this.descendentOverlays.set(
|
|
306
|
-
target.overlayElement,
|
|
307
|
-
target.overlayElement
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
handleDescendentOverlayClosed(event) {
|
|
311
|
-
const target = event.composedPath()[0];
|
|
312
|
-
if (!target.overlayElement)
|
|
313
|
-
return;
|
|
314
|
-
this.descendentOverlays.delete(target.overlayElement);
|
|
252
|
+
this.removeEventListener("focusout", this.handleFocusout);
|
|
315
253
|
}
|
|
316
254
|
async selectOrToggleItem(targetItem) {
|
|
317
255
|
const resolvedSelects = this.resolvedSelects;
|
|
@@ -320,7 +258,6 @@ export class Menu extends SpectrumElement {
|
|
|
320
258
|
const oldSelectedItems = this.selectedItems.slice();
|
|
321
259
|
const oldValue = this.value;
|
|
322
260
|
this.childItems[this.focusedItemIndex].focused = false;
|
|
323
|
-
this.childItems[this.focusedItemIndex].active = false;
|
|
324
261
|
this.focusedItemIndex = this.childItems.indexOf(targetItem);
|
|
325
262
|
this.forwardFocusVisibleToItem(targetItem);
|
|
326
263
|
if (resolvedSelects === "multiple") {
|
|
@@ -384,30 +321,23 @@ export class Menu extends SpectrumElement {
|
|
|
384
321
|
return;
|
|
385
322
|
}
|
|
386
323
|
event.preventDefault();
|
|
387
|
-
event.stopPropagation();
|
|
388
324
|
itemToFocus.scrollIntoView({ block: "nearest" });
|
|
389
325
|
}
|
|
390
|
-
navigateBetweenRelatedMenus(
|
|
391
|
-
const { code } = event;
|
|
326
|
+
navigateBetweenRelatedMenus(code) {
|
|
392
327
|
const shouldOpenSubmenu = this.isLTR && code === "ArrowRight" || !this.isLTR && code === "ArrowLeft";
|
|
393
328
|
const shouldCloseSelfAsSubmenu = this.isLTR && code === "ArrowLeft" || !this.isLTR && code === "ArrowRight";
|
|
394
329
|
if (shouldOpenSubmenu) {
|
|
395
|
-
event.stopPropagation();
|
|
396
330
|
const lastFocusedItem = this.childItems[this.focusedItemIndex];
|
|
397
331
|
if (lastFocusedItem == null ? void 0 : lastFocusedItem.hasSubmenu) {
|
|
332
|
+
this.blur();
|
|
398
333
|
lastFocusedItem.openOverlay();
|
|
399
334
|
}
|
|
400
335
|
} else if (shouldCloseSelfAsSubmenu && this.isSubmenu) {
|
|
401
|
-
event.stopPropagation();
|
|
402
336
|
this.dispatchEvent(new Event("close", { bubbles: true }));
|
|
403
|
-
this.updateSelectedItemIndex();
|
|
404
337
|
}
|
|
405
338
|
}
|
|
406
339
|
handleKeydown(event) {
|
|
407
340
|
var _a;
|
|
408
|
-
if (event.target !== this && this !== event.target.parentElement) {
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
341
|
const { code } = event;
|
|
412
342
|
if (code === "Tab") {
|
|
413
343
|
this.prepareToCleanUp();
|
|
@@ -416,6 +346,7 @@ export class Menu extends SpectrumElement {
|
|
|
416
346
|
if (code === "Space") {
|
|
417
347
|
const lastFocusedItem = this.childItems[this.focusedItemIndex];
|
|
418
348
|
if (lastFocusedItem == null ? void 0 : lastFocusedItem.hasSubmenu) {
|
|
349
|
+
this.blur();
|
|
419
350
|
lastFocusedItem.openOverlay();
|
|
420
351
|
return;
|
|
421
352
|
}
|
|
@@ -428,15 +359,12 @@ export class Menu extends SpectrumElement {
|
|
|
428
359
|
this.navigateWithinMenu(event);
|
|
429
360
|
return;
|
|
430
361
|
}
|
|
431
|
-
this.navigateBetweenRelatedMenus(
|
|
362
|
+
this.navigateBetweenRelatedMenus(code);
|
|
432
363
|
}
|
|
433
364
|
focusMenuItemByOffset(offset) {
|
|
434
365
|
const step = offset || 1;
|
|
435
366
|
const focusedItem = this.childItems[this.focusedItemIndex];
|
|
436
|
-
|
|
437
|
-
focusedItem.focused = false;
|
|
438
|
-
focusedItem.active = false;
|
|
439
|
-
}
|
|
367
|
+
focusedItem.focused = false;
|
|
440
368
|
this.focusedItemIndex = (this.childItems.length + this.focusedItemIndex + offset) % this.childItems.length;
|
|
441
369
|
let itemToFocus = this.childItems[this.focusedItemIndex];
|
|
442
370
|
let availableItems = this.childItems.length;
|
|
@@ -475,7 +403,7 @@ export class Menu extends SpectrumElement {
|
|
|
475
403
|
itemIndex -= 1;
|
|
476
404
|
const childItem = this.childItems[itemIndex];
|
|
477
405
|
if (childItem.menuData.selectionRoot === this) {
|
|
478
|
-
if (childItem.selected
|
|
406
|
+
if (childItem.selected) {
|
|
479
407
|
firstOrFirstSelectedIndex = itemIndex;
|
|
480
408
|
selectedItemsMap.set(childItem, true);
|
|
481
409
|
selected.unshift(childItem.value);
|
|
@@ -501,17 +429,20 @@ export class Menu extends SpectrumElement {
|
|
|
501
429
|
handleItemsChanged() {
|
|
502
430
|
this.cachedChildItems = void 0;
|
|
503
431
|
if (!this._willUpdateItems) {
|
|
432
|
+
let resolve = () => {
|
|
433
|
+
return;
|
|
434
|
+
};
|
|
435
|
+
this.cacheUpdated = new Promise((res) => resolve = res);
|
|
504
436
|
this._willUpdateItems = true;
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
437
|
+
window.requestAnimationFrame(() => {
|
|
438
|
+
if (this.cachedChildItems === void 0) {
|
|
439
|
+
this.updateSelectedItemIndex();
|
|
440
|
+
this.updateItemFocus();
|
|
441
|
+
}
|
|
442
|
+
this._willUpdateItems = false;
|
|
443
|
+
resolve();
|
|
444
|
+
});
|
|
513
445
|
}
|
|
514
|
-
this._willUpdateItems = false;
|
|
515
446
|
}
|
|
516
447
|
updateItemFocus() {
|
|
517
448
|
if (this.childItems.length == 0) {
|
|
@@ -522,52 +453,21 @@ export class Menu extends SpectrumElement {
|
|
|
522
453
|
this.forwardFocusVisibleToItem(focusInItem);
|
|
523
454
|
}
|
|
524
455
|
}
|
|
525
|
-
closeDescendentOverlays() {
|
|
526
|
-
this.descendentOverlays.forEach((overlay) => {
|
|
527
|
-
overlay.open = false;
|
|
528
|
-
});
|
|
529
|
-
this.descendentOverlays = /* @__PURE__ */ new Map();
|
|
530
|
-
}
|
|
531
456
|
forwardFocusVisibleToItem(item) {
|
|
532
457
|
if (item.menuData.focusRoot !== this) {
|
|
533
458
|
return;
|
|
534
459
|
}
|
|
535
|
-
this.
|
|
536
|
-
const focused = this.hasVisibleFocusInTree() || !!this.childItems.find((child) => {
|
|
537
|
-
return child.hasVisibleFocusInTree();
|
|
538
|
-
});
|
|
539
|
-
item.focused = focused;
|
|
460
|
+
item.focused = this.hasVisibleFocusInTree();
|
|
540
461
|
this.setAttribute("aria-activedescendant", item.id);
|
|
541
462
|
if (item.menuData.selectionRoot && item.menuData.selectionRoot !== this) {
|
|
542
463
|
item.menuData.selectionRoot.focus();
|
|
543
464
|
}
|
|
544
465
|
}
|
|
545
|
-
|
|
546
|
-
target
|
|
547
|
-
}) {
|
|
548
|
-
const assignedElement = target.assignedElements({
|
|
549
|
-
flatten: true
|
|
550
|
-
});
|
|
551
|
-
if (this.childItems.length !== assignedElement.length) {
|
|
552
|
-
assignedElement.forEach((item) => {
|
|
553
|
-
if (typeof item.triggerUpdate !== "undefined") {
|
|
554
|
-
item.triggerUpdate();
|
|
555
|
-
}
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
renderMenuItemSlot() {
|
|
466
|
+
render() {
|
|
560
467
|
return html`
|
|
561
|
-
<slot
|
|
562
|
-
@sp-menu-submenu-opened=${this.handleDescendentOverlayOpened}
|
|
563
|
-
@sp-menu-submenu-closed=${this.handleDescendentOverlayClosed}
|
|
564
|
-
@slotchange=${this.handleSlotchange}
|
|
565
|
-
></slot>
|
|
468
|
+
<slot></slot>
|
|
566
469
|
`;
|
|
567
470
|
}
|
|
568
|
-
render() {
|
|
569
|
-
return this.renderMenuItemSlot();
|
|
570
|
-
}
|
|
571
471
|
firstUpdated(changed) {
|
|
572
472
|
super.firstUpdated(changed);
|
|
573
473
|
if (!this.hasAttribute("tabindex") && !this.ignore) {
|
|
@@ -590,16 +490,17 @@ export class Menu extends SpectrumElement {
|
|
|
590
490
|
}
|
|
591
491
|
updated(changes) {
|
|
592
492
|
super.updated(changes);
|
|
593
|
-
if (changes.has("selects") && this.
|
|
493
|
+
if (changes.has("selects") && this._notFirstUpdated) {
|
|
594
494
|
this.selectsChanged();
|
|
595
495
|
}
|
|
596
|
-
if (changes.has("label")
|
|
496
|
+
if (changes.has("label")) {
|
|
597
497
|
if (this.label) {
|
|
598
498
|
this.setAttribute("aria-label", this.label);
|
|
599
499
|
} else {
|
|
600
500
|
this.removeAttribute("aria-label");
|
|
601
501
|
}
|
|
602
502
|
}
|
|
503
|
+
this._notFirstUpdated = true;
|
|
603
504
|
}
|
|
604
505
|
selectsChanged() {
|
|
605
506
|
const updates = [
|
|
@@ -617,6 +518,10 @@ export class Menu extends SpectrumElement {
|
|
|
617
518
|
}
|
|
618
519
|
this.updateComplete.then(() => this.updateItemFocus());
|
|
619
520
|
}
|
|
521
|
+
disconnectedCallback() {
|
|
522
|
+
this.cachedChildItems = void 0;
|
|
523
|
+
super.disconnectedCallback();
|
|
524
|
+
}
|
|
620
525
|
async getUpdateComplete() {
|
|
621
526
|
const complete = await super.getUpdateComplete();
|
|
622
527
|
await this.childItemsUpdated;
|