react-native-screen-transitions 3.9.0 → 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 (383) 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 +40 -33
  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/providers/helpers/measured-bounds-writes.js +4 -1
  51. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  52. package/lib/commonjs/shared/providers/screen/gestures/gestures.provider.js +2 -8
  53. package/lib/commonjs/shared/providers/screen/gestures/gestures.provider.js.map +1 -1
  54. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +1 -0
  55. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  56. package/lib/commonjs/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js +37 -3
  57. package/lib/commonjs/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js.map +1 -1
  58. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +1 -0
  59. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  60. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-release.js +3 -2
  61. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-release.js.map +1 -1
  62. package/lib/commonjs/shared/providers/screen/gestures/types.js.map +1 -1
  63. package/lib/commonjs/shared/providers/screen/styles/helpers/transition-visual-state.js +42 -0
  64. package/lib/commonjs/shared/providers/screen/styles/helpers/transition-visual-state.js.map +1 -0
  65. package/lib/commonjs/shared/providers/screen/styles/helpers/visibility-gate.js +11 -5
  66. package/lib/commonjs/shared/providers/screen/styles/helpers/visibility-gate.js.map +1 -1
  67. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +23 -10
  68. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  69. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +10 -8
  70. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  71. package/lib/commonjs/shared/stores/bounds/internals/links.js +4 -4
  72. package/lib/commonjs/shared/stores/bounds/internals/links.js.map +1 -1
  73. package/lib/commonjs/shared/stores/scroll.store.js +20 -2
  74. package/lib/commonjs/shared/stores/scroll.store.js.map +1 -1
  75. package/lib/commonjs/shared/stores/system.store.js +2 -0
  76. package/lib/commonjs/shared/stores/system.store.js.map +1 -1
  77. package/lib/commonjs/shared/utils/animation/animate-to-progress.js +23 -1
  78. package/lib/commonjs/shared/utils/animation/animate-to-progress.js.map +1 -1
  79. package/lib/commonjs/shared/utils/animation/animate.js +14 -2
  80. package/lib/commonjs/shared/utils/animation/animate.js.map +1 -1
  81. package/lib/commonjs/shared/utils/animation/spring/spring.js +22 -2
  82. package/lib/commonjs/shared/utils/animation/spring/spring.js.map +1 -1
  83. package/lib/commonjs/shared/utils/animation/spring/springUtils.js +96 -0
  84. package/lib/commonjs/shared/utils/animation/spring/springUtils.js.map +1 -1
  85. package/lib/commonjs/shared/utils/animation/state.js +4 -0
  86. package/lib/commonjs/shared/utils/bounds/navigation/reveal/math.js +17 -5
  87. package/lib/commonjs/shared/utils/bounds/navigation/reveal/math.js.map +1 -1
  88. package/lib/commonjs/shared/utils/bounds/navigation/zoom/build.js +44 -20
  89. package/lib/commonjs/shared/utils/bounds/navigation/zoom/build.js.map +1 -1
  90. package/lib/commonjs/shared/utils/bounds/navigation/zoom/drag.js +2 -31
  91. package/lib/commonjs/shared/utils/bounds/navigation/zoom/drag.js.map +1 -1
  92. package/lib/commonjs/shared/utils/bounds/navigation/zoom/helpers.js +3 -17
  93. package/lib/commonjs/shared/utils/bounds/navigation/zoom/helpers.js.map +1 -1
  94. package/lib/module/shared/animation/snap-to.js +2 -0
  95. package/lib/module/shared/animation/snap-to.js.map +1 -1
  96. package/lib/module/shared/components/boundary/components/boundary-target.js +19 -20
  97. package/lib/module/shared/components/boundary/components/boundary-target.js.map +1 -1
  98. package/lib/module/shared/components/boundary/create-boundary-component.js +17 -3
  99. package/lib/module/shared/components/boundary/create-boundary-component.js.map +1 -1
  100. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +5 -0
  101. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  102. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js +1 -3
  103. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  104. package/lib/module/shared/components/boundary/index.js +3 -2
  105. package/lib/module/shared/components/boundary/index.js.map +1 -1
  106. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +49 -189
  107. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +1 -1
  108. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/index.js +21 -13
  109. package/lib/module/shared/components/boundary/portal/components/boundary-content-portal/index.js.map +1 -1
  110. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js +2 -13
  111. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  112. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +43 -36
  113. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  114. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +3 -4
  115. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  116. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +50 -134
  117. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  118. package/lib/module/shared/components/boundary/portal/components/boundary-portal/index.js +44 -9
  119. package/lib/module/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  120. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.js.map +1 -1
  121. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +1 -27
  122. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  123. package/lib/module/shared/components/boundary/portal/utils/handoff-target.js +28 -0
  124. package/lib/module/shared/components/boundary/portal/utils/handoff-target.js.map +1 -0
  125. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js +19 -15
  126. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js.map +1 -1
  127. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js +0 -8
  128. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js.map +1 -1
  129. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js +19 -37
  130. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  131. package/lib/module/shared/components/boundary/utils/refresh-signals.js +7 -0
  132. package/lib/module/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  133. package/lib/module/shared/components/boundary/utils/resolve-boundary-target.js +24 -0
  134. package/lib/module/shared/components/boundary/utils/resolve-boundary-target.js.map +1 -0
  135. package/lib/module/shared/components/masked-view.js +10 -2
  136. package/lib/module/shared/components/masked-view.js.map +1 -1
  137. package/lib/module/shared/components/screen-container/layers/backdrop.js +3 -1
  138. package/lib/module/shared/components/screen-container/layers/backdrop.js.map +1 -1
  139. package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js +10 -2
  140. package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
  141. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +2 -0
  142. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  143. package/lib/module/shared/providers/helpers/measured-bounds-writes.js +4 -1
  144. package/lib/module/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  145. package/lib/module/shared/providers/screen/gestures/gestures.provider.js +2 -8
  146. package/lib/module/shared/providers/screen/gestures/gestures.provider.js.map +1 -1
  147. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +1 -0
  148. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  149. package/lib/module/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js +35 -2
  150. package/lib/module/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.js.map +1 -1
  151. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +1 -0
  152. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  153. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-release.js +3 -2
  154. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-release.js.map +1 -1
  155. package/lib/module/shared/providers/screen/gestures/types.js.map +1 -1
  156. package/lib/module/shared/providers/screen/styles/helpers/transition-visual-state.js +35 -0
  157. package/lib/module/shared/providers/screen/styles/helpers/transition-visual-state.js.map +1 -0
  158. package/lib/module/shared/providers/screen/styles/helpers/visibility-gate.js +11 -5
  159. package/lib/module/shared/providers/screen/styles/helpers/visibility-gate.js.map +1 -1
  160. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +23 -10
  161. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  162. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +10 -8
  163. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  164. package/lib/module/shared/stores/bounds/internals/links.js +4 -4
  165. package/lib/module/shared/stores/bounds/internals/links.js.map +1 -1
  166. package/lib/module/shared/stores/scroll.store.js +17 -0
  167. package/lib/module/shared/stores/scroll.store.js.map +1 -1
  168. package/lib/module/shared/stores/system.store.js +2 -0
  169. package/lib/module/shared/stores/system.store.js.map +1 -1
  170. package/lib/module/shared/utils/animation/animate-to-progress.js +21 -0
  171. package/lib/module/shared/utils/animation/animate-to-progress.js.map +1 -1
  172. package/lib/module/shared/utils/animation/animate.js +14 -2
  173. package/lib/module/shared/utils/animation/animate.js.map +1 -1
  174. package/lib/module/shared/utils/animation/spring/spring.js +23 -3
  175. package/lib/module/shared/utils/animation/spring/spring.js.map +1 -1
  176. package/lib/module/shared/utils/animation/spring/springUtils.js +95 -0
  177. package/lib/module/shared/utils/animation/spring/springUtils.js.map +1 -1
  178. package/lib/module/shared/utils/animation/state.js +2 -0
  179. package/lib/module/shared/utils/bounds/navigation/reveal/math.js +16 -5
  180. package/lib/module/shared/utils/bounds/navigation/reveal/math.js.map +1 -1
  181. package/lib/module/shared/utils/bounds/navigation/zoom/build.js +46 -22
  182. package/lib/module/shared/utils/bounds/navigation/zoom/build.js.map +1 -1
  183. package/lib/module/shared/utils/bounds/navigation/zoom/drag.js +2 -30
  184. package/lib/module/shared/utils/bounds/navigation/zoom/drag.js.map +1 -1
  185. package/lib/module/shared/utils/bounds/navigation/zoom/helpers.js +4 -18
  186. package/lib/module/shared/utils/bounds/navigation/zoom/helpers.js.map +1 -1
  187. package/lib/typescript/shared/animation/snap-to.d.ts.map +1 -1
  188. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts +2 -1
  189. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts.map +1 -1
  190. package/lib/typescript/shared/components/boundary/create-boundary-component.d.ts.map +1 -1
  191. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts.map +1 -1
  192. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts +3 -4
  193. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts.map +1 -1
  194. package/lib/typescript/shared/components/boundary/index.d.ts +6 -9
  195. package/lib/typescript/shared/components/boundary/index.d.ts.map +1 -1
  196. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts +1 -3
  197. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts.map +1 -1
  198. package/lib/typescript/shared/components/boundary/portal/components/boundary-content-portal/index.d.ts.map +1 -1
  199. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/host.d.ts.map +1 -1
  200. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts.map +1 -1
  201. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts +1 -10
  202. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts.map +1 -1
  203. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts +1 -3
  204. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts.map +1 -1
  205. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/index.d.ts +2 -2
  206. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/index.d.ts.map +1 -1
  207. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.d.ts +0 -1
  208. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.d.ts.map +1 -1
  209. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts +1 -10
  210. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts.map +1 -1
  211. package/lib/typescript/shared/components/boundary/portal/utils/handoff-target.d.ts +12 -0
  212. package/lib/typescript/shared/components/boundary/portal/utils/handoff-target.d.ts.map +1 -0
  213. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts +2 -3
  214. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts.map +1 -1
  215. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts +0 -4
  216. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts.map +1 -1
  217. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts +8 -12
  218. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts.map +1 -1
  219. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts +1 -0
  220. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts.map +1 -1
  221. package/lib/typescript/shared/components/boundary/utils/resolve-boundary-target.d.ts +12 -0
  222. package/lib/typescript/shared/components/boundary/utils/resolve-boundary-target.d.ts.map +1 -0
  223. package/lib/typescript/shared/components/masked-view.d.ts.map +1 -1
  224. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts.map +1 -1
  225. package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts.map +1 -1
  226. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-transition-start-controller.d.ts.map +1 -1
  227. package/lib/typescript/shared/providers/helpers/measured-bounds-writes.d.ts.map +1 -1
  228. package/lib/typescript/shared/providers/screen/gestures/gestures.provider.d.ts.map +1 -1
  229. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.d.ts.map +1 -1
  230. package/lib/typescript/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.d.ts +2 -1
  231. package/lib/typescript/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.d.ts.map +1 -1
  232. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.d.ts.map +1 -1
  233. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-release.d.ts.map +1 -1
  234. package/lib/typescript/shared/providers/screen/gestures/types.d.ts +1 -9
  235. package/lib/typescript/shared/providers/screen/gestures/types.d.ts.map +1 -1
  236. package/lib/typescript/shared/providers/screen/styles/helpers/transition-visual-state.d.ts +18 -0
  237. package/lib/typescript/shared/providers/screen/styles/helpers/transition-visual-state.d.ts.map +1 -0
  238. package/lib/typescript/shared/providers/screen/styles/helpers/visibility-gate.d.ts +2 -2
  239. package/lib/typescript/shared/providers/screen/styles/helpers/visibility-gate.d.ts.map +1 -1
  240. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts.map +1 -1
  241. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts.map +1 -1
  242. package/lib/typescript/shared/stores/bounds/internals/links.d.ts +1 -1
  243. package/lib/typescript/shared/stores/bounds/internals/links.d.ts.map +1 -1
  244. package/lib/typescript/shared/stores/scroll.store.d.ts +7 -0
  245. package/lib/typescript/shared/stores/scroll.store.d.ts.map +1 -1
  246. package/lib/typescript/shared/stores/system.store.d.ts +5 -0
  247. package/lib/typescript/shared/stores/system.store.d.ts.map +1 -1
  248. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts +6 -1
  249. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts.map +1 -1
  250. package/lib/typescript/shared/utils/animation/animate.d.ts +2 -2
  251. package/lib/typescript/shared/utils/animation/animate.d.ts.map +1 -1
  252. package/lib/typescript/shared/utils/animation/spring/spring.d.ts +2 -2
  253. package/lib/typescript/shared/utils/animation/spring/spring.d.ts.map +1 -1
  254. package/lib/typescript/shared/utils/animation/spring/springUtils.d.ts +3 -0
  255. package/lib/typescript/shared/utils/animation/spring/springUtils.d.ts.map +1 -1
  256. package/lib/typescript/shared/utils/animation/state.d.ts +6 -0
  257. package/lib/typescript/shared/utils/animation/state.d.ts.map +1 -1
  258. package/lib/typescript/shared/utils/bounds/navigation/reveal/math.d.ts +9 -0
  259. package/lib/typescript/shared/utils/bounds/navigation/reveal/math.d.ts.map +1 -1
  260. package/lib/typescript/shared/utils/bounds/navigation/zoom/build.d.ts.map +1 -1
  261. package/lib/typescript/shared/utils/bounds/navigation/zoom/drag.d.ts +2 -11
  262. package/lib/typescript/shared/utils/bounds/navigation/zoom/drag.d.ts.map +1 -1
  263. package/lib/typescript/shared/utils/bounds/navigation/zoom/helpers.d.ts +7 -4
  264. package/lib/typescript/shared/utils/bounds/navigation/zoom/helpers.d.ts.map +1 -1
  265. package/package.json +1 -1
  266. package/src/shared/animation/snap-to.ts +5 -0
  267. package/src/shared/components/boundary/components/boundary-target.tsx +37 -23
  268. package/src/shared/components/boundary/create-boundary-component.tsx +29 -3
  269. package/src/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.ts +11 -0
  270. package/src/shared/components/boundary/hooks/use-boundary-measurement.ts +3 -9
  271. package/src/shared/components/boundary/index.tsx +4 -8
  272. package/src/shared/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.ts +73 -275
  273. package/src/shared/components/boundary/portal/components/boundary-content-portal/index.tsx +31 -12
  274. package/src/shared/components/boundary/portal/components/boundary-portal/components/host.tsx +2 -12
  275. package/src/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.tsx +64 -62
  276. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.ts +2 -9
  277. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.ts +73 -186
  278. package/src/shared/components/boundary/portal/components/boundary-portal/index.tsx +72 -12
  279. package/src/shared/components/boundary/portal/components/boundary-portal/stores/host-registry.store.ts +0 -1
  280. package/src/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.ts +2 -39
  281. package/src/shared/components/boundary/portal/utils/handoff-target.ts +48 -0
  282. package/src/shared/components/boundary/portal/utils/resolve-portal.ts +26 -18
  283. package/src/shared/components/boundary/portal/utils/teleport-control.ts +0 -12
  284. package/src/shared/components/boundary/providers/boundary-root.provider.tsx +28 -80
  285. package/src/shared/components/boundary/utils/refresh-signals.ts +8 -0
  286. package/src/shared/components/boundary/utils/resolve-boundary-target.tsx +39 -0
  287. package/src/shared/components/masked-view.tsx +20 -4
  288. package/src/shared/components/screen-container/layers/backdrop.tsx +3 -1
  289. package/src/shared/components/screen-container/layers/maybe-masked-navigation-container.tsx +14 -4
  290. package/src/shared/components/screen-lifecycle/hooks/use-transition-start-controller.ts +2 -0
  291. package/src/shared/providers/helpers/measured-bounds-writes.ts +1 -0
  292. package/src/shared/providers/screen/gestures/gestures.provider.tsx +2 -10
  293. package/src/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.ts +1 -0
  294. package/src/shared/providers/screen/gestures/pinch/activation/use-pinch-activation.ts +74 -3
  295. package/src/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.ts +1 -0
  296. package/src/shared/providers/screen/gestures/pinch/behavior/pinch-release.ts +2 -4
  297. package/src/shared/providers/screen/gestures/types.ts +0 -14
  298. package/src/shared/providers/screen/styles/helpers/transition-visual-state.ts +44 -0
  299. package/src/shared/providers/screen/styles/helpers/visibility-gate.ts +17 -7
  300. package/src/shared/providers/screen/styles/hooks/use-interpolated-style-maps.tsx +30 -15
  301. package/src/shared/providers/screen/styles/hooks/use-maybe-block-visibility.tsx +14 -13
  302. package/src/shared/stores/bounds/internals/links.ts +13 -2
  303. package/src/shared/stores/scroll.store.ts +23 -0
  304. package/src/shared/stores/system.store.ts +8 -0
  305. package/src/shared/utils/animation/animate-to-progress.ts +59 -28
  306. package/src/shared/utils/animation/animate.ts +18 -2
  307. package/src/shared/utils/animation/spring/spring.ts +36 -1
  308. package/src/shared/utils/animation/spring/springUtils.ts +130 -0
  309. package/src/shared/utils/animation/state.ts +8 -0
  310. package/src/shared/utils/bounds/navigation/reveal/math.ts +21 -5
  311. package/src/shared/utils/bounds/navigation/zoom/build.ts +77 -23
  312. package/src/shared/utils/bounds/navigation/zoom/drag.ts +3 -42
  313. package/src/shared/utils/bounds/navigation/zoom/helpers.ts +9 -23
  314. package/lib/commonjs/shared/components/boundary/hooks/use-register-target.js +0 -32
  315. package/lib/commonjs/shared/components/boundary/hooks/use-register-target.js.map +0 -1
  316. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js +0 -51
  317. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js.map +0 -1
  318. package/lib/commonjs/shared/components/boundary/portal/utils/ownership.js +0 -220
  319. package/lib/commonjs/shared/components/boundary/portal/utils/ownership.js.map +0 -1
  320. package/lib/commonjs/shared/components/boundary/portal/utils/shallow-equal.js +0 -29
  321. package/lib/commonjs/shared/components/boundary/portal/utils/shallow-equal.js.map +0 -1
  322. package/lib/commonjs/shared/components/boundary/portal/utils/visible-host.js +0 -25
  323. package/lib/commonjs/shared/components/boundary/portal/utils/visible-host.js.map +0 -1
  324. package/lib/commonjs/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js +0 -64
  325. package/lib/commonjs/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js.map +0 -1
  326. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js +0 -21
  327. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js.map +0 -1
  328. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js +0 -29
  329. package/lib/commonjs/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js.map +0 -1
  330. package/lib/commonjs/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js +0 -38
  331. package/lib/commonjs/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js.map +0 -1
  332. package/lib/commonjs/shared/providers/screen/styles/helpers/opening-phase.js +0 -32
  333. package/lib/commonjs/shared/providers/screen/styles/helpers/opening-phase.js.map +0 -1
  334. package/lib/module/shared/components/boundary/hooks/use-register-target.js +0 -27
  335. package/lib/module/shared/components/boundary/hooks/use-register-target.js.map +0 -1
  336. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js +0 -46
  337. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.js.map +0 -1
  338. package/lib/module/shared/components/boundary/portal/utils/ownership.js +0 -213
  339. package/lib/module/shared/components/boundary/portal/utils/ownership.js.map +0 -1
  340. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js +0 -24
  341. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js.map +0 -1
  342. package/lib/module/shared/components/boundary/portal/utils/visible-host.js +0 -20
  343. package/lib/module/shared/components/boundary/portal/utils/visible-host.js.map +0 -1
  344. package/lib/module/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js +0 -59
  345. package/lib/module/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.js.map +0 -1
  346. package/lib/module/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js +0 -15
  347. package/lib/module/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.js.map +0 -1
  348. package/lib/module/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js +0 -24
  349. package/lib/module/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.js.map +0 -1
  350. package/lib/module/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js +0 -33
  351. package/lib/module/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.js.map +0 -1
  352. package/lib/module/shared/providers/screen/styles/helpers/opening-phase.js +0 -26
  353. package/lib/module/shared/providers/screen/styles/helpers/opening-phase.js.map +0 -1
  354. package/lib/typescript/shared/components/boundary/hooks/use-register-target.d.ts +0 -10
  355. package/lib/typescript/shared/components/boundary/hooks/use-register-target.d.ts.map +0 -1
  356. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.d.ts +0 -13
  357. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.d.ts.map +0 -1
  358. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts +0 -34
  359. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts.map +0 -1
  360. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts +0 -8
  361. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts.map +0 -1
  362. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts +0 -8
  363. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts.map +0 -1
  364. package/lib/typescript/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.d.ts +0 -15
  365. package/lib/typescript/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.d.ts.map +0 -1
  366. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.d.ts +0 -4
  367. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.d.ts.map +0 -1
  368. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.d.ts +0 -5
  369. package/lib/typescript/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.d.ts.map +0 -1
  370. package/lib/typescript/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.d.ts +0 -9
  371. package/lib/typescript/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.d.ts.map +0 -1
  372. package/lib/typescript/shared/providers/screen/styles/helpers/opening-phase.d.ts +0 -16
  373. package/lib/typescript/shared/providers/screen/styles/helpers/opening-phase.d.ts.map +0 -1
  374. package/src/shared/components/boundary/hooks/use-register-target.ts +0 -43
  375. package/src/shared/components/boundary/portal/components/boundary-portal/components/portal-slot.tsx +0 -79
  376. package/src/shared/components/boundary/portal/utils/ownership.ts +0 -319
  377. package/src/shared/components/boundary/portal/utils/shallow-equal.ts +0 -25
  378. package/src/shared/components/boundary/portal/utils/visible-host.ts +0 -24
  379. package/src/shared/providers/screen/gestures/rotation/activation/use-rotation-activation.ts +0 -88
  380. package/src/shared/providers/screen/gestures/rotation/behavior/rotation-lifecycle.ts +0 -19
  381. package/src/shared/providers/screen/gestures/rotation/behavior/use-rotation-behavior.ts +0 -47
  382. package/src/shared/providers/screen/gestures/rotation/use-build-rotation-gesture.ts +0 -50
  383. package/src/shared/providers/screen/styles/helpers/opening-phase.ts +0 -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
 
