@tamagui/animations-react-native 2.0.0-rc.36 → 2.0.0-rc.36-1775258360494

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.
@@ -2,33 +2,35 @@ var __create = Object.create;
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf,
6
- __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
7
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: !0
11
- });
12
- },
13
- __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
15
16
  get: () => from[key],
16
17
  enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
18
  });
18
- return to;
19
- };
19
+ }
20
+ return to;
21
+ };
20
22
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
26
- value: mod,
27
- enumerable: !0
28
- }) : target, mod)),
29
- __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
30
- value: !0
31
- }), mod);
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
28
+ value: mod,
29
+ enumerable: true
30
+ }) : target, mod));
31
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
32
+ value: true
33
+ }), mod);
32
34
  var createAnimations_exports = {};
33
35
  __export(createAnimations_exports, {
34
36
  AnimatedText: () => AnimatedText,
@@ -40,59 +42,69 @@ __export(createAnimations_exports, {
40
42
  useAnimatedNumbersStyle: () => useAnimatedNumbersStyle
41
43
  });
42
44
  module.exports = __toCommonJS(createAnimations_exports);
43
- var import_animation_helpers = require("@tamagui/animation-helpers"),
44
- import_constants = require("@tamagui/constants"),
45
- import_use_presence = require("@tamagui/use-presence"),
46
- import_web = require("@tamagui/web"),
47
- import_react = __toESM(require("react"), 1),
48
- import_react_native = require("react-native-web");
49
- const isFabric = !import_constants.isWeb && typeof global < "u" && !!global.__nativeFabricUIManager,
50
- resolveDynamicValue = (value, isDark) => value && typeof value == "object" && "dynamic" in value ? isDark ? value.dynamic.dark : value.dynamic.light : value,
51
- animatedStyleKey = {
52
- transform: !0,
53
- opacity: !0
54
- },
55
- colorStyleKey = {
56
- backgroundColor: !0,
57
- color: !0,
58
- borderColor: !0,
59
- borderLeftColor: !0,
60
- borderRightColor: !0,
61
- borderTopColor: !0,
62
- borderBottomColor: !0
63
- },
64
- costlyToAnimateStyleKey = {
65
- borderRadius: !0,
66
- borderTopLeftRadius: !0,
67
- borderTopRightRadius: !0,
68
- borderBottomLeftRadius: !0,
69
- borderBottomRightRadius: !0,
70
- borderWidth: !0,
71
- borderLeftWidth: !0,
72
- borderRightWidth: !0,
73
- borderTopWidth: !0,
74
- borderBottomWidth: !0,
75
- ...colorStyleKey
76
- },
77
- AnimatedView = import_react_native.Animated.View,
78
- AnimatedText = import_react_native.Animated.Text;
45
+ var import_animation_helpers = require("@tamagui/animation-helpers");
46
+ var import_constants = require("@tamagui/constants");
47
+ var import_use_presence = require("@tamagui/use-presence");
48
+ var import_web = require("@tamagui/web");
49
+ var import_react = __toESM(require("react"), 1);
50
+ var import_react_native = require("react-native-web");
51
+ const isFabric = !import_constants.isWeb && typeof global !== "undefined" && !!global.__nativeFabricUIManager;
52
+ const resolveDynamicValue = (value, isDark) => {
53
+ if (value && typeof value === "object" && "dynamic" in value) {
54
+ const dynamicValue = isDark ? value.dynamic.dark : value.dynamic.light;
55
+ return dynamicValue;
56
+ }
57
+ return value;
58
+ };
59
+ const animatedStyleKey = {
60
+ transform: true,
61
+ opacity: true
62
+ };
63
+ const colorStyleKey = {
64
+ backgroundColor: true,
65
+ color: true,
66
+ borderColor: true,
67
+ borderLeftColor: true,
68
+ borderRightColor: true,
69
+ borderTopColor: true,
70
+ borderBottomColor: true
71
+ };
72
+ const costlyToAnimateStyleKey = {
73
+ borderRadius: true,
74
+ borderTopLeftRadius: true,
75
+ borderTopRightRadius: true,
76
+ borderBottomLeftRadius: true,
77
+ borderBottomRightRadius: true,
78
+ borderWidth: true,
79
+ borderLeftWidth: true,
80
+ borderRightWidth: true,
81
+ borderTopWidth: true,
82
+ borderBottomWidth: true,
83
+ ...colorStyleKey
84
+ };
85
+ const AnimatedView = import_react_native.Animated.View;
86
+ const AnimatedText = import_react_native.Animated.Text;
79
87
  function useAnimatedNumber(initial) {
80
88
  const state = import_react.default.useRef(null);
81
- return state.current || (state.current = {
82
- composite: null,
83
- val: new import_react_native.Animated.Value(initial),
84
- strategy: {
85
- type: "spring"
86
- }
87
- }), {
89
+ if (!state.current) {
90
+ state.current = {
91
+ composite: null,
92
+ val: new import_react_native.Animated.Value(initial),
93
+ strategy: {
94
+ type: "spring"
95
+ }
96
+ };
97
+ }
98
+ return {
88
99
  getInstance() {
89
100
  return state.current.val;
90
101
  },
91
102
  getValue() {
92
- return state.current.val._value;
103
+ return state.current.val["_value"];
93
104
  },
94
105
  stop() {
95
- state.current.composite?.stop(), state.current.composite = null;
106
+ state.current.composite?.stop();
107
+ state.current.composite = null;
96
108
  },
97
109
  setValue(next, {
98
110
  type,
@@ -100,18 +112,21 @@ function useAnimatedNumber(initial) {
100
112
  } = {
101
113
  type: "spring"
102
114
  }, onFinish) {
103
- const val = state.current.val,
104
- handleFinish = onFinish ? ({
105
- finished
106
- }) => finished ? onFinish() : null : void 0;
107
- if (type === "direct") val.setValue(next);else if (type === "spring") {
115
+ const val = state.current.val;
116
+ const handleFinish = onFinish ? ({
117
+ finished
118
+ }) => finished ? onFinish() : null : void 0;
119
+ if (type === "direct") {
120
+ val.setValue(next);
121
+ } else if (type === "spring") {
108
122
  state.current.composite?.stop();
109
123
  const composite = import_react_native.Animated.spring(val, {
110
124
  ...config,
111
125
  toValue: next,
112
126
  useNativeDriver: isFabric
113
127
  });
114
- composite.start(handleFinish), state.current.composite = composite;
128
+ composite.start(handleFinish);
129
+ state.current.composite = composite;
115
130
  } else {
116
131
  state.current.composite?.stop();
117
132
  const composite = import_react_native.Animated.timing(val, {
@@ -119,35 +134,40 @@ function useAnimatedNumber(initial) {
119
134
  toValue: next,
120
135
  useNativeDriver: isFabric
121
136
  });
122
- composite.start(handleFinish), state.current.composite = composite;
137
+ composite.start(handleFinish);
138
+ state.current.composite = composite;
123
139
  }
124
140
  }
125
141
  };
126
142
  }
127
143
  const useAnimatedNumberReaction = ({
128
- value
129
- }, onValue) => {
130
- const onChange = (0, import_web.useEvent)(current => {
131
- onValue(current.value);
132
- });
133
- import_react.default.useEffect(() => {
134
- const id = value.getInstance().addListener(onChange);
135
- return () => {
136
- value.getInstance().removeListener(id);
137
- };
138
- }, [value, onChange]);
139
- },
140
- useAnimatedNumberStyle = (value, getStyle) => getStyle(value.getInstance()),
141
- useAnimatedNumbersStyle = (vals, getStyle) => getStyle(...vals.map(v => v.getInstance()));
144
+ value
145
+ }, onValue) => {
146
+ const onChange = (0, import_web.useEvent)(current => {
147
+ onValue(current.value);
148
+ });
149
+ import_react.default.useEffect(() => {
150
+ const id = value.getInstance().addListener(onChange);
151
+ return () => {
152
+ value.getInstance().removeListener(id);
153
+ };
154
+ }, [value, onChange]);
155
+ };
156
+ const useAnimatedNumberStyle = (value, getStyle) => {
157
+ return getStyle(value.getInstance());
158
+ };
159
+ const useAnimatedNumbersStyle = (vals, getStyle) => {
160
+ return getStyle(...vals.map(v => v.getInstance()));
161
+ };
142
162
  function createAnimations(animations, options) {
143
163
  const nativeDriver = options?.useNativeDriver ?? isFabric;
144
164
  return {
145
- isReactNative: !0,
165
+ isReactNative: true,
146
166
  inputStyle: "value",
147
167
  outputStyle: "inline",
148
- avoidReRenders: !0,
168
+ avoidReRenders: true,
149
169
  animations,
150
- needsCustomComponent: !0,
170
+ needsCustomComponent: true,
151
171
  View: AnimatedView,
152
172
  Text: AnimatedText,
153
173
  useAnimatedNumber,
@@ -164,170 +184,221 @@ function createAnimations(animations, options) {
164
184
  presence,
165
185
  useStyleEmitter
166
186
  }) => {
167
- const isDisabled = import_constants.isWeb && componentState.unmounted === !0,
168
- isExiting = presence?.[0] === !1,
169
- sendExitComplete = presence?.[1],
170
- [, themeState] = (0, import_web.useThemeWithState)({}),
171
- isDark = themeState?.scheme === "dark" || themeState?.name?.startsWith("dark"),
172
- animateStyles = import_react.default.useRef({}),
173
- animatedTranforms = import_react.default.useRef([]),
174
- animationsState = import_react.default.useRef(/* @__PURE__ */new WeakMap()),
175
- exitCycleIdRef = import_react.default.useRef(0),
176
- exitCompletedRef = import_react.default.useRef(!1),
177
- wasExitingRef = import_react.default.useRef(!1),
178
- justStartedExiting = isExiting && !wasExitingRef.current,
179
- justStoppedExiting = !isExiting && wasExitingRef.current;
180
- justStartedExiting && (exitCycleIdRef.current++, exitCompletedRef.current = !1), justStoppedExiting && exitCycleIdRef.current++;
181
- const animateOnly = props.animateOnly || [],
182
- hasTransitionOnly = !!props.animateOnly,
183
- isEntering = !!componentState.unmounted,
184
- wasEnteringRef = import_react.default.useRef(isEntering),
185
- justFinishedEntering = wasEnteringRef.current && !isEntering;
187
+ const isDisabled = import_constants.isWeb && componentState.unmounted === true;
188
+ const isExiting = presence?.[0] === false;
189
+ const sendExitComplete = presence?.[1];
190
+ const [, themeState] = (0, import_web.useThemeWithState)({});
191
+ const isDark = themeState?.scheme === "dark" || themeState?.name?.startsWith("dark");
192
+ const animateStyles = import_react.default.useRef({});
193
+ const animatedTranforms = import_react.default.useRef([]);
194
+ const animationsState = import_react.default.useRef(/* @__PURE__ */new WeakMap());
195
+ const exitCycleIdRef = import_react.default.useRef(0);
196
+ const exitCompletedRef = import_react.default.useRef(false);
197
+ const wasExitingRef = import_react.default.useRef(false);
198
+ const justStartedExiting = isExiting && !wasExitingRef.current;
199
+ const justStoppedExiting = !isExiting && wasExitingRef.current;
200
+ if (justStartedExiting) {
201
+ exitCycleIdRef.current++;
202
+ exitCompletedRef.current = false;
203
+ }
204
+ if (justStoppedExiting) {
205
+ exitCycleIdRef.current++;
206
+ }
207
+ const animateOnly = props.animateOnly || [];
208
+ const hasTransitionOnly = !!props.animateOnly;
209
+ const isEntering = !!componentState.unmounted;
210
+ const wasEnteringRef = import_react.default.useRef(isEntering);
211
+ const justFinishedEntering = wasEnteringRef.current && !isEntering;
186
212
  import_react.default.useEffect(() => {
187
213
  wasEnteringRef.current = isEntering;
188
214
  });
189
- const args = [JSON.stringify(style), componentState, isExiting, !!onDidAnimate, isDark, justFinishedEntering, hasTransitionOnly],
190
- res = import_react.default.useMemo(() => {
191
- const runners = [],
192
- completions = [],
193
- animationState = isExiting ? "exit" : isEntering || justFinishedEntering ? "enter" : "default",
194
- nonAnimatedStyle = {};
195
- for (const key in style) {
196
- const rawVal = style[key],
197
- val = resolveDynamicValue(rawVal, isDark);
198
- if (val !== void 0 && !isDisabled) {
199
- if (animatedStyleKey[key] == null && !costlyToAnimateStyleKey[key]) {
200
- nonAnimatedStyle[key] = val;
201
- continue;
202
- }
203
- if (hasTransitionOnly && !animateOnly.includes(key)) {
204
- nonAnimatedStyle[key] = val;
205
- continue;
206
- }
207
- if (key !== "transform") {
208
- animateStyles.current[key] = update(key, animateStyles.current[key], val);
209
- continue;
210
- }
211
- if (val) {
212
- if (typeof val == "string") {
213
- console.warn("Warning: Tamagui can't animate string transforms yet!");
214
- continue;
215
- }
216
- for (const [index, transform] of val.entries()) {
217
- if (!transform) continue;
218
- const tkey = Object.keys(transform)[0],
219
- currentTransform = animatedTranforms.current[index]?.[tkey];
220
- animatedTranforms.current[index] = {
221
- [tkey]: update(tkey, currentTransform, transform[tkey])
222
- }, animatedTranforms.current = [...animatedTranforms.current];
223
- }
224
- }
225
- }
215
+ const args = [JSON.stringify(style), componentState, isExiting, !!onDidAnimate, isDark, justFinishedEntering, hasTransitionOnly];
216
+ const res = import_react.default.useMemo(() => {
217
+ const runners = [];
218
+ const completions = [];
219
+ const animationState = isExiting ? "exit" : isEntering || justFinishedEntering ? "enter" : "default";
220
+ const nonAnimatedStyle = {};
221
+ for (const key in style) {
222
+ const rawVal = style[key];
223
+ const val = resolveDynamicValue(rawVal, isDark);
224
+ if (val === void 0) continue;
225
+ if (isDisabled) {
226
+ continue;
227
+ }
228
+ if (animatedStyleKey[key] == null && !costlyToAnimateStyleKey[key]) {
229
+ nonAnimatedStyle[key] = val;
230
+ continue;
231
+ }
232
+ if (hasTransitionOnly && !animateOnly.includes(key)) {
233
+ nonAnimatedStyle[key] = val;
234
+ continue;
235
+ }
236
+ if (key !== "transform") {
237
+ animateStyles.current[key] = update(key, animateStyles.current[key], val);
238
+ continue;
226
239
  }
227
- const animatedTransformStyle = animatedTranforms.current.length > 0 ? {
228
- transform: animatedTranforms.current.map(r => {
229
- const key = Object.keys(r)[0],
230
- val = animationsState.current.get(r[key])?.interpolation || r[key];
231
- return {
232
- [key]: val
233
- };
234
- })
235
- } : {},
236
- animatedStyle = {
237
- ...Object.fromEntries(Object.entries(animateStyles.current).map(([k, v]) => [k, animationsState.current.get(v)?.interpolation || v])),
238
- ...animatedTransformStyle
240
+ if (!val) continue;
241
+ if (typeof val === "string") {
242
+ console.warn(`Warning: Tamagui can't animate string transforms yet!`);
243
+ continue;
244
+ }
245
+ for (const [index, transform] of val.entries()) {
246
+ if (!transform) continue;
247
+ const tkey = Object.keys(transform)[0];
248
+ const currentTransform = animatedTranforms.current[index]?.[tkey];
249
+ animatedTranforms.current[index] = {
250
+ [tkey]: update(tkey, currentTransform, transform[tkey])
239
251
  };
240
- return {
241
- runners,
242
- completions,
243
- style: [nonAnimatedStyle, animatedStyle]
244
- };
245
- function update(key, animated, valIn) {
246
- const isColorStyleKey = colorStyleKey[key],
247
- [val, type] = isColorStyleKey ? [0, void 0] : getValue(valIn);
248
- let animateToValue = val;
249
- const value = animated || new import_react_native.Animated.Value(val),
250
- curInterpolation = animationsState.current.get(value);
251
- let interpolateArgs;
252
- if (type && (interpolateArgs = getInterpolated(curInterpolation?.current ?? value._value, val, type), animationsState.current.set(value, {
252
+ animatedTranforms.current = [...animatedTranforms.current];
253
+ }
254
+ }
255
+ const animatedTransformStyle = animatedTranforms.current.length > 0 ? {
256
+ transform: animatedTranforms.current.map(r => {
257
+ const key = Object.keys(r)[0];
258
+ const val = animationsState.current.get(r[key])?.interpolation || r[key];
259
+ return {
260
+ [key]: val
261
+ };
262
+ })
263
+ } : {};
264
+ const animatedStyle = {
265
+ ...Object.fromEntries(Object.entries(animateStyles.current).map(([k, v]) => [k, animationsState.current.get(v)?.interpolation || v])),
266
+ ...animatedTransformStyle
267
+ };
268
+ return {
269
+ runners,
270
+ completions,
271
+ style: [nonAnimatedStyle, animatedStyle]
272
+ };
273
+ function update(key, animated, valIn) {
274
+ const isColorStyleKey = colorStyleKey[key];
275
+ const [val, type] = isColorStyleKey ? [0, void 0] : getValue(valIn);
276
+ let animateToValue = val;
277
+ const value = animated || new import_react_native.Animated.Value(val);
278
+ const curInterpolation = animationsState.current.get(value);
279
+ let interpolateArgs;
280
+ if (type) {
281
+ interpolateArgs = getInterpolated(curInterpolation?.current ?? value["_value"], val, type);
282
+ animationsState.current.set(value, {
253
283
  interpolation: value.interpolate(interpolateArgs),
254
284
  current: val
255
- })), isColorStyleKey && (animateToValue = curInterpolation?.animateToValue ? 0 : 1, interpolateArgs = getColorInterpolated(curInterpolation?.current,
285
+ });
286
+ }
287
+ if (isColorStyleKey) {
288
+ animateToValue = curInterpolation?.animateToValue ? 0 : 1;
289
+ interpolateArgs = getColorInterpolated(curInterpolation?.current,
256
290
  // valIn is the next color
257
- valIn, animateToValue), animationsState.current.set(value, {
291
+ valIn, animateToValue);
292
+ animationsState.current.set(value, {
258
293
  current: valIn,
259
294
  interpolation: value.interpolate(interpolateArgs),
260
295
  animateToValue: curInterpolation?.animateToValue ? 0 : 1
261
- })), value) {
262
- const animationConfig = getAnimationConfig(key, animations, props.transition, animationState);
263
- let resolve;
264
- const promise = new Promise(res2 => {
265
- resolve = res2;
266
- });
267
- completions.push(promise), runners.push(() => {
268
- value.stopAnimation();
269
- function getAnimation() {
270
- return import_react_native.Animated[animationConfig.type || "spring"](value, {
271
- toValue: animateToValue,
272
- useNativeDriver: nativeDriver,
273
- ...animationConfig
274
- });
275
- }
276
- (animationConfig.delay ? import_react_native.Animated.sequence([import_react_native.Animated.delay(animationConfig.delay), getAnimation()]) : getAnimation()).start(({
277
- finished
278
- }) => {
279
- (finished || isExiting) && resolve();
296
+ });
297
+ }
298
+ if (value) {
299
+ const animationConfig = getAnimationConfig(key, animations, props.transition, animationState);
300
+ let resolve;
301
+ const promise = new Promise(res2 => {
302
+ resolve = res2;
303
+ });
304
+ completions.push(promise);
305
+ runners.push(() => {
306
+ value.stopAnimation();
307
+ function getAnimation() {
308
+ return import_react_native.Animated[animationConfig.type || "spring"](value, {
309
+ toValue: animateToValue,
310
+ useNativeDriver: nativeDriver,
311
+ ...animationConfig
280
312
  });
313
+ }
314
+ const animation = animationConfig.delay ? import_react_native.Animated.sequence([import_react_native.Animated.delay(animationConfig.delay), getAnimation()]) : getAnimation();
315
+ animation.start(({
316
+ finished
317
+ }) => {
318
+ if (finished || isExiting) {
319
+ resolve();
320
+ }
281
321
  });
322
+ });
323
+ }
324
+ if (process.env.NODE_ENV === "development") {
325
+ if (props["debug"] === "verbose") {
326
+ console.info(" \u{1F4A0} animate", key, `from (${value["_value"]}) to`, valIn, `(${val})`, "type", type, "interpolate", interpolateArgs);
282
327
  }
283
- return process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info(" \u{1F4A0} animate", key, `from (${value._value}) to`, valIn, `(${val})`, "type", type, "interpolate", interpolateArgs), value;
284
328
  }
285
- }, args);
286
- return import_react.default.useEffect(() => {
329
+ return value;
330
+ }
331
+ }, args);
332
+ import_react.default.useEffect(() => {
287
333
  wasExitingRef.current = isExiting;
288
- }), (0, import_constants.useIsomorphicLayoutEffect)(() => {
334
+ });
335
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
289
336
  res.runners.forEach(r => r());
290
337
  const cycleId = exitCycleIdRef.current;
291
338
  if (res.completions.length === 0) {
292
- onDidAnimate?.(), isExiting && !exitCompletedRef.current && (exitCompletedRef.current = !0, sendExitComplete?.());
339
+ onDidAnimate?.();
340
+ if (isExiting && !exitCompletedRef.current) {
341
+ exitCompletedRef.current = true;
342
+ sendExitComplete?.();
343
+ }
293
344
  return;
294
345
  }
295
- let cancel = !1;
296
- return Promise.all(res.completions).then(() => {
297
- cancel || isExiting && cycleId !== exitCycleIdRef.current || isExiting && exitCompletedRef.current || (onDidAnimate?.(), isExiting && (exitCompletedRef.current = !0, sendExitComplete?.()));
298
- }), () => {
299
- cancel = !0;
346
+ let cancel = false;
347
+ Promise.all(res.completions).then(() => {
348
+ if (cancel) return;
349
+ if (isExiting && cycleId !== exitCycleIdRef.current) return;
350
+ if (isExiting && exitCompletedRef.current) return;
351
+ onDidAnimate?.();
352
+ if (isExiting) {
353
+ exitCompletedRef.current = true;
354
+ sendExitComplete?.();
355
+ }
356
+ });
357
+ return () => {
358
+ cancel = true;
300
359
  };
301
- }, args), useStyleEmitter?.(nextStyle => {
360
+ }, args);
361
+ useStyleEmitter?.(nextStyle => {
302
362
  for (const key in nextStyle) {
303
- const rawVal = nextStyle[key],
304
- val = resolveDynamicValue(rawVal, isDark);
305
- if (val !== void 0) if (key === "transform" && Array.isArray(val)) for (const [index, transform] of val.entries()) {
306
- if (!transform) continue;
307
- const tkey = Object.keys(transform)[0],
308
- currentTransform = animatedTranforms.current[index]?.[tkey];
309
- animatedTranforms.current[index] = {
310
- [tkey]: update(tkey, currentTransform, transform[tkey])
311
- };
312
- } else (animatedStyleKey[key] != null || costlyToAnimateStyleKey[key]) && (animateStyles.current[key] = update(key, animateStyles.current[key], val));
363
+ const rawVal = nextStyle[key];
364
+ const val = resolveDynamicValue(rawVal, isDark);
365
+ if (val === void 0) continue;
366
+ if (key === "transform" && Array.isArray(val)) {
367
+ for (const [index, transform] of val.entries()) {
368
+ if (!transform) continue;
369
+ const tkey = Object.keys(transform)[0];
370
+ const currentTransform = animatedTranforms.current[index]?.[tkey];
371
+ animatedTranforms.current[index] = {
372
+ [tkey]: update(tkey, currentTransform, transform[tkey])
373
+ };
374
+ }
375
+ } else if (animatedStyleKey[key] != null || costlyToAnimateStyleKey[key]) {
376
+ animateStyles.current[key] = update(key, animateStyles.current[key], val);
377
+ }
313
378
  }
314
379
  res.runners.forEach(r => r());
315
380
  function update(key, animated, valIn) {
316
- const isColor = colorStyleKey[key],
317
- [numVal, type] = isColor ? [0, void 0] : getValue(valIn);
381
+ const isColor = colorStyleKey[key];
382
+ const [numVal, type] = isColor ? [0, void 0] : getValue(valIn);
318
383
  let animateToValue = numVal;
319
- const value = animated || new import_react_native.Animated.Value(numVal),
320
- curInterpolation = animationsState.current.get(value);
321
- type && animationsState.current.set(value, {
322
- interpolation: value.interpolate(getInterpolated(curInterpolation?.current ?? value._value, numVal, type)),
323
- current: numVal
324
- }), isColor && (animateToValue = curInterpolation?.animateToValue ? 0 : 1, animationsState.current.set(value, {
325
- current: valIn,
326
- interpolation: value.interpolate(getColorInterpolated(curInterpolation?.current, valIn, animateToValue)),
327
- animateToValue: curInterpolation?.animateToValue ? 0 : 1
328
- }));
384
+ const value = animated || new import_react_native.Animated.Value(numVal);
385
+ const curInterpolation = animationsState.current.get(value);
386
+ if (type) {
387
+ animationsState.current.set(value, {
388
+ interpolation: value.interpolate(getInterpolated(curInterpolation?.current ?? value["_value"], numVal, type)),
389
+ current: numVal
390
+ });
391
+ }
392
+ if (isColor) {
393
+ animateToValue = curInterpolation?.animateToValue ? 0 : 1;
394
+ animationsState.current.set(value, {
395
+ current: valIn,
396
+ interpolation: value.interpolate(getColorInterpolated(curInterpolation?.current, valIn, animateToValue)),
397
+ animateToValue: curInterpolation?.animateToValue ? 0 : 1
398
+ });
399
+ }
329
400
  const animationConfig = getAnimationConfig(key, animations, props.transition, "default");
330
- return res.runners.push(() => {
401
+ res.runners.push(() => {
331
402
  value.stopAnimation();
332
403
  const anim = import_react_native.Animated[animationConfig.type || "spring"](value, {
333
404
  toValue: animateToValue,
@@ -335,44 +406,72 @@ function createAnimations(animations, options) {
335
406
  ...animationConfig
336
407
  });
337
408
  (animationConfig.delay ? import_react_native.Animated.sequence([import_react_native.Animated.delay(animationConfig.delay), anim]) : anim).start();
338
- }), value;
409
+ });
410
+ return value;
411
+ }
412
+ });
413
+ if (process.env.NODE_ENV === "development") {
414
+ if (props["debug"] === "verbose") {
415
+ console.info(`Animated`, {
416
+ response: res,
417
+ inputStyle: style,
418
+ isExiting
419
+ });
339
420
  }
340
- }), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("Animated", {
341
- response: res,
342
- inputStyle: style,
343
- isExiting
344
- }), res;
421
+ }
422
+ return res;
345
423
  }
346
424
  };
347
425
  }
348
426
  function getColorInterpolated(currentColor, nextColor, animateToValue) {
349
- const inputRange = [0, 1],
350
- outputRange = [currentColor || nextColor, nextColor];
351
- return animateToValue === 0 && outputRange.reverse(), {
427
+ const inputRange = [0, 1];
428
+ const outputRange = [currentColor ? currentColor : nextColor, nextColor];
429
+ if (animateToValue === 0) {
430
+ outputRange.reverse();
431
+ }
432
+ return {
352
433
  inputRange,
353
434
  outputRange
354
435
  };
355
436
  }
356
437
  function getInterpolated(current, next, postfix = "deg") {
357
- next === current && (current = next - 1e-9);
358
- const inputRange = [current, next],
359
- outputRange = [`${current}${postfix}`, `${next}${postfix}`];
360
- return next < current && (inputRange.reverse(), outputRange.reverse()), {
438
+ if (next === current) {
439
+ current = next - 1e-9;
440
+ }
441
+ const inputRange = [current, next];
442
+ const outputRange = [`${current}${postfix}`, `${next}${postfix}`];
443
+ if (next < current) {
444
+ inputRange.reverse();
445
+ outputRange.reverse();
446
+ }
447
+ return {
361
448
  inputRange,
362
449
  outputRange
363
450
  };
364
451
  }
365
452
  function getAnimationConfig(key, animations, transition, animationState = "default") {
366
- const normalized = (0, import_animation_helpers.normalizeTransition)(transition),
367
- shortKey = transformShorthands[key],
368
- propAnimation = normalized.properties[key] ?? normalized.properties[shortKey];
369
- let animationType = null,
370
- extraConf = {};
371
- return typeof propAnimation == "string" ? animationType = propAnimation : propAnimation && typeof propAnimation == "object" ? (animationType = propAnimation.type || (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState), extraConf = propAnimation) : animationType = (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState), normalized.delay && !extraConf.delay && (extraConf = {
372
- ...extraConf,
373
- delay: normalized.delay
374
- }), {
375
- ...(animationType ? animations[animationType] : {}),
453
+ const normalized = (0, import_animation_helpers.normalizeTransition)(transition);
454
+ const shortKey = transformShorthands[key];
455
+ const propAnimation = normalized.properties[key] ?? normalized.properties[shortKey];
456
+ let animationType = null;
457
+ let extraConf = {};
458
+ if (typeof propAnimation === "string") {
459
+ animationType = propAnimation;
460
+ } else if (propAnimation && typeof propAnimation === "object") {
461
+ animationType = propAnimation.type || (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState);
462
+ extraConf = propAnimation;
463
+ } else {
464
+ animationType = (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState);
465
+ }
466
+ if (normalized.delay && !extraConf.delay) {
467
+ extraConf = {
468
+ ...extraConf,
469
+ delay: normalized.delay
470
+ };
471
+ }
472
+ const found = animationType ? animations[animationType] : {};
473
+ return {
474
+ ...found,
376
475
  // Apply global spring config overrides (from transition={['bouncy', { stiffness: 1000 }]})
377
476
  ...normalized.config,
378
477
  // Property-specific config takes highest precedence
@@ -385,8 +484,10 @@ const transformShorthands = {
385
484
  translateX: "x",
386
485
  translateY: "y"
387
486
  };
388
- function getValue(input, isColor = !1) {
389
- if (typeof input != "string") return [input];
487
+ function getValue(input, isColor = false) {
488
+ if (typeof input !== "string") {
489
+ return [input];
490
+ }
390
491
  const [_, number, after] = input.match(/([-0-9]+)(deg|%|px)/) ?? [];
391
492
  return [+number, after];
392
493
  }