element-plus
Version:
A Component Library for Vue 3
1 lines • 24.9 kB
Source Map (JSON)
{"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","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","transform","width","navContainerWidth","height","navContainerHeight","navWidth","navHeight","box","navContainerSize","navSize","onWheel","atStartEdge","atEndEdge","layout","offset","handleWheel","event","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'\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'\n\ninterface Scrollable {\n next?: boolean\n prev?: number\n}\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: isWheelScrolling.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 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 >\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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"}