@mks2508/mks-ui 0.2.1 → 0.3.1

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 (155) hide show
  1. package/dist/react-ui/hooks/Animation/UseAutoHeight.js +7 -7
  2. package/dist/react-ui/hooks/DOM/UseIsInView.js +3 -3
  3. package/dist/react-ui/hooks/Formatting/UseListFormat.d.ts +49 -0
  4. package/dist/react-ui/hooks/Formatting/UseListFormat.d.ts.map +1 -0
  5. package/dist/react-ui/hooks/Formatting/UseListFormat.js +105 -0
  6. package/dist/react-ui/hooks/State/UseControlledState.js +4 -4
  7. package/dist/react-ui/hooks/State/UseDataState.js +5 -5
  8. package/dist/react-ui/hooks/index.d.ts +2 -0
  9. package/dist/react-ui/hooks/index.d.ts.map +1 -1
  10. package/dist/react-ui/hooks/index.js +1 -0
  11. package/dist/react-ui/index.js +22 -2
  12. package/dist/react-ui/lib/get-strict-context.js +3 -3
  13. package/dist/react-ui/primitives/CountingNumber/index.js +3 -3
  14. package/dist/react-ui/primitives/Highlight/index.js +26 -26
  15. package/dist/react-ui/primitives/Slot/index.js +3 -3
  16. package/dist/react-ui/primitives/index.d.ts +1 -0
  17. package/dist/react-ui/primitives/index.d.ts.map +1 -1
  18. package/dist/react-ui/primitives/index.js +18 -0
  19. package/dist/react-ui/primitives/waapi/Morph/Morph.types.d.ts +76 -0
  20. package/dist/react-ui/primitives/waapi/Morph/Morph.types.d.ts.map +1 -0
  21. package/dist/react-ui/primitives/waapi/Morph/MorphContext.d.ts +11 -0
  22. package/dist/react-ui/primitives/waapi/Morph/MorphContext.d.ts.map +1 -0
  23. package/dist/react-ui/primitives/waapi/Morph/MorphContext.js +19 -0
  24. package/dist/react-ui/primitives/waapi/Morph/index.d.ts +23 -0
  25. package/dist/react-ui/primitives/waapi/Morph/index.d.ts.map +1 -0
  26. package/dist/react-ui/primitives/waapi/Morph/index.js +45 -0
  27. package/dist/react-ui/primitives/waapi/Morph/techniques/index.d.ts +12 -0
  28. package/dist/react-ui/primitives/waapi/Morph/techniques/index.d.ts.map +1 -0
  29. package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.d.ts +38 -0
  30. package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.d.ts.map +1 -0
  31. package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.js +78 -0
  32. package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.d.ts +23 -0
  33. package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.d.ts.map +1 -0
  34. package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.js +140 -0
  35. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts +28 -0
  36. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts.map +1 -0
  37. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.js +77 -0
  38. package/dist/react-ui/primitives/waapi/Morph/useMorph.d.ts +27 -0
  39. package/dist/react-ui/primitives/waapi/Morph/useMorph.d.ts.map +1 -0
  40. package/dist/react-ui/primitives/waapi/Morph/useMorph.js +86 -0
  41. package/dist/react-ui/primitives/waapi/Reorder/Reorder.types.d.ts +168 -0
  42. package/dist/react-ui/primitives/waapi/Reorder/Reorder.types.d.ts.map +1 -0
  43. package/dist/react-ui/primitives/waapi/Reorder/index.d.ts +25 -0
  44. package/dist/react-ui/primitives/waapi/Reorder/index.d.ts.map +1 -0
  45. package/dist/react-ui/primitives/waapi/Reorder/index.js +186 -0
  46. package/dist/react-ui/primitives/waapi/Reorder/useReorder.d.ts +26 -0
  47. package/dist/react-ui/primitives/waapi/Reorder/useReorder.d.ts.map +1 -0
  48. package/dist/react-ui/primitives/waapi/Reorder/useReorder.js +48 -0
  49. package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.d.ts +33 -0
  50. package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.d.ts.map +1 -0
  51. package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.js +137 -0
  52. package/dist/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.d.ts +47 -0
  53. package/dist/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.d.ts.map +1 -0
  54. package/dist/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.js +72 -0
  55. package/dist/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.d.ts +10 -0
  56. package/dist/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.d.ts.map +1 -0
  57. package/dist/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.d.ts +74 -0
  58. package/dist/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.d.ts.map +1 -0
  59. package/dist/react-ui/primitives/waapi/SlidingNumber/index.d.ts +33 -0
  60. package/dist/react-ui/primitives/waapi/SlidingNumber/index.d.ts.map +1 -0
  61. package/dist/react-ui/primitives/waapi/SlidingNumber/index.js +354 -0
  62. package/dist/react-ui/primitives/waapi/SlidingText/SlidingText.styles.d.ts +25 -0
  63. package/dist/react-ui/primitives/waapi/SlidingText/SlidingText.styles.d.ts.map +1 -0
  64. package/dist/react-ui/primitives/waapi/SlidingText/SlidingText.types.d.ts +57 -0
  65. package/dist/react-ui/primitives/waapi/SlidingText/SlidingText.types.d.ts.map +1 -0
  66. package/dist/react-ui/primitives/waapi/SlidingText/index.d.ts +26 -0
  67. package/dist/react-ui/primitives/waapi/SlidingText/index.d.ts.map +1 -0
  68. package/dist/react-ui/primitives/waapi/SlidingText/index.js +105 -0
  69. package/dist/react-ui/primitives/waapi/core/animationConstants.d.ts +156 -0
  70. package/dist/react-ui/primitives/waapi/core/animationConstants.d.ts.map +1 -0
  71. package/dist/react-ui/primitives/waapi/core/animationConstants.js +180 -0
  72. package/dist/react-ui/primitives/waapi/core/index.d.ts +16 -0
  73. package/dist/react-ui/primitives/waapi/core/index.d.ts.map +1 -0
  74. package/dist/react-ui/primitives/waapi/core/index.js +5 -0
  75. package/dist/react-ui/primitives/waapi/core/types.d.ts +143 -0
  76. package/dist/react-ui/primitives/waapi/core/types.d.ts.map +1 -0
  77. package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.d.ts +32 -0
  78. package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.d.ts.map +1 -0
  79. package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.js +322 -0
  80. package/dist/react-ui/primitives/waapi/core/useElementRegistry.d.ts +21 -0
  81. package/dist/react-ui/primitives/waapi/core/useElementRegistry.d.ts.map +1 -0
  82. package/dist/react-ui/primitives/waapi/core/useElementRegistry.js +65 -0
  83. package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.d.ts +20 -0
  84. package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.d.ts.map +1 -0
  85. package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.js +99 -0
  86. package/dist/react-ui/primitives/waapi/core/usePositionCapture.d.ts +24 -0
  87. package/dist/react-ui/primitives/waapi/core/usePositionCapture.d.ts.map +1 -0
  88. package/dist/react-ui/primitives/waapi/core/usePositionCapture.js +75 -0
  89. package/dist/react-ui/primitives/waapi/index.d.ts +33 -0
  90. package/dist/react-ui/primitives/waapi/index.d.ts.map +1 -0
  91. package/dist/react-ui/primitives/waapi/index.js +18 -0
  92. package/dist/react-ui/ui/Accordion/index.js +3 -3
  93. package/dist/react-ui/ui/Button/index.js +8 -8
  94. package/dist/react-ui/ui/Combobox/index.js +2 -2
  95. package/dist/react-ui/ui/DataCard/DataCard.styles.d.ts +35 -0
  96. package/dist/react-ui/ui/DataCard/DataCard.styles.d.ts.map +1 -0
  97. package/dist/react-ui/ui/DataCard/DataCard.styles.js +114 -0
  98. package/dist/react-ui/ui/DataCard/DataCard.types.d.ts +135 -0
  99. package/dist/react-ui/ui/DataCard/DataCard.types.d.ts.map +1 -0
  100. package/dist/react-ui/ui/DataCard/index.d.ts +129 -0
  101. package/dist/react-ui/ui/DataCard/index.d.ts.map +1 -0
  102. package/dist/react-ui/ui/DataCard/index.js +276 -0
  103. package/dist/react-ui/ui/Menu/index.js +2 -2
  104. package/dist/react-ui/ui/Switch/index.js +3 -3
  105. package/dist/react-ui/ui/Tabs/index.js +3 -3
  106. package/dist/react-ui/ui/TextFlow/TextFlow.styles.d.ts +16 -0
  107. package/dist/react-ui/ui/TextFlow/TextFlow.styles.d.ts.map +1 -0
  108. package/dist/react-ui/ui/TextFlow/TextFlow.types.d.ts +101 -0
  109. package/dist/react-ui/ui/TextFlow/TextFlow.types.d.ts.map +1 -0
  110. package/dist/react-ui/ui/TextFlow/index.d.ts +26 -0
  111. package/dist/react-ui/ui/TextFlow/index.d.ts.map +1 -0
  112. package/dist/react-ui/ui/TextFlow/index.js +187 -0
  113. package/dist/react-ui/ui/index.d.ts +2 -1
  114. package/dist/react-ui/ui/index.d.ts.map +1 -1
  115. package/dist/react-ui/ui/index.js +3 -1
  116. package/package.json +6 -2
  117. package/src/react-ui/hooks/Formatting/UseListFormat.ts +134 -0
  118. package/src/react-ui/hooks/index.ts +3 -0
  119. package/src/react-ui/primitives/index.ts +3 -0
  120. package/src/react-ui/primitives/waapi/Morph/Morph.types.ts +106 -0
  121. package/src/react-ui/primitives/waapi/Morph/MorphContext.tsx +21 -0
  122. package/src/react-ui/primitives/waapi/Morph/index.tsx +56 -0
  123. package/src/react-ui/primitives/waapi/Morph/techniques/index.ts +12 -0
  124. package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +88 -0
  125. package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +175 -0
  126. package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +86 -0
  127. package/src/react-ui/primitives/waapi/Morph/useMorph.ts +100 -0
  128. package/src/react-ui/primitives/waapi/Reorder/Reorder.types.ts +177 -0
  129. package/src/react-ui/primitives/waapi/Reorder/index.tsx +260 -0
  130. package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +46 -0
  131. package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +208 -0
  132. package/src/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.ts +104 -0
  133. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.ts +14 -0
  134. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.ts +84 -0
  135. package/src/react-ui/primitives/waapi/SlidingNumber/index.tsx +474 -0
  136. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.styles.ts +32 -0
  137. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.types.ts +69 -0
  138. package/src/react-ui/primitives/waapi/SlidingText/index.tsx +140 -0
  139. package/src/react-ui/primitives/waapi/core/animationConstants.ts +215 -0
  140. package/src/react-ui/primitives/waapi/core/index.ts +53 -0
  141. package/src/react-ui/primitives/waapi/core/types.ts +200 -0
  142. package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +429 -0
  143. package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +80 -0
  144. package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +137 -0
  145. package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +105 -0
  146. package/src/react-ui/primitives/waapi/index.ts +116 -0
  147. package/src/react-ui/styles/animations.css +369 -0
  148. package/src/react-ui/ui/DataCard/DataCard.styles.ts +150 -0
  149. package/src/react-ui/ui/DataCard/DataCard.types.ts +146 -0
  150. package/src/react-ui/ui/DataCard/index.tsx +406 -0
  151. package/src/react-ui/ui/TextFlow/TextFlow.styles.ts +36 -0
  152. package/src/react-ui/ui/TextFlow/TextFlow.types.ts +118 -0
  153. package/src/react-ui/ui/TextFlow/index.tsx +276 -0
  154. package/src/react-ui/ui/index.ts +4 -1
  155. /package/dist/react-ui/components/MorphingPopover/{morphing-popover.module-CgbYV_HS.css → morphing-popover.module-BycNI8nU.css} +0 -0
