@tamagui/animations-react-native 2.0.0-rc.4 → 2.0.0-rc.40

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,
@@ -36,62 +38,73 @@ __export(createAnimations_exports, {
36
38
  createAnimations: () => createAnimations,
37
39
  useAnimatedNumber: () => useAnimatedNumber,
38
40
  useAnimatedNumberReaction: () => useAnimatedNumberReaction,
39
- useAnimatedNumberStyle: () => useAnimatedNumberStyle
41
+ useAnimatedNumberStyle: () => useAnimatedNumberStyle,
42
+ useAnimatedNumbersStyle: () => useAnimatedNumbersStyle
40
43
  });
41
44
  module.exports = __toCommonJS(createAnimations_exports);
42
- var import_animation_helpers = require("@tamagui/animation-helpers"),
43
- import_constants = require("@tamagui/constants"),
44
- import_use_presence = require("@tamagui/use-presence"),
45
- import_web = require("@tamagui/web"),
46
- import_react = __toESM(require("react"), 1),
47
- import_react_native = require("react-native-web");
48
- const resolveDynamicValue = (value, isDark) => value && typeof value == "object" && "dynamic" in value ? isDark ? value.dynamic.dark : value.dynamic.light : value,
49
- animatedStyleKey = {
50
- transform: !0,
51
- opacity: !0
52
- },
53
- colorStyleKey = {
54
- backgroundColor: !0,
55
- color: !0,
56
- borderColor: !0,
57
- borderLeftColor: !0,
58
- borderRightColor: !0,
59
- borderTopColor: !0,
60
- borderBottomColor: !0
61
- },
62
- costlyToAnimateStyleKey = {
63
- borderRadius: !0,
64
- borderTopLeftRadius: !0,
65
- borderTopRightRadius: !0,
66
- borderBottomLeftRadius: !0,
67
- borderBottomRightRadius: !0,
68
- borderWidth: !0,
69
- borderLeftWidth: !0,
70
- borderRightWidth: !0,
71
- borderTopWidth: !0,
72
- borderBottomWidth: !0,
73
- ...colorStyleKey
74
- // TODO for other keys like height or width, it's better to not add them here till layout animations are ready
75
- },
76
- AnimatedView = import_react_native.Animated.View,
77
- 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;
78
87
  function useAnimatedNumber(initial) {
79
88
  const state = import_react.default.useRef(null);
80
- return state.current || (state.current = {
81
- composite: null,
82
- val: new import_react_native.Animated.Value(initial),
83
- strategy: {
84
- type: "spring"
85
- }
86
- }), {
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 {
87
99
  getInstance() {
88
100
  return state.current.val;
89
101
  },
90
102
  getValue() {
91
- return state.current.val._value;
103
+ return state.current.val["_value"];
92
104
  },
93
105
  stop() {
94
- state.current.composite?.stop(), state.current.composite = null;
106
+ state.current.composite?.stop();
107
+ state.current.composite = null;
95
108
  },
96
109
  setValue(next, {
97
110
  type,
@@ -99,55 +112,68 @@ function useAnimatedNumber(initial) {
99
112
  } = {
100
113
  type: "spring"
101
114
  }, onFinish) {
102
- const val = state.current.val,
103
- handleFinish = onFinish ? ({
104
- finished
105
- }) => finished ? onFinish() : null : void 0;
106
- 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") {
107
122
  state.current.composite?.stop();
108
123
  const composite = import_react_native.Animated.spring(val, {
109
124
  ...config,
110
125
  toValue: next,
111
- useNativeDriver: !import_constants.isWeb
126
+ useNativeDriver: isFabric
112
127
  });
113
- composite.start(handleFinish), state.current.composite = composite;
128
+ composite.start(handleFinish);
129
+ state.current.composite = composite;
114
130
  } else {
115
131
  state.current.composite?.stop();
116
132
  const composite = import_react_native.Animated.timing(val, {
117
133
  ...config,
118
134
  toValue: next,
119
- useNativeDriver: !import_constants.isWeb
135
+ useNativeDriver: isFabric
120
136
  });
121
- composite.start(handleFinish), state.current.composite = composite;
137
+ composite.start(handleFinish);
138
+ state.current.composite = composite;
122
139
  }
123
140
  }
124
141
  };
125
142
  }
126
143
  const useAnimatedNumberReaction = ({
127
- value
128
- }, onValue) => {
129
- const onChange = (0, import_web.useEvent)(current => {
130
- onValue(current.value);
131
- });
132
- import_react.default.useEffect(() => {
133
- const id = value.getInstance().addListener(onChange);
134
- return () => {
135
- value.getInstance().removeListener(id);
136
- };
137
- }, [value, onChange]);
138
- },
139
- useAnimatedNumberStyle = (value, getStyle) => getStyle(value.getInstance());
140
- function createAnimations(animations) {
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
+ };
162
+ function createAnimations(animations, options) {
163
+ const nativeDriver = options?.useNativeDriver ?? isFabric;
141
164
  return {
142
- isReactNative: !0,
165
+ isReactNative: true,
143
166
  inputStyle: "value",
144
167
  outputStyle: "inline",
168
+ avoidReRenders: true,
145
169
  animations,
170
+ needsCustomComponent: true,
146
171
  View: AnimatedView,
147
172
  Text: AnimatedText,
148
173
  useAnimatedNumber,
149
174
  useAnimatedNumberReaction,
150
175
  useAnimatedNumberStyle,
176
+ useAnimatedNumbersStyle,
151
177
  usePresence: import_use_presence.usePresence,
152
178
  ResetPresence: import_use_presence.ResetPresence,
153
179
  useAnimations: ({
@@ -155,163 +181,300 @@ function createAnimations(animations) {
155
181
  onDidAnimate,
156
182
  style,
157
183
  componentState,
158
- presence
184
+ presence,
185
+ useStyleEmitter
159
186
  }) => {
160
- const isDisabled = import_constants.isWeb && componentState.unmounted === !0,
161
- isExiting = presence?.[0] === !1,
162
- sendExitComplete = presence?.[1],
163
- [, themeState] = (0, import_web.useThemeWithState)({}),
164
- isDark = themeState?.scheme === "dark" || themeState?.name?.startsWith("dark"),
165
- animateStyles = import_react.default.useRef({}),
166
- animatedTranforms = import_react.default.useRef([]),
167
- animationsState = import_react.default.useRef(/* @__PURE__ */new WeakMap()),
168
- animateOnly = props.animateOnly || [],
169
- hasTransitionOnly = !!props.animateOnly,
170
- isEntering = !!componentState.unmounted,
171
- wasEnteringRef = import_react.default.useRef(isEntering),
172
- 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;
173
212
  import_react.default.useEffect(() => {
174
213
  wasEnteringRef.current = isEntering;
175
214
  });
176
- const args = [JSON.stringify(style), componentState, isExiting, !!onDidAnimate, isDark, justFinishedEntering],
177
- isThereNoNativeStyleKeys = import_react.default.useMemo(() => import_constants.isWeb ? !0 : Object.keys(style).some(key => animateOnly ? !animatedStyleKey[key] && animateOnly.indexOf(key) === -1 : !animatedStyleKey[key]), args),
178
- res = import_react.default.useMemo(() => {
179
- const runners = [],
180
- completions = [],
181
- animationState = isExiting ? "exit" : isEntering || justFinishedEntering ? "enter" : "default",
182
- nonAnimatedStyle = {};
183
- for (const key in style) {
184
- const rawVal = style[key],
185
- val = resolveDynamicValue(rawVal, isDark);
186
- if (val !== void 0 && !isDisabled) {
187
- if (animatedStyleKey[key] == null && !costlyToAnimateStyleKey[key]) {
188
- nonAnimatedStyle[key] = val;
189
- continue;
190
- }
191
- if (hasTransitionOnly && !animateOnly.includes(key)) {
192
- nonAnimatedStyle[key] = val;
193
- continue;
194
- }
195
- if (key !== "transform") {
196
- animateStyles.current[key] = update(key, animateStyles.current[key], val);
197
- continue;
198
- }
199
- if (val) {
200
- if (typeof val == "string") {
201
- console.warn("Warning: Tamagui can't animate string transforms yet!");
202
- continue;
203
- }
204
- for (const [index, transform] of val.entries()) {
205
- if (!transform) continue;
206
- const tkey = Object.keys(transform)[0],
207
- currentTransform = animatedTranforms.current[index]?.[tkey];
208
- animatedTranforms.current[index] = {
209
- [tkey]: update(tkey, currentTransform, transform[tkey])
210
- }, animatedTranforms.current = [...animatedTranforms.current];
211
- }
212
- }
213
- }
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;
214
227
  }
215
- const animatedStyle = {
216
- ...Object.fromEntries(Object.entries(animateStyles.current).map(([k, v]) => [k, animationsState.current.get(v)?.interpolation || v])),
217
- transform: animatedTranforms.current.map(r => {
218
- const key = Object.keys(r)[0],
219
- val = animationsState.current.get(r[key])?.interpolation || r[key];
220
- return {
221
- [key]: val
222
- };
223
- })
224
- };
225
- return {
226
- runners,
227
- completions,
228
- style: [nonAnimatedStyle, animatedStyle]
229
- };
230
- function update(key, animated, valIn) {
231
- const isColorStyleKey = colorStyleKey[key],
232
- [val, type] = isColorStyleKey ? [0, void 0] : getValue(valIn);
233
- let animateToValue = val;
234
- const value = animated || new import_react_native.Animated.Value(val),
235
- curInterpolation = animationsState.current.get(value);
236
- let interpolateArgs;
237
- if (type && (interpolateArgs = getInterpolated(curInterpolation?.current ?? value._value, val, type), animationsState.current.set(value, {
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;
239
+ }
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])
251
+ };
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, {
238
283
  interpolation: value.interpolate(interpolateArgs),
239
284
  current: val
240
- })), 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,
241
290
  // valIn is the next color
242
- valIn, animateToValue), animationsState.current.set(value, {
291
+ valIn, animateToValue);
292
+ animationsState.current.set(value, {
243
293
  current: valIn,
244
294
  interpolation: value.interpolate(interpolateArgs),
245
295
  animateToValue: curInterpolation?.animateToValue ? 0 : 1
246
- })), value) {
247
- const animationConfig = getAnimationConfig(key, animations, props.transition, animationState);
248
- let resolve;
249
- const promise = new Promise(res2 => {
250
- resolve = res2;
251
- });
252
- completions.push(promise), runners.push(() => {
253
- value.stopAnimation();
254
- function getAnimation() {
255
- return import_react_native.Animated[animationConfig.type || "spring"](value, {
256
- toValue: animateToValue,
257
- useNativeDriver: !import_constants.isWeb && !isThereNoNativeStyleKeys,
258
- ...animationConfig
259
- });
260
- }
261
- (animationConfig.delay ? import_react_native.Animated.sequence([import_react_native.Animated.delay(animationConfig.delay), getAnimation()]) : getAnimation()).start(({
262
- finished
263
- }) => {
264
- finished && 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
265
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
+ }
266
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);
267
327
  }
268
- 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;
269
328
  }
270
- }, args);
271
- return (0, import_constants.useIsomorphicLayoutEffect)(() => {
329
+ return value;
330
+ }
331
+ }, args);
332
+ import_react.default.useEffect(() => {
333
+ wasExitingRef.current = isExiting;
334
+ });
335
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
272
336
  res.runners.forEach(r => r());
273
- let cancel = !1;
274
- return Promise.all(res.completions).then(() => {
275
- cancel || (onDidAnimate?.(), isExiting && sendExitComplete?.());
276
- }), () => {
277
- cancel = !0;
337
+ const cycleId = exitCycleIdRef.current;
338
+ if (res.completions.length === 0) {
339
+ onDidAnimate?.();
340
+ if (isExiting && !exitCompletedRef.current) {
341
+ exitCompletedRef.current = true;
342
+ sendExitComplete?.();
343
+ }
344
+ return;
345
+ }
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;
278
359
  };
279
- }, args), process.env.NODE_ENV === "development" && props.debug === "verbose" && console.info("Animated", {
280
- response: res,
281
- inputStyle: style,
282
- isExiting
283
- }), res;
360
+ }, args);
361
+ useStyleEmitter?.(nextStyle => {
362
+ for (const key in nextStyle) {
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
+ }
378
+ }
379
+ res.runners.forEach(r => r());
380
+ function update(key, animated, valIn) {
381
+ const isColor = colorStyleKey[key];
382
+ const [numVal, type] = isColor ? [0, void 0] : getValue(valIn);
383
+ let animateToValue = numVal;
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
+ }
400
+ const animationConfig = getAnimationConfig(key, animations, props.transition, "default");
401
+ res.runners.push(() => {
402
+ value.stopAnimation();
403
+ const anim = import_react_native.Animated[animationConfig.type || "spring"](value, {
404
+ toValue: animateToValue,
405
+ useNativeDriver: nativeDriver,
406
+ ...animationConfig
407
+ });
408
+ (animationConfig.delay ? import_react_native.Animated.sequence([import_react_native.Animated.delay(animationConfig.delay), anim]) : anim).start();
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
+ });
420
+ }
421
+ }
422
+ return res;
284
423
  }
