react-native-screen-transitions 3.6.0 → 3.7.0-beta.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 (397) 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 +69 -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 +57 -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/helpers/resolve-slot-styles/index.js +7 -28
  60. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js.map +1 -1
  61. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +16 -1
  62. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  63. package/lib/commonjs/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js +2 -14
  64. package/lib/commonjs/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js.map +1 -1
  65. package/lib/commonjs/shared/providers/stack/direct.provider.js +4 -3
  66. package/lib/commonjs/shared/providers/stack/direct.provider.js.map +1 -1
  67. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js +197 -0
  68. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js.map +1 -0
  69. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js +58 -0
  70. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js.map +1 -0
  71. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js +92 -0
  72. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js.map +1 -0
  73. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js +118 -0
  74. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js.map +1 -0
  75. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/types.js +6 -0
  76. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/helpers/types.js.map +1 -0
  77. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/index.js +24 -0
  78. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/index.js.map +1 -0
  79. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js +131 -0
  80. package/lib/commonjs/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js.map +1 -0
  81. package/lib/commonjs/shared/providers/stack/managed.provider.js +18 -29
  82. package/lib/commonjs/shared/providers/stack/managed.provider.js.map +1 -1
  83. package/lib/commonjs/shared/types/stack.types.js.map +1 -1
  84. package/lib/commonjs/shared/utils/bounds/navigation/reveal/build.js +4 -4
  85. package/lib/commonjs/shared/utils/bounds/navigation/reveal/build.js.map +1 -1
  86. package/lib/commonjs/shared/utils/bounds/navigation/reveal/config.js +2 -1
  87. package/lib/commonjs/shared/utils/bounds/navigation/reveal/config.js.map +1 -1
  88. package/lib/commonjs/shared/utils/create-provider.js +99 -10
  89. package/lib/commonjs/shared/utils/create-provider.js.map +1 -1
  90. package/lib/commonjs/shared/utils/navigation/resolve-scene-neighbors.js +8 -5
  91. package/lib/commonjs/shared/utils/navigation/resolve-scene-neighbors.js.map +1 -1
  92. package/lib/commonjs/shared/utils/navigation/sync-routes-with-removed.js +23 -6
  93. package/lib/commonjs/shared/utils/navigation/sync-routes-with-removed.js.map +1 -1
  94. package/lib/commonjs/shared/utils/visibility-block-offset.js +13 -0
  95. package/lib/commonjs/shared/utils/visibility-block-offset.js.map +1 -0
  96. package/lib/module/blank-stack/components/stack-view.js +36 -40
  97. package/lib/module/blank-stack/components/stack-view.js.map +1 -1
  98. package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js +7 -14
  99. package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
  100. package/lib/module/component-stack/components/stack-view.js +4 -11
  101. package/lib/module/component-stack/components/stack-view.js.map +1 -1
  102. package/lib/module/component-stack/navigators/create-component-stack-navigator.js +1 -1
  103. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +6 -0
  104. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  105. package/lib/module/shared/adapters/with-screen-transitions/context.js +23 -0
  106. package/lib/module/shared/adapters/with-screen-transitions/context.js.map +1 -0
  107. package/lib/module/shared/adapters/with-screen-transitions/index.js +65 -0
  108. package/lib/module/shared/adapters/with-screen-transitions/index.js.map +1 -0
  109. package/lib/module/shared/adapters/with-screen-transitions/options.js +52 -0
  110. package/lib/module/shared/adapters/with-screen-transitions/options.js.map +1 -0
  111. package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js +138 -0
  112. package/lib/module/shared/adapters/with-screen-transitions/stack-layout.js.map +1 -0
  113. package/lib/module/shared/adapters/with-screen-transitions/types.js +4 -0
  114. package/lib/module/shared/adapters/with-screen-transitions/types.js.map +1 -0
  115. package/lib/module/shared/components/activity/helpers.js +5 -0
  116. package/lib/module/shared/components/activity/helpers.js.map +1 -0
  117. package/lib/module/shared/components/activity/index.js +5 -0
  118. package/lib/module/shared/components/activity/index.js.map +1 -0
  119. package/lib/module/shared/components/activity/variants/activity-container.js +24 -0
  120. package/lib/module/shared/components/activity/variants/activity-container.js.map +1 -0
  121. package/lib/module/shared/components/activity/variants/activity-screen.js +103 -0
  122. package/lib/module/shared/components/activity/variants/activity-screen.js.map +1 -0
  123. package/lib/module/shared/components/create-boundary-component/hooks/use-measurer.js +11 -5
  124. package/lib/module/shared/components/create-boundary-component/hooks/use-measurer.js.map +1 -1
  125. package/lib/module/shared/components/create-boundary-component/utils/measured-bounds.js +11 -0
  126. package/lib/module/shared/components/create-boundary-component/utils/measured-bounds.js.map +1 -1
  127. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +8 -17
  128. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  129. package/lib/module/shared/components/screen-lifecycle/index.js +1 -1
  130. package/lib/module/shared/components/screen-lifecycle/index.js.map +1 -1
  131. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js +11 -5
  132. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  133. package/lib/module/shared/hooks/navigation/use-stack.js +63 -6
  134. package/lib/module/shared/hooks/navigation/use-stack.js.map +1 -1
  135. package/lib/module/shared/index.js +3 -0
  136. package/lib/module/shared/index.js.map +1 -1
  137. package/lib/module/shared/providers/screen/descriptors/descriptors.provider.js +17 -29
  138. package/lib/module/shared/providers/screen/descriptors/descriptors.provider.js.map +1 -1
  139. package/lib/module/shared/providers/screen/descriptors/index.js +1 -1
  140. package/lib/module/shared/providers/screen/descriptors/index.js.map +1 -1
  141. package/lib/module/shared/providers/screen/gestures/ownership/resolve-ownership.js +2 -1
  142. package/lib/module/shared/providers/screen/gestures/ownership/resolve-ownership.js.map +1 -1
  143. package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js +2 -2
  144. package/lib/module/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.js.map +1 -1
  145. package/lib/module/shared/providers/screen/gestures/pan/pan-lifecycle.js +5 -2
  146. package/lib/module/shared/providers/screen/gestures/pan/pan-lifecycle.js.map +1 -1
  147. package/lib/module/shared/providers/screen/gestures/pan/use-pan-behavior.js +4 -3
  148. package/lib/module/shared/providers/screen/gestures/pan/use-pan-behavior.js.map +1 -1
  149. package/lib/module/shared/providers/screen/gestures/pinch/pinch-lifecycle.js +5 -2
  150. package/lib/module/shared/providers/screen/gestures/pinch/pinch-lifecycle.js.map +1 -1
  151. package/lib/module/shared/providers/screen/gestures/pinch/use-pinch-behavior.js +4 -3
  152. package/lib/module/shared/providers/screen/gestures/pinch/use-pinch-behavior.js.map +1 -1
  153. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js +7 -28
  154. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js.map +1 -1
  155. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +16 -1
  156. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  157. package/lib/module/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js +3 -15
  158. package/lib/module/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js.map +1 -1
  159. package/lib/module/shared/providers/stack/direct.provider.js +5 -4
  160. package/lib/module/shared/providers/stack/direct.provider.js.map +1 -1
  161. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js +192 -0
  162. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.js.map +1 -0
  163. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js +53 -0
  164. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.js.map +1 -0
  165. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js +78 -0
  166. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.js.map +1 -0
  167. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js +113 -0
  168. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.js.map +1 -0
  169. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/types.js +4 -0
  170. package/lib/module/shared/providers/stack/helpers/managed-stack-state/helpers/types.js.map +1 -0
  171. package/lib/module/shared/providers/stack/helpers/managed-stack-state/index.js +19 -0
  172. package/lib/module/shared/providers/stack/helpers/managed-stack-state/index.js.map +1 -0
  173. package/lib/module/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js +126 -0
  174. package/lib/module/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.js.map +1 -0
  175. package/lib/module/shared/providers/stack/managed.provider.js +19 -30
  176. package/lib/module/shared/providers/stack/managed.provider.js.map +1 -1
  177. package/lib/module/shared/types/stack.types.js.map +1 -1
  178. package/lib/module/shared/utils/bounds/navigation/reveal/build.js +5 -5
  179. package/lib/module/shared/utils/bounds/navigation/reveal/build.js.map +1 -1
  180. package/lib/module/shared/utils/bounds/navigation/reveal/config.js +1 -0
  181. package/lib/module/shared/utils/bounds/navigation/reveal/config.js.map +1 -1
  182. package/lib/module/shared/utils/create-provider.js +100 -11
  183. package/lib/module/shared/utils/create-provider.js.map +1 -1
  184. package/lib/module/shared/utils/navigation/resolve-scene-neighbors.js +8 -5
  185. package/lib/module/shared/utils/navigation/resolve-scene-neighbors.js.map +1 -1
  186. package/lib/module/shared/utils/navigation/sync-routes-with-removed.js +23 -6
  187. package/lib/module/shared/utils/navigation/sync-routes-with-removed.js.map +1 -1
  188. package/lib/module/shared/utils/visibility-block-offset.js +8 -0
  189. package/lib/module/shared/utils/visibility-block-offset.js.map +1 -0
  190. package/lib/typescript/blank-stack/components/stack-view.d.ts.map +1 -1
  191. package/lib/typescript/blank-stack/index.d.ts +1 -1
  192. package/lib/typescript/blank-stack/index.d.ts.map +1 -1
  193. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts +4 -6
  194. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts.map +1 -1
  195. package/lib/typescript/blank-stack/types.d.ts +41 -29
  196. package/lib/typescript/blank-stack/types.d.ts.map +1 -1
  197. package/lib/typescript/component-stack/components/stack-view.d.ts.map +1 -1
  198. package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts +1 -1
  199. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +5 -0
  200. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -1
  201. package/lib/typescript/native-stack/types.d.ts +25 -0
  202. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  203. package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts +15 -0
  204. package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts.map +1 -0
  205. package/lib/typescript/shared/adapters/with-screen-transitions/index.d.ts +10 -0
  206. package/lib/typescript/shared/adapters/with-screen-transitions/index.d.ts.map +1 -0
  207. package/lib/typescript/shared/adapters/with-screen-transitions/options.d.ts +9 -0
  208. package/lib/typescript/shared/adapters/with-screen-transitions/options.d.ts.map +1 -0
  209. package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts +12 -0
  210. package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts.map +1 -0
  211. package/lib/typescript/shared/adapters/with-screen-transitions/types.d.ts +24 -0
  212. package/lib/typescript/shared/adapters/with-screen-transitions/types.d.ts.map +1 -0
  213. package/lib/typescript/shared/components/activity/helpers.d.ts +4 -0
  214. package/lib/typescript/shared/components/activity/helpers.d.ts.map +1 -0
  215. package/lib/typescript/shared/components/activity/index.d.ts +3 -0
  216. package/lib/typescript/shared/components/activity/index.d.ts.map +1 -0
  217. package/lib/typescript/shared/components/activity/variants/activity-container.d.ts +6 -0
  218. package/lib/typescript/shared/components/activity/variants/activity-container.d.ts.map +1 -0
  219. package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts +13 -0
  220. package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts.map +1 -0
  221. package/lib/typescript/shared/components/create-boundary-component/hooks/use-measurer.d.ts.map +1 -1
  222. package/lib/typescript/shared/components/create-boundary-component/index.d.ts +2 -2
  223. package/lib/typescript/shared/components/create-boundary-component/utils/measured-bounds.d.ts +1 -0
  224. package/lib/typescript/shared/components/create-boundary-component/utils/measured-bounds.d.ts.map +1 -1
  225. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts +1 -2
  226. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts.map +1 -1
  227. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts +1 -0
  228. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts.map +1 -1
  229. package/lib/typescript/shared/hooks/navigation/use-stack.d.ts +13 -1
  230. package/lib/typescript/shared/hooks/navigation/use-stack.d.ts.map +1 -1
  231. package/lib/typescript/shared/index.d.ts +15 -11
  232. package/lib/typescript/shared/index.d.ts.map +1 -1
  233. package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts +11 -3
  234. package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts.map +1 -1
  235. package/lib/typescript/shared/providers/screen/descriptors/index.d.ts +1 -1
  236. package/lib/typescript/shared/providers/screen/descriptors/index.d.ts.map +1 -1
  237. package/lib/typescript/shared/providers/screen/gestures/ownership/resolve-ownership.d.ts.map +1 -1
  238. package/lib/typescript/shared/providers/screen/gestures/pan/pan-lifecycle.d.ts +1 -1
  239. package/lib/typescript/shared/providers/screen/gestures/pan/pan-lifecycle.d.ts.map +1 -1
  240. package/lib/typescript/shared/providers/screen/gestures/pan/use-pan-behavior.d.ts.map +1 -1
  241. package/lib/typescript/shared/providers/screen/gestures/pinch/pinch-lifecycle.d.ts +1 -1
  242. package/lib/typescript/shared/providers/screen/gestures/pinch/pinch-lifecycle.d.ts.map +1 -1
  243. package/lib/typescript/shared/providers/screen/gestures/pinch/use-pinch-behavior.d.ts.map +1 -1
  244. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/index.d.ts +1 -2
  245. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/index.d.ts.map +1 -1
  246. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts +3 -1
  247. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts.map +1 -1
  248. package/lib/typescript/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.d.ts.map +1 -1
  249. package/lib/typescript/shared/providers/stack/direct.provider.d.ts.map +1 -1
  250. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.d.ts +13 -0
  251. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.d.ts.map +1 -0
  252. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.d.ts +12 -0
  253. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.d.ts.map +1 -0
  254. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.d.ts +13 -0
  255. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.d.ts.map +1 -0
  256. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.d.ts +12 -0
  257. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.d.ts.map +1 -0
  258. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/types.d.ts +40 -0
  259. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/helpers/types.d.ts.map +1 -0
  260. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/index.d.ts +12 -0
  261. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/index.d.ts.map +1 -0
  262. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.d.ts +13 -0
  263. package/lib/typescript/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.d.ts.map +1 -0
  264. package/lib/typescript/shared/providers/stack/managed.provider.d.ts.map +1 -1
  265. package/lib/typescript/shared/types/bounds.types.d.ts +19 -0
  266. package/lib/typescript/shared/types/bounds.types.d.ts.map +1 -1
  267. package/lib/typescript/shared/types/index.d.ts +2 -2
  268. package/lib/typescript/shared/types/index.d.ts.map +1 -1
  269. package/lib/typescript/shared/types/providers/managed-stack.types.d.ts +3 -9
  270. package/lib/typescript/shared/types/providers/managed-stack.types.d.ts.map +1 -1
  271. package/lib/typescript/shared/types/screen.types.d.ts +24 -0
  272. package/lib/typescript/shared/types/screen.types.d.ts.map +1 -1
  273. package/lib/typescript/shared/types/stack.types.d.ts +7 -0
  274. package/lib/typescript/shared/types/stack.types.d.ts.map +1 -1
  275. package/lib/typescript/shared/utils/bounds/navigation/reveal/build.d.ts.map +1 -1
  276. package/lib/typescript/shared/utils/bounds/navigation/reveal/config.d.ts +1 -0
  277. package/lib/typescript/shared/utils/bounds/navigation/reveal/config.d.ts.map +1 -1
  278. package/lib/typescript/shared/utils/create-provider.d.ts +17 -3
  279. package/lib/typescript/shared/utils/create-provider.d.ts.map +1 -1
  280. package/lib/typescript/shared/utils/navigation/resolve-scene-neighbors.d.ts +2 -1
  281. package/lib/typescript/shared/utils/navigation/resolve-scene-neighbors.d.ts.map +1 -1
  282. package/lib/typescript/shared/utils/navigation/sync-routes-with-removed.d.ts +2 -1
  283. package/lib/typescript/shared/utils/navigation/sync-routes-with-removed.d.ts.map +1 -1
  284. package/lib/typescript/shared/utils/visibility-block-offset.d.ts +2 -0
  285. package/lib/typescript/shared/utils/visibility-block-offset.d.ts.map +1 -0
  286. package/package.json +11 -1
  287. package/src/blank-stack/components/stack-view.tsx +54 -48
  288. package/src/blank-stack/index.ts +1 -0
  289. package/src/blank-stack/navigators/create-blank-stack-navigator.tsx +7 -15
  290. package/src/blank-stack/types.ts +44 -29
  291. package/src/component-stack/components/stack-view.tsx +4 -11
  292. package/src/component-stack/navigators/create-component-stack-navigator.tsx +1 -1
  293. package/src/native-stack/navigators/createNativeStackNavigator.tsx +5 -0
  294. package/src/native-stack/types.ts +25 -0
  295. package/src/shared/adapters/with-screen-transitions/context.tsx +42 -0
  296. package/src/shared/adapters/with-screen-transitions/index.tsx +150 -0
  297. package/src/shared/adapters/with-screen-transitions/options.ts +101 -0
  298. package/src/shared/adapters/with-screen-transitions/stack-layout.tsx +233 -0
  299. package/src/shared/adapters/with-screen-transitions/types.ts +28 -0
  300. package/src/shared/components/activity/helpers.ts +8 -0
  301. package/src/shared/components/activity/index.tsx +2 -0
  302. package/src/shared/components/activity/variants/activity-container.tsx +25 -0
  303. package/src/shared/components/activity/variants/activity-screen.tsx +133 -0
  304. package/src/shared/components/create-boundary-component/hooks/use-measurer.ts +23 -4
  305. package/src/shared/components/create-boundary-component/utils/measured-bounds.ts +15 -0
  306. package/src/shared/components/screen-lifecycle/hooks/use-close-transition-intent.ts +9 -26
  307. package/src/shared/components/screen-lifecycle/index.tsx +1 -1
  308. package/src/shared/hooks/navigation/use-navigation-helpers.ts +9 -3
  309. package/src/shared/hooks/navigation/use-stack.tsx +115 -6
  310. package/src/shared/index.ts +5 -0
  311. package/src/shared/providers/screen/descriptors/descriptors.provider.tsx +31 -31
  312. package/src/shared/providers/screen/descriptors/index.tsx +1 -0
  313. package/src/shared/providers/screen/gestures/ownership/resolve-ownership.ts +2 -1
  314. package/src/shared/providers/screen/gestures/ownership/use-walk-up-and-register-shadowing-claims.ts +2 -2
  315. package/src/shared/providers/screen/gestures/pan/pan-lifecycle.ts +7 -2
  316. package/src/shared/providers/screen/gestures/pan/use-pan-behavior.ts +10 -2
  317. package/src/shared/providers/screen/gestures/pinch/pinch-lifecycle.ts +7 -2
  318. package/src/shared/providers/screen/gestures/pinch/use-pinch-behavior.ts +8 -3
  319. package/src/shared/providers/screen/styles/helpers/resolve-slot-styles/index.ts +12 -53
  320. package/src/shared/providers/screen/styles/hooks/use-maybe-block-visibility.tsx +17 -1
  321. package/src/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.tsx +3 -16
  322. package/src/shared/providers/stack/direct.provider.tsx +13 -4
  323. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/build-managed-stack-state.ts +365 -0
  324. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/derive-managed-stack-state.ts +121 -0
  325. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/helpers.ts +158 -0
  326. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/reconcile-managed-routes.ts +188 -0
  327. package/src/shared/providers/stack/helpers/managed-stack-state/helpers/types.ts +57 -0
  328. package/src/shared/providers/stack/helpers/managed-stack-state/index.ts +40 -0
  329. package/src/shared/providers/stack/helpers/managed-stack-state/managed-stack-controller.ts +160 -0
  330. package/src/shared/providers/stack/managed.provider.tsx +23 -39
  331. package/src/shared/types/bounds.types.ts +19 -0
  332. package/src/shared/types/index.ts +3 -0
  333. package/src/shared/types/providers/managed-stack.types.ts +6 -8
  334. package/src/shared/types/screen.types.ts +25 -0
  335. package/src/shared/types/stack.types.ts +11 -0
  336. package/src/shared/utils/bounds/navigation/reveal/build.ts +10 -6
  337. package/src/shared/utils/bounds/navigation/reveal/config.ts +1 -0
  338. package/src/shared/utils/create-provider.tsx +183 -8
  339. package/src/shared/utils/navigation/resolve-scene-neighbors.ts +9 -4
  340. package/src/shared/utils/navigation/sync-routes-with-removed.ts +38 -7
  341. package/src/shared/utils/visibility-block-offset.ts +4 -0
  342. package/lib/commonjs/blank-stack/components/stack-view.native.js +0 -64
  343. package/lib/commonjs/blank-stack/components/stack-view.native.js.map +0 -1
  344. package/lib/commonjs/shared/components/native-screen-container.js +0 -42
  345. package/lib/commonjs/shared/components/native-screen-container.js.map +0 -1
  346. package/lib/commonjs/shared/components/native-screen.js +0 -125
  347. package/lib/commonjs/shared/components/native-screen.js.map +0 -1
  348. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js +0 -51
  349. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js.map +0 -1
  350. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js +0 -15
  351. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js.map +0 -1
  352. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js +0 -14
  353. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js.map +0 -1
  354. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js +0 -13
  355. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js.map +0 -1
  356. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/index.js +0 -101
  357. package/lib/commonjs/shared/providers/stack/helpers/use-local-routes/index.js.map +0 -1
  358. package/lib/module/blank-stack/components/stack-view.native.js +0 -60
  359. package/lib/module/blank-stack/components/stack-view.native.js.map +0 -1
  360. package/lib/module/shared/components/native-screen-container.js +0 -37
  361. package/lib/module/shared/components/native-screen-container.js.map +0 -1
  362. package/lib/module/shared/components/native-screen.js +0 -119
  363. package/lib/module/shared/components/native-screen.js.map +0 -1
  364. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js +0 -47
  365. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.js.map +0 -1
  366. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js +0 -10
  367. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.js.map +0 -1
  368. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js +0 -9
  369. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.js.map +0 -1
  370. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js +0 -8
  371. package/lib/module/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.js.map +0 -1
  372. package/lib/module/shared/providers/stack/helpers/use-local-routes/index.js +0 -95
  373. package/lib/module/shared/providers/stack/helpers/use-local-routes/index.js.map +0 -1
  374. package/lib/typescript/blank-stack/components/stack-view.native.d.ts +0 -3
  375. package/lib/typescript/blank-stack/components/stack-view.native.d.ts.map +0 -1
  376. package/lib/typescript/shared/components/native-screen-container.d.ts +0 -6
  377. package/lib/typescript/shared/components/native-screen-container.d.ts.map +0 -1
  378. package/lib/typescript/shared/components/native-screen.d.ts +0 -12
  379. package/lib/typescript/shared/components/native-screen.d.ts.map +0 -1
  380. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.d.ts +0 -10
  381. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.d.ts.map +0 -1
  382. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.d.ts +0 -2
  383. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.d.ts.map +0 -1
  384. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.d.ts +0 -3
  385. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.d.ts.map +0 -1
  386. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.d.ts +0 -3
  387. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.d.ts.map +0 -1
  388. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/index.d.ts +0 -19
  389. package/lib/typescript/shared/providers/stack/helpers/use-local-routes/index.d.ts.map +0 -1
  390. package/src/blank-stack/components/stack-view.native.tsx +0 -74
  391. package/src/shared/components/native-screen-container.tsx +0 -33
  392. package/src/shared/components/native-screen.tsx +0 -176
  393. package/src/shared/providers/stack/helpers/use-local-routes/helpers/align-routes-with-latest.ts +0 -65
  394. package/src/shared/providers/stack/helpers/use-local-routes/helpers/are-descriptors-equal.ts +0 -15
  395. package/src/shared/providers/stack/helpers/use-local-routes/helpers/have-same-route-keys.ts +0 -12
  396. package/src/shared/providers/stack/helpers/use-local-routes/helpers/routes-are-identical.ts +0 -11
  397. package/src/shared/providers/stack/helpers/use-local-routes/index.ts +0 -147