@@ -0,0 +1,86 @@
1
+ import { useFLIPClipPath } from "./techniques/useFLIPClipPath.js";
2
+ import { useCSSGridMorph } from "./techniques/useCSSGridMorph.js";
3
+ import { useViewTransitions } from "./techniques/useViewTransitions.js";
4
+ import { useCallback, useEffect, useRef } from "react";
5
+
6
+ //#region src/react-ui/primitives/waapi/Morph/useMorph.ts
7
+ /**
8
+ * Unified hook for morphing animations.
9
+ *
10
+ * Provides access to multiple morphing techniques:
11
+ * - FLIP + clip-path (default): Best for element-to-element transitions
12
+ * - CSS Grid: Best for expand/collapse animations
13
+ * - View Transitions: Best for page/route transitions (requires browser support)
14
+ *
15
+ * Falls back to FLIP + clip-path when View Transitions API is unsupported.
16
+ *
17
+ * @param options - Technique selection, timing, and callbacks
18
+ * @returns Unified morph API with access to individual techniques
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * const morph = useMorph({ technique: 'flip-clip-path' });
23
+ *
24
+ * // Unified API:
25
+ * await morph.morph(fromElement, toElement);
26
+ *
27
+ * // Or individual techniques:
28
+ * morph.cssGrid.toggle();
29
+ * ```
30
+ */
31
+ function useMorph(options) {
32
+ const technique = options?.technique ?? "flip-clip-path";
33
+ const optionsRef = useRef(options);
34
+ useEffect(() => {
35
+ optionsRef.current = options;
36
+ }, [options]);
37
+ const flipClipPath = useFLIPClipPath({
38
+ duration: options?.duration,
39
+ easing: options?.easing
40
+ });
41
+ const cssGrid = useCSSGridMorph({
42
+ duration: options?.duration,
43
+ easing: options?.easing
44
+ });
45
+ const viewTransitions = useViewTransitions();
46
+ const isMorphing = flipClipPath.isMorphing;
47
+ const morph = useCallback(async (fromElement, toElement) => {
48
+ optionsRef.current?.onMorphStart?.();
49
+ switch (optionsRef.current?.technique ?? "flip-clip-path") {
50
+ case "flip-clip-path":
51
+ await flipClipPath.morph(fromElement, toElement);
52
+ break;
53
+ case "view-transitions":
54
+ if (viewTransitions.isSupported) await viewTransitions.startTransition(() => {
55
+ fromElement.style.opacity = "0";
56
+ toElement.style.opacity = "1";
57
+ });
58
+ else await flipClipPath.morph(fromElement, toElement);
59
+ break;
60
+ case "css-grid":
61
+ cssGrid.toggle();
62
+ break;
63
+ }
64
+ optionsRef.current?.onMorphEnd?.();
65
+ }, [
66
+ flipClipPath,
67
+ viewTransitions,
68
+ cssGrid
69
+ ]);
70
+ const cancel = useCallback(() => {
71
+ flipClipPath.cancel();
72
+ }, [flipClipPath]);
73
+ return {
74
+ isMorphing,
75
+ technique,
76
+ isViewTransitionsSupported: viewTransitions.isSupported,
77
+ morph,
78
+ cancel,
79
+ flipClipPath,
80
+ cssGrid,
81
+ viewTransitions
82
+ };
83
+ }
84
+
85
+ //#endregion
86
+ export { useMorph };
@@ -0,0 +1,168 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { IAnimationOrchestratorAPI, FLIPBehavior, ExitPositionStrategy } from '../core/types';
3
+ export type { FLIPBehavior, ExitPositionStrategy } from '../core/types';
4
+ /**
5
+ * Layout direction for reorder items.
6
+ *
7
+ * - `auto`: No layout applied (consumer handles positioning)
8
+ * - `horizontal`: Flexbox row layout with wrapping
9
+ * - `inline-horizontal`: Inline-flexbox row layout without wrapping
10
+ * - `vertical`: Flexbox column layout
11
+ * - `grid`: CSS Grid with auto-fill columns
12
+ */
13
+ export type ReorderLayout = 'auto' | 'horizontal' | 'inline-horizontal' | 'vertical' | 'grid';
14
+ /**
15
+ * Stagger configuration for animations.
16
+ * A single number applies to both enter/exit; an object allows separate values.
17
+ */
18
+ export type StaggerConfig = number | {
19
+ enter: number;
20
+ exit: number;
21
+ };
22
+ /**
23
+ * Duration configuration for animations.
24
+ * A single number applies to both enter/exit; an object allows separate values.
25
+ */
26
+ export type DurationConfig = number | {
27
+ enter: number;
28
+ exit: number;
29
+ };
30
+ /**
31
+ * Animation state for individual reorder items.
32
+ */
33
+ export interface IReorderItemState {
34
+ /** True when the item is currently animating out */
35
+ isExiting: boolean;
36
+ /** True when the item is currently animating in */
37
+ isEntering: boolean;
38
+ }
39
+ /**
40
+ * Props for Reorder container component.
41
+ * Agnostic primitive for animated list reordering using FLIP technique.
42
+ */
43
+ export interface IReorderProps {
44
+ /** Child elements to be animated. Each child should have a unique `key` prop */
45
+ children: ReactNode;
46
+ /** Layout arrangement for child elements */
47
+ layout?: ReorderLayout;
48
+ /** Stagger delay between item animations */
49
+ stagger?: StaggerConfig;
50
+ /** Animation duration in milliseconds */
51
+ duration?: DurationConfig;
52
+ /** Additional CSS class name for the container */
53
+ className?: string;
54
+ /** FLIP animation behavior strategy */
55
+ flipBehavior?: FLIPBehavior;
56
+ /** Strategy for positioning elements during exit animation */
57
+ exitPositionStrategy?: ExitPositionStrategy;
58
+ /** Callback fired when an item starts its exit animation */
59
+ onItemExit?: (id: string) => void;
60
+ /** Callback fired when an item completes its enter animation */
61
+ onItemEnter?: (id: string) => void;
62
+ }
63
+ /**
64
+ * Configuration options for useReorder hook.
65
+ * All timing values are in milliseconds.
66
+ */
67
+ export interface IUseReorderConfig {
68
+ /** Duration of enter animation in milliseconds. @default 200 */
69
+ enterDuration?: number;
70
+ /** Duration of exit animation in milliseconds. @default 180 */
71
+ exitDuration?: number;
72
+ /** Duration of FLIP animation in milliseconds. @default 300 */
73
+ flipDuration?: number;
74
+ /** Easing function for enter animation */
75
+ enterEasing?: string;
76
+ /** Easing function for exit animation */
77
+ exitEasing?: string;
78
+ /** Easing function for FLIP animation */
79
+ flipEasing?: string;
80
+ /** FLIP animation behavior strategy. @default 'all' */
81
+ flipBehavior?: FLIPBehavior;
82
+ /** Strategy for positioning elements during exit animation. @default 'absolute-fixed' */
83
+ exitPositionStrategy?: ExitPositionStrategy;
84
+ /** Callback called when an item's exit animation completes */
85
+ onComplete?: (id: string) => void;
86
+ }
87
+ /**
88
+ * Return type for useReorder hook.
89
+ * Extends the full AnimationOrchestratorAPI with semantic aliases.
90
+ */
91
+ export interface IUseReorderReturn extends IAnimationOrchestratorAPI {
92
+ /** Start exit animation for an item (alias for startExit) */
93
+ startItemExit: (id: string) => Promise<void>;
94
+ /** Start enter animation for an item (alias for startEnter) */
95
+ startItemEnter: (id: string) => Promise<void>;
96
+ }
97
+ /**
98
+ * Context value passed to Reorder children.
99
+ * @internal Consumed by ReorderItem component.
100
+ */
101
+ export interface IReorderContextValue {
102
+ /** Reorder instance with animation methods */
103
+ reorder: IUseReorderReturn;
104
+ /** Current layout setting */
105
+ layout: ReorderLayout;
106
+ /** Check if an item is currently exiting */
107
+ isExiting: (id: string) => boolean;
108
+ /** Check if an item is currently entering */
109
+ isEntering: (id: string) => boolean;
110
+ /** Array of item IDs currently exiting */
111
+ exitingIds: string[];
112
+ /** Array of item IDs currently entering */
113
+ enteringIds: string[];
114
+ }
115
+ /**
116
+ * Configuration for useReorderPresence hook.
117
+ * An alternative to the Reorder component giving full control
118
+ * over rendering while handling animation orchestration.
119
+ */
120
+ export interface IUseReorderPresenceConfig {
121
+ /** Enable automatic enter animations for new children. @default true */
122
+ autoAnimate?: boolean;
123
+ /** Stagger delay between item animations */
124
+ stagger?: StaggerConfig;
125
+ /** Duration of enter animation in milliseconds */
126
+ enterDuration?: number;
127
+ /** Duration of exit animation in milliseconds */
128
+ exitDuration?: number;
129
+ /** Duration of FLIP animation in milliseconds */
130
+ flipDuration?: number;
131
+ /** Easing function for enter animation */
132
+ enterEasing?: string;
133
+ /** Easing function for exit animation */
134
+ exitEasing?: string;
135
+ /** Easing function for FLIP animation */
136
+ flipEasing?: string;
137
+ /** FLIP animation behavior strategy */
138
+ flipBehavior?: FLIPBehavior;
139
+ /** Strategy for positioning elements during exit animation */
140
+ exitPositionStrategy?: ExitPositionStrategy;
141
+ /** Callback fired when an item starts its exit animation */
142
+ onItemExit?: (id: string) => void;
143
+ /** Callback fired when an item completes its enter animation */
144
+ onItemEnter?: (id: string) => void;
145
+ /** Callback fired when an item's exit animation completes */
146
+ onAnimationComplete?: (id: string) => void;
147
+ }
148
+ /**
149
+ * Return type for useReorderPresence hook.
150
+ * Provides rendered children and methods for triggering animations.
151
+ */
152
+ export interface IUseReorderPresenceReturn {
153
+ /** Rendered children with animation data attributes applied */
154
+ presentChildren: ReactNode;
155
+ /** Trigger exit animation for an item */
156
+ triggerExit: (id: string) => void;
157
+ /** Check if an item is currently exiting */
158
+ isExiting: (id: string) => boolean;
159
+ /** Check if an item is currently entering */
160
+ isEntering: (id: string) => boolean;
161
+ /** Array of item IDs currently exiting */
162
+ exitingIds: string[];
163
+ /** Array of item IDs currently entering */
164
+ enteringIds: string[];
165
+ /** Underlying reorder instance */
166
+ reorder: IUseReorderReturn;
167
+ }
168
+ //# sourceMappingURL=Reorder.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reorder.types.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/primitives/waapi/Reorder/Reorder.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,OAAO,CAAC;AACpD,OAAO,KAAK,EACV,yBAAyB,EACzB,YAAY,EACZ,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAExE;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,mBAAmB,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9F;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,QAAQ,EAAE,SAAS,CAAC;IACpB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gEAAgE;IAChE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,yFAAyF;IACzF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,8DAA8D;IAC9D,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,yBAAyB;IAClE,6DAA6D;IAC7D,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,+DAA+D;IAC/D,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,4CAA4C;IAC5C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,6CAA6C;IAC7C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,wEAAwE;IACxE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gEAAgE;IAChE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,6DAA6D;IAC7D,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,+DAA+D;IAC/D,eAAe,EAAE,SAAS,CAAC;IAC3B,yCAAyC;IACzC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4CAA4C;IAC5C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,6CAA6C;IAC7C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kCAAkC;IAClC,OAAO,EAAE,iBAAiB,CAAC;CAC5B"}
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import type { IReorderProps } from './Reorder.types';
3
+ /**
4
+ * Reorder - Agnostic container for reorderable items with FLIP animations
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * <Reorder
9
+ * layout="horizontal"
10
+ * onItemExit={(id) => handleRemove(id)}
11
+ * >
12
+ * {items.map(item => (
13
+ * <div key={item.id}>{item.name}</div>
14
+ * ))}
15
+ * </Reorder>
16
+ * ```
17
+ */
18
+ declare const ReorderRoot: React.ForwardRefExoticComponent<IReorderProps & React.RefAttributes<{
19
+ startItemExit: (id: string) => Promise<void>;
20
+ startItemEnter: (id: string) => Promise<void>;
21
+ isAnimating: (id?: string) => boolean;
22
+ }>>;
23
+ export { ReorderRoot as Reorder };
24
+ export type { IReorderProps, ReorderLayout, DurationConfig, StaggerConfig, IUseReorderReturn, IUseReorderConfig, IReorderItemState, IReorderContextValue, IUseReorderPresenceConfig, IUseReorderPresenceReturn, FLIPBehavior, ExitPositionStrategy, } from './Reorder.types';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/primitives/waapi/Reorder/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4L,MAAM,OAAO,CAAC;AAEjN,OAAO,KAAK,EAAE,aAAa,EAAiC,MAAM,iBAAiB,CAAC;AAsBpF;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,WAAW;mBACA,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;oBAC5B,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;iBAChC,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO;GAqMrC,CAAC;AAIH,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,CAAC;AAClC,YAAY,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,YAAY,EACZ,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,186 @@
1
+ "use client";
2
+
3
+ import { cn } from "../../../lib/utils.js";
4
+ import { useReorder } from "./useReorder.js";
5
+ import React, { Children, cloneElement, forwardRef, isValidElement, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+
8
+ //#region src/react-ui/primitives/waapi/Reorder/index.tsx
9
+ function getDuration(config, type) {
10
+ if (config === void 0) return void 0;
11
+ if (typeof config === "number") return config;
12
+ return config[type];
13
+ }
14
+ const layoutStyles = {
15
+ auto: { position: "relative" },
16
+ horizontal: {
17
+ display: "flex",
18
+ flexDirection: "row",
19
+ flexWrap: "wrap",
20
+ alignItems: "center",
21
+ position: "relative"
22
+ },
23
+ "inline-horizontal": {
24
+ display: "inline-flex",
25
+ flexDirection: "row",
26
+ flexWrap: "nowrap",
27
+ alignItems: "center",
28
+ position: "relative"
29
+ },
30
+ vertical: {
31
+ display: "flex",
32
+ flexDirection: "column",
33
+ position: "relative"
34
+ },
35
+ grid: {
36
+ display: "grid",
37
+ gridTemplateColumns: "repeat(auto-fill, minmax(100px, 1fr))",
38
+ gap: "8px",
39
+ position: "relative"
40
+ }
41
+ };
42
+ /**
43
+ * Reorder - Agnostic container for reorderable items with FLIP animations
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * <Reorder
48
+ * layout="horizontal"
49
+ * onItemExit={(id) => handleRemove(id)}
50
+ * >
51
+ * {items.map(item => (
52
+ * <div key={item.id}>{item.name}</div>
53
+ * ))}
54
+ * </Reorder>
55
+ * ```
56
+ */
57
+ const ReorderRoot = forwardRef(({ children, stagger, duration, layout = "auto", className = "", flipBehavior, exitPositionStrategy, onItemExit, onItemEnter }, ref) => {
58
+ const handleAnimationComplete = useCallback((id) => {
59
+ setDisplayChildren((prev) => prev.filter((child) => child.key !== id));
60
+ }, []);
61
+ const reorder = useReorder({
62
+ enterDuration: getDuration(duration, "enter"),
63
+ exitDuration: getDuration(duration, "exit"),
64
+ flipBehavior,
65
+ exitPositionStrategy,
66
+ onComplete: handleAnimationComplete
67
+ });
68
+ useImperativeHandle(ref, () => ({
69
+ startItemExit: reorder.startItemExit,
70
+ startItemEnter: reorder.startItemEnter,
71
+ isAnimating: reorder.isAnimating
72
+ }), [
73
+ reorder.startItemExit,
74
+ reorder.startItemEnter,
75
+ reorder.isAnimating
76
+ ]);
77
+ const startExitRef = useRef(reorder.startItemExit);
78
+ const startEnterRef = useRef(reorder.startItemEnter);
79
+ useEffect(() => {
80
+ startExitRef.current = reorder.startItemExit;
81
+ startEnterRef.current = reorder.startItemEnter;
82
+ }, [reorder.startItemExit, reorder.startItemEnter]);
83
+ const currentChildren = useMemo(() => {
84
+ const records = [];
85
+ Children.forEach(children, (child) => {
86
+ if (isValidElement(child) && child.key != null) records.push({
87
+ key: String(child.key),
88
+ element: child
89
+ });
90
+ });
91
+ return records;
92
+ }, [children]);
93
+ const [displayChildren, setDisplayChildren] = useState(currentChildren);
94
+ const exitingKeysRef = useRef(/* @__PURE__ */ new Set());
95
+ const getStaggerDelay = useCallback((index, type) => {
96
+ if (!stagger) return 0;
97
+ if (typeof stagger === "number") return stagger * index;
98
+ return (stagger[type] ?? 0) * index;
99
+ }, [stagger]);
100
+ useEffect(() => {
101
+ const currentKeys = new Set(currentChildren.map((c) => c.key));
102
+ const displayKeys = new Set(displayChildren.map((c) => c.key));
103
+ const removed = displayChildren.filter((c) => !currentKeys.has(c.key) && !exitingKeysRef.current.has(c.key));
104
+ const added = currentChildren.filter((c) => !displayKeys.has(c.key));
105
+ if (removed.length === 0 && added.length === 0) {
106
+ if (currentChildren.some((c) => {
107
+ const displayChild = displayChildren.find((dc) => dc.key === c.key);
108
+ return displayChild && displayChild.element !== c.element;
109
+ })) setDisplayChildren((prev) => prev.map((dc) => {
110
+ if (exitingKeysRef.current.has(dc.key)) return dc;
111
+ return currentChildren.find((c) => c.key === dc.key) ?? dc;
112
+ }));
113
+ return;
114
+ }
115
+ removed.forEach((child, index) => {
116
+ const delay = getStaggerDelay(index, "exit");
117
+ exitingKeysRef.current.add(child.key);
118
+ const processExit = () => {
119
+ onItemExit?.(child.key);
120
+ startExitRef.current(child.key).finally(() => {
121
+ exitingKeysRef.current.delete(child.key);
122
+ });
123
+ };
124
+ if (delay > 0) setTimeout(processExit, delay);
125
+ else processExit();
126
+ });
127
+ if (added.length > 0) {
128
+ const exitingChildren = displayChildren.filter((c) => !currentKeys.has(c.key));
129
+ let result = [...currentChildren];
130
+ exitingChildren.forEach((ec) => {
131
+ const oldIdx = displayChildren.findIndex((c) => c.key === ec.key);
132
+ if (oldIdx !== -1 && oldIdx <= result.length) result.splice(oldIdx, 0, ec);
133
+ });
134
+ setDisplayChildren(result);
135
+ added.forEach((child, index) => {
136
+ const delay = getStaggerDelay(index, "enter");
137
+ const processEnter = () => {
138
+ onItemEnter?.(child.key);
139
+ };
140
+ if (delay > 0) setTimeout(processEnter, delay);
141
+ else processEnter();
142
+ });
143
+ }
144
+ }, [
145
+ currentChildren,
146
+ displayChildren,
147
+ getStaggerDelay,
148
+ onItemExit,
149
+ onItemEnter
150
+ ]);
151
+ const presentChildren = useMemo(() => {
152
+ const currentKeys = new Set(currentChildren.map((c) => c.key));
153
+ return displayChildren.map(({ key, element }) => {
154
+ const isNewElement = currentKeys.has(key);
155
+ const isExiting = exitingKeysRef.current.has(key);
156
+ return cloneElement(element, {
157
+ ref: (el) => {
158
+ if (el) {
159
+ reorder.registerElement(key, el);
160
+ if (!el.dataset.reorderState && isNewElement && !isExiting) {
161
+ el.dataset.reorderState = "entering";
162
+ startEnterRef.current(key);
163
+ }
164
+ } else reorder.registerElement(key, null);
165
+ const originalRef = element.ref;
166
+ if (typeof originalRef === "function") originalRef(el);
167
+ else if (originalRef && typeof originalRef === "object") originalRef.current = el;
168
+ },
169
+ "data-reorder-id": key
170
+ });
171
+ });
172
+ }, [
173
+ displayChildren,
174
+ currentChildren,
175
+ reorder.registerElement
176
+ ]);
177
+ return /* @__PURE__ */ jsx("div", {
178
+ className: cn("waapi-reorder-container", "reorder", layout !== "auto" ? `reorder--${layout}` : "", className),
179
+ style: layoutStyles[layout],
180
+ children: presentChildren
181
+ });
182
+ });
183
+ ReorderRoot.displayName = "Reorder";
184
+
185
+ //#endregion
186
+ export { ReorderRoot };
@@ -0,0 +1,26 @@
1
+ import type { IUseReorderReturn, IUseReorderConfig } from './Reorder.types';
2
+ /**
3
+ * Hook for managing reorderable lists with FLIP animations.
4
+ *
5
+ * Architecture: Thin wrapper around useAnimationOrchestrator.
6
+ * Delegates all animation logic to the orchestrator and provides
7
+ * a stable API surface for the Reorder component.
8
+ *
9
+ * @param config - Optional reorder configuration (timing, easing, callbacks)
10
+ * @returns Reorder API with register, exit, enter, and query methods
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const reorder = useReorder({
15
+ * onComplete: (id) => removeFromList(id)
16
+ * });
17
+ *
18
+ * <div ref={el => reorder.registerElement('item-1', el)}>
19
+ * Item 1
20
+ * </div>
21
+ *
22
+ * await reorder.startItemExit('item-1');
23
+ * ```
24
+ */
25
+ export declare function useReorder(config?: IUseReorderConfig): IUseReorderReturn;
26
+ //# sourceMappingURL=useReorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReorder.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/primitives/waapi/Reorder/useReorder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,CAmBxE"}
@@ -0,0 +1,48 @@
1
+ import { useAnimationOrchestrator } from "../core/useAnimationOrchestrator.js";
2
+
3
+ //#region src/react-ui/primitives/waapi/Reorder/useReorder.ts
4
+ /**
5
+ * Hook for managing reorderable lists with FLIP animations.
6
+ *
7
+ * Architecture: Thin wrapper around useAnimationOrchestrator.
8
+ * Delegates all animation logic to the orchestrator and provides
9
+ * a stable API surface for the Reorder component.
10
+ *
11
+ * @param config - Optional reorder configuration (timing, easing, callbacks)
12
+ * @returns Reorder API with register, exit, enter, and query methods
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const reorder = useReorder({
17
+ * onComplete: (id) => removeFromList(id)
18
+ * });
19
+ *
20
+ * <div ref={el => reorder.registerElement('item-1', el)}>
21
+ * Item 1
22
+ * </div>
23
+ *
24
+ * await reorder.startItemExit('item-1');
25
+ * ```
26
+ */
27
+ function useReorder(config) {
28
+ const orchestrator = useAnimationOrchestrator({
29
+ enterDuration: config?.enterDuration,
30
+ exitDuration: config?.exitDuration,
31
+ flipDuration: config?.flipDuration,
32
+ enterEasing: config?.enterEasing,
33
+ exitEasing: config?.exitEasing,
34
+ flipEasing: config?.flipEasing,
35
+ flipBehavior: config?.flipBehavior,
36
+ exitPositionStrategy: config?.exitPositionStrategy,
37
+ onExitComplete: config?.onComplete
38
+ });
39
+ return {
40
+ ...orchestrator,
41
+ registerElement: orchestrator.registerElement,
42
+ startItemExit: orchestrator.startExit,
43
+ startItemEnter: orchestrator.startEnter
44
+ };
45
+ }
46
+
47
+ //#endregion
48
+ export { useReorder };
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { IUseReorderPresenceConfig, IUseReorderPresenceReturn } from './Reorder.types';
3
+ /**
4
+ * Hook for managing presence animations in reorderable lists.
5
+ *
6
+ * Follows the pattern where elements stay in DOM until animation completes.
7
+ * Consumer must keep items in their state until onAnimationComplete fires.
8
+ * No "ghost" cloning — animations run on actual DOM elements.
9
+ *
10
+ * @param children - React children with unique keys
11
+ * @param config - Presence animation configuration
12
+ * @returns Presence API with presentChildren, triggerExit, and state queries
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const [items, setItems] = useState(INITIAL_ITEMS);
17
+ *
18
+ * const { presentChildren, triggerExit } = useReorderPresence(
19
+ * items.map(item => <div key={item.id}>{item.name}</div>),
20
+ * {
21
+ * onAnimationComplete: (id) => {
22
+ * setItems(prev => prev.filter(item => item.id !== id));
23
+ * }
24
+ * }
25
+ * );
26
+ *
27
+ * const handleDelete = (id: string) => {
28
+ * triggerExit(id);
29
+ * };
30
+ * ```
31
+ */
32
+ export declare function useReorderPresence(children: ReactNode, config?: IUseReorderPresenceConfig): IUseReorderPresenceReturn;
33
+ //# sourceMappingURL=useReorderPresence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReorderPresence.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,EACnB,MAAM,GAAE,yBAA8B,GACrC,yBAAyB,CA6J3B"}