{"version":3,"file":"roving-focus-group-impl.js","sources":["../../../../../../packages/components/roving-focus-group/src/roving-focus-group-impl.vue"],"sourcesContent":["<template>\n  <slot />\n</template>\n\n<script lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  inject,\n  provide,\n  readonly,\n  ref,\n  toRef,\n  unref,\n  watch,\n} from 'vue'\nimport { useEventListener } from '@vueuse/core'\nimport { composeEventHandlers } from '@element-plus/utils'\nimport {\n  ROVING_FOCUS_COLLECTION_INJECTION_KEY,\n  rovingFocusGroupProps,\n} from './roving-focus-group'\nimport { ROVING_FOCUS_GROUP_INJECTION_KEY } from './tokens'\nimport { focusFirst } from './utils'\n\nimport type { StyleValue } from 'vue'\n\nconst CURRENT_TAB_ID_CHANGE_EVT = 'currentTabIdChange'\n\nconst ENTRY_FOCUS_EVT = 'rovingFocusGroup.entryFocus'\nconst EVT_OPTS: EventInit = { bubbles: false, cancelable: true }\nexport default defineComponent({\n  name: 'ElRovingFocusGroupImpl',\n  inheritAttrs: false,\n  props: rovingFocusGroupProps,\n  emits: [CURRENT_TAB_ID_CHANGE_EVT, 'entryFocus'],\n  setup(props, { emit }) {\n    const currentTabbedId = ref<string | null>(\n      (props.currentTabId || props.defaultCurrentTabId) ?? null\n    )\n    const isBackingOut = ref(false)\n    const isClickFocus = ref(false)\n    const rovingFocusGroupRef = ref<HTMLElement | null>(null)\n    const { getItems } = inject(\n      ROVING_FOCUS_COLLECTION_INJECTION_KEY,\n      undefined\n    )!\n    const rovingFocusGroupRootStyle = computed(() => {\n      // casting to any for fix compiler error since HTMLElement.StyleValue does not\n      // support CSSProperties\n      return [\n        {\n          outline: 'none',\n        },\n        props.style as StyleValue,\n      ] as any\n    })\n\n    const onItemFocus = (tabbedId: string) => {\n      emit(CURRENT_TAB_ID_CHANGE_EVT, tabbedId)\n    }\n\n    const onItemShiftTab = () => {\n      isBackingOut.value = true\n    }\n\n    const onMousedown = composeEventHandlers(\n      (e: Event) => {\n        props.onMousedown?.(e)\n      },\n      () => {\n        isClickFocus.value = true\n      }\n    )\n\n    const onFocus = composeEventHandlers(\n      (e: FocusEvent) => {\n        props.onFocus?.(e)\n      },\n      (e) => {\n        const isKeyboardFocus = !unref(isClickFocus)\n        const { target, currentTarget } = e\n        if (\n          target === currentTarget &&\n          isKeyboardFocus &&\n          !unref(isBackingOut)\n        ) {\n          const entryFocusEvt = new Event(ENTRY_FOCUS_EVT, EVT_OPTS)\n          currentTarget?.dispatchEvent(entryFocusEvt)\n\n          if (!entryFocusEvt.defaultPrevented) {\n            const items = getItems<{\n              id: string\n              focusable: boolean\n              active: boolean\n            }>().filter((item) => item.focusable)\n            const activeItem = items.find((item) => item.active)\n            const currentItem = items.find(\n              (item) => item.id === unref(currentTabbedId)\n            )\n            const candidates = [activeItem!, currentItem!, ...items].filter(\n              Boolean\n            )\n            const candidateNodes = candidates.map((item) => item.ref!)\n            focusFirst(candidateNodes)\n          }\n        }\n\n        isClickFocus.value = false\n      }\n    )\n\n    const onBlur = composeEventHandlers(\n      (e: Event) => {\n        props.onBlur?.(e)\n      },\n      () => {\n        isBackingOut.value = false\n      }\n    )\n\n    const handleEntryFocus = (...args: any[]) => {\n      emit('entryFocus', ...args)\n    }\n\n    provide(ROVING_FOCUS_GROUP_INJECTION_KEY, {\n      currentTabbedId: readonly(currentTabbedId),\n      loop: toRef(props, 'loop'),\n      tabIndex: computed(() => {\n        return unref(isBackingOut) ? -1 : 0\n      }),\n      rovingFocusGroupRef,\n      rovingFocusGroupRootStyle,\n      orientation: toRef(props, 'orientation'),\n      dir: toRef(props, 'dir'),\n      onItemFocus,\n      onItemShiftTab,\n      onBlur,\n      onFocus,\n      onMousedown,\n    })\n\n    watch(\n      () => props.currentTabId,\n      (val) => {\n        currentTabbedId.value = val ?? null\n      }\n    )\n\n    useEventListener(rovingFocusGroupRef, ENTRY_FOCUS_EVT, handleEntryFocus)\n  },\n})\n</script>\n"],"names":["defineComponent","rovingFocusGroupProps","ref","inject","ROVING_FOCUS_COLLECTION_INJECTION_KEY","computed","composeEventHandlers","unref","focusFirst","provide","ROVING_FOCUS_GROUP_INJECTION_KEY","readonly","toRef","watch"],"mappings":"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"}