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
@@ -8,12 +8,13 @@ import {
8
8
  SlideFromTop,
9
9
  ZoomIn,
10
10
  } from "./presets";
11
- import { DefaultSnapSpec, DefaultSpec, FlingSpec } from "./specs";
11
+ import { DefaultSnapSpec, DefaultSpec, FlingSpec, Zoom } from "./specs";
12
12
 
13
13
  export const Specs = {
14
14
  DefaultSpec,
15
15
  DefaultSnapSpec,
16
16
  FlingSpec,
17
+ Zoom,
17
18
  };
18
19
 
19
20
  export const Presets = {
@@ -1,4 +1,5 @@
1
1
  import type { WithSpringConfig } from "react-native-reanimated";
2
+ import type { TransitionSpec } from "../types/animation.types";
2
3
 
3
4
  export const DefaultSpec: WithSpringConfig = {
4
5
  stiffness: 1000,
@@ -22,3 +23,25 @@ export const FlingSpec: WithSpringConfig = {
22
23
  overshootClamping: false,
23
24
  energyThreshold: 6e-9,
24
25
  };
26
+
27
+ /**
28
+ * Paired spring configuration tuned for navigation zoom transitions.
29
+ */
30
+ export const Zoom = {
31
+ open: {
32
+ stiffness: 1000,
33
+ damping: 500,
34
+ mass: 3,
35
+ overshootClamping: false,
36
+ // @ts-expect-error Reanimated v3 spring config support.
37
+ restSpeedThreshold: 0.02,
38
+ },
39
+ close: {
40
+ stiffness: 1100,
41
+ damping: 98,
42
+ mass: 3,
43
+ overshootClamping: false,
44
+ // @ts-expect-error Reanimated v3 spring config support.
45
+ restSpeedThreshold: 0.02,
46
+ },
47
+ } satisfies TransitionSpec;
@@ -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
+ };
@@ -1,11 +1,15 @@
1
1
  import { LifecycleTransitionRequestKind } from "../../../../stores/system.store";
2
+ import {
3
+ hasOpenTransitionStarted,
4
+ isOpenTransitionBlocked,
5
+ } from "./transition-visual-state";
2
6
 
3
7
  type ScreenVisibilityGateState = {
4
8
  isFloatingOverlay?: boolean;
5
9
  hasVisibilityGateOpened: boolean;
6
10
  pendingLifecycleStartBlockCount: number;
7
11
  pendingLifecycleRequestKind: LifecycleTransitionRequestKind;
8
- progress: number;
12
+ animationProgress: number;
9
13
  entering: number;
10
14
  };
11
15
 
@@ -19,7 +23,7 @@ export const resolveScreenVisibilityGate = ({
19
23
  hasVisibilityGateOpened,
20
24
  pendingLifecycleStartBlockCount,
21
25
  pendingLifecycleRequestKind,
22
- progress,
26
+ animationProgress,
23
27
  entering,
24
28
  }: ScreenVisibilityGateState): ScreenVisibilityGateDecision => {
25
29
  "worklet";
@@ -30,16 +34,22 @@ export const resolveScreenVisibilityGate = ({
30
34
  };
31
35
  }
32
36
 
33
- const hasPendingLifecycleBlock = pendingLifecycleStartBlockCount > 0;
34
37
  const isPendingOpen =
35
38
  pendingLifecycleRequestKind === LifecycleTransitionRequestKind.Open;
36
39
  const isOpening = isPendingOpen || !!entering;
37
- const isWaitingForOpenToStart = progress <= 0;
38
- const shouldBlock =
39
- (hasPendingLifecycleBlock || isWaitingForOpenToStart) && isOpening;
40
+ const shouldBlock = isOpenTransitionBlocked({
41
+ opening: isOpening,
42
+ pendingLifecycleStartBlockCount,
43
+ animationProgress,
44
+ });
40
45
 
41
46
  return {
42
47
  shouldBlock,
43
- shouldOpenGate: !shouldBlock && progress > 0,
48
+ shouldOpenGate:
49
+ !shouldBlock &&
50
+ hasOpenTransitionStarted({
51
+ pendingLifecycleStartBlockCount,
52
+ animationProgress,
53
+ }),
44
54
  };
45
55
  };
@@ -25,9 +25,12 @@ import {
25
25
  } from "../../options";
26
26
  import { collectInterpolatorSharedValues } from "../helpers/collect-interpolator-shared-values";
27
27
  import { normalizeSlots } from "../helpers/normalize-slots";
28
- import { isOpeningBeforeStart } from "../helpers/opening-phase";
29
28
  import type { LocalStyleLayers } from "../helpers/resolve-slot-styles";
30
29
  import { stripInterpolatorOptions } from "../helpers/strip-interpolator-options";
30
+ import {
31
+ hasCloseTransitionFinished,
32
+ isOpenTransitionBlocked,
33
+ } from "../helpers/transition-visual-state";
31
34
 
32
35
  const NO_STYLE_LAYERS: LocalStyleLayers = [];
33
36
 
@@ -157,12 +160,13 @@ export const useInterpolatedStylesMap = () => {
157
160
  );
158
161
 
159
162
  const activeScreenKey = nextScreenKey ?? currentScreenKey;
163
+ const { closing: activeClosing, entering: activeEntering } =
164
+ AnimationStore.getBag(activeScreenKey);
160
165
  const {
161
- entering: activeEntering,
162
- transitionProgress: activeTransitionProgress,
163
- } = AnimationStore.getBag(activeScreenKey);
164
- const { pendingLifecycleRequestKind: activePendingLifecycleRequestKind } =
165
- SystemStore.getBag(activeScreenKey);
166
+ animationProgress: activeAnimationProgress,
167
+ pendingLifecycleRequestKind: activePendingLifecycleRequestKind,
168
+ pendingLifecycleStartBlockCount: activePendingLifecycleStartBlockCount,
169
+ } = SystemStore.getBag(activeScreenKey);
166
170
 
