@rainbow-oh/yee-c 0.14.2 → 0.14.4
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/dist/cjs/Form/index.d.ts +1 -1
- package/dist/cjs/Splitter/demo/animation.d.ts +3 -0
- package/dist/cjs/Splitter/demo/animation.js +43 -0
- package/dist/cjs/Splitter/hooks/useMove.d.ts +1 -1
- package/dist/cjs/Splitter/hooks/useMove.js +3 -1
- package/dist/cjs/Splitter/interface.d.ts +6 -0
- package/dist/cjs/Splitter/splitter-handler.d.ts +3 -1
- package/dist/cjs/Splitter/splitter-handler.js +3 -2
- package/dist/cjs/Splitter/splitter.js +79 -11
- package/dist/cjs/style/themes.css +1 -1
- package/dist/cjs/style/variables.css +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/Form/index.d.ts +1 -1
- package/dist/esm/Splitter/demo/animation.d.ts +3 -0
- package/dist/esm/Splitter/demo/animation.js +51 -0
- package/dist/esm/Splitter/hooks/useMove.d.ts +1 -1
- package/dist/esm/Splitter/hooks/useMove.js +3 -1
- package/dist/esm/Splitter/interface.d.ts +6 -0
- package/dist/esm/Splitter/splitter-handler.d.ts +3 -1
- package/dist/esm/Splitter/splitter-handler.js +3 -2
- package/dist/esm/Splitter/splitter.js +107 -14
- package/dist/esm/style/themes.css +1 -1
- package/dist/esm/style/variables.css +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/yee-c.min.js +1 -1
- package/package.json +1 -1
- package/src/Form/index.ts +1 -0
- package/src/Splitter/demo/animation.tsx +29 -0
- package/src/Splitter/hooks/useMove.ts +3 -0
- package/src/Splitter/index.en-US.md +2 -0
- package/src/Splitter/index.zh-CN.md +2 -0
- package/src/Splitter/interface.ts +6 -0
- package/src/Splitter/splitter-handler.tsx +4 -1
- package/src/Splitter/splitter.tsx +93 -6
- package/src/version.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
var _excluded = ["children", "itemsSize", "onClick"],
|
|
3
|
-
_excluded2 = ["prefixCls", "className", "layout", "children", "bordered", "onResize"];
|
|
2
|
+
var _excluded = ["children", "itemsSize", "itemTransition", "animation", "onDraggingChange", "onClick"],
|
|
3
|
+
_excluded2 = ["prefixCls", "className", "layout", "children", "bordered", "onResize", "animation"];
|
|
4
4
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
5
5
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
6
6
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
@@ -35,10 +35,13 @@ var getPanelSize = function getPanelSize(children, _ref) {
|
|
|
35
35
|
var totalSize = _ref.totalSize,
|
|
36
36
|
layout = _ref.layout;
|
|
37
37
|
var panelsRect = [];
|
|
38
|
-
|
|
38
|
+
// toArray 剔除 null/undefined/boolean(如 `{open ? <Item/> : null}` 条件面板)。
|
|
39
|
+
// Children.count 会把 null 也计为一面板,导致 auto 面板被平分出错误尺寸。
|
|
40
|
+
var items = React.Children.toArray(children);
|
|
41
|
+
var count = items.length;
|
|
39
42
|
var remainingSize = totalSize;
|
|
40
43
|
var remainingItem = count;
|
|
41
|
-
|
|
44
|
+
items.forEach(function (child) {
|
|
42
45
|
if ( /*#__PURE__*/React.isValidElement(child)) {
|
|
43
46
|
var _ref2 = child.props || {},
|
|
44
47
|
style = _ref2.style,
|
|
@@ -100,6 +103,8 @@ var getPanelSize = function getPanelSize(children, _ref) {
|
|
|
100
103
|
});
|
|
101
104
|
panelsRect.forEach(function (item) {
|
|
102
105
|
if (item.type === 'default') {
|
|
106
|
+
// currentSize 缺失会导致 Wrapper 注入的 flexBasis 为空,defaultSize 失效(宽度由内容撑开)
|
|
107
|
+
item.currentSize = item.size;
|
|
103
108
|
remainingSize -= item.size || 0;
|
|
104
109
|
remainingItem--;
|
|
105
110
|
} else if (item.type === 'percent') {
|
|
@@ -112,7 +117,8 @@ var getPanelSize = function getPanelSize(children, _ref) {
|
|
|
112
117
|
if (remainingItem > 0) {
|
|
113
118
|
panelsRect.forEach(function (item) {
|
|
114
119
|
if (item.type === 'auto') {
|
|
115
|
-
|
|
120
|
+
// 显式尺寸总和超出 totalSize 时 remainingSize 为负,负 flexBasis 会被浏览器丢弃导致面板回退内容尺寸
|
|
121
|
+
item.size = Math.max(0, remainingSize / remainingItem);
|
|
116
122
|
item.currentSize = item.size;
|
|
117
123
|
}
|
|
118
124
|
});
|
|
@@ -122,12 +128,16 @@ var getPanelSize = function getPanelSize(children, _ref) {
|
|
|
122
128
|
var Wrapper = function Wrapper(_ref3) {
|
|
123
129
|
var children = _ref3.children,
|
|
124
130
|
itemsSize = _ref3.itemsSize,
|
|
131
|
+
itemTransition = _ref3.itemTransition,
|
|
132
|
+
animation = _ref3.animation,
|
|
133
|
+
onDraggingChange = _ref3.onDraggingChange,
|
|
125
134
|
onClick = _ref3.onClick,
|
|
126
135
|
props = _objectWithoutProperties(_ref3, _excluded);
|
|
127
136
|
var wrappered = [];
|
|
128
137
|
var refs = useRef({});
|
|
138
|
+
// 与 getPanelSize 同口径:toArray 剔除 null,index/handler 判断不受条件渲染干扰
|
|
129
139
|
var arr = React.Children.toArray(children);
|
|
130
|
-
|
|
140
|
+
arr.forEach(function (child, index) {
|
|
131
141
|
if ( /*#__PURE__*/React.isValidElement(child)) {
|
|
132
142
|
var n = index + 1;
|
|
133
143
|
var _ref4 = child.props || {},
|
|
@@ -145,7 +155,9 @@ var Wrapper = function Wrapper(_ref3) {
|
|
|
145
155
|
// @ts-ignore
|
|
146
156
|
style: _objectSpread(_objectSpread({}, style), {}, {
|
|
147
157
|
// If there is a border or other size-related design, it may cause calculation issues
|
|
148
|
-
flexBasis: currentSize
|
|
158
|
+
flexBasis: currentSize,
|
|
159
|
+
// animation 模式下受控尺寸变更走 flex-basis 过渡;拖拽期间为 undefined 保证跟手
|
|
160
|
+
transition: itemTransition
|
|
149
161
|
}),
|
|
150
162
|
min: min,
|
|
151
163
|
max: max,
|
|
@@ -186,15 +198,64 @@ var Wrapper = function Wrapper(_ref3) {
|
|
|
186
198
|
flexable: flexable,
|
|
187
199
|
expandable: _expandable,
|
|
188
200
|
onClick: onClick,
|
|
201
|
+
onDraggingChange: onDraggingChange,
|
|
189
202
|
key: "handler-".concat(n)
|
|
190
203
|
})));
|
|
191
204
|
}
|
|
192
205
|
});
|
|
206
|
+
|
|
207
|
+
// ── 出场动画:children 数量减少(条件渲染的面板卸载)时,保留上一次渲染的
|
|
208
|
+
// 尾部面板克隆,flex-basis 过渡到 0 后再真正移除,避免右栏瞬间消失导致跳变。
|
|
209
|
+
var prevCountRef = React.useRef(arr.length);
|
|
210
|
+
var prevClonesRef = React.useRef([]);
|
|
211
|
+
var _React$useState = React.useState([]),
|
|
212
|
+
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
213
|
+
exiting = _React$useState2[0],
|
|
214
|
+
setExiting = _React$useState2[1];
|
|
215
|
+
React.useEffect(function () {
|
|
216
|
+
var prevCount = prevCountRef.current;
|
|
217
|
+
prevCountRef.current = arr.length;
|
|
218
|
+
if (!animation || arr.length >= prevCount) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
// 上一帧克隆里已带原 flex-basis(本帧 records 已不含被移除面板)
|
|
222
|
+
var removed = prevClonesRef.current.slice(arr.length);
|
|
223
|
+
if (!removed.length) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
setExiting(removed);
|
|
227
|
+
// 第二阶段:下一帧 flex-basis 归 0,触发过渡
|
|
228
|
+
var raf = requestAnimationFrame(function () {
|
|
229
|
+
setExiting(function (list) {
|
|
230
|
+
return list.map(function (el) {
|
|
231
|
+
return /*#__PURE__*/React.cloneElement(el, {
|
|
232
|
+
style: _objectSpread(_objectSpread({}, el.props.style), {}, {
|
|
233
|
+
flexBasis: 0
|
|
234
|
+
})
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
var timer = window.setTimeout(function () {
|
|
240
|
+
return setExiting([]);
|
|
241
|
+
}, 320);
|
|
242
|
+
return function () {
|
|
243
|
+
// 过渡期间面板重新打开:立即丢弃残留克隆
|
|
244
|
+
cancelAnimationFrame(raf);
|
|
245
|
+
window.clearTimeout(timer);
|
|
246
|
+
setExiting([]);
|
|
247
|
+
};
|
|
248
|
+
}, [arr.length, animation]);
|
|
249
|
+
|
|
250
|
+
// 记录本帧克隆,供下一次渲染的移除检测读取(声明在其后:上方 effect 读到的是旧值)
|
|
251
|
+
React.useEffect(function () {
|
|
252
|
+
prevClonesRef.current = wrappered;
|
|
253
|
+
});
|
|
193
254
|
return /*#__PURE__*/React.createElement(SplitterWrapperCtx.Provider, {
|
|
194
255
|
value: {
|
|
195
256
|
refs: refs
|
|
196
257
|
}
|
|
197
|
-
}, wrappered);
|
|
258
|
+
}, wrappered, exiting);
|
|
198
259
|
};
|
|
199
260
|
var Splitter = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
|
|
200
261
|
var _useContext = useContext(GlobalContext),
|
|
@@ -208,6 +269,7 @@ var Splitter = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
|
|
|
208
269
|
children = props.children,
|
|
209
270
|
bordered = props.bordered,
|
|
210
271
|
onResize = props.onResize,
|
|
272
|
+
animation = props.animation,
|
|
211
273
|
rest = _objectWithoutProperties(props, _excluded2);
|
|
212
274
|
var internalRef = useRef(null);
|
|
213
275
|
var componentRef = ref || internalRef;
|
|
@@ -215,6 +277,14 @@ var Splitter = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
|
|
|
215
277
|
_useState2 = _slicedToArray(_useState, 2),
|
|
216
278
|
records = _useState2[0],
|
|
217
279
|
setRecords = _useState2[1];
|
|
280
|
+
|
|
281
|
+
// animation 模式:拖拽期间关掉面板的 flex-basis 过渡(onMove 直接写 DOM,过渡会导致跟不
|
|
282
|
+
// 上鼠标);其余程序性尺寸变更(受控 size、collapsible 收展、面板增减)都走过渡。
|
|
283
|
+
var _React$useState3 = React.useState(false),
|
|
284
|
+
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
|
285
|
+
dragging = _React$useState4[0],
|
|
286
|
+
setDragging = _React$useState4[1];
|
|
287
|
+
var itemTransition = animation ? dragging ? undefined : 'flex-basis 0.28s cubic-bezier(0.22, 0.61, 0.36, 1)' : undefined;
|
|
218
288
|
var handleClick = function handleClick(index, action) {
|
|
219
289
|
var c = index - 1;
|
|
220
290
|
var newRecords = _toConsumableArray(records);
|
|
@@ -232,10 +302,10 @@ var Splitter = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
|
|
|
232
302
|
setRecords(newRecords);
|
|
233
303
|
};
|
|
234
304
|
var cls = clsx(prefixCls, ["".concat(prefixCls, "-").concat(layout)], _defineProperty({}, "".concat(prefixCls, "-bordered"), bordered), className);
|
|
235
|
-
var _React$
|
|
236
|
-
_React$
|
|
237
|
-
totalSize = _React$
|
|
238
|
-
setTotalSize = _React$
|
|
305
|
+
var _React$useState5 = React.useState(0),
|
|
306
|
+
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
|
307
|
+
totalSize = _React$useState6[0],
|
|
308
|
+
setTotalSize = _React$useState6[1];
|
|
239
309
|
var updateTotalSize = function updateTotalSize(ele) {
|
|
240
310
|
if (layout === 'horizontal') {
|
|
241
311
|
setTotalSize(ele.offsetWidth);
|
|
@@ -260,15 +330,35 @@ var Splitter = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
|
|
|
260
330
|
};
|
|
261
331
|
}
|
|
262
332
|
}, [layout]);
|
|
333
|
+
var prevPanelCountRef = React.useRef(-1);
|
|
263
334
|
React.useEffect(function () {
|
|
264
335
|
if (totalSize) {
|
|
265
336
|
var panelsSize = getPanelSize(children, {
|
|
266
337
|
totalSize: totalSize,
|
|
267
338
|
layout: layout
|
|
268
339
|
});
|
|
340
|
+
// animation 模式下面板新增(条件渲染的面板挂载)时先以 0 尺寸入库,下一帧再落到
|
|
341
|
+
// 目标尺寸,配合 flex-basis 过渡播放入场动画;否则新面板瞬间撑开、旧面板瞬间收窄。
|
|
342
|
+
var prevCount = prevPanelCountRef.current;
|
|
343
|
+
prevPanelCountRef.current = panelsSize.length;
|
|
344
|
+
if (animation && prevCount >= 0 && panelsSize.length > prevCount) {
|
|
345
|
+
panelsSize.slice(prevCount).forEach(function (item) {
|
|
346
|
+
item.currentSize = 0;
|
|
347
|
+
});
|
|
348
|
+
setRecords(panelsSize);
|
|
349
|
+
var raf = requestAnimationFrame(function () {
|
|
350
|
+
setRecords(getPanelSize(children, {
|
|
351
|
+
totalSize: totalSize,
|
|
352
|
+
layout: layout
|
|
353
|
+
}));
|
|
354
|
+
});
|
|
355
|
+
return function () {
|
|
356
|
+
return cancelAnimationFrame(raf);
|
|
357
|
+
};
|
|
358
|
+
}
|
|
269
359
|
setRecords(panelsSize);
|
|
270
360
|
}
|
|
271
|
-
}, [children, totalSize, layout]);
|
|
361
|
+
}, [children, totalSize, layout, animation]);
|
|
272
362
|
return /*#__PURE__*/React.createElement("div", _extends({
|
|
273
363
|
className: cls
|
|
274
364
|
}, rest, {
|
|
@@ -284,7 +374,10 @@ var Splitter = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
|
|
|
284
374
|
setRecords: setRecords,
|
|
285
375
|
totalSize: totalSize,
|
|
286
376
|
itemsSize: records,
|
|
287
|
-
onClick: handleClick
|
|
377
|
+
onClick: handleClick,
|
|
378
|
+
animation: animation,
|
|
379
|
+
itemTransition: itemTransition,
|
|
380
|
+
onDraggingChange: setDragging
|
|
288
381
|
}, children)));
|
|
289
382
|
});
|
|
290
383
|
Splitter.displayName = 'Splitter';
|
package/dist/esm/version.d.ts
CHANGED
package/dist/esm/version.js
CHANGED