c8a758067321e7c88147a6655706c7077b38de9bd4d6cc45f008b6e60cb37c3e70bb76b0a1ca259b18ad6cec546db2093acfa6789f7e4a89a44ae8ab4b9110 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { defineComponent, inject, ref, watch, nextTick, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, unref, normalizeStyle } from 'vue';
  2. import { useResizeObserver } from '@vueuse/core';
  3. import { tabsRootContextKey } from './constants.mjs';
  4. import { tabBarProps } from './tab-bar.mjs';
  5. import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
  6. import { capitalize } from '../../../utils/strings.mjs';
  7. import { throwError } from '../../../utils/error.mjs';
  8. import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
  9. import { isUndefined } from '../../../utils/types.mjs';
  10. const COMPONENT_NAME = "ElTabBar";
  11. const __default__ = defineComponent({
  12. name: COMPONENT_NAME
  13. });
  14. const _sfc_main = /* @__PURE__ */ defineComponent({
  15. ...__default__,
  16. props: tabBarProps,
  17. setup(__props, { expose }) {
  18. const props = __props;
  19. const rootTabs = inject(tabsRootContextKey);
  20. if (!rootTabs)
  21. throwError(COMPONENT_NAME, "<el-tabs><el-tab-bar /></el-tabs>");
  22. const ns = useNamespace("tabs");
  23. const barRef = ref();
  24. const barStyle = ref();
  25. const getBarStyle = () => {
  26. let offset = 0;
  27. let tabSize = 0;
  28. const sizeName = ["top", "bottom"].includes(rootTabs.props.tabPosition) ? "width" : "height";
  29. const sizeDir = sizeName === "width" ? "x" : "y";
  30. const position = sizeDir === "x" ? "left" : "top";
  31. props.tabs.every((tab) => {
  32. if (isUndefined(tab.paneName))
  33. return false;
  34. const $el = props.tabRefs[tab.paneName];
  35. if (!$el)
  36. return false;
  37. if (!tab.active) {
  38. return true;
  39. }
  40. offset = $el[`offset${capitalize(position)}`];
  41. tabSize = $el[`client${capitalize(sizeName)}`];
  42. const tabStyles = window.getComputedStyle($el);
  43. if (sizeName === "width") {
  44. tabSize -= Number.parseFloat(tabStyles.paddingLeft) + Number.parseFloat(tabStyles.paddingRight);
  45. offset += Number.parseFloat(tabStyles.paddingLeft);
  46. }
  47. return false;
  48. });
  49. return {
  50. [sizeName]: `${tabSize}px`,
  51. transform: `translate${capitalize(sizeDir)}(${offset}px)`
  52. };
  53. };
  54. const update = () => barStyle.value = getBarStyle();
  55. const tabObservers = [];
  56. const observerTabs = () => {
  57. tabObservers.forEach((observer) => observer.stop());
  58. tabObservers.length = 0;
  59. Object.values(props.tabRefs).forEach((tab) => {
  60. tabObservers.push(useResizeObserver(tab, update));
  61. });
  62. };
  63. watch(() => props.tabs, async () => {
  64. await nextTick();
  65. update();
  66. observerTabs();
  67. }, { immediate: true });
  68. const barObserver = useResizeObserver(barRef, () => update());
  69. onBeforeUnmount(() => {
  70. tabObservers.forEach((observer) => observer.stop());
  71. tabObservers.length = 0;
  72. barObserver.stop();
  73. });
  74. expose({
  75. ref: barRef,
  76. update
  77. });
  78. return (_ctx, _cache) => {
  79. return openBlock(), createElementBlock("div", {
  80. ref_key: "barRef",
  81. ref: barRef,
  82. class: normalizeClass([unref(ns).e("active-bar"), unref(ns).is(unref(rootTabs).props.tabPosition)]),
  83. style: normalizeStyle(barStyle.value)
  84. }, null, 6);
  85. };
  86. }
  87. });
  88. var TabBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "tab-bar.vue"]]);
  89. export { TabBar as default };
  90. //# sourceMappingURL=tab-bar2.mjs.map