@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
@@ -16,5 +16,5 @@ type FormInterface = typeof InternalForm & {
16
16
  List: typeof List;
17
17
  };
18
18
  declare const Form: FormInterface;
19
- export type { FieldGroupProps, FieldStatus, FieldStatusData, FormInstance, FormListProps, FormProps, ValidateMessage, } from './interface';
19
+ export type { FieldGroupProps, FieldStatus, FieldStatusData, FormInstance, FormListProps, FormProps, Rule as FormRule, ValidateMessage, } from './interface';
20
20
  export default Form;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,43 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/Splitter/demo/animation.tsx
30
+ var animation_exports = {};
31
+ __export(animation_exports, {
32
+ default: () => animation_default
33
+ });
34
+ module.exports = __toCommonJS(animation_exports);
35
+ var import_yee_c = require("../..");
36
+ var import_react = __toESM(require("react"));
37
+ var animation_default = () => {
38
+ const [open, setOpen] = import_react.default.useState(false);
39
+ return /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { style: { marginBottom: 8 } }, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { type: "primary", onClick: () => setOpen((v) => !v) }, open ? "Close Panel" : "Open Panel")), /* @__PURE__ */ import_react.default.createElement("div", { style: { height: 300 } }, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Splitter, { animation: true }, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Splitter.Item, { min: "30%" }, /* @__PURE__ */ import_react.default.createElement("div", { style: { padding: 16, backgroundColor: "#f0f0f0" } }, "Content Panel")), open ? (
40
+ // 条件渲染的面板:挂载时从 0 展开到目标尺寸,卸载时过渡收合到 0 后移除
41
+ /* @__PURE__ */ import_react.default.createElement(import_yee_c.Splitter.Item, { size: "40%", min: "200px", max: "60%" }, /* @__PURE__ */ import_react.default.createElement("div", { style: { padding: 16, backgroundColor: "#e0e0e0" } }, "Assistant Panel"))
42
+ ) : null)));
43
+ };
@@ -1,2 +1,2 @@
1
1
  import * as React from 'react';
