@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/menu",
3
- "version": "0.33.1-overlay.41+c5a2c1756",
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.1-overlay.41+c5a2c1756",
89
- "@spectrum-web-components/base": "^0.33.1-overlay.41+c5a2c1756",
90
- "@spectrum-web-components/divider": "^0.33.1-overlay.41+c5a2c1756",
91
- "@spectrum-web-components/icon": "^0.33.1-overlay.41+c5a2c1756",
92
- "@spectrum-web-components/icons-ui": "^0.33.1-overlay.41+c5a2c1756",
93
- "@spectrum-web-components/overlay": "^0.33.1-overlay.41+c5a2c1756",
94
- "@spectrum-web-components/shared": "^0.33.1-overlay.41+c5a2c1756"
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": "c5a2c1756a8919cf1228bc093488b27b4584bcfa"
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
- private get isSubmenu();
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 CAPTURE phase the first
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 BUBBLE phase the first
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 handleClick;
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(event: KeyboardEvent): void;
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("click", this.handleClick);
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 CAPTURE phase the first
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
- const cascadeData = event.menuCascade.get(this);
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.item.menuData.selectionRoot = event.item.menuData.selectionRoot || this;
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(item) {
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.selectedItems[0];
169
+ const selectedItem = this.querySelector("[selected]");
227
170
  if (selectedItem && !preventScroll) {
228
171
  selectedItem.scrollIntoView({ block: "nearest" });
229
172
  }
230
173
  }
231
- handleClick(event) {
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 wasOrContainedRelatedTarget = elementIsOrContains(
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 || !wasOrContainedRelatedTarget && event.target !== this) {
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.forEach((child) => child.focused = false);
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(event) {
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(event);
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
- if (focusedItem) {
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 || !this._hasUpdatedSelectedItemIndex && this.selected.includes(childItem.value)) {
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
- this.cacheUpdated = this.updateCache();
506
- }
507
- }
508
- async updateCache() {
509
- await new Promise((res) => requestAnimationFrame(() => res(true)));
510
- if (this.cachedChildItems === void 0) {
511
- this.updateSelectedItemIndex();
512
- this.updateItemFocus();
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.closeDescendentOverlays();
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
- handleSlotchange({
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.hasUpdated) {
493
+ if (changes.has("selects") && this._notFirstUpdated) {
594
494
  this.selectsChanged();
595
495
  }
596
- if (changes.has("label") && (this.label || typeof changes.get("label") !== "undefined")) {
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;