react-native-screen-transitions 1.0.1 → 1.0.2
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/README.md +4 -4
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
| iOS | Android |
|
|
5
5
|
|---------|---------|
|
|
6
6
|
|<video src="https://github.com/user-attachments/assets/8a7b8006-f165-4a78-b0f9-c94cddd948b9" width="300" controls></video>|<video src="https://github.com/user-attachments/assets/ddebdaa8-a929-43ab-b857-08a00e142343" width="300" controls></video>|
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
|
|
9
9
|
**WIP**: This package is a work-in-progress. It provides customizable screen transition animations for React Native apps, primarily designed for use with `expo-router` and `react-navigation`. It supports gestures, predefined presets, and custom animations, making it easy to add polished transitions to your navigation flows.
|
|
10
10
|
|
|
11
|
-
This library is inspired by the transition system in `@react-navigation/stack` (not the native stack). If you're familiar with how transitions work there (e.g., using interpolators), you'll find this similar.
|
|
11
|
+
This library is inspired by the transition system in `@react-navigation/stack` (not the native stack). If you're familiar with how transitions work there (e.g., using interpolators), you'll find this similar.
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
@@ -334,11 +334,11 @@ export default function B() {
|
|
|
334
334
|
### Known Issues and Roadmap
|
|
335
335
|
This is a WIP package, so expect improvements. Current known issues:
|
|
336
336
|
- **Gestures with ScrollViews**: Gestures can be wonky when combined with scrollable content. For example, if a screen defines vertical dismissal gestures and contains a vertical `ScrollView`, the gesture may not trigger reliably (conflicts with scroll handling).
|
|
337
|
+
- **Gestures Dismisall with Nested Navigators**: When using nested navigators with gesture dismissal enabled, dismissing a nested screen via gesture may cause the transparent modal to appear dismissed while remaining open. This affects the visual state but not the actual navigation state.
|
|
337
338
|
- **Web Support**: Not intended or tested for web—focus is on mobile (iOS/Android). Web may have issues with gestures and animations.
|
|
338
|
-
- **Other**: Limited testing in complex nested navigators; potential edge cases with rapid transitions.
|
|
339
339
|
|
|
340
340
|
|
|
341
|
-
### Note:
|
|
341
|
+
### Note:
|
|
342
342
|
|
|
343
343
|
This package is something I'll work on in my freetime. However, you can see the roadmap I plan on following in the coming future.
|
|
344
344
|
|
package/dist/index.js
CHANGED
|
@@ -384,6 +384,11 @@ var RouteStore = {
|
|
|
384
384
|
routeKeys.splice(indexToRemove, 1);
|
|
385
385
|
}
|
|
386
386
|
});
|
|
387
|
+
},
|
|
388
|
+
getPreviousRoute: (key) => {
|
|
389
|
+
if (!key) return null;
|
|
390
|
+
const index = useRouteStore.getState().routeKeys.indexOf(key);
|
|
391
|
+
return index > -1 ? useRouteStore.getState().routes[useRouteStore.getState().routeKeys[index - 1]] : null;
|
|
387
392
|
}
|
|
388
393
|
};
|
|
389
394
|
|
|
@@ -684,9 +689,17 @@ var useAnimationBuilder = () => {
|
|
|
684
689
|
}
|
|
685
690
|
const currentScreenIndex = current.index;
|
|
686
691
|
const nextKey = routeKeys[currentScreenIndex + 1];
|
|
692
|
+
const next = nextKey ? routes[nextKey] : void 0;
|
|
693
|
+
const isSameNavigator = next?.navigatorKey === current.navigatorKey;
|
|
694
|
+
if (!isSameNavigator) {
|
|
695
|
+
return {
|
|
696
|
+
currentRoute: current,
|
|
697
|
+
nextRoute: void 0
|
|
698
|
+
};
|
|
699
|
+
}
|
|
687
700
|
return {
|
|
688
701
|
currentRoute: current,
|
|
689
|
-
nextRoute:
|
|
702
|
+
nextRoute: next
|
|
690
703
|
};
|
|
691
704
|
})
|
|
692
705
|
);
|
|
@@ -776,15 +789,23 @@ var createConfig = ({
|
|
|
776
789
|
}) => {
|
|
777
790
|
return {
|
|
778
791
|
focus: (e) => {
|
|
792
|
+
const navigatorKey = reactNavigation.getState().key;
|
|
779
793
|
RouteStore.updateRoute(e.target, {
|
|
780
794
|
id: e.target,
|
|
781
795
|
name: route.name,
|
|
782
796
|
status: 1,
|
|
783
797
|
closing: false,
|
|
798
|
+
navigatorKey,
|
|
784
799
|
...config
|
|
785
800
|
});
|
|
786
801
|
},
|
|
787
802
|
beforeRemove: (e) => {
|
|
803
|
+
const navigatorState = reactNavigation.getState();
|
|
804
|
+
const isLastScreenInStack = navigatorState.routes.length === 1 && navigatorState.routes[0].key === e.target;
|
|
805
|
+
if (isLastScreenInStack) {
|
|
806
|
+
RouteStore.removeRoute(e.target);
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
788
809
|
e.preventDefault();
|
|
789
810
|
const handleFinish = (finished) => {
|
|
790
811
|
if (!finished) return;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/configs/presets.ts","../src/configs/specs.ts","../src/hooks/use-screen-animation.tsx","../src/store/utils/use-shallow.tsx","../src/store/utils/shallow.ts","../src/animation-engine.ts","../src/store/utils/create-vanilla-store.ts","../src/store/index.ts","../src/utils/animate.ts","../src/utils/gesture/build-gesture-detector.ts","../src/utils/gesture/create-gesture-activation-criteria.ts","../src/utils/gesture/map-gesture-to-progress.ts","../src/utils/noop-interpolator.ts","../src/hooks/use-key.tsx","../src/utils/create-config.ts","../src/utils/create-transition-component.tsx","../src/hooks/use-skip-first-frame.tsx","../src/utils/default-screen-options.ts"],"sourcesContent":["import { Pressable, View } from \"react-native\";\nimport { presets, specs } from \"./configs\";\nimport { useScreenAnimation } from \"./hooks/use-screen-animation\";\nimport { createConfig } from \"./utils/create-config\";\nimport { createTransitionComponent } from \"./utils/create-transition-component\";\nimport { defaultScreenOptions } from \"./utils/default-screen-options\";\n\nexport default {\n\tcreateTransitionComponent,\n\tView: createTransitionComponent(View),\n\tPressable: createTransitionComponent(Pressable),\n\tcreateConfig,\n\tdefaultScreenOptions,\n\tpresets,\n\tspecs,\n};\n\nexport { useScreenAnimation };\n","import {\n\tExtrapolation,\n\tinterpolate,\n\tinterpolateColor,\n} from \"react-native-reanimated\";\nimport type { TransitionConfig } from \"../types\";\nimport { DefaultSpec } from \"./specs\";\n\nexport const SlideFromTop = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical-inverted\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [-height, 0, height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ZoomIn = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: false,\n\t\tscreenStyleInterpolator: ({ current, next }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst scale = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0.5, 1, 0.5],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\tconst opacity = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0, 1, 0],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }],\n\t\t\t\t\topacity,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const SlideFromBottom = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [height, 0, -height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const DraggableCard = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: [\"horizontal\", \"vertical\"],\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\t/** Combined */\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.75]);\n\n\t\t\t/** Vertical */\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.height * 0.5, screen.height * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/** Horizontal */\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.width * 0.5, screen.width * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateY: translateY }, { translateX }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ElasticCard = (\n\tconfig: Partial<TransitionConfig> & {\n\t\telasticFactor?: number;\n\t} = { elasticFactor: 0.5 },\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"bidirectional\",\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\t/**\n\t\t\t * Applies to both screens ( previous and incoming)\n\t\t\t */\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.8]);\n\n\t\t\t/**\n\t\t\t * Applies to current screen\n\t\t\t */\n\t\t\tconst maxElasticityX = screen.width * (config.elasticFactor ?? 0.5);\n\t\t\tconst maxElasticityY = screen.height * (config.elasticFactor ?? 0.5);\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityX, 0, maxElasticityX],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityY, 0, maxElasticityY],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Applies to unfocused screen ( previous screen )\n\t\t\t */\n\t\t\tconst overlayColor = interpolateColor(\n\t\t\t\tnext?.progress.value || 0,\n\t\t\t\t[0, 1],\n\t\t\t\t[\"rgba(0,0,0,0)\", \"rgba(0,0,0,0.5)\"],\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateX }, { translateY }],\n\t\t\t\t},\n\t\t\t\toverlayStyle: {\n\t\t\t\t\tbackgroundColor: overlayColor,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t...config,\n\t};\n};\n","import type { WithSpringConfig } from \"react-native-reanimated\";\n\nexport const DefaultSpec: WithSpringConfig = {\n\tstiffness: 1000,\n\tdamping: 500,\n\tmass: 3,\n\tovershootClamping: true,\n\trestSpeedThreshold: 0.01,\n};\n","import { useNavigation } from \"@react-navigation/native\";\nimport { useMemo } from \"react\";\nimport { useWindowDimensions } from \"react-native\";\nimport type {\n\tComposedGesture,\n\tGestureType,\n} from \"react-native-gesture-handler\";\nimport { useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useShallow } from \"@/store/utils/use-shallow\";\nimport { animationValues } from \"../animation-engine\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tScreenInterpolationProps,\n\tScreenStyleInterpolator,\n} from \"../types\";\nimport { buildGestureDetector } from \"../utils/gesture/build-gesture-detector\";\nimport { noopinterpolator } from \"../utils/noop-interpolator\";\nimport { useKey } from \"./use-key\";\n\ninterface InternalScreenInterpolationProps extends ScreenInterpolationProps {\n\tgestureDetector: GestureType | ComposedGesture;\n\tscreenStyleInterpolator: ScreenStyleInterpolator;\n}\n\nconst useAnimationBuilder = () => {\n\tconst key = useKey();\n\tconst dimensions = useWindowDimensions();\n\tconst insets = useSafeAreaInsets();\n\tconst navigation = useNavigation();\n\n\tconst { currentRoute, nextRoute } = RouteStore.use(\n\t\tuseShallow(({ routes, routeKeys }) => {\n\t\t\tconst current = routes[key];\n\n\t\t\tif (!current) {\n\t\t\t\treturn { currentRoute: undefined, nextRoute: undefined };\n\t\t\t}\n\n\t\t\tconst currentScreenIndex = current.index;\n\t\t\tconst nextKey = routeKeys[currentScreenIndex + 1];\n\n\t\t\treturn {\n\t\t\t\tcurrentRoute: current,\n\t\t\t\tnextRoute: nextKey ? routes[nextKey] : undefined,\n\t\t\t};\n\t\t}),\n\t);\n\n\tconst panGesture = useMemo(\n\t\t() =>\n\t\t\tbuildGestureDetector({\n\t\t\t\tkey,\n\t\t\t\tprogress: animationValues.screenProgress[key],\n\t\t\t\tconfig: currentRoute || {\n\t\t\t\t\tid: key,\n\t\t\t\t\tname: key,\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tstatus: 0,\n\t\t\t\t\tclosing: false,\n\t\t\t\t},\n\t\t\t\twidth: dimensions.width,\n\t\t\t\theight: dimensions.height,\n\t\t\t\tgoBack: navigation.goBack,\n\t\t\t}),\n\t\t[key, currentRoute, dimensions.width, dimensions.height, navigation.goBack],\n\t);\n\n\t// We'll avoid using makeMutable as fallbacks since useSharedValues are automatically garbage collected\n\tconst progressFallback = useSharedValue(0);\n\tconst gestureDraggingFallback = useSharedValue(0);\n\tconst gestureXFallback = useSharedValue(0);\n\tconst gestureYFallback = useSharedValue(0);\n\tconst normalizedGestureXFallback = useSharedValue(0);\n\tconst normalizedGestureYFallback = useSharedValue(0);\n\n\treturn useMemo(() => {\n\t\treturn {\n\t\t\tcurrent: {\n\t\t\t\tprogress: animationValues.screenProgress[key] || progressFallback,\n\t\t\t\tgesture: {\n\t\t\t\t\tisDragging:\n\t\t\t\t\t\tanimationValues.gestureDragging[key] || gestureDraggingFallback,\n\t\t\t\t\tx: animationValues.gestureX[key] || gestureXFallback,\n\t\t\t\t\ty: animationValues.gestureY[key] || gestureYFallback,\n\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\tanimationValues.normalizedGestureX[key] ||\n\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\tanimationValues.normalizedGestureY[key] ||\n\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t},\n\t\t\t},\n\t\t\tnext:\n\t\t\t\tnextRoute && animationValues.screenProgress[nextRoute.id]\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tprogress: animationValues.screenProgress[nextRoute.id],\n\t\t\t\t\t\t\tgesture: {\n\t\t\t\t\t\t\t\tisDragging:\n\t\t\t\t\t\t\t\t\tanimationValues.gestureDragging[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tgestureDraggingFallback,\n\t\t\t\t\t\t\t\tx: animationValues.gestureX[nextRoute.id] || gestureXFallback,\n\t\t\t\t\t\t\t\ty: animationValues.gestureY[nextRoute.id] || gestureYFallback,\n\t\t\t\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureX[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureY[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tlayouts: { screen: dimensions },\n\t\t\tinsets,\n\t\t\tclosing: currentRoute?.closing || false,\n\t\t\tscreenStyleInterpolator:\n\t\t\t\tnextRoute?.screenStyleInterpolator ||\n\t\t\t\tcurrentRoute?.screenStyleInterpolator ||\n\t\t\t\tnoopinterpolator,\n\n\t\t\tgestureDetector: panGesture,\n\t\t};\n\t}, [\n\t\tkey,\n\t\tcurrentRoute,\n\t\tnextRoute,\n\t\tdimensions,\n\t\tinsets,\n\t\tpanGesture,\n\t\tprogressFallback,\n\t\tgestureDraggingFallback,\n\t\tgestureXFallback,\n\t\tgestureYFallback,\n\t\tnormalizedGestureXFallback,\n\t\tnormalizedGestureYFallback,\n\t]);\n};\n\nconst _useScreenAnimation = (): InternalScreenInterpolationProps => {\n\treturn useAnimationBuilder();\n};\n\nconst useScreenAnimation = (): ScreenInterpolationProps => {\n\tconst {\n\t\tscreenStyleInterpolator: _,\n\t\tgestureDetector: __,\n\t\t...animationProps\n\t} = useAnimationBuilder();\n\n\treturn animationProps;\n};\n\nexport { _useScreenAnimation, useScreenAnimation };\n","/**\n * NOTICE:\n * Taken from zustand/react/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/react/shallow.ts\n */\nimport React from \"react\";\nimport { shallow } from \"./shallow\";\n\nexport function useShallow<S, U>(selector: (state: S) => U): (state: S) => U {\n\tconst prev = React.useRef<U>(undefined);\n\treturn (state) => {\n\t\tconst next = selector(state);\n\n\t\tif (shallow(prev.current, next)) {\n\t\t\treturn prev.current as U;\n\t\t}\n\n\t\tprev.current = next;\n\t\treturn next;\n\t};\n}\n","/**\n * NOTICE:\n * Taken from zustand/vanilla/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/vanilla/shallow.ts\n */\n\nconst isIterable = (obj: object): obj is Iterable<unknown> =>\n\tSymbol.iterator in obj;\n\nconst hasIterableEntries = (\n\tvalue: Iterable<unknown>,\n): value is Iterable<unknown> & {\n\tentries(): Iterable<[unknown, unknown]>;\n} =>\n\t// HACK: avoid checking entries type\n\t\"entries\" in value;\n\nconst compareEntries = (\n\tvalueA: { entries(): Iterable<[unknown, unknown]> },\n\tvalueB: { entries(): Iterable<[unknown, unknown]> },\n) => {\n\tconst mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n\tconst mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n\tif (mapA.size !== mapB.size) {\n\t\treturn false;\n\t}\n\tfor (const [key, value] of mapA) {\n\t\tif (!Object.is(value, mapB.get(key))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\n// Ordered iterables\nconst compareIterables = (\n\tvalueA: Iterable<unknown>,\n\tvalueB: Iterable<unknown>,\n) => {\n\tconst iteratorA = valueA[Symbol.iterator]();\n\tconst iteratorB = valueB[Symbol.iterator]();\n\tlet nextA = iteratorA.next();\n\tlet nextB = iteratorB.next();\n\twhile (!nextA.done && !nextB.done) {\n\t\tif (!Object.is(nextA.value, nextB.value)) {\n\t\t\treturn false;\n\t\t}\n\t\tnextA = iteratorA.next();\n\t\tnextB = iteratorB.next();\n\t}\n\treturn !!nextA.done && !!nextB.done;\n};\n\nexport function shallow<T>(valueA: T, valueB: T): boolean {\n\tif (Object.is(valueA, valueB)) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof valueA !== \"object\" ||\n\t\tvalueA === null ||\n\t\ttypeof valueB !== \"object\" ||\n\t\tvalueB === null\n\t) {\n\t\treturn false;\n\t}\n\tif (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {\n\t\treturn false;\n\t}\n\n\tif (isIterable(valueA) && isIterable(valueB)) {\n\t\tif (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n\t\t\treturn compareEntries(valueA, valueB);\n\t\t}\n\t\treturn compareIterables(valueA, valueB);\n\t}\n\t// assume plain objects\n\treturn compareEntries(\n\t\t{ entries: () => Object.entries(valueA) },\n\t\t{ entries: () => Object.entries(valueB) },\n\t);\n}\n","import {\n\tcancelAnimation,\n\tmakeMutable,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\n\nimport { RouteStore } from \"./store/index\";\nimport type { RouteState } from \"./types\";\nimport { animate } from \"./utils/animate\";\n\ntype RouteKey = string;\n\nexport const animationValues: Record<\n\tstring,\n\tRecord<RouteKey, SharedValue<number>>\n> = {\n\tscreenProgress: {},\n\tgestureX: {},\n\tgestureY: {},\n\tnormalizedGestureX: {},\n\tnormalizedGestureY: {},\n\tgestureDragging: {},\n};\n\nconst triggerAnimation = (route: RouteState) => {\n\t\"worklet\";\n\tconst { id, closing, status, transitionSpec, onAnimationFinish } = route;\n\n\tconst progressValue = animationValues.screenProgress[id];\n\n\tif (!progressValue && __DEV__) {\n\t\tconsole.warn(`Animation values not found for route: ${id}`);\n\t\treturn;\n\t}\n\n\tconst animationConfig = closing\n\t\t? transitionSpec?.close\n\t\t: transitionSpec?.open;\n\n\tconst targetValue = status || 0;\n\n\tprogressValue.value = animate(targetValue, animationConfig, (finished) => {\n\t\t\"worklet\";\n\t\tif (finished && onAnimationFinish) {\n\t\t\trunOnJS(onAnimationFinish)(true);\n\t\t}\n\t});\n};\n\nRouteStore.use.subscribeWithSelector(\n\t(state) => state.routes,\n\t(currRoutes, prevRoutes) => {\n\t\tconst currKeys = Object.keys(currRoutes);\n\t\tconst prevKeys = Object.keys(prevRoutes);\n\n\t\tconst incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));\n\t\tconst removedKeys = prevKeys.filter((k) => !currKeys.includes(k));\n\t\tconst changedKeys = currKeys.filter((k) => currRoutes[k] !== prevRoutes[k]);\n\n\t\tconst animatableValues = Object.values(animationValues);\n\n\t\tfor (const incomingKey of incomingKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tvalue[incomingKey] = makeMutable(0);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove mutable values for removed routes\n\t\t * @see {@link https://docs.swmansion.com/react-native-reanimated/docs/advanced/makeMutable/}\n\t\t */\n\t\tfor (const removedKey of removedKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tcancelAnimation(value[removedKey]);\n\t\t\t\tdelete value[removedKey];\n\t\t\t}\n\t\t}\n\n\t\tfor (const changedKey of changedKeys) {\n\t\t\tconst currentRoute = currRoutes[changedKey];\n\t\t\tif (currentRoute) {\n\t\t\t\ttriggerAnimation(currentRoute);\n\t\t\t}\n\t\t}\n\t},\n);\n","import { type Draft, produce } from \"immer\";\nimport { useSyncExternalStore } from \"react\";\n\ntype Listener = () => void;\ntype StateUpdater<T> = (draft: Draft<T>) => void;\n\ntype StoreListener<_, TSelectorOutput> = (\n\tselectedState: TSelectorOutput,\n\tpreviousSelectedState: TSelectorOutput,\n) => void;\n\nexport interface StoreApi<T> {\n\tsetState: (updater: StateUpdater<T>) => void;\n\tgetState: () => T;\n\tsubscribe: (listener: Listener) => () => void;\n\tsubscribeWithSelector: <TSelectorOutput>(\n\t\tselector: (state: T) => TSelectorOutput,\n\t\tlistener: StoreListener<T, TSelectorOutput>,\n\t) => () => void;\n}\n\nexport function createVanillaStore<TState>(initialState: TState) {\n\tlet state: TState = initialState;\n\tconst listeners = new Set<Listener>();\n\n\tconst getState = (): TState => state;\n\n\tconst setState = (updater: StateUpdater<TState>) => {\n\t\tconst nextState = produce(state, updater);\n\n\t\tif (nextState !== state) {\n\t\t\tstate = nextState;\n\t\t\tlisteners.forEach((listener) => listener());\n\t\t}\n\t};\n\n\tconst subscribe = (listener: Listener): (() => void) => {\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t};\n\n\tconst subscribeWithSelector = <TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t\tlistener: StoreListener<TState, TSelectorOutput>,\n\t) => {\n\t\tlet previousSelectedState = selector(state);\n\n\t\tconst internalListener = () => {\n\t\t\tconst currentSelectedState = selector(getState());\n\n\t\t\tif (!Object.is(previousSelectedState, currentSelectedState)) {\n\t\t\t\tlistener(currentSelectedState, previousSelectedState);\n\t\t\t\tpreviousSelectedState = currentSelectedState;\n\t\t\t}\n\t\t};\n\n\t\tconst unsubscribe = subscribe(internalListener);\n\n\t\tlistener(previousSelectedState, previousSelectedState);\n\n\t\treturn unsubscribe;\n\t};\n\n\tfunction useStore<TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t): TSelectorOutput {\n\t\treturn useSyncExternalStore(subscribe, () => selector(getState()));\n\t}\n\n\tObject.assign(useStore, {\n\t\tsetState,\n\t\tgetState,\n\t\tsubscribe,\n\t\tsubscribeWithSelector,\n\t});\n\n\treturn useStore as typeof useStore & StoreApi<TState>;\n}\n","import type { RouteState, RouteStateStore } from \"../types\";\nimport { createVanillaStore } from \"./utils/create-vanilla-store\";\n\nconst useRouteStore = createVanillaStore<RouteStateStore>({\n\troutes: {},\n\trouteKeys: [],\n});\n\nexport const RouteStore = {\n\tuse: useRouteStore,\n\tupdateRoute: (key: string | undefined, value: Partial<RouteState>) => {\n\t\tif (!key) return;\n\n\t\tuseRouteStore.setState(({ routeKeys, routes }) => {\n\t\t\tconst currentRoute = routes[key];\n\n\t\t\tif (currentRoute) {\n\t\t\t\troutes[key] = {\n\t\t\t\t\t...currentRoute,\n\t\t\t\t\t...value,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { name = \"\", status = 0, closing = false, ...rest } = value;\n\n\t\t\t\tconst newIndex = routeKeys.length;\n\n\t\t\t\troutes[key] = {\n\t\t\t\t\tid: key,\n\t\t\t\t\tindex: newIndex,\n\t\t\t\t\tname,\n\t\t\t\t\tstatus,\n\t\t\t\t\tclosing,\n\t\t\t\t\t...rest,\n\t\t\t\t};\n\n\t\t\t\trouteKeys.push(key);\n\t\t\t}\n\t\t});\n\t},\n\tremoveRoute: (key: string | undefined) => {\n\t\tif (!key) return;\n\t\tuseRouteStore.setState(({ routes, routeKeys }) => {\n\t\t\tdelete routes[key];\n\n\t\t\tconst indexToRemove = routeKeys.indexOf(key);\n\n\t\t\tif (indexToRemove > -1) {\n\t\t\t\trouteKeys.splice(indexToRemove, 1);\n\t\t\t}\n\t\t});\n\t},\n};\n","import {\n\ttype WithSpringConfig,\n\ttype WithTimingConfig,\n\twithSpring,\n\twithTiming,\n} from \"react-native-reanimated\";\nimport type {\n\tAnimatableValue,\n\tAnimationCallback,\n} from \"react-native-reanimated/lib/typescript/commonTypes\";\n\nexport const animate = <T extends AnimatableValue>(\n\ttoValue: T,\n\tconfig?: WithSpringConfig | WithTimingConfig,\n\tcallback?: AnimationCallback,\n) => {\n\t\"worklet\";\n\tconst isSpring =\n\t\ttypeof config === \"object\" &&\n\t\t!(\"duration\" in config) &&\n\t\t!(\"easing\" in config);\n\n\tif (!isSpring) {\n\t\treturn withTiming(toValue, config, callback);\n\t}\n\n\treturn withSpring(toValue, config, callback);\n};\n","import { Gesture } from \"react-native-gesture-handler\";\nimport {\n\tinterpolate,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\nimport { animationValues } from \"../../animation-engine\";\nimport type { GestureDirection, RouteState } from \"../../types\";\nimport { animate } from \"../animate\";\nimport { createGestureActivationCriteria } from \"./create-gesture-activation-criteria\";\nimport { mapGestureToProgress } from \"./map-gesture-to-progress\";\n\nconst GESTURE_VELOCITY_IMPACT = 0.3;\nconst DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;\n\ninterface BuildGestureDetectorProps {\n\tkey: string;\n\tprogress: SharedValue<number>;\n\tconfig: RouteState;\n\twidth: number;\n\theight: number;\n\tgoBack: () => void;\n}\n\nexport const normalizeGestureTranslation = (\n\ttranslation: number,\n\tgestureDirection: GestureDirection,\n) => {\n\t\"worklet\";\n\tconst isInverted = gestureDirection.includes(\"inverted\");\n\n\tconst translated = Math.abs(translation) * (isInverted ? -1 : 1);\n\n\tif (isInverted) {\n\t\treturn Math.min(0, translated);\n\t}\n\n\treturn Math.max(0, translated);\n};\n\nexport const buildGestureDetector = ({\n\tkey,\n\tprogress,\n\tconfig,\n\twidth,\n\theight,\n\tgoBack,\n}: BuildGestureDetectorProps) => {\n\tconst _translateX = animationValues.gestureX[key];\n\tconst _translateY = animationValues.gestureY[key];\n\tconst _normalizedGestureX = animationValues.normalizedGestureX[key];\n\tconst _normalizedGestureY = animationValues.normalizedGestureY[key];\n\tconst _isDragging = animationValues.gestureDragging[key];\n\n\tconst {\n\t\tgestureDirection = \"horizontal\",\n\t\tgestureEnabled = false,\n\t\ttransitionSpec,\n\t\tgestureVelocityImpact = GESTURE_VELOCITY_IMPACT,\n\t\tgestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE,\n\t} = config;\n\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tconst panGesture = Gesture.Pan()\n\t\t.enabled(gestureEnabled)\n\t\t.onStart(() => {\n\t\t\t\"worklet\";\n\t\t\t_isDragging.value = 1;\n\t\t})\n\t\t.onUpdate((event) => {\n\t\t\t\"worklet\";\n\t\t\tlet gestureProgress = 0;\n\n\t\t\t_translateX.value = event.translationX;\n\t\t\t_translateY.value = event.translationY;\n\t\t\t_normalizedGestureX.value = interpolate(\n\t\t\t\tevent.translationX,\n\t\t\t\t[-width, width],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\t\t\t_normalizedGestureY.value = interpolate(\n\t\t\t\tevent.translationY,\n\t\t\t\t[-height, height],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst distance = Math.sqrt(\n\t\t\t\t\tevent.translationX ** 2 + event.translationY ** 2,\n\t\t\t\t);\n\t\t\t\tgestureProgress = mapGestureToProgress(distance, width);\n\t\t\t} else {\n\t\t\t\tlet maxProgress = 0;\n\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (allowedRight || allowedLeft) {\n\t\t\t\t\tconst absX = Math.abs(event.translationX);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absX, width);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tif (allowedUp || allowedDown) {\n\t\t\t\t\tconst absY = Math.abs(event.translationY);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absY, height);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tgestureProgress = maxProgress;\n\t\t\t}\n\n\t\t\tprogress.value = 1 - gestureProgress;\n\t\t})\n\t\t.onEnd((event) => {\n\t\t\t\"worklet\";\n\t\t\tconst { translationX, translationY, velocityX, velocityY } = event;\n\n\t\t\tlet shouldDismiss = false;\n\t\t\tconst dismissThreshold = 0.5;\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst finalX = Math.abs(\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalY = Math.abs(\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalDistance = Math.sqrt(finalX ** 2 + finalY ** 2);\n\t\t\t\tshouldDismiss = finalDistance > width * dismissThreshold;\n\t\t\t} else {\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (\n\t\t\t\t\tallowedRight &&\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedLeft &&\n\t\t\t\t\t-translationX - velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedDown &&\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedUp &&\n\t\t\t\t\t-translationY - velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst finalProgress = shouldDismiss ? 0 : 1;\n\t\t\tconst spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;\n\n\t\t\tconst onFinish = shouldDismiss\n\t\t\t\t? (isFinished?: boolean) => {\n\t\t\t\t\t\t\"worklet\";\n\t\t\t\t\t\tif (isFinished) runOnJS(goBack)();\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\t\tprogress.value = animate(finalProgress, spec, onFinish);\n\n\t\t\t_translateX.value = animate(0, spec);\n\t\t\t_translateY.value = animate(0, spec);\n\t\t\t_normalizedGestureX.value = animate(0, spec);\n\t\t\t_normalizedGestureY.value = animate(0, spec);\n\t\t});\n\n\tconst criteria = createGestureActivationCriteria({\n\t\tgestureDirection,\n\t\tgestureResponseDistance,\n\t});\n\n\tif (criteria?.activeOffsetX) {\n\t\tpanGesture.activeOffsetX(criteria.activeOffsetX);\n\t}\n\tif (criteria?.activeOffsetY) {\n\t\tpanGesture.activeOffsetY(criteria.activeOffsetY);\n\t}\n\tif (criteria?.failOffsetX) {\n\t\tpanGesture.failOffsetX(criteria.failOffsetX);\n\t}\n\tif (criteria?.failOffsetY) {\n\t\tpanGesture.failOffsetY(criteria.failOffsetY);\n\t}\n\n\tpanGesture.enableTrackpadTwoFingerGesture(true);\n\tconst nativeGesture = Gesture.Native().shouldCancelWhenOutside(false);\n\n\treturn Gesture.Race(panGesture, nativeGesture);\n};\n","import type { TransitionConfig } from \"../../types\";\n\ninterface GestureActivationOptions {\n\tgestureDirection:\n\t\t| TransitionConfig[\"gestureDirection\"]\n\t\t| Array<TransitionConfig[\"gestureDirection\"]>;\n\tgestureResponseDistance: number;\n}\n\n/**\n * rngh requires this type instead a number[]. We're returning a num[] which is still correct, this is just to remove the type error.\n */\ntype OffsetErrorTypeBugFix = [start: number, end: number];\n\nexport const createGestureActivationCriteria = ({\n\tgestureDirection,\n\tgestureResponseDistance,\n}: GestureActivationOptions) => {\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tif (directions.includes(\"bidirectional\")) {\n\t\treturn {\n\t\t\tactiveOffsetX: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t\tactiveOffsetY: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t};\n\t}\n\n\tconst allowedDown = directions.includes(\"vertical\");\n\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\tconst allowedRight = directions.includes(\"horizontal\");\n\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\tconst toleranceX = 15;\n\tconst toleranceY = 20;\n\tconst dist = gestureResponseDistance;\n\n\tconst result: {\n\t\tactiveOffsetX?: number | [number, number];\n\t\tfailOffsetX?: number | OffsetErrorTypeBugFix;\n\t\tactiveOffsetY?: number | [number, number];\n\t\tfailOffsetY?: number | OffsetErrorTypeBugFix;\n\t} = {};\n\n\tconst hasHorizontal = allowedLeft || allowedRight;\n\tif (hasHorizontal) {\n\t\tif (allowedLeft && allowedRight) {\n\t\t\tresult.activeOffsetX = [-dist, dist];\n\t\t} else if (allowedLeft) {\n\t\t\tresult.activeOffsetX = -dist;\n\t\t} else if (allowedRight) {\n\t\t\tresult.activeOffsetX = dist;\n\t\t}\n\n\t\tif (allowedRight && !allowedLeft) {\n\t\t\tresult.failOffsetX = -dist;\n\t\t} else if (allowedLeft && !allowedRight) {\n\t\t\tresult.failOffsetX = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetX = [-toleranceX, toleranceX] as OffsetErrorTypeBugFix;\n\t}\n\n\tconst hasVertical = allowedUp || allowedDown;\n\tif (hasVertical) {\n\t\tif (allowedUp && allowedDown) {\n\t\t\tresult.activeOffsetY = [-dist, dist];\n\t\t} else if (allowedUp) {\n\t\t\tresult.activeOffsetY = -dist;\n\t\t} else if (allowedDown) {\n\t\t\tresult.activeOffsetY = dist;\n\t\t}\n\n\t\tif (allowedDown && !allowedUp) {\n\t\t\tresult.failOffsetY = -dist;\n\t\t} else if (allowedUp && !allowedDown) {\n\t\t\tresult.failOffsetY = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetY = [-toleranceY, toleranceY] as OffsetErrorTypeBugFix;\n\t}\n\n\treturn result;\n};\n","/**\n * Utility function to map raw gesture translation to a progress value.\n */\nexport const mapGestureToProgress = (\n\ttranslation: number,\n\tdimension: number,\n) => {\n\t\"worklet\";\n\tconst rawProgress = translation / dimension;\n\treturn Math.max(0, Math.min(1, rawProgress));\n};\n","import type { TransitionInterpolatedStyle } from \"../types\";\n\nexport const noopinterpolator = (): TransitionInterpolatedStyle => {\n\t\"worklet\";\n\treturn {\n\t\tcontentStyle: {},\n\t\toverlayStyle: {},\n\t};\n};\n","import { useRoute } from \"@react-navigation/native\";\n\nexport const useKey = () => useRoute().key;\n","import type { ParamListBase, RouteProp } from \"@react-navigation/native\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tAny,\n\tBeforeRemoveEvent,\n\tFocusEvent,\n\tTransitionConfig,\n\tTransitionListeners,\n} from \"../types\";\n\nexport interface TransitionEventHandlersProps extends TransitionConfig {\n\tnavigation: Any;\n\troute: RouteProp<ParamListBase, string>;\n}\n\nexport const createConfig = ({\n\tnavigation: reactNavigation,\n\troute,\n\t...config\n}: TransitionEventHandlersProps): TransitionListeners => {\n\treturn {\n\t\tfocus: (e: FocusEvent) => {\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tid: e.target,\n\t\t\t\tname: route.name,\n\t\t\t\tstatus: 1,\n\t\t\t\tclosing: false,\n\t\t\t\t...config,\n\t\t\t});\n\t\t},\n\t\tbeforeRemove: (e: BeforeRemoveEvent) => {\n\t\t\te.preventDefault();\n\n\t\t\tconst handleFinish = (finished?: boolean) => {\n\t\t\t\tif (!finished) return;\n\t\t\t\tif (reactNavigation.canGoBack()) {\n\t\t\t\t\treactNavigation.dispatch(e.data?.action);\n\t\t\t\t\tRouteStore.removeRoute(e.target);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tstatus: 0,\n\t\t\t\tclosing: true,\n\t\t\t\tonAnimationFinish: handleFinish,\n\t\t\t});\n\t\t},\n\t} as TransitionListeners;\n};\n","import type React from \"react\";\nimport { type ComponentType, forwardRef, memo } from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n\ttype AnimatedProps,\n\tuseAnimatedStyle,\n} from \"react-native-reanimated\";\nimport type { Any } from \"@/types\";\nimport { _useScreenAnimation } from \"../hooks/use-screen-animation\";\nimport { useSkipFirstFrame } from \"../hooks/use-skip-first-frame\";\n\nexport function createTransitionComponent<P extends object>(\n\tWrapped: ComponentType<P>,\n) {\n\tconst AnimatedComponent = Animated.createAnimatedComponent(Wrapped);\n\n\ttype Props = AnimatedProps<P>;\n\n\tconst Inner = forwardRef<React.ComponentRef<typeof AnimatedComponent>, Props>(\n\t\t(props, ref) => {\n\t\t\tconst { children, style, ...rest } = props as Any;\n\n\t\t\tconst {\n\t\t\t\tscreenStyleInterpolator,\n\t\t\t\tgestureDetector,\n\t\t\t\t...screenInterpolationProps\n\t\t\t} = _useScreenAnimation();\n\n\t\t\tconst screenContainerStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).contentStyle || {}\n\t\t\t\t);\n\t\t\t});\n\t\t\tconst overlayStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).overlayStyle || {}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst { style: flickerFixStyle } = useSkipFirstFrame();\n\n\t\t\treturn (\n\t\t\t\t<Animated.View style={[{ flex: 1 }, flickerFixStyle]}>\n\t\t\t\t\t<GestureDetector gesture={gestureDetector}>\n\t\t\t\t\t\t<AnimatedComponent\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\t\t{ flex: 1, position: \"relative\" },\n\t\t\t\t\t\t\t\tscreenContainerStyle,\n\t\t\t\t\t\t\t\tstyle,\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</AnimatedComponent>\n\t\t\t\t\t</GestureDetector>\n\t\t\t\t\t<Animated.View\n\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\tStyleSheet.absoluteFillObject,\n\t\t\t\t\t\t\toverlayStyle,\n\t\t\t\t\t\t\t{ zIndex: 10000 },\n\t\t\t\t\t\t]}\n\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t/>\n\t\t\t\t</Animated.View>\n\t\t\t);\n\t\t},\n\t);\n\n\tInner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || \"Component\"})`;\n\n\treturn memo(Inner) as React.MemoExoticComponent<\n\t\tReact.ForwardRefExoticComponent<\n\t\t\tAnimatedProps<P> & React.RefAttributes<React.ComponentRef<typeof Wrapped>>\n\t\t>\n\t>;\n}\n","import { useEffect } from \"react\";\nimport { useAnimatedStyle, useSharedValue } from \"react-native-reanimated\";\n\n/**\n * This hook helps mitigate a race condition between the JS and UI thread where styles are not applied immediately.\n * By skipping one frame before rendering, it ensures styles are properly applied, removing a flicker effect.\n *\n * Related issue: https://github.com/software-mansion/react-native-reanimated/issues/4446\n */\nexport const useSkipFirstFrame = () => {\n\tconst opacity = useSharedValue(0);\n\tconst style = useAnimatedStyle(() => {\n\t\t\"worklet\";\n\t\treturn {\n\t\t\topacity: opacity.value,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\trequestAnimationFrame(() => {\n\t\t\topacity.value = 1;\n\t\t});\n\t}, [opacity]);\n\n\treturn { style };\n};\n","/**\n * Helper function to return the default screen options in order for the screen animations to work properly.\n */\nexport const defaultScreenOptions = () =>\n\t({\n\t\tpresentation: \"containedTransparentModal\",\n\t\theaderShown: false,\n\t\tanimation: \"none\",\n\t}) as const;\n"],"mappings":"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","names":["import_react_native","import_native","import_react","import_react_native_reanimated","React","import_react_native_reanimated","import_react","import_react_native_reanimated","import_react_native_reanimated","import_react","import_react_native","import_react_native_gesture_handler","import_react_native_reanimated","import_react","import_react_native_reanimated","Animated"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/configs/presets.ts","../src/configs/specs.ts","../src/hooks/use-screen-animation.tsx","../src/store/utils/use-shallow.tsx","../src/store/utils/shallow.ts","../src/animation-engine.ts","../src/store/utils/create-vanilla-store.ts","../src/store/index.ts","../src/utils/animate.ts","../src/utils/gesture/build-gesture-detector.ts","../src/utils/gesture/create-gesture-activation-criteria.ts","../src/utils/gesture/map-gesture-to-progress.ts","../src/utils/noop-interpolator.ts","../src/hooks/use-key.tsx","../src/utils/create-config.ts","../src/utils/create-transition-component.tsx","../src/hooks/use-skip-first-frame.tsx","../src/utils/default-screen-options.ts"],"sourcesContent":["import { Pressable, View } from \"react-native\";\nimport { presets, specs } from \"./configs\";\nimport { useScreenAnimation } from \"./hooks/use-screen-animation\";\nimport { createConfig } from \"./utils/create-config\";\nimport { createTransitionComponent } from \"./utils/create-transition-component\";\nimport { defaultScreenOptions } from \"./utils/default-screen-options\";\n\nexport default {\n\tcreateTransitionComponent,\n\tView: createTransitionComponent(View),\n\tPressable: createTransitionComponent(Pressable),\n\tcreateConfig,\n\tdefaultScreenOptions,\n\tpresets,\n\tspecs,\n};\n\nexport { useScreenAnimation };\n","import {\n\tExtrapolation,\n\tinterpolate,\n\tinterpolateColor,\n} from \"react-native-reanimated\";\nimport type { TransitionConfig } from \"../types\";\nimport { DefaultSpec } from \"./specs\";\n\nexport const SlideFromTop = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical-inverted\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [-height, 0, height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ZoomIn = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: false,\n\t\tscreenStyleInterpolator: ({ current, next }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst scale = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0.5, 1, 0.5],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\tconst opacity = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0, 1, 0],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }],\n\t\t\t\t\topacity,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const SlideFromBottom = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [height, 0, -height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const DraggableCard = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: [\"horizontal\", \"vertical\"],\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\t/** Combined */\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.75]);\n\n\t\t\t/** Vertical */\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.height * 0.5, screen.height * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/** Horizontal */\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.width * 0.5, screen.width * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateY: translateY }, { translateX }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ElasticCard = (\n\tconfig: Partial<TransitionConfig> & {\n\t\telasticFactor?: number;\n\t} = { elasticFactor: 0.5 },\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"bidirectional\",\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\t/**\n\t\t\t * Applies to both screens ( previous and incoming)\n\t\t\t */\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.8]);\n\n\t\t\t/**\n\t\t\t * Applies to current screen\n\t\t\t */\n\t\t\tconst maxElasticityX = screen.width * (config.elasticFactor ?? 0.5);\n\t\t\tconst maxElasticityY = screen.height * (config.elasticFactor ?? 0.5);\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityX, 0, maxElasticityX],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityY, 0, maxElasticityY],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Applies to unfocused screen ( previous screen )\n\t\t\t */\n\t\t\tconst overlayColor = interpolateColor(\n\t\t\t\tnext?.progress.value || 0,\n\t\t\t\t[0, 1],\n\t\t\t\t[\"rgba(0,0,0,0)\", \"rgba(0,0,0,0.5)\"],\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateX }, { translateY }],\n\t\t\t\t},\n\t\t\t\toverlayStyle: {\n\t\t\t\t\tbackgroundColor: overlayColor,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t...config,\n\t};\n};\n","import type { WithSpringConfig } from \"react-native-reanimated\";\n\nexport const DefaultSpec: WithSpringConfig = {\n\tstiffness: 1000,\n\tdamping: 500,\n\tmass: 3,\n\tovershootClamping: true,\n\trestSpeedThreshold: 0.01,\n};\n","import { useNavigation } from \"@react-navigation/native\";\nimport { useMemo } from \"react\";\nimport { useWindowDimensions } from \"react-native\";\nimport type {\n\tComposedGesture,\n\tGestureType,\n} from \"react-native-gesture-handler\";\nimport { useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useShallow } from \"@/store/utils/use-shallow\";\nimport { animationValues } from \"../animation-engine\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tScreenInterpolationProps,\n\tScreenStyleInterpolator,\n} from \"../types\";\nimport { buildGestureDetector } from \"../utils/gesture/build-gesture-detector\";\nimport { noopinterpolator } from \"../utils/noop-interpolator\";\nimport { useKey } from \"./use-key\";\n\ninterface InternalScreenInterpolationProps extends ScreenInterpolationProps {\n\tgestureDetector: GestureType | ComposedGesture;\n\tscreenStyleInterpolator: ScreenStyleInterpolator;\n}\n\nconst useAnimationBuilder = () => {\n\tconst key = useKey();\n\tconst dimensions = useWindowDimensions();\n\tconst insets = useSafeAreaInsets();\n\tconst navigation = useNavigation();\n\n\tconst { currentRoute, nextRoute } = RouteStore.use(\n\t\tuseShallow(({ routes, routeKeys }) => {\n\t\t\tconst current = routes[key];\n\n\t\t\tif (!current) {\n\t\t\t\treturn { currentRoute: undefined, nextRoute: undefined };\n\t\t\t}\n\n\t\t\tconst currentScreenIndex = current.index;\n\t\t\tconst nextKey = routeKeys[currentScreenIndex + 1];\n\t\t\tconst next = nextKey ? routes[nextKey] : undefined;\n\n\t\t\tconst isSameNavigator = next?.navigatorKey === current.navigatorKey;\n\n\t\t\tif (!isSameNavigator) {\n\t\t\t\t/**\n\t\t\t\t * Without this guard, b (_layout) would instantly run its exit animation (if declared) once b/index is focused.\n\t\t\t\t */\n\t\t\t\treturn {\n\t\t\t\t\tcurrentRoute: current,\n\t\t\t\t\tnextRoute: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcurrentRoute: current,\n\t\t\t\tnextRoute: next,\n\t\t\t};\n\t\t}),\n\t);\n\n\tconst panGesture = useMemo(\n\t\t() =>\n\t\t\tbuildGestureDetector({\n\t\t\t\tkey,\n\t\t\t\tprogress: animationValues.screenProgress[key],\n\t\t\t\tconfig: currentRoute || {\n\t\t\t\t\tid: key,\n\t\t\t\t\tname: key,\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tstatus: 0,\n\t\t\t\t\tclosing: false,\n\t\t\t\t},\n\t\t\t\twidth: dimensions.width,\n\t\t\t\theight: dimensions.height,\n\t\t\t\tgoBack: navigation.goBack,\n\t\t\t}),\n\t\t[key, currentRoute, dimensions.width, dimensions.height, navigation.goBack],\n\t);\n\n\t// We'll avoid using makeMutable as fallbacks since useSharedValues are automatically garbage collected\n\tconst progressFallback = useSharedValue(0);\n\tconst gestureDraggingFallback = useSharedValue(0);\n\tconst gestureXFallback = useSharedValue(0);\n\tconst gestureYFallback = useSharedValue(0);\n\tconst normalizedGestureXFallback = useSharedValue(0);\n\tconst normalizedGestureYFallback = useSharedValue(0);\n\n\treturn useMemo(() => {\n\t\treturn {\n\t\t\tcurrent: {\n\t\t\t\tprogress: animationValues.screenProgress[key] || progressFallback,\n\t\t\t\tgesture: {\n\t\t\t\t\tisDragging:\n\t\t\t\t\t\tanimationValues.gestureDragging[key] || gestureDraggingFallback,\n\t\t\t\t\tx: animationValues.gestureX[key] || gestureXFallback,\n\t\t\t\t\ty: animationValues.gestureY[key] || gestureYFallback,\n\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\tanimationValues.normalizedGestureX[key] ||\n\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\tanimationValues.normalizedGestureY[key] ||\n\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t},\n\t\t\t},\n\t\t\tnext:\n\t\t\t\tnextRoute && animationValues.screenProgress[nextRoute.id]\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tprogress: animationValues.screenProgress[nextRoute.id],\n\t\t\t\t\t\t\tgesture: {\n\t\t\t\t\t\t\t\tisDragging:\n\t\t\t\t\t\t\t\t\tanimationValues.gestureDragging[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tgestureDraggingFallback,\n\t\t\t\t\t\t\t\tx: animationValues.gestureX[nextRoute.id] || gestureXFallback,\n\t\t\t\t\t\t\t\ty: animationValues.gestureY[nextRoute.id] || gestureYFallback,\n\t\t\t\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureX[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureY[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tlayouts: { screen: dimensions },\n\t\t\tinsets,\n\t\t\tclosing: currentRoute?.closing || false,\n\t\t\tscreenStyleInterpolator:\n\t\t\t\tnextRoute?.screenStyleInterpolator ||\n\t\t\t\tcurrentRoute?.screenStyleInterpolator ||\n\t\t\t\tnoopinterpolator,\n\n\t\t\tgestureDetector: panGesture,\n\t\t};\n\t}, [\n\t\tkey,\n\t\tcurrentRoute,\n\t\tnextRoute,\n\t\tdimensions,\n\t\tinsets,\n\t\tpanGesture,\n\t\tprogressFallback,\n\t\tgestureDraggingFallback,\n\t\tgestureXFallback,\n\t\tgestureYFallback,\n\t\tnormalizedGestureXFallback,\n\t\tnormalizedGestureYFallback,\n\t]);\n};\n\nconst _useScreenAnimation = (): InternalScreenInterpolationProps => {\n\treturn useAnimationBuilder();\n};\n\nconst useScreenAnimation = (): ScreenInterpolationProps => {\n\tconst {\n\t\tscreenStyleInterpolator: _,\n\t\tgestureDetector: __,\n\t\t...animationProps\n\t} = useAnimationBuilder();\n\n\treturn animationProps;\n};\n\nexport { _useScreenAnimation, useScreenAnimation };\n","/**\n * NOTICE:\n * Taken from zustand/react/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/react/shallow.ts\n */\nimport React from \"react\";\nimport { shallow } from \"./shallow\";\n\nexport function useShallow<S, U>(selector: (state: S) => U): (state: S) => U {\n\tconst prev = React.useRef<U>(undefined);\n\treturn (state) => {\n\t\tconst next = selector(state);\n\n\t\tif (shallow(prev.current, next)) {\n\t\t\treturn prev.current as U;\n\t\t}\n\n\t\tprev.current = next;\n\t\treturn next;\n\t};\n}\n","/**\n * NOTICE:\n * Taken from zustand/vanilla/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/vanilla/shallow.ts\n */\n\nconst isIterable = (obj: object): obj is Iterable<unknown> =>\n\tSymbol.iterator in obj;\n\nconst hasIterableEntries = (\n\tvalue: Iterable<unknown>,\n): value is Iterable<unknown> & {\n\tentries(): Iterable<[unknown, unknown]>;\n} =>\n\t// HACK: avoid checking entries type\n\t\"entries\" in value;\n\nconst compareEntries = (\n\tvalueA: { entries(): Iterable<[unknown, unknown]> },\n\tvalueB: { entries(): Iterable<[unknown, unknown]> },\n) => {\n\tconst mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n\tconst mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n\tif (mapA.size !== mapB.size) {\n\t\treturn false;\n\t}\n\tfor (const [key, value] of mapA) {\n\t\tif (!Object.is(value, mapB.get(key))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\n// Ordered iterables\nconst compareIterables = (\n\tvalueA: Iterable<unknown>,\n\tvalueB: Iterable<unknown>,\n) => {\n\tconst iteratorA = valueA[Symbol.iterator]();\n\tconst iteratorB = valueB[Symbol.iterator]();\n\tlet nextA = iteratorA.next();\n\tlet nextB = iteratorB.next();\n\twhile (!nextA.done && !nextB.done) {\n\t\tif (!Object.is(nextA.value, nextB.value)) {\n\t\t\treturn false;\n\t\t}\n\t\tnextA = iteratorA.next();\n\t\tnextB = iteratorB.next();\n\t}\n\treturn !!nextA.done && !!nextB.done;\n};\n\nexport function shallow<T>(valueA: T, valueB: T): boolean {\n\tif (Object.is(valueA, valueB)) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof valueA !== \"object\" ||\n\t\tvalueA === null ||\n\t\ttypeof valueB !== \"object\" ||\n\t\tvalueB === null\n\t) {\n\t\treturn false;\n\t}\n\tif (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {\n\t\treturn false;\n\t}\n\n\tif (isIterable(valueA) && isIterable(valueB)) {\n\t\tif (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n\t\t\treturn compareEntries(valueA, valueB);\n\t\t}\n\t\treturn compareIterables(valueA, valueB);\n\t}\n\t// assume plain objects\n\treturn compareEntries(\n\t\t{ entries: () => Object.entries(valueA) },\n\t\t{ entries: () => Object.entries(valueB) },\n\t);\n}\n","import {\n\tcancelAnimation,\n\tmakeMutable,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\n\nimport { RouteStore } from \"./store/index\";\nimport type { RouteState } from \"./types\";\nimport { animate } from \"./utils/animate\";\n\ntype RouteKey = string;\n\nexport const animationValues: Record<\n\tstring,\n\tRecord<RouteKey, SharedValue<number>>\n> = {\n\tscreenProgress: {},\n\tgestureX: {},\n\tgestureY: {},\n\tnormalizedGestureX: {},\n\tnormalizedGestureY: {},\n\tgestureDragging: {},\n};\n\nconst triggerAnimation = (route: RouteState) => {\n\t\"worklet\";\n\tconst { id, closing, status, transitionSpec, onAnimationFinish } = route;\n\n\tconst progressValue = animationValues.screenProgress[id];\n\n\tif (!progressValue && __DEV__) {\n\t\tconsole.warn(`Animation values not found for route: ${id}`);\n\t\treturn;\n\t}\n\n\tconst animationConfig = closing\n\t\t? transitionSpec?.close\n\t\t: transitionSpec?.open;\n\n\tconst targetValue = status || 0;\n\n\tprogressValue.value = animate(targetValue, animationConfig, (finished) => {\n\t\t\"worklet\";\n\t\tif (finished && onAnimationFinish) {\n\t\t\trunOnJS(onAnimationFinish)(true);\n\t\t}\n\t});\n};\n\nRouteStore.use.subscribeWithSelector(\n\t(state) => state.routes,\n\t(currRoutes, prevRoutes) => {\n\t\tconst currKeys = Object.keys(currRoutes);\n\t\tconst prevKeys = Object.keys(prevRoutes);\n\n\t\tconst incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));\n\t\tconst removedKeys = prevKeys.filter((k) => !currKeys.includes(k));\n\t\tconst changedKeys = currKeys.filter((k) => currRoutes[k] !== prevRoutes[k]);\n\n\t\tconst animatableValues = Object.values(animationValues);\n\n\t\tfor (const incomingKey of incomingKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tvalue[incomingKey] = makeMutable(0);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove mutable values for removed routes\n\t\t * @see {@link https://docs.swmansion.com/react-native-reanimated/docs/advanced/makeMutable/}\n\t\t */\n\t\tfor (const removedKey of removedKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tcancelAnimation(value[removedKey]);\n\t\t\t\tdelete value[removedKey];\n\t\t\t}\n\t\t}\n\n\t\tfor (const changedKey of changedKeys) {\n\t\t\tconst currentRoute = currRoutes[changedKey];\n\t\t\tif (currentRoute) {\n\t\t\t\ttriggerAnimation(currentRoute);\n\t\t\t}\n\t\t}\n\t},\n);\n","import { type Draft, produce } from \"immer\";\nimport { useSyncExternalStore } from \"react\";\n\ntype Listener = () => void;\ntype StateUpdater<T> = (draft: Draft<T>) => void;\n\ntype StoreListener<_, TSelectorOutput> = (\n\tselectedState: TSelectorOutput,\n\tpreviousSelectedState: TSelectorOutput,\n) => void;\n\nexport interface StoreApi<T> {\n\tsetState: (updater: StateUpdater<T>) => void;\n\tgetState: () => T;\n\tsubscribe: (listener: Listener) => () => void;\n\tsubscribeWithSelector: <TSelectorOutput>(\n\t\tselector: (state: T) => TSelectorOutput,\n\t\tlistener: StoreListener<T, TSelectorOutput>,\n\t) => () => void;\n}\n\nexport function createVanillaStore<TState>(initialState: TState) {\n\tlet state: TState = initialState;\n\tconst listeners = new Set<Listener>();\n\n\tconst getState = (): TState => state;\n\n\tconst setState = (updater: StateUpdater<TState>) => {\n\t\tconst nextState = produce(state, updater);\n\n\t\tif (nextState !== state) {\n\t\t\tstate = nextState;\n\t\t\tlisteners.forEach((listener) => listener());\n\t\t}\n\t};\n\n\tconst subscribe = (listener: Listener): (() => void) => {\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t};\n\n\tconst subscribeWithSelector = <TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t\tlistener: StoreListener<TState, TSelectorOutput>,\n\t) => {\n\t\tlet previousSelectedState = selector(state);\n\n\t\tconst internalListener = () => {\n\t\t\tconst currentSelectedState = selector(getState());\n\n\t\t\tif (!Object.is(previousSelectedState, currentSelectedState)) {\n\t\t\t\tlistener(currentSelectedState, previousSelectedState);\n\t\t\t\tpreviousSelectedState = currentSelectedState;\n\t\t\t}\n\t\t};\n\n\t\tconst unsubscribe = subscribe(internalListener);\n\n\t\tlistener(previousSelectedState, previousSelectedState);\n\n\t\treturn unsubscribe;\n\t};\n\n\tfunction useStore<TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t): TSelectorOutput {\n\t\treturn useSyncExternalStore(subscribe, () => selector(getState()));\n\t}\n\n\tObject.assign(useStore, {\n\t\tsetState,\n\t\tgetState,\n\t\tsubscribe,\n\t\tsubscribeWithSelector,\n\t});\n\n\treturn useStore as typeof useStore & StoreApi<TState>;\n}\n","import type { RouteState, RouteStateStore } from \"../types\";\nimport { createVanillaStore } from \"./utils/create-vanilla-store\";\n\nconst useRouteStore = createVanillaStore<RouteStateStore>({\n\troutes: {},\n\trouteKeys: [],\n});\n\nexport const RouteStore = {\n\tuse: useRouteStore,\n\tupdateRoute: (key: string | undefined, value: Partial<RouteState>) => {\n\t\tif (!key) return;\n\n\t\tuseRouteStore.setState(({ routeKeys, routes }) => {\n\t\t\tconst currentRoute = routes[key];\n\n\t\t\tif (currentRoute) {\n\t\t\t\troutes[key] = {\n\t\t\t\t\t...currentRoute,\n\t\t\t\t\t...value,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { name = \"\", status = 0, closing = false, ...rest } = value;\n\n\t\t\t\tconst newIndex = routeKeys.length;\n\n\t\t\t\troutes[key] = {\n\t\t\t\t\tid: key,\n\t\t\t\t\tindex: newIndex,\n\t\t\t\t\tname,\n\t\t\t\t\tstatus,\n\t\t\t\t\tclosing,\n\t\t\t\t\t...rest,\n\t\t\t\t};\n\n\t\t\t\trouteKeys.push(key);\n\t\t\t}\n\t\t});\n\t},\n\tremoveRoute: (key: string | undefined) => {\n\t\tif (!key) return;\n\t\tuseRouteStore.setState(({ routes, routeKeys }) => {\n\t\t\tdelete routes[key];\n\n\t\t\tconst indexToRemove = routeKeys.indexOf(key);\n\n\t\t\tif (indexToRemove > -1) {\n\t\t\t\trouteKeys.splice(indexToRemove, 1);\n\t\t\t}\n\t\t});\n\t},\n\tgetPreviousRoute: (key: string | undefined): RouteState | null => {\n\t\tif (!key) return null;\n\t\tconst index = useRouteStore.getState().routeKeys.indexOf(key);\n\n\t\treturn index > -1\n\t\t\t? useRouteStore.getState().routes[\n\t\t\t\t\tuseRouteStore.getState().routeKeys[index - 1]\n\t\t\t\t]\n\t\t\t: null;\n\t},\n};\n","import {\n\ttype WithSpringConfig,\n\ttype WithTimingConfig,\n\twithSpring,\n\twithTiming,\n} from \"react-native-reanimated\";\nimport type {\n\tAnimatableValue,\n\tAnimationCallback,\n} from \"react-native-reanimated/lib/typescript/commonTypes\";\n\nexport const animate = <T extends AnimatableValue>(\n\ttoValue: T,\n\tconfig?: WithSpringConfig | WithTimingConfig,\n\tcallback?: AnimationCallback,\n) => {\n\t\"worklet\";\n\tconst isSpring =\n\t\ttypeof config === \"object\" &&\n\t\t!(\"duration\" in config) &&\n\t\t!(\"easing\" in config);\n\n\tif (!isSpring) {\n\t\treturn withTiming(toValue, config, callback);\n\t}\n\n\treturn withSpring(toValue, config, callback);\n};\n","import { Gesture } from \"react-native-gesture-handler\";\nimport {\n\tinterpolate,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\nimport { animationValues } from \"../../animation-engine\";\nimport type { GestureDirection, RouteState } from \"../../types\";\nimport { animate } from \"../animate\";\nimport { createGestureActivationCriteria } from \"./create-gesture-activation-criteria\";\nimport { mapGestureToProgress } from \"./map-gesture-to-progress\";\n\nconst GESTURE_VELOCITY_IMPACT = 0.3;\nconst DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;\n\ninterface BuildGestureDetectorProps {\n\tkey: string;\n\tprogress: SharedValue<number>;\n\tconfig: RouteState;\n\twidth: number;\n\theight: number;\n\tgoBack: () => void;\n}\n\nexport const normalizeGestureTranslation = (\n\ttranslation: number,\n\tgestureDirection: GestureDirection,\n) => {\n\t\"worklet\";\n\tconst isInverted = gestureDirection.includes(\"inverted\");\n\n\tconst translated = Math.abs(translation) * (isInverted ? -1 : 1);\n\n\tif (isInverted) {\n\t\treturn Math.min(0, translated);\n\t}\n\n\treturn Math.max(0, translated);\n};\n\nexport const buildGestureDetector = ({\n\tkey,\n\tprogress,\n\tconfig,\n\twidth,\n\theight,\n\tgoBack,\n}: BuildGestureDetectorProps) => {\n\tconst _translateX = animationValues.gestureX[key];\n\tconst _translateY = animationValues.gestureY[key];\n\tconst _normalizedGestureX = animationValues.normalizedGestureX[key];\n\tconst _normalizedGestureY = animationValues.normalizedGestureY[key];\n\tconst _isDragging = animationValues.gestureDragging[key];\n\n\tconst {\n\t\tgestureDirection = \"horizontal\",\n\t\tgestureEnabled = false,\n\t\ttransitionSpec,\n\t\tgestureVelocityImpact = GESTURE_VELOCITY_IMPACT,\n\t\tgestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE,\n\t} = config;\n\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tconst panGesture = Gesture.Pan()\n\t\t.enabled(gestureEnabled)\n\t\t.onStart(() => {\n\t\t\t\"worklet\";\n\t\t\t_isDragging.value = 1;\n\t\t})\n\t\t.onUpdate((event) => {\n\t\t\t\"worklet\";\n\t\t\tlet gestureProgress = 0;\n\n\t\t\t_translateX.value = event.translationX;\n\t\t\t_translateY.value = event.translationY;\n\t\t\t_normalizedGestureX.value = interpolate(\n\t\t\t\tevent.translationX,\n\t\t\t\t[-width, width],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\t\t\t_normalizedGestureY.value = interpolate(\n\t\t\t\tevent.translationY,\n\t\t\t\t[-height, height],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst distance = Math.sqrt(\n\t\t\t\t\tevent.translationX ** 2 + event.translationY ** 2,\n\t\t\t\t);\n\t\t\t\tgestureProgress = mapGestureToProgress(distance, width);\n\t\t\t} else {\n\t\t\t\tlet maxProgress = 0;\n\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (allowedRight || allowedLeft) {\n\t\t\t\t\tconst absX = Math.abs(event.translationX);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absX, width);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tif (allowedUp || allowedDown) {\n\t\t\t\t\tconst absY = Math.abs(event.translationY);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absY, height);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tgestureProgress = maxProgress;\n\t\t\t}\n\n\t\t\tprogress.value = 1 - gestureProgress;\n\t\t})\n\t\t.onEnd((event) => {\n\t\t\t\"worklet\";\n\t\t\tconst { translationX, translationY, velocityX, velocityY } = event;\n\n\t\t\tlet shouldDismiss = false;\n\t\t\tconst dismissThreshold = 0.5;\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst finalX = Math.abs(\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalY = Math.abs(\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalDistance = Math.sqrt(finalX ** 2 + finalY ** 2);\n\t\t\t\tshouldDismiss = finalDistance > width * dismissThreshold;\n\t\t\t} else {\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (\n\t\t\t\t\tallowedRight &&\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedLeft &&\n\t\t\t\t\t-translationX - velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedDown &&\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedUp &&\n\t\t\t\t\t-translationY - velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst finalProgress = shouldDismiss ? 0 : 1;\n\t\t\tconst spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;\n\n\t\t\tconst onFinish = shouldDismiss\n\t\t\t\t? (isFinished?: boolean) => {\n\t\t\t\t\t\t\"worklet\";\n\t\t\t\t\t\tif (isFinished) runOnJS(goBack)();\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\t\tprogress.value = animate(finalProgress, spec, onFinish);\n\n\t\t\t_translateX.value = animate(0, spec);\n\t\t\t_translateY.value = animate(0, spec);\n\t\t\t_normalizedGestureX.value = animate(0, spec);\n\t\t\t_normalizedGestureY.value = animate(0, spec);\n\t\t});\n\n\tconst criteria = createGestureActivationCriteria({\n\t\tgestureDirection,\n\t\tgestureResponseDistance,\n\t});\n\n\tif (criteria?.activeOffsetX) {\n\t\tpanGesture.activeOffsetX(criteria.activeOffsetX);\n\t}\n\tif (criteria?.activeOffsetY) {\n\t\tpanGesture.activeOffsetY(criteria.activeOffsetY);\n\t}\n\tif (criteria?.failOffsetX) {\n\t\tpanGesture.failOffsetX(criteria.failOffsetX);\n\t}\n\tif (criteria?.failOffsetY) {\n\t\tpanGesture.failOffsetY(criteria.failOffsetY);\n\t}\n\n\tpanGesture.enableTrackpadTwoFingerGesture(true);\n\tconst nativeGesture = Gesture.Native().shouldCancelWhenOutside(false);\n\n\treturn Gesture.Race(panGesture, nativeGesture);\n};\n","import type { TransitionConfig } from \"../../types\";\n\ninterface GestureActivationOptions {\n\tgestureDirection:\n\t\t| TransitionConfig[\"gestureDirection\"]\n\t\t| Array<TransitionConfig[\"gestureDirection\"]>;\n\tgestureResponseDistance: number;\n}\n\n/**\n * rngh requires this type instead a number[]. We're returning a num[] which is still correct, this is just to remove the type error.\n */\ntype OffsetErrorTypeBugFix = [start: number, end: number];\n\nexport const createGestureActivationCriteria = ({\n\tgestureDirection,\n\tgestureResponseDistance,\n}: GestureActivationOptions) => {\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tif (directions.includes(\"bidirectional\")) {\n\t\treturn {\n\t\t\tactiveOffsetX: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t\tactiveOffsetY: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t};\n\t}\n\n\tconst allowedDown = directions.includes(\"vertical\");\n\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\tconst allowedRight = directions.includes(\"horizontal\");\n\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\tconst toleranceX = 15;\n\tconst toleranceY = 20;\n\tconst dist = gestureResponseDistance;\n\n\tconst result: {\n\t\tactiveOffsetX?: number | [number, number];\n\t\tfailOffsetX?: number | OffsetErrorTypeBugFix;\n\t\tactiveOffsetY?: number | [number, number];\n\t\tfailOffsetY?: number | OffsetErrorTypeBugFix;\n\t} = {};\n\n\tconst hasHorizontal = allowedLeft || allowedRight;\n\tif (hasHorizontal) {\n\t\tif (allowedLeft && allowedRight) {\n\t\t\tresult.activeOffsetX = [-dist, dist];\n\t\t} else if (allowedLeft) {\n\t\t\tresult.activeOffsetX = -dist;\n\t\t} else if (allowedRight) {\n\t\t\tresult.activeOffsetX = dist;\n\t\t}\n\n\t\tif (allowedRight && !allowedLeft) {\n\t\t\tresult.failOffsetX = -dist;\n\t\t} else if (allowedLeft && !allowedRight) {\n\t\t\tresult.failOffsetX = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetX = [-toleranceX, toleranceX] as OffsetErrorTypeBugFix;\n\t}\n\n\tconst hasVertical = allowedUp || allowedDown;\n\tif (hasVertical) {\n\t\tif (allowedUp && allowedDown) {\n\t\t\tresult.activeOffsetY = [-dist, dist];\n\t\t} else if (allowedUp) {\n\t\t\tresult.activeOffsetY = -dist;\n\t\t} else if (allowedDown) {\n\t\t\tresult.activeOffsetY = dist;\n\t\t}\n\n\t\tif (allowedDown && !allowedUp) {\n\t\t\tresult.failOffsetY = -dist;\n\t\t} else if (allowedUp && !allowedDown) {\n\t\t\tresult.failOffsetY = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetY = [-toleranceY, toleranceY] as OffsetErrorTypeBugFix;\n\t}\n\n\treturn result;\n};\n","/**\n * Utility function to map raw gesture translation to a progress value.\n */\nexport const mapGestureToProgress = (\n\ttranslation: number,\n\tdimension: number,\n) => {\n\t\"worklet\";\n\tconst rawProgress = translation / dimension;\n\treturn Math.max(0, Math.min(1, rawProgress));\n};\n","import type { TransitionInterpolatedStyle } from \"../types\";\n\nexport const noopinterpolator = (): TransitionInterpolatedStyle => {\n\t\"worklet\";\n\treturn {\n\t\tcontentStyle: {},\n\t\toverlayStyle: {},\n\t};\n};\n","import { useRoute } from \"@react-navigation/native\";\n\nexport const useKey = () => useRoute().key;\n","import type { ParamListBase, RouteProp } from \"@react-navigation/native\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tAny,\n\tBeforeRemoveEvent,\n\tFocusEvent,\n\tTransitionConfig,\n\tTransitionListeners,\n} from \"../types\";\n\nexport interface TransitionEventHandlersProps extends TransitionConfig {\n\tnavigation: Any;\n\troute: RouteProp<ParamListBase, string>;\n}\n\nexport const createConfig = ({\n\tnavigation: reactNavigation,\n\troute,\n\t...config\n}: TransitionEventHandlersProps): TransitionListeners => {\n\treturn {\n\t\tfocus: (e: FocusEvent) => {\n\t\t\tconst navigatorKey = reactNavigation.getState().key;\n\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tid: e.target,\n\t\t\t\tname: route.name,\n\t\t\t\tstatus: 1,\n\t\t\t\tclosing: false,\n\t\t\t\tnavigatorKey,\n\t\t\t\t...config,\n\t\t\t});\n\t\t},\n\t\tbeforeRemove: (e: BeforeRemoveEvent) => {\n\t\t\tconst navigatorState = reactNavigation.getState();\n\n\t\t\tconst isLastScreenInStack =\n\t\t\t\tnavigatorState.routes.length === 1 &&\n\t\t\t\tnavigatorState.routes[0].key === e.target;\n\n\t\t\tif (isLastScreenInStack) {\n\t\t\t\t/**\n\t\t\t\t * Without this guard, b/index would have a noticeable delay in it's back event. Then we will see the exit animation from b (layout).\n\t\t\t\t *\n\t\t\t\t * Since this is the last screen, we can assume the previous route is the parent. We'll let the parent handle it's exit animation instead.\n\t\t\t\t */\n\t\t\t\tRouteStore.removeRoute(e.target);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst handleFinish = (finished?: boolean) => {\n\t\t\t\tif (!finished) return;\n\t\t\t\tif (reactNavigation.canGoBack()) {\n\t\t\t\t\treactNavigation.dispatch(e.data?.action);\n\t\t\t\t\tRouteStore.removeRoute(e.target);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tstatus: 0,\n\t\t\t\tclosing: true,\n\t\t\t\tonAnimationFinish: handleFinish,\n\t\t\t});\n\t\t},\n\t} as TransitionListeners;\n};\n","import type React from \"react\";\nimport { type ComponentType, forwardRef, memo } from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n\ttype AnimatedProps,\n\tuseAnimatedStyle,\n} from \"react-native-reanimated\";\nimport type { Any } from \"@/types\";\nimport { _useScreenAnimation } from \"../hooks/use-screen-animation\";\nimport { useSkipFirstFrame } from \"../hooks/use-skip-first-frame\";\n\nexport function createTransitionComponent<P extends object>(\n\tWrapped: ComponentType<P>,\n) {\n\tconst AnimatedComponent = Animated.createAnimatedComponent(Wrapped);\n\n\ttype Props = AnimatedProps<P>;\n\n\tconst Inner = forwardRef<React.ComponentRef<typeof AnimatedComponent>, Props>(\n\t\t(props, ref) => {\n\t\t\tconst { children, style, ...rest } = props as Any;\n\n\t\t\tconst {\n\t\t\t\tscreenStyleInterpolator,\n\t\t\t\tgestureDetector,\n\t\t\t\t...screenInterpolationProps\n\t\t\t} = _useScreenAnimation();\n\n\t\t\tconst screenContainerStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).contentStyle || {}\n\t\t\t\t);\n\t\t\t});\n\t\t\tconst overlayStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).overlayStyle || {}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst { style: flickerFixStyle } = useSkipFirstFrame();\n\n\t\t\treturn (\n\t\t\t\t<Animated.View style={[{ flex: 1 }, flickerFixStyle]}>\n\t\t\t\t\t<GestureDetector gesture={gestureDetector}>\n\t\t\t\t\t\t<AnimatedComponent\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\t\t{ flex: 1, position: \"relative\" },\n\t\t\t\t\t\t\t\tscreenContainerStyle,\n\t\t\t\t\t\t\t\tstyle,\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</AnimatedComponent>\n\t\t\t\t\t</GestureDetector>\n\t\t\t\t\t<Animated.View\n\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\tStyleSheet.absoluteFillObject,\n\t\t\t\t\t\t\toverlayStyle,\n\t\t\t\t\t\t\t{ zIndex: 10000 },\n\t\t\t\t\t\t]}\n\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t/>\n\t\t\t\t</Animated.View>\n\t\t\t);\n\t\t},\n\t);\n\n\tInner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || \"Component\"})`;\n\n\treturn memo(Inner) as React.MemoExoticComponent<\n\t\tReact.ForwardRefExoticComponent<\n\t\t\tAnimatedProps<P> & React.RefAttributes<React.ComponentRef<typeof Wrapped>>\n\t\t>\n\t>;\n}\n","import { useEffect } from \"react\";\nimport { useAnimatedStyle, useSharedValue } from \"react-native-reanimated\";\n\n/**\n * This hook helps mitigate a race condition between the JS and UI thread where styles are not applied immediately.\n * By skipping one frame before rendering, it ensures styles are properly applied, removing a flicker effect.\n *\n * Related issue: https://github.com/software-mansion/react-native-reanimated/issues/4446\n */\nexport const useSkipFirstFrame = () => {\n\tconst opacity = useSharedValue(0);\n\tconst style = useAnimatedStyle(() => {\n\t\t\"worklet\";\n\t\treturn {\n\t\t\topacity: opacity.value,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\trequestAnimationFrame(() => {\n\t\t\topacity.value = 1;\n\t\t});\n\t}, [opacity]);\n\n\treturn { style };\n};\n","/**\n * Helper function to return the default screen options in order for the screen animations to work properly.\n */\nexport const defaultScreenOptions = () =>\n\t({\n\t\tpresentation: \"containedTransparentModal\",\n\t\theaderShown: false,\n\t\tanimation: \"none\",\n\t}) as const;\n"],"mappings":"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","names":["import_react_native","import_native","import_react","import_react_native_reanimated","React","import_react_native_reanimated","import_react","import_react_native_reanimated","import_react_native_reanimated","import_react","import_react_native","import_react_native_gesture_handler","import_react_native_reanimated","import_react","import_react_native_reanimated","Animated"]}
|
package/dist/index.mjs
CHANGED
|
@@ -363,6 +363,11 @@ var RouteStore = {
|
|
|
363
363
|
routeKeys.splice(indexToRemove, 1);
|
|
364
364
|
}
|
|
365
365
|
});
|
|
366
|
+
},
|
|
367
|
+
getPreviousRoute: (key) => {
|
|
368
|
+
if (!key) return null;
|
|
369
|
+
const index = useRouteStore.getState().routeKeys.indexOf(key);
|
|
370
|
+
return index > -1 ? useRouteStore.getState().routes[useRouteStore.getState().routeKeys[index - 1]] : null;
|
|
366
371
|
}
|
|
367
372
|
};
|
|
368
373
|
|
|
@@ -669,9 +674,17 @@ var useAnimationBuilder = () => {
|
|
|
669
674
|
}
|
|
670
675
|
const currentScreenIndex = current.index;
|
|
671
676
|
const nextKey = routeKeys[currentScreenIndex + 1];
|
|
677
|
+
const next = nextKey ? routes[nextKey] : void 0;
|
|
678
|
+
const isSameNavigator = next?.navigatorKey === current.navigatorKey;
|
|
679
|
+
if (!isSameNavigator) {
|
|
680
|
+
return {
|
|
681
|
+
currentRoute: current,
|
|
682
|
+
nextRoute: void 0
|
|
683
|
+
};
|
|
684
|
+
}
|
|
672
685
|
return {
|
|
673
686
|
currentRoute: current,
|
|
674
|
-
nextRoute:
|
|
687
|
+
nextRoute: next
|
|
675
688
|
};
|
|
676
689
|
})
|
|
677
690
|
);
|
|
@@ -761,15 +774,23 @@ var createConfig = ({
|
|
|
761
774
|
}) => {
|
|
762
775
|
return {
|
|
763
776
|
focus: (e) => {
|
|
777
|
+
const navigatorKey = reactNavigation.getState().key;
|
|
764
778
|
RouteStore.updateRoute(e.target, {
|
|
765
779
|
id: e.target,
|
|
766
780
|
name: route.name,
|
|
767
781
|
status: 1,
|
|
768
782
|
closing: false,
|
|
783
|
+
navigatorKey,
|
|
769
784
|
...config
|
|
770
785
|
});
|
|
771
786
|
},
|
|
772
787
|
beforeRemove: (e) => {
|
|
788
|
+
const navigatorState = reactNavigation.getState();
|
|
789
|
+
const isLastScreenInStack = navigatorState.routes.length === 1 && navigatorState.routes[0].key === e.target;
|
|
790
|
+
if (isLastScreenInStack) {
|
|
791
|
+
RouteStore.removeRoute(e.target);
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
773
794
|
e.preventDefault();
|
|
774
795
|
const handleFinish = (finished) => {
|
|
775
796
|
if (!finished) return;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/configs/presets.ts","../src/configs/specs.ts","../src/hooks/use-screen-animation.tsx","../src/store/utils/use-shallow.tsx","../src/store/utils/shallow.ts","../src/animation-engine.ts","../src/store/utils/create-vanilla-store.ts","../src/store/index.ts","../src/utils/animate.ts","../src/utils/gesture/build-gesture-detector.ts","../src/utils/gesture/create-gesture-activation-criteria.ts","../src/utils/gesture/map-gesture-to-progress.ts","../src/utils/noop-interpolator.ts","../src/hooks/use-key.tsx","../src/utils/create-config.ts","../src/utils/create-transition-component.tsx","../src/hooks/use-skip-first-frame.tsx","../src/utils/default-screen-options.ts"],"sourcesContent":["import { Pressable, View } from \"react-native\";\nimport { presets, specs } from \"./configs\";\nimport { useScreenAnimation } from \"./hooks/use-screen-animation\";\nimport { createConfig } from \"./utils/create-config\";\nimport { createTransitionComponent } from \"./utils/create-transition-component\";\nimport { defaultScreenOptions } from \"./utils/default-screen-options\";\n\nexport default {\n\tcreateTransitionComponent,\n\tView: createTransitionComponent(View),\n\tPressable: createTransitionComponent(Pressable),\n\tcreateConfig,\n\tdefaultScreenOptions,\n\tpresets,\n\tspecs,\n};\n\nexport { useScreenAnimation };\n","import {\n\tExtrapolation,\n\tinterpolate,\n\tinterpolateColor,\n} from \"react-native-reanimated\";\nimport type { TransitionConfig } from \"../types\";\nimport { DefaultSpec } from \"./specs\";\n\nexport const SlideFromTop = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical-inverted\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [-height, 0, height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ZoomIn = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: false,\n\t\tscreenStyleInterpolator: ({ current, next }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst scale = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0.5, 1, 0.5],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\tconst opacity = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0, 1, 0],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }],\n\t\t\t\t\topacity,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const SlideFromBottom = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [height, 0, -height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const DraggableCard = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: [\"horizontal\", \"vertical\"],\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\t/** Combined */\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.75]);\n\n\t\t\t/** Vertical */\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.height * 0.5, screen.height * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/** Horizontal */\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.width * 0.5, screen.width * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateY: translateY }, { translateX }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ElasticCard = (\n\tconfig: Partial<TransitionConfig> & {\n\t\telasticFactor?: number;\n\t} = { elasticFactor: 0.5 },\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"bidirectional\",\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\t/**\n\t\t\t * Applies to both screens ( previous and incoming)\n\t\t\t */\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.8]);\n\n\t\t\t/**\n\t\t\t * Applies to current screen\n\t\t\t */\n\t\t\tconst maxElasticityX = screen.width * (config.elasticFactor ?? 0.5);\n\t\t\tconst maxElasticityY = screen.height * (config.elasticFactor ?? 0.5);\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityX, 0, maxElasticityX],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityY, 0, maxElasticityY],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Applies to unfocused screen ( previous screen )\n\t\t\t */\n\t\t\tconst overlayColor = interpolateColor(\n\t\t\t\tnext?.progress.value || 0,\n\t\t\t\t[0, 1],\n\t\t\t\t[\"rgba(0,0,0,0)\", \"rgba(0,0,0,0.5)\"],\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateX }, { translateY }],\n\t\t\t\t},\n\t\t\t\toverlayStyle: {\n\t\t\t\t\tbackgroundColor: overlayColor,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t...config,\n\t};\n};\n","import type { WithSpringConfig } from \"react-native-reanimated\";\n\nexport const DefaultSpec: WithSpringConfig = {\n\tstiffness: 1000,\n\tdamping: 500,\n\tmass: 3,\n\tovershootClamping: true,\n\trestSpeedThreshold: 0.01,\n};\n","import { useNavigation } from \"@react-navigation/native\";\nimport { useMemo } from \"react\";\nimport { useWindowDimensions } from \"react-native\";\nimport type {\n\tComposedGesture,\n\tGestureType,\n} from \"react-native-gesture-handler\";\nimport { useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useShallow } from \"@/store/utils/use-shallow\";\nimport { animationValues } from \"../animation-engine\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tScreenInterpolationProps,\n\tScreenStyleInterpolator,\n} from \"../types\";\nimport { buildGestureDetector } from \"../utils/gesture/build-gesture-detector\";\nimport { noopinterpolator } from \"../utils/noop-interpolator\";\nimport { useKey } from \"./use-key\";\n\ninterface InternalScreenInterpolationProps extends ScreenInterpolationProps {\n\tgestureDetector: GestureType | ComposedGesture;\n\tscreenStyleInterpolator: ScreenStyleInterpolator;\n}\n\nconst useAnimationBuilder = () => {\n\tconst key = useKey();\n\tconst dimensions = useWindowDimensions();\n\tconst insets = useSafeAreaInsets();\n\tconst navigation = useNavigation();\n\n\tconst { currentRoute, nextRoute } = RouteStore.use(\n\t\tuseShallow(({ routes, routeKeys }) => {\n\t\t\tconst current = routes[key];\n\n\t\t\tif (!current) {\n\t\t\t\treturn { currentRoute: undefined, nextRoute: undefined };\n\t\t\t}\n\n\t\t\tconst currentScreenIndex = current.index;\n\t\t\tconst nextKey = routeKeys[currentScreenIndex + 1];\n\n\t\t\treturn {\n\t\t\t\tcurrentRoute: current,\n\t\t\t\tnextRoute: nextKey ? routes[nextKey] : undefined,\n\t\t\t};\n\t\t}),\n\t);\n\n\tconst panGesture = useMemo(\n\t\t() =>\n\t\t\tbuildGestureDetector({\n\t\t\t\tkey,\n\t\t\t\tprogress: animationValues.screenProgress[key],\n\t\t\t\tconfig: currentRoute || {\n\t\t\t\t\tid: key,\n\t\t\t\t\tname: key,\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tstatus: 0,\n\t\t\t\t\tclosing: false,\n\t\t\t\t},\n\t\t\t\twidth: dimensions.width,\n\t\t\t\theight: dimensions.height,\n\t\t\t\tgoBack: navigation.goBack,\n\t\t\t}),\n\t\t[key, currentRoute, dimensions.width, dimensions.height, navigation.goBack],\n\t);\n\n\t// We'll avoid using makeMutable as fallbacks since useSharedValues are automatically garbage collected\n\tconst progressFallback = useSharedValue(0);\n\tconst gestureDraggingFallback = useSharedValue(0);\n\tconst gestureXFallback = useSharedValue(0);\n\tconst gestureYFallback = useSharedValue(0);\n\tconst normalizedGestureXFallback = useSharedValue(0);\n\tconst normalizedGestureYFallback = useSharedValue(0);\n\n\treturn useMemo(() => {\n\t\treturn {\n\t\t\tcurrent: {\n\t\t\t\tprogress: animationValues.screenProgress[key] || progressFallback,\n\t\t\t\tgesture: {\n\t\t\t\t\tisDragging:\n\t\t\t\t\t\tanimationValues.gestureDragging[key] || gestureDraggingFallback,\n\t\t\t\t\tx: animationValues.gestureX[key] || gestureXFallback,\n\t\t\t\t\ty: animationValues.gestureY[key] || gestureYFallback,\n\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\tanimationValues.normalizedGestureX[key] ||\n\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\tanimationValues.normalizedGestureY[key] ||\n\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t},\n\t\t\t},\n\t\t\tnext:\n\t\t\t\tnextRoute && animationValues.screenProgress[nextRoute.id]\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tprogress: animationValues.screenProgress[nextRoute.id],\n\t\t\t\t\t\t\tgesture: {\n\t\t\t\t\t\t\t\tisDragging:\n\t\t\t\t\t\t\t\t\tanimationValues.gestureDragging[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tgestureDraggingFallback,\n\t\t\t\t\t\t\t\tx: animationValues.gestureX[nextRoute.id] || gestureXFallback,\n\t\t\t\t\t\t\t\ty: animationValues.gestureY[nextRoute.id] || gestureYFallback,\n\t\t\t\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureX[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureY[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tlayouts: { screen: dimensions },\n\t\t\tinsets,\n\t\t\tclosing: currentRoute?.closing || false,\n\t\t\tscreenStyleInterpolator:\n\t\t\t\tnextRoute?.screenStyleInterpolator ||\n\t\t\t\tcurrentRoute?.screenStyleInterpolator ||\n\t\t\t\tnoopinterpolator,\n\n\t\t\tgestureDetector: panGesture,\n\t\t};\n\t}, [\n\t\tkey,\n\t\tcurrentRoute,\n\t\tnextRoute,\n\t\tdimensions,\n\t\tinsets,\n\t\tpanGesture,\n\t\tprogressFallback,\n\t\tgestureDraggingFallback,\n\t\tgestureXFallback,\n\t\tgestureYFallback,\n\t\tnormalizedGestureXFallback,\n\t\tnormalizedGestureYFallback,\n\t]);\n};\n\nconst _useScreenAnimation = (): InternalScreenInterpolationProps => {\n\treturn useAnimationBuilder();\n};\n\nconst useScreenAnimation = (): ScreenInterpolationProps => {\n\tconst {\n\t\tscreenStyleInterpolator: _,\n\t\tgestureDetector: __,\n\t\t...animationProps\n\t} = useAnimationBuilder();\n\n\treturn animationProps;\n};\n\nexport { _useScreenAnimation, useScreenAnimation };\n","/**\n * NOTICE:\n * Taken from zustand/react/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/react/shallow.ts\n */\nimport React from \"react\";\nimport { shallow } from \"./shallow\";\n\nexport function useShallow<S, U>(selector: (state: S) => U): (state: S) => U {\n\tconst prev = React.useRef<U>(undefined);\n\treturn (state) => {\n\t\tconst next = selector(state);\n\n\t\tif (shallow(prev.current, next)) {\n\t\t\treturn prev.current as U;\n\t\t}\n\n\t\tprev.current = next;\n\t\treturn next;\n\t};\n}\n","/**\n * NOTICE:\n * Taken from zustand/vanilla/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/vanilla/shallow.ts\n */\n\nconst isIterable = (obj: object): obj is Iterable<unknown> =>\n\tSymbol.iterator in obj;\n\nconst hasIterableEntries = (\n\tvalue: Iterable<unknown>,\n): value is Iterable<unknown> & {\n\tentries(): Iterable<[unknown, unknown]>;\n} =>\n\t// HACK: avoid checking entries type\n\t\"entries\" in value;\n\nconst compareEntries = (\n\tvalueA: { entries(): Iterable<[unknown, unknown]> },\n\tvalueB: { entries(): Iterable<[unknown, unknown]> },\n) => {\n\tconst mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n\tconst mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n\tif (mapA.size !== mapB.size) {\n\t\treturn false;\n\t}\n\tfor (const [key, value] of mapA) {\n\t\tif (!Object.is(value, mapB.get(key))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\n// Ordered iterables\nconst compareIterables = (\n\tvalueA: Iterable<unknown>,\n\tvalueB: Iterable<unknown>,\n) => {\n\tconst iteratorA = valueA[Symbol.iterator]();\n\tconst iteratorB = valueB[Symbol.iterator]();\n\tlet nextA = iteratorA.next();\n\tlet nextB = iteratorB.next();\n\twhile (!nextA.done && !nextB.done) {\n\t\tif (!Object.is(nextA.value, nextB.value)) {\n\t\t\treturn false;\n\t\t}\n\t\tnextA = iteratorA.next();\n\t\tnextB = iteratorB.next();\n\t}\n\treturn !!nextA.done && !!nextB.done;\n};\n\nexport function shallow<T>(valueA: T, valueB: T): boolean {\n\tif (Object.is(valueA, valueB)) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof valueA !== \"object\" ||\n\t\tvalueA === null ||\n\t\ttypeof valueB !== \"object\" ||\n\t\tvalueB === null\n\t) {\n\t\treturn false;\n\t}\n\tif (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {\n\t\treturn false;\n\t}\n\n\tif (isIterable(valueA) && isIterable(valueB)) {\n\t\tif (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n\t\t\treturn compareEntries(valueA, valueB);\n\t\t}\n\t\treturn compareIterables(valueA, valueB);\n\t}\n\t// assume plain objects\n\treturn compareEntries(\n\t\t{ entries: () => Object.entries(valueA) },\n\t\t{ entries: () => Object.entries(valueB) },\n\t);\n}\n","import {\n\tcancelAnimation,\n\tmakeMutable,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\n\nimport { RouteStore } from \"./store/index\";\nimport type { RouteState } from \"./types\";\nimport { animate } from \"./utils/animate\";\n\ntype RouteKey = string;\n\nexport const animationValues: Record<\n\tstring,\n\tRecord<RouteKey, SharedValue<number>>\n> = {\n\tscreenProgress: {},\n\tgestureX: {},\n\tgestureY: {},\n\tnormalizedGestureX: {},\n\tnormalizedGestureY: {},\n\tgestureDragging: {},\n};\n\nconst triggerAnimation = (route: RouteState) => {\n\t\"worklet\";\n\tconst { id, closing, status, transitionSpec, onAnimationFinish } = route;\n\n\tconst progressValue = animationValues.screenProgress[id];\n\n\tif (!progressValue && __DEV__) {\n\t\tconsole.warn(`Animation values not found for route: ${id}`);\n\t\treturn;\n\t}\n\n\tconst animationConfig = closing\n\t\t? transitionSpec?.close\n\t\t: transitionSpec?.open;\n\n\tconst targetValue = status || 0;\n\n\tprogressValue.value = animate(targetValue, animationConfig, (finished) => {\n\t\t\"worklet\";\n\t\tif (finished && onAnimationFinish) {\n\t\t\trunOnJS(onAnimationFinish)(true);\n\t\t}\n\t});\n};\n\nRouteStore.use.subscribeWithSelector(\n\t(state) => state.routes,\n\t(currRoutes, prevRoutes) => {\n\t\tconst currKeys = Object.keys(currRoutes);\n\t\tconst prevKeys = Object.keys(prevRoutes);\n\n\t\tconst incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));\n\t\tconst removedKeys = prevKeys.filter((k) => !currKeys.includes(k));\n\t\tconst changedKeys = currKeys.filter((k) => currRoutes[k] !== prevRoutes[k]);\n\n\t\tconst animatableValues = Object.values(animationValues);\n\n\t\tfor (const incomingKey of incomingKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tvalue[incomingKey] = makeMutable(0);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove mutable values for removed routes\n\t\t * @see {@link https://docs.swmansion.com/react-native-reanimated/docs/advanced/makeMutable/}\n\t\t */\n\t\tfor (const removedKey of removedKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tcancelAnimation(value[removedKey]);\n\t\t\t\tdelete value[removedKey];\n\t\t\t}\n\t\t}\n\n\t\tfor (const changedKey of changedKeys) {\n\t\t\tconst currentRoute = currRoutes[changedKey];\n\t\t\tif (currentRoute) {\n\t\t\t\ttriggerAnimation(currentRoute);\n\t\t\t}\n\t\t}\n\t},\n);\n","import { type Draft, produce } from \"immer\";\nimport { useSyncExternalStore } from \"react\";\n\ntype Listener = () => void;\ntype StateUpdater<T> = (draft: Draft<T>) => void;\n\ntype StoreListener<_, TSelectorOutput> = (\n\tselectedState: TSelectorOutput,\n\tpreviousSelectedState: TSelectorOutput,\n) => void;\n\nexport interface StoreApi<T> {\n\tsetState: (updater: StateUpdater<T>) => void;\n\tgetState: () => T;\n\tsubscribe: (listener: Listener) => () => void;\n\tsubscribeWithSelector: <TSelectorOutput>(\n\t\tselector: (state: T) => TSelectorOutput,\n\t\tlistener: StoreListener<T, TSelectorOutput>,\n\t) => () => void;\n}\n\nexport function createVanillaStore<TState>(initialState: TState) {\n\tlet state: TState = initialState;\n\tconst listeners = new Set<Listener>();\n\n\tconst getState = (): TState => state;\n\n\tconst setState = (updater: StateUpdater<TState>) => {\n\t\tconst nextState = produce(state, updater);\n\n\t\tif (nextState !== state) {\n\t\t\tstate = nextState;\n\t\t\tlisteners.forEach((listener) => listener());\n\t\t}\n\t};\n\n\tconst subscribe = (listener: Listener): (() => void) => {\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t};\n\n\tconst subscribeWithSelector = <TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t\tlistener: StoreListener<TState, TSelectorOutput>,\n\t) => {\n\t\tlet previousSelectedState = selector(state);\n\n\t\tconst internalListener = () => {\n\t\t\tconst currentSelectedState = selector(getState());\n\n\t\t\tif (!Object.is(previousSelectedState, currentSelectedState)) {\n\t\t\t\tlistener(currentSelectedState, previousSelectedState);\n\t\t\t\tpreviousSelectedState = currentSelectedState;\n\t\t\t}\n\t\t};\n\n\t\tconst unsubscribe = subscribe(internalListener);\n\n\t\tlistener(previousSelectedState, previousSelectedState);\n\n\t\treturn unsubscribe;\n\t};\n\n\tfunction useStore<TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t): TSelectorOutput {\n\t\treturn useSyncExternalStore(subscribe, () => selector(getState()));\n\t}\n\n\tObject.assign(useStore, {\n\t\tsetState,\n\t\tgetState,\n\t\tsubscribe,\n\t\tsubscribeWithSelector,\n\t});\n\n\treturn useStore as typeof useStore & StoreApi<TState>;\n}\n","import type { RouteState, RouteStateStore } from \"../types\";\nimport { createVanillaStore } from \"./utils/create-vanilla-store\";\n\nconst useRouteStore = createVanillaStore<RouteStateStore>({\n\troutes: {},\n\trouteKeys: [],\n});\n\nexport const RouteStore = {\n\tuse: useRouteStore,\n\tupdateRoute: (key: string | undefined, value: Partial<RouteState>) => {\n\t\tif (!key) return;\n\n\t\tuseRouteStore.setState(({ routeKeys, routes }) => {\n\t\t\tconst currentRoute = routes[key];\n\n\t\t\tif (currentRoute) {\n\t\t\t\troutes[key] = {\n\t\t\t\t\t...currentRoute,\n\t\t\t\t\t...value,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { name = \"\", status = 0, closing = false, ...rest } = value;\n\n\t\t\t\tconst newIndex = routeKeys.length;\n\n\t\t\t\troutes[key] = {\n\t\t\t\t\tid: key,\n\t\t\t\t\tindex: newIndex,\n\t\t\t\t\tname,\n\t\t\t\t\tstatus,\n\t\t\t\t\tclosing,\n\t\t\t\t\t...rest,\n\t\t\t\t};\n\n\t\t\t\trouteKeys.push(key);\n\t\t\t}\n\t\t});\n\t},\n\tremoveRoute: (key: string | undefined) => {\n\t\tif (!key) return;\n\t\tuseRouteStore.setState(({ routes, routeKeys }) => {\n\t\t\tdelete routes[key];\n\n\t\t\tconst indexToRemove = routeKeys.indexOf(key);\n\n\t\t\tif (indexToRemove > -1) {\n\t\t\t\trouteKeys.splice(indexToRemove, 1);\n\t\t\t}\n\t\t});\n\t},\n};\n","import {\n\ttype WithSpringConfig,\n\ttype WithTimingConfig,\n\twithSpring,\n\twithTiming,\n} from \"react-native-reanimated\";\nimport type {\n\tAnimatableValue,\n\tAnimationCallback,\n} from \"react-native-reanimated/lib/typescript/commonTypes\";\n\nexport const animate = <T extends AnimatableValue>(\n\ttoValue: T,\n\tconfig?: WithSpringConfig | WithTimingConfig,\n\tcallback?: AnimationCallback,\n) => {\n\t\"worklet\";\n\tconst isSpring =\n\t\ttypeof config === \"object\" &&\n\t\t!(\"duration\" in config) &&\n\t\t!(\"easing\" in config);\n\n\tif (!isSpring) {\n\t\treturn withTiming(toValue, config, callback);\n\t}\n\n\treturn withSpring(toValue, config, callback);\n};\n","import { Gesture } from \"react-native-gesture-handler\";\nimport {\n\tinterpolate,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\nimport { animationValues } from \"../../animation-engine\";\nimport type { GestureDirection, RouteState } from \"../../types\";\nimport { animate } from \"../animate\";\nimport { createGestureActivationCriteria } from \"./create-gesture-activation-criteria\";\nimport { mapGestureToProgress } from \"./map-gesture-to-progress\";\n\nconst GESTURE_VELOCITY_IMPACT = 0.3;\nconst DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;\n\ninterface BuildGestureDetectorProps {\n\tkey: string;\n\tprogress: SharedValue<number>;\n\tconfig: RouteState;\n\twidth: number;\n\theight: number;\n\tgoBack: () => void;\n}\n\nexport const normalizeGestureTranslation = (\n\ttranslation: number,\n\tgestureDirection: GestureDirection,\n) => {\n\t\"worklet\";\n\tconst isInverted = gestureDirection.includes(\"inverted\");\n\n\tconst translated = Math.abs(translation) * (isInverted ? -1 : 1);\n\n\tif (isInverted) {\n\t\treturn Math.min(0, translated);\n\t}\n\n\treturn Math.max(0, translated);\n};\n\nexport const buildGestureDetector = ({\n\tkey,\n\tprogress,\n\tconfig,\n\twidth,\n\theight,\n\tgoBack,\n}: BuildGestureDetectorProps) => {\n\tconst _translateX = animationValues.gestureX[key];\n\tconst _translateY = animationValues.gestureY[key];\n\tconst _normalizedGestureX = animationValues.normalizedGestureX[key];\n\tconst _normalizedGestureY = animationValues.normalizedGestureY[key];\n\tconst _isDragging = animationValues.gestureDragging[key];\n\n\tconst {\n\t\tgestureDirection = \"horizontal\",\n\t\tgestureEnabled = false,\n\t\ttransitionSpec,\n\t\tgestureVelocityImpact = GESTURE_VELOCITY_IMPACT,\n\t\tgestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE,\n\t} = config;\n\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tconst panGesture = Gesture.Pan()\n\t\t.enabled(gestureEnabled)\n\t\t.onStart(() => {\n\t\t\t\"worklet\";\n\t\t\t_isDragging.value = 1;\n\t\t})\n\t\t.onUpdate((event) => {\n\t\t\t\"worklet\";\n\t\t\tlet gestureProgress = 0;\n\n\t\t\t_translateX.value = event.translationX;\n\t\t\t_translateY.value = event.translationY;\n\t\t\t_normalizedGestureX.value = interpolate(\n\t\t\t\tevent.translationX,\n\t\t\t\t[-width, width],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\t\t\t_normalizedGestureY.value = interpolate(\n\t\t\t\tevent.translationY,\n\t\t\t\t[-height, height],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst distance = Math.sqrt(\n\t\t\t\t\tevent.translationX ** 2 + event.translationY ** 2,\n\t\t\t\t);\n\t\t\t\tgestureProgress = mapGestureToProgress(distance, width);\n\t\t\t} else {\n\t\t\t\tlet maxProgress = 0;\n\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (allowedRight || allowedLeft) {\n\t\t\t\t\tconst absX = Math.abs(event.translationX);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absX, width);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tif (allowedUp || allowedDown) {\n\t\t\t\t\tconst absY = Math.abs(event.translationY);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absY, height);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tgestureProgress = maxProgress;\n\t\t\t}\n\n\t\t\tprogress.value = 1 - gestureProgress;\n\t\t})\n\t\t.onEnd((event) => {\n\t\t\t\"worklet\";\n\t\t\tconst { translationX, translationY, velocityX, velocityY } = event;\n\n\t\t\tlet shouldDismiss = false;\n\t\t\tconst dismissThreshold = 0.5;\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst finalX = Math.abs(\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalY = Math.abs(\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalDistance = Math.sqrt(finalX ** 2 + finalY ** 2);\n\t\t\t\tshouldDismiss = finalDistance > width * dismissThreshold;\n\t\t\t} else {\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (\n\t\t\t\t\tallowedRight &&\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedLeft &&\n\t\t\t\t\t-translationX - velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedDown &&\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedUp &&\n\t\t\t\t\t-translationY - velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst finalProgress = shouldDismiss ? 0 : 1;\n\t\t\tconst spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;\n\n\t\t\tconst onFinish = shouldDismiss\n\t\t\t\t? (isFinished?: boolean) => {\n\t\t\t\t\t\t\"worklet\";\n\t\t\t\t\t\tif (isFinished) runOnJS(goBack)();\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\t\tprogress.value = animate(finalProgress, spec, onFinish);\n\n\t\t\t_translateX.value = animate(0, spec);\n\t\t\t_translateY.value = animate(0, spec);\n\t\t\t_normalizedGestureX.value = animate(0, spec);\n\t\t\t_normalizedGestureY.value = animate(0, spec);\n\t\t});\n\n\tconst criteria = createGestureActivationCriteria({\n\t\tgestureDirection,\n\t\tgestureResponseDistance,\n\t});\n\n\tif (criteria?.activeOffsetX) {\n\t\tpanGesture.activeOffsetX(criteria.activeOffsetX);\n\t}\n\tif (criteria?.activeOffsetY) {\n\t\tpanGesture.activeOffsetY(criteria.activeOffsetY);\n\t}\n\tif (criteria?.failOffsetX) {\n\t\tpanGesture.failOffsetX(criteria.failOffsetX);\n\t}\n\tif (criteria?.failOffsetY) {\n\t\tpanGesture.failOffsetY(criteria.failOffsetY);\n\t}\n\n\tpanGesture.enableTrackpadTwoFingerGesture(true);\n\tconst nativeGesture = Gesture.Native().shouldCancelWhenOutside(false);\n\n\treturn Gesture.Race(panGesture, nativeGesture);\n};\n","import type { TransitionConfig } from \"../../types\";\n\ninterface GestureActivationOptions {\n\tgestureDirection:\n\t\t| TransitionConfig[\"gestureDirection\"]\n\t\t| Array<TransitionConfig[\"gestureDirection\"]>;\n\tgestureResponseDistance: number;\n}\n\n/**\n * rngh requires this type instead a number[]. We're returning a num[] which is still correct, this is just to remove the type error.\n */\ntype OffsetErrorTypeBugFix = [start: number, end: number];\n\nexport const createGestureActivationCriteria = ({\n\tgestureDirection,\n\tgestureResponseDistance,\n}: GestureActivationOptions) => {\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tif (directions.includes(\"bidirectional\")) {\n\t\treturn {\n\t\t\tactiveOffsetX: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t\tactiveOffsetY: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t};\n\t}\n\n\tconst allowedDown = directions.includes(\"vertical\");\n\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\tconst allowedRight = directions.includes(\"horizontal\");\n\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\tconst toleranceX = 15;\n\tconst toleranceY = 20;\n\tconst dist = gestureResponseDistance;\n\n\tconst result: {\n\t\tactiveOffsetX?: number | [number, number];\n\t\tfailOffsetX?: number | OffsetErrorTypeBugFix;\n\t\tactiveOffsetY?: number | [number, number];\n\t\tfailOffsetY?: number | OffsetErrorTypeBugFix;\n\t} = {};\n\n\tconst hasHorizontal = allowedLeft || allowedRight;\n\tif (hasHorizontal) {\n\t\tif (allowedLeft && allowedRight) {\n\t\t\tresult.activeOffsetX = [-dist, dist];\n\t\t} else if (allowedLeft) {\n\t\t\tresult.activeOffsetX = -dist;\n\t\t} else if (allowedRight) {\n\t\t\tresult.activeOffsetX = dist;\n\t\t}\n\n\t\tif (allowedRight && !allowedLeft) {\n\t\t\tresult.failOffsetX = -dist;\n\t\t} else if (allowedLeft && !allowedRight) {\n\t\t\tresult.failOffsetX = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetX = [-toleranceX, toleranceX] as OffsetErrorTypeBugFix;\n\t}\n\n\tconst hasVertical = allowedUp || allowedDown;\n\tif (hasVertical) {\n\t\tif (allowedUp && allowedDown) {\n\t\t\tresult.activeOffsetY = [-dist, dist];\n\t\t} else if (allowedUp) {\n\t\t\tresult.activeOffsetY = -dist;\n\t\t} else if (allowedDown) {\n\t\t\tresult.activeOffsetY = dist;\n\t\t}\n\n\t\tif (allowedDown && !allowedUp) {\n\t\t\tresult.failOffsetY = -dist;\n\t\t} else if (allowedUp && !allowedDown) {\n\t\t\tresult.failOffsetY = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetY = [-toleranceY, toleranceY] as OffsetErrorTypeBugFix;\n\t}\n\n\treturn result;\n};\n","/**\n * Utility function to map raw gesture translation to a progress value.\n */\nexport const mapGestureToProgress = (\n\ttranslation: number,\n\tdimension: number,\n) => {\n\t\"worklet\";\n\tconst rawProgress = translation / dimension;\n\treturn Math.max(0, Math.min(1, rawProgress));\n};\n","import type { TransitionInterpolatedStyle } from \"../types\";\n\nexport const noopinterpolator = (): TransitionInterpolatedStyle => {\n\t\"worklet\";\n\treturn {\n\t\tcontentStyle: {},\n\t\toverlayStyle: {},\n\t};\n};\n","import { useRoute } from \"@react-navigation/native\";\n\nexport const useKey = () => useRoute().key;\n","import type { ParamListBase, RouteProp } from \"@react-navigation/native\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tAny,\n\tBeforeRemoveEvent,\n\tFocusEvent,\n\tTransitionConfig,\n\tTransitionListeners,\n} from \"../types\";\n\nexport interface TransitionEventHandlersProps extends TransitionConfig {\n\tnavigation: Any;\n\troute: RouteProp<ParamListBase, string>;\n}\n\nexport const createConfig = ({\n\tnavigation: reactNavigation,\n\troute,\n\t...config\n}: TransitionEventHandlersProps): TransitionListeners => {\n\treturn {\n\t\tfocus: (e: FocusEvent) => {\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tid: e.target,\n\t\t\t\tname: route.name,\n\t\t\t\tstatus: 1,\n\t\t\t\tclosing: false,\n\t\t\t\t...config,\n\t\t\t});\n\t\t},\n\t\tbeforeRemove: (e: BeforeRemoveEvent) => {\n\t\t\te.preventDefault();\n\n\t\t\tconst handleFinish = (finished?: boolean) => {\n\t\t\t\tif (!finished) return;\n\t\t\t\tif (reactNavigation.canGoBack()) {\n\t\t\t\t\treactNavigation.dispatch(e.data?.action);\n\t\t\t\t\tRouteStore.removeRoute(e.target);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tstatus: 0,\n\t\t\t\tclosing: true,\n\t\t\t\tonAnimationFinish: handleFinish,\n\t\t\t});\n\t\t},\n\t} as TransitionListeners;\n};\n","import type React from \"react\";\nimport { type ComponentType, forwardRef, memo } from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n\ttype AnimatedProps,\n\tuseAnimatedStyle,\n} from \"react-native-reanimated\";\nimport type { Any } from \"@/types\";\nimport { _useScreenAnimation } from \"../hooks/use-screen-animation\";\nimport { useSkipFirstFrame } from \"../hooks/use-skip-first-frame\";\n\nexport function createTransitionComponent<P extends object>(\n\tWrapped: ComponentType<P>,\n) {\n\tconst AnimatedComponent = Animated.createAnimatedComponent(Wrapped);\n\n\ttype Props = AnimatedProps<P>;\n\n\tconst Inner = forwardRef<React.ComponentRef<typeof AnimatedComponent>, Props>(\n\t\t(props, ref) => {\n\t\t\tconst { children, style, ...rest } = props as Any;\n\n\t\t\tconst {\n\t\t\t\tscreenStyleInterpolator,\n\t\t\t\tgestureDetector,\n\t\t\t\t...screenInterpolationProps\n\t\t\t} = _useScreenAnimation();\n\n\t\t\tconst screenContainerStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).contentStyle || {}\n\t\t\t\t);\n\t\t\t});\n\t\t\tconst overlayStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).overlayStyle || {}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst { style: flickerFixStyle } = useSkipFirstFrame();\n\n\t\t\treturn (\n\t\t\t\t<Animated.View style={[{ flex: 1 }, flickerFixStyle]}>\n\t\t\t\t\t<GestureDetector gesture={gestureDetector}>\n\t\t\t\t\t\t<AnimatedComponent\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\t\t{ flex: 1, position: \"relative\" },\n\t\t\t\t\t\t\t\tscreenContainerStyle,\n\t\t\t\t\t\t\t\tstyle,\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</AnimatedComponent>\n\t\t\t\t\t</GestureDetector>\n\t\t\t\t\t<Animated.View\n\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\tStyleSheet.absoluteFillObject,\n\t\t\t\t\t\t\toverlayStyle,\n\t\t\t\t\t\t\t{ zIndex: 10000 },\n\t\t\t\t\t\t]}\n\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t/>\n\t\t\t\t</Animated.View>\n\t\t\t);\n\t\t},\n\t);\n\n\tInner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || \"Component\"})`;\n\n\treturn memo(Inner) as React.MemoExoticComponent<\n\t\tReact.ForwardRefExoticComponent<\n\t\t\tAnimatedProps<P> & React.RefAttributes<React.ComponentRef<typeof Wrapped>>\n\t\t>\n\t>;\n}\n","import { useEffect } from \"react\";\nimport { useAnimatedStyle, useSharedValue } from \"react-native-reanimated\";\n\n/**\n * This hook helps mitigate a race condition between the JS and UI thread where styles are not applied immediately.\n * By skipping one frame before rendering, it ensures styles are properly applied, removing a flicker effect.\n *\n * Related issue: https://github.com/software-mansion/react-native-reanimated/issues/4446\n */\nexport const useSkipFirstFrame = () => {\n\tconst opacity = useSharedValue(0);\n\tconst style = useAnimatedStyle(() => {\n\t\t\"worklet\";\n\t\treturn {\n\t\t\topacity: opacity.value,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\trequestAnimationFrame(() => {\n\t\t\topacity.value = 1;\n\t\t});\n\t}, [opacity]);\n\n\treturn { style };\n};\n","/**\n * Helper function to return the default screen options in order for the screen animations to work properly.\n */\nexport const defaultScreenOptions = () =>\n\t({\n\t\tpresentation: \"containedTransparentModal\",\n\t\theaderShown: false,\n\t\tanimation: \"none\",\n\t}) as const;\n"],"mappings":"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","names":["interpolate","runOnJS","interpolate","runOnJS","useAnimatedStyle","useSharedValue","useAnimatedStyle"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/configs/presets.ts","../src/configs/specs.ts","../src/hooks/use-screen-animation.tsx","../src/store/utils/use-shallow.tsx","../src/store/utils/shallow.ts","../src/animation-engine.ts","../src/store/utils/create-vanilla-store.ts","../src/store/index.ts","../src/utils/animate.ts","../src/utils/gesture/build-gesture-detector.ts","../src/utils/gesture/create-gesture-activation-criteria.ts","../src/utils/gesture/map-gesture-to-progress.ts","../src/utils/noop-interpolator.ts","../src/hooks/use-key.tsx","../src/utils/create-config.ts","../src/utils/create-transition-component.tsx","../src/hooks/use-skip-first-frame.tsx","../src/utils/default-screen-options.ts"],"sourcesContent":["import { Pressable, View } from \"react-native\";\nimport { presets, specs } from \"./configs\";\nimport { useScreenAnimation } from \"./hooks/use-screen-animation\";\nimport { createConfig } from \"./utils/create-config\";\nimport { createTransitionComponent } from \"./utils/create-transition-component\";\nimport { defaultScreenOptions } from \"./utils/default-screen-options\";\n\nexport default {\n\tcreateTransitionComponent,\n\tView: createTransitionComponent(View),\n\tPressable: createTransitionComponent(Pressable),\n\tcreateConfig,\n\tdefaultScreenOptions,\n\tpresets,\n\tspecs,\n};\n\nexport { useScreenAnimation };\n","import {\n\tExtrapolation,\n\tinterpolate,\n\tinterpolateColor,\n} from \"react-native-reanimated\";\nimport type { TransitionConfig } from \"../types\";\nimport { DefaultSpec } from \"./specs\";\n\nexport const SlideFromTop = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical-inverted\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [-height, 0, height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ZoomIn = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: false,\n\t\tscreenStyleInterpolator: ({ current, next }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst scale = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0.5, 1, 0.5],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\tconst opacity = interpolate(\n\t\t\t\tprogress,\n\t\t\t\t[0, 1, 2],\n\t\t\t\t[0, 1, 0],\n\t\t\t\tExtrapolation.CLAMP,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }],\n\t\t\t\t\topacity,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const SlideFromBottom = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"vertical\",\n\t\tscreenStyleInterpolator: ({\n\t\t\tcurrent,\n\t\t\tnext,\n\t\t\tlayouts: {\n\t\t\t\tscreen: { height },\n\t\t\t},\n\t\t}) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\tconst y = interpolate(progress, [0, 1, 2], [height, 0, -height]);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ translateY: y }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const DraggableCard = (\n\tconfig: Partial<TransitionConfig> = {},\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: [\"horizontal\", \"vertical\"],\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\n\t\t\t/** Combined */\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.75]);\n\n\t\t\t/** Vertical */\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.height * 0.5, screen.height * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/** Horizontal */\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 1],\n\t\t\t\t[-screen.width * 0.5, screen.width * 0.5],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateY: translateY }, { translateX }],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\ttransitionSpec: {\n\t\t\topen: DefaultSpec,\n\t\t\tclose: DefaultSpec,\n\t\t},\n\t\t...config,\n\t};\n};\n\nexport const ElasticCard = (\n\tconfig: Partial<TransitionConfig> & {\n\t\telasticFactor?: number;\n\t} = { elasticFactor: 0.5 },\n): TransitionConfig => {\n\treturn {\n\t\tgestureEnabled: true,\n\t\tgestureDirection: \"bidirectional\",\n\t\tscreenStyleInterpolator: ({ current, next, layouts: { screen } }) => {\n\t\t\t\"worklet\";\n\n\t\t\t/**\n\t\t\t * Applies to both screens ( previous and incoming)\n\t\t\t */\n\t\t\tconst progress = current.progress.value + (next?.progress.value ?? 0);\n\t\t\tconst scale = interpolate(progress, [0, 1, 2], [0, 1, 0.8]);\n\n\t\t\t/**\n\t\t\t * Applies to current screen\n\t\t\t */\n\t\t\tconst maxElasticityX = screen.width * (config.elasticFactor ?? 0.5);\n\t\t\tconst maxElasticityY = screen.height * (config.elasticFactor ?? 0.5);\n\t\t\tconst translateX = interpolate(\n\t\t\t\tcurrent.gesture.normalizedX.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityX, 0, maxElasticityX],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tconst translateY = interpolate(\n\t\t\t\tcurrent.gesture.normalizedY.value,\n\t\t\t\t[-1, 0, 1],\n\t\t\t\t[-maxElasticityY, 0, maxElasticityY],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Applies to unfocused screen ( previous screen )\n\t\t\t */\n\t\t\tconst overlayColor = interpolateColor(\n\t\t\t\tnext?.progress.value || 0,\n\t\t\t\t[0, 1],\n\t\t\t\t[\"rgba(0,0,0,0)\", \"rgba(0,0,0,0.5)\"],\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcontentStyle: {\n\t\t\t\t\ttransform: [{ scale }, { translateX }, { translateY }],\n\t\t\t\t},\n\t\t\t\toverlayStyle: {\n\t\t\t\t\tbackgroundColor: overlayColor,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t...config,\n\t};\n};\n","import type { WithSpringConfig } from \"react-native-reanimated\";\n\nexport const DefaultSpec: WithSpringConfig = {\n\tstiffness: 1000,\n\tdamping: 500,\n\tmass: 3,\n\tovershootClamping: true,\n\trestSpeedThreshold: 0.01,\n};\n","import { useNavigation } from \"@react-navigation/native\";\nimport { useMemo } from \"react\";\nimport { useWindowDimensions } from \"react-native\";\nimport type {\n\tComposedGesture,\n\tGestureType,\n} from \"react-native-gesture-handler\";\nimport { useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useShallow } from \"@/store/utils/use-shallow\";\nimport { animationValues } from \"../animation-engine\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tScreenInterpolationProps,\n\tScreenStyleInterpolator,\n} from \"../types\";\nimport { buildGestureDetector } from \"../utils/gesture/build-gesture-detector\";\nimport { noopinterpolator } from \"../utils/noop-interpolator\";\nimport { useKey } from \"./use-key\";\n\ninterface InternalScreenInterpolationProps extends ScreenInterpolationProps {\n\tgestureDetector: GestureType | ComposedGesture;\n\tscreenStyleInterpolator: ScreenStyleInterpolator;\n}\n\nconst useAnimationBuilder = () => {\n\tconst key = useKey();\n\tconst dimensions = useWindowDimensions();\n\tconst insets = useSafeAreaInsets();\n\tconst navigation = useNavigation();\n\n\tconst { currentRoute, nextRoute } = RouteStore.use(\n\t\tuseShallow(({ routes, routeKeys }) => {\n\t\t\tconst current = routes[key];\n\n\t\t\tif (!current) {\n\t\t\t\treturn { currentRoute: undefined, nextRoute: undefined };\n\t\t\t}\n\n\t\t\tconst currentScreenIndex = current.index;\n\t\t\tconst nextKey = routeKeys[currentScreenIndex + 1];\n\t\t\tconst next = nextKey ? routes[nextKey] : undefined;\n\n\t\t\tconst isSameNavigator = next?.navigatorKey === current.navigatorKey;\n\n\t\t\tif (!isSameNavigator) {\n\t\t\t\t/**\n\t\t\t\t * Without this guard, b (_layout) would instantly run its exit animation (if declared) once b/index is focused.\n\t\t\t\t */\n\t\t\t\treturn {\n\t\t\t\t\tcurrentRoute: current,\n\t\t\t\t\tnextRoute: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcurrentRoute: current,\n\t\t\t\tnextRoute: next,\n\t\t\t};\n\t\t}),\n\t);\n\n\tconst panGesture = useMemo(\n\t\t() =>\n\t\t\tbuildGestureDetector({\n\t\t\t\tkey,\n\t\t\t\tprogress: animationValues.screenProgress[key],\n\t\t\t\tconfig: currentRoute || {\n\t\t\t\t\tid: key,\n\t\t\t\t\tname: key,\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tstatus: 0,\n\t\t\t\t\tclosing: false,\n\t\t\t\t},\n\t\t\t\twidth: dimensions.width,\n\t\t\t\theight: dimensions.height,\n\t\t\t\tgoBack: navigation.goBack,\n\t\t\t}),\n\t\t[key, currentRoute, dimensions.width, dimensions.height, navigation.goBack],\n\t);\n\n\t// We'll avoid using makeMutable as fallbacks since useSharedValues are automatically garbage collected\n\tconst progressFallback = useSharedValue(0);\n\tconst gestureDraggingFallback = useSharedValue(0);\n\tconst gestureXFallback = useSharedValue(0);\n\tconst gestureYFallback = useSharedValue(0);\n\tconst normalizedGestureXFallback = useSharedValue(0);\n\tconst normalizedGestureYFallback = useSharedValue(0);\n\n\treturn useMemo(() => {\n\t\treturn {\n\t\t\tcurrent: {\n\t\t\t\tprogress: animationValues.screenProgress[key] || progressFallback,\n\t\t\t\tgesture: {\n\t\t\t\t\tisDragging:\n\t\t\t\t\t\tanimationValues.gestureDragging[key] || gestureDraggingFallback,\n\t\t\t\t\tx: animationValues.gestureX[key] || gestureXFallback,\n\t\t\t\t\ty: animationValues.gestureY[key] || gestureYFallback,\n\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\tanimationValues.normalizedGestureX[key] ||\n\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\tanimationValues.normalizedGestureY[key] ||\n\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t},\n\t\t\t},\n\t\t\tnext:\n\t\t\t\tnextRoute && animationValues.screenProgress[nextRoute.id]\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tprogress: animationValues.screenProgress[nextRoute.id],\n\t\t\t\t\t\t\tgesture: {\n\t\t\t\t\t\t\t\tisDragging:\n\t\t\t\t\t\t\t\t\tanimationValues.gestureDragging[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tgestureDraggingFallback,\n\t\t\t\t\t\t\t\tx: animationValues.gestureX[nextRoute.id] || gestureXFallback,\n\t\t\t\t\t\t\t\ty: animationValues.gestureY[nextRoute.id] || gestureYFallback,\n\t\t\t\t\t\t\t\tnormalizedX:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureX[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureXFallback,\n\t\t\t\t\t\t\t\tnormalizedY:\n\t\t\t\t\t\t\t\t\tanimationValues.normalizedGestureY[nextRoute.id] ||\n\t\t\t\t\t\t\t\t\tnormalizedGestureYFallback,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tlayouts: { screen: dimensions },\n\t\t\tinsets,\n\t\t\tclosing: currentRoute?.closing || false,\n\t\t\tscreenStyleInterpolator:\n\t\t\t\tnextRoute?.screenStyleInterpolator ||\n\t\t\t\tcurrentRoute?.screenStyleInterpolator ||\n\t\t\t\tnoopinterpolator,\n\n\t\t\tgestureDetector: panGesture,\n\t\t};\n\t}, [\n\t\tkey,\n\t\tcurrentRoute,\n\t\tnextRoute,\n\t\tdimensions,\n\t\tinsets,\n\t\tpanGesture,\n\t\tprogressFallback,\n\t\tgestureDraggingFallback,\n\t\tgestureXFallback,\n\t\tgestureYFallback,\n\t\tnormalizedGestureXFallback,\n\t\tnormalizedGestureYFallback,\n\t]);\n};\n\nconst _useScreenAnimation = (): InternalScreenInterpolationProps => {\n\treturn useAnimationBuilder();\n};\n\nconst useScreenAnimation = (): ScreenInterpolationProps => {\n\tconst {\n\t\tscreenStyleInterpolator: _,\n\t\tgestureDetector: __,\n\t\t...animationProps\n\t} = useAnimationBuilder();\n\n\treturn animationProps;\n};\n\nexport { _useScreenAnimation, useScreenAnimation };\n","/**\n * NOTICE:\n * Taken from zustand/react/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/react/shallow.ts\n */\nimport React from \"react\";\nimport { shallow } from \"./shallow\";\n\nexport function useShallow<S, U>(selector: (state: S) => U): (state: S) => U {\n\tconst prev = React.useRef<U>(undefined);\n\treturn (state) => {\n\t\tconst next = selector(state);\n\n\t\tif (shallow(prev.current, next)) {\n\t\t\treturn prev.current as U;\n\t\t}\n\n\t\tprev.current = next;\n\t\treturn next;\n\t};\n}\n","/**\n * NOTICE:\n * Taken from zustand/vanilla/shallow.ts\n * @link https://github.com/pmndrs/zustand/blob/main/src/vanilla/shallow.ts\n */\n\nconst isIterable = (obj: object): obj is Iterable<unknown> =>\n\tSymbol.iterator in obj;\n\nconst hasIterableEntries = (\n\tvalue: Iterable<unknown>,\n): value is Iterable<unknown> & {\n\tentries(): Iterable<[unknown, unknown]>;\n} =>\n\t// HACK: avoid checking entries type\n\t\"entries\" in value;\n\nconst compareEntries = (\n\tvalueA: { entries(): Iterable<[unknown, unknown]> },\n\tvalueB: { entries(): Iterable<[unknown, unknown]> },\n) => {\n\tconst mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n\tconst mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n\tif (mapA.size !== mapB.size) {\n\t\treturn false;\n\t}\n\tfor (const [key, value] of mapA) {\n\t\tif (!Object.is(value, mapB.get(key))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\n// Ordered iterables\nconst compareIterables = (\n\tvalueA: Iterable<unknown>,\n\tvalueB: Iterable<unknown>,\n) => {\n\tconst iteratorA = valueA[Symbol.iterator]();\n\tconst iteratorB = valueB[Symbol.iterator]();\n\tlet nextA = iteratorA.next();\n\tlet nextB = iteratorB.next();\n\twhile (!nextA.done && !nextB.done) {\n\t\tif (!Object.is(nextA.value, nextB.value)) {\n\t\t\treturn false;\n\t\t}\n\t\tnextA = iteratorA.next();\n\t\tnextB = iteratorB.next();\n\t}\n\treturn !!nextA.done && !!nextB.done;\n};\n\nexport function shallow<T>(valueA: T, valueB: T): boolean {\n\tif (Object.is(valueA, valueB)) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof valueA !== \"object\" ||\n\t\tvalueA === null ||\n\t\ttypeof valueB !== \"object\" ||\n\t\tvalueB === null\n\t) {\n\t\treturn false;\n\t}\n\tif (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {\n\t\treturn false;\n\t}\n\n\tif (isIterable(valueA) && isIterable(valueB)) {\n\t\tif (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n\t\t\treturn compareEntries(valueA, valueB);\n\t\t}\n\t\treturn compareIterables(valueA, valueB);\n\t}\n\t// assume plain objects\n\treturn compareEntries(\n\t\t{ entries: () => Object.entries(valueA) },\n\t\t{ entries: () => Object.entries(valueB) },\n\t);\n}\n","import {\n\tcancelAnimation,\n\tmakeMutable,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\n\nimport { RouteStore } from \"./store/index\";\nimport type { RouteState } from \"./types\";\nimport { animate } from \"./utils/animate\";\n\ntype RouteKey = string;\n\nexport const animationValues: Record<\n\tstring,\n\tRecord<RouteKey, SharedValue<number>>\n> = {\n\tscreenProgress: {},\n\tgestureX: {},\n\tgestureY: {},\n\tnormalizedGestureX: {},\n\tnormalizedGestureY: {},\n\tgestureDragging: {},\n};\n\nconst triggerAnimation = (route: RouteState) => {\n\t\"worklet\";\n\tconst { id, closing, status, transitionSpec, onAnimationFinish } = route;\n\n\tconst progressValue = animationValues.screenProgress[id];\n\n\tif (!progressValue && __DEV__) {\n\t\tconsole.warn(`Animation values not found for route: ${id}`);\n\t\treturn;\n\t}\n\n\tconst animationConfig = closing\n\t\t? transitionSpec?.close\n\t\t: transitionSpec?.open;\n\n\tconst targetValue = status || 0;\n\n\tprogressValue.value = animate(targetValue, animationConfig, (finished) => {\n\t\t\"worklet\";\n\t\tif (finished && onAnimationFinish) {\n\t\t\trunOnJS(onAnimationFinish)(true);\n\t\t}\n\t});\n};\n\nRouteStore.use.subscribeWithSelector(\n\t(state) => state.routes,\n\t(currRoutes, prevRoutes) => {\n\t\tconst currKeys = Object.keys(currRoutes);\n\t\tconst prevKeys = Object.keys(prevRoutes);\n\n\t\tconst incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));\n\t\tconst removedKeys = prevKeys.filter((k) => !currKeys.includes(k));\n\t\tconst changedKeys = currKeys.filter((k) => currRoutes[k] !== prevRoutes[k]);\n\n\t\tconst animatableValues = Object.values(animationValues);\n\n\t\tfor (const incomingKey of incomingKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tvalue[incomingKey] = makeMutable(0);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove mutable values for removed routes\n\t\t * @see {@link https://docs.swmansion.com/react-native-reanimated/docs/advanced/makeMutable/}\n\t\t */\n\t\tfor (const removedKey of removedKeys) {\n\t\t\tfor (const value of animatableValues) {\n\t\t\t\tcancelAnimation(value[removedKey]);\n\t\t\t\tdelete value[removedKey];\n\t\t\t}\n\t\t}\n\n\t\tfor (const changedKey of changedKeys) {\n\t\t\tconst currentRoute = currRoutes[changedKey];\n\t\t\tif (currentRoute) {\n\t\t\t\ttriggerAnimation(currentRoute);\n\t\t\t}\n\t\t}\n\t},\n);\n","import { type Draft, produce } from \"immer\";\nimport { useSyncExternalStore } from \"react\";\n\ntype Listener = () => void;\ntype StateUpdater<T> = (draft: Draft<T>) => void;\n\ntype StoreListener<_, TSelectorOutput> = (\n\tselectedState: TSelectorOutput,\n\tpreviousSelectedState: TSelectorOutput,\n) => void;\n\nexport interface StoreApi<T> {\n\tsetState: (updater: StateUpdater<T>) => void;\n\tgetState: () => T;\n\tsubscribe: (listener: Listener) => () => void;\n\tsubscribeWithSelector: <TSelectorOutput>(\n\t\tselector: (state: T) => TSelectorOutput,\n\t\tlistener: StoreListener<T, TSelectorOutput>,\n\t) => () => void;\n}\n\nexport function createVanillaStore<TState>(initialState: TState) {\n\tlet state: TState = initialState;\n\tconst listeners = new Set<Listener>();\n\n\tconst getState = (): TState => state;\n\n\tconst setState = (updater: StateUpdater<TState>) => {\n\t\tconst nextState = produce(state, updater);\n\n\t\tif (nextState !== state) {\n\t\t\tstate = nextState;\n\t\t\tlisteners.forEach((listener) => listener());\n\t\t}\n\t};\n\n\tconst subscribe = (listener: Listener): (() => void) => {\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t};\n\n\tconst subscribeWithSelector = <TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t\tlistener: StoreListener<TState, TSelectorOutput>,\n\t) => {\n\t\tlet previousSelectedState = selector(state);\n\n\t\tconst internalListener = () => {\n\t\t\tconst currentSelectedState = selector(getState());\n\n\t\t\tif (!Object.is(previousSelectedState, currentSelectedState)) {\n\t\t\t\tlistener(currentSelectedState, previousSelectedState);\n\t\t\t\tpreviousSelectedState = currentSelectedState;\n\t\t\t}\n\t\t};\n\n\t\tconst unsubscribe = subscribe(internalListener);\n\n\t\tlistener(previousSelectedState, previousSelectedState);\n\n\t\treturn unsubscribe;\n\t};\n\n\tfunction useStore<TSelectorOutput>(\n\t\tselector: (state: TState) => TSelectorOutput,\n\t): TSelectorOutput {\n\t\treturn useSyncExternalStore(subscribe, () => selector(getState()));\n\t}\n\n\tObject.assign(useStore, {\n\t\tsetState,\n\t\tgetState,\n\t\tsubscribe,\n\t\tsubscribeWithSelector,\n\t});\n\n\treturn useStore as typeof useStore & StoreApi<TState>;\n}\n","import type { RouteState, RouteStateStore } from \"../types\";\nimport { createVanillaStore } from \"./utils/create-vanilla-store\";\n\nconst useRouteStore = createVanillaStore<RouteStateStore>({\n\troutes: {},\n\trouteKeys: [],\n});\n\nexport const RouteStore = {\n\tuse: useRouteStore,\n\tupdateRoute: (key: string | undefined, value: Partial<RouteState>) => {\n\t\tif (!key) return;\n\n\t\tuseRouteStore.setState(({ routeKeys, routes }) => {\n\t\t\tconst currentRoute = routes[key];\n\n\t\t\tif (currentRoute) {\n\t\t\t\troutes[key] = {\n\t\t\t\t\t...currentRoute,\n\t\t\t\t\t...value,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { name = \"\", status = 0, closing = false, ...rest } = value;\n\n\t\t\t\tconst newIndex = routeKeys.length;\n\n\t\t\t\troutes[key] = {\n\t\t\t\t\tid: key,\n\t\t\t\t\tindex: newIndex,\n\t\t\t\t\tname,\n\t\t\t\t\tstatus,\n\t\t\t\t\tclosing,\n\t\t\t\t\t...rest,\n\t\t\t\t};\n\n\t\t\t\trouteKeys.push(key);\n\t\t\t}\n\t\t});\n\t},\n\tremoveRoute: (key: string | undefined) => {\n\t\tif (!key) return;\n\t\tuseRouteStore.setState(({ routes, routeKeys }) => {\n\t\t\tdelete routes[key];\n\n\t\t\tconst indexToRemove = routeKeys.indexOf(key);\n\n\t\t\tif (indexToRemove > -1) {\n\t\t\t\trouteKeys.splice(indexToRemove, 1);\n\t\t\t}\n\t\t});\n\t},\n\tgetPreviousRoute: (key: string | undefined): RouteState | null => {\n\t\tif (!key) return null;\n\t\tconst index = useRouteStore.getState().routeKeys.indexOf(key);\n\n\t\treturn index > -1\n\t\t\t? useRouteStore.getState().routes[\n\t\t\t\t\tuseRouteStore.getState().routeKeys[index - 1]\n\t\t\t\t]\n\t\t\t: null;\n\t},\n};\n","import {\n\ttype WithSpringConfig,\n\ttype WithTimingConfig,\n\twithSpring,\n\twithTiming,\n} from \"react-native-reanimated\";\nimport type {\n\tAnimatableValue,\n\tAnimationCallback,\n} from \"react-native-reanimated/lib/typescript/commonTypes\";\n\nexport const animate = <T extends AnimatableValue>(\n\ttoValue: T,\n\tconfig?: WithSpringConfig | WithTimingConfig,\n\tcallback?: AnimationCallback,\n) => {\n\t\"worklet\";\n\tconst isSpring =\n\t\ttypeof config === \"object\" &&\n\t\t!(\"duration\" in config) &&\n\t\t!(\"easing\" in config);\n\n\tif (!isSpring) {\n\t\treturn withTiming(toValue, config, callback);\n\t}\n\n\treturn withSpring(toValue, config, callback);\n};\n","import { Gesture } from \"react-native-gesture-handler\";\nimport {\n\tinterpolate,\n\trunOnJS,\n\ttype SharedValue,\n} from \"react-native-reanimated\";\nimport { animationValues } from \"../../animation-engine\";\nimport type { GestureDirection, RouteState } from \"../../types\";\nimport { animate } from \"../animate\";\nimport { createGestureActivationCriteria } from \"./create-gesture-activation-criteria\";\nimport { mapGestureToProgress } from \"./map-gesture-to-progress\";\n\nconst GESTURE_VELOCITY_IMPACT = 0.3;\nconst DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;\n\ninterface BuildGestureDetectorProps {\n\tkey: string;\n\tprogress: SharedValue<number>;\n\tconfig: RouteState;\n\twidth: number;\n\theight: number;\n\tgoBack: () => void;\n}\n\nexport const normalizeGestureTranslation = (\n\ttranslation: number,\n\tgestureDirection: GestureDirection,\n) => {\n\t\"worklet\";\n\tconst isInverted = gestureDirection.includes(\"inverted\");\n\n\tconst translated = Math.abs(translation) * (isInverted ? -1 : 1);\n\n\tif (isInverted) {\n\t\treturn Math.min(0, translated);\n\t}\n\n\treturn Math.max(0, translated);\n};\n\nexport const buildGestureDetector = ({\n\tkey,\n\tprogress,\n\tconfig,\n\twidth,\n\theight,\n\tgoBack,\n}: BuildGestureDetectorProps) => {\n\tconst _translateX = animationValues.gestureX[key];\n\tconst _translateY = animationValues.gestureY[key];\n\tconst _normalizedGestureX = animationValues.normalizedGestureX[key];\n\tconst _normalizedGestureY = animationValues.normalizedGestureY[key];\n\tconst _isDragging = animationValues.gestureDragging[key];\n\n\tconst {\n\t\tgestureDirection = \"horizontal\",\n\t\tgestureEnabled = false,\n\t\ttransitionSpec,\n\t\tgestureVelocityImpact = GESTURE_VELOCITY_IMPACT,\n\t\tgestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE,\n\t} = config;\n\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tconst panGesture = Gesture.Pan()\n\t\t.enabled(gestureEnabled)\n\t\t.onStart(() => {\n\t\t\t\"worklet\";\n\t\t\t_isDragging.value = 1;\n\t\t})\n\t\t.onUpdate((event) => {\n\t\t\t\"worklet\";\n\t\t\tlet gestureProgress = 0;\n\n\t\t\t_translateX.value = event.translationX;\n\t\t\t_translateY.value = event.translationY;\n\t\t\t_normalizedGestureX.value = interpolate(\n\t\t\t\tevent.translationX,\n\t\t\t\t[-width, width],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\t\t\t_normalizedGestureY.value = interpolate(\n\t\t\t\tevent.translationY,\n\t\t\t\t[-height, height],\n\t\t\t\t[-1, 1],\n\t\t\t\t\"clamp\",\n\t\t\t);\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst distance = Math.sqrt(\n\t\t\t\t\tevent.translationX ** 2 + event.translationY ** 2,\n\t\t\t\t);\n\t\t\t\tgestureProgress = mapGestureToProgress(distance, width);\n\t\t\t} else {\n\t\t\t\tlet maxProgress = 0;\n\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (allowedRight || allowedLeft) {\n\t\t\t\t\tconst absX = Math.abs(event.translationX);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absX, width);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tif (allowedUp || allowedDown) {\n\t\t\t\t\tconst absY = Math.abs(event.translationY);\n\t\t\t\t\tconst currentProgress = mapGestureToProgress(absY, height);\n\t\t\t\t\tmaxProgress = Math.max(maxProgress, currentProgress);\n\t\t\t\t}\n\n\t\t\t\tgestureProgress = maxProgress;\n\t\t\t}\n\n\t\t\tprogress.value = 1 - gestureProgress;\n\t\t})\n\t\t.onEnd((event) => {\n\t\t\t\"worklet\";\n\t\t\tconst { translationX, translationY, velocityX, velocityY } = event;\n\n\t\t\tlet shouldDismiss = false;\n\t\t\tconst dismissThreshold = 0.5;\n\n\t\t\tif (directions.includes(\"bidirectional\")) {\n\t\t\t\tconst finalX = Math.abs(\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalY = Math.abs(\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact,\n\t\t\t\t);\n\t\t\t\tconst finalDistance = Math.sqrt(finalX ** 2 + finalY ** 2);\n\t\t\t\tshouldDismiss = finalDistance > width * dismissThreshold;\n\t\t\t} else {\n\t\t\t\tconst allowedDown = directions.includes(\"vertical\");\n\t\t\t\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\t\t\t\tconst allowedRight = directions.includes(\"horizontal\");\n\t\t\t\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\t\t\t\tif (\n\t\t\t\t\tallowedRight &&\n\t\t\t\t\ttranslationX + velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedLeft &&\n\t\t\t\t\t-translationX - velocityX * gestureVelocityImpact >\n\t\t\t\t\t\twidth * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedDown &&\n\t\t\t\t\ttranslationY + velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t} else if (\n\t\t\t\t\tallowedUp &&\n\t\t\t\t\t-translationY - velocityY * gestureVelocityImpact >\n\t\t\t\t\t\theight * dismissThreshold\n\t\t\t\t) {\n\t\t\t\t\tshouldDismiss = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst finalProgress = shouldDismiss ? 0 : 1;\n\t\t\tconst spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;\n\n\t\t\tconst onFinish = shouldDismiss\n\t\t\t\t? (isFinished?: boolean) => {\n\t\t\t\t\t\t\"worklet\";\n\t\t\t\t\t\tif (isFinished) runOnJS(goBack)();\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\t\tprogress.value = animate(finalProgress, spec, onFinish);\n\n\t\t\t_translateX.value = animate(0, spec);\n\t\t\t_translateY.value = animate(0, spec);\n\t\t\t_normalizedGestureX.value = animate(0, spec);\n\t\t\t_normalizedGestureY.value = animate(0, spec);\n\t\t});\n\n\tconst criteria = createGestureActivationCriteria({\n\t\tgestureDirection,\n\t\tgestureResponseDistance,\n\t});\n\n\tif (criteria?.activeOffsetX) {\n\t\tpanGesture.activeOffsetX(criteria.activeOffsetX);\n\t}\n\tif (criteria?.activeOffsetY) {\n\t\tpanGesture.activeOffsetY(criteria.activeOffsetY);\n\t}\n\tif (criteria?.failOffsetX) {\n\t\tpanGesture.failOffsetX(criteria.failOffsetX);\n\t}\n\tif (criteria?.failOffsetY) {\n\t\tpanGesture.failOffsetY(criteria.failOffsetY);\n\t}\n\n\tpanGesture.enableTrackpadTwoFingerGesture(true);\n\tconst nativeGesture = Gesture.Native().shouldCancelWhenOutside(false);\n\n\treturn Gesture.Race(panGesture, nativeGesture);\n};\n","import type { TransitionConfig } from \"../../types\";\n\ninterface GestureActivationOptions {\n\tgestureDirection:\n\t\t| TransitionConfig[\"gestureDirection\"]\n\t\t| Array<TransitionConfig[\"gestureDirection\"]>;\n\tgestureResponseDistance: number;\n}\n\n/**\n * rngh requires this type instead a number[]. We're returning a num[] which is still correct, this is just to remove the type error.\n */\ntype OffsetErrorTypeBugFix = [start: number, end: number];\n\nexport const createGestureActivationCriteria = ({\n\tgestureDirection,\n\tgestureResponseDistance,\n}: GestureActivationOptions) => {\n\tconst directions = Array.isArray(gestureDirection)\n\t\t? gestureDirection\n\t\t: [gestureDirection];\n\n\tif (directions.includes(\"bidirectional\")) {\n\t\treturn {\n\t\t\tactiveOffsetX: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t\tactiveOffsetY: [\n\t\t\t\t-gestureResponseDistance,\n\t\t\t\tgestureResponseDistance,\n\t\t\t] as OffsetErrorTypeBugFix,\n\t\t};\n\t}\n\n\tconst allowedDown = directions.includes(\"vertical\");\n\tconst allowedUp = directions.includes(\"vertical-inverted\");\n\tconst allowedRight = directions.includes(\"horizontal\");\n\tconst allowedLeft = directions.includes(\"horizontal-inverted\");\n\n\tconst toleranceX = 15;\n\tconst toleranceY = 20;\n\tconst dist = gestureResponseDistance;\n\n\tconst result: {\n\t\tactiveOffsetX?: number | [number, number];\n\t\tfailOffsetX?: number | OffsetErrorTypeBugFix;\n\t\tactiveOffsetY?: number | [number, number];\n\t\tfailOffsetY?: number | OffsetErrorTypeBugFix;\n\t} = {};\n\n\tconst hasHorizontal = allowedLeft || allowedRight;\n\tif (hasHorizontal) {\n\t\tif (allowedLeft && allowedRight) {\n\t\t\tresult.activeOffsetX = [-dist, dist];\n\t\t} else if (allowedLeft) {\n\t\t\tresult.activeOffsetX = -dist;\n\t\t} else if (allowedRight) {\n\t\t\tresult.activeOffsetX = dist;\n\t\t}\n\n\t\tif (allowedRight && !allowedLeft) {\n\t\t\tresult.failOffsetX = -dist;\n\t\t} else if (allowedLeft && !allowedRight) {\n\t\t\tresult.failOffsetX = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetX = [-toleranceX, toleranceX] as OffsetErrorTypeBugFix;\n\t}\n\n\tconst hasVertical = allowedUp || allowedDown;\n\tif (hasVertical) {\n\t\tif (allowedUp && allowedDown) {\n\t\t\tresult.activeOffsetY = [-dist, dist];\n\t\t} else if (allowedUp) {\n\t\t\tresult.activeOffsetY = -dist;\n\t\t} else if (allowedDown) {\n\t\t\tresult.activeOffsetY = dist;\n\t\t}\n\n\t\tif (allowedDown && !allowedUp) {\n\t\t\tresult.failOffsetY = -dist;\n\t\t} else if (allowedUp && !allowedDown) {\n\t\t\tresult.failOffsetY = dist;\n\t\t}\n\t} else {\n\t\tresult.failOffsetY = [-toleranceY, toleranceY] as OffsetErrorTypeBugFix;\n\t}\n\n\treturn result;\n};\n","/**\n * Utility function to map raw gesture translation to a progress value.\n */\nexport const mapGestureToProgress = (\n\ttranslation: number,\n\tdimension: number,\n) => {\n\t\"worklet\";\n\tconst rawProgress = translation / dimension;\n\treturn Math.max(0, Math.min(1, rawProgress));\n};\n","import type { TransitionInterpolatedStyle } from \"../types\";\n\nexport const noopinterpolator = (): TransitionInterpolatedStyle => {\n\t\"worklet\";\n\treturn {\n\t\tcontentStyle: {},\n\t\toverlayStyle: {},\n\t};\n};\n","import { useRoute } from \"@react-navigation/native\";\n\nexport const useKey = () => useRoute().key;\n","import type { ParamListBase, RouteProp } from \"@react-navigation/native\";\nimport { RouteStore } from \"../store\";\nimport type {\n\tAny,\n\tBeforeRemoveEvent,\n\tFocusEvent,\n\tTransitionConfig,\n\tTransitionListeners,\n} from \"../types\";\n\nexport interface TransitionEventHandlersProps extends TransitionConfig {\n\tnavigation: Any;\n\troute: RouteProp<ParamListBase, string>;\n}\n\nexport const createConfig = ({\n\tnavigation: reactNavigation,\n\troute,\n\t...config\n}: TransitionEventHandlersProps): TransitionListeners => {\n\treturn {\n\t\tfocus: (e: FocusEvent) => {\n\t\t\tconst navigatorKey = reactNavigation.getState().key;\n\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tid: e.target,\n\t\t\t\tname: route.name,\n\t\t\t\tstatus: 1,\n\t\t\t\tclosing: false,\n\t\t\t\tnavigatorKey,\n\t\t\t\t...config,\n\t\t\t});\n\t\t},\n\t\tbeforeRemove: (e: BeforeRemoveEvent) => {\n\t\t\tconst navigatorState = reactNavigation.getState();\n\n\t\t\tconst isLastScreenInStack =\n\t\t\t\tnavigatorState.routes.length === 1 &&\n\t\t\t\tnavigatorState.routes[0].key === e.target;\n\n\t\t\tif (isLastScreenInStack) {\n\t\t\t\t/**\n\t\t\t\t * Without this guard, b/index would have a noticeable delay in it's back event. Then we will see the exit animation from b (layout).\n\t\t\t\t *\n\t\t\t\t * Since this is the last screen, we can assume the previous route is the parent. We'll let the parent handle it's exit animation instead.\n\t\t\t\t */\n\t\t\t\tRouteStore.removeRoute(e.target);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst handleFinish = (finished?: boolean) => {\n\t\t\t\tif (!finished) return;\n\t\t\t\tif (reactNavigation.canGoBack()) {\n\t\t\t\t\treactNavigation.dispatch(e.data?.action);\n\t\t\t\t\tRouteStore.removeRoute(e.target);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tRouteStore.updateRoute(e.target, {\n\t\t\t\tstatus: 0,\n\t\t\t\tclosing: true,\n\t\t\t\tonAnimationFinish: handleFinish,\n\t\t\t});\n\t\t},\n\t} as TransitionListeners;\n};\n","import type React from \"react\";\nimport { type ComponentType, forwardRef, memo } from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n\ttype AnimatedProps,\n\tuseAnimatedStyle,\n} from \"react-native-reanimated\";\nimport type { Any } from \"@/types\";\nimport { _useScreenAnimation } from \"../hooks/use-screen-animation\";\nimport { useSkipFirstFrame } from \"../hooks/use-skip-first-frame\";\n\nexport function createTransitionComponent<P extends object>(\n\tWrapped: ComponentType<P>,\n) {\n\tconst AnimatedComponent = Animated.createAnimatedComponent(Wrapped);\n\n\ttype Props = AnimatedProps<P>;\n\n\tconst Inner = forwardRef<React.ComponentRef<typeof AnimatedComponent>, Props>(\n\t\t(props, ref) => {\n\t\t\tconst { children, style, ...rest } = props as Any;\n\n\t\t\tconst {\n\t\t\t\tscreenStyleInterpolator,\n\t\t\t\tgestureDetector,\n\t\t\t\t...screenInterpolationProps\n\t\t\t} = _useScreenAnimation();\n\n\t\t\tconst screenContainerStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).contentStyle || {}\n\t\t\t\t);\n\t\t\t});\n\t\t\tconst overlayStyle = useAnimatedStyle(() => {\n\t\t\t\t\"worklet\";\n\t\t\t\treturn (\n\t\t\t\t\tscreenStyleInterpolator(screenInterpolationProps).overlayStyle || {}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst { style: flickerFixStyle } = useSkipFirstFrame();\n\n\t\t\treturn (\n\t\t\t\t<Animated.View style={[{ flex: 1 }, flickerFixStyle]}>\n\t\t\t\t\t<GestureDetector gesture={gestureDetector}>\n\t\t\t\t\t\t<AnimatedComponent\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\t\t{ flex: 1, position: \"relative\" },\n\t\t\t\t\t\t\t\tscreenContainerStyle,\n\t\t\t\t\t\t\t\tstyle,\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</AnimatedComponent>\n\t\t\t\t\t</GestureDetector>\n\t\t\t\t\t<Animated.View\n\t\t\t\t\t\tstyle={[\n\t\t\t\t\t\t\tStyleSheet.absoluteFillObject,\n\t\t\t\t\t\t\toverlayStyle,\n\t\t\t\t\t\t\t{ zIndex: 10000 },\n\t\t\t\t\t\t]}\n\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t/>\n\t\t\t\t</Animated.View>\n\t\t\t);\n\t\t},\n\t);\n\n\tInner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || \"Component\"})`;\n\n\treturn memo(Inner) as React.MemoExoticComponent<\n\t\tReact.ForwardRefExoticComponent<\n\t\t\tAnimatedProps<P> & React.RefAttributes<React.ComponentRef<typeof Wrapped>>\n\t\t>\n\t>;\n}\n","import { useEffect } from \"react\";\nimport { useAnimatedStyle, useSharedValue } from \"react-native-reanimated\";\n\n/**\n * This hook helps mitigate a race condition between the JS and UI thread where styles are not applied immediately.\n * By skipping one frame before rendering, it ensures styles are properly applied, removing a flicker effect.\n *\n * Related issue: https://github.com/software-mansion/react-native-reanimated/issues/4446\n */\nexport const useSkipFirstFrame = () => {\n\tconst opacity = useSharedValue(0);\n\tconst style = useAnimatedStyle(() => {\n\t\t\"worklet\";\n\t\treturn {\n\t\t\topacity: opacity.value,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\trequestAnimationFrame(() => {\n\t\t\topacity.value = 1;\n\t\t});\n\t}, [opacity]);\n\n\treturn { style };\n};\n","/**\n * Helper function to return the default screen options in order for the screen animations to work properly.\n */\nexport const defaultScreenOptions = () =>\n\t({\n\t\tpresentation: \"containedTransparentModal\",\n\t\theaderShown: false,\n\t\tanimation: \"none\",\n\t}) as const;\n"],"mappings":"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","names":["interpolate","runOnJS","interpolate","runOnJS","useAnimatedStyle","useSharedValue","useAnimatedStyle"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-screen-transitions",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Easy screen transitions for React Native and Expo",
|
|
5
5
|
"author": "Ed",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,6 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@biomejs/biome": "2.1.1",
|
|
50
|
+
"@testing-library/react-native": "^13.2.0",
|
|
51
|
+
"@types/bun": "^1.2.18",
|
|
50
52
|
"@types/react": "~19.0.10",
|
|
51
53
|
"tsup": "^8.5.0",
|
|
52
54
|
"typescript": "~5.8.3"
|