react-native-screen-transitions 4.0.0 → 4.1.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 (411) hide show
  1. package/lib/commonjs/adapters/with-screen-transitions/stack-layout.js +1 -3
  2. package/lib/commonjs/adapters/with-screen-transitions/stack-layout.js.map +1 -1
  3. package/lib/commonjs/components/blank-stack-host.js +21 -0
  4. package/lib/commonjs/components/blank-stack-host.js.map +1 -0
  5. package/lib/commonjs/components/blank-stack-runtime.js +33 -0
  6. package/lib/commonjs/components/blank-stack-runtime.js.map +1 -0
  7. package/lib/commonjs/components/blank-stack-scene.js +31 -0
  8. package/lib/commonjs/components/blank-stack-scene.js.map +1 -0
  9. package/lib/commonjs/components/blank-stack-view.js +23 -0
  10. package/lib/commonjs/components/blank-stack-view.js.map +1 -0
  11. package/lib/commonjs/components/overlay/helpers/run-overlay-slot-interpolator.js +2 -4
  12. package/lib/commonjs/components/overlay/helpers/run-overlay-slot-interpolator.js.map +1 -1
  13. package/lib/commonjs/components/overlay/hooks/use-overlay-slot.js +1 -16
  14. package/lib/commonjs/components/overlay/hooks/use-overlay-slot.js.map +1 -1
  15. package/lib/commonjs/components/overlay/variations/overlay-host.js +0 -1
  16. package/lib/commonjs/components/overlay/variations/overlay-host.js.map +1 -1
  17. package/lib/commonjs/components/screen-lifecycle/index.js +2 -2
  18. package/lib/commonjs/components/screen-lifecycle/index.js.map +1 -1
  19. package/lib/commonjs/custom-navigator.js +41 -0
  20. package/lib/commonjs/custom-navigator.js.map +1 -0
  21. package/lib/commonjs/hooks/navigation/use-blank-stack-state.js +26 -0
  22. package/lib/commonjs/hooks/navigation/use-blank-stack-state.js.map +1 -0
  23. package/lib/commonjs/hooks/navigation/use-navigation-helpers.js +2 -2
  24. package/lib/commonjs/hooks/navigation/use-navigation-helpers.js.map +1 -1
  25. package/lib/commonjs/hooks/navigation/use-screen-state.js +1 -1
  26. package/lib/commonjs/hooks/navigation/use-screen-state.js.map +1 -1
  27. package/lib/commonjs/providers/screen/animation/animation.provider.js +11 -24
  28. package/lib/commonjs/providers/screen/animation/animation.provider.js.map +1 -1
  29. package/lib/commonjs/providers/screen/animation/helpers/pipeline.js +19 -36
  30. package/lib/commonjs/providers/screen/animation/helpers/pipeline.js.map +1 -1
  31. package/lib/commonjs/providers/screen/animation/use-screen-animation.js +16 -12
  32. package/lib/commonjs/providers/screen/animation/use-screen-animation.js.map +1 -1
  33. package/lib/commonjs/providers/screen/descriptors/descriptors.provider.js +31 -64
  34. package/lib/commonjs/providers/screen/descriptors/descriptors.provider.js.map +1 -1
  35. package/lib/commonjs/providers/screen/descriptors/index.js +6 -0
  36. package/lib/commonjs/providers/screen/descriptors/index.js.map +1 -1
  37. package/lib/commonjs/providers/screen/gestures/gestures.provider.js +14 -25
  38. package/lib/commonjs/providers/screen/gestures/gestures.provider.js.map +1 -1
  39. package/lib/commonjs/providers/screen/gestures/hooks/use-screen-gesture-config.js +3 -4
  40. package/lib/commonjs/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  41. package/lib/commonjs/providers/screen/gestures/hooks/use-screen-gesture.js +6 -7
  42. package/lib/commonjs/providers/screen/gestures/hooks/use-screen-gesture.js.map +1 -1
  43. package/lib/commonjs/providers/screen/gestures/ownership/gesture-ownership-coordinator.js +149 -0
  44. package/lib/commonjs/providers/screen/gestures/ownership/gesture-ownership-coordinator.js.map +1 -0
  45. package/lib/commonjs/providers/screen/gestures/ownership/use-gesture-scroll-coordination.js +15 -0
  46. package/lib/commonjs/providers/screen/gestures/ownership/use-gesture-scroll-coordination.js.map +1 -0
  47. package/lib/commonjs/providers/screen/gestures/ownership/use-register-gesture-ownership.js +52 -0
  48. package/lib/commonjs/providers/screen/gestures/ownership/use-register-gesture-ownership.js.map +1 -0
  49. package/lib/commonjs/providers/screen/gestures/pan/activation/pan-activation-decision.js +4 -9
  50. package/lib/commonjs/providers/screen/gestures/pan/activation/pan-activation-decision.js.map +1 -1
  51. package/lib/commonjs/providers/screen/gestures/pan/activation/use-pan-activation.js +3 -3
  52. package/lib/commonjs/providers/screen/gestures/pan/activation/use-pan-activation.js.map +1 -1
  53. package/lib/commonjs/providers/screen/gestures/pan/use-build-pan-gesture.js +2 -2
  54. package/lib/commonjs/providers/screen/gestures/pan/use-build-pan-gesture.js.map +1 -1
  55. package/lib/commonjs/providers/screen/gestures/scroll-coordination/use-scroll-gesture-coordination.js +13 -11
  56. package/lib/commonjs/providers/screen/gestures/scroll-coordination/use-scroll-gesture-coordination.js.map +1 -1
  57. package/lib/commonjs/providers/screen/gestures/shared/policy.js +4 -9
  58. package/lib/commonjs/providers/screen/gestures/shared/policy.js.map +1 -1
  59. package/lib/commonjs/providers/screen/gestures/types.js +2 -2
  60. package/lib/commonjs/providers/screen/gestures/types.js.map +1 -1
  61. package/lib/commonjs/providers/screen/screen-composer.js +10 -13
  62. package/lib/commonjs/providers/screen/screen-composer.js.map +1 -1
  63. package/lib/commonjs/providers/screen/styles/helpers/create-interpolator-scope.js +3 -15
  64. package/lib/commonjs/providers/screen/styles/helpers/create-interpolator-scope.js.map +1 -1
  65. package/lib/commonjs/providers/screen/styles/hooks/use-interpolated-style-maps.js +4 -25
  66. package/lib/commonjs/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  67. package/lib/commonjs/providers/screen/topology/helpers/create-screen-topology.js +176 -0
  68. package/lib/commonjs/providers/screen/topology/helpers/create-screen-topology.js.map +1 -0
  69. package/lib/commonjs/providers/screen/topology/hooks/use-resolved-transition-key.js +17 -0
  70. package/lib/commonjs/providers/screen/topology/hooks/use-resolved-transition-key.js.map +1 -0
  71. package/lib/commonjs/{factories/screen-topology → providers/screen/topology/hooks}/use-screen-relationships.js +1 -1
  72. package/lib/commonjs/providers/screen/topology/hooks/use-screen-relationships.js.map +1 -0
  73. package/lib/commonjs/{factories/screen-topology → providers/screen/topology}/index.js +16 -15
  74. package/lib/commonjs/providers/screen/topology/index.js.map +1 -0
  75. package/lib/commonjs/providers/screen/topology/topology.provider.js +56 -0
  76. package/lib/commonjs/providers/screen/topology/topology.provider.js.map +1 -0
  77. package/lib/commonjs/providers/screen/topology/types.js.map +1 -0
  78. package/lib/commonjs/providers/screen/use-current-screen-relationships.js +2 -2
  79. package/lib/commonjs/providers/screen/use-current-screen-relationships.js.map +1 -1
  80. package/lib/commonjs/providers/stack/blank-stack-state/helpers/build-blank-stack-state.js +1 -1
  81. package/lib/commonjs/providers/stack/blank-stack-state/helpers/build-blank-stack-state.js.map +1 -1
  82. package/lib/commonjs/providers/stack/blank-stack-state/helpers/state-equality.js +1 -1
  83. package/lib/commonjs/providers/stack/blank-stack-state/helpers/state-equality.js.map +1 -1
  84. package/lib/commonjs/providers/stack/stack-transition/index.js +20 -0
  85. package/lib/commonjs/providers/stack/stack-transition/index.js.map +1 -0
  86. package/lib/commonjs/providers/stack/stack-transition/stack-transition-controller.js +197 -0
  87. package/lib/commonjs/providers/stack/stack-transition/stack-transition-controller.js.map +1 -0
  88. package/lib/commonjs/providers/stack/stack-transition/stack-transition.provider.js +92 -0
  89. package/lib/commonjs/providers/stack/stack-transition/stack-transition.provider.js.map +1 -0
  90. package/lib/commonjs/providers/stack/stack-transition/use-stack-transition.js +46 -0
  91. package/lib/commonjs/providers/stack/stack-transition/use-stack-transition.js.map +1 -0
  92. package/lib/commonjs/types/ownership.types.js +2 -25
  93. package/lib/commonjs/types/ownership.types.js.map +1 -1
  94. package/lib/module/adapters/with-screen-transitions/stack-layout.js +1 -3
  95. package/lib/module/adapters/with-screen-transitions/stack-layout.js.map +1 -1
  96. package/lib/module/components/blank-stack-host.js +17 -0
  97. package/lib/module/components/blank-stack-host.js.map +1 -0
  98. package/lib/module/components/blank-stack-runtime.js +29 -0
  99. package/lib/module/components/blank-stack-runtime.js.map +1 -0
  100. package/lib/module/components/blank-stack-scene.js +27 -0
  101. package/lib/module/components/blank-stack-scene.js.map +1 -0
  102. package/lib/module/components/blank-stack-view.js +19 -0
  103. package/lib/module/components/blank-stack-view.js.map +1 -0
  104. package/lib/module/components/overlay/helpers/run-overlay-slot-interpolator.js +2 -4
  105. package/lib/module/components/overlay/helpers/run-overlay-slot-interpolator.js.map +1 -1
  106. package/lib/module/components/overlay/hooks/use-overlay-slot.js +1 -16
  107. package/lib/module/components/overlay/hooks/use-overlay-slot.js.map +1 -1
  108. package/lib/module/components/overlay/variations/overlay-host.js +0 -1
  109. package/lib/module/components/overlay/variations/overlay-host.js.map +1 -1
  110. package/lib/module/components/screen-lifecycle/index.js +2 -2
  111. package/lib/module/components/screen-lifecycle/index.js.map +1 -1
  112. package/lib/module/custom-navigator.js +8 -0
  113. package/lib/module/custom-navigator.js.map +1 -0
  114. package/lib/module/hooks/navigation/use-blank-stack-state.js +21 -0
  115. package/lib/module/hooks/navigation/use-blank-stack-state.js.map +1 -0
  116. package/lib/module/hooks/navigation/use-navigation-helpers.js +2 -2
  117. package/lib/module/hooks/navigation/use-navigation-helpers.js.map +1 -1
  118. package/lib/module/hooks/navigation/use-screen-state.js +1 -1
  119. package/lib/module/hooks/navigation/use-screen-state.js.map +1 -1
  120. package/lib/module/providers/screen/animation/animation.provider.js +11 -24
  121. package/lib/module/providers/screen/animation/animation.provider.js.map +1 -1
  122. package/lib/module/providers/screen/animation/helpers/pipeline.js +19 -36
  123. package/lib/module/providers/screen/animation/helpers/pipeline.js.map +1 -1
  124. package/lib/module/providers/screen/animation/use-screen-animation.js +17 -13
  125. package/lib/module/providers/screen/animation/use-screen-animation.js.map +1 -1
  126. package/lib/module/providers/screen/descriptors/descriptors.provider.js +31 -66
  127. package/lib/module/providers/screen/descriptors/descriptors.provider.js.map +1 -1
  128. package/lib/module/providers/screen/descriptors/index.js +1 -1
  129. package/lib/module/providers/screen/descriptors/index.js.map +1 -1
  130. package/lib/module/providers/screen/gestures/gestures.provider.js +16 -27
  131. package/lib/module/providers/screen/gestures/gestures.provider.js.map +1 -1
  132. package/lib/module/providers/screen/gestures/hooks/use-screen-gesture-config.js +3 -4
  133. package/lib/module/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  134. package/lib/module/providers/screen/gestures/hooks/use-screen-gesture.js +6 -7
  135. package/lib/module/providers/screen/gestures/hooks/use-screen-gesture.js.map +1 -1
  136. package/lib/module/providers/screen/gestures/ownership/gesture-ownership-coordinator.js +144 -0
  137. package/lib/module/providers/screen/gestures/ownership/gesture-ownership-coordinator.js.map +1 -0
  138. package/lib/module/providers/screen/gestures/ownership/use-gesture-scroll-coordination.js +10 -0
  139. package/lib/module/providers/screen/gestures/ownership/use-gesture-scroll-coordination.js.map +1 -0
  140. package/lib/module/providers/screen/gestures/ownership/use-register-gesture-ownership.js +47 -0
  141. package/lib/module/providers/screen/gestures/ownership/use-register-gesture-ownership.js.map +1 -0
  142. package/lib/module/providers/screen/gestures/pan/activation/pan-activation-decision.js +4 -9
  143. package/lib/module/providers/screen/gestures/pan/activation/pan-activation-decision.js.map +1 -1
  144. package/lib/module/providers/screen/gestures/pan/activation/use-pan-activation.js +3 -3
  145. package/lib/module/providers/screen/gestures/pan/activation/use-pan-activation.js.map +1 -1
  146. package/lib/module/providers/screen/gestures/pan/use-build-pan-gesture.js +2 -2
  147. package/lib/module/providers/screen/gestures/pan/use-build-pan-gesture.js.map +1 -1
  148. package/lib/module/providers/screen/gestures/scroll-coordination/use-scroll-gesture-coordination.js +13 -11
  149. package/lib/module/providers/screen/gestures/scroll-coordination/use-scroll-gesture-coordination.js.map +1 -1
  150. package/lib/module/providers/screen/gestures/shared/policy.js +4 -9
  151. package/lib/module/providers/screen/gestures/shared/policy.js.map +1 -1
  152. package/lib/module/providers/screen/gestures/types.js +1 -1
  153. package/lib/module/providers/screen/gestures/types.js.map +1 -1
  154. package/lib/module/providers/screen/screen-composer.js +10 -13
  155. package/lib/module/providers/screen/screen-composer.js.map +1 -1
  156. package/lib/module/providers/screen/styles/helpers/create-interpolator-scope.js +3 -15
  157. package/lib/module/providers/screen/styles/helpers/create-interpolator-scope.js.map +1 -1
  158. package/lib/module/providers/screen/styles/hooks/use-interpolated-style-maps.js +4 -25
  159. package/lib/module/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  160. package/lib/module/providers/screen/topology/helpers/create-screen-topology.js +171 -0
  161. package/lib/module/providers/screen/topology/helpers/create-screen-topology.js.map +1 -0
  162. package/lib/module/providers/screen/topology/hooks/use-resolved-transition-key.js +12 -0
  163. package/lib/module/providers/screen/topology/hooks/use-resolved-transition-key.js.map +1 -0
  164. package/lib/module/{factories/screen-topology → providers/screen/topology/hooks}/use-screen-relationships.js +1 -1
  165. package/lib/module/providers/screen/topology/hooks/use-screen-relationships.js.map +1 -0
  166. package/lib/module/providers/screen/topology/index.js +7 -0
  167. package/lib/module/providers/screen/topology/index.js.map +1 -0
  168. package/lib/module/providers/screen/topology/topology.provider.js +50 -0
  169. package/lib/module/providers/screen/topology/topology.provider.js.map +1 -0
  170. package/lib/module/providers/screen/topology/types.js.map +1 -0
  171. package/lib/module/providers/screen/use-current-screen-relationships.js +1 -1
  172. package/lib/module/providers/screen/use-current-screen-relationships.js.map +1 -1
  173. package/lib/module/providers/stack/blank-stack-state/helpers/build-blank-stack-state.js +1 -1
  174. package/lib/module/providers/stack/blank-stack-state/helpers/build-blank-stack-state.js.map +1 -1
  175. package/lib/module/providers/stack/blank-stack-state/helpers/state-equality.js +1 -1
  176. package/lib/module/providers/stack/blank-stack-state/helpers/state-equality.js.map +1 -1
  177. package/lib/module/providers/stack/stack-transition/index.js +5 -0
  178. package/lib/module/providers/stack/stack-transition/index.js.map +1 -0
  179. package/lib/module/providers/stack/stack-transition/stack-transition-controller.js +189 -0
  180. package/lib/module/providers/stack/stack-transition/stack-transition-controller.js.map +1 -0
  181. package/lib/module/providers/stack/stack-transition/stack-transition.provider.js +85 -0
  182. package/lib/module/providers/stack/stack-transition/stack-transition.provider.js.map +1 -0
  183. package/lib/module/providers/stack/stack-transition/use-stack-transition.js +41 -0
  184. package/lib/module/providers/stack/stack-transition/use-stack-transition.js.map +1 -0
  185. package/lib/module/types/animation.types.js.map +1 -1
  186. package/lib/module/types/ownership.types.js +1 -24
  187. package/lib/module/types/ownership.types.js.map +1 -1
  188. package/lib/typescript/adapters/with-screen-transitions/stack-layout.d.ts.map +1 -1
  189. package/lib/typescript/components/blank-stack-host.d.ts +9 -0
  190. package/lib/typescript/components/blank-stack-host.d.ts.map +1 -0
  191. package/lib/typescript/components/blank-stack-runtime.d.ts +8 -0
  192. package/lib/typescript/components/blank-stack-runtime.d.ts.map +1 -0
  193. package/lib/typescript/components/blank-stack-scene.d.ts +5 -0
  194. package/lib/typescript/components/blank-stack-scene.d.ts.map +1 -0
  195. package/lib/typescript/components/blank-stack-view.d.ts +2 -0
  196. package/lib/typescript/components/blank-stack-view.d.ts.map +1 -0
  197. package/lib/typescript/components/overlay/helpers/run-overlay-slot-interpolator.d.ts +2 -3
  198. package/lib/typescript/components/overlay/helpers/run-overlay-slot-interpolator.d.ts.map +1 -1
  199. package/lib/typescript/components/overlay/hooks/use-overlay-slot.d.ts.map +1 -1
  200. package/lib/typescript/custom-navigator.d.ts +8 -0
  201. package/lib/typescript/custom-navigator.d.ts.map +1 -0
  202. package/lib/typescript/hooks/navigation/use-blank-stack-state.d.ts +8 -0
  203. package/lib/typescript/hooks/navigation/use-blank-stack-state.d.ts.map +1 -0
  204. package/lib/typescript/hooks/navigation/use-navigation-helpers.d.ts.map +1 -1
  205. package/lib/typescript/index.d.ts +1 -1
  206. package/lib/typescript/index.d.ts.map +1 -1
  207. package/lib/typescript/providers/screen/animation/animation.provider.d.ts +2 -5
  208. package/lib/typescript/providers/screen/animation/animation.provider.d.ts.map +1 -1
  209. package/lib/typescript/providers/screen/animation/helpers/pipeline.d.ts +2 -4
  210. package/lib/typescript/providers/screen/animation/helpers/pipeline.d.ts.map +1 -1
  211. package/lib/typescript/providers/screen/animation/types.d.ts +0 -9
  212. package/lib/typescript/providers/screen/animation/types.d.ts.map +1 -1
  213. package/lib/typescript/providers/screen/animation/use-screen-animation.d.ts.map +1 -1
  214. package/lib/typescript/providers/screen/descriptors/descriptors.provider.d.ts +9 -11
  215. package/lib/typescript/providers/screen/descriptors/descriptors.provider.d.ts.map +1 -1
  216. package/lib/typescript/providers/screen/descriptors/index.d.ts +1 -1
  217. package/lib/typescript/providers/screen/descriptors/index.d.ts.map +1 -1
  218. package/lib/typescript/providers/screen/gestures/gestures.provider.d.ts +9 -12
  219. package/lib/typescript/providers/screen/gestures/gestures.provider.d.ts.map +1 -1
  220. package/lib/typescript/providers/screen/gestures/hooks/use-screen-gesture-config.d.ts +2 -2
  221. package/lib/typescript/providers/screen/gestures/hooks/use-screen-gesture-config.d.ts.map +1 -1
  222. package/lib/typescript/providers/screen/gestures/hooks/use-screen-gesture.d.ts +3 -2
  223. package/lib/typescript/providers/screen/gestures/hooks/use-screen-gesture.d.ts.map +1 -1
  224. package/lib/typescript/providers/screen/gestures/index.d.ts +1 -1
  225. package/lib/typescript/providers/screen/gestures/index.d.ts.map +1 -1
  226. package/lib/typescript/providers/screen/gestures/ownership/gesture-ownership-coordinator.d.ts +26 -0
  227. package/lib/typescript/providers/screen/gestures/ownership/gesture-ownership-coordinator.d.ts.map +1 -0
  228. package/lib/typescript/providers/screen/gestures/ownership/use-gesture-scroll-coordination.d.ts +3 -0
  229. package/lib/typescript/providers/screen/gestures/ownership/use-gesture-scroll-coordination.d.ts.map +1 -0
  230. package/lib/typescript/providers/screen/gestures/ownership/use-register-gesture-ownership.d.ts +9 -0
  231. package/lib/typescript/providers/screen/gestures/ownership/use-register-gesture-ownership.d.ts.map +1 -0
  232. package/lib/typescript/providers/screen/gestures/pan/activation/pan-activation-decision.d.ts +4 -4
  233. package/lib/typescript/providers/screen/gestures/pan/activation/pan-activation-decision.d.ts.map +1 -1
  234. package/lib/typescript/providers/screen/gestures/pan/activation/use-pan-activation.d.ts +3 -3
  235. package/lib/typescript/providers/screen/gestures/pan/activation/use-pan-activation.d.ts.map +1 -1
  236. package/lib/typescript/providers/screen/gestures/pan/use-build-pan-gesture.d.ts +3 -3
  237. package/lib/typescript/providers/screen/gestures/pan/use-build-pan-gesture.d.ts.map +1 -1
  238. package/lib/typescript/providers/screen/gestures/scroll-coordination/use-scroll-gesture-coordination.d.ts.map +1 -1
  239. package/lib/typescript/providers/screen/gestures/shared/policy.d.ts +2 -3
  240. package/lib/typescript/providers/screen/gestures/shared/policy.d.ts.map +1 -1
  241. package/lib/typescript/providers/screen/gestures/types.d.ts +4 -18
  242. package/lib/typescript/providers/screen/gestures/types.d.ts.map +1 -1
  243. package/lib/typescript/providers/screen/screen-composer.d.ts +2 -6
  244. package/lib/typescript/providers/screen/screen-composer.d.ts.map +1 -1
  245. package/lib/typescript/providers/screen/styles/helpers/create-interpolator-scope.d.ts +2 -3
  246. package/lib/typescript/providers/screen/styles/helpers/create-interpolator-scope.d.ts.map +1 -1
  247. package/lib/typescript/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts.map +1 -1
  248. package/lib/typescript/{factories/screen-topology → providers/screen/topology/helpers}/create-screen-topology.d.ts +1 -1
  249. package/lib/typescript/providers/screen/topology/helpers/create-screen-topology.d.ts.map +1 -0
  250. package/lib/typescript/providers/screen/topology/hooks/use-resolved-transition-key.d.ts +3 -0
  251. package/lib/typescript/providers/screen/topology/hooks/use-resolved-transition-key.d.ts.map +1 -0
  252. package/lib/typescript/{factories/screen-topology → providers/screen/topology/hooks}/use-screen-relationships.d.ts +1 -0
  253. package/lib/typescript/providers/screen/topology/hooks/use-screen-relationships.d.ts.map +1 -0
  254. package/lib/typescript/providers/screen/topology/index.d.ts +6 -0
  255. package/lib/typescript/providers/screen/topology/index.d.ts.map +1 -0
  256. package/lib/typescript/providers/screen/topology/topology.provider.d.ts +13 -0
  257. package/lib/typescript/providers/screen/topology/topology.provider.d.ts.map +1 -0
  258. package/lib/typescript/{factories/screen-topology → providers/screen/topology}/types.d.ts +7 -1
  259. package/lib/typescript/providers/screen/topology/types.d.ts.map +1 -0
  260. package/lib/typescript/providers/screen/use-current-screen-relationships.d.ts +1 -0
  261. package/lib/typescript/providers/screen/use-current-screen-relationships.d.ts.map +1 -1
  262. package/lib/typescript/providers/stack/blank-stack-state/helpers/build-blank-stack-state.d.ts.map +1 -1
  263. package/lib/typescript/providers/stack/blank-stack-state/helpers/state-equality.d.ts.map +1 -1
  264. package/lib/typescript/providers/stack/stack-transition/index.d.ts +3 -0
  265. package/lib/typescript/providers/stack/stack-transition/index.d.ts.map +1 -0
  266. package/lib/typescript/providers/stack/stack-transition/stack-transition-controller.d.ts +48 -0
  267. package/lib/typescript/providers/stack/stack-transition/stack-transition-controller.d.ts.map +1 -0
  268. package/lib/typescript/providers/stack/stack-transition/stack-transition.provider.d.ts +14 -0
  269. package/lib/typescript/providers/stack/stack-transition/stack-transition.provider.d.ts.map +1 -0
  270. package/lib/typescript/providers/stack/stack-transition/use-stack-transition.d.ts +12 -0
  271. package/lib/typescript/providers/stack/stack-transition/use-stack-transition.d.ts.map +1 -0
  272. package/lib/typescript/types/animation.types.d.ts +1 -15
  273. package/lib/typescript/types/animation.types.d.ts.map +1 -1
  274. package/lib/typescript/types/bounds.types.d.ts +1 -1
  275. package/lib/typescript/types/bounds.types.d.ts.map +1 -1
  276. package/lib/typescript/types/index.d.ts +1 -1
  277. package/lib/typescript/types/index.d.ts.map +1 -1
  278. package/lib/typescript/types/ownership.types.d.ts +1 -18
  279. package/lib/typescript/types/ownership.types.d.ts.map +1 -1
  280. package/lib/typescript/types/screen.types.d.ts +9 -0
  281. package/lib/typescript/types/screen.types.d.ts.map +1 -1
  282. package/package.json +7 -1
  283. package/src/adapters/with-screen-transitions/stack-layout.tsx +1 -9
  284. package/src/components/blank-stack-host.tsx +21 -0
  285. package/src/components/blank-stack-runtime.tsx +37 -0
  286. package/src/components/blank-stack-scene.tsx +30 -0
  287. package/src/components/blank-stack-view.tsx +19 -0
  288. package/src/components/overlay/helpers/run-overlay-slot-interpolator.ts +0 -4
  289. package/src/components/overlay/hooks/use-overlay-slot.ts +0 -25
  290. package/src/components/overlay/variations/overlay-host.tsx +0 -1
  291. package/src/components/screen-lifecycle/index.tsx +2 -2
  292. package/src/custom-navigator.ts +25 -0
  293. package/src/hooks/navigation/use-blank-stack-state.ts +24 -0
  294. package/src/hooks/navigation/use-navigation-helpers.ts +4 -2
  295. package/src/hooks/navigation/use-screen-state.ts +1 -1
  296. package/src/index.ts +0 -1
  297. package/src/providers/screen/animation/animation.provider.tsx +13 -53
  298. package/src/providers/screen/animation/helpers/pipeline.ts +14 -26
  299. package/src/providers/screen/animation/types.ts +0 -11
  300. package/src/providers/screen/animation/use-screen-animation.tsx +42 -10
  301. package/src/providers/screen/descriptors/descriptors.provider.tsx +43 -99
  302. package/src/providers/screen/descriptors/index.tsx +1 -0
  303. package/src/providers/screen/gestures/gestures.provider.tsx +14 -55
  304. package/src/providers/screen/gestures/hooks/use-screen-gesture-config.ts +3 -6
  305. package/src/providers/screen/gestures/hooks/use-screen-gesture.ts +13 -13
  306. package/src/providers/screen/gestures/index.tsx +0 -2
  307. package/src/providers/screen/gestures/ownership/gesture-ownership-coordinator.ts +252 -0
  308. package/src/providers/screen/gestures/ownership/use-gesture-scroll-coordination.ts +23 -0
  309. package/src/providers/screen/gestures/ownership/use-register-gesture-ownership.ts +73 -0
  310. package/src/providers/screen/gestures/pan/activation/pan-activation-decision.ts +6 -20
  311. package/src/providers/screen/gestures/pan/activation/use-pan-activation.ts +5 -5
  312. package/src/providers/screen/gestures/pan/use-build-pan-gesture.ts +4 -4
  313. package/src/providers/screen/gestures/scroll-coordination/use-scroll-gesture-coordination.ts +9 -12
  314. package/src/providers/screen/gestures/shared/policy.ts +0 -8
  315. package/src/providers/screen/gestures/types.ts +4 -19
  316. package/src/providers/screen/screen-composer.tsx +18 -29
  317. package/src/providers/screen/styles/helpers/create-interpolator-scope.ts +2 -21
  318. package/src/providers/screen/styles/hooks/use-interpolated-style-maps.tsx +0 -29
  319. package/src/{factories/screen-topology → providers/screen/topology/helpers}/create-screen-topology.ts +97 -53
  320. package/src/providers/screen/topology/hooks/use-resolved-transition-key.ts +29 -0
  321. package/src/{factories/screen-topology → providers/screen/topology/hooks}/use-screen-relationships.ts +1 -1
  322. package/src/providers/screen/topology/index.ts +16 -0
  323. package/src/providers/screen/topology/topology.provider.tsx +72 -0
  324. package/src/{factories/screen-topology → providers/screen/topology}/types.ts +7 -1
  325. package/src/providers/screen/use-current-screen-relationships.ts +1 -1
  326. package/src/providers/stack/blank-stack-state/helpers/build-blank-stack-state.ts +1 -0
  327. package/src/providers/stack/blank-stack-state/helpers/state-equality.ts +6 -3
  328. package/src/providers/stack/stack-transition/index.ts +5 -0
  329. package/src/providers/stack/stack-transition/stack-transition-controller.ts +341 -0
  330. package/src/providers/stack/stack-transition/stack-transition.provider.tsx +120 -0
  331. package/src/providers/stack/stack-transition/use-stack-transition.ts +77 -0
  332. package/src/types/animation.types.ts +1 -19
  333. package/src/types/bounds.types.ts +1 -4
  334. package/src/types/index.ts +0 -1
  335. package/src/types/ownership.types.ts +1 -26
  336. package/src/types/screen.types.ts +10 -0
  337. package/lib/commonjs/factories/screen-topology/create-screen-topology.js +0 -147
  338. package/lib/commonjs/factories/screen-topology/create-screen-topology.js.map +0 -1
  339. package/lib/commonjs/factories/screen-topology/index.js.map +0 -1
  340. package/lib/commonjs/factories/screen-topology/types.js.map +0 -1
  341. package/lib/commonjs/factories/screen-topology/use-screen-relationships.js.map +0 -1
  342. package/lib/commonjs/factories/screen-topology/worklet.js +0 -55
  343. package/lib/commonjs/factories/screen-topology/worklet.js.map +0 -1
  344. package/lib/commonjs/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js +0 -62
  345. package/lib/commonjs/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js.map +0 -1
  346. package/lib/commonjs/providers/screen/animation/helpers/read-screen-animation-revisions.js +0 -16
  347. package/lib/commonjs/providers/screen/animation/helpers/read-screen-animation-revisions.js.map +0 -1
  348. package/lib/commonjs/providers/screen/gestures/ownership/gesture-ownership-bridge.js +0 -128
  349. package/lib/commonjs/providers/screen/gestures/ownership/gesture-ownership-bridge.js.map +0 -1
  350. package/lib/commonjs/providers/screen/gestures/ownership/resolve-ownership.js +0 -71
  351. package/lib/commonjs/providers/screen/gestures/ownership/resolve-ownership.js.map +0 -1
  352. package/lib/commonjs/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.js +0 -54
  353. package/lib/commonjs/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.js.map +0 -1
  354. package/lib/commonjs/providers/screen/styles/helpers/collect-interpolator-shared-values.js +0 -50
  355. package/lib/commonjs/providers/screen/styles/helpers/collect-interpolator-shared-values.js.map +0 -1
  356. package/lib/commonjs/utils/resolve-chain-target.js +0 -29
  357. package/lib/commonjs/utils/resolve-chain-target.js.map +0 -1
  358. package/lib/module/factories/screen-topology/create-screen-topology.js +0 -142
  359. package/lib/module/factories/screen-topology/create-screen-topology.js.map +0 -1
  360. package/lib/module/factories/screen-topology/index.js +0 -6
  361. package/lib/module/factories/screen-topology/index.js.map +0 -1
  362. package/lib/module/factories/screen-topology/types.js.map +0 -1
  363. package/lib/module/factories/screen-topology/use-screen-relationships.js.map +0 -1
  364. package/lib/module/factories/screen-topology/worklet.js +0 -48
  365. package/lib/module/factories/screen-topology/worklet.js.map +0 -1
  366. package/lib/module/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js +0 -56
  367. package/lib/module/providers/screen/animation/helpers/accessors/use-build-transition-accessor.js.map +0 -1
  368. package/lib/module/providers/screen/animation/helpers/read-screen-animation-revisions.js +0 -11
  369. package/lib/module/providers/screen/animation/helpers/read-screen-animation-revisions.js.map +0 -1
  370. package/lib/module/providers/screen/gestures/ownership/gesture-ownership-bridge.js +0 -124
  371. package/lib/module/providers/screen/gestures/ownership/gesture-ownership-bridge.js.map +0 -1
  372. package/lib/module/providers/screen/gestures/ownership/resolve-ownership.js +0 -67
  373. package/lib/module/providers/screen/gestures/ownership/resolve-ownership.js.map +0 -1
  374. package/lib/module/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.js +0 -50
  375. package/lib/module/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.js.map +0 -1
  376. package/lib/module/providers/screen/styles/helpers/collect-interpolator-shared-values.js +0 -45
  377. package/lib/module/providers/screen/styles/helpers/collect-interpolator-shared-values.js.map +0 -1
  378. package/lib/module/utils/resolve-chain-target.js +0 -25
  379. package/lib/module/utils/resolve-chain-target.js.map +0 -1
  380. package/lib/typescript/factories/screen-topology/create-screen-topology.d.ts.map +0 -1
  381. package/lib/typescript/factories/screen-topology/index.d.ts +0 -5
  382. package/lib/typescript/factories/screen-topology/index.d.ts.map +0 -1
  383. package/lib/typescript/factories/screen-topology/types.d.ts.map +0 -1
  384. package/lib/typescript/factories/screen-topology/use-screen-relationships.d.ts.map +0 -1
  385. package/lib/typescript/factories/screen-topology/worklet.d.ts +0 -5
  386. package/lib/typescript/factories/screen-topology/worklet.d.ts.map +0 -1
  387. package/lib/typescript/providers/screen/animation/helpers/accessors/use-build-transition-accessor.d.ts +0 -9
  388. package/lib/typescript/providers/screen/animation/helpers/accessors/use-build-transition-accessor.d.ts.map +0 -1
  389. package/lib/typescript/providers/screen/animation/helpers/read-screen-animation-revisions.d.ts +0 -6
  390. package/lib/typescript/providers/screen/animation/helpers/read-screen-animation-revisions.d.ts.map +0 -1
  391. package/lib/typescript/providers/screen/gestures/ownership/gesture-ownership-bridge.d.ts +0 -3
  392. package/lib/typescript/providers/screen/gestures/ownership/gesture-ownership-bridge.d.ts.map +0 -1
  393. package/lib/typescript/providers/screen/gestures/ownership/resolve-ownership.d.ts +0 -32
  394. package/lib/typescript/providers/screen/gestures/ownership/resolve-ownership.d.ts.map +0 -1
  395. package/lib/typescript/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.d.ts +0 -11
  396. package/lib/typescript/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.d.ts.map +0 -1
  397. package/lib/typescript/providers/screen/styles/helpers/collect-interpolator-shared-values.d.ts +0 -4
  398. package/lib/typescript/providers/screen/styles/helpers/collect-interpolator-shared-values.d.ts.map +0 -1
  399. package/lib/typescript/utils/resolve-chain-target.d.ts +0 -11
  400. package/lib/typescript/utils/resolve-chain-target.d.ts.map +0 -1
  401. package/src/factories/screen-topology/index.ts +0 -16
  402. package/src/factories/screen-topology/worklet.ts +0 -60
  403. package/src/providers/screen/animation/helpers/accessors/use-build-transition-accessor.ts +0 -96
  404. package/src/providers/screen/animation/helpers/read-screen-animation-revisions.ts +0 -15
  405. package/src/providers/screen/gestures/ownership/gesture-ownership-bridge.tsx +0 -173
  406. package/src/providers/screen/gestures/ownership/resolve-ownership.ts +0 -90
  407. package/src/providers/screen/gestures/scroll-coordination/walk-up-scroll-gesture-coordination.ts +0 -88
  408. package/src/providers/screen/styles/helpers/collect-interpolator-shared-values.ts +0 -75
  409. package/src/utils/resolve-chain-target.ts +0 -33
  410. /package/lib/commonjs/{factories/screen-topology → providers/screen/topology}/types.js +0 -0
  411. /package/lib/module/{factories/screen-topology → providers/screen/topology}/types.js +0 -0
