{"version":3,"file":"onion.cjs","sources":["../src/onion.ts"],"sourcesContent":["interface OnionElement extends HTMLElement {\n  onion?: {\n    abort?: () => void;\n  }\n}\n\ninterface ClassList {\n  [key: string]: boolean;\n}\n\nfunction setClasses(el: Element, classes: ClassList) {\n  Object.entries(classes)\n    .filter(([key]) => key.length)\n    .forEach(([key, value]) => el.classList.toggle(key, value));\n}\n\nfunction addEndListener(el: Element, listener: () => void) {\n  el.addEventListener(\"transitionend\", listener);\n  el.addEventListener(\"animationend\", listener);\n}\n\nfunction removeEndListener(el: Element, listener: () => void) {\n  el.removeEventListener(\"transitionend\", listener);\n  el.removeEventListener(\"animationend\", listener);\n}\n\nfunction show(el: OnionElement, token: string = \"\") {\n  if (!(el instanceof HTMLElement)) return;\n\n  if (el.classList.contains(\"is-opening\"))\n    return;\n\n  el.onion?.abort?.();\n\n  if (token === \"is-opening\")\n    token = \"\";\n\n  const handleEnd = (event?: Event) => {\n    if (event && event.target !== el) return;\n\n    setClasses(el, {\n      \"is-open\": true,\n      \"is-opening\": true,\n      \"is-closing\": false,\n      [token]: false,\n    });\n    el.onion?.abort?.();\n  }\n\n  const timeoutID = setTimeout(handleEnd, 2000);\n\n  el.onion = Object.assign(el.onion || {}, {\n    abort: () => {\n      removeEndListener(el, handleEnd);\n      clearTimeout(timeoutID);\n      setClasses(el, { [token]: false });\n      delete el.onion?.abort;\n    }\n  });\n\n  addEndListener(el, handleEnd);\n\n  setClasses(el, {\n    \"is-open\": true,\n    \"is-opening\": false,\n    \"is-closing\": false,\n    [token]: false,\n  });\n\n  setTimeout(() => setClasses(el, {\n    \"is-open\": true,\n    \"is-opening\": true,\n    \"is-closing\": false,\n    [token]: true,\n  }));\n}\n\nfunction hide(el: OnionElement, token: string = \"\") {\n  if (!(el instanceof HTMLElement)) return;\n\n  if (el.classList.contains(\"is-closing\") || !el.classList.contains(\"is-open\"))\n    return;\n\n  el.onion?.abort?.();\n\n  if (token === \"is-closing\")\n    token = \"\";\n\n  const handleEnd = (event?: Event) => {\n    if (event && event.target !== el) return;\n\n    setClasses(el, {\n      \"is-open\": false,\n      \"is-opening\": false,\n      \"is-closing\": false,\n      [token]: false,\n    });\n    el.onion?.abort?.();\n  }\n\n  const timeoutID = setTimeout(handleEnd, 2000);\n\n  el.onion = Object.assign(el.onion || {}, {\n    abort: () => {\n      removeEndListener(el, handleEnd);\n      clearTimeout(timeoutID);\n      setClasses(el, { [token]: false });\n      delete el.onion?.abort;\n    }\n  });\n\n  addEndListener(el, handleEnd);\n\n  setClasses(el, {\n    \"is-open\": true,\n    \"is-opening\": false,\n    \"is-closing\": true,\n    [token]: true,\n  });\n}\n\nfunction toggle(el: OnionElement, force?: boolean, openingToken: string = \"\", closingToken: string = \"\") {\n  if (!(el instanceof HTMLElement)) return;\n\n  if (typeof force === 'undefined') {\n    if (el.classList.contains('is-opening')) {\n      hide(el, closingToken);\n    } else {\n      show(el, openingToken);\n    }\n  } else {\n    if (force) show(el, openingToken);\n    else hide(el, closingToken);\n  }\n}\n\nexport default {\n  show,\n  hide,\n  toggle\n};\n"],"names":["setClasses","el","classes","Object","entries","filter","_ref","length","forEach","key","classList","toggle","_ref2","addEndListener","listener","addEventListener","removeEndListener","removeEventListener","show","token","HTMLElement","contains","onion","_el$onion","abort","event","_setClasses","_el$onion2","target","timeoutID","setTimeout","handleEnd","assign","clearTimeout","_setClasses2","_el$onion3","_setClasses3","_setClasses4","hide","_el$onion4","_setClasses7","_setClasses5","_el$onion5","_setClasses6","_el$onion6","force","openingToken","closingToken"],"mappings":"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"}