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,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);
@@ -16,6 +16,7 @@ interface AnimateToProgressProps {
16
16
  onAnimationFinish?: (finished: boolean) => void;
17
17
  animations: AnimationStoreMap;
18
18
  targetProgress: SharedValue<number>;
19
+ animationProgress: SharedValue<number>;
19
20
  emitWillAnimate?: boolean;
20
21
  markEntering?: boolean;
21
22
  /** Optional initial velocity for spring-based progress (units: progress/sec). */
@@ -35,17 +36,31 @@ const setTransitionLifecycleFlags = (
35
36
  return;
36
37
  }
37
38
 
39
+ animations.closing.set(FALSE);
40
+
38
41
  if (markEntering) {
39
42
  animations.entering.set(TRUE);
40
43
  }
41
44
  };
42
45
 
46
+ export const resolveAnimationProgressRange = (
47
+ currentProgress: number,
48
+ targetProgress: number,
49
+ ) => {
50
+ "worklet";
51
+ return {
52
+ from: Math.min(1, Math.max(0, currentProgress)),
53
+ to: targetProgress,
54
+ };
55
+ };
56
+
43
57
  export const animateToProgress = ({
44
58
  target,
45
59
  spec,
46
60
  onAnimationFinish,
47
61
  animations,
48
62
  targetProgress,
63
+ animationProgress,
49
64
  emitWillAnimate = true,
50
65
  markEntering = true,
51
66
  initialVelocity,
@@ -77,7 +92,11 @@ export const animateToProgress = ({
77
92
 
78
93
  const startAnimation = () => {
79
94
  "worklet";
95
+ const { from: animationProgressFrom, to: animationProgressTo } =
96
+ resolveAnimationProgressRange(transitionProgress.get(), value);
97
+
80
98
  targetProgress.set(value);
99
+ animationProgress.set(animationProgressFrom);
81
100
 
82
101
  const shouldClearEnteringOnFinish =
83
102
  !isClosing && (markEntering || entering.get());
@@ -88,6 +107,7 @@ export const animateToProgress = ({
88
107
  progressAnimating.set(FALSE);
89
108
  progressSettled.set(TRUE);
90
109
  transitionProgress.set(value);
110
+ animationProgress.set(animationProgressTo);
91
111
  if (shouldClearEnteringOnFinish) {
92
112
  entering.set(FALSE);
93
113
  }
@@ -101,43 +121,54 @@ export const animateToProgress = ({
101
121
  progressAnimating.set(TRUE); //<-- Do not move this into the callback
102
122
  progressSettled.set(FALSE);
103
123
  transitionProgress.set(
104
- animate(value, effectiveConfig, (state) => {
105
- "worklet";
106
- if (state.settled) {
107
- progressSettled.set(TRUE);
108
- }
124
+ animate(
125
+ value,
126
+ effectiveConfig,
127
+ (state) => {
128
+ "worklet";
129
+ if (state.settled) {
130
+ progressSettled.set(TRUE);
131
+ }
109
132
 
110
- if (!state.finished) return;
133
+ if (!state.finished) return;
111
134
 
112
- if (shouldClearEnteringOnFinish) {
113
- entering.set(FALSE);
114
- }
135
+ animationProgress.set(animationProgressTo);
115
136
 
116
- if (isClosing) {
117
- progressAnimating.set(FALSE);
137
+ if (shouldClearEnteringOnFinish) {
138
+ entering.set(FALSE);
139
+ }
118
140
 
119
- if (onAnimationFinish) {
120
- // Paint the terminal UI-thread host/style state before React
121
- // removes the closing route and its native portal host.
122
- requestAnimationFrame(() => {
123
- "worklet";
141
+ if (isClosing) {
142
+ progressAnimating.set(FALSE);
143
+
144
+ if (onAnimationFinish) {
145
+ // Paint the terminal UI-thread host/style state before React
146
+ // removes the closing route and its native portal host.
124
147
  requestAnimationFrame(() => {
125
148
  "worklet";
126
- runOnJS(onAnimationFinish)(state.finished);
149
+ requestAnimationFrame(() => {
150
+ "worklet";
151
+ runOnJS(onAnimationFinish)(state.finished);
152
+ });
127
153
  });
154
+ }
155
+ } else {
156
+ if (onAnimationFinish) {
157
+ runOnJS(onAnimationFinish)(state.finished);
158
+ }
159
+
160
+ // Delay clearing progress animation by one frame to ensure final frame is painted
161
+ requestAnimationFrame(() => {
162
+ progressAnimating.set(FALSE);
128
163
  });
129
164
  }
130
- } else {
131
- if (onAnimationFinish) {
132
- runOnJS(onAnimationFinish)(state.finished);
133
- }
134
-
135
- // Delay clearing progress animation by one frame to ensure final frame is painted
136
- requestAnimationFrame(() => {
137
- progressAnimating.set(FALSE);
138
- });
139
- }
140
- }),
165
+ },
166
+ {
167
+ value: animationProgress,
168
+ from: animationProgressFrom,
169
+ to: animationProgressTo,
170
+ },
171
+ ),
141
172
  );
142
173
  };
143
174
 
@@ -1,7 +1,7 @@
1
1
  import type { WithTimingConfig } from "react-native-reanimated";
2
2
  import { withTiming } from "react-native-reanimated";
3
3
  import { type SpringConfig, withInternalSpring } from "./spring";
4
- import type { AnimationStateCallback } from "./state";
4
+ import type { AnimationProgressDriver, AnimationStateCallback } from "./state";
5
5
 
6
6
  export type TimingAnimationConfig = WithTimingConfig;
7
7
  export type SpringAnimationConfig = SpringConfig;
@@ -9,6 +9,11 @@ export type ScreenAnimationConfig =
9
9
  | SpringAnimationConfig
10
10
  | TimingAnimationConfig;
11
11
 
12
+ const linearEasing = (progress: number) => {
13
+ "worklet";
14
+ return progress;
15
+ };
16
+
12
17
  export const isSpringAnimationConfig = (
13
18
  config: ScreenAnimationConfig | undefined,
14
19
  ): config is SpringAnimationConfig => {
@@ -33,10 +38,21 @@ export const animate = (
33
38
  toValue: number,
34
39
  config?: ScreenAnimationConfig,
35
40
  callback?: AnimationStateCallback,
41
+ animationProgress?: AnimationProgressDriver,
36
42
  ) => {
37
43
  "worklet";
38
44
 
39
45
  if (!isSpringAnimationConfig(config)) {
46
+ if (animationProgress) {
47
+ animationProgress.value.set(animationProgress.from);
48
+ animationProgress.value.set(
49
+ withTiming(animationProgress.to, {
50
+ ...config,
51
+ easing: linearEasing,
52
+ }),
53
+ );
54
+ }
55
+
40
56
  return withTiming(toValue, config, (finished) => {
41
57
  "worklet";
42
58
  const didFinish = finished === true;
@@ -47,5 +63,5 @@ export const animate = (
47
63
  });
48
64
  }
49
65
 
50
- return withInternalSpring(toValue, config, callback);
66
+ return withInternalSpring(toValue, config, callback, animationProgress);
51
67
  };
@@ -3,7 +3,7 @@ import type {
3
3
  AnimationCallback,
4
4
  ReduceMotion,
5
5
  } from "react-native-reanimated";
6
- import type { AnimationStateCallback } from "../state";
6
+ import type { AnimationProgressDriver, AnimationStateCallback } from "../state";
7
7
  import type { SpringConfig } from "./springConfigs";
8
8
  import type {
9
9
  DefaultSpringConfig,
@@ -13,6 +13,7 @@ import type {
13
13
  } from "./springUtils";
14
14
  import {
15
15
  calculateNewStiffnessToMatchDuration,
16
+ calculateSpringAnimationDuration,
16
17
  checkIfConfigIsValid,
17
18
  criticallyDampedSpringCalculations,
18
19
  getEnergy,
@@ -30,6 +31,7 @@ const REACT_NATIVE_RUNTIME_KIND = 1;
30
31
  const REDUCE_MOTION_SYSTEM = "system";
31
32
  const REDUCE_MOTION_ALWAYS = "always";
32
33
  const DEFAULT_SPRING_SETTLE_DISTANCE = 0.001;
34
+ const MAX_UNFINISHED_ANIMATION_PROGRESS = 1 - 1e-6;
33
35
 
34
36
  const DEFAULT_SPRING_CONFIG = {
35
37
  damping: 120,
@@ -61,6 +63,7 @@ const getReduceMotionForAnimation = (config?: ReduceMotion) => {
61
63
  const defineSpringAnimation = <TAnimation extends Animation<TAnimation>>(
62
64
  _starting: number,
63
65
  factory: () => TAnimation,
66
+ onReducedMotion?: () => void,
64
67
  ): TAnimation => {
65
68
  "worklet";
66
69
  const create = (() => {
@@ -76,6 +79,7 @@ const defineSpringAnimation = <TAnimation extends Animation<TAnimation>>(
76
79
  ) => {
77
80
  "worklet";
78
81
  if (animation.reduceMotion) {
82
+ onReducedMotion?.();
79
83
  animation.current = animation.toValue;
80
84
  animation.onFrame = () => true;
81
85
  return;
@@ -99,6 +103,7 @@ type withSpringType = (
99
103
  toValue: number,
100
104
  userConfig?: SpringConfig,
101
105
  callback?: AnimationStateCallback,
106
+ animationProgress?: AnimationProgressDriver,
102
107
  ) => number;
103
108
 
104
109
  /**
@@ -123,9 +128,11 @@ export const withInternalSpring = ((
123
128
  toValue: number,
124
129
  userConfig?: SpringConfig,
125
130
  callback?: AnimationStateCallback,
131
+ animationProgress?: AnimationProgressDriver,
126
132
  ): Animation<SpringAnimation> => {
127
133
  "worklet";
128
134
 
135
+ // biome-ignore format: Keep this Reanimated fork aligned with its upstream layout.
129
136
  return defineSpringAnimation<SpringAnimation>(toValue, () => {
130
137
  "worklet";
131
138
  const config: DefaultSpringConfig & SpringConfigInner = safeMergeConfigs<
@@ -175,6 +182,7 @@ export const withInternalSpring = ((
175
182
 
176
183
  if (config.skipAnimation) {
177
184
  animation.current = toValue;
185
+ animationProgress?.value.set(animationProgress.to);
178
186
  animation.lastTimestamp = 0;
179
187
  return true;
180
188
  }
@@ -182,6 +190,7 @@ export const withInternalSpring = ((
182
190
 
183
191
  const deltaTime = Math.min(Math.max(now - lastTimestamp, 0), 64);
184
192
  animation.lastTimestamp = now;
193
+ animation.animationProgressElapsed += deltaTime;
185
194
 
186
195
  const t = deltaTime / 1000;
187
196
  const v0 = velocity as number;
@@ -212,6 +221,7 @@ export const withInternalSpring = ((
212
221
  if (isAnimationTerminatingCalculation(animation, config)) {
213
222
  animation.velocity = 0;
214
223
  animation.current = toValue;
224
+ animationProgress?.value.set(animationProgress.to);
215
225
  settled = true;
216
226
  animation.settled = true;
217
227
  // clear lastTimestamp to avoid using stale value by the next spring animation that starts after this one
@@ -221,6 +231,21 @@ export const withInternalSpring = ((
221
231
 
222
232
  notifySettled(animation);
223
233
 
234
+ if (animationProgress) {
235
+ const elapsedFraction =
236
+ animation.animationProgressDuration <= 0
237
+ ? MAX_UNFINISHED_ANIMATION_PROGRESS
238
+ : Math.min(
239
+ animation.animationProgressElapsed /
240
+ animation.animationProgressDuration,
241
+ MAX_UNFINISHED_ANIMATION_PROGRESS,
242
+ );
243
+ const nextAnimationProgress =
244
+ animationProgress.from +
245
+ (animationProgress.to - animationProgress.from) * elapsedFraction;
246
+ animationProgress.value.set(nextAnimationProgress);
247
+ }
248
+
224
249
  return false;
225
250
  }
226
251
 
@@ -307,6 +332,11 @@ export const withInternalSpring = ((
307
332
  config.mass,
308
333
  );
309
334
  animation.initialEnergy = initialEnergy;
335
+ animation.animationProgressElapsed = 0;
336
+ animation.animationProgressDuration = config.skipAnimation
337
+ ? 0
338
+ : calculateSpringAnimationDuration(animation, config);
339
+ animationProgress?.value.set(animationProgress.from);
310
340
 
311
341
  animation.lastTimestamp = previousAnimation?.lastTimestamp || now;
312
342
 
@@ -339,9 +369,14 @@ export const withInternalSpring = ((
339
369
  omega0: 0,
340
370
  omega1: 0,
341
371
  initialEnergy: 0,
372
+ animationProgressElapsed: 0,
373
+ animationProgressDuration: 0,
342
374
  reduceMotion: getReduceMotionForAnimation(config.reduceMotion),
343
375
  } as SpringAnimation;
344
376
 
345
377
  return animation;
378
+ }, () => {
379
+ "worklet";
380
+ animationProgress?.value.set(animationProgress.to);
346
381
  });
347
382
  }) as unknown as withSpringType;