{"version":3,"file":"index.mjs","sources":["../../../../../packages/directives/click-outside/index.ts"],"sourcesContent":["import { on } from '@element-plus/utils/dom'\nimport isServer from '@element-plus/utils/isServer'\n\nimport type {\n  ComponentPublicInstance,\n  DirectiveBinding,\n  ObjectDirective,\n} from 'vue'\nimport type { Nullable } from '@element-plus/utils/types'\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 (!isServer) {\n  on(document, 'mousedown', (e: MouseEvent) => (startClick = e))\n  on(document, 'mouseup', (e: MouseEvent) => {\n    for (const handlers of nodeList.values()) {\n      for (const { documentHandler } of handlers) {\n        documentHandler(e, 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 ((binding.arg as unknown) instanceof HTMLElement) {\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: Nullable<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":";;;AAmBA,MAAM,WAAsB,IAAI;AAEhC,IAAI;AAEJ,IAAI,CAAC,UAAU;AACb,KAAG,UAAU,aAAa,CAAC,MAAmB,aAAa;AAC3D,KAAG,UAAU,WAAW,CAAC,MAAkB;AACzC,eAAW,YAAY,SAAS,UAAU;AACxC,iBAAW,EAAE,qBAAqB,UAAU;AAC1C,wBAAgB,GAAG;AAAA;AAAA;AAAA;AAAA;AAM3B,+BACE,IACA,SACiB;AACjB,MAAI,WAA0B;AAC9B,MAAI,MAAM,QAAQ,QAAQ,MAAM;AAC9B,eAAW,QAAQ;AAAA,aACT,QAAQ,eAA2B,aAAa;AAE1D,aAAS,KAAK,QAAQ;AAAA;AAExB,SAAO,SAAU,SAAS,WAAW;AACnC,UAAM,YACJ,QAAQ,SAGR;AACF,UAAM,gBAAgB,QAAQ;AAC9B,UAAM,kBAAkB,uCAAW;AACnC,UAAM,UAAU,CAAC,WAAW,CAAC,QAAQ;AACrC,UAAM,iBAAiB,CAAC,iBAAiB,CAAC;AAC1C,UAAM,kBACJ,GAAG,SAAS,kBAAkB,GAAG,SAAS;AAC5C,UAAM,SAAS,OAAO;AAEtB,UAAM,mBACH,SAAS,UACR,SAAS,KAAK,CAAC,SAAS,6BAAM,SAAS,mBACxC,SAAS,UAAU,SAAS,SAAS;AACxC,UAAM,sBACJ,wBACW,SAAS,kBAAkB,UAAU,SAAS;AAC3D,QACE,WACA,kBACA,mBACA,UACA,oBACA,qBACA;AACA;AAAA;AAEF,YAAQ,MAAM,SAAS;AAAA;AAAA;MAIrB,eAAgC;AAAA,EACpC,YAAY,IAAiB,SAA2B;AAEtD,QAAI,CAAC,SAAS,IAAI,KAAK;AACrB,eAAS,IAAI,IAAI;AAAA;AAGnB,aAAS,IAAI,IAAI,KAAK;AAAA,MACpB,iBAAiB,sBAAsB,IAAI;AAAA,MAC3C,WAAW,QAAQ;AAAA;AAAA;AAAA,EAGvB,QAAQ,IAAiB,SAA2B;AAClD,QAAI,CAAC,SAAS,IAAI,KAAK;AACrB,eAAS,IAAI,IAAI;AAAA;AAGnB,UAAM,WAAW,SAAS,IAAI;AAC9B,UAAM,kBAAkB,SAAS,UAC/B,CAAC,SAAS,KAAK,cAAc,QAAQ;AAEvC,UAAM,aAAa;AAAA,MACjB,iBAAiB,sBAAsB,IAAI;AAAA,MAC3C,WAAW,QAAQ;AAAA;AAGrB,QAAI,mBAAmB,GAAG;AAExB,eAAS,OAAO,iBAAiB,GAAG;AAAA,WAC/B;AACL,eAAS,KAAK;AAAA;AAAA;AAAA,EAGlB,UAAU,IAAiB;AAEzB,aAAS,OAAO;AAAA;AAAA;;;;"}