bkui-vue 3.0.2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -3,5 +3,5 @@ export * from './hooks';
3
3
  export { default } from './preset';
4
4
  export * from './config-provider';
5
5
  export * from './directives';
6
- export const version = "3.0.2";
6
+ export const version = "3.0.3";
7
7
  window.__bkui_vue_version__ = version;
@@ -1,4 +1,5 @@
1
- import { ExtractPropTypes, PropType, VNode } from 'vue';
1
+ import { ComputedRef, ExtractPropTypes, InjectionKey, PropType, VNode } from 'vue';
2
+ export declare const tabActiveInjectionKey: InjectionKey<ComputedRef<number | string>>;
2
3
  export declare enum TabTypeEnum {
3
4
  BORDER_CARD = "border-card",
4
5
  CARD = "card",
@@ -69,11 +70,7 @@ export declare const tabPanelProps: {
69
70
  name: import("vue-types").VueTypeDef<string | number> & {
70
71
  default: string | number;
71
72
  };
72
- label: (import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
73
- default: string;
74
- }) | (import("vue-types").VueTypeValidableDef<(...args: any[]) => any, import("vue-types/dist/shared/vue-types.d8e57a80").b<(...args: any[]) => any>> & {
75
- default: (...args: any[]) => any;
76
- });
73
+ label: import("vue-types").VueTypeDef<any>;
77
74
  tips: import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
78
75
  default: string;
79
76
  };
@@ -86,11 +83,7 @@ export declare const tabPanelProps: {
86
83
  renderDirective: import("vue-types").VueTypeValidableDef<"if" | "show", import("vue-types/dist/shared/vue-types.d8e57a80").b<"if" | "show">> & {
87
84
  default: "if" | "show";
88
85
  };
89
- panel: (import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
90
- default: string;
91
- }) | (import("vue-types").VueTypeValidableDef<(...args: any[]) => any, import("vue-types/dist/shared/vue-types.d8e57a80").b<(...args: any[]) => any>> & {
92
- default: (...args: any[]) => any;
93
- });
86
+ panel: import("vue-types").VueTypeDef<any>;
94
87
  num: import("vue-types").VueTypeValidableDef<number, import("vue-types/dist/shared/vue-types.d8e57a80").b<number>> & {
95
88
  default: number;
96
89
  } & {
@@ -1,12 +1,9 @@
1
+ import { ComputedRef } from 'vue';
1
2
  declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
2
3
  name: import("vue-types").VueTypeDef<string | number> & {
3
4
  default: string | number;
4
5
  };
5
- label: (import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
6
- default: string;
7
- }) | (import("vue-types").VueTypeValidableDef<(...args: any[]) => any, import("vue-types/dist/shared/vue-types.d8e57a80").b<(...args: any[]) => any>> & {
8
- default: (...args: any[]) => any;
9
- });
6
+ label: import("vue-types").VueTypeDef<any>;
10
7
  tips: import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
11
8
  default: string;
12
9
  };
@@ -19,11 +16,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
19
16
  renderDirective: import("vue-types").VueTypeValidableDef<"if" | "show", import("vue-types/dist/shared/vue-types.d8e57a80").b<"if" | "show">> & {
20
17
  default: "if" | "show";
21
18
  };
22
- panel: (import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
23
- default: string;
24
- }) | (import("vue-types").VueTypeValidableDef<(...args: any[]) => any, import("vue-types/dist/shared/vue-types.d8e57a80").b<(...args: any[]) => any>> & {
25
- default: (...args: any[]) => any;
26
- });
19
+ panel: import("vue-types").VueTypeDef<any>;
27
20
  num: import("vue-types").VueTypeValidableDef<number, import("vue-types/dist/shared/vue-types.d8e57a80").b<number>> & {
28
21
  default: number;
29
22
  } & {
@@ -34,15 +27,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
34
27
  } & {
35
28
  default: string;
36
29
  };
