react-native-screen-transitions 3.6.0 → 3.7.0-alpha.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 (368) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/blank-stack/components/stack-view.js +35 -39
  3. package/lib/commonjs/blank-stack/components/stack-view.js.map +1 -1
  4. package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js +7 -14
  5. package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
  6. package/lib/commonjs/component-stack/components/stack-view.js +4 -11
  7. package/lib/commonjs/component-stack/components/stack-view.js.map +1 -1
  8. package/lib/commonjs/component-stack/navigators/create-component-stack-navigator.js +1 -1
  9. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +6 -0
  10. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  11. package/lib/commonjs/shared/adapters/with-screen-transitions/context.js +28 -0
  12. package/lib/commonjs/shared/adapters/with-screen-transitions/context.js.map +1 -0
  13. package/lib/commonjs/shared/adapters/with-screen-transitions/index.js +75 -0
  14. package/lib/commonjs/shared/adapters/with-screen-transitions/index.js.map +1 -0
  15. package/lib/commonjs/shared/adapters/with-screen-transitions/options.js +103 -0
  16. package/lib/commonjs/shared/adapters/with-screen-transitions/options.js.map +1 -0
  17. package/lib/commonjs/shared/adapters/with-screen-transitions/stack-layout.js +143 -0
  18. package/lib/commonjs/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -0
  19. package/lib/commonjs/shared/adapters/with-screen-transitions/types.js +6 -0
  20. package/lib/commonjs/shared/adapters/with-screen-transitions/types.js.map +1 -0
  21. package/lib/commonjs/shared/components/activity/helpers.js +9 -0
  22. package/lib/commonjs/shared/components/activity/helpers.js.map +1 -0
  23. package/lib/commonjs/shared/components/activity/index.js +20 -0
  24. package/lib/commonjs/shared/components/activity/index.js.map +1 -0
  25. package/lib/commonjs/shared/components/activity/variants/activity-container.js +29 -0
  26. package/lib/commonjs/shared/components/activity/variants/activity-container.js.map +1 -0
  27. package/lib/commonjs/shared/components/activity/variants/activity-screen.js +107 -0
  28. package/lib/commonjs/shared/components/activity/variants/activity-screen.js.map +1 -0
  29. package/lib/commonjs/shared/components/create-boundary-component/hooks/use-measurer.js +10 -4
  30. package/lib/commonjs/shared/components/create-boundary-component/hooks/use-measurer.js.map +1 -1
  31. package/lib/commonjs/shared/components/create-boundary-component/utils/measured-bounds.js +13 -1
  32. package/lib/commonjs/shared/components/create-boundary-component/utils/measured-bounds.js.map +1 -1
  33. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +8 -17
  34. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  35. package/lib/commonjs/shared/components/screen-lifecycle/index.js +1 -1
  36. package/lib/commonjs/shared/components/screen-lifecycle/index.js.map +1 -1
  37. package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js +10 -4
  38. package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  39. package/lib/commonjs/shared/hooks/navigation/use-stack.js +63 -6
  40. package/lib/commonjs/shared/hooks/navigation/use-stack.js.map +1 -1
  41. package/lib/commonjs/shared/index.js +8 -0
  42. package/lib/commonjs/shared/index.js.map +1 -1
  43. package/lib/commonjs/shared/providers/screen/descriptors/descriptors.provider.js +18 -29
  44. package/lib/commonjs/shared/providers/screen/descriptors/descriptors.provider.js.map +1 -1
  45. package/lib/commonjs/shared/providers/screen/descriptors/index.js +6 -0
  46. package/lib/commonjs/shared/providers/screen/descriptors/index.js.map +1 -1
  47. package/lib/commonjs/shared/providers/screen/gestures/ownership/resolve-ownership.js +2 -1
  48. package/lib/commonjs/shared/providers/screen/gestures/ownership/resolve-ownership.js.map +1 -1
  49. package/lib/commonjs/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js +1 -1
  50. package/lib/commonjs/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +1 -1
  51. package/lib/commonjs/shared/providers/screen/gestures/pan/pan-lifecycle.js +4 -1
  52. package/lib/commonjs/shared/providers/screen/gestures/pan/pan-lifecycle.js.map +1 -1
  53. package/lib/commonjs/shared/providers/screen/gestures/pan/use-pan-behavior.js +4 -3
  54. package/lib/commonjs/shared/providers/screen/gestures/pan/use-pan-behavior.js.map +1 -1
  55. package/lib/commonjs/shared/providers/screen/gestures/pinch/pinch-lifecycle.js +4 -1
  56. package/lib/commonjs/shared/providers/screen/gestures/pinch/pinch-lifecycle.js.map +1 -1
  57. package/lib/commonjs/shared/providers/screen/gestures/pinch/use-pinch-behavior.js +4 -3
  58. package/lib/commonjs/shared/providers/screen/gestures/pinch/use-pinch-behavior.js.map +1 -1
  59. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +16 -1
  60. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  61. package/lib/commonjs/shared/providers/stack/direct.provider.js +4 -3
  62. package/lib/commonjs/shared/providers/stack/direct.provider.js.map +1 -1
  63. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js +199 -0
  64. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js.map +1 -0
  65. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js +62 -0
  66. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js.map +1 -0
  67. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js +81 -0
  68. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js.map +1 -0
  69. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js +123 -0
  70. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js.map +1 -0
  71. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/types.js +6 -0
  72. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/types.js.map +1 -0
  73. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/index.js +24 -0
  74. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/index.js.map +1 -0
  75. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js +131 -0
  76. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js.map +1 -0
  77. package/lib/commonjs/shared/providers/stack/managed.provider.js +18 -29
  78. package/lib/commonjs/shared/providers/stack/managed.provider.js.map +1 -1
  79. package/lib/commonjs/shared/types/stack.types.js.map +1 -1
  80. package/lib/commonjs/shared/utils/create-provider.js +99 -10
  81. package/lib/commonjs/shared/utils/create-provider.js.map +1 -1
  82. package/lib/commonjs/shared/utils/navigation/resolve-scene-neighbors.js +8 -5
  83. package/lib/commonjs/shared/utils/navigation/resolve-scene-neighbors.js.map +1 -1
  84. package/lib/commonjs/shared/utils/navigation/sync-routes-with-removed.js +23 -6
  85. package/lib/commonjs/shared/utils/navigation/sync-routes-with-removed.js.map +1 -1
  86. package/lib/commonjs/shared/utils/visibility-block-offset.js +13 -0
  87. package/lib/commonjs/shared/utils/visibility-block-offset.js.map +1 -0
  88. package/lib/module/blank-stack/components/stack-view.js +36 -40
  89. package/lib/module/blank-stack/components/stack-view.js.map +1 -1
  90. package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js +7 -14
  91. package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
  92. package/lib/module/component-stack/components/stack-view.js +4 -11
  93. package/lib/module/component-stack/components/stack-view.js.map +1 -1
  94. package/lib/module/component-stack/navigators/create-component-stack-navigator.js +1 -1
  95. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +6 -0
  96. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  97. package/lib/module/shared/adapters/with-screen-transitions/context.js +23 -0
  98. package/lib/module/shared/adapters/with-screen-transitions/context.js.map +1 -0
  99. package/lib/module/shared/adapters/with-screen-transitions/index.js +66 -0
  100. package/lib/module/shared/adapters/with-screen-transitions/index.js.map +1 -0
  101. package/lib/module/shared/adapters/with-screen-transitions/options.js +98 -0
  102. package/lib/module/shared/adapters/with-screen-transitions/options.js.map +1 -0
  103. package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js +138 -0
  104. package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -0
  105. package/lib/module/shared/adapters/with-screen-transitions/types.js +4 -0
  106. package/lib/module/shared/adapters/with-screen-transitions/types.js.map +1 -0
  107. package/lib/module/shared/components/activity/helpers.js +5 -0
  108. package/lib/module/shared/components/activity/helpers.js.map +1 -0
  109. package/lib/module/shared/components/activity/index.js +5 -0
  110. package/lib/module/shared/components/activity/index.js.map +1 -0
  111. package/lib/module/shared/components/activity/variants/activity-container.js +24 -0
  112. package/lib/module/shared/components/activity/variants/activity-container.js.map +1 -0
  113. package/lib/module/shared/components/activity/variants/activity-screen.js +103 -0
  114. package/lib/module/shared/components/activity/variants/activity-screen.js.map +1 -0
  115. package/lib/module/shared/components/create-boundary-component/hooks/use-measurer.js +11 -5
  116. package/lib/module/shared/components/create-boundary-component/hooks/use-measurer.js.map +1 -1
  117. package/lib/module/shared/components/create-boundary-component/utils/measured-bounds.js +11 -0
  118. package/lib/module/shared/components/create-boundary-component/utils/measured-bounds.js.map +1 -1
  119. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +8 -17
  120. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  121. package/lib/module/shared/components/screen-lifecycle/index.js +1 -1
  122. package/lib/module/shared/components/screen-lifecycle/index.js.map +1 -1
  123. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js +11 -5
  124. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  125. package/lib/module/shared/hooks/navigation/use-stack.js +63 -6
  126. package/lib/module/shared/hooks/navigation/use-stack.js.map +1 -1
  127. package/lib/module/shared/index.js +3 -0
  128. package/lib/module/shared/index.js.map +1 -1
  129. package/lib/module/shared/providers/screen/descriptors/descriptors.provider.js +17 -29
  130. package/lib/module/shared/providers/screen/descriptors/descriptors.provider.js.map +1 -1
  131. package/lib/module/shared/providers/screen/descriptors/index.js +1 -1
  132. package/lib/module/shared/providers/screen/descriptors/index.js.map +1 -1
  133. package/lib/module/shared/providers/screen/gestures/ownership/resolve-ownership.js +2 -1
  134. package/lib/module/shared/providers/screen/gestures/ownership/resolve-ownership.js.map +1 -1
  135. package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js +2 -2
  136. package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +1 -1
  137. package/lib/module/shared/providers/screen/gestures/pan/pan-lifecycle.js +5 -2
  138. package/lib/module/shared/providers/screen/gestures/pan/pan-lifecycle.js.map +1 -1
  139. package/lib/module/shared/providers/screen/gestures/pan/use-pan-behavior.js +4 -3
  140. package/lib/module/shared/providers/screen/gestures/pan/use-pan-behavior.js.map +1 -1
  141. package/lib/module/shared/providers/screen/gestures/pinch/pinch-lifecycle.js +5 -2
  142. package/lib/module/shared/providers/screen/gestures/pinch/pinch-lifecycle.js.map +1 -1
  143. package/lib/module/shared/providers/screen/gestures/pinch/use-pinch-behavior.js +4 -3
  144. package/lib/module/shared/providers/screen/gestures/pinch/use-pinch-behavior.js.map +1 -1
  145. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +16 -1
  146. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  147. package/lib/module/shared/providers/stack/direct.provider.js +5 -4
  148. package/lib/module/shared/providers/stack/direct.provider.js.map +1 -1
  149. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js +194 -0
  150. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js.map +1 -0
  151. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js +57 -0
  152. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js.map +1 -0
  153. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js +69 -0
  154. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js.map +1 -0
  155. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js +118 -0
  156. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js.map +1 -0
  157. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/types.js +4 -0
  158. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/types.js.map +1 -0
  159. package/lib/module/shared/providers/stack/helpers/managed-stack-state/index.js +19 -0
  160. package/lib/module/shared/providers/stack/helpers/managed-stack-state/index.js.map +1 -0
  161. package/lib/module/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js +126 -0
  162. package/lib/module/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js.map +1 -0
  163. package/lib/module/shared/providers/stack/managed.provider.js +19 -30
  164. package/lib/module/shared/providers/stack/managed.provider.js.map +1 -1
  165. package/lib/module/shared/types/stack.types.js.map +1 -1
  166. package/lib/module/shared/utils/create-provider.js +100 -11
  167. package/lib/module/shared/utils/create-provider.js.map +1 -1
  168. package/lib/module/shared/utils/navigation/resolve-scene-neighbors.js +8 -5
  169. package/lib/module/shared/utils/navigation/resolve-scene-neighbors.js.map +1 -1
  170. package/lib/module/shared/utils/navigation/sync-routes-with-removed.js +23 -6
  171. package/lib/module/shared/utils/navigation/sync-routes-with-removed.js.map +1 -1
  172. package/lib/module/shared/utils/visibility-block-offset.js +8 -0
  173. package/lib/module/shared/utils/visibility-block-offset.js.map +1 -0
  174. package/lib/typescript/blank-stack/components/stack-view.d.ts.map +1 -1
  175. package/lib/typescript/blank-stack/index.d.ts +1 -1
  176. package/lib/typescript/blank-stack/index.d.ts.map +1 -1
  177. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts +4 -6
  178. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts.map +1 -1
  179. package/lib/typescript/blank-stack/types.d.ts +41 -29
  180. package/lib/typescript/blank-stack/types.d.ts.map +1 -1
  181. package/lib/typescript/component-stack/components/stack-view.d.ts.map +1 -1
  182. package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts +1 -1
  183. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +5 -0
  184. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -1
  185. package/lib/typescript/native-stack/types.d.ts +25 -0
  186. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  187. package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts +15 -0
  188. package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts.map +1 -0
  189. package/lib/typescript/shared/adapters/with-screen-transitions/index.d.ts +11 -0
  190. package/lib/typescript/shared/adapters/with-screen-transitions/index.d.ts.map +1 -0
  191. package/lib/typescript/shared/adapters/with-screen-transitions/options.d.ts +16 -0
  192. package/lib/typescript/shared/adapters/with-screen-transitions/options.d.ts.map +1 -0
  193. package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts +12 -0
  194. package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts.map +1 -0
  195. package/lib/typescript/shared/adapters/with-screen-transitions/types.d.ts +24 -0
  196. package/lib/typescript/shared/adapters/with-screen-transitions/types.d.ts.map +1 -0
  197. package/lib/typescript/shared/components/activity/helpers.d.ts +4 -0
  198. package/lib/typescript/shared/components/activity/helpers.d.ts.map +1 -0
  199. package/lib/typescript/shared/components/activity/index.d.ts +3 -0
  200. package/lib/typescript/shared/components/activity/index.d.ts.map +1 -0
  201. package/lib/typescript/shared/components/activity/variants/activity-container.d.ts +6 -0
  202. package/lib/typescript/shared/components/activity/variants/activity-container.d.ts.map +1 -0
  203. package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts +13 -0
  204. package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts.map +1 -0
  205. package/lib/typescript/shared/components/create-boundary-component/hooks/use-measurer.d.ts.map +1 -1
  206. package/lib/typescript/shared/components/create-boundary-component/index.d.ts +2 -2
  207. package/lib/typescript/shared/components/create-boundary-component/utils/measured-bounds.d.ts +1 -0
  208. package/lib/typescript/shared/components/create-boundary-component/utils/measured-bounds.d.ts.map +1 -1
  209. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts +1 -2
  210. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts.map +1 -1
  211. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts +1 -0
  212. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts.map +1 -1
  213. package/lib/typescript/shared/hooks/navigation/use-stack.d.ts +13 -1
  214. package/lib/typescript/shared/hooks/navigation/use-stack.d.ts.map +1 -1
  215. package/lib/typescript/shared/index.d.ts +15 -11
  216. package/lib/typescript/shared/index.d.ts.map +1 -1
  217. package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts +11 -3
  218. package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts.map +1 -1
  219. package/lib/typescript/shared/providers/screen/descriptors/index.d.ts +1 -1
  220. package/lib/typescript/shared/providers/screen/descriptors/index.d.ts.map +1 -1
  221. package/lib/typescript/shared/providers/screen/gestures/ownership/resolve-ownership.d.ts.map +1 -1
  222. package/lib/typescript/shared/providers/screen/gestures/pan/pan-lifecycle.d.ts +1 -1
  223. package/lib/typescript/shared/providers/screen/gestures/pan/pan-lifecycle.d.ts.map +1 -1
  224. package/lib/typescript/shared/providers/screen/gestures/pan/use-pan-behavior.d.ts.map +1 -1
  225. package/lib/typescript/shared/providers/screen/gestures/pinch/pinch-lifecycle.d.ts +1 -1
  226. package/lib/typescript/shared/providers/screen/gestures/pinch/pinch-lifecycle.d.ts.map +1 -1
  227. package/lib/typescript/shared/providers/screen/gestures/pinch/use-pinch-behavior.d.ts.map +1 -1
  228. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts +3 -1
  229. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts.map +1 -1
  230. package/lib/typescript/shared/providers/stack/direct.provider.d.ts.map +1 -1
  231. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.d.ts +13 -0
  232. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.d.ts.map +1 -0
  233. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.d.ts +12 -0
  234. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.d.ts.map +1 -0
  235. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.d.ts +11 -0
  236. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.d.ts.map +1 -0
  237. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.d.ts +12 -0
  238. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.d.ts.map +1 -0
  239. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/types.d.ts +40 -0
  240. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/types.d.ts.map +1 -0
  241. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/index.d.ts +12 -0
  242. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/index.d.ts.map +1 -0
  243. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.d.ts +13 -0
  244. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.d.ts.map +1 -0
  245. package/lib/typescript/shared/providers/stack/managed.provider.d.ts.map +1 -1
  246. package/lib/typescript/shared/types/index.d.ts +2 -2
  247. package/lib/typescript/shared/types/index.d.ts.map +1 -1
  248. package/lib/typescript/shared/types/providers/managed-stack.types.d.ts +3 -9
  249. package/lib/typescript/shared/types/providers/managed-stack.types.d.ts.map +1 -1
  250. package/lib/typescript/shared/types/screen.types.d.ts +24 -0
  251. package/lib/typescript/shared/types/screen.types.d.ts.map +1 -1
  252. package/lib/typescript/shared/types/stack.types.d.ts +7 -0
  253. package/lib/typescript/shared/types/stack.types.d.ts.map +1 -1
  254. package/lib/typescript/shared/utils/create-provider.d.ts +17 -3
  255. package/lib/typescript/shared/utils/create-provider.d.ts.map +1 -1
  256. package/lib/typescript/shared/utils/navigation/resolve-scene-neighbors.d.ts +2 -1
  257. package/lib/typescript/shared/utils/navigation/resolve-scene-neighbors.d.ts.map +1 -1
  258. package/lib/typescript/shared/utils/navigation/sync-routes-with-removed.d.ts +2 -1
  259. package/lib/typescript/shared/utils/navigation/sync-routes-with-removed.d.ts.map +1 -1
  260. package/lib/typescript/shared/utils/visibility-block-offset.d.ts +2 -0
  261. package/lib/typescript/shared/utils/visibility-block-offset.d.ts.map +1 -0
  262. package/package.json +11 -1
  263. package/src/blank-stack/components/stack-view.tsx +54 -48
  264. package/src/blank-stack/index.ts +1 -0
  265. package/src/blank-stack/navigators/create-blank-stack-navigator.tsx +7 -15
  266. package/src/blank-stack/types.ts +44 -29
  267. package/src/component-stack/components/stack-view.tsx +4 -11
  268. package/src/component-stack/navigators/create-component-stack-navigator.tsx +1 -1
  269. package/src/native-stack/navigators/createNativeStackNavigator.tsx +5 -0
  270. package/src/native-stack/types.ts +25 -0
  271. package/src/shared/adapters/with-screen-transitions/context.tsx +42 -0
  272. package/src/shared/adapters/with-screen-transitions/index.tsx +155 -0
  273. package/src/shared/adapters/with-screen-transitions/options.ts +172 -0
  274. package/src/shared/adapters/with-screen-transitions/stack-layout.tsx +233 -0
  275. package/src/shared/adapters/with-screen-transitions/types.ts +28 -0
  276. package/src/shared/components/activity/helpers.ts +8 -0
  277. package/src/shared/components/activity/index.tsx +2 -0
  278. package/src/shared/components/activity/variants/activity-container.tsx +25 -0
  279. package/src/shared/components/activity/variants/activity-screen.tsx +133 -0
  280. package/src/shared/components/create-boundary-component/hooks/use-measurer.ts +23 -4
  281. package/src/shared/components/create-boundary-component/utils/measured-bounds.ts +15 -0
  282. package/src/shared/components/screen-lifecycle/hooks/use-close-transition-intent.ts +9 -26
  283. package/src/shared/components/screen-lifecycle/index.tsx +1 -1
  284. package/src/shared/hooks/navigation/use-navigation-helpers.ts +9 -3
  285. package/src/shared/hooks/navigation/use-stack.tsx +115 -6
  286. package/src/shared/index.ts +9 -0
  287. package/src/shared/providers/screen/descriptors/descriptors.provider.tsx +31 -31
  288. package/src/shared/providers/screen/descriptors/index.tsx +1 -0
  289. package/src/shared/providers/screen/gestures/ownership/resolve-ownership.ts +2 -1
  290. package/src/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.ts +2 -2
  291. package/src/shared/providers/screen/gestures/pan/pan-lifecycle.ts +7 -2
  292. package/src/shared/providers/screen/gestures/pan/use-pan-behavior.ts +10 -2
  293. package/src/shared/providers/screen/gestures/pinch/pinch-lifecycle.ts +7 -2
  294. package/src/shared/providers/screen/gestures/pinch/use-pinch-behavior.ts +8 -3
  295. package/src/shared/providers/screen/styles/hooks/use-maybe-block-visibility.tsx +17 -1
  296. package/src/shared/providers/stack/direct.provider.tsx +13 -4
  297. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.ts +368 -0
  298. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.ts +129 -0
  299. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.ts +139 -0
  300. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.ts +198 -0
  301. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/types.ts +57 -0
  302. package/src/shared/providers/stack/helpers/managed-stack-state/index.ts +40 -0
  303. package/src/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.ts +160 -0
  304. package/src/shared/providers/stack/managed.provider.tsx +23 -39
  305. package/src/shared/types/index.ts +3 -0
  306. package/src/shared/types/providers/managed-stack.types.ts +6 -8
  307. package/src/shared/types/screen.types.ts +25 -0
  308. package/src/shared/types/stack.types.ts +11 -0
  309. package/src/shared/utils/create-provider.tsx +183 -8
  310. package/src/shared/utils/navigation/resolve-scene-neighbors.ts +9 -4
  311. package/src/shared/utils/navigation/sync-routes-with-removed.ts +38 -7
  312. package/src/shared/utils/visibility-block-offset.ts +4 -0
  313. package/lib/commonjs/blank-stack/components/stack-view.native.js +0 -64
  314. package/lib/commonjs/blank-stack/components/stack-view.native.js.map +0 -1
  315. package/lib/commonjs/shared/components/native-screen-container.js +0 -42
  316. package/lib/commonjs/shared/components/native-screen-container.js.map +0 -1
  317. package/lib/commonjs/shared/components/native-screen.js +0 -125
  318. package/lib/commonjs/shared/components/native-screen.js.map +0 -1
  319. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js +0 -51
  320. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js.map +0 -1
  321. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js +0 -15
  322. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js.map +0 -1
  323. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js +0 -14
  324. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js.map +0 -1
  325. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js +0 -13
  326. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js.map +0 -1
  327. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/index.js +0 -101
  328. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/index.js.map +0 -1
  329. package/lib/module/blank-stack/components/stack-view.native.js +0 -60
  330. package/lib/module/blank-stack/components/stack-view.native.js.map +0 -1
  331. package/lib/module/shared/components/native-screen-container.js +0 -37
  332. package/lib/module/shared/components/native-screen-container.js.map +0 -1
  333. package/lib/module/shared/components/native-screen.js +0 -119
  334. package/lib/module/shared/components/native-screen.js.map +0 -1
  335. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js +0 -47
  336. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js.map +0 -1
  337. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js +0 -10
  338. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js.map +0 -1
  339. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js +0 -9
  340. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js.map +0 -1
  341. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js +0 -8
  342. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js.map +0 -1
  343. package/lib/module/shared/providers/stack/helpers/use-local-routes/index.js +0 -95
  344. package/lib/module/shared/providers/stack/helpers/use-local-routes/index.js.map +0 -1
  345. package/lib/typescript/blank-stack/components/stack-view.native.d.ts +0 -3
  346. package/lib/typescript/blank-stack/components/stack-view.native.d.ts.map +0 -1
  347. package/lib/typescript/shared/components/native-screen-container.d.ts +0 -6
  348. package/lib/typescript/shared/components/native-screen-container.d.ts.map +0 -1
  349. package/lib/typescript/shared/components/native-screen.d.ts +0 -12
  350. package/lib/typescript/shared/components/native-screen.d.ts.map +0 -1
  351. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.d.ts +0 -10
  352. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.d.ts.map +0 -1
  353. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.d.ts +0 -2
  354. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.d.ts.map +0 -1
  355. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.d.ts +0 -3
  356. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.d.ts.map +0 -1
  357. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.d.ts +0 -3
  358. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.d.ts.map +0 -1
  359. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/index.d.ts +0 -19
  360. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/index.d.ts.map +0 -1
  361. package/src/blank-stack/components/stack-view.native.tsx +0 -74
  362. package/src/shared/components/native-screen-container.tsx +0 -33
  363. package/src/shared/components/native-screen.tsx +0 -176
  364. package/src/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.ts +0 -65
  365. package/src/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.ts +0 -15
  366. package/src/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.ts +0 -12
  367. package/src/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.ts +0 -11
  368. package/src/shared/providers/stack/helpers/use-local-routes/index.ts +0 -147
