@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.
- package/dist/cjs/createAnimations.cjs +356 -252
- package/dist/cjs/createAnimations.native.js +410 -315
- package/dist/cjs/createAnimations.native.js.map +1 -1
- package/dist/cjs/index.cjs +7 -5
- package/dist/cjs/index.native.js +7 -5
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/polyfill.cjs +3 -1
- package/dist/cjs/polyfill.native.js +3 -1
- package/dist/cjs/polyfill.native.js.map +1 -1
- package/dist/esm/createAnimations.mjs +325 -224
- package/dist/esm/createAnimations.mjs.map +1 -1
- package/dist/esm/createAnimations.native.js +379 -287
- package/dist/esm/createAnimations.native.js.map +1 -1
- package/dist/esm/polyfill.mjs +3 -1
- package/dist/esm/polyfill.mjs.map +1 -1
- package/dist/esm/polyfill.native.js +3 -1
- package/dist/esm/polyfill.native.js.map +1 -1
- package/package.json +6 -6
- package/src/createAnimations.tsx +9 -1
- package/types/createAnimations.d.ts +1 -0
- package/types/createAnimations.d.ts.map +2 -2
|
@@ -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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
59
|
+
return state.current.val["_value"];
|
|
51
60
|
},
|
|
52
61
|
stop() {
|
|
53
|
-
state.current.composite?.stop()
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (type === "direct")
|
|
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)
|
|
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)
|
|
93
|
+
composite.start(handleFinish);
|
|
94
|
+
state.current.composite = composite;
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
97
|
};
|
|
84
98
|
}
|
|
85
99
|
const useAnimatedNumberReaction = ({
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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:
|
|
121
|
+
isReactNative: true,
|
|
103
122
|
inputStyle: "value",
|
|
104
123
|
outputStyle: "inline",
|
|
105
|
-
avoidReRenders:
|
|
124
|
+
avoidReRenders: true,
|
|
106
125
|
animations,
|
|
107
|
-
needsCustomComponent:
|
|
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 ===
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
})
|
|
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)
|
|
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
|
-
})
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
242
|
-
|
|
285
|
+
return value;
|
|
286
|
+
}
|
|
287
|
+
}, args);
|
|
288
|
+
React.useEffect(() => {
|
|
243
289
|
wasExitingRef.current = isExiting;
|
|
244
|
-
})
|
|
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?.()
|
|
295
|
+
onDidAnimate?.();
|
|
296
|
+
if (isExiting && !exitCompletedRef.current) {
|
|
297
|
+
exitCompletedRef.current = true;
|
|
298
|
+
sendExitComplete?.();
|
|
299
|
+
}
|
|
249
300
|
return;
|
|
250
301
|
}
|
|
251
|
-
let cancel =
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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)
|
|
316
|
+
}, args);
|
|
317
|
+
useStyleEmitter?.(nextStyle => {
|
|
258
318
|
for (const key in nextStyle) {
|
|
259
|
-
const rawVal = nextStyle[key]
|
|
260
|
-
|
|
261
|
-
if (val
|
|
262
|
-
|
|
263
|
-
const
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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
|
-
|
|
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
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
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
|
-
})
|
|
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
|
-
}
|
|
297
|
-
|
|
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
|
-
|
|
307
|
-
|
|
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
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
let animationType = null
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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 =
|
|
345
|
-
if (typeof 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
|