@spectrum-web-components/menu 1.12.0-testing.20260223092154 → 1.12.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["MenuItem.ts"],
4
- "sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\n\nimport {\n CSSResultArray,\n html,\n INPUT_COMPONENT_PATTERN,\n nothing,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\nimport chevronStyles from '@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js';\nimport type { Overlay } from '@spectrum-web-components/overlay';\nimport { SlottableRequestEvent } from '@spectrum-web-components/overlay/src/slottable-request-event.js';\nimport { DependencyManagerController } from '@spectrum-web-components/reactive-controllers/src/DependencyManger.js';\nimport {\n ObserveSlotPresence,\n ObserveSlotText,\n randomID,\n} from '@spectrum-web-components/shared';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\n\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';\n\nimport type { Menu } from './Menu.dev.js'\nimport menuItemStyles from './menu-item.css.js';\n\n/**\n * Duration during which a pointing device can leave an `<sp-menu-item>` element\n * and return to it or to the submenu opened from it before closing that submenu.\n **/\nconst POINTERLEAVE_TIMEOUT = 100;\n\ntype MenuCascadeItem = {\n hadFocusRoot: boolean;\n ancestorWithSelects?: HTMLElement;\n};\n\n/**\n * Fires when a menu item is added or updated so that a parent menu can track it.\n */\nexport class MenuItemAddedOrUpdatedEvent extends Event {\n constructor(item: MenuItem) {\n super('sp-menu-item-added-or-updated', {\n bubbles: true,\n composed: true,\n });\n this.clear(item);\n }\n clear(item: MenuItem): void {\n this._item = item;\n this.currentAncestorWithSelects = undefined;\n item.menuData = {\n cleanupSteps: [],\n focusRoot: undefined,\n selectionRoot: undefined,\n parentMenu: undefined,\n };\n this.menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n }\n menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n get item(): MenuItem {\n return this._item;\n }\n private _item!: MenuItem;\n currentAncestorWithSelects?: Menu;\n}\n\n/**\n * Fires to forward keyboard event information to parent menu.\n */\nexport class MenuItemKeydownEvent extends KeyboardEvent {\n root?: MenuItem;\n private _event?: KeyboardEvent;\n constructor({ root, event }: { root?: MenuItem; event?: KeyboardEvent }) {\n super('sp-menu-item-keydown', { bubbles: true, composed: true });\n this.root = root;\n this._event = event;\n }\n\n public override get altKey(): boolean {\n return this._event?.altKey || false;\n }\n\n public override get code(): string {\n return this._event?.code || '';\n }\n\n public override get ctrlKey(): boolean {\n return this._event?.ctrlKey || false;\n }\n\n public override get isComposing(): boolean {\n return this._event?.isComposing || false;\n }\n\n public override get key(): string {\n return this._event?.key || '';\n }\n\n public override get location(): number {\n return this._event?.location || 0;\n }\n\n public override get metaKey(): boolean {\n return this._event?.metaKey || false;\n }\n\n public override get repeat(): boolean {\n return this._event?.repeat || false;\n }\n\n public override get shiftKey(): boolean {\n return this._event?.shiftKey || false;\n }\n}\n\nexport type MenuItemChildren = { icon: Element[]; content: Node[] };\n\n/**\n * @element sp-menu-item\n *\n * @slot - text content to display within the Menu Item\n * @slot description - description to be placed below the label of the Menu Item\n * @slot icon - icon element to be placed at the start of the Menu Item\n * @slot value - content placed at the end of the Menu Item like values, keyboard shortcuts, etc.\n * @slot submenu - content placed in a submenu\n * @fires sp-menu-item-added - announces the item has been added so a parent menu can take ownerships\n */\nexport class MenuItem extends LikeAnchor(\n ObserveSlotText(ObserveSlotPresence(Focusable, '[slot=\"icon\"]'))\n) {\n public static override get styles(): CSSResultArray {\n return [menuItemStyles, checkmarkStyles, chevronStyles];\n }\n\n abortControllerSubmenu!: AbortController;\n\n /**\n * whether the menu item is active or has an active descendant\n */\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n private dependencyManager = new DependencyManagerController(this);\n\n /**\n * whether the menu item has keyboard focus\n */\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n /**\n * whether the menu item is selected\n */\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n /**\n * value of the menu item which is used for selection\n */\n @property({ type: String })\n public get value(): string {\n return this._value || this.itemText;\n }\n\n public set value(value: string) {\n if (value === this._value) {\n return;\n }\n this._value = value || '';\n if (this._value) {\n this.setAttribute('value', this._value);\n } else {\n this.removeAttribute('value');\n }\n }\n\n private _value = '';\n\n /**\n * @private\n * text content of the menu item minus whitespace\n */\n public get itemText(): string {\n return this.itemChildren.content.reduce(\n (acc, node) => acc + (node.textContent || '').trim(),\n ''\n );\n }\n\n /**\n * whether the menu item has a submenu\n */\n @property({ type: Boolean, reflect: true, attribute: 'has-submenu' })\n public hasSubmenu = false;\n\n @query('slot:not([name])')\n contentSlot!: HTMLSlotElement;\n\n @query('slot[name=\"icon\"]')\n iconSlot!: HTMLSlotElement;\n\n /**\n * whether menu item text content should not wrap\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'no-wrap',\n hasChanged() {\n return false;\n },\n })\n public noWrap = false;\n\n @query('.anchor')\n private anchorElement!: HTMLAnchorElement;\n\n @query('sp-overlay')\n public overlayElement!: Overlay;\n\n private submenuElement?: HTMLElement;\n\n /**\n * the focusable element of the menu item\n */\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasIcon(): boolean {\n return this.slotContentIsPresent;\n }\n\n public get itemChildren(): MenuItemChildren {\n if (!this.iconSlot || !this.contentSlot) {\n return {\n icon: [],\n content: [],\n };\n }\n if (this._itemChildren) {\n return this._itemChildren;\n }\n const icon = this.iconSlot.assignedElements().map((element) => {\n const newElement = element.cloneNode(true) as HTMLElement;\n newElement.removeAttribute('slot');\n newElement.classList.toggle('icon');\n return newElement;\n });\n const content = this.contentSlot\n .assignedNodes()\n .map((node) => node.cloneNode(true));\n this._itemChildren = { icon, content };\n\n return this._itemChildren;\n }\n\n private _itemChildren?: MenuItemChildren;\n\n constructor() {\n super();\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n this.addEventListener('focus', this.handleFocus);\n this.addEventListener('blur', this.handleBlur);\n\n new MutationController(this, {\n config: {\n characterData: true,\n childList: true,\n subtree: true,\n attributeFilter: ['src'],\n },\n callback: (mutations) => {\n const isSubmenu = mutations.every(\n (mutation) => (mutation.target as HTMLElement).slot === 'submenu'\n );\n if (isSubmenu) {\n return;\n }\n this.breakItemChildrenCache();\n },\n });\n }\n\n /**\n * whether submenu is open\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * whether menu item's submenu is opened via keyboard\n */\n private _openedViaKeyboard = false;\n\n /**\n * whether menu item's submenu is closed via pointer leave\n */\n private _closedViaPointer = false;\n\n /**\n * Touch interaction state for submenu toggling\n */\n private _activePointerId?: number;\n private _touchHandledViaPointerup = false;\n private _touchAbortController?: AbortController;\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return false;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n }\n\n private handleSlottableRequest = (event: SlottableRequestEvent): void => {\n this.submenuElement?.dispatchEvent(\n new SlottableRequestEvent(event.name, event.data)\n );\n };\n\n private proxyFocus = (): void => {\n this.focus();\n };\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n }\n return handled;\n }\n\n protected breakItemChildrenCache(): void {\n this._itemChildren = undefined;\n this.triggerUpdate();\n }\n\n protected renderSubmenu(): TemplateResult {\n const slot = html`\n <slot\n name=\"submenu\"\n @slotchange=${this.manageSubmenu}\n @sp-menu-item-added-or-updated=${{\n handleEvent: (event: MenuItemAddedOrUpdatedEvent) => {\n event.clear(event.item);\n },\n capture: true,\n }}\n @focusin=${(event: Event) => event.stopPropagation()}\n ></slot>\n `;\n if (!this.hasSubmenu) {\n return slot;\n }\n this.dependencyManager.add('sp-overlay');\n this.dependencyManager.add('sp-popover');\n import('@spectrum-web-components/overlay/sp-overlay.js');\n import('@spectrum-web-components/popover/sp-popover.js');\n return html`\n <sp-overlay\n receives-focus=\"false\"\n .triggerElement=${this as HTMLElement}\n ?disabled=${!this.hasSubmenu}\n ?open=${this.hasSubmenu && this.open && this.dependencyManager.loaded}\n .placement=${this.dir === 'ltr' ? 'right-start' : 'left-start'}\n .offset=${[-10, 0] as [number, number]}\n .type=${'auto'}\n @close=${(event: Event) => event.stopPropagation()}\n @slottable-request=${this.handleSlottableRequest}\n >\n <sp-popover\n @change=${(event: Event) => {\n this.handleSubmenuChange(event);\n this.open = false;\n }}\n @pointerenter=${this.handleSubmenuPointerenter}\n @pointerleave=${this.handleSubmenuPointerleave}\n @sp-menu-item-added-or-updated=${(event: Event) =>\n event.stopPropagation()}\n >\n ${slot}\n </sp-popover>\n </sp-overlay>\n <sp-icon-chevron100\n class=\"spectrum-UIIcon-ChevronRight100 chevron icon\"\n ></sp-icon-chevron100>\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n ${this.selected\n ? html`\n <sp-icon-checkmark100\n id=\"selected\"\n class=\"spectrum-UIIcon-Checkmark100\n icon\n checkmark\n ${this.hasIcon\n ? 'checkmark--withAdjacentIcon'\n : ''}\"\n ></sp-icon-checkmark100>\n `\n : nothing}\n <slot name=\"icon\"></slot>\n <div id=\"label\">\n <slot id=\"slot\"></slot>\n </div>\n <slot name=\"description\"></slot>\n <slot name=\"value\"></slot>\n ${this.href && this.href.length > 0\n ? super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })\n : nothing}\n ${this.renderSubmenu()}\n `;\n }\n\n /**\n * determines if item has a submenu and updates the `aria-haspopup` attribute\n */\n protected manageSubmenu(event: Event & { target: HTMLSlotElement }): void {\n this.submenuElement = event.target.assignedElements({\n flatten: true,\n })[0] as HTMLElement;\n this.hasSubmenu = !!this.submenuElement;\n if (this.hasSubmenu) {\n this.setAttribute('aria-haspopup', 'true');\n }\n }\n\n private handlePointerdown(event: PointerEvent): void {\n const path = event.composedPath();\n const targetIsInOverlay =\n this.overlayElement && path.includes(this.overlayElement);\n\n if (\n event.pointerType === 'touch' &&\n this.hasSubmenu &&\n !targetIsInOverlay &&\n this._activePointerId === undefined\n ) {\n this._activePointerId = event.pointerId;\n this._touchAbortController = new AbortController();\n\n window.addEventListener('pointerup', this.handleTouchSubmenuToggle, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n window.addEventListener('pointercancel', this.handleTouchCleanup, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n }\n\n if (\n !targetIsInOverlay &&\n this.hasSubmenu &&\n this.open &&\n event.pointerType !== 'touch'\n ) {\n this.addEventListener('focus', this.handleSubmenuFocus, {\n once: true,\n });\n this.overlayElement?.addEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n }\n\n private handleTouchSubmenuToggle = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n\n this._touchAbortController?.abort();\n this._touchHandledViaPointerup = true;\n this._activePointerId = undefined;\n\n if (this.open) {\n this.open = false;\n } else {\n this.openOverlay();\n }\n\n setTimeout(() => {\n this._touchHandledViaPointerup = false;\n }, 0);\n };\n\n private handleTouchCleanup = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n };\n\n protected override firstUpdated(changes: PropertyValues): void {\n super.firstUpdated(changes);\n this.setAttribute('tabindex', '-1');\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('mouseover', this.handleMouseover);\n this.addEventListener('pointerdown', this.handlePointerdown);\n this.addEventListener('pointerenter', this.closeOverlaysForRoot);\n if (!this.hasAttribute('id')) {\n this.id = `sp-menu-item-${randomID()}`;\n }\n }\n\n private getActiveElementSafely(): HTMLElement | null {\n let root = this.getRootNode() as Document | ShadowRoot;\n let activeElement = root.activeElement as HTMLElement;\n\n // If no active element in current context and we're in shadow DOM,\n // traverse up to find the document-level active element\n if (!activeElement && root !== document) {\n while (root && root !== document && 'host' in root) {\n root = (root as ShadowRoot).host.getRootNode() as Document | ShadowRoot;\n activeElement = root.activeElement as HTMLElement;\n if (activeElement) {\n break;\n }\n }\n }\n\n return activeElement;\n }\n\n handleMouseover(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target === this) {\n // Check for active input elements across shadow boundaries\n const activeElement = this.getActiveElementSafely();\n\n // Only focus this menu item if no input element is currently active\n // This prevents interrupting user input in search boxes, text fields, etc.\n if (!activeElement || !this.isInputElement(activeElement)) {\n this.focus();\n }\n this.focused = false;\n }\n }\n\n /**\n * Determines if an element is an input field that should retain focus.\n * Uses multiple detection strategies to identify input elements generically.\n */\n private isInputElement(element: HTMLElement): boolean {\n // Check for native HTML input elements\n if (this.isNativeInputElement(element)) {\n return true;\n }\n\n // Check for contenteditable elements (rich text editors)\n if (element.contentEditable === 'true') {\n return true;\n }\n\n // Check for Spectrum Web Components with input-like behavior\n if (this.isSpectrumInputComponent(element)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if an element is a native HTML input element.\n */\n private isNativeInputElement(element: HTMLElement): boolean {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n );\n }\n\n /**\n * Checks if an element is a Spectrum Web Component with input behavior.\n * Uses ARIA roles and component patterns for generic detection.\n */\n private isSpectrumInputComponent(element: HTMLElement): boolean {\n // Check if it's a Spectrum Web Component\n if (!element.tagName.startsWith('SP-')) {\n return false;\n }\n\n // Check ARIA role for input-like behavior\n const role = element.getAttribute('role');\n const inputRoles = ['textbox', 'searchbox', 'combobox', 'slider'];\n if (role && inputRoles.includes(role)) {\n return true;\n }\n\n // Check for components that typically contain input elements\n // This covers components like sp-search, sp-textfield, sp-number-field, etc.\n const inputComponentPattern = INPUT_COMPONENT_PATTERN;\n if (inputComponentPattern.test(element.tagName)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * forward key info from keydown event to parent menu\n */\n handleKeydown = (event: KeyboardEvent): void => {\n const { target, key } = event;\n const openSubmenuKey =\n this.hasSubmenu && !this.open && [' ', 'Enter'].includes(key);\n if (target === this) {\n if (\n ['ArrowLeft', 'ArrowRight', 'Escape'].includes(key) ||\n openSubmenuKey\n ) {\n event.preventDefault();\n }\n this.dispatchEvent(\n new MenuItemKeydownEvent({ root: this, event: event })\n );\n }\n };\n\n protected closeOverlaysForRoot(): void {\n if (this.open) {\n return;\n }\n this.menuData.parentMenu?.closeDescendentOverlays();\n }\n\n protected handleFocus(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = true;\n }\n }\n\n protected handleBlur(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = false;\n }\n }\n\n protected handleSubmenuClick(event: Event): void {\n if (this._touchHandledViaPointerup) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n\n if (event.composedPath().includes(this.overlayElement)) {\n return;\n }\n\n this.openOverlay(true);\n }\n\n protected handleSubmenuFocus(): void {\n requestAnimationFrame(() => {\n // Wait till after `closeDescendentOverlays` has happened in Menu\n // to reopen (keep open) the direct descendent of this Menu Item\n this.overlayElement.open = this.open;\n this.focused = false;\n });\n }\n\n protected handleBeforetoggle = (event: Event): void => {\n if ((event as Event & { newState: string }).newState === 'closed') {\n this.open = true;\n this.overlayElement.manuallyKeepOpen();\n this.overlayElement.removeEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n };\n\n protected handlePointerenter(event: PointerEvent): void {\n // For touch devices, don't open on pointerenter - let click handle it\n if (event.pointerType === 'touch') {\n return;\n }\n\n if (this.leaveTimeout) {\n clearTimeout(this.leaveTimeout);\n delete this.leaveTimeout;\n this.recentlyLeftChild = false;\n return;\n }\n this.focus();\n this.openOverlay();\n }\n\n protected leaveTimeout?: ReturnType<typeof setTimeout>;\n protected recentlyLeftChild = false;\n\n protected handlePointerleave(event: PointerEvent): void {\n // For touch devices, don't close on pointerleave - let click handle it\n if (event.pointerType === 'touch') {\n return;\n }\n\n this._closedViaPointer = true;\n if (this.open && !this.recentlyLeftChild) {\n this.leaveTimeout = setTimeout(() => {\n delete this.leaveTimeout;\n this.open = false;\n }, POINTERLEAVE_TIMEOUT);\n }\n }\n\n /**\n * When there is a `change` event in the submenu for this item\n * then we \"click\" this item to cascade the selection up the\n * menu tree allowing all submenus between the initial selection\n * and the root of the tree to have their selection changes and\n * be closed.\n */\n protected handleSubmenuChange(event: Event): void {\n event.stopPropagation();\n this.menuData.selectionRoot?.selectOrToggleItem(this);\n }\n\n protected handleSubmenuPointerenter(): void {\n this.recentlyLeftChild = true;\n }\n\n protected async handleSubmenuPointerleave(): Promise<void> {\n this.recentlyLeftChild = false;\n }\n\n protected handleSubmenuOpen(event: Event): void {\n const parentOverlay = event.composedPath().find((el) => {\n return (\n el !== this.overlayElement &&\n (el as HTMLElement).localName === 'sp-overlay'\n );\n }) as Overlay;\n if (this._openedViaKeyboard) {\n this.submenuElement?.focus();\n }\n this.overlayElement.parentOverlayToForceClose = parentOverlay;\n }\n\n protected cleanup(): void {\n this._closedViaPointer = false;\n this.setAttribute('aria-expanded', 'false');\n this.open = false;\n this.active = false;\n }\n\n public async openOverlay(shouldFocus: boolean = false): Promise<void> {\n if (!this.hasSubmenu || this.open || this.disabled) {\n return;\n }\n this.open = true;\n this.active = true;\n this.setAttribute('aria-expanded', 'true');\n this._openedViaKeyboard = shouldFocus;\n this.addEventListener('sp-closed', this.cleanup, {\n once: true,\n });\n }\n\n updateAriaSelected(): void {\n const role = this.getAttribute('role');\n if (role === 'option') {\n this.setAttribute('aria-selected', this.selected ? 'true' : 'false');\n } else if (role === 'menuitemcheckbox' || role === 'menuitemradio') {\n this.setAttribute('aria-checked', this.selected ? 'true' : 'false');\n }\n }\n\n public setRole(role: string): void {\n this.setAttribute('role', role);\n this.updateAriaSelected();\n }\n\n protected override willUpdate(changes: PropertyValues<this>): void {\n super.updated(changes);\n\n // make sure focus returns to the anchor element when submenu is closed\n if (\n changes.has('open') &&\n !this.open &&\n this.hasSubmenu &&\n !this._closedViaPointer &&\n this.matches(':focus-within')\n ) {\n this.focus();\n }\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (\n changes.has('label') &&\n (this.label || typeof changes.get('label') !== 'undefined')\n ) {\n this.setAttribute('aria-label', this.label || '');\n }\n if (\n changes.has('active') &&\n (this.active || typeof changes.get('active') !== 'undefined')\n ) {\n if (this.active) {\n this.menuData.selectionRoot?.closeDescendentOverlays();\n }\n }\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n if (changes.has('selected')) {\n this.updateAriaSelected();\n }\n if (\n changes.has('hasSubmenu') &&\n (this.hasSubmenu || typeof changes.get('hasSubmenu') !== 'undefined')\n ) {\n if (this.hasSubmenu) {\n this.abortControllerSubmenu = new AbortController();\n const options = { signal: this.abortControllerSubmenu.signal };\n this.addEventListener('click', this.handleSubmenuClick, options);\n this.addEventListener('pointerenter', this.handlePointerenter, options);\n this.addEventListener('pointerleave', this.handlePointerleave, options);\n this.addEventListener('sp-opened', this.handleSubmenuOpen, options);\n } else {\n this.abortControllerSubmenu?.abort();\n }\n }\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.triggerUpdate();\n }\n\n _parentElement!: HTMLElement;\n\n public override disconnectedCallback(): void {\n this.menuData.cleanupSteps.forEach((removal) => removal(this));\n this.menuData = {\n focusRoot: undefined,\n parentMenu: undefined,\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n\n // Clean up any active touch listeners\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n\n super.disconnectedCallback();\n }\n\n private willDispatchUpdate = false;\n\n public async triggerUpdate(): Promise<void> {\n if (this.willDispatchUpdate) {\n return;\n }\n this.willDispatchUpdate = true;\n await new Promise((ready) => requestAnimationFrame(ready));\n this.dispatchUpdate();\n }\n\n public override focus(): void {\n super.focus();\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('focus'));\n }\n\n public override blur(): void {\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('blur'));\n super.blur();\n }\n\n public dispatchUpdate(): void {\n if (!this.isConnected) {\n return;\n }\n this.dispatchEvent(new MenuItemAddedOrUpdatedEvent(this));\n this.willDispatchUpdate = false;\n }\n\n public menuData: {\n focusRoot?: Menu;\n parentMenu?: Menu;\n selectionRoot?: Menu;\n cleanupSteps: ((item: MenuItem) => void)[];\n } = {\n // menu that controls ArrowUp/ArrowDown navigation\n focusRoot: undefined,\n parentMenu: undefined,\n // menu or menu group that controls selection\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'sp-menu-item-added-or-updated': MenuItemAddedOrUpdatedEvent;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\n\nimport {\n CSSResultArray,\n html,\n INPUT_COMPONENT_PATTERN,\n nothing,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\nimport chevronStyles from '@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js';\nimport type { Overlay } from '@spectrum-web-components/overlay';\nimport { SlottableRequestEvent } from '@spectrum-web-components/overlay/src/slottable-request-event.js';\nimport { DependencyManagerController } from '@spectrum-web-components/reactive-controllers/src/DependencyManger.js';\nimport {\n ObserveSlotPresence,\n ObserveSlotText,\n randomID,\n} from '@spectrum-web-components/shared';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\n\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';\n\nimport type { Menu } from './Menu.dev.js'\nimport menuItemStyles from './menu-item.css.js';\n\n/**\n * Duration during which a pointing device can leave an `<sp-menu-item>` element\n * and return to it or to the submenu opened from it before closing that submenu.\n **/\nconst POINTERLEAVE_TIMEOUT = 100;\n\ntype MenuCascadeItem = {\n hadFocusRoot: boolean;\n ancestorWithSelects?: HTMLElement;\n};\n\n/**\n * Fires when a menu item is added or updated so that a parent menu can track it.\n */\nexport class MenuItemAddedOrUpdatedEvent extends Event {\n constructor(item: MenuItem) {\n super('sp-menu-item-added-or-updated', {\n bubbles: true,\n composed: true,\n });\n this.clear(item);\n }\n clear(item: MenuItem): void {\n this._item = item;\n this.currentAncestorWithSelects = undefined;\n item.menuData = {\n cleanupSteps: [],\n focusRoot: undefined,\n selectionRoot: undefined,\n parentMenu: undefined,\n };\n this.menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n }\n menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n get item(): MenuItem {\n return this._item;\n }\n private _item!: MenuItem;\n currentAncestorWithSelects?: Menu;\n}\n\n/**\n * Fires to forward keyboard event information to parent menu.\n */\nexport class MenuItemKeydownEvent extends KeyboardEvent {\n root?: MenuItem;\n private _event?: KeyboardEvent;\n constructor({ root, event }: { root?: MenuItem; event?: KeyboardEvent }) {\n super('sp-menu-item-keydown', { bubbles: true, composed: true });\n this.root = root;\n this._event = event;\n }\n\n public override get altKey(): boolean {\n return this._event?.altKey || false;\n }\n\n public override get code(): string {\n return this._event?.code || '';\n }\n\n public override get ctrlKey(): boolean {\n return this._event?.ctrlKey || false;\n }\n\n public override get isComposing(): boolean {\n return this._event?.isComposing || false;\n }\n\n public override get key(): string {\n return this._event?.key || '';\n }\n\n public override get location(): number {\n return this._event?.location || 0;\n }\n\n public override get metaKey(): boolean {\n return this._event?.metaKey || false;\n }\n\n public override get repeat(): boolean {\n return this._event?.repeat || false;\n }\n\n public override get shiftKey(): boolean {\n return this._event?.shiftKey || false;\n }\n\n /**\n * Original `KeyboardEvent` that triggered this forwarded event,\n * exposed so listeners on the parent menu can call\n * `preventDefault()`/`stopPropagation()` on the underlying event.\n */\n public get nativeEvent(): KeyboardEvent | undefined {\n return this._event;\n }\n}\n\nexport type MenuItemChildren = { icon: Element[]; content: Node[] };\n\n/**\n * @element sp-menu-item\n *\n * @slot - text content to display within the Menu Item\n * @slot description - description to be placed below the label of the Menu Item\n * @slot icon - icon element to be placed at the start of the Menu Item\n * @slot value - content placed at the end of the Menu Item like values, keyboard shortcuts, etc.\n * @slot submenu - content placed in a submenu\n * @fires sp-menu-item-added - announces the item has been added so a parent menu can take ownerships\n */\nexport class MenuItem extends LikeAnchor(\n ObserveSlotText(ObserveSlotPresence(Focusable, '[slot=\"icon\"]'))\n) {\n public static override get styles(): CSSResultArray {\n return [menuItemStyles, checkmarkStyles, chevronStyles];\n }\n\n abortControllerSubmenu!: AbortController;\n\n /**\n * whether the menu item is active or has an active descendant\n */\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n private dependencyManager = new DependencyManagerController(this);\n\n /**\n * whether the menu item has keyboard focus\n */\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n /**\n * whether the menu item is selected\n */\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n /**\n * value of the menu item which is used for selection\n */\n @property({ type: String })\n public get value(): string {\n return this._value || this.itemText;\n }\n\n public set value(value: string) {\n if (value === this._value) {\n return;\n }\n this._value = value || '';\n if (this._value) {\n this.setAttribute('value', this._value);\n } else {\n this.removeAttribute('value');\n }\n }\n\n private _value = '';\n\n /**\n * @private\n * text content of the menu item minus whitespace\n */\n public get itemText(): string {\n return this.itemChildren.content.reduce(\n (acc, node) => acc + (node.textContent || '').trim(),\n ''\n );\n }\n\n /**\n * whether the menu item has a submenu\n */\n @property({ type: Boolean, reflect: true, attribute: 'has-submenu' })\n public hasSubmenu = false;\n\n @query('slot:not([name])')\n contentSlot!: HTMLSlotElement;\n\n @query('slot[name=\"icon\"]')\n iconSlot!: HTMLSlotElement;\n\n /**\n * whether menu item text content should not wrap\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'no-wrap',\n hasChanged() {\n return false;\n },\n })\n public noWrap = false;\n\n @query('.anchor')\n private anchorElement!: HTMLAnchorElement;\n\n @query('sp-overlay')\n public overlayElement!: Overlay;\n\n /**\n * Reference to the slotted submenu element, captured by `manageSubmenu`.\n * Public so the parent `<sp-menu>` can project this submenu for mobile\n * drill-down and so tests can assert on its contents.\n *\n * @internal\n */\n public submenuElement?: HTMLElement;\n\n /**\n * Set by the parent Menu when the submenu element is projected to the\n * mobile-submenu slot. Guards against `manageSubmenu` clearing\n * `hasSubmenu` when the slot appears empty during projection.\n * Cross-class implementation detail; do not depend on it from outside\n * the `@spectrum-web-components/menu` package.\n *\n * @internal\n */\n public _mobileSubmenuProjected = false;\n\n /**\n * the focusable element of the menu item\n */\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasIcon(): boolean {\n return this.slotContentIsPresent;\n }\n\n public get itemChildren(): MenuItemChildren {\n if (!this.iconSlot || !this.contentSlot) {\n return {\n icon: [],\n content: [],\n };\n }\n if (this._itemChildren) {\n return this._itemChildren;\n }\n const icon = this.iconSlot.assignedElements().map((element) => {\n const newElement = element.cloneNode(true) as HTMLElement;\n newElement.removeAttribute('slot');\n newElement.classList.toggle('icon');\n return newElement;\n });\n const content = this.contentSlot\n .assignedNodes()\n .map((node) => node.cloneNode(true));\n this._itemChildren = { icon, content };\n\n return this._itemChildren;\n }\n\n private _itemChildren?: MenuItemChildren;\n\n constructor() {\n super();\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n this.addEventListener('focus', this.handleFocus);\n this.addEventListener('blur', this.handleBlur);\n\n new MutationController(this, {\n config: {\n characterData: true,\n childList: true,\n subtree: true,\n attributeFilter: ['src'],\n },\n callback: (mutations) => {\n const isSubmenu = mutations.every(\n (mutation) => (mutation.target as HTMLElement).slot === 'submenu'\n );\n if (isSubmenu) {\n return;\n }\n this.breakItemChildrenCache();\n },\n });\n }\n\n /**\n * whether submenu is open\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * whether menu item's submenu is opened via keyboard\n */\n private _openedViaKeyboard = false;\n\n /**\n * whether menu item's submenu is closed via pointer leave\n */\n private _closedViaPointer = false;\n\n /**\n * Touch interaction state for submenu toggling\n */\n private _activePointerId?: number;\n private _touchHandledViaPointerup = false;\n private _touchAbortController?: AbortController;\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return false;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n }\n\n private handleSlottableRequest = (event: SlottableRequestEvent): void => {\n this.submenuElement?.dispatchEvent(\n new SlottableRequestEvent(event.name, event.data)\n );\n };\n\n private proxyFocus = (): void => {\n this.focus();\n };\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n }\n return handled;\n }\n\n protected breakItemChildrenCache(): void {\n this._itemChildren = undefined;\n this.triggerUpdate();\n }\n\n private get isMobileView(): boolean {\n return !!this._mobileRootMenu;\n }\n\n /**\n * Returns the root sp-menu with mobile-view, traversing up from\n * either the focusRoot or the DOM tree.\n */\n private get _mobileRootMenu(): Menu | null {\n const focusRoot = this.menuData.focusRoot;\n if (focusRoot?.mobileView) {\n return focusRoot;\n }\n return this.closest('sp-menu[mobile-view]') as Menu | null;\n }\n\n protected renderSubmenu(): TemplateResult {\n const slot = html`\n <slot\n name=\"submenu\"\n @slotchange=${this.manageSubmenu}\n @sp-menu-item-added-or-updated=${{\n handleEvent: (event: MenuItemAddedOrUpdatedEvent) => {\n event.clear(event.item);\n },\n capture: true,\n }}\n @focusin=${(event: Event) => event.stopPropagation()}\n ></slot>\n `;\n if (!this.hasSubmenu) {\n return slot;\n }\n\n if (this.isMobileView) {\n return html`\n <div class=\"mobile-submenu-slot-hidden\">${slot}</div>\n <sp-icon-chevron100\n class=\"spectrum-UIIcon-ChevronRight100 chevron icon\"\n ></sp-icon-chevron100>\n `;\n }\n\n this.dependencyManager.add('sp-overlay');\n this.dependencyManager.add('sp-popover');\n import('@spectrum-web-components/overlay/sp-overlay.js');\n import('@spectrum-web-components/popover/sp-popover.js');\n return html`\n <sp-overlay\n receives-focus=\"false\"\n .triggerElement=${this as HTMLElement}\n ?disabled=${!this.hasSubmenu}\n ?open=${this.hasSubmenu && this.open && this.dependencyManager.loaded}\n .placement=${this.dir === 'ltr' ? 'right-start' : 'left-start'}\n .offset=${[-10, 0] as [number, number]}\n .type=${'auto'}\n @close=${(event: Event) => event.stopPropagation()}\n @slottable-request=${this.handleSlottableRequest}\n >\n <sp-popover\n @change=${(event: Event) => {\n this.handleSubmenuChange(event);\n this.open = false;\n }}\n @pointerenter=${this.handleSubmenuPointerenter}\n @pointerleave=${this.handleSubmenuPointerleave}\n @sp-menu-item-added-or-updated=${(event: Event) =>\n event.stopPropagation()}\n >\n ${slot}\n </sp-popover>\n </sp-overlay>\n <sp-icon-chevron100\n class=\"spectrum-UIIcon-ChevronRight100 chevron icon\"\n ></sp-icon-chevron100>\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n ${this.selected\n ? html`\n <sp-icon-checkmark100\n id=\"selected\"\n class=\"spectrum-UIIcon-Checkmark100\n icon\n checkmark\n ${this.hasIcon\n ? 'checkmark--withAdjacentIcon'\n : ''}\"\n ></sp-icon-checkmark100>\n `\n : nothing}\n <slot name=\"icon\"></slot>\n <div id=\"label\">\n <slot id=\"slot\"></slot>\n </div>\n <slot name=\"description\"></slot>\n <slot name=\"value\"></slot>\n ${this.href && this.href.length > 0\n ? super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })\n : nothing}\n ${this.renderSubmenu()}\n `;\n }\n\n /**\n * Determines if item has a submenu and updates the `aria-haspopup` attribute.\n * Skips clearing state when the submenu is temporarily projected to the\n * parent Menu's mobile-submenu slot.\n */\n protected manageSubmenu(event: Event & { target: HTMLSlotElement }): void {\n const assigned = event.target.assignedElements({\n flatten: true,\n })[0] as HTMLElement | undefined;\n\n if (!assigned && this._mobileSubmenuProjected) {\n return;\n }\n\n this.submenuElement = assigned;\n this.hasSubmenu = !!this.submenuElement;\n if (this.hasSubmenu) {\n this.setAttribute('aria-haspopup', 'true');\n }\n }\n\n private handlePointerdown(event: PointerEvent): void {\n const path = event.composedPath();\n const targetIsInOverlay =\n this.overlayElement && path.includes(this.overlayElement);\n\n if (\n event.pointerType === 'touch' &&\n this.hasSubmenu &&\n !targetIsInOverlay &&\n this._activePointerId === undefined\n ) {\n this._activePointerId = event.pointerId;\n this._touchAbortController = new AbortController();\n\n window.addEventListener('pointerup', this.handleTouchSubmenuToggle, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n window.addEventListener('pointercancel', this.handleTouchCleanup, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n }\n\n if (\n !targetIsInOverlay &&\n this.hasSubmenu &&\n this.open &&\n event.pointerType !== 'touch'\n ) {\n this.addEventListener('focus', this.handleSubmenuFocus, {\n once: true,\n });\n this.overlayElement?.addEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n }\n\n private handleTouchSubmenuToggle = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n\n this._touchAbortController?.abort();\n this._touchHandledViaPointerup = true;\n this._activePointerId = undefined;\n\n if (this.isMobileView) {\n this._mobileRootMenu?.openMobileSubmenu(this);\n // Defer clearing the flag until after the synthetic `click`\n // dispatched by the same touch sequence has been handled, so\n // `handleSubmenuClick` can suppress that duplicate activation.\n setTimeout(() => {\n this._touchHandledViaPointerup = false;\n }, 0);\n return;\n }\n\n if (this.open) {\n this.open = false;\n } else {\n this.openOverlay();\n }\n\n // Same rationale as above: keep the suppression flag set through\n // the trailing `click` event before resetting it.\n setTimeout(() => {\n this._touchHandledViaPointerup = false;\n }, 0);\n };\n\n private handleTouchCleanup = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n };\n\n protected override firstUpdated(changes: PropertyValues): void {\n super.firstUpdated(changes);\n this.setAttribute('tabindex', '-1');\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('mouseover', this.handleMouseover);\n this.addEventListener('pointerdown', this.handlePointerdown);\n this.addEventListener('pointerenter', this.closeOverlaysForRoot);\n if (!this.hasAttribute('id')) {\n this.id = `sp-menu-item-${randomID()}`;\n }\n }\n\n private getActiveElementSafely(): HTMLElement | null {\n let root = this.getRootNode() as Document | ShadowRoot;\n let activeElement = root.activeElement as HTMLElement;\n\n // If no active element in current context and we're in shadow DOM,\n // traverse up to find the document-level active element\n if (!activeElement && root !== document) {\n while (root && root !== document && 'host' in root) {\n root = (root as ShadowRoot).host.getRootNode() as Document | ShadowRoot;\n activeElement = root.activeElement as HTMLElement;\n if (activeElement) {\n break;\n }\n }\n }\n\n return activeElement;\n }\n\n handleMouseover(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target === this) {\n // Check for active input elements across shadow boundaries\n const activeElement = this.getActiveElementSafely();\n\n // Only focus this menu item if no input element is currently active\n // This prevents interrupting user input in search boxes, text fields, etc.\n if (!activeElement || !this.isInputElement(activeElement)) {\n this.focus();\n }\n this.focused = false;\n }\n }\n\n /**\n * Determines if an element is an input field that should retain focus.\n * Uses multiple detection strategies to identify input elements generically.\n */\n private isInputElement(element: HTMLElement): boolean {\n // Check for native HTML input elements\n if (this.isNativeInputElement(element)) {\n return true;\n }\n\n // Check for contenteditable elements (rich text editors)\n if (element.contentEditable === 'true') {\n return true;\n }\n\n // Check for Spectrum Web Components with input-like behavior\n if (this.isSpectrumInputComponent(element)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if an element is a native HTML input element.\n */\n private isNativeInputElement(element: HTMLElement): boolean {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n );\n }\n\n /**\n * Checks if an element is a Spectrum Web Component with input behavior.\n * Uses ARIA roles and component patterns for generic detection.\n */\n private isSpectrumInputComponent(element: HTMLElement): boolean {\n // Check if it's a Spectrum Web Component\n if (!element.tagName.startsWith('SP-')) {\n return false;\n }\n\n // Check ARIA role for input-like behavior\n const role = element.getAttribute('role');\n const inputRoles = ['textbox', 'searchbox', 'combobox', 'slider'];\n if (role && inputRoles.includes(role)) {\n return true;\n }\n\n // Check for components that typically contain input elements\n // This covers components like sp-search, sp-textfield, sp-number-field, etc.\n const inputComponentPattern = INPUT_COMPONENT_PATTERN;\n if (inputComponentPattern.test(element.tagName)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * forward key info from keydown event to parent menu\n */\n handleKeydown = (event: KeyboardEvent): void => {\n const { target, key } = event;\n const openSubmenuKey =\n this.hasSubmenu && !this.open && [' ', 'Enter'].includes(key);\n // Forward the keydown when this item is the closest `sp-menu-item`\n // ancestor of the event target. That covers both focus on the item\n // itself and focus on any of its non-menu-item descendants (e.g.\n // the back-arrow icon inside a mobile back button), while\n // preventing a parent item from double-dispatching events that\n // originated inside its slotted submenu (whose menu items are\n // also descendants in the light DOM tree).\n const targetIsThisItem =\n target === this ||\n (target instanceof Element && target.closest('sp-menu-item') === this);\n if (targetIsThisItem) {\n if (\n ['ArrowLeft', 'ArrowRight', 'Escape'].includes(key) ||\n openSubmenuKey\n ) {\n event.preventDefault();\n }\n this.dispatchEvent(\n new MenuItemKeydownEvent({ root: this, event: event })\n );\n }\n };\n\n protected closeOverlaysForRoot(): void {\n if (this.open) {\n return;\n }\n this.menuData.parentMenu?.closeDescendentOverlays();\n }\n\n protected handleFocus(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = true;\n }\n }\n\n protected handleBlur(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = false;\n }\n }\n\n protected handleSubmenuClick(event: Event): void {\n if (this.isMobileView) {\n event.stopPropagation();\n event.preventDefault();\n this._mobileRootMenu?.openMobileSubmenu(this);\n return;\n }\n\n if (this._touchHandledViaPointerup) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n\n if (event.composedPath().includes(this.overlayElement)) {\n return;\n }\n\n this.openOverlay(true);\n }\n\n protected handleSubmenuFocus(): void {\n requestAnimationFrame(() => {\n // Wait till after `closeDescendentOverlays` has happened in Menu\n // to reopen (keep open) the direct descendent of this Menu Item\n this.overlayElement.open = this.open;\n this.focused = false;\n });\n }\n\n protected handleBeforetoggle = (event: Event): void => {\n if ((event as Event & { newState: string }).newState === 'closed') {\n this.open = true;\n this.overlayElement.manuallyKeepOpen();\n this.overlayElement.removeEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n };\n\n protected handlePointerenter(event: PointerEvent): void {\n if (event.pointerType === 'touch' || this.isMobileView) {\n return;\n }\n\n if (this.leaveTimeout) {\n clearTimeout(this.leaveTimeout);\n delete this.leaveTimeout;\n this.recentlyLeftChild = false;\n return;\n }\n this.focus();\n this.openOverlay();\n }\n\n protected leaveTimeout?: ReturnType<typeof setTimeout>;\n protected recentlyLeftChild = false;\n\n protected handlePointerleave(event: PointerEvent): void {\n // For touch devices, don't close on pointerleave - let click handle it\n if (event.pointerType === 'touch') {\n return;\n }\n\n this._closedViaPointer = true;\n if (this.open && !this.recentlyLeftChild) {\n this.leaveTimeout = setTimeout(() => {\n delete this.leaveTimeout;\n this.open = false;\n }, POINTERLEAVE_TIMEOUT);\n }\n }\n\n /**\n * When there is a `change` event in the submenu for this item\n * then we \"click\" this item to cascade the selection up the\n * menu tree allowing all submenus between the initial selection\n * and the root of the tree to have their selection changes and\n * be closed.\n */\n protected handleSubmenuChange(event: Event): void {\n event.stopPropagation();\n this.menuData.selectionRoot?.selectOrToggleItem(this);\n }\n\n protected handleSubmenuPointerenter(): void {\n this.recentlyLeftChild = true;\n }\n\n protected async handleSubmenuPointerleave(): Promise<void> {\n this.recentlyLeftChild = false;\n }\n\n protected handleSubmenuOpen(event: Event): void {\n const parentOverlay = event.composedPath().find((el) => {\n return (\n el !== this.overlayElement &&\n (el as HTMLElement).localName === 'sp-overlay'\n );\n }) as Overlay;\n if (this._openedViaKeyboard) {\n this.submenuElement?.focus();\n }\n this.overlayElement.parentOverlayToForceClose = parentOverlay;\n }\n\n protected cleanup(): void {\n this._closedViaPointer = false;\n this.setAttribute('aria-expanded', 'false');\n this.open = false;\n this.active = false;\n }\n\n public async openOverlay(shouldFocus: boolean = false): Promise<void> {\n if (!this.hasSubmenu || this.open || this.disabled) {\n return;\n }\n this.open = true;\n this.active = true;\n this.setAttribute('aria-expanded', 'true');\n this._openedViaKeyboard = shouldFocus;\n this.addEventListener('sp-closed', this.cleanup, {\n once: true,\n });\n }\n\n updateAriaSelected(): void {\n const role = this.getAttribute('role');\n if (role === 'option') {\n this.setAttribute('aria-selected', this.selected ? 'true' : 'false');\n } else if (role === 'menuitemcheckbox' || role === 'menuitemradio') {\n this.setAttribute('aria-checked', this.selected ? 'true' : 'false');\n }\n }\n\n public setRole(role: string): void {\n this.setAttribute('role', role);\n this.updateAriaSelected();\n }\n\n protected override willUpdate(changes: PropertyValues<this>): void {\n super.updated(changes);\n\n // make sure focus returns to the anchor element when submenu is closed\n if (\n changes.has('open') &&\n !this.open &&\n this.hasSubmenu &&\n !this._closedViaPointer &&\n this.matches(':focus-within')\n ) {\n this.focus();\n }\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (\n changes.has('label') &&\n (this.label || typeof changes.get('label') !== 'undefined')\n ) {\n this.setAttribute('aria-label', this.label || '');\n }\n if (\n changes.has('active') &&\n (this.active || typeof changes.get('active') !== 'undefined')\n ) {\n if (this.active) {\n this.menuData.selectionRoot?.closeDescendentOverlays();\n }\n }\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n if (changes.has('selected')) {\n this.updateAriaSelected();\n }\n if (\n changes.has('hasSubmenu') &&\n (this.hasSubmenu || typeof changes.get('hasSubmenu') !== 'undefined')\n ) {\n if (this.hasSubmenu) {\n this.abortControllerSubmenu = new AbortController();\n const options = { signal: this.abortControllerSubmenu.signal };\n this.addEventListener('click', this.handleSubmenuClick, options);\n this.addEventListener('pointerenter', this.handlePointerenter, options);\n this.addEventListener('pointerleave', this.handlePointerleave, options);\n this.addEventListener('sp-opened', this.handleSubmenuOpen, options);\n } else {\n this.abortControllerSubmenu?.abort();\n }\n }\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.triggerUpdate();\n }\n\n _parentElement!: HTMLElement;\n\n public override disconnectedCallback(): void {\n this.menuData.cleanupSteps.forEach((removal) => removal(this));\n this.menuData = {\n focusRoot: undefined,\n parentMenu: undefined,\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n\n // Clean up any active touch listeners\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n\n super.disconnectedCallback();\n }\n\n private willDispatchUpdate = false;\n\n public async triggerUpdate(): Promise<void> {\n if (this.willDispatchUpdate) {\n return;\n }\n this.willDispatchUpdate = true;\n await new Promise((ready) => requestAnimationFrame(ready));\n this.dispatchUpdate();\n }\n\n public override focus(): void {\n super.focus();\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('focus'));\n }\n\n public override blur(): void {\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('blur'));\n super.blur();\n }\n\n public dispatchUpdate(): void {\n if (!this.isConnected) {\n return;\n }\n this.dispatchEvent(new MenuItemAddedOrUpdatedEvent(this));\n this.willDispatchUpdate = false;\n }\n\n public menuData: {\n focusRoot?: Menu;\n parentMenu?: Menu;\n selectionRoot?: Menu;\n cleanupSteps: ((item: MenuItem) => void)[];\n } = {\n // menu that controls ArrowUp/ArrowDown navigation\n focusRoot: undefined,\n parentMenu: undefined,\n // menu or menu group that controls selection\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'sp-menu-item-added-or-updated': MenuItemAddedOrUpdatedEvent;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/src/MenuItem.js CHANGED
@@ -1,11 +1,16 @@
1
- "use strict";var c=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var r=(a,n,e,t)=>{for(var i=t>1?void 0:t?p(n,e):n,o=a.length-1,d;o>=0;o--)(d=a[o])&&(i=(t?d(n,e,i):d(i))||i);return t&&i&&c(n,e,i),i};import{MutationController as m}from"@lit-labs/observers/mutation-controller.js";import{html as l,INPUT_COMPONENT_PATTERN as v,nothing as h}from"@spectrum-web-components/base";import{property as s,query as u}from"@spectrum-web-components/base/src/decorators.js";import f from"@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js";import b from"@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js";import{SlottableRequestEvent as E}from"@spectrum-web-components/overlay/src/slottable-request-event.js";import{DependencyManagerController as y}from"@spectrum-web-components/reactive-controllers/src/DependencyManger.js";import{ObserveSlotPresence as g,ObserveSlotText as S,randomID as C}from"@spectrum-web-components/shared";import{Focusable as T}from"@spectrum-web-components/shared/src/focusable.js";import{LikeAnchor as P}from"@spectrum-web-components/shared/src/like-anchor.js";import"@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js";import"@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js";import _ from"./menu-item.css.js";const M=100;export class MenuItemAddedOrUpdatedEvent extends Event{constructor(e){super("sp-menu-item-added-or-updated",{bubbles:!0,composed:!0});this.menuCascade=new WeakMap;this.clear(e)}clear(e){this._item=e,this.currentAncestorWithSelects=void 0,e.menuData={cleanupSteps:[],focusRoot:void 0,selectionRoot:void 0,parentMenu:void 0},this.menuCascade=new WeakMap}get item(){return this._item}}export class MenuItemKeydownEvent extends KeyboardEvent{constructor({root:n,event:e}){super("sp-menu-item-keydown",{bubbles:!0,composed:!0}),this.root=n,this._event=e}get altKey(){var n;return((n=this._event)==null?void 0:n.altKey)||!1}get code(){var n;return((n=this._event)==null?void 0:n.code)||""}get ctrlKey(){var n;return((n=this._event)==null?void 0:n.ctrlKey)||!1}get isComposing(){var n;return((n=this._event)==null?void 0:n.isComposing)||!1}get key(){var n;return((n=this._event)==null?void 0:n.key)||""}get location(){var n;return((n=this._event)==null?void 0:n.location)||0}get metaKey(){var n;return((n=this._event)==null?void 0:n.metaKey)||!1}get repeat(){var n;return((n=this._event)==null?void 0:n.repeat)||!1}get shiftKey(){var n;return((n=this._event)==null?void 0:n.shiftKey)||!1}}export class MenuItem extends P(S(g(T,'[slot="icon"]'))){constructor(){super();this.active=!1;this.dependencyManager=new y(this);this.focused=!1;this.selected=!1;this._value="";this.hasSubmenu=!1;this.noWrap=!1;this.open=!1;this._openedViaKeyboard=!1;this._closedViaPointer=!1;this._touchHandledViaPointerup=!1;this.handleSlottableRequest=e=>{var t;(t=this.submenuElement)==null||t.dispatchEvent(new E(e.name,e.data))};this.proxyFocus=()=>{this.focus()};this.handleTouchSubmenuToggle=e=>{var t;e.pointerId===this._activePointerId&&((t=this._touchAbortController)==null||t.abort(),this._touchHandledViaPointerup=!0,this._activePointerId=void 0,this.open?this.open=!1:this.openOverlay(),setTimeout(()=>{this._touchHandledViaPointerup=!1},0))};this.handleTouchCleanup=e=>{var t;e.pointerId===this._activePointerId&&((t=this._touchAbortController)==null||t.abort(),this._activePointerId=void 0,this._touchHandledViaPointerup=!1)};this.handleKeydown=e=>{const{target:t,key:i}=e,o=this.hasSubmenu&&!this.open&&[" ","Enter"].includes(i);t===this&&((["ArrowLeft","ArrowRight","Escape"].includes(i)||o)&&e.preventDefault(),this.dispatchEvent(new MenuItemKeydownEvent({root:this,event:e})))};this.handleBeforetoggle=e=>{e.newState==="closed"&&(this.open=!0,this.overlayElement.manuallyKeepOpen(),this.overlayElement.removeEventListener("beforetoggle",this.handleBeforetoggle))};this.recentlyLeftChild=!1;this.willDispatchUpdate=!1;this.menuData={focusRoot:void 0,parentMenu:void 0,selectionRoot:void 0,cleanupSteps:[]};this.addEventListener("click",this.handleClickCapture,{capture:!0}),this.addEventListener("focus",this.handleFocus),this.addEventListener("blur",this.handleBlur),new m(this,{config:{characterData:!0,childList:!0,subtree:!0,attributeFilter:["src"]},callback:e=>{e.every(i=>i.target.slot==="submenu")||this.breakItemChildrenCache()}})}static get styles(){return[_,f,b]}get value(){return this._value||this.itemText}set value(e){e!==this._value&&(this._value=e||"",this._value?this.setAttribute("value",this._value):this.removeAttribute("value"))}get itemText(){return this.itemChildren.content.reduce((e,t)=>e+(t.textContent||"").trim(),"")}get focusElement(){return this}get hasIcon(){return this.slotContentIsPresent}get itemChildren(){if(!this.iconSlot||!this.contentSlot)return{icon:[],content:[]};if(this._itemChildren)return this._itemChildren;const e=this.iconSlot.assignedElements().map(i=>{const o=i.cloneNode(!0);return o.removeAttribute("slot"),o.classList.toggle("icon"),o}),t=this.contentSlot.assignedNodes().map(i=>i.cloneNode(!0));return this._itemChildren={icon:e,content:t},this._itemChildren}handleClickCapture(e){if(this.disabled)return e.preventDefault(),e.stopImmediatePropagation(),!1;this.shouldProxyClick()}shouldProxyClick(){let e=!1;return this.anchorElement&&(this.anchorElement.click(),e=!0),e}breakItemChildrenCache(){this._itemChildren=void 0,this.triggerUpdate()}renderSubmenu(){const e=l`
1
+ "use strict";var c=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var r=(a,i,e,t)=>{for(var n=t>1?void 0:t?p(i,e):i,o=a.length-1,u;o>=0;o--)(u=a[o])&&(n=(t?u(i,e,n):u(n))||n);return t&&n&&c(i,e,n),n};import{MutationController as m}from"@lit-labs/observers/mutation-controller.js";import{html as l,INPUT_COMPONENT_PATTERN as v,nothing as h}from"@spectrum-web-components/base";import{property as s,query as d}from"@spectrum-web-components/base/src/decorators.js";import b from"@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js";import f from"@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js";import{SlottableRequestEvent as E}from"@spectrum-web-components/overlay/src/slottable-request-event.js";import{DependencyManagerController as y}from"@spectrum-web-components/reactive-controllers/src/DependencyManger.js";import{ObserveSlotPresence as g,ObserveSlotText as S,randomID as C}from"@spectrum-web-components/shared";import{Focusable as M}from"@spectrum-web-components/shared/src/focusable.js";import{LikeAnchor as _}from"@spectrum-web-components/shared/src/like-anchor.js";import"@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js";import"@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js";import P from"./menu-item.css.js";const T=100;export class MenuItemAddedOrUpdatedEvent extends Event{constructor(e){super("sp-menu-item-added-or-updated",{bubbles:!0,composed:!0});this.menuCascade=new WeakMap;this.clear(e)}clear(e){this._item=e,this.currentAncestorWithSelects=void 0,e.menuData={cleanupSteps:[],focusRoot:void 0,selectionRoot:void 0,parentMenu:void 0},this.menuCascade=new WeakMap}get item(){return this._item}}export class MenuItemKeydownEvent extends KeyboardEvent{constructor({root:i,event:e}){super("sp-menu-item-keydown",{bubbles:!0,composed:!0}),this.root=i,this._event=e}get altKey(){var i;return((i=this._event)==null?void 0:i.altKey)||!1}get code(){var i;return((i=this._event)==null?void 0:i.code)||""}get ctrlKey(){var i;return((i=this._event)==null?void 0:i.ctrlKey)||!1}get isComposing(){var i;return((i=this._event)==null?void 0:i.isComposing)||!1}get key(){var i;return((i=this._event)==null?void 0:i.key)||""}get location(){var i;return((i=this._event)==null?void 0:i.location)||0}get metaKey(){var i;return((i=this._event)==null?void 0:i.metaKey)||!1}get repeat(){var i;return((i=this._event)==null?void 0:i.repeat)||!1}get shiftKey(){var i;return((i=this._event)==null?void 0:i.shiftKey)||!1}get nativeEvent(){return this._event}}export class MenuItem extends _(S(g(M,'[slot="icon"]'))){constructor(){super();this.active=!1;this.dependencyManager=new y(this);this.focused=!1;this.selected=!1;this._value="";this.hasSubmenu=!1;this.noWrap=!1;this._mobileSubmenuProjected=!1;this.open=!1;this._openedViaKeyboard=!1;this._closedViaPointer=!1;this._touchHandledViaPointerup=!1;this.handleSlottableRequest=e=>{var t;(t=this.submenuElement)==null||t.dispatchEvent(new E(e.name,e.data))};this.proxyFocus=()=>{this.focus()};this.handleTouchSubmenuToggle=e=>{var t,n;if(e.pointerId===this._activePointerId){if((t=this._touchAbortController)==null||t.abort(),this._touchHandledViaPointerup=!0,this._activePointerId=void 0,this.isMobileView){(n=this._mobileRootMenu)==null||n.openMobileSubmenu(this),setTimeout(()=>{this._touchHandledViaPointerup=!1},0);return}this.open?this.open=!1:this.openOverlay(),setTimeout(()=>{this._touchHandledViaPointerup=!1},0)}};this.handleTouchCleanup=e=>{var t;e.pointerId===this._activePointerId&&((t=this._touchAbortController)==null||t.abort(),this._activePointerId=void 0,this._touchHandledViaPointerup=!1)};this.handleKeydown=e=>{const{target:t,key:n}=e,o=this.hasSubmenu&&!this.open&&[" ","Enter"].includes(n);(t===this||t instanceof Element&&t.closest("sp-menu-item")===this)&&((["ArrowLeft","ArrowRight","Escape"].includes(n)||o)&&e.preventDefault(),this.dispatchEvent(new MenuItemKeydownEvent({root:this,event:e})))};this.handleBeforetoggle=e=>{e.newState==="closed"&&(this.open=!0,this.overlayElement.manuallyKeepOpen(),this.overlayElement.removeEventListener("beforetoggle",this.handleBeforetoggle))};this.recentlyLeftChild=!1;this.willDispatchUpdate=!1;this.menuData={focusRoot:void 0,parentMenu:void 0,selectionRoot:void 0,cleanupSteps:[]};this.addEventListener("click",this.handleClickCapture,{capture:!0}),this.addEventListener("focus",this.handleFocus),this.addEventListener("blur",this.handleBlur),new m(this,{config:{characterData:!0,childList:!0,subtree:!0,attributeFilter:["src"]},callback:e=>{e.every(n=>n.target.slot==="submenu")||this.breakItemChildrenCache()}})}static get styles(){return[P,b,f]}get value(){return this._value||this.itemText}set value(e){e!==this._value&&(this._value=e||"",this._value?this.setAttribute("value",this._value):this.removeAttribute("value"))}get itemText(){return this.itemChildren.content.reduce((e,t)=>e+(t.textContent||"").trim(),"")}get focusElement(){return this}get hasIcon(){return this.slotContentIsPresent}get itemChildren(){if(!this.iconSlot||!this.contentSlot)return{icon:[],content:[]};if(this._itemChildren)return this._itemChildren;const e=this.iconSlot.assignedElements().map(n=>{const o=n.cloneNode(!0);return o.removeAttribute("slot"),o.classList.toggle("icon"),o}),t=this.contentSlot.assignedNodes().map(n=>n.cloneNode(!0));return this._itemChildren={icon:e,content:t},this._itemChildren}handleClickCapture(e){if(this.disabled)return e.preventDefault(),e.stopImmediatePropagation(),!1;this.shouldProxyClick()}shouldProxyClick(){let e=!1;return this.anchorElement&&(this.anchorElement.click(),e=!0),e}breakItemChildrenCache(){this._itemChildren=void 0,this.triggerUpdate()}get isMobileView(){return!!this._mobileRootMenu}get _mobileRootMenu(){const e=this.menuData.focusRoot;return e!=null&&e.mobileView?e:this.closest("sp-menu[mobile-view]")}renderSubmenu(){const e=l`
2
2
  <slot
3
3
  name="submenu"
4
4
  @slotchange=${this.manageSubmenu}
5
5
  @sp-menu-item-added-or-updated=${{handleEvent:t=>{t.clear(t.item)},capture:!0}}
6
6
  @focusin=${t=>t.stopPropagation()}
7
7
  ></slot>
8
- `;return this.hasSubmenu?(this.dependencyManager.add("sp-overlay"),this.dependencyManager.add("sp-popover"),import("@spectrum-web-components/overlay/sp-overlay.js"),import("@spectrum-web-components/popover/sp-popover.js"),l`
8
+ `;return this.hasSubmenu?this.isMobileView?l`
9
+ <div class="mobile-submenu-slot-hidden">${e}</div>
10
+ <sp-icon-chevron100
11
+ class="spectrum-UIIcon-ChevronRight100 chevron icon"
12
+ ></sp-icon-chevron100>
13
+ `:(this.dependencyManager.add("sp-overlay"),this.dependencyManager.add("sp-popover"),import("@spectrum-web-components/overlay/sp-overlay.js"),import("@spectrum-web-components/popover/sp-popover.js"),l`
9
14
  <sp-overlay
10
15
  receives-focus="false"
11
16
  .triggerElement=${this}
@@ -47,5 +52,5 @@
47
52
  <slot name="value"></slot>
48
53
  ${this.href&&this.href.length>0?super.renderAnchor({id:"button",ariaHidden:!0,className:"button anchor hidden"}):h}
49
54
  ${this.renderSubmenu()}
50
- `}manageSubmenu(e){this.submenuElement=e.target.assignedElements({flatten:!0})[0],this.hasSubmenu=!!this.submenuElement,this.hasSubmenu&&this.setAttribute("aria-haspopup","true")}handlePointerdown(e){var o;const t=e.composedPath(),i=this.overlayElement&&t.includes(this.overlayElement);e.pointerType==="touch"&&this.hasSubmenu&&!i&&this._activePointerId===void 0&&(this._activePointerId=e.pointerId,this._touchAbortController=new AbortController,window.addEventListener("pointerup",this.handleTouchSubmenuToggle,{once:!0,signal:this._touchAbortController.signal}),window.addEventListener("pointercancel",this.handleTouchCleanup,{once:!0,signal:this._touchAbortController.signal})),!i&&this.hasSubmenu&&this.open&&e.pointerType!=="touch"&&(this.addEventListener("focus",this.handleSubmenuFocus,{once:!0}),(o=this.overlayElement)==null||o.addEventListener("beforetoggle",this.handleBeforetoggle))}firstUpdated(e){super.firstUpdated(e),this.setAttribute("tabindex","-1"),this.addEventListener("keydown",this.handleKeydown),this.addEventListener("mouseover",this.handleMouseover),this.addEventListener("pointerdown",this.handlePointerdown),this.addEventListener("pointerenter",this.closeOverlaysForRoot),this.hasAttribute("id")||(this.id=`sp-menu-item-${C()}`)}getActiveElementSafely(){let e=this.getRootNode(),t=e.activeElement;if(!t&&e!==document)for(;e&&e!==document&&"host"in e&&(e=e.host.getRootNode(),t=e.activeElement,!t););return t}handleMouseover(e){if(e.target===this){const i=this.getActiveElementSafely();(!i||!this.isInputElement(i))&&this.focus(),this.focused=!1}}isInputElement(e){return!!(this.isNativeInputElement(e)||e.contentEditable==="true"||this.isSpectrumInputComponent(e))}isNativeInputElement(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement}isSpectrumInputComponent(e){if(!e.tagName.startsWith("SP-"))return!1;const t=e.getAttribute("role");return!!(t&&["textbox","searchbox","combobox","slider"].includes(t)||v.test(e.tagName))}closeOverlaysForRoot(){var e;this.open||(e=this.menuData.parentMenu)==null||e.closeDescendentOverlays()}handleFocus(e){const{target:t}=e;t===this&&(this.focused=!0)}handleBlur(e){const{target:t}=e;t===this&&(this.focused=!1)}handleSubmenuClick(e){if(this._touchHandledViaPointerup){e.stopPropagation(),e.preventDefault();return}e.composedPath().includes(this.overlayElement)||this.openOverlay(!0)}handleSubmenuFocus(){requestAnimationFrame(()=>{this.overlayElement.open=this.open,this.focused=!1})}handlePointerenter(e){if(e.pointerType!=="touch"){if(this.leaveTimeout){clearTimeout(this.leaveTimeout),delete this.leaveTimeout,this.recentlyLeftChild=!1;return}this.focus(),this.openOverlay()}}handlePointerleave(e){e.pointerType!=="touch"&&(this._closedViaPointer=!0,this.open&&!this.recentlyLeftChild&&(this.leaveTimeout=setTimeout(()=>{delete this.leaveTimeout,this.open=!1},M)))}handleSubmenuChange(e){var t;e.stopPropagation(),(t=this.menuData.selectionRoot)==null||t.selectOrToggleItem(this)}handleSubmenuPointerenter(){this.recentlyLeftChild=!0}async handleSubmenuPointerleave(){this.recentlyLeftChild=!1}handleSubmenuOpen(e){var i;const t=e.composedPath().find(o=>o!==this.overlayElement&&o.localName==="sp-overlay");this._openedViaKeyboard&&((i=this.submenuElement)==null||i.focus()),this.overlayElement.parentOverlayToForceClose=t}cleanup(){this._closedViaPointer=!1,this.setAttribute("aria-expanded","false"),this.open=!1,this.active=!1}async openOverlay(e=!1){!this.hasSubmenu||this.open||this.disabled||(this.open=!0,this.active=!0,this.setAttribute("aria-expanded","true"),this._openedViaKeyboard=e,this.addEventListener("sp-closed",this.cleanup,{once:!0}))}updateAriaSelected(){const e=this.getAttribute("role");e==="option"?this.setAttribute("aria-selected",this.selected?"true":"false"):(e==="menuitemcheckbox"||e==="menuitemradio")&&this.setAttribute("aria-checked",this.selected?"true":"false")}setRole(e){this.setAttribute("role",e),this.updateAriaSelected()}willUpdate(e){super.updated(e),e.has("open")&&!this.open&&this.hasSubmenu&&!this._closedViaPointer&&this.matches(":focus-within")&&this.focus()}updated(e){var t,i;if(super.updated(e),e.has("label")&&(this.label||typeof e.get("label")!="undefined")&&this.setAttribute("aria-label",this.label||""),e.has("active")&&(this.active||typeof e.get("active")!="undefined")&&this.active&&((t=this.menuData.selectionRoot)==null||t.closeDescendentOverlays()),this.anchorElement&&(this.anchorElement.addEventListener("focus",this.proxyFocus),this.anchorElement.tabIndex=-1),e.has("selected")&&this.updateAriaSelected(),e.has("hasSubmenu")&&(this.hasSubmenu||typeof e.get("hasSubmenu")!="undefined"))if(this.hasSubmenu){this.abortControllerSubmenu=new AbortController;const o={signal:this.abortControllerSubmenu.signal};this.addEventListener("click",this.handleSubmenuClick,o),this.addEventListener("pointerenter",this.handlePointerenter,o),this.addEventListener("pointerleave",this.handlePointerleave,o),this.addEventListener("sp-opened",this.handleSubmenuOpen,o)}else(i=this.abortControllerSubmenu)==null||i.abort()}connectedCallback(){super.connectedCallback(),this.triggerUpdate()}disconnectedCallback(){var e;this.menuData.cleanupSteps.forEach(t=>t(this)),this.menuData={focusRoot:void 0,parentMenu:void 0,selectionRoot:void 0,cleanupSteps:[]},(e=this._touchAbortController)==null||e.abort(),this._activePointerId=void 0,this._touchHandledViaPointerup=!1,super.disconnectedCallback()}async triggerUpdate(){this.willDispatchUpdate||(this.willDispatchUpdate=!0,await new Promise(e=>requestAnimationFrame(e)),this.dispatchUpdate())}focus(){super.focus(),this.dispatchEvent(new FocusEvent("focus"))}blur(){this.dispatchEvent(new FocusEvent("blur")),super.blur()}dispatchUpdate(){this.isConnected&&(this.dispatchEvent(new MenuItemAddedOrUpdatedEvent(this)),this.willDispatchUpdate=!1)}}r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"active",2),r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"focused",2),r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"selected",2),r([s({type:String})],MenuItem.prototype,"value",1),r([s({type:Boolean,reflect:!0,attribute:"has-submenu"})],MenuItem.prototype,"hasSubmenu",2),r([u("slot:not([name])")],MenuItem.prototype,"contentSlot",2),r([u('slot[name="icon"]')],MenuItem.prototype,"iconSlot",2),r([s({type:Boolean,reflect:!0,attribute:"no-wrap",hasChanged(){return!1}})],MenuItem.prototype,"noWrap",2),r([u(".anchor")],MenuItem.prototype,"anchorElement",2),r([u("sp-overlay")],MenuItem.prototype,"overlayElement",2),r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"open",2);
55
+ `}manageSubmenu(e){const t=e.target.assignedElements({flatten:!0})[0];!t&&this._mobileSubmenuProjected||(this.submenuElement=t,this.hasSubmenu=!!this.submenuElement,this.hasSubmenu&&this.setAttribute("aria-haspopup","true"))}handlePointerdown(e){var o;const t=e.composedPath(),n=this.overlayElement&&t.includes(this.overlayElement);e.pointerType==="touch"&&this.hasSubmenu&&!n&&this._activePointerId===void 0&&(this._activePointerId=e.pointerId,this._touchAbortController=new AbortController,window.addEventListener("pointerup",this.handleTouchSubmenuToggle,{once:!0,signal:this._touchAbortController.signal}),window.addEventListener("pointercancel",this.handleTouchCleanup,{once:!0,signal:this._touchAbortController.signal})),!n&&this.hasSubmenu&&this.open&&e.pointerType!=="touch"&&(this.addEventListener("focus",this.handleSubmenuFocus,{once:!0}),(o=this.overlayElement)==null||o.addEventListener("beforetoggle",this.handleBeforetoggle))}firstUpdated(e){super.firstUpdated(e),this.setAttribute("tabindex","-1"),this.addEventListener("keydown",this.handleKeydown),this.addEventListener("mouseover",this.handleMouseover),this.addEventListener("pointerdown",this.handlePointerdown),this.addEventListener("pointerenter",this.closeOverlaysForRoot),this.hasAttribute("id")||(this.id=`sp-menu-item-${C()}`)}getActiveElementSafely(){let e=this.getRootNode(),t=e.activeElement;if(!t&&e!==document)for(;e&&e!==document&&"host"in e&&(e=e.host.getRootNode(),t=e.activeElement,!t););return t}handleMouseover(e){if(e.target===this){const n=this.getActiveElementSafely();(!n||!this.isInputElement(n))&&this.focus(),this.focused=!1}}isInputElement(e){return!!(this.isNativeInputElement(e)||e.contentEditable==="true"||this.isSpectrumInputComponent(e))}isNativeInputElement(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement}isSpectrumInputComponent(e){if(!e.tagName.startsWith("SP-"))return!1;const t=e.getAttribute("role");return!!(t&&["textbox","searchbox","combobox","slider"].includes(t)||v.test(e.tagName))}closeOverlaysForRoot(){var e;this.open||(e=this.menuData.parentMenu)==null||e.closeDescendentOverlays()}handleFocus(e){const{target:t}=e;t===this&&(this.focused=!0)}handleBlur(e){const{target:t}=e;t===this&&(this.focused=!1)}handleSubmenuClick(e){var t;if(this.isMobileView){e.stopPropagation(),e.preventDefault(),(t=this._mobileRootMenu)==null||t.openMobileSubmenu(this);return}if(this._touchHandledViaPointerup){e.stopPropagation(),e.preventDefault();return}e.composedPath().includes(this.overlayElement)||this.openOverlay(!0)}handleSubmenuFocus(){requestAnimationFrame(()=>{this.overlayElement.open=this.open,this.focused=!1})}handlePointerenter(e){if(!(e.pointerType==="touch"||this.isMobileView)){if(this.leaveTimeout){clearTimeout(this.leaveTimeout),delete this.leaveTimeout,this.recentlyLeftChild=!1;return}this.focus(),this.openOverlay()}}handlePointerleave(e){e.pointerType!=="touch"&&(this._closedViaPointer=!0,this.open&&!this.recentlyLeftChild&&(this.leaveTimeout=setTimeout(()=>{delete this.leaveTimeout,this.open=!1},T)))}handleSubmenuChange(e){var t;e.stopPropagation(),(t=this.menuData.selectionRoot)==null||t.selectOrToggleItem(this)}handleSubmenuPointerenter(){this.recentlyLeftChild=!0}async handleSubmenuPointerleave(){this.recentlyLeftChild=!1}handleSubmenuOpen(e){var n;const t=e.composedPath().find(o=>o!==this.overlayElement&&o.localName==="sp-overlay");this._openedViaKeyboard&&((n=this.submenuElement)==null||n.focus()),this.overlayElement.parentOverlayToForceClose=t}cleanup(){this._closedViaPointer=!1,this.setAttribute("aria-expanded","false"),this.open=!1,this.active=!1}async openOverlay(e=!1){!this.hasSubmenu||this.open||this.disabled||(this.open=!0,this.active=!0,this.setAttribute("aria-expanded","true"),this._openedViaKeyboard=e,this.addEventListener("sp-closed",this.cleanup,{once:!0}))}updateAriaSelected(){const e=this.getAttribute("role");e==="option"?this.setAttribute("aria-selected",this.selected?"true":"false"):(e==="menuitemcheckbox"||e==="menuitemradio")&&this.setAttribute("aria-checked",this.selected?"true":"false")}setRole(e){this.setAttribute("role",e),this.updateAriaSelected()}willUpdate(e){super.updated(e),e.has("open")&&!this.open&&this.hasSubmenu&&!this._closedViaPointer&&this.matches(":focus-within")&&this.focus()}updated(e){var t,n;if(super.updated(e),e.has("label")&&(this.label||typeof e.get("label")!="undefined")&&this.setAttribute("aria-label",this.label||""),e.has("active")&&(this.active||typeof e.get("active")!="undefined")&&this.active&&((t=this.menuData.selectionRoot)==null||t.closeDescendentOverlays()),this.anchorElement&&(this.anchorElement.addEventListener("focus",this.proxyFocus),this.anchorElement.tabIndex=-1),e.has("selected")&&this.updateAriaSelected(),e.has("hasSubmenu")&&(this.hasSubmenu||typeof e.get("hasSubmenu")!="undefined"))if(this.hasSubmenu){this.abortControllerSubmenu=new AbortController;const o={signal:this.abortControllerSubmenu.signal};this.addEventListener("click",this.handleSubmenuClick,o),this.addEventListener("pointerenter",this.handlePointerenter,o),this.addEventListener("pointerleave",this.handlePointerleave,o),this.addEventListener("sp-opened",this.handleSubmenuOpen,o)}else(n=this.abortControllerSubmenu)==null||n.abort()}connectedCallback(){super.connectedCallback(),this.triggerUpdate()}disconnectedCallback(){var e;this.menuData.cleanupSteps.forEach(t=>t(this)),this.menuData={focusRoot:void 0,parentMenu:void 0,selectionRoot:void 0,cleanupSteps:[]},(e=this._touchAbortController)==null||e.abort(),this._activePointerId=void 0,this._touchHandledViaPointerup=!1,super.disconnectedCallback()}async triggerUpdate(){this.willDispatchUpdate||(this.willDispatchUpdate=!0,await new Promise(e=>requestAnimationFrame(e)),this.dispatchUpdate())}focus(){super.focus(),this.dispatchEvent(new FocusEvent("focus"))}blur(){this.dispatchEvent(new FocusEvent("blur")),super.blur()}dispatchUpdate(){this.isConnected&&(this.dispatchEvent(new MenuItemAddedOrUpdatedEvent(this)),this.willDispatchUpdate=!1)}}r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"active",2),r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"focused",2),r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"selected",2),r([s({type:String})],MenuItem.prototype,"value",1),r([s({type:Boolean,reflect:!0,attribute:"has-submenu"})],MenuItem.prototype,"hasSubmenu",2),r([d("slot:not([name])")],MenuItem.prototype,"contentSlot",2),r([d('slot[name="icon"]')],MenuItem.prototype,"iconSlot",2),r([s({type:Boolean,reflect:!0,attribute:"no-wrap",hasChanged(){return!1}})],MenuItem.prototype,"noWrap",2),r([d(".anchor")],MenuItem.prototype,"anchorElement",2),r([d("sp-overlay")],MenuItem.prototype,"overlayElement",2),r([s({type:Boolean,reflect:!0})],MenuItem.prototype,"open",2);
51
56
  //# sourceMappingURL=MenuItem.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["MenuItem.ts"],
