UNPKG

accessible-menu

Version:

A JavaScript library to help you generate WCAG accessible menus in the DOM.

3 lines 54.3 kB
"use strict";function w(r,e){r===""||r.length===0||(typeof r=="string"?e.classList.add(r):e.classList.add(...r))}function k(r,e){r===""||r.length===0||(typeof r=="string"?e.classList.remove(r):e.classList.remove(...r))}function A(r,e){try{if(typeof e!="object"){const t=typeof e;throw new TypeError(`Elements given to isValidInstance() must be inside of an object. "${t}" given.`)}for(const t in e)if(!(e[t]instanceof r)){const s=typeof e[t];throw new TypeError(`${t} must be an instance of ${r.name}. "${s}" given.`)}return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function h(r,e){try{if(typeof e!="object"){const t=typeof e;throw new TypeError(`Values given to isValidType() must be inside of an object. "${t}" given.`)}for(const t in e){const s=typeof e[t];if(s!==r)throw new TypeError(`${t} must be a ${r}. "${s}" given.`)}return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function x(r){try{if(typeof r!="object"){const e=typeof r;throw new TypeError(`Values given to isQuerySelector() must be inside of an object. "${e}" given.`)}for(const e in r)try{if(r[e]===null)throw new Error;document.querySelector(r[e])}catch{throw new TypeError(`${e} must be a valid query selector. "${r[e]}" given.`)}return{status:!0,error:null}}catch(e){return{status:!1,error:e}}}function D(r){try{if(typeof r!="object"||Array.isArray(r)){const e=typeof r;throw new TypeError(`Values given to isValidClassList() must be inside of an object. "${e}" given.`)}for(const e in r){const t=typeof r[e];if(t!=="string")if(Array.isArray(r[e]))r[e].forEach(s=>{if(typeof s!="string")throw new TypeError(`${e} must be a string or an array of strings. An array containing non-strings given.`)});else throw new TypeError(`${e} must be a string or an array of strings. "${t}" given.`);else{const s={};s[e]=r[e],x(s)}}return{status:!0,error:null}}catch(e){return{status:!1,error:e}}}function V(r){try{if(typeof r!="object"){const t=typeof r;throw new TypeError(`Values given to isValidState() must be inside of an object. "${t}" given.`)}const e=["none","self","child"];for(const t in r)if(!e.includes(r[t]))throw new TypeError(`${t} must be one of the following values: ${e.join(", ")}. "${r[t]}" given.`);return{status:!0,error:null}}catch(e){return{status:!1,error:e}}}function P(r){try{if(typeof r!="object"){const t=typeof r;throw new TypeError(`Values given to isValidEvent() must be inside of an object. "${t}" given.`)}const e=["none","mouse","keyboard","character"];for(const t in r)if(!e.includes(r[t]))throw new TypeError(`${t} must be one of the following values: ${e.join(", ")}. "${r[t]}" given.`);return{status:!0,error:null}}catch(e){return{status:!1,error:e}}}function j(r){try{if(typeof r!="object"){const t=typeof r;throw new TypeError(`Values given to isValidHoverType() must be inside of an object. "${t}" given.`)}const e=["off","on","dynamic"];for(const t in r)if(!e.includes(r[t]))throw new TypeError(`${t} must be one of the following values: ${e.join(", ")}. "${r[t]}" given.`);return{status:!0,error:null}}catch(e){return{status:!1,error:e}}}function $(r,e){if(h("string",{tagName:r}).status&&A(HTMLElement,e).status){const t=r.toLowerCase();let s=!0;for(const n in e)e[n].tagName.toLowerCase()!==t&&(s=!1);return s}else return!1}class L{_dom={toggle:null,parent:null};_elements={controlledMenu:null,parentMenu:null};_open=!1;_expandEvent=new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}});_collapseEvent=new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}});constructor({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n=null}){this._dom.toggle=e,this._dom.parent=t,this._elements.controlledMenu=s,this._elements.parentMenu=n}initialize(){this._setIds(),this._setAriaAttributes(),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){h("boolean",{isOpen:e}),this._open=e}_setIds(){if(this.dom.toggle.id===""||this.elements.controlledMenu.dom.menu.id===""){let e=this.dom.toggle.innerText?.replace(/[^a-zA-Z0-9\s]/g,"")||"",t=this.elements.controlledMenu.key;!e.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(e=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),e.replace(/\s/g,"").length>0&&(e=e.toLowerCase().replace(/\s+/g,"-"),e.startsWith("-")&&(e=e.substring(1)),e.endsWith("-")&&(e=e.slice(0,-1)),t=`${e}-${t}`),this.dom.toggle.id=this.dom.toggle.id||`menu-button-${t}`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`menu-${t}`}}_setAriaAttributes(){this.dom.toggle.setAttribute("aria-expanded","false"),this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id)}_expand(e=!0){const{closeClass:t,openClass:s,transitionClass:n,openDuration:i}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),this.elements.controlledMenu.elements.rootMenu.hasOpened=!0,n!==""?(w(n,this.elements.controlledMenu.dom.menu),requestAnimationFrame(()=>{k(t,this.elements.controlledMenu.dom.menu),requestAnimationFrame(()=>{w(s,this.elements.controlledMenu.dom.menu),requestAnimationFrame(()=>{setTimeout(()=>{k(n,this.elements.controlledMenu.dom.menu)},i)})})})):(w(s,this.elements.controlledMenu.dom.menu),k(t,this.elements.controlledMenu.dom.menu)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(e=!0){const{closeClass:t,openClass:s,transitionClass:n,closeDuration:i}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),n!==""?(w(n,this.elements.controlledMenu.dom.menu),requestAnimationFrame(()=>{k(s,this.elements.controlledMenu.dom.menu),requestAnimationFrame(()=>{w(t,this.elements.controlledMenu.dom.menu),requestAnimationFrame(()=>{setTimeout(()=>{k(n,this.elements.controlledMenu.dom.menu)},i)})})})):(w(t,this.elements.controlledMenu.dom.menu),k(s,this.elements.controlledMenu.dom.menu)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this.isOpen||(this._expand(),this.isOpen=!0)}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this.isOpen||(this._expand(),this.isOpen=!0)}close(){this.isOpen&&(this.elements.controlledMenu.blur(),this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._collapse(),this.isOpen=!1)}toggle(){this.isOpen?this.close():this.open()}closeSiblings(){this.elements.parentMenu&&this.elements.parentMenu.elements.submenuToggles.forEach(e=>{e!==this&&e.close()})}closeChildren(){this.elements.controlledMenu.elements.submenuToggles.forEach(e=>e.close())}}class O{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n=!1,childMenu:i=null,toggle:l=null}){this._dom.item=e,this._dom.link=t,this._elements.parentMenu=s,this._elements.childMenu=i,this._elements.toggle=l,this._submenu=n}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&requestAnimationFrame(()=>{this.dom.link.focus()})}blur(){this.elements.parentMenu.shouldFocus&&requestAnimationFrame(()=>{this.dom.link.blur()})}}function y(r){try{const e=r.key||r.keyCode,t={Enter:e==="Enter"||e===13,Space:e===" "||e==="Spacebar"||e===32,Escape:e==="Escape"||e==="Esc"||e===27,ArrowUp:e==="ArrowUp"||e==="Up"||e===38,ArrowRight:e==="ArrowRight"||e==="Right"||e===39,ArrowDown:e==="ArrowDown"||e==="Down"||e===40,ArrowLeft:e==="ArrowLeft"||e==="Left"||e===37,Home:e==="Home"||e===36,End:e==="End"||e===35,Character:isNaN(e)&&!!e.match(/^[a-zA-Z]{1}$/),Tab:e==="Tab"||e===9,Asterisk:e==="*"||e===56};return Object.keys(t).find(s=>t[s]===!0)||""}catch{return""}}function o(r){r.preventDefault(),r.stopPropagation()}class I{_MenuType=I;_MenuItemType=O;_MenuToggleType=L;_dom={menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null};_selectors={menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""};_elements={menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null};_openClass="show";_closeClass="hide";_transitionClass="transitioning";_transitionDuration=250;_openDuration=-1;_closeDuration=-1;_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;_enterDelay=-1;_leaveDelay=-1;_prefix="am-";_hoverTimeout=null;_hasOpened=!1;_key="";_errors=[];constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:s="a",submenuItemSelector:n="li:has(ul)",submenuToggleSelector:i="a",submenuSelector:l="ul",controllerElement:u=null,containerElement:c=null,openClass:a="show",closeClass:d="hide",transitionClass:f="transitioning",transitionDuration:p=250,openDuration:m=-1,closeDuration:_=-1,isTopLevel:g=!0,parentMenu:M=null,hoverType:b="off",hoverDelay:C=250,enterDelay:T=-1,leaveDelay:E=-1,prefix:v="am-",key:S=null}){this._dom.menu=e,this._dom.controller=u,this._dom.container=c,this._selectors.menuItems=t,this._selectors.menuLinks=s,this._selectors.submenuItems=n,this._selectors.submenuToggles=i,this._selectors.submenus=l,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=M,this._elements.rootMenu=g?this:null,this._openClass=a||"",this._closeClass=d||"",this._transitionClass=f||"",this._transitionDuration=p,this._openDuration=m,this._closeDuration=_,this._prefix=v||"",this._key=S||"",this._root=g,this._hoverType=b,this._hoverDelay=C,this._enterDelay=T,this._leaveDelay=E}initialize(){if(!this._validate())throw new Error(`AccessibleMenu: cannot initialize menu. The following errors have been found: - ${this.errors.join(` - `)}`);if(this.elements.rootMenu===null&&this._findRootMenu(this),this._generateKey(),this._setDOMElements(),this.isTopLevel){if(this._setIds(),this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});$("button",{toggle:e.dom.toggle})||e.dom.toggle.setAttribute("role","button"),e.dom.toggle.setAttribute("aria-controls",this.dom.menu.id),this._elements.controller=e}window.AccessibleMenu=window.AccessibleMenu||{menus:{}},typeof window.AccessibleMenu.menus!="object"&&(window.AccessibleMenu.menus={}),window.AccessibleMenu.menus[this.dom.menu.id]=this}this._createChildElements(),this._setTransitionDurations()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get key(){if(this.isTopLevel)return this._key;const e=this.elements.parentMenu.dom.submenus.indexOf(this.dom.menu)||0;return`${this.elements.parentMenu.key}-${e}`}get errors(){return this._errors}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}set openClass(e){D({openClass:e}),this._openClass!==e&&(this._openClass=e)}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}set closeClass(e){D({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}get transitionClass(){return this.isTopLevel?this._transitionClass:this.elements.rootMenu.transitionClass}set transitionClass(e){D({transitionClass:e}),this._transitionClass!==e&&(this._transitionClass=e)}get transitionDuration(){return this.isTopLevel?this._transitionDuration:this.elements.rootMenu.transitionDuration}set transitionDuration(e){h("number",{transitionDuration:e}),this._transitionDuration!==e&&(this._transitionDuration=e,this._setTransitionDurations())}get openDuration(){return this._openDuration===-1?this.transitionDuration:this.isTopLevel?this._openDuration:this.elements.rootMenu.openDuration}set openDuration(e){h("number",{openDuration:e}),this._openDuration!==e&&(this._openDuration=e,this._setTransitionDurations())}get closeDuration(){return this._closeDuration===-1?this.transitionDuration:this.isTopLevel?this._closeDuration:this.elements.rootMenu.closeDuration}set closeDuration(e){h("number",{closeDuration:e}),this._closeDuration!==e&&(this._closeDuration=e,this._setTransitionDurations())}get currentChild(){return this._currentChild}set currentChild(e){h("number",{currentChild:e});function t(s){if(["mouse","character"].includes(s.currentEvent)&&s.elements.parentMenu){let i=0,l=!1;for(;!l&&i<s.elements.parentMenu.elements.menuItems.length;){const u=s.elements.parentMenu.elements.menuItems[i];u.isSubmenuItem&&u.elements.toggle.elements.controlledMenu===s&&(l=!0,s.elements.parentMenu.currentEvent=s.currentEvent,s.elements.parentMenu.currentChild=i),i++}}}e<-1?(this._currentChild=-1,t(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,t(this)):this.focusChild!==e&&(this._currentChild=e,t(this))}get focusState(){return this._focusState}set focusState(e){V({focusState:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&(e==="self"||e==="none")&&this.elements.submenuToggles.forEach(t=>{t.elements.controlledMenu.focusState="none"}),this.elements.parentMenu&&(e==="self"||e==="child")&&(this.elements.parentMenu.focusState="child")}get currentEvent(){return this._currentEvent}set currentEvent(e){P({currentEvent:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach(t=>{t.elements.controlledMenu.currentEvent=e}))}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}set hoverType(e){j({hoverType:e}),this._hoverType!==e&&(this._hoverType=e)}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}set hoverDelay(e){h("number",{hoverDelay:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}get enterDelay(){return this._enterDelay===-1?this.hoverDelay:this._root?this._enterDelay:this.elements.rootMenu.enterDelay}set enterDelay(e){h("number",{enterDelay:e}),this._enterDelay!==e&&(this._enterDelay=e)}get leaveDelay(){return this._leaveDelay===-1?this.hoverDelay:this._root?this._leaveDelay:this.elements.rootMenu.leaveDelay}set leaveDelay(e){h("number",{leaveDelay:e}),this._leaveDelay!==e&&(this._leaveDelay=e)}get prefix(){return this._root?this._prefix:this.elements.rootMenu.prefix}set prefix(e){h("string",{prefix:e}),this._prefix!==e&&(this._prefix=e)}get shouldFocus(){let e=!1;return(this.currentEvent==="keyboard"||this.currentEvent==="character")&&(e=!0),this.currentEvent==="mouse"&&this.hoverType==="dynamic"&&(e=!0),e}get hasOpened(){return this._root?this._hasOpened:this.elements.rootMenu.hasOpened}set hasOpened(e){h("boolean",{hasOpened:e}),this._hasOpened!==e&&(this._hasOpened=e)}_validate(){let e=!0,t;this._dom.container!==null||this._dom.controller!==null?t=A(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container}):t=A(HTMLElement,{menuElement:this._dom.menu}),t.status||(this._errors.push(t.error.message),e=!1);let s;if(this._selectors.submenuItems!==""?s=x({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus}):s=x({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks}),s.status||(this._errors.push(s.error.message),e=!1),this._openClass!==""){const m=D({openClass:this._openClass});m.status||(this._errors.push(m.error.message),e=!1)}if(this._closeClass!==""){const m=D({closeClass:this._closeClass});m.status||(this._errors.push(m.error.message),e=!1)}if(this._transitionClass!==""){const m=D({transitionClass:this._transitionClass});m.status||(this._errors.push(m.error.message),e=!1)}const n=h("number",{transitionDuration:this._transitionDuration});n.status||(this._errors.push(n.error.message),e=!1);const i=h("number",{openDuration:this._openDuration});i.status||(this._errors.push(i.error.message),e=!1);const l=h("number",{closeDuration:this._closeDuration});l.status||(this._errors.push(l.error.message),e=!1);const u=h("boolean",{isTopLevel:this._root});if(u.status||(this._errors.push(u.error.message),e=!1),this._elements.parentMenu!==null){const m=A(I,{parentMenu:this._elements.parentMenu});m.status||(this._errors.push(m.error.message),e=!1)}const c=j({hoverType:this._hoverType});c.status||(this._errors.push(c.error.message),e=!1);const a=h("number",{hoverDelay:this._hoverDelay});a.status||(this._errors.push(a.error.message),e=!1);const d=h("number",{enterDelay:this._enterDelay});d.status||(this._errors.push(d.error.message),e=!1);const f=h("number",{leaveDelay:this._leaveDelay});if(f.status||(this._errors.push(f.error.message),e=!1),this._key!==""){const m=h("string",{key:this._key});m.status||(this._errors.push(m.error.message),e=!1)}const p=h("string",{prefix:this._prefix});return p.status||(this._errors.push(p.error.message),e=!1),e}_setDOMElementType(e,t=this.dom.menu,s=!0){if(typeof this.selectors[e]=="string"){if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);t!==this.dom.menu&&A(HTMLElement,{base:t});const i=Array.from(t.querySelectorAll(this.selectors[e])).filter(l=>l.parentElement===t);s?this._dom[e]=i:this._dom[e]=[...this._dom[e],...i]}else throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`)}_resetDOMElementType(e){if(typeof this.dom[e]<"u"){if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}else throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`)}_setDOMElements(){this._setDOMElementType("menuItems"),this.selectors.submenuItems!==""&&(this._setDOMElementType("submenuItems"),this._resetDOMElementType("submenuToggles"),this._resetDOMElementType("submenus"),this.dom.submenuItems.forEach(e=>{this._setDOMElementType("submenuToggles",e,!1),this._setDOMElementType("submenus",e,!1)}))}_generateKey(e=!1){(this.key===""||e)&&(this._key=Math.random().toString(36).replace(/[^a-z]+/g,"").substring(0,10))}_setIds(){this.dom.menu.id=this.dom.menu.id||`menu-${this.key}`,this.dom.container&&(this.dom.container.id=this.dom.container.id||`menu-container-${this.key}`),this.dom.controller&&(this.dom.controller.id=this.dom.controller.id||`menu-controller-${this.key}`)}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else if(e.elements.parentMenu!==null)this._findRootMenu(e.elements.parentMenu);else throw new Error("Cannot find root menu.")}_createChildElements(){this.dom.menuItems.forEach(e=>{let t;if(this.dom.submenuItems.includes(e)){const s=e.querySelector(this.selectors.submenuToggles),n=e.querySelector(this.selectors.submenus),i=new this._MenuType({menuElement:n,menuItemSelector:this.selectors.menuItems,menuLinkSelector:this.selectors.menuLinks,submenuItemSelector:this.selectors.submenuItems,submenuToggleSelector:this.selectors.submenuToggles,submenuSelector:this.selectors.submenus,openClass:this.openClass,closeClass:this.closeClass,transitionClass:this.transitionClass,transitionDuration:this.transitionDuration,openDuration:this.openDuration,closeDuration:this.closeDuration,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay,enterDelay:this.enterDelay,leaveDelay:this.leaveDelay}),l=new this._MenuToggleType({menuToggleElement:s,parentElement:e,controlledMenu:i,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:s,parentMenu:this,isSubmenuItem:!0,childMenu:i,toggle:l})}else{const s=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:s,parentMenu:this})}this._elements.menuItems.push(t)})}_clearTimeout(){clearTimeout(this._hoverTimeout)}_setTimeout(e,t){h("function",{callback:e}),h("number",{delay:t}),this._hoverTimeout=setTimeout(e,t)}_handleFocus(){this.elements.menuItems.forEach((e,t)=>{e.dom.link.addEventListener("focus",()=>{this.focusState="self",this.currentChild=t})}),this.dom.menu.addEventListener("focusout",e=>{this.currentEvent!=="keyboard"||e.relatedTarget===null||this.dom.menu.contains(e.relatedTarget)||(this.focusState="none",this.closeChildren())})}_handleClick(){function e(t,s,n){o(n),n.button===0&&(s.toggle(),s.isOpen&&(t.focusState="self",s.elements.controlledMenu.focusState="none"))}this.elements.menuItems.forEach((t,s)=>{t.dom.link.addEventListener("click",()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this._clearTimeout(),this.focusChild(s)},{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("click",n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)})}),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("click",t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}),document.addEventListener("click",t=>{this.focusState!=="none"&&(this.currentEvent="mouse",!this.dom.menu.contains(t.target)&&!this.dom.menu!==t.target&&(this.elements.rootMenu.hasOpened=this.elements.submenuToggles.some(s=>s.isOpen)))})}_handleHover(){this.elements.menuItems.forEach((e,t)=>{e.dom.link.addEventListener("pointerenter",s=>{s.pointerType==="pen"||s.pointerType==="touch"||(this.hoverType==="on"?(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(t),e.isSubmenuItem&&(this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{e.elements.toggle.preview()},this.enterDelay)):e.elements.toggle.preview())):this.hoverType==="dynamic"&&(this.currentChild=t,(!this.isTopLevel||this.focusState!=="none")&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild()),(!this.isTopLevel||this.hasOpened)&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild(),e.isSubmenuItem?this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{e.elements.toggle.preview()},this.enterDelay)):e.elements.toggle.preview():this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.closeChildren()},this.enterDelay)):this.closeChildren())))}),e.isSubmenuItem&&(e.dom.item.addEventListener("pointerleave",s=>{s.pointerType==="pen"||s.pointerType==="touch"||(this.hoverType==="on"?this.leaveDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.currentEvent="mouse",e.elements.toggle.close()},this.leaveDelay)):(this.currentEvent="mouse",e.elements.toggle.close()):this.hoverType==="dynamic"&&(this.leaveDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.currentEvent="mouse"},this.leaveDelay)):this.currentEvent="mouse"))}),e.dom.item.addEventListener("pointerenter",s=>{s.pointerType==="pen"||s.pointerType==="touch"||e.isSubmenuItem&&(this.hoverType==="on"||this.hoverType==="dynamic")&&this.leaveDelay>0&&this._clearTimeout()}))})}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",e=>{this.currentEvent="keyboard";const t=y(e);(t==="Space"||t==="Enter")&&o(e)})}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",e=>{this.currentEvent="keyboard";const t=y(e);(t==="Space"||t==="Enter")&&(o(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())})}_setTransitionDurations(){this.dom.menu.style.setProperty(`--${this.prefix}transition-duration`,`${this.transitionDuration}ms`),this.dom.menu.style.setProperty(`--${this.prefix}open-transition-duration`,`${this.openDuration}ms`),this.dom.menu.style.setProperty(`--${this.prefix}close-transition-duration`,`${this.closeDuration}ms`)}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",this.currentChild!==-1&&this.currentMenuItem.focus()}focusChild(e){this.blurCurrentChild(),this.currentChild=e,this.focusCurrentChild()}focusFirstChild(){this.focusChild(0)}focusLastChild(){this.focusChild(this.elements.menuItems.length-1)}focusNextChild(){this.currentChild<this.elements.menuItems.length-1?this.focusChild(this.currentChild+1):this.focusCurrentChild()}focusPreviousChild(){this.currentChild>0?this.focusChild(this.currentChild-1):this.focusCurrentChild()}blurCurrentChild(){this.focusState="none",this.currentChild!==-1&&this.currentMenuItem.blur()}focusController(){this.dom.controller&&(this.shouldFocus&&this.dom.controller.focus(),this.focusState="none")}focusContainer(){this.dom.container&&(this.shouldFocus&&this.dom.container.focus(),this.focusState="none")}closeChildren(){this.elements.submenuToggles.forEach(e=>e.close())}blurChildren(){this.elements.menuItems.forEach(e=>{e.blur(),e.isSubmenuItem&&e.elements.childMenu.blurChildren()})}}class R extends O{constructor({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n=!1,childMenu:i=null,toggle:l=null,initialize:u=!0}){super({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n,childMenu:i,toggle:l}),u&&this.initialize()}}class U extends L{constructor({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n=null,initialize:i=!0}){super({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n}),i&&this.initialize()}_setAriaAttributes(){super._setAriaAttributes(),$("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id)}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class F extends I{_MenuType=F;_MenuItemType=R;_MenuToggleType=U;_currentChild=-1;_optionalSupport=!1;constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:s="a",submenuItemSelector:n="li:has(ul)",submenuToggleSelector:i="button",submenuSelector:l="ul",controllerElement:u=null,containerElement:c=null,openClass:a="show",closeClass:d="hide",transitionClass:f="transitioning",transitionDuration:p=250,openDuration:m=-1,closeDuration:_=-1,isTopLevel:g=!0,parentMenu:M=null,hoverType:b="off",hoverDelay:C=250,enterDelay:T=-1,leaveDelay:E=-1,optionalKeySupport:v=!1,prefix:S="am-",key:K=null,initialize:N=!0}){super({menuElement:e,menuItemSelector:t,menuLinkSelector:s,submenuItemSelector:n,submenuToggleSelector:i,submenuSelector:l,controllerElement:u,containerElement:c,openClass:a,closeClass:d,transitionClass:f,transitionDuration:p,openDuration:m,closeDuration:_,isTopLevel:g,parentMenu:M,hoverType:b,hoverDelay:C,enterDelay:T,leaveDelay:E,prefix:S,key:K}),this._optionalSupport=v,N&&this.initialize()}initialize(){try{super.initialize(),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup()}catch(e){console.error(e)}}get optionalKeySupport(){return this.isTopLevel?this._optionalSupport:this.elements.rootMenu.optionalKeySupport}set optionalKeySupport(e){h("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();const t=h("boolean",{optionalKeySupport:this._optionalSupport});return t.status||(this._errors.push(t.error.message),e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("click",e=>{this.focusState!=="none"&&(this.currentEvent="mouse",!this.dom.menu.contains(e.target)&&!this.dom.menu!==e.target&&(this.closeChildren(),this.blur(),this.elements.controller&&this.elements.controller.close(),this.elements.rootMenu.hasOpened=!1))})}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",e=>{this.currentEvent="keyboard";const t=y(e);if(this.focusState==="self"){const s=["Space","Enter"],n=["Escape"],i=["Escape"],l=["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"];(s.includes(t)||this.optionalKeySupport&&l.includes(t)||this.elements.controller&&n.includes(t)||this.elements.parentMenu&&i.includes(t))&&o(e)}})}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",e=>{this.currentEvent="keyboard";const t=y(e);this.focusState==="self"&&(t==="Space"||t==="Enter"?(o(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click()):t==="Escape"?this.elements.submenuToggles.some(n=>n.isOpen)?(o(e),this.closeChildren()):this.elements.parentMenu?(o(e),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.closeChildren(),this.elements.parentMenu.focusCurrentChild()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController()):this.optionalKeySupport&&(t==="ArrowDown"||t==="ArrowRight"?(o(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):t==="ArrowUp"||t==="ArrowLeft"?(o(e),this.focusPreviousChild()):t==="Home"?(o(e),this.focusFirstChild()):t==="End"&&(o(e),this.focusLastChild())))})}}class W extends O{constructor({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n=!1,childMenu:i=null,toggle:l=null,initialize:u=!0}){super({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n,childMenu:i,toggle:l}),u&&this.initialize()}initialize(){super.initialize(),this.dom.item.setAttribute("role","none"),this.dom.link.setAttribute("role","menuitem"),this.dom.link.tabIndex=-1}focus(){super.focus(),this.elements.parentMenu.isTopLevel&&(this.dom.link.tabIndex=0)}blur(){super.blur(),this.elements.parentMenu.isTopLevel&&(this.dom.link.tabIndex=-1)}}class Z extends L{constructor({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n=null,initialize:i=!0}){super({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n}),i&&this.initialize()}_setAriaAttributes(){super._setAriaAttributes(),this.dom.toggle.setAttribute("aria-haspopup","true")}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&(this.closeChildren(),this.elements.parentMenu&&this.elements.parentMenu.focusCurrentChild()),super.close()}}class z extends I{_MenuType=z;_MenuItemType=W;_MenuToggleType=Z;constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:s="a",submenuItemSelector:n="li:has(ul)",submenuToggleSelector:i="a",submenuSelector:l="ul",controllerElement:u=null,containerElement:c=null,openClass:a="show",closeClass:d="hide",transitionClass:f="transitioning",transitionDuration:p=250,isTopLevel:m=!0,parentMenu:_=null,hoverType:g="off",hoverDelay:M=250,enterDelay:b=-1,leaveDelay:C=-1,prefix:T="am-",key:E=null,initialize:v=!0}){super({menuElement:e,menuItemSelector:t,menuLinkSelector:s,submenuItemSelector:n,submenuToggleSelector:i,submenuSelector:l,controllerElement:u,containerElement:c,openClass:a,closeClass:d,transitionClass:f,transitionDuration:p,isTopLevel:m,parentMenu:_,hoverType:g,hoverDelay:M,enterDelay:b,leaveDelay:C,prefix:T,key:E}),v&&this.initialize()}initialize(){try{super.initialize(),this.isTopLevel?this.dom.menu.setAttribute("role","menubar"):this.dom.menu.setAttribute("role","menu"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0,this.elements.controller&&this.elements.controller.dom.toggle.removeAttribute("aria-haspopup"))}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("click",e=>{this.focusState!=="none"&&(this.currentEvent="mouse",!this.dom.menu.contains(e.target)&&!this.dom.menu!==e.target&&(this.closeChildren(),this.blur(),this.elements.controller&&this.elements.controller.close(),this.elements.rootMenu.hasOpened=!1))})}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",e=>{this.currentEvent="keyboard";const t=y(e);if(t==="Tab"&&(this.elements.rootMenu.focusState!=="none"?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),t==="Character")o(e);else if(this.isTopLevel){if(this.focusState==="self"){const s=["Space","Enter","ArrowRight","ArrowLeft","Home","End"],n=["ArrowDown","ArrowUp"],i=["Escape"];(s.includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&i.includes(t))&&o(e)}}else["Space","Enter","Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)&&o(e)})}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",e=>{this.currentEvent="keyboard";const t=y(e),{altKey:s,crtlKey:n,metaKey:i}=e;if(t==="Character"&&!(s||n||i))o(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key);else if(this.isTopLevel){if(this.focusState==="self")if(t==="Space"||t==="Enter")o(e),this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame(()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})):this.currentMenuItem.dom.link.click();else if(t==="ArrowRight"){o(e);const u=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),u&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if(t==="ArrowLeft"){o(e);const u=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),u&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else t==="ArrowDown"?this.currentMenuItem.isSubmenuItem&&(o(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame(()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})):t==="ArrowUp"?this.currentMenuItem.isSubmenuItem&&(o(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame(()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})):t==="Home"?(o(e),this.focusFirstChild()):t==="End"?(o(e),this.focusLastChild()):t==="Escape"&&(this.elements.submenuToggles.some(c=>c.isOpen)?(o(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(o(e),this.elements.controller.close(),this.focusController()))}else t==="Space"||t==="Enter"?(o(e),this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame(()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})):this.currentMenuItem.dom.link.click()):t==="Escape"?(o(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):t==="ArrowRight"?this.currentMenuItem.isSubmenuItem?(o(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame(()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})):(o(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):t==="ArrowLeft"?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(o(e),this.elements.parentMenu.currentMenuItem.elements.toggle.close(),this.elements.parentMenu.focusCurrentChild(),this.elements.parentMenu===this.elements.rootMenu&&(this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusPreviousChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&(this.elements.rootMenu.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.elements.rootMenu.currentMenuItem.elements.toggle.preview()))):t==="ArrowDown"?(o(e),this.focusNextChild()):t==="ArrowUp"?(o(e),this.focusPreviousChild()):t==="Home"?(o(e),this.focusFirstChild()):t==="End"&&(o(e),this.focusLastChild())})}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){this.currentChild===0?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let s=this.currentChild+1,n=!1;for(;!n&&s<this.elements.menuItems.length;){let i="";this.elements.menuItems[s].dom.item.innerText?i=this.elements.menuItems[s].dom.item.innerText:i=this.elements.menuItems[s].dom.item.textContent,i=i.replace(/[\s]/g,"").toLowerCase().charAt(0),i===t&&(n=!0,this.focusChild(s)),s++}}}class Q extends O{_elements={parentMenu:null,childMenu:null,toggle:null,sibling:null};constructor({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n=!1,childMenu:i=null,toggle:l=null,initialize:u=!0,submenuSibling:c=null}){super({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n,childMenu:i,toggle:l}),this._elements.parentMenu=s,this._elements.childMenu=i,this._elements.toggle=l,this._elements.sibling=c,u&&this.initialize()}}class B extends L{constructor({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n=null,initialize:i=!0}){super({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n}),i&&this.initialize()}_setAriaAttributes(){super._setAriaAttributes(),$("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id)}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class H extends I{_MenuType=H;_MenuItemType=Q;_MenuToggleType=B;_currentChild=-1;_selectors={menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:"",submenuSubtoggles:""};_optionalSupport=!1;constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:s="a",submenuItemSelector:n="li:has(ul)",submenuToggleSelector:i="button",submenuSelector:l="ul",submenuSubtoggleSelector:u="a",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:f="hide",transitionClass:p="transitioning",transitionDuration:m=250,isTopLevel:_=!0,parentMenu:g=null,hoverType:M="off",hoverDelay:b=250,enterDelay:C=-1,leaveDelay:T=-1,optionalKeySupport:E=!1,prefix:v="am-",key:S=null,initialize:K=!0}){super({menuElement:e,menuItemSelector:t,menuLinkSelector:s,submenuItemSelector:n,submenuSelector:l,submenuToggleSelector:i,controllerElement:c,containerElement:a,openClass:d,closeClass:f,transitionClass:p,transitionDuration:m,isTopLevel:_,parentMenu:g,hoverType:M,hoverDelay:b,enterDelay:C,leaveDelay:T,prefix:v,key:S}),this._optionalSupport=E,this._selectors.menuItems=t,this._selectors.submenuItems=n,this._selectors.submenuToggles=i,this._selectors.submenus=l,this._selectors.submenuSubtoggles=u,this._selectors.menuLinks=[...new Set([s,i])].join(","),K&&this.initialize()}initialize(){try{super.initialize(),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup()}catch(e){console.error(e)}}get optionalKeySupport(){return this.isTopLevel?this._optionalSupport:this.elements.rootMenu.optionalKeySupport}set optionalKeySupport(e){h("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_createChildElements(){this.dom.menuItems.forEach(e=>{let t,s;const n=e.querySelector(this.selectors.menuLinks);if(this.dom.submenuItems.includes(e)){const i=e.querySelector(this.selectors.submenuToggles),l=e.querySelector(this.selectors.submenus),u=new this._MenuType({menuElement:l,menuItemSelector:this.selectors.menuItems,menuLinkSelector:this.selectors.menuLinks,submenuItemSelector:this.selectors.submenuItems,submenuToggleSelector:this.selectors.submenuSubtoggles,submenuSelector:this.selectors.submenus,submenuSubtoggleSelector:this.selectors.submenuSubtoggles,openClass:this.openClass,closeClass:this.closeClass,transitionClass:this.transitionClass,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay,enterDelay:this.enterDelay,leaveDelay:this.leaveDelay}),c=new this._MenuToggleType({menuToggleElement:i,parentElement:e,controlledMenu:u,parentMenu:this});this._elements.submenuToggles.push(c),i!==n?(s=new this._MenuItemType({menuItemElement:e,menuLinkElement:i,parentMenu:this,isSubmenuItem:!0,childMenu:u,toggle:c}),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,submenuSibling:s})):t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:u,toggle:c})}else t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this});this._elements.menuItems.push(t),typeof s<"u"&&this._elements.menuItems.push(s)})}_validate(){let e=super._validate();const t=x({submenuSubtoggleSelector:this._selectors.submenuSubtoggles});t.status||(this._errors.push(t.error.message),e=!1);const s=h("boolean",{optionalKeySupport:this._optionalSupport});return s.status||(this._errors.push(s.error.message),e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("click",e=>{this.focusState!=="none"&&(this.currentEvent="mouse",!this.dom.menu.contains(e.target)&&!this.dom.menu!==e.target&&(this.closeChildren(),this.blur(),this.elements.controller&&this.elements.controller.close(),this.elements.rootMenu.hasOpened=!1))})}_handleHover(){this.elements.menuItems.forEach((e,t)=>{e.dom.link.addEventListener("pointerenter",s=>{if(!(s.pointerType==="pen"||s.pointerType==="touch")){if(this.hoverType==="on"){this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(t);let n=e.isSubmenuItem?e.elements.toggle:null;if(e.elements.sibling!==null&&(n=e.elements.sibling.elements.toggle),n===null)return;this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{n.preview()},this.enterDelay)):n.preview()}else if(this.hoverType==="dynamic"&&(this.currentChild=t,(!this.isTopLevel||this.focusState!=="none")&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild()),!this.isTopLevel||this.hasOpened)){this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild();let n=e.isSubmenuItem?e.elements.toggle:null;e.elements.sibling!==null&&(n=e.elements.sibling.elements.toggle),n!==null?this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{n.preview()},this.enterDelay)):n.preview():this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.closeChildren()},this.enterDelay)):this.closeChildren()}}}),e.isSubmenuItem&&(e.dom.item.addEventListener("pointerleave",s=>{s.pointerType==="pen"||s.pointerType==="touch"||(this.hoverType==="on"?this.leaveDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.currentEvent="mouse",e.elements.toggle.close()},this.leaveDelay)):(this.currentEvent="mouse",e.elements.toggle.close()):this.hoverType==="dynamic"&&(this.leaveDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.currentEvent="mouse"},this.leaveDelay)):this.currentEvent="mouse"))}),e.dom.item.addEventListener("pointerenter",s=>{s.pointerType==="pen"||s.pointerType==="touch"||e.isSubmenuItem&&(this.hoverType==="on"||this.hoverType==="dynamic")&&this.leaveDelay>0&&this._clearTimeout()}))})}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",e=>{this.currentEvent="keyboard";const t=y(e);if(this.focusState==="self"){const s=["Space","Enter"],n=["Escape"],i=["Escape"],l=["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"];(s.includes(t)||this.optionalKeySupport&&l.includes(t)||this.elements.controller&&n.includes(t)||this.elements.parentMenu&&i.includes(t))&&o(e)}})}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",e=>{this.currentEvent="keyboard";const t=y(e);this.focusState==="self"&&(t==="Space"||t==="Enter"?(o(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click()):t==="Escape"?this.elements.submenuToggles.some(n=>n.isOpen)?(o(e),this.closeChildren()):this.elements.parentMenu?(o(e),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.closeChildren(),this.elements.parentMenu.focusCurrentChild()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController()):this.optionalKeySupport&&(t==="ArrowDown"||t==="ArrowRight"?(o(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):t==="ArrowUp"||t==="ArrowLeft"?(o(e),this.focusPreviousChild()):t==="Home"?(o(e),this.focusFirstChild()):t==="End"&&(o(e),this.focusLastChild())))})}}class G extends O{constructor({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n=!1,childMenu:i=null,toggle:l=null,initialize:u=!0}){super({menuItemElement:e,menuLinkElement:t,parentMenu:s,isSubmenuItem:n,childMenu:i,toggle:l}),u&&this.initialize()}initialize(){super.initialize(),this.dom.item.setAttribute("role","none"),this.dom.link.setAttribute("role","treeitem"),this.dom.link.tabIndex=-1}focus(){super.focus(),this.dom.link.tabIndex=0}blur(){super.blur(),this.dom.link.tabIndex=-1}}class J extends L{constructor({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n=null,initialize:i=!0}){super({menuToggleElement:e,parentElement:t,controlledMenu:s,parentMenu:n}),i&&this.initialize()}initialize(){this._setIds(),this._setAriaAttributes(),this.dom.toggle.getAttribute("aria-expanded")==="true"?this.open():this._collapse(!1)}_setAriaAttributes(){this.dom.toggle.getAttribute("aria-expanded")!=="true"&&this.dom.toggle.setAttribute("aria-expanded","false"),this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-owns",this.elements.controlledMenu.dom.menu.id)}}class q extends I{_MenuType=q;_MenuItemType=G;_MenuToggleType=J;constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:s="a",submenuItemSelector:n="li:has(ul)",submenuToggleSelector:i="a",submenuSelector:l="ul",controllerElement:u=null,containerElement:c=null,openClass:a="show",closeClass:d="hide",transitionClass:f="transitioning",transitionDuration:p=250,isTopLevel:m=!0,parentMenu:_=null,hoverType:g="off",hoverDelay:M=250,enterDelay:b=-1,leaveDelay:C=-1,prefix:T="am-",key:E=null,initialize:v=!0}){super({menuElement:e,menuItemSelector:t,menuLinkSelector:s,submenuItemSelector:n,submenuToggleSelector:i,submenuSelector:l,controllerElement:u,containerElement:c,openClass:a,closeClass:d,transitionClass:f,transitionDuration:p,isTopLevel:m,parentMenu:_,hoverType:g,hoverDelay:M,enterDelay:b,leaveDelay:C,prefix:T,key:E}),v&&this.initialize()}initialize(){try{super.initialize(),this.isTopLevel?(this.dom.menu.setAttribute("role","tree"),this.elements.menuItems[0].dom.link.tabIndex=0):this.dom.menu.setAttribute("role","group"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.removeAttribute("aria-owns")}catch(e){console.error(e)}}_handleHover(){this.elements.menuItems.forEach((e,t)=>{e.dom.link.addEventListener("pointerenter",s=>{s.pointerType==="pen"||s.pointerType==="touch"||(this.hoverType==="on"?(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(t),e.isSubmenuItem&&(this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{e.elements.toggle.preview()},this.enterDelay)):e.elements.toggle.preview())):this.hoverType==="dynamic"&&(this.currentChild=t,(!this.isTopLevel||this.focusState!=="none")&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild()),(!this.isTopLevel||this.hasOpened)&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild(),e.isSubmenuItem?this.enterDelay>0?(this._clearTimeout(),this._setTimeout(()=>{e.elements.toggle.preview()},this.enterDelay)):e.elements.toggle.preview():this.enterDelay>0&&this._clearTimeout())))}),e.isSubmenuItem&&(e.dom.item.addEventListener("pointerleave",s=>{s.pointerType==="pen"||s.pointerType==="touch"||(this.hoverType==="on"?this.leaveDelay>0&&this._clearTimeout():this.hoverType==="dynamic"&&(this.leaveDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.currentEvent="mouse"},this.leaveDelay)):this.currentEvent="mouse"))}),e.dom.item.addEventListener("pointerenter",s=>{s.pointerType==="pen"||s.pointerType==="touch"||e.isSubmenuItem&&(this.hoverType==="on"||this.hoverType==="dynamic")&&this.leaveDelay>0&&this._clearTimeout()})),this.isTopLevel&&this.dom.menu.addEventListener("pointerleave",s=>{s.pointerType==="pen"||s.pointerType==="touch"||this.hoverType==="on"&&(this.leaveDelay>0?(this._clearTimeout(),this._setTimeout(()=>{this.closeChildren(),this.blur()},this.leaveDelay)):(this.closeChildren(),this.blur()))})})}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",e=>{this.currentEvent="keyboard";const t=y(e);if(t==="Tab"&&(this.elements.rootMenu.focusState!=="none"?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),this.focusState==="self"){const s=["Space","Enter","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"],n=["ArrowRight"],i=["Escape"];(s.includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&i