react-native-screen-transitions 3.9.0-beta.3 → 3.10.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 (420) hide show
  1. package/lib/commonjs/shared/animation/snap-to.js +2 -0
  2. package/lib/commonjs/shared/animation/snap-to.js.map +1 -1
  3. package/lib/commonjs/shared/components/boundary/components/boundary-target.js +19 -20
  4. package/lib/commonjs/shared/components/boundary/components/boundary-target.js.map +1 -1
  5. package/lib/commonjs/shared/components/boundary/create-boundary-component.js +16 -2
  6. package/lib/commonjs/shared/components/boundary/create-boundary-component.js.map +1 -1
  7. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +5 -0
  8. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  9. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js +1 -3
  10. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  11. package/lib/commonjs/shared/components/boundary/index.js +4 -3
  12. package/lib/commonjs/shared/components/boundary/index.js.map +1 -1
  13. package/lib/commonjs/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +47 -187
  14. package/lib/commonjs/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +1 -1
  15. package/lib/commonjs/shared/components/boundary/portal/components/boundary-content-portal/index.js +21 -13
  16. package/lib/commonjs/shared/components/boundary/portal/components/boundary-content-portal/index.js.map +1 -1
  17. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/host.js +1 -12
  18. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  19. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +42 -35
  20. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  21. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +3 -4
  22. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  23. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +46 -130
  24. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  25. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/index.js +45 -9
  26. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  27. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.js.map +1 -1
  28. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +2 -29
  29. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  30. package/lib/commonjs/shared/components/boundary/portal/utils/handoff-target.js +33 -0
  31. package/lib/commonjs/shared/components/boundary/portal/utils/handoff-target.js.map +1 -0
  32. package/lib/commonjs/shared/components/boundary/portal/utils/resolve-portal.js +19 -15
  33. package/lib/commonjs/shared/components/boundary/portal/utils/resolve-portal.js.map +1 -1
  34. package/lib/commonjs/shared/components/boundary/portal/utils/teleport-control.js +1 -10
  35. package/lib/commonjs/shared/components/boundary/portal/utils/teleport-control.js.map +1 -1
  36. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js +18 -36
  37. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  38. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js +7 -0
  39. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  40. package/lib/commonjs/shared/components/boundary/utils/resolve-boundary-target.js +29 -0
  41. package/lib/commonjs/shared/components/boundary/utils/resolve-boundary-target.js.map +1 -0
  42. package/lib/commonjs/shared/components/masked-view.js +9 -1
  43. package/lib/commonjs/shared/components/masked-view.js.map +1 -1
  44. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js +3 -1
  45. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js.map +1 -1
  46. package/lib/commonjs/shared/components/screen-container/layers/maybe-masked-navigation-container.js +9 -1
  47. package/lib/commonjs/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
  48. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +2 -0
  49. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  50. package/lib/commonjs/shared/configs/index.js +2 -1
  51. package/lib/commonjs/shared/configs/index.js.map +1 -1
  52. package/lib/commonjs/shared/configs/specs.js +23 -1
  53. package/lib/commonjs/shared/configs/specs.js.map +1 -1
  54. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js +4 -1
  55. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  56. package/lib/commonjs/shared/providers/screen/gestures/gestures.provider.js +2 -8
  57. package/lib/commonjs/shared/providers/screen/gestures/gestures.provider.js.map +1 -1
  58. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +1 -0
  59. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  60. package/lib/commonjs/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js +37 -3
  61. package/lib/commonjs/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js.map +1 -1
  62. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +1 -0
  63. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  64. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-release.js +3 -2
  65. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-release.js.map +1 -1
  66. package/lib/commonjs/shared/providers/screen/gestures/types.js.map +1 -1
  67. package/lib/commonjs/shared/providers/screen/styles/helpers/transition-visual-state.js +42 -0
  68. package/lib/commonjs/shared/providers/screen/styles/helpers/transition-visual-state.js.map +1 -0
  69. package/lib/commonjs/shared/providers/screen/styles/helpers/visibility-gate.js +11 -5
  70. package/lib/commonjs/shared/providers/screen/styles/helpers/visibility-gate.js.map +1 -1
  71. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +23 -10
  72. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  73. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +10 -8
  74. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  75. package/lib/commonjs/shared/stores/bounds/internals/links.js +4 -4
  76. package/lib/commonjs/shared/stores/bounds/internals/links.js.map +1 -1
  77. package/lib/commonjs/shared/stores/scroll.store.js +20 -2
  78. package/lib/commonjs/shared/stores/scroll.store.js.map +1 -1
  79. package/lib/commonjs/shared/stores/system.store.js +2 -0
  80. package/lib/commonjs/shared/stores/system.store.js.map +1 -1
  81. package/lib/commonjs/shared/utils/animation/animate-to-progress.js +23 -1
  82. package/lib/commonjs/shared/utils/animation/animate-to-progress.js.map +1 -1
  83. package/lib/commonjs/shared/utils/animation/animate.js +14 -2
  84. package/lib/commonjs/shared/utils/animation/animate.js.map +1 -1
  85. package/lib/commonjs/shared/utils/animation/spring/spring.js +22 -2
  86. package/lib/commonjs/shared/utils/animation/spring/spring.js.map +1 -1
  87. package/lib/commonjs/shared/utils/animation/spring/springUtils.js +96 -0
  88. package/lib/commonjs/shared/utils/animation/spring/springUtils.js.map +1 -1
  89. package/lib/commonjs/shared/utils/animation/state.js +4 -0
  90. package/lib/commonjs/shared/utils/bounds/navigation/reveal/math.js +20 -6
  91. package/lib/commonjs/shared/utils/bounds/navigation/reveal/math.js.map +1 -1
  92. package/lib/commonjs/shared/utils/bounds/navigation/zoom/build.js +51 -20
  93. package/lib/commonjs/shared/utils/bounds/navigation/zoom/build.js.map +1 -1
  94. package/lib/commonjs/shared/utils/bounds/navigation/zoom/config.js +4 -3
  95. package/lib/commonjs/shared/utils/bounds/navigation/zoom/config.js.map +1 -1
  96. package/lib/commonjs/shared/utils/bounds/navigation/zoom/drag.js +2 -31
  97. package/lib/commonjs/shared/utils/bounds/navigation/zoom/drag.js.map +1 -1
  98. package/lib/commonjs/shared/utils/bounds/navigation/zoom/helpers.js +2 -13
  99. package/lib/commonjs/shared/utils/bounds/navigation/zoom/helpers.js.map +1 -1
  100. package/lib/commonjs/shared/utils/bounds/navigation/zoom/mask.js +3 -2
  101. package/lib/commonjs/shared/utils/bounds/navigation/zoom/mask.js.map +1 -1
  102. package/lib/commonjs/shared/utils/bounds/navigation/zoom/targets.js +36 -1
  103. package/lib/commonjs/shared/utils/bounds/navigation/zoom/targets.js.map +1 -1
  104. package/lib/module/shared/animation/snap-to.js +2 -0
  105. package/lib/module/shared/animation/snap-to.js.map +1 -1
  106. package/lib/module/shared/components/boundary/components/boundary-target.js +19 -20
  107. package/lib/module/shared/components/boundary/components/boundary-target.js.map +1 -1
  108. package/lib/module/shared/components/boundary/create-boundary-component.js +17 -3
  109. package/lib/module/shared/components/boundary/create-boundary-component.js.map +1 -1
  110. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +5 -0
  111. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  112. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js +1 -3
  113. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  114. package/lib/module/shared/components/boundary/index.js +3 -2
  115. package/lib/module/shared/components/boundary/index.js.map +1 -1
  116. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +49 -189
  117. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +1 -1
  118. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/index.js +21 -13
  119. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/index.js.map +1 -1
  120. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js +2 -13
  121. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  122. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +45 -38
  123. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  124. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +3 -4
  125. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  126. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +50 -134
  127. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  128. package/lib/module/shared/components/boundary/portal/components/boundary-portal/index.js +44 -9
  129. package/lib/module/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  130. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.js.map +1 -1
  131. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +1 -27
  132. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  133. package/lib/module/shared/components/boundary/portal/utils/handoff-target.js +28 -0
  134. package/lib/module/shared/components/boundary/portal/utils/handoff-target.js.map +1 -0
  135. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js +19 -15
  136. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js.map +1 -1
  137. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js +0 -8
  138. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js.map +1 -1
  139. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js +19 -37
  140. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  141. package/lib/module/shared/components/boundary/utils/refresh-signals.js +7 -0
  142. package/lib/module/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  143. package/lib/module/shared/components/boundary/utils/resolve-boundary-target.js +24 -0
  144. package/lib/module/shared/components/boundary/utils/resolve-boundary-target.js.map +1 -0
  145. package/lib/module/shared/components/masked-view.js +10 -2
  146. package/lib/module/shared/components/masked-view.js.map +1 -1
  147. package/lib/module/shared/components/screen-container/layers/backdrop.js +3 -1
  148. package/lib/module/shared/components/screen-container/layers/backdrop.js.map +1 -1
  149. package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js +10 -2
  150. package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
  151. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +2 -0
  152. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  153. package/lib/module/shared/configs/index.js +3 -2
  154. package/lib/module/shared/configs/index.js.map +1 -1
  155. package/lib/module/shared/configs/specs.js +22 -0
  156. package/lib/module/shared/configs/specs.js.map +1 -1
  157. package/lib/module/shared/providers/helpers/measured-bounds-writes.js +4 -1
  158. package/lib/module/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  159. package/lib/module/shared/providers/screen/gestures/gestures.provider.js +2 -8
  160. package/lib/module/shared/providers/screen/gestures/gestures.provider.js.map +1 -1
  161. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +1 -0
  162. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  163. package/lib/module/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js +35 -2
  164. package/lib/module/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js.map +1 -1
  165. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +1 -0
  166. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  167. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-release.js +3 -2
  168. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-release.js.map +1 -1
  169. package/lib/module/shared/providers/screen/gestures/types.js.map +1 -1
  170. package/lib/module/shared/providers/screen/styles/helpers/transition-visual-state.js +35 -0
  171. package/lib/module/shared/providers/screen/styles/helpers/transition-visual-state.js.map +1 -0
  172. package/lib/module/shared/providers/screen/styles/helpers/visibility-gate.js +11 -5
  173. package/lib/module/shared/providers/screen/styles/helpers/visibility-gate.js.map +1 -1
  174. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +23 -10
  175. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  176. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +10 -8
  177. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  178. package/lib/module/shared/stores/bounds/internals/links.js +4 -4
  179. package/lib/module/shared/stores/bounds/internals/links.js.map +1 -1
  180. package/lib/module/shared/stores/scroll.store.js +17 -0
  181. package/lib/module/shared/stores/scroll.store.js.map +1 -1
  182. package/lib/module/shared/stores/system.store.js +2 -0
  183. package/lib/module/shared/stores/system.store.js.map +1 -1
  184. package/lib/module/shared/utils/animation/animate-to-progress.js +21 -0
  185. package/lib/module/shared/utils/animation/animate-to-progress.js.map +1 -1
  186. package/lib/module/shared/utils/animation/animate.js +14 -2
  187. package/lib/module/shared/utils/animation/animate.js.map +1 -1
  188. package/lib/module/shared/utils/animation/spring/spring.js +23 -3
  189. package/lib/module/shared/utils/animation/spring/spring.js.map +1 -1
  190. package/lib/module/shared/utils/animation/spring/springUtils.js +95 -0
  191. package/lib/module/shared/utils/animation/spring/springUtils.js.map +1 -1
  192. package/lib/module/shared/utils/animation/state.js +2 -0
  193. package/lib/module/shared/utils/bounds/navigation/reveal/math.js +19 -6
  194. package/lib/module/shared/utils/bounds/navigation/reveal/math.js.map +1 -1
  195. package/lib/module/shared/utils/bounds/navigation/zoom/build.js +54 -23
  196. package/lib/module/shared/utils/bounds/navigation/zoom/build.js.map +1 -1
  197. package/lib/module/shared/utils/bounds/navigation/zoom/config.js +4 -3
  198. package/lib/module/shared/utils/bounds/navigation/zoom/config.js.map +1 -1
  199. package/lib/module/shared/utils/bounds/navigation/zoom/drag.js +2 -30
  200. package/lib/module/shared/utils/bounds/navigation/zoom/drag.js.map +1 -1
  201. package/lib/module/shared/utils/bounds/navigation/zoom/helpers.js +3 -14
  202. package/lib/module/shared/utils/bounds/navigation/zoom/helpers.js.map +1 -1
  203. package/lib/module/shared/utils/bounds/navigation/zoom/mask.js +3 -2
  204. package/lib/module/shared/utils/bounds/navigation/zoom/mask.js.map +1 -1
  205. package/lib/module/shared/utils/bounds/navigation/zoom/targets.js +35 -1
  206. package/lib/module/shared/utils/bounds/navigation/zoom/targets.js.map +1 -1
  207. package/lib/typescript/shared/animation/snap-to.d.ts.map +1 -1
  208. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts +2 -1
  209. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts.map +1 -1
  210. package/lib/typescript/shared/components/boundary/create-boundary-component.d.ts.map +1 -1
  211. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts.map +1 -1
  212. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts +3 -4
  213. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts.map +1 -1
  214. package/lib/typescript/shared/components/boundary/index.d.ts +6 -9
  215. package/lib/typescript/shared/components/boundary/index.d.ts.map +1 -1
  216. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts +1 -3
  217. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts.map +1 -1
  218. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/index.d.ts.map +1 -1
  219. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/host.d.ts.map +1 -1
  220. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts.map +1 -1
  221. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts +1 -10
  222. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts.map +1 -1
  223. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts +1 -3
  224. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts.map +1 -1
  225. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/index.d.ts +2 -2
  226. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/index.d.ts.map +1 -1
  227. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.d.ts +0 -1
  228. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.d.ts.map +1 -1
  229. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts +1 -10
  230. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts.map +1 -1
  231. package/lib/typescript/shared/components/boundary/portal/utils/handoff-target.d.ts +12 -0
  232. package/lib/typescript/shared/components/boundary/portal/utils/handoff-target.d.ts.map +1 -0
  233. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts +2 -3
  234. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts.map +1 -1
  235. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts +0 -4
  236. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts.map +1 -1
  237. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts +8 -12
  238. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts.map +1 -1
  239. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts +1 -0
  240. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts.map +1 -1
  241. package/lib/typescript/shared/components/boundary/utils/resolve-boundary-target.d.ts +12 -0
  242. package/lib/typescript/shared/components/boundary/utils/resolve-boundary-target.d.ts.map +1 -0
  243. package/lib/typescript/shared/components/masked-view.d.ts.map +1 -1
  244. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts.map +1 -1
  245. package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts.map +1 -1
  246. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-transition-start-controller.d.ts.map +1 -1
  247. package/lib/typescript/shared/configs/index.d.ts +16 -0
  248. package/lib/typescript/shared/configs/index.d.ts.map +1 -1
  249. package/lib/typescript/shared/configs/specs.d.ts +19 -0
  250. package/lib/typescript/shared/configs/specs.d.ts.map +1 -1
  251. package/lib/typescript/shared/index.d.ts +16 -0
  252. package/lib/typescript/shared/index.d.ts.map +1 -1
  253. package/lib/typescript/shared/providers/helpers/measured-bounds-writes.d.ts.map +1 -1
  254. package/lib/typescript/shared/providers/screen/gestures/gestures.provider.d.ts.map +1 -1
  255. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.d.ts.map +1 -1
  256. package/lib/typescript/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.d.ts +2 -1
  257. package/lib/typescript/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.d.ts.map +1 -1
  258. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.d.ts.map +1 -1
  259. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-release.d.ts.map +1 -1
  260. package/lib/typescript/shared/providers/screen/gestures/types.d.ts +1 -9
  261. package/lib/typescript/shared/providers/screen/gestures/types.d.ts.map +1 -1
  262. package/lib/typescript/shared/providers/screen/styles/helpers/transition-visual-state.d.ts +18 -0
  263. package/lib/typescript/shared/providers/screen/styles/helpers/transition-visual-state.d.ts.map +1 -0
  264. package/lib/typescript/shared/providers/screen/styles/helpers/visibility-gate.d.ts +2 -2
  265. package/lib/typescript/shared/providers/screen/styles/helpers/visibility-gate.d.ts.map +1 -1
  266. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts.map +1 -1
  267. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts.map +1 -1
  268. package/lib/typescript/shared/stores/bounds/internals/links.d.ts +1 -1
  269. package/lib/typescript/shared/stores/bounds/internals/links.d.ts.map +1 -1
  270. package/lib/typescript/shared/stores/scroll.store.d.ts +7 -0
  271. package/lib/typescript/shared/stores/scroll.store.d.ts.map +1 -1
  272. package/lib/typescript/shared/stores/system.store.d.ts +5 -0
  273. package/lib/typescript/shared/stores/system.store.d.ts.map +1 -1
  274. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts +6 -1
  275. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts.map +1 -1
  276. package/lib/typescript/shared/utils/animation/animate.d.ts +2 -2
  277. package/lib/typescript/shared/utils/animation/animate.d.ts.map +1 -1
  278. package/lib/typescript/shared/utils/animation/spring/spring.d.ts +2 -2
  279. package/lib/typescript/shared/utils/animation/spring/spring.d.ts.map +1 -1
  280. package/lib/typescript/shared/utils/animation/spring/springUtils.d.ts +3 -0
  281. package/lib/typescript/shared/utils/animation/spring/springUtils.d.ts.map +1 -1
  282. package/lib/typescript/shared/utils/animation/state.d.ts +6 -0
  283. package/lib/typescript/shared/utils/animation/state.d.ts.map +1 -1
  284. package/lib/typescript/shared/utils/bounds/navigation/reveal/math.d.ts +12 -1
  285. package/lib/typescript/shared/utils/bounds/navigation/reveal/math.d.ts.map +1 -1
  286. package/lib/typescript/shared/utils/bounds/navigation/zoom/build.d.ts.map +1 -1
  287. package/lib/typescript/shared/utils/bounds/navigation/zoom/config.d.ts +2 -2
  288. package/lib/typescript/shared/utils/bounds/navigation/zoom/config.d.ts.map +1 -1
  289. package/lib/typescript/shared/utils/bounds/navigation/zoom/drag.d.ts +2 -11
  290. package/lib/typescript/shared/utils/bounds/navigation/zoom/drag.d.ts.map +1 -1
  291. package/lib/typescript/shared/utils/bounds/navigation/zoom/helpers.d.ts +7 -2
  292. package/lib/typescript/shared/utils/bounds/navigation/zoom/helpers.d.ts.map +1 -1
  293. package/lib/typescript/shared/utils/bounds/navigation/zoom/mask.d.ts +3 -1
  294. package/lib/typescript/shared/utils/bounds/navigation/zoom/mask.d.ts.map +1 -1
  295. package/lib/typescript/shared/utils/bounds/navigation/zoom/targets.d.ts +6 -0
  296. package/lib/typescript/shared/utils/bounds/navigation/zoom/targets.d.ts.map +1 -1
  297. package/package.json +2 -2
  298. package/src/shared/animation/snap-to.ts +5 -0
  299. package/src/shared/components/boundary/components/boundary-target.tsx +37 -23
  300. package/src/shared/components/boundary/create-boundary-component.tsx +29 -3
  301. package/src/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.ts +11 -0
  302. package/src/shared/components/boundary/hooks/use-boundary-measurement.ts +3 -9
  303. package/src/shared/components/boundary/index.tsx +4 -8
  304. package/src/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.ts +73 -275
  305. package/src/shared/components/boundary/portal/components/boundary-content-portal/index.tsx +31 -12
  306. package/src/shared/components/boundary/portal/components/boundary-portal/components/host.tsx +2 -12
  307. package/src/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.tsx +66 -64
  308. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.ts +2 -9
  309. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.ts +73 -186
  310. package/src/shared/components/boundary/portal/components/boundary-portal/index.tsx +72 -12
  311. package/src/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.ts +0 -1
  312. package/src/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.ts +2 -39
  313. package/src/shared/components/boundary/portal/utils/handoff-target.ts +48 -0
  314. package/src/shared/components/boundary/portal/utils/resolve-portal.ts +26 -18
  315. package/src/shared/components/boundary/portal/utils/teleport-control.ts +0 -12
  316. package/src/shared/components/boundary/providers/boundary-root.provider.tsx +28 -80
  317. package/src/shared/components/boundary/utils/refresh-signals.ts +8 -0
  318. package/src/shared/components/boundary/utils/resolve-boundary-target.tsx +39 -0
  319. package/src/shared/components/masked-view.tsx +20 -4
  320. package/src/shared/components/screen-container/layers/backdrop.tsx +3 -1
  321. package/src/shared/components/screen-container/layers/maybe-masked-navigation-container.tsx +14 -4
  322. package/src/shared/components/screen-lifecycle/hooks/use-transition-start-controller.ts +2 -0
  323. package/src/shared/configs/index.ts +2 -1
  324. package/src/shared/configs/specs.ts +23 -0
  325. package/src/shared/providers/helpers/measured-bounds-writes.ts +1 -0
  326. package/src/shared/providers/screen/gestures/gestures.provider.tsx +2 -10
  327. package/src/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.ts +1 -0
  328. package/src/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.ts +74 -3
  329. package/src/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.ts +1 -0
  330. package/src/shared/providers/screen/gestures/pinch/behavior/pinch-release.ts +2 -4
  331. package/src/shared/providers/screen/gestures/types.ts +0 -14
  332. package/src/shared/providers/screen/styles/helpers/transition-visual-state.ts +44 -0
  333. package/src/shared/providers/screen/styles/helpers/visibility-gate.ts +17 -7
  334. package/src/shared/providers/screen/styles/hooks/use-interpolated-style-maps.tsx +30 -15
  335. package/src/shared/providers/screen/styles/hooks/use-maybe-block-visibility.tsx +14 -13
  336. package/src/shared/stores/bounds/internals/links.ts +13 -2
  337. package/src/shared/stores/scroll.store.ts +23 -0
  338. package/src/shared/stores/system.store.ts +8 -0
  339. package/src/shared/utils/animation/animate-to-progress.ts +59 -28
  340. package/src/shared/utils/animation/animate.ts +18 -2
  341. package/src/shared/utils/animation/spring/spring.ts +36 -1
  342. package/src/shared/utils/animation/spring/springUtils.ts +130 -0
  343. package/src/shared/utils/animation/state.ts +8 -0
  344. package/src/shared/utils/bounds/navigation/reveal/math.ts +25 -5
  345. package/src/shared/utils/bounds/navigation/zoom/build.ts +85 -23
  346. package/src/shared/utils/bounds/navigation/zoom/config.ts +4 -3
  347. package/src/shared/utils/bounds/navigation/zoom/drag.ts +3 -42
  348. package/src/shared/utils/bounds/navigation/zoom/helpers.ts +9 -18
  349. package/src/shared/utils/bounds/navigation/zoom/mask.ts +4 -1
  350. package/src/shared/utils/bounds/navigation/zoom/targets.ts +59 -1
  351. package/lib/commonjs/shared/components/boundary/hooks/use-register-target.js +0 -32
  352. package/lib/commonjs/shared/components/boundary/hooks/use-register-target.js.map +0 -1
  353. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js +0 -51
  354. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js.map +0 -1
  355. package/lib/commonjs/shared/components/boundary/portal/utils/ownership.js +0 -217
  356. package/lib/commonjs/shared/components/boundary/portal/utils/ownership.js.map +0 -1
  357. package/lib/commonjs/shared/components/boundary/portal/utils/shallow-equal.js +0 -29
  358. package/lib/commonjs/shared/components/boundary/portal/utils/shallow-equal.js.map +0 -1
  359. package/lib/commonjs/shared/components/boundary/portal/utils/visible-host.js +0 -25
  360. package/lib/commonjs/shared/components/boundary/portal/utils/visible-host.js.map +0 -1
  361. package/lib/commonjs/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js +0 -64
  362. package/lib/commonjs/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js.map +0 -1
  363. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js +0 -21
  364. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js.map +0 -1
  365. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js +0 -29
  366. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js.map +0 -1
  367. package/lib/commonjs/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js +0 -38
  368. package/lib/commonjs/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js.map +0 -1
  369. package/lib/commonjs/shared/providers/screen/styles/helpers/opening-phase.js +0 -32
  370. package/lib/commonjs/shared/providers/screen/styles/helpers/opening-phase.js.map +0 -1
  371. package/lib/module/shared/components/boundary/hooks/use-register-target.js +0 -27
  372. package/lib/module/shared/components/boundary/hooks/use-register-target.js.map +0 -1
  373. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js +0 -46
  374. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js.map +0 -1
  375. package/lib/module/shared/components/boundary/portal/utils/ownership.js +0 -210
  376. package/lib/module/shared/components/boundary/portal/utils/ownership.js.map +0 -1
  377. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js +0 -24
  378. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js.map +0 -1
  379. package/lib/module/shared/components/boundary/portal/utils/visible-host.js +0 -20
  380. package/lib/module/shared/components/boundary/portal/utils/visible-host.js.map +0 -1
  381. package/lib/module/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js +0 -59
  382. package/lib/module/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js.map +0 -1
  383. package/lib/module/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js +0 -15
  384. package/lib/module/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js.map +0 -1
  385. package/lib/module/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js +0 -24
  386. package/lib/module/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js.map +0 -1
  387. package/lib/module/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js +0 -33
  388. package/lib/module/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js.map +0 -1
  389. package/lib/module/shared/providers/screen/styles/helpers/opening-phase.js +0 -26
  390. package/lib/module/shared/providers/screen/styles/helpers/opening-phase.js.map +0 -1
  391. package/lib/typescript/shared/components/boundary/hooks/use-register-target.d.ts +0 -10
  392. package/lib/typescript/shared/components/boundary/hooks/use-register-target.d.ts.map +0 -1
  393. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.d.ts +0 -13
  394. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.d.ts.map +0 -1
  395. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts +0 -34
  396. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts.map +0 -1
  397. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts +0 -8
  398. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts.map +0 -1
  399. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts +0 -8
  400. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts.map +0 -1
  401. package/lib/typescript/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.d.ts +0 -15
  402. package/lib/typescript/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.d.ts.map +0 -1
  403. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.d.ts +0 -4
  404. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.d.ts.map +0 -1
  405. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.d.ts +0 -5
  406. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.d.ts.map +0 -1
  407. package/lib/typescript/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.d.ts +0 -9
  408. package/lib/typescript/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.d.ts.map +0 -1
  409. package/lib/typescript/shared/providers/screen/styles/helpers/opening-phase.d.ts +0 -16
  410. package/lib/typescript/shared/providers/screen/styles/helpers/opening-phase.d.ts.map +0 -1
  411. package/src/shared/components/boundary/hooks/use-register-target.ts +0 -43
  412. package/src/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.tsx +0 -79
  413. package/src/shared/components/boundary/portal/utils/ownership.ts +0 -315
  414. package/src/shared/components/boundary/portal/utils/shallow-equal.ts +0 -25
  415. package/src/shared/components/boundary/portal/utils/visible-host.ts +0 -24
  416. package/src/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.ts +0 -88
  417. package/src/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.ts +0 -19
  418. package/src/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.ts +0 -47
  419. package/src/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.ts +0 -50
  420. package/src/shared/providers/screen/styles/helpers/opening-phase.ts +0 -25
