{"version":3,"file":"index.mjs","sources":["../../../../../packages/directives/click-outside/index.ts"],"sourcesContent":["import { isClient } from '@vueuse/core'\nimport { isElement } from '@vuesax-plus/utils'\n\nimport type {\n  ComponentPublicInstance,\n  DirectiveBinding,\n  ObjectDirective,\n} from 'vue'\n\ntype DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void\ntype FlushList = Map<\n  HTMLElement,\n  {\n    documentHandler: DocumentHandler\n    bindingFn: (...args: unknown[]) => unknown\n  }[]\n>\n\nconst nodeList: FlushList = new Map()\n\nlet startClick: MouseEvent\n\nif (isClient) {\n  document.addEventListener('mousedown', (e: MouseEvent) => (startClick = e))\n  document.addEventListener('mouseup', (e: MouseEvent) => {\n    for (const handlers of nodeList.values()) {\n      for (const { documentHandler } of handlers) {\n        documentHandler(e as MouseEvent, startClick)\n      }\n    }\n  })\n}\n\nfunction createDocumentHandler(\n  el: HTMLElement,\n  binding: DirectiveBinding\n): DocumentHandler {\n  let excludes: HTMLElement[] = []\n  if (Array.isArray(binding.arg)) {\n    excludes = binding.arg\n  } else if (isElement(binding.arg)) {\n    // due to current implementation on binding type is wrong the type casting is necessary here\n    excludes.push(binding.arg as unknown as HTMLElement)\n  }\n  return function (mouseup, mousedown) {\n    const popperRef = (\n      binding.instance as ComponentPublicInstance<{\n        popperRef: HTMLElement\n      }>\n    ).popperRef\n    const mouseUpTarget = mouseup.target as Node\n    const mouseDownTarget = mousedown?.target as Node\n    const isBound = !binding || !binding.instance\n    const isTargetExists = !mouseUpTarget || !mouseDownTarget\n    const isContainedByEl =\n      el.contains(mouseUpTarget) || el.contains(mouseDownTarget)\n    const isSelf = el === mouseUpTarget\n\n    const isTargetExcluded =\n      (excludes.length &&\n        excludes.some((item) => item?.contains(mouseUpTarget))) ||\n      (excludes.length && excludes.includes(mouseDownTarget as HTMLElement))\n    const isContainedByPopper =\n      popperRef &&\n      (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget))\n    if (\n      isBound ||\n      isTargetExists ||\n      isContainedByEl ||\n      isSelf ||\n      isTargetExcluded ||\n      isContainedByPopper\n    ) {\n      return\n    }\n    binding.value(mouseup, mousedown)\n  }\n}\n\nconst ClickOutside: ObjectDirective = {\n  beforeMount(el: HTMLElement, binding: DirectiveBinding) {\n    // there could be multiple handlers on the element\n    if (!nodeList.has(el)) {\n      nodeList.set(el, [])\n    }\n\n    nodeList.get(el)!.push({\n      documentHandler: createDocumentHandler(el, binding),\n      bindingFn: binding.value,\n    })\n  },\n  updated(el: HTMLElement, binding: DirectiveBinding) {\n    if (!nodeList.has(el)) {\n      nodeList.set(el, [])\n    }\n\n    const handlers = nodeList.get(el)!\n    const oldHandlerIndex = handlers.findIndex(\n      (item) => item.bindingFn === binding.oldValue\n    )\n    const newHandler = {\n      documentHandler: createDocumentHandler(el, binding),\n      bindingFn: binding.value,\n    }\n\n    if (oldHandlerIndex >= 0) {\n      // replace the old handler to the new handler\n      handlers.splice(oldHandlerIndex, 1, newHandler)\n    } else {\n      handlers.push(newHandler)\n    }\n  },\n  unmounted(el: HTMLElement) {\n    // remove all listeners when a component unmounted\n    nodeList.delete(el)\n  },\n}\n\nexport default ClickOutside\n"],"names":[],"mappings":";;;;AAkBA,MAAM,QAAA,uBAA0B,GAAI,EAAA,CAAA;AAEpC,IAAI,UAAA,CAAA;AAEJ,IAAI,QAAU,EAAA;AACZ,EAAA,QAAA,CAAS,gBAAiB,CAAA,WAAA,EAAa,CAAC,CAAA,KAAmB,aAAa,CAAE,CAAA,CAAA;AAC1E,EAAS,QAAA,CAAA,gBAAA,CAAiB,SAAW,EAAA,CAAC,CAAkB,KAAA;AACtD,IAAW,KAAA,MAAA,QAAA,IAAY,QAAS,CAAA,MAAA,EAAU,EAAA;AACxC,MAAW,KAAA,MAAA,EAAE,eAAgB,EAAA,IAAK,QAAU,EAAA;AAC1C,QAAA,eAAA,CAAgB,GAAiB,UAAU,CAAA,CAAA;AAAA,OAC7C;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACH,CAAA;AAEA,SAAS,qBAAA,CACP,IACA,OACiB,EAAA;AACjB,EAAA,IAAI,WAA0B,EAAC,CAAA;AAC/B,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,GAAG,CAAG,EAAA;AAC9B,IAAA,QAAA,GAAW,OAAQ,CAAA,GAAA,CAAA;AAAA,GACV,MAAA,IAAA,SAAA,CAAU,OAAQ,CAAA,GAAG,CAAG,EAAA;AAEjC,IAAS,QAAA,CAAA,IAAA,CAAK,QAAQ,GAA6B,CAAA,CAAA;AAAA,GACrD;AACA,EAAO,OAAA,SAAU,SAAS,SAAW,EAAA;AACnC,IAAM,MAAA,SAAA,GACJ,QAAQ,QAGR,CAAA,SAAA,CAAA;AACF,IAAA,MAAM,gBAAgB,OAAQ,CAAA,MAAA,CAAA;AAC9B,IAAA,MAAM,kBAAkB,SAAW,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,MAAA,CAAA;AACnC,IAAA,MAAM,OAAU,GAAA,CAAC,OAAW,IAAA,CAAC,OAAQ,CAAA,QAAA,CAAA;AACrC,IAAM,MAAA,cAAA,GAAiB,CAAC,aAAA,IAAiB,CAAC,eAAA,CAAA;AAC1C,IAAA,MAAM,kBACJ,EAAG,CAAA,QAAA,CAAS,aAAa,CAAK,IAAA,EAAA,CAAG,SAAS,eAAe,CAAA,CAAA;AAC3D,IAAA,MAAM,SAAS,EAAO,KAAA,aAAA,CAAA;AAEtB,IAAA,MAAM,gBACH,GAAA,QAAA,CAAS,MACR,IAAA,QAAA,CAAS,KAAK,CAAC,IAAA,KAAS,IAAM,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAA,QAAA,CAAS,cAAc,CACtD,IAAA,QAAA,CAAS,MAAU,IAAA,QAAA,CAAS,SAAS,eAA8B,CAAA,CAAA;AACtE,IAAM,MAAA,mBAAA,GACJ,cACC,SAAU,CAAA,QAAA,CAAS,aAAa,CAAK,IAAA,SAAA,CAAU,SAAS,eAAe,CAAA,CAAA,CAAA;AAC1E,IAAA,IACE,OACA,IAAA,cAAA,IACA,eACA,IAAA,MAAA,IACA,oBACA,mBACA,EAAA;AACA,MAAA,OAAA;AAAA,KACF;AACA,IAAQ,OAAA,CAAA,KAAA,CAAM,SAAS,SAAS,CAAA,CAAA;AAAA,GAClC,CAAA;AACF,CAAA;AAEA,MAAM,YAAgC,GAAA;AAAA,EACpC,WAAA,CAAY,IAAiB,OAA2B,EAAA;AAEtD,IAAA,IAAI,CAAC,QAAA,CAAS,GAAI,CAAA,EAAE,CAAG,EAAA;AACrB,MAAS,QAAA,CAAA,GAAA,CAAI,EAAI,EAAA,EAAE,CAAA,CAAA;AAAA,KACrB;AAEA,IAAS,QAAA,CAAA,GAAA,CAAI,EAAE,CAAA,CAAG,IAAK,CAAA;AAAA,MACrB,eAAA,EAAiB,qBAAsB,CAAA,EAAA,EAAI,OAAO,CAAA;AAAA,MAClD,WAAW,OAAQ,CAAA,KAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GACH;AAAA,EACA,OAAA,CAAQ,IAAiB,OAA2B,EAAA;AAClD,IAAA,IAAI,CAAC,QAAA,CAAS,GAAI,CAAA,EAAE,CAAG,EAAA;AACrB,MAAS,QAAA,CAAA,GAAA,CAAI,EAAI,EAAA,EAAE,CAAA,CAAA;AAAA,KACrB;AAEA,IAAM,MAAA,QAAA,GAAW,QAAS,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAChC,IAAA,MAAM,kBAAkB,QAAS,CAAA,SAAA;AAAA,MAC/B,CAAC,IAAA,KAAS,IAAK,CAAA,SAAA,KAAc,OAAQ,CAAA,QAAA;AAAA,KACvC,CAAA;AACA,IAAA,MAAM,UAAa,GAAA;AAAA,MACjB,eAAA,EAAiB,qBAAsB,CAAA,EAAA,EAAI,OAAO,CAAA;AAAA,MAClD,WAAW,OAAQ,CAAA,KAAA;AAAA,KACrB,CAAA;AAEA,IAAA,IAAI,mBAAmB,CAAG,EAAA;AAExB,MAAS,QAAA,CAAA,MAAA,CAAO,eAAiB,EAAA,CAAA,EAAG,UAAU,CAAA,CAAA;AAAA,KACzC,MAAA;AACL,MAAA,QAAA,CAAS,KAAK,UAAU,CAAA,CAAA;AAAA,KAC1B;AAAA,GACF;AAAA,EACA,UAAU,EAAiB,EAAA;AAEzB,IAAA,QAAA,CAAS,OAAO,EAAE,CAAA,CAAA;AAAA,GACpB;AACF;;;;"}