@@ -67,6 +67,7 @@ export const applyMeasuredBoundsWrites = (
67
67
  measured,
68
68
  preparedStyles,
69
69
  group,
70
+ { handoff, escapeClipping },
70
71
  );
71
72
  }
72
73
  };
@@ -8,7 +8,6 @@ import { useScreenGestureConfig } from "./hooks/use-screen-gesture-config";
8
8
  import { useWalkUpAndRegisterShadowingClaims } from "./ownership/use-walk-up-and-register-shadowing-claims";
9
9
  import { useBuildPanGesture } from "./pan/use-build-pan-gesture";
10
10
  import { useBuildPinchGesture } from "./pinch/use-build-pinch-gesture";
11
- import { useBuildRotationGesture } from "./rotation/use-build-rotation-gesture";
12
11
  import {
13
12
  type DirectionClaimMap,
14
13
  type GestureCompositionOwner,
@@ -54,14 +53,9 @@ export const {
54
53
  gestureCompositionOwner,
55
54
  });
56
55
 
57
- const rotationGesture = useBuildRotationGesture({
58
- gestureConfig,
59
- gestureCompositionOwner,
60
- });
61
-
62
56
  const detectorGesture = useMemo(
63
- () => Gesture.Simultaneous(panGesture, pinchGesture, rotationGesture),
64
- [panGesture, pinchGesture, rotationGesture],
57
+ () => Gesture.Simultaneous(panGesture, pinchGesture),
58
+ [panGesture, pinchGesture],
65
59
  );