167
171
  const isGesturingDuringCloseAnimation = useSharedValue(false);
168
172
 
@@ -194,22 +198,33 @@ export const useInterpolatedStylesMap = () => {
194
198
  const isInGestureMode =
195
199
  !!isDragging || isGesturingDuringCloseAnimation.get();
196
200
 
197
- // The current screen keeps interpolator ownership until the next screen is
198
- // genuinely live: never during a gesture-driven close, never before a next
199
- // interpolator exists, and never in the next screen's pre-start window
200
- // (entering, but no transformed frame yet). Only then does "next" take over.
201
+ // Interpolator ownership changes only at visual boundaries on the UI thread:
202
+ // the next screen attaches after its blockers clear and progress starts, then
203
+ // detaches once its closing progress has committed at zero. The downstream
204
+ // resolver sees the owner disappear in this same graph and resets its styles
205
+ // without waiting for React to remove the screen.
201
206
  const isPendingOpen =
202
207
  activePendingLifecycleRequestKind.get() ===
203
208
  LifecycleTransitionRequestKind.Open;
204
209
  const activeOpening = isPendingOpen || !!activeEntering.get();
210
+ const isOpeningBlocked = isOpenTransitionBlocked({
211
+ opening: activeOpening,
212
+ pendingLifecycleStartBlockCount:
213
+ activePendingLifecycleStartBlockCount.get(),
214
+ animationProgress: activeAnimationProgress.get(),
215
+ });
216
+ const hasCloseFinished = hasCloseTransitionFinished({
217
+ closing: activeClosing.get(),
218
+ animationProgress: activeAnimationProgress.get(),
219
+ });
205
220
  const currentOwnsInterpolator =
206
221
  isInGestureMode ||
207
222
  !nextInterpolator ||
208
- isOpeningBeforeStart(
209
- activeOpening ? 1 : 0,
210
- activeTransitionProgress.get(),
211
- );
212
- nextInterpolatorReady.set(currentOwnsInterpolator ? 0 : 1);
223
+ isOpeningBlocked ||
224
+ hasCloseFinished;
225
+ const nextReady = currentOwnsInterpolator ? 0 : 1;
226
+
227
+ nextInterpolatorReady.set(nextReady);
213
228
 
214
229
  const interpolatorOptionsOwner = currentOwnsInterpolator
215
230
  ? "current"
@@ -9,15 +9,18 @@ import { AnimationStore } from "../../../../stores/animation.store";
9
9
  import { SystemStore } from "../../../../stores/system.store";
10
10
  import { getVisibilityBlockOffset } from "../../../../utils/visibility-block-offset";
11
11
  import { useDescriptorDerivations } from "../../descriptors";
12
+ import { hasCloseTransitionFinished } from "../helpers/transition-visual-state";
12
13
  import { resolveScreenVisibilityGate } from "../helpers/visibility-gate";
13
14
 
14
15
  export const useMaybeBlockVisibility = (isFloatingOverlay?: boolean) => {
15
16
  const { height } = useWindowDimensions();
16
17
  const { currentScreenKey } = useDescriptorDerivations();
17
- const { closing, entering, progressAnimating, transitionProgress } =
18
- AnimationStore.getBag(currentScreenKey);
19
- const { pendingLifecycleStartBlockCount, pendingLifecycleRequestKind } =
20
- SystemStore.getBag(currentScreenKey);
18
+ const { closing, entering } = AnimationStore.getBag(currentScreenKey);
19
+ const {
20
+ animationProgress,
21
+ pendingLifecycleStartBlockCount,
22
+ pendingLifecycleRequestKind,
23
+ } = SystemStore.getBag(currentScreenKey);
21
24
 
22
25
  const hasVisibilityGateOpened = useSharedValue(false);
23
26
  const shouldBlockVisibility = useSharedValue(!isFloatingOverlay);
@@ -31,7 +34,7 @@ export const useMaybeBlockVisibility = (isFloatingOverlay?: boolean) => {
31
34
  hasVisibilityGateOpened: hasVisibilityGateOpened.get(),
32
35
  pendingLifecycleStartBlockCount: pendingLifecycleStartBlockCount.get(),
33
36
  pendingLifecycleRequestKind: pendingLifecycleRequestKind.get(),
34
- progress: transitionProgress.get(),
37
+ animationProgress: animationProgress.get(),
35
38
  entering: entering.get(),
36
39
  });
37
40
  },
