UNPKG

reka-ui

Version:

Vue port for Radix UI Primitives.

1 lines 9.04 kB
{"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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"}