@@ -0,0 +1,25 @@
1
+ import { StyleSheet, View } from "react-native";
2
+
3
+ import { ScreenContainer } from "react-native-screens";
4
+ import { IS_WEB } from "../../../constants";
5
+ import { useStack } from "../../../hooks/navigation/use-stack";
6
+
7
+ interface Props {
8
+ children: React.ReactNode;
9
+ }
10
+
11
+ export const ActivityContainer = ({ children }: Props) => {
12
+ const nativeScreenDisabled = useStack((s) => s.flags.DISABLE_NATIVE_SCREENS);
13
+ const Component = IS_WEB || nativeScreenDisabled ? View : ScreenContainer;
14
+ return (
15
+ <Component collapsable={false} style={styles.container}>
16
+ {children}
17
+ </Component>
18
+ );
19
+ };
20
+
21
+ const styles = StyleSheet.create({
22
+ container: {
23
+ flex: 1,
24
+ },
25
+ });
@@ -0,0 +1,133 @@
1
+ import type * as React from "react";
2
+ import { memo } from "react";
3
+ import { StyleSheet, View, type ViewProps } from "react-native";
4
+ import { useDerivedValue } from "react-native-reanimated";
5
+ import { Screen } from "react-native-screens";
6
+ import { IS_WEB } from "../../../constants";
7
+ import { useStack } from "../../../hooks/navigation/use-stack";
8
+ import { useSharedValueState } from "../../../hooks/reanimated/use-shared-value-state";
9
+ import { AnimationStore } from "../../../stores/animation.store";
10
+ import type { StackSceneActivity } from "../../../types/stack.types";
11
+ import { DEFAULT_INACTIVE_BEHAVIOR, type InactiveBehavior } from "../helpers";
12
+
13
+ type ActivityState = 0 | 1 | 2;
14
+ const ActivityStateByActivity = {
15
+ active: 2,
16
+ inert: 1,
17
+ inactive: 0,
18
+ closing: 1,
19
+ } satisfies Record<StackSceneActivity, ActivityState>;
20
+
21
+ const PointerEventsByActivity = {
22
+ active: "auto",
23
+ inert: "auto",
24
+ inactive: "none",
25
+ closing: "none",
26
+ } satisfies Record<StackSceneActivity, ViewProps["pointerEvents"]>;
27
+
28
+ interface ActivityScreenProps {
29
+ activity: StackSceneActivity;
30
+ children: React.ReactNode;
31
+ inactiveBehavior?: InactiveBehavior;
32
+ paintDriverRouteKey?: string;
33
+ hasNestedState?: boolean;
34
+ }
35
+
36
+ export const ActivityScreen = memo(function ActivityScreen({
37
+ activity,
38
+ children,
39
+ inactiveBehavior = DEFAULT_INACTIVE_BEHAVIOR,
40
+ paintDriverRouteKey,
41
+ hasNestedState,
42
+ }: ActivityScreenProps) {
43
+ const nativeScreenDisabled = useStack((s) => s.flags.DISABLE_NATIVE_SCREENS);
44
+ const paintDriverAnimations = paintDriverRouteKey
45
+ ? AnimationStore.getBag(paintDriverRouteKey)
46
+ : undefined;
47
+
48
+ /**
49
+ * Avoid hiding inactive content until the screen that exposes it has settled.
50
+ *
51
+ * For A(inactive), B(inert), C(active), A's paint depends on C finishing its
52
+ * transition. Watching B can still leave a brief blank frame, so we wait for
53
+ * C's progress to reach its settled value of 1 before hiding A.
54
+ */
55
+ const isPaintDriverSettled = useDerivedValue(() => {
56
+ "worklet";
57
+
58
+ if (!paintDriverAnimations) {
59
+ return false;
60
+ }
61
+
62
+ return paintDriverAnimations.progress.get() >= 1;
63
+ });
64
+
65
+ const isPaintDriverSettledOnJS = useSharedValueState(isPaintDriverSettled);
66
+
67
+ let activityState: ActivityState = ActivityStateByActivity[activity];
68
+ let shouldFreeze = false;
69
+ let visible = activity !== "inactive";
70
+
71
+ const shouldWaitForPaintDriver = !isPaintDriverSettledOnJS;
72
+
73
+ if (activity === "inactive") {
74
+ if (inactiveBehavior === "keep") {
75
+ activityState = 1;
76
+ visible = true;
77
+ } else if (shouldWaitForPaintDriver) {
78
+ // Delay hiding until the paint driver has settled to avoid
79
+ // a blank frame during the transition.
80
+ activityState = 1;
81
+ visible = true;
82
+ } else if (inactiveBehavior === "freeze") {
83
+ activityState = 1;
84
+ shouldFreeze = true;
85
+ visible = true;
86
+ } else {
87
+ // `detach` hides native presentation. Non-nested `unmount`
88
+ // removes the React subtree through the JS guard below.
89
+ activityState = 0;
90
+ visible = false;
91
+ }
92
+ }
93
+
94
+ const shouldUnmount =
95
+ inactiveBehavior === "unmount" &&
96
+ activity === "inactive" &&
97
+ !hasNestedState &&
98
+ isPaintDriverSettledOnJS;
99
+
100
+ const pointerEvents = PointerEventsByActivity[activity];
101
+
102
+ if (shouldUnmount) {
103
+ return null;
104
+ }
105
+
106
+ const style = [StyleSheet.absoluteFill, visible ? undefined : styles.hidden];
107
+
108
+ if (IS_WEB || nativeScreenDisabled) {
109
+ return (
110
+ <View style={style} pointerEvents={pointerEvents} collapsable={false}>
111
+ {children}
112
+ </View>
113
+ );
114
+ }
115
+
116
+ return (
117
+ <Screen
118
+ style={style}
119
+ activityState={activityState}
120
+ shouldFreeze={shouldFreeze}
121
+ pointerEvents={pointerEvents}
122
+ collapsable={false}
123
+ >
124
+ {children}
125
+ </Screen>
126
+ );
127
+ });
128
+
129
+ const styles = StyleSheet.create({
130
+ hidden: {
131
+ display: "none",
132
+ },
133
+ });
@@ -9,8 +9,10 @@ import {
9
9
  } from "../../../stores/bounds/internals/links";
