{"version":3,"file":"DismissableLayer.cjs","sources":["../../src/DismissableLayer/DismissableLayer.vue"],"sourcesContent":["<script lang=\"ts\">\nimport {\n  computed,\n  nextTick,\n  reactive,\n  watchEffect,\n} from 'vue'\n\nimport type { PrimitiveProps } from '@/Primitive'\nimport type {\n  FocusOutsideEvent,\n  PointerDownOutsideEvent,\n} from './utils'\nimport { useForwardExpose } from '@/shared'\n\nexport interface DismissableLayerProps extends PrimitiveProps {\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 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 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\nexport type DismissableLayerPrivateEmits = DismissableLayerEmits & {\n  /**\n   * Handler called when the `DismissableLayer` should be dismissed\n   */\n  dismiss: []\n}\n\nexport const context = reactive({\n  layersRoot: new Set<HTMLElement>(),\n  layersWithOutsidePointerEventsDisabled: new Set<HTMLElement>(),\n  branches: new Set<HTMLElement>(),\n})\n</script>\n\n<script setup lang=\"ts\">\nimport { onKeyStroke } from '@vueuse/core'\nimport {\n  useFocusOutside,\n  usePointerDownOutside,\n} from './utils'\nimport {\n  Primitive,\n} from '@/Primitive'\n\nconst props = withDefaults(defineProps<DismissableLayerProps>(), {\n  disableOutsidePointerEvents: false,\n})\n\nconst emits = defineEmits<DismissableLayerPrivateEmits>()\n\nconst { forwardRef, currentElement: layerElement } = useForwardExpose()\nconst ownerDocument = computed(\n  () => layerElement.value?.ownerDocument ?? globalThis.document,\n)\n\nconst layers = computed(() => context.layersRoot)\n\nconst index = computed(() => {\n  return layerElement.value\n    ? Array.from(layers.value).indexOf(layerElement.value)\n    : -1\n})\n\nconst isBodyPointerEventsDisabled = computed(() => {\n  return context.layersWithOutsidePointerEventsDisabled.size > 0\n})\n\nconst isPointerEventsEnabled = computed(() => {\n  const localLayers = Array.from(layers.value)\n  const [highestLayerWithOutsidePointerEventsDisabled] = [...context.layersWithOutsidePointerEventsDisabled].slice(-1)\n  const highestLayerWithOutsidePointerEventsDisabledIndex = localLayers.indexOf(highestLayerWithOutsidePointerEventsDisabled)\n\n  return index.value >= highestLayerWithOutsidePointerEventsDisabledIndex\n})\n\nconst pointerDownOutside = usePointerDownOutside(async (event) => {\n  const isPointerDownOnBranch = [...context.branches].some(branch =>\n    branch?.contains(event.target as HTMLElement),\n  )\n\n  if (!isPointerEventsEnabled.value || isPointerDownOnBranch)\n    return\n  emits('pointerDownOutside', event)\n  emits('interactOutside', event)\n  await nextTick()\n  if (!event.defaultPrevented)\n    emits('dismiss')\n}, layerElement)\n\nconst focusOutside = useFocusOutside((event) => {\n  const isFocusInBranch = [...context.branches].some(branch =>\n    branch?.contains(event.target as HTMLElement),\n  )\n\n  if (isFocusInBranch)\n    return\n  emits('focusOutside', event)\n  emits('interactOutside', event)\n  if (!event.defaultPrevented)\n    emits('dismiss')\n}, layerElement)\n\nonKeyStroke('Escape', (event) => {\n  const isHighestLayer = index.value === layers.value.size - 1\n  if (!isHighestLayer)\n    return\n  emits('escapeKeyDown', event)\n  if (!event.defaultPrevented)\n    emits('dismiss')\n})\n\nlet originalBodyPointerEvents: string\nwatchEffect((cleanupFn) => {\n  if (!layerElement.value)\n    return\n  if (props.disableOutsidePointerEvents) {\n    if (context.layersWithOutsidePointerEventsDisabled.size === 0) {\n      originalBodyPointerEvents = ownerDocument.value.body.style.pointerEvents\n      ownerDocument.value.body.style.pointerEvents = 'none'\n    }\n    context.layersWithOutsidePointerEventsDisabled.add(layerElement.value)\n  }\n  layers.value.add(layerElement.value)\n\n  cleanupFn(() => {\n    if (\n      props.disableOutsidePointerEvents\n      && context.layersWithOutsidePointerEventsDisabled.size === 1\n    ) {\n      ownerDocument.value.body.style.pointerEvents = originalBodyPointerEvents\n    }\n  })\n})\n\nwatchEffect((cleanupFn) => {\n  cleanupFn(() => {\n    if (!layerElement.value)\n      return\n    layers.value.delete(layerElement.value)\n    context.layersWithOutsidePointerEventsDisabled.delete(layerElement.value)\n  })\n})\n</script>\n\n<template>\n  <Primitive\n    :ref=\"forwardRef\"\n    :as-child=\"asChild\"\n    :as=\"as\"\n    data-dismissable-layer\n    :style=\"{\n      pointerEvents: isBodyPointerEventsDisabled\n        ? isPointerEventsEnabled\n          ? 'auto'\n          : 'none'\n        : undefined,\n    }\"\n    @focus.capture=\"focusOutside.onFocusCapture\"\n    @blur.capture=\"focusOutside.onBlurCapture\"\n    @pointerdown.capture=\"pointerDownOutside.onPointerDownCapture\"\n  >\n    <slot />\n  </Primitive>\n</template>\n"],"names":["reactive","useForwardExpose","computed","usePointerDownOutside","nextTick","useFocusOutside","onKeyStroke","watchEffect"],"mappings":"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"}