react-native-screen-transitions 3.11.3 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/lib/commonjs/blank-stack/components/stack-view.js +1 -2
  2. package/lib/commonjs/blank-stack/components/stack-view.js.map +1 -1
  3. package/lib/commonjs/component-stack/components/stack-view.js +1 -2
  4. package/lib/commonjs/component-stack/components/stack-view.js.map +1 -1
  5. package/lib/commonjs/native-stack/views/NativeStackView.native.js +2 -3
  6. package/lib/commonjs/native-stack/views/NativeStackView.native.js.map +1 -1
  7. package/lib/commonjs/shared/adapters/with-screen-transitions/stack-layout.js +1 -1
  8. package/lib/commonjs/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -1
  9. package/lib/commonjs/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +7 -4
  10. package/lib/commonjs/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +1 -1
  11. package/lib/commonjs/shared/components/overlay/helpers/create-overlay-interpolator-frame.js +30 -0
  12. package/lib/commonjs/shared/components/overlay/helpers/create-overlay-interpolator-frame.js.map +1 -0
  13. package/lib/commonjs/shared/components/overlay/helpers/get-active-overlay.js +40 -22
  14. package/lib/commonjs/shared/components/overlay/helpers/get-active-overlay.js.map +1 -1
  15. package/lib/commonjs/shared/components/overlay/helpers/retain-ready-overlay-resources.js +21 -0
  16. package/lib/commonjs/shared/components/overlay/helpers/retain-ready-overlay-resources.js.map +1 -0
  17. package/lib/commonjs/shared/components/overlay/helpers/run-overlay-slot-interpolator.js +41 -0
  18. package/lib/commonjs/shared/components/overlay/helpers/run-overlay-slot-interpolator.js.map +1 -0
  19. package/lib/commonjs/shared/components/overlay/hooks/use-overlay-slot.js +85 -0
  20. package/lib/commonjs/shared/components/overlay/hooks/use-overlay-slot.js.map +1 -0
  21. package/lib/commonjs/shared/components/overlay/variations/float-overlay.js +14 -65
  22. package/lib/commonjs/shared/components/overlay/variations/float-overlay.js.map +1 -1
  23. package/lib/commonjs/shared/components/overlay/variations/overlay-host.js +89 -16
  24. package/lib/commonjs/shared/components/overlay/variations/overlay-host.js.map +1 -1
  25. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +4 -1
  26. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  27. package/lib/commonjs/shared/providers/screen/animation/animation.provider.js +10 -7
  28. package/lib/commonjs/shared/providers/screen/animation/animation.provider.js.map +1 -1
  29. package/lib/commonjs/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js +6 -8
  30. package/lib/commonjs/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js.map +1 -1
  31. package/lib/commonjs/shared/providers/screen/animation/use-screen-animation.js +8 -2
  32. package/lib/commonjs/shared/providers/screen/animation/use-screen-animation.js.map +1 -1
  33. package/lib/commonjs/shared/providers/screen/gestures/gestures.provider.js +9 -5
  34. package/lib/commonjs/shared/providers/screen/gestures/gestures.provider.js.map +1 -1
  35. package/lib/commonjs/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js +1 -3
  36. package/lib/commonjs/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  37. package/lib/commonjs/shared/providers/screen/gestures/ownership/{use-walk-up-and-register-shadowing-claims.js → gesture-ownership-bridge.js} +36 -50
  38. package/lib/commonjs/shared/providers/screen/gestures/ownership/gesture-ownership-bridge.js.map +1 -0
  39. package/lib/commonjs/shared/providers/screen/styles/constants.js +1 -0
  40. package/lib/commonjs/shared/providers/screen/styles/constants.js.map +1 -1
  41. package/lib/commonjs/shared/providers/screen/styles/helpers/transition-visual-state.js +20 -1
  42. package/lib/commonjs/shared/providers/screen/styles/helpers/transition-visual-state.js.map +1 -1
  43. package/lib/commonjs/shared/providers/screen/styles/hooks/slot-resolvers.js +14 -15
  44. package/lib/commonjs/shared/providers/screen/styles/hooks/slot-resolvers.js.map +1 -1
  45. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +34 -11
  46. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  47. package/lib/commonjs/shared/providers/screen/styles/slot.provider.js +18 -29
  48. package/lib/commonjs/shared/providers/screen/styles/slot.provider.js.map +1 -1
  49. package/lib/commonjs/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.js +18 -0
  50. package/lib/commonjs/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.js.map +1 -0
  51. package/lib/commonjs/shared/providers/stack/blank-stack.provider.js +2 -1
  52. package/lib/commonjs/shared/providers/stack/blank-stack.provider.js.map +1 -1
  53. package/lib/commonjs/shared/utils/create-provider.js +119 -10
  54. package/lib/commonjs/shared/utils/create-provider.js.map +1 -1
  55. package/lib/module/blank-stack/components/stack-view.js +1 -2
  56. package/lib/module/blank-stack/components/stack-view.js.map +1 -1
  57. package/lib/module/component-stack/components/stack-view.js +1 -2
  58. package/lib/module/component-stack/components/stack-view.js.map +1 -1
  59. package/lib/module/native-stack/views/NativeStackView.native.js +2 -3
  60. package/lib/module/native-stack/views/NativeStackView.native.js.map +1 -1
  61. package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js +1 -1
  62. package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -1
  63. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +7 -4
  64. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +1 -1
  65. package/lib/module/shared/components/overlay/helpers/create-overlay-interpolator-frame.js +25 -0
  66. package/lib/module/shared/components/overlay/helpers/create-overlay-interpolator-frame.js.map +1 -0
  67. package/lib/module/shared/components/overlay/helpers/get-active-overlay.js +37 -21
  68. package/lib/module/shared/components/overlay/helpers/get-active-overlay.js.map +1 -1
  69. package/lib/module/shared/components/overlay/helpers/retain-ready-overlay-resources.js +17 -0
  70. package/lib/module/shared/components/overlay/helpers/retain-ready-overlay-resources.js.map +1 -0
  71. package/lib/module/shared/components/overlay/helpers/run-overlay-slot-interpolator.js +36 -0
  72. package/lib/module/shared/components/overlay/helpers/run-overlay-slot-interpolator.js.map +1 -0
  73. package/lib/module/shared/components/overlay/hooks/use-overlay-slot.js +80 -0
  74. package/lib/module/shared/components/overlay/hooks/use-overlay-slot.js.map +1 -0
  75. package/lib/module/shared/components/overlay/variations/float-overlay.js +15 -66
  76. package/lib/module/shared/components/overlay/variations/float-overlay.js.map +1 -1
  77. package/lib/module/shared/components/overlay/variations/overlay-host.js +90 -18
  78. package/lib/module/shared/components/overlay/variations/overlay-host.js.map +1 -1
  79. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +4 -1
  80. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  81. package/lib/module/shared/providers/screen/animation/animation.provider.js +10 -7
  82. package/lib/module/shared/providers/screen/animation/animation.provider.js.map +1 -1
  83. package/lib/module/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js +6 -8
  84. package/lib/module/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js.map +1 -1
  85. package/lib/module/shared/providers/screen/animation/use-screen-animation.js +8 -2
  86. package/lib/module/shared/providers/screen/animation/use-screen-animation.js.map +1 -1
  87. package/lib/module/shared/providers/screen/gestures/gestures.provider.js +10 -6
  88. package/lib/module/shared/providers/screen/gestures/gestures.provider.js.map +1 -1
  89. package/lib/module/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js +1 -3
  90. package/lib/module/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  91. package/lib/module/shared/providers/screen/gestures/ownership/{use-walk-up-and-register-shadowing-claims.js → gesture-ownership-bridge.js} +35 -49
  92. package/lib/module/shared/providers/screen/gestures/ownership/gesture-ownership-bridge.js.map +1 -0
  93. package/lib/module/shared/providers/screen/styles/constants.js +1 -0
  94. package/lib/module/shared/providers/screen/styles/constants.js.map +1 -1
  95. package/lib/module/shared/providers/screen/styles/helpers/transition-visual-state.js +18 -0
  96. package/lib/module/shared/providers/screen/styles/helpers/transition-visual-state.js.map +1 -1
  97. package/lib/module/shared/providers/screen/styles/hooks/slot-resolvers.js +14 -15
  98. package/lib/module/shared/providers/screen/styles/hooks/slot-resolvers.js.map +1 -1
  99. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +35 -12
  100. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  101. package/lib/module/shared/providers/screen/styles/slot.provider.js +19 -30
  102. package/lib/module/shared/providers/screen/styles/slot.provider.js.map +1 -1
  103. package/lib/module/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.js +14 -0
  104. package/lib/module/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.js.map +1 -0
  105. package/lib/module/shared/providers/stack/blank-stack.provider.js +2 -1
  106. package/lib/module/shared/providers/stack/blank-stack.provider.js.map +1 -1
  107. package/lib/module/shared/types/animation.types.js.map +1 -1
  108. package/lib/module/shared/utils/create-provider.js +119 -10
  109. package/lib/module/shared/utils/create-provider.js.map +1 -1
  110. package/lib/typescript/blank-stack/components/stack-view.d.ts.map +1 -1
  111. package/lib/typescript/blank-stack/types.d.ts +1 -1
  112. package/lib/typescript/blank-stack/types.d.ts.map +1 -1
  113. package/lib/typescript/component-stack/components/stack-view.d.ts.map +1 -1
  114. package/lib/typescript/component-stack/types.d.ts +1 -1
  115. package/lib/typescript/component-stack/types.d.ts.map +1 -1
  116. package/lib/typescript/native-stack/types.d.ts +1 -1
  117. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  118. package/lib/typescript/native-stack/views/NativeStackView.native.d.ts.map +1 -1
  119. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts.map +1 -1
  120. package/lib/typescript/shared/components/overlay/helpers/create-overlay-interpolator-frame.d.ts +7 -0
  121. package/lib/typescript/shared/components/overlay/helpers/create-overlay-interpolator-frame.d.ts.map +1 -0
  122. package/lib/typescript/shared/components/overlay/helpers/get-active-overlay.d.ts +17 -7
  123. package/lib/typescript/shared/components/overlay/helpers/get-active-overlay.d.ts.map +1 -1
  124. package/lib/typescript/shared/components/overlay/helpers/retain-ready-overlay-resources.d.ts +11 -0
  125. package/lib/typescript/shared/components/overlay/helpers/retain-ready-overlay-resources.d.ts.map +1 -0
  126. package/lib/typescript/shared/components/overlay/helpers/run-overlay-slot-interpolator.d.ts +8 -0
  127. package/lib/typescript/shared/components/overlay/helpers/run-overlay-slot-interpolator.d.ts.map +1 -0
  128. package/lib/typescript/shared/components/overlay/hooks/use-overlay-slot.d.ts +15 -0
  129. package/lib/typescript/shared/components/overlay/hooks/use-overlay-slot.d.ts.map +1 -0
  130. package/lib/typescript/shared/components/overlay/variations/float-overlay.d.ts +1 -1
  131. package/lib/typescript/shared/components/overlay/variations/float-overlay.d.ts.map +1 -1
  132. package/lib/typescript/shared/components/overlay/variations/overlay-host.d.ts +7 -6
  133. package/lib/typescript/shared/components/overlay/variations/overlay-host.d.ts.map +1 -1
  134. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts.map +1 -1
  135. package/lib/typescript/shared/index.d.ts +12 -12
  136. package/lib/typescript/shared/index.d.ts.map +1 -1
  137. package/lib/typescript/shared/providers/screen/animation/animation.provider.d.ts +4 -0
  138. package/lib/typescript/shared/providers/screen/animation/animation.provider.d.ts.map +1 -1
  139. package/lib/typescript/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.d.ts +4 -1
  140. package/lib/typescript/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.d.ts.map +1 -1
  141. package/lib/typescript/shared/providers/screen/animation/use-screen-animation.d.ts.map +1 -1
  142. package/lib/typescript/shared/providers/screen/gestures/gestures.provider.d.ts.map +1 -1
  143. package/lib/typescript/shared/providers/screen/gestures/hooks/use-screen-gesture-config.d.ts +2 -2
  144. package/lib/typescript/shared/providers/screen/gestures/hooks/use-screen-gesture-config.d.ts.map +1 -1
  145. package/lib/typescript/shared/providers/screen/gestures/ownership/gesture-ownership-bridge.d.ts +3 -0
  146. package/lib/typescript/shared/providers/screen/gestures/ownership/gesture-ownership-bridge.d.ts.map +1 -0
  147. package/lib/typescript/shared/providers/screen/styles/constants.d.ts.map +1 -1
  148. package/lib/typescript/shared/providers/screen/styles/helpers/transition-visual-state.d.ts +7 -0
  149. package/lib/typescript/shared/providers/screen/styles/helpers/transition-visual-state.d.ts.map +1 -1
  150. package/lib/typescript/shared/providers/screen/styles/hooks/slot-resolvers.d.ts.map +1 -1
  151. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts +1 -1
  152. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts.map +1 -1
  153. package/lib/typescript/shared/providers/screen/styles/slot.provider.d.ts +5 -5
  154. package/lib/typescript/shared/providers/screen/styles/slot.provider.d.ts.map +1 -1
  155. package/lib/typescript/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.d.ts +3 -0
  156. package/lib/typescript/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.d.ts.map +1 -0
  157. package/lib/typescript/shared/providers/stack/blank-stack.provider.d.ts.map +1 -1
  158. package/lib/typescript/shared/types/animation.types.d.ts +8 -0
  159. package/lib/typescript/shared/types/animation.types.d.ts.map +1 -1
  160. package/lib/typescript/shared/types/index.d.ts +1 -1
  161. package/lib/typescript/shared/types/index.d.ts.map +1 -1
  162. package/lib/typescript/shared/types/overlay.types.d.ts +26 -11
  163. package/lib/typescript/shared/types/overlay.types.d.ts.map +1 -1
  164. package/lib/typescript/shared/types/screen.types.d.ts +2 -2
  165. package/lib/typescript/shared/types/screen.types.d.ts.map +1 -1
  166. package/lib/typescript/shared/utils/create-provider.d.ts +21 -6
  167. package/lib/typescript/shared/utils/create-provider.d.ts.map +1 -1
  168. package/package.json +1 -1
  169. package/src/blank-stack/components/stack-view.tsx +1 -4
  170. package/src/blank-stack/types.ts +8 -2
  171. package/src/component-stack/components/stack-view.tsx +1 -4
  172. package/src/component-stack/types.ts +8 -2
  173. package/src/native-stack/types.ts +8 -2
  174. package/src/native-stack/views/NativeStackView.native.tsx +3 -9
  175. package/src/shared/adapters/with-screen-transitions/stack-layout.tsx +1 -1
  176. package/src/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.ts +9 -4
  177. package/src/shared/components/overlay/helpers/create-overlay-interpolator-frame.ts +29 -0
  178. package/src/shared/components/overlay/helpers/get-active-overlay.ts +62 -20
  179. package/src/shared/components/overlay/helpers/retain-ready-overlay-resources.ts +38 -0
  180. package/src/shared/components/overlay/helpers/run-overlay-slot-interpolator.ts +48 -0
  181. package/src/shared/components/overlay/hooks/use-overlay-slot.ts +103 -0
  182. package/src/shared/components/overlay/variations/float-overlay.tsx +22 -64
  183. package/src/shared/components/overlay/variations/overlay-host.tsx +135 -28
  184. package/src/shared/components/screen-lifecycle/hooks/use-close-transition-intent.ts +5 -1
  185. package/src/shared/index.ts +1 -0
  186. package/src/shared/providers/screen/animation/animation.provider.tsx +24 -11
  187. package/src/shared/providers/screen/animation/helpers/accessors/use-build-transition-accessor.ts +15 -9
  188. package/src/shared/providers/screen/animation/use-screen-animation.tsx +12 -2
  189. package/src/shared/providers/screen/gestures/gestures.provider.tsx +18 -7
  190. package/src/shared/providers/screen/gestures/hooks/use-screen-gesture-config.ts +4 -4
  191. package/src/shared/providers/screen/gestures/ownership/{use-walk-up-and-register-shadowing-claims.ts → gesture-ownership-bridge.tsx} +44 -54
  192. package/src/shared/providers/screen/styles/constants.ts +1 -0
  193. package/src/shared/providers/screen/styles/helpers/transition-visual-state.ts +26 -0
  194. package/src/shared/providers/screen/styles/hooks/slot-resolvers.tsx +17 -5
  195. package/src/shared/providers/screen/styles/hooks/use-interpolated-style-maps.tsx +51 -12
  196. package/src/shared/providers/screen/styles/slot.provider.tsx +46 -70
  197. package/src/shared/providers/stack/blank-stack-state/helpers/resolve-presented-index.ts +22 -0
  198. package/src/shared/providers/stack/blank-stack.provider.tsx +6 -1
  199. package/src/shared/types/animation.types.ts +8 -0
  200. package/src/shared/types/index.ts +1 -1
  201. package/src/shared/types/overlay.types.ts +41 -14
  202. package/src/shared/types/screen.types.ts +2 -2
  203. package/src/shared/utils/create-provider.tsx +221 -19
  204. package/lib/commonjs/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +0 -1
  205. package/lib/commonjs/shared/providers/screen/styles/components/floating-overlay-layer.js +0 -28
  206. package/lib/commonjs/shared/providers/screen/styles/components/floating-overlay-layer.js.map +0 -1
  207. package/lib/commonjs/shared/providers/screen/styles/stores/slot-references.store.js +0 -53
  208. package/lib/commonjs/shared/providers/screen/styles/stores/slot-references.store.js.map +0 -1
  209. package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +0 -1
  210. package/lib/module/shared/providers/screen/styles/components/floating-overlay-layer.js +0 -24
  211. package/lib/module/shared/providers/screen/styles/components/floating-overlay-layer.js.map +0 -1
  212. package/lib/module/shared/providers/screen/styles/stores/slot-references.store.js +0 -47
  213. package/lib/module/shared/providers/screen/styles/stores/slot-references.store.js.map +0 -1
  214. package/lib/typescript/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.d.ts +0 -14
  215. package/lib/typescript/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.d.ts.map +0 -1
  216. package/lib/typescript/shared/providers/screen/styles/components/floating-overlay-layer.d.ts +0 -7
  217. package/lib/typescript/shared/providers/screen/styles/components/floating-overlay-layer.d.ts.map +0 -1
  218. package/lib/typescript/shared/providers/screen/styles/stores/slot-references.store.d.ts +0 -6
  219. package/lib/typescript/shared/providers/screen/styles/stores/slot-references.store.d.ts.map +0 -1
  220. package/src/shared/providers/screen/styles/components/floating-overlay-layer.tsx +0 -29
  221. package/src/shared/providers/screen/styles/stores/slot-references.store.ts +0 -72
