element-plus
Version:
A Component Library for Vue 3
1 lines • 8.31 kB
Source Map (JSON)
{"version":3,"file":"roving-focus-group-impl.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-plus/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"],"mappings":";;;;;;;;AA4BA,MAAM,yBAA4B,GAAA,oBAAA,CAAA;AAElC,MAAM,eAAkB,GAAA,6BAAA,CAAA;AACxB,MAAM,QAAsB,GAAA,EAAE,OAAS,EAAA,KAAA,EAAO,UAAY,EAAA,IAAA,EAAA,CAAA;AAC1D,MAAK,YAAa,eAAa,CAAA;AAAA,EAC7B,IAAM,EAAA,wBAAA;AAAA,EACN,YAAc,EAAA,KAAA;AAAA,EACd,KAAO,EAAA,qBAAA;AAAA,EACP,KAAA,EAAO,CAAC,yBAA2B,EAAA,YAAA,CAAA;AAAA,EACnC,KAAA,CAAM,KAAO,EAAA,EAAE,IAAQ,EAAA,EAAA;AACrB,IAAA,IAAA,EAAM,CAAkB;AAGxB,IAAA,MAAM,eAAe,GAAI,GAAA,CAAA,CAAA,EAAA,GAAA,KAAA,CAAA,YAAA,IAAA,KAAA,CAAA,mBAAA,KAAA,IAAA,GAAA,EAAA,GAAA,IAAA,CAAA,CAAA;AACzB,IAAA,MAAM,eAAe,GAAI,CAAA,KAAA,CAAA,CAAA;AACzB,IAAA,MAAM,wBAA8C,CAAA,CAAA;AACpD,IAAM,MAAA,mBAAe,GACnB,GACA,CAAA,IAAA,CAAA,CAAA;AAEF,IAAM,MAAA,EAAA,QAAA,EAAA,GAAA,MAAA,CAAAA,wBAA2C,EAAA,KAAA,CAAA,CAAA,CAAA;AAG/C,IAAO,MAAA,yBAAA,GAAA,QAAA,CAAA,MAAA;AAAA,MACL,OAAA;AAAA,QAAA;AACW,UAAA,OAAA,EAAA,MAAA;AAAA,SAEL;AAAA,QAAA,KAAA,CAAA,KAAA;AAAA,OAAA,CAAA;AAIV,KAAM,CAAA,CAAA;AACJ,IAAA,MAAA,WAAgC,GAAA,CAAA,QAAA,KAAA;AAAA,MAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,CAAA,CAAA;AAGlC,KAAA,CAAA;AACE,IAAA,MAAA,cAAqB,GAAA,MAAA;AAAA,MAAA,YAAA,CAAA,KAAA,GAAA,IAAA,CAAA;AAGvB,KAAM,CAAA;AAEF,IAAA,MAAA,WAAoB,GAAA,oBAAA,CAAA,CAAA,CAAA,KAAA;AAAA,MAAA,IAEhB,GAAA,CAAA;AACJ,MAAA,CAAA,GAAA,GAAA,KAAA,CAAa,WAAQ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,EAAA,CAAA,CAAA,CAAA;AAAA,KAAA,EAAA,MAAA;AAIzB,MAAM,YAAA,CAAA,KACJ,GAAA,IAAA,CAAA;AACE,KAAA,CAAA,CAAA;AAAgB,IAAA,MAEX,OAAA,GAAA,oBAAA,CAAA,CAAA,CAAA,KAAA;AACL,MAAM,IAAA,GAAA,CAAA;AACN,MAAM,CAAA,GAAA,GAAA,aAA4B,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,EAAA,CAAA,CAAA,CAAA;AAClC,KAAA,EAAA,CAAA,CAAA,KACa;AAIX,MAAM,MAAA,eAAA,GAAgB,CAAI,KAAA,CAAA,YAAuB,CAAA,CAAA;AACjD,MAAA,MAAA,EAAA,MAAA,EAAA,aAA6B,EAAA,GAAA,CAAA,CAAA;AAE7B,MAAI,IAAA,wBAAiC,IAAA,eAAA,IAAA,CAAA,KAAA,CAAA,YAAA,CAAA,EAAA;AACnC,QAAA,MAAA,aAAc,GAAA,IAAA,KAIF,CAAA,eAAe,EAAA,QAAA,CAAA,CAAA;AAC3B,QAAA,aAAmB,IAAA,IAAA,GAAA,KAAW,CAAA,GAAC,aAAc,CAAA,aAAA,CAAA,aAAA,CAAA,CAAA;AAC7C,QAAA,IAAA,CAAA,8BACY,EAAA;AAEZ,UAAA,MAAM,gBAAc,EAAA,CAAA,MAAA,CAAa,CAAc,IAAA,KAAA,IAAA,CAAA,SAC7C,CAAA,CAAA;AAEF,UAAA,MAAM,UAAiB,GAAA,KAAA,CAAA,IAAA,CAAA,CAAA,IAAe,gBAAe,CAAA,CAAA;AACrD,UAAW,MAAA,WAAA,GAAA,KAAA,CAAA,IAAA,CAAA,CAAA,IAAA,KAAA,IAAA,CAAA,EAAA,KAAA,KAAA,CAAA,eAAA,CAAA,CAAA,CAAA;AAAA,UAAA,MAAA,UAAA,GAAA,CAAA,UAAA,EAAA,WAAA,EAAA,GAAA,KAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA,CAAA;AAAA,UAAA,MAAA,cAAA,GAAA,UAAA,CAAA,GAAA,CAAA,CAAA,IAAA,KAAA,IAAA,CAAA,GAAA,CAAA,CAAA;AAIf,UAAA,UAAqB,CAAA,cAAA,CAAA,CAAA;AAAA,SAAA;AAIzB,OAAM;AAEF,MAAA,YAAe,CAAA,KAAA,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAEjB;AACE,IAAA,MAAA,MAAA,GAAa,oBAAQ,CAAA,CAAA,CAAA,KAAA;AAAA,MAAA,IAAA,GAAA,CAAA;AAIzB,MAAM,CAAA,GAAA,GAAA,KAAA,CAAA,MAAA,SAAuC,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,EAAA,CAAA,CAAA,CAAA;AAC3C,KAAA,EAAA;AAAsB,MAAA,YAAA,CAAA,KAAA,GAAA,KAAA,CAAA;AAGxB,KAAA,CAAA,CAAA;AAA0C,IAAA,sBACd,GAAA,CAAA,GAAA,IAAA,KAAA;AAAA,MAC1B,IAAA,CAAA,YAAmB,EAAA,GAAA,IAAA,CAAA,CAAA;AAAA,KACnB,CAAA;AACE,IAAO,OAAA,CAAA,gCAA2B,EAAA;AAAA,MAAA,eAAA,EAAA,QAAA,CAAA,eAAA,CAAA;AAAA,MAEpC,IAAA,EAAA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA;AAAA,MACA,QAAA,EAAA,QAAA,CAAA,MAAA;AAAA,QACA,OAAA,kBAA0B,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA;AAAA,OAC1B,CAAA;AAAkB,MAClB,mBAAA;AAAA,MACA,yBAAA;AAAA,MACA,WAAA,EAAA,KAAA,CAAA,KAAA,EAAA,aAAA,CAAA;AAAA,MACA,GAAA,EAAA,KAAA,CAAA,KAAA,EAAA,KAAA,CAAA;AAAA,MACA,WAAA;AAAA,MAAA,cAAA;AAGF,MAAA,MACQ;AAEJ,MAAA,OAAA;AAA+B,MAAA,WAAA;AAInC,KAAA,CAAA,CAAA;AACE,IAAA,KAAA,CAAA,wBAAiC,EAAA,CAAA,GAAA,KAAA;AACjC,MAAA,wBAAwC,GAAA,IAAA,IAAA,GAAA,GAAA,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1C,IAAA,SAAA,CAAA,MAAgB;AACd,MAAA,MAAM,qBAAqB,KAAM,CAAA,mBAAA,CAAA,CAAA;AACjC,MAAA,EAAA,CAAA,mCAAyC,EAAA,gBAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,IAAA,eAAA,CAAA,MAAA;AAAA,MAAA,MAAA,kBAAA,GAAA,KAAA,CAAA,mBAAA,CAAA,CAAA;;;;AA5JrC,CAAA,CAAA,CAAA;;;;;;;;"}