@@ -1,8 +1,35 @@
1
- import { memo, type ReactNode } from "react";
1
+ import {
2
+ type ComponentProps,
3
+ type ComponentType,
4
+ memo,
5
+ type ReactNode,
6
+ } from "react";
2
7
  import type { View } from "react-native";
3
- import type { AnimatedRef } from "react-native-reanimated";
4
- import { BoundaryPortalSlot } from "./components/portal-slot";
8
+ import Animated, { type AnimatedRef, runOnUI } from "react-native-reanimated";
9
+ import { logger } from "../../../../../utils/logger";
10
+ import {
11
+ isTeleportAvailable,
12
+ PORTAL_POINTER_EVENTS,
13
+ NativePortal as TeleportPortal,
14
+ } from "../../teleport";
5
15
  import { useBoundaryPortalAttachment } from "./hooks/use-boundary-portal-attachment";
16
+ import { usePlaceholderStyles } from "./hooks/use-placeholder-styles";
17
+
18
+ type NullableHostNamePortalProps = Omit<
19
+ ComponentProps<NonNullable<typeof TeleportPortal>>,
20
+ "hostName"
21
+ > & {
22
+ hostName?: string | null;
23
+ };
24
+
25
+ const AnimatedNativePortal = TeleportPortal
26
+ ? Animated.createAnimatedComponent(
27
+ TeleportPortal as ComponentType<NullableHostNamePortalProps>,
28
+ )
29
+ : null;
30
+ const EnabledNativePortal = AnimatedNativePortal as NonNullable<
31
+ typeof AnimatedNativePortal
32
+ >;
6
33
 
