{"version":3,"file":"roving-focus-group-impl.vue2.mjs","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  provide,\n  onBeforeUnmount,\n  onMounted,\n  ref,\n  unref,\n  inject,\n  watch,\n  readonly,\n  toRef,\n} from 'vue'\nimport { composeEventHandlers, on, off } from '@element-ultra/utils'\nimport {\n  rovingFocusGroupProps,\n  ROVING_FOCUS_COLLECTION_INJECTION_KEY,\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    onMounted(() => {\n      const rovingFocusGroupEl = unref(rovingFocusGroupRef)!\n      on(rovingFocusGroupEl, ENTRY_FOCUS_EVT, handleEntryFocus)\n    })\n\n    onBeforeUnmount(() => {\n      const rovingFocusGroupEl = unref(rovingFocusGroupRef)!\n      off(rovingFocusGroupEl, ENTRY_FOCUS_EVT, handleEntryFocus)\n    })\n  },\n})\n</script>\n"],"names":["ROVING_FOCUS_COLLECTION_INJECTION_KEY","_a"],"mappings":"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"}