@tamagui/animations-reanimated 1.0.0-beta.207 → 1.0.0-beta.230
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/dist/cjs/createAnimations.js +72 -89
- package/dist/cjs/createAnimations.js.map +2 -2
- package/dist/esm/createAnimations.js +74 -92
- package/dist/esm/createAnimations.js.map +2 -2
- package/dist/jsx/createAnimations.js +74 -92
- package/package.json +5 -5
- package/types/createAnimations.d.ts +16 -1
- package/types/createAnimations.d.ts.map +1 -1
|
@@ -38,64 +38,73 @@ function createAnimations(animations) {
|
|
|
38
38
|
View: AnimatedView,
|
|
39
39
|
Text: AnimatedText,
|
|
40
40
|
useAnimations: (props, helpers) => {
|
|
41
|
-
|
|
42
|
-
const
|
|
41
|
+
var _a, _b;
|
|
42
|
+
const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers;
|
|
43
|
+
const [isEntering, safeToUnmount] = (0, import_animate_presence.useEntering)();
|
|
43
44
|
const presence = (0, import_react.useContext)(import_animate_presence.AnimatePresenceContext);
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const custom = (0, import_react.useCallback)(() => {
|
|
48
|
-
"worklet";
|
|
49
|
-
return presence == null ? void 0 : presence.custom;
|
|
50
|
-
}, [presence]);
|
|
51
|
-
const reanimatedOnDidAnimated = (0, import_react.useCallback)((...args) => {
|
|
52
|
-
onDidAnimate == null ? void 0 : onDidAnimate(...args);
|
|
45
|
+
const exitStyle = (presence == null ? void 0 : presence.exitVariant) ? ((_b = (_a = staticConfig.variantsParsed) == null ? void 0 : _a[presence.exitVariant]) == null ? void 0 : _b.true) || pseudos.exitStyle : pseudos.exitStyle;
|
|
46
|
+
const reanimatedOnDidAnimated = (0, import_react.useCallback)((...args2) => {
|
|
47
|
+
onDidAnimate == null ? void 0 : onDidAnimate(...args2);
|
|
53
48
|
}, [onDidAnimate]);
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
},
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
49
|
+
const all = getStyle({
|
|
50
|
+
isEntering,
|
|
51
|
+
exitVariant: presence == null ? void 0 : presence.exitVariant,
|
|
52
|
+
enterVariant: presence == null ? void 0 : presence.enterVariant
|
|
53
|
+
});
|
|
54
|
+
const [animatedStyles, nonAnimatedStyle] = [{}, {}];
|
|
55
|
+
const animatedStyleKey = {
|
|
56
|
+
transform: true,
|
|
57
|
+
opacity: true
|
|
58
|
+
};
|
|
59
|
+
for (const key of Object.keys(all)) {
|
|
60
|
+
if (animatedStyleKey[key]) {
|
|
61
|
+
animatedStyles[key] = all[key];
|
|
62
|
+
} else {
|
|
63
|
+
nonAnimatedStyle[key] = all[key];
|
|
66
64
|
}
|
|
67
|
-
}
|
|
65
|
+
}
|
|
66
|
+
const args = [
|
|
67
|
+
JSON.stringify(animatedStyles),
|
|
68
|
+
state.mounted,
|
|
69
|
+
state.hover,
|
|
70
|
+
state.press,
|
|
71
|
+
state.pressIn,
|
|
72
|
+
state.focus,
|
|
73
|
+
delay,
|
|
74
|
+
isEntering,
|
|
75
|
+
onDidAnimate,
|
|
76
|
+
reanimatedOnDidAnimated,
|
|
77
|
+
presence == null ? void 0 : presence.exitVariant,
|
|
78
|
+
presence == null ? void 0 : presence.enterVariant
|
|
79
|
+
];
|
|
68
80
|
const animatedStyle = (0, import_react_native_reanimated.useAnimatedStyle)(() => {
|
|
69
|
-
|
|
70
|
-
isHovering.value;
|
|
71
|
-
const style = mergedStyles({
|
|
72
|
-
isExiting: !isPresent
|
|
73
|
-
});
|
|
81
|
+
const style = animatedStyles;
|
|
74
82
|
const final = {
|
|
75
83
|
transform: []
|
|
76
84
|
};
|
|
77
|
-
const isExiting =
|
|
85
|
+
const isExiting = isEntering === false;
|
|
78
86
|
const transition = animations[props.animation];
|
|
79
87
|
const exitingStyleProps = {};
|
|
80
|
-
if (
|
|
81
|
-
for (const key of Object.keys(
|
|
88
|
+
if (exitStyle) {
|
|
89
|
+
for (const key of Object.keys(exitStyle)) {
|
|
82
90
|
exitingStyleProps[key] = true;
|
|
83
91
|
}
|
|
84
92
|
}
|
|
85
93
|
for (const key in style) {
|
|
86
94
|
const value = style[key];
|
|
87
|
-
const
|
|
95
|
+
const aconf = animationConfig(key, transition);
|
|
96
|
+
const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf;
|
|
88
97
|
const callback = /* @__PURE__ */ __name((completed, recentValue) => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
});
|
|
93
|
-
}
|
|
98
|
+
(0, import_react_native_reanimated.runOnJS)(reanimatedOnDidAnimated)(key, completed, recentValue, {
|
|
99
|
+
attemptedValue: value
|
|
100
|
+
});
|
|
94
101
|
if (isExiting) {
|
|
95
102
|
exitingStyleProps[key] = false;
|
|
96
103
|
const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
|
|
97
104
|
if (!areStylesExiting) {
|
|
98
|
-
|
|
105
|
+
if (safeToUnmount) {
|
|
106
|
+
(0, import_react_native_reanimated.runOnJS)(safeToUnmount)();
|
|
107
|
+
}
|
|
99
108
|
}
|
|
100
109
|
}
|
|
101
110
|
}, "callback");
|
|
@@ -108,22 +117,13 @@ function createAnimations(animations) {
|
|
|
108
117
|
for (const transformObject of value) {
|
|
109
118
|
const key2 = Object.keys(transformObject)[0];
|
|
110
119
|
const transformValue = transformObject[key2];
|
|
111
|
-
const transform = {};
|
|
112
|
-
if (((_a = transition == null ? void 0 : transition[key2]) == null ? void 0 : _a.delay) != null) {
|
|
113
|
-
delayMs = ((_b = transition == null ? void 0 : transition[key2]) == null ? void 0 : _b.delay) ?? null;
|
|
114
|
-
}
|
|
115
120
|
let finalValue2 = animation(transformValue, config, callback);
|
|
116
121
|
if (shouldRepeat) {
|
|
117
122
|
finalValue2 = (0, import_react_native_reanimated.withRepeat)(finalValue2, repeatCount, repeatReverse);
|
|
118
123
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
transform[key2] = finalValue2;
|
|
123
|
-
}
|
|
124
|
-
if (Object.keys(transform).length) {
|
|
125
|
-
final["transform"].push(transform);
|
|
126
|
-
}
|
|
124
|
+
final["transform"].push({
|
|
125
|
+
[key2]: finalValue2
|
|
126
|
+
});
|
|
127
127
|
}
|
|
128
128
|
continue;
|
|
129
129
|
}
|
|
@@ -153,38 +153,28 @@ function createAnimations(animations) {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
if (process.env.NODE_ENV === "development" && props["debug"]) {
|
|
156
|
-
console.log("animation style",
|
|
156
|
+
console.log("animation style", final);
|
|
157
157
|
}
|
|
158
158
|
return final;
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
isPresent,
|
|
166
|
-
onDidAnimate,
|
|
167
|
-
reanimatedOnDidAnimated,
|
|
168
|
-
reanimatedSafeToUnmount
|
|
169
|
-
]);
|
|
170
|
-
return {
|
|
171
|
-
style: animatedStyle
|
|
172
|
-
};
|
|
159
|
+
}, args);
|
|
160
|
+
return (0, import_react.useMemo)(() => {
|
|
161
|
+
return {
|
|
162
|
+
style: [nonAnimatedStyle, animatedStyle]
|
|
163
|
+
};
|
|
164
|
+
}, args);
|
|
173
165
|
}
|
|
174
166
|
};
|
|
175
167
|
}
|
|
176
168
|
__name(createAnimations, "createAnimations");
|
|
177
169
|
function animationDelay(key, transition, defaultDelay) {
|
|
178
|
-
var _a, _b;
|
|
179
170
|
"worklet";
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
delayMs = transition.delay;
|
|
171
|
+
if (!transition || !transition[key] || transition[key].delayMs === void 0 || transition[key].delayMs === null) {
|
|
172
|
+
return {
|
|
173
|
+
delayMs: null
|
|
174
|
+
};
|
|
185
175
|
}
|
|
186
176
|
return {
|
|
187
|
-
delayMs
|
|
177
|
+
delayMs: transition[key].delayMs
|
|
188
178
|
};
|
|
189
179
|
}
|
|
190
180
|
__name(animationDelay, "animationDelay");
|
|
@@ -203,7 +193,7 @@ const isColor = /* @__PURE__ */ __name((styleKey) => {
|
|
|
203
193
|
].includes(styleKey);
|
|
204
194
|
}, "isColor");
|
|
205
195
|
function animationConfig(styleProp, transition) {
|
|
206
|
-
var _a, _b, _c, _d, _e
|
|
196
|
+
var _a, _b, _c, _d, _e;
|
|
207
197
|
"worklet";
|
|
208
198
|
const key = styleProp;
|
|
209
199
|
let repeatCount = 0;
|
|
@@ -212,30 +202,23 @@ function animationConfig(styleProp, transition) {
|
|
|
212
202
|
if (isColor(key) || key === "opacity") {
|
|
213
203
|
animationType = "timing";
|
|
214
204
|
}
|
|
205
|
+
if (!transition) {
|
|
206
|
+
return {};
|
|
207
|
+
}
|
|
215
208
|
if ((_a = transition[key]) == null ? void 0 : _a.type) {
|
|
216
209
|
animationType = (_b = transition[key]) == null ? void 0 : _b.type;
|
|
217
|
-
} else if (transition
|
|
210
|
+
} else if (transition.type) {
|
|
218
211
|
animationType = transition.type;
|
|
219
212
|
}
|
|
220
|
-
const loop = ((_c = transition[key]) == null ? void 0 : _c.loop)
|
|
213
|
+
const loop = ((_c = transition[key]) == null ? void 0 : _c.loop) || transition.loop || null;
|
|
221
214
|
if (loop != null) {
|
|
222
215
|
repeatCount = loop ? -1 : 0;
|
|
223
216
|
}
|
|
224
|
-
if (((_d = transition[key]) == null ? void 0 : _d.repeat) != null) {
|
|
225
|
-
repeatCount = (_e = transition[key]) == null ? void 0 : _e.repeat;
|
|
226
|
-
} else if ((transition == null ? void 0 : transition.repeat) != null) {
|
|
227
|
-
repeatCount = transition.repeat;
|
|
228
|
-
}
|
|
229
|
-
if (((_f = transition[key]) == null ? void 0 : _f.repeatReverse) != null) {
|
|
230
|
-
repeatReverse = (_g = transition[key]) == null ? void 0 : _g.repeatReverse;
|
|
231
|
-
} else if ((transition == null ? void 0 : transition.repeatReverse) != null) {
|
|
232
|
-
repeatReverse = transition.repeatReverse;
|
|
233
|
-
}
|
|
234
217
|
let config = {};
|
|
235
|
-
let animation
|
|
218
|
+
let animation;
|
|
236
219
|
if (animationType === "timing") {
|
|
237
|
-
const duration = ((
|
|
238
|
-
const easing = ((
|
|
220
|
+
const duration = ((_d = transition[key]) == null ? void 0 : _d.duration) ?? (transition == null ? void 0 : transition.duration);
|
|
221
|
+
const easing = ((_e = transition[key]) == null ? void 0 : _e.easing) ?? (transition == null ? void 0 : transition.easing);
|
|
239
222
|
if (easing) {
|
|
240
223
|
config["easing"] = easing;
|
|
241
224
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"sourcesContent": ["import { AnimatePresenceContext, usePresence } from '@tamagui/animate-presence'\nimport { AnimationDriver, UseAnimationHelpers, UseAnimationProps } from '@tamagui/core'\nimport { createContext, useCallback, useContext, useEffect } from 'react'\nimport {\n PerpectiveTransform,\n RotateTransform,\n RotateXTransform,\n RotateYTransform,\n RotateZTransform,\n ScaleTransform,\n ScaleXTransform,\n ScaleYTransform,\n SkewXTransform,\n SkewYTransform,\n TranslateXTransform,\n TranslateYTransform,\n} from 'react-native'\nimport Animated, {\n WithDecayConfig,\n WithSpringConfig,\n WithTimingConfig,\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withDecay,\n withDelay,\n withRepeat,\n withSpring,\n withTiming,\n} from 'react-native-reanimated'\n\nconst AnimatedView = Animated.View\nconst AnimatedText = Animated.Text\n\nAnimatedView['displayName'] = 'AnimatedView'\nAnimatedText['displayName'] = 'AnimatedText'\n\nexport function createAnimations<A extends Object>(animations: A): AnimationDriver<A> {\n return {\n avoidClasses: true,\n animations,\n View: AnimatedView,\n Text: AnimatedText,\n useAnimations: (props: UseAnimationProps, helpers: UseAnimationHelpers) => {\n const { styleKey, mergedStyles, state, pseudos, onDidAnimate, delay } = helpers\n const [isPresent, safeToUnmount] = usePresence()\n const presence = useContext(AnimatePresenceContext)\n const isMounted = useSharedValue(false)\n const isHovering = useSharedValue(false)\n const hasExitStyle = !!pseudos.exitStyle\n const custom = useCallback(() => {\n 'worklet'\n return presence?.custom\n }, [presence])\n\n const reanimatedOnDidAnimated = useCallback<NonNullable<typeof onDidAnimate>>(\n (...args) => {\n onDidAnimate?.(...args)\n },\n [onDidAnimate]\n )\n const reanimatedSafeToUnmount = useCallback(() => {\n safeToUnmount?.()\n }, [safeToUnmount])\n\n useEffect(() => {\n isMounted.value = true\n }, [isMounted])\n\n useEffect(() => {\n isHovering.value = true\n }, [state.hover])\n\n useEffect(\n function allowUnMountIfMissingExit() {\n if (!isPresent && !hasExitStyle) {\n reanimatedSafeToUnmount()\n }\n },\n [hasExitStyle, isPresent, reanimatedSafeToUnmount]\n )\n\n const animatedStyle = useAnimatedStyle(() => {\n // read this testing effect\n isHovering.value\n\n const style = mergedStyles({\n isExiting: !isPresent,\n })\n\n const final = {\n transform: [] as any[],\n }\n\n const isExiting = !isPresent && !!pseudos.exitStyle\n const transition = animations[props.animation]\n\n const exitingStyleProps: Record<string, boolean> = {}\n if (pseudos.exitStyle) {\n for (const key of Object.keys(pseudos.exitStyle)) {\n exitingStyleProps[key] = true\n }\n }\n\n for (const key in style) {\n const value = style[key]\n const { animation, config, shouldRepeat, repeatCount, repeatReverse } = animationConfig(\n key,\n transition\n )\n\n const callback: (completed: boolean, value?: any) => void = (completed, recentValue) => {\n if (onDidAnimate) {\n runOnJS(reanimatedOnDidAnimated)(key as any, completed, recentValue, {\n attemptedValue: value,\n })\n }\n if (isExiting) {\n exitingStyleProps[key] = false\n const areStylesExiting = Object.values(exitingStyleProps).some(Boolean)\n // if this is true, then we've finished our exit animations\n if (!areStylesExiting) {\n runOnJS(reanimatedSafeToUnmount)()\n }\n }\n }\n\n let { delayMs = null } = animationDelay(key, transition, delay)\n\n if (key === 'transform') {\n if (!Array.isArray(value)) {\n console.error(`Invalid transform value. Needs to be an array.`)\n continue\n }\n\n for (const transformObject of value) {\n const key = Object.keys(transformObject)[0]\n const transformValue = transformObject[key]\n const transform = {} as any\n if (transition?.[key]?.delay != null) {\n delayMs = transition?.[key]?.delay ?? null\n }\n let finalValue = animation(transformValue, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null) {\n transform[key] = withDelay(delayMs, finalValue)\n } else {\n transform[key] = finalValue\n }\n if (Object.keys(transform).length) {\n final['transform'].push(transform)\n }\n }\n continue\n }\n\n if (typeof value === 'object') {\n // shadows\n final[key] = {}\n for (const innerStyleKey of Object.keys(value || {})) {\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null) {\n final[key][innerStyleKey] = withDelay(delayMs, finalValue)\n } else {\n final[key][innerStyleKey] = finalValue\n }\n }\n continue\n }\n\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null && typeof delayMs === 'number') {\n final[key] = withDelay(delayMs, finalValue)\n } else {\n final[key] = finalValue\n }\n\n // end for (key in mergedStyles)\n }\n\n if (process.env.NODE_ENV === 'development' && props['debug']) {\n console.log('animation style', JSON.stringify(final, null, 2))\n }\n\n return final\n }, [\n styleKey,\n custom,\n delay,\n // disableInitialAnimation,\n // exitProp,\n // exitTransitionProp,\n // fromProp,\n hasExitStyle,\n isMounted,\n isPresent,\n onDidAnimate,\n reanimatedOnDidAnimated,\n reanimatedSafeToUnmount,\n // state,\n // stylePriority,\n // transitionProp,\n ])\n\n return {\n style: animatedStyle,\n }\n },\n }\n}\n\nfunction animationDelay<Animate>(\n key: string,\n transition: MotiTransition<Animate> | undefined,\n defaultDelay?: number\n) {\n 'worklet'\n let delayMs: TransitionConfig['delay'] = defaultDelay\n\n if (transition[key as keyof Animate]?.delay != null) {\n delayMs = transition[key as keyof Animate]?.delay\n } else if (transition?.delay != null) {\n delayMs = transition.delay\n }\n\n return {\n delayMs,\n }\n}\n\ntype MotiTransition<A> = any\ntype Transforms = PerpectiveTransform &\n RotateTransform &\n RotateXTransform &\n RotateYTransform &\n RotateZTransform &\n ScaleTransform &\n ScaleXTransform &\n ScaleYTransform &\n TranslateXTransform &\n TranslateYTransform &\n SkewXTransform &\n SkewYTransform\ntype TransitionConfigWithoutRepeats = (\n | ({ type?: 'spring' } & WithSpringConfig)\n | ({ type: 'timing' } & WithTimingConfig)\n | ({ type: 'decay' } & WithDecayConfig)\n) & {\n delay?: number\n}\n\ntype TransitionConfig = TransitionConfigWithoutRepeats & {\n /**\n * Number of times this animation should repeat. To make it infinite, use the `loop` boolean.\n *\n * Default: `0`\n *\n * It's worth noting that this value isn't *exactly* a `repeat`. Instead, it uses Reanimated's `withRepeat` function under the hood, which repeats back to the **previous value**. If you want a repeated animation, I recommend setting it to `true` from the start, and make sure you have a `from` value.\n *\n * As a result, this value cannot be reliably changed on the fly. If you would like animations to repeat based on the `from` value, `repeat` must be a number when the component initializes. You can set it to `0` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n repeat?: number\n /**\n * Setting this to `true` is the same as `repeat: Infinity`\n *\n * Default: `false`\n *\n * Note: this value cannot be set on the fly. If you would like animations to repeat based on the `from` value, it must be `true` when the component initializes. You can set it to `false` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n loop?: boolean\n /**\n * Whether or not the animation repetition should alternate in direction.\n *\n * By default, this is `true`.\n *\n * If `false`, any animations with `loop` or `repeat` will not go back and forth. Instead, they will go from 0 -> 1, and again from 0 -> 1.\n *\n * If `true`, then animations will go 0 -> 1 -> 0.\n *\n * Setting this to `true` is like setting `animationDirection: alternate` in CSS.\n */\n repeatReverse?: boolean\n}\n\nconst isColor = (styleKey: string) => {\n 'worklet'\n return [\n 'backgroundColor',\n 'borderBottomColor',\n 'borderColor',\n 'borderEndColor',\n 'borderLeftColor',\n 'borderRightColor',\n 'borderStartColor',\n 'borderTopColor',\n 'color',\n ].includes(styleKey)\n}\n\nfunction animationConfig<Animate>(\n styleProp: string,\n transition: MotiTransition<Animate> | undefined\n) {\n 'worklet'\n const key = styleProp\n let repeatCount = 0\n let repeatReverse = true\n let animationType: Required<TransitionConfig>['type'] = 'spring'\n\n if (isColor(key) || key === 'opacity') {\n animationType = 'timing'\n }\n\n // say that we're looking at `width`\n // first, check if we have transition.width.type\n if (transition[key as keyof Animate]?.type) {\n animationType = (transition as any)[key]?.type\n } else if (transition?.type) {\n // otherwise, fallback to transition.type\n animationType = transition.type\n }\n\n const loop = transition[key as keyof Animate]?.loop ?? transition?.loop\n\n if (loop != null) {\n repeatCount = loop ? -1 : 0\n }\n\n if (transition[key as keyof Animate]?.repeat != null) {\n repeatCount = transition[key as keyof Animate]?.repeat\n } else if (transition?.repeat != null) {\n repeatCount = transition.repeat\n }\n\n if (transition[key as keyof Animate]?.repeatReverse != null) {\n repeatReverse = transition[key as keyof Animate]?.repeatReverse\n } else if (transition?.repeatReverse != null) {\n repeatReverse = transition.repeatReverse\n }\n\n let config = {}\n // so sad, but fix it later :(\n let animation = (...props: any): any => props\n\n if (animationType === 'timing') {\n const duration =\n (transition[key as keyof Animate] as WithTimingConfig)?.duration ??\n (transition as WithTimingConfig)?.duration\n\n const easing =\n (transition[key as keyof Animate] as WithTimingConfig)?.easing ??\n (transition as WithTimingConfig)?.easing\n\n if (easing) {\n config['easing'] = easing\n }\n if (duration != null) {\n config['duration'] = duration\n }\n animation = withTiming\n } else if (animationType === 'spring') {\n animation = withSpring\n config = {} as WithSpringConfig\n configKeys.forEach((configKey) => {\n 'worklet'\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n } else if (animationType === 'decay') {\n animation = withDecay\n config = {\n velocity: 2,\n deceleration: 2,\n }\n const configKeys: (keyof WithDecayConfig)[] = [\n 'clamp',\n 'velocity',\n 'deceleration',\n 'velocityFactor',\n ]\n configKeys.forEach((configKey) => {\n 'worklet'\n // is this necessary ^ don't think so...?\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n }\n\n return {\n animation,\n config,\n repeatReverse,\n repeatCount,\n shouldRepeat: !!repeatCount,\n }\n}\n\nconst configKeys: (keyof WithSpringConfig)[] = [\n 'damping',\n 'mass',\n 'overshootClamping',\n 'restDisplacementThreshold',\n 'restSpeedThreshold',\n 'stiffness',\n 'velocity',\n]\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAoD;AAEpD,
|
|
4
|
+
"sourcesContent": ["import { AnimatePresenceContext, useEntering } from '@tamagui/animate-presence'\nimport { AnimationDriver } from '@tamagui/core'\nimport { useCallback, useContext, useEffect, useMemo } from 'react'\nimport Animated, {\n WithDecayConfig,\n WithSpringConfig,\n WithTimingConfig,\n runOnJS,\n useAnimatedStyle,\n withDecay,\n withDelay,\n withRepeat,\n withSpring,\n withTiming,\n} from 'react-native-reanimated'\n\ntype AnimationsConfig<A extends Object = any> = {\n [Key in keyof A]: AnimationConfig\n}\n\ntype AnimationConfig =\n | ({ type: 'timing'; loop?: number } & WithTimingConfig)\n | ({ type: 'spring'; loop?: number } & WithSpringConfig)\n | ({ type: 'decay'; loop?: number } & WithDecayConfig)\n// | ({ type: 'transition' } & TransitionProps)\n\nconst AnimatedView = Animated.View\nconst AnimatedText = Animated.Text\n\nAnimatedView['displayName'] = 'AnimatedView'\nAnimatedText['displayName'] = 'AnimatedText'\n\nexport function createAnimations<A extends AnimationsConfig>(animations: A): AnimationDriver<A> {\n return {\n avoidClasses: true,\n animations,\n View: AnimatedView,\n Text: AnimatedText,\n useAnimations: (props, helpers) => {\n const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers\n const [isEntering, safeToUnmount] = useEntering()\n const presence = useContext(AnimatePresenceContext)\n\n const exitStyle = presence?.exitVariant\n ? staticConfig.variantsParsed?.[presence.exitVariant]?.true || pseudos.exitStyle\n : pseudos.exitStyle\n\n const reanimatedOnDidAnimated = useCallback<NonNullable<typeof onDidAnimate>>(\n (...args) => {\n onDidAnimate?.(...args)\n },\n [onDidAnimate]\n )\n\n const all = getStyle({\n isEntering,\n exitVariant: presence?.exitVariant,\n enterVariant: presence?.enterVariant,\n })\n const [animatedStyles, nonAnimatedStyle] = [{}, {}]\n const animatedStyleKey = {\n transform: true,\n opacity: true,\n }\n for (const key of Object.keys(all)) {\n if (animatedStyleKey[key]) {\n animatedStyles[key] = all[key]\n } else {\n nonAnimatedStyle[key] = all[key]\n }\n }\n\n const args = [\n JSON.stringify(animatedStyles),\n state.mounted,\n state.hover,\n state.press,\n state.pressIn,\n state.focus,\n delay,\n isEntering,\n onDidAnimate,\n reanimatedOnDidAnimated,\n presence?.exitVariant,\n presence?.enterVariant,\n ]\n\n const animatedStyle = useAnimatedStyle(() => {\n const style = animatedStyles\n\n const final = {\n transform: [] as any[],\n }\n\n const isExiting = isEntering === false\n const transition = animations[props.animation]\n\n const exitingStyleProps: Record<string, boolean> = {}\n if (exitStyle) {\n for (const key of Object.keys(exitStyle)) {\n exitingStyleProps[key] = true\n }\n }\n\n for (const key in style) {\n const value = style[key]\n const aconf = animationConfig(key, transition)\n const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf\n\n const callback: (completed: boolean, value?: any) => void = (completed, recentValue) => {\n runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {\n attemptedValue: value,\n })\n if (isExiting) {\n exitingStyleProps[key] = false\n const areStylesExiting = Object.values(exitingStyleProps).some(Boolean)\n // if this is true, then we've finished our exit animations\n if (!areStylesExiting) {\n if (safeToUnmount) {\n runOnJS(safeToUnmount)()\n }\n }\n }\n }\n\n let { delayMs = null } = animationDelay(key, transition, delay)\n\n if (key === 'transform') {\n if (!Array.isArray(value)) {\n console.error(`Invalid transform value. Needs to be an array.`)\n continue\n }\n\n for (const transformObject of value) {\n const key = Object.keys(transformObject)[0]\n const transformValue = transformObject[key]\n let finalValue = animation(transformValue, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n final['transform'].push({\n [key]: finalValue,\n })\n }\n continue\n }\n\n if (typeof value === 'object') {\n // shadows\n final[key] = {}\n for (const innerStyleKey of Object.keys(value || {})) {\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null) {\n final[key][innerStyleKey] = withDelay(delayMs, finalValue)\n } else {\n final[key][innerStyleKey] = finalValue\n }\n }\n continue\n }\n\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null && typeof delayMs === 'number') {\n final[key] = withDelay(delayMs, finalValue)\n } else {\n final[key] = finalValue\n }\n\n // end for (key in mergedStyles)\n }\n\n if (process.env.NODE_ENV === 'development' && props['debug']) {\n console.log('animation style', final)\n }\n\n return final\n }, args)\n\n return useMemo(() => {\n return {\n style: [nonAnimatedStyle, animatedStyle],\n }\n }, args)\n },\n }\n}\n\nfunction animationDelay(\n key: string,\n transition: AnimationConfig | undefined,\n defaultDelay?: number\n) {\n 'worklet'\n if (\n !transition ||\n !transition[key] ||\n transition[key].delayMs === undefined ||\n transition[key].delayMs === null\n ) {\n return {\n delayMs: null,\n }\n }\n return {\n delayMs: transition[key].delayMs as TransitionConfig['delay'],\n }\n}\n\ntype TransitionConfigWithoutRepeats = (\n | ({ type?: 'spring' } & WithSpringConfig)\n | ({ type: 'timing' } & WithTimingConfig)\n | ({ type: 'decay' } & WithDecayConfig)\n) & {\n delay?: number\n}\n\ntype TransitionConfig = TransitionConfigWithoutRepeats & {\n /**\n * Number of times this animation should repeat. To make it infinite, use the `loop` boolean.\n *\n * Default: `0`\n *\n * It's worth noting that this value isn't *exactly* a `repeat`. Instead, it uses Reanimated's `withRepeat` function under the hood, which repeats back to the **previous value**. If you want a repeated animation, I recommend setting it to `true` from the start, and make sure you have a `from` value.\n *\n * As a result, this value cannot be reliably changed on the fly. If you would like animations to repeat based on the `from` value, `repeat` must be a number when the component initializes. You can set it to `0` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n repeat?: number\n /**\n * Setting this to `true` is the same as `repeat: Infinity`\n *\n * Default: `false`\n *\n * Note: this value cannot be set on the fly. If you would like animations to repeat based on the `from` value, it must be `true` when the component initializes. You can set it to `false` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n loop?: boolean\n /**\n * Whether or not the animation repetition should alternate in direction.\n *\n * By default, this is `true`.\n *\n * If `false`, any animations with `loop` or `repeat` will not go back and forth. Instead, they will go from 0 -> 1, and again from 0 -> 1.\n *\n * If `true`, then animations will go 0 -> 1 -> 0.\n *\n * Setting this to `true` is like setting `animationDirection: alternate` in CSS.\n */\n repeatReverse?: boolean\n}\n\nconst isColor = (styleKey: string) => {\n 'worklet'\n return [\n 'backgroundColor',\n 'borderBottomColor',\n 'borderColor',\n 'borderEndColor',\n 'borderLeftColor',\n 'borderRightColor',\n 'borderStartColor',\n 'borderTopColor',\n 'color',\n ].includes(styleKey)\n}\n\nfunction animationConfig<Animate>(styleProp: string, transition: AnimationConfig | undefined) {\n 'worklet'\n const key = styleProp\n let repeatCount = 0\n let repeatReverse = true\n let animationType: Required<TransitionConfig>['type'] = 'spring'\n\n if (isColor(key) || key === 'opacity') {\n animationType = 'timing'\n }\n\n if (!transition) {\n return {}\n }\n\n // say that we're looking at `width`\n // first, check if we have transition.width.type\n if (transition[key]?.type) {\n animationType = transition[key]?.type\n } else if (transition.type) {\n // otherwise, fallback to transition.type\n animationType = transition.type\n }\n\n const loop = transition[key]?.loop || transition.loop || null\n\n if (loop != null) {\n repeatCount = loop ? -1 : 0\n }\n\n // if (transition[key]?.repeat != null) {\n // repeatCount = transition[key]?.repeat\n // } else if (transition?.repeat != null) {\n // repeatCount = transition.repeat\n // }\n\n // if (transition[key]?.repeatReverse != null) {\n // repeatReverse = transition[key]?.repeatReverse\n // } else if (transition?.repeatReverse != null) {\n // repeatReverse = transition.repeatReverse\n // }\n\n let config = {}\n // so sad, but fix it later :(\n let animation: any\n\n if (animationType === 'timing') {\n const duration =\n (transition[key] as WithTimingConfig)?.duration ?? (transition as WithTimingConfig)?.duration\n\n const easing =\n (transition[key] as WithTimingConfig)?.easing ?? (transition as WithTimingConfig)?.easing\n\n if (easing) {\n config['easing'] = easing\n }\n if (duration != null) {\n config['duration'] = duration\n }\n animation = withTiming\n } else if (animationType === 'spring') {\n animation = withSpring\n config = {} as WithSpringConfig\n configKeys.forEach((configKey) => {\n 'worklet'\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n } else if (animationType === 'decay') {\n animation = withDecay\n config = {\n velocity: 2,\n deceleration: 2,\n }\n const configKeys: (keyof WithDecayConfig)[] = [\n 'clamp',\n 'velocity',\n 'deceleration',\n 'velocityFactor',\n ]\n configKeys.forEach((configKey) => {\n 'worklet'\n // is this necessary ^ don't think so...?\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n }\n\n return {\n animation,\n config,\n repeatReverse,\n repeatCount,\n shouldRepeat: !!repeatCount,\n }\n}\n\nconst configKeys: (keyof WithSpringConfig)[] = [\n 'damping',\n 'mass',\n 'overshootClamping',\n 'restDisplacementThreshold',\n 'restSpeedThreshold',\n 'stiffness',\n 'velocity',\n]\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { AnimatePresenceContext,
|
|
4
|
-
import { useCallback, useContext,
|
|
3
|
+
import { AnimatePresenceContext, useEntering } from "@tamagui/animate-presence";
|
|
4
|
+
import { useCallback, useContext, useMemo } from "react";
|
|
5
5
|
import Animated, {
|
|
6
6
|
runOnJS,
|
|
7
7
|
useAnimatedStyle,
|
|
8
|
-
useSharedValue,
|
|
9
8
|
withDecay,
|
|
10
9
|
withDelay,
|
|
11
10
|
withRepeat,
|
|
@@ -23,64 +22,73 @@ function createAnimations(animations) {
|
|
|
23
22
|
View: AnimatedView,
|
|
24
23
|
Text: AnimatedText,
|
|
25
24
|
useAnimations: (props, helpers) => {
|
|
26
|
-
|
|
27
|
-
const
|
|
25
|
+
var _a, _b;
|
|
26
|
+
const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers;
|
|
27
|
+
const [isEntering, safeToUnmount] = useEntering();
|
|
28
28
|
const presence = useContext(AnimatePresenceContext);
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const custom = useCallback(() => {
|
|
33
|
-
"worklet";
|
|
34
|
-
return presence == null ? void 0 : presence.custom;
|
|
35
|
-
}, [presence]);
|
|
36
|
-
const reanimatedOnDidAnimated = useCallback((...args) => {
|
|
37
|
-
onDidAnimate == null ? void 0 : onDidAnimate(...args);
|
|
29
|
+
const exitStyle = (presence == null ? void 0 : presence.exitVariant) ? ((_b = (_a = staticConfig.variantsParsed) == null ? void 0 : _a[presence.exitVariant]) == null ? void 0 : _b.true) || pseudos.exitStyle : pseudos.exitStyle;
|
|
30
|
+
const reanimatedOnDidAnimated = useCallback((...args2) => {
|
|
31
|
+
onDidAnimate == null ? void 0 : onDidAnimate(...args2);
|
|
38
32
|
}, [onDidAnimate]);
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
const all = getStyle({
|
|
34
|
+
isEntering,
|
|
35
|
+
exitVariant: presence == null ? void 0 : presence.exitVariant,
|
|
36
|
+
enterVariant: presence == null ? void 0 : presence.enterVariant
|
|
37
|
+
});
|
|
38
|
+
const [animatedStyles, nonAnimatedStyle] = [{}, {}];
|
|
39
|
+
const animatedStyleKey = {
|
|
40
|
+
transform: true,
|
|
41
|
+
opacity: true
|
|
42
|
+
};
|
|
43
|
+
for (const key of Object.keys(all)) {
|
|
44
|
+
if (animatedStyleKey[key]) {
|
|
45
|
+
animatedStyles[key] = all[key];
|
|
46
|
+
} else {
|
|
47
|
+
nonAnimatedStyle[key] = all[key];
|
|
51
48
|
}
|
|
52
|
-
}
|
|
49
|
+
}
|
|
50
|
+
const args = [
|
|
51
|
+
JSON.stringify(animatedStyles),
|
|
52
|
+
state.mounted,
|
|
53
|
+
state.hover,
|
|
54
|
+
state.press,
|
|
55
|
+
state.pressIn,
|
|
56
|
+
state.focus,
|
|
57
|
+
delay,
|
|
58
|
+
isEntering,
|
|
59
|
+
onDidAnimate,
|
|
60
|
+
reanimatedOnDidAnimated,
|
|
61
|
+
presence == null ? void 0 : presence.exitVariant,
|
|
62
|
+
presence == null ? void 0 : presence.enterVariant
|
|
63
|
+
];
|
|
53
64
|
const animatedStyle = useAnimatedStyle(() => {
|
|
54
|
-
|
|
55
|
-
isHovering.value;
|
|
56
|
-
const style = mergedStyles({
|
|
57
|
-
isExiting: !isPresent
|
|
58
|
-
});
|
|
65
|
+
const style = animatedStyles;
|
|
59
66
|
const final = {
|
|
60
67
|
transform: []
|
|
61
68
|
};
|
|
62
|
-
const isExiting =
|
|
69
|
+
const isExiting = isEntering === false;
|
|
63
70
|
const transition = animations[props.animation];
|
|
64
71
|
const exitingStyleProps = {};
|
|
65
|
-
if (
|
|
66
|
-
for (const key of Object.keys(
|
|
72
|
+
if (exitStyle) {
|
|
73
|
+
for (const key of Object.keys(exitStyle)) {
|
|
67
74
|
exitingStyleProps[key] = true;
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
for (const key in style) {
|
|
71
78
|
const value = style[key];
|
|
72
|
-
const
|
|
79
|
+
const aconf = animationConfig(key, transition);
|
|
80
|
+
const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf;
|
|
73
81
|
const callback = /* @__PURE__ */ __name((completed, recentValue) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
});
|
|
78
|
-
}
|
|
82
|
+
runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {
|
|
83
|
+
attemptedValue: value
|
|
84
|
+
});
|
|
79
85
|
if (isExiting) {
|
|
80
86
|
exitingStyleProps[key] = false;
|
|
81
87
|
const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
|
|
82
88
|
if (!areStylesExiting) {
|
|
83
|
-
|
|
89
|
+
if (safeToUnmount) {
|
|
90
|
+
runOnJS(safeToUnmount)();
|
|
91
|
+
}
|
|
84
92
|
}
|
|
85
93
|
}
|
|
86
94
|
}, "callback");
|
|
@@ -93,22 +101,13 @@ function createAnimations(animations) {
|
|
|
93
101
|
for (const transformObject of value) {
|
|
94
102
|
const key2 = Object.keys(transformObject)[0];
|
|
95
103
|
const transformValue = transformObject[key2];
|
|
96
|
-
const transform = {};
|
|
97
|
-
if (((_a = transition == null ? void 0 : transition[key2]) == null ? void 0 : _a.delay) != null) {
|
|
98
|
-
delayMs = (_c = (_b = transition == null ? void 0 : transition[key2]) == null ? void 0 : _b.delay) != null ? _c : null;
|
|
99
|
-
}
|
|
100
104
|
let finalValue2 = animation(transformValue, config, callback);
|
|
101
105
|
if (shouldRepeat) {
|
|
102
106
|
finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
|
|
103
107
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
transform[key2] = finalValue2;
|
|
108
|
-
}
|
|
109
|
-
if (Object.keys(transform).length) {
|
|
110
|
-
final["transform"].push(transform);
|
|
111
|
-
}
|
|
108
|
+
final["transform"].push({
|
|
109
|
+
[key2]: finalValue2
|
|
110
|
+
});
|
|
112
111
|
}
|
|
113
112
|
continue;
|
|
114
113
|
}
|
|
@@ -138,38 +137,28 @@ function createAnimations(animations) {
|
|
|
138
137
|
}
|
|
139
138
|
}
|
|
140
139
|
if (process.env.NODE_ENV === "development" && props["debug"]) {
|
|
141
|
-
console.log("animation style",
|
|
140
|
+
console.log("animation style", final);
|
|
142
141
|
}
|
|
143
142
|
return final;
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
isPresent,
|
|
151
|
-
onDidAnimate,
|
|
152
|
-
reanimatedOnDidAnimated,
|
|
153
|
-
reanimatedSafeToUnmount
|
|
154
|
-
]);
|
|
155
|
-
return {
|
|
156
|
-
style: animatedStyle
|
|
157
|
-
};
|
|
143
|
+
}, args);
|
|
144
|
+
return useMemo(() => {
|
|
145
|
+
return {
|
|
146
|
+
style: [nonAnimatedStyle, animatedStyle]
|
|
147
|
+
};
|
|
148
|
+
}, args);
|
|
158
149
|
}
|
|
159
150
|
};
|
|
160
151
|
}
|
|
161
152
|
__name(createAnimations, "createAnimations");
|
|
162
153
|
function animationDelay(key, transition, defaultDelay) {
|
|
163
|
-
var _a, _b;
|
|
164
154
|
"worklet";
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
delayMs = transition.delay;
|
|
155
|
+
if (!transition || !transition[key] || transition[key].delayMs === void 0 || transition[key].delayMs === null) {
|
|
156
|
+
return {
|
|
157
|
+
delayMs: null
|
|
158
|
+
};
|
|
170
159
|
}
|
|
171
160
|
return {
|
|
172
|
-
delayMs
|
|
161
|
+
delayMs: transition[key].delayMs
|
|
173
162
|
};
|
|
174
163
|
}
|
|
175
164
|
__name(animationDelay, "animationDelay");
|
|
@@ -188,7 +177,7 @@ const isColor = /* @__PURE__ */ __name((styleKey) => {
|
|
|
188
177
|
].includes(styleKey);
|
|
189
178
|
}, "isColor");
|
|
190
179
|
function animationConfig(styleProp, transition) {
|
|
191
|
-
var _a, _b, _c, _d, _e, _f, _g
|
|
180
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
192
181
|
"worklet";
|
|
193
182
|
const key = styleProp;
|
|
194
183
|
let repeatCount = 0;
|
|
@@ -197,30 +186,23 @@ function animationConfig(styleProp, transition) {
|
|
|
197
186
|
if (isColor(key) || key === "opacity") {
|
|
198
187
|
animationType = "timing";
|
|
199
188
|
}
|
|
189
|
+
if (!transition) {
|
|
190
|
+
return {};
|
|
191
|
+
}
|
|
200
192
|
if ((_a = transition[key]) == null ? void 0 : _a.type) {
|
|
201
193
|
animationType = (_b = transition[key]) == null ? void 0 : _b.type;
|
|
202
|
-
} else if (transition
|
|
194
|
+
} else if (transition.type) {
|
|
203
195
|
animationType = transition.type;
|
|
204
196
|
}
|
|
205
|
-
const loop = (
|
|
197
|
+
const loop = ((_c = transition[key]) == null ? void 0 : _c.loop) || transition.loop || null;
|
|
206
198
|
if (loop != null) {
|
|
207
199
|
repeatCount = loop ? -1 : 0;
|
|
208
200
|
}
|
|
209
|
-
if (((_e = transition[key]) == null ? void 0 : _e.repeat) != null) {
|
|
210
|
-
repeatCount = (_f = transition[key]) == null ? void 0 : _f.repeat;
|
|
211
|
-
} else if ((transition == null ? void 0 : transition.repeat) != null) {
|
|
212
|
-
repeatCount = transition.repeat;
|
|
213
|
-
}
|
|
214
|
-
if (((_g = transition[key]) == null ? void 0 : _g.repeatReverse) != null) {
|
|
215
|
-
repeatReverse = (_h = transition[key]) == null ? void 0 : _h.repeatReverse;
|
|
216
|
-
} else if ((transition == null ? void 0 : transition.repeatReverse) != null) {
|
|
217
|
-
repeatReverse = transition.repeatReverse;
|
|
218
|
-
}
|
|
219
201
|
let config = {};
|
|
220
|
-
let animation
|
|
202
|
+
let animation;
|
|
221
203
|
if (animationType === "timing") {
|
|
222
|
-
const duration = (
|
|
223
|
-
const easing = (
|
|
204
|
+
const duration = (_e = (_d = transition[key]) == null ? void 0 : _d.duration) != null ? _e : transition == null ? void 0 : transition.duration;
|
|
205
|
+
const easing = (_g = (_f = transition[key]) == null ? void 0 : _f.easing) != null ? _g : transition == null ? void 0 : transition.easing;
|
|
224
206
|
if (easing) {
|
|
225
207
|
config["easing"] = easing;
|
|
226
208
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/createAnimations.tsx"],
|
|
4
|
-
"sourcesContent": ["import { AnimatePresenceContext, usePresence } from '@tamagui/animate-presence'\nimport { AnimationDriver, UseAnimationHelpers, UseAnimationProps } from '@tamagui/core'\nimport { createContext, useCallback, useContext, useEffect } from 'react'\nimport {\n PerpectiveTransform,\n RotateTransform,\n RotateXTransform,\n RotateYTransform,\n RotateZTransform,\n ScaleTransform,\n ScaleXTransform,\n ScaleYTransform,\n SkewXTransform,\n SkewYTransform,\n TranslateXTransform,\n TranslateYTransform,\n} from 'react-native'\nimport Animated, {\n WithDecayConfig,\n WithSpringConfig,\n WithTimingConfig,\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withDecay,\n withDelay,\n withRepeat,\n withSpring,\n withTiming,\n} from 'react-native-reanimated'\n\nconst AnimatedView = Animated.View\nconst AnimatedText = Animated.Text\n\nAnimatedView['displayName'] = 'AnimatedView'\nAnimatedText['displayName'] = 'AnimatedText'\n\nexport function createAnimations<A extends Object>(animations: A): AnimationDriver<A> {\n return {\n avoidClasses: true,\n animations,\n View: AnimatedView,\n Text: AnimatedText,\n useAnimations: (props: UseAnimationProps, helpers: UseAnimationHelpers) => {\n const { styleKey, mergedStyles, state, pseudos, onDidAnimate, delay } = helpers\n const [isPresent, safeToUnmount] = usePresence()\n const presence = useContext(AnimatePresenceContext)\n const isMounted = useSharedValue(false)\n const isHovering = useSharedValue(false)\n const hasExitStyle = !!pseudos.exitStyle\n const custom = useCallback(() => {\n 'worklet'\n return presence?.custom\n }, [presence])\n\n const reanimatedOnDidAnimated = useCallback<NonNullable<typeof onDidAnimate>>(\n (...args) => {\n onDidAnimate?.(...args)\n },\n [onDidAnimate]\n )\n const reanimatedSafeToUnmount = useCallback(() => {\n safeToUnmount?.()\n }, [safeToUnmount])\n\n useEffect(() => {\n isMounted.value = true\n }, [isMounted])\n\n useEffect(() => {\n isHovering.value = true\n }, [state.hover])\n\n useEffect(\n function allowUnMountIfMissingExit() {\n if (!isPresent && !hasExitStyle) {\n reanimatedSafeToUnmount()\n }\n },\n [hasExitStyle, isPresent, reanimatedSafeToUnmount]\n )\n\n const animatedStyle = useAnimatedStyle(() => {\n // read this testing effect\n isHovering.value\n\n const style = mergedStyles({\n isExiting: !isPresent,\n })\n\n const final = {\n transform: [] as any[],\n }\n\n const isExiting = !isPresent && !!pseudos.exitStyle\n const transition = animations[props.animation]\n\n const exitingStyleProps: Record<string, boolean> = {}\n if (pseudos.exitStyle) {\n for (const key of Object.keys(pseudos.exitStyle)) {\n exitingStyleProps[key] = true\n }\n }\n\n for (const key in style) {\n const value = style[key]\n const { animation, config, shouldRepeat, repeatCount, repeatReverse } = animationConfig(\n key,\n transition\n )\n\n const callback: (completed: boolean, value?: any) => void = (completed, recentValue) => {\n if (onDidAnimate) {\n runOnJS(reanimatedOnDidAnimated)(key as any, completed, recentValue, {\n attemptedValue: value,\n })\n }\n if (isExiting) {\n exitingStyleProps[key] = false\n const areStylesExiting = Object.values(exitingStyleProps).some(Boolean)\n // if this is true, then we've finished our exit animations\n if (!areStylesExiting) {\n runOnJS(reanimatedSafeToUnmount)()\n }\n }\n }\n\n let { delayMs = null } = animationDelay(key, transition, delay)\n\n if (key === 'transform') {\n if (!Array.isArray(value)) {\n console.error(`Invalid transform value. Needs to be an array.`)\n continue\n }\n\n for (const transformObject of value) {\n const key = Object.keys(transformObject)[0]\n const transformValue = transformObject[key]\n const transform = {} as any\n if (transition?.[key]?.delay != null) {\n delayMs = transition?.[key]?.delay ?? null\n }\n let finalValue = animation(transformValue, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null) {\n transform[key] = withDelay(delayMs, finalValue)\n } else {\n transform[key] = finalValue\n }\n if (Object.keys(transform).length) {\n final['transform'].push(transform)\n }\n }\n continue\n }\n\n if (typeof value === 'object') {\n // shadows\n final[key] = {}\n for (const innerStyleKey of Object.keys(value || {})) {\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null) {\n final[key][innerStyleKey] = withDelay(delayMs, finalValue)\n } else {\n final[key][innerStyleKey] = finalValue\n }\n }\n continue\n }\n\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null && typeof delayMs === 'number') {\n final[key] = withDelay(delayMs, finalValue)\n } else {\n final[key] = finalValue\n }\n\n // end for (key in mergedStyles)\n }\n\n if (process.env.NODE_ENV === 'development' && props['debug']) {\n console.log('animation style', JSON.stringify(final, null, 2))\n }\n\n return final\n }, [\n styleKey,\n custom,\n delay,\n // disableInitialAnimation,\n // exitProp,\n // exitTransitionProp,\n // fromProp,\n hasExitStyle,\n isMounted,\n isPresent,\n onDidAnimate,\n reanimatedOnDidAnimated,\n reanimatedSafeToUnmount,\n // state,\n // stylePriority,\n // transitionProp,\n ])\n\n return {\n style: animatedStyle,\n }\n },\n }\n}\n\nfunction animationDelay<Animate>(\n key: string,\n transition: MotiTransition<Animate> | undefined,\n defaultDelay?: number\n) {\n 'worklet'\n let delayMs: TransitionConfig['delay'] = defaultDelay\n\n if (transition[key as keyof Animate]?.delay != null) {\n delayMs = transition[key as keyof Animate]?.delay\n } else if (transition?.delay != null) {\n delayMs = transition.delay\n }\n\n return {\n delayMs,\n }\n}\n\ntype MotiTransition<A> = any\ntype Transforms = PerpectiveTransform &\n RotateTransform &\n RotateXTransform &\n RotateYTransform &\n RotateZTransform &\n ScaleTransform &\n ScaleXTransform &\n ScaleYTransform &\n TranslateXTransform &\n TranslateYTransform &\n SkewXTransform &\n SkewYTransform\ntype TransitionConfigWithoutRepeats = (\n | ({ type?: 'spring' } & WithSpringConfig)\n | ({ type: 'timing' } & WithTimingConfig)\n | ({ type: 'decay' } & WithDecayConfig)\n) & {\n delay?: number\n}\n\ntype TransitionConfig = TransitionConfigWithoutRepeats & {\n /**\n * Number of times this animation should repeat. To make it infinite, use the `loop` boolean.\n *\n * Default: `0`\n *\n * It's worth noting that this value isn't *exactly* a `repeat`. Instead, it uses Reanimated's `withRepeat` function under the hood, which repeats back to the **previous value**. If you want a repeated animation, I recommend setting it to `true` from the start, and make sure you have a `from` value.\n *\n * As a result, this value cannot be reliably changed on the fly. If you would like animations to repeat based on the `from` value, `repeat` must be a number when the component initializes. You can set it to `0` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n repeat?: number\n /**\n * Setting this to `true` is the same as `repeat: Infinity`\n *\n * Default: `false`\n *\n * Note: this value cannot be set on the fly. If you would like animations to repeat based on the `from` value, it must be `true` when the component initializes. You can set it to `false` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n loop?: boolean\n /**\n * Whether or not the animation repetition should alternate in direction.\n *\n * By default, this is `true`.\n *\n * If `false`, any animations with `loop` or `repeat` will not go back and forth. Instead, they will go from 0 -> 1, and again from 0 -> 1.\n *\n * If `true`, then animations will go 0 -> 1 -> 0.\n *\n * Setting this to `true` is like setting `animationDirection: alternate` in CSS.\n */\n repeatReverse?: boolean\n}\n\nconst isColor = (styleKey: string) => {\n 'worklet'\n return [\n 'backgroundColor',\n 'borderBottomColor',\n 'borderColor',\n 'borderEndColor',\n 'borderLeftColor',\n 'borderRightColor',\n 'borderStartColor',\n 'borderTopColor',\n 'color',\n ].includes(styleKey)\n}\n\nfunction animationConfig<Animate>(\n styleProp: string,\n transition: MotiTransition<Animate> | undefined\n) {\n 'worklet'\n const key = styleProp\n let repeatCount = 0\n let repeatReverse = true\n let animationType: Required<TransitionConfig>['type'] = 'spring'\n\n if (isColor(key) || key === 'opacity') {\n animationType = 'timing'\n }\n\n // say that we're looking at `width`\n // first, check if we have transition.width.type\n if (transition[key as keyof Animate]?.type) {\n animationType = (transition as any)[key]?.type\n } else if (transition?.type) {\n // otherwise, fallback to transition.type\n animationType = transition.type\n }\n\n const loop = transition[key as keyof Animate]?.loop ?? transition?.loop\n\n if (loop != null) {\n repeatCount = loop ? -1 : 0\n }\n\n if (transition[key as keyof Animate]?.repeat != null) {\n repeatCount = transition[key as keyof Animate]?.repeat\n } else if (transition?.repeat != null) {\n repeatCount = transition.repeat\n }\n\n if (transition[key as keyof Animate]?.repeatReverse != null) {\n repeatReverse = transition[key as keyof Animate]?.repeatReverse\n } else if (transition?.repeatReverse != null) {\n repeatReverse = transition.repeatReverse\n }\n\n let config = {}\n // so sad, but fix it later :(\n let animation = (...props: any): any => props\n\n if (animationType === 'timing') {\n const duration =\n (transition[key as keyof Animate] as WithTimingConfig)?.duration ??\n (transition as WithTimingConfig)?.duration\n\n const easing =\n (transition[key as keyof Animate] as WithTimingConfig)?.easing ??\n (transition as WithTimingConfig)?.easing\n\n if (easing) {\n config['easing'] = easing\n }\n if (duration != null) {\n config['duration'] = duration\n }\n animation = withTiming\n } else if (animationType === 'spring') {\n animation = withSpring\n config = {} as WithSpringConfig\n configKeys.forEach((configKey) => {\n 'worklet'\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n } else if (animationType === 'decay') {\n animation = withDecay\n config = {\n velocity: 2,\n deceleration: 2,\n }\n const configKeys: (keyof WithDecayConfig)[] = [\n 'clamp',\n 'velocity',\n 'deceleration',\n 'velocityFactor',\n ]\n configKeys.forEach((configKey) => {\n 'worklet'\n // is this necessary ^ don't think so...?\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n }\n\n return {\n animation,\n config,\n repeatReverse,\n repeatCount,\n shouldRepeat: !!repeatCount,\n }\n}\n\nconst configKeys: (keyof WithSpringConfig)[] = [\n 'damping',\n 'mass',\n 'overshootClamping',\n 'restDisplacementThreshold',\n 'restSpeedThreshold',\n 'stiffness',\n 'velocity',\n]\n"],
|
|
5
|
-
"mappings": ";;AAAA;AAEA;
|
|
4
|
+
"sourcesContent": ["import { AnimatePresenceContext, useEntering } from '@tamagui/animate-presence'\nimport { AnimationDriver } from '@tamagui/core'\nimport { useCallback, useContext, useEffect, useMemo } from 'react'\nimport Animated, {\n WithDecayConfig,\n WithSpringConfig,\n WithTimingConfig,\n runOnJS,\n useAnimatedStyle,\n withDecay,\n withDelay,\n withRepeat,\n withSpring,\n withTiming,\n} from 'react-native-reanimated'\n\ntype AnimationsConfig<A extends Object = any> = {\n [Key in keyof A]: AnimationConfig\n}\n\ntype AnimationConfig =\n | ({ type: 'timing'; loop?: number } & WithTimingConfig)\n | ({ type: 'spring'; loop?: number } & WithSpringConfig)\n | ({ type: 'decay'; loop?: number } & WithDecayConfig)\n// | ({ type: 'transition' } & TransitionProps)\n\nconst AnimatedView = Animated.View\nconst AnimatedText = Animated.Text\n\nAnimatedView['displayName'] = 'AnimatedView'\nAnimatedText['displayName'] = 'AnimatedText'\n\nexport function createAnimations<A extends AnimationsConfig>(animations: A): AnimationDriver<A> {\n return {\n avoidClasses: true,\n animations,\n View: AnimatedView,\n Text: AnimatedText,\n useAnimations: (props, helpers) => {\n const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers\n const [isEntering, safeToUnmount] = useEntering()\n const presence = useContext(AnimatePresenceContext)\n\n const exitStyle = presence?.exitVariant\n ? staticConfig.variantsParsed?.[presence.exitVariant]?.true || pseudos.exitStyle\n : pseudos.exitStyle\n\n const reanimatedOnDidAnimated = useCallback<NonNullable<typeof onDidAnimate>>(\n (...args) => {\n onDidAnimate?.(...args)\n },\n [onDidAnimate]\n )\n\n const all = getStyle({\n isEntering,\n exitVariant: presence?.exitVariant,\n enterVariant: presence?.enterVariant,\n })\n const [animatedStyles, nonAnimatedStyle] = [{}, {}]\n const animatedStyleKey = {\n transform: true,\n opacity: true,\n }\n for (const key of Object.keys(all)) {\n if (animatedStyleKey[key]) {\n animatedStyles[key] = all[key]\n } else {\n nonAnimatedStyle[key] = all[key]\n }\n }\n\n const args = [\n JSON.stringify(animatedStyles),\n state.mounted,\n state.hover,\n state.press,\n state.pressIn,\n state.focus,\n delay,\n isEntering,\n onDidAnimate,\n reanimatedOnDidAnimated,\n presence?.exitVariant,\n presence?.enterVariant,\n ]\n\n const animatedStyle = useAnimatedStyle(() => {\n const style = animatedStyles\n\n const final = {\n transform: [] as any[],\n }\n\n const isExiting = isEntering === false\n const transition = animations[props.animation]\n\n const exitingStyleProps: Record<string, boolean> = {}\n if (exitStyle) {\n for (const key of Object.keys(exitStyle)) {\n exitingStyleProps[key] = true\n }\n }\n\n for (const key in style) {\n const value = style[key]\n const aconf = animationConfig(key, transition)\n const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf\n\n const callback: (completed: boolean, value?: any) => void = (completed, recentValue) => {\n runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {\n attemptedValue: value,\n })\n if (isExiting) {\n exitingStyleProps[key] = false\n const areStylesExiting = Object.values(exitingStyleProps).some(Boolean)\n // if this is true, then we've finished our exit animations\n if (!areStylesExiting) {\n if (safeToUnmount) {\n runOnJS(safeToUnmount)()\n }\n }\n }\n }\n\n let { delayMs = null } = animationDelay(key, transition, delay)\n\n if (key === 'transform') {\n if (!Array.isArray(value)) {\n console.error(`Invalid transform value. Needs to be an array.`)\n continue\n }\n\n for (const transformObject of value) {\n const key = Object.keys(transformObject)[0]\n const transformValue = transformObject[key]\n let finalValue = animation(transformValue, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n final['transform'].push({\n [key]: finalValue,\n })\n }\n continue\n }\n\n if (typeof value === 'object') {\n // shadows\n final[key] = {}\n for (const innerStyleKey of Object.keys(value || {})) {\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null) {\n final[key][innerStyleKey] = withDelay(delayMs, finalValue)\n } else {\n final[key][innerStyleKey] = finalValue\n }\n }\n continue\n }\n\n let finalValue = animation(value, config, callback)\n if (shouldRepeat) {\n finalValue = withRepeat(finalValue, repeatCount, repeatReverse)\n }\n if (delayMs != null && typeof delayMs === 'number') {\n final[key] = withDelay(delayMs, finalValue)\n } else {\n final[key] = finalValue\n }\n\n // end for (key in mergedStyles)\n }\n\n if (process.env.NODE_ENV === 'development' && props['debug']) {\n console.log('animation style', final)\n }\n\n return final\n }, args)\n\n return useMemo(() => {\n return {\n style: [nonAnimatedStyle, animatedStyle],\n }\n }, args)\n },\n }\n}\n\nfunction animationDelay(\n key: string,\n transition: AnimationConfig | undefined,\n defaultDelay?: number\n) {\n 'worklet'\n if (\n !transition ||\n !transition[key] ||\n transition[key].delayMs === undefined ||\n transition[key].delayMs === null\n ) {\n return {\n delayMs: null,\n }\n }\n return {\n delayMs: transition[key].delayMs as TransitionConfig['delay'],\n }\n}\n\ntype TransitionConfigWithoutRepeats = (\n | ({ type?: 'spring' } & WithSpringConfig)\n | ({ type: 'timing' } & WithTimingConfig)\n | ({ type: 'decay' } & WithDecayConfig)\n) & {\n delay?: number\n}\n\ntype TransitionConfig = TransitionConfigWithoutRepeats & {\n /**\n * Number of times this animation should repeat. To make it infinite, use the `loop` boolean.\n *\n * Default: `0`\n *\n * It's worth noting that this value isn't *exactly* a `repeat`. Instead, it uses Reanimated's `withRepeat` function under the hood, which repeats back to the **previous value**. If you want a repeated animation, I recommend setting it to `true` from the start, and make sure you have a `from` value.\n *\n * As a result, this value cannot be reliably changed on the fly. If you would like animations to repeat based on the `from` value, `repeat` must be a number when the component initializes. You can set it to `0` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n repeat?: number\n /**\n * Setting this to `true` is the same as `repeat: Infinity`\n *\n * Default: `false`\n *\n * Note: this value cannot be set on the fly. If you would like animations to repeat based on the `from` value, it must be `true` when the component initializes. You can set it to `false` to stop it, but you won't be able to start it again. You might be better off using the sequence array API if you need to update its repetitiveness on the fly.\n */\n loop?: boolean\n /**\n * Whether or not the animation repetition should alternate in direction.\n *\n * By default, this is `true`.\n *\n * If `false`, any animations with `loop` or `repeat` will not go back and forth. Instead, they will go from 0 -> 1, and again from 0 -> 1.\n *\n * If `true`, then animations will go 0 -> 1 -> 0.\n *\n * Setting this to `true` is like setting `animationDirection: alternate` in CSS.\n */\n repeatReverse?: boolean\n}\n\nconst isColor = (styleKey: string) => {\n 'worklet'\n return [\n 'backgroundColor',\n 'borderBottomColor',\n 'borderColor',\n 'borderEndColor',\n 'borderLeftColor',\n 'borderRightColor',\n 'borderStartColor',\n 'borderTopColor',\n 'color',\n ].includes(styleKey)\n}\n\nfunction animationConfig<Animate>(styleProp: string, transition: AnimationConfig | undefined) {\n 'worklet'\n const key = styleProp\n let repeatCount = 0\n let repeatReverse = true\n let animationType: Required<TransitionConfig>['type'] = 'spring'\n\n if (isColor(key) || key === 'opacity') {\n animationType = 'timing'\n }\n\n if (!transition) {\n return {}\n }\n\n // say that we're looking at `width`\n // first, check if we have transition.width.type\n if (transition[key]?.type) {\n animationType = transition[key]?.type\n } else if (transition.type) {\n // otherwise, fallback to transition.type\n animationType = transition.type\n }\n\n const loop = transition[key]?.loop || transition.loop || null\n\n if (loop != null) {\n repeatCount = loop ? -1 : 0\n }\n\n // if (transition[key]?.repeat != null) {\n // repeatCount = transition[key]?.repeat\n // } else if (transition?.repeat != null) {\n // repeatCount = transition.repeat\n // }\n\n // if (transition[key]?.repeatReverse != null) {\n // repeatReverse = transition[key]?.repeatReverse\n // } else if (transition?.repeatReverse != null) {\n // repeatReverse = transition.repeatReverse\n // }\n\n let config = {}\n // so sad, but fix it later :(\n let animation: any\n\n if (animationType === 'timing') {\n const duration =\n (transition[key] as WithTimingConfig)?.duration ?? (transition as WithTimingConfig)?.duration\n\n const easing =\n (transition[key] as WithTimingConfig)?.easing ?? (transition as WithTimingConfig)?.easing\n\n if (easing) {\n config['easing'] = easing\n }\n if (duration != null) {\n config['duration'] = duration\n }\n animation = withTiming\n } else if (animationType === 'spring') {\n animation = withSpring\n config = {} as WithSpringConfig\n configKeys.forEach((configKey) => {\n 'worklet'\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n } else if (animationType === 'decay') {\n animation = withDecay\n config = {\n velocity: 2,\n deceleration: 2,\n }\n const configKeys: (keyof WithDecayConfig)[] = [\n 'clamp',\n 'velocity',\n 'deceleration',\n 'velocityFactor',\n ]\n configKeys.forEach((configKey) => {\n 'worklet'\n // is this necessary ^ don't think so...?\n const styleSpecificConfig = transition?.[key]?.[configKey]\n const transitionConfigForKey = transition?.[configKey]\n\n if (styleSpecificConfig != null) {\n config[configKey] = styleSpecificConfig\n } else if (transitionConfigForKey != null) {\n config[configKey] = transitionConfigForKey\n }\n })\n }\n\n return {\n animation,\n config,\n repeatReverse,\n repeatCount,\n shouldRepeat: !!repeatCount,\n }\n}\n\nconst configKeys: (keyof WithSpringConfig)[] = [\n 'damping',\n 'mass',\n 'overshootClamping',\n 'restDisplacementThreshold',\n 'restSpeedThreshold',\n 'stiffness',\n 'velocity',\n]\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { AnimatePresenceContext,
|
|
4
|
-
import { useCallback, useContext,
|
|
3
|
+
import { AnimatePresenceContext, useEntering } from "@tamagui/animate-presence";
|
|
4
|
+
import { useCallback, useContext, useMemo } from "react";
|
|
5
5
|
import Animated, {
|
|
6
6
|
runOnJS,
|
|
7
7
|
useAnimatedStyle,
|
|
8
|
-
useSharedValue,
|
|
9
8
|
withDecay,
|
|
10
9
|
withDelay,
|
|
11
10
|
withRepeat,
|
|
@@ -23,64 +22,73 @@ function createAnimations(animations) {
|
|
|
23
22
|
View: AnimatedView,
|
|
24
23
|
Text: AnimatedText,
|
|
25
24
|
useAnimations: (props, helpers) => {
|
|
26
|
-
|
|
27
|
-
const
|
|
25
|
+
var _a, _b;
|
|
26
|
+
const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers;
|
|
27
|
+
const [isEntering, safeToUnmount] = useEntering();
|
|
28
28
|
const presence = useContext(AnimatePresenceContext);
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const custom = useCallback(() => {
|
|
33
|
-
"worklet";
|
|
34
|
-
return presence == null ? void 0 : presence.custom;
|
|
35
|
-
}, [presence]);
|
|
36
|
-
const reanimatedOnDidAnimated = useCallback((...args) => {
|
|
37
|
-
onDidAnimate == null ? void 0 : onDidAnimate(...args);
|
|
29
|
+
const exitStyle = (presence == null ? void 0 : presence.exitVariant) ? ((_b = (_a = staticConfig.variantsParsed) == null ? void 0 : _a[presence.exitVariant]) == null ? void 0 : _b.true) || pseudos.exitStyle : pseudos.exitStyle;
|
|
30
|
+
const reanimatedOnDidAnimated = useCallback((...args2) => {
|
|
31
|
+
onDidAnimate == null ? void 0 : onDidAnimate(...args2);
|
|
38
32
|
}, [onDidAnimate]);
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
const all = getStyle({
|
|
34
|
+
isEntering,
|
|
35
|
+
exitVariant: presence == null ? void 0 : presence.exitVariant,
|
|
36
|
+
enterVariant: presence == null ? void 0 : presence.enterVariant
|
|
37
|
+
});
|
|
38
|
+
const [animatedStyles, nonAnimatedStyle] = [{}, {}];
|
|
39
|
+
const animatedStyleKey = {
|
|
40
|
+
transform: true,
|
|
41
|
+
opacity: true
|
|
42
|
+
};
|
|
43
|
+
for (const key of Object.keys(all)) {
|
|
44
|
+
if (animatedStyleKey[key]) {
|
|
45
|
+
animatedStyles[key] = all[key];
|
|
46
|
+
} else {
|
|
47
|
+
nonAnimatedStyle[key] = all[key];
|
|
51
48
|
}
|
|
52
|
-
}
|
|
49
|
+
}
|
|
50
|
+
const args = [
|
|
51
|
+
JSON.stringify(animatedStyles),
|
|
52
|
+
state.mounted,
|
|
53
|
+
state.hover,
|
|
54
|
+
state.press,
|
|
55
|
+
state.pressIn,
|
|
56
|
+
state.focus,
|
|
57
|
+
delay,
|
|
58
|
+
isEntering,
|
|
59
|
+
onDidAnimate,
|
|
60
|
+
reanimatedOnDidAnimated,
|
|
61
|
+
presence == null ? void 0 : presence.exitVariant,
|
|
62
|
+
presence == null ? void 0 : presence.enterVariant
|
|
63
|
+
];
|
|
53
64
|
const animatedStyle = useAnimatedStyle(() => {
|
|
54
|
-
|
|
55
|
-
isHovering.value;
|
|
56
|
-
const style = mergedStyles({
|
|
57
|
-
isExiting: !isPresent
|
|
58
|
-
});
|
|
65
|
+
const style = animatedStyles;
|
|
59
66
|
const final = {
|
|
60
67
|
transform: []
|
|
61
68
|
};
|
|
62
|
-
const isExiting =
|
|
69
|
+
const isExiting = isEntering === false;
|
|
63
70
|
const transition = animations[props.animation];
|
|
64
71
|
const exitingStyleProps = {};
|
|
65
|
-
if (
|
|
66
|
-
for (const key of Object.keys(
|
|
72
|
+
if (exitStyle) {
|
|
73
|
+
for (const key of Object.keys(exitStyle)) {
|
|
67
74
|
exitingStyleProps[key] = true;
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
for (const key in style) {
|
|
71
78
|
const value = style[key];
|
|
72
|
-
const
|
|
79
|
+
const aconf = animationConfig(key, transition);
|
|
80
|
+
const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf;
|
|
73
81
|
const callback = /* @__PURE__ */ __name((completed, recentValue) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
});
|
|
78
|
-
}
|
|
82
|
+
runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {
|
|
83
|
+
attemptedValue: value
|
|
84
|
+
});
|
|
79
85
|
if (isExiting) {
|
|
80
86
|
exitingStyleProps[key] = false;
|
|
81
87
|
const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
|
|
82
88
|
if (!areStylesExiting) {
|
|
83
|
-
|
|
89
|
+
if (safeToUnmount) {
|
|
90
|
+
runOnJS(safeToUnmount)();
|
|
91
|
+
}
|
|
84
92
|
}
|
|
85
93
|
}
|
|
86
94
|
}, "callback");
|
|
@@ -93,22 +101,13 @@ function createAnimations(animations) {
|
|
|
93
101
|
for (const transformObject of value) {
|
|
94
102
|
const key2 = Object.keys(transformObject)[0];
|
|
95
103
|
const transformValue = transformObject[key2];
|
|
96
|
-
const transform = {};
|
|
97
|
-
if (((_a = transition == null ? void 0 : transition[key2]) == null ? void 0 : _a.delay) != null) {
|
|
98
|
-
delayMs = (_c = (_b = transition == null ? void 0 : transition[key2]) == null ? void 0 : _b.delay) != null ? _c : null;
|
|
99
|
-
}
|
|
100
104
|
let finalValue2 = animation(transformValue, config, callback);
|
|
101
105
|
if (shouldRepeat) {
|
|
102
106
|
finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
|
|
103
107
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
transform[key2] = finalValue2;
|
|
108
|
-
}
|
|
109
|
-
if (Object.keys(transform).length) {
|
|
110
|
-
final["transform"].push(transform);
|
|
111
|
-
}
|
|
108
|
+
final["transform"].push({
|
|
109
|
+
[key2]: finalValue2
|
|
110
|
+
});
|
|
112
111
|
}
|
|
113
112
|
continue;
|
|
114
113
|
}
|
|
@@ -138,38 +137,28 @@ function createAnimations(animations) {
|
|
|
138
137
|
}
|
|
139
138
|
}
|
|
140
139
|
if (process.env.NODE_ENV === "development" && props["debug"]) {
|
|
141
|
-
console.log("animation style",
|
|
140
|
+
console.log("animation style", final);
|
|
142
141
|
}
|
|
143
142
|
return final;
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
isPresent,
|
|
151
|
-
onDidAnimate,
|
|
152
|
-
reanimatedOnDidAnimated,
|
|
153
|
-
reanimatedSafeToUnmount
|
|
154
|
-
]);
|
|
155
|
-
return {
|
|
156
|
-
style: animatedStyle
|
|
157
|
-
};
|
|
143
|
+
}, args);
|
|
144
|
+
return useMemo(() => {
|
|
145
|
+
return {
|
|
146
|
+
style: [nonAnimatedStyle, animatedStyle]
|
|
147
|
+
};
|
|
148
|
+
}, args);
|
|
158
149
|
}
|
|
159
150
|
};
|
|
160
151
|
}
|
|
161
152
|
__name(createAnimations, "createAnimations");
|
|
162
153
|
function animationDelay(key, transition, defaultDelay) {
|
|
163
|
-
var _a, _b;
|
|
164
154
|
"worklet";
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
delayMs = transition.delay;
|
|
155
|
+
if (!transition || !transition[key] || transition[key].delayMs === void 0 || transition[key].delayMs === null) {
|
|
156
|
+
return {
|
|
157
|
+
delayMs: null
|
|
158
|
+
};
|
|
170
159
|
}
|
|
171
160
|
return {
|
|
172
|
-
delayMs
|
|
161
|
+
delayMs: transition[key].delayMs
|
|
173
162
|
};
|
|
174
163
|
}
|
|
175
164
|
__name(animationDelay, "animationDelay");
|
|
@@ -188,7 +177,7 @@ const isColor = /* @__PURE__ */ __name((styleKey) => {
|
|
|
188
177
|
].includes(styleKey);
|
|
189
178
|
}, "isColor");
|
|
190
179
|
function animationConfig(styleProp, transition) {
|
|
191
|
-
var _a, _b, _c, _d, _e, _f, _g
|
|
180
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
192
181
|
"worklet";
|
|
193
182
|
const key = styleProp;
|
|
194
183
|
let repeatCount = 0;
|
|
@@ -197,30 +186,23 @@ function animationConfig(styleProp, transition) {
|
|
|
197
186
|
if (isColor(key) || key === "opacity") {
|
|
198
187
|
animationType = "timing";
|
|
199
188
|
}
|
|
189
|
+
if (!transition) {
|
|
190
|
+
return {};
|
|
191
|
+
}
|
|
200
192
|
if ((_a = transition[key]) == null ? void 0 : _a.type) {
|
|
201
193
|
animationType = (_b = transition[key]) == null ? void 0 : _b.type;
|
|
202
|
-
} else if (transition
|
|
194
|
+
} else if (transition.type) {
|
|
203
195
|
animationType = transition.type;
|
|
204
196
|
}
|
|
205
|
-
const loop = (
|
|
197
|
+
const loop = ((_c = transition[key]) == null ? void 0 : _c.loop) || transition.loop || null;
|
|
206
198
|
if (loop != null) {
|
|
207
199
|
repeatCount = loop ? -1 : 0;
|
|
208
200
|
}
|
|
209
|
-
if (((_e = transition[key]) == null ? void 0 : _e.repeat) != null) {
|
|
210
|
-
repeatCount = (_f = transition[key]) == null ? void 0 : _f.repeat;
|
|
211
|
-
} else if ((transition == null ? void 0 : transition.repeat) != null) {
|
|
212
|
-
repeatCount = transition.repeat;
|
|
213
|
-
}
|
|
214
|
-
if (((_g = transition[key]) == null ? void 0 : _g.repeatReverse) != null) {
|
|
215
|
-
repeatReverse = (_h = transition[key]) == null ? void 0 : _h.repeatReverse;
|
|
216
|
-
} else if ((transition == null ? void 0 : transition.repeatReverse) != null) {
|
|
217
|
-
repeatReverse = transition.repeatReverse;
|
|
218
|
-
}
|
|
219
201
|
let config = {};
|
|
220
|
-
let animation
|
|
202
|
+
let animation;
|
|
221
203
|
if (animationType === "timing") {
|
|
222
|
-
const duration = (
|
|
223
|
-
const easing = (
|
|
204
|
+
const duration = (_e = (_d = transition[key]) == null ? void 0 : _d.duration) != null ? _e : transition == null ? void 0 : transition.duration;
|
|
205
|
+
const easing = (_g = (_f = transition[key]) == null ? void 0 : _f.easing) != null ? _g : transition == null ? void 0 : transition.easing;
|
|
224
206
|
if (easing) {
|
|
225
207
|
config["easing"] = easing;
|
|
226
208
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/animations-reanimated",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.230+fab00413",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"typings": "types",
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
"dist"
|
|
13
13
|
],
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@tamagui/animate-presence": "^1.0.0-beta.
|
|
16
|
-
"@tamagui/core": "^1.0.0-beta.
|
|
15
|
+
"@tamagui/animate-presence": "^1.0.0-beta.230+fab00413",
|
|
16
|
+
"@tamagui/core": "^1.0.0-beta.230+fab00413",
|
|
17
17
|
"react-native-reanimated": "^2.4.1"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@tamagui/build": "^1.0.0-beta.
|
|
20
|
+
"@tamagui/build": "^1.0.0-beta.230+fab00413"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tamagui-build",
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"publishConfig": {
|
|
29
29
|
"access": "public"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "fab0041356da84bd32620811a57a156d11514d2b"
|
|
32
32
|
}
|
|
@@ -1,3 +1,18 @@
|
|
|
1
1
|
import { AnimationDriver } from '@tamagui/core';
|
|
2
|
-
|
|
2
|
+
import { WithDecayConfig, WithSpringConfig, WithTimingConfig } from 'react-native-reanimated';
|
|
3
|
+
declare type AnimationsConfig<A extends Object = any> = {
|
|
4
|
+
[Key in keyof A]: AnimationConfig;
|
|
5
|
+
};
|
|
6
|
+
declare type AnimationConfig = ({
|
|
7
|
+
type: 'timing';
|
|
8
|
+
loop?: number;
|
|
9
|
+
} & WithTimingConfig) | ({
|
|
10
|
+
type: 'spring';
|
|
11
|
+
loop?: number;
|
|
12
|
+
} & WithSpringConfig) | ({
|
|
13
|
+
type: 'decay';
|
|
14
|
+
loop?: number;
|
|
15
|
+
} & WithDecayConfig);
|
|
16
|
+
export declare function createAnimations<A extends AnimationsConfig>(animations: A): AnimationDriver<A>;
|
|
17
|
+
export {};
|
|
3
18
|
//# sourceMappingURL=createAnimations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAnimations.d.ts","sourceRoot":"","sources":["../src/createAnimations.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"createAnimations.d.ts","sourceRoot":"","sources":["../src/createAnimations.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,OAAiB,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAQjB,MAAM,yBAAyB,CAAA;AAEhC,aAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI;KAC7C,GAAG,IAAI,MAAM,CAAC,GAAG,eAAe;CAClC,CAAA;AAED,aAAK,eAAe,GAChB,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACtD,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACtD,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAAC,CAAA;AASxD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EAAE,UAAU,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CA+J9F"}
|