@hi-ui/tabs 4.0.0-beta.19 → 4.0.0-beta.21
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/cjs/TabInk.js +31 -24
- package/lib/cjs/TabList.js +134 -114
- package/lib/cjs/TabPane.js +6 -1
- package/lib/cjs/hooks/index.js +9 -1
- package/lib/cjs/utils/index.js +32 -0
- package/lib/esm/TabInk.js +31 -24
- package/lib/esm/TabList.js +132 -114
- package/lib/esm/TabPane.js +4 -1
- package/lib/esm/hooks/index.js +7 -1
- package/lib/esm/utils/index.js +26 -0
- package/lib/types/TabInk.d.ts +4 -4
- package/lib/types/hooks/index.d.ts +3 -0
- package/lib/types/utils/index.d.ts +3 -0
- package/package.json +6 -4
package/lib/cjs/TabInk.js
CHANGED
|
@@ -32,36 +32,43 @@ var TabInk = function TabInk(_ref) {
|
|
|
32
32
|
|
|
33
33
|
var disabled = _ref.disabled,
|
|
34
34
|
prefixCls = _ref.prefixCls,
|
|
35
|
-
|
|
36
|
-
tabListRef = _ref.tabListRef,
|
|
35
|
+
activeItemElement = _ref.activeItemElement,
|
|
37
36
|
direction = _ref.direction,
|
|
38
|
-
|
|
37
|
+
activeTabId = _ref.activeTabId,
|
|
38
|
+
getTabOffset = _ref.getTabOffset;
|
|
39
39
|
var inkRef = React.useRef(null);
|
|
40
40
|
React.useEffect(function () {
|
|
41
|
-
if (inkRef.current
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
if (!inkRef.current) return;
|
|
42
|
+
if (!activeItemElement) return;
|
|
43
|
+
var computedStyle = getComputedStyle(activeItemElement);
|
|
44
|
+
var itemRect = activeItemElement.getBoundingClientRect();
|
|
45
|
+
var offset = getTabOffset(activeTabId);
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
_style = {
|
|
48
|
-
top: itemRect.top - listRect.top - translate + 2 + 8 + "px",
|
|
49
|
-
height: itemRect.height - 4 - 16 + "px",
|
|
50
|
-
left: '',
|
|
51
|
-
width: ''
|
|
52
|
-
};
|
|
53
|
-
} else {
|
|
54
|
-
_style = {
|
|
55
|
-
left: itemRect.left - listRect.left - translate + 20 + "px",
|
|
56
|
-
width: itemRect.width - 40 + "px",
|
|
57
|
-
top: '',
|
|
58
|
-
height: ''
|
|
59
|
-
};
|
|
60
|
-
}
|
|
47
|
+
var _style;
|
|
61
48
|
|
|
62
|
-
|
|
49
|
+
if (direction === 'vertical') {
|
|
50
|
+
var paddingTop = parseFloat(computedStyle.getPropertyValue('padding-top'));
|
|
51
|
+
var paddingBottom = parseFloat(computedStyle.getPropertyValue('padding-bottom'));
|
|
52
|
+
_style = {
|
|
53
|
+
// 2px 保证尽量和文字顶部对齐,减少文本行高的影响
|
|
54
|
+
top: offset + paddingTop + 2 + 'px',
|
|
55
|
+
height: itemRect.height - paddingTop - paddingBottom - 4 + "px",
|
|
56
|
+
left: '',
|
|
57
|
+
width: ''
|
|
58
|
+
};
|
|
59
|
+
} else {
|
|
60
|
+
var paddingLeft = parseFloat(computedStyle.getPropertyValue('padding-left'));
|
|
61
|
+
var paddingRight = parseFloat(computedStyle.getPropertyValue('padding-right'));
|
|
62
|
+
_style = {
|
|
63
|
+
left: offset + paddingLeft + 'px',
|
|
64
|
+
width: itemRect.width - paddingRight - paddingLeft + "px",
|
|
65
|
+
top: '',
|
|
66
|
+
height: ''
|
|
67
|
+
};
|
|
63
68
|
}
|
|
64
|
-
|
|
69
|
+
|
|
70
|
+
Object.assign(inkRef.current.style, _style);
|
|
71
|
+
}, [activeItemElement, direction, activeTabId, getTabOffset]);
|
|
65
72
|
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
66
73
|
className: classname.cx(prefixCls + "__ink", (_cx = {}, _cx[prefixCls + "__ink--disabled"] = disabled, _cx)),
|
|
67
74
|
ref: inkRef
|
package/lib/cjs/TabList.js
CHANGED
|
@@ -37,6 +37,10 @@ var iconButton = require('@hi-ui/icon-button');
|
|
|
37
37
|
|
|
38
38
|
var index = require('./hooks/index.js');
|
|
39
39
|
|
|
40
|
+
var useLatest = require('@hi-ui/use-latest');
|
|
41
|
+
|
|
42
|
+
var index$1 = require('./utils/index.js');
|
|
43
|
+
|
|
40
44
|
function _interopDefaultLegacy(e) {
|
|
41
45
|
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
42
46
|
'default': e
|
|
@@ -52,8 +56,6 @@ var _prefix = classname.getPrefixCls(_role);
|
|
|
52
56
|
var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
53
57
|
var _cx;
|
|
54
58
|
|
|
55
|
-
var _b;
|
|
56
|
-
|
|
57
59
|
var data = _a.data,
|
|
58
60
|
className = _a.className,
|
|
59
61
|
style = _a.style,
|
|
@@ -84,25 +86,30 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
return defaultActiveId;
|
|
87
|
-
}, activeId, onChange),
|
|
89
|
+
}, activeId, onChange, Object.is),
|
|
88
90
|
activeTabId = _useUncontrolledState[0],
|
|
89
91
|
setActiveTabId = _useUncontrolledState[1];
|
|
90
92
|
|
|
91
93
|
var _useState = React.useState(null),
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
innerElement = _useState[0],
|
|
95
|
+
setInnerElement = _useState[1];
|
|
94
96
|
|
|
95
97
|
var _useState2 = React.useState(null),
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
scrollElement = _useState2[0],
|
|
99
|
+
setScrollElement = _useState2[1];
|
|
100
|
+
|
|
101
|
+
var showHorizontal = direction === 'horizontal';
|
|
102
|
+
var getClientSize = React.useCallback(function (element) {
|
|
103
|
+
return showHorizontal ? element.clientWidth : element.clientHeight;
|
|
104
|
+
}, [showHorizontal]);
|
|
98
105
|
|
|
99
106
|
var _useState3 = React.useState(0),
|
|
100
|
-
|
|
101
|
-
|
|
107
|
+
translatePos = _useState3[0],
|
|
108
|
+
setTranslatePos = _useState3[1];
|
|
102
109
|
|
|
103
110
|
var _useState4 = React.useState(0),
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
translateBoundPos = _useState4[0],
|
|
112
|
+
setTranslateBoundPos = _useState4[1];
|
|
106
113
|
|
|
107
114
|
var itemsRef = React.useRef({});
|
|
108
115
|
|
|
@@ -110,103 +117,132 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
|
110
117
|
showScrollBtn = _useState5[0],
|
|
111
118
|
setShowScrollBtn = _useState5[1];
|
|
112
119
|
|
|
113
|
-
var
|
|
120
|
+
var resizeScroll = function resizeScroll(scrollSize, innerSize) {
|
|
121
|
+
var showScrollBtn = scrollSize > innerSize;
|
|
122
|
+
setShowScrollBtn(showScrollBtn);
|
|
123
|
+
|
|
124
|
+
if (showScrollBtn) {
|
|
125
|
+
setTranslateBoundPos(scrollSize - innerSize);
|
|
126
|
+
}
|
|
127
|
+
}; // 响应式滚动按钮展示
|
|
128
|
+
|
|
114
129
|
|
|
115
130
|
index.useResizeObserver({
|
|
116
|
-
element:
|
|
117
|
-
getSize:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
var _showScrollBtn = showHorizontal ? scrollRef.clientWidth > size : scrollRef.clientHeight > size;
|
|
123
|
-
|
|
124
|
-
setShowScrollBtn(_showScrollBtn);
|
|
131
|
+
element: innerElement,
|
|
132
|
+
getSize: getClientSize,
|
|
133
|
+
onResize: function onResize(_, innerSize) {
|
|
134
|
+
if (scrollElement) {
|
|
135
|
+
var scrollSize = getClientSize(scrollElement);
|
|
136
|
+
resizeScroll(scrollSize, innerSize);
|
|
125
137
|
}
|
|
126
138
|
}
|
|
127
139
|
});
|
|
128
140
|
index.useResizeObserver({
|
|
129
|
-
element:
|
|
130
|
-
getSize:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
var _showScrollBtn2 = showHorizontal ? size > innerRef.clientWidth : size > innerRef.clientHeight;
|
|
136
|
-
|
|
137
|
-
setShowScrollBtn(_showScrollBtn2);
|
|
141
|
+
element: scrollElement,
|
|
142
|
+
getSize: getClientSize,
|
|
143
|
+
onResize: function onResize(_, scrollSize) {
|
|
144
|
+
if (innerElement) {
|
|
145
|
+
var innerSize = getClientSize(innerElement);
|
|
146
|
+
resizeScroll(scrollSize, innerSize);
|
|
138
147
|
}
|
|
139
148
|
}
|
|
140
149
|
});
|
|
141
|
-
var
|
|
142
|
-
|
|
143
|
-
|
|
150
|
+
var getTabPos = React.useCallback(function (tabId) {
|
|
151
|
+
var target = 0; // 获取目标元素的位置
|
|
152
|
+
|
|
153
|
+
var targetElement = itemsRef.current[tabId];
|
|
154
|
+
|
|
155
|
+
if (targetElement) {
|
|
156
|
+
var rect = targetElement.getBoundingClientRect();
|
|
157
|
+
target = showHorizontal ? rect.left : rect.top;
|
|
144
158
|
}
|
|
145
159
|
|
|
146
|
-
|
|
147
|
-
|
|
160
|
+
return target;
|
|
161
|
+
}, [showHorizontal]);
|
|
162
|
+
var getTabOffset = React.useCallback(function (tabId) {
|
|
163
|
+
// 获取目标元素的位置
|
|
164
|
+
var targetPos = getTabPos(tabId); // 获取基准元素的位置(第一个)
|
|
165
|
+
|
|
166
|
+
var basePos = 0;
|
|
167
|
+
|
|
168
|
+
if (typeAssertion.isArrayNonEmpty(data)) {
|
|
169
|
+
var baseItem = data[0];
|
|
170
|
+
basePos = getTabPos(baseItem.tabId);
|
|
171
|
+
} // 返回目标元素相对基准元素的偏移量
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
return targetPos ? targetPos - basePos : 0;
|
|
175
|
+
}, [data, getTabPos]);
|
|
176
|
+
|
|
177
|
+
var syncScrollPosition = function syncScrollPosition(tabId) {
|
|
178
|
+
if (!innerElement) return;
|
|
179
|
+
if (!scrollElement) return;
|
|
180
|
+
var scrollSize = getClientSize(scrollElement);
|
|
181
|
+
var innerSize = getClientSize(innerElement);
|
|
182
|
+
var offsetValue = getTabOffset(tabId); // 左边或上半部内容展示不全
|
|
183
|
+
|
|
184
|
+
var currentOffset = -translatePos;
|
|
185
|
+
|
|
186
|
+
if (offsetValue < currentOffset) {
|
|
187
|
+
setTranslatePos(-offsetValue);
|
|
188
|
+
} else {
|
|
189
|
+
// 右边或下半部内容展示不全
|
|
190
|
+
var nextTabId = index$1.getNextTabId(data, tabId);
|
|
191
|
+
var nextOffsetValue = nextTabId !== null ? getTabOffset(nextTabId) : scrollSize;
|
|
192
|
+
|
|
193
|
+
var _currentOffset = -translatePos + innerSize;
|
|
194
|
+
|
|
195
|
+
if (nextOffsetValue > _currentOffset) {
|
|
196
|
+
setTranslatePos(translatePos - (nextOffsetValue - _currentOffset));
|
|
197
|
+
}
|
|
148
198
|
}
|
|
149
|
-
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
var onClickTab = useLatest.useLatestCallback(function (tabId, event) {
|
|
202
|
+
onTabClick === null || onTabClick === void 0 ? void 0 : onTabClick(tabId, event);
|
|
203
|
+
setActiveTabId(tabId);
|
|
204
|
+
syncScrollPosition(tabId);
|
|
205
|
+
});
|
|
150
206
|
return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
|
|
151
207
|
style: style,
|
|
152
208
|
className: classname.cx(prefixCls + "__list", (_cx = {}, _cx[prefixCls + "__list--" + type] = type, _cx), className),
|
|
153
209
|
ref: ref
|
|
154
|
-
}, rest), showScrollBtn
|
|
155
|
-
className: prefixCls + "__left-btn",
|
|
210
|
+
}, rest), showScrollBtn ? /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
|
|
211
|
+
className: showHorizontal ? prefixCls + "__left-btn" : prefixCls + "__up-btn",
|
|
156
212
|
effect: true,
|
|
157
|
-
|
|
213
|
+
disabled: translatePos === 0,
|
|
214
|
+
icon: showHorizontal ? /*#__PURE__*/React__default["default"].createElement(icons.LeftOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.UpOutlined, null),
|
|
158
215
|
onClick: function onClick() {
|
|
159
|
-
if (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
setTranslateX(translateX + moveWidth);
|
|
170
|
-
}
|
|
216
|
+
if (!scrollElement) return;
|
|
217
|
+
if (!innerElement) return; // 向前面滚动
|
|
218
|
+
|
|
219
|
+
var clientSize = getClientSize(innerElement);
|
|
220
|
+
var canScroll = -translatePos - clientSize;
|
|
221
|
+
var moveWidth = canScroll >= 0 ? clientSize : -translatePos;
|
|
222
|
+
setTranslatePos(function (prev) {
|
|
223
|
+
return prev + moveWidth;
|
|
224
|
+
});
|
|
171
225
|
}
|
|
172
|
-
})
|
|
173
|
-
className: prefixCls + "__up-btn",
|
|
174
|
-
effect: true,
|
|
175
|
-
icon: /*#__PURE__*/React__default["default"].createElement(icons.UpOutlined, null),
|
|
176
|
-
onClick: function onClick() {
|
|
177
|
-
if (scrollRef && innerRef) {
|
|
178
|
-
var canScroll = -translateY - innerRef.clientHeight;
|
|
179
|
-
var moveWidth = 0;
|
|
180
|
-
|
|
181
|
-
if (canScroll >= 0) {
|
|
182
|
-
moveWidth = innerRef.clientHeight;
|
|
183
|
-
} else {
|
|
184
|
-
moveWidth = -translateY;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
setTranslateY(translateY + moveWidth);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
226
|
+
}) : null, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
191
227
|
className: classname.cx(prefixCls + "__list--inner"),
|
|
192
|
-
ref:
|
|
228
|
+
ref: setInnerElement
|
|
193
229
|
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
194
230
|
className: classname.cx(prefixCls + "__list--scroll"),
|
|
195
|
-
ref:
|
|
231
|
+
ref: setScrollElement,
|
|
196
232
|
style: showScrollBtn ? {
|
|
197
|
-
transform: direction === 'horizontal' ? "translateX(" +
|
|
198
|
-
} :
|
|
199
|
-
}, data.map(function (
|
|
233
|
+
transform: direction === 'horizontal' ? "translateX(" + translatePos + "px)" : "translateY(" + translatePos + "px)"
|
|
234
|
+
} : undefined
|
|
235
|
+
}, data.map(function (item, index) {
|
|
200
236
|
return /*#__PURE__*/React__default["default"].createElement(TabItem.TabItem, Object.assign({
|
|
201
237
|
key: index
|
|
202
|
-
},
|
|
238
|
+
}, item, {
|
|
203
239
|
ref: function ref(node) {
|
|
204
|
-
itemsRef.current["" +
|
|
240
|
+
itemsRef.current["" + item.tabId] = node;
|
|
205
241
|
},
|
|
206
242
|
type: type,
|
|
207
|
-
itemRef: itemsRef.current["" +
|
|
243
|
+
itemRef: itemsRef.current["" + item.tabId],
|
|
208
244
|
index: index,
|
|
209
|
-
active: activeTabId ===
|
|
245
|
+
active: activeTabId === item.tabId,
|
|
210
246
|
prefixCls: prefixCls,
|
|
211
247
|
draggable: draggable,
|
|
212
248
|
onTabClick: onClickTab,
|
|
@@ -218,46 +254,30 @@ var TabList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
|
218
254
|
onDragEnd: onDragEnd,
|
|
219
255
|
direction: direction
|
|
220
256
|
}));
|
|
221
|
-
}), type === 'line'
|
|
222
|
-
translate: direction === 'horizontal' ? translateX : translateY,
|
|
257
|
+
}), type === 'line' ? /*#__PURE__*/React__default["default"].createElement(TabInk.TabInk, {
|
|
223
258
|
prefixCls: prefixCls,
|
|
224
259
|
direction: direction,
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
260
|
+
activeItemElement: itemsRef.current[activeTabId],
|
|
261
|
+
activeTabId: activeTabId,
|
|
262
|
+
getTabOffset: getTabOffset
|
|
263
|
+
}) : null)), showScrollBtn ? /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
|
|
228
264
|
effect: true,
|
|
229
|
-
className: prefixCls + "__right-btn",
|
|
230
|
-
|
|
265
|
+
className: showHorizontal ? prefixCls + "__right-btn" : prefixCls + "__down-btn",
|
|
266
|
+
disabled: translateBoundPos === -translatePos,
|
|
267
|
+
icon: showHorizontal ? /*#__PURE__*/React__default["default"].createElement(icons.RightOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.DownOutlined, null),
|
|
231
268
|
onClick: function onClick() {
|
|
232
|
-
if (
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}), showScrollBtn && direction === 'vertical' && /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
|
|
243
|
-
effect: true,
|
|
244
|
-
className: prefixCls + "__down-btn",
|
|
245
|
-
icon: /*#__PURE__*/React__default["default"].createElement(icons.DownOutlined, null),
|
|
246
|
-
onClick: function onClick() {
|
|
247
|
-
if (scrollRef && innerRef) {
|
|
248
|
-
var canScroll = scrollRef.clientHeight - innerRef.clientHeight + translateY;
|
|
249
|
-
var moveWidth = 0;
|
|
250
|
-
|
|
251
|
-
if (canScroll >= innerRef.clientHeight) {
|
|
252
|
-
moveWidth = innerRef.clientHeight;
|
|
253
|
-
} else {
|
|
254
|
-
moveWidth = canScroll;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
setTranslateY(translateY - moveWidth);
|
|
258
|
-
}
|
|
269
|
+
if (!scrollElement) return;
|
|
270
|
+
if (!innerElement) return; // 向后面滚动
|
|
271
|
+
|
|
272
|
+
var scrollSize = getClientSize(scrollElement);
|
|
273
|
+
var innerSize = getClientSize(innerElement);
|
|
274
|
+
var canScrollWidth = scrollSize - innerSize + translatePos;
|
|
275
|
+
var moveWidth = canScrollWidth < innerSize ? canScrollWidth : innerSize;
|
|
276
|
+
setTranslatePos(function (prev) {
|
|
277
|
+
return prev - moveWidth;
|
|
278
|
+
});
|
|
259
279
|
}
|
|
260
|
-
}), editable ? /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
|
|
280
|
+
}) : null, editable ? /*#__PURE__*/React__default["default"].createElement(iconButton.IconButton, {
|
|
261
281
|
icon: /*#__PURE__*/React__default["default"].createElement(icons.PlusOutlined, null),
|
|
262
282
|
className: prefixCls + "__add-btn",
|
|
263
283
|
onClick: onAdd
|
package/lib/cjs/TabPane.js
CHANGED
|
@@ -19,6 +19,8 @@ var tslib = require('tslib');
|
|
|
19
19
|
|
|
20
20
|
var React = require('react');
|
|
21
21
|
|
|
22
|
+
var reactUtils = require('@hi-ui/react-utils');
|
|
23
|
+
|
|
22
24
|
function _interopDefaultLegacy(e) {
|
|
23
25
|
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
24
26
|
'default': e
|
|
@@ -27,6 +29,8 @@ function _interopDefaultLegacy(e) {
|
|
|
27
29
|
|
|
28
30
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
29
31
|
|
|
32
|
+
var omitProps = ['tabId', 'tabTitle', 'disabled', 'tabDesc', 'closeable'];
|
|
33
|
+
|
|
30
34
|
var TabPane = function TabPane(_a) {
|
|
31
35
|
var children = _a.children,
|
|
32
36
|
className = _a.className,
|
|
@@ -34,10 +38,11 @@ var TabPane = function TabPane(_a) {
|
|
|
34
38
|
active = _a.active,
|
|
35
39
|
rest = tslib.__rest(_a, ["children", "className", "style", "active"]);
|
|
36
40
|
|
|
41
|
+
var htmlProps = reactUtils.filterProps(rest, omitProps);
|
|
37
42
|
return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
|
|
38
43
|
style: style,
|
|
39
44
|
className: className
|
|
40
|
-
},
|
|
45
|
+
}, htmlProps), active ? children : null);
|
|
41
46
|
};
|
|
42
47
|
|
|
43
48
|
exports.TabPane = TabPane;
|
package/lib/cjs/hooks/index.js
CHANGED
|
@@ -17,6 +17,12 @@ var React = require('react');
|
|
|
17
17
|
|
|
18
18
|
var useLatest = require('@hi-ui/use-latest');
|
|
19
19
|
|
|
20
|
+
var useUnmountEffect = require('@hi-ui/use-unmount-effect');
|
|
21
|
+
/**
|
|
22
|
+
* 响应式监听元素的 size 变化
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
|
|
20
26
|
var useResizeObserver = function useResizeObserver(_ref) {
|
|
21
27
|
var element = _ref.element,
|
|
22
28
|
onResize = _ref.onResize,
|
|
@@ -26,9 +32,11 @@ var useResizeObserver = function useResizeObserver(_ref) {
|
|
|
26
32
|
var getSizeLatestRef = useLatest.useLatestRef(getSize);
|
|
27
33
|
var onResizeLatest = useLatest.useLatestCallback(onResize);
|
|
28
34
|
var prevSizeRef = React.useRef(initialSize);
|
|
35
|
+
var unmountRef = useUnmountEffect.useUnmountEffect();
|
|
29
36
|
React.useEffect(function () {
|
|
30
37
|
if (element) {
|
|
31
38
|
var _resizeObserver = new ResizeObserver(function () {
|
|
39
|
+
if (unmountRef.current) return;
|
|
32
40
|
var getSize = getSizeLatestRef.current;
|
|
33
41
|
|
|
34
42
|
if (element) {
|
|
@@ -49,7 +57,7 @@ var useResizeObserver = function useResizeObserver(_ref) {
|
|
|
49
57
|
}
|
|
50
58
|
|
|
51
59
|
return function () {};
|
|
52
|
-
}, [element, getSizeLatestRef, onResizeLatest]);
|
|
60
|
+
}, [element, getSizeLatestRef, onResizeLatest, unmountRef]);
|
|
53
61
|
};
|
|
54
62
|
|
|
55
63
|
exports.useResizeObserver = useResizeObserver;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/tabs
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/tabs#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HIUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
Object.defineProperty(exports, '__esModule', {
|
|
13
|
+
value: true
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
var typeAssertion = require('@hi-ui/type-assertion');
|
|
17
|
+
|
|
18
|
+
var getNextTabId = function getNextTabId(data, tabId) {
|
|
19
|
+
if (typeAssertion.isArrayNonEmpty(data)) {
|
|
20
|
+
var itemIndex = data.findIndex(function (item) {
|
|
21
|
+
return item.tabId === tabId;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (itemIndex !== -1 && data[itemIndex + 1]) {
|
|
25
|
+
return data[itemIndex + 1].tabId;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
exports.getNextTabId = getNextTabId;
|
package/lib/esm/TabInk.js
CHANGED
|
@@ -15,36 +15,43 @@ var TabInk = function TabInk(_ref) {
|
|
|
15
15
|
|
|
16
16
|
var disabled = _ref.disabled,
|
|
17
17
|
prefixCls = _ref.prefixCls,
|
|
18
|
-
|
|
19
|
-
tabListRef = _ref.tabListRef,
|
|
18
|
+
activeItemElement = _ref.activeItemElement,
|
|
20
19
|
direction = _ref.direction,
|
|
21
|
-
|
|
20
|
+
activeTabId = _ref.activeTabId,
|
|
21
|
+
getTabOffset = _ref.getTabOffset;
|
|
22
22
|
var inkRef = useRef(null);
|
|
23
23
|
useEffect(function () {
|
|
24
|
-
if (inkRef.current
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
if (!inkRef.current) return;
|
|
25
|
+
if (!activeItemElement) return;
|
|
26
|
+
var computedStyle = getComputedStyle(activeItemElement);
|
|
27
|
+
var itemRect = activeItemElement.getBoundingClientRect();
|
|
28
|
+
var offset = getTabOffset(activeTabId);
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
_style = {
|
|
31
|
-
top: itemRect.top - listRect.top - translate + 2 + 8 + "px",
|
|
32
|
-
height: itemRect.height - 4 - 16 + "px",
|
|
33
|
-
left: '',
|
|
34
|
-
width: ''
|
|
35
|
-
};
|
|
36
|
-
} else {
|
|
37
|
-
_style = {
|
|
38
|
-
left: itemRect.left - listRect.left - translate + 20 + "px",
|
|
39
|
-
width: itemRect.width - 40 + "px",
|
|
40
|
-
top: '',
|
|
41
|
-
height: ''
|
|
42
|
-
};
|
|
43
|
-
}
|
|
30
|
+
var _style;
|
|
44
31
|
|
|
45
|
-
|
|
32
|
+
if (direction === 'vertical') {
|
|
33
|
+
var paddingTop = parseFloat(computedStyle.getPropertyValue('padding-top'));
|
|
34
|
+
var paddingBottom = parseFloat(computedStyle.getPropertyValue('padding-bottom'));
|
|
35
|
+
_style = {
|
|
36
|
+
// 2px 保证尽量和文字顶部对齐,减少文本行高的影响
|
|
37
|
+
top: offset + paddingTop + 2 + 'px',
|
|
38
|
+
height: itemRect.height - paddingTop - paddingBottom - 4 + "px",
|
|
39
|
+
left: '',
|
|
40
|
+
width: ''
|
|
41
|
+
};
|
|
42
|
+
} else {
|
|
43
|
+
var paddingLeft = parseFloat(computedStyle.getPropertyValue('padding-left'));
|
|
44
|
+
var paddingRight = parseFloat(computedStyle.getPropertyValue('padding-right'));
|
|
45
|
+
_style = {
|
|
46
|
+
left: offset + paddingLeft + 'px',
|
|
47
|
+
width: itemRect.width - paddingRight - paddingLeft + "px",
|
|
48
|
+
top: '',
|
|
49
|
+
height: ''
|
|
50
|
+
};
|
|
46
51
|
}
|
|
47
|
-
|
|
52
|
+
|
|
53
|
+
Object.assign(inkRef.current.style, _style);
|
|
54
|
+
}, [activeItemElement, direction, activeTabId, getTabOffset]);
|
|
48
55
|
return /*#__PURE__*/React.createElement("div", {
|
|
49
56
|
className: cx(prefixCls + "__ink", (_cx = {}, _cx[prefixCls + "__ink--disabled"] = disabled, _cx)),
|
|
50
57
|
ref: inkRef
|
package/lib/esm/TabList.js
CHANGED
|
@@ -8,16 +8,18 @@
|
|
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
|
9
9
|
*/
|
|
10
10
|
import { __rest } from 'tslib';
|
|
11
|
-
import React, { forwardRef, useState,
|
|
11
|
+
import React, { forwardRef, useState, useCallback, useRef } from 'react';
|
|
12
12
|
import { __DEV__ } from '@hi-ui/env';
|
|
13
13
|
import { TabItem } from './TabItem.js';
|
|
14
14
|
import { useUncontrolledState } from '@hi-ui/use-uncontrolled-state';
|
|
15
15
|
import { getPrefixCls, cx } from '@hi-ui/classname';
|
|
16
16
|
import { TabInk } from './TabInk.js';
|
|
17
17
|
import { LeftOutlined, UpOutlined, RightOutlined, DownOutlined, PlusOutlined } from '@hi-ui/icons';
|
|
18
|
-
import { isUndef } from '@hi-ui/type-assertion';
|
|
18
|
+
import { isUndef, isArrayNonEmpty } from '@hi-ui/type-assertion';
|
|
19
19
|
import { IconButton } from '@hi-ui/icon-button';
|
|
20
20
|
import { useResizeObserver } from './hooks/index.js';
|
|
21
|
+
import { useLatestCallback } from '@hi-ui/use-latest';
|
|
22
|
+
import { getNextTabId } from './utils/index.js';
|
|
21
23
|
var _role = 'tabs';
|
|
22
24
|
|
|
23
25
|
var _prefix = getPrefixCls(_role);
|
|
@@ -25,8 +27,6 @@ var _prefix = getPrefixCls(_role);
|
|
|
25
27
|
var TabList = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
26
28
|
var _cx;
|
|
27
29
|
|
|
28
|
-
var _b;
|
|
29
|
-
|
|
30
30
|
var data = _a.data,
|
|
31
31
|
className = _a.className,
|
|
32
32
|
style = _a.style,
|
|
@@ -57,25 +57,30 @@ var TabList = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
return defaultActiveId;
|
|
60
|
-
}, activeId, onChange),
|
|
60
|
+
}, activeId, onChange, Object.is),
|
|
61
61
|
activeTabId = _useUncontrolledState[0],
|
|
62
62
|
setActiveTabId = _useUncontrolledState[1];
|
|
63
63
|
|
|
64
64
|
var _useState = useState(null),
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
innerElement = _useState[0],
|
|
66
|
+
setInnerElement = _useState[1];
|
|
67
67
|
|
|
68
68
|
var _useState2 = useState(null),
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
scrollElement = _useState2[0],
|
|
70
|
+
setScrollElement = _useState2[1];
|
|
71
|
+
|
|
72
|
+
var showHorizontal = direction === 'horizontal';
|
|
73
|
+
var getClientSize = useCallback(function (element) {
|
|
74
|
+
return showHorizontal ? element.clientWidth : element.clientHeight;
|
|
75
|
+
}, [showHorizontal]);
|
|
71
76
|
|
|
72
77
|
var _useState3 = useState(0),
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
translatePos = _useState3[0],
|
|
79
|
+
setTranslatePos = _useState3[1];
|
|
75
80
|
|
|
76
81
|
var _useState4 = useState(0),
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
translateBoundPos = _useState4[0],
|
|
83
|
+
setTranslateBoundPos = _useState4[1];
|
|
79
84
|
|
|
80
85
|
var itemsRef = useRef({});
|
|
81
86
|
|
|
@@ -83,103 +88,132 @@ var TabList = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
|
83
88
|
showScrollBtn = _useState5[0],
|
|
84
89
|
setShowScrollBtn = _useState5[1];
|
|
85
90
|
|
|
86
|
-
var
|
|
91
|
+
var resizeScroll = function resizeScroll(scrollSize, innerSize) {
|
|
92
|
+
var showScrollBtn = scrollSize > innerSize;
|
|
93
|
+
setShowScrollBtn(showScrollBtn);
|
|
94
|
+
|
|
95
|
+
if (showScrollBtn) {
|
|
96
|
+
setTranslateBoundPos(scrollSize - innerSize);
|
|
97
|
+
}
|
|
98
|
+
}; // 响应式滚动按钮展示
|
|
99
|
+
|
|
87
100
|
|
|
88
101
|
useResizeObserver({
|
|
89
|
-
element:
|
|
90
|
-
getSize:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
var _showScrollBtn = showHorizontal ? scrollRef.clientWidth > size : scrollRef.clientHeight > size;
|
|
96
|
-
|
|
97
|
-
setShowScrollBtn(_showScrollBtn);
|
|
102
|
+
element: innerElement,
|
|
103
|
+
getSize: getClientSize,
|
|
104
|
+
onResize: function onResize(_, innerSize) {
|
|
105
|
+
if (scrollElement) {
|
|
106
|
+
var scrollSize = getClientSize(scrollElement);
|
|
107
|
+
resizeScroll(scrollSize, innerSize);
|
|
98
108
|
}
|
|
99
109
|
}
|
|
100
110
|
});
|
|
101
111
|
useResizeObserver({
|
|
102
|
-
element:
|
|
103
|
-
getSize:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
var _showScrollBtn2 = showHorizontal ? size > innerRef.clientWidth : size > innerRef.clientHeight;
|
|
109
|
-
|
|
110
|
-
setShowScrollBtn(_showScrollBtn2);
|
|
112
|
+
element: scrollElement,
|
|
113
|
+
getSize: getClientSize,
|
|
114
|
+
onResize: function onResize(_, scrollSize) {
|
|
115
|
+
if (innerElement) {
|
|
116
|
+
var innerSize = getClientSize(innerElement);
|
|
117
|
+
resizeScroll(scrollSize, innerSize);
|
|
111
118
|
}
|
|
112
119
|
}
|
|
113
120
|
});
|
|
114
|
-
var
|
|
115
|
-
|
|
116
|
-
|
|
121
|
+
var getTabPos = useCallback(function (tabId) {
|
|
122
|
+
var target = 0; // 获取目标元素的位置
|
|
123
|
+
|
|
124
|
+
var targetElement = itemsRef.current[tabId];
|
|
125
|
+
|
|
126
|
+
if (targetElement) {
|
|
127
|
+
var rect = targetElement.getBoundingClientRect();
|
|
128
|
+
target = showHorizontal ? rect.left : rect.top;
|
|
117
129
|
}
|
|
118
130
|
|
|
119
|
-
|
|
120
|
-
|
|
131
|
+
return target;
|
|
132
|
+
}, [showHorizontal]);
|
|
133
|
+
var getTabOffset = useCallback(function (tabId) {
|
|
134
|
+
// 获取目标元素的位置
|
|
135
|
+
var targetPos = getTabPos(tabId); // 获取基准元素的位置(第一个)
|
|
136
|
+
|
|
137
|
+
var basePos = 0;
|
|
138
|
+
|
|
139
|
+
if (isArrayNonEmpty(data)) {
|
|
140
|
+
var baseItem = data[0];
|
|
141
|
+
basePos = getTabPos(baseItem.tabId);
|
|
142
|
+
} // 返回目标元素相对基准元素的偏移量
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
return targetPos ? targetPos - basePos : 0;
|
|
146
|
+
}, [data, getTabPos]);
|
|
147
|
+
|
|
148
|
+
var syncScrollPosition = function syncScrollPosition(tabId) {
|
|
149
|
+
if (!innerElement) return;
|
|
150
|
+
if (!scrollElement) return;
|
|
151
|
+
var scrollSize = getClientSize(scrollElement);
|
|
152
|
+
var innerSize = getClientSize(innerElement);
|
|
153
|
+
var offsetValue = getTabOffset(tabId); // 左边或上半部内容展示不全
|
|
154
|
+
|
|
155
|
+
var currentOffset = -translatePos;
|
|
156
|
+
|
|
157
|
+
if (offsetValue < currentOffset) {
|
|
158
|
+
setTranslatePos(-offsetValue);
|
|
159
|
+
} else {
|
|
160
|
+
// 右边或下半部内容展示不全
|
|
161
|
+
var nextTabId = getNextTabId(data, tabId);
|
|
162
|
+
var nextOffsetValue = nextTabId !== null ? getTabOffset(nextTabId) : scrollSize;
|
|
163
|
+
|
|
164
|
+
var _currentOffset = -translatePos + innerSize;
|
|
165
|
+
|
|
166
|
+
if (nextOffsetValue > _currentOffset) {
|
|
167
|
+
setTranslatePos(translatePos - (nextOffsetValue - _currentOffset));
|
|
168
|
+
}
|
|
121
169
|
}
|
|
122
|
-
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
var onClickTab = useLatestCallback(function (tabId, event) {
|
|
173
|
+
onTabClick === null || onTabClick === void 0 ? void 0 : onTabClick(tabId, event);
|
|
174
|
+
setActiveTabId(tabId);
|
|
175
|
+
syncScrollPosition(tabId);
|
|
176
|
+
});
|
|
123
177
|
return /*#__PURE__*/React.createElement("div", Object.assign({
|
|
124
178
|
style: style,
|
|
125
179
|
className: cx(prefixCls + "__list", (_cx = {}, _cx[prefixCls + "__list--" + type] = type, _cx), className),
|
|
126
180
|
ref: ref
|
|
127
|
-
}, rest), showScrollBtn
|
|
128
|
-
className: prefixCls + "__left-btn",
|
|
129
|
-
effect: true,
|
|
130
|
-
icon: /*#__PURE__*/React.createElement(LeftOutlined, null),
|
|
131
|
-
onClick: function onClick() {
|
|
132
|
-
if (scrollRef && innerRef) {
|
|
133
|
-
var canScroll = -translateX - innerRef.clientWidth;
|
|
134
|
-
var moveWidth = 0;
|
|
135
|
-
|
|
136
|
-
if (canScroll >= 0) {
|
|
137
|
-
moveWidth = innerRef.clientWidth;
|
|
138
|
-
} else {
|
|
139
|
-
moveWidth = -translateX;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
setTranslateX(translateX + moveWidth);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}), showScrollBtn && direction === 'vertical' && /*#__PURE__*/React.createElement(IconButton, {
|
|
146
|
-
className: prefixCls + "__up-btn",
|
|
181
|
+
}, rest), showScrollBtn ? /*#__PURE__*/React.createElement(IconButton, {
|
|
182
|
+
className: showHorizontal ? prefixCls + "__left-btn" : prefixCls + "__up-btn",
|
|
147
183
|
effect: true,
|
|
148
|
-
|
|
184
|
+
disabled: translatePos === 0,
|
|
185
|
+
icon: showHorizontal ? /*#__PURE__*/React.createElement(LeftOutlined, null) : /*#__PURE__*/React.createElement(UpOutlined, null),
|
|
149
186
|
onClick: function onClick() {
|
|
150
|
-
if (
|
|
151
|
-
|
|
152
|
-
var moveWidth = 0;
|
|
187
|
+
if (!scrollElement) return;
|
|
188
|
+
if (!innerElement) return; // 向前面滚动
|
|
153
189
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
setTranslateY(translateY + moveWidth);
|
|
161
|
-
}
|
|
190
|
+
var clientSize = getClientSize(innerElement);
|
|
191
|
+
var canScroll = -translatePos - clientSize;
|
|
192
|
+
var moveWidth = canScroll >= 0 ? clientSize : -translatePos;
|
|
193
|
+
setTranslatePos(function (prev) {
|
|
194
|
+
return prev + moveWidth;
|
|
195
|
+
});
|
|
162
196
|
}
|
|
163
|
-
}), /*#__PURE__*/React.createElement("div", {
|
|
197
|
+
}) : null, /*#__PURE__*/React.createElement("div", {
|
|
164
198
|
className: cx(prefixCls + "__list--inner"),
|
|
165
|
-
ref:
|
|
199
|
+
ref: setInnerElement
|
|
166
200
|
}, /*#__PURE__*/React.createElement("div", {
|
|
167
201
|
className: cx(prefixCls + "__list--scroll"),
|
|
168
|
-
ref:
|
|
202
|
+
ref: setScrollElement,
|
|
169
203
|
style: showScrollBtn ? {
|
|
170
|
-
transform: direction === 'horizontal' ? "translateX(" +
|
|
171
|
-
} :
|
|
172
|
-
}, data.map(function (
|
|
204
|
+
transform: direction === 'horizontal' ? "translateX(" + translatePos + "px)" : "translateY(" + translatePos + "px)"
|
|
205
|
+
} : undefined
|
|
206
|
+
}, data.map(function (item, index) {
|
|
173
207
|
return /*#__PURE__*/React.createElement(TabItem, Object.assign({
|
|
174
208
|
key: index
|
|
175
|
-
},
|
|
209
|
+
}, item, {
|
|
176
210
|
ref: function ref(node) {
|
|
177
|
-
itemsRef.current["" +
|
|
211
|
+
itemsRef.current["" + item.tabId] = node;
|
|
178
212
|
},
|
|
179
213
|
type: type,
|
|
180
|
-
itemRef: itemsRef.current["" +
|
|
214
|
+
itemRef: itemsRef.current["" + item.tabId],
|
|
181
215
|
index: index,
|
|
182
|
-
active: activeTabId ===
|
|
216
|
+
active: activeTabId === item.tabId,
|
|
183
217
|
prefixCls: prefixCls,
|
|
184
218
|
draggable: draggable,
|
|
185
219
|
onTabClick: onClickTab,
|
|
@@ -191,46 +225,30 @@ var TabList = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
|
191
225
|
onDragEnd: onDragEnd,
|
|
192
226
|
direction: direction
|
|
193
227
|
}));
|
|
194
|
-
}), type === 'line'
|
|
195
|
-
translate: direction === 'horizontal' ? translateX : translateY,
|
|
228
|
+
}), type === 'line' ? /*#__PURE__*/React.createElement(TabInk, {
|
|
196
229
|
prefixCls: prefixCls,
|
|
197
230
|
direction: direction,
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
className: prefixCls + "__right-btn",
|
|
203
|
-
icon: /*#__PURE__*/React.createElement(RightOutlined, null),
|
|
204
|
-
onClick: function onClick() {
|
|
205
|
-
if (scrollRef && innerRef) {
|
|
206
|
-
var scrollWidth = scrollRef.clientWidth;
|
|
207
|
-
var innerWidth = innerRef.clientWidth;
|
|
208
|
-
var canScrollWidth = scrollWidth - innerWidth + translateX;
|
|
209
|
-
var moveWidth = canScrollWidth < innerWidth ? canScrollWidth : innerWidth;
|
|
210
|
-
setTranslateX(function (prev) {
|
|
211
|
-
return prev - moveWidth;
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}), showScrollBtn && direction === 'vertical' && /*#__PURE__*/React.createElement(IconButton, {
|
|
231
|
+
activeItemElement: itemsRef.current[activeTabId],
|
|
232
|
+
activeTabId: activeTabId,
|
|
233
|
+
getTabOffset: getTabOffset
|
|
234
|
+
}) : null)), showScrollBtn ? /*#__PURE__*/React.createElement(IconButton, {
|
|
216
235
|
effect: true,
|
|
217
|
-
className: prefixCls + "__down-btn",
|
|
218
|
-
|
|
236
|
+
className: showHorizontal ? prefixCls + "__right-btn" : prefixCls + "__down-btn",
|
|
237
|
+
disabled: translateBoundPos === -translatePos,
|
|
238
|
+
icon: showHorizontal ? /*#__PURE__*/React.createElement(RightOutlined, null) : /*#__PURE__*/React.createElement(DownOutlined, null),
|
|
219
239
|
onClick: function onClick() {
|
|
220
|
-
if (
|
|
221
|
-
|
|
222
|
-
var moveWidth = 0;
|
|
240
|
+
if (!scrollElement) return;
|
|
241
|
+
if (!innerElement) return; // 向后面滚动
|
|
223
242
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
243
|
+
var scrollSize = getClientSize(scrollElement);
|
|
244
|
+
var innerSize = getClientSize(innerElement);
|
|
245
|
+
var canScrollWidth = scrollSize - innerSize + translatePos;
|
|
246
|
+
var moveWidth = canScrollWidth < innerSize ? canScrollWidth : innerSize;
|
|
247
|
+
setTranslatePos(function (prev) {
|
|
248
|
+
return prev - moveWidth;
|
|
249
|
+
});
|
|
232
250
|
}
|
|
233
|
-
}), editable ? /*#__PURE__*/React.createElement(IconButton, {
|
|
251
|
+
}) : null, editable ? /*#__PURE__*/React.createElement(IconButton, {
|
|
234
252
|
icon: /*#__PURE__*/React.createElement(PlusOutlined, null),
|
|
235
253
|
className: prefixCls + "__add-btn",
|
|
236
254
|
onClick: onAdd
|
package/lib/esm/TabPane.js
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { __rest } from 'tslib';
|
|
11
11
|
import React from 'react';
|
|
12
|
+
import { filterProps } from '@hi-ui/react-utils';
|
|
13
|
+
var omitProps = ['tabId', 'tabTitle', 'disabled', 'tabDesc', 'closeable'];
|
|
12
14
|
|
|
13
15
|
var TabPane = function TabPane(_a) {
|
|
14
16
|
var children = _a.children,
|
|
@@ -17,10 +19,11 @@ var TabPane = function TabPane(_a) {
|
|
|
17
19
|
active = _a.active,
|
|
18
20
|
rest = __rest(_a, ["children", "className", "style", "active"]);
|
|
19
21
|
|
|
22
|
+
var htmlProps = filterProps(rest, omitProps);
|
|
20
23
|
return /*#__PURE__*/React.createElement("div", Object.assign({
|
|
21
24
|
style: style,
|
|
22
25
|
className: className
|
|
23
|
-
},
|
|
26
|
+
}, htmlProps), active ? children : null);
|
|
24
27
|
};
|
|
25
28
|
|
|
26
29
|
export { TabPane };
|
package/lib/esm/hooks/index.js
CHANGED
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { useRef, useEffect } from 'react';
|
|
11
11
|
import { useLatestRef, useLatestCallback } from '@hi-ui/use-latest';
|
|
12
|
+
import { useUnmountEffect } from '@hi-ui/use-unmount-effect';
|
|
13
|
+
/**
|
|
14
|
+
* 响应式监听元素的 size 变化
|
|
15
|
+
*/
|
|
12
16
|
|
|
13
17
|
var useResizeObserver = function useResizeObserver(_ref) {
|
|
14
18
|
var element = _ref.element,
|
|
@@ -19,9 +23,11 @@ var useResizeObserver = function useResizeObserver(_ref) {
|
|
|
19
23
|
var getSizeLatestRef = useLatestRef(getSize);
|
|
20
24
|
var onResizeLatest = useLatestCallback(onResize);
|
|
21
25
|
var prevSizeRef = useRef(initialSize);
|
|
26
|
+
var unmountRef = useUnmountEffect();
|
|
22
27
|
useEffect(function () {
|
|
23
28
|
if (element) {
|
|
24
29
|
var _resizeObserver = new ResizeObserver(function () {
|
|
30
|
+
if (unmountRef.current) return;
|
|
25
31
|
var getSize = getSizeLatestRef.current;
|
|
26
32
|
|
|
27
33
|
if (element) {
|
|
@@ -42,7 +48,7 @@ var useResizeObserver = function useResizeObserver(_ref) {
|
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
return function () {};
|
|
45
|
-
}, [element, getSizeLatestRef, onResizeLatest]);
|
|
51
|
+
}, [element, getSizeLatestRef, onResizeLatest, unmountRef]);
|
|
46
52
|
};
|
|
47
53
|
|
|
48
54
|
export { useResizeObserver };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/tabs
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/tabs#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HIUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
import { isArrayNonEmpty } from '@hi-ui/type-assertion';
|
|
11
|
+
|
|
12
|
+
var getNextTabId = function getNextTabId(data, tabId) {
|
|
13
|
+
if (isArrayNonEmpty(data)) {
|
|
14
|
+
var itemIndex = data.findIndex(function (item) {
|
|
15
|
+
return item.tabId === tabId;
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
if (itemIndex !== -1 && data[itemIndex + 1]) {
|
|
19
|
+
return data[itemIndex + 1].tabId;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return null;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { getNextTabId };
|
package/lib/types/TabInk.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export declare const TabInk: React.FC<TabInkProps>;
|
|
3
3
|
interface TabInkProps {
|
|
4
|
-
disabled?: boolean;
|
|
5
4
|
prefixCls?: string;
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
activeItemElement: HTMLElement | null;
|
|
8
7
|
direction: 'vertical' | 'horizontal';
|
|
9
|
-
|
|
8
|
+
activeTabId: React.ReactText;
|
|
9
|
+
getTabOffset: (tabId: React.ReactText) => number;
|
|
10
10
|
}
|
|
11
11
|
export {};
|
|
@@ -4,5 +4,8 @@ interface UseResizeObserverProps {
|
|
|
4
4
|
initialSize?: any;
|
|
5
5
|
getSize?: (element: HTMLElement) => any;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* 响应式监听元素的 size 变化
|
|
9
|
+
*/
|
|
7
10
|
export declare const useResizeObserver: ({ element, onResize, initialSize, getSize, }: UseResizeObserverProps) => void;
|
|
8
11
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hi-ui/tabs",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.21",
|
|
4
4
|
"description": "A sub-package for @hi-ui/hiui.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"author": "HIUI <mi-hiui@xiaomi.com>",
|
|
@@ -47,11 +47,13 @@
|
|
|
47
47
|
"@hi-ui/core": "^4.0.0-beta.9",
|
|
48
48
|
"@hi-ui/core-css": "^4.0.0-beta.5",
|
|
49
49
|
"@hi-ui/env": "^4.0.0-beta.1",
|
|
50
|
-
"@hi-ui/icon-button": "^4.0.0-beta.
|
|
50
|
+
"@hi-ui/icon-button": "^4.0.0-beta.11",
|
|
51
51
|
"@hi-ui/icons": "^4.0.0-beta.11",
|
|
52
|
+
"@hi-ui/react-utils": "^4.0.0-beta.6",
|
|
52
53
|
"@hi-ui/type-assertion": "^4.0.0-beta.5",
|
|
53
54
|
"@hi-ui/use-latest": "^4.0.0-beta.5",
|
|
54
|
-
"@hi-ui/use-uncontrolled-state": "^4.0.0-beta.5"
|
|
55
|
+
"@hi-ui/use-uncontrolled-state": "^4.0.0-beta.5",
|
|
56
|
+
"@hi-ui/use-unmount-effect": "^4.0.0-beta.7"
|
|
55
57
|
},
|
|
56
58
|
"peerDependencies": {
|
|
57
59
|
"react": ">=16.8.6",
|
|
@@ -62,5 +64,5 @@
|
|
|
62
64
|
"react": "^17.0.1",
|
|
63
65
|
"react-dom": "^17.0.1"
|
|
64
66
|
},
|
|
65
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "a59dd6b403457d48fea690a9c6f50b701a8e667b"
|
|
66
68
|
}
|