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
@@ -2,9 +2,10 @@ import type { Route } from "@react-navigation/native";
2
2
  import * as React from "react";
3
3
  import { useMemo } from "react";
4
4
  import {
5
- StackContext,
6
5
  type StackContextValue,
6
+ StackProvider,
7
7
  } from "../../hooks/navigation/use-stack";
8
+ import { AnimationStore } from "../../stores/animation.store";
8
9
  import type {
9
10
  ManagedStackContextValue,
10
11
  ManagedStackProps,
@@ -17,9 +18,7 @@ import type {
17
18
  BaseStackScene,
18
19
  } from "../../types/stack.types";
19
20
  import { useStackCoreContext } from "./core.provider";
20
- import { useClosingRouteMap } from "./helpers/use-closing-route-map";
21
- import { useLocalRoutes } from "./helpers/use-local-routes";
22
- import { useProcessedRoutes } from "./helpers/use-processed-routes";
21
+ import { useManagedStackState } from "./helpers/managed-stack-state";
23
22
  import { useStackDerived } from "./helpers/use-stack-derived";
24
23
 
25
24
  const ManagedStackContext =
@@ -43,70 +42,55 @@ function useManagedStackValue<
43
42
  props: ManagedStackProps<TDescriptor, TNavigation>,
44
43
  ): ManagedStackResult<TDescriptor> {
45
44
  const { flags } = useStackCoreContext();
46
- const { state, handleCloseRoute, closingRouteKeys } = useLocalRoutes(props);
45
+ const { state, handleCloseRoute, requestDismiss } =
46
+ useManagedStackState(props);
47
47
  const navigatorKey = props.state.key;
48
48
 
49
- const processed = useProcessedRoutes(state.routes, state.descriptors);
50
- const { optimisticFocusedIndex } = useStackDerived(processed.animationMaps);
51
- const closingRouteMap = useClosingRouteMap(
52
- processed.routeKeys,
53
- processed.animationMaps,
49
+ const animationMaps = useMemo(
50
+ () => state.routeKeys.map((routeKey) => AnimationStore.getBag(routeKey)),
51
+ [state.routeKeys],
54
52
  );
53
+ const { optimisticFocusedIndex } = useStackDerived(animationMaps);
55
54
 
56
55
  const focusedIndex = props.state.index;
57
56
 
58
- // Common stack context (consumed by useStack())
59
57
  const stackContextValue = useMemo<StackContextValue>(
60
58
  () => ({
61
59
  flags,
62
60
  navigatorKey,
63
- routeKeys: processed.routeKeys,
61
+ routeKeys: state.routeKeys,
64
62
  routes: state.routes as Route<string>[],
65
- scenes: processed.scenes as BaseStackScene[],
63
+ scenes: state.scenes as BaseStackScene[],
66
64
  optimisticFocusedIndex,
65
+ focusedIndex,
66
+ requestDismiss,
67
67
  }),
68
68
  [
69
69
  flags,
70
70
  navigatorKey,
71
- processed.routeKeys,
71
+ state.routeKeys,
72
72
  state.routes,
73
- processed.scenes,
73
+ state.scenes,
74
74
  optimisticFocusedIndex,
75
+ focusedIndex,
76
+ requestDismiss,
75
77
  ],
76
78
  );
77
79
 
78
- // Managed-specific context (consumed by useManagedStackContext())
79
80
  const managedContextValue = useMemo<ManagedStackContextValue>(
80
81
  () => ({
81
- activeScreensLimit: processed.activeScreensLimit,
82
- closingRouteKeysShared: closingRouteKeys.shared,
83
82
  handleCloseRoute,
84
- backdropBehaviors: processed.backdropBehaviors,
85
83
  }),
86
- [
87
- processed.activeScreensLimit,
88
- closingRouteKeys.shared,
89
- handleCloseRoute,
90
- processed.backdropBehaviors,
91
- ],
84
+ [handleCloseRoute],
92
85
  );
93
86
 
94
- // Combined props for render children (stack-view components)
95
87
  const renderProps = useMemo<ManagedStackRenderProps<TDescriptor>>(
96
88
  () => ({
97
- descriptors: state.descriptors,
98
- scenes: processed.scenes,
89
+ scenes: state.scenes,
99
90
  focusedIndex,
100
- closingRouteMap,
101
- shouldShowFloatOverlay: processed.shouldShowFloatOverlay,
91
+ shouldShowFloatOverlay: state.shouldShowFloatOverlay,
102
92
  }),
103
- [
104
- state.descriptors,
105
- processed.scenes,
106
- focusedIndex,
107
- closingRouteMap,
108
- processed.shouldShowFloatOverlay,
109
- ],
93
+ [state.scenes, focusedIndex, state.shouldShowFloatOverlay],
110
94
  );
111
95
 
112
96
  return { stackContextValue, managedContextValue, renderProps };
@@ -125,11 +109,11 @@ function withManagedStack<
125
109
  useManagedStackValue<TDescriptor, TNavigation>(props);
126
110
 
127
111
  return (
128
- <StackContext.Provider value={stackContextValue}>
112
+ <StackProvider value={stackContextValue}>
129
113
  <ManagedStackContext.Provider value={managedContextValue}>
130
114
  <Component {...renderProps} />
131
115
  </ManagedStackContext.Provider>
132
- </StackContext.Provider>
116
+ </StackProvider>
133
117
  );
134
118
  };
135
119
  }