@@ -2,44 +2,33 @@ import type React from "react";
2
2
  import { ScreenContainer } from "../../components/screen-container";
3
3
  import { ScreenLifecycle } from "../../components/screen-lifecycle";
4
4
  import { ScreenAnimationProvider } from "./animation";
5
- import { type BaseDescriptor, DescriptorsProvider } from "./descriptors";
5
+ import { DescriptorsProvider } from "./descriptors";
6
6
  import { ScreenGestureProvider } from "./gestures";
7
7
  import { ScreenOptionsProvider } from "./options";
8
8
  import { ScreenSlotProvider } from "./styles";
9
+ import { ScreenTopologyProvider } from "./topology";
9
10
 
10
11
  type Props = {
11
- previous?: BaseDescriptor;
12
- current?: BaseDescriptor;
13
- next?: BaseDescriptor;
14
- routeKey?: string;
12
+ routeKey: string;
15
13
  children: React.ReactNode;
16
14
  };
17
15
 
18
- export function ScreenComposer({
19
- previous,
20
- current,
21
- next,
22
- routeKey,
23
- children,
24
- }: Props) {
16
+ export function ScreenComposer({ routeKey, children }: Props) {
25
17
  return (
26
- <DescriptorsProvider
27
- previous={previous}
28
- current={current}
29
- next={next}
30
- routeKey={routeKey}
31
- >
32
- <ScreenLifecycle>
33
- <ScreenOptionsProvider>
34
- <ScreenGestureProvider>
35
- <ScreenAnimationProvider>
36
- <ScreenSlotProvider>
37
- <ScreenContainer>{children}</ScreenContainer>
38
- </ScreenSlotProvider>
39
- </ScreenAnimationProvider>
40
- </ScreenGestureProvider>
41
- </ScreenOptionsProvider>
42
- </ScreenLifecycle>
18
+ <DescriptorsProvider routeKey={routeKey}>
19
+ <ScreenTopologyProvider>
20
+ <ScreenLifecycle>
21
+ <ScreenOptionsProvider>
22
+ <ScreenGestureProvider>
23
+ <ScreenAnimationProvider>
24
+ <ScreenSlotProvider>
25
+ <ScreenContainer>{children}</ScreenContainer>
26
+ </ScreenSlotProvider>
27
+ </ScreenAnimationProvider>
28
+ </ScreenGestureProvider>
29
+ </ScreenOptionsProvider>
30
+ </ScreenLifecycle>
31
+ </ScreenTopologyProvider>
43
32
  </DescriptorsProvider>
44
33
  );
45
34
  }
@@ -1,7 +1,4 @@
1
- import type {
2
- ScreenInterpolationProps,
3
- ScreenTransitionAccessor,
4
- } from "../../../../types/animation.types";
1
+ import type { ScreenInterpolationProps } from "../../../../types/animation.types";
5
2
  import { createBoundsAccessor } from "../../../../utils/bounds";
6
3
  import type { ScreenInterpolatorFrame } from "../../animation/helpers/pipeline";
7
4
  import type { SelectedInterpolatorFrame } from "./select-interpolator-frame";
@@ -9,11 +6,9 @@ import type { SelectedInterpolatorFrame } from "./select-interpolator-frame";
9
6
  export const createInterpolatorScope = ({
10
7
  frame,
11
8
  selectedFrame,
12
- transition,
13
9
  }: {
14
10
  frame: ScreenInterpolatorFrame;
15
11
  selectedFrame: SelectedInterpolatorFrame;
16
- transition: ScreenTransitionAccessor;
17
12
  }): ScreenInterpolationProps => {
18
13
  "worklet";
19
14
 
@@ -21,25 +16,11 @@ export const createInterpolatorScope = ({
21
16
  ...frame,
22
17
  ...selectedFrame,
23
18
  };
24
- let scope: ScreenInterpolationProps;
25
- const scopedTransition: ScreenTransitionAccessor = (target) => {
26
- "worklet";
27
-
28
- if ((target?.depth ?? 0) === 0) {
29
- return scope;
30
- }
31
-
32
- return transition(target);
33
- };
34
-
35
- scope = {
19
+ return {
36
20
  ...selectedProps,
37
21
  bounds: createBoundsAccessor(() => {
38
22
  "worklet";
39
23
  return selectedProps;
40
24
  }),
41
- transition: scopedTransition,
42
25
  };
43
-
44
- return scope;
45
26
  };
@@ -1,4 +1,3 @@
1
- import { useMemo } from "react";
2
1
  import {
3
2
  type SharedValue,
4
3
  useAnimatedReaction,
@@ -18,16 +17,13 @@ import type {
18
17
  } from "../../../../types/animation.types";
19
18
  import { logger } from "../../../../utils/logger";
20
19
  import { useScreenAnimationStore } from "../../animation";
21
- import { useBuildTransitionAccessor } from "../../animation/helpers/accessors/use-build-transition-accessor";
22
20
  import type { ScreenInterpolatorFrame } from "../../animation/helpers/pipeline";
23
- import { readScreenAnimationRevisions } from "../../animation/helpers/read-screen-animation-revisions";
24
21
  import { syncSelectedInterpolatorOptions } from "../../animation/helpers/selected-interpolator-options";
25
22
  import { useDescriptorsStore } from "../../descriptors";
26
23
  import {
27
24
  syncScreenOptionsOverrides,
28
25
  useScreenOptionsStore,
29
26
  } from "../../options";
30
- import { collectInterpolatorSharedValues } from "../helpers/collect-interpolator-shared-values";
31
27
  import { createInterpolatorScope } from "../helpers/create-interpolator-scope";
32
28
  import { normalizeSlots } from "../helpers/normalize-slots";
33
29
  import { resolveInterpolatorStyleHandoff } from "../helpers/resolve-interpolator-style-handoff";
@@ -55,7 +51,6 @@ type RunInterpolatorParams = {
55
51
  interpolator: ScreenStyleInterpolator | undefined;
56
52
  props: ScreenInterpolatorFrame;
57
53
  selectedFrame: SelectedInterpolatorFrame;
58
- transition: Parameters<ScreenStyleInterpolator>[0]["transition"];
59
54
  };
60
55
 
61
56
  const normalizeRawStyleMap = (
@@ -76,7 +71,6 @@ const runInterpolator = ({
76
71
  interpolator,
77
72
  props,
78
73
  selectedFrame,
79
- transition,
80
74
  }: RunInterpolatorParams): InterpolatorResult | undefined => {
81
75
  "worklet";
82
76
 
@@ -89,7 +83,6 @@ const runInterpolator = ({
89
83
  createInterpolatorScope({
90
84
  frame: props,
91
85
  selectedFrame,
92
- transition,
93
86
  }),
94
87
  );
95
88
 
@@ -157,16 +150,6 @@ export const useInterpolatedStylesMap = ({
157
150
  const currentInterpolator = useScreenAnimationStore(
158
151
  (store) => store.currentInterpolator,
159
152
  );
160
- const transitionSources = useScreenAnimationStore(
161
- (store) => store.transitionSources,
162
- );
163
- const transitionOriginIndex = useScreenAnimationStore(
164
- (store) => store.transitionOriginIndex,
165
- );
166
- const transition = useBuildTransitionAccessor({
167
- transitionSources,
168
- transitionOriginIndex,
169
- });
170
153
  const hasCurrentInterpolator = !!currentInterpolator;
171
154
  const { closing: currentClosing, entering: currentEntering } =
172
155
  AnimationStore.getBag(currentScreenKey);
@@ -194,14 +177,6 @@ export const useInterpolatedStylesMap = ({
194
177
  : 0;
195
178
  });
196
179
 
197
- // In some cases, a user may want to use external shared values to drive animations in the interpoaltor.
198
- // We can now support this by collecting those shared values and reading them here to trigger an update.
199
- const interpolatorSharedValues = useMemo(
200
- () =>
201
- collectInterpolatorSharedValues([currentInterpolator, nextInterpolator]),
202
- [currentInterpolator, nextInterpolator],
203
- );
204
-
205
180
  const activeScreenKey = nextScreenKey ?? currentScreenKey;
206
181
  const { closing: activeClosing, entering: activeEntering } =
207
182
  AnimationStore.getBag(activeScreenKey);
@@ -236,8 +211,6 @@ export const useInterpolatedStylesMap = ({
236
211
  );
237
212
 
238
213
  const localStylesMaps = useDerivedValue<LocalStyleLayers>(() => {
239
- "worklet";
240
- readScreenAnimationRevisions(transitionSources, interpolatorSharedValues);
241
214
  const props = screenInterpolatorProps.get();
242
215
 
243
216
  const { current, next } = props;
@@ -298,7 +271,6 @@ export const useInterpolatedStylesMap = ({
298
271
  interpolator: currentInterpolator,
299
272
  props,
300
273
  selectedFrame: currentSelectedFrame,
301
- transition,
302
274
  });
303
275
 
304
276
  const initialDestinationStyleGate = resolveInitialDestinationStyleGate({
@@ -335,7 +307,6 @@ export const useInterpolatedStylesMap = ({
335
307
  interpolator: nextInterpolator,
336
308
  props,
337
309
  selectedFrame: nextSelectedFrame,
338
- transition,
339
310
  });
340
311
 
341
312
  syncSelectedInterpolatorOptions(
@@ -3,28 +3,35 @@ import type {
3
3
  ScreenRelationships,
4
4
  ScreenTopology,
5
5
  ScreenTopologyRegistration,
6
- } from "./types";
6
+ } from "../types";
7
7
 
8
8
  type ScreenNode = {
9
+ registered: boolean;
10
+ navigatorKey: string | null;
9
11
  parentScreenKey: string | null;
10
12
  activeChildScreenKeys: string[];
13
+ transitionKey: string | null;
11
14
  };
12
15
 
13
16
  const EMPTY_RELATIONSHIPS: ScreenRelationships = {
14
17
  parentScreenKey: null,
15
18
  activeChildScreenKey: null,
19
+ activeChildNavigatorKey: null,
16
20
  };
17
21
 
18
22
  const areRelationshipsEqual = (
19
23
  left: ScreenRelationships,
20
24
  right: ScreenRelationships,
21
- ): boolean =>
25
+ ) =>
22
26
  left.parentScreenKey === right.parentScreenKey &&
23
- left.activeChildScreenKey === right.activeChildScreenKey;
27
+ left.activeChildScreenKey === right.activeChildScreenKey &&
28
+ left.activeChildNavigatorKey === right.activeChildNavigatorKey;
24
29
 
25
30
  export const createScreenTopology = (): ScreenTopology => {
26
31
  const nodes = new Map<string, ScreenNode>();
32
+ const screenKeyByTransitionKey = new Map<string, string>();
27
33
  const listenersByScreenKey = new Map<string, Set<() => void>>();
34
+ const resolutionListeners = new Set<() => void>();
28
35
  const relationshipCache = new Map<string, ScreenRelationships>();
29
36
 
30
37
  const getNode = (screenKey: string) => nodes.get(screenKey);
@@ -33,8 +40,11 @@ export const createScreenTopology = (): ScreenTopology => {
33
40
  if (existing) return existing;
34
41
 
35
42
  const node: ScreenNode = {
43
+ registered: false,
44
+ navigatorKey: null,
36
45
  parentScreenKey: null,
37
46
  activeChildScreenKeys: [],
47
+ transitionKey: null,
38
48
  };
39
49
  nodes.set(screenKey, node);
40
50
  return node;
@@ -44,6 +54,7 @@ export const createScreenTopology = (): ScreenTopology => {
44
54
  const node = getNode(screenKey);
45
55
  if (
46
56
  node &&
57
+ !node.registered &&
47
58
  !node.parentScreenKey &&
48
59
  node.activeChildScreenKeys.length === 0
49
60
  ) {
@@ -53,27 +64,30 @@ export const createScreenTopology = (): ScreenTopology => {
53
64
 
54
65
  const getParent = (screenKey: string) =>
55
66
  getNode(screenKey)?.parentScreenKey ?? null;
56
-
57
67
  const getActiveChild = (screenKey: string) => {
58
- const activeChildScreenKeys = getNode(screenKey)?.activeChildScreenKeys;
59
- return activeChildScreenKeys?.[activeChildScreenKeys.length - 1] ?? null;
68
+ const children = getNode(screenKey)?.activeChildScreenKeys;
69
+ return children?.[children.length - 1] ?? null;
60
70
  };
61
71
 
62
72
  const materializeRelationships = (screenKey: string): ScreenRelationships => {
63
73
  const parentScreenKey = getParent(screenKey);
64
74
  const activeChildScreenKey = getActiveChild(screenKey);
75
+ const activeChildNavigatorKey = activeChildScreenKey
76
+ ? (getNode(activeChildScreenKey)?.navigatorKey ?? null)
77
+ : null;
65
78
 
66
- if (!parentScreenKey && !activeChildScreenKey) {
67
- return EMPTY_RELATIONSHIPS;
68
- }
79
+ if (!parentScreenKey && !activeChildScreenKey) return EMPTY_RELATIONSHIPS;
69
80
 
70
- return { parentScreenKey, activeChildScreenKey };
81
+ return {
82
+ parentScreenKey,
83
+ activeChildScreenKey,
84
+ activeChildNavigatorKey,
85
+ };
71
86
  };
72
87
 
73
88
  const getRelationships = (screenKey: string) => {
74
89
  const cached = relationshipCache.get(screenKey);
75
90
  if (cached) return cached;
76
-
77
91
  const relationships = materializeRelationships(screenKey);
78
92
  relationshipCache.set(screenKey, relationships);
79
93
  return relationships;
@@ -93,83 +107,110 @@ export const createScreenTopology = (): ScreenTopology => {
93
107
  }
94
108
 
95
109
  for (const [screenKey, previous] of previousRelationships) {
96
- const listeners = listenersByScreenKey.get(screenKey);
97
- if (!listeners) continue;
98
-
99
110
  const next = getRelationships(screenKey);
100
111
  if (areRelationshipsEqual(previous, next)) {
101
112
  relationshipCache.set(screenKey, previous);
102
113
  continue;
103
114
  }
104
-
105
- for (const listener of listeners) listener();
115
+ for (const listener of listenersByScreenKey.get(screenKey) ?? []) {
116
+ listener();
117
+ }
106
118
  }
119
+
120
+ for (const listener of resolutionListeners) listener();
107
121
  };
108
122
 
109
123
  const register = ({
110
124
  screenKey,
125
+ navigatorKey,
111
126
  parentScreenKey,
127
+ transitionKey,
112
128
  }: ScreenTopologyRegistration) => {
129
+ const transitionKeyOwner = transitionKey
130
+ ? screenKeyByTransitionKey.get(transitionKey)
131
+ : undefined;
132
+ if (transitionKeyOwner && transitionKeyOwner !== screenKey) {
133
+ throw new Error(
134
+ `Transition key "${transitionKey}" is already registered by screen "${transitionKeyOwner}".`,
135
+ );
136
+ }
137
+
113
138
  mutate(new Set([screenKey]), () => {
114
- ensureNode(screenKey).parentScreenKey = parentScreenKey ?? null;
139
+ const node = ensureNode(screenKey);
140
+ if (
141
+ node.transitionKey &&
142
+ node.transitionKey !== transitionKey &&
143
+ screenKeyByTransitionKey.get(node.transitionKey) === screenKey
144
+ ) {
145
+ screenKeyByTransitionKey.delete(node.transitionKey);
146
+ }
147
+
148
+ node.registered = true;
149
+ node.navigatorKey = navigatorKey ?? null;
150
+ node.parentScreenKey = parentScreenKey ?? null;
151
+ node.transitionKey = transitionKey ?? null;
152
+ if (transitionKey) screenKeyByTransitionKey.set(transitionKey, screenKey);
115
153
  });
116
154
  };
117
155
 
118
156
  const unregister = (screenKey: string) => {
119
157
  const node = getNode(screenKey);
120
158
  if (!node) return;
121
-
122
159
  const affectedScreenKeys = new Set([screenKey]);
123
- if (node.parentScreenKey) {
124
- affectedScreenKeys.add(node.parentScreenKey);
125
- }
160
+ if (node.parentScreenKey) affectedScreenKeys.add(node.parentScreenKey);
126
161
 
127
162
  mutate(affectedScreenKeys, () => {
163
+ if (
164
+ node.transitionKey &&
165
+ screenKeyByTransitionKey.get(node.transitionKey) === screenKey
166
+ ) {
167
+ screenKeyByTransitionKey.delete(node.transitionKey);
168
+ }
169
+
128
170
  if (node.parentScreenKey) {
129
171
  const parent = getNode(node.parentScreenKey);
130
172
  if (parent) {
131
173
  parent.activeChildScreenKeys = parent.activeChildScreenKeys.filter(
132
- (activeScreenKey) => activeScreenKey !== screenKey,
174
+ (childScreenKey) => childScreenKey !== screenKey,
133
175
  );
134
176
  }
135
177
  removeNodeIfEmpty(node.parentScreenKey);
136
178
  }
137
-
138
179
  nodes.delete(screenKey);
139
180
  });
140
181
  };
141
182
 
142
- const activate = (registration: ActiveScreenRegistration) => {
143
- if (getParent(registration.screenKey) !== registration.parentScreenKey) {
183
+ const activate = ({
184
+ screenKey,
185
+ parentScreenKey,
186
+ }: ActiveScreenRegistration) => {
187
+ if (getParent(screenKey) !== parentScreenKey) {
144
188
  throw new Error(
145
189
  "Screen topology can only activate a direct containment child.",
146
190
  );
147
191
  }
148
192
 
149
- const affectedScreenKeys = new Set([registration.parentScreenKey]);
150
- mutate(affectedScreenKeys, () => {
151
- const parent = ensureNode(registration.parentScreenKey);
152
- parent.activeChildScreenKeys = [
153
- ...parent.activeChildScreenKeys.filter(
154
- (screenKey) => screenKey !== registration.screenKey,
155
- ),
156
- registration.screenKey,
157
- ];
193
+ mutate(new Set([parentScreenKey]), () => {
194
+ const parent = ensureNode(parentScreenKey);
195
+ // A closing screen remains the active owner until it unmounts.
196
+ if (parent.activeChildScreenKeys.includes(screenKey)) return;
197
+ parent.activeChildScreenKeys.push(screenKey);
158
198
  });
199
+ };
159
200
 
160
- return () => {
161
- const parent = getNode(registration.parentScreenKey);
162
- if (!parent?.activeChildScreenKeys.includes(registration.screenKey)) {
163
- return;
164
- }
201
+ const resolve = (screenKey: string, depth: number) => {
202
+ if (!Number.isInteger(depth)) return null;
165
203
 
166
- mutate(affectedScreenKeys, () => {
167
- parent.activeChildScreenKeys = parent.activeChildScreenKeys.filter(
168
- (screenKey) => screenKey !== registration.screenKey,
169
- );
170
- removeNodeIfEmpty(registration.parentScreenKey);
171
- });
172
- };
204
+ let resolvedScreenKey: string | null = screenKey;
205
+ for (let step = 0; step < Math.abs(depth); step += 1) {
206
+ resolvedScreenKey =
207
+ depth < 0
208
+ ? getParent(resolvedScreenKey)
209
+ : getActiveChild(resolvedScreenKey);
210
+ if (!resolvedScreenKey) return null;
211
+ }
212
+
213
+ return getNode(resolvedScreenKey)?.registered ? resolvedScreenKey : null;
173
214
  };
174
215
 
175
216
  return {
@@ -177,22 +218,25 @@ export const createScreenTopology = (): ScreenTopology => {
177
218
  unregister,
178
219
  activate,
179
220
  getRelationships,
221
+ resolve,
222
+ resolveTransitionKey: (key) => {
223
+ const screenKey = screenKeyByTransitionKey.get(key) ?? key;
224
+ return getNode(screenKey)?.registered ? screenKey : null;
225
+ },
180
226
  subscribe: (screenKey, listener) => {
181
227
  const listeners =
182
228
  listenersByScreenKey.get(screenKey) ?? new Set<() => void>();
183
229
  listeners.add(listener);
184
230
  listenersByScreenKey.set(screenKey, listeners);
185
-
186
231
  return () => {
187
232
  listeners.delete(listener);
188
- if (listeners.size === 0) {
189
- listenersByScreenKey.delete(screenKey);
190
- if (!getNode(screenKey)) {
191
- relationshipCache.delete(screenKey);
192
- }
193
- }
233
+ if (listeners.size === 0) listenersByScreenKey.delete(screenKey);
194
234
  };
195
235
  },
236
+ subscribeResolution: (listener) => {
237
+ resolutionListeners.add(listener);
238
+ return () => resolutionListeners.delete(listener);
239
+ },
196
240
  };
197
241
  };
198
242
 
@@ -0,0 +1,29 @@
1
+ import { useCallback, useSyncExternalStore } from "react";
2
+ import type { ScreenTransitionTarget } from "../../../../types/animation.types";
3
+ import { screenTopology } from "../helpers/create-screen-topology";
4
+
5
+ export const useResolvedTransitionKey = (
6
+ screenKey: string | null,
7
+ target?: ScreenTransitionTarget,
8
+ ) => {
9
+ const depth = typeof target === "string" ? null : (target?.depth ?? 0);
10
+ const requiresResolution = typeof target === "string" || depth !== 0;
11
+ const subscribe = useCallback(
12
+ (listener: () => void) =>
13
+ requiresResolution
14
+ ? screenTopology.subscribeResolution(listener)
15
+ : () => {},
16
+ [requiresResolution],
17
+ );
18
+ const getSnapshot = useCallback(
19
+ () =>
20
+ typeof target === "string"
21
+ ? screenTopology.resolveTransitionKey(target)
22
+ : requiresResolution && screenKey
23
+ ? screenTopology.resolve(screenKey, depth ?? 0)
24
+ : screenKey,
25
+ [depth, requiresResolution, screenKey, target],
26
+ );
27
+
28
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
29
+ };
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useSyncExternalStore } from "react";
2
- import { screenTopology } from "./create-screen-topology";
2
+ import { screenTopology } from "../helpers/create-screen-topology";
3
3
 
4
4
  export const useScreenRelationships = (screenKey: string) => {
5
5
  const subscribe = useCallback(
@@ -0,0 +1,16 @@
1
+ export {
2
+ createScreenTopology,
3
+ screenTopology,
4
+ } from "./helpers/create-screen-topology";
5
+ export { useResolvedTransitionKey } from "./hooks/use-resolved-transition-key";
6
+ export { useScreenRelationships } from "./hooks/use-screen-relationships";
7
+ export {
8
+ ScreenTopologyProvider,
9
+ useScreenTopologyStore,
10
+ } from "./topology.provider";
11
+ export type {
12
+ ActiveScreenRegistration,
13
+ ScreenRelationships,
14
+ ScreenTopology,
15
+ ScreenTopologyRegistration,
16
+ } from "./types";
@@ -0,0 +1,72 @@
1
+ import { type ReactNode, useLayoutEffect, useMemo } from "react";
2
+ import createProvider from "../../../utils/create-provider";
3
+ import { useBlankStackStore } from "../../stack/blank-stack.provider";
4
+ import { useDescriptorsStore } from "../descriptors";
5
+ import { screenTopology } from "./helpers/create-screen-topology";
6
+
7
+ type Props = {
8
+ children: ReactNode;
9
+ };
10
+
11
+ type ScreenTopologyContextValue = {
12
+ screenKey: string;
13
+ };
14
+
15
+ const {
16
+ ScreenTopologyProvider,
17
+ useOptionalScreenTopologyStore,
18
+ useScreenTopologyStore,
19
+ } = createProvider("ScreenTopology")<Props, ScreenTopologyContextValue>(
20
+ ({ children }) => {
21
+ const screenKey = useDescriptorsStore(
22
+ (store) => store.derivations.currentScreenKey,
23
+ );
24
+ const transitionKey = useDescriptorsStore(
25
+ (store) => store.options.transitionKey,
26
+ );
27
+ const parentScreenKey = useOptionalScreenTopologyStore(
28
+ (store) => store?.screenKey,
29
+ );
30
+ const navigatorKey = useBlankStackStore((store) => store.navigatorKey);
31
+ const isActiveScreen = useBlankStackStore((store) => {
32
+ const focusedScene = store.scenes[store.focusedIndex];
33
+ return (
34
+ focusedScene?.route.key === screenKey &&
35
+ focusedScene.activity === "active"
36
+ );
37
+ });
38
+ useLayoutEffect(() => {
39
+ screenTopology.register({
40
+ screenKey,
41
+ navigatorKey,
42
+ parentScreenKey,
43
+ transitionKey,
44
+ });
45
+ }, [screenKey, navigatorKey, parentScreenKey, transitionKey]);
46
+
47
+ useLayoutEffect(() => {
48
+ if (!isActiveScreen || !parentScreenKey) return;
49
+
50
+ screenTopology.activate({
51
+ screenKey,
52
+ parentScreenKey,
53
+ });
54
+ }, [isActiveScreen, parentScreenKey, screenKey]);
55
+
56
+ useLayoutEffect(
57
+ () => () => {
58
+ screenTopology.unregister(screenKey);
59
+ },
60
+ [screenKey],
61
+ );
62
+
63
+ const value = useMemo(() => ({ screenKey }), [screenKey]);
64
+
65
+ return {
66
+ value,
67
+ children,
68
+ };
69
+ },
70
+ );
71
+
72
+ export { ScreenTopologyProvider, useScreenTopologyStore };
@@ -1,6 +1,8 @@
1
1
  export type ScreenTopologyRegistration = {
2
2
  screenKey: string;
3
+ navigatorKey?: string;
3
4
  parentScreenKey?: string;
5
+ transitionKey?: string;
4
6
  };
5
7
 
6
8
  export type ActiveScreenRegistration = {
@@ -11,12 +13,16 @@ export type ActiveScreenRegistration = {
11
13
  export type ScreenRelationships = Readonly<{
12
14
  parentScreenKey: string | null;
13
15
  activeChildScreenKey: string | null;
16
+ activeChildNavigatorKey: string | null;
14
17
  }>;
15
18
 
16
19
  export type ScreenTopology = {
17
20
  register(registration: ScreenTopologyRegistration): void;
18
21
  unregister(screenKey: string): void;
19
- activate(registration: ActiveScreenRegistration): () => void;
22
+ activate(registration: ActiveScreenRegistration): void;
20
23
  getRelationships(screenKey: string): ScreenRelationships;
24
+ resolve(screenKey: string, depth: number): string | null;
25
+ resolveTransitionKey(key: string): string | null;
21
26
  subscribe(screenKey: string, listener: () => void): () => void;
27
+ subscribeResolution(listener: () => void): () => void;
22
28
  };
@@ -1,5 +1,5 @@
1
- import { useScreenRelationships } from "../../factories/screen-topology";
2
1
  import { useDescriptorsStore } from "./descriptors";
2
+ import { useScreenRelationships } from "./topology";
3
3
 
4
4
  export const useCurrentScreenRelationships = () => {
5
5
  const screenKey = useDescriptorsStore(
@@ -189,6 +189,7 @@ const buildBaseScenes = ({
189
189
  childStateUnchanged &&
190
190
  previousDescriptor.route === descriptorRoute &&
191
191
  previousDescriptor.navigation === props.navigation &&
192
+ previousDescriptor.render === sourceDescriptor.render &&
192
193
  previousDescriptor.options === sourceDescriptor.options
193
194
  ? previousDescriptor
194
195
  : ({
@@ -132,9 +132,12 @@ export const areDescriptorSourcesEquivalent = (
132
132
  previous: BlankStackDescriptorSource,
133
133
  next: BlankStackDescriptorSource,
134
134
  ): boolean => {
135
- return areRecordsShallowEqual(
136
- previous.options as unknown as Record<string, unknown>,
137
- next.options as unknown as Record<string, unknown>,
135
+ return (
136
+ previous.render === next.render &&
137
+ areRecordsShallowEqual(
138
+ previous.options as unknown as Record<string, unknown>,
139
+ next.options as unknown as Record<string, unknown>,
140
+ )
138
141
  );
139
142
  };
140
143
 
@@ -0,0 +1,5 @@
1
+ export { StackTransitionProvider } from "./stack-transition.provider";
2
+ export {
3
+ type StackTransition,
4
+ useStackTransition,
5
+ } from "./use-stack-transition";