@tiny-design/react 1.2.0 → 1.4.0

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 (75) hide show
  1. package/es/button/style/_index.scss +16 -11
  2. package/es/button/style/index.css +26 -5
  3. package/es/drawer/drawer.js +3 -2
  4. package/es/drawer/drawer.js.map +1 -1
  5. package/es/message/message.js +3 -2
  6. package/es/message/message.js.map +1 -1
  7. package/es/modal/modal.js +3 -2
  8. package/es/modal/modal.js.map +1 -1
  9. package/es/overlay/overlay.js +2 -2
  10. package/es/overlay/overlay.js.map +1 -1
  11. package/es/pop-confirm/style/_index.scss +4 -0
  12. package/es/pop-confirm/style/index.css +4 -0
  13. package/es/slider/style/_index.scss +1 -9
  14. package/es/slider/style/index.css +1 -6
  15. package/es/speed-dial/style/_index.scss +6 -7
  16. package/es/speed-dial/style/index.css +5 -5
  17. package/es/style/base.css +24 -3
  18. package/es/tag/style/_index.scss +24 -0
  19. package/es/tag/style/index.css +20 -0
  20. package/es/tag/types.d.ts +2 -1
  21. package/es/tag/types.js +7 -2
  22. package/es/tag/types.js.map +1 -1
  23. package/es/time-picker/style/_index.scss +13 -0
  24. package/es/time-picker/style/index.css +10 -0
  25. package/es/time-picker/time-panel.js +28 -28
  26. package/es/time-picker/time-panel.js.map +1 -1
  27. package/es/time-picker/time-picker.js +50 -29
  28. package/es/time-picker/time-picker.js.map +1 -1
  29. package/es/transition/index.js +1 -0
  30. package/es/transition/index.js.map +1 -1
  31. package/es/transition/transition.d.ts +20 -5
  32. package/es/transition/transition.js +33 -8
  33. package/es/transition/transition.js.map +1 -1
  34. package/es/transition/use-transition.js +137 -0
  35. package/es/transition/use-transition.js.map +1 -0
  36. package/es/waterfall/waterfall.js +62 -39
  37. package/es/waterfall/waterfall.js.map +1 -1
  38. package/lib/button/style/_index.scss +16 -11
  39. package/lib/button/style/index.css +26 -5
  40. package/lib/drawer/drawer.js +5 -4
  41. package/lib/drawer/drawer.js.map +1 -1
  42. package/lib/message/message.js +3 -2
  43. package/lib/message/message.js.map +1 -1
  44. package/lib/modal/modal.js +5 -4
  45. package/lib/modal/modal.js.map +1 -1
  46. package/lib/overlay/overlay.js +3 -3
  47. package/lib/overlay/overlay.js.map +1 -1
  48. package/lib/pop-confirm/style/_index.scss +4 -0
  49. package/lib/pop-confirm/style/index.css +4 -0
  50. package/lib/slider/style/_index.scss +1 -9
  51. package/lib/slider/style/index.css +1 -6
  52. package/lib/speed-dial/style/_index.scss +6 -7
  53. package/lib/speed-dial/style/index.css +5 -5
  54. package/lib/style/base.css +24 -3
  55. package/lib/tag/style/_index.scss +24 -0
  56. package/lib/tag/style/index.css +20 -0
  57. package/lib/tag/types.d.ts +2 -1
  58. package/lib/tag/types.js +7 -2
  59. package/lib/tag/types.js.map +1 -1
  60. package/lib/time-picker/style/_index.scss +13 -0
  61. package/lib/time-picker/style/index.css +10 -0
  62. package/lib/time-picker/time-panel.js +28 -28
  63. package/lib/time-picker/time-panel.js.map +1 -1
  64. package/lib/time-picker/time-picker.js +50 -29
  65. package/lib/time-picker/time-picker.js.map +1 -1
  66. package/lib/transition/index.js +1 -0
  67. package/lib/transition/index.js.map +1 -1
  68. package/lib/transition/transition.d.ts +20 -5
  69. package/lib/transition/transition.js +32 -7
  70. package/lib/transition/transition.js.map +1 -1
  71. package/lib/transition/use-transition.js +138 -0
  72. package/lib/transition/use-transition.js.map +1 -0
  73. package/lib/waterfall/waterfall.js +61 -38
  74. package/lib/waterfall/waterfall.js.map +1 -1
  75. package/package.json +3 -5
