@tamagui/animations-reanimated 1.0.1-beta.21 → 1.0.1-beta.210

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.
@@ -1,7 +1,7 @@
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";
1
+ import { useEvent } from "@tamagui/core";
2
+ import { PresenceContext, usePresence } from "@tamagui/use-presence";
3
+ import { useContext, useMemo } from "react";
4
+ import { FlatList, Animated as RNAnimated } from "react-native";
5
5
  import Animated, {
6
6
  runOnJS,
7
7
  useAnimatedStyle,
@@ -11,146 +11,195 @@ import Animated, {
11
11
  withSpring,
12
12
  withTiming
13
13
  } from "react-native-reanimated";
14
+ import {
15
+ useAnimatedNumber,
16
+ useAnimatedNumberReaction,
17
+ useAnimatedNumberStyle
18
+ } from "./useAnimatedNumber";
19
+ if (process.env.NODE_ENV === "development") {
20
+ if (FlatList?.["_isProxyWorm"]) {
21
+ console.warn(
22
+ `Using reanimated with excludeReactNativeWebExports including FlatList, adjust your next.config.js, reanimated currently doesn't support tree-shaking and needs *List components around.`
23
+ );
24
+ }
25
+ }
26
+ const animatedStyleKey = {
27
+ transform: true,
28
+ opacity: true
29
+ };
14
30
  function createAnimations(animations) {
15
31
  const AnimatedView = Animated.View;
16
32
  const AnimatedText = Animated.Text;
17
33
  AnimatedView["displayName"] = "AnimatedView";
18
34
  AnimatedText["displayName"] = "AnimatedText";
19
35
  return {
20
- avoidClasses: true,
36
+ isReactNative: true,
21
37
  animations,
22
38
  View: AnimatedView,
23
39
  Text: AnimatedText,
40
+ NumberView: RNAnimated.View,
41
+ useAnimatedNumber,
42
+ useAnimatedNumberReaction,
43
+ useAnimatedNumberStyle,
24
44
  useAnimations: (props, helpers) => {
25
- var _a, _b;
26
45
  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]);
46
+ const [isPresent, sendExitComplete] = usePresence();
47
+ const presence = useContext(PresenceContext);
48
+ const exitStyle = presence?.exitVariant ? staticConfig.variantsParsed?.[presence.exitVariant]?.true || pseudos.exitStyle : pseudos.exitStyle;
49
+ const reanimatedOnDidAnimated = useEvent((...args) => {
50
+ onDidAnimate?.(...args);
51
+ });
52
+ const isExiting = isPresent === false;
53
+ const isEntering = !state.mounted;
33
54
  const all = getStyle({
55
+ isExiting,
34
56
  isEntering,
35
- exitVariant: presence == null ? void 0 : presence.exitVariant,
36
- enterVariant: presence == null ? void 0 : presence.enterVariant
57
+ exitVariant: presence?.exitVariant,
58
+ enterVariant: presence?.enterVariant
37
59
  });
38
60
  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];
61
+ for (const key2 of Object.keys(all)) {
62
+ if (animatedStyleKey[key2]) {
63
+ animatedStyles[key2] = all[key2];
46
64
  } else {
47
- nonAnimatedStyle[key] = all[key];
65
+ nonAnimatedStyle[key2] = all[key2];
48
66
  }
49
67
  }
50
- const args = [
51
- JSON.stringify(all),
68
+ const animatedString = JSON.stringify(animatedStyles);
69
+ const key = animatedString + JSON.stringify([
52
70
  state.mounted,
53
71
  state.hover,
54
72
  state.press,
55
73
  state.pressIn,
56
74
  state.focus,
57
75
  delay,
58
- isEntering,
76
+ isPresent,
59
77
  onDidAnimate,
60
- reanimatedOnDidAnimated,
61
- presence == null ? void 0 : presence.exitVariant,
62
- presence == null ? void 0 : presence.enterVariant
63
- ];
78
+ presence?.exitVariant,
79
+ presence?.enterVariant
80
+ ]);
81
+ const callback = (isExiting2, exitingStyleProps, key2, value) => {
82
+ "worklet";
83
+ return (completed, current) => {
84
+ "worklet";
85
+ runOnJS(reanimatedOnDidAnimated)(key2, completed, current, {
86
+ attemptedValue: value
87
+ });
88
+ if (isExiting2) {
89
+ exitingStyleProps[key2] = false;
90
+ const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
91
+ if (!areStylesExiting) {
92
+ if (sendExitComplete) {
93
+ runOnJS(sendExitComplete)();
94
+ }
95
+ }
96
+ }
97
+ };
98
+ };
64
99
  const animatedStyle = useAnimatedStyle(() => {
65
- const style = animatedStyles;
100
+ "worklet";
101
+ const style = JSON.parse(animatedString);
66
102
  const final = {
67
103
  transform: []
68
104
  };
69
- const isExiting = isEntering === false;
105
+ const isExiting2 = isPresent === false;
70
106
  const exitingStyleProps = {};
71
107
  if (exitStyle) {
72
- for (const key of Object.keys(exitStyle)) {
73
- exitingStyleProps[key] = true;
74
- }
75
- }
76
- for (const key in style) {
77
- const value = style[key];
78
- const animationConfig = getAnimationConfig(key, animations, props.animation);
79
- const { animation, config, shouldRepeat, repeatCount, repeatReverse } = getAnimation(key, animationConfig, props.animateOnly);
80
- const callback = /* @__PURE__ */ __name((completed, recentValue) => {
81
- runOnJS(reanimatedOnDidAnimated)(key, completed, recentValue, {
82
- attemptedValue: value
83
- });
84
- if (isExiting) {
85
- exitingStyleProps[key] = false;
86
- const areStylesExiting = Object.values(exitingStyleProps).some(Boolean);
87
- if (!areStylesExiting) {
88
- if (safeToUnmount) {
89
- runOnJS(safeToUnmount)();
90
- }
108
+ for (const key2 in exitStyle) {
109
+ if (key2 === "transform") {
110
+ for (const attr of exitStyle[key2]) {
111
+ const tkey = Object.keys(attr)[0];
112
+ exitingStyleProps[tkey] = true;
91
113
  }
114
+ } else {
115
+ exitingStyleProps[key2] = true;
92
116
  }
93
- }, "callback");
94
- let { delayMs = null } = animationDelay(key, animationConfig, delay);
95
- if (key === "transform") {
117
+ }
118
+ }
119
+ for (const key2 in style) {
120
+ const value = style[key2];
121
+ const animationConfig = getAnimationConfig(key2, animations, props.animation);
122
+ const { animation, config, shouldRepeat, repeatCount, repeatReverse } = getAnimation(
123
+ key2,
124
+ animationConfig,
125
+ props.animateOnly
126
+ );
127
+ const { delayMs = null } = animationDelay(key2, animationConfig, delay);
128
+ if (!animation) {
129
+ console.warn("No animation for", key2, "in", style);
130
+ continue;
131
+ }
132
+ if (!config) {
133
+ console.warn("No animation config for", key2, "in", style);
134
+ continue;
135
+ }
136
+ if (key2 === "transform") {
96
137
  if (!Array.isArray(value)) {
97
138
  console.error(`Invalid transform value. Needs to be an array.`);
98
139
  continue;
99
140
  }
100
141
  for (const transformObject of value) {
101
- const key2 = Object.keys(transformObject)[0];
102
- const transformValue = transformObject[key2];
103
- let finalValue2 = animation(transformValue, config, callback);
142
+ const key3 = Object.keys(transformObject)[0];
143
+ const transformValue = transformObject[key3];
144
+ let finalValue2 = animation(
145
+ transformValue,
146
+ config,
147
+ callback(isExiting2, exitingStyleProps, key3, value)
148
+ );
104
149
  if (shouldRepeat) {
105
150
  finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
106
151
  }
107
152
  final["transform"].push({
108
- [key2]: finalValue2
153
+ [key3]: finalValue2
109
154
  });
110
155
  }
111
156
  continue;
112
157
  }
113
158
  if (typeof value === "object") {
114
- final[key] = {};
159
+ final[key2] = {};
115
160
  for (const innerStyleKey of Object.keys(value || {})) {
116
- let finalValue2 = animation(value, config, callback);
161
+ let finalValue2 = animation(
162
+ value,
163
+ config,
164
+ callback(isExiting2, exitingStyleProps, key2, value)
165
+ );
117
166
  if (shouldRepeat) {
118
167
  finalValue2 = withRepeat(finalValue2, repeatCount, repeatReverse);
119
168
  }
120
169
  if (delayMs != null) {
121
- final[key][innerStyleKey] = withDelay(delayMs, finalValue2);
170
+ final[key2][innerStyleKey] = withDelay(delayMs, finalValue2);
122
171
  } else {
123
- final[key][innerStyleKey] = finalValue2;
172
+ final[key2][innerStyleKey] = finalValue2;
124
173
  }
125
174
  }
126
175
  continue;
127
176
  }
128
- let finalValue = animation(value, config, callback);
177
+ let finalValue = animation(
178
+ value,
179
+ config,
180
+ callback(isExiting2, exitingStyleProps, key2, value)
181
+ );
129
182
  if (shouldRepeat) {
130
183
  finalValue = withRepeat(finalValue, repeatCount, repeatReverse);
131
184
  }
132
185
  if (delayMs != null && typeof delayMs === "number") {
133
- final[key] = withDelay(delayMs, finalValue);
186
+ final[key2] = withDelay(delayMs, finalValue);
134
187
  } else {
135
- final[key] = finalValue;
188
+ final[key2] = finalValue;
136
189
  }
137
190
  }
138
- if (process.env.NODE_ENV === "development" && props["debug"]) {
139
- console.log("animation style", final);
140
- }
141
191
  return final;
142
- }, args);
192
+ }, [key]);
143
193
  return useMemo(() => {
144
194
  return {
145
195
  style: [nonAnimatedStyle, animatedStyle]
146
196
  };
147
- }, args);
197
+ }, [key]);
148
198
  }
