@enact-ui/animate 0.1.0 → 0.2.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 (82) hide show
  1. package/api-schema.json +206 -0
  2. package/dist/components/CountUp.d.ts +84 -0
  3. package/dist/components/CountUp.d.ts.map +1 -0
  4. package/dist/components/CountUp.js +68 -0
  5. package/dist/components/CountUp.js.map +1 -0
  6. package/dist/components/MotionDiv.d.ts +159 -0
  7. package/dist/components/MotionDiv.d.ts.map +1 -0
  8. package/dist/components/MotionDiv.js +162 -0
  9. package/dist/components/MotionDiv.js.map +1 -0
  10. package/dist/components/StaggerContainer.d.ts +136 -0
  11. package/dist/components/StaggerContainer.d.ts.map +1 -0
  12. package/dist/components/StaggerContainer.js +166 -0
  13. package/dist/components/StaggerContainer.js.map +1 -0
  14. package/dist/hooks/use-component-animation.d.ts +156 -0
  15. package/dist/hooks/use-component-animation.d.ts.map +1 -0
  16. package/dist/hooks/use-component-animation.js +231 -0
  17. package/dist/hooks/use-component-animation.js.map +1 -0
  18. package/dist/hooks/use-count-up.d.ts +111 -0
  19. package/dist/hooks/use-count-up.d.ts.map +1 -0
  20. package/dist/hooks/use-count-up.js +246 -0
  21. package/dist/hooks/use-count-up.js.map +1 -0
  22. package/dist/hooks/use-draw-path.d.ts +96 -0
  23. package/dist/hooks/use-draw-path.d.ts.map +1 -0
  24. package/dist/hooks/use-draw-path.js +227 -0
  25. package/dist/hooks/use-draw-path.js.map +1 -0
  26. package/dist/hooks/use-motion-preset.d.ts.map +1 -1
  27. package/dist/hooks/use-motion-preset.js +17 -16
  28. package/dist/hooks/use-motion-preset.js.map +1 -1
  29. package/dist/hooks/use-stagger.d.ts +174 -0
  30. package/dist/hooks/use-stagger.d.ts.map +1 -0
  31. package/dist/hooks/use-stagger.js +256 -0
  32. package/dist/hooks/use-stagger.js.map +1 -0
  33. package/dist/index.d.ts +17 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2442 -26
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +2335 -25
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/presets/component-presets.d.ts +246 -0
  40. package/dist/presets/component-presets.d.ts.map +1 -0
  41. package/dist/presets/component-presets.js +472 -0
  42. package/dist/presets/component-presets.js.map +1 -0
  43. package/dist/presets/micro-interactions.d.ts +451 -0
  44. package/dist/presets/micro-interactions.d.ts.map +1 -0
  45. package/dist/presets/micro-interactions.js +856 -0
  46. package/dist/presets/micro-interactions.js.map +1 -0
  47. package/dist/presets/motion-presets.d.ts.map +1 -1
  48. package/dist/presets/motion-presets.js +0 -1
  49. package/dist/presets/motion-presets.js.map +1 -1
  50. package/dist/presets/motion-styles.d.ts +186 -0
  51. package/dist/presets/motion-styles.d.ts.map +1 -0
  52. package/dist/presets/motion-styles.js +204 -0
  53. package/dist/presets/motion-styles.js.map +1 -0
  54. package/dist/presets/stagger-presets.d.ts +378 -0
  55. package/dist/presets/stagger-presets.d.ts.map +1 -0
  56. package/dist/presets/stagger-presets.js +582 -0
  57. package/dist/presets/stagger-presets.js.map +1 -0
  58. package/dist/showcase/motion-presets.demo.d.ts +25 -0
  59. package/dist/showcase/motion-presets.demo.d.ts.map +1 -0
  60. package/dist/showcase/motion-presets.demo.js +96 -0
  61. package/dist/showcase/motion-presets.demo.js.map +1 -0
  62. package/dist/showcase/motion-presets.story.d.ts +37 -0
  63. package/dist/showcase/motion-presets.story.d.ts.map +1 -0
  64. package/dist/showcase/motion-presets.story.js +151 -0
  65. package/dist/showcase/motion-presets.story.js.map +1 -0
  66. package/dist/utils/easing.d.ts +294 -0
  67. package/dist/utils/easing.d.ts.map +1 -0
  68. package/dist/utils/easing.js +265 -0
  69. package/dist/utils/easing.js.map +1 -0
  70. package/dist/utils/reduced-motion.d.ts +322 -0
  71. package/dist/utils/reduced-motion.d.ts.map +1 -0
  72. package/dist/utils/reduced-motion.js +362 -0
  73. package/dist/utils/reduced-motion.js.map +1 -0
  74. package/dist/utils/select-preset.d.ts +186 -0
  75. package/dist/utils/select-preset.d.ts.map +1 -0
  76. package/dist/utils/select-preset.js +320 -0
  77. package/dist/utils/select-preset.js.map +1 -0
  78. package/dist/utils/spring-configs.d.ts +187 -0
  79. package/dist/utils/spring-configs.d.ts.map +1 -0
  80. package/dist/utils/spring-configs.js +169 -0
  81. package/dist/utils/spring-configs.js.map +1 -0
  82. package/package.json +4 -3