@@ -1,3 +1,4 @@
1
+ import { useRoute } from "@react-navigation/native";
1
2
  import { useMemo } from "react";
2
3
  import { useAnimatedProps, useAnimatedStyle } from "react-native-reanimated";
3
4
  import { NO_PROPS, NO_STYLES } from "../../../../constants";
@@ -7,8 +8,19 @@ import {
7
8
  } from "../helpers/compose-slot-style";
8
9
  import { useScreenSlots } from "../slot.provider";
9
10
 
11
+ const useCurrentScreenSlotsMap = () => {
12
+ const route = useRoute();
13
+ const slotsMap = useScreenSlots(route.key, (store) => store.slotsMap);
14
+
15
+ if (!slotsMap) {
16
+ throw new Error(`ScreenSlot store for route "${route.key}" was not found`);
17
+ }
18
+
19
+ return slotsMap;
20
+ };
21
+
10
22
  export const useSlotStyles = (slotId: string | undefined) => {
11
- const { slotsMap } = useScreenSlots();
23
+ const slotsMap = useCurrentScreenSlotsMap();
12
24
 
13
25
  return useAnimatedStyle(() => {
14
26
  const slot = slotId ? slotsMap.get()[slotId] : undefined;
@@ -26,7 +38,7 @@ export const useComposedSlotStyles = (
26
38
  slotId: string | undefined,
27
39
  style: unknown,
28
40
  ) => {
29
- const { slotsMap } = useScreenSlots();
41
+ const slotsMap = useCurrentScreenSlotsMap();
30
42
  const localTransform = useMemo(
31
43
  () => getLocalTransformForSlotComposition(style),
32
44
  [style],
@@ -50,7 +62,7 @@ export const useComposedSlotStyles = (
50
62
  * target takes the full associated style. Yields `NO_STYLES` when neither is set.
51
63
  */
52
64
  export const useSlotStackingStyles = (slotId: string | undefined) => {
53
- const { slotsMap } = useScreenSlots();
65
+ const slotsMap = useCurrentScreenSlotsMap();
54
66
 
55
67
  return useAnimatedStyle(() => {
56
68
  const baseStyle = slotId ? slotsMap.get()[slotId]?.style : undefined;
@@ -66,7 +78,7 @@ export const useSlotStackingStyles = (slotId: string | undefined) => {
66
78
  };
67
79
 
68
80
  export const useSlotLayoutStyles = (slotId: string | undefined) => {
69
- const { slotsMap } = useScreenSlots();
81
+ const slotsMap = useCurrentScreenSlotsMap();
70
82
 
71
83
  return useAnimatedStyle(() => {
72
84
  const baseStyle = slotId ? slotsMap.get()[slotId]?.style : undefined;
@@ -103,7 +115,7 @@ export const useSlotLayoutStyles = (slotId: string | undefined) => {
103
115
  };
104
116
 
105
117
  export const useSlotProps = (slotId: string | undefined) => {
106
- const { slotsMap } = useScreenSlots();
118
+ const slotsMap = useCurrentScreenSlotsMap();
107
119
 
108
120
  return useAnimatedProps(() => {
109
121
  return (slotId ? slotsMap.get()[slotId]?.props : undefined) ?? NO_PROPS;
@@ -40,6 +40,7 @@ import { stripInterpolatorOptions } from "../helpers/strip-interpolator-options"
40
40
  import {
41
41
  hasCloseTransitionFinished,
42
42
  isOpenTransitionBlocked,
43
+ isScreenInterpolatorReady,
43
44
  } from "../helpers/transition-visual-state";
44
45
  import { resolveInitialDestinationStyleGate } from "../helpers/visibility-gate";
45
46
 
@@ -144,17 +145,59 @@ export const useInterpolatedStylesMap = ({
144
145
  (s) => s.derivations.destinationPairKey,
145
146
  );
146
147
  const screenOptions = useScreenOptionsStore();
147
- const {
148
+ const screenInterpolatorProps = useScreenAnimationStore(
149
+ (store) => store.screenInterpolatorProps,
150
+ );
151
+ const screenInterpolatorPropsRevision = useScreenAnimationStore(
152
+ (store) => store.screenInterpolatorPropsRevision,
153
+ );
154
+ const selectedInterpolatorOptions = useScreenAnimationStore(
155
+ (store) => store.selectedInterpolatorOptions,
156
+ );
157
+ const nextInterpolator = useScreenAnimationStore(
158
+ (store) => store.nextInterpolator,
159
+ );
160
+ const currentInterpolator = useScreenAnimationStore(
161
+ (store) => store.currentInterpolator,
162
+ );
163
+ const ancestorScreenAnimationSources = useScreenAnimationStore(
164
+ (store) => store.ancestorScreenAnimationSources,
165
+ );
166
+ const descendantScreenAnimationSources = useScreenAnimationStore(
167
+ (store) => store.descendantScreenAnimationSources,
168
+ );
169
+ const transition = useBuildTransitionAccessor({
148
170
  screenInterpolatorProps,
149
171
  screenInterpolatorPropsRevision,
150
- selectedInterpolatorOptions,
151
- nextInterpolator,
152
- currentInterpolator,
153
172
  ancestorScreenAnimationSources,
154
173
  descendantScreenAnimationSources,
155
- } = useScreenAnimationStore();
156
- const transition = useBuildTransitionAccessor();
157
- const nextInterpolatorReady = useSharedValue(0);
174
+ });
175
+ const hasCurrentInterpolator = !!currentInterpolator;
176
+ const { closing: currentClosing, entering: currentEntering } =
177
+ AnimationStore.getBag(currentScreenKey);
178
+ const {
179
+ animationProgress: currentAnimationProgress,
180
+ pendingLifecycleRequestKind: currentPendingLifecycleRequestKind,
181
+ pendingLifecycleStartBlockCount: currentPendingLifecycleStartBlockCount,
182
+ } = SystemStore.getBag(currentScreenKey);
183
+ const interpolatorReady = useDerivedValue<number>(() => {
184
+ "worklet";
185
+ const isPendingOpen =
186
+ currentPendingLifecycleRequestKind.get() ===
187
+ LifecycleTransitionRequestKind.Open;
188
+ const opening = isPendingOpen || !!currentEntering.get();
189
+
190
+ return isScreenInterpolatorReady({
191
+ hasInterpolator: hasCurrentInterpolator,
192
+ opening,
193
+ closing: currentClosing.get(),
194
+ pendingLifecycleStartBlockCount:
195
+ currentPendingLifecycleStartBlockCount.get(),
196
+ animationProgress: currentAnimationProgress.get(),
197
+ })
198
+ ? 1
199
+ : 0;
200
+ });
158
201
 
159
202
  // In some cases, a user may want to use external shared values to drive animations in the interpoaltor.
160
203
  // We can now support this by collecting those shared values and reading them here to trigger an update.
@@ -249,10 +292,6 @@ export const useInterpolatedStylesMap = ({
249
292
  !nextInterpolator ||
250
293
  isOpeningBlocked ||
251
294
  hasCloseFinished;
252
- const nextReady = currentOwnsInterpolator ? 0 : 1;
253
-
254
- nextInterpolatorReady.set(nextReady);
255
-
256
295
  const interpolatorOptionsOwner = currentOwnsInterpolator
257
296
  ? "current"
258
297
  : "next";
@@ -328,7 +367,7 @@ export const useInterpolatedStylesMap = ({
328
367
  });
329
368
 
330
369
  return {
370
+ interpolatorReady,
331
371
  localStylesMaps,
332
- nextInterpolatorReady,
333
372
  };
334
373
  };
@@ -1,4 +1,4 @@
1
- import { type ReactNode, useLayoutEffect, useMemo } from "react";
1
+ import { type ReactNode, useMemo } from "react";
2
2
  import { StyleSheet } from "react-native";
3
3
  import Animated, { type SharedValue } from "react-native-reanimated";
4
4
  import type {
@@ -8,22 +8,16 @@ import type {
8
8
  import type { NormalizedTransitionInterpolatedStyle } from "../../../types/animation.types";
9
9
  import createProvider from "../../../utils/create-provider";
10
10
  import { useDescriptorsStore } from "../descriptors";
11
- import { FloatingOverlayLayer } from "./components/floating-overlay-layer";
12
- import type { LocalStyleLayers } from "./helpers/resolve-slot-styles";
13
11
  import { useInterpolatedStylesMap } from "./hooks/use-interpolated-style-maps";
14
12
  import { useMaybeBlockVisibility } from "./hooks/use-maybe-block-visibility";
15
13
  import { useResolvedStylesMap } from "./hooks/use-resolved-slot-style-map";
16
- import {
17
- registerScreenSlots,
18
- unregisterScreenSlots,
19
- } from "./stores/slot-references.store";
20
14
 
21
15
  type Props = {
22
16
  children: ReactNode;
23
- isFloatingOverlay?: boolean;
24
17
  };
25
18
 
26
19
  export type ScreenSlotName =
20
+ | "overlay"
27
21
  | "content"
28
22
  | "backdrop"
29
23
  | "surface"
@@ -31,8 +25,7 @@ export type ScreenSlotName =
31
25
  | typeof NAVIGATION_MASK_ELEMENT_STYLE_ID;
32
26
 
33
27
  export type ScreenSlotContextValue = {
34
- localStylesMaps: SharedValue<LocalStyleLayers>;
35
- nextInterpolatorReady: SharedValue<number>;
28
+ interpolatorReady: SharedValue<number>;
36
29
  slotsMap: SharedValue<NormalizedTransitionInterpolatedStyle>;
37
30
  visibilityBlocked: SharedValue<boolean>;
38
31
  };
@@ -40,69 +33,52 @@ export type ScreenSlotContextValue = {
40
33
  export const { ScreenSlotProvider, useScreenSlotStore: useScreenSlots } =
41
34
  createProvider("ScreenSlot", {
42
35
  guarded: true,
43
- })<Props, ScreenSlotContextValue>(
44
- ({ children, isFloatingOverlay }, { useParentStore }) => {
45
- const parentContext = useParentStore();
46
- const currentScreenKey = useDescriptorsStore(
47
- (s) => s.derivations.currentScreenKey,
48
- );
36
+ global: true,
37
+ })<Props, ScreenSlotContextValue>(({ children }, { useParentStore }) => {
38
+ const ancestorStylesMap = useParentStore(
39
+ (parentContext) => parentContext?.slotsMap,
40
+ );
41
+ const currentScreenKey = useDescriptorsStore(
42
+ (store) => store.derivations.currentScreenKey,
43
+ );
44
+ const { animatedStyle, animatedProps, shouldBlockVisibility } =
45
+ useMaybeBlockVisibility();
49
46
 
50
- const { animatedStyle, animatedProps, shouldBlockVisibility } =
51
- useMaybeBlockVisibility(isFloatingOverlay);
47
+ const { interpolatorReady, localStylesMaps } = useInterpolatedStylesMap({
48
+ enabled: true,
49
+ visibilityBlocked: shouldBlockVisibility,
50
+ });
52
51
 
53
- const { localStylesMaps, nextInterpolatorReady } =
54
- useInterpolatedStylesMap({
55
- enabled: !isFloatingOverlay,
56
- visibilityBlocked: shouldBlockVisibility,
57
- });
52
+ const slotsMap = useResolvedStylesMap({
53
+ localStylesMaps,
54
+ ancestorStylesMap,
55
+ });
56
+ const value = useMemo(
57
+ () => ({
58
+ interpolatorReady,
59
+ slotsMap,
60
+ visibilityBlocked: shouldBlockVisibility,
61
+ }),
62
+ [interpolatorReady, shouldBlockVisibility, slotsMap],
63
+ );
64
+ const content = useMemo(
65
+ () => (
66
+ <Animated.View
67
+ style={[styles.container, animatedStyle]}
68
+ animatedProps={animatedProps}
69
+ >
70
+ {children}
71
+ </Animated.View>
72
+ ),
73
+ [children, animatedStyle, animatedProps],
74
+ );
58
75
 
59
- const slotsMap = useResolvedStylesMap({
60
- localStylesMaps,
61
- ancestorStylesMap: parentContext?.slotsMap,
62
- });
63
- const value = useMemo(
64
- () => ({
65
- localStylesMaps,
66
- nextInterpolatorReady,
67
- slotsMap,
68
- visibilityBlocked: shouldBlockVisibility,
69
- }),
70
- [
71
- localStylesMaps,
72
- nextInterpolatorReady,
73
- shouldBlockVisibility,
74
- slotsMap,
75
- ],
76
- );
77
-
78
- useLayoutEffect(() => {
79
- registerScreenSlots(currentScreenKey, value);
80
-
81
- return () => {
82
- unregisterScreenSlots(currentScreenKey, value);
83
- };
84
- }, [currentScreenKey, value]);
85
-
86
- const content = useMemo(
87
- () => (
88
- <FloatingOverlayLayer enabled={isFloatingOverlay}>
89
- <Animated.View
90
- style={[styles.container, animatedStyle]}
91
- animatedProps={animatedProps}
92
- >
93
- {children}
94
- </Animated.View>
95
- </FloatingOverlayLayer>
96
- ),
97
- [children, animatedStyle, isFloatingOverlay, animatedProps],
98
- );
99
-
100
- return {
101
- value,
102
- children: content,
103
- };
104
- },
105
- );
76
+ return {
77
+ key: currentScreenKey,
78
+ value,
79
+ children: content,
80
+ };
81
+ });
106
82
 
107
83
  const styles = StyleSheet.create({
108
84
  container: { flex: 1 },
@@ -0,0 +1,22 @@
1
+ import type { BaseStackRoute } from "../../../../types/stack.types";
2
+
3
+ export function resolvePresentedIndex(
4
+ routes: BaseStackRoute[],
5
+ focusedRouteKey: string | undefined,
6
+ closingRouteKeys: ReadonlySet<string>,
7
+ ): number {
8
+ const focusedIndex = focusedRouteKey
9
+ ? routes.findIndex((route) => route.key === focusedRouteKey)
10
+ : routes.length - 1;
11
+ const resolvedFocusedIndex =
12
+ focusedIndex >= 0 ? focusedIndex : routes.length - 1;
13
+
14
+ for (let index = resolvedFocusedIndex; index >= 0; index -= 1) {
15
+ const route = routes[index];
16
+ if (route && !closingRouteKeys.has(route.key)) {
17
+ return index;
18
+ }
19
+ }
20
+
21
+ return resolvedFocusedIndex;
22
+ }
@@ -15,6 +15,7 @@ import type {
15
15
  } from "../../types/stack.types";
16
16
  import createProvider from "../../utils/create-provider";
17
17
  import { useBlankStackState } from "./blank-stack-state";
18
+ import { resolvePresentedIndex } from "./blank-stack-state/helpers/resolve-presented-index";
18
19
  import { useStackCoreStore } from "./core.provider";
19
20
 
20
21
  type InternalBlankStackProviderProps = BlankStackProviderProps<
@@ -58,7 +59,11 @@ function BlankStackProvider({
58
59
  state: stackState,
59
60
  });
60
61
  const navigatorKey = stackState.key;
61
- const focusedIndex = stackState.index;
62
+ const focusedIndex = resolvePresentedIndex(
63
+ state.routes,
64
+ state.focusedRouteKey,
65
+ state.closingRouteKeys,
66
+ );
62
67
  const scenesByKey = useMemo(
63
68
  () => createScenesByKey(state.scenes),
64
69
  [state.scenes],
@@ -384,6 +384,14 @@ export type TransitionInterpolatedStyle = {
384
384
  * This reserved key is stripped before style slot normalization.
385
385
  */
386
386
  options?: TransitionInterpolatorOptions;
387
+ /**
388
+ * Animated style and props for the route-owned floating overlay.
389
+ *
390
+ * Visible overlays form their own adjacency chain. A route that returns this
391
+ * slot controls the previous visible overlay and, when it owns an overlay,
392
+ * its entering overlay.
393
+ */
394
+ overlay?: TransitionSlotStyle;
387
395
  /** Animated style and props for the main screen content view. */
388
396
  content?: TransitionSlotStyle;
389
397
  /** Animated style and props for the backdrop layer between screens. */
@@ -51,7 +51,7 @@ export type {
51
51
  ScrollMetadataState,
52
52
  SideActivation,
53
53
  } from "./gesture.types";
54
- export type { OverlayProps } from "./overlay.types";
54
+ export type { OverlayComponent, OverlayProps } from "./overlay.types";
55
55
  export type {
56
56
  GestureTracking,
57
57
  InactiveBehavior,
@@ -1,28 +1,44 @@
1
- import type { Route } from "@react-navigation/native";
1
+ import type {
2
+ ParamListBase,
3
+ ParamListRoute,
4
+ RouteProp,
5
+ } from "@react-navigation/native";
6
+ import type { ReactNode } from "react";
2
7
  import type { DerivedValue } from "react-native-reanimated";
3
8
  import type { ScreenTransitionConfig } from "./screen.types";
4
9
 
5
10
  /**
6
- * Props passed to overlay components.
7
- * Generic over the navigation type since different stacks have different navigation props.
11
+ * Overlay state without the animated progress value.
8
12
  */
13
+ export type OverlayScreenState<
14
+ TNavigation = unknown,
15
+ TParamList extends ParamListBase = ParamListBase,
16
+ TOwnerRouteName extends keyof TParamList = keyof TParamList,
17
+ > = Omit<OverlayProps<TNavigation, TParamList, TOwnerRouteName>, "progress"> & {
18
+ snapTo: (index: number) => void;
19
+ };
20
+
9
21
  /**
10
- * Overlay screen state passed to overlay host for rendering.
11
- * Generic over navigation type — defaults to `unknown` for flexibility.
22
+ * Props passed to a floating overlay component.
23
+ *
24
+ * `route` and `index` identify the screen that owns the overlay. Focused
25
+ * values may describe a later screen while that overlay remains visible.
12
26
  */
13
- export type OverlayScreenState<TNavigation = unknown> = Omit<
14
- OverlayProps<TNavigation>,
15
- "progress"
16
- > & {
27
+ export type OverlayProps<
28
+ TNavigation = unknown,
29
+ TParamList extends ParamListBase = ParamListBase,
30
+ TOwnerRouteName extends keyof TParamList = keyof TParamList,
31
+ > = {
32
+ /** Route that declared this overlay. */
33
+ route: RouteProp<TParamList, TOwnerRouteName>;
34
+
35
+ /** Index of the route that declared this overlay. */
17
36
  index: number;
18
- snapTo: (index: number) => void;
19
- };
20
37
 
21
- export type OverlayProps<TNavigation = unknown> = {
22
38
  /**
23
39
  * Route of the currently focused screen in the stack.
24
40
  */
25
- focusedRoute: Route<string>;
41
+ focusedRoute: ParamListRoute<TParamList>;
26
42
 
27
43
  /**
28
44
  * Index of the focused route in the stack.
@@ -32,7 +48,7 @@ export type OverlayProps<TNavigation = unknown> = {
32
48
  /**
33
49
  * All routes currently in the stack.
34
50
  */
35
- routes: Route<string>[];
51
+ routes: ParamListRoute<TParamList>[];
36
52
 
37
53
  /**
38
54
  * Custom metadata from the focused screen's options.
@@ -55,3 +71,14 @@ export type OverlayProps<TNavigation = unknown> = {
55
71
  */
56
72
  progress: DerivedValue<number>;
57
73
  };
74
+
75
+ /**
76
+ * Component rendered for a floating screen overlay.
77
+ *
78
+ * The callback is bivariant because React Navigation stores overlay components
79
+ * in navigator-wide screen options while applications annotate them for one
80
+ * specific route.
81
+ */
82
+ export type OverlayComponent = {
83
+ bivarianceHack(props: OverlayProps): ReactNode;
84
+ }["bivarianceHack"];
@@ -11,7 +11,7 @@ import type {
11
11
  GestureProgressMode,
12
12
  ScrollMetadataState,
13
13
  } from "./gesture.types";
14
- import type { OverlayProps } from "./overlay.types";
14
+ import type { OverlayComponent } from "./overlay.types";
15
15
 
16
16
  export type Layout = {
17
17
  width: number;
@@ -336,7 +336,7 @@ export type ScreenTransitionConfig = {
336
336
  /**
337
337
  * Function that returns a React Element to display as an overlay.
338
338
  */
339
- overlay?: (props: OverlayProps) => React.ReactNode;
339
+ overlay?: OverlayComponent;
340
340
 
341
341
  /**
342
342
  * Whether to show the overlay. The overlay is shown by default when `overlay` is provided.