@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.
- package/api-schema.json +206 -0
- package/dist/components/CountUp.d.ts +84 -0
- package/dist/components/CountUp.d.ts.map +1 -0
- package/dist/components/CountUp.js +68 -0
- package/dist/components/CountUp.js.map +1 -0
- package/dist/components/MotionDiv.d.ts +159 -0
- package/dist/components/MotionDiv.d.ts.map +1 -0
- package/dist/components/MotionDiv.js +162 -0
- package/dist/components/MotionDiv.js.map +1 -0
- package/dist/components/StaggerContainer.d.ts +136 -0
- package/dist/components/StaggerContainer.d.ts.map +1 -0
- package/dist/components/StaggerContainer.js +166 -0
- package/dist/components/StaggerContainer.js.map +1 -0
- package/dist/hooks/use-component-animation.d.ts +156 -0
- package/dist/hooks/use-component-animation.d.ts.map +1 -0
- package/dist/hooks/use-component-animation.js +231 -0
- package/dist/hooks/use-component-animation.js.map +1 -0
- package/dist/hooks/use-count-up.d.ts +111 -0
- package/dist/hooks/use-count-up.d.ts.map +1 -0
- package/dist/hooks/use-count-up.js +246 -0
- package/dist/hooks/use-count-up.js.map +1 -0
- package/dist/hooks/use-draw-path.d.ts +96 -0
- package/dist/hooks/use-draw-path.d.ts.map +1 -0
- package/dist/hooks/use-draw-path.js +227 -0
- package/dist/hooks/use-draw-path.js.map +1 -0
- package/dist/hooks/use-motion-preset.d.ts.map +1 -1
- package/dist/hooks/use-motion-preset.js +17 -16
- package/dist/hooks/use-motion-preset.js.map +1 -1
- package/dist/hooks/use-stagger.d.ts +174 -0
- package/dist/hooks/use-stagger.d.ts.map +1 -0
- package/dist/hooks/use-stagger.js +256 -0
- package/dist/hooks/use-stagger.js.map +1 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2442 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2335 -25
- package/dist/index.mjs.map +1 -1
- package/dist/presets/component-presets.d.ts +246 -0
- package/dist/presets/component-presets.d.ts.map +1 -0
- package/dist/presets/component-presets.js +472 -0
- package/dist/presets/component-presets.js.map +1 -0
- package/dist/presets/micro-interactions.d.ts +451 -0
- package/dist/presets/micro-interactions.d.ts.map +1 -0
- package/dist/presets/micro-interactions.js +856 -0
- package/dist/presets/micro-interactions.js.map +1 -0
- package/dist/presets/motion-presets.d.ts.map +1 -1
- package/dist/presets/motion-presets.js +0 -1
- package/dist/presets/motion-presets.js.map +1 -1
- package/dist/presets/motion-styles.d.ts +186 -0
- package/dist/presets/motion-styles.d.ts.map +1 -0
- package/dist/presets/motion-styles.js +204 -0
- package/dist/presets/motion-styles.js.map +1 -0
- package/dist/presets/stagger-presets.d.ts +378 -0
- package/dist/presets/stagger-presets.d.ts.map +1 -0
- package/dist/presets/stagger-presets.js +582 -0
- package/dist/presets/stagger-presets.js.map +1 -0
- package/dist/showcase/motion-presets.demo.d.ts +25 -0
- package/dist/showcase/motion-presets.demo.d.ts.map +1 -0
- package/dist/showcase/motion-presets.demo.js +96 -0
- package/dist/showcase/motion-presets.demo.js.map +1 -0
- package/dist/showcase/motion-presets.story.d.ts +37 -0
- package/dist/showcase/motion-presets.story.d.ts.map +1 -0
- package/dist/showcase/motion-presets.story.js +151 -0
- package/dist/showcase/motion-presets.story.js.map +1 -0
- package/dist/utils/easing.d.ts +294 -0
- package/dist/utils/easing.d.ts.map +1 -0
- package/dist/utils/easing.js +265 -0
- package/dist/utils/easing.js.map +1 -0
- package/dist/utils/reduced-motion.d.ts +322 -0
- package/dist/utils/reduced-motion.d.ts.map +1 -0
- package/dist/utils/reduced-motion.js +362 -0
- package/dist/utils/reduced-motion.js.map +1 -0
- package/dist/utils/select-preset.d.ts +186 -0
- package/dist/utils/select-preset.d.ts.map +1 -0
- package/dist/utils/select-preset.js +320 -0
- package/dist/utils/select-preset.js.map +1 -0
- package/dist/utils/spring-configs.d.ts +187 -0
- package/dist/utils/spring-configs.d.ts.map +1 -0
- package/dist/utils/spring-configs.js +169 -0
- package/dist/utils/spring-configs.js.map +1 -0
- 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":"
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
14
|
+
const parseMotionVar = (value) => {
|
|
22
15
|
const parsed = parseFloat(value);
|
|
23
|
-
|
|
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:
|
|
27
|
-
opacityMin:
|
|
28
|
-
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 (
|
|
85
|
-
const [cssVars, setCssVars] = useState(
|
|
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":"AAAA,
|
|
1
|
+
{"version":3,"file":"use-motion-preset.js","sourceRoot":"","sources":["../../src/hooks/use-motion-preset.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAA+C,SAAS,EAA2C,MAAM,2BAA2B,CAAC;AAwC5I;;;GAGG;AACH,SAAS,gBAAgB;IACrB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;IACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE;QAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACH,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC3F,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;QAC3E,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;KAC9E,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAA0B,EAAE,OAA2B,EAAE,oBAA6B;IAC9G,IAAI,oBAAoB,EAAE,CAAC;QACvB,OAAO;YACH,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;YACrE,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,oBAAoB,EAAE,IAAI;SAC7B,CAAC;IACN,CAAC;IAED,OAAO;QACH,YAAY,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,kBAAkB;QAC1D,OAAO,EAAE;YACL,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;SAClD;QACD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,oBAAoB,EAAE,KAAK;KAC9B,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAuB,EAAE,OAA2B,EAAE,oBAA6B;IAC1G,IAAI,oBAAoB,EAAE,CAAC;QACvB,OAAO;YACH,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,IAAI;SAC7B,CAAC;IACN,CAAC;IAED,OAAO;QACH,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;QACvE,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,oBAAoB,EAAE,KAAK;KAC9B,CAAC;AACN,CAAC;AA2BD,MAAM,UAAU,eAAe,CAAC,SAAwB,EAAE,MAAoB;IAC1E,4DAA4D;IAC5D,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAClE,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAChD,OAAO,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,mFAAmF;IACnF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,GAAG,EAAE;QAC5D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,gBAAgB,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC;QACzE,uBAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/E,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE/B,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACvC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;YACvC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,+CAA+C;IAC/C,OAAO,OAAO,CAAC,GAAG,EAAE;QAChB,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -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"}
|