tab-bar2.mjs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { defineComponent, getCurrentInstance, 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 { throwError } from '../../../utils/error.mjs';
  7. import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
  8. import { capitalize } from '../../../utils/strings.mjs';
  9. const COMPONENT_NAME = "ElTabBar";
  10. const __default__ = defineComponent({
  11. name: COMPONENT_NAME
  12. });
  13. const _sfc_main = /* @__PURE__ */ defineComponent({
  14. ...__default__,
  15. props: tabBarProps,
  16. setup(__props, { expose }) {
  17. const props = __props;
  18. const instance = getCurrentInstance();
  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. var _a, _b;
  33. const $el = (_b = (_a = instance.parent) == null ? void 0 : _a.refs) == null ? void 0 : _b[`tab-${tab.uid}`];
  34. if (!$el)
  35. return false;
  36. if (!tab.active) {
  37. return true;
  38. }
  39. offset = $el[`offset${capitalize(position)}`];
  40. tabSize = $el[`client${capitalize(sizeName)}`];
  41. const tabStyles = window.getComputedStyle($el);
  42. if (sizeName === "width") {
  43. tabSize -= Number.parseFloat(tabStyles.paddingLeft) + Number.parseFloat(tabStyles.paddingRight);
  44. offset += Number.parseFloat(tabStyles.paddingLeft);
  45. }
  46. return false;
  47. });
  48. return {
  49. [sizeName]: `${tabSize}px`,
  50. transform: `translate${capitalize(sizeDir)}(${offset}px)`
  51. };
  52. };
  53. const update = () => barStyle.value = getBarStyle();
  54. const saveObserver = [];
  55. const observerTabs = () => {
  56. var _a;
  57. saveObserver.forEach((observer) => observer.stop());
  58. saveObserver.length = 0;
  59. const list = (_a = instance.parent) == null ? void 0 : _a.refs;
  60. if (!list)
  61. return;
  62. for (const key in list) {
  63. if (key.startsWith("tab-")) {
  64. const _el = list[key];
  65. if (_el) {
  66. saveObserver.push(useResizeObserver(_el, update));
  67. }
  68. }
  69. }
  70. };
  71. watch(() => props.tabs, async () => {
  72. await nextTick();
  73. update();
  74. observerTabs();
  75. }, { immediate: true });
  76. const barObserever = useResizeObserver(barRef, () => update());
  77. onBeforeUnmount(() => {
  78. saveObserver.forEach((observer) => observer.stop());
  79. saveObserver.length = 0;
  80. barObserever.stop();
  81. });
  82. expose({
  83. ref: barRef,
  84. update
  85. });
  86. return (_ctx, _cache) => {
  87. return openBlock(), createElementBlock("div", {
  88. ref_key: "barRef",
  89. ref: barRef,
  90. class: normalizeClass([unref(ns).e("active-bar"), unref(ns).is(unref(rootTabs).props.tabPosition)]),
  91. style: normalizeStyle(barStyle.value)
  92. }, null, 6);
  93. };
  94. }
  95. });
  96. var TabBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "tab-bar.vue"]]);
  97. export { TabBar as default };
  98. //# sourceMappingURL=tab-bar2.mjs.map