2
- export default function useMove(handler: React.RefObject<HTMLDivElement | null>, direction: 'horizontal' | 'vertical', onMove: (dis: number) => void): boolean[];
2
+ export default function useMove(handler: React.RefObject<HTMLDivElement | null>, direction: 'horizontal' | 'vertical', onMove: (dis: number) => void, onMovingChange?: (moving: boolean) => void): boolean[];
@@ -34,7 +34,7 @@ __export(useMove_exports, {
34
34
  module.exports = __toCommonJS(useMove_exports);
35
35
  var React = __toESM(require("react"));
36
36
  var import_debounce = __toESM(require("../../utils/debounce"));
37
- function useMove(handler, direction, onMove) {
37
+ function useMove(handler, direction, onMove, onMovingChange) {
38
38
  const [moving, setMoving] = React.useState(false);
39
39
  const moveTarget = (distance) => {
40
40
  onMove(distance);
@@ -48,6 +48,7 @@ function useMove(handler, direction, onMove) {
48
48
  let x = e.pageX;
49
49
  let y = e.pageY;
50
50
  setMoving(true);
51
+ onMovingChange == null ? void 0 : onMovingChange(true);
51
52
  const onMouseMove = (0, import_debounce.default)((e2) => {
52
53
  document.body.style.userSelect = "none";
53
54
  document.body.style.cursor = direction === "horizontal" ? "col-resize" : "row-resize";
@@ -63,6 +64,7 @@ function useMove(handler, direction, onMove) {
63
64
  }, 5);
64
65
  const onMouseUp = () => {
65
66
  setMoving(false);
67
+ onMovingChange == null ? void 0 : onMovingChange(false);
66
68
  window.removeEventListener("mousemove", onMouseMove);
67
69
  window.removeEventListener("mouseup", onMouseUp);
68
70
  ele.removeEventListener("mouseup", onMouseUp);
@@ -83,4 +83,10 @@ export interface SplitterProps extends DataAttributeProps {
83
83
  * panel size change event
84
84
  * */
85
85
  onResize?: (sizes: PanelRect[]) => void;
86
+ /**
87
+ * animate programmatic size changes and panel mount/unmount with a
88
+ * flex-basis transition; dragging always tracks the pointer in real time
89
+ * @default false
90
+ */
91
+ animation?: boolean;
86
92
  }
@@ -17,6 +17,8 @@ interface SplitterHandlerProps {
17
17
  start: HTMLDivElement;
18
18
  end: HTMLDivElement;
19
19
  }) => void;
20
+ /** 拖拽开始/结束回调(animation 模式下拖拽期间需关闭 flex-basis 过渡) */
21
+ onDraggingChange?: (dragging: boolean) => void;
20
22
  }
21
- declare const SplitterHandler: ({ layout, resizable, collapsible, index, records, setRecords, onClick, }: SplitterHandlerProps) => React.JSX.Element;
23
+ declare const SplitterHandler: ({ layout, resizable, collapsible, index, records, setRecords, onClick, onDraggingChange, }: SplitterHandlerProps) => React.JSX.Element;
22
24
  export default SplitterHandler;
@@ -61,7 +61,8 @@ var SplitterHandler = ({
61
61
  index,
62
62
  records,
63
63
  setRecords,
64
- onClick
64
+ onClick,
65
+ onDraggingChange
65
66
  }) => {
66
67
  const { start, end } = collapsible ? typeof collapsible === "boolean" ? { start: true, end: true } : collapsible : {};
67
68
  const cref = (0, import_react.useRef)(null);
@@ -108,7 +109,7 @@ var SplitterHandler = ({
108
109
  return newState;
109
110
  });
110
111
  };
111
- (0, import_useMove.default)(handler, layout, onMove);
112
+ (0, import_useMove.default)(handler, layout, onMove, onDraggingChange);
112
113
  const handleClick = (action) => {
113
114
  const eles = refs.current;
114
115
  const { el: start2 } = eles[`item${index}`];
@@ -80,10 +80,11 @@ var getPanelSize = (children, {
80
80
  layout
81
81
  }) => {
82
82
  const panelsRect = [];
83
- const count = import_react.default.Children.count(children);
83
+ const items = import_react.default.Children.toArray(children);
84
+ const count = items.length;
84
85
  let remainingSize = totalSize;
85
86
  let remainingItem = count;
86
- import_react.default.Children.forEach(children, (child) => {
87
+ items.forEach((child) => {
87
88
  if (import_react.default.isValidElement(child)) {
88
89
  const { style, size, defaultSize, min, max } = child.props || {};
89
90
  const styleSize = style ? layout === "horizontal" ? style.width : style.height : void 0;
@@ -140,6 +141,7 @@ var getPanelSize = (children, {
140
141
  });
141
142
  panelsRect.forEach((item) => {
142
143
  if (item.type === "default") {
144
+ item.currentSize = item.size;
143
145
  remainingSize -= item.size || 0;
144
146
  remainingItem--;
145
147
  } else if (item.type === "percent") {
@@ -152,7 +154,7 @@ var getPanelSize = (children, {
152
154
  if (remainingItem > 0) {
153
155
  panelsRect.forEach((item) => {
154
156
  if (item.type === "auto") {
155
- item.size = remainingSize / remainingItem;
157
+ item.size = Math.max(0, remainingSize / remainingItem);
156
158
  item.currentSize = item.size;
157
159
  }
158
160
  });
@@ -160,11 +162,25 @@ var getPanelSize = (children, {
160
162
  return panelsRect;
161
163
  };
162
164
  var Wrapper = (_a) => {
163
- var _b = _a, { children, itemsSize, onClick } = _b, props = __objRest(_b, ["children", "itemsSize", "onClick"]);
165
+ var _b = _a, {
166
+ children,
167
+ itemsSize,
168
+ itemTransition,
169
+ animation,
170
+ onDraggingChange,
171
+ onClick
172
+ } = _b, props = __objRest(_b, [
173
+ "children",
174
+ "itemsSize",
175
+ "itemTransition",
176
+ "animation",
177
+ "onDraggingChange",
178
+ "onClick"
179
+ ]);
164
180
  const wrappered = [];
165
181
  const refs = (0, import_react.useRef)({});
166
182
  const arr = import_react.default.Children.toArray(children);
167
- import_react.default.Children.forEach(children, (child, index) => {
183
+ arr.forEach((child, index) => {
168
184
  if (import_react.default.isValidElement(child)) {
169
185
  const n = index + 1;
170
186
  const { style } = child.props || {};
@@ -179,7 +195,9 @@ var Wrapper = (_a) => {
179
195
  // @ts-ignore
180
196
  style: __spreadProps(__spreadValues({}, style), {
181
197
  // If there is a border or other size-related design, it may cause calculation issues
182
- flexBasis: currentSize
198
+ flexBasis: currentSize,
199
+ // animation 模式下受控尺寸变更走 flex-basis 过渡;拖拽期间为 undefined 保证跟手
200
+ transition: itemTransition
183
201
  }),
184
202
  min,
185
203
  max,
@@ -215,13 +233,43 @@ var Wrapper = (_a) => {
215
233
  flexable,
216
234
  expandable: _expandable,
217
235
  onClick,
236
+ onDraggingChange,
218
237
  key: `handler-${n}`
219
238
  })
220
239
  )
221
240
  );
222
241
  }
223
242
  });
224
- return /* @__PURE__ */ import_react.default.createElement(SplitterWrapperCtx.Provider, { value: { refs } }, wrappered);
243
+ const prevCountRef = import_react.default.useRef(arr.length);
244
+ const prevClonesRef = import_react.default.useRef([]);
245
+ const [exiting, setExiting] = import_react.default.useState([]);
246
+ import_react.default.useEffect(() => {
247
+ const prevCount = prevCountRef.current;
248
+ prevCountRef.current = arr.length;
249
+ if (!animation || arr.length >= prevCount) {
250
+ return;
251
+ }
252
+ const removed = prevClonesRef.current.slice(arr.length);
253
+ if (!removed.length) {
254
+ return;
255
+ }
256
+ setExiting(removed);
257
+ const raf = requestAnimationFrame(() => {
258
+ setExiting(
259
+ (list) => list.map((el) => import_react.default.cloneElement(el, { style: __spreadProps(__spreadValues({}, el.props.style), { flexBasis: 0 }) }))
260
+ );
261
+ });
262
+ const timer = window.setTimeout(() => setExiting([]), 320);
263
+ return () => {
264
+ cancelAnimationFrame(raf);
265
+ window.clearTimeout(timer);
266
+ setExiting([]);
267
+ };
268
+ }, [arr.length, animation]);
269
+ import_react.default.useEffect(() => {
270
+ prevClonesRef.current = wrappered;
271
+ });
272
+ return /* @__PURE__ */ import_react.default.createElement(SplitterWrapperCtx.Provider, { value: { refs } }, wrappered, exiting);
225
273
  };
226
274
  var Splitter = import_react.default.forwardRef(
227
275
  (baseprops, ref) => {
@@ -233,18 +281,22 @@ var Splitter = import_react.default.forwardRef(
233
281
  layout = "horizontal",
234
282
  children,
235
283
  bordered,
236
- onResize
284
+ onResize,
285
+ animation
237
286
  } = _a, rest = __objRest(_a, [
238
287
  "prefixCls",
239
288
  "className",
240
289
  "layout",
241
290
  "children",
242
291
  "bordered",
243
- "onResize"
292
+ "onResize",
293
+ "animation"
244
294
  ]);
245
295
  const internalRef = (0, import_react.useRef)(null);
246
296
  const componentRef = ref || internalRef;
247
297
  const [records, setRecords] = (0, import_react.useState)([]);
298
+ const [dragging, setDragging] = import_react.default.useState(false);
299
+ const itemTransition = animation ? dragging ? void 0 : "flex-basis 0.28s cubic-bezier(0.22, 0.61, 0.36, 1)" : void 0;
248
300
  const handleClick = (index, action) => {
249
301
  const c = index - 1;
250
302
  const newRecords = [...records];
@@ -294,15 +346,28 @@ var Splitter = import_react.default.forwardRef(
294
346
  };
295
347
  }
296
348
  }, [layout]);
349
+ const prevPanelCountRef = import_react.default.useRef(-1);
297
350
  import_react.default.useEffect(() => {
298
351
  if (totalSize) {
299
352
  const panelsSize = getPanelSize(children, {
300
353
  totalSize,
301
354
  layout
302
355
  });
356
+ const prevCount = prevPanelCountRef.current;
357
+ prevPanelCountRef.current = panelsSize.length;
358
+ if (animation && prevCount >= 0 && panelsSize.length > prevCount) {
359
+ panelsSize.slice(prevCount).forEach((item) => {
360
+ item.currentSize = 0;
361
+ });
362
+ setRecords(panelsSize);
363
+ const raf = requestAnimationFrame(() => {
364
+ setRecords(getPanelSize(children, { totalSize, layout }));
365
+ });
366
+ return () => cancelAnimationFrame(raf);
367
+ }
303
368
  setRecords(panelsSize);
304
369
  }
305
- }, [children, totalSize, layout]);
370
+ }, [children, totalSize, layout, animation]);
306
371
  return /* @__PURE__ */ import_react.default.createElement("div", __spreadProps(__spreadValues({ className: cls }, rest), { ref: componentRef }), /* @__PURE__ */ import_react.default.createElement(SplitterCtx.Provider, { value: { prefixCls, onResize } }, /* @__PURE__ */ import_react.default.createElement(
307
372
  Wrapper,
308
373
  {
@@ -311,7 +376,10 @@ var Splitter = import_react.default.forwardRef(
311
376
  setRecords,
312
377
  totalSize,
313
378
  itemsSize: records,
314
- onClick: handleClick
379
+ onClick: handleClick,
380
+ animation,
381
+ itemTransition,
382
+ onDraggingChange: setDragging
315
383
  },
316
384
  children
317
385
  )));
@@ -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";
@@ -22,7 +22,7 @@ __export(version_exports, {
22
22
  version: () => version
23
23
  });
24
24
  module.exports = __toCommonJS(version_exports);
25
- var version = "0.14.2";
25
+ var version = "0.14.4";
26
26
  if (typeof window !== "undefined") {
27
27
  window.__yee_c_version__ = version;
28
28
  }
@@ -16,5 +16,5 @@ type FormInterface = typeof InternalForm & {
16
16
  List: typeof List;
17
17
  };
18
18
  declare const Form: FormInterface;
19
- export type { FieldGroupProps, FieldStatus, FieldStatusData, FormInstance, FormListProps, FormProps, ValidateMessage, } from './interface';
19
+ export type { FieldGroupProps, FieldStatus, FieldStatusData, FormInstance, FormListProps, FormProps, Rule as FormRule, ValidateMessage, } from './interface';
20
20
  export default Form;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,51 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import { Button, Splitter } from "../..";
8
+ import React from 'react';
9
+ export default (function () {
10
+ var _React$useState = React.useState(false),
11
+ _React$useState2 = _slicedToArray(_React$useState, 2),
12
+ open = _React$useState2[0],
13
+ setOpen = _React$useState2[1];
14
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
15
+ style: {
16
+ marginBottom: 8
17
+ }
18
+ }, /*#__PURE__*/React.createElement(Button, {
19
+ type: "primary",
20
+ onClick: function onClick() {
21
+ return setOpen(function (v) {
22
+ return !v;
23
+ });
24
+ }
25
+ }, open ? 'Close Panel' : 'Open Panel')), /*#__PURE__*/React.createElement("div", {
26
+ style: {
27
+ height: 300
28
+ }
29
+ }, /*#__PURE__*/React.createElement(Splitter, {
30
+ animation: true
31
+ }, /*#__PURE__*/React.createElement(Splitter.Item, {
32
+ min: "30%"
33
+ }, /*#__PURE__*/React.createElement("div", {
34
+ style: {
35
+ padding: 16,
36
+ backgroundColor: '#f0f0f0'
37
+ }
38
+ }, "Content Panel")), open ?
39
+ /*#__PURE__*/
40
+ // 条件渲染的面板:挂载时从 0 展开到目标尺寸,卸载时过渡收合到 0 后移除
41
+ React.createElement(Splitter.Item, {
42
+ size: "40%",
43
+ min: "200px",
44
+ max: "60%"
45
+ }, /*#__PURE__*/React.createElement("div", {
46
+ style: {
47
+ padding: 16,
48
+ backgroundColor: '#e0e0e0'
49
+ }
50
+ }, "Assistant Panel")) : null)));
51
+ });
@@ -1,2 +1,2 @@
1
1
  import * as React from 'react';
2
- export default function useMove(handler: React.RefObject<HTMLDivElement | null>, direction: 'horizontal' | 'vertical', onMove: (dis: number) => void): boolean[];
2
+ export default function useMove(handler: React.RefObject<HTMLDivElement | null>, direction: 'horizontal' | 'vertical', onMove: (dis: number) => void, onMovingChange?: (moving: boolean) => void): boolean[];
@@ -6,7 +6,7 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
6
6
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
7
  import * as React from 'react';
8
8
  import debounce from "../../utils/debounce";
9
- export default function useMove(handler, direction, onMove) {
9
+ export default function useMove(handler, direction, onMove, onMovingChange) {
10
10
  var _React$useState = React.useState(false),
11
11
  _React$useState2 = _slicedToArray(_React$useState, 2),
12
12
  moving = _React$useState2[0],
@@ -22,6 +22,7 @@ export default function useMove(handler, direction, onMove) {
22
22
  var x = e.pageX;
23
23
  var y = e.pageY;
24
24
  setMoving(true);
25
+ onMovingChange === null || onMovingChange === void 0 || onMovingChange(true);
25
26
  var onMouseMove = debounce(function (e) {
26
27
  document.body.style.userSelect = 'none';
27
28
  document.body.style.cursor = direction === 'horizontal' ? 'col-resize' : 'row-resize';
@@ -37,6 +38,7 @@ export default function useMove(handler, direction, onMove) {
37
38
  }, 5);
38
39
  var onMouseUp = function onMouseUp() {
39
40
  setMoving(false);
41
+ onMovingChange === null || onMovingChange === void 0 || onMovingChange(false);
40
42
  window.removeEventListener('mousemove', onMouseMove);
41
43
  window.removeEventListener('mouseup', onMouseUp);
42
44
  ele.removeEventListener('mouseup', onMouseUp);
@@ -83,4 +83,10 @@ export interface SplitterProps extends DataAttributeProps {
83
83
  * panel size change event
84
84
  * */
85
85
  onResize?: (sizes: PanelRect[]) => void;
86
+ /**
87
+ * animate programmatic size changes and panel mount/unmount with a
88
+ * flex-basis transition; dragging always tracks the pointer in real time
89
+ * @default false
90
+ */
91
+ animation?: boolean;
86
92
  }
@@ -17,6 +17,8 @@ interface SplitterHandlerProps {
17
17
  start: HTMLDivElement;
18
18
  end: HTMLDivElement;
19
19
  }) => void;
20
+ /** 拖拽开始/结束回调(animation 模式下拖拽期间需关闭 flex-basis 过渡) */
21
+ onDraggingChange?: (dragging: boolean) => void;
20
22
  }
21
- declare const SplitterHandler: ({ layout, resizable, collapsible, index, records, setRecords, onClick, }: SplitterHandlerProps) => React.JSX.Element;
23
+ declare const SplitterHandler: ({ layout, resizable, collapsible, index, records, setRecords, onClick, onDraggingChange, }: SplitterHandlerProps) => React.JSX.Element;
22
24
  export default SplitterHandler;
@@ -23,7 +23,8 @@ var SplitterHandler = function SplitterHandler(_ref) {
23
23
  index = _ref.index,
24
24
  records = _ref.records,
25
25
  setRecords = _ref.setRecords,
26
- onClick = _ref.onClick;
26
+ onClick = _ref.onClick,
27
+ onDraggingChange = _ref.onDraggingChange;
27
28
  // eslint-disable-line @typescript-eslint/no-unused-vars
28
29
  var _ref2 = collapsible ? typeof collapsible === 'boolean' ? {
29
30
  start: true,
@@ -85,7 +86,7 @@ var SplitterHandler = function SplitterHandler(_ref) {
85
86
  return newState;
86
87
  });
87
88
  };
88
- useMove(handler, layout, onMove);
89
+ useMove(handler, layout, onMove, onDraggingChange);
89
90
  var handleClick = function handleClick(action) {
90
91
  var eles = refs.current;
91
92
  var start = eles["item".concat(index)].el;