37
- }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
30
+ }>, {
31
+ tabActive: ComputedRef<string | number>;
32
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
38
33
  name: import("vue-types").VueTypeDef<string | number> & {
39
34
  default: string | number;
40
35
  };
41
- label: (import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
42
- default: string;
43
- }) | (import("vue-types").VueTypeValidableDef<(...args: any[]) => any, import("vue-types/dist/shared/vue-types.d8e57a80").b<(...args: any[]) => any>> & {
44
- default: (...args: any[]) => any;
45
- });
36
+ label: import("vue-types").VueTypeDef<any>;
46
37
  tips: import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
47
38
  default: string;
48
39
  };
@@ -55,11 +46,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
55
46
  renderDirective: import("vue-types").VueTypeValidableDef<"if" | "show", import("vue-types/dist/shared/vue-types.d8e57a80").b<"if" | "show">> & {
56
47
  default: "if" | "show";
57
48
  };
58
- panel: (import("vue-types").VueTypeValidableDef<string, import("vue-types/dist/shared/vue-types.d8e57a80").b<string>> & {
59
- default: string;
60
- }) | (import("vue-types").VueTypeValidableDef<(...args: any[]) => any, import("vue-types/dist/shared/vue-types.d8e57a80").b<(...args: any[]) => any>> & {
61
- default: (...args: any[]) => any;
62
- });
49
+ panel: import("vue-types").VueTypeDef<any>;
63
50
  num: import("vue-types").VueTypeValidableDef<number, import("vue-types/dist/shared/vue-types.d8e57a80").b<number>> & {
64
51
  default: number;
65
52
  } & {
@@ -72,11 +59,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
72
59
  };
