@hanzogui/animations-reanimated 3.0.6 → 4.4.0
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 +477 -334
- package/dist/cjs/createAnimations.native.js +561 -409
- 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/esm/createAnimations.mjs +449 -308
- package/dist/esm/createAnimations.mjs.map +1 -1
- package/dist/esm/createAnimations.native.js +533 -383
- package/dist/esm/createAnimations.native.js.map +1 -1
- package/package.json +5 -5
- package/src/createAnimations.tsx +164 -123
- package/types/createAnimations.d.ts.map +2 -2
|
@@ -2,193 +2,226 @@ 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
|
-
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
7
|
var __export = (target, all) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
19
|
-
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
20
22
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
createAnimations: () => createAnimations
|
|
35
37
|
});
|
|
36
38
|
module.exports = __toCommonJS(createAnimations_exports);
|
|
37
|
-
var import_animation_helpers = require("@hanzogui/animation-helpers")
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
var import_animation_helpers = require("@hanzogui/animation-helpers");
|
|
40
|
+
var import_core = require("@hanzogui/core");
|
|
41
|
+
var import_use_presence = require("@hanzogui/use-presence");
|
|
42
|
+
var import_react = __toESM(require("react"), 1);
|
|
43
|
+
var import_react_native_reanimated = __toESM(require("react-native-reanimated"), 1);
|
|
44
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
43
45
|
const getDefaultExport = module2 => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
const mod = module2;
|
|
47
|
+
if (mod.__esModule || mod[Symbol.toStringTag] === "Module") {
|
|
48
|
+
return mod.default || mod;
|
|
49
|
+
}
|
|
50
|
+
return mod;
|
|
51
|
+
};
|
|
52
|
+
const Animated = getDefaultExport(import_react_native_reanimated.default);
|
|
53
|
+
const resolveDynamicValue = (value, isDark) => {
|
|
54
|
+
if (value !== null && typeof value === "object" && "dynamic" in value && typeof value.dynamic === "object") {
|
|
55
|
+
const dynamic = value.dynamic;
|
|
56
|
+
return isDark ? dynamic.dark : dynamic.light;
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
};
|
|
60
|
+
const applyAnimation = (targetValue, config, callback) => {
|
|
61
|
+
"worklet";
|
|
57
62
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
63
|
+
const delay = config.delay;
|
|
64
|
+
let animatedValue;
|
|
65
|
+
if (config.type === "timing") {
|
|
66
|
+
animatedValue = (0, import_react_native_reanimated.withTiming)(targetValue, config, callback);
|
|
67
|
+
} else {
|
|
68
|
+
animatedValue = (0, import_react_native_reanimated.withSpring)(targetValue, config, callback);
|
|
69
|
+
}
|
|
70
|
+
if (delay && delay > 0) {
|
|
71
|
+
animatedValue = (0, import_react_native_reanimated.withDelay)(delay, animatedValue);
|
|
72
|
+
}
|
|
73
|
+
return animatedValue;
|
|
74
|
+
};
|
|
75
|
+
const ANIMATABLE_PROPERTIES = {
|
|
76
|
+
// Transform
|
|
77
|
+
transform: true,
|
|
78
|
+
// Opacity
|
|
79
|
+
opacity: true,
|
|
80
|
+
// Dimensions
|
|
81
|
+
height: true,
|
|
82
|
+
width: true,
|
|
83
|
+
minWidth: true,
|
|
84
|
+
minHeight: true,
|
|
85
|
+
maxWidth: true,
|
|
86
|
+
maxHeight: true,
|
|
87
|
+
// Background
|
|
88
|
+
backgroundColor: true,
|
|
89
|
+
// Border colors
|
|
90
|
+
borderColor: true,
|
|
91
|
+
borderLeftColor: true,
|
|
92
|
+
borderRightColor: true,
|
|
93
|
+
borderTopColor: true,
|
|
94
|
+
borderBottomColor: true,
|
|
95
|
+
// Border radius
|
|
96
|
+
borderRadius: true,
|
|
97
|
+
borderTopLeftRadius: true,
|
|
98
|
+
borderTopRightRadius: true,
|
|
99
|
+
borderBottomLeftRadius: true,
|
|
100
|
+
borderBottomRightRadius: true,
|
|
101
|
+
// Border width
|
|
102
|
+
borderWidth: true,
|
|
103
|
+
borderLeftWidth: true,
|
|
104
|
+
borderRightWidth: true,
|
|
105
|
+
borderTopWidth: true,
|
|
106
|
+
borderBottomWidth: true,
|
|
107
|
+
// Text
|
|
108
|
+
color: true,
|
|
109
|
+
fontSize: true,
|
|
110
|
+
fontWeight: true,
|
|
111
|
+
lineHeight: true,
|
|
112
|
+
letterSpacing: true,
|
|
113
|
+
// Position
|
|
114
|
+
left: true,
|
|
115
|
+
right: true,
|
|
116
|
+
top: true,
|
|
117
|
+
bottom: true,
|
|
118
|
+
// Margin
|
|
119
|
+
margin: true,
|
|
120
|
+
marginTop: true,
|
|
121
|
+
marginBottom: true,
|
|
122
|
+
marginLeft: true,
|
|
123
|
+
marginRight: true,
|
|
124
|
+
marginHorizontal: true,
|
|
125
|
+
marginVertical: true,
|
|
126
|
+
// Padding
|
|
127
|
+
padding: true,
|
|
128
|
+
paddingTop: true,
|
|
129
|
+
paddingBottom: true,
|
|
130
|
+
paddingLeft: true,
|
|
131
|
+
paddingRight: true,
|
|
132
|
+
paddingHorizontal: true,
|
|
133
|
+
paddingVertical: true,
|
|
134
|
+
// Flex/Gap
|
|
135
|
+
gap: true,
|
|
136
|
+
rowGap: true,
|
|
137
|
+
columnGap: true,
|
|
138
|
+
flex: true,
|
|
139
|
+
flexGrow: true,
|
|
140
|
+
flexShrink: true
|
|
141
|
+
};
|
|
142
|
+
const canAnimateProperty = (key, value, animateOnly) => {
|
|
143
|
+
if (!ANIMATABLE_PROPERTIES[key]) return false;
|
|
144
|
+
if (value === "auto") return false;
|
|
145
|
+
if (typeof value === "string" && value.startsWith("calc")) return false;
|
|
146
|
+
if (animateOnly && !animateOnly.includes(key)) return false;
|
|
147
|
+
return true;
|
|
148
|
+
};
|
|
130
149
|
function createWebAnimatedComponent(defaultTag) {
|
|
131
|
-
const isText = defaultTag === "span"
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
})
|
|
159
|
-
|
|
150
|
+
const isText = defaultTag === "span";
|
|
151
|
+
const Component = Animated.createAnimatedComponent((0, import_react.forwardRef)((propsIn, ref) => {
|
|
152
|
+
const {
|
|
153
|
+
forwardedRef,
|
|
154
|
+
render = defaultTag,
|
|
155
|
+
...rest
|
|
156
|
+
} = propsIn;
|
|
157
|
+
const hostRef = (0, import_react.useRef)(null);
|
|
158
|
+
const composedRefs = (0, import_core.useComposedRefs)(forwardedRef, ref, hostRef);
|
|
159
|
+
const stateRef = (0, import_react.useRef)({
|
|
160
|
+
get host() {
|
|
161
|
+
return hostRef.current;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
const [, themeState] = (0, import_core.useThemeWithState)({});
|
|
165
|
+
const result = (0, import_core.getSplitStyles)(rest, isText ? import_core.Text.staticConfig : import_core.View.staticConfig, themeState?.theme ?? {}, themeState?.name ?? "", {
|
|
166
|
+
unmounted: false
|
|
167
|
+
}, {
|
|
168
|
+
isAnimated: false,
|
|
169
|
+
noClass: true
|
|
170
|
+
});
|
|
171
|
+
const viewProps = result?.viewProps ?? {};
|
|
172
|
+
const Element = render;
|
|
173
|
+
const transformedProps = import_core.hooks.usePropsTransform?.(render, viewProps, stateRef, false);
|
|
174
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Element, {
|
|
175
|
+
...transformedProps,
|
|
176
|
+
ref: composedRefs
|
|
177
|
+
});
|
|
178
|
+
}));
|
|
179
|
+
Component.acceptRenderProp = true;
|
|
180
|
+
return Component;
|
|
160
181
|
}
|
|
161
|
-
const AnimatedView = createWebAnimatedComponent("div")
|
|
162
|
-
|
|
182
|
+
const AnimatedView = createWebAnimatedComponent("div");
|
|
183
|
+
const AnimatedText = createWebAnimatedComponent("span");
|
|
163
184
|
function buildTransitionConfig(transition, animations, animationState, styleKeys) {
|
|
164
|
-
const normalized = (0, import_animation_helpers.normalizeTransition)(transition)
|
|
165
|
-
|
|
185
|
+
const normalized = (0, import_animation_helpers.normalizeTransition)(transition);
|
|
186
|
+
const effectiveKey = (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState);
|
|
166
187
|
let base = effectiveKey ? animations[effectiveKey] ?? {
|
|
167
188
|
type: "spring"
|
|
168
189
|
} : {
|
|
169
190
|
type: "spring"
|
|
170
191
|
};
|
|
171
|
-
normalized.delay
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
192
|
+
if (normalized.delay) {
|
|
193
|
+
base = {
|
|
194
|
+
...base,
|
|
195
|
+
delay: normalized.delay
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (normalized.config) {
|
|
199
|
+
base = {
|
|
200
|
+
...base,
|
|
201
|
+
...normalized.config
|
|
202
|
+
};
|
|
203
|
+
if (base.type !== "timing" && normalized.config.duration !== void 0 && normalized.config.damping === void 0 && normalized.config.stiffness === void 0 && normalized.config.mass === void 0) {
|
|
204
|
+
base = {
|
|
205
|
+
...base,
|
|
206
|
+
type: "timing"
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
181
210
|
const propertyConfigs = {};
|
|
182
211
|
for (const key of styleKeys) {
|
|
183
212
|
const propAnimation = normalized.properties[key];
|
|
184
|
-
if (typeof propAnimation
|
|
185
|
-
|
|
186
|
-
|
|
213
|
+
if (typeof propAnimation === "string") {
|
|
214
|
+
propertyConfigs[key] = animations[propAnimation] ?? base;
|
|
215
|
+
} else if (propAnimation && typeof propAnimation === "object") {
|
|
216
|
+
const configType = propAnimation.type;
|
|
217
|
+
const baseForProp = configType ? animations[configType] ?? base : base;
|
|
187
218
|
propertyConfigs[key] = {
|
|
188
219
|
...baseForProp,
|
|
189
220
|
...propAnimation
|
|
190
221
|
};
|
|
191
|
-
} else
|
|
222
|
+
} else {
|
|
223
|
+
propertyConfigs[key] = base;
|
|
224
|
+
}
|
|
192
225
|
}
|
|
193
226
|
return {
|
|
194
227
|
baseConfig: base,
|
|
@@ -197,23 +230,31 @@ function buildTransitionConfig(transition, animations, animationState, styleKeys
|
|
|
197
230
|
}
|
|
198
231
|
function getStyleKeys(style) {
|
|
199
232
|
const keys = new Set(Object.keys(style));
|
|
200
|
-
if (style.transform && Array.isArray(style.transform))
|
|
233
|
+
if (style.transform && Array.isArray(style.transform)) {
|
|
234
|
+
for (const t of style.transform) {
|
|
235
|
+
if (t && typeof t === "object") {
|
|
236
|
+
keys.add(Object.keys(t)[0]);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
201
240
|
return keys;
|
|
202
241
|
}
|
|
203
242
|
function createAnimations(animationsConfig) {
|
|
204
243
|
const animations = {};
|
|
205
|
-
for (const key in animationsConfig)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
244
|
+
for (const key in animationsConfig) {
|
|
245
|
+
animations[key] = {
|
|
246
|
+
type: "spring",
|
|
247
|
+
...animationsConfig[key]
|
|
248
|
+
};
|
|
249
|
+
}
|
|
209
250
|
return {
|
|
210
|
-
needsCustomComponent:
|
|
251
|
+
needsCustomComponent: true,
|
|
211
252
|
View: import_core.isWeb ? AnimatedView : Animated.View,
|
|
212
253
|
Text: import_core.isWeb ? AnimatedText : Animated.Text,
|
|
213
|
-
isReactNative:
|
|
254
|
+
isReactNative: true,
|
|
214
255
|
inputStyle: "value",
|
|
215
256
|
outputStyle: "inline",
|
|
216
|
-
avoidReRenders:
|
|
257
|
+
avoidReRenders: true,
|
|
217
258
|
animations,
|
|
218
259
|
usePresence: import_use_presence.usePresence,
|
|
219
260
|
ResetPresence: import_use_presence.ResetPresence,
|
|
@@ -236,18 +277,27 @@ function createAnimations(animationsConfig) {
|
|
|
236
277
|
setValue(next, config = {
|
|
237
278
|
type: "spring"
|
|
238
279
|
}, onFinish) {
|
|
239
|
-
"
|
|
280
|
+
if (config.type === "direct") {
|
|
281
|
+
sharedValue.value = next;
|
|
282
|
+
onFinish?.();
|
|
283
|
+
} else {
|
|
284
|
+
const cb = onFinish ? () => {
|
|
285
|
+
"worklet";
|
|
240
286
|
|
|
241
|
-
|
|
242
|
-
|
|
287
|
+
(0, import_react_native_reanimated.runOnJS)(onFinish)();
|
|
288
|
+
} : void 0;
|
|
289
|
+
if (import_core.isWeb) {
|
|
290
|
+
sharedValue.value = config.type === "spring" ? (0, import_react_native_reanimated.withSpring)(next, config, cb) : (0, import_react_native_reanimated.withTiming)(next, config, cb);
|
|
291
|
+
} else {
|
|
292
|
+
(0, import_react_native_reanimated.runOnUI)(() => {
|
|
293
|
+
"worklet";
|
|
243
294
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
295
|
+
sharedValue.value = config.type === "spring" ? (0, import_react_native_reanimated.withSpring)(next, config, cb) : (0, import_react_native_reanimated.withTiming)(next, config, cb);
|
|
296
|
+
})();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
247
299
|
},
|
|
248
300
|
stop() {
|
|
249
|
-
"worklet";
|
|
250
|
-
|
|
251
301
|
(0, import_react_native_reanimated.cancelAnimation)(sharedValue);
|
|
252
302
|
}
|
|
253
303
|
}), [sharedValue]);
|
|
@@ -260,106 +310,161 @@ function createAnimations(animationsConfig) {
|
|
|
260
310
|
}, onValue) {
|
|
261
311
|
const instance = value.getInstance();
|
|
262
312
|
return (0, import_react_native_reanimated.useAnimatedReaction)(() => instance.value, (next, prev) => {
|
|
263
|
-
prev !== next
|
|
313
|
+
if (prev !== next) {
|
|
314
|
+
(0, import_react_native_reanimated.runOnJS)(onValue)(next);
|
|
315
|
+
}
|
|
264
316
|
}, [onValue, instance]);
|
|
265
317
|
},
|
|
266
318
|
// =========================================================================
|
|
267
319
|
// useAnimatedNumberStyle - Create animated styles from values
|
|
268
320
|
// =========================================================================
|
|
269
321
|
useAnimatedNumberStyle(val, getStyle) {
|
|
270
|
-
const instance = val.getInstance()
|
|
271
|
-
|
|
272
|
-
|
|
322
|
+
const instance = val.getInstance();
|
|
323
|
+
if (import_core.isWeb) {
|
|
324
|
+
return (0, import_react_native_reanimated.useAnimatedStyle)(() => {
|
|
325
|
+
"worklet";
|
|
326
|
+
|
|
327
|
+
return getStyle(instance.value);
|
|
328
|
+
}, [instance, getStyle]);
|
|
329
|
+
}
|
|
330
|
+
const styleVal = (0, import_react_native_reanimated.useDerivedValue)(() => {
|
|
331
|
+
"worklet";
|
|
332
|
+
|
|
333
|
+
return getStyle(instance.value);
|
|
334
|
+
});
|
|
335
|
+
return (0, import_react_native_reanimated.useAnimatedStyle)(() => {
|
|
336
|
+
"worklet";
|
|
337
|
+
|
|
338
|
+
return styleVal.value;
|
|
339
|
+
});
|
|
340
|
+
},
|
|
341
|
+
useAnimatedNumbersStyle(vals, getStyle) {
|
|
342
|
+
const instances = vals.map(v => v.getInstance());
|
|
343
|
+
return (0, import_react_native_reanimated.useAnimatedStyle)(() => {
|
|
344
|
+
"worklet";
|
|
345
|
+
|
|
346
|
+
const currentValues = instances.map(inst => inst.value);
|
|
347
|
+
return getStyle(...currentValues);
|
|
348
|
+
}, import_core.isWeb ? [getStyle, ...instances] : void 0);
|
|
273
349
|
},
|
|
274
350
|
// =========================================================================
|
|
275
351
|
// useAnimations - Main animation hook for components
|
|
276
352
|
// =========================================================================
|
|
277
353
|
useAnimations(animationProps) {
|
|
278
354
|
const {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
355
|
+
props,
|
|
356
|
+
presence,
|
|
357
|
+
style,
|
|
358
|
+
componentState,
|
|
359
|
+
useStyleEmitter,
|
|
360
|
+
themeName,
|
|
361
|
+
stateRef,
|
|
362
|
+
styleState
|
|
363
|
+
} = animationProps;
|
|
364
|
+
const isHydrating = componentState.unmounted === true;
|
|
365
|
+
const isMounting = componentState.unmounted === "should-enter";
|
|
366
|
+
const isEntering = !!componentState.unmounted;
|
|
367
|
+
const isExiting = presence?.[0] === false;
|
|
368
|
+
const wasEnteringRef = (0, import_react.useRef)(isEntering);
|
|
369
|
+
const justFinishedEntering = wasEnteringRef.current && !isEntering;
|
|
294
370
|
import_react.default.useEffect(() => {
|
|
295
371
|
wasEnteringRef.current = isEntering;
|
|
296
372
|
});
|
|
297
|
-
const effectiveTransition = styleState?.effectiveTransition ?? props.transition
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
373
|
+
const effectiveTransition = styleState?.effectiveTransition ?? props.transition;
|
|
374
|
+
const normalized = (0, import_animation_helpers.normalizeTransition)(effectiveTransition);
|
|
375
|
+
const animationState = isExiting ? "exit" : isMounting || justFinishedEntering ? "enter" : "default";
|
|
376
|
+
const animationKey = (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState);
|
|
377
|
+
const disableAnimation = isHydrating || !animationKey;
|
|
378
|
+
const isDark = themeName?.startsWith("dark") || false;
|
|
379
|
+
const sendExitComplete = presence?.[1];
|
|
380
|
+
const exitCycleIdRef = (0, import_react.useRef)(0);
|
|
381
|
+
const pendingExitKeysRef = (0, import_react.useRef)(/* @__PURE__ */new Set());
|
|
382
|
+
const exitCompletedRef = (0, import_react.useRef)(false);
|
|
383
|
+
const wasExitingRef = (0, import_react.useRef)(false);
|
|
384
|
+
const justStartedExiting = isExiting && !wasExitingRef.current;
|
|
385
|
+
const justStoppedExiting = !isExiting && wasExitingRef.current;
|
|
386
|
+
const markExitKeyDone = (0, import_core.useEvent)((key, cycleId, finished) => {
|
|
387
|
+
if (cycleId !== exitCycleIdRef.current) return;
|
|
388
|
+
if (exitCompletedRef.current) return;
|
|
389
|
+
pendingExitKeysRef.current.delete(key);
|
|
390
|
+
if (pendingExitKeysRef.current.size === 0) {
|
|
391
|
+
exitCompletedRef.current = true;
|
|
392
|
+
sendExitComplete?.();
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
const isExitingRef = (0, import_react_native_reanimated.useSharedValue)(isExiting);
|
|
396
|
+
const exitCycleIdShared = (0, import_react_native_reanimated.useSharedValue)(exitCycleIdRef.current);
|
|
397
|
+
if (justStartedExiting) {
|
|
398
|
+
exitCycleIdRef.current++;
|
|
399
|
+
exitCompletedRef.current = false;
|
|
400
|
+
pendingExitKeysRef.current.clear();
|
|
401
|
+
}
|
|
402
|
+
if (justStoppedExiting) {
|
|
403
|
+
exitCycleIdRef.current++;
|
|
404
|
+
pendingExitKeysRef.current.clear();
|
|
405
|
+
}
|
|
406
|
+
(0, import_core.useIsomorphicLayoutEffect)(() => {
|
|
407
|
+
isExitingRef.value = isExiting;
|
|
408
|
+
exitCycleIdShared.value = exitCycleIdRef.current;
|
|
409
|
+
}, [isExiting, exitCycleIdRef.current]);
|
|
410
|
+
import_react.default.useEffect(() => {
|
|
318
411
|
wasExitingRef.current = isExiting;
|
|
319
412
|
});
|
|
320
|
-
const animatedTargetsRef = (0, import_react_native_reanimated.useSharedValue)(null)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
413
|
+
const animatedTargetsRef = (0, import_react_native_reanimated.useSharedValue)(null);
|
|
414
|
+
const staticTargetsRef = (0, import_react_native_reanimated.useSharedValue)(null);
|
|
415
|
+
const transformTargetsRef = (0, import_react_native_reanimated.useSharedValue)(null);
|
|
416
|
+
const {
|
|
417
|
+
animatedStyles,
|
|
418
|
+
staticStyles
|
|
419
|
+
} = (0, import_react.useMemo)(() => {
|
|
420
|
+
const animated = {};
|
|
421
|
+
const staticStyles2 = {};
|
|
422
|
+
const animateOnly = props.animateOnly;
|
|
423
|
+
for (const key in style) {
|
|
424
|
+
const rawValue = style[key];
|
|
425
|
+
const value = resolveDynamicValue(rawValue, isDark);
|
|
426
|
+
if (value === void 0) continue;
|
|
427
|
+
if (disableAnimation) {
|
|
428
|
+
staticStyles2[key] = value;
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
if (canAnimateProperty(key, value, animateOnly)) {
|
|
432
|
+
animated[key] = value;
|
|
433
|
+
} else {
|
|
434
|
+
staticStyles2[key] = value;
|
|
340
435
|
}
|
|
341
|
-
|
|
436
|
+
}
|
|
437
|
+
if (isMounting) {
|
|
438
|
+
for (const key in animated) {
|
|
439
|
+
staticStyles2[key] = animated[key];
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return {
|
|
443
|
+
animatedStyles: animated,
|
|
444
|
+
staticStyles: staticStyles2
|
|
445
|
+
};
|
|
446
|
+
}, [disableAnimation, style, isDark, isMounting, props.animateOnly]);
|
|
447
|
+
const {
|
|
448
|
+
baseConfig,
|
|
449
|
+
propertyConfigs
|
|
450
|
+
} = (0, import_react.useMemo)(() => {
|
|
451
|
+
if (isHydrating) {
|
|
342
452
|
return {
|
|
343
|
-
|
|
344
|
-
|
|
453
|
+
baseConfig: {
|
|
454
|
+
type: "timing",
|
|
455
|
+
duration: 0
|
|
456
|
+
},
|
|
457
|
+
propertyConfigs: {}
|
|
345
458
|
};
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
propertyConfigs: {}
|
|
356
|
-
} : buildTransitionConfig(props.transition, animations, animationState, getStyleKeys(animatedStyles)), [isHydrating, props.transition, animatedStyles, animationState]),
|
|
357
|
-
configRef = (0, import_react_native_reanimated.useSharedValue)({
|
|
358
|
-
baseConfig,
|
|
359
|
-
propertyConfigs,
|
|
360
|
-
disableAnimation,
|
|
361
|
-
isHydrating
|
|
362
|
-
});
|
|
459
|
+
}
|
|
460
|
+
return buildTransitionConfig(props.transition, animations, animationState, getStyleKeys(animatedStyles));
|
|
461
|
+
}, [isHydrating, props.transition, animatedStyles, animationState]);
|
|
462
|
+
const configRef = (0, import_react_native_reanimated.useSharedValue)({
|
|
463
|
+
baseConfig,
|
|
464
|
+
propertyConfigs,
|
|
465
|
+
disableAnimation,
|
|
466
|
+
isHydrating
|
|
467
|
+
});
|
|
363
468
|
(0, import_core.useIsomorphicLayoutEffect)(() => {
|
|
364
469
|
configRef.set({
|
|
365
470
|
baseConfig,
|
|
@@ -367,16 +472,17 @@ function createAnimations(animationsConfig) {
|
|
|
367
472
|
disableAnimation,
|
|
368
473
|
isHydrating
|
|
369
474
|
});
|
|
370
|
-
}, [baseConfig, propertyConfigs, disableAnimation, isHydrating])
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
475
|
+
}, [baseConfig, propertyConfigs, disableAnimation, isHydrating]);
|
|
476
|
+
useStyleEmitter?.((nextStyle, effectiveTransition2) => {
|
|
477
|
+
const animateOnly = props.animateOnly;
|
|
478
|
+
const animated = {};
|
|
479
|
+
const statics = {};
|
|
480
|
+
const transforms = [];
|
|
481
|
+
const transitionToUse = effectiveTransition2 ?? props.transition;
|
|
482
|
+
const {
|
|
483
|
+
baseConfig: newBase,
|
|
484
|
+
propertyConfigs: newPropertyConfigs
|
|
485
|
+
} = buildTransitionConfig(transitionToUse, animations, animationState, getStyleKeys(nextStyle));
|
|
380
486
|
configRef.set({
|
|
381
487
|
baseConfig: newBase,
|
|
382
488
|
propertyConfigs: newPropertyConfigs,
|
|
@@ -384,76 +490,108 @@ function createAnimations(animationsConfig) {
|
|
|
384
490
|
isHydrating: configRef.get().isHydrating
|
|
385
491
|
});
|
|
386
492
|
for (const key in nextStyle) {
|
|
387
|
-
const rawValue = nextStyle[key]
|
|
388
|
-
|
|
389
|
-
if (value
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
493
|
+
const rawValue = nextStyle[key];
|
|
494
|
+
const value = resolveDynamicValue(rawValue, isDark);
|
|
495
|
+
if (value == void 0) continue;
|
|
496
|
+
if (configRef.get().disableAnimation) {
|
|
497
|
+
statics[key] = value;
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
if (key === "transform" && Array.isArray(value)) {
|
|
501
|
+
for (const t of value) {
|
|
502
|
+
if (t && typeof t === "object") {
|
|
503
|
+
const tKey = Object.keys(t)[0];
|
|
504
|
+
const tVal = t[tKey];
|
|
505
|
+
if (typeof tVal === "number" || typeof tVal === "string") {
|
|
506
|
+
transforms.push(t);
|
|
507
|
+
}
|
|
399
508
|
}
|
|
400
|
-
continue;
|
|
401
509
|
}
|
|
402
|
-
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
if (canAnimateProperty(key, value, animateOnly)) {
|
|
513
|
+
animated[key] = value;
|
|
514
|
+
} else {
|
|
515
|
+
statics[key] = value;
|
|
403
516
|
}
|
|
404
517
|
}
|
|
405
|
-
animatedTargetsRef.set(animated)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
518
|
+
animatedTargetsRef.set(animated);
|
|
519
|
+
staticTargetsRef.set(statics);
|
|
520
|
+
transformTargetsRef.set(transforms);
|
|
521
|
+
if (process.env.NODE_ENV === "development" && props.debug && props.debug !== "profile") {
|
|
522
|
+
console.info("[animations-reanimated] useStyleEmitter update", {
|
|
523
|
+
animated,
|
|
524
|
+
statics,
|
|
525
|
+
transforms
|
|
526
|
+
});
|
|
527
|
+
}
|
|
410
528
|
});
|
|
411
|
-
const exitKeysRegistered = (0, import_react.useRef)(
|
|
529
|
+
const exitKeysRegistered = (0, import_react.useRef)(false);
|
|
412
530
|
if (justStartedExiting && sendExitComplete) {
|
|
413
|
-
const exitKeys = []
|
|
414
|
-
|
|
415
|
-
for (const key in animatedStyles)
|
|
531
|
+
const exitKeys = [];
|
|
532
|
+
const animateOnly = props.animateOnly;
|
|
533
|
+
for (const key in animatedStyles) {
|
|
534
|
+
if (key === "transform") continue;
|
|
535
|
+
if (canAnimateProperty(key, animatedStyles[key], animateOnly)) {
|
|
536
|
+
exitKeys.push(key);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
416
539
|
const transforms = animatedStyles.transform;
|
|
417
|
-
if (transforms && Array.isArray(transforms))
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
if (
|
|
422
|
-
|
|
540
|
+
if (transforms && Array.isArray(transforms)) {
|
|
541
|
+
for (const t of transforms) {
|
|
542
|
+
if (!t) continue;
|
|
543
|
+
const tKey = Object.keys(t)[0];
|
|
544
|
+
if (tKey) {
|
|
545
|
+
if (animateOnly && !animateOnly.includes(tKey)) {
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
exitKeys.push(`transform:${tKey}`);
|
|
549
|
+
}
|
|
423
550
|
}
|
|
424
551
|
}
|
|
425
|
-
pendingExitKeysRef.current = new Set(exitKeys)
|
|
552
|
+
pendingExitKeysRef.current = new Set(exitKeys);
|
|
553
|
+
exitKeysRegistered.current = exitKeys.length > 0;
|
|
426
554
|
}
|
|
427
555
|
import_react.default.useEffect(() => {
|
|
428
|
-
!justStartedExiting || !sendExitComplete
|
|
556
|
+
if (!justStartedExiting || !sendExitComplete) return;
|
|
557
|
+
if (!exitKeysRegistered.current && pendingExitKeysRef.current.size === 0) {
|
|
558
|
+
if (!exitCompletedRef.current) {
|
|
559
|
+
exitCompletedRef.current = true;
|
|
560
|
+
sendExitComplete();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
429
563
|
}, [justStartedExiting, sendExitComplete]);
|
|
430
564
|
const animatedStyle = (0, import_react_native_reanimated.useAnimatedStyle)(() => {
|
|
431
565
|
"worklet";
|
|
432
566
|
|
|
433
|
-
if (disableAnimation || isHydrating)
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
567
|
+
if (disableAnimation || isHydrating) {
|
|
568
|
+
return {};
|
|
569
|
+
}
|
|
570
|
+
const result = {};
|
|
571
|
+
const config = configRef.get();
|
|
572
|
+
const emitterAnimated = animatedTargetsRef.value;
|
|
573
|
+
const emitterStatic = staticTargetsRef.value;
|
|
574
|
+
const emitterTransforms = transformTargetsRef.value;
|
|
575
|
+
const hasEmitterUpdates = emitterAnimated !== null;
|
|
576
|
+
const animatedValues = hasEmitterUpdates ? emitterAnimated : animatedStyles;
|
|
577
|
+
const staticValues = hasEmitterUpdates ? emitterStatic : {};
|
|
578
|
+
const currentlyExiting = isExitingRef.value;
|
|
579
|
+
const currentCycleId = exitCycleIdShared.value;
|
|
580
|
+
for (const key in staticValues) {
|
|
581
|
+
result[key] = staticValues[key];
|
|
582
|
+
}
|
|
445
583
|
for (const key in animatedValues) {
|
|
446
584
|
if (key === "transform") continue;
|
|
447
|
-
const targetValue = animatedValues[key]
|
|
448
|
-
|
|
585
|
+
const targetValue = animatedValues[key];
|
|
586
|
+
const propConfig = config.propertyConfigs[key] ?? config.baseConfig;
|
|
449
587
|
let callback;
|
|
450
588
|
if (currentlyExiting) {
|
|
451
|
-
const capturedKey = key
|
|
452
|
-
|
|
589
|
+
const capturedKey = key;
|
|
590
|
+
const capturedCycleId = currentCycleId;
|
|
453
591
|
callback = finished => {
|
|
454
592
|
"worklet";
|
|
455
593
|
|
|
456
|
-
(0, import_react_native_reanimated.runOnJS)(markExitKeyDone)(capturedKey, capturedCycleId, finished ??
|
|
594
|
+
(0, import_react_native_reanimated.runOnJS)(markExitKeyDone)(capturedKey, capturedCycleId, finished ?? false);
|
|
457
595
|
};
|
|
458
596
|
}
|
|
459
597
|
result[key] = applyAnimation(targetValue, propConfig, callback);
|
|
@@ -466,18 +604,18 @@ function createAnimations(animationsConfig) {
|
|
|
466
604
|
const keys = Object.keys(t);
|
|
467
605
|
if (keys.length === 0) continue;
|
|
468
606
|
const value = t[keys[0]];
|
|
469
|
-
if (typeof value
|
|
470
|
-
const transformKey = Object.keys(t)[0]
|
|
471
|
-
|
|
472
|
-
|
|
607
|
+
if (typeof value === "number" || typeof value === "string") {
|
|
608
|
+
const transformKey = Object.keys(t)[0];
|
|
609
|
+
const targetValue = t[transformKey];
|
|
610
|
+
const propConfig = config.propertyConfigs[transformKey] ?? config.baseConfig;
|
|
473
611
|
let callback;
|
|
474
612
|
if (currentlyExiting) {
|
|
475
|
-
const capturedKey = `transform:${transformKey}
|
|
476
|
-
|
|
613
|
+
const capturedKey = `transform:${transformKey}`;
|
|
614
|
+
const capturedCycleId = currentCycleId;
|
|
477
615
|
callback = finished => {
|
|
478
616
|
"worklet";
|
|
479
617
|
|
|
480
|
-
(0, import_react_native_reanimated.runOnJS)(markExitKeyDone)(capturedKey, capturedCycleId, finished ??
|
|
618
|
+
(0, import_react_native_reanimated.runOnJS)(markExitKeyDone)(capturedKey, capturedCycleId, finished ?? false);
|
|
481
619
|
};
|
|
482
620
|
}
|
|
483
621
|
validTransforms.push({
|
|
@@ -485,21 +623,26 @@ function createAnimations(animationsConfig) {
|
|
|
485
623
|
});
|
|
486
624
|
}
|
|
487
625
|
}
|
|
488
|
-
validTransforms.length > 0
|
|
626
|
+
if (validTransforms.length > 0) {
|
|
627
|
+
result.transform = validTransforms;
|
|
628
|
+
}
|
|
489
629
|
}
|
|
490
630
|
return result;
|
|
491
|
-
}, [animatedStyles, baseConfig, propertyConfigs, disableAnimation, isHydrating,
|
|
492
|
-
//
|
|
493
|
-
animatedTargetsRef, staticTargetsRef, transformTargetsRef, isExitingRef, exitCycleIdShared, markExitKeyDone]);
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
631
|
+
}, import_core.isWeb ? [animatedStyles, baseConfig, propertyConfigs, disableAnimation, isHydrating,
|
|
632
|
+
// pass SharedValues so the mapper watches them on web (no babel plugin)
|
|
633
|
+
animatedTargetsRef, staticTargetsRef, transformTargetsRef, isExitingRef, exitCycleIdShared, markExitKeyDone] : void 0);
|
|
634
|
+
if (process.env.NODE_ENV === "development" && props.debug && props.debug !== "profile") {
|
|
635
|
+
console.info("[animations-reanimated] useAnimations", {
|
|
636
|
+
animationKey,
|
|
637
|
+
componentState,
|
|
638
|
+
isExiting,
|
|
639
|
+
animatedStyles,
|
|
640
|
+
staticStyles,
|
|
641
|
+
baseConfig,
|
|
642
|
+
propertyConfigs
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
return {
|
|
503
646
|
style: [staticStyles, animatedStyle]
|
|
504
647
|
};
|
|
505
648
|
}
|