{"version":3,"file":"index.mjs","names":["attachedRoot","defaultConditional","checkEvent","e","el","binding","checkIsActive","root","ShadowRoot","host","target","elements","value","include","push","some","contains","isActive","closeConditional","directive","handler","_clickOutside","lastMousedownWasOutside","setTimeout","handleShadow","callback","document","ClickOutside","mounted","onClick","onMousedown","app","addEventListener","instance","$","uid","unmounted","removeEventListener"],"sources":["../../../src/directives/click-outside/index.ts"],"sourcesContent":["// Utilities\nimport { attachedRoot } from '@/util'\n\n// Types\nimport type { DirectiveBinding } from 'vue'\n\ninterface ClickOutsideBindingArgs {\n  handler: (e: MouseEvent) => void\n  closeConditional?: (e: Event) => boolean\n  include?: () => HTMLElement[]\n}\n\ninterface ClickOutsideDirectiveBinding extends DirectiveBinding {\n  value: ((e: MouseEvent) => void) | ClickOutsideBindingArgs\n}\n\nfunction defaultConditional () {\n  return true\n}\n\nfunction checkEvent (e: MouseEvent, el: HTMLElement, binding: ClickOutsideDirectiveBinding): boolean {\n  // The include element callbacks below can be expensive\n  // so we should avoid calling them when we're not active.\n  // Explicitly check for false to allow fallback compatibility\n  // with non-toggleable components\n  if (!e || checkIsActive(e, binding) === false) return false\n\n  // If we're clicking inside the shadowroot, then the app root doesn't get the same\n  // level of introspection as to _what_ we're clicking. We want to check to see if\n  // our target is the shadowroot parent container, and if it is, ignore.\n  const root = attachedRoot(el)\n  if (\n    typeof ShadowRoot !== 'undefined' &&\n    root instanceof ShadowRoot &&\n    root.host === e.target\n  ) return false\n\n  // Check if additional elements were passed to be included in check\n  // (click must be outside all included elements, if any)\n  const elements = ((typeof binding.value === 'object' && binding.value.include) || (() => []))()\n  // Add the root element for the component this directive was defined on\n  elements.push(el)\n\n  // Check if it's a click outside our elements, and then if our callback returns true.\n  // Non-toggleable components should take action in their callback and return falsy.\n  // Toggleable can return true if it wants to deactivate.\n  // Note that, because we're in the capture phase, this callback will occur before\n  // the bubbling click event on any outside elements.\n  return !elements.some(el => el?.contains(e.target as Node))\n}\n\nfunction checkIsActive (e: MouseEvent, binding: ClickOutsideDirectiveBinding): boolean | void {\n  const isActive = (typeof binding.value === 'object' && binding.value.closeConditional) || defaultConditional\n\n  return isActive(e)\n}\n\nfunction directive (e: MouseEvent, el: HTMLElement, binding: ClickOutsideDirectiveBinding) {\n  const handler = typeof binding.value === 'function' ? binding.value : binding.value.handler\n\n  el._clickOutside!.lastMousedownWasOutside && checkEvent(e, el, binding) && setTimeout(() => {\n    checkIsActive(e, binding) && handler && handler(e)\n  }, 0)\n}\n\nfunction handleShadow (el: HTMLElement, callback: Function): void {\n  const root = attachedRoot(el)\n\n  callback(document)\n\n  if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot) {\n    callback(root)\n  }\n}\n\nexport const ClickOutside = {\n  // [data-app] may not be found\n  // if using bind, inserted makes\n  // sure that the root element is\n  // available, iOS does not support\n  // clicks on body\n  mounted (el: HTMLElement, binding: ClickOutsideDirectiveBinding) {\n    const onClick = (e: Event) => directive(e as MouseEvent, el, binding)\n    const onMousedown = (e: Event) => {\n      el._clickOutside!.lastMousedownWasOutside = checkEvent(e as MouseEvent, el, binding)\n    }\n\n    handleShadow(el, (app: HTMLElement) => {\n      app.addEventListener('click', onClick, true)\n      app.addEventListener('mousedown', onMousedown, true)\n    })\n\n    if (!el._clickOutside) {\n      el._clickOutside = {\n        lastMousedownWasOutside: false,\n      }\n    }\n\n    el._clickOutside[binding.instance!.$.uid] = {\n      onClick,\n      onMousedown,\n    }\n  },\n\n  unmounted (el: HTMLElement, binding: ClickOutsideDirectiveBinding) {\n    if (!el._clickOutside) return\n\n    handleShadow(el, (app: HTMLElement) => {\n      if (!app || !el._clickOutside?.[binding.instance!.$.uid]) return\n\n      const { onClick, onMousedown } = el._clickOutside[binding.instance!.$.uid]!\n\n      app.removeEventListener('click', onClick, true)\n      app.removeEventListener('mousedown', onMousedown, true)\n    })\n\n    delete el._clickOutside[binding.instance!.$.uid]\n  },\n}\n\nexport default ClickOutside\n"],"mappings":"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"}