@@ -0,0 +1,137 @@
1
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
2
+ //#region src/transition/use-transition.ts
3
+ function normalizeTimeout(timeout) {
4
+ if (timeout == null) return {
5
+ enter: 300,
6
+ exit: 300
7
+ };
8
+ if (typeof timeout === "number") return {
9
+ enter: timeout,
10
+ exit: timeout
11
+ };
12
+ return timeout;
13
+ }
14
+ function useTransition(options) {
15
+ const { in: inProp, timeout, appear = true, unmountOnExit = true, mountOnEnter = false, onEnter, onEntering, onEntered, onExit, onExiting, onExited, nodeRef } = options;
16
+ const normalizedTimeout = normalizeTimeout(timeout);
17
+ const getInitialState = () => {
18
+ if (inProp) return appear ? "enter" : "entered";
19
+ if (unmountOnExit || mountOnEnter) return "unmounted";
20
+ return "exited";
21
+ };
22
+ const [state, setState] = useState(getInitialState);
23
+ const rafRef = useRef(0);
24
+ const timerRef = useRef(0);
25
+ const transitionEndRef = useRef(null);
26
+ const initialMountRef = useRef(true);
27
+ const callbacksRef = useRef({
28
+ onEnter,
29
+ onEntering,
30
+ onEntered,
31
+ onExit,
32
+ onExiting,
33
+ onExited
34
+ });
35
+ callbacksRef.current = {
36
+ onEnter,
37
+ onEntering,
38
+ onEntered,
39
+ onExit,
40
+ onExiting,
41
+ onExited
42
+ };
43
+ const cleanup = useCallback(() => {
44
+ if (rafRef.current) {
45
+ cancelAnimationFrame(rafRef.current);
46
+ rafRef.current = 0;
47
+ }
48
+ if (timerRef.current) {
49
+ clearTimeout(timerRef.current);
50
+ timerRef.current = 0;
51
+ }
52
+ if (transitionEndRef.current && nodeRef?.current) {
53
+ nodeRef.current.removeEventListener("transitionend", transitionEndRef.current);
54
+ transitionEndRef.current = null;
55
+ }
56
+ }, [nodeRef]);
57
+ const waitForTransition = useCallback((phase, done) => {
58
+ const safetyDuration = phase === "enter" ? normalizedTimeout.enter : normalizedTimeout.exit;
59
+ if (safetyDuration === 0) {
60
+ done();
61
+ return;
62
+ }
63
+ const finish = () => {
64
+ cleanup();
65
+ done();
66
+ };
67
+ const node = nodeRef?.current;
68
+ if (node) {
69
+ const handler = (e) => {
70
+ if (e.target === node) finish();
71
+ };
72
+ transitionEndRef.current = handler;
73
+ node.addEventListener("transitionend", handler);
74
+ }
75
+ timerRef.current = window.setTimeout(finish, safetyDuration + 50);
76
+ }, [
77
+ cleanup,
78
+ nodeRef,
79
+ normalizedTimeout.enter,
80
+ normalizedTimeout.exit
81
+ ]);
82
+ useLayoutEffect(() => {
83
+ if (state === "enter") {
84
+ callbacksRef.current.onEnter?.();
85
+ rafRef.current = requestAnimationFrame(() => {
86
+ setState("entering");
87
+ callbacksRef.current.onEntering?.();
88
+ waitForTransition("enter", () => {
89
+ setState("entered");
90
+ callbacksRef.current.onEntered?.();
91
+ });
92
+ });
93
+ }
94
+ }, [state]);
95
+ useLayoutEffect(() => {
96
+ if (state === "exit") {
97
+ callbacksRef.current.onExit?.();
98
+ rafRef.current = requestAnimationFrame(() => {
99
+ setState("exiting");
100
+ callbacksRef.current.onExiting?.();
101
+ waitForTransition("exit", () => {
102
+ setState((prev) => {
103
+ if (prev === "exiting") {
104
+ callbacksRef.current.onExited?.();
105
+ return unmountOnExit ? "unmounted" : "exited";
106
+ }
107
+ return prev;
108
+ });
109
+ });
110
+ });
111
+ }
112
+ }, [state]);
113
+ useEffect(() => {
114
+ if (initialMountRef.current) {
115
+ initialMountRef.current = false;
116
+ return;
117
+ }
118
+ if (inProp) {
119
+ cleanup();
120
+ setState("enter");
121
+ } else {
122
+ cleanup();
123
+ setState("exit");
124
+ }
125
+ }, [inProp]);
126
+ useEffect(() => {
127
+ return cleanup;
128
+ }, [cleanup]);
129
+ return {
130
+ state,
131
+ shouldMount: state !== "unmounted"
132
+ };
133
+ }
134
+ //#endregion
135
+ export { useTransition as default };
136
+
137
+ //# sourceMappingURL=use-transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-transition.js","names":[],"sources":["../../src/transition/use-transition.ts"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nexport type TransitionState =\n | 'unmounted'\n | 'enter'\n | 'entering'\n | 'entered'\n | 'exit'\n | 'exiting'\n | 'exited';\n\nexport interface UseTransitionOptions {\n in: boolean;\n timeout?: number | { enter: number; exit: number };\n appear?: boolean;\n unmountOnExit?: boolean;\n mountOnEnter?: boolean;\n onEnter?: () => void;\n onEntering?: () => void;\n onEntered?: () => void;\n onExit?: () => void;\n onExiting?: () => void;\n onExited?: () => void;\n nodeRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport interface UseTransitionResult {\n state: TransitionState;\n shouldMount: boolean;\n}\n\nfunction normalizeTimeout(\n timeout: number | { enter: number; exit: number } | undefined\n): { enter: number; exit: number } {\n if (timeout == null) return { enter: 300, exit: 300 };\n if (typeof timeout === 'number') return { enter: timeout, exit: timeout };\n return timeout;\n}\n\nfunction useTransition(options: UseTransitionOptions): UseTransitionResult {\n const {\n in: inProp,\n timeout,\n appear = true,\n unmountOnExit = true,\n mountOnEnter = false,\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n nodeRef,\n } = options;\n\n const normalizedTimeout = normalizeTimeout(timeout);\n\n // Determine initial state\n const getInitialState = (): TransitionState => {\n if (inProp) {\n return appear ? 'enter' : 'entered';\n }\n if (unmountOnExit || mountOnEnter) {\n return 'unmounted';\n }\n return 'exited';\n };\n\n const [state, setState] = useState<TransitionState>(getInitialState);\n const rafRef = useRef<number>(0);\n const timerRef = useRef<number>(0);\n const transitionEndRef = useRef<(() => void) | null>(null);\n const initialMountRef = useRef(true);\n\n // Store latest callbacks in refs to avoid re-triggering effects\n const callbacksRef = useRef({\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n });\n callbacksRef.current = {\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n };\n\n const cleanup = useCallback(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = 0;\n }\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = 0;\n }\n if (transitionEndRef.current && nodeRef?.current) {\n nodeRef.current.removeEventListener('transitionend', transitionEndRef.current);\n transitionEndRef.current = null;\n }\n }, [nodeRef]);\n\n const waitForTransition = useCallback(\n (phase: 'enter' | 'exit', done: () => void) => {\n const safetyDuration =\n phase === 'enter' ? normalizedTimeout.enter : normalizedTimeout.exit;\n\n // timeout=0 means \"don't wait\" — advance immediately.\n // This matches react-transition-group's behavior where timeout=0\n // skips straight to the done state, letting CSS handle the animation\n // via the base element's transition property.\n if (safetyDuration === 0) {\n done();\n return;\n }\n\n const finish = () => {\n cleanup();\n done();\n };\n\n // Try transitionend listener first\n const node = nodeRef?.current;\n if (node) {\n const handler = (e: Event) => {\n if ((e as TransitionEvent).target === node) {\n finish();\n }\n };\n transitionEndRef.current = handler as () => void;\n node.addEventListener('transitionend', handler);\n }\n\n // Safety timeout fallback\n timerRef.current = window.setTimeout(finish, safetyDuration + 50);\n },\n [cleanup, nodeRef, normalizedTimeout.enter, normalizedTimeout.exit]\n );\n\n // Continue the enter animation after DOM is committed (state === 'enter').\n // useLayoutEffect fires synchronously after DOM mutations, guaranteeing\n // the child is mounted and refs are populated before onEnter runs.\n useLayoutEffect(() => {\n if (state === 'enter') {\n callbacksRef.current.onEnter?.();\n\n // Single rAF: useLayoutEffect runs before paint, so one rAF is enough\n // to ensure the browser has painted the -enter class before we add -enter-active.\n rafRef.current = requestAnimationFrame(() => {\n setState('entering');\n callbacksRef.current.onEntering?.();\n\n waitForTransition('enter', () => {\n setState('entered');\n callbacksRef.current.onEntered?.();\n });\n });\n }\n }, [state]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Continue the exit animation after DOM reflects exit state\n useLayoutEffect(() => {\n if (state === 'exit') {\n callbacksRef.current.onExit?.();\n\n rafRef.current = requestAnimationFrame(() => {\n setState('exiting');\n callbacksRef.current.onExiting?.();\n\n waitForTransition('exit', () => {\n setState((prev) => {\n if (prev === 'exiting') {\n callbacksRef.current.onExited?.();\n return unmountOnExit ? 'unmounted' : 'exited';\n }\n return prev;\n });\n });\n });\n }\n }, [state]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // React to `in` prop changes — only set the initial phase state.\n // The useLayoutEffect above handles the rest after DOM commit.\n useEffect(() => {\n if (initialMountRef.current) {\n initialMountRef.current = false;\n // On initial mount with appear=true, state is already 'enter' from getInitialState,\n // and the useLayoutEffect above will pick it up.\n return;\n }\n\n if (inProp) {\n cleanup();\n setState('enter');\n } else {\n cleanup();\n setState('exit');\n }\n }, [inProp]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Cleanup on unmount\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n const shouldMount = state !== 'unmounted';\n\n return { state, shouldMount };\n}\n\nexport default useTransition;\n"],"mappings":";;AA+BA,SAAS,iBACP,SACiC;AACjC,KAAI,WAAW,KAAM,QAAO;EAAE,OAAO;EAAK,MAAM;EAAK;AACrD,KAAI,OAAO,YAAY,SAAU,QAAO;EAAE,OAAO;EAAS,MAAM;EAAS;AACzE,QAAO;;AAGT,SAAS,cAAc,SAAoD;CACzE,MAAM,EACJ,IAAI,QACJ,SACA,SAAS,MACT,gBAAgB,MAChB,eAAe,OACf,SACA,YACA,WACA,QACA,WACA,UACA,YACE;CAEJ,MAAM,oBAAoB,iBAAiB,QAAQ;CAGnD,MAAM,wBAAyC;AAC7C,MAAI,OACF,QAAO,SAAS,UAAU;AAE5B,MAAI,iBAAiB,aACnB,QAAO;AAET,SAAO;;CAGT,MAAM,CAAC,OAAO,YAAY,SAA0B,gBAAgB;CACpE,MAAM,SAAS,OAAe,EAAE;CAChC,MAAM,WAAW,OAAe,EAAE;CAClC,MAAM,mBAAmB,OAA4B,KAAK;CAC1D,MAAM,kBAAkB,OAAO,KAAK;CAGpC,MAAM,eAAe,OAAO;EAC1B;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AACF,cAAa,UAAU;EACrB;EACA;EACA;EACA;EACA;EACA;EACD;CAED,MAAM,UAAU,kBAAkB;AAChC,MAAI,OAAO,SAAS;AAClB,wBAAqB,OAAO,QAAQ;AACpC,UAAO,UAAU;;AAEnB,MAAI,SAAS,SAAS;AACpB,gBAAa,SAAS,QAAQ;AAC9B,YAAS,UAAU;;AAErB,MAAI,iBAAiB,WAAW,SAAS,SAAS;AAChD,WAAQ,QAAQ,oBAAoB,iBAAiB,iBAAiB,QAAQ;AAC9E,oBAAiB,UAAU;;IAE5B,CAAC,QAAQ,CAAC;CAEb,MAAM,oBAAoB,aACvB,OAAyB,SAAqB;EAC7C,MAAM,iBACJ,UAAU,UAAU,kBAAkB,QAAQ,kBAAkB;AAMlE,MAAI,mBAAmB,GAAG;AACxB,SAAM;AACN;;EAGF,MAAM,eAAe;AACnB,YAAS;AACT,SAAM;;EAIR,MAAM,OAAO,SAAS;AACtB,MAAI,MAAM;GACR,MAAM,WAAW,MAAa;AAC5B,QAAK,EAAsB,WAAW,KACpC,SAAQ;;AAGZ,oBAAiB,UAAU;AAC3B,QAAK,iBAAiB,iBAAiB,QAAQ;;AAIjD,WAAS,UAAU,OAAO,WAAW,QAAQ,iBAAiB,GAAG;IAEnE;EAAC;EAAS;EAAS,kBAAkB;EAAO,kBAAkB;EAAK,CACpE;AAKD,uBAAsB;AACpB,MAAI,UAAU,SAAS;AACrB,gBAAa,QAAQ,WAAW;AAIhC,UAAO,UAAU,4BAA4B;AAC3C,aAAS,WAAW;AACpB,iBAAa,QAAQ,cAAc;AAEnC,sBAAkB,eAAe;AAC/B,cAAS,UAAU;AACnB,kBAAa,QAAQ,aAAa;MAClC;KACF;;IAEH,CAAC,MAAM,CAAC;AAGX,uBAAsB;AACpB,MAAI,UAAU,QAAQ;AACpB,gBAAa,QAAQ,UAAU;AAE/B,UAAO,UAAU,4BAA4B;AAC3C,aAAS,UAAU;AACnB,iBAAa,QAAQ,aAAa;AAElC,sBAAkB,cAAc;AAC9B,eAAU,SAAS;AACjB,UAAI,SAAS,WAAW;AACtB,oBAAa,QAAQ,YAAY;AACjC,cAAO,gBAAgB,cAAc;;AAEvC,aAAO;OACP;MACF;KACF;;IAEH,CAAC,MAAM,CAAC;AAIX,iBAAgB;AACd,MAAI,gBAAgB,SAAS;AAC3B,mBAAgB,UAAU;AAG1B;;AAGF,MAAI,QAAQ;AACV,YAAS;AACT,YAAS,QAAQ;SACZ;AACL,YAAS;AACT,YAAS,OAAO;;IAEjB,CAAC,OAAO,CAAC;AAGZ,iBAAgB;AACd,SAAO;IACN,CAAC,QAAQ,CAAC;AAIb,QAAO;EAAE;EAAO,aAFI,UAAU;EAED"}
@@ -1,11 +1,11 @@
1
1
  import { ConfigContext } from "../config-provider/config-context.js";