73
60
  }>> & Readonly<{}>, {
74
61
  name: string | number;
75
- label: string | ((...args: any[]) => any);
76
62
  visible: boolean;
77
63
  renderDirective: "if" | "show";
78
64
  tips: string;
79
- panel: string | ((...args: any[]) => any);
80
65
  num: number;
81
66
  numDisplayType: string;
82
67
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
package/lib/tab/index.js CHANGED
@@ -2,7 +2,7 @@ import "../styles/reset.css";
2
2
  import "./tab.less";
3
3
  import { PropTypes as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__, bkZIndexManager as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_bkZIndexManager__, renderDirectiveType as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_renderDirectiveType__, resolveClassName as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_resolveClassName__, withInstallProps as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_withInstallProps__ } from "../shared";
4
4
  import { toType as __WEBPACK_EXTERNAL_MODULE_vue_types_22de060a_toType__ } from "vue-types";
5
- import { Fragment as __WEBPACK_EXTERNAL_MODULE_vue_Fragment__, computed as __WEBPACK_EXTERNAL_MODULE_vue_computed__, createVNode as __WEBPACK_EXTERNAL_MODULE_vue_createVNode__, defineComponent as __WEBPACK_EXTERNAL_MODULE_vue_defineComponent__, getCurrentInstance as __WEBPACK_EXTERNAL_MODULE_vue_getCurrentInstance__, h as __WEBPACK_EXTERNAL_MODULE_vue_h__, nextTick as __WEBPACK_EXTERNAL_MODULE_vue_nextTick__, onMounted as __WEBPACK_EXTERNAL_MODULE_vue_onMounted__, onUpdated as __WEBPACK_EXTERNAL_MODULE_vue_onUpdated__, ref as __WEBPACK_EXTERNAL_MODULE_vue_ref__, render as __WEBPACK_EXTERNAL_MODULE_vue_render__, resolveDirective as __WEBPACK_EXTERNAL_MODULE_vue_resolveDirective__, vShow as __WEBPACK_EXTERNAL_MODULE_vue_vShow__, withDirectives as __WEBPACK_EXTERNAL_MODULE_vue_withDirectives__ } from "vue";
5
+ import { Fragment as __WEBPACK_EXTERNAL_MODULE_vue_Fragment__, computed as __WEBPACK_EXTERNAL_MODULE_vue_computed__, createVNode as __WEBPACK_EXTERNAL_MODULE_vue_createVNode__, defineComponent as __WEBPACK_EXTERNAL_MODULE_vue_defineComponent__, getCurrentInstance as __WEBPACK_EXTERNAL_MODULE_vue_getCurrentInstance__, h as __WEBPACK_EXTERNAL_MODULE_vue_h__, inject as __WEBPACK_EXTERNAL_MODULE_vue_inject__, nextTick as __WEBPACK_EXTERNAL_MODULE_vue_nextTick__, onBeforeUnmount as __WEBPACK_EXTERNAL_MODULE_vue_onBeforeUnmount__, onMounted as __WEBPACK_EXTERNAL_MODULE_vue_onMounted__, onUpdated as __WEBPACK_EXTERNAL_MODULE_vue_onUpdated__, provide as __WEBPACK_EXTERNAL_MODULE_vue_provide__, ref as __WEBPACK_EXTERNAL_MODULE_vue_ref__, render as __WEBPACK_EXTERNAL_MODULE_vue_render__, resolveDirective as __WEBPACK_EXTERNAL_MODULE_vue_resolveDirective__, vShow as __WEBPACK_EXTERNAL_MODULE_vue_vShow__, watch as __WEBPACK_EXTERNAL_MODULE_vue_watch__, withDirectives as __WEBPACK_EXTERNAL_MODULE_vue_withDirectives__ } from "vue";
6
6
  import { usePrefix as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__ } from "../config-provider";
7
7
  import "../popover";
8
8
  import { createPopper as __WEBPACK_EXTERNAL_MODULE__popperjs_core_a5c7319c_createPopper__ } from "@popperjs/core";
@@ -714,7 +714,9 @@ function _defineProperty(e, r, t) {
714
714
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
715
715
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
716
716
 
717
-
717
+ // Tab 通过 provide 向下注入当前激活面板的 name,TabPanel 通过 inject 获取,
718
+ // 避免依赖 this.$parent 这种与组件层级强耦合的写法。
719
+ var tabActiveInjectionKey = Symbol('tabActive');
718
720
  var TabTypeEnum;
719
721
  (function (TabTypeEnum) {
720
722
  TabTypeEnum["BORDER_CARD"] = "border-card";
@@ -805,14 +807,14 @@ var tabEventProps = (/* unused pure expression or super */ null && ({
805
807
  }));
806
808
  var tabPanelProps = {
807
809
  name: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.oneOfType([__WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.number, __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string]).def(''),
808
- label: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string || __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.func,
810
+ label: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.oneOfType([__WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string, __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.func]),
809
811
  tips: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string,
810
812
  closable: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.bool,
811
813
  visible: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.bool.def(true),
812
814
  disabled: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.bool,
813
815
  sortable: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.bool,
814
816
  renderDirective: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_renderDirectiveType__(),
815
- panel: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string || __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.func,
817
+ panel: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.oneOfType([__WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string, __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.func]),
816
818
  num: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.number.def(undefined),
817
819
  numDisplayType: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.string.def('default')
818
820
  };
@@ -1557,15 +1559,19 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1557
1559
  props: tabNavProps,
1558
1560
  setup: function setup(props) {
1559
1561
  var activeRef = __WEBPACK_EXTERNAL_MODULE_vue_ref__(null);
1560
- var activeBarStyle = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
1561
- var initStyle = {
1562
- width: 0,
1563
- height: 0,
1564
- bottom: 0,
1565
- left: 0
1566
- };
1562
+ // 激活条位置依赖 DOM clientWidth/offsetLeft 等非响应式量,computed 无法在
1563
+ // label 内容(宽度)变化但激活项不变时重算。改为 ref + 主动测量,并在 DOM
1564
+ // 更新后/激活项尺寸变化时刷新。
1565
+ var initBarStyle = {
1566
+ width: 0,
1567
+ height: 0,
1568
+ bottom: 0,
1569
+ left: 0
1570
+ };
1571
+ var activeBarStyle = __WEBPACK_EXTERNAL_MODULE_vue_ref__(tab_nav_objectSpread({}, initBarStyle));
1572
+ var calcActiveBarStyle = function calcActiveBarStyle() {
1567
1573
  if (!activeRef.value) {
1568
- return initStyle;
1574
+ return tab_nav_objectSpread({}, initBarStyle);
1569
1575
  }
1570
1576
  var positionArr = [PositionEnum.LEFT, PositionEnum.RIGHT];
1571
1577
  if (positionArr.includes(props.tabPosition)) {
@@ -1597,18 +1603,45 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1597
1603
  background: props.activeBarColor
1598
1604
  };
1599
1605
  }
1600
- return initStyle;
1606
+ return tab_nav_objectSpread({}, initBarStyle);
1607
+ };
1608
+ var updateActiveBarStyle = function updateActiveBarStyle() {
1609
+ var next = calcActiveBarStyle();
1610
+ // 仅在确有变化时赋值,避免无意义的重渲染
1611
+ if (JSON.stringify(next) !== JSON.stringify(activeBarStyle.value)) {
1612
+ activeBarStyle.value = next;
1613
+ }
1614
+ };
1615
+ // 观察激活项自身尺寸变化(label 长度变化、字体异步加载、容器缩放等)
1616
+ var barResizeObserver = null;
1617
+ var observeActiveBar = function observeActiveBar() {
1618
+ var _barResizeObserver;
1619
+ (_barResizeObserver = barResizeObserver) === null || _barResizeObserver === void 0 || _barResizeObserver.disconnect();
1620
+ if (typeof ResizeObserver !== 'undefined' && activeRef.value) {
1621
+ barResizeObserver = new ResizeObserver(function () {
1622
+ return updateActiveBarStyle();
1623
+ });
1624
+ barResizeObserver.observe(activeRef.value);
1625
+ }
1626
+ };
1627
+ __WEBPACK_EXTERNAL_MODULE_vue_onMounted__(function () {
1628
+ observeActiveBar();
1629
+ updateActiveBarStyle();
1630
+ });
1631
+ __WEBPACK_EXTERNAL_MODULE_vue_onBeforeUnmount__(function () {
1632
+ var _barResizeObserver2;
1633
+ (_barResizeObserver2 = barResizeObserver) === null || _barResizeObserver2 === void 0 || _barResizeObserver2.disconnect();
1634
+ barResizeObserver = null;
1601
1635
  });
1602
1636
  var tableNavList = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
1603
1637
  if (!Array.isArray(props.panels) || !props.panels.length) {
1604
1638
  return [];
1605
1639
  }
1606
1640
  var list = [];
1607
- var hasFindActive = false;
1608
1641
  var panels = props.panels;
1609
- panels.filter(function (item, index) {
1642
+ panels.forEach(function (item, index) {
1610
1643
  if (!item.props) {
1611
- return null;
1644
+ return;
1612
1645
  }
1613
1646
  var _item$props = item.props,
1614
1647
  name = _item$props.name,
@@ -1621,10 +1654,7 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1621
1654
  tips = _item$props.tips,
1622
1655
  numDisplayType = _item$props.numDisplayType;
1623
1656
  if (!visible) {
1624
- return false;
1625
- }
1626
- if (props.active === name) {
1627
- hasFindActive = true;
1657
+ return;
1628
1658
  }
1629
1659
  var renderLabel = function renderLabel(label) {
1630
1660
  if (item.slots.label) {
@@ -1652,17 +1682,50 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1652
1682
  tabLabel: renderLabel(label),
1653
1683
  tabNum: num
1654
1684
  });
1655
- return true;
1656
1685
  });
1657
- if (!hasFindActive && props.validateActive) {
1658
- props.panels[0].props && props.tabChange(props.panels[0].props.name);
1659
- }
1660
1686
  return list;
1661
1687
  });
1688
+ // 激活项、页签内容(label/数量)、位置或激活条尺寸/颜色变化后,等 DOM 更新完成再重新测量;
1689
+ // 同时把 ResizeObserver 重新挂到新的激活元素上。
1690
+ __WEBPACK_EXTERNAL_MODULE_vue_watch__([function () {
1691
+ return props.active;
1692
+ }, function () {
1693
+ return props.tabPosition;
1694
+ }, function () {
1695
+ return props.type;
1696
+ }, function () {
1697
+ return props.activeBarSize;
1698
+ }, function () {
1699
+ return props.activeBarColor;
1700
+ }, tableNavList], function () {
1701
+ __WEBPACK_EXTERNAL_MODULE_vue_nextTick__(function () {
1702
+ observeActiveBar();
1703
+ updateActiveBarStyle();
1704
+ });
1705
+ });
1706
+ // 当没有匹配到激活项且开启校验时,默认激活第一个面板。
1707
+ // 该逻辑必须放在副作用(watch)中,computed 需保持纯函数。
1708
+ __WEBPACK_EXTERNAL_MODULE_vue_watch__([tableNavList, function () {
1709
+ return props.active;
1710
+ }], function () {
1711
+ var _props$panels;
1712
+ if (!props.validateActive) {
1713
+ return;
1714
+ }
1715
+ var hasFindActive = tableNavList.value.some(function (item) {
1716
+ return (item === null || item === void 0 ? void 0 : item.name) === props.active;
1717
+ });
1718
+ var firstPanel = (_props$panels = props.panels) === null || _props$panels === void 0 ? void 0 : _props$panels[0];
1719
+ if (!hasFindActive && firstPanel !== null && firstPanel !== void 0 && firstPanel.props) {
1720
+ props.tabChange(firstPanel.props.name);
1721
+ }
1722
+ }, {
1723
+ immediate: true
1724
+ });
1662
1725
  var dragenterIndex = __WEBPACK_EXTERNAL_MODULE_vue_ref__(-1);
1663
1726
  var dragStartIndex = __WEBPACK_EXTERNAL_MODULE_vue_ref__(-1);
1664
1727
  var draggingEle = __WEBPACK_EXTERNAL_MODULE_vue_ref__('');
1665
- var distinctRoots = function distinctRoots(el1, el2) {
1728
+ var isSameRoot = function isSameRoot(el1, el2) {
1666
1729
  return el1 === el2;
1667
1730
  };
1668
1731
  var methods = {
@@ -1687,18 +1750,18 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1687
1750
  },
1688
1751
  dragenter: function dragenter(index) {
1689
1752
  // 缓存目标元素索引,方便添加样式
1690
- if (distinctRoots(draggingEle.value, props.guid)) {
1753
+ if (isSameRoot(draggingEle.value, props.guid)) {
1691
1754
  dragenterIndex.value = index;
1692
1755
  }
1693
1756
  },
1694
1757
  dragend: function dragend() {
1695
1758
  dragenterIndex.value = -1;
1696
1759
  dragStartIndex.value = -1;
1697
- draggingEle.value = null;
1760
+ draggingEle.value = '';
1698
1761
  },
1699
1762
  drop: function drop(index, sortType) {
1700
1763
  // 不是同一个tab,返回——暂时不支持跨tab拖动
1701
- if (!distinctRoots(draggingEle.value, props.guid)) {
1764
+ if (!isSameRoot(draggingEle.value, props.guid)) {
1702
1765
  return false;
1703
1766
  }
1704
1767
  props.tabSort(dragStartIndex.value, index, sortType);
@@ -1719,7 +1782,7 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1719
1782
  dragenterIndex: dragenterIndex,
1720
1783
  dragStartIndex: dragStartIndex,
1721
1784
  draggingEle: draggingEle,
1722
- guid: Math.random().toString(16).substr(4) + Math.random().toString(16).substr(4),
1785
+ guid: "".concat(Date.now().toString(16), "-").concat(Math.random().toString(16).slice(2, 10)),
1723
1786
  resolveClassName: resolveClassName
1724
1787
  });
1725
1788
  },
@@ -1772,11 +1835,21 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1772
1835
  return __WEBPACK_EXTERNAL_MODULE_vue_withDirectives__(__WEBPACK_EXTERNAL_MODULE_vue_createVNode__("div", {
1773
1836
  "key": name,
1774
1837
  "ref": active === name ? 'activeRef' : 'tabLabelRef',
1838
+ "role": "tab",
1839
+ "aria-selected": active === name,
1840
+ "aria-disabled": disabled || undefined,
1841
+ "tabindex": disabled ? -1 : 0,
1775
1842
  "class": getNavItemClass(),
1776
1843
  "draggable": getValue(item.sortable, sortable),
1777
1844
  "onClick": function onClick() {
1778
1845
  return !disabled && _this.handleTabChange(name);
1779
1846
  },
1847
+ "onKeydown": function onKeydown(e) {
1848
+ if (!disabled && (e.key === 'Enter' || e.key === ' ')) {
1849
+ e.preventDefault();
1850
+ _this.handleTabChange(name);
1851
+ }
1852
+ },
1780
1853
  "onDragend": function onDragend(e) {
1781
1854
  e.preventDefault();
1782
1855
  dragend();
@@ -1857,6 +1930,7 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1857
1930
  },
1858
1931
  "class": this.resolveClassName('tab-header')
1859
1932
  }, [__WEBPACK_EXTERNAL_MODULE_vue_createVNode__("div", {
1933
+ "role": "tablist",
1860
1934
  "class": [this.resolveClassName('tab-header-nav'), operations || setting ? 'tab-header-auto' : '']
1861
1935
  }, [renderActiveBar(), renderNavs()]), operations, setting]);
1862
1936
  }
@@ -1865,6 +1939,7 @@ function tab_nav_objectSpread(e) { for (var r = 1; r < arguments.length; r++) {
1865
1939
 
1866
1940
 
1867
1941
 
1942
+
1868
1943
  function tab_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1869
1944
  function tab_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? tab_ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : tab_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1870
1945
  /*
@@ -1913,31 +1988,41 @@ function tab_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
1913
1988
  var isMounted = __WEBPACK_EXTERNAL_MODULE_vue_ref__(false);
1914
1989
  var panels = __WEBPACK_EXTERNAL_MODULE_vue_ref__([]);
1915
1990
  var instance = __WEBPACK_EXTERNAL_MODULE_vue_getCurrentInstance__();
1916
- // 动态插入tabPanel
1991
+ // 向下注入当前激活面板,供 TabPanel 通过 inject 读取,替代 this.$parent.active。
1992
+ __WEBPACK_EXTERNAL_MODULE_vue_provide__(tabActiveInjectionKey, __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
1993
+ return _props.active;
1994
+ }));
1995
+ // 递归收集已挂载的 TabPanel 实例。
1996
+ // 仅向下穿透 Tab 自身的包裹元素(原生标签、Fragment、template),
1997
+ // 不进入用户自定义组件,避免误收集嵌套 Tab 的面板。
1917
1998
  var _getPaneInstanceFromSlot = function getPaneInstanceFromSlot(vnode) {
1918
1999
  var panelInstanceList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
1919
- var children = vnode.children;
1920
- (children || []).forEach(function (node) {
1921
- var type = node.type;
1922
- type = type.name || type;
2000
+ var children = vnode === null || vnode === void 0 ? void 0 : vnode.children;
2001
+ if (!Array.isArray(children)) {
2002
+ return panelInstanceList;
2003
+ }
2004
+ children.forEach(function (node) {
2005
+ if (!node || _typeof(node) !== 'object') {
2006
+ return;
2007
+ }
2008
+ var rawType = node.type;
2009
+ var type = (rawType === null || rawType === void 0 ? void 0 : rawType.name) || rawType;
1923
2010
  if (type === 'TabPanel' && node.component) {
1924
2011
  panelInstanceList.push(node.component);
1925
- } else if (type === __WEBPACK_EXTERNAL_MODULE_vue_Fragment__ || type === 'template') {
2012
+ } else if (rawType === __WEBPACK_EXTERNAL_MODULE_vue_Fragment__ || rawType === 'template' || typeof rawType === 'string') {
1926
2013
  _getPaneInstanceFromSlot(node, panelInstanceList);
1927
2014
  }
1928
2015
  });
1929
2016
  return panelInstanceList;
1930
2017
  };
1931
2018
  var setPanelInstances = function setPanelInstances() {
1932
- if (slots["default"]) {
1933
- var children = instance.subTree.children[1].children;
1934
- if (!children) return;
1935
- var content = children[0];
1936
- var panelInstanceList = _getPaneInstanceFromSlot(content);
1937
- var isChanged = panelInstanceList.length !== panels.value.length;
1938
- if (isChanged) {
1939
- panels.value = panelInstanceList;
1940
- }
2019
+ if (!slots["default"] || !(instance !== null && instance !== void 0 && instance.subTree)) {
2020
+ return;
2021
+ }
2022
+ var panelInstanceList = _getPaneInstanceFromSlot(instance.subTree);
2023
+ var isChanged = panelInstanceList.length !== panels.value.length;
2024
+ if (isChanged) {
2025
+ panels.value = panelInstanceList;
1941
2026
  }
1942
2027
  };
1943
2028
  __WEBPACK_EXTERNAL_MODULE_vue_onMounted__(function () {
@@ -1949,9 +2034,9 @@ function tab_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
1949
2034
  */
1950
2035
  setPanelInstances();
1951
2036
  isMounted.value = true;
1952
- __WEBPACK_EXTERNAL_MODULE_vue_onUpdated__(function () {
1953
- setPanelInstances();
1954
- });
2037
+ });
2038
+ __WEBPACK_EXTERNAL_MODULE_vue_onUpdated__(function () {
2039
+ setPanelInstances();
1955
2040
  });
1956
2041
  var methods = {
1957
2042
  tabAdd: function tabAdd(e) {
@@ -1981,10 +2066,10 @@ function tab_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
1981
2066
  // 如果是插队模式
1982
2067
  if (sortType === SortTypeEnum.INSERT) {
1983
2068
  if (dragTabIndex < dropTabIndex) {
1984
- list.splice(dropTabIndex + 1, 0, panels[dragTabIndex]);
2069
+ list.splice(dropTabIndex + 1, 0, list[dragTabIndex]);
1985
2070
  list.splice(dragTabIndex, 1);
1986
2071
  } else if (dragTabIndex > dropTabIndex) {
1987
- list.splice(dropTabIndex, 0, panels[dragTabIndex]);
2072
+ list.splice(dropTabIndex, 0, list[dragTabIndex]);
1988
2073
  list.splice(dragTabIndex + 1, 1);
1989
2074
  } else {
1990
2075
  return false;
@@ -2111,9 +2196,19 @@ function tab_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
2111
2196
  /* harmony default export */ const tab_panel = (__WEBPACK_EXTERNAL_MODULE_vue_defineComponent__({
2112
2197
  name: 'TabPanel',
2113
2198
  props: tabPanelProps,
2199
+ setup: function setup() {
2200
+ // 优先通过 inject 获取激活态;单独使用 TabPanel(无父级 Tab)时回退到 $parent。
2201
+ var tabActive = __WEBPACK_EXTERNAL_MODULE_vue_inject__(tabActiveInjectionKey, null);
2202
+ return {
2203
+ tabActive: tabActive
2204
+ };
2205
+ },
2114
2206
  render: function render() {
2115
- var _this = this;
2116
- var active = this.name === this.$parent.active;
2207
+ var _this$tabActive,
2208
+ _this$$parent,
2209
+ _this = this;
2210
+ var parentActive = (_this$tabActive = this.tabActive) !== null && _this$tabActive !== void 0 ? _this$tabActive : (_this$$parent = this.$parent) === null || _this$$parent === void 0 ? void 0 : _this$$parent.active;
2211
+ var active = this.name === parentActive;
2117
2212
  var getContent = function getContent() {
2118
2213
  // 不渲染
2119
2214
  if (!_this.visible || _this.renderDirective === 'if' && !active) {
@@ -100,6 +100,7 @@ declare module '@vue/runtime-core' {
100
100
  BkSearchSelect: typeof import('./search-select/search-select').default;
101
101
  BkConfigProvider: typeof import('./config-provider/config-provider').default;
102
102
  BkPopConfirm: typeof import('./pop-confirm/pop-confirm').default;
103
+ BkCollapsePanel: typeof import('./collapse/collapse-panel').default;
103
104
  }
104
105
  }
105
106
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bkui-vue",
3
- "version": "3.0.2",
3
+ "version": "3.0.3",
4
4
  "workspaces": [
5
5
  "packages/**",
6
6
  "scripts/cli",