66
60
 
67
61
  const value = useMemo<GestureContextType>(
@@ -70,7 +64,6 @@ export const {
70
64
  detectorGesture,
71
65
  panGesture,
72
66
  pinchGesture,
73
- rotationGesture,
74
67
  scrollState,
75
68
  gestureContext,
76
69
  claimedDirections: gestureConfig.participation.claimedDirections,
@@ -81,7 +74,6 @@ export const {
81
74
  detectorGesture,
82
75
  panGesture,
83
76
  pinchGesture,
84
- rotationGesture,
85
77
  scrollState,
86
78
  gestureContext,
87
79
  gestureConfig.participation.claimedDirections,
@@ -169,6 +169,7 @@ export const finalizePanRelease = (
169
169
  emitWillAnimate: false,
170
170
  markEntering: false,
171
171
  targetProgress: system.targetProgress,
172
+ animationProgress: system.animationProgress,
172
173
  animations,
173
174
  initialVelocity: plan.progressVelocity,
174
175
  });
@@ -3,7 +3,7 @@ import type {
3
3
  GestureStateManager,
4
4
  GestureTouchEvent,
5
5
  } from "react-native-gesture-handler";
6
- import type { SharedValue } from "react-native-reanimated";
6
+ import { type SharedValue, useSharedValue } from "react-native-reanimated";
7
7
  import type { GestureStoreMap } from "../../../../../stores/gesture.store";
8
8
  import type { ScreenOptionsContextValue } from "../../../options";
9
9
  import { resolvePinchRuntime } from "../../shared/runtime";
@@ -34,6 +34,48 @@ export const updateAbsolutePinchFocalPoint = (
34
34
  }
35
35
  };
36
36
 
37
+ export const updatePinchRotation = (
38
+ event: GestureTouchEvent,
39
+ gestures: GestureStoreMap,
40
+ lastAngle: SharedValue<number>,
41
+ accumulatedRotation: SharedValue<number>,
42
+ captureOrigin: boolean,
43
+ ) => {
44
+ "worklet";
45
+ const firstTouch = event.allTouches[0];
46
+ const secondTouch = event.allTouches[1];
47
+
48
+ if (!firstTouch || !secondTouch) {
49
+ return;
50
+ }
51
+
52
+ const angle = Math.atan2(
53
+ secondTouch.absoluteY - firstTouch.absoluteY,
54
+ secondTouch.absoluteX - firstTouch.absoluteX,
55
+ );
56
+
57
+ if (captureOrigin) {
58
+ lastAngle.set(angle);
59
+ accumulatedRotation.set(0);
60
+ gestures.rotation.set(0);
61
+ gestures.raw.rotation.set(0);
62
+ return;
63
+ }
64
+
65
+ let angleDelta = angle - lastAngle.get();
66
+ if (angleDelta > Math.PI) {
67
+ angleDelta -= 2 * Math.PI;
68
+ } else if (angleDelta < -Math.PI) {
69
+ angleDelta += 2 * Math.PI;
70
+ }
71
+
72
+ const rotation = accumulatedRotation.get() + angleDelta;
73
+ lastAngle.set(angle);
74
+ accumulatedRotation.set(rotation);
75
+ gestures.rotation.set(rotation);
76
+ gestures.raw.rotation.set(rotation);
77
+ };
78
+
37
79
  interface UsePinchActivationProps {
38
80
  runtime: SharedValue<PinchGestureRuntime>;
39
81
  screenOptions: ScreenOptionsContextValue;
@@ -45,6 +87,9 @@ export const usePinchActivation = ({
45
87
  screenOptions,
46
88
  gestureCompositionOwner,
47
89
  }: UsePinchActivationProps) => {
90
+ const lastAngle = useSharedValue(0);
91
+ const accumulatedRotation = useSharedValue(0);
92
+
48
93
  const onTouchesDown = useCallback(
49
94
  (
50
95
  event: GestureTouchEvent,
@@ -68,6 +113,13 @@ export const usePinchActivation = ({
68
113
  latestRuntime.stores.gestures,
69
114
  true,
70
115
  );
116
+ updatePinchRotation(
117
+ event,
118
+ latestRuntime.stores.gestures,
119
+ lastAngle,
120
+ accumulatedRotation,
121
+ true,
122
+ );
71
123
  if (gestureCompositionOwner.get() === null) {
72
124
  gestureCompositionOwner.set("pinch");
73
125
  }
@@ -79,7 +131,13 @@ export const usePinchActivation = ({
79
131
  stateManager?.fail();
80
132
  }
81
133
  },
82
- [runtime, screenOptions, gestureCompositionOwner],
134
+ [
135
+ runtime,
136
+ screenOptions,
137
+ gestureCompositionOwner,
138
+ lastAngle,
139
+ accumulatedRotation,
140
+ ],
83
141
  );
84
142
 
85
143
  const onTouchesMove = useCallback(
@@ -102,6 +160,13 @@ export const usePinchActivation = ({
102
160
  latestRuntime.stores.gestures,
103
161
  false,
104
162
  );
163
+ updatePinchRotation(
164
+ event,
165
+ latestRuntime.stores.gestures,
166
+ lastAngle,
167
+ accumulatedRotation,
168
+ false,
169
+ );
105
170
  if (gestureCompositionOwner.get() === null) {
106
171
  gestureCompositionOwner.set("pinch");
107
172
  }
@@ -113,7 +178,13 @@ export const usePinchActivation = ({
113
178
  stateManager.fail();
114
179
  }
115
180
  },
116
- [runtime, screenOptions, gestureCompositionOwner],
181
+ [
182
+ runtime,
183
+ screenOptions,
184
+ gestureCompositionOwner,
185
+ lastAngle,
186
+ accumulatedRotation,
187
+ ],
117
188
  );
118
189
 
119
190
  return useMemo(
@@ -107,6 +107,7 @@ export const finalizePinchRelease = (
107
107
  markEntering: false,
108
108
  animations,
109
109
  targetProgress: system.targetProgress,
110
+ animationProgress: system.animationProgress,
110
111
  initialVelocity: release.initialVelocity,
111
112
  });
112
113
  };
@@ -95,7 +95,7 @@ export const resolvePinchRelease = (
95
95
  const {
96
96
  participation,
97
97
  policy,
98
- stores: { animations },
98
+ stores: { animations, system },
99
99
  } = runtime;
100
100
  const normalizedScale = clamp(normalizePinchScale(event.scale), -1, 1);
101
101
  const currentProgress = animations.transitionProgress.get();
@@ -106,9 +106,7 @@ export const resolvePinchRelease = (
106
106
  policy.pinchInEnabled,
107
107
  policy.pinchOutEnabled,
108
108
  );
109
- const target = shouldDismiss
110
- ? 0
111
- : runtime.stores.gestures.internal.progressBaseline.get();
109
+ const target = shouldDismiss ? 0 : system.targetProgress.get();
112
110
  const progressVelocity = getPinchReleaseHandoffVelocity(event.velocity);
113
111
  const handoffVelocity = getPinchReleaseHandoffVelocity(
114
112
  event.velocity,
@@ -4,7 +4,6 @@ import type {
4
4
  GestureUpdateEvent,
5
5
  PanGestureHandlerEventPayload,
6
6
  PinchGestureHandlerEventPayload,
7
- RotationGestureHandlerEventPayload,
8
7
  } from "react-native-gesture-handler";
9
8
  import type { SharedValue } from "react-native-reanimated";
10
9
  import type { AnimationStoreMap } from "../../../stores/animation.store";
@@ -33,7 +32,6 @@ import type { EffectiveSnapPointsResult } from "./shared/snap-points";
33
32
 
34
33
  export type PanGesture = ReturnType<typeof Gesture.Pan>;
35
34
  export type PinchGesture = ReturnType<typeof Gesture.Pinch>;
36
- export type RotationGesture = ReturnType<typeof Gesture.Rotation>;
37
35
  export type ComposedGesture = ReturnType<typeof Gesture.Simultaneous>;
38
36
 
39
37
  export type PanGestureEvent =
@@ -44,10 +42,6 @@ export type PinchGestureEvent =
44
42
  | GestureUpdateEvent<PinchGestureHandlerEventPayload>
45
43
  | GestureStateChangeEvent<PinchGestureHandlerEventPayload>;
46
44
 
47
- export type RotationGestureEvent =
48
- | GestureUpdateEvent<RotationGestureHandlerEventPayload>
49
- | GestureStateChangeEvent<RotationGestureHandlerEventPayload>;
50
-
51
45
  /** Gesture that owns navigation release for the current simultaneous composition. */
52
46
  export type GestureCompositionOwner = "pan" | "pinch" | null;
53
47
 
@@ -82,7 +76,6 @@ export interface GestureContextType {
82
76
  detectorGesture: ComposedGesture;
83
77
  panGesture: PanGesture;
84
78
  pinchGesture: PinchGesture;
85
- rotationGesture: RotationGesture;
86
79
  scrollState: SharedValue<ScrollGestureState | null>;
87
80
  gestureContext: GestureContextType | null;
88
81
  claimedDirections: ClaimedDirections;
@@ -156,8 +149,6 @@ export type PanGestureRuntime = GestureRuntime<PanGesturePolicy>;
156
149
 
157
150
  export type PinchGestureRuntime = GestureRuntime<PinchGesturePolicy>;
158
151
 
159
- export type RotationGestureRuntime = GestureRuntime<PinchGesturePolicy>;
160
-
161
152
  export interface GestureDimensions {
162
153
  width: number;
163
154
  height: number;
@@ -221,8 +212,3 @@ export interface PinchBehavior {
221
212
  onUpdate: (event: PinchGestureEvent) => void;
222
213
  onEnd: (event: PinchGestureEvent) => void;
223
214
  }
224
-
225
- export interface RotationBehavior {
226
- onStart: () => void;
227
- onUpdate: (event: RotationGestureEvent) => void;
228
- }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Visual lifecycle boundaries use the internal directional clock rather than
3
+ * physical transition progress, which may overshoot or revisit an endpoint.
4
+ */
5
+ export const hasOpenTransitionStarted = ({
6
+ pendingLifecycleStartBlockCount,
7
+ animationProgress,
8
+ }: {
9
+ pendingLifecycleStartBlockCount: number;
10
+ animationProgress: number;
11
+ }) => {
12
+ "worklet";
13
+ return pendingLifecycleStartBlockCount === 0 && animationProgress > 0;
14
+ };
15
+
16
+ export const isOpenTransitionBlocked = ({
17
+ opening,
18
+ pendingLifecycleStartBlockCount,
19
+ animationProgress,
20
+ }: {
21
+ opening: boolean;
22
+ pendingLifecycleStartBlockCount: number;
23
+ animationProgress: number;
24
+ }) => {
25
+ "worklet";
26
+ return (
27
+ opening &&
28
+ !hasOpenTransitionStarted({
29
+ pendingLifecycleStartBlockCount,
30
+ animationProgress,
31
+ })
32
+ );
33
+ };
34
+
35
+ export const hasCloseTransitionFinished = ({
36
+ closing,
37
+ animationProgress,
38
+ }: {
39
+ closing: number;
40
+ animationProgress: number;
41
+ }) => {
42
+ "worklet";
43
+ return !!closing && animationProgress === 0;
44
+ };