2
2
  import { getPrefixCls } from "../_utils/general.js";
3
+ import transition_default from "../transition/index.js";
3
4
  import useBreakpoint, { responsiveArray } from "./hooks/use-breakpoint.js";
4
5
  import usePositions from "./hooks/use-positions.js";
5
6
  import React, { useCallback, useContext, useEffect, useRef, useState } from "react";
6
7
  import classNames from "classnames";
7
- import { jsx } from "react/jsx-runtime";
8
- import { CSSTransition, TransitionGroup } from "react-transition-group";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/waterfall/waterfall.tsx
10
10
  const Waterfall = React.forwardRef((props, ref) => {
11
11
  const { prefixCls: customisedCls, className, style, columns = 3, gutter = 0, items, itemRender, onLayoutChange, ...otherProps } = props;
@@ -69,6 +69,31 @@ const Waterfall = React.forwardRef((props, ref) => {
69
69
  items,
70
70
  onLayoutChange
71
71
  ]);
72
+ const prevItemsRef = useRef(items || []);
73
+ const [exitingItems, setExitingItems] = useState(/* @__PURE__ */ new Map());
74
+ useEffect(() => {
75
+ const currentKeys = new Set((items || []).map((item, i) => item.key ?? i));
76
+ const removed = /* @__PURE__ */ new Map();
77
+ prevItemsRef.current.forEach((item, index) => {
78
+ const key = item.key ?? index;
79
+ if (!currentKeys.has(key)) removed.set(key, item);
80
+ });
81
+ if (removed.size > 0) setExitingItems((prev) => {
82
+ const next = new Map(prev);
83
+ removed.forEach((item, key) => next.set(key, item));
84
+ return next;
85
+ });
86
+ prevItemsRef.current = items || [];
87
+ }, [items]);
88
+ const handleExited = useCallback((key) => {
89
+ itemRefsMap.current.delete(key);
90
+ setExitingItems((prev) => {
91
+ const next = new Map(prev);
92
+ next.delete(key);
93
+ return next;
94
+ });
95
+ collectItemSizes();
96
+ }, [collectItemSizes]);
72
97
  const cls = classNames(prefixCls, className);
73
98
  const containerStyle = {
74
99
  ...style,
@@ -76,49 +101,47 @@ const Waterfall = React.forwardRef((props, ref) => {
76
101
  height: totalHeight || void 0
77
102
  };
78
103
  const mergedItems = items || [];
79
- return /* @__PURE__ */ jsx("div", {
104
+ const renderItem = (item, index, isExiting) => {
105
+ const key = item.key ?? index;
106
+ const position = itemPositions.get(key);
107
+ const hasPosition = !!position;
108
+ const columnIndex = position?.column ?? 0;
109
+ const itemStyle = {
110
+ position: "absolute",
111
+ width: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount})`,
112
+ left: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount} * ${columnIndex} + ${horizontalGutter * columnIndex}px)`,
113
+ top: position?.top ?? 0,
114
+ transition: hasPosition ? "top 0.3s ease, left 0.3s ease, opacity 0.3s ease" : "none",
115
+ opacity: hasPosition ? 1 : 0
116
+ };
117
+ const content = item.children ?? itemRender?.({
118
+ ...item,
119
+ index,
120
+ column: columnIndex
121
+ });
122
+ return /* @__PURE__ */ jsx(transition_default, {
123
+ in: !isExiting,
124
+ timeout: 300,
125
+ appear: false,
126
+ unmountOnExit: true,
127
+ classNames: `${prefixCls}__item-fade`,
128
+ onExited: () => handleExited(key),
129
+ children: /* @__PURE__ */ jsx("div", {
130
+ ref: (el) => setItemRef(key, el),
131
+ className: `${prefixCls}__item`,
132
+ style: itemStyle,
133
+ children: content
134
+ })
135
+ }, key);
136
+ };
137
+ return /* @__PURE__ */ jsxs("div", {
80
138
  ref,
81
139
  ...otherProps,
82
140
  className: cls,
83
141
  style: containerStyle,
84
142
  onLoad: collectItemSizes,
85
143
  onError: collectItemSizes,
86
- children: /* @__PURE__ */ jsx(TransitionGroup, {
87
- component: null,
88
- children: mergedItems.map((item, index) => {
89
- const key = item.key ?? index;
90
- const position = itemPositions.get(key);
91
- const hasPosition = !!position;
92
- const columnIndex = position?.column ?? 0;
93
- const itemStyle = {
94
- position: "absolute",
95
- width: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount})`,
96
- left: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount} * ${columnIndex} + ${horizontalGutter * columnIndex}px)`,
97
- top: position?.top ?? 0,
98
- transition: hasPosition ? "top 0.3s ease, left 0.3s ease, opacity 0.3s ease" : "none",
99
- opacity: hasPosition ? 1 : 0
100
- };
101
- const content = item.children ?? itemRender?.({
102
- ...item,
103
- index,
104
- column: columnIndex
105
- });
106
- return /* @__PURE__ */ jsx(CSSTransition, {
107
- timeout: 300,
108
- classNames: `${prefixCls}__item-fade`,
109
- onExited: () => {
110
- itemRefsMap.current.delete(key);
111
- collectItemSizes();
112
- },
113
- children: /* @__PURE__ */ jsx("div", {
114
- ref: (el) => setItemRef(key, el),
115
- className: `${prefixCls}__item`,
116
- style: itemStyle,
117
- children: content
118
- })
119
- }, key);
120
- })
121
- })
144
+ children: [mergedItems.map((item, index) => renderItem(item, index, false)), Array.from(exitingItems.entries()).map(([key, item]) => renderItem(item, Number(key), true))]
122
145
  });
123
146
  });