149
199
  };
150
200
  }
151
- __name(createAnimations, "createAnimations");
152
201
  function getAnimationConfig(key, animations, animation) {
153
- var _a;
202
+ "worklet";
154
203
  if (typeof animation === "string") {
155
204
  return animations[animation];
156
205
  }
@@ -158,7 +207,7 @@ function getAnimationConfig(key, animations, animation) {
158
207
  let extraConf;
159
208
  if (Array.isArray(animation)) {
160
209
  type = animation[0];
161
- const conf = (_a = animation[1]) == null ? void 0 : _a[key];
210
+ const conf = animation[1] && animation[1][key];
162
211
  if (conf) {
163
212
  if (typeof conf === "string") {
164
213
  type = conf;
@@ -168,8 +217,8 @@ function getAnimationConfig(key, animations, animation) {
168
217
  }
169
218
  }
170
219
  } else {
171
- const val = animation == null ? void 0 : animation[key];
172
- type = val == null ? void 0 : val.type;
220
+ const val = animation?.[key];
221
+ type = val?.type;
173
222
  extraConf = val;
174
223
  }
175
224
  const found = animations[type];
@@ -182,7 +231,6 @@ function getAnimationConfig(key, animations, animation) {
182
231
  type: found.type
183
232
  };
184
233
  }
185
- __name(getAnimationConfig, "getAnimationConfig");
186
234
  function animationDelay(key, animation, defaultDelay) {
187
235
  "worklet";
188
236
  if (!animation || !animation[key] || animation[key].delayMs === void 0 || animation[key].delayMs === null) {
@@ -194,8 +242,7 @@ function animationDelay(key, animation, defaultDelay) {
194
242
  delayMs: animation[key].delayMs
195
243
  };
196
244
  }
197
- __name(animationDelay, "animationDelay");
198
- const isColor = /* @__PURE__ */ __name((styleKey) => {
245
+ const isColor = (styleKey) => {
199
246
  "worklet";
200
247
  return [
201
248
  "backgroundColor",
@@ -208,15 +255,15 @@ const isColor = /* @__PURE__ */ __name((styleKey) => {
208
255
  "borderTopColor",
209
256
  "color"
210
257
  ].includes(styleKey);
211
- }, "isColor");
258
+ };
212
259
  function getAnimation(key, animationConfig, animateOnly) {
213
260
  "worklet";
214
261
  if (!animationConfig || animateOnly && !animateOnly.includes(key)) {
215
262
  return {};
216
263
  }
217
264
  let repeatCount = 0;
218
- let repeatReverse = animationConfig.repeatReverse || false;
219
- let animationType = (animationConfig == null ? void 0 : animationConfig.type) || "spring";
265
+ const repeatReverse = animationConfig.repeatReverse || false;
266
+ let animationType = animationConfig?.type || "spring";
220
267
  if (isColor(key) || key === "opacity") {
221
268
  animationType = "timing";
222
269
  }
@@ -240,7 +287,6 @@ function getAnimation(key, animationConfig, animateOnly) {
240
287
  deceleration: 2
241
288
  };
242
289
  } else {
243
- console.warn("no type of animation?", animationType);
244
290
  animation = withSpring;
245
291
  }
246
292
  return {
@@ -251,7 +297,7 @@ function getAnimation(key, animationConfig, animateOnly) {
251
297
  shouldRepeat: !!repeatCount
252
298
  };
253
299
  }
254
- __name(getAnimation, "getAnimation");
255
300
  export {
256
301
  createAnimations
257
302
  };
303
+ //# sourceMappingURL=createAnimations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/createAnimations.tsx"],
4
+ "sourcesContent": ["import { AnimationDriver, AnimationProp, useEvent } from '@tamagui/core'\nimport { PresenceContext, usePresence } from '@tamagui/use-presence'\nimport { useContext, useMemo } from 'react'\n// until we fix Sheet\nimport { FlatList, Animated as RNAnimated } from 'react-native'\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\nimport {\n useAnimatedNumber,\n useAnimatedNumberReaction,\n useAnimatedNumberStyle,\n} from './useAnimatedNumber'\n\n// add nice warning for if mis-configured next config:\nif (process.env.NODE_ENV === 'development') {\n if (FlatList?.['_isProxyWorm']) {\n // eslint-disable-next-line no-console\n console.warn(\n `Using reanimated with excludeReactNativeWebExports including FlatList, adjust your next.config.js, reanimated currently doesn't support tree-shaking and needs *List components around.`\n )\n }\n}\n\ntype AnimationsConfig<A extends Object = any> = {\n [Key in keyof A]: AnimationConfig\n}\n\ntype AnimationConfig =\n | ({ type: 'timing'; loop?: number; repeat?: number; repeatReverse?: boolean } & WithTimingConfig)\n | ({ type: 'spring'; loop?: number; repeat?: number; repeatReverse?: boolean } & WithSpringConfig)\n | ({ type: 'decay'; loop?: number; repeat?: number; repeatReverse?: boolean } & WithDecayConfig)\n\nconst animatedStyleKey = {\n transform: true,\n opacity: true,\n // backgroundColor: true,\n // color: true,\n}\n\nexport function createAnimations<A extends AnimationsConfig>(animations: A): AnimationDriver<A> {\n const AnimatedView = Animated.View\n const AnimatedText = Animated.Text\n\n AnimatedView['displayName'] = 'AnimatedView'\n AnimatedText['displayName'] = 'AnimatedText'\n\n return {\n isReactNative: true,\n animations,\n View: AnimatedView,\n Text: AnimatedText,\n\n // temp\n // @ts-ignore\n NumberView: RNAnimated.View,\n\n useAnimatedNumber,\n useAnimatedNumberReaction,\n useAnimatedNumberStyle,\n useAnimations: (props, helpers) => {\n const { pseudos, onDidAnimate, delay, getStyle, state, staticConfig } = helpers\n const [isPresent, sendExitComplete] = usePresence()\n const presence = useContext(PresenceContext)\n\n const exitStyle = presence?.exitVariant\n ? staticConfig.variantsParsed?.[presence.exitVariant]?.true || pseudos.exitStyle\n : pseudos.exitStyle\n\n const reanimatedOnDidAnimated = useEvent<NonNullable<typeof onDidAnimate>>((...args) => {\n onDidAnimate?.(...args)\n })\n\n const isExiting = isPresent === false\n const isEntering = !state.mounted\n\n const all = getStyle({\n isExiting,\n isEntering,\n exitVariant: presence?.exitVariant,\n enterVariant: presence?.enterVariant,\n })\n\n const [animatedStyles, nonAnimatedStyle] = [{}, {}]\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 animatedString = JSON.stringify(animatedStyles)\n const key =\n animatedString +\n JSON.stringify([\n state.mounted,\n state.hover,\n state.press,\n state.pressIn,\n state.focus,\n delay,\n isPresent,\n onDidAnimate,\n presence?.exitVariant,\n presence?.enterVariant,\n ])\n\n const callback = (\n isExiting: boolean,\n exitingStyleProps: Record<string, boolean>,\n key: string,\n value: any\n ) => {\n 'worklet'\n return (completed: boolean | undefined, current: any) => {\n 'worklet'\n runOnJS(reanimatedOnDidAnimated)(key, completed, current, {\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 (sendExitComplete) {\n runOnJS(sendExitComplete)()\n }\n }\n }\n }\n }\n\n const animatedStyle = useAnimatedStyle(() => {\n 'worklet'\n\n // getting issues with native unless this :/\n const style = JSON.parse(animatedString)\n\n const final = {\n transform: [] as any[],\n }\n\n const isExiting = isPresent === false\n\n const exitingStyleProps: Record<string, boolean> = {}\n if (exitStyle) {\n for (const key in exitStyle) {\n if (key === 'transform') {\n for (const attr of exitStyle[key]) {\n const tkey = Object.keys(attr)[0]\n exitingStyleProps[tkey] = true\n }\n } else {\n exitingStyleProps[key] = true\n }\n }\n }\n\n for (const key in style) {\n const value = style[key]\n const animationConfig = getAnimationConfig(key, animations, props.animation)\n const { animation, config, shouldRepeat, repeatCount, repeatReverse } = getAnimation(\n key,\n animationConfig,\n props.animateOnly\n )\n\n const { delayMs = null } = animationDelay(key, animationConfig, delay)\n\n if (!animation) {\n // eslint-disable-next-line no-console\n console.warn('No animation for', key, 'in', style)\n continue\n }\n if (!config) {\n // eslint-disable-next-line no-console\n console.warn('No animation config for', key, 'in', style)\n continue\n }\n\n if (key === 'transform') {\n if (!Array.isArray(value)) {\n // eslint-disable-next-line no-console\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(\n transformValue,\n config as any,\n callback(isExiting, exitingStyleProps, key, value)\n )\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(\n value,\n config as any,\n callback(isExiting, exitingStyleProps, key, value)\n )\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(\n value,\n config as any,\n callback(isExiting, exitingStyleProps, key, value)\n )\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 return final\n }, [key])\n\n return useMemo(() => {\n return {\n style: [nonAnimatedStyle, animatedStyle],\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n },\n }\n}\n\nfunction getAnimationConfig(key: string, animations: AnimationsConfig, animation?: AnimationProp) {\n 'worklet'\n if (typeof animation === 'string') {\n return animations[animation]\n }\n let type = ''\n let extraConf: any\n if (Array.isArray(animation)) {\n type = animation[0] as string\n const conf = animation[1] && animation[1][key]\n if (conf) {\n if (typeof conf === 'string') {\n type = conf\n } else {\n type = (conf as any).type || type\n extraConf = conf\n }\n }\n } else {\n const val = animation?.[key]\n type = val?.type\n extraConf = val\n }\n const found = animations[type]\n if (!found) {\n throw new Error(`No animation of type \"${type}\" for key \"${key}\"`)\n }\n return {\n ...found,\n ...extraConf,\n type: found.type,\n }\n}\n\nfunction animationDelay(\n key: string,\n animation: AnimationConfig | undefined,\n defaultDelay?: number\n) {\n 'worklet'\n if (\n !animation ||\n !animation[key] ||\n animation[key].delayMs === undefined ||\n animation[key].delayMs === null\n ) {\n return {\n delayMs: null,\n }\n }\n return {\n delayMs: animation[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 getAnimation(\n key: string,\n animationConfig: AnimationConfig | undefined,\n animateOnly?: string[]\n) {\n 'worklet'\n if (!animationConfig || (animateOnly && !animateOnly.includes(key))) {\n return {}\n }\n\n let repeatCount = 0\n const repeatReverse = animationConfig.repeatReverse || false\n let animationType: Required<TransitionConfig>['type'] = animationConfig?.type || 'spring'\n\n if (isColor(key) || key === 'opacity') {\n animationType = 'timing'\n }\n\n if ('repeat' in animationConfig) {\n repeatCount = animationConfig.repeat || 0\n } else {\n if (animationConfig.loop) {\n repeatCount = animationConfig.loop ? -1 : 0\n }\n }\n\n let config = animationConfig\n let animation: typeof withTiming | typeof withSpring | typeof withDecay\n\n if (animationType === 'timing') {\n animation = withTiming\n } else if (animationType === 'spring') {\n animation = withSpring\n } else if (animationType === 'decay') {\n animation = withDecay\n config = config || {\n velocity: 2,\n deceleration: 2,\n }\n } else {\n animation = withSpring\n }\n\n return {\n animation,\n config,\n repeatReverse,\n repeatCount,\n shouldRepeat: !!repeatCount,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["key", "isExiting", "finalValue"]
7
+ }
package/dist/jsx/index.js CHANGED
@@ -1,2 +1,4 @@
1
1
  import "./polyfill";
2
2
  export * from "./createAnimations";
3
+ export * from "./useAnimatedNumber";
4
+ //# 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'\nexport * from './useAnimatedNumber'\n"],
5
+ "mappings": "AAAA,OAAO;AAEP,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -1,3 +1,4 @@
1
1
  if (typeof requestAnimationFrame === "undefined") {
2
2
  globalThis["requestAnimationFrame"] = setImmediate;
3
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,11 @@
1
+ import {
2
+ useAnimatedNumber,
3
+ useAnimatedNumberStyle,
4
+ useAnimatedNumberReaction
5
+ } from "@tamagui/animations-react-native";
6
+ export {
7
+ useAnimatedNumber,
8
+ useAnimatedNumberReaction,
9
+ useAnimatedNumberStyle
10
+ };
11
+ //# sourceMappingURL=useAnimatedNumber.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useAnimatedNumber.tsx"],
4
+ "sourcesContent": ["// there's some bug with reanimated likely related to worklets\n// for now to not regress, we require react-native Animated alongside\nexport {\n useAnimatedNumber,\n useAnimatedNumberStyle,\n useAnimatedNumberReaction,\n} from '@tamagui/animations-react-native'\n\n// import { UniversalAnimatedNumber } from '@tamagui/core'\n// import {\n// SharedValue,\n// cancelAnimation,\n// useAnimatedReaction,\n// useAnimatedStyle,\n// useSharedValue,\n// withSpring,\n// withTiming,\n// } from 'react-native-reanimated'\n\n// type ReanimatedAnimatedNumber = SharedValue<number>\n\n// export function useAnimatedNumber(\n// initial: number\n// ): UniversalAnimatedNumber<ReanimatedAnimatedNumber> {\n// const val = useSharedValue(initial)\n// return {\n// getInstance() {\n// return val\n// },\n// getValue() {\n// return val.value\n// },\n// stop() {\n// cancelAnimation(val)\n// },\n// setValue(next: number, config = { type: 'spring' }) {\n// if (config.type === 'direct') {\n// val.value = next\n// } else if (config.type === 'spring') {\n// val.value = withSpring(next, config)\n// } else {\n// val.value = withTiming(next, config)\n// }\n// },\n// }\n// }\n\n// export function useAnimatedNumberReaction(\n// value: UniversalAnimatedNumber<ReanimatedAnimatedNumber>,\n// cb: (current: number) => void\n// ) {\n// useAnimatedReaction(\n// () => {\n// 'worklet'\n// return value.getValue()\n// },\n// (result, prev) => {\n// 'worklet'\n// if (result !== prev) cb(result)\n// },\n// [value]\n// )\n// }\n\n// export function useAnimatedNumberStyle<V extends UniversalAnimatedNumber<ReanimatedAnimatedNumber>>(\n// value: V,\n// getStyle: (value: number) => any\n// ) {\n// return useAnimatedStyle(() => {\n// 'worklet'\n// return getStyle(value.getValue())\n// })\n// }\n"],
5
+ "mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,23 +1,26 @@
1
1
  {
2
2
  "name": "@tamagui/animations-reanimated",
3
- "version": "1.0.1-beta.21",
3
+ "version": "1.0.1-beta.210",
4
4
  "source": "src/index.ts",
5
+ "sideEffects": true,
5
6
  "license": "MIT",
6
- "typings": "types",
7
+ "types": "./types/index.d.ts",
7
8
  "main": "dist/cjs",
8
9
  "module": "dist/esm",
9
10
  "module:jsx": "dist/jsx",
10
11
  "files": [
12
+ "src",
11
13
  "types",
12
14
  "dist"
13
15
  ],
14
16
  "dependencies": {
15
- "@tamagui/animate-presence": "^1.0.1-beta.21",
16
- "@tamagui/core": "^1.0.1-beta.21",
17
- "react-native-reanimated": "~2.8.0"
17
+ "@tamagui/animations-react-native": "^1.0.1-beta.210",
18
+ "@tamagui/core": "^1.0.1-beta.210",
19
+ "@tamagui/use-presence": "^1.0.1-beta.210"
18
20
  },
19
21
  "devDependencies": {
20
- "@tamagui/build": "^1.0.1-beta.21"
22
+ "@tamagui/build": "^1.0.1-beta.210",
23
+ "react-native-reanimated": "^2.12.0"
21
24
  },
22
25
  "scripts": {
23
26
  "build": "tamagui-build",