@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.
Files changed (37) hide show
  1. package/dist/cjs/Form/index.d.ts +1 -1
  2. package/dist/cjs/Splitter/demo/animation.d.ts +3 -0
  3. package/dist/cjs/Splitter/demo/animation.js +43 -0
  4. package/dist/cjs/Splitter/hooks/useMove.d.ts +1 -1
  5. package/dist/cjs/Splitter/hooks/useMove.js +3 -1
  6. package/dist/cjs/Splitter/interface.d.ts +6 -0
  7. package/dist/cjs/Splitter/splitter-handler.d.ts +3 -1
  8. package/dist/cjs/Splitter/splitter-handler.js +3 -2
  9. package/dist/cjs/Splitter/splitter.js +79 -11
  10. package/dist/cjs/style/themes.css +1 -1
  11. package/dist/cjs/style/variables.css +1 -1
  12. package/dist/cjs/version.d.ts +1 -1
  13. package/dist/cjs/version.js +1 -1
  14. package/dist/esm/Form/index.d.ts +1 -1
  15. package/dist/esm/Splitter/demo/animation.d.ts +3 -0
  16. package/dist/esm/Splitter/demo/animation.js +51 -0
  17. package/dist/esm/Splitter/hooks/useMove.d.ts +1 -1
  18. package/dist/esm/Splitter/hooks/useMove.js +3 -1
  19. package/dist/esm/Splitter/interface.d.ts +6 -0
  20. package/dist/esm/Splitter/splitter-handler.d.ts +3 -1
  21. package/dist/esm/Splitter/splitter-handler.js +3 -2
  22. package/dist/esm/Splitter/splitter.js +107 -14
  23. package/dist/esm/style/themes.css +1 -1
  24. package/dist/esm/style/variables.css +1 -1
  25. package/dist/esm/version.d.ts +1 -1
  26. package/dist/esm/version.js +1 -1
  27. package/dist/umd/yee-c.min.js +1 -1
  28. package/package.json +1 -1
  29. package/src/Form/index.ts +1 -0
  30. package/src/Splitter/demo/animation.tsx +29 -0
  31. package/src/Splitter/hooks/useMove.ts +3 -0
  32. package/src/Splitter/index.en-US.md +2 -0
  33. package/src/Splitter/index.zh-CN.md +2 -0
  34. package/src/Splitter/interface.ts +6 -0
  35. package/src/Splitter/splitter-handler.tsx +4 -1
  36. package/src/Splitter/splitter.tsx +93 -6
  37. 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
- var count = React.Children.count(children);
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
- React.Children.forEach(children, function (child) {
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
- item.size = remainingSize / remainingItem;
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
- React.Children.forEach(children, function (child, index) {
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$useState = React.useState(0),
236
- _React$useState2 = _slicedToArray(_React$useState, 2),
237
- totalSize = _React$useState2[0],
238
- setTotalSize = _React$useState2[1];
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';
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-09-20T02:38:16.830Z
4
+ * Generated on 2026-09-23T09:41:24.738Z
5
5
  */
6
6
 
7
7
  /* ========== color.blue.css ========== */
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-09-20T02:38:16.830Z
4
+ * Generated on 2026-09-23T09:41:24.738Z
5
5
  */
6
6
 
7
7
  /* ========== color.css ========== */
@@ -3,4 +3,4 @@ declare global {
3
3
  __yee_c_version__: string;
4
4
  }
5
5
  }
6
- export declare const version = "0.14.2";
6
+ export declare const version = "0.14.4";
@@ -1,4 +1,4 @@
1
- export var version = "0.14.2";
1
+ export var version = "0.14.4";
2
2
  if (typeof window !== 'undefined') {
3
3
  window.__yee_c_version__ = version;
4
4
  }