124
147
  Waterfall.displayName = "Waterfall";
@@ -1 +1 @@
1
- {"version":3,"file":"waterfall.js","names":[],"sources":["../../src/waterfall/waterfall.tsx"],"sourcesContent":["import React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition, TransitionGroup } from 'react-transition-group';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { Breakpoint, WaterfallItem, WaterfallProps } from './types';\nimport useBreakpoint, { responsiveArray } from './hooks/use-breakpoint';\nimport usePositions, { ItemHeightData } from './hooks/use-positions';\n\nconst Waterfall = React.forwardRef<HTMLDivElement, WaterfallProps>((props, ref) => {\n const {\n prefixCls: customisedCls,\n className,\n style,\n columns = 3,\n gutter = 0,\n items,\n itemRender,\n onLayoutChange,\n ...otherProps\n } = props;\n\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('waterfall', configContext.prefixCls, customisedCls);\n\n // ===================== Breakpoint =====================\n const screens = useBreakpoint();\n\n const columnCount = React.useMemo<number>(() => {\n if (typeof columns === 'number') {\n return columns;\n }\n\n const matchingBreakpoint = responsiveArray.find(\n (bp: Breakpoint) => screens[bp] && columns[bp] !== undefined,\n );\n\n if (matchingBreakpoint) {\n return columns[matchingBreakpoint] as number;\n }\n\n return columns.xs ?? 1;\n }, [columns, screens]);\n\n // ====================== Gutter ======================\n const [horizontalGutter, verticalGutter] = Array.isArray(gutter)\n ? gutter\n : [gutter, gutter];\n\n // =================== Item Refs ===================\n const itemRefsMap = useRef<Map<React.Key, HTMLDivElement | null>>(new Map());\n\n const setItemRef = useCallback((key: React.Key, el: HTMLDivElement | null) => {\n itemRefsMap.current.set(key, el);\n }, []);\n\n // ================= Item Heights ==================\n const [itemHeights, setItemHeights] = useState<ItemHeightData[]>([]);\n\n const collectItemSizes = useCallback(() => {\n if (!items || items.length === 0) {\n setItemHeights([]);\n return;\n }\n\n const nextHeights = items.map<ItemHeightData>((item, index) => {\n const key = item.key ?? index;\n const el = itemRefsMap.current.get(key);\n const height = el ? el.getBoundingClientRect().height : 0;\n return [key, height, item.column];\n });\n\n setItemHeights((prev) => {\n const isSame =\n prev.length === nextHeights.length &&\n prev.every((p, i) => p[0] === nextHeights[i][0] && p[1] === nextHeights[i][1]);\n return isSame ? prev : nextHeights;\n });\n }, [items]);\n\n // ================= Positions ==================\n const [itemPositions, totalHeight] = usePositions(itemHeights, columnCount, verticalGutter);\n\n // Collect sizes on items/columns change\n useEffect(() => {\n collectItemSizes();\n }, [items, columnCount, collectItemSizes]);\n\n // ResizeObserver for dynamic content\n useEffect(() => {\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(() => {\n collectItemSizes();\n });\n\n for (const [, el] of itemRefsMap.current) {\n if (el) observer.observe(el);\n }\n\n return () => observer.disconnect();\n }, [items, collectItemSizes]);\n\n // ================ onLayoutChange ================\n useEffect(() => {\n if (!onLayoutChange || !items || items.length === 0) return;\n\n const allPositioned = items.every((item) => itemPositions.has(item.key));\n if (!allPositioned) return;\n\n const sortInfo = items.map((item) => ({\n key: item.key,\n column: itemPositions.get(item.key)!.column,\n }));\n onLayoutChange(sortInfo);\n }, [itemPositions, items, onLayoutChange]);\n\n // ==================== Render ====================\n const cls = classNames(prefixCls, className);\n\n const containerStyle: React.CSSProperties = {\n ...style,\n position: 'relative',\n height: totalHeight || undefined,\n };\n\n const mergedItems = items || [];\n\n return (\n <div\n ref={ref}\n {...otherProps}\n className={cls}\n style={containerStyle}\n onLoad={collectItemSizes}\n onError={collectItemSizes}\n >\n <TransitionGroup component={null}>\n {mergedItems.map((item, index) => {\n const key = item.key ?? index;\n const position = itemPositions.get(key);\n const hasPosition = !!position;\n const columnIndex = position?.column ?? 0;\n\n const itemStyle: React.CSSProperties = {\n position: 'absolute',\n width: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount})`,\n left: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount} * ${columnIndex} + ${horizontalGutter * columnIndex}px)`,\n top: position?.top ?? 0,\n // Only transition position changes after initial placement\n transition: hasPosition ? 'top 0.3s ease, left 0.3s ease, opacity 0.3s ease' : 'none',\n // Hide until position is computed so items don't flash at (0,0)\n opacity: hasPosition ? 1 : 0,\n };\n\n const content = item.children ?? itemRender?.({ ...item, index, column: columnIndex });\n\n return (\n <CSSTransition\n key={key}\n timeout={300}\n classNames={`${prefixCls}__item-fade`}\n onExited={() => {\n itemRefsMap.current.delete(key);\n collectItemSizes();\n }}\n >\n <div\n ref={(el) => setItemRef(key, el)}\n className={`${prefixCls}__item`}\n style={itemStyle}\n >\n {content}\n </div>\n </CSSTransition>\n );\n })}\n </TransitionGroup>\n </div>\n );\n});\n\nWaterfall.displayName = 'Waterfall';\n\nexport default Waterfall;\n"],"mappings":"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"}
1
+ {"version":3,"file":"waterfall.js","names":["Transition"],"sources":["../../src/waterfall/waterfall.tsx"],"sourcesContent":["import React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport Transition from '../transition';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { Breakpoint, WaterfallItem, WaterfallProps } from './types';\nimport useBreakpoint, { responsiveArray } from './hooks/use-breakpoint';\nimport usePositions, { ItemHeightData } from './hooks/use-positions';\n\nconst Waterfall = React.forwardRef<HTMLDivElement, WaterfallProps>((props, ref) => {\n const {\n prefixCls: customisedCls,\n className,\n style,\n columns = 3,\n gutter = 0,\n items,\n itemRender,\n onLayoutChange,\n ...otherProps\n } = props;\n\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('waterfall', configContext.prefixCls, customisedCls);\n\n // ===================== Breakpoint =====================\n const screens = useBreakpoint();\n\n const columnCount = React.useMemo<number>(() => {\n if (typeof columns === 'number') {\n return columns;\n }\n\n const matchingBreakpoint = responsiveArray.find(\n (bp: Breakpoint) => screens[bp] && columns[bp] !== undefined,\n );\n\n if (matchingBreakpoint) {\n return columns[matchingBreakpoint] as number;\n }\n\n return columns.xs ?? 1;\n }, [columns, screens]);\n\n // ====================== Gutter ======================\n const [horizontalGutter, verticalGutter] = Array.isArray(gutter)\n ? gutter\n : [gutter, gutter];\n\n // =================== Item Refs ===================\n const itemRefsMap = useRef<Map<React.Key, HTMLDivElement | null>>(new Map());\n\n const setItemRef = useCallback((key: React.Key, el: HTMLDivElement | null) => {\n itemRefsMap.current.set(key, el);\n }, []);\n\n // ================= Item Heights ==================\n const [itemHeights, setItemHeights] = useState<ItemHeightData[]>([]);\n\n const collectItemSizes = useCallback(() => {\n if (!items || items.length === 0) {\n setItemHeights([]);\n return;\n }\n\n const nextHeights = items.map<ItemHeightData>((item, index) => {\n const key = item.key ?? index;\n const el = itemRefsMap.current.get(key);\n const height = el ? el.getBoundingClientRect().height : 0;\n return [key, height, item.column];\n });\n\n setItemHeights((prev) => {\n const isSame =\n prev.length === nextHeights.length &&\n prev.every((p, i) => p[0] === nextHeights[i][0] && p[1] === nextHeights[i][1]);\n return isSame ? prev : nextHeights;\n });\n }, [items]);\n\n // ================= Positions ==================\n const [itemPositions, totalHeight] = usePositions(itemHeights, columnCount, verticalGutter);\n\n // Collect sizes on items/columns change\n useEffect(() => {\n collectItemSizes();\n }, [items, columnCount, collectItemSizes]);\n\n // ResizeObserver for dynamic content\n useEffect(() => {\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(() => {\n collectItemSizes();\n });\n\n for (const [, el] of itemRefsMap.current) {\n if (el) observer.observe(el);\n }\n\n return () => observer.disconnect();\n }, [items, collectItemSizes]);\n\n // ================ onLayoutChange ================\n useEffect(() => {\n if (!onLayoutChange || !items || items.length === 0) return;\n\n const allPositioned = items.every((item) => itemPositions.has(item.key));\n if (!allPositioned) return;\n\n const sortInfo = items.map((item) => ({\n key: item.key,\n column: itemPositions.get(item.key)!.column,\n }));\n onLayoutChange(sortInfo);\n }, [itemPositions, items, onLayoutChange]);\n\n // ============== Exiting items (replaces TransitionGroup) ==============\n const prevItemsRef = useRef<WaterfallItem[]>(items || []);\n const [exitingItems, setExitingItems] = useState<Map<React.Key, WaterfallItem>>(new Map());\n\n useEffect(() => {\n const currentKeys = new Set((items || []).map((item, i) => item.key ?? i));\n const removed = new Map<React.Key, WaterfallItem>();\n\n prevItemsRef.current.forEach((item, index) => {\n const key = item.key ?? index;\n if (!currentKeys.has(key)) {\n removed.set(key, item);\n }\n });\n\n if (removed.size > 0) {\n setExitingItems((prev) => {\n const next = new Map(prev);\n removed.forEach((item, key) => next.set(key, item));\n return next;\n });\n }\n\n prevItemsRef.current = items || [];\n }, [items]);\n\n const handleExited = useCallback((key: React.Key) => {\n itemRefsMap.current.delete(key);\n setExitingItems((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n collectItemSizes();\n }, [collectItemSizes]);\n\n // ==================== Render ====================\n const cls = classNames(prefixCls, className);\n\n const containerStyle: React.CSSProperties = {\n ...style,\n position: 'relative',\n height: totalHeight || undefined,\n };\n\n const mergedItems = items || [];\n\n const renderItem = (item: WaterfallItem, index: number, isExiting: boolean) => {\n const key = item.key ?? index;\n const position = itemPositions.get(key);\n const hasPosition = !!position;\n const columnIndex = position?.column ?? 0;\n\n const itemStyle: React.CSSProperties = {\n position: 'absolute',\n width: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount})`,\n left: `calc((100% - ${horizontalGutter * (columnCount - 1)}px) / ${columnCount} * ${columnIndex} + ${horizontalGutter * columnIndex}px)`,\n top: position?.top ?? 0,\n // Only transition position changes after initial placement\n transition: hasPosition ? 'top 0.3s ease, left 0.3s ease, opacity 0.3s ease' : 'none',\n // Hide until position is computed so items don't flash at (0,0)\n opacity: hasPosition ? 1 : 0,\n };\n\n const content = item.children ?? itemRender?.({ ...item, index, column: columnIndex });\n\n return (\n <Transition\n key={key}\n in={!isExiting}\n timeout={300}\n appear={false}\n unmountOnExit={true}\n classNames={`${prefixCls}__item-fade`}\n onExited={() => handleExited(key)}\n >\n <div\n ref={(el) => setItemRef(key, el)}\n className={`${prefixCls}__item`}\n style={itemStyle}\n >\n {content}\n </div>\n </Transition>\n );\n };\n\n return (\n <div\n ref={ref}\n {...otherProps}\n className={cls}\n style={containerStyle}\n onLoad={collectItemSizes}\n onError={collectItemSizes}\n >\n {mergedItems.map((item, index) => renderItem(item, index, false))}\n {Array.from(exitingItems.entries()).map(([key, item]) =>\n renderItem(item, Number(key), true)\n )}\n </div>\n );\n});\n\nWaterfall.displayName = 'Waterfall';\n\nexport default Waterfall;\n"],"mappings":"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"}
@@ -24,7 +24,7 @@ $btn-prefix: #{$prefix}-btn;
24
24
  line-height: $btn-line-height;
