{"version":3,"file":"roving-focus-item.mjs","sources":["../../../../../../packages/components/roving-focus-group/src/roving-focus-item.vue"],"sourcesContent":["<template>\n  <el-roving-focus-collection-item\n    :id=\"id\"\n    :focusable=\"focusable\"\n    :active=\"active\"\n  >\n    <slot />\n  </el-roving-focus-collection-item>\n</template>\n\n<script lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  inject,\n  ref,\n  unref,\n  nextTick,\n  provide,\n} from 'vue'\nimport { useId } from '@element-plus/hooks'\nimport { composeEventHandlers } from '@element-plus/utils'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport {\n  ROVING_FOCUS_COLLECTION_INJECTION_KEY,\n  ElCollectionItem as ElRovingFocusCollectionItem,\n} from './roving-focus-group'\nimport {\n  ROVING_FOCUS_GROUP_INJECTION_KEY,\n  ROVING_FOCUS_GROUP_ITEM_INJECTION_KEY,\n} from './tokens'\nimport { getFocusIntent, reorderArray, focusFirst } from './utils'\n\nexport default defineComponent({\n  components: {\n    ElRovingFocusCollectionItem,\n  },\n  props: {\n    focusable: {\n      type: Boolean,\n      default: true,\n    },\n    active: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: ['mousedown', 'focus', 'keydown'],\n  setup(props, { emit }) {\n    const { currentTabbedId, loop, onItemFocus, onItemShiftTab } = inject(\n      ROVING_FOCUS_GROUP_INJECTION_KEY,\n      undefined\n    )!\n\n    const { getItems } = inject(\n      ROVING_FOCUS_COLLECTION_INJECTION_KEY,\n      undefined\n    )!\n\n    const id = useId()\n    const rovingFocusGroupItemRef = ref<HTMLElement | null>(null)\n\n    const handleMousedown = composeEventHandlers(\n      (e: Event) => {\n        emit('mousedown', e)\n      },\n      (e) => {\n        if (!props.focusable) {\n          e.preventDefault()\n        } else {\n          onItemFocus(unref(id))\n        }\n      }\n    )\n\n    const handleFocus = composeEventHandlers(\n      (e: Event) => {\n        emit('focus', e)\n      },\n      () => {\n        onItemFocus(unref(id))\n      }\n    )\n\n    const handleKeydown = composeEventHandlers(\n      (e: Event) => {\n        emit('keydown', e)\n      },\n      (e) => {\n        const { key, shiftKey, target, currentTarget } = e as KeyboardEvent\n        if (key === EVENT_CODE.tab && shiftKey) {\n          onItemShiftTab()\n          return\n        }\n        if (target !== currentTarget) return\n        const focusIntent = getFocusIntent(e as KeyboardEvent)\n\n        if (focusIntent) {\n          e.preventDefault()\n          const items = getItems<typeof props>().filter(\n            (item) => item.focusable\n          )\n\n          let elements = items.map((item) => item.ref!)\n\n          switch (focusIntent) {\n            case 'last': {\n              elements.reverse()\n              break\n            }\n            case 'prev':\n            case 'next': {\n              if (focusIntent === 'prev') {\n                elements.reverse()\n              }\n              const currentIdx = elements.indexOf(currentTarget as HTMLElement)\n              elements = loop.value\n                ? reorderArray(elements, currentIdx + 1)\n                : elements.slice(currentIdx + 1)\n              break\n            }\n            default: {\n              break\n            }\n          }\n\n          nextTick(() => {\n            focusFirst(elements)\n          })\n        }\n      }\n    )\n\n    const isCurrentTab = computed(() => currentTabbedId.value === unref(id))\n\n    provide(ROVING_FOCUS_GROUP_ITEM_INJECTION_KEY, {\n      rovingFocusGroupItemRef,\n      tabIndex: computed(() => (unref(isCurrentTab) ? 0 : -1)),\n      handleMousedown,\n      handleFocus,\n      handleKeydown,\n    })\n\n    return {\n      id,\n      handleKeydown,\n      handleFocus,\n      handleMousedown,\n    }\n  },\n})\n</script>\n"],"names":["ElRovingFocusCollectionItem","ROVING_FOCUS_COLLECTION_INJECTION_KEY","_openBlock","_createBlock","_withCtx"],"mappings":";;;;;;;;;;;;AAiCA,MAAK,YAAa,gBAAa;AAAA,EAC7B,YAAY;AAAA,iCACVA;AAAA;AAAA,EAEF,OAAO;AAAA,IACL,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA,EAGb,OAAO,CAAC,aAAa,SAAS;AAAA,EAC9B,MAAM,OAAO,EAAE,QAAQ;AACrB,UAAM,EAAE,iBAAiB,MAAM,aAAa,mBAAmB,OAC7D,kCACA;AAGF,UAAM,EAAE,aAAa,OACnBC,0BACA;AAGF,UAAM,KAAK;AACX,UAAM,0BAA0B,IAAwB;AAExD,UAAM,kBAAkB,qBACtB,CAAC,MAAa;AACZ,WAAK,aAAa;AAAA,OAEpB,CAAC,MAAM;AACL,UAAI,CAAC,MAAM,WAAW;AACpB,UAAE;AAAA,aACG;AACL,oBAAY,MAAM;AAAA;AAAA;AAKxB,UAAM,cAAc,qBAClB,CAAC,MAAa;AACZ,WAAK,SAAS;AAAA,OAEhB,MAAM;AACJ,kBAAY,MAAM;AAAA;AAItB,UAAM,gBAAgB,qBACpB,CAAC,MAAa;AACZ,WAAK,WAAW;AAAA,OAElB,CAAC,MAAM;AACL,YAAM,EAAE,KAAK,UAAU,QAAQ,kBAAkB;AACjD,UAAI,QAAQ,WAAW,OAAO,UAAU;AACtC;AACA;AAAA;AAEF,UAAI,WAAW;AAAe;AAC9B,YAAM,cAAc,eAAe;AAEnC,UAAI,aAAa;AACf,UAAE;AACF,cAAM,QAAQ,WAAyB,OACrC,CAAC,SAAS,KAAK;AAGjB,YAAI,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK;AAExC,gBAAQ;AAAA,eACD,QAAQ;AACX,qBAAS;AACT;AAAA;AAAA,eAEG;AAAA,eACA,QAAQ;AACX,gBAAI,gBAAgB,QAAQ;AAC1B,uBAAS;AAAA;AAEX,kBAAM,aAAa,SAAS,QAAQ;AACpC,uBAAW,KAAK,QACZ,aAAa,UAAU,aAAa,KACpC,SAAS,MAAM,aAAa;AAChC;AAAA;AAAA,mBAEO;AACP;AAAA;AAAA;AAIJ,iBAAS,MAAM;AACb,qBAAW;AAAA;AAAA;AAAA;AAMnB,UAAM,eAAe,SAAS,MAAM,gBAAgB,UAAU,MAAM;AAEpE,YAAQ,uCAAuC;AAAA,MAC7C;AAAA,MACA,UAAU,SAAS,MAAO,MAAM,gBAAgB,IAAI;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA;AAGF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;;;SAjJGC,aAAEC;AAAA,IACN,SAAS;AAAA,IACT,WAAQ;AAAA;;aAETC,QAAQ;AAAA;;;;;;;;;"}