285
424
  };
286
425
  }
287
426
  function getColorInterpolated(currentColor, nextColor, animateToValue) {
288
- const inputRange = [0, 1],
289
- outputRange = [currentColor || nextColor, nextColor];
290
- 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 {
291
433
  inputRange,
292
434
  outputRange
293
435
  };
294
436
  }
295
437
  function getInterpolated(current, next, postfix = "deg") {
296
- next === current && (current = next - 1e-9);
297
- const inputRange = [current, next],
298
- outputRange = [`${current}${postfix}`, `${next}${postfix}`];
299
- 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 {
300
448
  inputRange,
301
449
  outputRange
302
450
  };
303
451
  }
304
452
  function getAnimationConfig(key, animations, transition, animationState = "default") {
305
- const normalized = (0, import_animation_helpers.normalizeTransition)(transition),
306
- shortKey = transformShorthands[key],
307
- propAnimation = normalized.properties[key] ?? normalized.properties[shortKey];
308
- let animationType = null,
309
- extraConf = {};
310
- 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 = {
311
- ...extraConf,
312
- delay: normalized.delay
313
- }), {
314
- ...(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,
475
+ // Apply global spring config overrides (from transition={['bouncy', { stiffness: 1000 }]})
476
+ ...normalized.config,
477
+ // Property-specific config takes highest precedence
315
478
  ...extraConf
316
479
  };
317
480
  }
@@ -321,8 +484,10 @@ const transformShorthands = {
321
484
  translateX: "x",
322
485
  translateY: "y"
323
486
  };
324
- function getValue(input, isColor = !1) {
325
- if (typeof input != "string") return [input];
487
+ function getValue(input, isColor = false) {
488
+ if (typeof input !== "string") {
489
+ return [input];
490
+ }
326
491
  const [_, number, after] = input.match(/([-0-9]+)(deg|%|px)/) ?? [];
327
492
  return [+number, after];
328
493
  }