25
25
 
26
26
  &__loader {
27
- @include loader();
27
+ @include loader;
28
28
  }
29
29
 
30
30
  &__icon-container, &__loader {
@@ -91,19 +91,27 @@ $btn-prefix: #{$prefix}-btn;
91
91
  }
92
92
 
93
93
  &_info {
94
- @include button-style(#fff, var(--ty-color-info), var(--ty-color-info));
94
+ @include button-style(#fff, var(--ty-color-info), var(--ty-color-info),
95
+ var(--ty-color-info-hover), var(--ty-color-info-hover), #fff,
96
+ var(--ty-color-info-active), var(--ty-color-info-active), #fff);
95
97
  }
96
98
 
97
99
  &_success {
98
- @include button-style(#fff, var(--ty-color-success), var(--ty-color-success));
100
+ @include button-style(#fff, var(--ty-color-success), var(--ty-color-success),
101
+ var(--ty-color-success-hover), var(--ty-color-success-hover), #fff,
102
+ var(--ty-color-success-active), var(--ty-color-success-active), #fff);
99
103
  }
100
104
 
101
105
  &_warning {
102
- @include button-style(#fff, var(--ty-color-warning), var(--ty-color-warning));
106
+ @include button-style(#fff, var(--ty-color-warning), var(--ty-color-warning),
107
+ var(--ty-color-warning-hover), var(--ty-color-warning-hover), #fff,
108
+ var(--ty-color-warning-active), var(--ty-color-warning-active), #fff);
103
109
  }
104
110
 
105
111
  &_danger {
106
- @include button-style(#fff, var(--ty-color-danger), var(--ty-color-danger));
112
+ @include button-style(#fff, var(--ty-color-danger), var(--ty-color-danger),
113
+ var(--ty-color-danger-hover), var(--ty-color-danger-hover), #fff,
114
+ var(--ty-color-danger-active), var(--ty-color-danger-active), #fff);
107
115
  }
108
116
 
109
117
  // Sizes
@@ -135,13 +143,10 @@ $btn-prefix: #{$prefix}-btn;
135
143
  position: relative;
136
144
  pointer-events: none;
137
145
 
138
- &:before {
146
+ &::before {
139
147
  content: '';
140
148
  position: absolute;
141
- top: -1px;
142
- right: -1px;
143
- bottom: -1px;
144
- left: -1px;
149
+ inset: -1px;
145
150
  z-index: 1;
146
151
  display: block;
147
152
  background: var(--ty-btn-loading-bg);
@@ -208,7 +213,7 @@ $btn-prefix: #{$prefix}-btn;
208
213
  &_danger {
209
214
  .#{$btn-prefix} {
210
215
  &:not(:first-child) {
211
- border-left-color: rgba(255, 255, 255, 0.2);
216
+ border-left-color: rgb(255 255 255 / 20%);
212
217
  }
213
218
  }
214
219
  }
@@ -212,13 +212,19 @@
212
212
  }
213
213
  .ty-btn_info:hover {
214
214
  color: #fff;
215
+ background: var(--ty-color-info-hover);
216
+ border-color: var(--ty-color-info-hover);
215
217
  }
216
218
  .ty-btn_info:focus {
217
219
  color: #fff;
220
+ background: var(--ty-color-info-hover);
221
+ border-color: var(--ty-color-info-hover);
218
222
  z-index: 1;
219
223
  }
220
224
  .ty-btn_info:active {
221
225
  color: #fff;
226
+ background: var(--ty-color-info-active);
227
+ border-color: var(--ty-color-info-active);
222
228
  }
223
229
  .ty-btn_info:disabled {
224
230
  color: var(--ty-btn-disabled-color);
@@ -232,13 +238,19 @@
232
238
  }
233
239
  .ty-btn_success:hover {
234
240
  color: #fff;
241
+ background: var(--ty-color-success-hover);
242
+ border-color: var(--ty-color-success-hover);
235
243
  }
236
244
  .ty-btn_success:focus {
237
245
  color: #fff;
246
+ background: var(--ty-color-success-hover);
247
+ border-color: var(--ty-color-success-hover);
238
248
  z-index: 1;
239
249
  }
240
250
  .ty-btn_success:active {
241
251
  color: #fff;
252
+ background: var(--ty-color-success-active);
253
+ border-color: var(--ty-color-success-active);
242
254
  }
243
255
  .ty-btn_success:disabled {
244
256
  color: var(--ty-btn-disabled-color);
@@ -252,13 +264,19 @@
252
264
  }
253
265
  .ty-btn_warning:hover {
254
266
  color: #fff;
267
+ background: var(--ty-color-warning-hover);
268
+ border-color: var(--ty-color-warning-hover);
255
269
  }
256
270
  .ty-btn_warning:focus {
257
271
  color: #fff;
272
+ background: var(--ty-color-warning-hover);
273
+ border-color: var(--ty-color-warning-hover);
258
274
  z-index: 1;
259
275
  }
260
276
  .ty-btn_warning:active {
261
277
  color: #fff;
278
+ background: var(--ty-color-warning-active);
279
+ border-color: var(--ty-color-warning-active);
262
280
  }
263
281
  .ty-btn_warning:disabled {
264
282
  color: var(--ty-btn-disabled-color);
@@ -272,13 +290,19 @@
272
290
  }
273
291
  .ty-btn_danger:hover {
274
292
  color: #fff;
293
+ background: var(--ty-color-danger-hover);
294
+ border-color: var(--ty-color-danger-hover);
275
295
  }
276
296
  .ty-btn_danger:focus {
277
297
  color: #fff;
298
+ background: var(--ty-color-danger-hover);
299
+ border-color: var(--ty-color-danger-hover);
278
300
  z-index: 1;
279
301
  }
280
302
  .ty-btn_danger:active {
281
303
  color: #fff;
304
+ background: var(--ty-color-danger-active);
305
+ border-color: var(--ty-color-danger-active);
282
306
  }
283
307
  .ty-btn_danger:disabled {
284
308
  color: var(--ty-btn-disabled-color);
@@ -313,13 +337,10 @@
313
337
  position: relative;
314
338
  pointer-events: none;
315
339
  }
316
- .ty-btn_loading:before {
340
+ .ty-btn_loading::before {
317
341
  content: "";
318
342
  position: absolute;
319
- top: -1px;
320
- right: -1px;
321
- bottom: -1px;
322
- left: -1px;
343
+ inset: -1px;
323
344
  z-index: 1;
324
345
  display: block;
325
346
  background: var(--ty-btn-loading-bg);
@@ -1,13 +1,13 @@
1
1
  const require_runtime = require("../_virtual/_rolldown/runtime.js");
2
2
  const require_config_context = require("../config-provider/config-context.js");
3
3
  const require_general = require("../_utils/general.js");
4
- const require_index = require("../overlay/index.js");
4
+ const require_index = require("../transition/index.js");
5
+ const require_index$1 = require("../overlay/index.js");
5
6
  let react = require("react");
6
7
  react = require_runtime.__toESM(react);
7
8
  let classnames = require("classnames");
8
9
  classnames = require_runtime.__toESM(classnames);
9
10
  let react_jsx_runtime = require("react/jsx-runtime");
10
- let react_transition_group = require("react-transition-group");
11
11
  //#region src/drawer/drawer.tsx
12
12
  const Drawer = react.default.forwardRef((props, ref) => {
13
13
  const { visible, placement = "right", size = 256, closable = true, unmountOnClose = true, maskType = "default", maskClosable = true, onClose, prefixCls: customisedCls, afterClose, zIndex = 1e3, header, footer, className, maskStyle, style, children } = props;
@@ -54,7 +54,7 @@ const Drawer = react.default.forwardRef((props, ref) => {
54
54
  previousFocusRef.current?.focus();
55
55
  };
56
56
  }, [visible, onClose]);
57
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.default, {
57
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index$1.default, {
58
58
  onEnter: () => setDrawerVisible(true),
59
59
  onExit: () => setDrawerVisible(false),
60
60
  zIndex,
@@ -73,11 +73,12 @@ const Drawer = react.default.forwardRef((props, ref) => {
73
73
  ...style,
74
74
  ...sty
75
75
  },
76
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_transition_group.CSSTransition, {
76
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.default, {
77
77
  appear: true,
78
78
  nodeRef,
79
79
  in: drawerVisible,
80
80
  timeout: 0,
81
+ unmountOnExit: false,
81
82
  classNames: `${prefixCls}__content_move`,
82
83
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
83
84
  ref: nodeRef,
@@ -1 +1 @@
1
- {"version":3,"file":"drawer.js","names":["React","getPrefixCls","ConfigContext","Overlay","CSSTransition"],"sources":["../../src/drawer/drawer.tsx"],"sourcesContent":["import React, { useContext, useEffect, useId, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport Overlay from '../overlay';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { DrawerProps } from './types';\n\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>((props, ref) => {\n const {\n visible,\n placement = 'right',\n size = 256,\n closable = true,\n unmountOnClose = true,\n maskType = 'default',\n maskClosable = true,\n onClose,\n prefixCls: customisedCls,\n afterClose,\n zIndex = 1000,\n header,\n footer,\n className,\n maskStyle,\n style,\n children,\n } = props;\n const [drawerVisible, setDrawerVisible] = useState(visible);\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('drawer', configContext.prefixCls, customisedCls);\n const cls = classNames(prefixCls, className, `${prefixCls}_${placement}`);\n const sty: React.CSSProperties =\n placement === 'top' || placement === 'bottom' ? { height: size } : { width: size };\n const nodeRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n const titleId = useId();\n\n // Focus trap + Escape key\n useEffect(() => {\n if (!visible) return;\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.(e as unknown as React.MouseEvent);\n return;\n }\n if (e.key === 'Tab' && nodeRef.current) {\n const focusable = nodeRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first.focus(); }\n }\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n requestAnimationFrame(() => {\n if (nodeRef.current) {\n const focusable = nodeRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length > 0) focusable[0].focus();\n }\n });\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n previousFocusRef.current?.focus();\n };\n }, [visible, onClose]);\n\n return (\n <Overlay\n onEnter={(): void => setDrawerVisible(true)}\n onExit={(): void => setDrawerVisible(false)}\n zIndex={zIndex}\n type={maskType}\n unmountOnExit={unmountOnClose}\n isShow={visible}\n onExited={afterClose}\n clickCallback={(e: React.MouseEvent): void => {\n maskClosable && onClose ? onClose(e) : undefined;\n }}\n style={maskStyle}>\n <div ref={ref} className={cls} style={{ ...style, ...sty }}>\n <CSSTransition\n appear={true}\n nodeRef={nodeRef}\n in={drawerVisible}\n timeout={0}\n classNames={`${prefixCls}__content_move`}>\n <div\n ref={nodeRef}\n className={`${prefixCls}__content`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={header ? titleId : undefined}\n onClick={(e) => e.stopPropagation()}>\n {closable && (\n <button type=\"button\" className={`${prefixCls}__close-btn`} onClick={onClose} aria-label=\"Close\">\n ✕\n </button>\n )}\n {header && <div className={`${prefixCls}__header`} id={titleId}>{header}</div>}\n <div className={`${prefixCls}__body`}>{children}</div>\n {footer && <div className={`${prefixCls}__footer`}>{footer}</div>}\n </div>\n </CSSTransition>\n </div>\n </Overlay>\n );\n});\n\nDrawer.displayName = 'Drawer';\n\nexport default Drawer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"drawer.js","names":["React","getPrefixCls","ConfigContext","Overlay","Transition"],"sources":["../../src/drawer/drawer.tsx"],"sourcesContent":["import React, { useContext, useEffect, useId, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport Transition from '../transition';\nimport Overlay from '../overlay';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { DrawerProps } from './types';\n\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>((props, ref) => {\n const {\n visible,\n placement = 'right',\n size = 256,\n closable = true,\n unmountOnClose = true,\n maskType = 'default',\n maskClosable = true,\n onClose,\n prefixCls: customisedCls,\n afterClose,\n zIndex = 1000,\n header,\n footer,\n className,\n maskStyle,\n style,\n children,\n } = props;\n const [drawerVisible, setDrawerVisible] = useState(visible);\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('drawer', configContext.prefixCls, customisedCls);\n const cls = classNames(prefixCls, className, `${prefixCls}_${placement}`);\n const sty: React.CSSProperties =\n placement === 'top' || placement === 'bottom' ? { height: size } : { width: size };\n const nodeRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n const titleId = useId();\n\n // Focus trap + Escape key\n useEffect(() => {\n if (!visible) return;\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.(e as unknown as React.MouseEvent);\n return;\n }\n if (e.key === 'Tab' && nodeRef.current) {\n const focusable = nodeRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first.focus(); }\n }\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n requestAnimationFrame(() => {\n if (nodeRef.current) {\n const focusable = nodeRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length > 0) focusable[0].focus();\n }\n });\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n previousFocusRef.current?.focus();\n };\n }, [visible, onClose]);\n\n return (\n <Overlay\n onEnter={(): void => setDrawerVisible(true)}\n onExit={(): void => setDrawerVisible(false)}\n zIndex={zIndex}\n type={maskType}\n unmountOnExit={unmountOnClose}\n isShow={visible}\n onExited={afterClose}\n clickCallback={(e: React.MouseEvent): void => {\n maskClosable && onClose ? onClose(e) : undefined;\n }}\n style={maskStyle}>\n <div ref={ref} className={cls} style={{ ...style, ...sty }}>\n <Transition\n appear={true}\n nodeRef={nodeRef}\n in={drawerVisible}\n timeout={0}\n unmountOnExit={false}\n classNames={`${prefixCls}__content_move`}>\n <div\n ref={nodeRef}\n className={`${prefixCls}__content`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={header ? titleId : undefined}\n onClick={(e) => e.stopPropagation()}>\n {closable && (\n <button type=\"button\" className={`${prefixCls}__close-btn`} onClick={onClose} aria-label=\"Close\">\n ✕\n </button>\n )}\n {header && <div className={`${prefixCls}__header`} id={titleId}>{header}</div>}\n <div className={`${prefixCls}__body`}>{children}</div>\n {footer && <div className={`${prefixCls}__footer`}>{footer}</div>}\n </div>\n </Transition>\n </div>\n </Overlay>\n );\n});\n\nDrawer.displayName = 'Drawer';\n\nexport default Drawer;\n"],"mappings":"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"}
@@ -2,12 +2,12 @@ const require_runtime = require("../_virtual/_rolldown/runtime.js");
2
2
  const require_config_context = require("../config-provider/config-context.js");
3
3
  const require_general = require("../_utils/general.js");
4
4
  const require_components = require("../_utils/components.js");
5
+ const require_index = require("../transition/index.js");
5
6
  let react = require("react");
6
7
  react = require_runtime.__toESM(react);
7
8
  let classnames = require("classnames");
8
9
  classnames = require_runtime.__toESM(classnames);
9
10
  let react_jsx_runtime = require("react/jsx-runtime");
10
- let react_transition_group = require("react-transition-group");
11
11
  //#region src/message/message.tsx
12
12
  const Message = (props) => {
13
13
  const { type, icon, content, duration, willUnmount, extra, className, style, prefixCls: customisedCls } = props;
@@ -52,11 +52,12 @@ const Message = (props) => {
52
52
  window.clearTimeout(timer);
53
53
  };
54
54
  }, [duration, willUnmount]);
55
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_transition_group.CSSTransition, {
55
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.default, {
56
56
  nodeRef: ref,
57
57
  in: visible,
58
58
  appear: true,
59
59
  timeout: 0,
60
+ unmountOnExit: false,
60
61
  classNames: `${prefixCls}_fade-slide`,
61
62
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
62
63
  role: "alert",
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","names":["getPrefixCls","ConfigContext","React","CheckCircle","InfoCircle","WarningCircle","CloseCircle","LoadingCircle","CSSTransition"],"sources":["../../src/message/message.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useContext } from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport {\n CheckCircle,\n CloseCircle,\n InfoCircle,\n LoadingCircle,\n WarningCircle,\n} from '../_utils/components';\nimport { MessageProps } from './types';\n\nconst Message = (props: MessageProps): JSX.Element => {\n const {\n type,\n icon,\n content,\n duration,\n willUnmount,\n extra,\n className,\n style,\n prefixCls: customisedCls,\n } = props;\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('message', configContext.prefixCls, customisedCls);\n const cls = classNames(prefixCls, className);\n const ref = useRef<HTMLDivElement | null>(null);\n const [visible, setVisible] = useState(true);\n\n const renderIcon = (): React.ReactNode => {\n if (React.isValidElement(icon)) {\n return icon;\n } else if (typeof type === 'string') {\n switch (type) {\n case 'success':\n return <CheckCircle size={16} className={`${prefixCls}__icon`} />;\n case 'info':\n return <InfoCircle size={16} className={`${prefixCls}__icon`} />;\n case 'warning':\n return <WarningCircle size={16} className={`${prefixCls}__icon`} />;\n case 'error':\n return <CloseCircle size={16} className={`${prefixCls}__icon`} />;\n case 'loading':\n return (\n <LoadingCircle\n size={16}\n className={classNames(`${prefixCls}__icon`, {\n [`${prefixCls}__icon_loading`]: type === 'loading',\n })}\n />\n );\n }\n }\n\n return null;\n };\n\n useEffect(() => {\n const node = ref.current;\n const height = (node && node.offsetHeight) || 0;\n const timer = window.setTimeout(() => {\n setVisible(false);\n willUnmount(height);\n }, duration);\n\n return (): void => {\n window.clearTimeout(timer);\n };\n }, [duration, willUnmount]);\n\n return (\n <CSSTransition nodeRef={ref} in={visible} appear={true} timeout={0} classNames={`${prefixCls}_fade-slide`}>\n <div role=\"alert\" className={cls} style={style} ref={ref}>\n {renderIcon()}\n <span className={`${prefixCls}__content`}>{content}</span>\n {extra && <div className={`${prefixCls}__extra`}>{extra}</div>}\n </div>\n </CSSTransition>\n );\n};\n\nMessage.displayName = 'Message';\n\nexport default Message;\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,WAAW,UAAqC;CACpD,MAAM,EACJ,MACA,MACA,SACA,UACA,aACA,OACA,WACA,OACA,WAAW,kBACT;CAEJ,MAAM,YAAYA,gBAAAA,aAAa,YAAA,GAAA,MAAA,YADEC,uBAAAA,cAAc,CACS,WAAW,cAAc;CACjF,MAAM,OAAA,GAAA,WAAA,SAAiB,WAAW,UAAU;CAC5C,MAAM,OAAA,GAAA,MAAA,QAAoC,KAAK;CAC/C,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAuB,KAAK;CAE5C,MAAM,mBAAoC;AACxC,MAAIC,MAAAA,QAAM,eAAe,KAAK,CAC5B,QAAO;WACE,OAAO,SAAS,SACzB,SAAQ,MAAR;GACE,KAAK,UACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,aAAD;IAAa,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GACnE,KAAK,OACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,YAAD;IAAY,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GAClE,KAAK,UACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,eAAD;IAAe,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GACrE,KAAK,QACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,aAAD;IAAa,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GACnE,KAAK,UACH,QACE,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,eAAD;IACE,MAAM;IACN,YAAA,GAAA,WAAA,SAAsB,GAAG,UAAU,SAAS,GACzC,GAAG,UAAU,kBAAkB,SAAS,WAC1C,CAAC;IACF,CAAA;;AAKV,SAAO;;AAGT,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,OAAO,IAAI;EACjB,MAAM,SAAU,QAAQ,KAAK,gBAAiB;EAC9C,MAAM,QAAQ,OAAO,iBAAiB;AACpC,cAAW,MAAM;AACjB,eAAY,OAAO;KAClB,SAAS;AAEZ,eAAmB;AACjB,UAAO,aAAa,MAAM;;IAE3B,CAAC,UAAU,YAAY,CAAC;AAE3B,QACE,iBAAA,GAAA,kBAAA,KAACC,uBAAAA,eAAD;EAAe,SAAS;EAAK,IAAI;EAAS,QAAQ;EAAM,SAAS;EAAG,YAAY,GAAG,UAAU;YAC3F,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,MAAK;GAAQ,WAAW;GAAY;GAAY;aAArD;IACG,YAAY;IACb,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,WAAW,GAAG,UAAU;eAAa;KAAe,CAAA;IACzD,SAAS,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAW,GAAG,UAAU;eAAW;KAAY,CAAA;IAC1D;;EACQ,CAAA;;AAIpB,QAAQ,cAAc"}
1
+ {"version":3,"file":"message.js","names":["getPrefixCls","ConfigContext","React","CheckCircle","InfoCircle","WarningCircle","CloseCircle","LoadingCircle","Transition"],"sources":["../../src/message/message.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useContext } from 'react';\nimport classNames from 'classnames';\nimport Transition from '../transition';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport {\n CheckCircle,\n CloseCircle,\n InfoCircle,\n LoadingCircle,\n WarningCircle,\n} from '../_utils/components';\nimport { MessageProps } from './types';\n\nconst Message = (props: MessageProps): JSX.Element => {\n const {\n type,\n icon,\n content,\n duration,\n willUnmount,\n extra,\n className,\n style,\n prefixCls: customisedCls,\n } = props;\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('message', configContext.prefixCls, customisedCls);\n const cls = classNames(prefixCls, className);\n const ref = useRef<HTMLDivElement | null>(null);\n const [visible, setVisible] = useState(true);\n\n const renderIcon = (): React.ReactNode => {\n if (React.isValidElement(icon)) {\n return icon;\n } else if (typeof type === 'string') {\n switch (type) {\n case 'success':\n return <CheckCircle size={16} className={`${prefixCls}__icon`} />;\n case 'info':\n return <InfoCircle size={16} className={`${prefixCls}__icon`} />;\n case 'warning':\n return <WarningCircle size={16} className={`${prefixCls}__icon`} />;\n case 'error':\n return <CloseCircle size={16} className={`${prefixCls}__icon`} />;\n case 'loading':\n return (\n <LoadingCircle\n size={16}\n className={classNames(`${prefixCls}__icon`, {\n [`${prefixCls}__icon_loading`]: type === 'loading',\n })}\n />\n );\n }\n }\n\n return null;\n };\n\n useEffect(() => {\n const node = ref.current;\n const height = (node && node.offsetHeight) || 0;\n const timer = window.setTimeout(() => {\n setVisible(false);\n willUnmount(height);\n }, duration);\n\n return (): void => {\n window.clearTimeout(timer);\n };\n }, [duration, willUnmount]);\n\n return (\n <Transition nodeRef={ref} in={visible} appear={true} timeout={0} unmountOnExit={false} classNames={`${prefixCls}_fade-slide`}>\n <div role=\"alert\" className={cls} style={style} ref={ref}>\n {renderIcon()}\n <span className={`${prefixCls}__content`}>{content}</span>\n {extra && <div className={`${prefixCls}__extra`}>{extra}</div>}\n </div>\n </Transition>\n );\n};\n\nMessage.displayName = 'Message';\n\nexport default Message;\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,WAAW,UAAqC;CACpD,MAAM,EACJ,MACA,MACA,SACA,UACA,aACA,OACA,WACA,OACA,WAAW,kBACT;CAEJ,MAAM,YAAYA,gBAAAA,aAAa,YAAA,GAAA,MAAA,YADEC,uBAAAA,cAAc,CACS,WAAW,cAAc;CACjF,MAAM,OAAA,GAAA,WAAA,SAAiB,WAAW,UAAU;CAC5C,MAAM,OAAA,GAAA,MAAA,QAAoC,KAAK;CAC/C,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAuB,KAAK;CAE5C,MAAM,mBAAoC;AACxC,MAAIC,MAAAA,QAAM,eAAe,KAAK,CAC5B,QAAO;WACE,OAAO,SAAS,SACzB,SAAQ,MAAR;GACE,KAAK,UACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,aAAD;IAAa,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GACnE,KAAK,OACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,YAAD;IAAY,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GAClE,KAAK,UACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,eAAD;IAAe,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GACrE,KAAK,QACH,QAAO,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,aAAD;IAAa,MAAM;IAAI,WAAW,GAAG,UAAU;IAAW,CAAA;GACnE,KAAK,UACH,QACE,iBAAA,GAAA,kBAAA,KAACC,mBAAAA,eAAD;IACE,MAAM;IACN,YAAA,GAAA,WAAA,SAAsB,GAAG,UAAU,SAAS,GACzC,GAAG,UAAU,kBAAkB,SAAS,WAC1C,CAAC;IACF,CAAA;;AAKV,SAAO;;AAGT,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,OAAO,IAAI;EACjB,MAAM,SAAU,QAAQ,KAAK,gBAAiB;EAC9C,MAAM,QAAQ,OAAO,iBAAiB;AACpC,cAAW,MAAM;AACjB,eAAY,OAAO;KAClB,SAAS;AAEZ,eAAmB;AACjB,UAAO,aAAa,MAAM;;IAE3B,CAAC,UAAU,YAAY,CAAC;AAE3B,QACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,SAAD;EAAY,SAAS;EAAK,IAAI;EAAS,QAAQ;EAAM,SAAS;EAAG,eAAe;EAAO,YAAY,GAAG,UAAU;YAC9G,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,MAAK;GAAQ,WAAW;GAAY;GAAY;aAArD;IACG,YAAY;IACb,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,WAAW,GAAG,UAAU;eAAa;KAAe,CAAA;IACzD,SAAS,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAW,GAAG,UAAU;eAAW;KAAY,CAAA;IAC1D;;EACK,CAAA;;AAIjB,QAAQ,cAAc"}