10
10
  import { ScrollStore } from "../../../stores/scroll.store";
11
11
  import { SystemStore } from "../../../stores/system.store";
12
+ import { getVisibilityBlockOffset } from "../../../utils/visibility-block-offset";
12
13
  import type { MeasureBoundary } from "../types";
13
14
  import {
15
+ applyVisibilityBlockOffset,
14
16
  isMeasurementInViewport,
15
17
  measureWithOverscrollAwareness,
16
18
  } from "../utils/measured-bounds";
@@ -55,6 +57,19 @@ export const useMeasurer = ({
55
57
 
56
58
  if (!measured) return;
57
59
 
60
+ // Source boundaries do not need offset correction. Only destination
61
+ // captures can measure while the visibility gate is still blocked.
62
+ const shouldAdjustBlockedDestination =
63
+ target.type === "destination" &&
64
+ pendingLifecycleStartBlockCount.get() > 0;
65
+
66
+ const normalizedMeasured = shouldAdjustBlockedDestination
67
+ ? applyVisibilityBlockOffset(
68
+ measured,
69
+ getVisibilityBlockOffset(viewportHeight),
70
+ )
71
+ : measured;
72
+
58
73
  /**
59
74
  * - Destination Pass -
60
75
  * Be strict while lifecycle start is blocked for destination capture.
@@ -68,14 +83,18 @@ export const useMeasurer = ({
68
83
  const viewportAllowsDestinationWrite =
69
84
  target.type !== "destination" ||
70
85
  !shouldGuardDestinationViewport ||
71
- isMeasurementInViewport(measured, viewportWidth, viewportHeight);
86
+ isMeasurementInViewport(
87
+ normalizedMeasured,
88
+ viewportWidth,
89
+ viewportHeight,
90
+ );
72
91
 
73
92
  if (!viewportAllowsDestinationWrite) return;
74
93
 
75
94
  // Set the bounds entry on every measure to avoid any stale measurements
76
95
  // for the public read API.
77
96
  setEntry(entryTag, currentScreenKey, {
78
- bounds: measured,
97
+ bounds: normalizedMeasured,
79
98
  });
80
99
 
81
100
  if (target.type === "source") {
@@ -83,7 +102,7 @@ export const useMeasurer = ({
83
102
  target.pairKey,
84
103
  linkId,
85
104
  currentScreenKey,
86
- measured,
105
+ normalizedMeasured,
87
106
  preparedStyles,
88
107
  group,
89
108
  );
@@ -94,7 +113,7 @@ export const useMeasurer = ({
94
113
  target.pairKey,
95
114
  linkId,
96
115
  currentScreenKey,
97
- measured,
116
+ normalizedMeasured,
98
117
  preparedStyles,
99
118
  group,
100
119
  );
@@ -46,6 +46,21 @@ export const adjustedMeasuredBoundsForOverscrollDeltas = (
46
46
  };
47
47
  };
48
48
 
49
+ export const applyVisibilityBlockOffset = (
50
+ measured: MeasuredDimensions,
51
+ offset: number,
52
+ ): MeasuredDimensions => {
53
+ "worklet";
54
+ if (offset === 0) {
55
+ return measured;
56
+ }
57
+
58
+ return {
59
+ ...measured,
60
+ pageY: measured.pageY - offset,
61
+ };
62
+ };
63
+
49
64
  export const isMeasurementInViewport = (
50
65
  measured: MeasuredDimensions,
51
66
  viewportWidth: number,
@@ -1,6 +1,5 @@
1
1
  /** biome-ignore-all lint/correctness/useHookAtTopLevel: STACK_TYPE is stable per navigator */
2
2
  import { useLayoutEffect, useMemo, useRef } from "react";
3
- import { useAnimatedReaction } from "react-native-reanimated";
4
3
  import useStableCallback from "../../../hooks/use-stable-callback";
5
4
  import {
6
5
  type BaseDescriptor,
@@ -8,7 +7,6 @@ import {
8
7
  } from "../../../providers/screen/descriptors";
9
8
  import { useStackCoreContext } from "../../../providers/stack/core.provider";
10
9
  import { useManagedStackContext } from "../../../providers/stack/managed.provider";
11
- import type { AnimationStoreMap } from "../../../stores/animation.store";
12
10
  import { GestureStore } from "../../../stores/gesture.store";
13
11
  import {
14
12
  LifecycleTransitionRequestKind,
@@ -20,22 +18,24 @@ import { resetStoresForScreen } from "./helpers/reset-stores-for-screen";
20
18
 
21
19
  interface CloseHookParams {
22
20
  current: BaseDescriptor;
23
- animations: AnimationStoreMap;
24
21
  requestLifecycleTransition: SystemStoreActions["requestLifecycleTransition"];
25
22
  resetStores: () => void;
26
23
  }
27
24
 
28
- /**
29
- * Managed close - reacts to closingRouteKeysShared from ManagedStackContext.
30
- * Used by blank-stack and component-stack.
31
- */
32
25
  const useManagedClose = ({
33
26
  current,
34
27
  requestLifecycleTransition,
35
28
  resetStores,
36
29
  }: CloseHookParams) => {
37
- const { handleCloseRoute, closingRouteKeysShared } = useManagedStackContext();
38
- const routeKey = current.route.key;
30
+ const { handleCloseRoute } = useManagedStackContext();
31
+
32
+ useLayoutEffect(() => {
33
+ if (current.activity !== "closing") {
34
+ return;
35
+ }
36
+
37
+ requestLifecycleTransition(LifecycleTransitionRequestKind.ManagedClose, 0);
38
+ }, [current.activity, requestLifecycleTransition]);
39
39
 
40
40
  const handleManagedCloseEnd = useStableCallback((finished: boolean) => {
41
41
  if (!finished) return;
@@ -45,21 +45,6 @@ const useManagedClose = ({
45
45
  });
46
46
  });
47
47
 
48
- useAnimatedReaction(
49
- () => {
50
- const keys = closingRouteKeysShared.get();
51
- return keys?.includes(routeKey) ?? false;
52
- },
53
- (isClosing, wasClosing) => {
54
- if (!isClosing || wasClosing) return;
55
-
56
- requestLifecycleTransition(
57
- LifecycleTransitionRequestKind.ManagedClose,
58
- 0,
59
- );
60
- },
61
- );
62
-
63
48
  return { handleManagedCloseEnd };
64
49
  };
65
50
 
@@ -127,7 +112,6 @@ const useNativeStackClose = ({
127
112
  */
128
113
  export function useCloseTransitionIntent(
129
114
  current: BaseDescriptor,
130
- animations: AnimationStoreMap,
131
115
  system: SystemStoreMap,
132
116
  ): {
133
117
  handleManagedCloseEnd?: (finished: boolean) => void;
@@ -144,7 +128,6 @@ export function useCloseTransitionIntent(
144
128
 
145
129
  const closeParams: CloseHookParams = {
146
130
  current,
147
- animations,
148
131
  requestLifecycleTransition,
149
132
  resetStores,
150
133
  };
@@ -21,7 +21,7 @@ export const ScreenLifecycle = ({ children }: Props) => {
21
21
  const system = SystemStore.getBag(current.route.key);
22
22
 
23
23
  const { handleManagedCloseEnd, handleNativeCloseEnd } =
24
- useCloseTransitionIntent(current, animations, system);
24
+ useCloseTransitionIntent(current, system);
25
25
 
26
26
  useOpenTransitionIntent(current, animations, system);
27
27
 
@@ -1,9 +1,15 @@
1
1
  import { StackActions } from "@react-navigation/native";
2
2
  import { useCallback } from "react";
3
- import { useDescriptors } from "../../providers/screen/descriptors";
3
+ import { useDescriptorsStore } from "../../providers/screen/descriptors";
4
+ import { useStack } from "./use-stack";
4
5
 
5
6
  export function useNavigationHelpers() {
6
- const { current } = useDescriptors();
7
+ const current = useDescriptorsStore((store) => store.descriptors.current);
8
+ const requestStackDismiss = useStack((stack) => stack.requestDismiss);
9
+
10
+ const requestDismiss = useCallback((): boolean => {
11
+ return requestStackDismiss?.({ route: current.route }) ?? false;
12
+ }, [current.route, requestStackDismiss]);
7
13
 
8
14
  const dismissScreen = useCallback((): boolean => {
9
15
  const state = current.navigation.getState();
@@ -21,5 +27,5 @@ export function useNavigationHelpers() {
21
27
  return true;
22
28
  }, [current]);
23
29
 
24
- return { dismissScreen };
30
+ return { dismissScreen, requestDismiss };
25
31
  }
@@ -1,5 +1,13 @@
1
1
  import type { Route } from "@react-navigation/native";
2
- import { createContext, useContext } from "react";
2
+ import {
3
+ createContext,
4
+ type ReactNode,
5
+ useCallback,
6
+ useContext,
7
+ useLayoutEffect,
8
+ useRef,
9
+ useSyncExternalStore,
10
+ } from "react";
3
11
  import type { DerivedValue } from "react-native-reanimated";
4
12
  import type { StackCoreContextValue } from "../../providers/stack/core.provider";
5
13
  import type { OverlayProps } from "../../types/overlay.types";
@@ -25,23 +33,124 @@ export interface StackDescriptor<
25
33
  export type StackScene<TDescriptor extends StackDescriptor = StackDescriptor> =
26
34
  BaseStackScene<TDescriptor>;
27
35
 
36
+ type StackDismissRequest = (payload: { route: BaseStackRoute }) => boolean;
37
+ type StackSelector<T> = (stack: StackContextValue) => T;
38
+
28
39
  export interface StackContextValue extends StackCoreContextValue {
29
40
  navigatorKey: string;
30
41
  routeKeys: string[];
31
42
  routes: Route<string>[];
32
43
  scenes: StackScene[];
33
44
  optimisticFocusedIndex: DerivedValue<number>;
45
+ focusedIndex: number;
46
+ requestDismiss?: StackDismissRequest;
47
+ }
48
+
49
+ interface StackStoreApi {
50
+ getSnapshot: () => StackContextValue;
51
+ subscribe: (listener: () => void) => () => void;
34
52
  }
35
53
 
36
- export const StackContext = createContext<StackContextValue | null>(null);
54
+ interface MutableStackStoreApi extends StackStoreApi {
55
+ notify: () => void;
56
+ setSnapshot: (snapshot: StackContextValue) => boolean;
57
+ }
58
+
59
+ const createStackStore = (
60
+ initialSnapshot: StackContextValue,
61
+ ): MutableStackStoreApi => {
62
+ let snapshot = initialSnapshot;
63
+ const listeners = new Set<() => void>();
64
+
65
+ return {
66
+ getSnapshot: () => snapshot,
67
+ notify: () => {
68
+ for (const listener of listeners) {
69
+ listener();
70
+ }
71
+ },
72
+ setSnapshot: (nextSnapshot) => {
73
+ if (Object.is(snapshot, nextSnapshot)) {
74
+ return false;
75
+ }
76
+
77
+ snapshot = nextSnapshot;
78
+ return true;
79
+ },
80
+ subscribe: (listener) => {
81
+ listeners.add(listener);
82
+ return () => {
83
+ listeners.delete(listener);
84
+ };
85
+ },
86
+ };
87
+ };
88
+
89
+ const StackContext = createContext<StackStoreApi | null>(null);
37
90
  StackContext.displayName = "Stack";
38
91
 
39
- export function useStack<T extends StackContextValue = StackContextValue>(): T {
40
- const context = useContext(StackContext);
92
+ export function StackProvider({
93
+ children,
94
+ value,
95
+ }: {
96
+ children: ReactNode;
97
+ value: StackContextValue;
98
+ }) {
99
+ const storeRef = useRef<MutableStackStoreApi | null>(null);
100
+ const pendingNotifyRef = useRef(false);
101
+
102
+ let store = storeRef.current;
103
+ if (!store) {
104
+ store = createStackStore(value);
105
+ storeRef.current = store;
106
+ }
41
107
 
42
- if (context === null) {
108
+ pendingNotifyRef.current =
109
+ store.setSnapshot(value) || pendingNotifyRef.current;
110
+
111
+ useLayoutEffect(() => {
112
+ if (!pendingNotifyRef.current) {
113
+ return;
114
+ }
115
+
116
+ pendingNotifyRef.current = false;
117
+ store.notify();
118
+ });
119
+
120
+ return (
121
+ <StackContext.Provider value={store}>{children}</StackContext.Provider>
122
+ );
123
+ }
124
+
125
+ function useStackStore(): StackStoreApi {
126
+ const store = useContext(StackContext);
127
+
128
+ if (store === null) {
43
129
  throw new Error("useStack must be used within a Stack provider");
44
130
  }
45
131
 
46
- return context as T;
132
+ return store;
133
+ }
134
+
135
+ export function useStack<T extends StackContextValue = StackContextValue>(): T;
136
+ export function useStack<T>(selector: StackSelector<T>): T;
137
+ export function useStack<T>(
138
+ selector?: StackSelector<T>,
139
+ ): StackContextValue | T {
140
+ const store = useStackStore();
141
+ const selectorRef = useRef<StackSelector<StackContextValue | T>>(
142
+ selector ?? ((stack) => stack),
143
+ );
144
+ selectorRef.current = selector ?? ((stack) => stack);
145
+
146
+ const getSelectedSnapshot = useCallback(
147
+ () => selectorRef.current(store.getSnapshot()),
148
+ [store],
149
+ );
150
+
151
+ return useSyncExternalStore(
152
+ store.subscribe,
153
+ getSelectedSnapshot,
154
+ getSelectedSnapshot,
155
+ );
47
156
  }
@@ -1,4 +1,5 @@
1
1
  import { FlatList, Pressable, ScrollView, View } from "react-native";
2
+ import { withScreenTransitions } from "./adapters/with-screen-transitions";
2
3
  import {
3
4
  Boundary,
4
5
  createBoundaryComponent,
@@ -10,6 +11,7 @@ import { Presets, Specs } from "./configs";
10
11
  export default {
11
12
  createTransitionAwareComponent,
12
13
  createBoundaryComponent,
14
+ withScreenTransitions,
13
15
  Boundary,
14
16
  View: createTransitionAwareComponent(View),
15
17
  Pressable: createTransitionAwareComponent(Pressable),
@@ -24,6 +26,12 @@ export default {
24
26
  Specs,
25
27
  };
26
28
 
29
+ export type {
30
+ NativeStackAdapterOptions,
31
+ NativeStackNativeGestureOptions,
32
+ ScreenTransitionDescriptorOptions,
33
+ } from "./adapters/with-screen-transitions";
34
+ export { withScreenTransitions } from "./adapters/with-screen-transitions";
27
35
  export { snapTo } from "./animation/snap-to";
28
36
  export {
29
37
  NAVIGATION_MASK_CONTAINER_STYLE_ID,
@@ -53,6 +61,7 @@ export type {
53
61
  BoundsNavigationZoomOpacityRanges,
54
62
  BoundsNavigationZoomOptions,
55
63
  BoundsNavigationZoomStyle,
64
+ InactiveBehavior,
56
65
  OverlayProps,
57
66
  ScreenInterpolationProps,
58
67
  ScreenStyleInterpolator,
@@ -8,8 +8,8 @@ import { getAncestorKeys } from "./helpers/get-ancestor-keys";
8
8
 
9
9
  /**
10
10
  * Base descriptor interface - minimal contract for all stack types.
11
- * This allows blank-stack and native-stack to work with the shared
12
- * providers without tight coupling to React Navigation.
11
+ * This allows stack implementations to work with the shared providers without
12
+ * tight coupling to React Navigation.
13
13
  */
14
14
  export type BaseDescriptor = BaseStackDescriptor;
15
15
 
@@ -23,6 +23,13 @@ export interface DescriptorsContextValue<
23
23
 
24
24
  export type DescriptorDerivationsContextValue = DescriptorDerivations;
25
25
 
26
+ interface DescriptorStoreValue<
27
+ TDescriptor extends BaseDescriptor = BaseDescriptor,
28
+ > {
29
+ descriptors: DescriptorsContextValue<TDescriptor>;
30
+ derivations: DescriptorDerivationsContextValue;
31
+ }
32
+
26
33
  interface DescriptorsProviderProps<TDescriptor extends BaseDescriptor> {
27
34
  children: ReactNode;
28
35
  previous?: TDescriptor;
@@ -30,35 +37,21 @@ interface DescriptorsProviderProps<TDescriptor extends BaseDescriptor> {
30
37
  next?: TDescriptor;
31
38
  }
32
39
 
33
- type InternalProviderProps = DescriptorsProviderProps<BaseDescriptor>;
34
-
35
40
  const {
36
41
  DescriptorsProvider: InternalDescriptorsProvider,
37
- useDescriptorsContext,
42
+ useDescriptorsStore,
38
43
  } = createProvider("Descriptors", { guarded: true })<
39
- InternalProviderProps,
40
- DescriptorsContextValue<BaseDescriptor>
41
- >(({ previous, current, next }) => {
42
- const value = useMemo(
44
+ DescriptorsProviderProps<BaseDescriptor>,
45
+ DescriptorStoreValue<BaseDescriptor>
46
+ >(({ previous, current, next, children }) => {
47
+ const descriptors = useMemo(
43
48
  () => ({ previous, current, next }),
44
49
  [previous, current, next],
45
50
  );
46
51
 
47
- return {
48
- value,
49
- };
50
- });
51
-
52
- const {
53
- DescriptorDerivationsProvider: InternalDescriptorDerivationsProvider,
54
- useDescriptorDerivationsContext,
55
- } = createProvider("DescriptorDerivations", { guarded: true })<
56
- InternalProviderProps,
57
- DescriptorDerivationsContextValue
58
- >(({ previous, current, next, children }) => {
59
52
  const ancestorKeys = useMemo(() => getAncestorKeys(current), [current]);
60
53
 
61
- const value = useMemo(
54
+ const derivations = useMemo(
62
55
  () =>
63
56
  deriveDescriptorDerivations({
64
57
  previous,
@@ -69,6 +62,14 @@ const {
69
62
  [previous, current, next, ancestorKeys],
70
63
  );
71
64
 
65
+ const value = useMemo(
66
+ () => ({
67
+ descriptors,
68
+ derivations,
69
+ }),
70
+ [descriptors, derivations],
71
+ );
72
+
72
73
  return {
73
74
  value,
74
75
  children,
@@ -85,23 +86,22 @@ export function DescriptorsProvider<TDescriptor extends BaseDescriptor>({
85
86
  previous,
86
87
  current,
87
88
  next,
89
+ children,
88
90
  };
89
91
 
90
- return (
91
- <InternalDescriptorsProvider {...providerProps}>
92
- <InternalDescriptorDerivationsProvider {...providerProps}>
93
- {children}
94
- </InternalDescriptorDerivationsProvider>
95
- </InternalDescriptorsProvider>
96
- );
92
+ return <InternalDescriptorsProvider {...providerProps} />;
97
93
  }
98
94
 
99
95
  export function useDescriptors<
100
96
  TDescriptor extends BaseDescriptor = BaseDescriptor,
101
97
  >() {
102
- return useDescriptorsContext() as DescriptorsContextValue<TDescriptor>;
98
+ return useDescriptorsStore(
99
+ (store) => store.descriptors,
100
+ ) as DescriptorsContextValue<TDescriptor>;
103
101
  }
104
102
 
105
103
  export function useDescriptorDerivations(): DescriptorDerivationsContextValue {
106
- return useDescriptorDerivationsContext();
104
+ return useDescriptorsStore((store) => store.derivations);
107
105
  }
106
+
107
+ export { useDescriptorsStore };
@@ -3,4 +3,5 @@ export {
3
3
  DescriptorsProvider,
4
4
  useDescriptorDerivations,
5
5
  useDescriptors,
6
+ useDescriptorsStore,
6
7
  } from "./descriptors.provider";
@@ -87,6 +87,7 @@ export function shouldDeferToChildClaim(
87
87
  "worklet";
88
88
  if (!childClaim) return false;
89
89
  if (childClaim.routeKey === selfRouteKey) return false;
90
- if (childClaim.isDismissing.get()) return false;
90
+ // A closing child still owns its axis until its claim is cleaned up; otherwise
91
+ // an ancestor can steal the next drag while the previous screen is visible.
91
92
  return true;
92
93
  }
@@ -1,4 +1,4 @@
1
- import { useEffect, useMemo } from "react";
1
+ import { useLayoutEffect, useMemo } from "react";
2
2
  import { GestureStore } from "../../../../stores/gesture.store";
3
3
  import {
4
4
  type ClaimedDirections,
@@ -115,7 +115,7 @@ export function useWalkUpAndRegisterShadowingClaims(
115
115
  [parentContext, claimedDirections],
116
116
  );
117
117
 
118
- useEffect(() => {
118
+ useLayoutEffect(() => {
119
119
  if (!isTopMostScreen || !shadowedAncestors.length) {
120
120
  return;
121
121
  }