{"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<Element>;\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<HTMLElement>(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<HTMLElement>(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<HTMLElement>(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<K extends EventType>(\n    evtType: K,\n    handler: SpecificEventListener<K>,\n    options?: AddEventListenerOptions | boolean,\n  ): MetisMenu;\n\n  on<E extends Event>(\n    evtType: E,\n    handler: CustomEventListener<E>,\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<K extends EventType>(\n    evtType: K,\n    handler: SpecificEventListener<K>,\n    options?: AddEventListenerOptions | boolean,\n  ): MetisMenu;\n\n  off<E extends Event>(\n    evtType: E,\n    handler: CustomEventListener<E>,\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<T extends object>(\n    evtType: string,\n    evtData: T,\n    shouldBubble = false,\n  ): void {\n    const evt = new CustomEvent<T>(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<HTMLElement>(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<HTMLElement>(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":"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"}