tab-bar2.js 3.8 KB

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