@enegalan/contextmenu.js 1.4.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/contextmenu.ts"],"sourcesContent":["export { createContextMenu } from \"./contextmenu.js\";\nexport type {\n BadgeConfig,\n BindOptions,\n CloseContext,\n ContextMenuBindConfig,\n ContextMenuConfig,\n ContextMenuInstance,\n EventRegistry,\n MenuItem,\n MenuItemAction,\n MenuItemBase,\n MenuItemCheckbox,\n MenuItemLabel,\n MenuItemLink,\n MenuItemRadio,\n MenuItemSeparator,\n MenuItemSubmenu,\n MenuItemVariant,\n MenuCheckboxChangeEvent,\n MenuClickEvent,\n MenuRadioSelectEvent,\n OpenAtElementOptions,\n OpenAtElementPlacement,\n OpenContext,\n SpinnerConfig,\n SubmenuChildren,\n SubmenuPlacement,\n ThemeConfig,\n AnimationConfig,\n AnimationType,\n PositionConfig,\n} from \"./types.js\";\n","import type { ModifierSymbol } from \"./types.js\";\n\nexport const ID_PREFIX = \"cm-\";\nexport const CM_ITEM_KEY = \"_cmItem\";\nexport const CM_SUBMENU_KEY = \"_cmSubmenu\";\n\nexport const ROOT_CLASS = \"cm-menu\";\nexport const ROOT_OPEN_CLASS = \"cm-open\";\nexport const ROOT_LEAVE_CLASS = \"cm-leave\";\nexport const SUBMENU_OPEN_CLASS = \"cm-submenu-open\";\n\nexport const SUBMENU_HOVER_DELAY_MS = 200;\nexport const SUBMENU_CLOSE_DELAY_MS = 150;\nexport const DEFAULT_LONG_PRESS_MS = 500;\nexport const DEFAULT_SPINNER_SPEED_MS = 600;\n\nexport const CLASS_ICON = \"cm-icon\";\nexport const CLASS_SUBMENU_ARROW = \"cm-submenu-arrow\";\nexport const CLASS_SUBMENU_ARROW_ICON = \"cm-submenu-arrow--icon\";\nexport const CLASS_SEPARATOR = \"cm-separator\";\nexport const CLASS_ITEM = \"cm-item\";\nexport const CLASS_ITEM_LOADING = \"cm-item-loading\";\nexport const CLASS_ITEM_LEADING = \"cm-item-leading\";\nexport const CLASS_ITEM_LABEL = \"cm-item-label\";\nexport const CLASS_SPINNER = \"cm-spinner\";\nexport const CLASS_SPINNER_CUSTOM = \"cm-spinner--custom\";\nexport const CSS_VAR_SPINNER_DURATION = \"--cm-spinner-duration\";\nexport const CLASS_LABEL = \"cm-label\";\nexport const CLASS_ITEM_CHECKBOX = \"cm-item-checkbox\";\nexport const CLASS_CHECKED = \"cm-checked\";\nexport const CLASS_CHECK = \"cm-check\";\nexport const CLASS_CHECK_CUSTOM = \"cm-check--custom\";\nexport const CLASS_SHORTCUT = \"cm-shortcut\";\nexport const CLASS_SHORTCUT_ICON = \"cm-shortcut-icon\";\nexport const CLASS_ITEM_BADGE = \"cm-item-badge\";\nexport const CLASS_ITEM_RADIO = \"cm-item-radio\";\nexport const CLASS_RADIO = \"cm-radio\";\nexport const CLASS_RADIO_CUSTOM = \"cm-radio--custom\";\nexport const CLASS_SUBMENU_TRIGGER = \"cm-submenu-trigger\";\nexport const CLASS_WRAPPER = \"cm-wrapper\";\nexport const CLASS_SUBMENU = \"cm-submenu\";\n\nexport const MENU_ROLE_SELECTOR = \"[role='menu']\";\n\nexport const THEME_CLASS_DATA_ATTR = \"data-cm-theme-class\";\nexport const ANIMATION_TYPE_DATA_ATTR = \"data-cm-animation\";\n\nexport const CSS_VAR_PREFIX = \"--cm-\";\nexport const CSS_VAR_ENTER_DURATION = \"--cm-enter-duration\";\nexport const CSS_VAR_LEAVE_DURATION = \"--cm-leave-duration\";\nexport const CSS_VAR_ENTER_EASING = \"--cm-enter-easing\";\nexport const CSS_VAR_LEAVE_EASING = \"--cm-leave-easing\";\nexport const CSS_VAR_SUBMENU_ARROW_SIZE = \"--cm-submenu-arrow-size\";\n\nexport const WIN_KEY_ICON = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 4875 4875\" fill=\"currentColor\" aria-hidden=\"true\"><path xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" d=\"M0 0h2311v2310H0zm2564 0h2311v2310H2564zM0 2564h2311v2311H0zm2564 0h2311v2311H2564\"/></svg>';\n\nexport const DEFAULT_SUBMENU_ARROW_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z\"/></svg>';\n\nexport const MAC_MODIFIER_SYMBOLS: Record<string, string> = {\n cmd: \"⌘\",\n alt: \"⌥\",\n win: \"⌘\",\n windows: \"⌘\",\n};\n\nexport const WIN_MODIFIER_SYMBOLS: Record<string, ModifierSymbol> = {\n cmd: \"⊞\",\n alt: \"⎇\",\n win: { text: \"⊞\", icon: WIN_KEY_ICON },\n windows: { text: \"⊞\", icon: WIN_KEY_ICON },\n};\n\nexport const SHORTCUT_KEY_SYMBOLS: Record<string, string> = {\n ctrl: \"⌃\",\n shift: \"⇧\",\n enter: \"↵\",\n return: \"↵\",\n tab: \"⇥\",\n backspace: \"⌫\",\n escape: \"⎋\",\n esc: \"⎋\",\n delete: \"⌦\",\n space: \"␣\",\n left: \"←\",\n right: \"→\",\n up: \"↑\",\n down: \"↓\",\n arrowleft: \"←\",\n arrowright: \"→\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n home: \"⇱\",\n end: \"⇲\",\n pageup: \"⇞\",\n pagedown: \"⇟\",\n insert: \"⎀\",\n ins: \"⎀\",\n};\n","import type {\n BadgeConfig,\n BindOptions,\n CloseContext,\n ContextMenuConfig,\n ContextMenuInstance,\n ContextMenuState,\n EventRegistry,\n MenuItem,\n MenuItemAction,\n MenuItemCheckbox,\n MenuItemLabel,\n MenuItemLink,\n MenuItemRadio,\n MenuItemSubmenu,\n MenuItemVariant,\n MenuClickEvent,\n ShortcutPart,\n ModifierSymbol,\n OpenAtElementOptions,\n OpenContext,\n Placement,\n SpinnerConfig,\n SubmenuArrowConfig,\n SubmenuChildren,\n} from \"./types.js\";\nimport {\n ROOT_CLASS,\n ROOT_OPEN_CLASS,\n ROOT_LEAVE_CLASS,\n SUBMENU_OPEN_CLASS,\n SUBMENU_HOVER_DELAY_MS,\n SUBMENU_CLOSE_DELAY_MS,\n DEFAULT_LONG_PRESS_MS,\n DEFAULT_SPINNER_SPEED_MS,\n CLASS_ICON,\n CLASS_SUBMENU_ARROW,\n CLASS_SUBMENU_ARROW_ICON,\n CLASS_SEPARATOR,\n CLASS_ITEM,\n CLASS_ITEM_LOADING,\n CLASS_ITEM_LEADING,\n CLASS_ITEM_LABEL,\n CLASS_SPINNER,\n CLASS_SPINNER_CUSTOM,\n CLASS_LABEL,\n CSS_VAR_SPINNER_DURATION,\n CLASS_ITEM_CHECKBOX,\n CLASS_CHECKED,\n CLASS_CHECK,\n CLASS_CHECK_CUSTOM,\n CLASS_SHORTCUT,\n CLASS_SHORTCUT_ICON,\n CLASS_ITEM_BADGE,\n CLASS_ITEM_RADIO,\n CLASS_RADIO,\n CLASS_RADIO_CUSTOM,\n CLASS_SUBMENU_TRIGGER,\n CLASS_WRAPPER,\n CLASS_SUBMENU,\n CM_ITEM_KEY,\n CM_SUBMENU_KEY,\n DEFAULT_SUBMENU_ARROW_SVG,\n MAC_MODIFIER_SYMBOLS,\n SHORTCUT_KEY_SYMBOLS,\n WIN_MODIFIER_SYMBOLS,\n CSS_VAR_PREFIX,\n CSS_VAR_ENTER_DURATION,\n CSS_VAR_LEAVE_DURATION,\n CSS_VAR_ENTER_EASING,\n CSS_VAR_LEAVE_EASING,\n THEME_CLASS_DATA_ATTR,\n ANIMATION_TYPE_DATA_ATTR,\n MENU_ROLE_SELECTOR,\n ID_PREFIX,\n} from \"./constants.js\";\n\nconst OPEN_MENU_INSTANCES = new Set<{ close(): Promise<void> }>();\n\n/**\n * Get the portal element.\n * @param portal - The portal element or function that returns the portal element.\n * @returns The portal element.\n */\nfunction getPortal(portal: ContextMenuConfig[\"portal\"]): HTMLElement {\n if (portal == null) return document.body;\n return typeof portal === \"function\" ? portal() : portal;\n}\n\n/**\n * Get the viewport size.\n * @returns The viewport size.\n */\nfunction getViewportSize(): { vw: number; vh: number } {\n const el = document.documentElement;\n return { vw: el.clientWidth, vh: el.clientHeight };\n}\n\n/**\n * Set the attributes on the element.\n * @param el - The element.\n * @param attrs - The attributes to set.\n */\nfunction setAttrs(el: HTMLElement, attrs: Record<string, string>): void {\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n}\n\n/**\n * Set the styles on the element.\n * @param el - The element.\n * @param styles - The styles to set.\n */\nfunction setStyles(el: HTMLElement, styles: Record<string, string>): void {\n for (const [key, value] of Object.entries(styles)) {\n if (key.startsWith(\"--\")) {\n el.style.setProperty(key, value);\n } else {\n (el.style as unknown as Record<string, string>)[key] = value;\n }\n }\n}\n\n/**\n * Add the classes to the element.\n * @param el - The element.\n * @param classes - The classes to add.\n */\nfunction addClasses(el: HTMLElement, ...classes: (string | undefined | null | false)[]): void {\n for (const c of classes) {\n if (!c) continue;\n el.classList.add(...c.trim().split(/\\s+/).filter(Boolean));\n }\n}\n\n/**\n * Check if the platform is Mac-like.\n * @returns True if the platform is Mac-like, false otherwise.\n */\nfunction isMacLikePlatform(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const uaData = (navigator as { userAgentData?: { platform?: string } }).userAgentData?.platform;\n if (uaData === \"macOS\" || uaData === \"iOS\") return true;\n const ua = navigator.userAgent ?? \"\";\n return /Mac|iPhone|iPod|iPad/i.test(ua);\n}\n\n/**\n * Get the modifier display.\n * @param v - The modifier symbol.\n * @param fallback - The fallback string.\n * @returns The modifier display.\n */\nfunction modifierDisplay(v: ModifierSymbol | undefined, fallback: string): string {\n if (v == null) return fallback;\n return typeof v === \"string\" ? v : v.text;\n}\n\n/**\n * Get the shortcut parts.\n * @param shortcut - The shortcut string.\n * @param platformOverride - The platform override.\n * @returns The shortcut parts.\n */\nfunction getShortcutParts(\n shortcut: string,\n platformOverride?: \"mac\" | \"win\" | \"auto\"\n): { mods: ShortcutPart[]; key: ShortcutPart; useCmd: boolean } | null {\n if (!shortcut || typeof shortcut !== \"string\") return null;\n const parts = shortcut.split(\"+\").map((p) => p.trim());\n if (parts.length === 0) return null;\n const keyPart = parts[parts.length - 1] ?? \"\";\n const modParts = parts.slice(0, -1).map((p) => p.toLowerCase());\n const keyLower = keyPart.toLowerCase();\n const keyDisplay = SHORTCUT_KEY_SYMBOLS[keyLower] ?? (keyPart.length === 1 ? keyPart.toUpperCase() : keyPart);\n const useCmd = platformOverride === \"win\" ? false : platformOverride === \"mac\" ? true : isMacLikePlatform();\n const symbolMap = useCmd ? MAC_MODIFIER_SYMBOLS : WIN_MODIFIER_SYMBOLS;\n const mods: ShortcutPart[] = modParts.map((m) => ({\n name: m,\n display:\n useCmd && m === \"ctrl\"\n ? MAC_MODIFIER_SYMBOLS.cmd\n : SHORTCUT_KEY_SYMBOLS[m] ?? modifierDisplay(symbolMap[m as keyof typeof symbolMap], m),\n }));\n return {\n mods,\n key: { name: keyLower, display: keyDisplay },\n useCmd,\n };\n}\n\n/**\n * Normalize the item.\n * @param raw - The raw item.\n * @returns The normalized item.\n */\nfunction normalizeItem(raw: MenuItem): MenuItem {\n const item = { ...raw } as MenuItem;\n if (\"visible\" in item && item.visible === undefined) (item as MenuItemAction).visible = true;\n const hasExplicitType = \"type\" in raw && (raw as { type?: string }).type != null && (raw as { type?: string }).type !== \"\";\n if (!hasExplicitType) {\n if (\"children\" in item) (item as unknown as MenuItemSubmenu).type = \"submenu\";\n else if (\"href\" in item && (item as MenuItemLink).href != null) (item as unknown as MenuItemLink).type = \"link\";\n else if (\"label\" in item && !(\"children\" in item)) (item as MenuItemAction).type = \"item\";\n }\n if (\"children\" in item && item.type === \"submenu\") {\n const rawChildren = (item as MenuItemSubmenu).children;\n if (Array.isArray(rawChildren)) {\n (item as MenuItemSubmenu).children = rawChildren.map(normalizeItem);\n }\n }\n return item;\n}\n\n/**\n * Resolve the submenu children.\n * @param children - The submenu children.\n * @returns The resolved submenu children.\n */\nasync function resolveSubmenuChildren(children: SubmenuChildren): Promise<MenuItem[]> {\n const arr = Array.isArray(children) ? children : await children();\n return arr.map(normalizeItem);\n}\n\n/**\n * Position the menu.\n * @param el - The element.\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n * @param config - The configuration.\n */\nfunction positionMenu(el: HTMLElement, x: number, y: number, config: ContextMenuConfig): void {\n const pos = config.position ?? {};\n const offsetX = pos.offset?.x ?? 0;\n const offsetY = pos.offset?.y ?? 0;\n const padding = pos.padding ?? 8;\n const flip = pos.flip !== false;\n const shift = pos.shift !== false;\n\n setStyles(el, { display: \"\" });\n el.getClientRects();\n const rect = el.getBoundingClientRect();\n const { vw, vh } = getViewportSize();\n\n let left = x + offsetX;\n let top = y + offsetY;\n\n if (flip) {\n if (top + rect.height > vh - padding) top = y - rect.height - offsetY;\n if (left + rect.width > vw - padding) left = x - rect.width - offsetX;\n if (left < padding) left = padding;\n if (top < padding) top = padding;\n }\n if (shift) {\n left = Math.max(padding, Math.min(vw - rect.width - padding, left));\n top = Math.max(padding, Math.min(vh - rect.height - padding, top));\n }\n\n setStyles(el, { left: `${left}px`, top: `${top}px` });\n}\n\n/**\n * Apply the animation configuration.\n * @param root - The root element.\n * @param config - The configuration.\n */\nfunction applyAnimationConfig(root: HTMLElement, config: ContextMenuConfig): void {\n const anim = config.animation;\n if (!anim || anim.disabled) return;\n const animType = anim.type === \"slide\" ? \"slide\" : \"fade\";\n root.setAttribute(ANIMATION_TYPE_DATA_ATTR, animType);\n const enter = anim.enter ?? 120;\n const leave = anim.leave ?? 80;\n const enterMs = typeof enter === \"number\" ? enter : enter.duration;\n const leaveMs = typeof leave === \"number\" ? leave : leave.duration;\n const enterEasing = typeof enter === \"number\" ? \"ease-out\" : enter.easing;\n const leaveEasing = typeof leave === \"number\" ? \"ease-in\" : leave.easing;\n setStyles(root, {\n [CSS_VAR_ENTER_DURATION]: `${enterMs}ms`,\n [CSS_VAR_LEAVE_DURATION]: `${leaveMs}ms`,\n [CSS_VAR_ENTER_EASING]: enterEasing,\n [CSS_VAR_LEAVE_EASING]: leaveEasing,\n });\n}\n\n/**\n * Append the icon to the element.\n * @param el - The element.\n * @param icon - The icon.\n */\nfunction appendIcon(el: HTMLElement, icon: string | HTMLElement): void {\n const wrap = document.createElement(\"span\");\n wrap.setAttribute(\"aria-hidden\", \"true\");\n wrap.className = CLASS_ICON;\n if (typeof icon === \"string\") wrap.textContent = icon;\n else wrap.appendChild(icon);\n el.appendChild(wrap);\n}\n\n/**\n * Append the badge to the element.\n * @param el - The element.\n * @param badge - The badge.\n */\nfunction appendBadge(el: HTMLElement, badge: BadgeConfig): void {\n if (typeof badge === \"string\" || typeof badge === \"number\") {\n const span = document.createElement(\"span\");\n span.setAttribute(\"aria-hidden\", \"true\");\n span.className = CLASS_ITEM_BADGE;\n span.textContent = String(badge);\n el.appendChild(span);\n return;\n }\n if (badge.render) {\n const node = badge.render();\n if (!node.getAttribute(\"aria-hidden\")) node.setAttribute(\"aria-hidden\", \"true\");\n el.appendChild(node);\n return;\n }\n const span = document.createElement(\"span\");\n span.setAttribute(\"aria-hidden\", \"true\");\n span.className = CLASS_ITEM_BADGE;\n if (badge.className) span.classList.add(...badge.className.trim().split(/\\s+/));\n span.textContent = String(badge.content ?? \"\");\n el.appendChild(span);\n}\n\n/**\n * Append the shortcut icon to the element.\n * @param container - The container element.\n * @param icon - The icon.\n */\nfunction appendShortcutIcon(container: HTMLElement, icon: string | HTMLElement): void {\n const wrap = document.createElement(\"span\");\n wrap.setAttribute(\"aria-hidden\", \"true\");\n wrap.className = CLASS_SHORTCUT_ICON;\n if (typeof icon === \"string\") {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = icon;\n while (tmp.firstChild) wrap.appendChild(tmp.firstChild);\n } else wrap.appendChild(icon.cloneNode(true));\n container.appendChild(wrap);\n}\n\n/**\n * Append the shortcut to the element.\n * @param el - The element.\n * @param shortcut - The shortcut.\n * @param shortcutIcons - The shortcut icons.\n * @param platformOverride - The platform override.\n */\nfunction appendShortcut(\n el: HTMLElement,\n shortcut: string,\n shortcutIcons?: Record<string, string | HTMLElement>,\n platformOverride?: \"mac\" | \"win\" | \"auto\"\n): void {\n const sc = document.createElement(\"span\");\n sc.setAttribute(\"aria-hidden\", \"true\");\n sc.className = CLASS_SHORTCUT;\n const parsed = getShortcutParts(shortcut, platformOverride);\n if (!parsed) {\n sc.textContent = shortcut;\n el.appendChild(sc);\n return;\n }\n const { mods, key, useCmd } = parsed;\n const resolveIcon = (name: string): string | HTMLElement | undefined => {\n const v = shortcutIcons?.[name];\n if (v !== undefined) return v;\n if (name === \"win\" || name === \"windows\") {\n if (useCmd) return undefined;\n const entry = WIN_MODIFIER_SYMBOLS.win;\n return typeof entry === \"string\" ? undefined : entry.icon;\n }\n return undefined;\n };\n for (const part of mods) {\n const icon = resolveIcon(part.name);\n if (icon) appendShortcutIcon(sc, icon);\n else sc.appendChild(document.createTextNode(part.display));\n }\n const keyIcon = resolveIcon(key.name);\n if (keyIcon) appendShortcutIcon(sc, keyIcon);\n else sc.appendChild(document.createTextNode(key.display));\n el.appendChild(sc);\n}\n\n/**\n * Append the item content to the element.\n * @param el - The element.\n * @param label - The label.\n * @param opts - The options.\n * @returns The item content element.\n */\nfunction appendItemContent(\n el: HTMLElement,\n label: string,\n opts?: {\n icon?: string | HTMLElement;\n shortcut?: string;\n badge?: BadgeConfig;\n shortcutIcons?: Record<string, string | HTMLElement>;\n platform?: \"mac\" | \"win\" | \"auto\";\n }\n): HTMLElement {\n const leadingSlot = document.createElement(\"span\");\n leadingSlot.className = CLASS_ITEM_LEADING;\n leadingSlot.setAttribute(\"aria-hidden\", \"true\");\n el.appendChild(leadingSlot);\n const labelSpan = document.createElement(\"span\");\n labelSpan.className = CLASS_LABEL;\n labelSpan.textContent = label;\n el.appendChild(labelSpan);\n if (opts?.icon) appendIcon(el, opts.icon);\n if (opts?.shortcut) appendShortcut(el, opts.shortcut, opts.shortcutIcons, opts.platform);\n if (opts?.badge !== undefined) appendBadge(el, opts.badge);\n return leadingSlot;\n}\n\n/**\n * Apply the loading to the item.\n * @param el - The element.\n * @param opts - The options.\n */\nfunction applyLoadingToItem(\n el: HTMLElement,\n opts: SpinnerConfig\n): void {\n const leadingSlot = el.querySelector(`.${CLASS_ITEM_LEADING}`) as HTMLElement | null;\n if (leadingSlot) appendLoadingSpinner(leadingSlot, opts);\n else {\n const wrap = document.createElement(\"span\");\n wrap.className = CLASS_ITEM_LEADING;\n appendLoadingSpinner(wrap, opts);\n el.insertBefore(wrap, el.querySelector(`.${CLASS_LABEL}`) ?? el.firstChild);\n }\n}\n\n/**\n * Apply the item loading state.\n * @param el - The element.\n * @param item - The item.\n * @param getSpinnerOptions - The function to get the spinner options.\n */\nfunction applyItemLoadingState(\n el: HTMLElement,\n item: MenuItem,\n getSpinnerOptions?: (it: MenuItem) => SpinnerConfig\n): void {\n addClasses(el, CLASS_ITEM_LOADING);\n el.setAttribute(\"aria-busy\", \"true\");\n applyLoadingToItem(el, getSpinnerOptions?.(item) ?? {});\n}\n\n/**\n * Set the item id and disabled state.\n * @param el - The element.\n * @param id - The id.\n * @param disabled - The disabled state.\n */\nfunction setItemIdDisabled(el: HTMLElement, id?: string, disabled?: boolean): void {\n if (id) el.id = id;\n if (disabled) el.setAttribute(\"aria-disabled\", \"true\");\n}\n\n/**\n * Assign the cm item to the element.\n * @param el - The element.\n * @param item - The item.\n * @param extras - The extras.\n */\nfunction assignCmItem(\n el: HTMLElement,\n item: MenuItem,\n extras?: { _cmCheckbox?: MenuItemCheckbox; _cmRadio?: MenuItemRadio; _cmSubmenu?: MenuItemSubmenu }\n): void {\n const o = el as unknown as Record<string, unknown>;\n o[CM_ITEM_KEY] = item;\n if (extras?._cmCheckbox) o._cmCheckbox = extras._cmCheckbox;\n if (extras?._cmRadio) o._cmRadio = extras._cmRadio;\n if (extras?._cmSubmenu) o[CM_SUBMENU_KEY] = extras._cmSubmenu;\n}\n\n/**\n * Get the cm item from the element.\n * @param el - The element.\n * @returns The cm item.\n */\nfunction getCmItem(el: HTMLElement): MenuItem | undefined {\n const o = el as unknown as Record<string, unknown>;\n const sub = o[CM_SUBMENU_KEY] as MenuItemSubmenu | undefined;\n return sub ?? (o[CM_ITEM_KEY] as MenuItem | undefined);\n}\n\n/**\n * Get the cm submenu from the element.\n * @param el - The element.\n * @returns The cm submenu.\n */\nfunction getCmSubmenu(el: HTMLElement): MenuItemSubmenu | undefined {\n return (el as unknown as Record<string, unknown>)[CM_SUBMENU_KEY] as MenuItemSubmenu | undefined;\n}\n\n/**\n * Add the item hover listeners.\n * @param el - The element.\n * @param item - The item.\n * @param callbacks - The callbacks.\n */\nfunction addItemHoverListeners(\n el: HTMLElement,\n item: MenuItem,\n callbacks: {\n onHoverFocus?: (el: HTMLElement) => void;\n onEnterParentItem?: (el: HTMLElement) => void;\n onItemHoverCallback?: (item: MenuItem, nativeEvent: MouseEvent | FocusEvent) => void;\n afterFire?: (e: MouseEvent | FocusEvent) => void;\n onMouseLeave?: () => void;\n }\n): void {\n const fire = (e: MouseEvent | FocusEvent): void => {\n callbacks.onHoverFocus?.(el);\n callbacks.onEnterParentItem?.(el);\n callbacks.onItemHoverCallback?.(item, e);\n if (\"disabled\" in item && item.disabled) clearRovingFocus(el.closest(MENU_ROLE_SELECTOR) as HTMLElement | null);\n callbacks.afterFire?.(e);\n };\n el.addEventListener(\"mouseenter\", fire);\n el.addEventListener(\"focus\", fire);\n if (callbacks.onMouseLeave) el.addEventListener(\"mouseleave\", callbacks.onMouseLeave);\n}\n\n/**\n * Attach custom DOM event handlers from an item's events registry to the element.\n * @param el - The element.\n * @param events - Event registry or function that returns it.\n */\nfunction attachItemEvents(el: HTMLElement, events: EventRegistry | (() => EventRegistry) | undefined): void {\n if (events == null) return;\n const registry = typeof events === \"function\" ? events() : events;\n for (const [eventName, entry] of Object.entries(registry)) {\n if (entry == null) continue;\n if (typeof entry === \"function\") el.addEventListener(eventName, entry as EventListener);\n else el.addEventListener(eventName, entry.listener as EventListener, entry.options);\n }\n}\n\n/**\n * Append the state indicator to the element.\n * @param el - The element.\n * @param checked - The checked state.\n * @param icon - The icon.\n * @param uncheckedIcon - The unchecked icon.\n * @param baseClass - The base class.\n * @param customClass - The custom class.\n * @param checkedClassName - The checked class name.\n * @param uncheckedClassName - The unchecked class name.\n */\nfunction appendStateIndicator(\n el: HTMLElement,\n checked: boolean | undefined,\n icon: string | HTMLElement | undefined,\n uncheckedIcon: string | HTMLElement | undefined,\n baseClass: string,\n customClass: string,\n checkedClassName?: string,\n uncheckedClassName?: string\n): void {\n const isChecked = Boolean(checked);\n const span = document.createElement(\"span\");\n span.setAttribute(\"aria-hidden\", \"true\");\n const hasCustom = (icon !== undefined && icon !== null) || (uncheckedIcon !== undefined && uncheckedIcon !== null);\n span.className = baseClass + (hasCustom ? ` ${customClass}` : \"\");\n if (isChecked && checkedClassName) span.classList.add(...checkedClassName.trim().split(/\\s+/));\n if (!isChecked && uncheckedClassName) span.classList.add(...uncheckedClassName.trim().split(/\\s+/));\n if (hasCustom) {\n const indicatorIcon = isChecked ? icon : uncheckedIcon;\n if (indicatorIcon) {\n if (typeof indicatorIcon === \"string\") span.innerHTML = indicatorIcon;\n else span.appendChild(indicatorIcon.cloneNode(true));\n }\n }\n el.appendChild(span);\n}\n\n/**\n * Convert the size to CSS.\n * @param size - The size.\n * @returns The CSS size.\n */\nfunction sizeToCss(size: number | string): string {\n return typeof size === \"number\" ? `${size}px` : size;\n}\n\n/**\n * Append the loading spinner to the element.\n * @param container - The container element.\n * @param options - The options.\n */\nfunction appendLoadingSpinner(container: HTMLElement, options: SpinnerConfig): void {\n const spinner = document.createElement(\"span\");\n spinner.className = CLASS_SPINNER;\n spinner.setAttribute(\"aria-hidden\", \"true\");\n const icon = options.icon;\n const hasCustomIcon = icon !== undefined && icon !== null;\n if (hasCustomIcon && icon !== undefined) {\n spinner.classList.add(CLASS_SPINNER_CUSTOM);\n if (typeof icon === \"string\") {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = icon;\n while (tmp.firstChild) spinner.appendChild(tmp.firstChild);\n } else spinner.appendChild(icon.cloneNode(true));\n }\n const speedMs = options.speed ?? DEFAULT_SPINNER_SPEED_MS;\n const spinnerStyles: Record<string, string> = { [CSS_VAR_SPINNER_DURATION]: `${speedMs}ms` };\n if (options.size !== undefined) {\n const sizeCss = sizeToCss(options.size);\n spinnerStyles.width = sizeCss;\n spinnerStyles.height = sizeCss;\n spinnerStyles.minWidth = sizeCss;\n spinnerStyles.minHeight = sizeCss;\n }\n setStyles(spinner, spinnerStyles);\n container.appendChild(spinner);\n}\n\n/**\n * Normalize the submenu arrow.\n * @param value - The value.\n * @returns The normalized submenu arrow.\n */\nfunction normalizeSubmenuArrow(value: ContextMenuConfig[\"submenuArrow\"]): SubmenuArrowConfig | null {\n if (value === false || value === undefined) return null;\n if (value === true) return { icon: DEFAULT_SUBMENU_ARROW_SVG, size: 14 };\n return value;\n}\n\n/**\n * Append the submenu arrow to the element.\n * @param parent - The parent element.\n * @param config - The configuration.\n */\nfunction appendSubmenuArrow(parent: HTMLElement, config: SubmenuArrowConfig): void {\n const wrap = document.createElement(\"span\");\n wrap.setAttribute(\"aria-hidden\", \"true\");\n wrap.className = CLASS_SUBMENU_ARROW;\n if (config.className) wrap.classList.add(config.className);\n const icon = config.icon ?? DEFAULT_SUBMENU_ARROW_SVG;\n const size = config.size ?? 14;\n const arrowStyles: Record<string, string> = {};\n if (config.opacity !== undefined) arrowStyles.opacity = String(config.opacity);\n const sizeCss = sizeToCss(size);\n arrowStyles.width = sizeCss;\n arrowStyles.height = sizeCss;\n arrowStyles.minWidth = sizeCss;\n arrowStyles.minHeight = sizeCss;\n if (Object.keys(arrowStyles).length > 0) setStyles(wrap, arrowStyles);\n wrap.classList.add(CLASS_SUBMENU_ARROW_ICON);\n if (typeof icon === \"string\") {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = icon;\n while (tmp.firstChild) wrap.appendChild(tmp.firstChild);\n } else wrap.appendChild(icon.cloneNode(true));\n parent.appendChild(wrap);\n}\n\n/**\n * Create the state item node.\n * @param item - The item.\n * @param type - The type.\n * @param callbacks - The callbacks.\n * @returns The state item node.\n */\nfunction createStateItemNode(\n item: MenuItemCheckbox | MenuItemRadio,\n type: \"checkbox\" | \"radio\",\n callbacks: {\n close: (selectedItem?: MenuItem) => void;\n refreshContent?: () => void;\n getSpinnerOptions?: (it: MenuItem) => SpinnerConfig;\n onHoverFocus?: (el: HTMLElement) => void;\n onEnterParentItem?: (el: HTMLElement) => void;\n onItemHoverCallback?: (item: MenuItem, nativeEvent: MouseEvent | FocusEvent) => void;\n shortcutIcons?: Record<string, string | HTMLElement>;\n platform?: \"mac\" | \"win\" | \"auto\";\n }\n): HTMLElement {\n const { close, refreshContent, getSpinnerOptions, onHoverFocus, onEnterParentItem, onItemHoverCallback, shortcutIcons, platform } = callbacks;\n\n let role: string;\n let itemClass: string;\n let indicatorBase: string;\n let indicatorCustom: string;\n let assignExtra: { _cmCheckbox?: MenuItemCheckbox; _cmRadio?: MenuItemRadio };\n if (type === \"checkbox\") {\n role = \"menuitemcheckbox\";\n itemClass = CLASS_ITEM_CHECKBOX;\n indicatorBase = CLASS_CHECK;\n indicatorCustom = CLASS_CHECK_CUSTOM;\n assignExtra = { _cmCheckbox: item as MenuItemCheckbox };\n } else {\n role = \"menuitemradio\";\n itemClass = CLASS_ITEM_RADIO;\n indicatorBase = CLASS_RADIO;\n indicatorCustom = CLASS_RADIO_CUSTOM;\n assignExtra = { _cmRadio: item as MenuItemRadio };\n }\n\n let el: HTMLElement;\n if (item.render) el = item.render(item as MenuItemCheckbox & MenuItemRadio);\n else {\n el = document.createElement(\"div\");\n el.className = `${CLASS_ITEM} ${itemClass}`;\n addClasses(el, item.className, getVariantClass(item.variant), item.checked && CLASS_CHECKED);\n appendStateIndicator(el, item.checked, item.icon, item.uncheckedIcon, indicatorBase, indicatorCustom, item.checkedClassName, item.uncheckedClassName);\n appendItemContent(el, item.label, { icon: item.leadingIcon, shortcut: item.shortcut, shortcutIcons, platform });\n }\n\n assignCmItem(el, item, assignExtra);\n setAttrs(el, { role, \"aria-checked\": item.checked ? \"true\" : \"false\", tabindex: \"-1\" });\n setItemIdDisabled(el, item.id, item.disabled);\n if (item.loading) applyItemLoadingState(el, item, getSpinnerOptions);\n addItemHoverListeners(el, item, { onHoverFocus, onEnterParentItem, onItemHoverCallback });\n attachItemEvents(el, item.events);\n\n let handleTypeAction: (e: MouseEvent) => void;\n if (type === \"checkbox\") {\n const chk = item as MenuItemCheckbox;\n handleTypeAction = (e) => {\n if (!chk.onChange) return;\n chk.onChange({ item: chk, checked: !chk.checked, nativeEvent: e, close });\n };\n } else {\n const radioItem = item as MenuItemRadio;\n handleTypeAction = (e) => {\n if (!radioItem.onSelect) return;\n radioItem.onSelect({ item: radioItem, value: radioItem.value, nativeEvent: e, close });\n };\n }\n\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (item.disabled || item.loading) return;\n handleTypeAction(e);\n refreshContent?.();\n if (item.closeOnAction !== false) close(item);\n });\n return el;\n}\n\n/**\n * Create the item node.\n * @param item - The item.\n * @param close - The function to close the menu.\n * @param triggerSubmenu - The function to trigger the submenu.\n * @param scheduleSubmenuOpen - The function to schedule the submenu open.\n * @param scheduleSubmenuClose - The function to schedule the submenu close.\n * @param onHoverFocus - The function to handle the hover focus.\n * @param onEnterParentItem - The function to handle the enter parent item.\n * @param submenuArrowConfig - The submenu arrow configuration.\n * @param refreshContent - The function to refresh the content.\n * @param onItemHoverCallback - The function to handle the item hover callback.\n * @param getSpinnerOptions - The function to get the spinner options.\n * @param shortcutIcons - The shortcut icons.\n * @param platform - The platform.\n * @returns The item node.\n */\nfunction createItemNode(\n item: MenuItem,\n close: (selectedItem?: MenuItem) => void,\n triggerSubmenu: (item: MenuItemSubmenu, el: HTMLElement) => void,\n scheduleSubmenuOpen?: (sub: MenuItemSubmenu, el: HTMLElement) => void,\n scheduleSubmenuClose?: (triggerEl: HTMLElement) => void,\n onHoverFocus?: (el: HTMLElement) => void,\n onEnterParentItem?: (el: HTMLElement) => void,\n submenuArrowConfig?: SubmenuArrowConfig | null,\n refreshContent?: () => void,\n onItemHoverCallback?: (item: MenuItem, nativeEvent: MouseEvent | FocusEvent) => void,\n getSpinnerOptions?: (item: MenuItem) => SpinnerConfig,\n shortcutIcons?: Record<string, string | HTMLElement>,\n platform?: \"mac\" | \"win\" | \"auto\"\n): HTMLElement | null {\n const arrowConfig = submenuArrowConfig ?? null;\n if (\"visible\" in item && item.visible === false) return null;\n\n if (item.type === \"separator\") {\n const el = document.createElement(\"div\");\n el.setAttribute(\"role\", \"separator\");\n el.className = CLASS_SEPARATOR;\n addClasses(el, item.className);\n if (\"events\" in item && item.events) attachItemEvents(el, item.events);\n return el;\n }\n\n if (item.type === \"label\") {\n const labelItem = item as MenuItemLabel;\n const el = document.createElement(\"div\");\n el.setAttribute(\"role\", \"presentation\");\n el.className = `${CLASS_ITEM} ${CLASS_ITEM_LABEL}`;\n addClasses(el, labelItem.className);\n setItemIdDisabled(el, labelItem.id);\n const labelSpan = document.createElement(\"span\");\n labelSpan.className = CLASS_LABEL;\n labelSpan.textContent = labelItem.label;\n el.appendChild(labelSpan);\n if (\"events\" in labelItem && labelItem.events) attachItemEvents(el, labelItem.events);\n return el;\n }\n\n if (item.type === \"checkbox\" || item.type === \"radio\") {\n return createStateItemNode(\n item as MenuItemCheckbox | MenuItemRadio,\n item.type,\n { close, refreshContent, getSpinnerOptions, onHoverFocus, onEnterParentItem, onItemHoverCallback, shortcutIcons, platform }\n );\n }\n\n if (item.type === \"submenu\") {\n const sub = item as MenuItemSubmenu;\n const el = document.createElement(\"div\");\n assignCmItem(el, sub, { _cmSubmenu: sub });\n setAttrs(el, { role: \"menuitem\", \"aria-haspopup\": \"menu\", \"aria-expanded\": \"false\", tabindex: \"-1\" });\n el.className = `${CLASS_ITEM} ${CLASS_SUBMENU_TRIGGER}`;\n addClasses(el, sub.className, getVariantClass(sub.variant));\n setItemIdDisabled(el, sub.id, sub.disabled);\n\n const label = document.createElement(\"span\");\n label.className = CLASS_LABEL;\n label.textContent = sub.label;\n el.appendChild(label);\n if (sub.icon) appendIcon(el, sub.icon);\n if (sub.shortcut) appendShortcut(el, sub.shortcut, shortcutIcons, platform);\n if (sub.badge !== undefined) appendBadge(el, sub.badge);\n if (arrowConfig) appendSubmenuArrow(el, arrowConfig);\n\n addItemHoverListeners(el, sub, {\n onHoverFocus,\n onEnterParentItem,\n onItemHoverCallback,\n afterFire: () => {\n if (!sub.disabled) {\n if (scheduleSubmenuOpen) scheduleSubmenuOpen(sub, el);\n else triggerSubmenu(sub, el);\n }\n },\n onMouseLeave: scheduleSubmenuClose ? () => scheduleSubmenuClose(el) : undefined,\n });\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (sub.disabled) return;\n triggerSubmenu(sub, el);\n });\n attachItemEvents(el, sub.events);\n return el;\n }\n\n if (item.type === \"link\") {\n const linkItem = item as MenuItemLink;\n const el = document.createElement(\"a\");\n el.className = CLASS_ITEM;\n addClasses(el, linkItem.className, getVariantClass(linkItem.variant));\n if (!linkItem.disabled) {\n el.href = linkItem.href;\n if (linkItem.target) el.target = linkItem.target;\n if (linkItem.rel) el.rel = linkItem.rel;\n }\n appendItemContent(el, linkItem.label, { icon: linkItem.icon, shortcut: linkItem.shortcut, badge: linkItem.badge, shortcutIcons, platform });\n assignCmItem(el, linkItem);\n setAttrs(el, { role: \"menuitem\", tabindex: \"-1\" });\n setItemIdDisabled(el, linkItem.id, linkItem.disabled);\n if (linkItem.loading) applyItemLoadingState(el, linkItem, getSpinnerOptions);\n addItemHoverListeners(el, linkItem, { onHoverFocus, onEnterParentItem, onItemHoverCallback });\n el.addEventListener(\"click\", (e) => {\n if (linkItem.disabled || linkItem.loading) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n const isModifier = e.ctrlKey || e.metaKey;\n if (isModifier) {\n close(linkItem);\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n if (linkItem.target === \"_blank\") {\n window.open(linkItem.href, \"_blank\", linkItem.rel ? `rel=${linkItem.rel}` : undefined);\n } else window.location.href = linkItem.href;\n close(linkItem);\n });\n attachItemEvents(el, linkItem.events);\n return el;\n }\n\n const action = item as MenuItemAction;\n let el: HTMLElement;\n if (action.render) el = action.render(action);\n else {\n el = document.createElement(\"div\");\n el.className = CLASS_ITEM;\n addClasses(el, action.className, getVariantClass(action.variant));\n appendItemContent(el, action.label, { icon: action.icon, shortcut: action.shortcut, badge: action.badge, shortcutIcons, platform });\n }\n assignCmItem(el, action);\n setAttrs(el, { role: \"menuitem\", tabindex: \"-1\" });\n setItemIdDisabled(el, action.id, action.disabled);\n if (action.loading) applyItemLoadingState(el, action, getSpinnerOptions);\n addItemHoverListeners(el, action, { onHoverFocus, onEnterParentItem, onItemHoverCallback });\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (action.disabled || action.loading || !action.onClick) return;\n const event: MenuClickEvent = {\n item: action,\n nativeEvent: e,\n close,\n };\n action.onClick(event);\n if (action.closeOnAction !== false) close(action);\n });\n attachItemEvents(el, action.events);\n return el;\n}\n\n/**\n * Get the focusable items.\n * @param menuEl - The menu element.\n * @returns The focusable items.\n */\nfunction getFocusableItems(menuEl: HTMLElement): HTMLElement[] {\n return Array.from(\n menuEl.querySelectorAll<HTMLElement>(\n \"[role='menuitem']:not([aria-disabled='true']), [role='menuitemcheckbox']:not([aria-disabled='true']), [role='menuitemradio']:not([aria-disabled='true'])\"\n )\n );\n}\n\n/**\n * Set the roving tabindex.\n * @param items - The items.\n * @param focusedIndex - The focused index.\n */\nfunction setRovingTabindex(items: HTMLElement[], focusedIndex: number): void {\n items.forEach((node, i) => {\n node.setAttribute(\"tabindex\", i === focusedIndex ? \"0\" : \"-1\");\n });\n if (items[focusedIndex]) items[focusedIndex].focus();\n}\n\n/**\n * Clear the roving focus.\n * @param menuEl - The menu element.\n */\nfunction clearRovingFocus(menuEl: HTMLElement | null): void {\n if (!menuEl) return;\n const items = getFocusableItems(menuEl);\n items.forEach((node) => node.setAttribute(\"tabindex\", \"-1\"));\n menuEl.focus();\n}\n\n/**\n * Make the hover focus handler.\n * @param menuEl - The menu element.\n * @returns The hover focus handler.\n */\nfunction makeHoverFocusHandler(menuEl: HTMLElement): (el: HTMLElement) => void {\n return (el: HTMLElement) => {\n const items = getFocusableItems(menuEl);\n const idx = items.indexOf(el);\n if (idx >= 0) setRovingTabindex(items, idx);\n };\n}\n\n/**\n * Deep clone the menu.\n * @param items - The items.\n * @returns The deep cloned menu.\n */\nfunction deepCloneMenu(items: MenuItem[]): MenuItem[] {\n return items.map((item) => {\n const clone = { ...item } as MenuItem;\n if (\"children\" in clone && clone.type === \"submenu\") {\n const subChildren = (clone as MenuItemSubmenu).children;\n (clone as MenuItemSubmenu).children = Array.isArray(subChildren)\n ? deepCloneMenu(subChildren)\n : subChildren;\n }\n return clone;\n });\n}\n\n/**\n * Get the coordinates from the anchor.\n * @param anchor - The anchor.\n * @returns The coordinates.\n */\nfunction getCoordsFromAnchor(anchor: { x: number; y: number } | DOMRect): { x: number; y: number } {\n if (\"width\" in anchor && \"height\" in anchor) {\n const rect = anchor as DOMRect;\n return { x: rect.left + rect.width / 2, y: rect.top };\n }\n return anchor as { x: number; y: number };\n}\n\n/**\n * Get the variant class.\n * @param variant - The variant.\n * @returns The variant class.\n */\nfunction getVariantClass(variant: MenuItemVariant | undefined): string | null {\n if (!variant) return null;\n return `${ID_PREFIX}item--${variant.trim()}`;\n}\n\n/**\n * Normalize the key for the shortcut.\n * @param key - The key.\n * @returns The normalized key.\n */\nfunction normalizeKeyForShortcut(key: string): string {\n if (key.length === 1) return key.toLowerCase();\n return key;\n}\n\n/**\n * Check if the shortcut matches the event.\n * @param shortcut - The shortcut.\n * @param e - The event.\n * @returns True if the shortcut matches the event, false otherwise.\n */\nfunction shortcutMatchesEvent(shortcut: string, e: KeyboardEvent): boolean {\n const parts = shortcut.split(\"+\").map((p) => p.trim()).filter(Boolean);\n if (parts.length === 0) return false;\n\n const keyPart = parts[parts.length - 1] ?? \"\";\n if (normalizeKeyForShortcut(keyPart) !== normalizeKeyForShortcut(e.key)) return false;\n\n const mods = parts.slice(0, -1).map((p) => p.toLowerCase());\n const wantsCtrlOrCmd = mods.includes(\"ctrl\") || mods.includes(\"cmd\");\n\n if (wantsCtrlOrCmd) {\n const useCmd = isMacLikePlatform();\n const correctPressed = useCmd ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey;\n if (!correctPressed) return false;\n } else if (e.ctrlKey || e.metaKey) {\n return false;\n }\n\n const modifierMatches = (modName: string, pressed: boolean): boolean =>\n mods.includes(modName) ? pressed : !pressed;\n if (!modifierMatches(\"alt\", e.altKey)) return false;\n if (!modifierMatches(\"shift\", e.shiftKey)) return false;\n return true;\n}\n\n/**\n * Apply the theme to the element.\n * @param el - The element.\n * @param theme - The theme.\n */\nfunction applyThemeToElement(el: HTMLElement, theme: ContextMenuConfig[\"theme\"]): void {\n const prevClass = el.getAttribute(THEME_CLASS_DATA_ATTR);\n if (prevClass) {\n prevClass.trim().split(/\\s+/).forEach((c) => el.classList.remove(c));\n }\n el.removeAttribute(THEME_CLASS_DATA_ATTR);\n if (theme?.class) {\n addClasses(el, ...theme.class.trim().split(/\\s+/).filter(Boolean));\n el.setAttribute(THEME_CLASS_DATA_ATTR, theme.class);\n }\n if (theme?.tokens) {\n const tokens: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme.tokens)) {\n tokens[key.startsWith(\"--\") ? key : CSS_VAR_PREFIX + key] = value;\n }\n setStyles(el, tokens);\n }\n}\n\n/**\n * Cancel the leave animation.\n * @param state - The state.\n */\nfunction cancelLeaveAnimation(state: ContextMenuState): void {\n if (state.leaveTimeout) {\n clearTimeout(state.leaveTimeout);\n state.leaveTimeout = null;\n }\n if (state.leaveTransitionHandler) {\n state.root.removeEventListener(\"transitionend\", state.leaveTransitionHandler);\n state.leaveTransitionHandler = null;\n }\n state.root.classList.remove(ROOT_LEAVE_CLASS);\n}\n\n/**\n * On fully closed.\n * @param state - The state.\n */\nfunction onFullyClosed(state: ContextMenuState): void {\n OPEN_MENU_INSTANCES.delete(state.self);\n state.openPromiseResolve?.(state.lastSelectedItem);\n state.openPromiseResolve = null;\n state.closePromiseResolve?.();\n state.closePromiseResolve = null;\n}\n\n/**\n * Perform the root close.\n * @param state - The state.\n */\nfunction performRootClose(state: ContextMenuState): void {\n const anim = state.currentConfig.animation;\n const rawLeave = anim?.leave ?? 80;\n const leaveMs: number = anim?.disabled ? 0 : (typeof rawLeave === \"number\" ? rawLeave : rawLeave.duration);\n const closeContext: CloseContext = { selectedItem: state.lastSelectedItem, anchor: state.lastAnchor };\n\n if (leaveMs > 0 && !anim?.disabled) {\n state.root.classList.remove(ROOT_OPEN_CLASS);\n state.root.classList.add(ROOT_LEAVE_CLASS);\n const onEnd = (): void => {\n if (state.leaveTimeout) clearTimeout(state.leaveTimeout);\n state.leaveTimeout = null;\n if (state.leaveTransitionHandler) {\n state.root.removeEventListener(\"transitionend\", state.leaveTransitionHandler);\n state.leaveTransitionHandler = null;\n }\n state.root.classList.remove(ROOT_LEAVE_CLASS);\n setStyles(state.root, { display: \"none\" });\n state.wrapper.remove();\n onFullyClosed(state);\n state.currentConfig.onClose?.(closeContext);\n state.currentConfig.onAfterClose?.(closeContext);\n if (state.lastFocusTarget && typeof state.lastFocusTarget.focus === \"function\") state.lastFocusTarget.focus();\n };\n state.leaveTransitionHandler = onEnd;\n state.root.addEventListener(\"transitionend\", onEnd, { once: true });\n state.leaveTimeout = setTimeout(onEnd, leaveMs + 50);\n } else {\n setStyles(state.root, { display: \"none\" });\n state.wrapper.remove();\n onFullyClosed(state);\n state.currentConfig.onClose?.(closeContext);\n state.currentConfig.onAfterClose?.(closeContext);\n if (state.lastFocusTarget && typeof state.lastFocusTarget.focus === \"function\") state.lastFocusTarget.focus();\n }\n}\n\n/**\n * Close the submenu with animation.\n * @param panel - The panel element.\n * @param trigger - The trigger element.\n * @param state - The state.\n * @param options - The options.\n */\nfunction closeSubmenuWithAnimation(\n panel: HTMLElement,\n trigger: HTMLElement,\n state: ContextMenuState,\n options: { clearOpenSubmenu?: boolean; onDone?: () => void } = {}\n): void {\n const { clearOpenSubmenu = true, onDone } = options;\n const anim = state.currentConfig.animation;\n const rawLeave = anim?.leave ?? 80;\n const leaveMs: number = anim?.disabled ? 0 : (typeof rawLeave === \"number\" ? rawLeave : rawLeave.duration);\n\n const finish = (): void => {\n panel.remove();\n trigger.setAttribute(\"aria-expanded\", \"false\");\n trigger.classList.remove(SUBMENU_OPEN_CLASS);\n if (clearOpenSubmenu) {\n const idx = state.openSubmenus.findIndex((e) => e.panel === panel);\n if (idx >= 0) state.openSubmenus.splice(idx, 1);\n }\n onDone?.();\n };\n\n if (leaveMs <= 0 || anim?.disabled) {\n finish();\n return;\n }\n\n panel.classList.remove(ROOT_OPEN_CLASS);\n panel.classList.add(ROOT_LEAVE_CLASS);\n let done = false;\n const onEnd = (): void => {\n if (done) return;\n done = true;\n panel.removeEventListener(\"transitionend\", onEnd);\n if (t) clearTimeout(t);\n finish();\n };\n panel.addEventListener(\"transitionend\", onEnd, { once: true });\n const t = setTimeout(onEnd, leaveMs + 50);\n}\n\n/**\n * Perform the real close.\n * @param state - The state.\n * @returns The promise to resolve the close.\n */\nfunction realClose(state: ContextMenuState): Promise<void> {\n return new Promise((resolve) => {\n (async () => {\n const allow = await Promise.resolve(state.currentConfig.onBeforeClose?.());\n if (allow === false) {\n resolve();\n return;\n }\n if (!state.isOpen) {\n resolve();\n return;\n }\n state.closePromiseResolve = resolve;\n state.isOpen = false;\n if (state.outsideClickHandler) {\n document.removeEventListener(\"mousedown\", state.outsideClickHandler, true);\n state.outsideClickHandler = null;\n }\n if (state.resizeHandler) {\n window.removeEventListener(\"resize\", state.resizeHandler);\n state.resizeHandler = null;\n }\n cancelLeaveAnimation(state);\n if (state.submenuHoverTimer) clearTimeout(state.submenuHoverTimer);\n state.submenuHoverTimer = null;\n\n if (state.openSubmenus.length > 0) {\n const toClose = state.openSubmenus.slice();\n state.openSubmenus.length = 0;\n let idx = toClose.length - 1;\n const closeNext = (): void => {\n if (idx < 0) {\n performRootClose(state);\n return;\n }\n const { panel, trigger } = toClose[idx];\n idx--;\n closeSubmenuWithAnimation(panel, trigger, state, { clearOpenSubmenu: false, onDone: closeNext });\n };\n closeNext();\n return;\n }\n performRootClose(state);\n })();\n });\n}\n\n/**\n * Open the submenu panel.\n * @param state - The state.\n * @param sub - The submenu.\n * @param triggerEl - The trigger element.\n * @returns The promise to resolve the open.\n */\nasync function openSubmenuPanel(state: ContextMenuState, sub: MenuItemSubmenu, triggerEl: HTMLElement): Promise<void> {\n let containIndex = -1;\n if (state.root.contains(triggerEl)) containIndex = -1;\n else {\n for (let i = 0; i < state.openSubmenus.length; i++) {\n if (!state.openSubmenus[i].panel.contains(triggerEl)) continue;\n containIndex = i;\n break;\n }\n }\n for (let j = state.openSubmenus.length - 1; j > containIndex; j--) {\n const { panel: p, trigger: t } = state.openSubmenus[j];\n state.closeSubmenuWithAnimation(p, t, { clearOpenSubmenu: true });\n }\n const resolvedChildren = await resolveSubmenuChildren(sub.children);\n const panel = document.createElement(\"div\");\n setAttrs(panel, { role: \"menu\", \"aria-label\": sub.label, \"aria-orientation\": \"vertical\", tabindex: \"-1\" });\n panel.className = `${ROOT_CLASS} ${CLASS_SUBMENU}`;\n panel.addEventListener(\"mouseenter\", state.cancelSubmenuClose);\n applyThemeToElement(panel, state.currentConfig.theme);\n applyAnimationConfig(panel, state.currentConfig);\n const step = state.currentConfig.position?.submenuZIndexStep ?? 0;\n const base = state.currentConfig.position?.zIndexBase ?? 9999;\n if (step > 0) setStyles(panel, { zIndex: String(base + (state.openSubmenus.length + 1) * step) });\n\n resolvedChildren.forEach((child) => {\n const node = createItemNode(child, state.closeWithSelection, (subItem, el) => void state.openSubmenuPanel(subItem as MenuItemSubmenu, el), state.scheduleSubmenuOpen, state.scheduleSubmenuClose, state.makeHoverFocusHandler(panel), state.onEnterMenuItem, state.submenuArrowConfig, state.refreshContent, (it, ev) => state.currentConfig.onItemHover?.({ item: it, nativeEvent: ev }), state.getSpinnerOptions, state.currentConfig.shortcutIcons, state.currentConfig.platform);\n if (node) panel.appendChild(node);\n });\n\n state.wrapper.appendChild(panel);\n const triggerRect = triggerEl.getBoundingClientRect();\n const padding = state.currentConfig.position?.padding ?? 8;\n const { vw, vh } = getViewportSize();\n const isRtl = getComputedStyle(triggerEl).direction === \"rtl\";\n const placement = sub.submenuPlacement ?? state.currentConfig.submenuPlacement ?? \"auto\";\n setStyles(panel, { display: \"\" });\n panel.getClientRects();\n const rect = panel.getBoundingClientRect();\n let left: number;\n if (placement === \"left\") {\n left = triggerRect.left - rect.width - 2;\n if (left < padding) left = triggerRect.right + 2;\n } else if (placement === \"right\") {\n left = triggerRect.right + 2;\n if (left + rect.width > vw - padding) left = triggerRect.left - rect.width - 2;\n } else {\n if (isRtl) {\n left = triggerRect.left - rect.width - 2;\n if (left < padding) left = triggerRect.right + 2;\n } else {\n left = triggerRect.right + 2;\n if (left + rect.width > vw - padding) left = triggerRect.left - rect.width - 2;\n }\n }\n let top = triggerRect.top;\n if (top + rect.height > vh - padding) top = vh - rect.height - padding;\n if (top < padding) top = padding;\n setStyles(panel, { left: `${left}px`, top: `${top}px` });\n\n triggerEl.setAttribute(\"aria-expanded\", \"true\");\n triggerEl.classList.add(SUBMENU_OPEN_CLASS);\n state.openSubmenus.push({ panel, trigger: triggerEl });\n\n requestAnimationFrame(() => panel.classList.add(ROOT_OPEN_CLASS));\n}\n\n/**\n * Schedule the submenu open.\n * @param state - The state.\n * @param sub - The submenu.\n * @param triggerEl - The trigger element.\n */\nfunction scheduleSubmenuOpen(state: ContextMenuState, sub: MenuItemSubmenu, triggerEl: HTMLElement): void {\n const top = state.openSubmenus[state.openSubmenus.length - 1];\n if (top && top.trigger === triggerEl) {\n triggerEl.focus();\n return;\n }\n if (state.submenuHoverTimer) clearTimeout(state.submenuHoverTimer);\n state.submenuHoverTimer = setTimeout(() => {\n state.submenuHoverTimer = null;\n const currentTop = state.openSubmenus[state.openSubmenus.length - 1];\n if (currentTop && currentTop.trigger === triggerEl) return;\n void state.openSubmenuPanel(sub, triggerEl);\n }, SUBMENU_HOVER_DELAY_MS);\n}\n\n/**\n * Schedule the submenu close.\n * @param state - The state.\n * @param triggerEl - The trigger element.\n */\nfunction scheduleSubmenuClose(state: ContextMenuState, triggerEl: HTMLElement): void {\n if (state.submenuHoverTimer) clearTimeout(state.submenuHoverTimer);\n state.submenuHoverTimer = setTimeout(() => {\n state.submenuHoverTimer = null;\n const idx = state.openSubmenus.findIndex((e) => e.trigger === triggerEl);\n if (idx < 0) return;\n for (let j = state.openSubmenus.length - 1; j >= idx; j--) {\n const { panel, trigger } = state.openSubmenus[j];\n state.closeSubmenuWithAnimation(panel, trigger, { clearOpenSubmenu: true });\n }\n }, SUBMENU_CLOSE_DELAY_MS);\n}\n\n/**\n * Cancel the submenu close.\n * @param state - The state.\n */\nfunction cancelSubmenuClose(state: ContextMenuState): void {\n if (state.submenuHoverTimer) clearTimeout(state.submenuHoverTimer);\n state.submenuHoverTimer = null;\n}\n\n/**\n * On enter menu item.\n * @param state - The state.\n * @param el - The element.\n */\nfunction onEnterMenuItem(state: ContextMenuState, el: HTMLElement): void {\n if (state.openSubmenus.length === 0) return;\n state.cancelSubmenuClose();\n const menuEl = el.closest(MENU_ROLE_SELECTOR) as HTMLElement | null;\n if (!menuEl) return;\n let levelIndex = -1;\n if (menuEl !== state.root) {\n for (let i = 0; i < state.openSubmenus.length; i++) {\n if (state.openSubmenus[i].panel !== menuEl) continue;\n levelIndex = i;\n break;\n }\n }\n for (let j = state.openSubmenus.length - 1; j > levelIndex; j--) {\n const { panel, trigger } = state.openSubmenus[j];\n state.closeSubmenuWithAnimation(panel, trigger, { clearOpenSubmenu: true });\n }\n}\n\n/**\n * Refresh the content.\n * @param state - The state.\n */\nfunction refreshContent(state: ContextMenuState): void {\n if (!state.isOpen || typeof state.currentConfig.menu !== \"function\") return;\n state.menu = state.currentConfig.menu().map(normalizeItem);\n state.buildRootContent();\n}\n\n/**\n * Get the spinner options.\n * @param state - The state.\n * @param it - The item.\n * @returns The spinner options.\n */\nfunction getSpinnerOptions(state: ContextMenuState, it: MenuItem): SpinnerConfig {\n const base = state.currentConfig.spinner ?? {};\n const hasOverrides =\n it && typeof it === \"object\" &&\n (\"loadingIcon\" in it || \"loadingSize\" in it || \"loadingSpeed\" in it);\n if (!hasOverrides) return base;\n return {\n ...base,\n ...(\"loadingIcon\" in it && it.loadingIcon !== undefined && { icon: it.loadingIcon }),\n ...(\"loadingSize\" in it && it.loadingSize !== undefined && { size: it.loadingSize }),\n ...(\"loadingSpeed\" in it && it.loadingSpeed !== undefined && { speed: it.loadingSpeed }),\n };\n}\n\n/**\n * Build the root content.\n * @param state - The state.\n */\nfunction buildRootContent(state: ContextMenuState): void {\n state.root.innerHTML = \"\";\n state.menu.forEach((item) => {\n const node = createItemNode(item, state.closeWithSelection, state.triggerSubmenu, state.scheduleSubmenuOpen, state.scheduleSubmenuClose, state.makeHoverFocusHandler(state.root), (el) => state.onEnterMenuItem(el), state.submenuArrowConfig, state.refreshContent, (it, ev) => state.currentConfig.onItemHover?.({ item: it, nativeEvent: ev }), state.getSpinnerOptions, state.currentConfig.shortcutIcons, state.currentConfig.platform);\n if (node) state.root.appendChild(node);\n });\n}\n\n/**\n * Open the implementation.\n * @param state - The state.\n * @param xOrEvent - The x or event.\n * @param y - The y coordinate.\n * @returns The promise to resolve the open.\n */\nfunction openImpl(state: ContextMenuState, xOrEvent?: number | MouseEvent, y?: number): Promise<MenuItem | undefined> {\n return new Promise((resolve) => {\n state.openPromiseResolve = resolve;\n (async () => {\n if (typeof state.currentConfig.menu === \"function\") {\n state.menu = state.currentConfig.menu().map(normalizeItem);\n }\n const openEvent = typeof xOrEvent === \"object\" && xOrEvent !== null ? xOrEvent : undefined;\n let xCoord: number;\n let yCoord: number;\n if (openEvent) {\n xCoord = openEvent.clientX;\n yCoord = openEvent.clientY;\n } else {\n const noCoords = xOrEvent === undefined && y === undefined;\n if (noCoords && state.currentConfig.getAnchor) {\n const anchor = state.currentConfig.getAnchor();\n const coords = getCoordsFromAnchor(anchor);\n xCoord = coords.x;\n yCoord = coords.y;\n } else {\n xCoord = (xOrEvent as number) ?? 0;\n yCoord = y ?? 0;\n }\n }\n const openContext: OpenContext = {\n x: xCoord,\n y: yCoord,\n target: openEvent?.target instanceof Element ? openEvent.target : null,\n event: openEvent,\n };\n const allow = await Promise.resolve(state.currentConfig.onBeforeOpen?.(openEvent, openContext));\n if (allow === false) {\n state.openPromiseResolve?.(undefined);\n state.openPromiseResolve = null;\n return;\n }\n OPEN_MENU_INSTANCES.add(state.self);\n const others = [...OPEN_MENU_INSTANCES].filter((o) => o !== state.self);\n await Promise.all(others.map((o) => o.close()));\n cancelLeaveAnimation(state);\n if (state.isOpen) await state.realClose();\n state.lastAnchor = { x: xCoord, y: yCoord };\n state.lastSelectedItem = undefined;\n state.lastFocusTarget = document.activeElement as HTMLElement | null;\n state.isOpen = true;\n state.buildRootContent();\n if (!state.wrapper.parentElement) state.portal.appendChild(state.wrapper);\n state.outsideClickHandler = (e: MouseEvent): void => {\n if (!state.wrapper.contains(e.target as Node)) void state.realClose();\n };\n document.addEventListener(\"mousedown\", state.outsideClickHandler, true);\n if (state.currentConfig.closeOnResize) {\n state.resizeHandler = (): void => void state.realClose();\n window.addEventListener(\"resize\", state.resizeHandler);\n }\n positionMenu(state.root, xCoord, yCoord, state.currentConfig);\n setStyles(state.root, { display: \"\" });\n\n const applyOpenState = (): void => {\n state.root.classList.add(ROOT_OPEN_CLASS);\n state.currentConfig.onOpen?.(openEvent);\n const items = getFocusableItems(state.root);\n if (items.length) setRovingTabindex(items, 0);\n };\n const anim = state.currentConfig.animation;\n if (anim?.disabled) {\n applyOpenState();\n return;\n }\n state.root.getClientRects();\n requestAnimationFrame(applyOpenState);\n })();\n });\n}\n\n/**\n * Handle the keydown event.\n * @param state - The state.\n * @param e - The event.\n */\nfunction handleKeydown(state: ContextMenuState, e: KeyboardEvent): void {\n const target = e.target as HTMLElement;\n const menuEl = target.closest(MENU_ROLE_SELECTOR) as HTMLElement;\n if (!menuEl) return;\n const isSub = menuEl.classList.contains(CLASS_SUBMENU);\n const items = getFocusableItems(menuEl);\n let idx = items.indexOf(target);\n if (idx === -1) {\n if (e.key === \"ArrowDown\" && items.length) {\n e.preventDefault();\n setRovingTabindex(items, 0);\n } else if (e.key === \"ArrowUp\" && items.length) {\n e.preventDefault();\n setRovingTabindex(items, items.length - 1);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setRovingTabindex(items, (idx + 1) % items.length);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setRovingTabindex(items, idx === 0 ? items.length - 1 : idx - 1);\n break;\n }\n case \"ArrowRight\": {\n e.preventDefault();\n const sub = getCmSubmenu(target);\n if (sub) void state.openSubmenuPanel(sub, target);\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n if (isSub && state.openSubmenus.length > 0) {\n const { panel, trigger } = state.openSubmenus[state.openSubmenus.length - 1];\n state.closeSubmenuWithAnimation(panel, trigger, { clearOpenSubmenu: true, onDone: () => trigger.focus() });\n } else void state.realClose();\n break;\n }\n case \"Enter\":\n case \" \": {\n e.preventDefault();\n const sub = getCmSubmenu(target);\n if (sub) void state.openSubmenuPanel(sub, target);\n else target.click();\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n if (isSub && state.openSubmenus.length > 0) {\n const { panel, trigger } = state.openSubmenus[state.openSubmenus.length - 1];\n state.closeSubmenuWithAnimation(panel, trigger, { clearOpenSubmenu: true, onDone: () => trigger.focus() });\n } else void state.realClose();\n break;\n }\n case \"Home\": {\n e.preventDefault();\n setRovingTabindex(items, 0);\n break;\n }\n case \"End\": {\n e.preventDefault();\n setRovingTabindex(items, items.length - 1);\n break;\n }\n default: {\n const itemWithShortcut = items.find((el) => {\n const it = getCmItem(el);\n if (!it || !(\"shortcut\" in it) || !it.shortcut) return false;\n return shortcutMatchesEvent(it.shortcut, e);\n });\n if (itemWithShortcut) {\n e.preventDefault();\n const sub = getCmSubmenu(itemWithShortcut);\n if (sub) {\n void state.openSubmenuPanel(sub, itemWithShortcut);\n requestAnimationFrame(() => {\n const last = state.openSubmenus[state.openSubmenus.length - 1];\n if (!last) return;\n const subItems = getFocusableItems(last.panel);\n if (subItems.length) setRovingTabindex(subItems, 0);\n });\n } else itemWithShortcut.click();\n }\n break;\n }\n }\n}\n\n/**\n * Clear the long press timer.\n * @param state - The state.\n */\nfunction clearLongPressTimer(state: ContextMenuState): void {\n if (!state.longPressTimer) return;\n clearTimeout(state.longPressTimer);\n state.longPressTimer = null;\n}\n\n/**\n * Unbind the element.\n * @param state - The state.\n * @param el - The element.\n */\nfunction unbind(state: ContextMenuState, el?: HTMLElement): void {\n if (el != null && state.boundElement !== el) return;\n if (!state.boundElement) return;\n clearLongPressTimer(state);\n if (state.boundContextmenu) state.boundElement.removeEventListener(\"contextmenu\", state.boundContextmenu);\n if (state.boundTouchstart) state.boundElement.removeEventListener(\"touchstart\", state.boundTouchstart);\n state.boundElement.removeEventListener(\"touchend\", state.boundTouchEndOrCancel);\n state.boundElement.removeEventListener(\"touchcancel\", state.boundTouchEndOrCancel);\n state.boundElement = null;\n state.boundContextmenu = null;\n state.boundTouchstart = null;\n}\n\n/**\n * Bind the element.\n * @param state - The state.\n * @param el - The element.\n * @param options - The options.\n */\nfunction bind(state: ContextMenuState, el: HTMLElement, options?: BindOptions): void {\n unbind(state);\n const longPressMs = options?.longPressMs ?? DEFAULT_LONG_PRESS_MS;\n state.boundContextmenu = (e: MouseEvent): void => {\n e.preventDefault();\n if (\"pointerType\" in e && (e as PointerEvent).pointerType === \"touch\") return;\n openImpl(state, e);\n };\n state.boundTouchstart = (e: TouchEvent): void => {\n if (e.touches.length !== 1) return;\n clearLongPressTimer(state);\n state.longPressX = e.touches[0].clientX;\n state.longPressY = e.touches[0].clientY;\n state.longPressTimer = setTimeout(() => {\n state.longPressTimer = null;\n openImpl(state, state.longPressX, state.longPressY);\n }, longPressMs);\n };\n state.boundTouchEndOrCancel = (): void => clearLongPressTimer(state);\n el.addEventListener(\"contextmenu\", state.boundContextmenu);\n el.addEventListener(\"touchstart\", state.boundTouchstart, { passive: true });\n el.addEventListener(\"touchend\", state.boundTouchEndOrCancel, { passive: true });\n el.addEventListener(\"touchcancel\", state.boundTouchEndOrCancel, { passive: true });\n state.boundElement = el;\n}\n\n/**\n * Destroy the state.\n * @param state - The state.\n */\nfunction destroy(state: ContextMenuState): void {\n unbind(state);\n if (state.outsideClickHandler) {\n document.removeEventListener(\"mousedown\", state.outsideClickHandler, true);\n state.outsideClickHandler = null;\n }\n if (state.resizeHandler) {\n window.removeEventListener(\"resize\", state.resizeHandler);\n state.resizeHandler = null;\n }\n if (state.leaveTimeout) clearTimeout(state.leaveTimeout);\n if (state.submenuHoverTimer) clearTimeout(state.submenuHoverTimer);\n state.wrapper.remove();\n state.wrapper.removeEventListener(\"keydown\", state._keydownHandler);\n}\n\n/**\n * Set the menu.\n * @param state - The state.\n * @param newMenu - The new menu.\n */\nfunction setMenu(state: ContextMenuState, newMenu: MenuItem[]): void {\n state.menu = newMenu.map(normalizeItem);\n if (state.isOpen) state.buildRootContent();\n}\n\n/**\n * Set the theme.\n * @param state - The state.\n * @param theme - The theme.\n */\nfunction setTheme(state: ContextMenuState, theme: ContextMenuConfig[\"theme\"]): void {\n state.currentConfig.theme = theme;\n applyThemeToElement(state.root, theme);\n for (const { panel } of state.openSubmenus) applyThemeToElement(panel, theme);\n}\n\n/**\n * Set the position.\n * @param state - The state.\n * @param position - The position.\n */\nfunction setPosition(state: ContextMenuState, position: ContextMenuConfig[\"position\"]): void {\n state.currentConfig.position = position;\n}\n\n/**\n * Set the animation.\n * @param state - The state.\n * @param animation - The animation.\n */\nfunction setAnimation(state: ContextMenuState, animation: ContextMenuConfig[\"animation\"]): void {\n state.currentConfig.animation = animation;\n applyAnimationConfig(state.root, state.currentConfig);\n for (const { panel } of state.openSubmenus) applyAnimationConfig(panel, state.currentConfig);\n}\n\n/**\n * Open the menu at an element.\n * @param state - The state.\n * @param element - The element.\n * @param options - The options.\n */\nfunction openAtElement(state: ContextMenuState, element: HTMLElement, options?: OpenAtElementOptions): void {\n const offset = options?.offset ?? { x: 0, y: 0 };\n const rect = element.getBoundingClientRect();\n let placement: Placement = options?.placement ?? \"bottom-start\";\n if (placement === \"auto\") {\n const padding = state.currentConfig.position?.padding ?? 8;\n const { vw, vh } = getViewportSize();\n const spaceTop = rect.top - padding;\n const spaceBottom = vh - rect.bottom - padding;\n const spaceLeft = rect.left - padding;\n const spaceRight = vw - rect.right - padding;\n const vertical = spaceBottom >= spaceTop ? \"bottom\" : \"top\";\n const isRtl = getComputedStyle(element).direction === \"rtl\";\n const spaceStart = isRtl ? spaceRight : spaceLeft;\n const spaceEnd = isRtl ? spaceLeft : spaceRight;\n const startOrEnd = spaceEnd >= spaceStart ? (isRtl ? \"end\" : \"start\") : isRtl ? \"start\" : \"end\";\n placement = `${vertical}-${startOrEnd}` as Placement;\n }\n let x: number;\n let y: number;\n switch (placement) {\n case \"bottom-start\": x = rect.left; y = rect.bottom; break;\n case \"bottom-end\": x = rect.right; y = rect.bottom; break;\n case \"top-start\": x = rect.left; y = rect.top; break;\n case \"top-end\": x = rect.right; y = rect.top; break;\n case \"left-start\": x = rect.left; y = rect.top; break;\n case \"left-end\": x = rect.left; y = rect.bottom; break;\n case \"right-start\": x = rect.right; y = rect.top; break;\n case \"right-end\": x = rect.right; y = rect.bottom; break;\n default: x = rect.left; y = rect.bottom;\n }\n openImpl(state, x + offset.x, y + offset.y);\n}\n\n/**\n * Create the instance.\n * @param state - The state.\n * @returns The instance.\n */\nfunction createInstance(state: ContextMenuState): ContextMenuInstance {\n return {\n open: (xOrEvent?: number | MouseEvent, y?: number) => openImpl(state, xOrEvent, y),\n close: () => state.realClose(),\n toggle(x?, y?) {\n if (state.isOpen) void state.realClose();\n else void openImpl(state, x ?? 0, y ?? 0);\n },\n openAtElement: (element, options?) => openAtElement(state, element, options),\n isOpen: () => state.isOpen,\n getAnchor: () => state.lastAnchor,\n getMenu: () => deepCloneMenu(state.menu),\n getRootElement: () => state.wrapper,\n updateMenu: (updater) => setMenu(state, updater(deepCloneMenu(state.menu))),\n bind: (el, options?) => bind(state, el, options),\n unbind: (el?) => unbind(state, el),\n destroy: () => destroy(state),\n setMenu: (newMenu) => setMenu(state, newMenu),\n setTheme: (theme) => setTheme(state, theme),\n setPosition: (position) => setPosition(state, position),\n setAnimation: (animation) => setAnimation(state, animation),\n };\n}\n\n/**\n * Create the context menu.\n * @param config - The configuration.\n * @returns The context menu instance.\n */\nexport function createContextMenu(config: ContextMenuConfig): ContextMenuInstance {\n const currentConfig = { ...config };\n const rawMenu = typeof currentConfig.menu === \"function\" ? currentConfig.menu() : (currentConfig.menu ?? []);\n const menu = rawMenu.map(normalizeItem);\n const portal = getPortal(currentConfig.portal);\n const wrapper = document.createElement(\"div\");\n wrapper.className = CLASS_WRAPPER;\n const root = document.createElement(\"div\");\n setAttrs(root, { role: \"menu\", \"aria-orientation\": \"vertical\", tabindex: \"-1\" });\n root.className = ROOT_CLASS;\n setStyles(root, { display: \"none\", ...(currentConfig.position?.zIndexBase != null ? { zIndex: String(currentConfig.position.zIndexBase) } : {}) });\n applyThemeToElement(root, currentConfig.theme);\n applyAnimationConfig(root, currentConfig);\n wrapper.appendChild(root);\n\n const state: ContextMenuState = {\n currentConfig,\n menu,\n portal,\n wrapper,\n root,\n submenuArrowConfig: normalizeSubmenuArrow(currentConfig.submenuArrow),\n isOpen: false,\n lastFocusTarget: null,\n leaveTimeout: null,\n leaveTransitionHandler: null,\n openSubmenus: [],\n submenuHoverTimer: null,\n outsideClickHandler: null,\n resizeHandler: null,\n boundElement: null,\n boundContextmenu: null!,\n boundTouchstart: null!,\n boundTouchEndOrCancel: (): void => {},\n longPressTimer: null,\n longPressX: 0,\n longPressY: 0,\n lastAnchor: null,\n lastSelectedItem: undefined,\n openPromiseResolve: null,\n closePromiseResolve: null,\n self: null!,\n closeWithSelection: null!,\n realClose: null!,\n openSubmenuPanel: null!,\n scheduleSubmenuOpen: null!,\n scheduleSubmenuClose: null!,\n cancelSubmenuClose: null!,\n closeSubmenuWithAnimation: null!,\n buildRootContent: null!,\n refreshContent: null!,\n getSpinnerOptions: null!,\n makeHoverFocusHandler: null!,\n onEnterMenuItem: null!,\n triggerSubmenu: null!,\n _keydownHandler: null!,\n };\n\n state.self = { close: () => realClose(state) };\n state.closeWithSelection = (selectedItem?) => {\n if (selectedItem !== undefined) state.lastSelectedItem = selectedItem;\n void realClose(state);\n };\n state.realClose = () => realClose(state);\n state.openSubmenuPanel = (sub, triggerEl) => openSubmenuPanel(state, sub, triggerEl);\n state.scheduleSubmenuOpen = (sub, triggerEl) => scheduleSubmenuOpen(state, sub, triggerEl);\n state.scheduleSubmenuClose = (triggerEl) => scheduleSubmenuClose(state, triggerEl);\n state.cancelSubmenuClose = () => cancelSubmenuClose(state);\n state.closeSubmenuWithAnimation = (panel, trigger, options) => closeSubmenuWithAnimation(panel, trigger, state, options);\n state.buildRootContent = () => buildRootContent(state);\n state.refreshContent = () => refreshContent(state);\n state.getSpinnerOptions = (it) => getSpinnerOptions(state, it);\n state.makeHoverFocusHandler = makeHoverFocusHandler;\n state.onEnterMenuItem = (el) => onEnterMenuItem(state, el);\n state.triggerSubmenu = (sub, triggerEl) => void state.openSubmenuPanel(sub, triggerEl);\n\n state._keydownHandler = (e: KeyboardEvent) => handleKeydown(state, e);\n wrapper.addEventListener(\"keydown\", state._keydownHandler);\n\n const bindConfig = currentConfig.bind;\n if (bindConfig != null) {\n const el = bindConfig instanceof HTMLElement ? bindConfig : bindConfig.element;\n bind(state, el, bindConfig instanceof HTMLElement ? undefined : bindConfig.options);\n }\n\n return createInstance(state);\n}\n"],"mappings":"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","names":["span","getSpinnerOptions","refreshContent","scheduleSubmenuOpen","scheduleSubmenuClose","el"]}