@spectrum-web-components/menu 0.36.0 → 0.38.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 (48) hide show
  1. package/custom-elements.json +459 -159
  2. package/package.json +9 -9
  3. package/src/Menu.d.ts +16 -6
  4. package/src/Menu.dev.js +179 -65
  5. package/src/Menu.dev.js.map +2 -2
  6. package/src/Menu.js +7 -3
  7. package/src/Menu.js.map +3 -3
  8. package/src/MenuGroup.d.ts +0 -2
  9. package/src/MenuGroup.dev.js +8 -12
  10. package/src/MenuGroup.dev.js.map +2 -2
  11. package/src/MenuGroup.js +3 -5
  12. package/src/MenuGroup.js.map +3 -3
  13. package/src/MenuItem.d.ts +30 -23
  14. package/src/MenuItem.dev.js +209 -215
  15. package/src/MenuItem.dev.js.map +3 -3
  16. package/src/MenuItem.js +36 -18
  17. package/src/MenuItem.js.map +3 -3
  18. package/src/menu-item.css.dev.js +9 -9
  19. package/src/menu-item.css.dev.js.map +1 -1
  20. package/src/menu-item.css.js +9 -9
  21. package/src/menu-item.css.js.map +1 -1
  22. package/src/menu.css.dev.js +1 -1
  23. package/src/menu.css.dev.js.map +1 -1
  24. package/src/menu.css.js +1 -1
  25. package/src/menu.css.js.map +1 -1
  26. package/src/spectrum-config.js +27 -1
  27. package/src/spectrum-menu-item.css.dev.js +8 -8
  28. package/src/spectrum-menu-item.css.dev.js.map +1 -1
  29. package/src/spectrum-menu-item.css.js +8 -8
  30. package/src/spectrum-menu-item.css.js.map +1 -1
  31. package/stories/index.js +4 -0
  32. package/stories/index.js.map +2 -2
  33. package/stories/menu-item.stories.js +10 -0
  34. package/stories/menu-item.stories.js.map +2 -2
  35. package/stories/menu.stories.js +47 -0
  36. package/stories/menu.stories.js.map +2 -2
  37. package/stories/submenu.stories.js +117 -104
  38. package/stories/submenu.stories.js.map +3 -3
  39. package/test/menu-group.test.js +14 -1
  40. package/test/menu-group.test.js.map +2 -2
  41. package/test/menu-item.test.js +36 -0
  42. package/test/menu-item.test.js.map +2 -2
  43. package/test/menu-selects.test.js +3 -1
  44. package/test/menu-selects.test.js.map +2 -2
  45. package/test/menu.test.js +9 -1
  46. package/test/menu.test.js.map +2 -2
  47. package/test/submenu.test.js +208 -84
  48. package/test/submenu.test.js.map +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["MenuGroup.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n queryAssignedNodes,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { Menu } from './Menu.js';\n// Leveraged in build systems that use aliasing to prevent multiple registrations: https://github.com/adobe/spectrum-web-components/pull/3225\nimport '@spectrum-web-components/menu/sp-menu.js';\nimport menuGroupStyles from './menu-group.css.js';\n\n/**\n * @element sp-menu-group\n *\n * @slot header - headline of the menu group\n * @slot - menu items to be listed in the group\n */\nexport class MenuGroup extends Menu {\n public static override get styles(): CSSResultArray {\n return [...super.styles, menuGroupStyles];\n }\n\n private static instances = 0;\n\n private headerId!: string;\n\n public constructor() {\n super();\n MenuGroup.instances += 1;\n this.headerId = `sp-menu-group-label-${MenuGroup.instances}`;\n }\n\n @queryAssignedNodes({\n slot: 'header',\n flatten: true,\n })\n private headerElements!: NodeListOf<HTMLElement>;\n\n @state()\n private headerElement?: HTMLElement;\n\n protected override get ownRole(): string {\n switch (this.selects) {\n case 'multiple':\n case 'single':\n case 'inherit':\n return 'group';\n default:\n return 'menu';\n }\n }\n\n protected updateLabel(): void {\n const headerElement = this.headerElements.length\n ? this.headerElements[0]\n : undefined;\n if (headerElement !== this.headerElement) {\n if (this.headerElement && this.headerElement.id === this.headerId) {\n this.headerElement.removeAttribute('id');\n }\n if (headerElement) {\n const headerId = headerElement.id || this.headerId;\n if (!headerElement.id) {\n headerElement.id = headerId;\n }\n this.setAttribute('aria-labelledby', headerId);\n } else {\n this.removeAttribute('aria-labelledby');\n }\n }\n this.headerElement = headerElement;\n }\n\n public override render(): TemplateResult {\n return html`\n <span class=\"header\" ?hidden=${!this.headerElement}>\n <slot name=\"header\" @slotchange=${this.updateLabel}></slot>\n </span>\n <sp-menu ignore>\n <slot></slot>\n </sp-menu>\n `;\n }\n}\n"],
