@tamagui/animations-reanimated 1.0.0-beta.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.
@@ -0,0 +1,289 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
21
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
+ var createAnimations_exports = {};
23
+ __export(createAnimations_exports, {
24
+ createAnimations: () => createAnimations
25
+ });
26
+ module.exports = __toCommonJS(createAnimations_exports);
27
+ var import_animate_presence = require("@tamagui/animate-presence");
28
+ var import_react = require("react");
29
+ var import_react_native_reanimated = __toESM(require("react-native-reanimated"));
30
+ const AnimatedView = import_react_native_reanimated.default.View;
31
+ const AnimatedText = import_react_native_reanimated.default.Text;
32
+ AnimatedView["displayName"] = "AnimatedView";
33
+ AnimatedText["displayName"] = "AnimatedText";
34
+ function createAnimations(animations) {
35
+ return {
36
+ avoidClasses: true,
37
+ animations,
38
+ View: AnimatedView,
39
+ Text: AnimatedText,
40
+ useAnimations: (props, helpers) => {
41
+ var _a, _b;
42
+ const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers;
43
+ const [isEntering, safeToUnmount] = (0, import_animate_presence.useEntering)();
44
+ const presence = (0, import_react.useContext)(import_animate_presence.AnimatePresenceContext);
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);
48
+ }, [onDidAnimate]);
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];
64
+ }
65
+ }
66
+ const args = [
67
+ JSON.stringify(all),
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
+ ];
80
+ const animatedStyle = (0, import_react_native_reanimated.useAnimatedStyle)(() => {
81
+ const style = animatedStyles;
82
+ const final = {
83
+ transform: []
84
+ };
85
+ const isExiting = isEntering === false;
86
+ const transition = animations[props.animation];
87
+ const exitingStyleProps = {};
88
+ if (exitStyle) {
89
+ for (const key of Object.keys(exitStyle)) {
90
+ exitingStyleProps[key] = true;
91
+ }
92
+ }
93
+ for (const key in style) {
94
+ const value = style[key];
95
+ const aconf = animationConfig(key, transition);
96
+ const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf;
97
+ const callback = /* @__PURE__ */ __name((completed, recentValue) => {
98
+ (0, import_react_native_reanimated.runOnJS)(reanimatedOnDidAnimated)(key, completed, recentValue, {
99
+ attemptedValue: value
100
+ });
101
+ if (isExiting) {
102
+ exitingStyleProps[key] = false;
103
+ const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
104
+ if (!areStylesExiting) {
105
+ if (safeToUnmount) {
106
+ (0, import_react_native_reanimated.runOnJS)(safeToUnmount)();
107
+ }
108
+ }
109
+ }
110
+ }, "callback");
111
+ let { delayMs = null } = animationDelay(key, transition, delay);
112
+ if (key === "transform") {
113
+ if (!Array.isArray(value)) {
114
+ console.error(`Invalid transform value. Needs to be an array.`);
115
+ continue;
116
+ }
117
+ for (const transformObject of value) {
118
+ const key2 = Object.keys(transformObject)[0];
119
+ const transformValue = transformObject[key2];
120
+ let finalValue2 = animation(transformValue, config, callback);
121
+ if (shouldRepeat) {
122
+ finalValue2 = (0, import_react_native_reanimated.withRepeat)(finalValue2, repeatCount, repeatReverse);
123
+ }
124
+ final["transform"].push({
125
+ [key2]: finalValue2
126
+ });
127
+ }
128
+ continue;
129
+ }
130
+ if (typeof value === "object") {
131
+ final[key] = {};
132
+ for (const innerStyleKey of Object.keys(value || {})) {
133
+ let finalValue2 = animation(value, config, callback);
134
+ if (shouldRepeat) {
135
+ finalValue2 = (0, import_react_native_reanimated.withRepeat)(finalValue2, repeatCount, repeatReverse);
136
+ }
137
+ if (delayMs != null) {
138
+ final[key][innerStyleKey] = (0, import_react_native_reanimated.withDelay)(delayMs, finalValue2);
139
+ } else {
140
+ final[key][innerStyleKey] = finalValue2;
141
+ }
142
+ }
143
+ continue;
144
+ }
145
+ let finalValue = animation(value, config, callback);
146
+ if (shouldRepeat) {
147
+ finalValue = (0, import_react_native_reanimated.withRepeat)(finalValue, repeatCount, repeatReverse);
148
+ }
149
+ if (delayMs != null && typeof delayMs === "number") {
150
+ final[key] = (0, import_react_native_reanimated.withDelay)(delayMs, finalValue);
151
+ } else {
152
+ final[key] = finalValue;
153
+ }
154
+ }
155
+ if (process.env.NODE_ENV === "development" && props["debug"]) {
156
+ console.log("animation style", final);
157
+ }
158
+ return final;
159
+ }, args);
160
+ return (0, import_react.useMemo)(() => {
161
+ return {
162
+ style: [nonAnimatedStyle, animatedStyle]
163
+ };
164
+ }, args);
165
+ }
166
+ };
167
+ }
168
+ __name(createAnimations, "createAnimations");
169
+ function animationDelay(key, transition, defaultDelay) {
170
+ "worklet";
171
+ if (!transition || !transition[key] || transition[key].delayMs === void 0 || transition[key].delayMs === null) {
172
+ return {
173
+ delayMs: null
174
+ };
175
+ }
176
+ return {
177
+ delayMs: transition[key].delayMs
178
+ };
179
+ }
180
+ __name(animationDelay, "animationDelay");
181
+ const isColor = /* @__PURE__ */ __name((styleKey) => {
182
+ "worklet";
183
+ return [
184
+ "backgroundColor",
185
+ "borderBottomColor",
186
+ "borderColor",
187
+ "borderEndColor",
188
+ "borderLeftColor",
189
+ "borderRightColor",
190
+ "borderStartColor",
191
+ "borderTopColor",
192
+ "color"
193
+ ].includes(styleKey);
194
+ }, "isColor");
195
+ function animationConfig(styleProp, transition) {
196
+ var _a, _b, _c, _d, _e;
197
+ "worklet";
198
+ const key = styleProp;
199
+ let repeatCount = 0;
200
+ let repeatReverse = true;
201
+ let animationType = "spring";
202
+ if (isColor(key) || key === "opacity") {
203
+ animationType = "timing";
204
+ }
205
+ if (!transition) {
206
+ return {};
207
+ }
208
+ if ((_a = transition[key]) == null ? void 0 : _a.type) {
209
+ animationType = (_b = transition[key]) == null ? void 0 : _b.type;
210
+ } else if (transition.type) {
211
+ animationType = transition.type;
212
+ }
213
+ const loop = ((_c = transition[key]) == null ? void 0 : _c.loop) || transition.loop || null;
214
+ if (loop != null) {
215
+ repeatCount = loop ? -1 : 0;
216
+ }
217
+ let config = {};
218
+ let animation;
219
+ if (animationType === "timing") {
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);
222
+ if (easing) {
223
+ config["easing"] = easing;
224
+ }
225
+ if (duration != null) {
226
+ config["duration"] = duration;
227
+ }
228
+ animation = import_react_native_reanimated.withTiming;
229
+ } else if (animationType === "spring") {
230
+ animation = import_react_native_reanimated.withSpring;
231
+ config = {};
232
+ configKeys.forEach((configKey) => {
233
+ var _a2;
234
+ "worklet";
235
+ const styleSpecificConfig = (_a2 = transition == null ? void 0 : transition[key]) == null ? void 0 : _a2[configKey];
236
+ const transitionConfigForKey = transition == null ? void 0 : transition[configKey];
237
+ if (styleSpecificConfig != null) {
238
+ config[configKey] = styleSpecificConfig;
239
+ } else if (transitionConfigForKey != null) {
240
+ config[configKey] = transitionConfigForKey;
241
+ }
242
+ });
243
+ } else if (animationType === "decay") {
244
+ animation = import_react_native_reanimated.withDecay;
245
+ config = {
246
+ velocity: 2,
247
+ deceleration: 2
248
+ };
249
+ const configKeys2 = [
250
+ "clamp",
251
+ "velocity",
252
+ "deceleration",
253
+ "velocityFactor"
254
+ ];
255
+ configKeys2.forEach((configKey) => {
256
+ var _a2;
257
+ "worklet";
258
+ const styleSpecificConfig = (_a2 = transition == null ? void 0 : transition[key]) == null ? void 0 : _a2[configKey];
259
+ const transitionConfigForKey = transition == null ? void 0 : transition[configKey];
260
+ if (styleSpecificConfig != null) {
261
+ config[configKey] = styleSpecificConfig;
262
+ } else if (transitionConfigForKey != null) {
263
+ config[configKey] = transitionConfigForKey;
264
+ }
265
+ });
266
+ }
267
+ return {
268
+ animation,
269
+ config,
270
+ repeatReverse,
271
+ repeatCount,
272
+ shouldRepeat: !!repeatCount
273
+ };
274
+ }
275
+ __name(animationConfig, "animationConfig");
276
+ const configKeys = [
277
+ "damping",
278
+ "mass",
279
+ "overshootClamping",
280
+ "restDisplacementThreshold",
281
+ "restSpeedThreshold",
282
+ "stiffness",
283
+ "velocity"
284
+ ];
285
+ // Annotate the CommonJS export names for ESM import in node:
286
+ 0 && (module.exports = {
287
+ createAnimations
288
+ });
289
+ //# sourceMappingURL=createAnimations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/createAnimations.tsx"],
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(all),\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
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var src_exports = {};
16
+ module.exports = __toCommonJS(src_exports);
17
+ var import_polyfill = require("./polyfill");
18
+ __reExport(src_exports, require("./createAnimations"), module.exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.tsx"],
4
+ "sourcesContent": ["import './polyfill'\n\nexport * from './createAnimations'\n"],
5
+ "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;AAAA,sBAAO;AAEP,wBAAc,+BAFd;",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ if (typeof requestAnimationFrame === "undefined") {
2
+ globalThis["requestAnimationFrame"] = setImmediate;
3
+ }
4
+ //# sourceMappingURL=polyfill.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/polyfill.ts"],
4
+ "sourcesContent": ["// for SSR\nif (typeof requestAnimationFrame === 'undefined') {\n globalThis['requestAnimationFrame'] = setImmediate\n}\n"],
5
+ "mappings": "AACA,IAAI,OAAO,0BAA0B,aAAa;AAChD,aAAW,2BAA2B;AACxC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,272 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { AnimatePresenceContext, useEntering } from "@tamagui/animate-presence";
4
+ import { useCallback, useContext, useMemo } from "react";
5
+ import Animated, {
6
+ runOnJS,
7
+ useAnimatedStyle,
8
+ withDecay,
9
+ withDelay,
10
+ withRepeat,
11
+ withSpring,
12
+ withTiming
13
+ } from "react-native-reanimated";
14
+ const AnimatedView = Animated.View;
15
+ const AnimatedText = Animated.Text;
16
+ AnimatedView["displayName"] = "AnimatedView";
17
+ AnimatedText["displayName"] = "AnimatedText";
18
+ function createAnimations(animations) {
19
+ return {
20
+ avoidClasses: true,
21
+ animations,
22
+ View: AnimatedView,
23
+ Text: AnimatedText,
24
+ useAnimations: (props, helpers) => {
25
+ var _a, _b;
26
+ const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers;
27
+ const [isEntering, safeToUnmount] = useEntering();
28
+ const presence = useContext(AnimatePresenceContext);
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);
32
+ }, [onDidAnimate]);
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];
48
+ }
49
+ }
50
+ const args = [
51
+ JSON.stringify(all),
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
+ ];
64
+ const animatedStyle = useAnimatedStyle(() => {
65
+ const style = animatedStyles;
66
+ const final = {
67
+ transform: []
68
+ };
69
+ const isExiting = isEntering === false;
70
+ const transition = animations[props.animation];
71
+ const exitingStyleProps = {};
72
+ if (exitStyle) {
73
+ for (const key of Object.keys(exitStyle)) {
74
+ exitingStyleProps[key] = true;
75
+ }
76
+ }
77
+ for (const key in style) {
78
+ const value = style[key];
79
+ const aconf = animationConfig(key, transition);
80
+ const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf;
81
+ const callback = /* @__PURE__ */ __name((completed, recentValue) => {
82
+ runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {
83
+ attemptedValue: value
84
+ });
85
+ if (isExiting) {
86
+ exitingStyleProps[key] = false;
87
+ const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
88
+ if (!areStylesExiting) {
89
+ if (safeToUnmount) {
90
+ runOnJS(safeToUnmount)();
91
+ }
92
+ }
93
+ }
94
+ }, "callback");
95
+ let { delayMs = null } = animationDelay(key, transition, delay);
96
+ if (key === "transform") {
97
+ if (!Array.isArray(value)) {
98
+ console.error(`Invalid transform value. Needs to be an array.`);
99
+ continue;
100
+ }
101
+ for (const transformObject of value) {
102
+ const key2 = Object.keys(transformObject)[0];
103
+ const transformValue = transformObject[key2];
104
+ let finalValue2 = animation(transformValue, config, callback);
105
+ if (shouldRepeat) {
106
+ finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
107
+ }
108
+ final["transform"].push({
109
+ [key2]: finalValue2
110
+ });
111
+ }
112
+ continue;
113
+ }
114
+ if (typeof value === "object") {
115
+ final[key] = {};
116
+ for (const innerStyleKey of Object.keys(value || {})) {
117
+ let finalValue2 = animation(value, config, callback);
118
+ if (shouldRepeat) {
119
+ finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
120
+ }
121
+ if (delayMs != null) {
122
+ final[key][innerStyleKey] = withDelay(delayMs, finalValue2);
123
+ } else {
124
+ final[key][innerStyleKey] = finalValue2;
125
+ }
126
+ }
127
+ continue;
128
+ }
129
+ let finalValue = animation(value, config, callback);
130
+ if (shouldRepeat) {
131
+ finalValue = withRepeat(finalValue, repeatCount, repeatReverse);
132
+ }
133
+ if (delayMs != null && typeof delayMs === "number") {
134
+ final[key] = withDelay(delayMs, finalValue);
135
+ } else {
136
+ final[key] = finalValue;
137
+ }
138
+ }
139
+ if (process.env.NODE_ENV === "development" && props["debug"]) {
140
+ console.log("animation style", final);
141
+ }
142
+ return final;
143
+ }, args);
144
+ return useMemo(() => {
145
+ return {
146
+ style: [nonAnimatedStyle, animatedStyle]
147
+ };
148
+ }, args);
149
+ }
150
+ };
151
+ }
152
+ __name(createAnimations, "createAnimations");
153
+ function animationDelay(key, transition, defaultDelay) {
154
+ "worklet";
155
+ if (!transition || !transition[key] || transition[key].delayMs === void 0 || transition[key].delayMs === null) {
156
+ return {
157
+ delayMs: null
158
+ };
159
+ }
160
+ return {
161
+ delayMs: transition[key].delayMs
162
+ };
163
+ }
164
+ __name(animationDelay, "animationDelay");
165
+ const isColor = /* @__PURE__ */ __name((styleKey) => {
166
+ "worklet";
167
+ return [
168
+ "backgroundColor",
169
+ "borderBottomColor",
170
+ "borderColor",
171
+ "borderEndColor",
172
+ "borderLeftColor",
173
+ "borderRightColor",
174
+ "borderStartColor",
175
+ "borderTopColor",
176
+ "color"
177
+ ].includes(styleKey);
178
+ }, "isColor");
179
+ function animationConfig(styleProp, transition) {
180
+ var _a, _b, _c, _d, _e, _f, _g;
181
+ "worklet";
182
+ const key = styleProp;
183
+ let repeatCount = 0;
184
+ let repeatReverse = true;
185
+ let animationType = "spring";
186
+ if (isColor(key) || key === "opacity") {
187
+ animationType = "timing";
188
+ }
189
+ if (!transition) {
190
+ return {};
191
+ }
192
+ if ((_a = transition[key]) == null ? void 0 : _a.type) {
193
+ animationType = (_b = transition[key]) == null ? void 0 : _b.type;
194
+ } else if (transition.type) {
195
+ animationType = transition.type;
196
+ }
197
+ const loop = ((_c = transition[key]) == null ? void 0 : _c.loop) || transition.loop || null;
198
+ if (loop != null) {
199
+ repeatCount = loop ? -1 : 0;
200
+ }
201
+ let config = {};
202
+ let animation;
203
+ if (animationType === "timing") {
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;
206
+ if (easing) {
207
+ config["easing"] = easing;
208
+ }
209
+ if (duration != null) {
210
+ config["duration"] = duration;
211
+ }
212
+ animation = withTiming;
213
+ } else if (animationType === "spring") {
214
+ animation = withSpring;
215
+ config = {};
216
+ configKeys.forEach((configKey) => {
217
+ var _a2;
218
+ "worklet";
219
+ const styleSpecificConfig = (_a2 = transition == null ? void 0 : transition[key]) == null ? void 0 : _a2[configKey];
220
+ const transitionConfigForKey = transition == null ? void 0 : transition[configKey];
221
+ if (styleSpecificConfig != null) {
222
+ config[configKey] = styleSpecificConfig;
223
+ } else if (transitionConfigForKey != null) {
224
+ config[configKey] = transitionConfigForKey;
225
+ }
226
+ });
227
+ } else if (animationType === "decay") {
228
+ animation = withDecay;
229
+ config = {
230
+ velocity: 2,
231
+ deceleration: 2
232
+ };
233
+ const configKeys2 = [
234
+ "clamp",
235
+ "velocity",
236
+ "deceleration",
237
+ "velocityFactor"
238
+ ];
239
+ configKeys2.forEach((configKey) => {
240
+ var _a2;
241
+ "worklet";
242
+ const styleSpecificConfig = (_a2 = transition == null ? void 0 : transition[key]) == null ? void 0 : _a2[configKey];
243
+ const transitionConfigForKey = transition == null ? void 0 : transition[configKey];
244
+ if (styleSpecificConfig != null) {
245
+ config[configKey] = styleSpecificConfig;
246
+ } else if (transitionConfigForKey != null) {
247
+ config[configKey] = transitionConfigForKey;
248
+ }
249
+ });
250
+ }
251
+ return {
252
+ animation,
253
+ config,
254
+ repeatReverse,
255
+ repeatCount,
256
+ shouldRepeat: !!repeatCount
257
+ };
258
+ }
259
+ __name(animationConfig, "animationConfig");
260
+ const configKeys = [
261
+ "damping",
262
+ "mass",
263
+ "overshootClamping",
264
+ "restDisplacementThreshold",
265
+ "restSpeedThreshold",
266
+ "stiffness",
267
+ "velocity"
268
+ ];
269
+ export {
270
+ createAnimations
271
+ };
272
+ //# sourceMappingURL=createAnimations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/createAnimations.tsx"],
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(all),\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
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import "./polyfill";
2
+ export * from "./createAnimations";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.tsx"],
4
+ "sourcesContent": ["import './polyfill'\n\nexport * from './createAnimations'\n"],
5
+ "mappings": "AAAA;AAEA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ if (typeof requestAnimationFrame === "undefined") {
2
+ globalThis["requestAnimationFrame"] = setImmediate;
3
+ }
4
+ //# sourceMappingURL=polyfill.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/polyfill.ts"],
4
+ "sourcesContent": ["// for SSR\nif (typeof requestAnimationFrame === 'undefined') {\n globalThis['requestAnimationFrame'] = setImmediate\n}\n"],
5
+ "mappings": "AACA,IAAI,OAAO,0BAA0B,aAAa;AAChD,aAAW,2BAA2B;AACxC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,271 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { AnimatePresenceContext, useEntering } from "@tamagui/animate-presence";
4
+ import { useCallback, useContext, useMemo } from "react";
5
+ import Animated, {
6
+ runOnJS,
7
+ useAnimatedStyle,
8
+ withDecay,
9
+ withDelay,
10
+ withRepeat,
11
+ withSpring,
12
+ withTiming
13
+ } from "react-native-reanimated";
14
+ const AnimatedView = Animated.View;
15
+ const AnimatedText = Animated.Text;
16
+ AnimatedView["displayName"] = "AnimatedView";
17
+ AnimatedText["displayName"] = "AnimatedText";
18
+ function createAnimations(animations) {
19
+ return {
20
+ avoidClasses: true,
21
+ animations,
22
+ View: AnimatedView,
23
+ Text: AnimatedText,
24
+ useAnimations: (props, helpers) => {
25
+ var _a, _b;
26
+ const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers;
27
+ const [isEntering, safeToUnmount] = useEntering();
28
+ const presence = useContext(AnimatePresenceContext);
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);
32
+ }, [onDidAnimate]);
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];
48
+ }
49
+ }
50
+ const args = [
51
+ JSON.stringify(all),
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
+ ];
64
+ const animatedStyle = useAnimatedStyle(() => {
65
+ const style = animatedStyles;
66
+ const final = {
67
+ transform: []
68
+ };
69
+ const isExiting = isEntering === false;
70
+ const transition = animations[props.animation];
71
+ const exitingStyleProps = {};
72
+ if (exitStyle) {
73
+ for (const key of Object.keys(exitStyle)) {
74
+ exitingStyleProps[key] = true;
75
+ }
76
+ }
77
+ for (const key in style) {
78
+ const value = style[key];
79
+ const aconf = animationConfig(key, transition);
80
+ const { animation, config, shouldRepeat, repeatCount, repeatReverse } = aconf;
81
+ const callback = /* @__PURE__ */ __name((completed, recentValue) => {
82
+ runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {
83
+ attemptedValue: value
84
+ });
85
+ if (isExiting) {
86
+ exitingStyleProps[key] = false;
87
+ const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
88
+ if (!areStylesExiting) {
89
+ if (safeToUnmount) {
90
+ runOnJS(safeToUnmount)();
91
+ }
92
+ }
93
+ }
94
+ }, "callback");
95
+ let { delayMs = null } = animationDelay(key, transition, delay);
96
+ if (key === "transform") {
97
+ if (!Array.isArray(value)) {
98
+ console.error(`Invalid transform value. Needs to be an array.`);
99
+ continue;
100
+ }
101
+ for (const transformObject of value) {
102
+ const key2 = Object.keys(transformObject)[0];
103
+ const transformValue = transformObject[key2];
104
+ let finalValue2 = animation(transformValue, config, callback);
105
+ if (shouldRepeat) {
106
+ finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
107
+ }
108
+ final["transform"].push({
109
+ [key2]: finalValue2
110
+ });
111
+ }
112
+ continue;
113
+ }
114
+ if (typeof value === "object") {
115
+ final[key] = {};
116
+ for (const innerStyleKey of Object.keys(value || {})) {
117
+ let finalValue2 = animation(value, config, callback);
118
+ if (shouldRepeat) {
119
+ finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
120
+ }
121
+ if (delayMs != null) {
122
+ final[key][innerStyleKey] = withDelay(delayMs, finalValue2);
123
+ } else {
124
+ final[key][innerStyleKey] = finalValue2;
125
+ }
126
+ }
127
+ continue;
128
+ }
129
+ let finalValue = animation(value, config, callback);
130
+ if (shouldRepeat) {
131
+ finalValue = withRepeat(finalValue, repeatCount, repeatReverse);
132
+ }
133
+ if (delayMs != null && typeof delayMs === "number") {
134
+ final[key] = withDelay(delayMs, finalValue);
135
+ } else {
136
+ final[key] = finalValue;
137
+ }
138
+ }
139
+ if (process.env.NODE_ENV === "development" && props["debug"]) {
140
+ console.log("animation style", final);
141
+ }
142
+ return final;
143
+ }, args);
144
+ return useMemo(() => {
145
+ return {
146
+ style: [nonAnimatedStyle, animatedStyle]
147
+ };
148
+ }, args);
149
+ }
150
+ };
151
+ }
152
+ __name(createAnimations, "createAnimations");
153
+ function animationDelay(key, transition, defaultDelay) {
154
+ "worklet";
155
+ if (!transition || !transition[key] || transition[key].delayMs === void 0 || transition[key].delayMs === null) {
156
+ return {
157
+ delayMs: null
158
+ };
159
+ }
160
+ return {
161
+ delayMs: transition[key].delayMs
162
+ };
163
+ }
164
+ __name(animationDelay, "animationDelay");
165
+ const isColor = /* @__PURE__ */ __name((styleKey) => {
166
+ "worklet";
167
+ return [
168
+ "backgroundColor",
169
+ "borderBottomColor",
170
+ "borderColor",
171
+ "borderEndColor",
172
+ "borderLeftColor",
173
+ "borderRightColor",
174
+ "borderStartColor",
175
+ "borderTopColor",
176
+ "color"
177
+ ].includes(styleKey);
178
+ }, "isColor");
179
+ function animationConfig(styleProp, transition) {
180
+ var _a, _b, _c, _d, _e, _f, _g;
181
+ "worklet";
182
+ const key = styleProp;
183
+ let repeatCount = 0;
184
+ let repeatReverse = true;
185
+ let animationType = "spring";
186
+ if (isColor(key) || key === "opacity") {
187
+ animationType = "timing";
188
+ }
189
+ if (!transition) {
190
+ return {};
191
+ }
192
+ if ((_a = transition[key]) == null ? void 0 : _a.type) {
193
+ animationType = (_b = transition[key]) == null ? void 0 : _b.type;
194
+ } else if (transition.type) {
195
+ animationType = transition.type;
196
+ }
197
+ const loop = ((_c = transition[key]) == null ? void 0 : _c.loop) || transition.loop || null;
198
+ if (loop != null) {
199
+ repeatCount = loop ? -1 : 0;
200
+ }
201
+ let config = {};
202
+ let animation;
203
+ if (animationType === "timing") {
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;
206
+ if (easing) {
207
+ config["easing"] = easing;
208
+ }
209
+ if (duration != null) {
210
+ config["duration"] = duration;
211
+ }
212
+ animation = withTiming;
213
+ } else if (animationType === "spring") {
214
+ animation = withSpring;
215
+ config = {};
216
+ configKeys.forEach((configKey) => {
217
+ var _a2;
218
+ "worklet";
219
+ const styleSpecificConfig = (_a2 = transition == null ? void 0 : transition[key]) == null ? void 0 : _a2[configKey];
220
+ const transitionConfigForKey = transition == null ? void 0 : transition[configKey];
221
+ if (styleSpecificConfig != null) {
222
+ config[configKey] = styleSpecificConfig;
223
+ } else if (transitionConfigForKey != null) {
224
+ config[configKey] = transitionConfigForKey;
225
+ }
226
+ });
227
+ } else if (animationType === "decay") {
228
+ animation = withDecay;
229
+ config = {
230
+ velocity: 2,
231
+ deceleration: 2
232
+ };
233
+ const configKeys2 = [
234
+ "clamp",
235
+ "velocity",
236
+ "deceleration",
237
+ "velocityFactor"
238
+ ];
239
+ configKeys2.forEach((configKey) => {
240
+ var _a2;
241
+ "worklet";
242
+ const styleSpecificConfig = (_a2 = transition == null ? void 0 : transition[key]) == null ? void 0 : _a2[configKey];
243
+ const transitionConfigForKey = transition == null ? void 0 : transition[configKey];
244
+ if (styleSpecificConfig != null) {
245
+ config[configKey] = styleSpecificConfig;
246
+ } else if (transitionConfigForKey != null) {
247
+ config[configKey] = transitionConfigForKey;
248
+ }
249
+ });
250
+ }
251
+ return {
252
+ animation,
253
+ config,
254
+ repeatReverse,
255
+ repeatCount,
256
+ shouldRepeat: !!repeatCount
257
+ };
258
+ }
259
+ __name(animationConfig, "animationConfig");
260
+ const configKeys = [
261
+ "damping",
262
+ "mass",
263
+ "overshootClamping",
264
+ "restDisplacementThreshold",
265
+ "restSpeedThreshold",
266
+ "stiffness",
267
+ "velocity"
268
+ ];
269
+ export {
270
+ createAnimations
271
+ };
@@ -0,0 +1,2 @@
1
+ import "./polyfill";
2
+ export * from "./createAnimations";
@@ -0,0 +1,3 @@
1
+ if (typeof requestAnimationFrame === "undefined") {
2
+ globalThis["requestAnimationFrame"] = setImmediate;
3
+ }
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@tamagui/animations-reanimated",
3
+ "version": "1.0.0-beta.0",
4
+ "source": "src/index.ts",
5
+ "license": "MIT",
6
+ "typings": "types",
7
+ "main": "dist/cjs",
8
+ "module": "dist/esm",
9
+ "module:jsx": "dist/jsx",
10
+ "files": [
11
+ "types",
12
+ "dist"
13
+ ],
14
+ "dependencies": {
15
+ "@tamagui/animate-presence": "^1.0.0-beta.0",
16
+ "@tamagui/core": "^1.0.0-beta.0",
17
+ "react-native-reanimated": "^2.8.0"
18
+ },
19
+ "devDependencies": {
20
+ "@tamagui/build": "^1.0.0-beta.0"
21
+ },
22
+ "scripts": {
23
+ "build": "tamagui-build",
24
+ "watch": "tamagui-build --watch",
25
+ "clean": "tamagui-build clean",
26
+ "clean:build": "tamagui-build clean:build"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "gitHead": "a49cc7ea6b93ba384e77a4880ae48ac4a5635c14"
32
+ }
@@ -0,0 +1,18 @@
1
+ import { AnimationDriver } from '@tamagui/core';
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 {};
18
+ //# sourceMappingURL=createAnimations.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,3 @@
1
+ import './polyfill';
2
+ export * from './createAnimations';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAA;AAEnB,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=polyfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":""}