123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import { defineComponent, getCurrentInstance, inject, ref, watch, nextTick, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, unref, normalizeStyle } from 'vue';
- import { useResizeObserver } from '@vueuse/core';
- import { tabsRootContextKey } from './constants.mjs';
- import { tabBarProps } from './tab-bar.mjs';
- import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
- import { throwError } from '../../../utils/error.mjs';
- import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
- import { capitalize } from '../../../utils/strings.mjs';
- const COMPONENT_NAME = "ElTabBar";
- const __default__ = defineComponent({
- name: COMPONENT_NAME
- });
- const _sfc_main = /* @__PURE__ */ defineComponent({
- ...__default__,
- props: tabBarProps,
- setup(__props, { expose }) {
- const props = __props;
- const instance = getCurrentInstance();
- const rootTabs = inject(tabsRootContextKey);
- if (!rootTabs)
- throwError(COMPONENT_NAME, "<el-tabs><el-tab-bar /></el-tabs>");
- const ns = useNamespace("tabs");
- const barRef = ref();
- const barStyle = ref();
- const getBarStyle = () => {
- let offset = 0;
- let tabSize = 0;
- const sizeName = ["top", "bottom"].includes(rootTabs.props.tabPosition) ? "width" : "height";
- const sizeDir = sizeName === "width" ? "x" : "y";
- const position = sizeDir === "x" ? "left" : "top";
- props.tabs.every((tab) => {
- var _a, _b;
- const $el = (_b = (_a = instance.parent) == null ? void 0 : _a.refs) == null ? void 0 : _b[`tab-${tab.uid}`];
- if (!$el)
- return false;
- if (!tab.active) {
- return true;
- }
- offset = $el[`offset${capitalize(position)}`];
- tabSize = $el[`client${capitalize(sizeName)}`];
- const tabStyles = window.getComputedStyle($el);
- if (sizeName === "width") {
- tabSize -= Number.parseFloat(tabStyles.paddingLeft) + Number.parseFloat(tabStyles.paddingRight);
- offset += Number.parseFloat(tabStyles.paddingLeft);
- }
- return false;
- });
- return {
- [sizeName]: `${tabSize}px`,
- transform: `translate${capitalize(sizeDir)}(${offset}px)`
- };
- };
- const update = () => barStyle.value = getBarStyle();
- const saveObserver = [];
- const observerTabs = () => {
- var _a;
- saveObserver.forEach((observer) => observer.stop());
- saveObserver.length = 0;
- const list = (_a = instance.parent) == null ? void 0 : _a.refs;
- if (!list)
- return;
- for (const key in list) {
- if (key.startsWith("tab-")) {
- const _el = list[key];
- if (_el) {
- saveObserver.push(useResizeObserver(_el, update));
- }
- }
- }
- };
- watch(() => props.tabs, async () => {
- await nextTick();
- update();
- observerTabs();
- }, { immediate: true });
- const barObserever = useResizeObserver(barRef, () => update());
- onBeforeUnmount(() => {
- saveObserver.forEach((observer) => observer.stop());
- saveObserver.length = 0;
- barObserever.stop();
- });
- expose({
- ref: barRef,
- update
- });
- return (_ctx, _cache) => {
- return openBlock(), createElementBlock("div", {
- ref_key: "barRef",
- ref: barRef,
- class: normalizeClass([unref(ns).e("active-bar"), unref(ns).is(unref(rootTabs).props.tabPosition)]),
- style: normalizeStyle(barStyle.value)
- }, null, 6);
- };
- }
- });
- var TabBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "tab-bar.vue"]]);
- export { TabBar as default };
- //# sourceMappingURL=tab-bar2.mjs.map
|