5
- "mappings": "qNAYA,OAEI,QAAAA,MAEG,gCACP,OACI,sBAAAC,EACA,SAAAC,MACG,kDAEP,OAAS,QAAAC,MAAY,YAErB,MAAO,2CACP,OAAOC,MAAqB,sBAQrB,MAAMC,EAAN,MAAMA,UAAkBF,CAAK,CASzB,aAAc,CACjB,MAAM,EACNE,EAAU,WAAa,EACvB,KAAK,SAAW,uBAAuBA,EAAU,SAAS,EAC9D,CAZA,WAA2B,QAAyB,CAChD,MAAO,CAAC,GAAG,MAAM,OAAQD,CAAe,CAC5C,CAqBA,IAAuB,SAAkB,CACrC,OAAQ,KAAK,QAAS,CAClB,IAAK,WACL,IAAK,SACL,IAAK,UACD,MAAO,QACX,QACI,MAAO,MACf,CACJ,CAEU,aAAoB,CAC1B,MAAME,EAAgB,KAAK,eAAe,OACpC,KAAK,eAAe,CAAC,EACrB,OACN,GAAIA,IAAkB,KAAK,cAIvB,GAHI,KAAK,eAAiB,KAAK,cAAc,KAAO,KAAK,UACrD,KAAK,cAAc,gBAAgB,IAAI,EAEvCA,EAAe,CACf,MAAMC,EAAWD,EAAc,IAAM,KAAK,SACrCA,EAAc,KACfA,EAAc,GAAKC,GAEvB,KAAK,aAAa,kBAAmBA,CAAQ,CACjD,MACI,KAAK,gBAAgB,iBAAiB,EAG9C,KAAK,cAAgBD,CACzB,CAEgB,QAAyB,CACrC,OAAON;AAAA,2CAC4B,CAAC,KAAK,aAAa;AAAA,kDACZ,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,SAM9D,CACJ,EAlEaK,EAKM,UAAY,EAcnBG,EAAA,CAJPP,EAAmB,CAChB,KAAM,SACN,QAAS,EACb,CAAC,GAlBQI,EAmBD,8BAGAG,EAAA,CADPN,EAAM,GArBEG,EAsBD,6BAtBL,WAAM,UAANA",
6
- "names": ["html", "queryAssignedNodes", "state", "Menu", "menuGroupStyles", "_MenuGroup", "headerElement", "headerId", "__decorateClass"]
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n queryAssignedNodes,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { Menu } from './Menu.js';\n// Leveraged in build systems that use aliasing to prevent multiple registrations: https://github.com/adobe/spectrum-web-components/pull/3225\nimport '@spectrum-web-components/menu/sp-menu.js';\nimport menuGroupStyles from './menu-group.css.js';\n\n/**\n * @element sp-menu-group\n *\n * @slot header - headline of the menu group\n * @slot - menu items to be listed in the group\n */\nexport class MenuGroup extends Menu {\n public static override get styles(): CSSResultArray {\n return [...super.styles, menuGroupStyles];\n }\n\n private headerId = '';\n\n @queryAssignedNodes({\n slot: 'header',\n flatten: true,\n })\n private headerElements!: NodeListOf<HTMLElement>;\n\n @state()\n private headerElement?: HTMLElement;\n\n protected override get ownRole(): string {\n switch (this.selects) {\n case 'multiple':\n case 'single':\n case 'inherit':\n return 'group';\n default:\n return 'menu';\n }\n }\n\n protected updateLabel(): void {\n const headerElement = this.headerElements.length\n ? this.headerElements[0]\n : undefined;\n if (headerElement !== this.headerElement) {\n if (this.headerElement && this.headerElement.id === this.headerId) {\n this.headerElement.removeAttribute('id');\n }\n if (headerElement) {\n this.headerId =\n this.headerId ||\n `sp-menu-group-label-${crypto.randomUUID().slice(0, 8)}`;\n const headerId = headerElement.id || this.headerId;\n if (!headerElement.id) {\n headerElement.id = headerId;\n }\n this.setAttribute('aria-labelledby', headerId);\n } else {\n this.removeAttribute('aria-labelledby');\n }\n }\n this.headerElement = headerElement;\n }\n\n public override render(): TemplateResult {\n return html`\n <span class=\"header\" ?hidden=${!this.headerElement}>\n <slot name=\"header\" @slotchange=${this.updateLabel}></slot>\n </span>\n <sp-menu ignore>${this.renderMenuItemSlot()}</sp-menu>\n `;\n }\n}\n"],
5
+ "mappings": "qNAYA,OAEI,QAAAA,MAEG,gCACP,OACI,sBAAAC,EACA,SAAAC,MACG,kDAEP,OAAS,QAAAC,MAAY,YAErB,MAAO,2CACP,OAAOC,MAAqB,sBAQrB,aAAM,kBAAkBD,CAAK,CAA7B,kCAKH,KAAQ,SAAW,GAJnB,WAA2B,QAAyB,CAChD,MAAO,CAAC,GAAG,MAAM,OAAQC,CAAe,CAC5C,CAaA,IAAuB,SAAkB,CACrC,OAAQ,KAAK,QAAS,CAClB,IAAK,WACL,IAAK,SACL,IAAK,UACD,MAAO,QACX,QACI,MAAO,MACf,CACJ,CAEU,aAAoB,CAC1B,MAAMC,EAAgB,KAAK,eAAe,OACpC,KAAK,eAAe,CAAC,EACrB,OACN,GAAIA,IAAkB,KAAK,cAIvB,GAHI,KAAK,eAAiB,KAAK,cAAc,KAAO,KAAK,UACrD,KAAK,cAAc,gBAAgB,IAAI,EAEvCA,EAAe,CACf,KAAK,SACD,KAAK,UACL,uBAAuB,OAAO,WAAW,EAAE,MAAM,EAAG,CAAC,CAAC,GAC1D,MAAMC,EAAWD,EAAc,IAAM,KAAK,SACrCA,EAAc,KACfA,EAAc,GAAKC,GAEvB,KAAK,aAAa,kBAAmBA,CAAQ,CACjD,MACI,KAAK,gBAAgB,iBAAiB,EAG9C,KAAK,cAAgBD,CACzB,CAEgB,QAAyB,CACrC,OAAOL;AAAA,2CAC4B,CAAC,KAAK,aAAa;AAAA,kDACZ,KAAK,WAAW;AAAA;AAAA,8BAEpC,KAAK,mBAAmB,CAAC;AAAA,SAEnD,CACJ,CAhDYO,EAAA,CAJPN,EAAmB,CAChB,KAAM,SACN,QAAS,EACb,CAAC,GAVQ,UAWD,8BAGAM,EAAA,CADPL,EAAM,GAbE,UAcD",
6
+ "names": ["html", "queryAssignedNodes", "state", "Menu", "menuGroupStyles", "headerElement", "headerId", "__decorateClass"]
7
7
  }