@@ -34,6 +34,7 @@ export type {
34
34
  export type { OverlayProps } from "./overlay.types";
35
35
  export type {
36
36
  GestureTracking,
37
+ InactiveBehavior,
37
38
  Layout,
38
39
  ScreenKey,
39
40
  ScreenTransitionConfig,
@@ -46,4 +47,6 @@ export type {
46
47
  BaseStackScene,
47
48
  BaseStackState,
48
49
  DescriptorMap,
50
+ StackDescriptorSource,
51
+ StackSceneActivity,
49
52
  } from "./stack.types";
@@ -1,4 +1,3 @@
1
- import type { SharedValue } from "react-native-reanimated";
2
1
  import type { StackContextValue } from "../../hooks/navigation/use-stack";
3
2
  import type {
4
3
  BaseStackDescriptor,
@@ -6,6 +5,7 @@ import type {
6
5
  BaseStackRoute,
7
6
  BaseStackScene,
8
7
  BaseStackState,
8
+ StackDescriptorSource,
9
9
  } from "../stack.types";
10
10
 
11
11
  /**
@@ -18,8 +18,11 @@ export interface ManagedStackProps<
18
18
  > {
19
19
  state: BaseStackState<TDescriptor["route"]>;
20
20
  navigation: TNavigation;
21
- descriptors: Record<string, TDescriptor>;
22
- describe: (route: TDescriptor["route"], placeholder: boolean) => TDescriptor;
21
+ descriptors: Record<string, StackDescriptorSource<TDescriptor>>;
22
+ describe: (
23
+ route: TDescriptor["route"],
24
+ placeholder: boolean,
25
+ ) => StackDescriptorSource<TDescriptor>;
23
26
  }
24
27
 
25
28
  /**
@@ -27,10 +30,7 @@ export interface ManagedStackProps<
27
30
  * Shared fields (routes, scenes, etc.) live in StackContext.
28
31
  */
29
32
  export interface ManagedStackContextValue {
30
- activeScreensLimit: number;
31
- closingRouteKeysShared: SharedValue<string[]>;
32
33
  handleCloseRoute: (payload: { route: BaseStackRoute }) => void;
33
- backdropBehaviors: string[];
34
34
  }
35
35
 
36
36
  /**
@@ -40,10 +40,8 @@ export interface ManagedStackContextValue {
40
40
  export interface ManagedStackRenderProps<
41
41
  TDescriptor extends BaseStackDescriptor = BaseStackDescriptor,
42
42
  > {
43
- descriptors: Record<string, TDescriptor>;
44
43
  scenes: BaseStackScene<TDescriptor>[];
45
44
  focusedIndex: number;
46
- closingRouteMap: React.RefObject<Readonly<Record<string, true>>>;
47
45
  shouldShowFloatOverlay: boolean;
48
46
  }
49
47
 
@@ -43,6 +43,31 @@ export type SnapPoint = number | "auto";
43
43
 
44
44
  export type BackdropBehavior = "block" | "passthrough" | "dismiss" | "collapse";
45
45
 
46
+ /**
47
+ * Controls how an inactive screen is retained after it is no longer active.
48
+ *
49
+ * - `keep`
50
+ * keep inactive screen mounted, attached, visible, not interactive
51
+ * RNS: activityState=1, visible=true
52
+ * React Activity: mode="visible"
53
+ *
54
+ * - `freeze`
55
+ * keep last painted UI visible but stop/suspend inactive work where platform allows
56
+ * RNS: activityState=1, visible=true, maybe freezeOnBlur/shouldFreeze later
57
+ * React Activity: mode="hidden" with paint preserved
58
+ *
59
+ * - `detach`
60
+ * remove inactive screen from native/view presentation after safe paint
61
+ * RNS: activityState=0, visible=false
62
+ * React Activity: mode="hidden" + display none, or equivalent
63
+ *
64
+ * - `unmount`
65
+ * actually remove React subtree when the inactive screen is safe to remove
66
+ * RNS native: only after safe paint for non-nested screens
67
+ * web: return null
68
+ */
69
+ export type InactiveBehavior = "keep" | "freeze" | "detach" | "unmount";
70
+
46
71
  export type TransitionAwareProps<T extends object> = AnimatedProps<T> & {
47
72
  /**
48
73
  * Connects this component to custom animated styles defined in screenStyleInterpolator.
@@ -18,6 +18,8 @@ export interface BaseStackRoute {
18
18
  params?: object;
19
19
  }
20
20
 
21
+ export type StackSceneActivity = "active" | "inert" | "inactive" | "closing";
22
+
21
23
  /**
22
24
  * Base navigation interface - minimal contract for gesture handling.
23
25
  * Both React Navigation helpers and ComponentNavigation satisfy this.
@@ -45,9 +47,16 @@ export interface BaseStackDescriptor<
45
47
  route: TRoute;
46
48
  navigation: TNavigation;
47
49
  options: TOptions;
50
+ activity?: StackSceneActivity;
48
51
  render?: () => React.JSX.Element | null;
49
52
  }
50
53
 
54
+ export type StackDescriptorSource<
55
+ TDescriptor extends BaseStackDescriptor = BaseStackDescriptor,
56
+ > = Omit<TDescriptor, "activity"> & {
57
+ activity?: StackSceneActivity;
58
+ };
59
+
51
60
  /**
52
61
  * Base scene interface - route + descriptor pair.
53
62
  * Used by all stack views to iterate over screens.
@@ -57,6 +66,8 @@ export interface BaseStackScene<
57
66
  > {
58
67
  route: TDescriptor["route"];
59
68
  descriptor: TDescriptor;
69
+ previousDescriptor?: TDescriptor;
70
+ nextDescriptor?: TDescriptor;
60
71
  }
61
72
 
62
73
  /**
@@ -6,12 +6,82 @@
6
6
  import {
7
7
  createContext,
8
8
  type ReactNode,
9
+ useCallback,
9
10
  useContext,
11
+ useLayoutEffect,
10
12
  useMemo,
11
13
  useRef,
14
+ useSyncExternalStore,
12
15
  } from "react";
13
16
 
14
- type InnerProviderComponent = (props: { children: ReactNode }) => ReactNode;
17
+ type InnerProviderComponent = React.FC<{ children: ReactNode }>;
18
+
19
+ type ProviderSnapshot<
20
+ ContextValue,
21
+ Guarded extends boolean,
22
+ > = Guarded extends true ? ContextValue : ContextValue | null;
23
+
24
+ type ProviderSelector<ContextValue, Guarded extends boolean, Selected> = (
25
+ value: ProviderSnapshot<ContextValue, Guarded>,
26
+ ) => Selected;
27
+
28
+ type ProviderStoreHook<ContextValue, Guarded extends boolean> = {
29
+ (): ProviderSnapshot<ContextValue, Guarded>;
30
+ <Selected>(
31
+ selector: ProviderSelector<ContextValue, Guarded, Selected>,
32
+ ): Selected;
33
+ };
34
+
35
+ type ProviderOptionalStoreHook<ContextValue> = {
36
+ (): ContextValue | null;
37
+ <Selected>(selector: (value: ContextValue | null) => Selected): Selected;
38
+ };
39
+
40
+ export interface ProviderStoreApi<ContextValue> {
41
+ getSnapshot: () => ContextValue | null;
42
+ subscribe: (listener: () => void) => () => void;
43
+ }
44
+
45
+ interface MutableProviderStoreApi<ContextValue>
46
+ extends ProviderStoreApi<ContextValue> {
47
+ notify: () => void;
48
+ setSnapshot: (snapshot: ContextValue | null) => boolean;
49
+ }
50
+
51
+ const NullProviderStore: ProviderStoreApi<never> = {
52
+ getSnapshot: () => null,
53
+ subscribe: () => () => {},
54
+ };
55
+
56
+ const createProviderStore = <ContextValue,>(
57
+ initialSnapshot: ContextValue | null,
58
+ ): MutableProviderStoreApi<ContextValue> => {
59
+ let snapshot = initialSnapshot;
60
+ const listeners = new Set<() => void>();
61
+
62
+ return {
63
+ getSnapshot: () => snapshot,
64
+ notify: () => {
65
+ for (const listener of listeners) {
66
+ listener();
67
+ }
68
+ },
69
+ setSnapshot: (nextSnapshot) => {
70
+ if (Object.is(snapshot, nextSnapshot)) {
71
+ return false;
72
+ }
73
+
74
+ snapshot = nextSnapshot;
75
+ return true;
76
+ },
77
+ subscribe: (listener) => {
78
+ listeners.add(listener);
79
+ return () => {
80
+ listeners.delete(listener);
81
+ };
82
+ },
83
+ };
84
+ };
15
85
 
16
86
  export default function createProvider<
17
87
  ProviderName extends string,
@@ -31,10 +101,17 @@ export default function createProvider<
31
101
  },
32
102
  ) => {
33
103
  const { guarded = true } = options ?? {};
104
+ const providerDisplayName = `${name}Provider`;
105
+ const innerProviderDisplayName = `${name}InnerProvider`;
34
106
 
35
107
  const Context = createContext<ContextValue | null>(null);
36
108
  Context.displayName = name;
37
109
 
110
+ const StoreContext = createContext<ProviderStoreApi<ContextValue> | null>(
111
+ null,
112
+ );
113
+ StoreContext.displayName = `${name}Store`;
114
+
38
115
  const Provider: React.FC<ProviderProps> = (props) => {
39
116
  const {
40
117
  children = (props as { children?: ReactNode }).children,
@@ -53,20 +130,46 @@ export default function createProvider<
53
130
  [enabled, value],
54
131
  );
55
132
 
133
+ const storeRef = useRef<MutableProviderStoreApi<ContextValue> | null>(
134
+ null,
135
+ );
136
+ const pendingNotifyRef = useRef(false);
137
+
138
+ if (storeRef.current === null) {
139
+ storeRef.current = createProviderStore<ContextValue>(memoValue);
140
+ }
141
+ const store = storeRef.current;
142
+
143
+ pendingNotifyRef.current =
144
+ store.setSnapshot(memoValue) || pendingNotifyRef.current;
145
+
146
+ useLayoutEffect(() => {
147
+ if (!pendingNotifyRef.current) {
148
+ return;
149
+ }
150
+
151
+ pendingNotifyRef.current = false;
152
+ store.notify();
153
+ });
154
+
56
155
  // Per-instance ref ensures InnerProvider reads latest value while keeping
57
156
  // a stable component reference.
58
157
  const valueRef = useRef<ContextValue | null>(memoValue);
59
158
  valueRef.current = memoValue;
60
159
 
61
- const InnerProvider = useMemo(
62
- (): InnerProviderComponent =>
63
- ({ children }) => (
160
+ const InnerProvider = useMemo((): InnerProviderComponent => {
161
+ const NamedInnerProvider: InnerProviderComponent = ({ children }) => (
162
+ <StoreContext.Provider value={store}>
64
163
  <Context.Provider value={valueRef.current}>
65
164
  {children}
66
165
  </Context.Provider>
67
- ),
68
- [],
69
- );
166
+ </StoreContext.Provider>
167
+ );
168
+
169
+ NamedInnerProvider.displayName = innerProviderDisplayName;
170
+
171
+ return NamedInnerProvider;
172
+ }, [store]);
70
173
 
71
174
  if (typeof children === "function") {
72
175
  return children({
@@ -74,8 +177,13 @@ export default function createProvider<
74
177
  } as { [K in ProviderName as `${K}Provider`]: InnerProviderComponent });
75
178
  }
76
179
 
77
- return <Context.Provider value={memoValue}>{children}</Context.Provider>;
180
+ return (
181
+ <StoreContext.Provider value={store}>
182
+ <Context.Provider value={memoValue}>{children}</Context.Provider>
183
+ </StoreContext.Provider>
184
+ );
78
185
  };
186
+ Provider.displayName = providerDisplayName;
79
187
 
80
188
  const useEnhancedContext = (): ContextValue | null => {
81
189
  const context = useContext(Context);
@@ -89,18 +197,85 @@ export default function createProvider<
89
197
  return context;
90
198
  };
91
199
 
200
+ const useStoreSelector = <Selected,>(
201
+ selector?: (value: ContextValue | null) => Selected,
202
+ ): Selected | ContextValue | null => {
203
+ const store = useContext(StoreContext);
204
+ const resolvedStore =
205
+ store ?? (NullProviderStore as ProviderStoreApi<ContextValue>);
206
+ const selectorRef = useRef<typeof selector>(selector);
207
+ selectorRef.current = selector;
208
+
209
+ const getSelectedSnapshot = useCallback(() => {
210
+ if (guarded && store === null) {
211
+ throw new Error(
212
+ `${name} store must be used within a ${name}Provider`,
213
+ );
214
+ }
215
+
216
+ const snapshot = resolvedStore.getSnapshot();
217
+
218
+ if (guarded && snapshot === null) {
219
+ throw new Error(
220
+ `${name} store must be used within an enabled ${name}Provider`,
221
+ );
222
+ }
223
+
224
+ return selectorRef.current ? selectorRef.current(snapshot) : snapshot;
225
+ }, [resolvedStore, store]);
226
+
227
+ return useSyncExternalStore(
228
+ resolvedStore.subscribe,
229
+ getSelectedSnapshot,
230
+ getSelectedSnapshot,
231
+ );
232
+ };
233
+
234
+ const useOptionalStoreSelector = <Selected,>(
235
+ selector?: (value: ContextValue | null) => Selected,
236
+ ): Selected | ContextValue | null => {
237
+ const store = useContext(StoreContext);
238
+ const resolvedStore =
239
+ store ?? (NullProviderStore as ProviderStoreApi<ContextValue>);
240
+ const selectorRef = useRef<typeof selector>(selector);
241
+ selectorRef.current = selector;
242
+
243
+ const getSelectedSnapshot = useCallback(() => {
244
+ const snapshot = resolvedStore.getSnapshot();
245
+ return selectorRef.current ? selectorRef.current(snapshot) : snapshot;
246
+ }, [resolvedStore]);
247
+
248
+ return useSyncExternalStore(
249
+ resolvedStore.subscribe,
250
+ getSelectedSnapshot,
251
+ getSelectedSnapshot,
252
+ );
253
+ };
254
+
92
255
  return {
93
256
  [`${name}Context`]: Context,
257
+ [`${name}StoreContext`]: StoreContext,
94
258
  [`${name}Provider`]: Provider,
95
259
  [`use${name}Context`]: useEnhancedContext,
260
+ [`use${name}Store`]: useStoreSelector,
261
+ [`use${name}OptionalStore`]: useOptionalStoreSelector,
96
262
  } as {
97
263
  [P in ProviderName as `${P}Context`]: React.Context<ContextValue>;
264
+ } & {
265
+ [P in ProviderName as `${P}StoreContext`]: React.Context<ProviderStoreApi<ContextValue> | null>;
98
266
  } & {
99
267
  [P in ProviderName as `${P}Provider`]: React.FC<ProviderProps>;
100
268
  } & {
101
269
  [P in ProviderName as `use${P}Context`]: () => Guarded extends true
102
270
  ? ContextValue
103
271
  : ContextValue | null;
272
+ } & {
273
+ [P in ProviderName as `use${P}Store`]: ProviderStoreHook<
274
+ ContextValue,
275
+ Guarded
276
+ >;
277
+ } & {
278
+ [P in ProviderName as `use${P}OptionalStore`]: ProviderOptionalStoreHook<ContextValue>;
104
279
  };
105
280
  };
106
281
  }
@@ -4,6 +4,7 @@ interface SceneWithKey {
4
4
  }
5
5
 
6
6
  type IsRouteClosing = (routeKey: string) => boolean;
7
+ type GetRouteClosingOrder = (routeKey: string) => number | undefined;
7
8
 
8
9
  const findPreviousDescriptor = <T extends SceneWithKey>(
9
10
  scenes: T[],
@@ -45,6 +46,7 @@ export function resolveSceneNeighbors<T extends SceneWithKey>(
45
46
  scenes: T[],
46
47
  sceneIndex: number,
47
48
  isRouteClosing: IsRouteClosing,
49
+ getRouteClosingOrder?: GetRouteClosingOrder,
48
50
  ): {
49
51
  previousDescriptor: T["descriptor"] | undefined;
50
52
  nextDescriptor: T["descriptor"] | undefined;
@@ -69,7 +71,8 @@ export function resolveSceneNeighbors<T extends SceneWithKey>(
69
71
  }
70
72
 
71
73
  let nextDescriptor: T["descriptor"] | undefined;
72
- let firstClosingAbove: T["descriptor"] | undefined;
74
+ let latestClosingAbove: T["descriptor"] | undefined;
75
+ let latestClosingAboveOrder = Number.NEGATIVE_INFINITY;
73
76
 
74
77
  for (let i = sceneIndex + 1; i < scenes.length; i++) {
75
78
  const candidate = scenes[i];
@@ -80,13 +83,15 @@ export function resolveSceneNeighbors<T extends SceneWithKey>(
80
83
  break;
81
84
  }
82
85
 
83
- if (firstClosingAbove === undefined) {
84
- firstClosingAbove = candidate.descriptor;
86
+ const closeOrder = getRouteClosingOrder?.(candidate.route.key) ?? i;
87
+ if (closeOrder >= latestClosingAboveOrder) {
88
+ latestClosingAbove = candidate.descriptor;
89
+ latestClosingAboveOrder = closeOrder;
85
90
  }
86
91
  }
87
92
 
88
93
  if (nextDescriptor === undefined) {
89
- nextDescriptor = firstClosingAbove;
94
+ nextDescriptor = latestClosingAbove;
90
95
  }
91
96
 
92
97
  const previousDescriptor = findPreviousDescriptor(
@@ -2,6 +2,8 @@ import type { useClosingRouteKeys } from "../../hooks/navigation/use-closing-rou
2
2
  import type { RouteWithKey } from "../../types/stack.types";
3
3
  import { composeDescriptors } from "./compose-descriptors";
4
4
 
5
+ type ClosingRouteKeys = Set<string> | ReturnType<typeof useClosingRouteKeys>;
6
+
5
7
  type SyncRoutesWithRemovedParams<
6
8
  Route extends RouteWithKey,
7
9
  DescriptorMap extends Record<string, unknown>,
@@ -10,7 +12,36 @@ type SyncRoutesWithRemovedParams<
10
12
  prevDescriptors: DescriptorMap;
11
13
  nextRoutes: Route[];
12
14
  nextDescriptors: DescriptorMap;
13
- closingRouteKeys: ReturnType<typeof useClosingRouteKeys>;
15
+ closingRouteKeys: ClosingRouteKeys;
16
+ };
17
+
18
+ const addClosingRouteKey = (
19
+ closingRouteKeys: ClosingRouteKeys,
20
+ key: string,
21
+ ) => {
22
+ closingRouteKeys.add(key);
23
+ };
24
+
25
+ const deleteClosingRouteKey = (
26
+ closingRouteKeys: ClosingRouteKeys,
27
+ key: string,
28
+ ) => {
29
+ if (closingRouteKeys instanceof Set) {
30
+ closingRouteKeys.delete(key);
31
+ return;
32
+ }
33
+
34
+ closingRouteKeys.remove(key);
35
+ };
36
+
37
+ const getClosingRouteKeyValues = (
38
+ closingRouteKeys: ClosingRouteKeys,
39
+ ): Iterable<string> => {
40
+ if (closingRouteKeys instanceof Set) {
41
+ return closingRouteKeys;
42
+ }
43
+
44
+ return closingRouteKeys.ref.current;
14
45
  };
15
46
 
16
47
  /**
@@ -60,16 +91,16 @@ export const syncRoutesWithRemoved = <
60
91
 
61
92
  if (nextRouteWasPresent && !previousRouteStillPresent) {
62
93
  // Previous route was removed, mark as closing
63
- closingRouteKeys.add(previousFocusedRoute.key);
94
+ addClosingRouteKey(closingRouteKeys, previousFocusedRoute.key);
64
95
 
65
96
  derivedRoutes.push(previousFocusedRoute);
66
97
  } else {
67
98
  // Next route is now active, not closing
68
- closingRouteKeys.remove(nextFocusedRoute.key);
99
+ deleteClosingRouteKey(closingRouteKeys, nextFocusedRoute.key);
69
100
 
70
101
  if (!previousRouteStillPresent) {
71
102
  // Previous route needs to be inserted for transition
72
- closingRouteKeys.remove(previousFocusedRoute.key);
103
+ deleteClosingRouteKey(closingRouteKeys, previousFocusedRoute.key);
73
104
 
74
105
  const insertIndex = Math.max(derivedRoutes.length - 1, 0);
75
106
  derivedRoutes.splice(insertIndex, 0, previousFocusedRoute);
@@ -77,14 +108,14 @@ export const syncRoutesWithRemoved = <
77
108
  }
78
109
  } else if (nextFocusedRoute) {
79
110
  // Same focused route, ensure it's not marked as closing
80
- closingRouteKeys.remove(nextFocusedRoute.key);
111
+ deleteClosingRouteKey(closingRouteKeys, nextFocusedRoute.key);
81
112
  }
82
113
 
83
114
  // Clean up closing keys that are no longer in the route list
84
115
  const activeKeys = new Set(derivedRoutes.map((route) => route.key));
85
- for (const key of Array.from(closingRouteKeys.ref.current)) {
116
+ for (const key of Array.from(getClosingRouteKeyValues(closingRouteKeys))) {
86
117
  if (!activeKeys.has(key)) {
87
- closingRouteKeys.remove(key);
118
+ deleteClosingRouteKey(closingRouteKeys, key);
88
119
  }
89
120
  }
90
121
 
@@ -0,0 +1,4 @@
1
+ export const getVisibilityBlockOffset = (viewportHeight: number): number => {
2
+ "worklet";
3
+ return viewportHeight * 2 + 1;
4
+ };