{"version":3,"file":"tab-nav.mjs","names":["computed","defineComponent","inject","nextTick","onMounted","onUpdated","ref","shallowRef","triggerRef","watch","createVNode","_createVNode","useDocumentVisibility","useElementSize","useResizeObserver","useWindowFocus","buildProps","definePropType","getEventCode","isGreaterThan","mutable","rAF","throwError","EVENT_CODE","ElIcon","ArrowLeft","ArrowRight","Close","useNamespace","useWheel","clamp","TabBar","tabsRootContextKey","useTabNavTouch","tabNavProps","panes","type","Array","default","currentName","String","Number","editable","Boolean","values","stretch","tabindex","undefined","tabNavEmits","tabClick","tab","tabName","ev","Event","tabRemove","COMPONENT_NAME","TabNav","name","props","emits","setup","expose","emit","rootTabs","ns","visibility","focused","navScroll$","nav$","el$","tabRefsMap","tabBarRef","scrollable","navOffset","isFocus","focusable","isWheelScrolling","tracker","isHorizontal","includes","tabPosition","sizeName","value","navStyle","dir","transition","isTouchScrolling","transform","width","navContainerWidth","height","navContainerHeight","navWidth","navHeight","box","navContainerSize","navSize","onWheel","atStartEdge","atEndEdge","layout","offset","handleWheel","event","handleTouchStart","handleTouchMove","handleTouchEnd","scrollPrev","containerSize","getBoundingClientRect","currentOffset","newOffset","scrollNext","scrollToActiveTab","nav","activeTab","navScroll","activeTabBounding","navScrollBounding","navScrollLeft","left","navScrollRight","right","navBounding","maxOffset","top","bottom","Math","max","min","update","prev","next","changeTab","code","step","up","down","tabList","from","currentTarget","querySelectorAll","currentIndex","indexOf","target","nextIndex","length","focus","preventScroll","click","setFocus","removeFocus","setRefs","el","key","focusActiveTab","setTimeout","tabListRef","scheduleRender","scrollBtn","e","is","tabs","map","pane","index","uid","disabled","closable","isClosable","btnClose","tabLabelContent","slots","label","active","onFocus","onBlur","delete","backspace"],"sources":["../../../../../../packages/components/tabs/src/tab-nav.tsx"],"sourcesContent":["import {\n  computed,\n  defineComponent,\n  inject,\n  nextTick,\n  onMounted,\n  onUpdated,\n  ref,\n  shallowRef,\n  triggerRef,\n  watch,\n} from 'vue'\nimport {\n  useDocumentVisibility,\n  useElementSize,\n  useResizeObserver,\n  useWindowFocus,\n} from '@vueuse/core'\nimport {\n  buildProps,\n  definePropType,\n  getEventCode,\n  isGreaterThan,\n  mutable,\n  rAF,\n  throwError,\n} from '@element-plus/utils'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport { ElIcon } from '@element-plus/components/icon'\nimport { ArrowLeft, ArrowRight, Close } from '@element-plus/icons-vue'\nimport { useNamespace } from '@element-plus/hooks'\nimport useWheel from '@element-plus/components/virtual-list/src/hooks/use-wheel'\nimport { clamp } from 'lodash-unified'\nimport TabBar from './tab-bar.vue'\nimport { tabsRootContextKey } from './constants'\nimport { useTabNavTouch } from './composables/use-tab-nav-touch'\n\nimport type {\n  CSSProperties,\n  ComponentPublicInstance,\n  ExtractPropTypes,\n  ExtractPublicPropTypes,\n} from 'vue'\nimport type { TabBarInstance } from './tab-bar'\nimport type { TabPaneName, TabsPaneContext } from './constants'\nimport type { Scrollable } from './composables/use-tab-nav-touch'\n\nexport const tabNavProps = buildProps({\n  panes: {\n    type: definePropType<TabsPaneContext[]>(Array),\n    default: () => mutable([] as const),\n  },\n  currentName: {\n    type: [String, Number],\n    default: '',\n  },\n  editable: Boolean,\n  type: {\n    type: String,\n    values: ['card', 'border-card', ''],\n    default: '',\n  },\n  stretch: Boolean,\n  /**\n   * @description tab-nav tabindex\n   */\n  tabindex: {\n    type: [String, Number],\n    default: undefined,\n  },\n} as const)\n\nexport const tabNavEmits = {\n  tabClick: (tab: TabsPaneContext, tabName: TabPaneName, ev: Event) =>\n    ev instanceof Event,\n  tabRemove: (tab: TabsPaneContext, ev: Event) => ev instanceof Event,\n}\n\nexport type TabNavProps = ExtractPropTypes<typeof tabNavProps>\nexport type TabNavPropsPublic = ExtractPublicPropTypes<typeof tabNavProps>\nexport type TabNavEmits = typeof tabNavEmits\n\nconst COMPONENT_NAME = 'ElTabNav'\nconst TabNav = defineComponent({\n  name: COMPONENT_NAME,\n  props: tabNavProps,\n  emits: tabNavEmits,\n  setup(props, { expose, emit }) {\n    const rootTabs = inject(tabsRootContextKey)\n    if (!rootTabs) throwError(COMPONENT_NAME, `<el-tabs><tab-nav /></el-tabs>`)\n\n    const ns = useNamespace('tabs')\n    const visibility = useDocumentVisibility()\n    const focused = useWindowFocus()\n\n    const navScroll$ = ref<HTMLDivElement>()\n    const nav$ = ref<HTMLDivElement>()\n    const el$ = ref<HTMLDivElement>()\n    const tabRefsMap = ref<{ [key: TabPaneName]: HTMLDivElement }>({})\n\n    const tabBarRef = ref<TabBarInstance>()\n\n    const scrollable = ref<false | Scrollable>(false)\n    const navOffset = ref(0)\n    const isFocus = ref(false)\n    const focusable = ref(true)\n    const isWheelScrolling = ref(false)\n    const tracker = shallowRef()\n\n    const isHorizontal = computed(() =>\n      ['top', 'bottom'].includes(rootTabs.props.tabPosition)\n    )\n\n    const sizeName = computed(() => (isHorizontal.value ? 'width' : 'height'))\n    const navStyle = computed<CSSProperties>(() => {\n      const dir = sizeName.value === 'width' ? 'X' : 'Y'\n      return {\n        transition:\n          isWheelScrolling.value || isTouchScrolling.value ? 'none' : undefined,\n        transform: `translate${dir}(-${navOffset.value}px)`,\n      }\n    })\n\n    const { width: navContainerWidth, height: navContainerHeight } =\n      useElementSize(navScroll$)\n    const { width: navWidth, height: navHeight } = useElementSize(\n      nav$,\n      { width: 0, height: 0 },\n      { box: 'border-box' }\n    )\n\n    const navContainerSize = computed(() =>\n      isHorizontal.value ? navContainerWidth.value : navContainerHeight.value\n    )\n    const navSize = computed(() =>\n      isHorizontal.value ? navWidth.value : navHeight.value\n    )\n\n    const { onWheel } = useWheel(\n      {\n        atStartEdge: computed(() => navOffset.value <= 0),\n        atEndEdge: computed(\n          () => navSize.value - navOffset.value <= navContainerSize.value\n        ),\n        layout: computed(() =>\n          isHorizontal.value ? 'horizontal' : 'vertical'\n        ),\n      },\n      (offset) => {\n        navOffset.value = clamp(\n          navOffset.value + offset,\n          0,\n          navSize.value - navContainerSize.value\n        )\n      }\n    )\n\n    const handleWheel = (event: WheelEvent) => {\n      isWheelScrolling.value = true\n      onWheel(event)\n      rAF(() => {\n        isWheelScrolling.value = false\n      })\n    }\n\n    const {\n      isTouchScrolling,\n      handleTouchStart,\n      handleTouchMove,\n      handleTouchEnd,\n    } = useTabNavTouch({\n      scrollable,\n      navOffset,\n      navSize,\n      navContainerSize,\n      isHorizontal,\n    })\n\n    const scrollPrev = () => {\n      if (!navScroll$.value) return\n\n      const containerSize =\n        navScroll$.value.getBoundingClientRect()[sizeName.value]\n      const currentOffset = navOffset.value\n\n      if (!currentOffset) return\n\n      const newOffset =\n        currentOffset > containerSize ? currentOffset - containerSize : 0\n\n      navOffset.value = newOffset\n    }\n\n    const scrollNext = () => {\n      if (!navScroll$.value || !nav$.value) return\n\n      const navSize = nav$.value.getBoundingClientRect()[sizeName.value]\n      const containerSize =\n        navScroll$.value.getBoundingClientRect()[sizeName.value]\n      const currentOffset = navOffset.value\n\n      if (!isGreaterThan(navSize - currentOffset, containerSize)) return\n\n      const newOffset =\n        navSize - currentOffset > containerSize * 2\n          ? currentOffset + containerSize\n          : navSize - containerSize\n\n      navOffset.value = newOffset\n    }\n\n    const scrollToActiveTab = async () => {\n      const nav = nav$.value\n      if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return\n\n      await nextTick()\n\n      const activeTab = tabRefsMap.value[props.currentName]\n      if (!activeTab) return\n\n      const navScroll = navScroll$.value\n\n      const activeTabBounding = activeTab.getBoundingClientRect()\n      const navScrollBounding = navScroll.getBoundingClientRect()\n      // nav has a 1px border width\n      const navScrollLeft = navScrollBounding.left + 1\n      const navScrollRight = navScrollBounding.right - 1\n      const navBounding = nav.getBoundingClientRect()\n      const maxOffset = isHorizontal.value\n        ? navBounding.width - navScrollBounding.width\n        : navBounding.height - navScrollBounding.height\n      const currentOffset = navOffset.value\n      let newOffset = currentOffset\n\n      if (isHorizontal.value) {\n        if (activeTabBounding.left < navScrollLeft) {\n          newOffset = currentOffset - (navScrollLeft - activeTabBounding.left)\n        }\n        if (activeTabBounding.right > navScrollRight) {\n          newOffset = currentOffset + activeTabBounding.right - navScrollRight\n        }\n      } else {\n        if (activeTabBounding.top < navScrollBounding.top) {\n          newOffset =\n            currentOffset - (navScrollBounding.top - activeTabBounding.top)\n        }\n        if (activeTabBounding.bottom > navScrollBounding.bottom) {\n          newOffset =\n            currentOffset +\n            (activeTabBounding.bottom - navScrollBounding.bottom)\n        }\n      }\n      newOffset = Math.max(newOffset, 0)\n      navOffset.value = Math.min(newOffset, maxOffset)\n    }\n\n    const update = () => {\n      if (!nav$.value || !navScroll$.value) return\n\n      props.stretch && tabBarRef.value?.update()\n\n      const navSize = nav$.value.getBoundingClientRect()[sizeName.value]\n      const containerSize =\n        navScroll$.value.getBoundingClientRect()[sizeName.value]\n      const currentOffset = navOffset.value\n\n      if (containerSize < navSize) {\n        scrollable.value = scrollable.value || {}\n        scrollable.value.prev = currentOffset\n        scrollable.value.next = isGreaterThan(\n          navSize,\n          currentOffset + containerSize\n        )\n        if (isGreaterThan(containerSize, navSize - currentOffset)) {\n          navOffset.value = navSize - containerSize\n        }\n      } else {\n        scrollable.value = false\n        if (currentOffset > 0) {\n          navOffset.value = 0\n        }\n      }\n    }\n\n    const changeTab = (event: KeyboardEvent) => {\n      const code = getEventCode(event)\n      let step = 0\n\n      switch (code) {\n        case EVENT_CODE.left:\n        case EVENT_CODE.up:\n          step = -1\n          break\n        case EVENT_CODE.right:\n        case EVENT_CODE.down:\n          step = 1\n          break\n        default:\n          return\n      }\n\n      const tabList = Array.from(\n        (\n          event.currentTarget as HTMLDivElement\n        ).querySelectorAll<HTMLDivElement>('[role=tab]:not(.is-disabled)')\n      )\n      const currentIndex = tabList.indexOf(event.target as HTMLDivElement)\n      let nextIndex = currentIndex + step\n\n      if (nextIndex < 0) {\n        nextIndex = tabList.length - 1\n      } else if (nextIndex >= tabList.length) {\n        nextIndex = 0\n      }\n\n      tabList[nextIndex].focus({ preventScroll: true }) // 改变焦点元素\n      tabList[nextIndex].click() // 选中下一个tab\n      setFocus()\n    }\n\n    const setFocus = () => {\n      if (focusable.value) isFocus.value = true\n    }\n    const removeFocus = () => (isFocus.value = false)\n\n    const setRefs = (\n      el: Element | ComponentPublicInstance | null,\n      key: TabPaneName\n    ) => {\n      tabRefsMap.value[key] = el as HTMLDivElement\n    }\n\n    const focusActiveTab = async () => {\n      await nextTick()\n\n      const activeTab = tabRefsMap.value[props.currentName]\n      activeTab?.focus({ preventScroll: true })\n    }\n\n    watch(visibility, (visibility) => {\n      if (visibility === 'hidden') {\n        focusable.value = false\n      } else if (visibility === 'visible') {\n        setTimeout(() => (focusable.value = true), 50)\n      }\n    })\n    watch(focused, (focused) => {\n      if (focused) {\n        setTimeout(() => (focusable.value = true), 50)\n      } else {\n        focusable.value = false\n      }\n    })\n\n    useResizeObserver(el$, () => {\n      rAF(update)\n    })\n\n    onMounted(() => setTimeout(() => scrollToActiveTab(), 0))\n    onUpdated(() => update())\n\n    expose({\n      scrollToActiveTab,\n      removeFocus,\n      focusActiveTab,\n      tabListRef: nav$,\n      tabBarRef,\n      scheduleRender: () => triggerRef(tracker),\n    })\n\n    return () => {\n      const scrollBtn = scrollable.value\n        ? [\n            <span\n              class={[\n                ns.e('nav-prev'),\n                ns.is('disabled', !scrollable.value.prev),\n              ]}\n              onClick={scrollPrev}\n            >\n              <ElIcon>\n                <ArrowLeft />\n              </ElIcon>\n            </span>,\n            <span\n              class={[\n                ns.e('nav-next'),\n                ns.is('disabled', !scrollable.value.next),\n              ]}\n              onClick={scrollNext}\n            >\n              <ElIcon>\n                <ArrowRight />\n              </ElIcon>\n            </span>,\n          ]\n        : null\n\n      const tabs = props.panes.map((pane, index) => {\n        const uid = pane.uid\n        const disabled = pane.props.disabled\n        const tabName = pane.props.name ?? pane.index ?? `${index}`\n        const closable =\n          !disabled &&\n          (pane.isClosable || (pane.props.closable !== false && props.editable))\n        pane.index = `${index}`\n\n        const btnClose = closable ? (\n          <ElIcon\n            class=\"is-icon-close\"\n            // `onClick` not exist when generate dts\n\n            // @ts-ignore\n            onClick={(ev: MouseEvent) => emit('tabRemove', pane, ev)}\n          >\n            <Close />\n          </ElIcon>\n        ) : null\n\n        const tabLabelContent = pane.slots.label?.() || pane.props.label\n        const tabindex =\n          !disabled && pane.active\n            ? (props.tabindex ?? rootTabs.props.tabindex)\n            : -1\n\n        return (\n          <div\n            ref={(el) => setRefs(el, tabName)}\n            class={[\n              ns.e('item'),\n              ns.is(rootTabs.props.tabPosition),\n              ns.is('active', pane.active),\n              ns.is('disabled', disabled),\n              ns.is('closable', closable),\n              ns.is('focus', isFocus.value),\n            ]}\n            id={`tab-${tabName}`}\n            key={`tab-${uid}`}\n            aria-controls={`pane-${tabName}`}\n            role=\"tab\"\n            aria-selected={pane.active}\n            tabindex={tabindex}\n            onFocus={() => setFocus()}\n            onBlur={() => removeFocus()}\n            onClick={(ev: MouseEvent) => {\n              removeFocus()\n              emit('tabClick', pane, tabName, ev)\n            }}\n            onKeydown={(ev: KeyboardEvent) => {\n              const code = getEventCode(ev)\n              if (\n                closable &&\n                (code === EVENT_CODE.delete || code === EVENT_CODE.backspace)\n              ) {\n                emit('tabRemove', pane, ev)\n              }\n            }}\n          >\n            {...[tabLabelContent, btnClose]}\n          </div>\n        )\n      })\n\n      // By tracking the value property, we can schedule a job to re-render `TabNav` when needed.\n      // Unlike `instance.update`, the scheduler ensures the job is queued only once even if we trigger it multiple times.\n      tracker.value\n\n      return (\n        <div\n          ref={el$}\n          class={[\n            ns.e('nav-wrap'),\n            ns.is('scrollable', !!scrollable.value),\n            ns.is(rootTabs.props.tabPosition),\n          ]}\n        >\n          {scrollBtn}\n          <div class={ns.e('nav-scroll')} ref={navScroll$}>\n            {props.panes.length > 0 ? (\n              <div\n                class={[\n                  ns.e('nav'),\n                  ns.is(rootTabs.props.tabPosition),\n                  ns.is(\n                    'stretch',\n                    props.stretch &&\n                      ['top', 'bottom'].includes(rootTabs.props.tabPosition)\n                  ),\n                ]}\n                ref={nav$}\n                style={navStyle.value}\n                role=\"tablist\"\n                onKeydown={changeTab}\n                onWheel={handleWheel}\n                onTouchstart={handleTouchStart}\n                onTouchmove={handleTouchMove}\n                onTouchend={handleTouchEnd}\n                onTouchcancel={handleTouchEnd}\n              >\n                {...[\n                  !props.type ? (\n                    <TabBar\n                      ref={tabBarRef}\n                      tabs={[...props.panes]}\n                      tabRefs={tabRefsMap.value}\n                    />\n                  ) : null,\n                  tabs,\n                ]}\n              </div>\n            ) : null}\n          </div>\n        </div>\n      )\n    }\n  },\n})\n\nexport type TabNavInstance = InstanceType<typeof TabNav> & {\n  scrollToActiveTab: () => Promise<void>\n  removeFocus: () => void\n  focusActiveTab: () => void\n  scheduleRender: () => void\n  tabListRef: HTMLDivElement | undefined\n  tabBarRef: TabBarInstance | undefined\n}\n\nexport default TabNav\n"],"mappings":"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"}