{"version":3,"names":["Default","parentTrigger","subMenu","toggle","triggerElement","ClassName","ACTIVE","COLLAPSE","COLLAPSED","COLLAPSING","METIS","SHOW","MetisMenu","constructor","element","options","this","isElement","document","querySelector","config","Object","assign","disposed","triggerArr","boundEventHandler","clickEvent","bind","init","static","el","opt","classList","add","uls","querySelectorAll","length","forEach","ul","li","closest","contains","show","hide","a","getAttribute","setAttribute","addEventListener","push","evt","target","currentTarget","tagName","preventDefault","update","dispose","arr","removeEventListener","on","evtType","handler","off","emit","evtData","shouldBubble","CustomEvent","bubbles","detail","dispatchEvent","isTransitioning","complete","remove","style","height","setTransitioning","shownElement","eleParentSiblins","slice","call","_a","parentNode","children","filter","c","sibli","sibUl","scrollHeight","showElement","hideElement","hiddenElement","getBoundingClientRect","offsetHeight","Boolean"],"sources":["../src/constant.ts","../src/metismenujs.ts"],"sourcesContent":["import { IMMOptions } from './interface.js';\n\nexport type MetisMenuEvents =\n | 'show.metisMenu'\n | 'shown.metisMenu'\n | 'hide.metisMenu'\n | 'hidden.metisMenu';\n\nexport const Default: IMMOptions = {\n parentTrigger: 'li',\n subMenu: 'ul',\n toggle: true,\n triggerElement: 'a',\n};\n\nexport const ClassName = {\n ACTIVE: 'mm-active',\n COLLAPSE: 'mm-collapse',\n COLLAPSED: 'mm-collapsed',\n COLLAPSING: 'mm-collapsing',\n METIS: 'metismenu',\n SHOW: 'mm-show',\n};\n","/* eslint-disable max-len */\nimport { ClassName, Default, MetisMenuEvents } from \"./constant.js\";\nimport { IMMOptions } from \"./interface.js\";\nimport {\n CustomEventListener,\n EventType,\n SpecificEventListener,\n} from \"./types.js\";\n\nclass MetisMenu {\n protected config: IMMOptions;\n\n protected element: Element;\n\n protected isTransitioning!: boolean;\n\n protected disposed: boolean;\n\n protected triggerArr: Array;\n\n boundEventHandler: (evt?: Event) => void;\n\n /**\n * Creates an instance of MetisMenu.\n *\n * @constructor\n * @param {Element | string} element\n * @param {IMMOptions} [options]\n * @memberof MetisMenu\n */\n\n constructor(element: Element | string, options?: IMMOptions) {\n this.element = MetisMenu.isElement(element) ? element : document.querySelector(element)!;\n this.config = { ...Default, ...options };\n this.disposed = false;\n this.triggerArr = [];\n this.boundEventHandler = this.clickEvent.bind(this);\n this.init();\n }\n\n static attach(el: Element, opt?: IMMOptions) {\n return new MetisMenu(el, opt);\n }\n\n /**\n * @internal\n */\n private init(): void {\n const { METIS, ACTIVE, COLLAPSE } = ClassName;\n this.element.classList.add(METIS);\n\n const uls = [...this.element.querySelectorAll(this.config.subMenu!)];\n\n if (uls.length === 0) {\n return;\n }\n\n uls.forEach((ul: Element) => {\n ul.classList.add(COLLAPSE!);\n const li = ul.closest(this.config.parentTrigger!);\n\n if (li?.classList.contains(ACTIVE!)) {\n this.show(ul as HTMLElement);\n } else {\n this.hide(ul);\n }\n\n const a = li?.querySelector(this.config.triggerElement!);\n if (a?.getAttribute(\"aria-disabled\") === \"true\") {\n return;\n }\n\n a?.setAttribute(\"aria-expanded\", \"false\");\n\n a?.addEventListener(\"click\", this.boundEventHandler);\n this.triggerArr.push(a!);\n });\n }\n /**\n * @internal\n */\n\n private clickEvent(evt?: Event) {\n if (!this.disposed) {\n const target = evt?.currentTarget as Element | null;\n if (target && target.tagName === \"A\") {\n evt!.preventDefault();\n }\n\n const li = target!.closest(this.config.parentTrigger!);\n const ul = li?.querySelector(this.config.subMenu!);\n this.toggle(ul!);\n }\n }\n\n update() {\n this.disposed = false;\n this.init();\n }\n\n dispose() {\n this.triggerArr.forEach((arr) => {\n arr.removeEventListener(\"click\", this.boundEventHandler);\n });\n this.disposed = true;\n }\n\n on(\n evtType: K,\n handler: SpecificEventListener,\n options?: AddEventListenerOptions | boolean,\n ): MetisMenu;\n\n on(\n evtType: E,\n handler: CustomEventListener,\n options?: AddEventListenerOptions | boolean,\n ): MetisMenu;\n\n on(\n evtType: MetisMenuEvents,\n handler: EventListener,\n options?: AddEventListenerOptions | boolean,\n ) {\n this.element.addEventListener(evtType, handler, options);\n return this;\n }\n\n off(\n evtType: K,\n handler: SpecificEventListener,\n options?: AddEventListenerOptions | boolean,\n ): MetisMenu;\n\n off(\n evtType: E,\n handler: CustomEventListener,\n options?: AddEventListenerOptions | boolean,\n ): MetisMenu;\n\n off(\n evtType: MetisMenuEvents,\n handler: EventListener,\n options?: AddEventListenerOptions | boolean,\n ): MetisMenu {\n this.element.removeEventListener(evtType, handler, options);\n return this;\n }\n\n /**\n * @internal\n */\n emit(\n evtType: string,\n evtData: T,\n shouldBubble = false,\n ): void {\n const evt = new CustomEvent(evtType, {\n bubbles: shouldBubble,\n detail: evtData,\n });\n this.element.dispatchEvent(evt);\n }\n\n /**\n * @internal\n */\n toggle(ul: Element) {\n const li = ul.closest(this.config.parentTrigger!);\n if (li?.classList.contains(ClassName.ACTIVE)) {\n this.hide(ul);\n } else {\n this.show(ul);\n }\n }\n\n /**\n * @internal\n */\n show(el: Element) {\n const ul = el as HTMLElement;\n const { ACTIVE, COLLAPSE, COLLAPSED, COLLAPSING, SHOW } = ClassName;\n\n if (this.isTransitioning || ul.classList.contains(COLLAPSING!)) {\n return;\n }\n const complete = () => {\n ul.classList.remove(COLLAPSING!);\n ul.style.height = \"\";\n ul.removeEventListener(\"transitionend\", complete);\n this.setTransitioning(false);\n this.emit(\"shown.metisMenu\", {\n shownElement: ul,\n });\n };\n\n const li = ul.closest(this.config.parentTrigger!);\n li?.classList.add(ACTIVE!);\n\n const a = li?.querySelector(this.config.triggerElement!);\n a?.setAttribute(\"aria-expanded\", \"true\");\n a?.classList.remove(COLLAPSED!);\n\n ul.style.height = \"0px\";\n ul.classList.remove(COLLAPSE!);\n ul.classList.remove(SHOW!);\n ul.classList.add(COLLAPSING!);\n const eleParentSiblins = [].slice.call(li?.parentNode?.children).filter((\n c,\n ) => c !== li);\n if (this.config.toggle && eleParentSiblins.length > 0) {\n eleParentSiblins.forEach((sibli: Element) => {\n const sibUl = sibli.querySelector(this.config.subMenu!);\n if (sibUl) {\n this.hide(sibUl);\n }\n });\n }\n\n this.setTransitioning(true);\n\n ul.classList.add(COLLAPSE!);\n ul.classList.add(SHOW!);\n ul.style.height = `${ul.scrollHeight}px`;\n this.emit(\"show.metisMenu\", {\n showElement: ul,\n });\n ul.addEventListener(\"transitionend\", complete);\n }\n\n /**\n * @internal\n */\n hide(el: Element) {\n const { ACTIVE, COLLAPSE, COLLAPSED, COLLAPSING, SHOW } = ClassName;\n const ul = el as HTMLElement;\n if (this.isTransitioning || !ul.classList.contains(SHOW!)) {\n return;\n }\n this.emit(\"hide.metisMenu\", {\n hideElement: ul,\n });\n\n const li = ul.closest(this.config.parentTrigger!);\n li?.classList.remove(ACTIVE!);\n\n const complete = () => {\n ul.classList.remove(COLLAPSING!);\n ul.classList.add(COLLAPSE!);\n ul.style.height = \"\";\n ul.removeEventListener(\"transitionend\", complete);\n this.setTransitioning(false);\n this.emit(\"hidden.metisMenu\", {\n hiddenElement: ul,\n });\n };\n\n ul.style.height = `${ul.getBoundingClientRect().height}px`;\n ul.style.height = `${ul.offsetHeight}px`;\n\n ul.classList.add(COLLAPSING!);\n ul.classList.remove(COLLAPSE!);\n ul.classList.remove(SHOW!);\n this.setTransitioning(true);\n\n ul.addEventListener(\"transitionend\", complete);\n\n ul.style.height = \"0px\";\n\n const a = li?.querySelector(this.config.triggerElement!);\n a?.setAttribute(\"aria-expanded\", \"false\");\n a?.classList.add(COLLAPSED!);\n }\n\n /**\n * @internal\n */\n private setTransitioning(isTransitioning: boolean) {\n this.isTransitioning = isTransitioning;\n }\n\n /**\n * @internal\n */\n static isElement(element: unknown): element is Element {\n return Boolean((element as Element).classList);\n }\n}\n\nexport default MetisMenu;\n"],"mappings":";;;;;;;;0OAQO,MAAMA,EAAsB,CACjCC,cAAe,KACfC,QAAS,KACTC,QAAQ,EACRC,eAAgB,KAGLC,EAAY,CACvBC,OAAQ,YACRC,SAAU,cACVC,UAAW,eACXC,WAAY,gBACZC,MAAO,YACPC,KAAM,WCZR,MAAMC,EAsBJC,YAAYC,EAA2BC,GACrCC,KAAKF,QAAUF,EAAUK,UAAUH,GAAWA,EAAUI,SAASC,cAA2BL,GAC5FE,KAAKI,OAAMC,OAAAC,OAAAD,OAAAC,OAAA,GAAQtB,GAAYe,GAC/BC,KAAKO,UAAW,EAChBP,KAAKQ,WAAa,GAClBR,KAAKS,kBAAoBT,KAAKU,WAAWC,KAAKX,MAC9CA,KAAKY,M,CAGPC,cAAcC,EAAaC,GACzB,OAAO,IAAInB,EAAUkB,EAAIC,E,CAMnBH,OACN,MAAMlB,MAAEA,EAAKJ,OAAEA,EAAMC,SAAEA,GAAaF,EACpCW,KAAKF,QAAQkB,UAAUC,IAAIvB,GAE3B,MAAMwB,EAAM,IAAIlB,KAAKF,QAAQqB,iBAA8BnB,KAAKI,OAAOlB,UAEpD,IAAfgC,EAAIE,QAIRF,EAAIG,SAASC,IACXA,EAAGN,UAAUC,IAAI1B,GACjB,MAAMgC,EAAKD,EAAGE,QAAQxB,KAAKI,OAAOnB,gBAE9BsC,aAAE,EAAFA,EAAIP,UAAUS,SAASnC,IACzBU,KAAK0B,KAAKJ,GAEVtB,KAAK2B,KAAKL,GAGZ,MAAMM,EAAIL,aAAE,EAAFA,EAAIpB,cAA2BH,KAAKI,OAAOhB,gBACZ,UAArCwC,aAAA,EAAAA,EAAGC,aAAa,oBAIpBD,WAAGE,aAAa,gBAAiB,SAEjCF,WAAGG,iBAAiB,QAAS/B,KAAKS,mBAClCT,KAAKQ,WAAWwB,KAAKJ,GAAG,G,CAOpBlB,WAAWuB,GACjB,IAAKjC,KAAKO,SAAU,CAClB,MAAM2B,EAASD,aAAA,EAAAA,EAAKE,cAChBD,GAA6B,MAAnBA,EAAOE,SACnBH,EAAKI,iBAGP,MAAMd,EAAKW,EAAQV,QAAQxB,KAAKI,OAAOnB,eACjCqC,EAAKC,aAAE,EAAFA,EAAIpB,cAAcH,KAAKI,OAAOlB,SACzCc,KAAKb,OAAOmC,EACb,C,CAGHgB,SACEtC,KAAKO,UAAW,EAChBP,KAAKY,M,CAGP2B,UACEvC,KAAKQ,WAAWa,SAASmB,IACvBA,EAAIC,oBAAoB,QAASzC,KAAKS,kBAAkB,IAE1DT,KAAKO,UAAW,C,CAelBmC,GACEC,EACAC,EACA7C,GAGA,OADAC,KAAKF,QAAQiC,iBAAiBY,EAASC,EAAS7C,GACzCC,I,CAeT6C,IACEF,EACAC,EACA7C,GAGA,OADAC,KAAKF,QAAQ2C,oBAAoBE,EAASC,EAAS7C,GAC5CC,I,CAMT8C,KACEH,EACAI,EACAC,GAAe,GAEf,MAAMf,EAAM,IAAIgB,YAAeN,EAAS,CACtCO,QAASF,EACTG,OAAQJ,IAEV/C,KAAKF,QAAQsD,cAAcnB,E,CAM7B9C,OAAOmC,GACL,MAAMC,EAAKD,EAAGE,QAAQxB,KAAKI,OAAOnB,gBAC9BsC,aAAE,EAAFA,EAAIP,UAAUS,SAASpC,EAAUC,SACnCU,KAAK2B,KAAKL,GAEVtB,KAAK0B,KAAKJ,E,CAOdI,KAAKZ,G,MACH,MAAMQ,EAAKR,GACLxB,OAAEA,EAAMC,SAAEA,EAAQC,UAAEA,EAASC,WAAEA,EAAUE,KAAEA,GAASN,EAE1D,GAAIW,KAAKqD,iBAAmB/B,EAAGN,UAAUS,SAAShC,GAChD,OAEF,MAAM6D,EAAW,KACfhC,EAAGN,UAAUuC,OAAO9D,GACpB6B,EAAGkC,MAAMC,OAAS,GAClBnC,EAAGmB,oBAAoB,gBAAiBa,GACxCtD,KAAK0D,kBAAiB,GACtB1D,KAAK8C,KAAK,kBAAmB,CAC3Ba,aAAcrC,GACd,EAGEC,EAAKD,EAAGE,QAAQxB,KAAKI,OAAOnB,eAClCsC,WAAIP,UAAUC,IAAI3B,GAElB,MAAMsC,EAAIL,aAAE,EAAFA,EAAIpB,cAA2BH,KAAKI,OAAOhB,gBACrDwC,WAAGE,aAAa,gBAAiB,QACjCF,WAAGZ,UAAUuC,OAAO/D,GAEpB8B,EAAGkC,MAAMC,OAAS,MAClBnC,EAAGN,UAAUuC,OAAOhE,GACpB+B,EAAGN,UAAUuC,OAAO5D,GACpB2B,EAAGN,UAAUC,IAAIxB,GACjB,MAAMmE,EAAmB,GAAGC,MAAMC,KAAmB,QAAdC,EAAAxC,aAAE,EAAFA,EAAIyC,kBAAU,IAAAD,OAAA,EAAAA,EAAEE,UAAUC,QAC/DC,GACGA,IAAM5C,IACPvB,KAAKI,OAAOjB,QAAUyE,EAAiBxC,OAAS,GAClDwC,EAAiBvC,SAAS+C,IACxB,MAAMC,EAAQD,EAAMjE,cAA2BH,KAAKI,OAAOlB,SACvDmF,GACFrE,KAAK2B,KAAK0C,EACX,IAILrE,KAAK0D,kBAAiB,GAEtBpC,EAAGN,UAAUC,IAAI1B,GACjB+B,EAAGN,UAAUC,IAAItB,GACjB2B,EAAGkC,MAAMC,OAAS,GAAGnC,EAAGgD,iBACxBtE,KAAK8C,KAAK,iBAAkB,CAC1ByB,YAAajD,IAEfA,EAAGS,iBAAiB,gBAAiBuB,E,CAMvC3B,KAAKb,GACH,MAAMxB,OAAEA,EAAMC,SAAEA,EAAQC,UAAEA,EAASC,WAAEA,EAAUE,KAAEA,GAASN,EACpDiC,EAAKR,EACX,GAAId,KAAKqD,kBAAoB/B,EAAGN,UAAUS,SAAS9B,GACjD,OAEFK,KAAK8C,KAAK,iBAAkB,CAC1B0B,YAAalD,IAGf,MAAMC,EAAKD,EAAGE,QAAQxB,KAAKI,OAAOnB,eAClCsC,WAAIP,UAAUuC,OAAOjE,GAErB,MAAMgE,EAAW,KACfhC,EAAGN,UAAUuC,OAAO9D,GACpB6B,EAAGN,UAAUC,IAAI1B,GACjB+B,EAAGkC,MAAMC,OAAS,GAClBnC,EAAGmB,oBAAoB,gBAAiBa,GACxCtD,KAAK0D,kBAAiB,GACtB1D,KAAK8C,KAAK,mBAAoB,CAC5B2B,cAAenD,GACf,EAGJA,EAAGkC,MAAMC,OAAS,GAAGnC,EAAGoD,wBAAwBjB,WAChDnC,EAAGkC,MAAMC,OAAS,GAAGnC,EAAGqD,iBAExBrD,EAAGN,UAAUC,IAAIxB,GACjB6B,EAAGN,UAAUuC,OAAOhE,GACpB+B,EAAGN,UAAUuC,OAAO5D,GACpBK,KAAK0D,kBAAiB,GAEtBpC,EAAGS,iBAAiB,gBAAiBuB,GAErChC,EAAGkC,MAAMC,OAAS,MAElB,MAAM7B,EAAIL,aAAE,EAAFA,EAAIpB,cAAcH,KAAKI,OAAOhB,gBACxCwC,WAAGE,aAAa,gBAAiB,SACjCF,WAAGZ,UAAUC,IAAIzB,E,CAMXkE,iBAAiBL,GACvBrD,KAAKqD,gBAAkBA,C,CAMzBxC,iBAAiBf,GACf,OAAO8E,QAAS9E,EAAoBkB,U"}