@vuesax-alpha/nightly
Version:
A Component Library for Vue 3
1 lines • 15.9 kB
Source Map (JSON)
{"version":3,"file":"focus-trap2.mjs","sources":["../../../../../../packages/components/focus-trap/src/focus-trap.vue"],"sourcesContent":["<template>\n <slot :handle-keydown=\"onKeydown\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n nextTick,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n unref,\n watch,\n} from 'vue'\nimport { isNil } from 'lodash-unified'\nimport { EVENT_CODE } from '@vuesax-alpha/constants'\nimport { useEscapeKeydown } from '@vuesax-alpha/hooks'\nimport { isString } from '@vuesax-alpha/utils'\nimport {\n focusAfterReleased,\n focusAfterTrapped,\n focusAfterTrappedOpts,\n focusTrapInjectionKey,\n onReleaseFocusEvent,\n onTrapFocusEvent,\n} from '@vuesax-alpha/tokens'\nimport { focusTrapEmits, focusTrapProps } from './focus-trap'\nimport {\n createFocusOutPreventedEvent,\n focusFirstDescendant,\n focusableStack,\n getEdges,\n isFocusCausedByUserEvent,\n obtainAllFocusableElements,\n tryFocus,\n useFocusReason,\n} from './utils'\n\nimport type { FocusLayer } from './utils'\n\ndefineOptions({\n name: 'VsFocusTrap',\n inheritAttrs: false,\n})\n\nconst props = defineProps(focusTrapProps)\nconst emit = defineEmits(focusTrapEmits)\n\nconst forwardRef = ref<HTMLElement | undefined>()\nlet lastFocusBeforeTrapped: HTMLElement | null = null\nlet lastFocusAfterTrapped: HTMLElement | null = null\n\nconst { focusReason } = useFocusReason()\n\nuseEscapeKeydown((event) => {\n if (props.trapped && !focusLayer.paused) {\n emit('releaseRequested', event)\n }\n})\n\nconst focusLayer: FocusLayer = {\n paused: false,\n pause() {\n this.paused = true\n },\n resume() {\n this.paused = false\n },\n}\nconst onKeydown = (e: KeyboardEvent) => {\n if (!props.loop && !props.trapped) return\n if (focusLayer.paused) return\n const { key, altKey, ctrlKey, metaKey, currentTarget, shiftKey } = e\n const { loop } = props\n const isTabbing = key === EVENT_CODE.tab && !altKey && !ctrlKey && !metaKey\n const currentFocusingEl = document.activeElement\n if (isTabbing && currentFocusingEl) {\n const container = currentTarget as HTMLElement\n const [first, last] = getEdges(container)\n const isTabbable = first && last\n if (!isTabbable) {\n if (currentFocusingEl === container) {\n const focusoutPreventedEvent = createFocusOutPreventedEvent({\n focusReason: focusReason.value,\n })\n emit('focusoutPrevented', focusoutPreventedEvent)\n if (!focusoutPreventedEvent.defaultPrevented) {\n e.preventDefault()\n }\n }\n } else {\n if (!shiftKey && currentFocusingEl === last) {\n const focusoutPreventedEvent = createFocusOutPreventedEvent({\n focusReason: focusReason.value,\n })\n emit('focusoutPrevented', focusoutPreventedEvent)\n if (!focusoutPreventedEvent.defaultPrevented) {\n e.preventDefault()\n if (loop) tryFocus(first, true)\n }\n } else if (\n shiftKey &&\n [first, container].includes(currentFocusingEl as HTMLElement)\n ) {\n const focusoutPreventedEvent = createFocusOutPreventedEvent({\n focusReason: focusReason.value,\n })\n emit('focusoutPrevented', focusoutPreventedEvent)\n if (!focusoutPreventedEvent.defaultPrevented) {\n e.preventDefault()\n if (loop) tryFocus(last, true)\n }\n }\n }\n }\n}\nprovide(focusTrapInjectionKey, {\n focusTrapRef: forwardRef,\n onKeydown,\n})\nwatch(\n () => props.focusTrapEl,\n (focusTrapEl) => {\n if (focusTrapEl) {\n forwardRef.value = focusTrapEl\n }\n },\n { immediate: true }\n)\nwatch(forwardRef, (forwardRef, oldForwardRef) => {\n if (forwardRef) {\n forwardRef.addEventListener('keydown', onKeydown)\n forwardRef.addEventListener('focusin', onFocusIn)\n forwardRef.addEventListener('focusout', onFocusOut)\n }\n if (oldForwardRef instanceof HTMLElement) {\n oldForwardRef.removeEventListener('keydown', onKeydown)\n oldForwardRef.removeEventListener('focusin', onFocusIn)\n oldForwardRef.removeEventListener('focusout', onFocusOut)\n }\n})\n\nconst trapOnFocus = (e: Event) => {\n emit(onTrapFocusEvent, e)\n}\n\nconst releaseOnFocus = (e: unknown) =>\n emit(onReleaseFocusEvent, e as CustomEvent)\n\nconst onFocusIn = (e: FocusEvent) => {\n const trapContainer = unref(forwardRef)\n if (!trapContainer) return\n const target = e.target as HTMLElement | null\n const relatedTarget = e.relatedTarget as HTMLElement | null\n const isFocusedInTrap = target && trapContainer.contains(target)\n if (!props.trapped) {\n const isPrevFocusedInTrap =\n relatedTarget && trapContainer.contains(relatedTarget)\n if (!isPrevFocusedInTrap) {\n lastFocusBeforeTrapped = relatedTarget\n }\n }\n if (isFocusedInTrap) emit('focusin', e)\n if (focusLayer.paused) return\n if (props.trapped) {\n if (isFocusedInTrap) {\n lastFocusAfterTrapped = target\n } else {\n tryFocus(lastFocusAfterTrapped, true)\n }\n }\n}\n\nconst onFocusOut = (e: Event) => {\n const trapContainer = unref(forwardRef)\n if (focusLayer.paused || !trapContainer) return\n if (props.trapped) {\n const relatedTarget = (e as FocusEvent).relatedTarget as HTMLElement | null\n if (!isNil(relatedTarget) && !trapContainer.contains(relatedTarget)) {\n // Give embedded focus layer time to pause this layer before reclaiming focus\n // And only reclaim focus if it should currently be trapping\n setTimeout(() => {\n if (!focusLayer.paused && props.trapped) {\n const focusoutPreventedEvent = createFocusOutPreventedEvent({\n focusReason: focusReason.value,\n })\n emit('focusoutPrevented', focusoutPreventedEvent)\n if (!focusoutPreventedEvent.defaultPrevented) {\n tryFocus(lastFocusAfterTrapped, true)\n }\n }\n }, 0)\n }\n } else {\n const target = e.target as HTMLElement | null\n const isFocusedInTrap = target && trapContainer.contains(target)\n if (!isFocusedInTrap) emit('focusout', e)\n }\n}\n\nconst startTrap = async () => {\n // Wait for forwardRef to resolve\n await nextTick()\n const trapContainer = unref(forwardRef)\n if (trapContainer) {\n focusableStack.push(focusLayer)\n const prevFocusedElement = trapContainer.contains(document.activeElement)\n ? lastFocusBeforeTrapped\n : document.activeElement\n lastFocusBeforeTrapped = prevFocusedElement as HTMLElement | null\n const isPrevFocusContained = trapContainer.contains(prevFocusedElement)\n if (!isPrevFocusContained) {\n const focusEvent = new Event(focusAfterTrapped, focusAfterTrappedOpts)\n trapContainer.addEventListener(focusAfterTrapped, trapOnFocus)\n trapContainer.dispatchEvent(focusEvent)\n if (!focusEvent.defaultPrevented) {\n nextTick(() => {\n let focusStartEl = props.focusStartEl\n if (!isString(focusStartEl)) {\n tryFocus(focusStartEl)\n if (document.activeElement !== focusStartEl) {\n focusStartEl = 'first'\n }\n }\n if (focusStartEl === 'first') {\n focusFirstDescendant(\n obtainAllFocusableElements(trapContainer),\n true\n )\n }\n if (\n document.activeElement === prevFocusedElement ||\n focusStartEl === 'container'\n ) {\n tryFocus(trapContainer)\n }\n })\n }\n }\n }\n}\n\nconst stopTrap = () => {\n const trapContainer = unref(forwardRef)\n if (trapContainer) {\n trapContainer.removeEventListener(focusAfterTrapped, trapOnFocus)\n const releasedEvent = new CustomEvent(focusAfterReleased, {\n ...focusAfterTrappedOpts,\n detail: {\n focusReason: focusReason.value,\n },\n })\n trapContainer.addEventListener(focusAfterReleased, releaseOnFocus)\n trapContainer.dispatchEvent(releasedEvent)\n if (\n !releasedEvent.defaultPrevented &&\n (focusReason.value == 'keyboard' || !isFocusCausedByUserEvent())\n ) {\n tryFocus(lastFocusBeforeTrapped ?? document.body)\n }\n trapContainer.removeEventListener(focusAfterReleased, trapOnFocus)\n focusableStack.remove(focusLayer)\n }\n}\n\nonMounted(() => {\n if (props.trapped) {\n startTrap()\n }\n watch(\n () => props.trapped,\n (trapped) => {\n if (trapped) {\n startTrap()\n } else {\n stopTrap()\n }\n }\n )\n})\n\nonBeforeUnmount(() => {\n if (props.trapped) {\n stopTrap()\n }\n})\n</script>\n"],"names":["forwardRef"],"mappings":"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"}