@@ -1,3 +1,4 @@
1
+ import { useWindowDimensions } from "react-native";
1
2
  import {
2
3
  useAnimatedProps,
3
4
  useAnimatedReaction,
@@ -6,10 +7,12 @@ import {
6
7
  } from "react-native-reanimated";
7
8
  import { AnimationStore } from "../../../../stores/animation.store";
8
9
  import { SystemStore } from "../../../../stores/system.store";
10
+ import { getVisibilityBlockOffset } from "../../../../utils/visibility-block-offset";
9
11
  import { useDescriptorDerivations } from "../../descriptors";
10
12
  import { resolveScreenVisibilityGate } from "../helpers/visibility-gate";
11
13
 
12
14
  export const useMaybeBlockVisibility = (isFloatingOverlay?: boolean) => {
15
+ const { height } = useWindowDimensions();
13
16
  const { currentScreenKey } = useDescriptorDerivations();
14
17
  const { entering, progress } = AnimationStore.getBag(currentScreenKey);
15
18
 
@@ -54,8 +57,21 @@ export const useMaybeBlockVisibility = (isFloatingOverlay?: boolean) => {
54
57
 
55
58
  const animatedStyle = useAnimatedStyle(() => {
56
59
  "worklet";
60
+ /**
61
+ * Keep blocked screens physically offscreen. On physical devices,
62
+ * opacity: 0 can break Liquid Glass sampling.
63
+ *
64
+ * See: https://github.com/expo/expo/issues/41024
65
+ *
66
+ */
67
+ const offset = getVisibilityBlockOffset(height);
68
+
57
69
  return {
58
- opacity: shouldBlockVisibility.get() ? 0 : 1,
70
+ transform: [
71
+ {
72
+ translateY: shouldBlockVisibility.get() ? offset : 0,
73
+ },
74
+ ],
59
75
  };
60
76
  });
61
77
 
@@ -3,9 +3,8 @@ import {
3
3
  useDerivedValue,
4
4
  useSharedValue,
5
5
  } from "react-native-reanimated";
6
- import { NO_STYLES } from "../../../../constants";
6
+ import { NO_PROPS, NO_STYLES } from "../../../../constants";
7
7
  import type { NormalizedTransitionInterpolatedStyle } from "../../../../types/animation.types";
8
- import { useScreenAnimationContext } from "../../animation";
9
8
  import {
10
9
  type LocalStyleLayers,
11
10
  type ResettableStyleStatesBySlot,
@@ -22,30 +21,18 @@ export const useResolvedStylesMap = ({
22
21
  localStylesMaps,
23
22
  ancestorStylesMap,
24
23
  }: UseResolvedStylesMapParams) => {
25
- const { screenInterpolatorProps, screenInterpolatorPropsRevision } =
26
- useScreenAnimationContext();
27
- const previousStyleStatesBySlot = useSharedValue<ResettableStyleStatesBySlot>(
28
- {},
29
- );
24
+ const previousStyleStatesBySlot =
25
+ useSharedValue<ResettableStyleStatesBySlot>(NO_PROPS);
30
26
  const previousResolvedStylesMap =
31
27
  useSharedValue<NormalizedTransitionInterpolatedStyle>(NO_STYLES);
32
28
 
33
29
  return useDerivedValue(() => {
34
30
  "worklet";
35
- screenInterpolatorPropsRevision.get();
36
-
37
- const props = screenInterpolatorProps.get();
38
- // Keep missing local slots alive only when another route drives this screen
39
- // and no active local style layer is available. Once a current/next layer
40
- // runs, omitted local slots and dropped keys are intentional reset signals.
41
- const deferLocalSlotResets = !props.focused && !props.current.closing;
42
-
43
31
  const { resolvedStylesMap, nextPreviousStyleStatesBySlot } =
44
32
  resolveSlotStyles({
45
33
  localStylesMaps: localStylesMaps.get(),
46
34
  ancestorStylesMap: ancestorStylesMap?.get() ?? NO_STYLES,
47
35
  previousStyleStatesBySlot: previousStyleStatesBySlot.get(),
48
- deferLocalSlotResets,
49
36
  });
50
37
 
51
38
  previousStyleStatesBySlot.set(nextPreviousStyleStatesBySlot);
@@ -2,8 +2,8 @@ import type * as React from "react";
2
2
  import { useMemo } from "react";
3
3
  import type { NativeStackDescriptorMap } from "../../../native-stack/types";
4
4
  import {
5
- StackContext,
6
5
  type StackContextValue,
6
+ StackProvider,
7
7
  } from "../../hooks/navigation/use-stack";
8
8
  import {
9
9
  AnimationStore,
@@ -91,8 +91,17 @@ function useDirectStackValue(
91
91
  routes: allRoutes,
92
92
  scenes,
93
93
  optimisticFocusedIndex,
94
+ focusedIndex,
94
95
  }),
95
- [flags, navigatorKey, routeKeys, allRoutes, scenes, optimisticFocusedIndex],
96
+ [
97
+ flags,
98
+ navigatorKey,
99
+ routeKeys,
100
+ allRoutes,
101
+ scenes,
102
+ optimisticFocusedIndex,
103
+ focusedIndex,
104
+ ],
96
105
  );
97
106
 
98
107
  // DirectStack context value
@@ -125,9 +134,9 @@ function withDirectStack<TProps extends DirectStackProps>(
125
134
  const { stackContextValue, ...lifecycleValue } = useDirectStackValue(props);
126
135
 
127
136
  return (
128
- <StackContext.Provider value={stackContextValue}>
137
+ <StackProvider value={stackContextValue}>
129
138
  <Component {...lifecycleValue} />
130
- </StackContext.Provider>
139
+ </StackProvider>
131
140
  );
132
141
  };
133
142
  }
@@ -0,0 +1,365 @@
1
+ import type { ManagedStackProps } from "../../../../../types/providers/managed-stack.types";
2
+ import type {
3
+ BaseStackDescriptor,
4
+ BaseStackNavigation,
5
+ BaseStackScene,
6
+ StackDescriptorSource,
7
+ StackSceneActivity,
8
+ } from "../../../../../types/stack.types";
9
+ import { resolveSceneNeighbors } from "../../../../../utils/navigation/resolve-scene-neighbors";
10
+ import { isOverlayVisible } from "../../../../../utils/overlay/visibility";
11
+ import {
12
+ areDescriptorSourcesEquivalent,
13
+ areDescriptorsEqual,
14
+ areRouteChildStateMapsEqual,
15
+ getRouteChildState,
16
+ routeKeyListsAreEqual,
17
+ setsAreEqual,
18
+ } from "./helpers";
19
+ import type {
20
+ LocalRoutesState,
21
+ ManagedDescriptorSources,
22
+ ManagedDescriptors,
23
+ ManagedRoutes,
24
+ SceneActivityWindow,
25
+ } from "./types";
26
+
27
+ type BuildManagedStackStateParams<
28
+ TDescriptor extends BaseStackDescriptor,
29
+ TNavigation extends BaseStackNavigation,
30
+ > = {
31
+ props: ManagedStackProps<TDescriptor, TNavigation>;
32
+ routes: ManagedRoutes<TDescriptor>;
33
+ descriptors: ManagedDescriptorSources<TDescriptor>;
34
+ closingRouteKeys: ReadonlySet<string>;
35
+ previousState?: LocalRoutesState<TDescriptor>;
36
+ };
37
+
38
+ const resolveStableDescriptorSource = <
39
+ TDescriptor extends BaseStackDescriptor,
40
+ >({
41
+ routeKey,
42
+ sourceDescriptor,
43
+ previousState,
44
+ }: {
45
+ routeKey: string;
46
+ sourceDescriptor: StackDescriptorSource<TDescriptor>;
47
+ previousState?: LocalRoutesState<TDescriptor>;
48
+ }): StackDescriptorSource<TDescriptor> => {
49
+ const previousSourceDescriptor = previousState?.sourceDescriptors[routeKey];
50
+
51
+ if (
52
+ previousSourceDescriptor &&
53
+ areDescriptorSourcesEquivalent(previousSourceDescriptor, sourceDescriptor)
54
+ ) {
55
+ return previousSourceDescriptor;
56
+ }
57
+
58
+ return sourceDescriptor;
59
+ };
60
+
61
+ const getSceneActivity = ({
62
+ focusedIndex,
63
+ isClosing,
64
+ sceneIndex,
65
+ topIndex,
66
+ topIsClosing,
67
+ }: SceneActivityWindow & {
68
+ isClosing: boolean;
69
+ sceneIndex: number;
70
+ }): StackSceneActivity => {
71
+ if (isClosing) {
72
+ return "closing";
73
+ }
74
+
75
+ if (topIsClosing) {
76
+ return sceneIndex === focusedIndex ? "inert" : "inactive";
77
+ }
78
+
79
+ if (sceneIndex === topIndex) {
80
+ return "active";
81
+ }
82
+
83
+ if (sceneIndex === topIndex - 1) {
84
+ return "inert";
85
+ }
86
+
87
+ return "inactive";
88
+ };
89
+
90
+ const getSceneActivityWindow = <
91
+ TDescriptor extends BaseStackDescriptor,
92
+ TNavigation extends BaseStackNavigation,
93
+ >({
94
+ props,
95
+ routes,
96
+ closingRouteKeys,
97
+ }: BuildManagedStackStateParams<
98
+ TDescriptor,
99
+ TNavigation
100
+ >): SceneActivityWindow => {
101
+ const focusedRouteKey = props.state.routes[props.state.index]?.key;
102
+
103
+ let focusedIndex = routes.findIndex((route) => route.key === focusedRouteKey);
104
+
105
+ if (focusedIndex === -1) {
106
+ throw new Error(
107
+ `Focused route "${focusedRouteKey}" is missing from routes`,
108
+ );
109
+ }
110
+
111
+ while (focusedIndex > 0 && closingRouteKeys.has(routes[focusedIndex]?.key)) {
112
+ focusedIndex--;
113
+ }
114
+
115
+ const topIndex = routes.length - 1;
116
+ const topRoute = routes[topIndex];
117
+ const topIsClosing =
118
+ topRoute !== undefined && closingRouteKeys.has(topRoute.key);
119
+
120
+ return {
121
+ focusedIndex,
122
+ topIndex,
123
+ topIsClosing,
124
+ };
125
+ };
126
+
127
+ const withDescriptorActivityState = <TDescriptor extends BaseStackDescriptor>(
128
+ descriptor: StackDescriptorSource<TDescriptor>,
129
+ activity: StackSceneActivity,
130
+ ): TDescriptor => {
131
+ if (descriptor.activity === activity) {
132
+ return descriptor as TDescriptor;
133
+ }
134
+
135
+ return {
136
+ ...descriptor,
137
+ activity,
138
+ } as TDescriptor;
139
+ };
140
+
141
+ const buildBaseScenes = <
142
+ TDescriptor extends BaseStackDescriptor,
143
+ TNavigation extends BaseStackNavigation,
144
+ >({
145
+ routes,
146
+ descriptors,
147
+ closingRouteKeys,
148
+ previousState,
149
+ activityWindow,
150
+ }: BuildManagedStackStateParams<TDescriptor, TNavigation> & {
151
+ activityWindow: SceneActivityWindow;
152
+ }) => {
153
+ const routeKeys: string[] = [];
154
+ const scenes: BaseStackScene<TDescriptor>[] = [];
155
+ const routeChildStates: Record<string, unknown> = {};
156
+ const sourceDescriptors = {} as ManagedDescriptorSources<TDescriptor>;
157
+ const managedDescriptors = {} as ManagedDescriptors<TDescriptor>;
158
+ let shouldShowFloatOverlay = false;
159
+
160
+ for (let sceneIndex = 0; sceneIndex < routes.length; sceneIndex++) {
161
+ const route = routes[sceneIndex] as TDescriptor["route"];
162
+
163
+ const rawSourceDescriptor = descriptors[route.key] as
164
+ | StackDescriptorSource<TDescriptor>
165
+ | undefined;
166
+
167
+ if (!rawSourceDescriptor) {
168
+ throw new Error(`Missing descriptor for route "${route.key}"`);
169
+ }
170
+
171
+ const routeChildState = getRouteChildState(route);
172
+ const childStateUnchanged =
173
+ !previousState ||
174
+ Object.is(previousState.routeChildStates[route.key], routeChildState);
175
+
176
+ const sourceDescriptor = childStateUnchanged
177
+ ? resolveStableDescriptorSource({
178
+ routeKey: route.key,
179
+ sourceDescriptor: rawSourceDescriptor,
180
+ previousState,
181
+ })
182
+ : rawSourceDescriptor;
183
+
184
+ const activity = getSceneActivity({
185
+ ...activityWindow,
186
+ isClosing: closingRouteKeys.has(route.key),
187
+ sceneIndex,
188
+ });
189
+
190
+ const previousDescriptor = previousState?.descriptors[route.key];
191
+ const descriptor =
192
+ previousDescriptor &&
193
+ childStateUnchanged &&
194
+ previousDescriptor.route === sourceDescriptor.route &&
195
+ previousDescriptor.navigation === sourceDescriptor.navigation &&
196
+ previousDescriptor.options === sourceDescriptor.options &&
197
+ previousDescriptor.activity === activity
198
+ ? previousDescriptor
199
+ : withDescriptorActivityState(sourceDescriptor, activity);
200
+
201
+ routeKeys.push(route.key);
202
+ routeChildStates[route.key] = routeChildState;
203
+ sourceDescriptors[route.key] = sourceDescriptor;
204
+ managedDescriptors[route.key] = descriptor;
205
+
206
+ if (!shouldShowFloatOverlay) {
207
+ shouldShowFloatOverlay = isOverlayVisible(sourceDescriptor?.options);
208
+ }
209
+
210
+ scenes.push({
211
+ route: descriptor.route,
212
+ descriptor,
213
+ });
214
+ }
215
+
216
+ return {
217
+ scenes,
218
+ routeChildStates,
219
+ sourceDescriptors,
220
+ descriptors: managedDescriptors,
221
+ routeKeys,
222
+ shouldShowFloatOverlay,
223
+ };
224
+ };
225
+
226
+ const withSceneRelationships = <TDescriptor extends BaseStackDescriptor>({
227
+ scenes,
228
+ sourceDescriptors,
229
+ closingRouteKeys,
230
+ previousState,
231
+ }: {
232
+ scenes: BaseStackScene<TDescriptor>[];
233
+ sourceDescriptors: ManagedDescriptorSources<TDescriptor>;
234
+ closingRouteKeys: ReadonlySet<string>;
235
+ previousState?: LocalRoutesState<TDescriptor>;
236
+ }): BaseStackScene<TDescriptor>[] => {
237
+ const isRouteClosing = (routeKey: string) => closingRouteKeys.has(routeKey);
238
+
239
+ const closingRouteOrder = new Map(
240
+ Array.from(closingRouteKeys, (routeKey, index) => [routeKey, index]),
241
+ );
242
+
243
+ const previousScenesByRouteKey = previousState
244
+ ? new Map(previousState.scenes.map((scene) => [scene.route.key, scene]))
245
+ : undefined;
246
+
247
+ let reusedEveryScene =
248
+ previousState !== undefined &&
249
+ scenes.length === previousState.scenes.length;
250
+
251
+ const relationshipScenes = scenes.map((scene) => ({
252
+ route: scene.route,
253
+ descriptor: (sourceDescriptors[scene.route.key] ??
254
+ scene.descriptor) as TDescriptor,
255
+ }));
256
+
257
+ const nextScenes = scenes.map((scene, sceneIndex) => {
258
+ const { previousDescriptor, nextDescriptor } = resolveSceneNeighbors(
259
+ relationshipScenes,
260
+ sceneIndex,
261
+ isRouteClosing,
262
+ (routeKey) => closingRouteOrder.get(routeKey),
263
+ );
264
+
265
+ const nextScene = {
266
+ ...scene,
267
+ previousDescriptor,
268
+ nextDescriptor,
269
+ };
270
+
271
+ const previousScene =
272
+ previousState?.scenes[sceneIndex]?.route === scene.route
273
+ ? previousState.scenes[sceneIndex]
274
+ : previousScenesByRouteKey?.get(scene.route.key);
275
+
276
+ if (
277
+ previousScene &&
278
+ previousScene.route === nextScene.route &&
279
+ previousScene.descriptor === nextScene.descriptor &&
280
+ previousScene.previousDescriptor === nextScene.previousDescriptor &&
281
+ previousScene.nextDescriptor === nextScene.nextDescriptor
282
+ ) {
283
+ return previousScene;
284
+ }
285
+
286
+ reusedEveryScene = false;
287
+ return nextScene;
288
+ });
289
+
290
+ if (reusedEveryScene && previousState) {
291
+ return previousState.scenes;
292
+ }
293
+
294
+ return nextScenes;
295
+ };
296
+
297
+ export const buildManagedStackState = <
298
+ TDescriptor extends BaseStackDescriptor,
299
+ TNavigation extends BaseStackNavigation,
300
+ >(
301
+ params: BuildManagedStackStateParams<TDescriptor, TNavigation>,
302
+ ): LocalRoutesState<TDescriptor> => {
303
+ const activityWindow = getSceneActivityWindow(params);
304
+ const focusedRouteKey =
305
+ params.props.state.routes[params.props.state.index]?.key;
306
+
307
+ const {
308
+ scenes: baseScenes,
309
+ routeChildStates,
310
+ sourceDescriptors,
311
+ descriptors: managedDescriptors,
312
+ routeKeys,
313
+ shouldShowFloatOverlay,
314
+ } = buildBaseScenes({
315
+ ...params,
316
+ activityWindow,
317
+ });
318
+
319
+ const scenes = withSceneRelationships({
320
+ scenes: baseScenes,
321
+ sourceDescriptors,
322
+ closingRouteKeys: params.closingRouteKeys,
323
+ previousState: params.previousState,
324
+ });
325
+
326
+ const closingRouteKeys = new Set(params.closingRouteKeys);
327
+
328
+ return {
329
+ routes: params.routes,
330
+ descriptors:
331
+ params.previousState &&
332
+ areDescriptorsEqual(params.previousState.descriptors, managedDescriptors)
333
+ ? params.previousState.descriptors
334
+ : managedDescriptors,
335
+ sourceDescriptors:
336
+ params.previousState &&
337
+ areDescriptorsEqual(
338
+ params.previousState.sourceDescriptors,
339
+ sourceDescriptors,
340
+ )
341
+ ? params.previousState.sourceDescriptors
342
+ : sourceDescriptors,
343
+ focusedRouteKey,
344
+ routeChildStates:
345
+ params.previousState &&
346
+ areRouteChildStateMapsEqual(
347
+ params.previousState.routeChildStates,
348
+ routeChildStates,
349
+ )
350
+ ? params.previousState.routeChildStates
351
+ : routeChildStates,
352
+ scenes,
353
+ routeKeys:
354
+ params.previousState &&
355
+ routeKeyListsAreEqual(params.previousState.routeKeys, routeKeys)
356
+ ? params.previousState.routeKeys
357
+ : routeKeys,
358
+ shouldShowFloatOverlay,
359
+ closingRouteKeys:
360
+ params.previousState &&
361
+ setsAreEqual(params.previousState.closingRouteKeys, closingRouteKeys)
362
+ ? params.previousState.closingRouteKeys
363
+ : closingRouteKeys,
364
+ };
365
+ };
@@ -0,0 +1,121 @@
1
+ import type { ManagedStackProps } from "../../../../../types/providers/managed-stack.types";
2
+ import type {
3
+ BaseStackDescriptor,
4
+ BaseStackNavigation,
5
+ RouteWithKey,
6
+ } from "../../../../../types/stack.types";
7
+ import { buildManagedStackState } from "./build-managed-stack-state";
8
+ import {
9
+ areDescriptorSourceMapsEquivalent,
10
+ areDescriptorsEqual,
11
+ areRouteChildStateMapsEqual,
12
+ getRouteChildStateMap,
13
+ routesHaveSameKeys,
14
+ setsAreEqual,
15
+ } from "./helpers";
16
+ import { reconcileManagedRoutes } from "./reconcile-managed-routes";
17
+ import type { LocalRoutesState, ManagedRoutes } from "./types";
18
+
19
+ type DeriveManagedStackStateParams<
20
+ TDescriptor extends BaseStackDescriptor,
21
+ TNavigation extends BaseStackNavigation,
22
+ > = {
23
+ props: ManagedStackProps<TDescriptor, TNavigation>;
24
+ current: LocalRoutesState<TDescriptor>;
25
+ previousRoutesSnapshot: ManagedRoutes<TDescriptor>;
26
+ closingRouteKeys: Set<string>;
27
+ };
28
+
29
+ const routesAreIdentical = <Route extends RouteWithKey>(
30
+ a: Route[],
31
+ b: Route[],
32
+ ): boolean => {
33
+ if (a === b) return true;
34
+ if (a.length !== b.length) return false;
35
+
36
+ return a.every((route, index) => route === b[index]);
37
+ };
38
+
39
+ export const deriveManagedStackState = <
40
+ TDescriptor extends BaseStackDescriptor,
41
+ TNavigation extends BaseStackNavigation,
42
+ >({
43
+ props,
44
+ current,
45
+ previousRoutesSnapshot,
46
+ closingRouteKeys,
47
+ }: DeriveManagedStackStateParams<
48
+ TDescriptor,
49
+ TNavigation
50
+ >): LocalRoutesState<TDescriptor> => {
51
+ const nextRoutesSnapshot = props.state.routes;
52
+ const nextDescriptors = props.descriptors;
53
+ const nextRouteChildStates = getRouteChildStateMap(nextRoutesSnapshot);
54
+ const nextFocusedRouteKey = nextRoutesSnapshot[props.state.index]?.key;
55
+ const focusedRouteUnchanged = current.focusedRouteKey === nextFocusedRouteKey;
56
+ const closingRouteKeysUnchanged = setsAreEqual(
57
+ current.closingRouteKeys,
58
+ closingRouteKeys,
59
+ );
60
+ const routeChildStatesUnchanged = areRouteChildStateMapsEqual(
61
+ current.routeChildStates,
62
+ nextRouteChildStates,
63
+ );
64
+
65
+ const alreadyAligned =
66
+ focusedRouteUnchanged &&
67
+ closingRouteKeysUnchanged &&
68
+ routeChildStatesUnchanged &&
69
+ routesAreIdentical(current.routes, nextRoutesSnapshot) &&
70
+ areDescriptorsEqual(current.sourceDescriptors, nextDescriptors);
71
+
72
+ if (alreadyAligned) {
73
+ return current;
74
+ }
75
+
76
+ const logicallyAligned =
77
+ focusedRouteUnchanged &&
78
+ closingRouteKeysUnchanged &&
79
+ routeChildStatesUnchanged &&
80
+ routesHaveSameKeys(current.routes, nextRoutesSnapshot) &&
81
+ areDescriptorSourceMapsEquivalent(
82
+ current.sourceDescriptors,
83
+ nextDescriptors,
84
+ );
85
+
86
+ if (logicallyAligned) {
87
+ return current;
88
+ }
89
+
90
+ const result = reconcileManagedRoutes({
91
+ current,
92
+ previousRoutesSnapshot,
93
+ nextRoutesSnapshot,
94
+ nextDescriptors,
95
+ closingRouteKeys,
96
+ });
97
+
98
+ const routesChanged = !routesAreIdentical(current.routes, result.routes);
99
+ const descriptorsChanged = !areDescriptorsEqual(
100
+ current.sourceDescriptors,
101
+ result.descriptors,
102
+ );
103
+ const closingRouteKeysChanged = !setsAreEqual(
104
+ current.closingRouteKeys,
105
+ closingRouteKeys,
106
+ );
107
+
108
+ if (!routesChanged && !descriptorsChanged && !closingRouteKeysChanged) {
109
+ return current;
110
+ }
111
+
112
+ return buildManagedStackState({
113
+ props,
114
+ routes: routesChanged ? result.routes : current.routes,
115
+ descriptors: descriptorsChanged
116
+ ? result.descriptors
117
+ : current.sourceDescriptors,
118
+ closingRouteKeys,
119
+ previousState: current,
120
+ });
121
+ };