package/src/MenuItem.d.ts CHANGED
@@ -3,23 +3,18 @@ import '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';
3
3
  import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
4
4
  import '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';
5
5
  import type { Menu } from './Menu.js';
6
- export declare class MenuItemRemovedEvent extends Event {
7
- constructor();
8
- get item(): MenuItem;
9
- _item: MenuItem;
10
- focused: boolean;
11
- reset(item: MenuItem): void;
12
- }
6
+ import type { Overlay } from '@spectrum-web-components/overlay';
7
+ declare type MenuCascadeItem = {
8
+ hadFocusRoot: boolean;
9
+ ancestorWithSelects?: HTMLElement;
10
+ };
13
11
  export declare class MenuItemAddedOrUpdatedEvent extends Event {
14
- constructor();
15
- set focusRoot(root: Menu | undefined);
16
- set selectionRoot(root: Menu);
12
+ constructor(item: MenuItem);
13
+ clear(item: MenuItem): void;
14
+ menuCascade: WeakMap<HTMLElement, MenuCascadeItem>;
17
15
  get item(): MenuItem;
18
- _item: MenuItem;
19
- set currentAncestorWithSelects(ancestor: Menu | undefined);
20
- get currentAncestorWithSelects(): Menu | undefined;
21
- _currentAncestorWithSelects?: Menu;
22
- reset(item: MenuItem): void;
16
+ private _item;
17
+ currentAncestorWithSelects?: Menu;
23
18
  }
