@hanzogui/animations-react-native 3.0.5 → 4.3.1

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