{"version":3,"file":"dismissable-layer.mjs","sources":["../src/dismissable-layer/utils.ts","../src/dismissable-layer/DismissableLayer.ts","../src/dismissable-layer/DismissableLayerBranch.ts"],"sourcesContent":["import { isClient } from '@vueuse/core'\nimport { nextTick, onWatcherCleanup, type Ref, watch } from 'vue'\n\nexport type PointerDownOutsideEvent = CustomEvent<{\n  originalEvent: PointerEvent\n}>\nexport type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>\n\nexport const DISMISSABLE_LAYER_NAME = 'DismissableLayer'\n// export const CONTEXT_UPDATE = 'dismissableLayer.update'\nexport const POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'\nexport const FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'\n\n/**\n * Listens for `pointerdown` outside a DOM subtree. We use `pointerdown` rather than `pointerup`\n * to mimic layer dismissing behaviour present in OS.\n * Returns props to pass to the node we want to check for outside events.\n */\nexport function usePointerdownOutside(\n  onPointerDownOutside: (event: PointerDownOutsideEvent) => void,\n  node: Ref<HTMLElement | undefined>,\n) {\n  let isPointerInsideDOMTree = false\n\n  let handleClick = () => { }\n\n  const ret = {\n    // ensures we check React component tree (not just DOM tree)\n    onPointerdownCapture: () => {\n      isPointerInsideDOMTree = true\n    },\n  }\n\n  if (!isClient) {\n    return ret\n  }\n\n  watch(node, (nodeVal) => {\n    if (!nodeVal)\n      return\n\n    const ownerDocument = nodeVal.ownerDocument\n\n    async function handlePointerDown(event: PointerEvent) {\n      if (!node.value)\n        return\n\n      const target = event.target as HTMLElement\n\n      // TODO: wip\n      isPointerInsideDOMTree = isInsideDOMTree(node.value, target)\n\n      if (target && !isPointerInsideDOMTree) {\n        const eventDetail = { originalEvent: event }\n\n        function handleAndDispatchPointerDownOutsideEvent() {\n          handleAndDispatchCustomEvent(POINTER_DOWN_OUTSIDE, onPointerDownOutside, eventDetail)\n        }\n\n        /**\n         * On touch devices, we need to wait for a click event because browsers implement\n         * a ~350ms delay between the time the user stops touching the display and when the\n         * browser executes events. We need to ensure we don't reactivate pointer-events within\n         * this timeframe otherwise the browser may execute events that should have been prevented.\n         *\n         * Additionally, this also lets us deal automatically with cancellations when a click event\n         * isn't raised because the page was considered scrolled/drag-scrolled, long-pressed, etc.\n         *\n         * This is why we also continuously remove the previous listener, because we cannot be\n         * certain that it was raised, and therefore cleaned-up.\n         */\n        if (event.pointerType === 'touch') {\n          ownerDocument.removeEventListener('click', handleClick)\n          handleClick = handleAndDispatchPointerDownOutsideEvent\n          ownerDocument.addEventListener('click', handleClick, { once: true })\n        }\n        else {\n          handleAndDispatchPointerDownOutsideEvent()\n        }\n      }\n      else {\n        // We need to remove the event listener in case the outside click has been canceled.\n        // See: https://github.com/radix-ui/primitives/issues/2171\n        ownerDocument.removeEventListener('click', handleClick)\n      }\n      isPointerInsideDOMTree = false\n    }\n\n    /**\n     * if this hook executes in a component that mounts via a `pointerdown` event, the event\n     * would bubble up to the document and trigger a `pointerDownOutside` event. We avoid\n     * this by delaying the event listener registration on the document.\n     * This is how the DOM works, ie:\n     * ```\n     * button.addEventListener('pointerdown', () => {\n     *   console.log('I will log');\n     *   document.addEventListener('pointerdown', () => {\n     *     console.log('I will also log');\n     *   })\n     * });\n     */\n    const timerId = window.setTimeout(() => {\n      ownerDocument.addEventListener('pointerdown', handlePointerDown)\n    }, 0)\n\n    onWatcherCleanup(() => {\n      window.clearTimeout(timerId)\n      ownerDocument.removeEventListener('pointerdown', handlePointerDown)\n      ownerDocument.removeEventListener('click', handleClick)\n    })\n  })\n\n  return ret\n}\n\n/**\n * Listens for when focus happens outside a DOM subtree.\n * Returns props to pass to the root (node) of the subtree we want to check.\n */\nexport function useFocusOutside(\n  onFocusOutside: (event: FocusOutsideEvent) => void,\n  node: Ref<HTMLElement | undefined>,\n) {\n  let isFocusInsideDOMTree = false\n\n  const ret = {\n    onFocusCapture: () => {\n      isFocusInsideDOMTree = true\n    },\n    onBlurCapture: () => {\n      isFocusInsideDOMTree = false\n    },\n  }\n\n  if (!isClient) {\n    return ret\n  }\n\n  const handleFocus = async (event: FocusEvent) => {\n    await nextTick()\n\n    if (!node.value)\n      return\n\n    isFocusInsideDOMTree = isInsideDOMTree(node.value, event.target as HTMLElement)\n\n    if (event.target && !isFocusInsideDOMTree) {\n      const eventDetail = { originalEvent: event }\n      handleAndDispatchCustomEvent(FOCUS_OUTSIDE, onFocusOutside, eventDetail)\n    }\n  }\n\n  watch(node, (nodeVal) => {\n    if (!nodeVal)\n      return\n\n    const ownerDocument = nodeVal.ownerDocument\n\n    ownerDocument.addEventListener('focusin', handleFocus)\n\n    onWatcherCleanup(() => {\n      ownerDocument.removeEventListener('focusin', handleFocus)\n    })\n  })\n\n  return ret\n}\n\nfunction isInsideDOMTree(mainLayer: HTMLElement, targetElement: HTMLElement) {\n  if (!mainLayer)\n    return false\n\n  const targetLayer = targetElement.closest<HTMLElement>('[data-dismissable-layer]')\n\n  if (!targetLayer)\n    return false\n\n  if (mainLayer === targetLayer)\n    return true\n\n  const layerList = Array.from(mainLayer.ownerDocument.querySelectorAll<HTMLElement>('[data-dismissable-layer]'))\n\n  if (layerList.indexOf(mainLayer) < layerList.indexOf(targetLayer))\n    return true\n\n  return false\n}\n\nfunction handleAndDispatchCustomEvent<E extends CustomEvent, OriginalEvent extends Event>(\n  name: string,\n  handler: ((event: E) => void) | undefined,\n  detail: { originalEvent: OriginalEvent } & (E extends CustomEvent<infer D> ? D : never),\n) {\n  const target = detail.originalEvent.target as HTMLElement\n  const event = new CustomEvent(name, { bubbles: true, cancelable: true, detail })\n\n  if (handler)\n    target.addEventListener(name, handler as EventListener, { once: true })\n\n  target.dispatchEvent(event)\n}\n","import type { EmitsToHookProps, PrimitiveDefaultProps, PrimitiveElAttrs, RadixPrimitiveReturns } from '../shared/index.ts'\nimport { computed, onWatcherCleanup, type Ref, shallowReactive, shallowRef, watch } from 'vue'\nimport { useEscapeKeydown } from '../hooks/index.ts'\nimport { mergePrimitiveAttrs } from '../shared/index.ts'\nimport { useFocusOutside, usePointerdownOutside } from './utils.ts'\n\nexport type PointerdownOutsideEvent = CustomEvent<{ originalEvent: PointerEvent }>\nexport type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>\n\nexport interface DismissableLayerProps {\n  /**\n   * When `true`, hover/focus/click interactions will be disabled on elements outside\n   * the `DismissableLayer`. Users will need to click twice on outside elements to\n   * interact with them: once to close the `DismissableLayer`, and again to trigger the element.\n   */\n  disableOutsidePointerEvents?: boolean\n}\n\nexport const DEFAULT_DISMISSABLE_LAYER_PROPS = {\n  disableOutsidePointerEvents: false,\n} satisfies PrimitiveDefaultProps<DismissableLayerProps, 'disableOutsidePointerEvents'>\n\nexport type DismissableLayerEmits = {\n  /**\n   * Event handler called when the escape key is down.\n   * Can be prevented.\n   */\n  escapeKeydown: [event: KeyboardEvent]\n  /**\n   * Event handler called when the a `pointerdown` event happens outside of the `DismissableLayer`.\n   * Can be prevented.\n   */\n  pointerdownOutside: [event: PointerdownOutsideEvent]\n  /**\n   * Event handler called when the focus moves outside of the `DismissableLayer`.\n   * Can be prevented.\n   */\n  focusOutside: [event: FocusOutsideEvent]\n  /**\n   * Event handler called when an interaction happens outside the `DismissableLayer`.\n   * Specifically, when a `pointerdown` event happens outside or focus moves outside of it.\n   * Can be prevented.\n   */\n  interactOutside: [event: PointerdownOutsideEvent | FocusOutsideEvent]\n  /**\n   * Handler called when the `DismissableLayer` should be dismissed\n   */\n  dismiss: []\n\n  // focusCapture: [event: FocusEvent]\n  // blurCapture: [event: FocusEvent]\n  // pointerdownCapture: [event: FocusEvent]\n}\n\nexport const context = {\n  layers: shallowReactive(new Set<HTMLElement>()),\n  layersWithOutsidePointerEventsDisabled: shallowReactive(new Set<HTMLElement>()),\n  branches: shallowReactive(new Set<HTMLElement>()),\n}\n\nlet originalBodyPointerEvents: string | undefined\n\nexport interface UseDismissableLayerProps extends EmitsToHookProps<DismissableLayerEmits> {\n  el?: Ref<HTMLElement | undefined>\n  disableOutsidePointerEvents?: () => boolean\n}\n\nexport function useDismissableLayer(props: UseDismissableLayerProps = {}): RadixPrimitiveReturns {\n  const { disableOutsidePointerEvents = () => false } = props\n\n  const el = props.el || shallowRef<HTMLElement>()\n  const setElRef = props.el ? undefined : (value: HTMLElement | undefined) => el.value = value\n\n  const ownerDocument = () => el.value?.ownerDocument ?? globalThis?.document\n\n  const index = computed(() => el.value ? Array.from(context.layers).indexOf(el.value) : -1)\n\n  const isBodyPointerEventsDisabled = computed(() => context.layersWithOutsidePointerEventsDisabled.size > 0)\n\n  const isPointerEventsEnabled = computed(() => {\n    const layers = Array.from(context.layers)\n    const [highestLayerWithOutsidePointerEventsDisabled] = [...context.layersWithOutsidePointerEventsDisabled].slice(-1)\n    const highestLayerWithOutsidePointerEventsDisabledIndex = highestLayerWithOutsidePointerEventsDisabled ? layers.indexOf(highestLayerWithOutsidePointerEventsDisabled) : -1\n\n    return index.value >= highestLayerWithOutsidePointerEventsDisabledIndex\n  })\n\n  usePointerdownOutside((event) => {\n    if (!isPointerEventsEnabled.value)\n      return\n\n    const target = event.target as HTMLElement\n\n    const isPointerdownOnBranch = [...context.branches].some(branch => branch.contains(target))\n    if (isPointerdownOnBranch)\n      return\n\n    props.onPointerdownOutside?.(event)\n    props.onInteractOutside?.(event)\n\n    if (!event.defaultPrevented) {\n      props.onDismiss?.()\n    }\n  }, el)\n\n  useFocusOutside((event) => {\n    const target = event.target as HTMLElement\n\n    const isFocusInBranch = [...context.branches].some(branch => branch.contains(target))\n    if (isFocusInBranch)\n      return\n\n    props.onFocusOutside?.(event)\n    props.onInteractOutside?.(event)\n\n    if (!event.defaultPrevented)\n      props.onDismiss?.()\n  }, el)\n\n  useEscapeKeydown((event) => {\n    const isHighestLayer = index.value === context.layers.size - 1\n\n    if (!isHighestLayer)\n      return\n\n    props.onEscapeKeydown?.(event)\n\n    if (!event.defaultPrevented) {\n      event.preventDefault()\n      props.onDismiss?.()\n    }\n  }, ownerDocument)\n\n  watch(el, (nodeVal) => {\n    if (!nodeVal)\n      return\n\n    const ownerDocumentVal = ownerDocument()\n\n    const _disableOutsidePointerEvents = disableOutsidePointerEvents()\n    if (_disableOutsidePointerEvents) {\n      if (context.layersWithOutsidePointerEventsDisabled.size === 0) {\n        originalBodyPointerEvents = ownerDocumentVal.body.style.pointerEvents\n        ownerDocumentVal.body.style.pointerEvents = 'none'\n      }\n      context.layersWithOutsidePointerEventsDisabled.add(nodeVal)\n    }\n\n    context.layers.add(nodeVal)\n\n    onWatcherCleanup(() => {\n      if (_disableOutsidePointerEvents && context.layersWithOutsidePointerEventsDisabled.size === 1) {\n        if (!originalBodyPointerEvents) {\n          const syles = ownerDocumentVal.body.style\n          syles.removeProperty('pointer-events')\n        }\n        else {\n          ownerDocumentVal.body.style.pointerEvents = originalBodyPointerEvents\n        }\n      }\n\n      /**\n       * We purposefully prevent combining this effect with the `disableOutsidePointerEvents` effect\n       * because a change to `disableOutsidePointerEvents` would remove this layer from the stack\n       * and add it to the end again so the layering order wouldn't be _creation order_.\n       * We only want them to be removed from context stacks when unmounted.\n       */\n      context.layers.delete(nodeVal)\n      context.layersWithOutsidePointerEventsDisabled.delete(nodeVal)\n    })\n  })\n\n  // const onFocusCapture = composeEventHandlers<FocusEvent>((event) => {\n  //   emits.onFocusCapture?.(event)\n  // }, focusOutside.onFocusCapture)\n\n  // const onBlurCapture = composeEventHandlers<FocusEvent>((event) => {\n  //   emits.onBlurCapture?.(event)\n  // }, focusOutside.onBlurCapture)\n\n  // const onPointerdownCapture = composeEventHandlers<FocusEvent>((event) => {\n  //   // emits.onPointerdownCapture?.(event)\n  // }, pointerdownOutside.onPointerdownCapture)\n\n  return {\n    attrs(extraAttrs) {\n      const attrs: PrimitiveElAttrs = {\n        'elRef': setElRef,\n        'data-dismissable-layer': true,\n        'style': {\n          pointerEvents: isBodyPointerEventsDisabled.value\n            ? isPointerEventsEnabled.value\n              ? 'auto'\n              : 'none'\n            : undefined,\n        },\n      }\n\n      if (extraAttrs && extraAttrs.length > 0)\n        mergePrimitiveAttrs(attrs, extraAttrs)\n\n      return attrs\n    },\n  }\n}\n","import { onBeforeUnmount, onMounted } from 'vue'\nimport { type MutableRefObject, useRef } from '../hooks/index.ts'\n\nimport { mergePrimitiveAttrs, type RadixPrimitiveReturns } from '../shared/index.ts'\nimport { context } from './DismissableLayer.ts'\n\nexport interface UseDismissableLayerBranchProps {\n  elRef?: MutableRefObject<HTMLElement | undefined>\n}\n\nexport function useDismissableLayerBranch(props: UseDismissableLayerBranchProps = {}): RadixPrimitiveReturns {\n  const elRef = props.elRef ?? useRef<HTMLElement>()\n  const setElRef = props.elRef ? undefined : (value: HTMLElement | undefined) => elRef.value = value\n\n  onMounted(() => {\n    context.branches.add(elRef.value!)\n  })\n\n  onBeforeUnmount(() => {\n    context.branches.delete(elRef.value!)\n  })\n\n  return {\n    attrs(extraAttrs) {\n      const attrs = {\n        elRef: setElRef,\n      }\n\n      if (extraAttrs && extraAttrs.length > 0) {\n        mergePrimitiveAttrs(attrs, extraAttrs)\n      }\n\n      return attrs\n    },\n  }\n}\n"],"names":[],"mappings":"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"}