You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

0 lines
31 KiB

1 month ago
  1. {"ast":null,"code":"import { defineComponent, inject, ref, computed, watch, onMounted, onUpdated, createVNode, nextTick } from 'vue';\nimport { useDocumentVisibility, useWindowFocus, useResizeObserver } from '@vueuse/core';\nimport { ElIcon } from '../../icon/index.mjs';\nimport { ArrowLeft, ArrowRight, Close } from '@element-plus/icons-vue';\nimport TabBar from './tab-bar2.mjs';\nimport { tabsRootContextKey } from './constants.mjs';\nimport { buildProps, definePropType } from '../../../utils/vue/props/runtime.mjs';\nimport { mutable } from '../../../utils/typescript.mjs';\nimport { throwError } from '../../../utils/error.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\nimport { EVENT_CODE } from '../../../constants/aria.mjs';\nimport { capitalize } from '../../../utils/strings.mjs';\nconst tabNavProps = buildProps({\n panes: {\n type: definePropType(Array),\n default: () => mutable([])\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});\nconst tabNavEmits = {\n tabClick: (tab, tabName, ev) => ev instanceof Event,\n tabRemove: (tab, ev) => ev instanceof Event\n};\nconst COMPONENT_NAME = \"ElTabNav\";\nconst TabNav = defineComponent({\n name: COMPONENT_NAME,\n props: tabNavProps,\n emits: tabNavEmits,\n setup(props, {\n expose,\n emit\n }) {\n const rootTabs = inject(tabsRootContextKey);\n if (!rootTabs) throwError(COMPONENT_NAME, `<el-tabs><tab-nav /></el-tabs>`);\n const ns = useNamespace(\"tabs\");\n const visibility = useDocumentVisibility();\n const focused = useWindowFocus();\n const navScroll$ = ref();\n const nav$ = ref();\n const el$ = ref();\n const tabBarRef = ref();\n const scrollable = ref(false);\n const navOffset = ref(0);\n const isFocus = ref(false);\n const focusable = ref(true);\n const sizeName = computed(() => [\"top\", \"bottom\"].includes(rootTabs.props.tabPosition) ? \"width\" : \"height\");\n const navStyle = computed(() => {\n const dir = sizeName.value === \"width\" ? \"X\" : \"Y\";\n return {\n transform: `translate${dir}(-${navOffset.value}px)`\n };\n });\n const scrollPrev = () => {\n if (!navScroll$.value) return;\n const containerSize = navScroll$.value[`offset${capitalize(sizeName.value)}`];\n const currentOffset = navOffset.value;\n if (!currentOffset) return;\n const newOffset = currentOffset > containerSize ? currentOffset - containerSize : 0;\n navOffset.value = newOffset;\n };\n const scrollNext = () => {\n if (!navScroll$.value || !nav$.value) return;\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`];\n const containerSize = navScroll$.value[`offset${capitalize(sizeName.value)}`];\n const currentOffset = navOffset.value;\n if (navSize - currentOffset <= containerSize) return;\n const newOffset = navSize - currentOffset > containerSize * 2 ? currentOffset + containerSize : navSize - containerSize;\n navOffset.value = newOffset;\n };\n const scrollToActiveTab = async () => {\n const nav = nav$.value;\n if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return;\n await nextTick();\n const activeTab = el$.value.querySelector(\".is-active\");\n if (!activeTab) return;\n const navScroll = navScroll$.value;\n const isHorizontal = [\"top\", \"bottom\"].includes(rootTabs.props.tabPosition);\n const activeTabBounding = activeTab.getBoundingClientRect();\n const navScrollBounding = navScroll.getBoundingClientRect();\n const maxOffset = isHorizontal ? nav.offsetWidth - navScrollBounding.width : nav.offsetHeight - navScrollBounding.height;\n const currentOffset = navOffset.value;\n let newOffset = currentOffset;\n if (isHorizontal) {\n if (activeTabBounding.left < navScrollBounding.left) {\n newOffset = currentOffs