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
@@ -54,13 +54,10 @@ const StackViewContent = memo(function StackViewContent() {
54
54
  const routeKeys = useBlankStackStore(
55
55
  (store) => store?.routeKeys ?? EMPTY_ROUTE_KEYS,
56
56
  );
57
- const shouldShowFloatOverlay = useBlankStackStore(
58
- (store) => store?.shouldShowFloatOverlay ?? false,
59
- );
60
57
 
61
58
  return (
62
59
  <Fragment>
63
- {shouldShowFloatOverlay ? <Overlay.Float /> : null}
60
+ <Overlay.Float />
64
61
 
65
62
  {routeKeys.map((routeKey) => (
66
63
  <ComponentSceneRow key={routeKey} routeKey={routeKey} />
@@ -74,8 +74,14 @@ type ComponentStackNavigationConfig = {};
74
74
  *
75
75
  * @deprecated Component stack is deprecated. Use blank stack instead.
76
76
  */
77
- export type ComponentStackOverlayProps = OverlayProps<
78
- ComponentStackNavigationProp<ParamListBase>
77
+ export type ComponentStackOverlayProps<
78
+ ParamList extends ParamListBase = ParamListBase,
79
+ RouteName extends keyof ParamList = keyof ParamList,
80
+ NavigatorID extends string | undefined = undefined,
81
+ > = OverlayProps<
82
+ ComponentStackNavigationProp<ParamList, RouteName, NavigatorID>,
83
+ ParamList,
84
+ RouteName
79
85
  >;
80
86
 
81
87
  type ComponentStackScreenTransitionConfig = ScreenTransitionConfig & {
@@ -154,8 +154,14 @@ export type NativeStackHeaderLeftProps = NativeStackHeaderRightProps & {
154
154
  * Props passed to overlay components in native-stack.
155
155
  * Uses the shared OverlayProps type with native-stack's navigation type.
156
156
  */
157
- export type NativeStackOverlayProps = OverlayProps<
158
- NativeStackNavigationProp<ParamListBase>
157
+ export type NativeStackOverlayProps<
158
+ ParamList extends ParamListBase = ParamListBase,
159
+ RouteName extends keyof ParamList = keyof ParamList,
160
+ NavigatorID extends string | undefined = undefined,
161
+ > = OverlayProps<
162
+ NativeStackNavigationProp<ParamList, RouteName, NavigatorID>,
163
+ ParamList,
164
+ RouteName
159
165
  >;
160
166
 
161
167
  /**
@@ -482,14 +482,8 @@ const SceneView = ({
482
482
  };
483
483
 
484
484
  function NativeStackViewContent() {
485
- const {
486
- state,
487
- navigation,
488
- descriptors,
489
- scenes,
490
- focusedIndex,
491
- shouldShowFloatOverlay,
492
- } = useDirectStackStore();
485
+ const { state, navigation, descriptors, scenes, focusedIndex } =
486
+ useDirectStackStore();
493
487
  const { setNextDismissedKey } = useDismissedRouteError(state);
494
488
 
495
489
  useInvalidPreventRemoveError(descriptors);
@@ -498,7 +492,7 @@ function NativeStackViewContent() {
498
492
 
499
493
  return (
500
494
  <>
501
- {shouldShowFloatOverlay ? <Overlay.Float /> : null}
495
+ <Overlay.Float />
502
496
  <ScreenStack style={styles.container}>
503
497
  {scenes.map((scene, index) => {
504
498
  const { route, descriptor, isPreloaded } = scene;
@@ -182,7 +182,7 @@ function ScreenTransitionsStackContent({
182
182
  return (
183
183
  <ScreenTransitionsAdapterProvider value={adapterContextValue}>
184
184
  <StackProvider value={stackContextValue}>
185
- {transitionState.shouldShowFloatOverlay ? <Overlay.Float /> : null}
185
+ <Overlay.Float />
186
186
  {children}
187
187
  </StackProvider>
188
188
  </ScreenTransitionsAdapterProvider>
@@ -24,12 +24,17 @@ interface UseBoundaryContentPortalAttachmentParams {
24
24
  export const useBoundaryContentPortalAttachment = ({
25
25
  boundaryId,
26
26
  }: UseBoundaryContentPortalAttachmentParams) => {
27
- const { nextInterpolatorReady, slotsMap } = useScreenSlots();
27
+ const { slotsMap } = useScreenSlots();
28
28
 
29
29
  const currentScreenKey = useDescriptorsStore(
30
30
  (s) => s.derivations.currentScreenKey,
31
31
  );
32
+ const nextScreenKey = useDescriptorsStore((s) => s.derivations.nextScreenKey);
32
33
  const sourcePairKey = useDescriptorsStore((s) => s.derivations.sourcePairKey);
34
+ const destinationSlots = useScreenSlots(nextScreenKey ?? currentScreenKey);
35
+ const unavailableInterpolatorReady = useSharedValue(0);
36
+ const interpolatorReady =
37
+ destinationSlots?.interpolatorReady ?? unavailableInterpolatorReady;
33
38
 
34
39
  const activeReceiverScreenKey = useStack(resolveActiveHandoffReceiver);
35
40
  const previousReceiverScreenKey = useStack(resolvePreviousHandoffReceiver);
@@ -85,7 +90,7 @@ export const useBoundaryContentPortalAttachment = ({
85
90
  ? link.destination.screenKey
86
91
  : null;
87
92
 
88
- const interpolatorReady = nextInterpolatorReady.get();
93
+ const isInterpolatorReady = interpolatorReady.get();
89
94
  const attachedScreenKey = attachedReceiverScreenKey.get();
90
95
 
91
96
  const nextReceiverScreenKey = resolveHandoffAttachmentCandidate({
@@ -93,7 +98,7 @@ export const useBoundaryContentPortalAttachment = ({
93
98
  activeReceiverScreenKey,
94
99
  attachedReceiverScreenKey: attachedScreenKey,
95
100
  hasActiveCloseFinished,
96
- interpolatorReady: !!interpolatorReady,
101
+ interpolatorReady: !!isInterpolatorReady,
97
102
  pairChangedDuringClose,
98
103
  pairDestinationScreenKey: pairDestination,
99
104
  previousReceiverScreenKey,
@@ -110,7 +115,7 @@ export const useBoundaryContentPortalAttachment = ({
110
115
 
111
116
  const activatingPairDestination =
112
117
  !!pairDestination &&
113
- !!interpolatorReady &&
118
+ !!isInterpolatorReady &&
114
119
  nextReceiverScreenKey === pairDestination;
115
120
 
116
121
  const canActivateReceiver =
@@ -0,0 +1,29 @@
1
+ import { updateDerivations } from "../../../providers/screen/animation/helpers/derivations";
2
+ import type { ScreenInterpolatorFrame } from "../../../providers/screen/animation/helpers/pipeline";
3
+
4
+ export const createOverlayInterpolatorFrame = ({
5
+ overlayFrame,
6
+ driverFrame,
7
+ previousOverlayFrame,
8
+ }: {
9
+ overlayFrame: ScreenInterpolatorFrame;
10
+ driverFrame: ScreenInterpolatorFrame;
11
+ previousOverlayFrame?: ScreenInterpolatorFrame;
12
+ }): ScreenInterpolatorFrame => {
13
+ "worklet";
14
+ const current = overlayFrame.current;
15
+ const driverIsCurrent = driverFrame.current.route.key === current.route.key;
16
+ const frame: ScreenInterpolatorFrame = {
17
+ ...overlayFrame,
18
+ previous: previousOverlayFrame?.current,
19
+ current,
20
+ next: driverIsCurrent ? undefined : driverFrame.current,
21
+ layouts: current.layouts,
22
+ };
23
+
24
+ updateDerivations(frame);
25
+ frame.stackProgress = frame.progress;
26
+ frame.logicallySettled = frame.active.settled;
27
+
28
+ return frame;
29
+ };
@@ -1,39 +1,81 @@
1
1
  import type { StackScene } from "../../../hooks/navigation/use-stack";
2
2
  import { isOverlayVisible } from "../../../utils/overlay/visibility";
3
3
 
4
+ export type FloatOverlayActivity = "active" | "inert" | "inactive" | "closing";
5
+
6
+ export type FloatOverlayEntry = {
7
+ scene: StackScene;
8
+ overlayIndex: number;
9
+ activity: FloatOverlayActivity;
10
+ };
11
+
12
+ export type FloatOverlayTransitionEntry = FloatOverlayEntry & {
13
+ driverScene: StackScene;
14
+ };
15
+
16
+ type OverlayCandidate = Omit<FloatOverlayEntry, "activity">;
17
+
18
+ const resolveOverlayActivity = (
19
+ scene: StackScene,
20
+ distanceFromTop: number,
21
+ ): FloatOverlayActivity => {
22
+ if (distanceFromTop === 0 && scene.activity === "closing") {
23
+ return "closing";
24
+ }
25
+
26
+ if (distanceFromTop === 0) {
27
+ return "active";
28
+ }
29
+
30
+ if (distanceFromTop === 1) {
31
+ return "inert";
32
+ }
33
+
34
+ return "inactive";
35
+ };
36
+
4
37
  /**
5
- * Find the active float overlay from scenes.
6
- * Scans from the top of the stack downward to find the first screen
7
- * with a visible overlay.
38
+ * Finds every visible floating-overlay checkpoint in stack order.
39
+ *
40
+ * The newest checkpoint owns the active overlay. Its immediate predecessor
41
+ * remains visible and inert; all older checkpoints are retained but inactive.
42
+ * This mirrors the screen activity window without making plain screens create
43
+ * a new overlay checkpoint.
8
44
  */
9
- export function getActiveFloatOverlay(
45
+ export function getFloatOverlayStack(
10
46
  scenes: StackScene[],
11
- index: number,
12
47
  transitionsAlwaysOn: boolean,
13
- ): { scene: StackScene; overlayIndex: number } | null {
14
- if (scenes.length === 0) {
15
- return null;
16
- }
17
-
18
- // When navigating back, closing scenes are kept at the top of the local stack
19
- // while the focused index already points to the destination screen. We need to
20
- // start scanning from the actual top of the stack so the overlay can animate
21
- // out together with its closing screen instead of disappearing immediately.
22
- const startIndex = Math.max(index, scenes.length - 1);
48
+ ): FloatOverlayEntry[] {
49
+ const candidates: OverlayCandidate[] = [];
23
50
 
24
- for (let i = startIndex; i >= 0; i--) {
25
- const scene = scenes[i];
51
+ for (let index = 0; index < scenes.length; index += 1) {
52
+ const scene = scenes[index];
26
53
  const options = scene?.descriptor?.options;
27
54
 
28
- // Skip screens without enableTransitions (native-stack only)
29
55
  if (!transitionsAlwaysOn && !options?.enableTransitions) {
30
56
  continue;
31
57
  }
32
58
 
33
59
  if (isOverlayVisible(options)) {
34
- return { scene, overlayIndex: i };
60
+ candidates.push({ scene, overlayIndex: index });
35
61
  }
36
62
  }
37
63
 
38
- return null;
64
+ const topIndex = candidates.length - 1;
65
+ return candidates.map((candidate, index) => ({
66
+ ...candidate,
67
+ activity: resolveOverlayActivity(candidate.scene, topIndex - index),
68
+ }));
69
+ }
70
+
71
+ export function getFloatOverlayTransitions(
72
+ overlayStack: FloatOverlayEntry[],
73
+ scenes: StackScene[],
74
+ ): FloatOverlayTransitionEntry[] {
75
+ const topScene = scenes[scenes.length - 1];
76
+
77
+ return overlayStack.map((entry, index) => ({
78
+ ...entry,
79
+ driverScene: overlayStack[index + 1]?.scene ?? topScene ?? entry.scene,
80
+ }));
39
81
  }
@@ -0,0 +1,38 @@
1
+ import type { ScreenAnimationContextValue } from "../../../providers/screen/animation/animation.provider";
2
+ import type { ScreenSlotContextValue } from "../../../providers/screen/styles/slot.provider";
3
+ import type { FloatOverlayEntry } from "./get-active-overlay";
4
+
5
+ export type ReadyOverlayResources = {
6
+ overlayAnimationStore: ScreenAnimationContextValue;
7
+ driverScene: FloatOverlayEntry["scene"];
8
+ driverAnimationStore: ScreenAnimationContextValue;
9
+ driverSlots: ScreenSlotContextValue;
10
+ };
11
+
12
+ export function retainReadyOverlayResources(
13
+ previous: ReadyOverlayResources | null,
14
+ overlayAnimationStore: ScreenAnimationContextValue | null,
15
+ driverScene: FloatOverlayEntry["scene"],
16
+ driverAnimationStore: ScreenAnimationContextValue | null,
17
+ driverSlots: ScreenSlotContextValue | null,
18
+ ): ReadyOverlayResources | null {
19
+ if (!overlayAnimationStore || !driverAnimationStore || !driverSlots) {
20
+ return previous;
21
+ }
22
+
23
+ if (
24
+ previous?.overlayAnimationStore === overlayAnimationStore &&
25
+ previous.driverScene === driverScene &&
26
+ previous.driverAnimationStore === driverAnimationStore &&
27
+ previous.driverSlots === driverSlots
28
+ ) {
29
+ return previous;
30
+ }
31
+
32
+ return {
33
+ overlayAnimationStore,
34
+ driverScene,
35
+ driverAnimationStore,
36
+ driverSlots,
37
+ };
38
+ }
@@ -0,0 +1,48 @@
1
+ import type { ScreenInterpolatorFrame } from "../../../providers/screen/animation/helpers/pipeline";
2
+ import { createInterpolatorScope } from "../../../providers/screen/styles/helpers/create-interpolator-scope";
3
+ import { normalizeSlots } from "../../../providers/screen/styles/helpers/normalize-slots";
4
+ import { selectInterpolatorFrame } from "../../../providers/screen/styles/helpers/select-interpolator-frame";
5
+ import type {
6
+ NormalizedTransitionSlotStyle,
7
+ ScreenStyleInterpolator,
8
+ ScreenTransitionAccessor,
9
+ } from "../../../types/animation.types";
10
+ import { logger } from "../../../utils/logger";
11
+
12
+ export const runOverlaySlotInterpolator = ({
13
+ frame,
14
+ interpolator,
15
+ transition,
16
+ }: {
17
+ frame: ScreenInterpolatorFrame;
18
+ interpolator: ScreenStyleInterpolator | undefined;
19
+ transition: ScreenTransitionAccessor;
20
+ }): NormalizedTransitionSlotStyle | undefined => {
21
+ "worklet";
22
+
23
+ if (!interpolator) {
24
+ return undefined;
25
+ }
26
+
27
+ try {
28
+ const raw = interpolator(
29
+ createInterpolatorScope({
30
+ frame,
31
+ selectedFrame: selectInterpolatorFrame(frame, false),
32
+ transition,
33
+ }),
34
+ );
35
+
36
+ if (!raw?.overlay) {
37
+ return undefined;
38
+ }
39
+
40
+ return normalizeSlots({ overlay: raw.overlay }).overlay;
41
+ } catch (_) {
42
+ if (__DEV__) {
43
+ logger.warn("screenStyleInterpolator must be a worklet");
44
+ }
45
+
46
+ return undefined;
47
+ }
48
+ };
@@ -0,0 +1,103 @@
1
+ import { useMemo } from "react";
2
+ import { useWindowDimensions } from "react-native";
3
+ import {
4
+ type SharedValue,
5
+ useAnimatedProps,
6
+ useAnimatedStyle,
7
+ useDerivedValue,
8
+ } from "react-native-reanimated";
9
+ import { NO_PROPS, NO_STYLES } from "../../../constants";
10
+ import type { ScreenAnimationContextValue } from "../../../providers/screen/animation/animation.provider";
11
+ import { useBuildTransitionAccessor } from "../../../providers/screen/animation/helpers/accessors/use-build-transition-accessor";
12
+ import { collectInterpolatorSharedValues } from "../../../providers/screen/styles/helpers/collect-interpolator-shared-values";
13
+ import type {
14
+ NormalizedTransitionSlotStyle,
15
+ ScreenStyleInterpolator,
16
+ } from "../../../types/animation.types";
17
+ import { getVisibilityBlockOffset } from "../../../utils/visibility-block-offset";
18
+ import { createOverlayInterpolatorFrame } from "../helpers/create-overlay-interpolator-frame";
19
+ import { runOverlaySlotInterpolator } from "../helpers/run-overlay-slot-interpolator";
20
+
21
+ export const useOverlaySlot = ({
22
+ overlayAnimationStore,
23
+ driverAnimationStore,
24
+ previousOverlayAnimationStore,
25
+ driverInterpolator,
26
+ interpolatorReady,
27
+ isIncoming,
28
+ }: {
29
+ overlayAnimationStore: ScreenAnimationContextValue;
30
+ driverAnimationStore: ScreenAnimationContextValue;
31
+ previousOverlayAnimationStore?: ScreenAnimationContextValue;
32
+ driverInterpolator: ScreenStyleInterpolator | undefined;
33
+ interpolatorReady: SharedValue<number>;
34
+ isIncoming: boolean;
35
+ }) => {
36
+ const { height } = useWindowDimensions();
37
+ const transition = useBuildTransitionAccessor(driverAnimationStore);
38
+
39
+ const interpolatorSharedValues = useMemo(
40
+ () => collectInterpolatorSharedValues([driverInterpolator]),
41
+ [driverInterpolator],
42
+ );
43
+
44
+ const overlaySlot = useDerivedValue<
45
+ NormalizedTransitionSlotStyle | undefined
46
+ >(() => {
47
+ "worklet";
48
+ overlayAnimationStore.screenInterpolatorPropsRevision.get();
49
+ driverAnimationStore.screenInterpolatorPropsRevision.get();
50
+ previousOverlayAnimationStore?.screenInterpolatorPropsRevision.get();
51
+
52
+ for (let index = 0; index < interpolatorSharedValues.length; index++) {
53
+ interpolatorSharedValues[index]?.get();
54
+ }
55
+
56
+ const frame = createOverlayInterpolatorFrame({
57
+ overlayFrame: overlayAnimationStore.screenInterpolatorProps.get(),
58
+ driverFrame: driverAnimationStore.screenInterpolatorProps.get(),
59
+ previousOverlayFrame:
60
+ previousOverlayAnimationStore?.screenInterpolatorProps.get(),
61
+ });
62
+
63
+ return runOverlaySlotInterpolator({
64
+ frame,
65
+ interpolator: driverInterpolator,
66
+ transition,
67
+ });
68
+ });
69
+
70
+ const animatedStyle = useAnimatedStyle(() => {
71
+ "worklet";
72
+ const slot = overlaySlot.get();
73
+ if (!slot) {
74
+ return NO_STYLES;
75
+ }
76
+
77
+ if (isIncoming && !interpolatorReady.get()) {
78
+ return {
79
+ transform: [{ translateY: getVisibilityBlockOffset(height) }],
80
+ };
81
+ }
82
+
83
+ return slot.style ?? NO_STYLES;
84
+ });
85
+
86
+ const animatedProps = useAnimatedProps(() => {
87
+ "worklet";
88
+ const slotProps = overlaySlot.get()?.props;
89
+ if (!slotProps) {
90
+ return NO_PROPS;
91
+ }
92
+
93
+ const {
94
+ pointerEvents: _pointerEvents,
95
+ teleport: _teleport,
96
+ ...props
97
+ } = slotProps;
98
+
99
+ return props;
100
+ });
101
+
102
+ return { animatedProps, animatedStyle };
103
+ };
@@ -1,14 +1,9 @@
1
- import { useMemo } from "react";
2
- import { snapDescriptorToIndex } from "../../../animation/snap-to";
3
1
  import { useStack } from "../../../hooks/navigation/use-stack";
4
- import { ScreenAnimationProvider } from "../../../providers/screen/animation";
5
- import type { BaseDescriptor } from "../../../providers/screen/descriptors";
6
- import { DescriptorsProvider } from "../../../providers/screen/descriptors";
7
- import { ScreenOptionsProvider } from "../../../providers/screen/options";
8
- import { ScreenSlotProvider } from "../../../providers/screen/styles";
9
- import type { OverlayScreenState } from "../../../types/overlay.types";
10
2
 
11
- import { getActiveFloatOverlay } from "../helpers/get-active-overlay";
3
+ import {
4
+ getFloatOverlayStack,
5
+ getFloatOverlayTransitions,
6
+ } from "../helpers/get-active-overlay";
12
7
  import { OverlayHost } from "./overlay-host";
13
8
 
14
9
  /**
@@ -16,65 +11,28 @@ import { OverlayHost } from "./overlay-host";
16
11
  * Gets routes and descriptors from stack context.
17
12
  */
18
13
  export function FloatOverlay() {
19
- const { scenes, focusedIndex, flags, routes, routeKeys } = useStack();
14
+ const { scenes, flags } = useStack();
20
15
 
21
- const activeOverlay = useMemo(
22
- () =>
23
- getActiveFloatOverlay(scenes, focusedIndex, flags.TRANSITIONS_ALWAYS_ON),
24
- [scenes, focusedIndex, flags.TRANSITIONS_ALWAYS_ON],
16
+ const overlayStack = getFloatOverlayStack(
17
+ scenes,
18
+ flags.TRANSITIONS_ALWAYS_ON,
25
19
  );
26
-
27
- const overlayData = useMemo(() => {
28
- if (!activeOverlay) return null;
29
-
30
- const { scene, overlayIndex } = activeOverlay;
31
- const previous = scenes[overlayIndex - 1]?.descriptor;
32
- const current = scene.descriptor;
33
- const next = scenes[overlayIndex + 1]?.descriptor;
34
- const focusedScene = scenes[focusedIndex] ?? scenes[scenes.length - 1];
35
- const focusedDescriptor = focusedScene?.descriptor;
36
-
37
- const overlayScreenState: OverlayScreenState<BaseDescriptor["navigation"]> =
38
- {
39
- index: routeKeys.indexOf(current.route.key),
40
- options: focusedDescriptor?.options ?? {},
41
- routes,
42
- focusedRoute: focusedScene?.route ?? current.route,
43
- focusedIndex,
44
- meta: focusedDescriptor?.options?.meta,
45
- navigation: current.navigation,
46
- snapTo: (index: number) => {
47
- snapDescriptorToIndex(current, index);
48
- },
49
- };
50
-
51
- return {
52
- scene,
53
- previous,
54
- current,
55
- next,
56
- overlayScreenState,
57
- };
58
- }, [activeOverlay, scenes, focusedIndex, routeKeys, routes]);
59
-
60
- if (!overlayData) {
20
+ if (overlayStack.length === 0) {
61
21
  return null;
62
22
  }
63
23
 
64
- const { scene, previous, current, next, overlayScreenState } = overlayData;
65
-
66
- return (
67
- <DescriptorsProvider current={current} previous={previous} next={next}>
68
- <ScreenOptionsProvider>
69
- <ScreenAnimationProvider>
70
- <ScreenSlotProvider isFloatingOverlay>
71
- <OverlayHost
72
- scene={scene}
73
- overlayScreenState={overlayScreenState}
74
- />
75
- </ScreenSlotProvider>
76
- </ScreenAnimationProvider>
77
- </ScreenOptionsProvider>
78
- </DescriptorsProvider>
24
+ const overlayTransitions = getFloatOverlayTransitions(overlayStack, scenes);
25
+
26
+ return overlayTransitions.map(
27
+ ({ scene, activity, driverScene }, layerIndex) => (
28
+ <OverlayHost
29
+ key={scene.route.key}
30
+ scene={scene}
31
+ driverScene={driverScene}
32
+ previousOverlayScene={overlayTransitions[layerIndex - 1]?.scene}
33
+ activity={activity}
34
+ layerIndex={layerIndex}
35
+ />
36
+ ),
79
37
  );
80
38
  }