24
19
  export declare type MenuItemChildren = {
25
20
  icon: Element[];
@@ -39,16 +34,16 @@ declare const MenuItem_base: typeof Focusable & {
39
34
  * @element sp-menu-item
40
35
  *
41
36
  * @slot - text content to display within the Menu Item
37
+ * @slot description - description to be placed below the label of the Menu Item
42
38
  * @slot icon - icon element to be placed at the start of the Menu Item
43
39
  * @slot value - content placed at the end of the Menu Item like values, keyboard shortcuts, etc.
44
40
  * @slot submenu - content placed in a submenu
45
41
  * @fires sp-menu-item-added - announces the item has been added so a parent menu can take ownerships
46
- * @fires sp-menu-item-removed - announces when removed from the DOM so the parent menu can remove ownership and update selected state
47
42
  */
48
43
  export declare class MenuItem extends MenuItem_base {
49
44
  static get styles(): CSSResultArray;
50
- static instanceCount: number;
51
- private isInSubmenu;
45
+ abortControllerPointer: AbortController;
46
+ abortControllerSubmenu: AbortController;
52
47
  active: boolean;
53
48
  focused: boolean;
54
49
  selected: boolean;
@@ -60,8 +55,11 @@ export declare class MenuItem extends MenuItem_base {
60
55
  */
61
56
  get itemText(): string;
62
57
  hasSubmenu: boolean;
58
+ contentSlot: HTMLSlotElement;
59
+ iconSlot: HTMLSlotElement;
63
60
  noWrap: boolean;
64
61
  private anchorElement;
62
+ overlayElement: Overlay;
65
63
  get focusElement(): HTMLElement;
66
64
  protected get hasIcon(): boolean;
67
65
  get itemChildren(): MenuItemChildren;
@@ -73,6 +71,7 @@ export declare class MenuItem extends MenuItem_base {
73
71
  private proxyFocus;
74
72
  private shouldProxyClick;
75
73
  protected breakItemChildrenCache(): void;
74
+ protected renderSubmenu(): TemplateResult;
76
75
  protected render(): TemplateResult;
77
76
  protected manageSubmenu(event: Event & {
78
77
  target: HTMLSlotElement;
@@ -81,10 +80,12 @@ export declare class MenuItem extends MenuItem_base {
81
80
  private handlePointerdown;
82
81
  protected firstUpdated(changes: PropertyValues): void;
83
82
  protected closeOverlaysForRoot(): void;
84
- closeOverlay?: () => Promise<void>;
85
- protected handleSubmenuClick(): void;
83
+ protected handleSubmenuClick(event: Event): void;
84
+ protected handleSubmenuFocus(): void;
85
+ protected handleBeforetoggle: (event: Event) => void;
86
86
  protected handlePointerenter(): void;
87
87
  protected leaveTimeout?: ReturnType<typeof setTimeout>;
88
+ protected recentlyLeftChild: boolean;
88
89
  protected handlePointerleave(): void;
89
90
  /**
90
91
  * When there is a `change` event in the submenu for this item
@@ -93,8 +94,11 @@ export declare class MenuItem extends MenuItem_base {
93
94
  * and the root of the tree to have their selection changes and
94
95
  * be closed.
95
96
  */
96
- protected handleSubmenuChange: () => void;
97
- protected handleSubmenuPointerenter: () => void;
97
+ protected handleSubmenuChange(event: Event): void;
98
+ protected handleSubmenuPointerenter(): void;
99
+ protected handleSubmenuPointerleave(): Promise<void>;
100
+ protected handleSubmenuOpen(event: Event): void;
101
+ protected cleanup(): void;
98
102
  openOverlay(): Promise<void>;
99
103
  updateAriaSelected(): void;
100
104
  setRole(role: string): void;
@@ -102,16 +106,19 @@ export declare class MenuItem extends MenuItem_base {
102
106
  connectedCallback(): void;
103
107
  _parentElement: HTMLElement;
104
108
  disconnectedCallback(): void;
109
+ private willDispatchUpdate;
105
110
  triggerUpdate(): Promise<void>;
111
+ dispatchUpdate(): void;
106
112
  menuData: {
107
113
  focusRoot?: Menu;
114
+ parentMenu?: Menu;
108
115
  selectionRoot?: Menu;
116
+ cleanupSteps: ((item: MenuItem) => void)[];
109
117
  };
110
118
  }
111
119
  declare global {
112
120
  interface GlobalEventHandlersEventMap {
113
121
  'sp-menu-item-added-or-updated': MenuItemAddedOrUpdatedEvent;
114
- 'sp-menu-item-removed': MenuItemRemovedEvent;
115
122
  }
116
123
  }
117
124
  export {};