@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.
@@ -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
- __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
  createAnimations: () => createAnimations
35
37
  });
36
38
  module.exports = __toCommonJS(createAnimations_exports);
37
- var import_animation_helpers = require("@hanzogui/animation-helpers"),
38
- import_core = require("@hanzogui/core"),
39
- import_use_presence = require("@hanzogui/use-presence"),
40
- import_react = __toESM(require("react"), 1),
41
- import_react_native_reanimated = __toESM(require("react-native-reanimated"), 1),
42
- import_jsx_runtime = require("react/jsx-runtime");
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
- const mod = module2;
45
- return (mod.__esModule || mod[Symbol.toStringTag] === "Module") && mod.default || mod;
46
- },
47
- Animated = getDefaultExport(import_react_native_reanimated.default),
48
- resolveDynamicValue = (value, isDark) => {
49
- if (value !== null && typeof value == "object" && "dynamic" in value && typeof value.dynamic == "object") {
50
- const dynamic = value.dynamic;
51
- return isDark ? dynamic.dark : dynamic.light;
52
- }
53
- return value;
54
- },
55
- applyAnimation = (targetValue, config, callback) => {
56
- "worklet";
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
- const delay = config.delay;
59
- let animatedValue;
60
- return config.type === "timing" ? animatedValue = (0, import_react_native_reanimated.withTiming)(targetValue, config, callback) : animatedValue = (0, import_react_native_reanimated.withSpring)(targetValue, config, callback), delay && delay > 0 && (animatedValue = (0, import_react_native_reanimated.withDelay)(delay, animatedValue)), animatedValue;
61
- },
62
- ANIMATABLE_PROPERTIES = {
63
- // Transform
64
- transform: !0,
65
- // Opacity
66
- opacity: !0,
67
- // Dimensions
68
- height: !0,
69
- width: !0,
70
- minWidth: !0,
71
- minHeight: !0,
72
- maxWidth: !0,
73
- maxHeight: !0,
74
- // Background
75
- backgroundColor: !0,
76
- // Border colors
77
- borderColor: !0,
78
- borderLeftColor: !0,
79
- borderRightColor: !0,
80
- borderTopColor: !0,
81
- borderBottomColor: !0,
82
- // Border radius
83
- borderRadius: !0,
84
- borderTopLeftRadius: !0,
85
- borderTopRightRadius: !0,
86
- borderBottomLeftRadius: !0,
87
- borderBottomRightRadius: !0,
88
- // Border width
89
- borderWidth: !0,
90
- borderLeftWidth: !0,
91
- borderRightWidth: !0,
92
- borderTopWidth: !0,
93
- borderBottomWidth: !0,
94
- // Text
95
- color: !0,
96
- fontSize: !0,
97
- fontWeight: !0,
98
- lineHeight: !0,
99
- letterSpacing: !0,
100
- // Position
101
- left: !0,
102
- right: !0,
103
- top: !0,
104
- bottom: !0,
105
- // Margin
106
- margin: !0,
107
- marginTop: !0,
108
- marginBottom: !0,
109
- marginLeft: !0,
110
- marginRight: !0,
111
- marginHorizontal: !0,
112
- marginVertical: !0,
113
- // Padding
114
- padding: !0,
115
- paddingTop: !0,
116
- paddingBottom: !0,
117
- paddingLeft: !0,
118
- paddingRight: !0,
119
- paddingHorizontal: !0,
120
- paddingVertical: !0,
121
- // Flex/Gap
122
- gap: !0,
123
- rowGap: !0,
124
- columnGap: !0,
125
- flex: !0,
126
- flexGrow: !0,
127
- flexShrink: !0
128
- },
129
- canAnimateProperty = (key, value, animateOnly) => !(!ANIMATABLE_PROPERTIES[key] || value === "auto" || typeof value == "string" && value.startsWith("calc") || animateOnly && !animateOnly.includes(key));
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
- Component = Animated.createAnimatedComponent((0, import_react.forwardRef)((propsIn, ref) => {
133
- const {
134
- forwardedRef,
135
- render = defaultTag,
136
- ...rest
137
- } = propsIn,
138
- hostRef = (0, import_react.useRef)(null),
139
- composedRefs = (0, import_core.useComposedRefs)(forwardedRef, ref, hostRef),
140
- stateRef = (0, import_react.useRef)({
141
- get host() {
142
- return hostRef.current;
143
- }
144
- }),
145
- [, themeState] = (0, import_core.useThemeWithState)({}),
146
- viewProps = (0, import_core.getSplitStyles)(rest, isText ? import_core.Text.staticConfig : import_core.View.staticConfig, themeState?.theme ?? {}, themeState?.name ?? "", {
147
- unmounted: !1
148
- }, {
149
- isAnimated: !1,
150
- noClass: !0
151
- })?.viewProps ?? {},
152
- Element = render,
153
- transformedProps = import_core.hooks.usePropsTransform?.(render, viewProps, stateRef, !1);
154
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Element, {
155
- ...transformedProps,
156
- ref: composedRefs
157
- });
158
- }));
159
- return Component.acceptRenderProp = !0, Component;
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
- AnimatedText = createWebAnimatedComponent("span");
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
- effectiveKey = (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState);
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 && (base = {
172
- ...base,
173
- delay: normalized.delay
174
- }), normalized.config && (base = {
175
- ...base,
176
- ...normalized.config
177
- }, base.type !== "timing" && normalized.config.duration !== void 0 && normalized.config.damping === void 0 && normalized.config.stiffness === void 0 && normalized.config.mass === void 0 && (base = {
178
- ...base,
179
- type: "timing"
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 == "string") propertyConfigs[key] = animations[propAnimation] ?? base;else if (propAnimation && typeof propAnimation == "object") {
185
- const configType = propAnimation.type,
186
- baseForProp = configType ? animations[configType] ?? base : base;
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 propertyConfigs[key] = base;
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)) for (const t of style.transform) t && typeof t == "object" && keys.add(Object.keys(t)[0]);
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) animations[key] = {
206
- type: "spring",
207
- ...animationsConfig[key]
208
- };
244
+ for (const key in animationsConfig) {
245
+ animations[key] = {
246
+ type: "spring",
247
+ ...animationsConfig[key]
248
+ };
249
+ }
209
250
  return {
210
- needsCustomComponent: !0,
251
+ needsCustomComponent: true,
211
252
  View: import_core.isWeb ? AnimatedView : Animated.View,
212
253
  Text: import_core.isWeb ? AnimatedText : Animated.Text,
213
- isReactNative: !0,
254
+ isReactNative: true,
214
255
  inputStyle: "value",
215
256
  outputStyle: "inline",
216
- avoidReRenders: !0,
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
- "worklet";
280
+ if (config.type === "direct") {
281
+ sharedValue.value = next;
282
+ onFinish?.();
283
+ } else {
284
+ const cb = onFinish ? () => {
285
+ "worklet";
240
286
 
241
- const handleFinish = onFinish ? () => {
242
- "worklet";
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
- (0, import_react_native_reanimated.runOnJS)(onFinish)();
245
- } : void 0;
246
- config.type === "direct" ? (sharedValue.value = next, onFinish?.()) : config.type === "spring" ? sharedValue.value = (0, import_react_native_reanimated.withSpring)(next, config, handleFinish) : sharedValue.value = (0, import_react_native_reanimated.withTiming)(next, config, handleFinish);
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 && (0, import_react_native_reanimated.runOnJS)(onValue)(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
- derivedValue = (0, import_react_native_reanimated.useDerivedValue)(() => instance.value, [instance, getStyle]);
272
- return (0, import_react_native_reanimated.useAnimatedStyle)(() => getStyle(derivedValue.value), [val, getStyle, derivedValue, instance]);
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
- props,
280
- presence,
281
- style,
282
- componentState,
283
- useStyleEmitter,
284
- themeName,
285
- stateRef,
286
- styleState
287
- } = animationProps,
288
- isHydrating = componentState.unmounted === !0,
289
- isMounting = componentState.unmounted === "should-enter",
290
- isEntering = !!componentState.unmounted,
291
- isExiting = presence?.[0] === !1,
292
- wasEnteringRef = (0, import_react.useRef)(isEntering),
293
- justFinishedEntering = wasEnteringRef.current && !isEntering;
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
- normalized = (0, import_animation_helpers.normalizeTransition)(effectiveTransition),
299
- animationState = isExiting ? "exit" : isMounting || justFinishedEntering ? "enter" : "default",
300
- animationKey = (0, import_animation_helpers.getEffectiveAnimation)(normalized, animationState),
301
- disableAnimation = isHydrating || !animationKey,
302
- isDark = themeName?.startsWith("dark") || !1,
303
- sendExitComplete = presence?.[1],
304
- exitCycleIdRef = (0, import_react.useRef)(0),
305
- pendingExitKeysRef = (0, import_react.useRef)(/* @__PURE__ */new Set()),
306
- exitCompletedRef = (0, import_react.useRef)(!1),
307
- wasExitingRef = (0, import_react.useRef)(!1),
308
- justStartedExiting = isExiting && !wasExitingRef.current,
309
- justStoppedExiting = !isExiting && wasExitingRef.current,
310
- markExitKeyDone = (0, import_core.useEvent)((key, cycleId, finished) => {
311
- cycleId === exitCycleIdRef.current && (exitCompletedRef.current || (pendingExitKeysRef.current.delete(key), pendingExitKeysRef.current.size === 0 && (exitCompletedRef.current = !0, sendExitComplete?.())));
312
- }),
313
- isExitingRef = (0, import_react_native_reanimated.useSharedValue)(isExiting),
314
- exitCycleIdShared = (0, import_react_native_reanimated.useSharedValue)(exitCycleIdRef.current);
315
- justStartedExiting && (exitCycleIdRef.current++, exitCompletedRef.current = !1, pendingExitKeysRef.current.clear()), justStoppedExiting && (exitCycleIdRef.current++, pendingExitKeysRef.current.clear()), (0, import_core.useIsomorphicLayoutEffect)(() => {
316
- isExitingRef.value = isExiting, exitCycleIdShared.value = exitCycleIdRef.current;
317
- }, [isExiting, exitCycleIdRef.current]), import_react.default.useEffect(() => {
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
- staticTargetsRef = (0, import_react_native_reanimated.useSharedValue)(null),
322
- transformTargetsRef = (0, import_react_native_reanimated.useSharedValue)(null),
323
- {
324
- animatedStyles,
325
- staticStyles
326
- } = (0, import_react.useMemo)(() => {
327
- const animated = {},
328
- staticStyles2 = {},
329
- animateOnly = props.animateOnly;
330
- for (const key in style) {
331
- const rawValue = style[key],
332
- value = resolveDynamicValue(rawValue, isDark);
333
- if (value !== void 0) {
334
- if (disableAnimation) {
335
- staticStyles2[key] = value;
336
- continue;
337
- }
338
- canAnimateProperty(key, value, animateOnly) ? animated[key] = value : staticStyles2[key] = value;
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
- if (isMounting) for (const key in animated) staticStyles2[key] = animated[key];
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
- animatedStyles: animated,
344
- staticStyles: staticStyles2
453
+ baseConfig: {
454
+ type: "timing",
455
+ duration: 0
456
+ },
457
+ propertyConfigs: {}
345
458
  };
346
- }, [disableAnimation, style, isDark, isMounting, props.animateOnly]),
347
- {
348
- baseConfig,
349
- propertyConfigs
350
- } = (0, import_react.useMemo)(() => isHydrating ? {
351
- baseConfig: {
352
- type: "timing",
353
- duration: 0
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]), useStyleEmitter?.((nextStyle, effectiveTransition2) => {
371
- const animateOnly = props.animateOnly,
372
- animated = {},
373
- statics = {},
374
- transforms = [],
375
- transitionToUse = effectiveTransition2 ?? props.transition,
376
- {
377
- baseConfig: newBase,
378
- propertyConfigs: newPropertyConfigs
379
- } = buildTransitionConfig(transitionToUse, animations, animationState, getStyleKeys(nextStyle));
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
- value = resolveDynamicValue(rawValue, isDark);
389
- if (value != null) {
390
- if (configRef.get().disableAnimation) {
391
- statics[key] = value;
392
- continue;
393
- }
394
- if (key === "transform" && Array.isArray(value)) {
395
- for (const t of value) if (t && typeof t == "object") {
396
- const tKey = Object.keys(t)[0],
397
- tVal = t[tKey];
398
- (typeof tVal == "number" || typeof tVal == "string") && transforms.push(t);
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
- canAnimateProperty(key, value, animateOnly) ? animated[key] = value : statics[key] = value;
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), staticTargetsRef.set(statics), transformTargetsRef.set(transforms), process.env.NODE_ENV === "development" && props.debug && props.debug !== "profile" && console.info("[animations-reanimated] useStyleEmitter update", {
406
- animated,
407
- statics,
408
- transforms
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)(!1);
529
+ const exitKeysRegistered = (0, import_react.useRef)(false);
412
530
  if (justStartedExiting && sendExitComplete) {
413
- const exitKeys = [],
414
- animateOnly = props.animateOnly;
415
- for (const key in animatedStyles) key !== "transform" && canAnimateProperty(key, animatedStyles[key], animateOnly) && exitKeys.push(key);
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)) for (const t of transforms) {
418
- if (!t) continue;
419
- const tKey = Object.keys(t)[0];
420
- if (tKey) {
421
- if (animateOnly && !animateOnly.includes(tKey)) continue;
422
- exitKeys.push(`transform:${tKey}`);
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), exitKeysRegistered.current = exitKeys.length > 0;
552
+ pendingExitKeysRef.current = new Set(exitKeys);
553
+ exitKeysRegistered.current = exitKeys.length > 0;
426
554
  }
427
555
  import_react.default.useEffect(() => {
428
- !justStartedExiting || !sendExitComplete || !exitKeysRegistered.current && pendingExitKeysRef.current.size === 0 && (exitCompletedRef.current || (exitCompletedRef.current = !0, 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) return {};
434
- const result = {},
435
- config = configRef.get(),
436
- emitterAnimated = animatedTargetsRef.value,
437
- emitterStatic = staticTargetsRef.value,
438
- emitterTransforms = transformTargetsRef.value,
439
- hasEmitterUpdates = emitterAnimated !== null,
440
- animatedValues = hasEmitterUpdates ? emitterAnimated : animatedStyles,
441
- staticValues = hasEmitterUpdates ? emitterStatic : {},
442
- currentlyExiting = isExitingRef.value,
443
- currentCycleId = exitCycleIdShared.value;
444
- for (const key in staticValues) result[key] = staticValues[key];
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
- propConfig = config.propertyConfigs[key] ?? config.baseConfig;
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
- capturedCycleId = currentCycleId;
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 ?? !1);
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 == "number" || typeof value == "string") {
470
- const transformKey = Object.keys(t)[0],
471
- targetValue = t[transformKey],
472
- propConfig = config.propertyConfigs[transformKey] ?? config.baseConfig;
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
- capturedCycleId = currentCycleId;
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 ?? !1);
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 && (result.transform = validTransforms);
626
+ if (validTransforms.length > 0) {
627
+ result.transform = validTransforms;
628
+ }
489
629
  }
490
630
  return result;
491
- }, [animatedStyles, baseConfig, propertyConfigs, disableAnimation, isHydrating,
492
- // Pass SharedValues so the mapper watches them on web (see useAnimatedStyle.ts line 470-472)
493
- animatedTargetsRef, staticTargetsRef, transformTargetsRef, isExitingRef, exitCycleIdShared, markExitKeyDone]);
494
- return process.env.NODE_ENV === "development" && props.debug && props.debug !== "profile" && console.info("[animations-reanimated] useAnimations", {
495
- animationKey,
496
- componentState,
497
- isExiting,
498
- animatedStyles,
499
- staticStyles,
500
- baseConfig,
501
- propertyConfigs
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
  }