@@ -0,0 +1,96 @@
1
+ import type { MotionStyle } from "../presets/motion-styles";
2
+ /**
3
+ * Easing function type for path drawing animation.
4
+ */
5
+ export type DrawPathEasing = "linear" | "easeOut" | "easeOutExpo" | "easeInOut" | "spring";
6
+ /**
7
+ * Options for the useDrawPath hook.
8
+ */
9
+ export interface UseDrawPathOptions {
10
+ /** Starting path length (0-1). Defaults to 0. */
11
+ from?: number;
12
+ /** Target path length (0-1). Required. */
13
+ to: number;
14
+ /** Duration in milliseconds. Defaults to motion style duration. */
15
+ duration?: number;
16
+ /** Motion style to use for timing. Defaults to "standard". */
17
+ motionStyle?: MotionStyle;
18
+ /** Easing function. Defaults to "easeOutExpo". */
19
+ easing?: DrawPathEasing;
20
+ /** Delay before starting animation in ms. Defaults to 0. */
21
+ delay?: number;
22
+ /** Whether to start animation immediately. Defaults to true. */
23
+ autoStart?: boolean;
24
+ /** Callback when animation completes. */
25
+ onComplete?: () => void;
26
+ /** Callback on each value update. */
27
+ onUpdate?: (pathLength: number) => void;
28
+ /** Whether animation is enabled. Defaults to true. */
29
+ enabled?: boolean;
30
+ }
31
+ /**
32
+ * Return type for the useDrawPath hook.
33
+ */
34
+ export interface UseDrawPathResult {
35
+ /** Current path length (0-1) for strokeDasharray/strokeDashoffset. */
36
+ pathLength: number;
37
+ /** Whether animation is currently running. */
38
+ isAnimating: boolean;
39
+ /** Whether animation has completed. */
40
+ isComplete: boolean;
41
+ /** Start or restart the animation. */
42
+ start: () => void;
43
+ /** Pause the animation at current value. */
44
+ pause: () => void;
45
+ /** Resume a paused animation. */
46
+ resume: () => void;
47
+ /** Reset to starting value. */
48
+ reset: () => void;
49
+ /** Update the target value (will animate to new value). */
50
+ update: (newTo: number) => void;
51
+ /** Whether reduced motion is preferred. */
52
+ prefersReducedMotion: boolean;
53
+ }
54
+ /**
55
+ * Hook for animating SVG path/arc drawing.
56
+ *
57
+ * Features:
58
+ * - Animates pathLength from 0 to 1 (for strokeDasharray/strokeDashoffset)
59
+ * - Configurable duration and easing
60
+ * - Respects reduced motion preferences
61
+ * - Start/pause/resume/reset controls
62
+ *
63
+ * @param options - Configuration options for the animation
64
+ * @returns Object with current pathLength (0-1) and control functions
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * // Basic usage for circular progress
69
+ * const { pathLength } = useDrawPath({ to: 0.75 }); // 75% drawn
70
+ * return (
71
+ * <circle
72
+ * strokeDasharray="100"
73
+ * strokeDashoffset={100 - pathLength * 100}
74
+ * pathLength="100"
75
+ * />
76
+ * );
77
+ *
78
+ * // With motion/react
79
+ * const { pathLength } = useDrawPath({ to: 0.9, duration: 1500 });
80
+ * return (
81
+ * <motion.circle
82
+ * strokeDasharray="100"
83
+ * strokeDashoffset={100 - pathLength * 100}
84
+ * pathLength="100"
85
+ * />
86
+ * );
87
+ *
88
+ * // Manual control
89
+ * const { pathLength, start, reset } = useDrawPath({
90
+ * to: 1,
91
+ * autoStart: false,
92
+ * });
93
+ * ```
94
+ */
95
+ export declare function useDrawPath(options: UseDrawPathOptions): UseDrawPathResult;
96
+ //# sourceMappingURL=use-draw-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-draw-path.d.ts","sourceRoot":"","sources":["../../src/hooks/use-draw-path.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAO5D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,2DAA2D;IAC3D,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,2CAA2C;IAC3C,oBAAoB,EAAE,OAAO,CAAC;CACjC;AA8CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA4K1E"}
@@ -0,0 +1,227 @@
1
+ // Copyright (c) 2026 Amsterdam Data Labs
2
+ "use client";
3
+ /**
4
+ * useDrawPath Hook
5
+ *
6
+ * Animates SVG path/arc drawing by animating pathLength from 0 to 1.
7
+ * Perfect for trust score rings, progress arcs, and SVG path drawing animations.
8
+ * Respects reduced motion preferences.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { useCallback, useEffect, useRef, useState } from "react";
13
+ import { getDuration } from "../presets/motion-styles";
14
+ // =============================================================================
15
+ // Easing Functions
16
+ // =============================================================================
17
+ const easingFunctions = {
18
+ linear: (t) => t,
19
+ easeOut: (t) => 1 - (1 - t) ** 3,
20
+ easeOutExpo: (t) => (t === 1 ? 1 : 1 - 2 ** (-10 * t)),
21
+ easeInOut: (t) => (t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2),
22
+ spring: (t) => {
23
+ const c4 = (2 * Math.PI) / 3;
24
+ return t === 0 ? 0 : t === 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;
25
+ },
26
+ };
27
+ // =============================================================================
28
+ // Reduced Motion Detection
29
+ // =============================================================================
30
+ function useReducedMotion() {
31
+ const [prefersReducedMotion, setPrefersReducedMotion] = useState(() => {
32
+ if (typeof window === "undefined")
33
+ return false;
34
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
35
+ });
36
+ useEffect(() => {
37
+ const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
38
+ setPrefersReducedMotion(mediaQuery.matches);
39
+ const handler = (e) => {
40
+ setPrefersReducedMotion(e.matches);
41
+ };
42
+ mediaQuery.addEventListener("change", handler);
43
+ return () => mediaQuery.removeEventListener("change", handler);
44
+ }, []);
45
+ return prefersReducedMotion;
46
+ }
47
+ // =============================================================================
48
+ // useDrawPath Hook
49
+ // =============================================================================
50
+ /**
51
+ * Hook for animating SVG path/arc drawing.
52
+ *
53
+ * Features:
54
+ * - Animates pathLength from 0 to 1 (for strokeDasharray/strokeDashoffset)
55
+ * - Configurable duration and easing
56
+ * - Respects reduced motion preferences
57
+ * - Start/pause/resume/reset controls
58
+ *
59
+ * @param options - Configuration options for the animation
60
+ * @returns Object with current pathLength (0-1) and control functions
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * // Basic usage for circular progress
65
+ * const { pathLength } = useDrawPath({ to: 0.75 }); // 75% drawn
66
+ * return (
67
+ * <circle
68
+ * strokeDasharray="100"
69
+ * strokeDashoffset={100 - pathLength * 100}
70
+ * pathLength="100"
71
+ * />
72
+ * );
73
+ *
74
+ * // With motion/react
75
+ * const { pathLength } = useDrawPath({ to: 0.9, duration: 1500 });
76
+ * return (
77
+ * <motion.circle
78
+ * strokeDasharray="100"
79
+ * strokeDashoffset={100 - pathLength * 100}
80
+ * pathLength="100"
81
+ * />
82
+ * );
83
+ *
84
+ * // Manual control
85
+ * const { pathLength, start, reset } = useDrawPath({
86
+ * to: 1,
87
+ * autoStart: false,
88
+ * });
89
+ * ```
90
+ */
91
+ export function useDrawPath(options) {
92
+ const { from = 0, to, duration: customDuration, motionStyle = "standard", easing = "easeOutExpo", delay = 0, autoStart = true, onComplete, onUpdate, enabled = true, } = options;
93
+ // Get duration from motion style if not custom
94
+ const duration = customDuration ?? getDuration(motionStyle, "slow");
95
+ // State
96
+ const [pathLength, setPathLength] = useState(from);
97
+ const [isAnimating, setIsAnimating] = useState(false);
98
+ const [isComplete, setIsComplete] = useState(false);
99
+ // Refs for animation control
100
+ const animationRef = useRef(null);
101
+ const startTimeRef = useRef(null);
102
+ const pausedTimeRef = useRef(null);
103
+ const currentFromRef = useRef(from);
104
+ const currentToRef = useRef(to);
105
+ // Reduced motion
106
+ const prefersReducedMotion = useReducedMotion();
107
+ // Cancel animation
108
+ const cancelAnimation = useCallback(() => {
109
+ if (animationRef.current !== null) {
110
+ cancelAnimationFrame(animationRef.current);
111
+ animationRef.current = null;
112
+ }
113
+ }, []);
114
+ // Animation frame handler
115
+ const animate = useCallback((timestamp) => {
116
+ if (startTimeRef.current === null) {
117
+ startTimeRef.current = timestamp;
118
+ }
119
+ const elapsed = timestamp - startTimeRef.current;
120
+ const progress = Math.min(elapsed / duration, 1);
121
+ const easedProgress = easingFunctions[easing](progress);
122
+ const currentPathLength = currentFromRef.current + (currentToRef.current - currentFromRef.current) * easedProgress;
123
+ setPathLength(currentPathLength);
124
+ onUpdate?.(currentPathLength);
125
+ if (progress < 1) {
126
+ animationRef.current = requestAnimationFrame(animate);
127
+ }
128
+ else {
129
+ setIsAnimating(false);
130
+ setIsComplete(true);
131
+ onComplete?.();
132
+ }
133
+ }, [duration, easing, onComplete, onUpdate]);
134
+ // Start animation
135
+ const start = useCallback(() => {
136
+ if (!enabled) {
137
+ setPathLength(currentToRef.current);
138
+ setIsComplete(true);
139
+ return;
140
+ }
141
+ // Handle reduced motion - jump to end value immediately
142
+ if (prefersReducedMotion) {
143
+ setPathLength(currentToRef.current);
144
+ setIsComplete(true);
145
+ onComplete?.();
146
+ return;
147
+ }
148
+ cancelAnimation();
149
+ setIsComplete(false);
150
+ startTimeRef.current = null;
151
+ pausedTimeRef.current = null;
152
+ const startAnimation = () => {
153
+ setIsAnimating(true);
154
+ animationRef.current = requestAnimationFrame(animate);
155
+ };
156
+ if (delay > 0) {
157
+ setTimeout(startAnimation, delay);
158
+ }
159
+ else {
160
+ startAnimation();
161
+ }
162
+ }, [enabled, prefersReducedMotion, cancelAnimation, animate, delay, onComplete]);
163
+ // Pause animation
164
+ const pause = useCallback(() => {
165
+ if (isAnimating && animationRef.current !== null) {
166
+ pausedTimeRef.current = performance.now();
167
+ cancelAnimation();
168
+ setIsAnimating(false);
169
+ }
170
+ }, [isAnimating, cancelAnimation]);
171
+ // Resume animation
172
+ const resume = useCallback(() => {
173
+ if (!isAnimating && !isComplete && pausedTimeRef.current !== null && startTimeRef.current !== null) {
174
+ // Adjust start time to account for paused duration
175
+ const pausedDuration = performance.now() - pausedTimeRef.current;
176
+ startTimeRef.current += pausedDuration;
177
+ pausedTimeRef.current = null;
178
+ setIsAnimating(true);
179
+ animationRef.current = requestAnimationFrame(animate);
180
+ }
181
+ }, [isAnimating, isComplete, animate]);
182
+ // Reset to starting value
183
+ const reset = useCallback(() => {
184
+ cancelAnimation();
185
+ setPathLength(currentFromRef.current);
186
+ setIsAnimating(false);
187
+ setIsComplete(false);
188
+ startTimeRef.current = null;
189
+ pausedTimeRef.current = null;
190
+ }, [cancelAnimation]);
191
+ // Update target value
192
+ const update = useCallback((newTo) => {
193
+ currentFromRef.current = pathLength;
194
+ currentToRef.current = newTo;
195
+ start();
196
+ }, [pathLength, start]);
197
+ // Auto-start on mount - intentionally only runs once
198
+ // biome-ignore lint/correctness/useExhaustiveDependencies: We only want to start animation on mount, not on every dependency change
199
+ useEffect(() => {
200
+ if (autoStart) {
201
+ currentFromRef.current = from;
202
+ currentToRef.current = to;
203
+ start();
204
+ }
205
+ return () => {
206
+ cancelAnimation();
207
+ };
208
+ }, []);
209
+ // Update target when `to` prop changes
210
+ useEffect(() => {
211
+ if (to !== currentToRef.current && isComplete) {
212
+ update(to);
213
+ }
214
+ }, [to, isComplete, update]);
215
+ return {
216
+ pathLength,
217
+ isAnimating,
218
+ isComplete,
219
+ start,
220
+ pause,
221
+ resume,
222
+ reset,
223
+ update,
224
+ prefersReducedMotion,
225
+ };
226
+ }
227
+ //# sourceMappingURL=use-draw-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-draw-path.js","sourceRoot":"","sources":["../../src/hooks/use-draw-path.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-motion-preset.d.ts","sourceRoot":"","sources":["../../src/hooks/use-motion-preset.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgF,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAY5I,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAChC,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kCAAkC;IAClC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,oBAAoB,EAAE,OAAO,CAAC;CACjC;AAED,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IAC/B,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,oBAAoB,EAAE,OAAO,CAAC;CACjC;AAmFD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,mBAAmB,CAAC;AAC/F,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"use-motion-preset.d.ts","sourceRoot":"","sources":["../../src/hooks/use-motion-preset.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgF,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAY5I,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAChC,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kCAAkC;IAClC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,oBAAoB,EAAE,OAAO,CAAC;CACjC;AAED,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IAC/B,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,oBAAoB,EAAE,OAAO,CAAC;CACjC;AA+ED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,mBAAmB,CAAC;AAC/F,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAAC"}
@@ -1,31 +1,27 @@
1
- // Copyright (c) 2025 Amsterdam Data Labs
2
1
  "use client";
