accessible-menu
Advanced tools
Comparing version 3.0.5 to 3.0.6
@@ -1,2 +0,2 @@ | ||
var AccessibleMenu=function(){"use strict";function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function r(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}function i(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class l{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r=null}=e;i(this,"_dom",{toggle:null,parent:null}),i(this,"_elements",{controlledMenu:null,parentMenu:null}),i(this,"_open",!1),i(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),i(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=t,this._dom.parent=n,this._elements.controlledMenu=s,this._elements.parentMenu=r}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(n,s){if(t("string",{tagName:n})&&e(HTMLElement,s)){const e=n.toLowerCase();let t=!0;for(const n in s)s[n].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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()))}}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class u{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r=!1,childMenu:i=null,toggle:l=null}=e;o(this,"_dom",{item:null,link:null}),o(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),o(this,"_submenu",!1),this._dom.item=t,this._dom.link=n,this._elements.parentMenu=s,this._elements.childMenu=i,this._elements.toggle=l,this._submenu=r}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function h(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function m(e){e.preventDefault(),e.stopPropagation()}function c(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class a{constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:r="",submenuToggleSelector:i="a",submenuSelector:o="ul",controllerElement:h=null,containerElement:m=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250}=e;c(this,"_MenuType",a),c(this,"_MenuItemType",u),c(this,"_MenuToggleType",l),c(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),c(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),c(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),c(this,"_openClass","show"),c(this,"_closeClass","hide"),c(this,"_root",!0),c(this,"_currentChild",0),c(this,"_focusState","none"),c(this,"_currentEvent","none"),c(this,"_hoverType","off"),c(this,"_hoverDelay",250),this._dom.menu=t,this._dom.controller=h,this._dom.container=m,this._selectors.menuItems=n,this._selectors.menuLinks=s,this._selectors.submenuItems=r,this._selectors.submenuToggles=i,this._selectors.submenus=o,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=M}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){s({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){s({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function n(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,n(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,n(this)):this.focusChild!==e&&(this._currentChild=e,n(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){r({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let i=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(i=!1):e(HTMLElement,{menuElement:this._dom.menu})||(i=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(i=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(i=!1),""===this._openClass||s({openClass:this._openClass})||(i=!1),""===this._closeClass||s({closeClass:this._closeClass})||(i=!1),t("boolean",{isTopLevel:this._root})||(i=!1),null===this._elements.parentMenu||e(a,{parentMenu:this._elements.parentMenu})||(i=!1),r({hoverType:this._hoverType})||(i=!1),t("number",{hoverDelay:this._hoverDelay})||(i=!1),i}_setDOMElementType(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&e(HTMLElement,{base:n});const r=Array.from(n.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===n));this._dom[t]=s?r:[...this._dom[t],...r]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),r=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),i=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:r,parentMenu:this});this._elements.submenuToggles.push(i),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:r,toggle:i})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){m(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=h(e);"Space"!==t&&"Enter"!==t||m(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=h(e);"Space"!==t&&"Enter"!==t||(m(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 d extends u{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r=!1,childMenu:i=null,toggle:l=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r,childMenu:i,toggle:l}),o&&this.initialize()}}class p extends l{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r=null,initialize:i=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r}),i&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}function g(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class f extends a{constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:r="",submenuToggleSelector:i="a",submenuSelector:l="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:b="off",hoverDelay:M=250,optionalKeySupport:v=!1,initialize:y=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:r,submenuToggleSelector:i,submenuSelector:l,controllerElement:o,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:b,hoverDelay:M}),g(this,"_MenuType",f),g(this,"_MenuItemType",d),g(this,"_MenuToggleType",p),g(this,"_currentChild",-1),g(this,"_optionalSupport",!1),this._optionalSupport=v,y&&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){t("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();return t("boolean",{optionalKeySupport:this._optionalSupport})||(e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=h(e);if("self"===this.focusState){const n=["Space","Enter"],s=["Escape"],r=["Escape"];if(this.optionalKeySupport){["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"].includes(t)&&m(e)}else(this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t)||this.elements.parentMenu&&r.includes(t))&&m(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=h(e);if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(m(e),this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview()):this.currentMenuItem.dom.link.click();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(m(e),this.closeChildren()):this.elements.parentMenu?(m(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())}else this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(m(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(m(e),this.focusPreviousChild()):"Home"===t?(m(e),this.focusFirstChild()):"End"===t&&(m(e),this.focusLastChild()))}))}}class b extends u{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r=!1,childMenu:i=null,toggle:l=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r,childMenu:i,toggle:l}),o&&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 M extends l{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r=null,initialize:i=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r}),i&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}function v(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class y extends a{constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:r="",submenuToggleSelector:i="a",submenuSelector:l="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:r,submenuToggleSelector:i,submenuSelector:l,controllerElement:o,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),v(this,"_MenuType",y),v(this,"_MenuItemType",b),v(this,"_MenuToggleType",M),g&&this.initialize()}initialize(){try{super.initialize(),this.dom.menu.setAttribute("role","menubar"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0)}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=h(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),"Character"===t)m(e);else if(this.isTopLevel){if("self"===this.focusState){const n=["Space","Enter","ArrowDown","ArrowUp"],s=["Escape"];(["ArrowRight","ArrowLeft","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&m(e)}}else{const n=["Space","Enter"];(["Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t))&&m(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=h(e),{altKey:n,crtlKey:s,metaKey:r}=e;if("Character"!==t||(n||s||r))if(this.isTopLevel){if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(m(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click();else if("ArrowRight"===t){m(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowLeft"===t){m(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowDown"===t)this.currentMenuItem.isSubmenuItem&&(m(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})));else if("ArrowUp"===t)this.currentMenuItem.isSubmenuItem&&(m(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})));else if("Home"===t)m(e),this.focusFirstChild();else if("End"===t)m(e),this.focusLastChild();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(m(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(m(e),this.elements.controller.close(),this.focusController())}}else"Space"===t||"Enter"===t?this.currentMenuItem.isSubmenuItem?(m(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click():"Escape"===t?(m(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):"ArrowRight"===t?this.currentMenuItem.isSubmenuItem?(m(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):(m(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(m(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()))):"ArrowDown"===t?(m(e),this.focusNextChild()):"ArrowUp"===t?(m(e),this.focusPreviousChild()):"Home"===t?(m(e),this.focusFirstChild()):"End"===t&&(m(e),this.focusLastChild());else m(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key)}))}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){0===this.currentChild?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let n=this.currentChild+1,s=!1;for(;!s&&n<this.elements.menuItems.length;){let e="";e=this.elements.menuItems[n].dom.item.innerText?this.elements.menuItems[n].dom.item.innerText:this.elements.menuItems[n].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t&&(s=!0,this.focusChild(n)),n++}}}class E extends u{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r=!1,childMenu:i=null,toggle:l=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:r,childMenu:i,toggle:l}),o&&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 C extends l{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r=null,initialize:i=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:r}),i&&this.initialize()}}function I(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class _ extends a{constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:r="",submenuToggleSelector:i="a",submenuSelector:l="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:r,submenuToggleSelector:i,submenuSelector:l,controllerElement:o,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),I(this,"_MenuType",_),I(this,"_MenuItemType",E),I(this,"_MenuToggleType",C),g&&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()}catch(e){console.error(e)}}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=h(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),"self"===this.focusState){const n=["Enter","ArrowRight"],s=["Escape"];(["Space","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&m(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=h(e),{altKey:n,crtlKey:s,metaKey:r}=e;if("Character"!==t||(n||s||r)){if("self"===this.focusState)if("Enter"===t||"Space"===t)m(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click();else if("Escape"===t)this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController());else if("ArrowDown"===t)m(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.isTopLevel||this.currentChild!==this.elements.menuItems.length-1?this.focusNextChild():this.focusParentsNextChild();else if("ArrowUp"===t){m(e);const t=this.elements.menuItems[this.currentChild-1];t&&t.isSubmenuItem&&t.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentChild=this.currentChild-1,this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.focusChildsLastNode()):this.isTopLevel||0!==this.currentChild?this.focusPreviousChild():(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())}else"ArrowRight"===t?this.currentMenuItem.isSubmenuItem&&(m(e),this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?(m(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.toggle.close()):this.isTopLevel||(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())):"Home"===t?(m(e),this.blurCurrentChild(),this.elements.rootMenu.focusFirstChild()):"End"===t?(m(e),this.blurCurrentChild(),this.elements.rootMenu.focusLastNode()):"Asterisk"===t&&(m(e),this.openChildren())}else m(e),this.elements.rootMenu.currentEvent="character",this.focusNextNodeWithCharacter(e.key)}))}focusLastNode(){const e=this.elements.menuItems.length-1,t=this.elements.menuItems[e];t.isSubmenuItem&&t.elements.toggle.isOpen?(this.currentChild=e,t.elements.childMenu.currentEvent=this.currentEvent,t.elements.childMenu.focusLastNode()):this.focusLastChild()}openChildren(){this.elements.submenuToggles.forEach((e=>e.preview()))}focusNextNodeWithCharacter(e){const t=e.toLowerCase(),n=function e(t){let n=[];return t.elements.menuItems.forEach((t=>{n.push(t),t.isSubmenuItem&&t.elements.toggle.isOpen&&(n=[...n,...e(t.elements.toggle.elements.controlledMenu)])})),n}(this.elements.rootMenu),s=n.indexOf(this.currentMenuItem)+1,r=[...n.slice(s),...n.slice(0,s)];let i=0,l=!1;for(;!l&&i<r.length;){let e="";if(e=r[i].dom.item.innerText?r[i].dom.item.innerText:r[i].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t){l=!0;const e=r[i].elements.parentMenu,t=e.elements.menuItems.indexOf(r[i]);this.elements.rootMenu.blurChildren(),e.focusChild(t)}i++}}focusParentsNextChild(){this.elements.parentMenu&&(this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.currentChild===this.elements.parentMenu.elements.menuItems.length-1?(this.elements.parentMenu.blurCurrentChild(),this.elements.parentMenu.focusParentsNextChild()):(this.blurChildren(),this.elements.parentMenu.focusNextChild()))}focusChildsLastNode(){this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusLastChild(),this.currentMenuItem.elements.childMenu.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.childMenu.currentMenuItem.elements.toggle.isOpen&&(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.childMenu.focusChildsLastNode())}}return{DisclosureMenu:f,Menubar:y,Treeview:_}}(); | ||
var AccessibleMenu=function(){"use strict";function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class r{_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(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null}=e;this._dom.toggle=t,this._dom.parent=n,this._elements.controlledMenu=s,this._elements.parentMenu=l}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(n,s){if(t("string",{tagName:n})&&e(HTMLElement,s)){const e=n.toLowerCase();let t=!0;for(const n in s)s[n].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 i{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:i=null}=e;this._dom.item=t,this._dom.link=n,this._elements.parentMenu=s,this._elements.childMenu=r,this._elements.toggle=i,this._submenu=l}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function o(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=i;_MenuToggleType=r;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:r="a",submenuSelector:i="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=o,this._dom.container=u,this._selectors.menuItems=n,this._selectors.menuLinks=s,this._selectors.submenuItems=l,this._selectors.submenuToggles=r,this._selectors.submenus=i,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){s({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){s({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function n(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,n(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,n(this)):this.focusChild!==e&&(this._currentChild=e,n(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){l({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let r=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(r=!1):e(HTMLElement,{menuElement:this._dom.menu})||(r=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(r=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(r=!1),""===this._openClass||s({openClass:this._openClass})||(r=!1),""===this._closeClass||s({closeClass:this._closeClass})||(r=!1),t("boolean",{isTopLevel:this._root})||(r=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(r=!1),l({hoverType:this._hoverType})||(r=!1),t("number",{hoverDelay:this._hoverDelay})||(r=!1),r}_setDOMElementType(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&e(HTMLElement,{base:n});const l=Array.from(n.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===n));this._dom[t]=s?l:[...this._dom[t],...l]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),l=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),r=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:l,parentMenu:this});this._elements.submenuToggles.push(r),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:l,toggle:r})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){u(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=o(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=o(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends i{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:i=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:r,toggle:i}),o&&this.initialize()}}class c extends r{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:r=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),r&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;_currentChild=-1;_optionalSupport=!1;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:r="a",submenuSelector:i="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,optionalKeySupport:g=!1,initialize:M=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:l,submenuToggleSelector:r,submenuSelector:i,controllerElement:o,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),this._optionalSupport=g,M&&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){t("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();return t("boolean",{optionalKeySupport:this._optionalSupport})||(e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=o(e);if("self"===this.focusState){const n=["Space","Enter"],s=["Escape"],l=["Escape"];if(this.optionalKeySupport){["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"].includes(t)&&u(e)}else(this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t)||this.elements.parentMenu&&l.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=o(e);if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview()):this.currentMenuItem.dom.link.click();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(u(e),this.closeChildren()):this.elements.parentMenu?(u(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())}else this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(u(e),this.focusPreviousChild()):"Home"===t?(u(e),this.focusFirstChild()):"End"===t&&(u(e),this.focusLastChild()))}))}}class d extends i{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:i=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:r,toggle:i}),o&&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 p extends r{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:r=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),r&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class g extends h{_MenuType=g;_MenuItemType=d;_MenuToggleType=p;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:r="a",submenuSelector:i="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:l,submenuToggleSelector:r,submenuSelector:i,controllerElement:o,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),g&&this.initialize()}initialize(){try{super.initialize(),this.dom.menu.setAttribute("role","menubar"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0)}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=o(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),"Character"===t)u(e);else if(this.isTopLevel){if("self"===this.focusState){const n=["Space","Enter","ArrowDown","ArrowUp"],s=["Escape"];(["ArrowRight","ArrowLeft","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&u(e)}}else{const n=["Space","Enter"];(["Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=o(e),{altKey:n,crtlKey:s,metaKey:l}=e;if("Character"!==t||(n||s||l))if(this.isTopLevel){if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click();else if("ArrowRight"===t){u(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowLeft"===t){u(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowDown"===t)this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})));else if("ArrowUp"===t)this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})));else if("Home"===t)u(e),this.focusFirstChild();else if("End"===t)u(e),this.focusLastChild();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(u(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(u(e),this.elements.controller.close(),this.focusController())}}else"Space"===t||"Enter"===t?this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click():"Escape"===t?(u(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):"ArrowRight"===t?this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):(u(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(u(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()))):"ArrowDown"===t?(u(e),this.focusNextChild()):"ArrowUp"===t?(u(e),this.focusPreviousChild()):"Home"===t?(u(e),this.focusFirstChild()):"End"===t&&(u(e),this.focusLastChild());else u(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key)}))}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){0===this.currentChild?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let n=this.currentChild+1,s=!1;for(;!s&&n<this.elements.menuItems.length;){let e="";e=this.elements.menuItems[n].dom.item.innerText?this.elements.menuItems[n].dom.item.innerText:this.elements.menuItems[n].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t&&(s=!0,this.focusChild(n)),n++}}}class M extends i{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:i=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:r,toggle:i}),o&&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 f extends r{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:r=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),r&&this.initialize()}}class b extends h{_MenuType=b;_MenuItemType=M;_MenuToggleType=f;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:r="a",submenuSelector:i="ul",controllerElement:o=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:l,submenuToggleSelector:r,submenuSelector:i,controllerElement:o,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),g&&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()}catch(e){console.error(e)}}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=o(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),"self"===this.focusState){const n=["Enter","ArrowRight"],s=["Escape"];(["Space","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=o(e),{altKey:n,crtlKey:s,metaKey:l}=e;if("Character"!==t||(n||s||l)){if("self"===this.focusState)if("Enter"===t||"Space"===t)u(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click();else if("Escape"===t)this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController());else if("ArrowDown"===t)u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.isTopLevel||this.currentChild!==this.elements.menuItems.length-1?this.focusNextChild():this.focusParentsNextChild();else if("ArrowUp"===t){u(e);const t=this.elements.menuItems[this.currentChild-1];t&&t.isSubmenuItem&&t.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentChild=this.currentChild-1,this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.focusChildsLastNode()):this.isTopLevel||0!==this.currentChild?this.focusPreviousChild():(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())}else"ArrowRight"===t?this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?(u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.toggle.close()):this.isTopLevel||(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())):"Home"===t?(u(e),this.blurCurrentChild(),this.elements.rootMenu.focusFirstChild()):"End"===t?(u(e),this.blurCurrentChild(),this.elements.rootMenu.focusLastNode()):"Asterisk"===t&&(u(e),this.openChildren())}else u(e),this.elements.rootMenu.currentEvent="character",this.focusNextNodeWithCharacter(e.key)}))}focusLastNode(){const e=this.elements.menuItems.length-1,t=this.elements.menuItems[e];t.isSubmenuItem&&t.elements.toggle.isOpen?(this.currentChild=e,t.elements.childMenu.currentEvent=this.currentEvent,t.elements.childMenu.focusLastNode()):this.focusLastChild()}openChildren(){this.elements.submenuToggles.forEach((e=>e.preview()))}focusNextNodeWithCharacter(e){const t=e.toLowerCase(),n=function e(t){let n=[];return t.elements.menuItems.forEach((t=>{n.push(t),t.isSubmenuItem&&t.elements.toggle.isOpen&&(n=[...n,...e(t.elements.toggle.elements.controlledMenu)])})),n}(this.elements.rootMenu),s=n.indexOf(this.currentMenuItem)+1,l=[...n.slice(s),...n.slice(0,s)];let r=0,i=!1;for(;!i&&r<l.length;){let e="";if(e=l[r].dom.item.innerText?l[r].dom.item.innerText:l[r].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t){i=!0;const e=l[r].elements.parentMenu,t=e.elements.menuItems.indexOf(l[r]);this.elements.rootMenu.blurChildren(),e.focusChild(t)}r++}}focusParentsNextChild(){this.elements.parentMenu&&(this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.currentChild===this.elements.parentMenu.elements.menuItems.length-1?(this.elements.parentMenu.blurCurrentChild(),this.elements.parentMenu.focusParentsNextChild()):(this.blurChildren(),this.elements.parentMenu.focusNextChild()))}focusChildsLastNode(){this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusLastChild(),this.currentMenuItem.elements.childMenu.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.childMenu.currentMenuItem.elements.toggle.isOpen&&(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.childMenu.focusChildsLastNode())}}return{DisclosureMenu:a,Menubar:g,Treeview:b}}(); | ||
//# sourceMappingURL=accessible-menu.min.js.map |
@@ -1,30 +0,1 @@ | ||
function _defineProperty(obj, key, value) { | ||
key = _toPropertyKey(key); | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function _toPrimitive(input, hint) { | ||
if (typeof input !== "object" || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || "default"); | ||
if (typeof res !== "object") return res; | ||
throw new TypeError("@@toPrimitive must return a primitive value."); | ||
} | ||
return (hint === "string" ? String : Number)(input); | ||
} | ||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, "string"); | ||
return typeof key === "symbol" ? key : String(key); | ||
} | ||
function isValidInstance(contructor, elements) { | ||
@@ -188,2 +159,23 @@ try { | ||
class BaseMenuToggle { | ||
_dom = { | ||
toggle: null, | ||
parent: null | ||
}; | ||
_elements = { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}; | ||
_open = false; | ||
_expandEvent = new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
_collapseEvent = new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
constructor(_ref) { | ||
@@ -196,23 +188,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
toggle: null, | ||
parent: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}); | ||
_defineProperty(this, "_open", false); | ||
_defineProperty(this, "_expandEvent", new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
_defineProperty(this, "_collapseEvent", new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
this._dom.toggle = menuToggleElement; | ||
@@ -363,2 +334,12 @@ this._dom.parent = parentElement; | ||
class BaseMenuItem { | ||
_dom = { | ||
item: null, | ||
link: null | ||
}; | ||
_elements = { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}; | ||
_submenu = false; | ||
constructor(_ref) { | ||
@@ -373,12 +354,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
item: null, | ||
link: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}); | ||
_defineProperty(this, "_submenu", false); | ||
this._dom.item = menuItemElement; | ||
@@ -441,2 +412,36 @@ this._dom.link = menuLinkElement; | ||
class BaseMenu { | ||
_MenuType = BaseMenu; | ||
_MenuItemType = BaseMenuItem; | ||
_MenuToggleType = BaseMenuToggle; | ||
_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"; | ||
_root = true; | ||
_currentChild = 0; | ||
_focusState = "none"; | ||
_currentEvent = "none"; | ||
_hoverType = "off"; | ||
_hoverDelay = 250; | ||
constructor(_ref) { | ||
@@ -459,36 +464,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_MenuType", BaseMenu); | ||
_defineProperty(this, "_MenuItemType", BaseMenuItem); | ||
_defineProperty(this, "_MenuToggleType", BaseMenuToggle); | ||
_defineProperty(this, "_dom", { | ||
menu: null, | ||
menuItems: [], | ||
submenuItems: [], | ||
submenuToggles: [], | ||
submenus: [], | ||
controller: null, | ||
container: null | ||
}); | ||
_defineProperty(this, "_selectors", { | ||
menuItems: "", | ||
menuLinks: "", | ||
submenuItems: "", | ||
submenuToggles: "", | ||
submenus: "" | ||
}); | ||
_defineProperty(this, "_elements", { | ||
menuItems: [], | ||
submenuToggles: [], | ||
controller: null, | ||
parentMenu: null, | ||
rootMenu: null | ||
}); | ||
_defineProperty(this, "_openClass", "show"); | ||
_defineProperty(this, "_closeClass", "hide"); | ||
_defineProperty(this, "_root", true); | ||
_defineProperty(this, "_currentChild", 0); | ||
_defineProperty(this, "_focusState", "none"); | ||
_defineProperty(this, "_currentEvent", "none"); | ||
_defineProperty(this, "_hoverType", "off"); | ||
_defineProperty(this, "_hoverDelay", 250); | ||
this._dom.menu = menuElement; | ||
@@ -946,4 +917,6 @@ this._dom.controller = controllerElement; | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1092,2 +1065,7 @@ }); | ||
class DisclosureMenu extends BaseMenu { | ||
_MenuType = DisclosureMenu; | ||
_MenuItemType = DisclosureMenuItem; | ||
_MenuToggleType = DisclosureMenuToggle; | ||
_currentChild = -1; | ||
_optionalSupport = false; | ||
constructor(_ref) { | ||
@@ -1128,7 +1106,2 @@ let { | ||
}); | ||
_defineProperty(this, "_MenuType", DisclosureMenu); | ||
_defineProperty(this, "_MenuItemType", DisclosureMenuItem); | ||
_defineProperty(this, "_MenuToggleType", DisclosureMenuToggle); | ||
_defineProperty(this, "_currentChild", -1); | ||
_defineProperty(this, "_optionalSupport", false); | ||
this._optionalSupport = optionalKeySupport; | ||
@@ -1135,0 +1108,0 @@ if (initialize) { |
@@ -1,2 +0,2 @@ | ||
function e(e,t,s){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var s=e[Symbol.toPrimitive];if(void 0!==s){var n=s.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const s in t)if(!(t[s]instanceof e)){const n=typeof t[s];throw new TypeError(`AccessibleMenu: ${s} must be an instance of ${e.name}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const s in t){const n=typeof t[s];if(n!==e)throw new TypeError(`AccessibleMenu: ${s} must be a ${e}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(s){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!1}}class i{constructor(t){let{menuToggleElement:s,parentElement:n,controlledMenu:o,parentMenu:l=null}=t;e(this,"_dom",{toggle:null,parent:null}),e(this,"_elements",{controlledMenu:null,parentMenu:null}),e(this,"_open",!1),e(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),e(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=s,this._dom.parent=n,this._elements.controlledMenu=o,this._elements.parentMenu=l}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(e,n){if(s("string",{tagName:e})&&t(HTMLElement,n)){const t=e.toLowerCase();let s=!0;for(const e in n)n[e].tagName.toLowerCase()!==t&&(s=!1);return s}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),s=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),s=`${t}-${s}`),this.dom.toggle.id=this.dom.toggle.id||`${s}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${s}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){s("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.add(s):this.elements.controlledMenu.dom.menu.classList.add(...s)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.remove(s):this.elements.controlledMenu.dom.menu.classList.remove(...s)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{constructor(t){let{menuItemElement:s,menuLinkElement:n,parentMenu:o,isSubmenuItem:l=!1,childMenu:i=null,toggle:r=null}=t;e(this,"_dom",{item:null,link:null}),e(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),e(this,"_submenu",!1),this._dom.item=s,this._dom.link=n,this._elements.parentMenu=o,this._elements.childMenu=i,this._elements.toggle=r,this._submenu=l}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function u(e){try{const t=e.key||e.keyCode,s={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(s).find((e=>!0===s[e]))||""}catch(e){return""}}function h(e){e.preventDefault(),e.stopPropagation()}class m{constructor(t){let{menuElement:s,menuItemSelector:n="li",menuLinkSelector:o="a",submenuItemSelector:l="",submenuToggleSelector:u="a",submenuSelector:h="ul",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:v=250}=t;e(this,"_MenuType",m),e(this,"_MenuItemType",r),e(this,"_MenuToggleType",i),e(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),e(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),e(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),e(this,"_openClass","show"),e(this,"_closeClass","hide"),e(this,"_root",!0),e(this,"_currentChild",0),e(this,"_focusState","none"),e(this,"_currentEvent","none"),e(this,"_hoverType","off"),e(this,"_hoverDelay",250),this._dom.menu=s,this._dom.controller=c,this._dom.container=a,this._selectors.menuItems=n,this._selectors.menuLinks=o,this._selectors.submenuItems=l,this._selectors.submenuToggles=u,this._selectors.submenus=h,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=v}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){o({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){o({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,s=!1;for(;!s&&t<e.elements.parentMenu.elements.menuItems.length;){const n=e.elements.parentMenu.elements.menuItems[t];n.isSubmenuItem&&n.elements.toggle.elements.controlledMenu===e&&(s=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}s("number",{value:e}),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))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){l({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){s("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let e=!0;return null!==this._dom.container||null!==this._dom.controller?t(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(e=!1):t(HTMLElement,{menuElement:this._dom.menu})||(e=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(e=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(e=!1),""===this._openClass||o({openClass:this._openClass})||(e=!1),""===this._closeClass||o({closeClass:this._closeClass})||(e=!1),s("boolean",{isTopLevel:this._root})||(e=!1),null===this._elements.parentMenu||t(m,{parentMenu:this._elements.parentMenu})||(e=!1),l({hoverType:this._hoverType})||(e=!1),s("number",{hoverDelay:this._hoverDelay})||(e=!1),e}_setDOMElementType(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);s!==this.dom.menu&&t(HTMLElement,{base:s});const o=Array.from(s.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===s));this._dom[e]=n?o:[...this._dom[e],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_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),o=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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),l=new this._MenuToggleType({menuToggleElement:s,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:s,parentMenu:this,isSubmenuItem:!0,childMenu:o,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)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,s){h(s),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,s)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(s)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(s=>{this.currentEvent="mouse",e(this,t.elements.toggle,s)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(s=>{if("pen"!==s.pointerType&&"touch"!==s.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const s=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!s||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||h(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||(h(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 c extends r{constructor(e){let{menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o=!1,childMenu:l=null,toggle:i=null,initialize:r=!0}=e;super({menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o,childMenu:l,toggle:i}),r&&this.initialize()}}class a extends i{constructor(e){let{menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o=null,initialize:l=!0}=e;super({menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o}),l&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class d extends m{constructor(t){let{menuElement:s,menuItemSelector:n="li",menuLinkSelector:o="a",submenuItemSelector:l="",submenuToggleSelector:i="a",submenuSelector:r="ul",controllerElement:u=null,containerElement:h=null,openClass:m="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:v=250,optionalKeySupport:y=!1,initialize:_=!0}=t;super({menuElement:s,menuItemSelector:n,menuLinkSelector:o,submenuItemSelector:l,submenuToggleSelector:i,submenuSelector:r,controllerElement:u,containerElement:h,openClass:m,closeClass:p,isTopLevel:g,parentMenu:f,hoverType:b,hoverDelay:v}),e(this,"_MenuType",d),e(this,"_MenuItemType",c),e(this,"_MenuToggleType",a),e(this,"_currentChild",-1),e(this,"_optionalSupport",!1),this._optionalSupport=y,_&&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){s("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();return s("boolean",{optionalKeySupport:this._optionalSupport})||(e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);if("self"===this.focusState){const s=["Space","Enter"],n=["Escape"],o=["Escape"];if(this.optionalKeySupport){["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"].includes(t)&&h(e)}else(this.currentMenuItem.isSubmenuItem&&s.includes(t)||this.elements.controller&&n.includes(t)||this.elements.parentMenu&&o.includes(t))&&h(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview()):this.currentMenuItem.dom.link.click();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(h(e),this.closeChildren()):this.elements.parentMenu?(h(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())}else this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(h(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(h(e),this.focusPreviousChild()):"Home"===t?(h(e),this.focusFirstChild()):"End"===t&&(h(e),this.focusLastChild()))}))}}export{d as default}; | ||
function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const s in t)if(!(t[s]instanceof e)){const n=typeof t[s];throw new TypeError(`AccessibleMenu: ${s} must be an instance of ${e.name}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const s in t){const n=typeof t[s];if(n!==e)throw new TypeError(`AccessibleMenu: ${s} must be a ${e}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(s){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${n} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],s(n)}}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!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(e){let{menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o=null}=e;this._dom.toggle=t,this._dom.parent=s,this._elements.controlledMenu=n,this._elements.parentMenu=o}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(s,n){if(t("string",{tagName:s})&&e(HTMLElement,n)){const e=s.toLowerCase();let t=!0;for(const s in n)n[s].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),s=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),s=`${t}-${s}`),this.dom.toggle.id=this.dom.toggle.id||`${s}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${s}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.add(s):this.elements.controlledMenu.dom.menu.classList.add(...s)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.remove(s):this.elements.controlledMenu.dom.menu.classList.remove(...s)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor(e){let{menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null}=e;this._dom.item=t,this._dom.link=s,this._elements.parentMenu=n,this._elements.childMenu=l,this._elements.toggle=r,this._submenu=o}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function i(e){try{const t=e.key||e.keyCode,s={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(s).find((e=>!0===s[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=r;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:s="li",menuLinkSelector:n="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=i,this._dom.container=u,this._selectors.menuItems=s,this._selectors.menuLinks=n,this._selectors.submenuItems=o,this._selectors.submenuToggles=l,this._selectors.submenus=r,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){n({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){n({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function s(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,s=!1;for(;!s&&t<e.elements.parentMenu.elements.menuItems.length;){const n=e.elements.parentMenu.elements.menuItems[t];n.isSubmenuItem&&n.elements.toggle.elements.controlledMenu===e&&(s=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,s(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,s(this)):this.focusChild!==e&&(this._currentChild=e,s(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){o({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let l=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(l=!1):e(HTMLElement,{menuElement:this._dom.menu})||(l=!1),""!==this._selectors.submenuItems?s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(l=!1):s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(l=!1),""===this._openClass||n({openClass:this._openClass})||(l=!1),""===this._closeClass||n({closeClass:this._closeClass})||(l=!1),t("boolean",{isTopLevel:this._root})||(l=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(l=!1),o({hoverType:this._hoverType})||(l=!1),t("number",{hoverDelay:this._hoverDelay})||(l=!1),l}_setDOMElementType(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);s!==this.dom.menu&&e(HTMLElement,{base:s});const o=Array.from(s.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===s));this._dom[t]=n?o:[...this._dom[t],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_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),o=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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),l=new this._MenuToggleType({menuToggleElement:s,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:s,parentMenu:this,isSubmenuItem:!0,childMenu:o,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)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,s){u(s),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,s)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(s)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(s=>{this.currentEvent="mouse",e(this,t.elements.toggle,s)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(s=>{if("pen"!==s.pointerType&&"touch"!==s.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const s=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!s||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends r{constructor(e){let{menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o,childMenu:l,toggle:r}),i&&this.initialize()}}class c extends l{constructor(e){let{menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o=null,initialize:l=!0}=e;super({menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o}),l&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;_currentChild=-1;_optionalSupport=!1;constructor(e){let{menuElement:t,menuItemSelector:s="li",menuLinkSelector:n="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,optionalKeySupport:g=!1,initialize:f=!0}=e;super({menuElement:t,menuItemSelector:s,menuLinkSelector:n,submenuItemSelector:o,submenuToggleSelector:l,submenuSelector:r,controllerElement:i,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),this._optionalSupport=g,f&&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){t("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();return t("boolean",{optionalKeySupport:this._optionalSupport})||(e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);if("self"===this.focusState){const s=["Space","Enter"],n=["Escape"],o=["Escape"];if(this.optionalKeySupport){["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"].includes(t)&&u(e)}else(this.currentMenuItem.isSubmenuItem&&s.includes(t)||this.elements.controller&&n.includes(t)||this.elements.parentMenu&&o.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview()):this.currentMenuItem.dom.link.click();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(u(e),this.closeChildren()):this.elements.parentMenu?(u(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())}else this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(u(e),this.focusPreviousChild()):"Home"===t?(u(e),this.focusFirstChild()):"End"===t&&(u(e),this.focusLastChild()))}))}}export{a as default}; | ||
//# sourceMappingURL=disclosure-menu.esm.min.js.map |
var DisclosureMenu = (function () { | ||
'use strict'; | ||
function _defineProperty(obj, key, value) { | ||
key = _toPropertyKey(key); | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function _toPrimitive(input, hint) { | ||
if (typeof input !== "object" || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || "default"); | ||
if (typeof res !== "object") return res; | ||
throw new TypeError("@@toPrimitive must return a primitive value."); | ||
} | ||
return (hint === "string" ? String : Number)(input); | ||
} | ||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, "string"); | ||
return typeof key === "symbol" ? key : String(key); | ||
} | ||
function isValidInstance(contructor, elements) { | ||
@@ -191,2 +162,23 @@ try { | ||
class BaseMenuToggle { | ||
_dom = { | ||
toggle: null, | ||
parent: null | ||
}; | ||
_elements = { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}; | ||
_open = false; | ||
_expandEvent = new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
_collapseEvent = new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
constructor(_ref) { | ||
@@ -199,23 +191,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
toggle: null, | ||
parent: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}); | ||
_defineProperty(this, "_open", false); | ||
_defineProperty(this, "_expandEvent", new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
_defineProperty(this, "_collapseEvent", new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
this._dom.toggle = menuToggleElement; | ||
@@ -366,2 +337,12 @@ this._dom.parent = parentElement; | ||
class BaseMenuItem { | ||
_dom = { | ||
item: null, | ||
link: null | ||
}; | ||
_elements = { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}; | ||
_submenu = false; | ||
constructor(_ref) { | ||
@@ -376,12 +357,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
item: null, | ||
link: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}); | ||
_defineProperty(this, "_submenu", false); | ||
this._dom.item = menuItemElement; | ||
@@ -444,2 +415,36 @@ this._dom.link = menuLinkElement; | ||
class BaseMenu { | ||
_MenuType = BaseMenu; | ||
_MenuItemType = BaseMenuItem; | ||
_MenuToggleType = BaseMenuToggle; | ||
_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"; | ||
_root = true; | ||
_currentChild = 0; | ||
_focusState = "none"; | ||
_currentEvent = "none"; | ||
_hoverType = "off"; | ||
_hoverDelay = 250; | ||
constructor(_ref) { | ||
@@ -462,36 +467,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_MenuType", BaseMenu); | ||
_defineProperty(this, "_MenuItemType", BaseMenuItem); | ||
_defineProperty(this, "_MenuToggleType", BaseMenuToggle); | ||
_defineProperty(this, "_dom", { | ||
menu: null, | ||
menuItems: [], | ||
submenuItems: [], | ||
submenuToggles: [], | ||
submenus: [], | ||
controller: null, | ||
container: null | ||
}); | ||
_defineProperty(this, "_selectors", { | ||
menuItems: "", | ||
menuLinks: "", | ||
submenuItems: "", | ||
submenuToggles: "", | ||
submenus: "" | ||
}); | ||
_defineProperty(this, "_elements", { | ||
menuItems: [], | ||
submenuToggles: [], | ||
controller: null, | ||
parentMenu: null, | ||
rootMenu: null | ||
}); | ||
_defineProperty(this, "_openClass", "show"); | ||
_defineProperty(this, "_closeClass", "hide"); | ||
_defineProperty(this, "_root", true); | ||
_defineProperty(this, "_currentChild", 0); | ||
_defineProperty(this, "_focusState", "none"); | ||
_defineProperty(this, "_currentEvent", "none"); | ||
_defineProperty(this, "_hoverType", "off"); | ||
_defineProperty(this, "_hoverDelay", 250); | ||
this._dom.menu = menuElement; | ||
@@ -949,4 +920,6 @@ this._dom.controller = controllerElement; | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1095,2 +1068,7 @@ }); | ||
class DisclosureMenu extends BaseMenu { | ||
_MenuType = DisclosureMenu; | ||
_MenuItemType = DisclosureMenuItem; | ||
_MenuToggleType = DisclosureMenuToggle; | ||
_currentChild = -1; | ||
_optionalSupport = false; | ||
constructor(_ref) { | ||
@@ -1131,7 +1109,2 @@ let { | ||
}); | ||
_defineProperty(this, "_MenuType", DisclosureMenu); | ||
_defineProperty(this, "_MenuItemType", DisclosureMenuItem); | ||
_defineProperty(this, "_MenuToggleType", DisclosureMenuToggle); | ||
_defineProperty(this, "_currentChild", -1); | ||
_defineProperty(this, "_optionalSupport", false); | ||
this._optionalSupport = optionalKeySupport; | ||
@@ -1138,0 +1111,0 @@ if (initialize) { |
@@ -1,2 +0,2 @@ | ||
var DisclosureMenu=function(){"use strict";function e(e,t,s){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var s=e[Symbol.toPrimitive];if(void 0!==s){var n=s.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const s in t)if(!(t[s]instanceof e)){const n=typeof t[s];throw new TypeError(`AccessibleMenu: ${s} must be an instance of ${e.name}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const s in t){const n=typeof t[s];if(n!==e)throw new TypeError(`AccessibleMenu: ${s} must be a ${e}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(s){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!1}}class i{constructor(t){let{menuToggleElement:s,parentElement:n,controlledMenu:o,parentMenu:l=null}=t;e(this,"_dom",{toggle:null,parent:null}),e(this,"_elements",{controlledMenu:null,parentMenu:null}),e(this,"_open",!1),e(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),e(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=s,this._dom.parent=n,this._elements.controlledMenu=o,this._elements.parentMenu=l}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(e,n){if(s("string",{tagName:e})&&t(HTMLElement,n)){const t=e.toLowerCase();let s=!0;for(const e in n)n[e].tagName.toLowerCase()!==t&&(s=!1);return s}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),s=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),s=`${t}-${s}`),this.dom.toggle.id=this.dom.toggle.id||`${s}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${s}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){s("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.add(s):this.elements.controlledMenu.dom.menu.classList.add(...s)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.remove(s):this.elements.controlledMenu.dom.menu.classList.remove(...s)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{constructor(t){let{menuItemElement:s,menuLinkElement:n,parentMenu:o,isSubmenuItem:l=!1,childMenu:i=null,toggle:r=null}=t;e(this,"_dom",{item:null,link:null}),e(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),e(this,"_submenu",!1),this._dom.item=s,this._dom.link=n,this._elements.parentMenu=o,this._elements.childMenu=i,this._elements.toggle=r,this._submenu=l}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function u(e){try{const t=e.key||e.keyCode,s={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(s).find((e=>!0===s[e]))||""}catch(e){return""}}function h(e){e.preventDefault(),e.stopPropagation()}class m{constructor(t){let{menuElement:s,menuItemSelector:n="li",menuLinkSelector:o="a",submenuItemSelector:l="",submenuToggleSelector:u="a",submenuSelector:h="ul",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:v=250}=t;e(this,"_MenuType",m),e(this,"_MenuItemType",r),e(this,"_MenuToggleType",i),e(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),e(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),e(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),e(this,"_openClass","show"),e(this,"_closeClass","hide"),e(this,"_root",!0),e(this,"_currentChild",0),e(this,"_focusState","none"),e(this,"_currentEvent","none"),e(this,"_hoverType","off"),e(this,"_hoverDelay",250),this._dom.menu=s,this._dom.controller=c,this._dom.container=a,this._selectors.menuItems=n,this._selectors.menuLinks=o,this._selectors.submenuItems=l,this._selectors.submenuToggles=u,this._selectors.submenus=h,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=v}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){o({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){o({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,s=!1;for(;!s&&t<e.elements.parentMenu.elements.menuItems.length;){const n=e.elements.parentMenu.elements.menuItems[t];n.isSubmenuItem&&n.elements.toggle.elements.controlledMenu===e&&(s=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}s("number",{value:e}),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))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){l({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){s("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let e=!0;return null!==this._dom.container||null!==this._dom.controller?t(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(e=!1):t(HTMLElement,{menuElement:this._dom.menu})||(e=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(e=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(e=!1),""===this._openClass||o({openClass:this._openClass})||(e=!1),""===this._closeClass||o({closeClass:this._closeClass})||(e=!1),s("boolean",{isTopLevel:this._root})||(e=!1),null===this._elements.parentMenu||t(m,{parentMenu:this._elements.parentMenu})||(e=!1),l({hoverType:this._hoverType})||(e=!1),s("number",{hoverDelay:this._hoverDelay})||(e=!1),e}_setDOMElementType(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);s!==this.dom.menu&&t(HTMLElement,{base:s});const o=Array.from(s.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===s));this._dom[e]=n?o:[...this._dom[e],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_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),o=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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),l=new this._MenuToggleType({menuToggleElement:s,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:s,parentMenu:this,isSubmenuItem:!0,childMenu:o,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)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,s){h(s),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,s)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(s)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(s=>{this.currentEvent="mouse",e(this,t.elements.toggle,s)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(s=>{if("pen"!==s.pointerType&&"touch"!==s.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const s=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!s||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||h(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||(h(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 c extends r{constructor(e){let{menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o=!1,childMenu:l=null,toggle:i=null,initialize:r=!0}=e;super({menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o,childMenu:l,toggle:i}),r&&this.initialize()}}class a extends i{constructor(e){let{menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o=null,initialize:l=!0}=e;super({menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o}),l&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class d extends m{constructor(t){let{menuElement:s,menuItemSelector:n="li",menuLinkSelector:o="a",submenuItemSelector:l="",submenuToggleSelector:i="a",submenuSelector:r="ul",controllerElement:u=null,containerElement:h=null,openClass:m="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:v=250,optionalKeySupport:y=!1,initialize:_=!0}=t;super({menuElement:s,menuItemSelector:n,menuLinkSelector:o,submenuItemSelector:l,submenuToggleSelector:i,submenuSelector:r,controllerElement:u,containerElement:h,openClass:m,closeClass:p,isTopLevel:g,parentMenu:f,hoverType:b,hoverDelay:v}),e(this,"_MenuType",d),e(this,"_MenuItemType",c),e(this,"_MenuToggleType",a),e(this,"_currentChild",-1),e(this,"_optionalSupport",!1),this._optionalSupport=y,_&&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){s("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();return s("boolean",{optionalKeySupport:this._optionalSupport})||(e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);if("self"===this.focusState){const s=["Space","Enter"],n=["Escape"],o=["Escape"];if(this.optionalKeySupport){["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"].includes(t)&&h(e)}else(this.currentMenuItem.isSubmenuItem&&s.includes(t)||this.elements.controller&&n.includes(t)||this.elements.parentMenu&&o.includes(t))&&h(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview()):this.currentMenuItem.dom.link.click();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(h(e),this.closeChildren()):this.elements.parentMenu?(h(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())}else this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(h(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(h(e),this.focusPreviousChild()):"Home"===t?(h(e),this.focusFirstChild()):"End"===t&&(h(e),this.focusLastChild()))}))}}return d}(); | ||
var DisclosureMenu=function(){"use strict";function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const s in t)if(!(t[s]instanceof e)){const n=typeof t[s];throw new TypeError(`AccessibleMenu: ${s} must be an instance of ${e.name}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const s in t){const n=typeof t[s];if(n!==e)throw new TypeError(`AccessibleMenu: ${s} must be a ${e}. ${n} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(s){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${n} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],s(n)}}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!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(e){let{menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o=null}=e;this._dom.toggle=t,this._dom.parent=s,this._elements.controlledMenu=n,this._elements.parentMenu=o}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(s,n){if(t("string",{tagName:s})&&e(HTMLElement,n)){const e=s.toLowerCase();let t=!0;for(const s in n)n[s].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),s=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),s=`${t}-${s}`),this.dom.toggle.id=this.dom.toggle.id||`${s}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${s}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.add(s):this.elements.controlledMenu.dom.menu.classList.add(...s)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:s}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==s&&("string"==typeof s?this.elements.controlledMenu.dom.menu.classList.remove(s):this.elements.controlledMenu.dom.menu.classList.remove(...s)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor(e){let{menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null}=e;this._dom.item=t,this._dom.link=s,this._elements.parentMenu=n,this._elements.childMenu=l,this._elements.toggle=r,this._submenu=o}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function i(e){try{const t=e.key||e.keyCode,s={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(s).find((e=>!0===s[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=r;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:s="li",menuLinkSelector:n="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=i,this._dom.container=u,this._selectors.menuItems=s,this._selectors.menuLinks=n,this._selectors.submenuItems=o,this._selectors.submenuToggles=l,this._selectors.submenus=r,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){n({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){n({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function s(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,s=!1;for(;!s&&t<e.elements.parentMenu.elements.menuItems.length;){const n=e.elements.parentMenu.elements.menuItems[t];n.isSubmenuItem&&n.elements.toggle.elements.controlledMenu===e&&(s=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,s(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,s(this)):this.focusChild!==e&&(this._currentChild=e,s(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const s in e)if(!t.includes(e[s]))throw new TypeError(`AccessibleMenu: ${s} must be one of the following values: ${t.join(", ")}. "${e[s]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){o({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let l=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(l=!1):e(HTMLElement,{menuElement:this._dom.menu})||(l=!1),""!==this._selectors.submenuItems?s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(l=!1):s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(l=!1),""===this._openClass||n({openClass:this._openClass})||(l=!1),""===this._closeClass||n({closeClass:this._closeClass})||(l=!1),t("boolean",{isTopLevel:this._root})||(l=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(l=!1),o({hoverType:this._hoverType})||(l=!1),t("number",{hoverDelay:this._hoverDelay})||(l=!1),l}_setDOMElementType(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);s!==this.dom.menu&&e(HTMLElement,{base:s});const o=Array.from(s.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===s));this._dom[t]=n?o:[...this._dom[t],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_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),o=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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),l=new this._MenuToggleType({menuToggleElement:s,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:s,parentMenu:this,isSubmenuItem:!0,childMenu:o,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)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,s){u(s),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,s)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(s)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(s=>{this.currentEvent="mouse",e(this,t.elements.toggle,s)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(s=>{if("pen"!==s.pointerType&&"touch"!==s.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const s=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!s||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends r{constructor(e){let{menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:s,parentMenu:n,isSubmenuItem:o,childMenu:l,toggle:r}),i&&this.initialize()}}class c extends l{constructor(e){let{menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o=null,initialize:l=!0}=e;super({menuToggleElement:t,parentElement:s,controlledMenu:n,parentMenu:o}),l&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;_currentChild=-1;_optionalSupport=!1;constructor(e){let{menuElement:t,menuItemSelector:s="li",menuLinkSelector:n="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,optionalKeySupport:g=!1,initialize:f=!0}=e;super({menuElement:t,menuItemSelector:s,menuLinkSelector:n,submenuItemSelector:o,submenuToggleSelector:l,submenuSelector:r,controllerElement:i,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),this._optionalSupport=g,f&&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){t("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();return t("boolean",{optionalKeySupport:this._optionalSupport})||(e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);if("self"===this.focusState){const s=["Space","Enter"],n=["Escape"],o=["Escape"];if(this.optionalKeySupport){["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"].includes(t)&&u(e)}else(this.currentMenuItem.isSubmenuItem&&s.includes(t)||this.elements.controller&&n.includes(t)||this.elements.parentMenu&&o.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview()):this.currentMenuItem.dom.link.click();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(u(e),this.closeChildren()):this.elements.parentMenu?(u(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())}else this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(u(e),this.focusPreviousChild()):"Home"===t?(u(e),this.focusFirstChild()):"End"===t&&(u(e),this.focusLastChild()))}))}}return a}(); | ||
//# sourceMappingURL=disclosure-menu.min.js.map |
@@ -1,30 +0,1 @@ | ||
function _defineProperty(obj, key, value) { | ||
key = _toPropertyKey(key); | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function _toPrimitive(input, hint) { | ||
if (typeof input !== "object" || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || "default"); | ||
if (typeof res !== "object") return res; | ||
throw new TypeError("@@toPrimitive must return a primitive value."); | ||
} | ||
return (hint === "string" ? String : Number)(input); | ||
} | ||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, "string"); | ||
return typeof key === "symbol" ? key : String(key); | ||
} | ||
function isValidInstance(contructor, elements) { | ||
@@ -188,2 +159,23 @@ try { | ||
class BaseMenuToggle { | ||
_dom = { | ||
toggle: null, | ||
parent: null | ||
}; | ||
_elements = { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}; | ||
_open = false; | ||
_expandEvent = new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
_collapseEvent = new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
constructor(_ref) { | ||
@@ -196,23 +188,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
toggle: null, | ||
parent: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}); | ||
_defineProperty(this, "_open", false); | ||
_defineProperty(this, "_expandEvent", new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
_defineProperty(this, "_collapseEvent", new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
this._dom.toggle = menuToggleElement; | ||
@@ -363,2 +334,12 @@ this._dom.parent = parentElement; | ||
class BaseMenuItem { | ||
_dom = { | ||
item: null, | ||
link: null | ||
}; | ||
_elements = { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}; | ||
_submenu = false; | ||
constructor(_ref) { | ||
@@ -373,12 +354,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
item: null, | ||
link: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}); | ||
_defineProperty(this, "_submenu", false); | ||
this._dom.item = menuItemElement; | ||
@@ -441,2 +412,36 @@ this._dom.link = menuLinkElement; | ||
class BaseMenu { | ||
_MenuType = BaseMenu; | ||
_MenuItemType = BaseMenuItem; | ||
_MenuToggleType = BaseMenuToggle; | ||
_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"; | ||
_root = true; | ||
_currentChild = 0; | ||
_focusState = "none"; | ||
_currentEvent = "none"; | ||
_hoverType = "off"; | ||
_hoverDelay = 250; | ||
constructor(_ref) { | ||
@@ -459,36 +464,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_MenuType", BaseMenu); | ||
_defineProperty(this, "_MenuItemType", BaseMenuItem); | ||
_defineProperty(this, "_MenuToggleType", BaseMenuToggle); | ||
_defineProperty(this, "_dom", { | ||
menu: null, | ||
menuItems: [], | ||
submenuItems: [], | ||
submenuToggles: [], | ||
submenus: [], | ||
controller: null, | ||
container: null | ||
}); | ||
_defineProperty(this, "_selectors", { | ||
menuItems: "", | ||
menuLinks: "", | ||
submenuItems: "", | ||
submenuToggles: "", | ||
submenus: "" | ||
}); | ||
_defineProperty(this, "_elements", { | ||
menuItems: [], | ||
submenuToggles: [], | ||
controller: null, | ||
parentMenu: null, | ||
rootMenu: null | ||
}); | ||
_defineProperty(this, "_openClass", "show"); | ||
_defineProperty(this, "_closeClass", "hide"); | ||
_defineProperty(this, "_root", true); | ||
_defineProperty(this, "_currentChild", 0); | ||
_defineProperty(this, "_focusState", "none"); | ||
_defineProperty(this, "_currentEvent", "none"); | ||
_defineProperty(this, "_hoverType", "off"); | ||
_defineProperty(this, "_hoverDelay", 250); | ||
this._dom.menu = menuElement; | ||
@@ -946,4 +917,6 @@ this._dom.controller = controllerElement; | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1110,2 +1083,5 @@ }); | ||
class Menubar extends BaseMenu { | ||
_MenuType = Menubar; | ||
_MenuItemType = MenubarItem; | ||
_MenuToggleType = MenubarToggle; | ||
constructor(_ref) { | ||
@@ -1145,5 +1121,2 @@ let { | ||
}); | ||
_defineProperty(this, "_MenuType", Menubar); | ||
_defineProperty(this, "_MenuItemType", MenubarItem); | ||
_defineProperty(this, "_MenuToggleType", MenubarToggle); | ||
if (initialize) { | ||
@@ -1150,0 +1123,0 @@ this.initialize(); |
@@ -1,2 +0,2 @@ | ||
function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${n} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],s(n)}}return!0}catch(e){return console.error(e),!1}}function i(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class r{constructor(t){let{menuToggleElement:n,parentElement:s,controlledMenu:o,parentMenu:i=null}=t;e(this,"_dom",{toggle:null,parent:null}),e(this,"_elements",{controlledMenu:null,parentMenu:null}),e(this,"_open",!1),e(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),e(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=n,this._dom.parent=s,this._elements.controlledMenu=o,this._elements.parentMenu=i}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(e,s){if(n("string",{tagName:e})&&t(HTMLElement,s)){const t=e.toLowerCase();let n=!0;for(const e in s)s[e].tagName.toLowerCase()!==t&&(n=!1);return n}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){n("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 l{constructor(t){let{menuItemElement:n,menuLinkElement:s,parentMenu:o,isSubmenuItem:i=!1,childMenu:r=null,toggle:l=null}=t;e(this,"_dom",{item:null,link:null}),e(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),e(this,"_submenu",!1),this._dom.item=n,this._dom.link=s,this._elements.parentMenu=o,this._elements.childMenu=r,this._elements.toggle=l,this._submenu=i}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function u(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function h(e){e.preventDefault(),e.stopPropagation()}class m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:o="a",submenuItemSelector:i="",submenuToggleSelector:u="a",submenuSelector:h="ul",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250}=t;e(this,"_MenuType",m),e(this,"_MenuItemType",l),e(this,"_MenuToggleType",r),e(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),e(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),e(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),e(this,"_openClass","show"),e(this,"_closeClass","hide"),e(this,"_root",!0),e(this,"_currentChild",0),e(this,"_focusState","none"),e(this,"_currentEvent","none"),e(this,"_hoverType","off"),e(this,"_hoverDelay",250),this._dom.menu=n,this._dom.controller=c,this._dom.container=a,this._selectors.menuItems=s,this._selectors.menuLinks=o,this._selectors.submenuItems=i,this._selectors.submenuToggles=u,this._selectors.submenus=h,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=M}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){o({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){o({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}n("number",{value:e}),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))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){i({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){n("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let e=!0;return null!==this._dom.container||null!==this._dom.controller?t(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(e=!1):t(HTMLElement,{menuElement:this._dom.menu})||(e=!1),""!==this._selectors.submenuItems?s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(e=!1):s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(e=!1),""===this._openClass||o({openClass:this._openClass})||(e=!1),""===this._closeClass||o({closeClass:this._closeClass})||(e=!1),n("boolean",{isTopLevel:this._root})||(e=!1),null===this._elements.parentMenu||t(m,{parentMenu:this._elements.parentMenu})||(e=!1),i({hoverType:this._hoverType})||(e=!1),n("number",{hoverDelay:this._hoverDelay})||(e=!1),e}_setDOMElementType(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&t(HTMLElement,{base:n});const o=Array.from(n.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===n));this._dom[e]=s?o:[...this._dom[e],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),o=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),i=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(i),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:o,toggle:i})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){h(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||h(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||(h(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 c extends l{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o=!1,childMenu:i=null,toggle:r=null,initialize:l=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o,childMenu:i,toggle:r}),l&&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 a extends r{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o=null,initialize:i=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o}),i&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class d extends m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:o="a",submenuItemSelector:i="",submenuToggleSelector:r="a",submenuSelector:l="ul",controllerElement:u=null,containerElement:h=null,openClass:m="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250,initialize:v=!0}=t;super({menuElement:n,menuItemSelector:s,menuLinkSelector:o,submenuItemSelector:i,submenuToggleSelector:r,submenuSelector:l,controllerElement:u,containerElement:h,openClass:m,closeClass:p,isTopLevel:g,parentMenu:f,hoverType:b,hoverDelay:M}),e(this,"_MenuType",d),e(this,"_MenuItemType",c),e(this,"_MenuToggleType",a),v&&this.initialize()}initialize(){try{super.initialize(),this.dom.menu.setAttribute("role","menubar"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0)}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),"Character"===t)h(e);else if(this.isTopLevel){if("self"===this.focusState){const n=["Space","Enter","ArrowDown","ArrowUp"],s=["Escape"];(["ArrowRight","ArrowLeft","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&h(e)}}else{const n=["Space","Enter"];(["Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t))&&h(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e),{altKey:n,crtlKey:s,metaKey:o}=e;if("Character"!==t||(n||s||o))if(this.isTopLevel){if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click();else if("ArrowRight"===t){h(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowLeft"===t){h(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowDown"===t)this.currentMenuItem.isSubmenuItem&&(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})));else if("ArrowUp"===t)this.currentMenuItem.isSubmenuItem&&(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})));else if("Home"===t)h(e),this.focusFirstChild();else if("End"===t)h(e),this.focusLastChild();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(h(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(h(e),this.elements.controller.close(),this.focusController())}}else"Space"===t||"Enter"===t?this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click():"Escape"===t?(h(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):"ArrowRight"===t?this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):(h(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(h(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()))):"ArrowDown"===t?(h(e),this.focusNextChild()):"ArrowUp"===t?(h(e),this.focusPreviousChild()):"Home"===t?(h(e),this.focusFirstChild()):"End"===t&&(h(e),this.focusLastChild());else h(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key)}))}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){0===this.currentChild?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let n=this.currentChild+1,s=!1;for(;!s&&n<this.elements.menuItems.length;){let e="";e=this.elements.menuItems[n].dom.item.innerText?this.elements.menuItems[n].dom.item.innerText:this.elements.menuItems[n].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t&&(s=!0,this.focusChild(n)),n++}}}export{d as default}; | ||
function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!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(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o=null}=e;this._dom.toggle=t,this._dom.parent=n,this._elements.controlledMenu=s,this._elements.parentMenu=o}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(n,s){if(t("string",{tagName:n})&&e(HTMLElement,s)){const e=n.toLowerCase();let t=!0;for(const n in s)s[n].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null}=e;this._dom.item=t,this._dom.link=n,this._elements.parentMenu=s,this._elements.childMenu=l,this._elements.toggle=r,this._submenu=o}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function i(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=r;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=i,this._dom.container=u,this._selectors.menuItems=n,this._selectors.menuLinks=s,this._selectors.submenuItems=o,this._selectors.submenuToggles=l,this._selectors.submenus=r,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){s({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){s({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function n(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,n(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,n(this)):this.focusChild!==e&&(this._currentChild=e,n(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){o({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let l=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(l=!1):e(HTMLElement,{menuElement:this._dom.menu})||(l=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(l=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(l=!1),""===this._openClass||s({openClass:this._openClass})||(l=!1),""===this._closeClass||s({closeClass:this._closeClass})||(l=!1),t("boolean",{isTopLevel:this._root})||(l=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(l=!1),o({hoverType:this._hoverType})||(l=!1),t("number",{hoverDelay:this._hoverDelay})||(l=!1),l}_setDOMElementType(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&e(HTMLElement,{base:n});const o=Array.from(n.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===n));this._dom[t]=s?o:[...this._dom[t],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),o=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),l=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:o,toggle:l})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){u(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends r{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o,childMenu:l,toggle:r}),i&&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 c extends l{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o=null,initialize:l=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o}),l&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:o,submenuToggleSelector:l,submenuSelector:r,controllerElement:i,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),g&&this.initialize()}initialize(){try{super.initialize(),this.dom.menu.setAttribute("role","menubar"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0)}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),"Character"===t)u(e);else if(this.isTopLevel){if("self"===this.focusState){const n=["Space","Enter","ArrowDown","ArrowUp"],s=["Escape"];(["ArrowRight","ArrowLeft","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&u(e)}}else{const n=["Space","Enter"];(["Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e),{altKey:n,crtlKey:s,metaKey:o}=e;if("Character"!==t||(n||s||o))if(this.isTopLevel){if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click();else if("ArrowRight"===t){u(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowLeft"===t){u(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowDown"===t)this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})));else if("ArrowUp"===t)this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})));else if("Home"===t)u(e),this.focusFirstChild();else if("End"===t)u(e),this.focusLastChild();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(u(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(u(e),this.elements.controller.close(),this.focusController())}}else"Space"===t||"Enter"===t?this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click():"Escape"===t?(u(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):"ArrowRight"===t?this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):(u(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(u(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()))):"ArrowDown"===t?(u(e),this.focusNextChild()):"ArrowUp"===t?(u(e),this.focusPreviousChild()):"Home"===t?(u(e),this.focusFirstChild()):"End"===t&&(u(e),this.focusLastChild());else u(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key)}))}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){0===this.currentChild?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let n=this.currentChild+1,s=!1;for(;!s&&n<this.elements.menuItems.length;){let e="";e=this.elements.menuItems[n].dom.item.innerText?this.elements.menuItems[n].dom.item.innerText:this.elements.menuItems[n].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t&&(s=!0,this.focusChild(n)),n++}}}export{a as default}; | ||
//# sourceMappingURL=menubar.esm.min.js.map |
var Menubar = (function () { | ||
'use strict'; | ||
function _defineProperty(obj, key, value) { | ||
key = _toPropertyKey(key); | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function _toPrimitive(input, hint) { | ||
if (typeof input !== "object" || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || "default"); | ||
if (typeof res !== "object") return res; | ||
throw new TypeError("@@toPrimitive must return a primitive value."); | ||
} | ||
return (hint === "string" ? String : Number)(input); | ||
} | ||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, "string"); | ||
return typeof key === "symbol" ? key : String(key); | ||
} | ||
function isValidInstance(contructor, elements) { | ||
@@ -191,2 +162,23 @@ try { | ||
class BaseMenuToggle { | ||
_dom = { | ||
toggle: null, | ||
parent: null | ||
}; | ||
_elements = { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}; | ||
_open = false; | ||
_expandEvent = new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
_collapseEvent = new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
constructor(_ref) { | ||
@@ -199,23 +191,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
toggle: null, | ||
parent: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}); | ||
_defineProperty(this, "_open", false); | ||
_defineProperty(this, "_expandEvent", new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
_defineProperty(this, "_collapseEvent", new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
this._dom.toggle = menuToggleElement; | ||
@@ -366,2 +337,12 @@ this._dom.parent = parentElement; | ||
class BaseMenuItem { | ||
_dom = { | ||
item: null, | ||
link: null | ||
}; | ||
_elements = { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}; | ||
_submenu = false; | ||
constructor(_ref) { | ||
@@ -376,12 +357,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
item: null, | ||
link: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}); | ||
_defineProperty(this, "_submenu", false); | ||
this._dom.item = menuItemElement; | ||
@@ -444,2 +415,36 @@ this._dom.link = menuLinkElement; | ||
class BaseMenu { | ||
_MenuType = BaseMenu; | ||
_MenuItemType = BaseMenuItem; | ||
_MenuToggleType = BaseMenuToggle; | ||
_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"; | ||
_root = true; | ||
_currentChild = 0; | ||
_focusState = "none"; | ||
_currentEvent = "none"; | ||
_hoverType = "off"; | ||
_hoverDelay = 250; | ||
constructor(_ref) { | ||
@@ -462,36 +467,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_MenuType", BaseMenu); | ||
_defineProperty(this, "_MenuItemType", BaseMenuItem); | ||
_defineProperty(this, "_MenuToggleType", BaseMenuToggle); | ||
_defineProperty(this, "_dom", { | ||
menu: null, | ||
menuItems: [], | ||
submenuItems: [], | ||
submenuToggles: [], | ||
submenus: [], | ||
controller: null, | ||
container: null | ||
}); | ||
_defineProperty(this, "_selectors", { | ||
menuItems: "", | ||
menuLinks: "", | ||
submenuItems: "", | ||
submenuToggles: "", | ||
submenus: "" | ||
}); | ||
_defineProperty(this, "_elements", { | ||
menuItems: [], | ||
submenuToggles: [], | ||
controller: null, | ||
parentMenu: null, | ||
rootMenu: null | ||
}); | ||
_defineProperty(this, "_openClass", "show"); | ||
_defineProperty(this, "_closeClass", "hide"); | ||
_defineProperty(this, "_root", true); | ||
_defineProperty(this, "_currentChild", 0); | ||
_defineProperty(this, "_focusState", "none"); | ||
_defineProperty(this, "_currentEvent", "none"); | ||
_defineProperty(this, "_hoverType", "off"); | ||
_defineProperty(this, "_hoverDelay", 250); | ||
this._dom.menu = menuElement; | ||
@@ -949,4 +920,6 @@ this._dom.controller = controllerElement; | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1113,2 +1086,5 @@ }); | ||
class Menubar extends BaseMenu { | ||
_MenuType = Menubar; | ||
_MenuItemType = MenubarItem; | ||
_MenuToggleType = MenubarToggle; | ||
constructor(_ref) { | ||
@@ -1148,5 +1124,2 @@ let { | ||
}); | ||
_defineProperty(this, "_MenuType", Menubar); | ||
_defineProperty(this, "_MenuItemType", MenubarItem); | ||
_defineProperty(this, "_MenuToggleType", MenubarToggle); | ||
if (initialize) { | ||
@@ -1153,0 +1126,0 @@ this.initialize(); |
@@ -1,2 +0,2 @@ | ||
var Menubar=function(){"use strict";function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${n} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],s(n)}}return!0}catch(e){return console.error(e),!1}}function i(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class r{constructor(t){let{menuToggleElement:n,parentElement:s,controlledMenu:o,parentMenu:i=null}=t;e(this,"_dom",{toggle:null,parent:null}),e(this,"_elements",{controlledMenu:null,parentMenu:null}),e(this,"_open",!1),e(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),e(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=n,this._dom.parent=s,this._elements.controlledMenu=o,this._elements.parentMenu=i}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(e,s){if(n("string",{tagName:e})&&t(HTMLElement,s)){const t=e.toLowerCase();let n=!0;for(const e in s)s[e].tagName.toLowerCase()!==t&&(n=!1);return n}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){n("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 l{constructor(t){let{menuItemElement:n,menuLinkElement:s,parentMenu:o,isSubmenuItem:i=!1,childMenu:r=null,toggle:l=null}=t;e(this,"_dom",{item:null,link:null}),e(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),e(this,"_submenu",!1),this._dom.item=n,this._dom.link=s,this._elements.parentMenu=o,this._elements.childMenu=r,this._elements.toggle=l,this._submenu=i}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function u(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function h(e){e.preventDefault(),e.stopPropagation()}class m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:o="a",submenuItemSelector:i="",submenuToggleSelector:u="a",submenuSelector:h="ul",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250}=t;e(this,"_MenuType",m),e(this,"_MenuItemType",l),e(this,"_MenuToggleType",r),e(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),e(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),e(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),e(this,"_openClass","show"),e(this,"_closeClass","hide"),e(this,"_root",!0),e(this,"_currentChild",0),e(this,"_focusState","none"),e(this,"_currentEvent","none"),e(this,"_hoverType","off"),e(this,"_hoverDelay",250),this._dom.menu=n,this._dom.controller=c,this._dom.container=a,this._selectors.menuItems=s,this._selectors.menuLinks=o,this._selectors.submenuItems=i,this._selectors.submenuToggles=u,this._selectors.submenus=h,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=M}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){o({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){o({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}n("number",{value:e}),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))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){i({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){n("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let e=!0;return null!==this._dom.container||null!==this._dom.controller?t(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(e=!1):t(HTMLElement,{menuElement:this._dom.menu})||(e=!1),""!==this._selectors.submenuItems?s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(e=!1):s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(e=!1),""===this._openClass||o({openClass:this._openClass})||(e=!1),""===this._closeClass||o({closeClass:this._closeClass})||(e=!1),n("boolean",{isTopLevel:this._root})||(e=!1),null===this._elements.parentMenu||t(m,{parentMenu:this._elements.parentMenu})||(e=!1),i({hoverType:this._hoverType})||(e=!1),n("number",{hoverDelay:this._hoverDelay})||(e=!1),e}_setDOMElementType(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&t(HTMLElement,{base:n});const o=Array.from(n.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===n));this._dom[e]=s?o:[...this._dom[e],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),o=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),i=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(i),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:o,toggle:i})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){h(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||h(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||(h(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 c extends l{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o=!1,childMenu:i=null,toggle:r=null,initialize:l=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o,childMenu:i,toggle:r}),l&&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 a extends r{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o=null,initialize:i=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o}),i&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class d extends m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:o="a",submenuItemSelector:i="",submenuToggleSelector:r="a",submenuSelector:l="ul",controllerElement:u=null,containerElement:h=null,openClass:m="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250,initialize:v=!0}=t;super({menuElement:n,menuItemSelector:s,menuLinkSelector:o,submenuItemSelector:i,submenuToggleSelector:r,submenuSelector:l,controllerElement:u,containerElement:h,openClass:m,closeClass:p,isTopLevel:g,parentMenu:f,hoverType:b,hoverDelay:M}),e(this,"_MenuType",d),e(this,"_MenuItemType",c),e(this,"_MenuToggleType",a),v&&this.initialize()}initialize(){try{super.initialize(),this.dom.menu.setAttribute("role","menubar"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0)}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),"Character"===t)h(e);else if(this.isTopLevel){if("self"===this.focusState){const n=["Space","Enter","ArrowDown","ArrowUp"],s=["Escape"];(["ArrowRight","ArrowLeft","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&h(e)}}else{const n=["Space","Enter"];(["Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t))&&h(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e),{altKey:n,crtlKey:s,metaKey:o}=e;if("Character"!==t||(n||s||o))if(this.isTopLevel){if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click();else if("ArrowRight"===t){h(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowLeft"===t){h(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowDown"===t)this.currentMenuItem.isSubmenuItem&&(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})));else if("ArrowUp"===t)this.currentMenuItem.isSubmenuItem&&(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})));else if("Home"===t)h(e),this.focusFirstChild();else if("End"===t)h(e),this.focusLastChild();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(h(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(h(e),this.elements.controller.close(),this.focusController())}}else"Space"===t||"Enter"===t?this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click():"Escape"===t?(h(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):"ArrowRight"===t?this.currentMenuItem.isSubmenuItem?(h(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):(h(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(h(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()))):"ArrowDown"===t?(h(e),this.focusNextChild()):"ArrowUp"===t?(h(e),this.focusPreviousChild()):"Home"===t?(h(e),this.focusFirstChild()):"End"===t&&(h(e),this.focusLastChild());else h(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key)}))}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){0===this.currentChild?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let n=this.currentChild+1,s=!1;for(;!s&&n<this.elements.menuItems.length;){let e="";e=this.elements.menuItems[n].dom.item.innerText?this.elements.menuItems[n].dom.item.innerText:this.elements.menuItems[n].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t&&(s=!0,this.focusChild(n)),n++}}}return d}(); | ||
var Menubar=function(){"use strict";function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function o(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!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(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o=null}=e;this._dom.toggle=t,this._dom.parent=n,this._elements.controlledMenu=s,this._elements.parentMenu=o}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(n,s){if(t("string",{tagName:n})&&e(HTMLElement,s)){const e=n.toLowerCase();let t=!0;for(const n in s)s[n].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null}=e;this._dom.item=t,this._dom.link=n,this._elements.parentMenu=s,this._elements.childMenu=l,this._elements.toggle=r,this._submenu=o}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function i(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=r;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=i,this._dom.container=u,this._selectors.menuItems=n,this._selectors.menuLinks=s,this._selectors.submenuItems=o,this._selectors.submenuToggles=l,this._selectors.submenus=r,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){s({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){s({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function n(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,n(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,n(this)):this.focusChild!==e&&(this._currentChild=e,n(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){o({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let l=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(l=!1):e(HTMLElement,{menuElement:this._dom.menu})||(l=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(l=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(l=!1),""===this._openClass||s({openClass:this._openClass})||(l=!1),""===this._closeClass||s({closeClass:this._closeClass})||(l=!1),t("boolean",{isTopLevel:this._root})||(l=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(l=!1),o({hoverType:this._hoverType})||(l=!1),t("number",{hoverDelay:this._hoverDelay})||(l=!1),l}_setDOMElementType(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&e(HTMLElement,{base:n});const o=Array.from(n.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===n));this._dom[t]=s?o:[...this._dom[t],...o]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),o=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),l=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(l),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:o,toggle:l})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){u(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends r{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o=!1,childMenu:l=null,toggle:r=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:o,childMenu:l,toggle:r}),i&&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 c extends l{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o=null,initialize:l=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:o}),l&&this.initialize()}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:o="",submenuToggleSelector:l="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:o,submenuToggleSelector:l,submenuSelector:r,controllerElement:i,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),g&&this.initialize()}initialize(){try{super.initialize(),this.dom.menu.setAttribute("role","menubar"),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this.isTopLevel&&(this.elements.menuItems[0].dom.link.tabIndex=0)}catch(e){console.error(e)}}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(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()))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?(this.elements.rootMenu.blur(),this.elements.rootMenu.closeChildren()):this.elements.rootMenu.focus()),"Character"===t)u(e);else if(this.isTopLevel){if("self"===this.focusState){const n=["Space","Enter","ArrowDown","ArrowUp"],s=["Escape"];(["ArrowRight","ArrowLeft","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&u(e)}}else{const n=["Space","Enter"];(["Escape","ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e),{altKey:n,crtlKey:s,metaKey:o}=e;if("Character"!==t||(n||s||o))if(this.isTopLevel){if("self"===this.focusState)if("Space"===t||"Enter"===t)this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click();else if("ArrowRight"===t){u(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusNextChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowLeft"===t){u(e);const t=this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen;this.focusPreviousChild(),t&&(this.currentMenuItem.isSubmenuItem?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.preview()):this.closeChildren())}else if("ArrowDown"===t)this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()})));else if("ArrowUp"===t)this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusLastChild()})));else if("Home"===t)u(e),this.focusFirstChild();else if("End"===t)u(e),this.focusLastChild();else if("Escape"===t){this.elements.submenuToggles.some((e=>e.isOpen))?(u(e),this.closeChildren()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(u(e),this.elements.controller.close(),this.focusController())}}else"Space"===t||"Enter"===t?this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):this.currentMenuItem.dom.link.click():"Escape"===t?(u(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusCurrentChild()):"ArrowRight"===t?this.currentMenuItem.isSubmenuItem?(u(e),this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.toggle.open(),requestAnimationFrame((()=>{this.currentMenuItem.elements.childMenu.focusFirstChild()}))):(u(e),this.elements.rootMenu.closeChildren(),this.elements.rootMenu.focusNextChild(),this.elements.rootMenu.currentMenuItem.isSubmenuItem&&this.elements.rootMenu.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?this.elements.parentMenu.currentMenuItem.isSubmenuItem&&(u(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()))):"ArrowDown"===t?(u(e),this.focusNextChild()):"ArrowUp"===t?(u(e),this.focusPreviousChild()):"Home"===t?(u(e),this.focusFirstChild()):"End"===t&&(u(e),this.focusLastChild());else u(e),this.elements.rootMenu.currentEvent="character",this.focusNextChildWithCharacter(e.key)}))}focusNextChild(){this.currentChild===this.elements.menuItems.length-1?this.focusFirstChild():this.focusChild(this.currentChild+1)}focusPreviousChild(){0===this.currentChild?this.focusLastChild():this.focusChild(this.currentChild-1)}focusNextChildWithCharacter(e){const t=e.toLowerCase();let n=this.currentChild+1,s=!1;for(;!s&&n<this.elements.menuItems.length;){let e="";e=this.elements.menuItems[n].dom.item.innerText?this.elements.menuItems[n].dom.item.innerText:this.elements.menuItems[n].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t&&(s=!0,this.focusChild(n)),n++}}}return a}(); | ||
//# sourceMappingURL=menubar.min.js.map |
@@ -1,30 +0,1 @@ | ||
function _defineProperty(obj, key, value) { | ||
key = _toPropertyKey(key); | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function _toPrimitive(input, hint) { | ||
if (typeof input !== "object" || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || "default"); | ||
if (typeof res !== "object") return res; | ||
throw new TypeError("@@toPrimitive must return a primitive value."); | ||
} | ||
return (hint === "string" ? String : Number)(input); | ||
} | ||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, "string"); | ||
return typeof key === "symbol" ? key : String(key); | ||
} | ||
function isValidInstance(contructor, elements) { | ||
@@ -188,2 +159,23 @@ try { | ||
class BaseMenuToggle { | ||
_dom = { | ||
toggle: null, | ||
parent: null | ||
}; | ||
_elements = { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}; | ||
_open = false; | ||
_expandEvent = new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
_collapseEvent = new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
constructor(_ref) { | ||
@@ -196,23 +188,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
toggle: null, | ||
parent: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}); | ||
_defineProperty(this, "_open", false); | ||
_defineProperty(this, "_expandEvent", new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
_defineProperty(this, "_collapseEvent", new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
this._dom.toggle = menuToggleElement; | ||
@@ -363,2 +334,12 @@ this._dom.parent = parentElement; | ||
class BaseMenuItem { | ||
_dom = { | ||
item: null, | ||
link: null | ||
}; | ||
_elements = { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}; | ||
_submenu = false; | ||
constructor(_ref) { | ||
@@ -373,12 +354,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
item: null, | ||
link: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}); | ||
_defineProperty(this, "_submenu", false); | ||
this._dom.item = menuItemElement; | ||
@@ -441,2 +412,36 @@ this._dom.link = menuLinkElement; | ||
class BaseMenu { | ||
_MenuType = BaseMenu; | ||
_MenuItemType = BaseMenuItem; | ||
_MenuToggleType = BaseMenuToggle; | ||
_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"; | ||
_root = true; | ||
_currentChild = 0; | ||
_focusState = "none"; | ||
_currentEvent = "none"; | ||
_hoverType = "off"; | ||
_hoverDelay = 250; | ||
constructor(_ref) { | ||
@@ -459,36 +464,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_MenuType", BaseMenu); | ||
_defineProperty(this, "_MenuItemType", BaseMenuItem); | ||
_defineProperty(this, "_MenuToggleType", BaseMenuToggle); | ||
_defineProperty(this, "_dom", { | ||
menu: null, | ||
menuItems: [], | ||
submenuItems: [], | ||
submenuToggles: [], | ||
submenus: [], | ||
controller: null, | ||
container: null | ||
}); | ||
_defineProperty(this, "_selectors", { | ||
menuItems: "", | ||
menuLinks: "", | ||
submenuItems: "", | ||
submenuToggles: "", | ||
submenus: "" | ||
}); | ||
_defineProperty(this, "_elements", { | ||
menuItems: [], | ||
submenuToggles: [], | ||
controller: null, | ||
parentMenu: null, | ||
rootMenu: null | ||
}); | ||
_defineProperty(this, "_openClass", "show"); | ||
_defineProperty(this, "_closeClass", "hide"); | ||
_defineProperty(this, "_root", true); | ||
_defineProperty(this, "_currentChild", 0); | ||
_defineProperty(this, "_focusState", "none"); | ||
_defineProperty(this, "_currentEvent", "none"); | ||
_defineProperty(this, "_hoverType", "off"); | ||
_defineProperty(this, "_hoverDelay", 250); | ||
this._dom.menu = menuElement; | ||
@@ -946,4 +917,6 @@ this._dom.controller = controllerElement; | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1092,2 +1065,5 @@ }); | ||
class Treeview extends BaseMenu { | ||
_MenuType = Treeview; | ||
_MenuItemType = TreeviewItem; | ||
_MenuToggleType = TreeviewToggle; | ||
constructor(_ref) { | ||
@@ -1127,5 +1103,2 @@ let { | ||
}); | ||
_defineProperty(this, "_MenuType", Treeview); | ||
_defineProperty(this, "_MenuItemType", TreeviewItem); | ||
_defineProperty(this, "_MenuToggleType", TreeviewToggle); | ||
if (initialize) { | ||
@@ -1132,0 +1105,0 @@ this.initialize(); |
@@ -1,2 +0,2 @@ | ||
function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${n} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],s(n)}}return!0}catch(e){return console.error(e),!1}}function r(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class o{constructor(t){let{menuToggleElement:n,parentElement:s,controlledMenu:l,parentMenu:r=null}=t;e(this,"_dom",{toggle:null,parent:null}),e(this,"_elements",{controlledMenu:null,parentMenu:null}),e(this,"_open",!1),e(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),e(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=n,this._dom.parent=s,this._elements.controlledMenu=l,this._elements.parentMenu=r}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(e,s){if(n("string",{tagName:e})&&t(HTMLElement,s)){const t=e.toLowerCase();let n=!0;for(const e in s)s[e].tagName.toLowerCase()!==t&&(n=!1);return n}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){n("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 i{constructor(t){let{menuItemElement:n,menuLinkElement:s,parentMenu:l,isSubmenuItem:r=!1,childMenu:o=null,toggle:i=null}=t;e(this,"_dom",{item:null,link:null}),e(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),e(this,"_submenu",!1),this._dom.item=n,this._dom.link=s,this._elements.parentMenu=l,this._elements.childMenu=o,this._elements.toggle=i,this._submenu=r}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function u(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function h(e){e.preventDefault(),e.stopPropagation()}class m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:l="a",submenuItemSelector:r="",submenuToggleSelector:u="a",submenuSelector:h="ul",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250}=t;e(this,"_MenuType",m),e(this,"_MenuItemType",i),e(this,"_MenuToggleType",o),e(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),e(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),e(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),e(this,"_openClass","show"),e(this,"_closeClass","hide"),e(this,"_root",!0),e(this,"_currentChild",0),e(this,"_focusState","none"),e(this,"_currentEvent","none"),e(this,"_hoverType","off"),e(this,"_hoverDelay",250),this._dom.menu=n,this._dom.controller=c,this._dom.container=a,this._selectors.menuItems=s,this._selectors.menuLinks=l,this._selectors.submenuItems=r,this._selectors.submenuToggles=u,this._selectors.submenus=h,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=M}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){l({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){l({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}n("number",{value:e}),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))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){r({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){n("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let e=!0;return null!==this._dom.container||null!==this._dom.controller?t(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(e=!1):t(HTMLElement,{menuElement:this._dom.menu})||(e=!1),""!==this._selectors.submenuItems?s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(e=!1):s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(e=!1),""===this._openClass||l({openClass:this._openClass})||(e=!1),""===this._closeClass||l({closeClass:this._closeClass})||(e=!1),n("boolean",{isTopLevel:this._root})||(e=!1),null===this._elements.parentMenu||t(m,{parentMenu:this._elements.parentMenu})||(e=!1),r({hoverType:this._hoverType})||(e=!1),n("number",{hoverDelay:this._hoverDelay})||(e=!1),e}_setDOMElementType(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&t(HTMLElement,{base:n});const l=Array.from(n.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===n));this._dom[e]=s?l:[...this._dom[e],...l]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),l=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),r=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:l,parentMenu:this});this._elements.submenuToggles.push(r),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:l,toggle:r})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){h(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||h(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||(h(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 c extends i{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:o=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:r,toggle:o}),i&&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 a extends o{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:r=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),r&&this.initialize()}}class d extends m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:l="a",submenuItemSelector:r="",submenuToggleSelector:o="a",submenuSelector:i="ul",controllerElement:u=null,containerElement:h=null,openClass:m="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250,initialize:v=!0}=t;super({menuElement:n,menuItemSelector:s,menuLinkSelector:l,submenuItemSelector:r,submenuToggleSelector:o,submenuSelector:i,controllerElement:u,containerElement:h,openClass:m,closeClass:p,isTopLevel:g,parentMenu:f,hoverType:b,hoverDelay:M}),e(this,"_MenuType",d),e(this,"_MenuItemType",c),e(this,"_MenuToggleType",a),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()}catch(e){console.error(e)}}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),"self"===this.focusState){const n=["Enter","ArrowRight"],s=["Escape"];(["Space","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&h(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e),{altKey:n,crtlKey:s,metaKey:l}=e;if("Character"!==t||(n||s||l)){if("self"===this.focusState)if("Enter"===t||"Space"===t)h(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click();else if("Escape"===t)this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController());else if("ArrowDown"===t)h(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.isTopLevel||this.currentChild!==this.elements.menuItems.length-1?this.focusNextChild():this.focusParentsNextChild();else if("ArrowUp"===t){h(e);const t=this.elements.menuItems[this.currentChild-1];t&&t.isSubmenuItem&&t.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentChild=this.currentChild-1,this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.focusChildsLastNode()):this.isTopLevel||0!==this.currentChild?this.focusPreviousChild():(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())}else"ArrowRight"===t?this.currentMenuItem.isSubmenuItem&&(h(e),this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?(h(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.toggle.close()):this.isTopLevel||(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())):"Home"===t?(h(e),this.blurCurrentChild(),this.elements.rootMenu.focusFirstChild()):"End"===t?(h(e),this.blurCurrentChild(),this.elements.rootMenu.focusLastNode()):"Asterisk"===t&&(h(e),this.openChildren())}else h(e),this.elements.rootMenu.currentEvent="character",this.focusNextNodeWithCharacter(e.key)}))}focusLastNode(){const e=this.elements.menuItems.length-1,t=this.elements.menuItems[e];t.isSubmenuItem&&t.elements.toggle.isOpen?(this.currentChild=e,t.elements.childMenu.currentEvent=this.currentEvent,t.elements.childMenu.focusLastNode()):this.focusLastChild()}openChildren(){this.elements.submenuToggles.forEach((e=>e.preview()))}focusNextNodeWithCharacter(e){const t=e.toLowerCase(),n=function e(t){let n=[];return t.elements.menuItems.forEach((t=>{n.push(t),t.isSubmenuItem&&t.elements.toggle.isOpen&&(n=[...n,...e(t.elements.toggle.elements.controlledMenu)])})),n}(this.elements.rootMenu),s=n.indexOf(this.currentMenuItem)+1,l=[...n.slice(s),...n.slice(0,s)];let r=0,o=!1;for(;!o&&r<l.length;){let e="";if(e=l[r].dom.item.innerText?l[r].dom.item.innerText:l[r].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t){o=!0;const e=l[r].elements.parentMenu,t=e.elements.menuItems.indexOf(l[r]);this.elements.rootMenu.blurChildren(),e.focusChild(t)}r++}}focusParentsNextChild(){this.elements.parentMenu&&(this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.currentChild===this.elements.parentMenu.elements.menuItems.length-1?(this.elements.parentMenu.blurCurrentChild(),this.elements.parentMenu.focusParentsNextChild()):(this.blurChildren(),this.elements.parentMenu.focusNextChild()))}focusChildsLastNode(){this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusLastChild(),this.currentMenuItem.elements.childMenu.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.childMenu.currentMenuItem.elements.toggle.isOpen&&(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.childMenu.focusChildsLastNode())}}export{d as default}; | ||
function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class o{_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(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null}=e;this._dom.toggle=t,this._dom.parent=n,this._elements.controlledMenu=s,this._elements.parentMenu=l}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(n,s){if(t("string",{tagName:n})&&e(HTMLElement,s)){const e=n.toLowerCase();let t=!0;for(const n in s)s[n].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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 r{_dom={item:null,link:null};_elements={parentMenu:null,childMenu:null,toggle:null};_submenu=!1;constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:o=null,toggle:r=null}=e;this._dom.item=t,this._dom.link=n,this._elements.parentMenu=s,this._elements.childMenu=o,this._elements.toggle=r,this._submenu=l}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function i(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=r;_MenuToggleType=o;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:o="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=i,this._dom.container=u,this._selectors.menuItems=n,this._selectors.menuLinks=s,this._selectors.submenuItems=l,this._selectors.submenuToggles=o,this._selectors.submenus=r,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){s({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){s({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function n(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,n(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,n(this)):this.focusChild!==e&&(this._currentChild=e,n(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){l({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let o=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(o=!1):e(HTMLElement,{menuElement:this._dom.menu})||(o=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(o=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(o=!1),""===this._openClass||s({openClass:this._openClass})||(o=!1),""===this._closeClass||s({closeClass:this._closeClass})||(o=!1),t("boolean",{isTopLevel:this._root})||(o=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(o=!1),l({hoverType:this._hoverType})||(o=!1),t("number",{hoverDelay:this._hoverDelay})||(o=!1),o}_setDOMElementType(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&e(HTMLElement,{base:n});const l=Array.from(n.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===n));this._dom[t]=s?l:[...this._dom[t],...l]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),l=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),o=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:l,parentMenu:this});this._elements.submenuToggles.push(o),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:l,toggle:o})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){u(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends r{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:o=null,toggle:r=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:o,toggle:r}),i&&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 c extends o{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:o=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),o&&this.initialize()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:o="a",submenuSelector:r="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:l,submenuToggleSelector:o,submenuSelector:r,controllerElement:i,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),g&&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()}catch(e){console.error(e)}}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),"self"===this.focusState){const n=["Enter","ArrowRight"],s=["Escape"];(["Space","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e),{altKey:n,crtlKey:s,metaKey:l}=e;if("Character"!==t||(n||s||l)){if("self"===this.focusState)if("Enter"===t||"Space"===t)u(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click();else if("Escape"===t)this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController());else if("ArrowDown"===t)u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.isTopLevel||this.currentChild!==this.elements.menuItems.length-1?this.focusNextChild():this.focusParentsNextChild();else if("ArrowUp"===t){u(e);const t=this.elements.menuItems[this.currentChild-1];t&&t.isSubmenuItem&&t.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentChild=this.currentChild-1,this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.focusChildsLastNode()):this.isTopLevel||0!==this.currentChild?this.focusPreviousChild():(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())}else"ArrowRight"===t?this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?(u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.toggle.close()):this.isTopLevel||(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())):"Home"===t?(u(e),this.blurCurrentChild(),this.elements.rootMenu.focusFirstChild()):"End"===t?(u(e),this.blurCurrentChild(),this.elements.rootMenu.focusLastNode()):"Asterisk"===t&&(u(e),this.openChildren())}else u(e),this.elements.rootMenu.currentEvent="character",this.focusNextNodeWithCharacter(e.key)}))}focusLastNode(){const e=this.elements.menuItems.length-1,t=this.elements.menuItems[e];t.isSubmenuItem&&t.elements.toggle.isOpen?(this.currentChild=e,t.elements.childMenu.currentEvent=this.currentEvent,t.elements.childMenu.focusLastNode()):this.focusLastChild()}openChildren(){this.elements.submenuToggles.forEach((e=>e.preview()))}focusNextNodeWithCharacter(e){const t=e.toLowerCase(),n=function e(t){let n=[];return t.elements.menuItems.forEach((t=>{n.push(t),t.isSubmenuItem&&t.elements.toggle.isOpen&&(n=[...n,...e(t.elements.toggle.elements.controlledMenu)])})),n}(this.elements.rootMenu),s=n.indexOf(this.currentMenuItem)+1,l=[...n.slice(s),...n.slice(0,s)];let o=0,r=!1;for(;!r&&o<l.length;){let e="";if(e=l[o].dom.item.innerText?l[o].dom.item.innerText:l[o].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t){r=!0;const e=l[o].elements.parentMenu,t=e.elements.menuItems.indexOf(l[o]);this.elements.rootMenu.blurChildren(),e.focusChild(t)}o++}}focusParentsNextChild(){this.elements.parentMenu&&(this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.currentChild===this.elements.parentMenu.elements.menuItems.length-1?(this.elements.parentMenu.blurCurrentChild(),this.elements.parentMenu.focusParentsNextChild()):(this.blurChildren(),this.elements.parentMenu.focusNextChild()))}focusChildsLastNode(){this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusLastChild(),this.currentMenuItem.elements.childMenu.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.childMenu.currentMenuItem.elements.toggle.isOpen&&(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.childMenu.focusChildsLastNode())}}export{a as default}; | ||
//# sourceMappingURL=treeview.esm.min.js.map |
var Treeview = (function () { | ||
'use strict'; | ||
function _defineProperty(obj, key, value) { | ||
key = _toPropertyKey(key); | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function _toPrimitive(input, hint) { | ||
if (typeof input !== "object" || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || "default"); | ||
if (typeof res !== "object") return res; | ||
throw new TypeError("@@toPrimitive must return a primitive value."); | ||
} | ||
return (hint === "string" ? String : Number)(input); | ||
} | ||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, "string"); | ||
return typeof key === "symbol" ? key : String(key); | ||
} | ||
function isValidInstance(contructor, elements) { | ||
@@ -191,2 +162,23 @@ try { | ||
class BaseMenuToggle { | ||
_dom = { | ||
toggle: null, | ||
parent: null | ||
}; | ||
_elements = { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}; | ||
_open = false; | ||
_expandEvent = new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
_collapseEvent = new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
}); | ||
constructor(_ref) { | ||
@@ -199,23 +191,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
toggle: null, | ||
parent: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
controlledMenu: null, | ||
parentMenu: null | ||
}); | ||
_defineProperty(this, "_open", false); | ||
_defineProperty(this, "_expandEvent", new CustomEvent("accessibleMenuExpand", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
_defineProperty(this, "_collapseEvent", new CustomEvent("accessibleMenuCollapse", { | ||
bubbles: true, | ||
detail: { | ||
toggle: this | ||
} | ||
})); | ||
this._dom.toggle = menuToggleElement; | ||
@@ -366,2 +337,12 @@ this._dom.parent = parentElement; | ||
class BaseMenuItem { | ||
_dom = { | ||
item: null, | ||
link: null | ||
}; | ||
_elements = { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}; | ||
_submenu = false; | ||
constructor(_ref) { | ||
@@ -376,12 +357,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_dom", { | ||
item: null, | ||
link: null | ||
}); | ||
_defineProperty(this, "_elements", { | ||
parentMenu: null, | ||
childMenu: null, | ||
toggle: null | ||
}); | ||
_defineProperty(this, "_submenu", false); | ||
this._dom.item = menuItemElement; | ||
@@ -444,2 +415,36 @@ this._dom.link = menuLinkElement; | ||
class BaseMenu { | ||
_MenuType = BaseMenu; | ||
_MenuItemType = BaseMenuItem; | ||
_MenuToggleType = BaseMenuToggle; | ||
_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"; | ||
_root = true; | ||
_currentChild = 0; | ||
_focusState = "none"; | ||
_currentEvent = "none"; | ||
_hoverType = "off"; | ||
_hoverDelay = 250; | ||
constructor(_ref) { | ||
@@ -462,36 +467,2 @@ let { | ||
} = _ref; | ||
_defineProperty(this, "_MenuType", BaseMenu); | ||
_defineProperty(this, "_MenuItemType", BaseMenuItem); | ||
_defineProperty(this, "_MenuToggleType", BaseMenuToggle); | ||
_defineProperty(this, "_dom", { | ||
menu: null, | ||
menuItems: [], | ||
submenuItems: [], | ||
submenuToggles: [], | ||
submenus: [], | ||
controller: null, | ||
container: null | ||
}); | ||
_defineProperty(this, "_selectors", { | ||
menuItems: "", | ||
menuLinks: "", | ||
submenuItems: "", | ||
submenuToggles: "", | ||
submenus: "" | ||
}); | ||
_defineProperty(this, "_elements", { | ||
menuItems: [], | ||
submenuToggles: [], | ||
controller: null, | ||
parentMenu: null, | ||
rootMenu: null | ||
}); | ||
_defineProperty(this, "_openClass", "show"); | ||
_defineProperty(this, "_closeClass", "hide"); | ||
_defineProperty(this, "_root", true); | ||
_defineProperty(this, "_currentChild", 0); | ||
_defineProperty(this, "_focusState", "none"); | ||
_defineProperty(this, "_currentEvent", "none"); | ||
_defineProperty(this, "_hoverType", "off"); | ||
_defineProperty(this, "_hoverDelay", 250); | ||
this._dom.menu = menuElement; | ||
@@ -949,4 +920,6 @@ this._dom.controller = controllerElement; | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1095,2 +1068,5 @@ }); | ||
class Treeview extends BaseMenu { | ||
_MenuType = Treeview; | ||
_MenuItemType = TreeviewItem; | ||
_MenuToggleType = TreeviewToggle; | ||
constructor(_ref) { | ||
@@ -1130,5 +1106,2 @@ let { | ||
}); | ||
_defineProperty(this, "_MenuType", Treeview); | ||
_defineProperty(this, "_MenuItemType", TreeviewItem); | ||
_defineProperty(this, "_MenuToggleType", TreeviewToggle); | ||
if (initialize) { | ||
@@ -1135,0 +1108,0 @@ this.initialize(); |
@@ -1,2 +0,2 @@ | ||
var Treeview=function(){"use strict";function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${n} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],s(n)}}return!0}catch(e){return console.error(e),!1}}function r(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class i{constructor(t){let{menuToggleElement:n,parentElement:s,controlledMenu:l,parentMenu:r=null}=t;e(this,"_dom",{toggle:null,parent:null}),e(this,"_elements",{controlledMenu:null,parentMenu:null}),e(this,"_open",!1),e(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),e(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=n,this._dom.parent=s,this._elements.controlledMenu=l,this._elements.parentMenu=r}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(e,s){if(n("string",{tagName:e})&&t(HTMLElement,s)){const t=e.toLowerCase();let n=!0;for(const e in s)s[e].tagName.toLowerCase()!==t&&(n=!1);return n}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){n("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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{constructor(t){let{menuItemElement:n,menuLinkElement:s,parentMenu:l,isSubmenuItem:r=!1,childMenu:i=null,toggle:o=null}=t;e(this,"_dom",{item:null,link:null}),e(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),e(this,"_submenu",!1),this._dom.item=n,this._dom.link=s,this._elements.parentMenu=l,this._elements.childMenu=i,this._elements.toggle=o,this._submenu=r}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function u(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function h(e){e.preventDefault(),e.stopPropagation()}class m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:l="a",submenuItemSelector:r="",submenuToggleSelector:u="a",submenuSelector:h="ul",controllerElement:c=null,containerElement:a=null,openClass:d="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250}=t;e(this,"_MenuType",m),e(this,"_MenuItemType",o),e(this,"_MenuToggleType",i),e(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),e(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),e(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),e(this,"_openClass","show"),e(this,"_closeClass","hide"),e(this,"_root",!0),e(this,"_currentChild",0),e(this,"_focusState","none"),e(this,"_currentEvent","none"),e(this,"_hoverType","off"),e(this,"_hoverDelay",250),this._dom.menu=n,this._dom.controller=c,this._dom.container=a,this._selectors.menuItems=s,this._selectors.menuLinks=l,this._selectors.submenuItems=r,this._selectors.submenuToggles=u,this._selectors.submenus=h,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=f,this._elements.rootMenu=g?this:null,this._openClass=d||"",this._closeClass=p||"",this._root=g,this._hoverType=b,this._hoverDelay=M}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){l({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){l({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}n("number",{value:e}),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))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`)}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){r({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){n("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let e=!0;return null!==this._dom.container||null!==this._dom.controller?t(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(e=!1):t(HTMLElement,{menuElement:this._dom.menu})||(e=!1),""!==this._selectors.submenuItems?s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(e=!1):s({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(e=!1),""===this._openClass||l({openClass:this._openClass})||(e=!1),""===this._closeClass||l({closeClass:this._closeClass})||(e=!1),n("boolean",{isTopLevel:this._root})||(e=!1),null===this._elements.parentMenu||t(m,{parentMenu:this._elements.parentMenu})||(e=!1),r({hoverType:this._hoverType})||(e=!1),n("number",{hoverDelay:this._hoverDelay})||(e=!1),e}_setDOMElementType(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&t(HTMLElement,{base:n});const l=Array.from(n.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===n));this._dom[e]=s?l:[...this._dom[e],...l]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),l=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),r=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:l,parentMenu:this});this._elements.submenuToggles.push(r),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:l,toggle:r})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){h(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||h(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e);"Space"!==t&&"Enter"!==t||(h(e),this.elements.controller.open(),this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 c extends o{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:i=null,initialize:o=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:r,toggle:i}),o&&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 a extends i{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:r=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),r&&this.initialize()}}class d extends m{constructor(t){let{menuElement:n,menuItemSelector:s="li",menuLinkSelector:l="a",submenuItemSelector:r="",submenuToggleSelector:i="a",submenuSelector:o="ul",controllerElement:u=null,containerElement:h=null,openClass:m="show",closeClass:p="hide",isTopLevel:g=!0,parentMenu:f=null,hoverType:b="off",hoverDelay:M=250,initialize:v=!0}=t;super({menuElement:n,menuItemSelector:s,menuLinkSelector:l,submenuItemSelector:r,submenuToggleSelector:i,submenuSelector:o,controllerElement:u,containerElement:h,openClass:m,closeClass:p,isTopLevel:g,parentMenu:f,hoverType:b,hoverDelay:M}),e(this,"_MenuType",d),e(this,"_MenuItemType",c),e(this,"_MenuToggleType",a),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()}catch(e){console.error(e)}}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=u(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),"self"===this.focusState){const n=["Enter","ArrowRight"],s=["Escape"];(["Space","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&h(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=u(e),{altKey:n,crtlKey:s,metaKey:l}=e;if("Character"!==t||(n||s||l)){if("self"===this.focusState)if("Enter"===t||"Space"===t)h(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click();else if("Escape"===t)this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController());else if("ArrowDown"===t)h(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.isTopLevel||this.currentChild!==this.elements.menuItems.length-1?this.focusNextChild():this.focusParentsNextChild();else if("ArrowUp"===t){h(e);const t=this.elements.menuItems[this.currentChild-1];t&&t.isSubmenuItem&&t.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentChild=this.currentChild-1,this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.focusChildsLastNode()):this.isTopLevel||0!==this.currentChild?this.focusPreviousChild():(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())}else"ArrowRight"===t?this.currentMenuItem.isSubmenuItem&&(h(e),this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?(h(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.toggle.close()):this.isTopLevel||(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())):"Home"===t?(h(e),this.blurCurrentChild(),this.elements.rootMenu.focusFirstChild()):"End"===t?(h(e),this.blurCurrentChild(),this.elements.rootMenu.focusLastNode()):"Asterisk"===t&&(h(e),this.openChildren())}else h(e),this.elements.rootMenu.currentEvent="character",this.focusNextNodeWithCharacter(e.key)}))}focusLastNode(){const e=this.elements.menuItems.length-1,t=this.elements.menuItems[e];t.isSubmenuItem&&t.elements.toggle.isOpen?(this.currentChild=e,t.elements.childMenu.currentEvent=this.currentEvent,t.elements.childMenu.focusLastNode()):this.focusLastChild()}openChildren(){this.elements.submenuToggles.forEach((e=>e.preview()))}focusNextNodeWithCharacter(e){const t=e.toLowerCase(),n=function e(t){let n=[];return t.elements.menuItems.forEach((t=>{n.push(t),t.isSubmenuItem&&t.elements.toggle.isOpen&&(n=[...n,...e(t.elements.toggle.elements.controlledMenu)])})),n}(this.elements.rootMenu),s=n.indexOf(this.currentMenuItem)+1,l=[...n.slice(s),...n.slice(0,s)];let r=0,i=!1;for(;!i&&r<l.length;){let e="";if(e=l[r].dom.item.innerText?l[r].dom.item.innerText:l[r].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t){i=!0;const e=l[r].elements.parentMenu,t=e.elements.menuItems.indexOf(l[r]);this.elements.rootMenu.blurChildren(),e.focusChild(t)}r++}}focusParentsNextChild(){this.elements.parentMenu&&(this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.currentChild===this.elements.parentMenu.elements.menuItems.length-1?(this.elements.parentMenu.blurCurrentChild(),this.elements.parentMenu.focusParentsNextChild()):(this.blurChildren(),this.elements.parentMenu.focusNextChild()))}focusChildsLastNode(){this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusLastChild(),this.currentMenuItem.elements.childMenu.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.childMenu.currentMenuItem.elements.toggle.isOpen&&(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.childMenu.focusChildsLastNode())}}return d}(); | ||
var Treeview=function(){"use strict";function e(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Elements given to isValidInstance() must be inside of an object. ${typeof t} given.`)}for(const n in t)if(!(t[n]instanceof e)){const s=typeof t[n];throw new TypeError(`AccessibleMenu: ${n} must be an instance of ${e.name}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function t(e,t){try{if("object"!=typeof t){throw new TypeError(`AccessibleMenu: Values given to isValidType() must be inside of an object. ${typeof t} given.`)}for(const n in t){const s=typeof t[n];if(s!==e)throw new TypeError(`AccessibleMenu: ${n} must be a ${e}. ${s} given.`)}return!0}catch(e){return console.error(e),!1}}function n(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isCSSSelector() must be inside of an object. ${typeof e} given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch(n){throw new TypeError(`AccessibleMenu: ${t} must be a valid CSS selector. "${e[t]}" given.`)}return!0}catch(e){return console.error(e),!1}}function s(e){try{if("object"!=typeof e||Array.isArray(e)){throw new TypeError(`AccessibleMenu: Values given to isValidClassList() must be inside of an object. ${typeof e} given.`)}for(const t in e){const s=typeof e[t];if("string"!==s){if(!Array.isArray(e[t]))throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. ${s} given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`AccessibleMenu: ${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const s={};s[t]=e[t],n(s)}}return!0}catch(e){return console.error(e),!1}}function l(e){try{if("object"!=typeof e){throw new TypeError(`AccessibleMenu: Values given to isValidHoverType() must be inside of an object. ${typeof e} given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}class r{_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(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null}=e;this._dom.toggle=t,this._dom.parent=n,this._elements.controlledMenu=s,this._elements.parentMenu=l}initialize(){if(this.dom.toggle.setAttribute("aria-haspopup","true"),this.dom.toggle.setAttribute("aria-expanded","false"),function(n,s){if(t("string",{tagName:n})&&e(HTMLElement,s)){const e=n.toLowerCase();let t=!0;for(const n in s)s[n].tagName.toLowerCase()!==e&&(t=!1);return t}return!1}("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const e=Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,10);let t=this.dom.toggle.innerText.replace(/[^a-zA-Z0-9\s]/g,""),n=e;!t.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(t=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),t.replace(/\s/g,"").length>0&&(t=t.toLowerCase().replace(/\s+/g,"-"),t.startsWith("-")&&(t=t.substring(1)),t.endsWith("-")&&(t=t.slice(0,-1)),n=`${t}-${n}`),this.dom.toggle.id=this.dom.toggle.id||`${n}-menu-button`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`${n}-menu`}this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){t("boolean",{value:e}),this._open=e}_expand(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.add(n):this.elements.controlledMenu.dom.menu.classList.add(...n)),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.remove(t):this.elements.controlledMenu.dom.menu.classList.remove(...t)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const{closeClass:t,openClass:n}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==t&&("string"==typeof t?this.elements.controlledMenu.dom.menu.classList.add(t):this.elements.controlledMenu.dom.menu.classList.add(...t)),""!==n&&("string"==typeof n?this.elements.controlledMenu.dom.menu.classList.remove(n):this.elements.controlledMenu.dom.menu.classList.remove(...n)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this._expand(),this.isOpen=!0}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._expand(),this.isOpen=!0}close(){this.isOpen&&(this.elements.controlledMenu.currentChild=0,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(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:o=null}=e;this._dom.item=t,this._dom.link=n,this._elements.parentMenu=s,this._elements.childMenu=r,this._elements.toggle=o,this._submenu=l}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&this.dom.link.focus()}blur(){this.elements.parentMenu.shouldFocus&&this.dom.link.blur()}}function i(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch(e){return""}}function u(e){e.preventDefault(),e.stopPropagation()}class h{_MenuType=h;_MenuItemType=o;_MenuToggleType=r;_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";_root=!0;_currentChild=0;_focusState="none";_currentEvent="none";_hoverType="off";_hoverDelay=250;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:r="a",submenuSelector:o="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250}=e;this._dom.menu=t,this._dom.controller=i,this._dom.container=u,this._selectors.menuItems=n,this._selectors.menuLinks=s,this._selectors.submenuItems=l,this._selectors.submenuToggles=r,this._selectors.submenus=o,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=a,this._elements.rootMenu=c?this:null,this._openClass=h||"",this._closeClass=m||"",this._root=c,this._hoverType=d,this._hoverDelay=p}initialize(){if(!this._validate())throw new Error("AccesibleMenu: cannot initialize menu. See other error messages for more information.");if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});this._elements.controller=e}this._createChildElements()}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get shouldFocus(){let e=!1;return"keyboard"!==this.currentEvent&&"character"!==this.currentEvent||(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}set openClass(e){s({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){s({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set currentChild(e){function n(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t<e.elements.parentMenu.elements.menuItems.length;){const s=e.elements.parentMenu.elements.menuItems[t];s.isSubmenuItem&&s.elements.toggle.elements.controlledMenu===e&&(n=!0,e.elements.parentMenu.currentEvent=e.currentEvent,e.elements.parentMenu.currentChild=t),t++}}}t("number",{value:e}),e<-1?(this._currentChild=-1,n(this)):e>=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,n(this)):this.focusChild!==e&&(this._currentChild=e,n(this))}set focusState(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidState() must be inside of an object. ${typeof e} given.`);const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),!this.elements.parentMenu||"self"!==e&&"child"!==e||(this.elements.parentMenu.focusState="child")}set currentEvent(e){!function(e){try{if("object"!=typeof e)throw new TypeError(`AccessibleMenu: Values given to isValidEvent() must be inside of an object. ${typeof e} given.`);const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`AccessibleMenu: ${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return!0}catch(e){return console.error(e),!1}}({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){l({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){t("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}_validate(){let r=!0;return null!==this._dom.container||null!==this._dom.controller?e(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container})||(r=!1):e(HTMLElement,{menuElement:this._dom.menu})||(r=!1),""!==this._selectors.submenuItems?n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus})||(r=!1):n({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks})||(r=!1),""===this._openClass||s({openClass:this._openClass})||(r=!1),""===this._closeClass||s({closeClass:this._closeClass})||(r=!1),t("boolean",{isTopLevel:this._root})||(r=!1),null===this._elements.parentMenu||e(h,{parentMenu:this._elements.parentMenu})||(r=!1),l({hoverType:this._hoverType})||(r=!1),t("number",{hoverDelay:this._hoverDelay})||(r=!1),r}_setDOMElementType(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dom.menu,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if("string"!=typeof this.selectors[t])throw new Error(`AccessibleMenu: "${t}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[t]))throw new Error(`AccessibleMenu: The "${t}" element cannot be set through _setDOMElementType.`);n!==this.dom.menu&&e(HTMLElement,{base:n});const l=Array.from(n.querySelectorAll(this.selectors[t])).filter((e=>e.parentElement===n));this._dom[t]=s?l:[...this._dom[t],...l]}}_resetDOMElementType(e){if(void 0===this.dom[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_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)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),s=e.querySelector(this.selectors.submenus),l=new this._MenuType({menuElement:s,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,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay}),r=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:l,parentMenu:this});this._elements.submenuToggles.push(r),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:l,toggle:r})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))}))}_handleClick(){function e(e,t,n){u(n),t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none")}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{if("pen"!==n.pointerType&&"touch"!==n.pointerType)if("on"===this.hoverType)this.currentEvent="mouse",this.currentChild=t,e.isSubmenuItem&&e.elements.toggle.preview();else if("dynamic"===this.hoverType){const n=this.elements.submenuToggles.some((e=>e.isOpen));this.currentChild=t,this.isTopLevel&&"none"===this.focusState||(this.currentEvent="mouse",this.focusCurrentChild()),!e.isSubmenuItem||this.isTopLevel&&!n||(this.currentEvent="mouse",e.elements.toggle.preview())}})),e.isSubmenuItem&&e.dom.item.addEventListener("pointerleave",(t=>{"pen"!==t.pointerType&&"touch"!==t.pointerType&&("on"===this.hoverType?this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.isTopLevel||(this.hoverDelay>0?setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()}),this.hoverDelay):(this.currentEvent="mouse",e.elements.toggle.close(),this.focusCurrentChild()))))}))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||u(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e);"Space"!==t&&"Enter"!==t||(u(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&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",-1!==this.currentChild&&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 m extends o{constructor(e){let{menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l=!1,childMenu:r=null,toggle:o=null,initialize:i=!0}=e;super({menuItemElement:t,menuLinkElement:n,parentMenu:s,isSubmenuItem:l,childMenu:r,toggle:o}),i&&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 c extends r{constructor(e){let{menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l=null,initialize:r=!0}=e;super({menuToggleElement:t,parentElement:n,controlledMenu:s,parentMenu:l}),r&&this.initialize()}}class a extends h{_MenuType=a;_MenuItemType=m;_MenuToggleType=c;constructor(e){let{menuElement:t,menuItemSelector:n="li",menuLinkSelector:s="a",submenuItemSelector:l="",submenuToggleSelector:r="a",submenuSelector:o="ul",controllerElement:i=null,containerElement:u=null,openClass:h="show",closeClass:m="hide",isTopLevel:c=!0,parentMenu:a=null,hoverType:d="off",hoverDelay:p=250,initialize:g=!0}=e;super({menuElement:t,menuItemSelector:n,menuLinkSelector:s,submenuItemSelector:l,submenuToggleSelector:r,submenuSelector:o,controllerElement:i,containerElement:u,openClass:h,closeClass:m,isTopLevel:c,parentMenu:a,hoverType:d,hoverDelay:p}),g&&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()}catch(e){console.error(e)}}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=i(e);if("Tab"===t&&("none"!==this.elements.rootMenu.focusState?this.elements.rootMenu.blur():this.elements.rootMenu.focus()),"self"===this.focusState){const n=["Enter","ArrowRight"],s=["Escape"];(["Space","ArrowUp","ArrowDown","ArrowLeft","Asterisk","Home","End"].includes(t)||this.currentMenuItem.isSubmenuItem&&n.includes(t)||this.elements.controller&&s.includes(t))&&u(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=i(e),{altKey:n,crtlKey:s,metaKey:l}=e;if("Character"!==t||(n||s||l)){if("self"===this.focusState)if("Enter"===t||"Space"===t)u(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click();else if("Escape"===t)this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController());else if("ArrowDown"===t)u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.isTopLevel||this.currentChild!==this.elements.menuItems.length-1?this.focusNextChild():this.focusParentsNextChild();else if("ArrowUp"===t){u(e);const t=this.elements.menuItems[this.currentChild-1];t&&t.isSubmenuItem&&t.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentChild=this.currentChild-1,this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.focusChildsLastNode()):this.isTopLevel||0!==this.currentChild?this.focusPreviousChild():(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())}else"ArrowRight"===t?this.currentMenuItem.isSubmenuItem&&(u(e),this.currentMenuItem.elements.toggle.isOpen?(this.blurCurrentChild(),this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusFirstChild()):this.currentMenuItem.elements.toggle.preview()):"ArrowLeft"===t?(u(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.toggle.close()):this.isTopLevel||(this.blurCurrentChild(),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.focusCurrentChild())):"Home"===t?(u(e),this.blurCurrentChild(),this.elements.rootMenu.focusFirstChild()):"End"===t?(u(e),this.blurCurrentChild(),this.elements.rootMenu.focusLastNode()):"Asterisk"===t&&(u(e),this.openChildren())}else u(e),this.elements.rootMenu.currentEvent="character",this.focusNextNodeWithCharacter(e.key)}))}focusLastNode(){const e=this.elements.menuItems.length-1,t=this.elements.menuItems[e];t.isSubmenuItem&&t.elements.toggle.isOpen?(this.currentChild=e,t.elements.childMenu.currentEvent=this.currentEvent,t.elements.childMenu.focusLastNode()):this.focusLastChild()}openChildren(){this.elements.submenuToggles.forEach((e=>e.preview()))}focusNextNodeWithCharacter(e){const t=e.toLowerCase(),n=function e(t){let n=[];return t.elements.menuItems.forEach((t=>{n.push(t),t.isSubmenuItem&&t.elements.toggle.isOpen&&(n=[...n,...e(t.elements.toggle.elements.controlledMenu)])})),n}(this.elements.rootMenu),s=n.indexOf(this.currentMenuItem)+1,l=[...n.slice(s),...n.slice(0,s)];let r=0,o=!1;for(;!o&&r<l.length;){let e="";if(e=l[r].dom.item.innerText?l[r].dom.item.innerText:l[r].dom.item.textContent,e=e.replace(/[\s]/g,"").toLowerCase().charAt(0),e===t){o=!0;const e=l[r].elements.parentMenu,t=e.elements.menuItems.indexOf(l[r]);this.elements.rootMenu.blurChildren(),e.focusChild(t)}r++}}focusParentsNextChild(){this.elements.parentMenu&&(this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.currentChild===this.elements.parentMenu.elements.menuItems.length-1?(this.elements.parentMenu.blurCurrentChild(),this.elements.parentMenu.focusParentsNextChild()):(this.blurChildren(),this.elements.parentMenu.focusNextChild()))}focusChildsLastNode(){this.currentMenuItem.elements.childMenu.currentEvent=this.currentEvent,this.currentMenuItem.elements.childMenu.focusLastChild(),this.currentMenuItem.elements.childMenu.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.childMenu.currentMenuItem.elements.toggle.isOpen&&(this.currentMenuItem.elements.childMenu.blurCurrentChild(),this.currentMenuItem.elements.childMenu.focusChildsLastNode())}}return a}(); | ||
//# sourceMappingURL=treeview.min.js.map |
{ | ||
"name": "accessible-menu", | ||
"version": "3.0.5", | ||
"version": "3.0.6", | ||
"description": "A JavaScript library to help you generate WCAG accessible menus in the DOM.", | ||
@@ -62,3 +62,3 @@ "main": "index.js", | ||
"eslint-plugin-import": "^2.22.1", | ||
"eslint-plugin-jsdoc": "^39.1.0", | ||
"eslint-plugin-jsdoc": "^46.2.6", | ||
"eslint-plugin-node": "^11.1.0", | ||
@@ -69,3 +69,3 @@ "eslint-plugin-promise": "^5.1.0", | ||
"jest-environment-jsdom": "^29.0.0", | ||
"jest-extended": "^3.0.0", | ||
"jest-extended": "^4.0.0", | ||
"jsdoc": "^4.0.0", | ||
@@ -72,0 +72,0 @@ "jsdoc-typeof-plugin": "^1.0.0", |
@@ -46,3 +46,3 @@ # accessible-menu | ||
```html | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.5/dist/accessible-menu.min.js"></script> | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.6/dist/accessible-menu.min.js"></script> | ||
``` | ||
@@ -81,3 +81,3 @@ | ||
```html | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.5/dist/accessible-menu.min.js"></script> | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.6/dist/accessible-menu.min.js"></script> | ||
``` | ||
@@ -111,3 +111,3 @@ | ||
```html | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.5/dist/disclosure-menu.min.js"></script> | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.6/dist/disclosure-menu.min.js"></script> | ||
``` | ||
@@ -133,3 +133,3 @@ | ||
```html | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.5/dist/menubar.min.js"></script> | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.6/dist/menubar.min.js"></script> | ||
``` | ||
@@ -155,3 +155,3 @@ | ||
```html | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.5/dist/treeview.min.js"></script> | ||
<script src="https://cdn.jsdelivr.net/npm/accessible-menu@3.0.6/dist/treeview.min.js"></script> | ||
``` | ||
@@ -158,0 +158,0 @@ |
@@ -0,1 +1,4 @@ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global DisclosureMenu, Menubar, Treeview */ | ||
import BaseMenuToggle from "./_baseMenuToggle.js"; | ||
@@ -194,13 +197,13 @@ import BaseMenuItem from "./_baseMenuItem.js"; | ||
* @param {HTMLElement} options.menuElement - The menu element in the DOM. | ||
* @param {string} [options.menuItemSelector = li] - The CSS selector string for menu items. | ||
* @param {string} [options.menuLinkSelector = a] - The CSS selector string for menu links. | ||
* @param {string} [options.menuItemSelector] - The CSS selector string for menu items. | ||
* @param {string} [options.menuLinkSelector] - The CSS selector string for menu links. | ||
* @param {string} [options.submenuItemSelector] - The CSS selector string for menu items containing submenus. | ||
* @param {string} [options.submenuToggleSelector = a] - The CSS selector string for submenu toggle buttons/links. | ||
* @param {string} [options.submenuSelector = ul] - The CSS selector string for submenus. | ||
* @param {?HTMLElement} [options.controllerElement = null] - The element controlling the menu in the DOM. | ||
* @param {?HTMLElement} [options.containerElement = null] - The element containing the menu in the DOM. | ||
* @param {?(string|string[])} [options.openClass = show] - The class to apply when a menu is "open". | ||
* @param {?(string|string[])} [options.closeClass = hide] - The class to apply when a menu is "closed". | ||
* @param {boolean} [options.isTopLevel = false] - A flag to mark the root menu. | ||
* @param {?BaseMenu} [options.parentMenu = null] - The parent menu to this menu. | ||
* @param {string} [options.submenuToggleSelector] - The CSS selector string for submenu toggle buttons/links. | ||
* @param {string} [options.submenuSelector] - The CSS selector string for submenus. | ||
* @param {?HTMLElement} [options.controllerElement] - The element controlling the menu in the DOM. | ||
* @param {?HTMLElement} [options.containerElement] - The element containing the menu in the DOM. | ||
* @param {?(string|string[])} [options.openClass] - The class to apply when a menu is "open". | ||
* @param {?(string|string[])} [options.closeClass] - The class to apply when a menu is "closed". | ||
* @param {boolean} [options.isTopLevel] - A flag to mark the root menu. | ||
* @param {?BaseMenu} [options.parentMenu] - The parent menu to this menu. | ||
* @param {string} [options.hoverType = off] - The type of hoverability a menu has. | ||
@@ -471,3 +474,3 @@ * @param {number} [options.hoverDelay = 250] - The delay for closing menus if the menu is hoverable (in miliseconds). | ||
* - The menu's current event is "mouse" _and_ the menu's | ||
* {@link BaseMenu_hoverTypeType|hover type} is "dynamic". | ||
* {@link BaseMenu#_hoverType|hover type} is "dynamic". | ||
* | ||
@@ -702,4 +705,4 @@ * @type {boolean} | ||
* @param {string} elementType - The type of element to populate. | ||
* @param {HTMLElement} [base = this.dom.menu] - The element used as the base for the querySelect. | ||
* @param {boolean} [overwrite = true] - A flag to set if the existing elements will be overwritten. | ||
* @param {HTMLElement} [base] - The element used as the base for the querySelect. | ||
* @param {boolean} [overwrite] - A flag to set if the existing elements will be overwritten. | ||
*/ | ||
@@ -965,3 +968,3 @@ _setDOMElementType(elementType, base = this.dom.menu, overwrite = true) { | ||
* to all submenu items which function differently depending on | ||
* the menu's {@link BaseMenu_hoverTypeType|hover type}. | ||
* the menu's {@link BaseMenu#_hoverType|hover type}. | ||
* | ||
@@ -980,3 +983,3 @@ * Before executing anything, the event is checked to make sure the event wasn't | ||
* {@link BaseMenuToggle#close|close method} for the submenu item's toggle | ||
* will be called after a delay set by the menu's {@link BaseMenu_hoverTypeDelay|hover delay}. | ||
* will be called after a delay set by the menu's {@link BaseMenu#_hoverDelay|hover delay}. | ||
* | ||
@@ -1106,3 +1109,3 @@ * <strong>Hover Type "dynamic"</strong> | ||
* - Adds a `keyup` listener to the menu's controller (if the menu is the root menu). | ||
* - Opens the menu when the user hits "Space" or "Enter". | ||
* - Toggles the menu when the user hits "Space" or "Enter". | ||
* | ||
@@ -1120,4 +1123,8 @@ * @protected | ||
preventEvent(event); | ||
this.elements.controller.open(); | ||
this.focusFirstChild(); | ||
this.elements.controller.toggle(); | ||
// If the menu is open, focus the first child. | ||
if (this.elements.controller.isOpen) { | ||
this.focusFirstChild(); | ||
} | ||
} | ||
@@ -1124,0 +1131,0 @@ }); |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global BaseMenu BaseMenuToggle */ | ||
@@ -3,0 +4,0 @@ /** |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global BaseMenu */ | ||
@@ -3,0 +4,0 @@ import { isTag, isValidType } from "./validate.js"; |
@@ -55,3 +55,3 @@ import BaseMenu from "./_baseMenu.js"; | ||
/** | ||
* The index of the currently selected {@link BaseMenuItem|menu item} in the menu. | ||
* The index of the currently selected {@link DisclosureMenuItem|menu item} in the menu. | ||
* | ||
@@ -58,0 +58,0 @@ * @protected |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global DisclosureMenu, DisclosureMenuToggle */ | ||
@@ -3,0 +4,0 @@ import BaseMenuItem from "./_baseMenuItem.js"; |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global DisclosureMenu */ | ||
@@ -3,0 +4,0 @@ import BaseMenuToggle from "./_baseMenuToggle.js"; |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global Menubar, MenubarToggle */ | ||
@@ -3,0 +4,0 @@ import BaseMenuItem from "./_baseMenuItem.js"; |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global Menubar */ | ||
@@ -3,0 +4,0 @@ import BaseMenuToggle from "./_baseMenuToggle.js"; |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global Treeview, TreeviewToggle */ | ||
@@ -64,3 +65,3 @@ import BaseMenuItem from "./_baseMenuItem.js"; | ||
* Focuses the menu item's link if the parent menu's | ||
* {@link Menubar#shouldFocus|shouldFocus} value is `true`. | ||
* {@link Treeview#shouldFocus|shouldFocus} value is `true`. | ||
* | ||
@@ -78,3 +79,3 @@ * This will call the {@link BaseMenuItem#focus|BaseMenuItem's focus method} | ||
* Blurs the menu item's link if the parent menu's | ||
* {@link Menubar#shouldFocus|shouldFocus} value is `true`. | ||
* {@link Treeview#shouldFocus|shouldFocus} value is `true`. | ||
* | ||
@@ -81,0 +82,0 @@ * This will call the {@link BaseMenuItem#blur|BaseMenuItem's blur method} |
@@ -1,2 +0,3 @@ | ||
/* eslint-disable jsdoc/no-undefined-types */ | ||
// eslint-disable-next-line no-unused-vars | ||
/* global Treeview */ | ||
@@ -3,0 +4,0 @@ import BaseMenuToggle from "./_baseMenuToggle.js"; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
2534429
14201