{"version":3,"file":"focus-trap.vue2.mjs","sources":["../../../../../../packages/components/focus-trap/src/focus-trap.vue"],"sourcesContent":["<template>\n  <slot :handle-keydown=\"onKeydown\" />\n</template>\n\n<script lang=\"ts\">\nimport {\n  defineComponent,\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 '@element-plus/constants'\nimport { useEscapeKeydown } from '@element-plus/hooks'\nimport { getEventCode, isString } from '@element-plus/utils'\nimport {\n  createFocusOutPreventedEvent,\n  focusFirstDescendant,\n  focusableStack,\n  getEdges,\n  isFocusCausedByUserEvent,\n  obtainAllFocusableElements,\n  tryFocus,\n  useFocusReason,\n} from './utils'\nimport {\n  FOCUS_AFTER_RELEASED,\n  FOCUS_AFTER_TRAPPED,\n  FOCUS_AFTER_TRAPPED_OPTS,\n  FOCUS_TRAP_INJECTION_KEY,\n  ON_RELEASE_FOCUS_EVT,\n  ON_TRAP_FOCUS_EVT,\n} from './tokens'\n\nimport type { PropType } from 'vue'\nimport type { FocusLayer } from './utils'\n\nexport default defineComponent({\n  name: 'ElFocusTrap',\n  inheritAttrs: false,\n  props: {\n    loop: Boolean,\n    trapped: Boolean,\n    focusTrapEl: Object as PropType<HTMLElement>,\n    focusStartEl: {\n      type: [Object, String] as PropType<'container' | 'first' | HTMLElement>,\n      default: 'first',\n    },\n  },\n  emits: [\n    ON_TRAP_FOCUS_EVT,\n    ON_RELEASE_FOCUS_EVT,\n    'focusin',\n    'focusout',\n    'focusout-prevented',\n    'release-requested',\n  ],\n  setup(props, { emit }) {\n    const forwardRef = ref<HTMLElement | undefined>()\n    let lastFocusBeforeTrapped: HTMLElement | null\n    let lastFocusAfterTrapped: HTMLElement | null\n\n    const { focusReason } = useFocusReason()\n\n    useEscapeKeydown((event) => {\n      if (props.trapped && !focusLayer.paused) {\n        emit('release-requested', event)\n      }\n    })\n\n    const focusLayer: FocusLayer = {\n      paused: false,\n      pause() {\n        this.paused = true\n      },\n      resume() {\n        this.paused = false\n      },\n    }\n\n    const onKeydown = (e: KeyboardEvent) => {\n      if (!props.loop && !props.trapped) return\n      if (focusLayer.paused) return\n\n      const { altKey, ctrlKey, metaKey, currentTarget, shiftKey } = e\n      const { loop } = props\n      const code = getEventCode(e)\n      const isTabbing =\n        code === EVENT_CODE.tab && !altKey && !ctrlKey && !metaKey\n\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('focusout-prevented', 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('focusout-prevented', 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('focusout-prevented', focusoutPreventedEvent)\n            if (!focusoutPreventedEvent.defaultPrevented) {\n              e.preventDefault()\n              if (loop) tryFocus(last, true)\n            }\n          }\n        }\n      }\n    }\n\n    provide(FOCUS_TRAP_INJECTION_KEY, {\n      focusTrapRef: forwardRef,\n      onKeydown,\n    })\n\n    watch(\n      () => props.focusTrapEl,\n      (focusTrapEl) => {\n        if (focusTrapEl) {\n          forwardRef.value = focusTrapEl\n        }\n      },\n      { immediate: true }\n    )\n\n    watch([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) {\n        oldForwardRef.removeEventListener('keydown', onKeydown)\n        oldForwardRef.removeEventListener('focusin', onFocusIn)\n        oldForwardRef.removeEventListener('focusout', onFocusOut)\n      }\n    })\n\n    const trapOnFocus = (e: Event) => {\n      emit(ON_TRAP_FOCUS_EVT, e)\n    }\n    const releaseOnFocus = (e: Event) => emit(ON_RELEASE_FOCUS_EVT, e)\n\n    const onFocusIn = (e: FocusEvent) => {\n      const trapContainer = unref(forwardRef)\n      if (!trapContainer) return\n\n      const target = e.target as HTMLElement | null\n      const relatedTarget = e.relatedTarget as HTMLElement | null\n      const isFocusedInTrap = target && trapContainer.contains(target)\n\n      if (!props.trapped) {\n        const isPrevFocusedInTrap =\n          relatedTarget && trapContainer.contains(relatedTarget)\n        if (!isPrevFocusedInTrap) {\n          lastFocusBeforeTrapped = relatedTarget\n        }\n      }\n\n      if (isFocusedInTrap) emit('focusin', e)\n\n      if (focusLayer.paused) return\n\n      if (props.trapped) {\n        if (isFocusedInTrap) {\n          lastFocusAfterTrapped = target\n        } else {\n          tryFocus(lastFocusAfterTrapped, true)\n        }\n      }\n    }\n\n    const onFocusOut = (e: Event) => {\n      const trapContainer = unref(forwardRef)\n      if (focusLayer.paused || !trapContainer) return\n\n      if (props.trapped) {\n        const relatedTarget = (e as FocusEvent)\n          .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('focusout-prevented', 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\n    async function startTrap() {\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(\n          document.activeElement\n        )\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(\n            FOCUS_AFTER_TRAPPED,\n            FOCUS_AFTER_TRAPPED_OPTS\n          )\n          trapContainer.addEventListener(FOCUS_AFTER_TRAPPED, 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\n    function stopTrap() {\n      const trapContainer = unref(forwardRef)\n\n      if (trapContainer) {\n        trapContainer.removeEventListener(FOCUS_AFTER_TRAPPED, trapOnFocus)\n\n        const releasedEvent = new CustomEvent(FOCUS_AFTER_RELEASED, {\n          ...FOCUS_AFTER_TRAPPED_OPTS,\n          detail: {\n            focusReason: focusReason.value,\n          },\n        })\n        trapContainer.addEventListener(FOCUS_AFTER_RELEASED, releaseOnFocus)\n        trapContainer.dispatchEvent(releasedEvent)\n        if (\n          !releasedEvent.defaultPrevented &&\n          (focusReason.value == 'keyboard' ||\n            !isFocusCausedByUserEvent() ||\n            trapContainer.contains(document.activeElement))\n        ) {\n          tryFocus(lastFocusBeforeTrapped ?? document.body)\n        }\n\n        trapContainer.removeEventListener(FOCUS_AFTER_RELEASED, releaseOnFocus)\n        focusableStack.remove(focusLayer)\n        lastFocusBeforeTrapped = null\n        lastFocusAfterTrapped = null\n      }\n    }\n\n    onMounted(() => {\n      if (props.trapped) {\n        startTrap()\n      }\n\n      watch(\n        () => props.trapped,\n        (trapped) => {\n          if (trapped) {\n            startTrap()\n          } else {\n            stopTrap()\n          }\n        }\n      )\n    })\n\n    onBeforeUnmount(() => {\n      if (props.trapped) {\n        stopTrap()\n      }\n\n      if (forwardRef.value) {\n        forwardRef.value.removeEventListener('keydown', onKeydown)\n        forwardRef.value.removeEventListener('focusin', onFocusIn)\n        forwardRef.value.removeEventListener('focusout', onFocusOut)\n        forwardRef.value = undefined\n      }\n\n      lastFocusBeforeTrapped = null\n      lastFocusAfterTrapped = null\n    })\n\n    return {\n      onKeydown,\n    }\n  },\n})\n</script>\n"],"names":["forwardRef"],"mappings":"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"}