@@ -49,14 +52,12 @@ export const useMaybeBlockVisibility = (isFloatingOverlay?: boolean) => {
49
52
  const animatedStyle = useAnimatedStyle(() => {
50
53
  "worklet";
51
54
  const offset = getVisibilityBlockOffset(height);
52
- // Keep opacity out of normal rendering so effects such as Liquid Glass
53
- // retain native compositing. Once closing has fully finished, hiding the
54
- // outgoing screen lets the handoff settle before React removes its host.
55
- const shouldHideClosedScreen =
56
- closing.get() === 1 &&
57
- transitionProgress.get() <= 0 &&
58
- progressAnimating.get() === 0;
59
-
55
+ // Hide the outgoing screen after its visual close while React removes its
56
+ // host asynchronously.
57
+ const shouldHideClosedScreen = hasCloseTransitionFinished({
58
+ closing: closing.get(),
59
+ animationProgress: animationProgress.get(),
60
+ });
60
61
  if (shouldHideClosedScreen) {
61
62
  return {
62
63
  opacity: 0,
@@ -215,11 +215,12 @@ const writeDestination = (
215
215
  bounds: MeasuredDimensions,
216
216
  styles: StyleProps,
217
217
  group?: GroupKey,
218
+ runtimeFlags: BoundaryRuntimeFlags = {},
218
219
  ) => {
219
220
  "worklet";
220
221
  const existingLink = getPairLink(state, pairKey, linkKey);
221
222
 
222
- const destination = createLinkSide(screenKey, bounds, styles);
223
+ const destination = createLinkSide(screenKey, bounds, styles, runtimeFlags);
223
224
  const link =
224
225
  existingLink ??
225
226
  ({
@@ -296,12 +297,22 @@ function setDestination(
296
297
  bounds: MeasuredDimensions,
297
298
  styles: StyleProps = {},
298
299
  group?: GroupKey,
300
+ runtimeFlags: BoundaryRuntimeFlags = {},
299
301
  ) {
300
302
  "worklet";
301
303
  pairs.modify(<T extends LinkPairsState>(state: T): T => {
302
304
  "worklet";
303
305
  const linkKey = getLinkKeyFromTag(tag);
304
- writeDestination(state, pairKey, linkKey, screenKey, bounds, styles, group);
306
+ writeDestination(
307
+ state,
308
+ pairKey,
309
+ linkKey,
310
+ screenKey,
311
+ bounds,
312
+ styles,
313
+ group,
314
+ runtimeFlags,
315
+ );
305
316
 
306
317
  return state;
307
318
  });
@@ -137,6 +137,29 @@ export const getClampedScrollAxisDelta = (
137
137
  return currentOffset - capturedOffset;
138
138
  };
139
139
 
140
+ /**
141
+ * Visual scroll travel from a bounds snapshot normalized to its at-rest
142
+ * position. The captured side is clamped because measurement removes transient
143
+ * rubber-band displacement; the current side stays raw so consumers can follow
144
+ * the position that is actually visible on iOS.
145
+ */
146
+ export const getVisualScrollAxisDelta = (
147
+ current: ScrollMetadataState | null | undefined,
148
+ captured: ScrollMetadataState | null | undefined,
149
+ axis: ScrollGestureAxis,
150
+ ): number => {
151
+ "worklet";
152
+
153
+ const currentAxisState = current?.[axis];
154
+ const capturedOffset = clampScrollAxisOffset(captured?.[axis]);
155
+
156
+ if (!currentAxisState || capturedOffset === null) {
157
+ return 0;
158
+ }
159
+
160
+ return currentAxisState.offset - capturedOffset;
161
+ };
162
+
140
163
  /**
141
164
  * Route-keyed scroll geometry used by gesture activation and bounds measurement.
142
165
  * Coordination tracks gesture-owner scoped ScrollView offsets and dimensions;
@@ -16,6 +16,12 @@ export enum LifecycleTransitionRequestKind {
16
16
  type SystemStoreState = {
17
17
  targetProgress: SharedValue<number>;
18
18
 
19
+ /**
20
+ * Directional linear clock for the active progress animation. Increasing
21
+ * animations run 0 -> 1; decreasing animations run 1 -> 0.
22
+ */
23
+ animationProgress: SharedValue<number>;
24
+
19
25
  /**
20
26
  * Resolved fraction (contentHeight / screenHeight) for the 'auto' snap point. -1 = not yet measured.
21
27
  */
@@ -67,6 +73,7 @@ export type SystemStoreMap = SystemStoreState & {
67
73
  export const SystemStore = createStore<SystemStoreState, SystemStoreActions>({
68
74
  createBag: () => ({
69
75
  targetProgress: makeMutable(1),
76
+ animationProgress: makeMutable(0),
70
77
  resolvedAutoSnapPoint: makeMutable(-1),
71
78
  measuredContentLayout: makeMutable<Layout | null>(null),
72
79
  pendingLifecycleRequestKind: makeMutable<LifecycleTransitionRequestKind>(
@@ -77,6 +84,7 @@ export const SystemStore = createStore<SystemStoreState, SystemStoreActions>({
77
84
  }),
78
85
  disposeBag: (bag) => {
79
86
  cancelAnimation(bag.targetProgress);
87
+ cancelAnimation(bag.animationProgress);
80
88
  cancelAnimation(bag.resolvedAutoSnapPoint);
81
89
  cancelAnimation(bag.measuredContentLayout);
82
90
  cancelAnimation(bag.pendingLifecycleRequestKind);