7
34
  type BoundaryPortalProps = {
8
35
  boundaryId: string;
@@ -17,19 +44,52 @@ export const BoundaryPortal = memo(function BoundaryPortal({
17
44
  enabled,
18
45
  placeholderRef,
19
46
  }: BoundaryPortalProps) {
20
- const { teleportProps } = useBoundaryPortalAttachment({
21
- boundaryId,
22
- enabled,
23
- });
47
+ if (!enabled || !isTeleportAvailable || !AnimatedNativePortal) {
48
+ return children;
49
+ }
24
50
 
25
51
  return (
26
- <BoundaryPortalSlot
27
- id={boundaryId}
28
- enabled={enabled}
29
- animatedProps={teleportProps}
52
+ <EnabledBoundaryPortal
53
+ boundaryId={boundaryId}
30
54
  placeholderRef={placeholderRef}
31
55
  >
32
56
  {children}
33
- </BoundaryPortalSlot>
57
+ </EnabledBoundaryPortal>
58
+ );
59
+ });
60
+
61
+ const EnabledBoundaryPortal = memo(function EnabledBoundaryPortal({
62
+ boundaryId,
63
+ children,
64
+ placeholderRef,
65
+ }: Omit<BoundaryPortalProps, "enabled">) {
66
+ if (__DEV__ && !boundaryId) {
67
+ logger.warnOnce(
68
+ "portal:missing-id",
69
+ "A boundary portal was rendered without an id; rendering inline.",
70
+ );
71
+ }
72
+
73
+ const { teleportProps } = useBoundaryPortalAttachment({ boundaryId });
74
+ const { handleOnLayout, placeholderStyle } = usePlaceholderStyles();
75
+
76
+ return (
77
+ <Animated.View
78
+ ref={placeholderRef}
79
+ onLayout={({ nativeEvent: { layout } }) =>
80
+ runOnUI(handleOnLayout)(layout)
81
+ }
82
+ style={placeholderStyle}
83
+ pointerEvents={PORTAL_POINTER_EVENTS}
84
+ collapsable={false}
85
+ >
86
+ <EnabledNativePortal
87
+ animatedProps={teleportProps}
88
+ name={boundaryId}
89
+ pointerEvents={PORTAL_POINTER_EVENTS}
90
+ >
91
+ {children}
92
+ </EnabledNativePortal>
93
+ </Animated.View>
34
94
  );
35
95
  });
@@ -4,7 +4,6 @@ export type HostRegistration = {
4
4
  hostKey: string;
5
5
  screenKey: string;
6
6
  fallback: boolean;
7
- capturesScroll: boolean;
8
7
  };
9
8
 
10
9
  type HostRegistrySnapshot = Record<string, string>;
@@ -5,11 +5,11 @@ import type { NormalizedTransitionInterpolatedStyle } from "../../../../../../ty
5
5
 
6
6
  export type ActivePortalBoundaryHost = {
7
7
  boundaryId: string;
8
- escapeClipping: boolean;
9
8
  hostKey: string;
10
9
  localStylesMaps: SharedValue<LocalStyleLayers>;
11
10
  pairKey: string;
12
11
  portalHostName: string;
12
+ portalHostReady: SharedValue<boolean>;
13
13
  screenKey: string;
14
14
  slotsMap: SharedValue<NormalizedTransitionInterpolatedStyle>;
15
15
  };
@@ -55,11 +55,11 @@ const isSameHost = (
55
55
  ) => {
56
56
  return (
57
57
  a.boundaryId === b.boundaryId &&
58
- a.escapeClipping === b.escapeClipping &&
59
58
  a.hostKey === b.hostKey &&
60
59
  a.localStylesMaps === b.localStylesMaps &&
61
60
  a.pairKey === b.pairKey &&
62
61
  a.portalHostName === b.portalHostName &&
62
+ a.portalHostReady === b.portalHostReady &&
63
63
  a.screenKey === b.screenKey &&
64
64
  a.slotsMap === b.slotsMap
65
65
  );
@@ -85,43 +85,6 @@ export const unmountPortalBoundaryHostByName = (
85
85
  emit();
86
86
  };
87
87
 
88
- /**
89
- * Post-handoff GC: drop every receiver for this boundary except the one now
90
- * visible (`keepPortalHostName`). Called once the new host is confirmed on
91
- * screen so the superseded receivers stop rendering.
92
- */
93
- export const dropStalePortalBoundaryHosts = ({
94
- boundaryId,
95
- keepPortalHostName,
96
- }: {
97
- boundaryId: string;
98
- keepPortalHostName: string;
99
- }) => {
100
- if (!activeBoundaryHosts.has(keepPortalHostName)) {
101
- return;
102
- }
103
-
104
- let didDelete = false;
105
-
106
- for (const [hostEntryKey, host] of activeBoundaryHosts) {
107
- if (
108
- host.boundaryId !== boundaryId ||
109
- host.portalHostName === keepPortalHostName
110
- ) {
111
- continue;
112
- }
113
-
114
- activeBoundaryHosts.delete(hostEntryKey);
115
- didDelete = true;
116
- }
117
-
118
- if (!didDelete) {
119
- return;
120
- }
121
-
122
- emit();
123
- };
124
-
125
88
  const subscribe = (listener: () => void) => {
126
89
  listeners.add(listener);
127
90
 
@@ -0,0 +1,48 @@
1
+ import { getLinkKeyFromTag } from "../../../../stores/bounds/helpers/link-pairs.helpers";
2
+ import type {
3
+ LinkPairsState,
4
+ ScreenKey,
5
+ ScreenPairKey,
6
+ } from "../../../../stores/bounds/types";
7
+
8
+ type ResolveEnteringHandoffTargetParams = {
9
+ animationProgress: number;
10
+ boundaryId: string;
11
+ currentScreenKey: ScreenKey;
12
+ pairsState: LinkPairsState;
13
+ sourcePairKey?: ScreenPairKey;
14
+ };
15
+
16
+ /** Resolve only the immediate A -> B entering handoff. */
17
+ export const resolveEnteringHandoffTarget = ({
18
+ animationProgress,
19
+ boundaryId,
20
+ currentScreenKey,
21
+ pairsState,
22
+ sourcePairKey,
23
+ }: ResolveEnteringHandoffTargetParams): ScreenKey | null => {
24
+ "worklet";
25
+
26
+ if (!sourcePairKey || animationProgress <= 0) {
27
+ return null;
28
+ }
29
+
30
+ const pair = pairsState[sourcePairKey];
31
+ const linkKey = getLinkKeyFromTag(boundaryId);
32
+ const link = pair?.links[linkKey];
33
+
34
+ if (
35
+ link?.status !== "complete" ||
36
+ link.source.screenKey !== currentScreenKey ||
37
+ !link.source.handoff ||
38
+ !link.destination.handoff
39
+ ) {
40
+ return null;
41
+ }
42
+
43
+ if (link.group && pair.groups[link.group]?.activeId !== linkKey) {
44
+ return null;
45
+ }
46
+
47
+ return link.destination.screenKey;
48
+ };
@@ -1,17 +1,33 @@
1
1
  import { logger } from "../../../../utils/logger";
2
2
  import { isTeleportAvailable } from "../teleport";
3
3
 
4
- export type BoundaryPortalRuntime = {
4
+ export type BoundaryPortalRuntime = Readonly<{
5
5
  handoff: boolean;
6
6
  escapeClipping: boolean;
7
- enabled: boolean;
8
- };
7
+ }>;
9
8
 
10
9
  type ResolveBoundaryPortalParams = {
11
10
  handoff?: boolean;
12
11
  escapeClipping?: boolean;
13
12
  };
14
13
 
14
+ const DISABLED_RUNTIME: BoundaryPortalRuntime = {
15
+ handoff: false,
16
+ escapeClipping: false,
17
+ };
18
+ const HANDOFF_RUNTIME: BoundaryPortalRuntime = {
19
+ handoff: true,
20
+ escapeClipping: false,
21
+ };
22
+ const ESCAPE_CLIPPING_RUNTIME: BoundaryPortalRuntime = {
23
+ handoff: false,
24
+ escapeClipping: true,
25
+ };
26
+ const HANDOFF_ESCAPE_CLIPPING_RUNTIME: BoundaryPortalRuntime = {
27
+ handoff: true,
28
+ escapeClipping: true,
29
+ };
30
+
15
31
  export const resolveBoundaryPortal = ({
16
32
  handoff,
17
33
  escapeClipping,
@@ -22,11 +38,7 @@ export const resolveBoundaryPortal = ({
22
38
  const enabled = resolvedHandoff || resolvedEscapeClipping;
23
39
 
24
40
  if (!enabled) {
25
- return {
26
- handoff: false,
27
- escapeClipping: false,
28
- enabled: false,
29
- };
41
+ return DISABLED_RUNTIME;
30
42
  }
31
43
 
32
44
  if (!isTeleportAvailable) {
@@ -35,16 +47,12 @@ export const resolveBoundaryPortal = ({
35
47
  "react-native-teleport is not installed; handoff and escapeClipping boundaries will render inline.",
36
48
  );
37
49
 
38
- return {
39
- handoff: false,
40
- escapeClipping: false,
41
- enabled: false,
42
- };
50
+ return DISABLED_RUNTIME;
43
51
  }
44
52
 
45
- return {
46
- handoff: resolvedHandoff,
47
- escapeClipping: resolvedEscapeClipping,
48
- enabled,
49
- };
53
+ return resolvedHandoff
54
+ ? resolvedEscapeClipping
55
+ ? HANDOFF_ESCAPE_CLIPPING_RUNTIME
56
+ : HANDOFF_RUNTIME
57
+ : ESCAPE_CLIPPING_RUNTIME;
50
58
  };
@@ -11,15 +11,3 @@ export const isTeleportEnabled = (
11
11
 
12
12
  return teleport?.enabled !== false;
13
13
  };
14
-
15
- export const shouldAttachBoundaryPortal = ({
16
- enabled,
17
- teleport,
18
- }: {
19
- enabled: boolean;
20
- teleport?: BoundaryTeleportControl;
21
- }) => {
22
- "worklet";
23
-
24
- return enabled && isTeleportEnabled(teleport);
25
- };
@@ -1,14 +1,13 @@
1
1
  import {
2
2
  type ForwardedRef,
3
3
  type ReactNode,
4
- useCallback,
5
4
  useImperativeHandle,
5
+ useLayoutEffect,
6
6
  useMemo,
7
7
  useRef,
8
- useState,
9
8
  } from "react";
10
9
  import type { View } from "react-native";
11
- import type { AnimatedRef, StyleProps } from "react-native-reanimated";
10
+ import type { AnimatedRef } from "react-native-reanimated";
12
11
  import { useAnimatedRef } from "react-native-reanimated";
13
12
  import { useDescriptorsStore } from "../../../providers/screen/descriptors";
14
13
  import {
@@ -30,28 +29,11 @@ import type {
30
29
  BoundaryOwnProps,
31
30
  } from "../types";
32
31
 
33
- interface BoundaryRootContextValue extends BoundaryRootRenderState {
34
- registerTargetRef: (
35
- targetRef: AnimatedRef<View>,
36
- preparedStyles: StyleProps,
37
- measurementRef?: AnimatedRef<View>,
38
- ) => void;
39
- unregisterTargetRef: (targetRef: AnimatedRef<View>) => void;
40
- activeTargetRef: AnimatedRef<View> | null;
41
- boundTag: BoundTag;
42
- portalRuntime: BoundaryPortalRuntime;
43
- }
44
-
45
- type BoundaryTargetEntry = {
46
- ref: AnimatedRef<View>;
47
- /** Surface to measure — the portal placeholder when content can teleport. */
48
- measurementRef: AnimatedRef<View>;
49
- preparedStyles: StyleProps;
50
- };
32
+ type BoundaryRootContextValue = BoundaryRootRenderState;
51
33
 
52
34
  // logger.warn prepends the library prefix.
53
35
  const MULTIPLE_TARGETS_WARNING =
54
- "Multiple Boundary.Target elements were rendered under the same boundary root. The first registered target will be measured.";
36
+ "Multiple Boundary.Target elements were rendered under the same boundary root. The first target in render order will be measured.";
55
37
 
56
38
  export const TARGET_OUTSIDE_ROOT_WARNING =
57
39
  "Boundary.Target must be rendered inside Transition.Boundary or a component created by createBoundaryComponent.";
@@ -61,9 +43,9 @@ export type BoundaryRootRenderState = {
61
43
  boundTag: BoundTag;
62
44
  currentScreenKey: string;
63
45
  handoffEnabled: boolean;
46
+ measurementRef: AnimatedRef<View>;
64
47
  portalRuntime: BoundaryPortalRuntime;
65
48
  ref: AnimatedRef<View>;
66
- rootEscapePlaceholderRef: AnimatedRef<View>;
67
49
  shouldRenderBoundaryRootThroughPortal: boolean;
68
50
  shouldRenderHandoffHost: boolean;
69
51
  };
@@ -75,8 +57,11 @@ type BoundaryRootProviderProps = Pick<
75
57
  children: (state: BoundaryRootRenderState) => ReactNode;
76
58
  config: BoundaryConfigProps;
77
59
  forwardedRef?: ForwardedRef<any>;
60
+ hasTarget: boolean;
78
61
  id: BoundaryId;
79
62
  style?: unknown;
63
+ targetCount: number;
64
+ targetStyle?: unknown;
80
65
  };
81
66
 
82
67
  export const {
@@ -95,8 +80,11 @@ export const {
95
80
  forwardedRef,
96
81
  group,
97
82
  handoff,
83
+ hasTarget,
98
84
  id,
99
85
  style,
86
+ targetCount,
87
+ targetStyle,
100
88
  }) => {
101
89
  const requestedBoundTag = useMemo(
102
90
  () => createBoundTag(String(id), group),
@@ -137,51 +125,18 @@ export const {
137
125
  const associatedStyles = useComposedSlotStyles(boundTag.tag, style);
138
126
  const associatedStackingStyles = useSlotStackingStyles(boundTag.tag);
139
127
  const rootRef = useAnimatedRef<View>();
140
- const rootEscapePlaceholderRef = useAnimatedRef<View>();
141
- const [targetEntry, setTargetEntry] = useState<BoundaryTargetEntry | null>(
142
- null,
143
- );
144
-
145
- const registerTargetRef = useCallback(
146
- (
147
- targetRef: AnimatedRef<View>,
148
- preparedStyles: StyleProps,
149
- measurementRef?: AnimatedRef<View>,
150
- ) => {
151
- setTargetEntry((prev) => {
152
- if (prev?.ref === targetRef) {
153
- return prev;
154
- }
155
-
156
- if (__DEV__ && prev !== null) {
157
- logger.warnOnce(
158
- "boundary:multiple-targets",
159
- MULTIPLE_TARGETS_WARNING,
160
- );
161
- }
162
-
163
- return (
164
- prev ?? {
165
- ref: targetRef,
166
- measurementRef: measurementRef ?? targetRef,
167
- preparedStyles,
168
- }
169
- );
170
- });
171
- },
172
- [],
173
- );
128
+ const measurementRef = useAnimatedRef<View>();
174
129
 
175
- const unregisterTargetRef = useCallback((targetRef: AnimatedRef<View>) => {
176
- setTargetEntry((prev) => (prev?.ref === targetRef ? null : prev));
177
- }, []);
130
+ useLayoutEffect(() => {
131
+ if (__DEV__ && targetCount > 1) {
132
+ logger.warnOnce("boundary:multiple-targets", MULTIPLE_TARGETS_WARNING);
133
+ }
134
+ }, [targetCount]);
178
135
 
179
- const rootMeasurementRef = shouldEscapeBoundaryRootToScreenHost
180
- ? rootEscapePlaceholderRef
181
- : rootRef;
182
- const measuredRef = targetEntry?.measurementRef ?? rootMeasurementRef;
183
- const hasActiveTarget = targetEntry !== null;
184
- const targetPreparedStyles = targetEntry?.preparedStyles;
136
+ const measuredRef =
137
+ hasTarget || shouldEscapeBoundaryRootToScreenHost
138
+ ? measurementRef
139
+ : rootRef;
185
140
 
186
141
  useImperativeHandle(forwardedRef, () => rootRef.current as any, [rootRef]);
187
142
 
@@ -191,15 +146,14 @@ export const {
191
146
  runtimeEnabled,
192
147
  currentScreenKey,
193
148
  measuredRef,
194
- style,
195
- targetPreparedStyles,
149
+ style: hasTarget ? targetStyle : style,
196
150
  handoff: portalRuntime.handoff,
197
151
  escapeClipping: portalRuntime.escapeClipping,
198
152
  config,
199
153
  });
200
154
 
201
155
  const shouldRenderBoundaryRootThroughPortal =
202
- shouldEscapeBoundaryRootToScreenHost && !hasActiveTarget;
156
+ shouldEscapeBoundaryRootToScreenHost && !hasTarget;
203
157
  const handoffEnabled = enabled && portalRuntime.handoff;
204
158
  // A nested active target takes the full associated style, so the root keeps
205
159
  // only its stacking context. Root-owned escape-clipping moves the root
@@ -209,7 +163,7 @@ export const {
209
163
  // handoff host is absolute-filled inside this root, so the root is the
210
164
  // visual frame that animates the received payload.
211
165
  const attachedStyle = shouldAttachAssociatedStyles
212
- ? hasActiveTarget
166
+ ? hasTarget
213
167
  ? associatedStackingStyles
214
168
  : shouldRenderBoundaryRootThroughPortal
215
169
  ? undefined
@@ -219,31 +173,25 @@ export const {
219
173
  const value = useMemo<BoundaryRootContextValue>(
220
174
  () => ({
221
175
  attachedStyle,
222
- activeTargetRef: targetEntry?.ref ?? null,
223
176
  boundTag,
224
177
  currentScreenKey,
225
178
  handoffEnabled,
179
+ measurementRef,
226
180
  portalRuntime,
227
- registerTargetRef,
228
181
  ref: rootRef,
229
- rootEscapePlaceholderRef,
230
182
  shouldRenderBoundaryRootThroughPortal,
231
- shouldRenderHandoffHost: handoffEnabled && !hasActiveTarget,
232
- unregisterTargetRef,
183
+ shouldRenderHandoffHost: handoffEnabled && !hasTarget,
233
184
  }),
234
185
  [
235
186
  attachedStyle,
236
187
  boundTag,
237
188
  currentScreenKey,
238
189
  handoffEnabled,
239
- hasActiveTarget,
190
+ hasTarget,
191
+ measurementRef,
240
192
  portalRuntime,
241
- registerTargetRef,
242
193
  rootRef,
243
- rootEscapePlaceholderRef,
244
194
  shouldRenderBoundaryRootThroughPortal,
245
- targetEntry,
246
- unregisterTargetRef,
247
195
  ],
248
196
  );
249
197
 
@@ -40,6 +40,7 @@ export const getRefreshBoundarySignal = (params: {
40
40
  entering: boolean;
41
41
  animating: boolean;
42
42
  progress: number;
43
+ gestureInProgress: boolean;
43
44
  linkState?: LinkPairsState;
44
45
  }): RefreshBoundarySignal | null => {
45
46
  "worklet";
@@ -57,11 +58,18 @@ export const getRefreshBoundarySignal = (params: {
57
58
  entering,
58
59
  animating,
59
60
  progress,
61
+ gestureInProgress,
60
62
  linkState,
61
63
  } = params;
62
64
 
63
65
  if (!enabled) return null;
64
66
 
67
+ // This is temporary for a patch fix. However, this architecture should
68
+ // change: our signals aren't currently doing their intended job, so right
69
+ // now we'll add one more guard until the shape is much more tested and
70
+ // bulletproof.
71
+ if (gestureInProgress) return null;
72
+
65
73
  const canRefreshPreCloseDestination =
66
74
  shouldRefresh && closing && !entering && !animating && progress >= 1;
67
75
 
@@ -0,0 +1,39 @@
1
+ import {
2
+ Children,
3
+ cloneElement,
4
+ Fragment,
5
+ isValidElement,
6
+ type ReactElement,
7
+ type ReactNode,
8
+ } from "react";
9
+
10
+ type ResolveBoundaryTargetOptions = {
11
+ isTarget: (element: ReactElement) => boolean;
12
+ mapTarget?: (element: ReactElement, selected: boolean) => ReactElement;
13
+ };
14
+
15
+ export const resolveBoundaryTarget = (
16
+ children: ReactNode,
17
+ options: ResolveBoundaryTargetOptions,
18
+ ): {
19
+ children: ReactNode;
20
+ target: ReactElement | null;
21
+ targetCount: number;
22
+ } => {
23
+ let target: ReactElement | null = null;
24
+ let targetCount = 0;
25
+ const map = (nodes: ReactNode): ReactNode =>
26
+ Children.map(nodes, (node) => {
27
+ if (!isValidElement<{ children?: ReactNode }>(node)) return node;
28
+ if (node.type === Fragment) {
29
+ return cloneElement(node, undefined, map(node.props.children));
30
+ }
31
+ if (!options.isTarget(node)) return node;
32
+ target ??= node;
33
+ targetCount += 1;
34
+ return options.mapTarget?.(node, targetCount === 1) ?? node;
35
+ });
36
+
37
+ const mappedChildren = map(children);
38
+ return { children: target ? mappedChildren : children, target, targetCount };
39
+ };
@@ -1,4 +1,10 @@
1
- import { type StyleProp, StyleSheet, View, type ViewStyle } from "react-native";
1
+ import {
2
+ I18nManager,
3
+ type StyleProp,
4
+ StyleSheet,
5
+ View,
6
+ type ViewStyle,
7
+ } from "react-native";
2
8
  import { CONTAINER_STYLE_ID, MASK_STYLE_ID } from "../constants";
3
9
  import { createTransitionAwareComponent } from "./create-transition-aware-component";
4
10
 
@@ -49,9 +55,19 @@ const styles = StyleSheet.create({
49
55
  root: {
50
56
  flex: 1,
51
57
  },
52
- rootMask: {
53
- backgroundColor: "white",
54
- },
58
+ // The mask rect's translate math assumes a physical top-left base. Under
59
+ // native RTL a fixed-width flex child anchors to the right edge, so pin it
60
+ // to the physical left (`end` = left edge in RTL).
61
+ rootMask: I18nManager.isRTL
62
+ ? {
63
+ backgroundColor: "white",
64
+ end: 0,
65
+ position: "absolute",
66
+ top: 0,
67
+ }
68
+ : {
69
+ backgroundColor: "white",
70
+ },
55
71
  rootContainer: {
56
72
  flex: 1,
57
73
  },
@@ -29,7 +29,7 @@ export const BackdropLayer = memo(function BackdropLayer({
29
29
  const BackdropComponent = current.options.backdropComponent;
30
30
  const routeKey = current.route.key;
31
31
  const animations = AnimationStore.getBag(routeKey);
32
- const { targetProgress, resolvedAutoSnapPoint } =
32
+ const { targetProgress, animationProgress, resolvedAutoSnapPoint } =
33
33
  SystemStore.getBag(routeKey);
34
34
 
35
35
  const AnimatedBackdropComponent = useMemo(
@@ -98,6 +98,7 @@ export const BackdropLayer = memo(function BackdropLayer({
98
98
  spec,
99
99
  animations,
100
100
  targetProgress,
101
+ animationProgress,
101
102
  onAnimationFinish: shouldDismiss ? dismissScreen : undefined,
102
103
  });
103
104
  })();
@@ -105,6 +106,7 @@ export const BackdropLayer = memo(function BackdropLayer({
105
106
  }, [
106
107
  animations,
107
108
  targetProgress,
109
+ animationProgress,
108
110
  resolvedAutoSnapPoint,
109
111
  backdropBehavior,
110
112
  current,
@@ -1,5 +1,5 @@
1
1
  import { memo, useCallback } from "react";
2
- import { StyleSheet, View, type ViewProps } from "react-native";
2
+ import { I18nManager, StyleSheet, View, type ViewProps } from "react-native";
3
3
  import Animated from "react-native-reanimated";
4
4
  import {
5
5
  NAVIGATION_MASK_CONTAINER_STYLE_ID,
@@ -97,7 +97,17 @@ const styles = StyleSheet.create({
97
97
  navigationContainer: {
98
98
  flex: 1,
99
99
  },
100
- navigationMaskElement: {
101
- backgroundColor: "white",
102
- },
100
+ // The mask rect's translate math assumes a physical top-left base. Under
101
+ // native RTL a fixed-width flex child anchors to the right edge, so pin it
102
+ // to the physical left (`end` = left edge in RTL).
103
+ navigationMaskElement: I18nManager.isRTL
104
+ ? {
105
+ backgroundColor: "white",
106
+ end: 0,
107
+ position: "absolute",
108
+ top: 0,
109
+ }
110
+ : {
111
+ backgroundColor: "white",
112
+ },
103
113
  });
@@ -22,6 +22,7 @@ export const useTransitionStartController = ({
22
22
  }) => {
23
23
  const {
24
24
  targetProgress,
25
+ animationProgress,
25
26
  pendingLifecycleRequestKind,
26
27
  pendingLifecycleRequestTarget,
27
28
  pendingLifecycleStartBlockCount,
@@ -62,6 +63,7 @@ export const useTransitionStartController = ({
62
63
  spec: transitionSpec,
63
64
  animations,
64
65
  targetProgress,
66
+ animationProgress,
65
67
  onAnimationFinish,
66
68
  });
67
69