4
- "sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\n\nimport {\n CSSResultArray,\n html,\n INPUT_COMPONENT_PATTERN,\n nothing,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\nimport chevronStyles from '@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js';\nimport type { Overlay } from '@spectrum-web-components/overlay';\nimport { SlottableRequestEvent } from '@spectrum-web-components/overlay/src/slottable-request-event.js';\nimport { DependencyManagerController } from '@spectrum-web-components/reactive-controllers/src/DependencyManger.js';\nimport {\n ObserveSlotPresence,\n ObserveSlotText,\n randomID,\n} from '@spectrum-web-components/shared';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\n\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';\n\nimport type { Menu } from './Menu.js';\nimport menuItemStyles from './menu-item.css.js';\n\n/**\n * Duration during which a pointing device can leave an `<sp-menu-item>` element\n * and return to it or to the submenu opened from it before closing that submenu.\n **/\nconst POINTERLEAVE_TIMEOUT = 100;\n\ntype MenuCascadeItem = {\n hadFocusRoot: boolean;\n ancestorWithSelects?: HTMLElement;\n};\n\n/**\n * Fires when a menu item is added or updated so that a parent menu can track it.\n */\nexport class MenuItemAddedOrUpdatedEvent extends Event {\n constructor(item: MenuItem) {\n super('sp-menu-item-added-or-updated', {\n bubbles: true,\n composed: true,\n });\n this.clear(item);\n }\n clear(item: MenuItem): void {\n this._item = item;\n this.currentAncestorWithSelects = undefined;\n item.menuData = {\n cleanupSteps: [],\n focusRoot: undefined,\n selectionRoot: undefined,\n parentMenu: undefined,\n };\n this.menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n }\n menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n get item(): MenuItem {\n return this._item;\n }\n private _item!: MenuItem;\n currentAncestorWithSelects?: Menu;\n}\n\n/**\n * Fires to forward keyboard event information to parent menu.\n */\nexport class MenuItemKeydownEvent extends KeyboardEvent {\n root?: MenuItem;\n private _event?: KeyboardEvent;\n constructor({ root, event }: { root?: MenuItem; event?: KeyboardEvent }) {\n super('sp-menu-item-keydown', { bubbles: true, composed: true });\n this.root = root;\n this._event = event;\n }\n\n public override get altKey(): boolean {\n return this._event?.altKey || false;\n }\n\n public override get code(): string {\n return this._event?.code || '';\n }\n\n public override get ctrlKey(): boolean {\n return this._event?.ctrlKey || false;\n }\n\n public override get isComposing(): boolean {\n return this._event?.isComposing || false;\n }\n\n public override get key(): string {\n return this._event?.key || '';\n }\n\n public override get location(): number {\n return this._event?.location || 0;\n }\n\n public override get metaKey(): boolean {\n return this._event?.metaKey || false;\n }\n\n public override get repeat(): boolean {\n return this._event?.repeat || false;\n }\n\n public override get shiftKey(): boolean {\n return this._event?.shiftKey || false;\n }\n}\n\nexport type MenuItemChildren = { icon: Element[]; content: Node[] };\n\n/**\n * @element sp-menu-item\n *\n * @slot - text content to display within the Menu Item\n * @slot description - description to be placed below the label of the Menu Item\n * @slot icon - icon element to be placed at the start of the Menu Item\n * @slot value - content placed at the end of the Menu Item like values, keyboard shortcuts, etc.\n * @slot submenu - content placed in a submenu\n * @fires sp-menu-item-added - announces the item has been added so a parent menu can take ownerships\n */\nexport class MenuItem extends LikeAnchor(\n ObserveSlotText(ObserveSlotPresence(Focusable, '[slot=\"icon\"]'))\n) {\n public static override get styles(): CSSResultArray {\n return [menuItemStyles, checkmarkStyles, chevronStyles];\n }\n\n abortControllerSubmenu!: AbortController;\n\n /**\n * whether the menu item is active or has an active descendant\n */\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n private dependencyManager = new DependencyManagerController(this);\n\n /**\n * whether the menu item has keyboard focus\n */\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n /**\n * whether the menu item is selected\n */\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n /**\n * value of the menu item which is used for selection\n */\n @property({ type: String })\n public get value(): string {\n return this._value || this.itemText;\n }\n\n public set value(value: string) {\n if (value === this._value) {\n return;\n }\n this._value = value || '';\n if (this._value) {\n this.setAttribute('value', this._value);\n } else {\n this.removeAttribute('value');\n }\n }\n\n private _value = '';\n\n /**\n * @private\n * text content of the menu item minus whitespace\n */\n public get itemText(): string {\n return this.itemChildren.content.reduce(\n (acc, node) => acc + (node.textContent || '').trim(),\n ''\n );\n }\n\n /**\n * whether the menu item has a submenu\n */\n @property({ type: Boolean, reflect: true, attribute: 'has-submenu' })\n public hasSubmenu = false;\n\n @query('slot:not([name])')\n contentSlot!: HTMLSlotElement;\n\n @query('slot[name=\"icon\"]')\n iconSlot!: HTMLSlotElement;\n\n /**\n * whether menu item text content should not wrap\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'no-wrap',\n hasChanged() {\n return false;\n },\n })\n public noWrap = false;\n\n @query('.anchor')\n private anchorElement!: HTMLAnchorElement;\n\n @query('sp-overlay')\n public overlayElement!: Overlay;\n\n private submenuElement?: HTMLElement;\n\n /**\n * the focusable element of the menu item\n */\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasIcon(): boolean {\n return this.slotContentIsPresent;\n }\n\n public get itemChildren(): MenuItemChildren {\n if (!this.iconSlot || !this.contentSlot) {\n return {\n icon: [],\n content: [],\n };\n }\n if (this._itemChildren) {\n return this._itemChildren;\n }\n const icon = this.iconSlot.assignedElements().map((element) => {\n const newElement = element.cloneNode(true) as HTMLElement;\n newElement.removeAttribute('slot');\n newElement.classList.toggle('icon');\n return newElement;\n });\n const content = this.contentSlot\n .assignedNodes()\n .map((node) => node.cloneNode(true));\n this._itemChildren = { icon, content };\n\n return this._itemChildren;\n }\n\n private _itemChildren?: MenuItemChildren;\n\n constructor() {\n super();\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n this.addEventListener('focus', this.handleFocus);\n this.addEventListener('blur', this.handleBlur);\n\n new MutationController(this, {\n config: {\n characterData: true,\n childList: true,\n subtree: true,\n attributeFilter: ['src'],\n },\n callback: (mutations) => {\n const isSubmenu = mutations.every(\n (mutation) => (mutation.target as HTMLElement).slot === 'submenu'\n );\n if (isSubmenu) {\n return;\n }\n this.breakItemChildrenCache();\n },\n });\n }\n\n /**\n * whether submenu is open\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * whether menu item's submenu is opened via keyboard\n */\n private _openedViaKeyboard = false;\n\n /**\n * whether menu item's submenu is closed via pointer leave\n */\n private _closedViaPointer = false;\n\n /**\n * Touch interaction state for submenu toggling\n */\n private _activePointerId?: number;\n private _touchHandledViaPointerup = false;\n private _touchAbortController?: AbortController;\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return false;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n }\n\n private handleSlottableRequest = (event: SlottableRequestEvent): void => {\n this.submenuElement?.dispatchEvent(\n new SlottableRequestEvent(event.name, event.data)\n );\n };\n\n private proxyFocus = (): void => {\n this.focus();\n };\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n }\n return handled;\n }\n\n protected breakItemChildrenCache(): void {\n this._itemChildren = undefined;\n this.triggerUpdate();\n }\n\n protected renderSubmenu(): TemplateResult {\n const slot = html`\n <slot\n name=\"submenu\"\n @slotchange=${this.manageSubmenu}\n @sp-menu-item-added-or-updated=${{\n handleEvent: (event: MenuItemAddedOrUpdatedEvent) => {\n event.clear(event.item);\n },\n capture: true,\n }}\n @focusin=${(event: Event) => event.stopPropagation()}\n ></slot>\n `;\n if (!this.hasSubmenu) {\n return slot;\n }\n this.dependencyManager.add('sp-overlay');\n this.dependencyManager.add('sp-popover');\n import('@spectrum-web-components/overlay/sp-overlay.js');\n import('@spectrum-web-components/popover/sp-popover.js');\n return html`\n <sp-overlay\n receives-focus=\"false\"\n .triggerElement=${this as HTMLElement}\n ?disabled=${!this.hasSubmenu}\n ?open=${this.hasSubmenu && this.open && this.dependencyManager.loaded}\n .placement=${this.dir === 'ltr' ? 'right-start' : 'left-start'}\n .offset=${[-10, 0] as [number, number]}\n .type=${'auto'}\n @close=${(event: Event) => event.stopPropagation()}\n @slottable-request=${this.handleSlottableRequest}\n >\n <sp-popover\n @change=${(event: Event) => {\n this.handleSubmenuChange(event);\n this.open = false;\n }}\n @pointerenter=${this.handleSubmenuPointerenter}\n @pointerleave=${this.handleSubmenuPointerleave}\n @sp-menu-item-added-or-updated=${(event: Event) =>\n event.stopPropagation()}\n >\n ${slot}\n </sp-popover>\n </sp-overlay>\n <sp-icon-chevron100\n class=\"spectrum-UIIcon-ChevronRight100 chevron icon\"\n ></sp-icon-chevron100>\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n ${this.selected\n ? html`\n <sp-icon-checkmark100\n id=\"selected\"\n class=\"spectrum-UIIcon-Checkmark100\n icon\n checkmark\n ${this.hasIcon\n ? 'checkmark--withAdjacentIcon'\n : ''}\"\n ></sp-icon-checkmark100>\n `\n : nothing}\n <slot name=\"icon\"></slot>\n <div id=\"label\">\n <slot id=\"slot\"></slot>\n </div>\n <slot name=\"description\"></slot>\n <slot name=\"value\"></slot>\n ${this.href && this.href.length > 0\n ? super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })\n : nothing}\n ${this.renderSubmenu()}\n `;\n }\n\n /**\n * determines if item has a submenu and updates the `aria-haspopup` attribute\n */\n protected manageSubmenu(event: Event & { target: HTMLSlotElement }): void {\n this.submenuElement = event.target.assignedElements({\n flatten: true,\n })[0] as HTMLElement;\n this.hasSubmenu = !!this.submenuElement;\n if (this.hasSubmenu) {\n this.setAttribute('aria-haspopup', 'true');\n }\n }\n\n private handlePointerdown(event: PointerEvent): void {\n const path = event.composedPath();\n const targetIsInOverlay =\n this.overlayElement && path.includes(this.overlayElement);\n\n if (\n event.pointerType === 'touch' &&\n this.hasSubmenu &&\n !targetIsInOverlay &&\n this._activePointerId === undefined\n ) {\n this._activePointerId = event.pointerId;\n this._touchAbortController = new AbortController();\n\n window.addEventListener('pointerup', this.handleTouchSubmenuToggle, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n window.addEventListener('pointercancel', this.handleTouchCleanup, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n }\n\n if (\n !targetIsInOverlay &&\n this.hasSubmenu &&\n this.open &&\n event.pointerType !== 'touch'\n ) {\n this.addEventListener('focus', this.handleSubmenuFocus, {\n once: true,\n });\n this.overlayElement?.addEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n }\n\n private handleTouchSubmenuToggle = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n\n this._touchAbortController?.abort();\n this._touchHandledViaPointerup = true;\n this._activePointerId = undefined;\n\n if (this.open) {\n this.open = false;\n } else {\n this.openOverlay();\n }\n\n setTimeout(() => {\n this._touchHandledViaPointerup = false;\n }, 0);\n };\n\n private handleTouchCleanup = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n };\n\n protected override firstUpdated(changes: PropertyValues): void {\n super.firstUpdated(changes);\n this.setAttribute('tabindex', '-1');\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('mouseover', this.handleMouseover);\n this.addEventListener('pointerdown', this.handlePointerdown);\n this.addEventListener('pointerenter', this.closeOverlaysForRoot);\n if (!this.hasAttribute('id')) {\n this.id = `sp-menu-item-${randomID()}`;\n }\n }\n\n private getActiveElementSafely(): HTMLElement | null {\n let root = this.getRootNode() as Document | ShadowRoot;\n let activeElement = root.activeElement as HTMLElement;\n\n // If no active element in current context and we're in shadow DOM,\n // traverse up to find the document-level active element\n if (!activeElement && root !== document) {\n while (root && root !== document && 'host' in root) {\n root = (root as ShadowRoot).host.getRootNode() as Document | ShadowRoot;\n activeElement = root.activeElement as HTMLElement;\n if (activeElement) {\n break;\n }\n }\n }\n\n return activeElement;\n }\n\n handleMouseover(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target === this) {\n // Check for active input elements across shadow boundaries\n const activeElement = this.getActiveElementSafely();\n\n // Only focus this menu item if no input element is currently active\n // This prevents interrupting user input in search boxes, text fields, etc.\n if (!activeElement || !this.isInputElement(activeElement)) {\n this.focus();\n }\n this.focused = false;\n }\n }\n\n /**\n * Determines if an element is an input field that should retain focus.\n * Uses multiple detection strategies to identify input elements generically.\n */\n private isInputElement(element: HTMLElement): boolean {\n // Check for native HTML input elements\n if (this.isNativeInputElement(element)) {\n return true;\n }\n\n // Check for contenteditable elements (rich text editors)\n if (element.contentEditable === 'true') {\n return true;\n }\n\n // Check for Spectrum Web Components with input-like behavior\n if (this.isSpectrumInputComponent(element)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if an element is a native HTML input element.\n */\n private isNativeInputElement(element: HTMLElement): boolean {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n );\n }\n\n /**\n * Checks if an element is a Spectrum Web Component with input behavior.\n * Uses ARIA roles and component patterns for generic detection.\n */\n private isSpectrumInputComponent(element: HTMLElement): boolean {\n // Check if it's a Spectrum Web Component\n if (!element.tagName.startsWith('SP-')) {\n return false;\n }\n\n // Check ARIA role for input-like behavior\n const role = element.getAttribute('role');\n const inputRoles = ['textbox', 'searchbox', 'combobox', 'slider'];\n if (role && inputRoles.includes(role)) {\n return true;\n }\n\n // Check for components that typically contain input elements\n // This covers components like sp-search, sp-textfield, sp-number-field, etc.\n const inputComponentPattern = INPUT_COMPONENT_PATTERN;\n if (inputComponentPattern.test(element.tagName)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * forward key info from keydown event to parent menu\n */\n handleKeydown = (event: KeyboardEvent): void => {\n const { target, key } = event;\n const openSubmenuKey =\n this.hasSubmenu && !this.open && [' ', 'Enter'].includes(key);\n if (target === this) {\n if (\n ['ArrowLeft', 'ArrowRight', 'Escape'].includes(key) ||\n openSubmenuKey\n ) {\n event.preventDefault();\n }\n this.dispatchEvent(\n new MenuItemKeydownEvent({ root: this, event: event })\n );\n }\n };\n\n protected closeOverlaysForRoot(): void {\n if (this.open) {\n return;\n }\n this.menuData.parentMenu?.closeDescendentOverlays();\n }\n\n protected handleFocus(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = true;\n }\n }\n\n protected handleBlur(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = false;\n }\n }\n\n protected handleSubmenuClick(event: Event): void {\n if (this._touchHandledViaPointerup) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n\n if (event.composedPath().includes(this.overlayElement)) {\n return;\n }\n\n this.openOverlay(true);\n }\n\n protected handleSubmenuFocus(): void {\n requestAnimationFrame(() => {\n // Wait till after `closeDescendentOverlays` has happened in Menu\n // to reopen (keep open) the direct descendent of this Menu Item\n this.overlayElement.open = this.open;\n this.focused = false;\n });\n }\n\n protected handleBeforetoggle = (event: Event): void => {\n if ((event as Event & { newState: string }).newState === 'closed') {\n this.open = true;\n this.overlayElement.manuallyKeepOpen();\n this.overlayElement.removeEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n };\n\n protected handlePointerenter(event: PointerEvent): void {\n // For touch devices, don't open on pointerenter - let click handle it\n if (event.pointerType === 'touch') {\n return;\n }\n\n if (this.leaveTimeout) {\n clearTimeout(this.leaveTimeout);\n delete this.leaveTimeout;\n this.recentlyLeftChild = false;\n return;\n }\n this.focus();\n this.openOverlay();\n }\n\n protected leaveTimeout?: ReturnType<typeof setTimeout>;\n protected recentlyLeftChild = false;\n\n protected handlePointerleave(event: PointerEvent): void {\n // For touch devices, don't close on pointerleave - let click handle it\n if (event.pointerType === 'touch') {\n return;\n }\n\n this._closedViaPointer = true;\n if (this.open && !this.recentlyLeftChild) {\n this.leaveTimeout = setTimeout(() => {\n delete this.leaveTimeout;\n this.open = false;\n }, POINTERLEAVE_TIMEOUT);\n }\n }\n\n /**\n * When there is a `change` event in the submenu for this item\n * then we \"click\" this item to cascade the selection up the\n * menu tree allowing all submenus between the initial selection\n * and the root of the tree to have their selection changes and\n * be closed.\n */\n protected handleSubmenuChange(event: Event): void {\n event.stopPropagation();\n this.menuData.selectionRoot?.selectOrToggleItem(this);\n }\n\n protected handleSubmenuPointerenter(): void {\n this.recentlyLeftChild = true;\n }\n\n protected async handleSubmenuPointerleave(): Promise<void> {\n this.recentlyLeftChild = false;\n }\n\n protected handleSubmenuOpen(event: Event): void {\n const parentOverlay = event.composedPath().find((el) => {\n return (\n el !== this.overlayElement &&\n (el as HTMLElement).localName === 'sp-overlay'\n );\n }) as Overlay;\n if (this._openedViaKeyboard) {\n this.submenuElement?.focus();\n }\n this.overlayElement.parentOverlayToForceClose = parentOverlay;\n }\n\n protected cleanup(): void {\n this._closedViaPointer = false;\n this.setAttribute('aria-expanded', 'false');\n this.open = false;\n this.active = false;\n }\n\n public async openOverlay(shouldFocus: boolean = false): Promise<void> {\n if (!this.hasSubmenu || this.open || this.disabled) {\n return;\n }\n this.open = true;\n this.active = true;\n this.setAttribute('aria-expanded', 'true');\n this._openedViaKeyboard = shouldFocus;\n this.addEventListener('sp-closed', this.cleanup, {\n once: true,\n });\n }\n\n updateAriaSelected(): void {\n const role = this.getAttribute('role');\n if (role === 'option') {\n this.setAttribute('aria-selected', this.selected ? 'true' : 'false');\n } else if (role === 'menuitemcheckbox' || role === 'menuitemradio') {\n this.setAttribute('aria-checked', this.selected ? 'true' : 'false');\n }\n }\n\n public setRole(role: string): void {\n this.setAttribute('role', role);\n this.updateAriaSelected();\n }\n\n protected override willUpdate(changes: PropertyValues<this>): void {\n super.updated(changes);\n\n // make sure focus returns to the anchor element when submenu is closed\n if (\n changes.has('open') &&\n !this.open &&\n this.hasSubmenu &&\n !this._closedViaPointer &&\n this.matches(':focus-within')\n ) {\n this.focus();\n }\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (\n changes.has('label') &&\n (this.label || typeof changes.get('label') !== 'undefined')\n ) {\n this.setAttribute('aria-label', this.label || '');\n }\n if (\n changes.has('active') &&\n (this.active || typeof changes.get('active') !== 'undefined')\n ) {\n if (this.active) {\n this.menuData.selectionRoot?.closeDescendentOverlays();\n }\n }\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n if (changes.has('selected')) {\n this.updateAriaSelected();\n }\n if (\n changes.has('hasSubmenu') &&\n (this.hasSubmenu || typeof changes.get('hasSubmenu') !== 'undefined')\n ) {\n if (this.hasSubmenu) {\n this.abortControllerSubmenu = new AbortController();\n const options = { signal: this.abortControllerSubmenu.signal };\n this.addEventListener('click', this.handleSubmenuClick, options);\n this.addEventListener('pointerenter', this.handlePointerenter, options);\n this.addEventListener('pointerleave', this.handlePointerleave, options);\n this.addEventListener('sp-opened', this.handleSubmenuOpen, options);\n } else {\n this.abortControllerSubmenu?.abort();\n }\n }\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.triggerUpdate();\n }\n\n _parentElement!: HTMLElement;\n\n public override disconnectedCallback(): void {\n this.menuData.cleanupSteps.forEach((removal) => removal(this));\n this.menuData = {\n focusRoot: undefined,\n parentMenu: undefined,\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n\n // Clean up any active touch listeners\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n\n super.disconnectedCallback();\n }\n\n private willDispatchUpdate = false;\n\n public async triggerUpdate(): Promise<void> {\n if (this.willDispatchUpdate) {\n return;\n }\n this.willDispatchUpdate = true;\n await new Promise((ready) => requestAnimationFrame(ready));\n this.dispatchUpdate();\n }\n\n public override focus(): void {\n super.focus();\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('focus'));\n }\n\n public override blur(): void {\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('blur'));\n super.blur();\n }\n\n public dispatchUpdate(): void {\n if (!this.isConnected) {\n return;\n }\n this.dispatchEvent(new MenuItemAddedOrUpdatedEvent(this));\n this.willDispatchUpdate = false;\n }\n\n public menuData: {\n focusRoot?: Menu;\n parentMenu?: Menu;\n selectionRoot?: Menu;\n cleanupSteps: ((item: MenuItem) => void)[];\n } = {\n // menu that controls ArrowUp/ArrowDown navigation\n focusRoot: undefined,\n parentMenu: undefined,\n // menu or menu group that controls selection\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'sp-menu-item-added-or-updated': MenuItemAddedOrUpdatedEvent;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["MutationController", "html", "INPUT_COMPONENT_PATTERN", "nothing", "property", "query", "checkmarkStyles", "chevronStyles", "SlottableRequestEvent", "DependencyManagerController", "ObserveSlotPresence", "ObserveSlotText", "randomID", "Focusable", "LikeAnchor", "menuItemStyles", "POINTERLEAVE_TIMEOUT", "item", "root", "event", "_a", "target", "key", "openSubmenuKey", "mutations", "mutation", "value", "acc", "node", "icon", "element", "newElement", "content", "handled", "slot", "path", "targetIsInOverlay", "changes", "activeElement", "role", "parentOverlay", "el", "shouldFocus", "_b", "options", "removal", "ready", "__decorateClass"]
4
+ "sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\n\nimport {\n CSSResultArray,\n html,\n INPUT_COMPONENT_PATTERN,\n nothing,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\nimport chevronStyles from '@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js';\nimport type { Overlay } from '@spectrum-web-components/overlay';\nimport { SlottableRequestEvent } from '@spectrum-web-components/overlay/src/slottable-request-event.js';\nimport { DependencyManagerController } from '@spectrum-web-components/reactive-controllers/src/DependencyManger.js';\nimport {\n ObserveSlotPresence,\n ObserveSlotText,\n randomID,\n} from '@spectrum-web-components/shared';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\n\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';\n\nimport type { Menu } from './Menu.js';\nimport menuItemStyles from './menu-item.css.js';\n\n/**\n * Duration during which a pointing device can leave an `<sp-menu-item>` element\n * and return to it or to the submenu opened from it before closing that submenu.\n **/\nconst POINTERLEAVE_TIMEOUT = 100;\n\ntype MenuCascadeItem = {\n hadFocusRoot: boolean;\n ancestorWithSelects?: HTMLElement;\n};\n\n/**\n * Fires when a menu item is added or updated so that a parent menu can track it.\n */\nexport class MenuItemAddedOrUpdatedEvent extends Event {\n constructor(item: MenuItem) {\n super('sp-menu-item-added-or-updated', {\n bubbles: true,\n composed: true,\n });\n this.clear(item);\n }\n clear(item: MenuItem): void {\n this._item = item;\n this.currentAncestorWithSelects = undefined;\n item.menuData = {\n cleanupSteps: [],\n focusRoot: undefined,\n selectionRoot: undefined,\n parentMenu: undefined,\n };\n this.menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n }\n menuCascade = new WeakMap<HTMLElement, MenuCascadeItem>();\n get item(): MenuItem {\n return this._item;\n }\n private _item!: MenuItem;\n currentAncestorWithSelects?: Menu;\n}\n\n/**\n * Fires to forward keyboard event information to parent menu.\n */\nexport class MenuItemKeydownEvent extends KeyboardEvent {\n root?: MenuItem;\n private _event?: KeyboardEvent;\n constructor({ root, event }: { root?: MenuItem; event?: KeyboardEvent }) {\n super('sp-menu-item-keydown', { bubbles: true, composed: true });\n this.root = root;\n this._event = event;\n }\n\n public override get altKey(): boolean {\n return this._event?.altKey || false;\n }\n\n public override get code(): string {\n return this._event?.code || '';\n }\n\n public override get ctrlKey(): boolean {\n return this._event?.ctrlKey || false;\n }\n\n public override get isComposing(): boolean {\n return this._event?.isComposing || false;\n }\n\n public override get key(): string {\n return this._event?.key || '';\n }\n\n public override get location(): number {\n return this._event?.location || 0;\n }\n\n public override get metaKey(): boolean {\n return this._event?.metaKey || false;\n }\n\n public override get repeat(): boolean {\n return this._event?.repeat || false;\n }\n\n public override get shiftKey(): boolean {\n return this._event?.shiftKey || false;\n }\n\n /**\n * Original `KeyboardEvent` that triggered this forwarded event,\n * exposed so listeners on the parent menu can call\n * `preventDefault()`/`stopPropagation()` on the underlying event.\n */\n public get nativeEvent(): KeyboardEvent | undefined {\n return this._event;\n }\n}\n\nexport type MenuItemChildren = { icon: Element[]; content: Node[] };\n\n/**\n * @element sp-menu-item\n *\n * @slot - text content to display within the Menu Item\n * @slot description - description to be placed below the label of the Menu Item\n * @slot icon - icon element to be placed at the start of the Menu Item\n * @slot value - content placed at the end of the Menu Item like values, keyboard shortcuts, etc.\n * @slot submenu - content placed in a submenu\n * @fires sp-menu-item-added - announces the item has been added so a parent menu can take ownerships\n */\nexport class MenuItem extends LikeAnchor(\n ObserveSlotText(ObserveSlotPresence(Focusable, '[slot=\"icon\"]'))\n) {\n public static override get styles(): CSSResultArray {\n return [menuItemStyles, checkmarkStyles, chevronStyles];\n }\n\n abortControllerSubmenu!: AbortController;\n\n /**\n * whether the menu item is active or has an active descendant\n */\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n private dependencyManager = new DependencyManagerController(this);\n\n /**\n * whether the menu item has keyboard focus\n */\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n /**\n * whether the menu item is selected\n */\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n /**\n * value of the menu item which is used for selection\n */\n @property({ type: String })\n public get value(): string {\n return this._value || this.itemText;\n }\n\n public set value(value: string) {\n if (value === this._value) {\n return;\n }\n this._value = value || '';\n if (this._value) {\n this.setAttribute('value', this._value);\n } else {\n this.removeAttribute('value');\n }\n }\n\n private _value = '';\n\n /**\n * @private\n * text content of the menu item minus whitespace\n */\n public get itemText(): string {\n return this.itemChildren.content.reduce(\n (acc, node) => acc + (node.textContent || '').trim(),\n ''\n );\n }\n\n /**\n * whether the menu item has a submenu\n */\n @property({ type: Boolean, reflect: true, attribute: 'has-submenu' })\n public hasSubmenu = false;\n\n @query('slot:not([name])')\n contentSlot!: HTMLSlotElement;\n\n @query('slot[name=\"icon\"]')\n iconSlot!: HTMLSlotElement;\n\n /**\n * whether menu item text content should not wrap\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'no-wrap',\n hasChanged() {\n return false;\n },\n })\n public noWrap = false;\n\n @query('.anchor')\n private anchorElement!: HTMLAnchorElement;\n\n @query('sp-overlay')\n public overlayElement!: Overlay;\n\n /**\n * Reference to the slotted submenu element, captured by `manageSubmenu`.\n * Public so the parent `<sp-menu>` can project this submenu for mobile\n * drill-down and so tests can assert on its contents.\n *\n * @internal\n */\n public submenuElement?: HTMLElement;\n\n /**\n * Set by the parent Menu when the submenu element is projected to the\n * mobile-submenu slot. Guards against `manageSubmenu` clearing\n * `hasSubmenu` when the slot appears empty during projection.\n * Cross-class implementation detail; do not depend on it from outside\n * the `@spectrum-web-components/menu` package.\n *\n * @internal\n */\n public _mobileSubmenuProjected = false;\n\n /**\n * the focusable element of the menu item\n */\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasIcon(): boolean {\n return this.slotContentIsPresent;\n }\n\n public get itemChildren(): MenuItemChildren {\n if (!this.iconSlot || !this.contentSlot) {\n return {\n icon: [],\n content: [],\n };\n }\n if (this._itemChildren) {\n return this._itemChildren;\n }\n const icon = this.iconSlot.assignedElements().map((element) => {\n const newElement = element.cloneNode(true) as HTMLElement;\n newElement.removeAttribute('slot');\n newElement.classList.toggle('icon');\n return newElement;\n });\n const content = this.contentSlot\n .assignedNodes()\n .map((node) => node.cloneNode(true));\n this._itemChildren = { icon, content };\n\n return this._itemChildren;\n }\n\n private _itemChildren?: MenuItemChildren;\n\n constructor() {\n super();\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n this.addEventListener('focus', this.handleFocus);\n this.addEventListener('blur', this.handleBlur);\n\n new MutationController(this, {\n config: {\n characterData: true,\n childList: true,\n subtree: true,\n attributeFilter: ['src'],\n },\n callback: (mutations) => {\n const isSubmenu = mutations.every(\n (mutation) => (mutation.target as HTMLElement).slot === 'submenu'\n );\n if (isSubmenu) {\n return;\n }\n this.breakItemChildrenCache();\n },\n });\n }\n\n /**\n * whether submenu is open\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * whether menu item's submenu is opened via keyboard\n */\n private _openedViaKeyboard = false;\n\n /**\n * whether menu item's submenu is closed via pointer leave\n */\n private _closedViaPointer = false;\n\n /**\n * Touch interaction state for submenu toggling\n */\n private _activePointerId?: number;\n private _touchHandledViaPointerup = false;\n private _touchAbortController?: AbortController;\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return false;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n }\n\n private handleSlottableRequest = (event: SlottableRequestEvent): void => {\n this.submenuElement?.dispatchEvent(\n new SlottableRequestEvent(event.name, event.data)\n );\n };\n\n private proxyFocus = (): void => {\n this.focus();\n };\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n }\n return handled;\n }\n\n protected breakItemChildrenCache(): void {\n this._itemChildren = undefined;\n this.triggerUpdate();\n }\n\n private get isMobileView(): boolean {\n return !!this._mobileRootMenu;\n }\n\n /**\n * Returns the root sp-menu with mobile-view, traversing up from\n * either the focusRoot or the DOM tree.\n */\n private get _mobileRootMenu(): Menu | null {\n const focusRoot = this.menuData.focusRoot;\n if (focusRoot?.mobileView) {\n return focusRoot;\n }\n return this.closest('sp-menu[mobile-view]') as Menu | null;\n }\n\n protected renderSubmenu(): TemplateResult {\n const slot = html`\n <slot\n name=\"submenu\"\n @slotchange=${this.manageSubmenu}\n @sp-menu-item-added-or-updated=${{\n handleEvent: (event: MenuItemAddedOrUpdatedEvent) => {\n event.clear(event.item);\n },\n capture: true,\n }}\n @focusin=${(event: Event) => event.stopPropagation()}\n ></slot>\n `;\n if (!this.hasSubmenu) {\n return slot;\n }\n\n if (this.isMobileView) {\n return html`\n <div class=\"mobile-submenu-slot-hidden\">${slot}</div>\n <sp-icon-chevron100\n class=\"spectrum-UIIcon-ChevronRight100 chevron icon\"\n ></sp-icon-chevron100>\n `;\n }\n\n this.dependencyManager.add('sp-overlay');\n this.dependencyManager.add('sp-popover');\n import('@spectrum-web-components/overlay/sp-overlay.js');\n import('@spectrum-web-components/popover/sp-popover.js');\n return html`\n <sp-overlay\n receives-focus=\"false\"\n .triggerElement=${this as HTMLElement}\n ?disabled=${!this.hasSubmenu}\n ?open=${this.hasSubmenu && this.open && this.dependencyManager.loaded}\n .placement=${this.dir === 'ltr' ? 'right-start' : 'left-start'}\n .offset=${[-10, 0] as [number, number]}\n .type=${'auto'}\n @close=${(event: Event) => event.stopPropagation()}\n @slottable-request=${this.handleSlottableRequest}\n >\n <sp-popover\n @change=${(event: Event) => {\n this.handleSubmenuChange(event);\n this.open = false;\n }}\n @pointerenter=${this.handleSubmenuPointerenter}\n @pointerleave=${this.handleSubmenuPointerleave}\n @sp-menu-item-added-or-updated=${(event: Event) =>\n event.stopPropagation()}\n >\n ${slot}\n </sp-popover>\n </sp-overlay>\n <sp-icon-chevron100\n class=\"spectrum-UIIcon-ChevronRight100 chevron icon\"\n ></sp-icon-chevron100>\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n ${this.selected\n ? html`\n <sp-icon-checkmark100\n id=\"selected\"\n class=\"spectrum-UIIcon-Checkmark100\n icon\n checkmark\n ${this.hasIcon\n ? 'checkmark--withAdjacentIcon'\n : ''}\"\n ></sp-icon-checkmark100>\n `\n : nothing}\n <slot name=\"icon\"></slot>\n <div id=\"label\">\n <slot id=\"slot\"></slot>\n </div>\n <slot name=\"description\"></slot>\n <slot name=\"value\"></slot>\n ${this.href && this.href.length > 0\n ? super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })\n : nothing}\n ${this.renderSubmenu()}\n `;\n }\n\n /**\n * Determines if item has a submenu and updates the `aria-haspopup` attribute.\n * Skips clearing state when the submenu is temporarily projected to the\n * parent Menu's mobile-submenu slot.\n */\n protected manageSubmenu(event: Event & { target: HTMLSlotElement }): void {\n const assigned = event.target.assignedElements({\n flatten: true,\n })[0] as HTMLElement | undefined;\n\n if (!assigned && this._mobileSubmenuProjected) {\n return;\n }\n\n this.submenuElement = assigned;\n this.hasSubmenu = !!this.submenuElement;\n if (this.hasSubmenu) {\n this.setAttribute('aria-haspopup', 'true');\n }\n }\n\n private handlePointerdown(event: PointerEvent): void {\n const path = event.composedPath();\n const targetIsInOverlay =\n this.overlayElement && path.includes(this.overlayElement);\n\n if (\n event.pointerType === 'touch' &&\n this.hasSubmenu &&\n !targetIsInOverlay &&\n this._activePointerId === undefined\n ) {\n this._activePointerId = event.pointerId;\n this._touchAbortController = new AbortController();\n\n window.addEventListener('pointerup', this.handleTouchSubmenuToggle, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n window.addEventListener('pointercancel', this.handleTouchCleanup, {\n once: true,\n signal: this._touchAbortController.signal,\n });\n }\n\n if (\n !targetIsInOverlay &&\n this.hasSubmenu &&\n this.open &&\n event.pointerType !== 'touch'\n ) {\n this.addEventListener('focus', this.handleSubmenuFocus, {\n once: true,\n });\n this.overlayElement?.addEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n }\n\n private handleTouchSubmenuToggle = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n\n this._touchAbortController?.abort();\n this._touchHandledViaPointerup = true;\n this._activePointerId = undefined;\n\n if (this.isMobileView) {\n this._mobileRootMenu?.openMobileSubmenu(this);\n // Defer clearing the flag until after the synthetic `click`\n // dispatched by the same touch sequence has been handled, so\n // `handleSubmenuClick` can suppress that duplicate activation.\n setTimeout(() => {\n this._touchHandledViaPointerup = false;\n }, 0);\n return;\n }\n\n if (this.open) {\n this.open = false;\n } else {\n this.openOverlay();\n }\n\n // Same rationale as above: keep the suppression flag set through\n // the trailing `click` event before resetting it.\n setTimeout(() => {\n this._touchHandledViaPointerup = false;\n }, 0);\n };\n\n private handleTouchCleanup = (event: PointerEvent): void => {\n if (event.pointerId !== this._activePointerId) {\n return;\n }\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n };\n\n protected override firstUpdated(changes: PropertyValues): void {\n super.firstUpdated(changes);\n this.setAttribute('tabindex', '-1');\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('mouseover', this.handleMouseover);\n this.addEventListener('pointerdown', this.handlePointerdown);\n this.addEventListener('pointerenter', this.closeOverlaysForRoot);\n if (!this.hasAttribute('id')) {\n this.id = `sp-menu-item-${randomID()}`;\n }\n }\n\n private getActiveElementSafely(): HTMLElement | null {\n let root = this.getRootNode() as Document | ShadowRoot;\n let activeElement = root.activeElement as HTMLElement;\n\n // If no active element in current context and we're in shadow DOM,\n // traverse up to find the document-level active element\n if (!activeElement && root !== document) {\n while (root && root !== document && 'host' in root) {\n root = (root as ShadowRoot).host.getRootNode() as Document | ShadowRoot;\n activeElement = root.activeElement as HTMLElement;\n if (activeElement) {\n break;\n }\n }\n }\n\n return activeElement;\n }\n\n handleMouseover(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target === this) {\n // Check for active input elements across shadow boundaries\n const activeElement = this.getActiveElementSafely();\n\n // Only focus this menu item if no input element is currently active\n // This prevents interrupting user input in search boxes, text fields, etc.\n if (!activeElement || !this.isInputElement(activeElement)) {\n this.focus();\n }\n this.focused = false;\n }\n }\n\n /**\n * Determines if an element is an input field that should retain focus.\n * Uses multiple detection strategies to identify input elements generically.\n */\n private isInputElement(element: HTMLElement): boolean {\n // Check for native HTML input elements\n if (this.isNativeInputElement(element)) {\n return true;\n }\n\n // Check for contenteditable elements (rich text editors)\n if (element.contentEditable === 'true') {\n return true;\n }\n\n // Check for Spectrum Web Components with input-like behavior\n if (this.isSpectrumInputComponent(element)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if an element is a native HTML input element.\n */\n private isNativeInputElement(element: HTMLElement): boolean {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n );\n }\n\n /**\n * Checks if an element is a Spectrum Web Component with input behavior.\n * Uses ARIA roles and component patterns for generic detection.\n */\n private isSpectrumInputComponent(element: HTMLElement): boolean {\n // Check if it's a Spectrum Web Component\n if (!element.tagName.startsWith('SP-')) {\n return false;\n }\n\n // Check ARIA role for input-like behavior\n const role = element.getAttribute('role');\n const inputRoles = ['textbox', 'searchbox', 'combobox', 'slider'];\n if (role && inputRoles.includes(role)) {\n return true;\n }\n\n // Check for components that typically contain input elements\n // This covers components like sp-search, sp-textfield, sp-number-field, etc.\n const inputComponentPattern = INPUT_COMPONENT_PATTERN;\n if (inputComponentPattern.test(element.tagName)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * forward key info from keydown event to parent menu\n */\n handleKeydown = (event: KeyboardEvent): void => {\n const { target, key } = event;\n const openSubmenuKey =\n this.hasSubmenu && !this.open && [' ', 'Enter'].includes(key);\n // Forward the keydown when this item is the closest `sp-menu-item`\n // ancestor of the event target. That covers both focus on the item\n // itself and focus on any of its non-menu-item descendants (e.g.\n // the back-arrow icon inside a mobile back button), while\n // preventing a parent item from double-dispatching events that\n // originated inside its slotted submenu (whose menu items are\n // also descendants in the light DOM tree).\n const targetIsThisItem =\n target === this ||\n (target instanceof Element && target.closest('sp-menu-item') === this);\n if (targetIsThisItem) {\n if (\n ['ArrowLeft', 'ArrowRight', 'Escape'].includes(key) ||\n openSubmenuKey\n ) {\n event.preventDefault();\n }\n this.dispatchEvent(\n new MenuItemKeydownEvent({ root: this, event: event })\n );\n }\n };\n\n protected closeOverlaysForRoot(): void {\n if (this.open) {\n return;\n }\n this.menuData.parentMenu?.closeDescendentOverlays();\n }\n\n protected handleFocus(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = true;\n }\n }\n\n protected handleBlur(event: FocusEvent): void {\n const { target } = event;\n if (target === this) {\n this.focused = false;\n }\n }\n\n protected handleSubmenuClick(event: Event): void {\n if (this.isMobileView) {\n event.stopPropagation();\n event.preventDefault();\n this._mobileRootMenu?.openMobileSubmenu(this);\n return;\n }\n\n if (this._touchHandledViaPointerup) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n\n if (event.composedPath().includes(this.overlayElement)) {\n return;\n }\n\n this.openOverlay(true);\n }\n\n protected handleSubmenuFocus(): void {\n requestAnimationFrame(() => {\n // Wait till after `closeDescendentOverlays` has happened in Menu\n // to reopen (keep open) the direct descendent of this Menu Item\n this.overlayElement.open = this.open;\n this.focused = false;\n });\n }\n\n protected handleBeforetoggle = (event: Event): void => {\n if ((event as Event & { newState: string }).newState === 'closed') {\n this.open = true;\n this.overlayElement.manuallyKeepOpen();\n this.overlayElement.removeEventListener(\n 'beforetoggle',\n this.handleBeforetoggle\n );\n }\n };\n\n protected handlePointerenter(event: PointerEvent): void {\n if (event.pointerType === 'touch' || this.isMobileView) {\n return;\n }\n\n if (this.leaveTimeout) {\n clearTimeout(this.leaveTimeout);\n delete this.leaveTimeout;\n this.recentlyLeftChild = false;\n return;\n }\n this.focus();\n this.openOverlay();\n }\n\n protected leaveTimeout?: ReturnType<typeof setTimeout>;\n protected recentlyLeftChild = false;\n\n protected handlePointerleave(event: PointerEvent): void {\n // For touch devices, don't close on pointerleave - let click handle it\n if (event.pointerType === 'touch') {\n return;\n }\n\n this._closedViaPointer = true;\n if (this.open && !this.recentlyLeftChild) {\n this.leaveTimeout = setTimeout(() => {\n delete this.leaveTimeout;\n this.open = false;\n }, POINTERLEAVE_TIMEOUT);\n }\n }\n\n /**\n * When there is a `change` event in the submenu for this item\n * then we \"click\" this item to cascade the selection up the\n * menu tree allowing all submenus between the initial selection\n * and the root of the tree to have their selection changes and\n * be closed.\n */\n protected handleSubmenuChange(event: Event): void {\n event.stopPropagation();\n this.menuData.selectionRoot?.selectOrToggleItem(this);\n }\n\n protected handleSubmenuPointerenter(): void {\n this.recentlyLeftChild = true;\n }\n\n protected async handleSubmenuPointerleave(): Promise<void> {\n this.recentlyLeftChild = false;\n }\n\n protected handleSubmenuOpen(event: Event): void {\n const parentOverlay = event.composedPath().find((el) => {\n return (\n el !== this.overlayElement &&\n (el as HTMLElement).localName === 'sp-overlay'\n );\n }) as Overlay;\n if (this._openedViaKeyboard) {\n this.submenuElement?.focus();\n }\n this.overlayElement.parentOverlayToForceClose = parentOverlay;\n }\n\n protected cleanup(): void {\n this._closedViaPointer = false;\n this.setAttribute('aria-expanded', 'false');\n this.open = false;\n this.active = false;\n }\n\n public async openOverlay(shouldFocus: boolean = false): Promise<void> {\n if (!this.hasSubmenu || this.open || this.disabled) {\n return;\n }\n this.open = true;\n this.active = true;\n this.setAttribute('aria-expanded', 'true');\n this._openedViaKeyboard = shouldFocus;\n this.addEventListener('sp-closed', this.cleanup, {\n once: true,\n });\n }\n\n updateAriaSelected(): void {\n const role = this.getAttribute('role');\n if (role === 'option') {\n this.setAttribute('aria-selected', this.selected ? 'true' : 'false');\n } else if (role === 'menuitemcheckbox' || role === 'menuitemradio') {\n this.setAttribute('aria-checked', this.selected ? 'true' : 'false');\n }\n }\n\n public setRole(role: string): void {\n this.setAttribute('role', role);\n this.updateAriaSelected();\n }\n\n protected override willUpdate(changes: PropertyValues<this>): void {\n super.updated(changes);\n\n // make sure focus returns to the anchor element when submenu is closed\n if (\n changes.has('open') &&\n !this.open &&\n this.hasSubmenu &&\n !this._closedViaPointer &&\n this.matches(':focus-within')\n ) {\n this.focus();\n }\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (\n changes.has('label') &&\n (this.label || typeof changes.get('label') !== 'undefined')\n ) {\n this.setAttribute('aria-label', this.label || '');\n }\n if (\n changes.has('active') &&\n (this.active || typeof changes.get('active') !== 'undefined')\n ) {\n if (this.active) {\n this.menuData.selectionRoot?.closeDescendentOverlays();\n }\n }\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n if (changes.has('selected')) {\n this.updateAriaSelected();\n }\n if (\n changes.has('hasSubmenu') &&\n (this.hasSubmenu || typeof changes.get('hasSubmenu') !== 'undefined')\n ) {\n if (this.hasSubmenu) {\n this.abortControllerSubmenu = new AbortController();\n const options = { signal: this.abortControllerSubmenu.signal };\n this.addEventListener('click', this.handleSubmenuClick, options);\n this.addEventListener('pointerenter', this.handlePointerenter, options);\n this.addEventListener('pointerleave', this.handlePointerleave, options);\n this.addEventListener('sp-opened', this.handleSubmenuOpen, options);\n } else {\n this.abortControllerSubmenu?.abort();\n }\n }\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.triggerUpdate();\n }\n\n _parentElement!: HTMLElement;\n\n public override disconnectedCallback(): void {\n this.menuData.cleanupSteps.forEach((removal) => removal(this));\n this.menuData = {\n focusRoot: undefined,\n parentMenu: undefined,\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n\n // Clean up any active touch listeners\n this._touchAbortController?.abort();\n this._activePointerId = undefined;\n this._touchHandledViaPointerup = false;\n\n super.disconnectedCallback();\n }\n\n private willDispatchUpdate = false;\n\n public async triggerUpdate(): Promise<void> {\n if (this.willDispatchUpdate) {\n return;\n }\n this.willDispatchUpdate = true;\n await new Promise((ready) => requestAnimationFrame(ready));\n this.dispatchUpdate();\n }\n\n public override focus(): void {\n super.focus();\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('focus'));\n }\n\n public override blur(): void {\n // ensure focus event fires in Chromium for tests\n this.dispatchEvent(new FocusEvent('blur'));\n super.blur();\n }\n\n public dispatchUpdate(): void {\n if (!this.isConnected) {\n return;\n }\n this.dispatchEvent(new MenuItemAddedOrUpdatedEvent(this));\n this.willDispatchUpdate = false;\n }\n\n public menuData: {\n focusRoot?: Menu;\n parentMenu?: Menu;\n selectionRoot?: Menu;\n cleanupSteps: ((item: MenuItem) => void)[];\n } = {\n // menu that controls ArrowUp/ArrowDown navigation\n focusRoot: undefined,\n parentMenu: undefined,\n // menu or menu group that controls selection\n selectionRoot: undefined,\n cleanupSteps: [],\n };\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'sp-menu-item-added-or-updated': MenuItemAddedOrUpdatedEvent;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["MutationController", "html", "INPUT_COMPONENT_PATTERN", "nothing", "property", "query", "checkmarkStyles", "chevronStyles", "SlottableRequestEvent", "DependencyManagerController", "ObserveSlotPresence", "ObserveSlotText", "randomID", "Focusable", "LikeAnchor", "menuItemStyles", "POINTERLEAVE_TIMEOUT", "item", "root", "event", "_a", "_b", "target", "key", "openSubmenuKey", "mutations", "mutation", "value", "acc", "node", "icon", "element", "newElement", "content", "handled", "focusRoot", "slot", "assigned", "path", "targetIsInOverlay", "changes", "activeElement", "role", "parentOverlay", "el", "shouldFocus", "options", "removal", "ready", "__decorateClass"]
7
7
  }