3
2
  import { useEffect, useMemo, useState } from "react";
4
3
  import { getPreset } from "../presets/motion-presets";
5
- /** Default CSS variable values (fallback if not in browser) */
6
- const DEFAULT_CSS_VARS = {
7
- durationMultiplier: 1,
8
- opacityMin: 0.35,
9
- opacityMax: 0.6,
10
- };
11
4
  /**
12
5
  * Reads motion CSS variables from the document root.
13
- * Returns default values if not in browser environment.
6
+ * Throws when not in a browser environment or when required CSS variables are missing/invalid.
14
7
  */
15
8
  function readCSSVariables() {
16
9
  if (typeof window === "undefined") {
17
- return DEFAULT_CSS_VARS;
10
+ throw new Error("useMotionPreset/readCSSVariables requires a browser environment");
18
11
  }
19
12
  const root = document.documentElement;
20
13
  const styles = getComputedStyle(root);
21
- const parseFloat_ = (value, fallback) => {
14
+ const parseMotionVar = (value) => {
22
15
  const parsed = parseFloat(value);
23
- return Number.isNaN(parsed) ? fallback : parsed;
16
+ if (Number.isNaN(parsed)) {
17
+ throw new Error("Motion CSS variable could not be parsed as a number");
18
+ }
19
+ return parsed;
24
20
  };
25
21
  return {
26
- durationMultiplier: parseFloat_(styles.getPropertyValue("--motion-duration-multiplier"), DEFAULT_CSS_VARS.durationMultiplier),
27
- opacityMin: parseFloat_(styles.getPropertyValue("--motion-opacity-min"), DEFAULT_CSS_VARS.opacityMin),
28
- opacityMax: parseFloat_(styles.getPropertyValue("--motion-opacity-max"), DEFAULT_CSS_VARS.opacityMax),
22
+ durationMultiplier: parseMotionVar(styles.getPropertyValue("--motion-duration-multiplier")),
23
+ opacityMin: parseMotionVar(styles.getPropertyValue("--motion-opacity-min")),
24
+ opacityMax: parseMotionVar(styles.getPropertyValue("--motion-opacity-max")),
29
25
  };
30
26
  }
31
27
  /**
@@ -81,8 +77,13 @@ export function useMotionPreset(component, preset) {
81
77
  return false;
82
78
  return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
83
79
  });
84
- // Track CSS variables (may change with theme)
85
- const [cssVars, setCssVars] = useState(DEFAULT_CSS_VARS);
80
+ // Track CSS variables (read from document; throws in SSR or when vars are invalid)
81
+ const [cssVars, setCssVars] = useState(() => {
82
+ if (typeof window === "undefined") {
83
+ throw new Error("useMotionPreset requires a browser environment");
84
+ }
85
+ return readCSSVariables();
86
+ });
86
87
  // Listen for reduced motion preference changes
87
88
  useEffect(() => {
88
89
  const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
@@ -1 +1 @@
1
- {"version":3,"file":"use-motion-preset.js","sourceRoot":"","sources":["../../src/hooks/use-motion-preset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-motion-preset.js","sourceRoot":"","sources":["../../src/hooks/use-motion-preset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ import { type MotionStyle } from "../presets/motion-styles";
2
+ /**
3
+ * Stagger direction patterns.
4
+ */
5
+ export type StaggerDirection = "forward" | "reverse" | "center" | "edges" | "random";
6
+ /**
7
+ * Options for configuring stagger behavior.
8
+ */
9
+ export interface StaggerOptions {
10
+ /** Direction of the stagger effect */
11
+ direction?: StaggerDirection;
12
+ /** Total number of items (required for some patterns) */
13
+ totalItems?: number;
14
+ /** Custom delay multiplier (overrides motion style) */
15
+ delayMultiplier?: number;
16
+ /** Maximum total stagger delay in ms */
17
+ maxDelay?: number;
18
+ /** Whether to use spring physics for items */
19
+ useSpring?: boolean;
20
+ /** Custom delay function for advanced patterns */
21
+ getDelay?: (index: number, total: number) => number;
22
+ }
23
+ /**
24
+ * Container animation variants.
25
+ */
26
+ export interface ContainerVariants {
27
+ hidden: Record<string, unknown>;
28
+ visible: Record<string, unknown>;
29
+ }
30
+ /**
31
+ * Item animation variants.
32
+ * Visible can be a function for custom delays based on index.
33
+ */
34
+ export interface ItemVariants {
35
+ hidden: Record<string, unknown>;
36
+ visible: Record<string, unknown> | ((custom: number) => Record<string, unknown>);
37
+ }
38
+ /**
39
+ * Result of the useStagger hook.
40
+ */
41
+ export interface StaggerResult {
42
+ /** Variants for the container element */
43
+ containerVariants: ContainerVariants;
44
+ /** Variants for child items */
45
+ itemVariants: ItemVariants;
46
+ /** Props to spread on the container */
47
+ containerProps: {
48
+ initial: string;
49
+ animate: string;
50
+ exit?: string;
51
+ variants: ContainerVariants;
52
+ };
53
+ /** Function to get props for an item at a specific index */
54
+ getItemProps: (index: number) => {
55
+ variants: ItemVariants;
56
+ custom: number;
57
+ };
58
+ }
59
+ /**
60
+ * Hook for creating staggered animations.
61
+ *
62
+ * Creates container and item variants for Motion library that orchestrate
63
+ * staggered entrance animations for lists and grids.
64
+ *
65
+ * @param style - The motion style to apply
66
+ * @param options - Stagger configuration options
67
+ * @returns Stagger animation configuration
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * import { motion } from "motion/react";
72
+ * import { useStagger } from "@enact-ui/animate";
73
+ *
74
+ * function AnimatedList({ items }) {
75
+ * const { containerProps, getItemProps } = useStagger("standard");
76
+ *
77
+ * return (
78
+ * <motion.ul {...containerProps}>
79
+ * {items.map((item, index) => (
80
+ * <motion.li key={item.id} {...getItemProps(index)}>
81
+ * {item.content}
82
+ * </motion.li>
83
+ * ))}
84
+ * </motion.ul>
85
+ * );
86
+ * }
87
+ * ```
88
+ *
89
+ * @example
90
+ * ```tsx
91
+ * // Center-out stagger pattern
92
+ * const { containerProps, getItemProps } = useStagger("bold", {
93
+ * direction: "center",
94
+ * totalItems: items.length,
95
+ * });
96
+ * ```
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * // Custom delay function for grid layouts
101
+ * const { containerProps, getItemProps } = useStagger("playful", {
102
+ * getDelay: (index, total) => {
103
+ * const row = Math.floor(index / columns);
104
+ * const col = index % columns;
105
+ * return (row + col) * 50; // Diagonal wave
106
+ * },
107
+ * });
108
+ * ```
109
+ */
110
+ export declare function useStagger(style?: MotionStyle, options?: StaggerOptions): StaggerResult;
111
+ /**
112
+ * Creates a grid stagger pattern (diagonal wave).
113
+ *
114
+ * @param columns - Number of columns in the grid
115
+ * @param baseDelay - Base delay between items in ms
116
+ * @returns Delay function for useStagger
117
+ *
118
+ * @example
119
+ * ```tsx
120
+ * const { containerProps, getItemProps } = useStagger("standard", {
121
+ * getDelay: gridStagger(4, 50),
122
+ * });
123
+ * ```
124
+ */
125
+ export declare function gridStagger(columns: number, baseDelay?: number): (index: number, total: number) => number;
126
+ /**
127
+ * Creates a wave stagger pattern (sine-based).
128
+ *
129
+ * @param amplitude - Wave amplitude (higher = more variation)
130
+ * @param frequency - Wave frequency
131
+ * @param baseDelay - Base delay in ms
132
+ * @returns Delay function for useStagger
133
+ *
134
+ * @example
135
+ * ```tsx
136
+ * const { containerProps, getItemProps } = useStagger("playful", {
137
+ * getDelay: waveStagger(100, 0.5, 30),
138
+ * });
139
+ * ```
140
+ */
141
+ export declare function waveStagger(amplitude?: number, frequency?: number, baseDelay?: number): (index: number, total: number) => number;
142
+ /**
143
+ * Creates a cascade stagger pattern (accelerating).
144
+ *
145
+ * Items start slow and speed up as the animation progresses.
146
+ *
147
+ * @param baseDelay - Base delay in ms
148
+ * @param acceleration - Acceleration factor (0-1)
149
+ * @returns Delay function for useStagger
150
+ *
151
+ * @example
152
+ * ```tsx
153
+ * const { containerProps, getItemProps } = useStagger("bold", {
154
+ * getDelay: cascadeStagger(80, 0.8),
155
+ * });
156
+ * ```
157
+ */
158
+ export declare function cascadeStagger(baseDelay?: number, acceleration?: number): (index: number, total: number) => number;
159
+ /**
160
+ * Creates an explode stagger pattern (from center outward, fast).
161
+ *
162
+ * @param baseDelay - Base delay in ms
163
+ * @returns Delay function for useStagger
164
+ *
165
+ * @example
166
+ * ```tsx
167
+ * const { containerProps, getItemProps } = useStagger("playful", {
168
+ * direction: "center",
169
+ * getDelay: explodeStagger(20),
170
+ * });
171
+ * ```
172
+ */
173
+ export declare function explodeStagger(baseDelay?: number): (index: number, total: number) => number;
174
+ //# sourceMappingURL=use-stagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-stagger.d.ts","sourceRoot":"","sources":["../../src/hooks/use-stagger.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,KAAK,WAAW,EAAe,MAAM,0BAA0B,CAAC;AAMzF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,sCAAsC;IACtC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpF;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,yCAAyC;IACzC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,+BAA+B;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,uCAAuC;IACvC,cAAc,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,iBAAiB,CAAC;KAC/B,CAAC;IACF,4DAA4D;IAC5D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAC7B,QAAQ,EAAE,YAAY,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;CACL;AA0CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,UAAU,CAAC,KAAK,GAAE,WAAwB,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,CAgFvG;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAM7G;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,SAAS,GAAE,MAAY,EAAE,SAAS,GAAE,MAAY,EAAE,SAAS,GAAE,MAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAK9I;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,SAAS,GAAE,MAAW,EAAE,YAAY,GAAE,MAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAK3H;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,SAAS,GAAE,MAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAM/F"}