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
@@ -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;
@@ -29,6 +29,8 @@ export interface SpringAnimation extends Animation<SpringAnimation> {
29
29
  omega0: number;
30
30
  omega1: number;
31
31
  initialEnergy: number;
32
+ animationProgressElapsed: number;
33
+ animationProgressDuration: number;
32
34
  }
33
35
 
34
36
  export type InnerSpringAnimation = SpringAnimation;
@@ -362,6 +364,134 @@ export function underDampedSpringCalculations(
362
364
  return { position: underDampedPosition, velocity: underDampedVelocity };
363
365
  }
364
366
 
367
+ const MAX_SPRING_DURATION_SECONDS = 60;
368
+ const SPRING_DURATION_PRECISION_SECONDS = 0.0001;
369
+ const MAX_OVERSHOOT_DURATION_SAMPLES = 4096;
370
+
371
+ export function calculateSpringAnimationDuration(
372
+ animation: InnerSpringAnimation,
373
+ config: DefaultSpringConfig & SpringConfigInner,
374
+ ): number {
375
+ "worklet";
376
+ const startPosition = animation.current;
377
+ const startVelocity = animation.velocity;
378
+ const x0 = startPosition - animation.toValue;
379
+
380
+ const stateAt = (time: number) => {
381
+ "worklet";
382
+ return animation.zeta < 1
383
+ ? underDampedSpringCalculations(animation, {
384
+ zeta: animation.zeta,
385
+ v0: startVelocity,
386
+ x0,
387
+ omega0: animation.omega0,
388
+ omega1: animation.omega1,
389
+ t: time,
390
+ })
391
+ : criticallyDampedSpringCalculations(animation, {
392
+ v0: startVelocity,
393
+ x0,
394
+ omega0: animation.omega0,
395
+ t: time,
396
+ });
397
+ };
398
+
399
+ const terminatesByEnergyAt = (time: number) => {
400
+ "worklet";
401
+ if (animation.initialEnergy === 0) {
402
+ return true;
403
+ }
404
+
405
+ const state = stateAt(time);
406
+ const energy = getEnergy(
407
+ animation.toValue - state.position,
408
+ state.velocity,
409
+ config.stiffness,
410
+ config.mass,
411
+ );
412
+
413
+ return energy / animation.initialEnergy <= config.energyThreshold;
414
+ };
415
+
416
+ if (terminatesByEnergyAt(0)) {
417
+ return 0;
418
+ }
419
+
420
+ let lowerBound = 0;
421
+ let upperBound = 1 / 60;
422
+ while (
423
+ upperBound < MAX_SPRING_DURATION_SECONDS &&
424
+ !terminatesByEnergyAt(upperBound)
425
+ ) {
426
+ lowerBound = upperBound;
427
+ upperBound *= 2;
428
+ }
429
+ upperBound = Math.min(upperBound, MAX_SPRING_DURATION_SECONDS);
430
+
431
+ if (terminatesByEnergyAt(upperBound)) {
432
+ while (upperBound - lowerBound > SPRING_DURATION_PRECISION_SECONDS) {
433
+ const midpoint = (lowerBound + upperBound) / 2;
434
+ if (terminatesByEnergyAt(midpoint)) {
435
+ upperBound = midpoint;
436
+ } else {
437
+ lowerBound = midpoint;
438
+ }
439
+ }
440
+ }
441
+
442
+ const energyDuration = upperBound;
443
+ if (!config.overshootClamping || energyDuration === 0) {
444
+ return energyDuration * 1000;
445
+ }
446
+
447
+ const leftBound =
448
+ animation.startValue >= 0
449
+ ? animation.toValue
450
+ : animation.toValue + animation.startValue;
451
+ const rightBound = leftBound + Math.abs(animation.startValue);
452
+ const isOutsideBoundsAt = (time: number) => {
453
+ "worklet";
454
+ const { position } = stateAt(time);
455
+ return position < leftBound || position > rightBound;
456
+ };
457
+
458
+ const frequency = animation.zeta < 1 ? animation.omega1 : animation.omega0;
459
+ const sampleStep =
460
+ frequency > 0 ? Math.min(1 / 240, Math.PI / (frequency * 8)) : 1 / 240;
461
+ const sampleCount = Math.min(
462
+ MAX_OVERSHOOT_DURATION_SAMPLES,
463
+ Math.max(1, Math.ceil(energyDuration / sampleStep)),
464
+ );
465
+ const effectiveStep = energyDuration / sampleCount;
466
+ let previousTime = 0;
467
+
468
+ for (let index = 1; index <= sampleCount; index += 1) {
469
+ const time = effectiveStep * index;
470
+ if (!isOutsideBoundsAt(time)) {
471
+ previousTime = time;
472
+ continue;
473
+ }
474
+
475
+ let crossingLowerBound = previousTime;
476
+ let crossingUpperBound = time;
477
+ while (
478
+ crossingUpperBound - crossingLowerBound >
479
+ SPRING_DURATION_PRECISION_SECONDS
480
+ ) {
481
+ const midpoint = (crossingLowerBound + crossingUpperBound) / 2;
482
+ if (isOutsideBoundsAt(midpoint)) {
483
+ crossingUpperBound = midpoint;
484
+ } else {
485
+ crossingLowerBound = midpoint;
486
+ }
487
+ }
488
+
489
+ return crossingUpperBound * 1000;
490
+ }
491
+
492
+ return energyDuration * 1000;
493
+ }
494
+
365
495
  export function isAnimationTerminatingCalculation(
366
496
  animation: InnerSpringAnimation,
367
497
  config: DefaultSpringConfig & SpringConfigInner,
@@ -1,6 +1,14 @@
1
+ import type { SharedValue } from "react-native-reanimated";
2
+
1
3
  export type AnimationState = {
2
4
  finished: boolean;
3
5
  settled: boolean;
4
6
  };
5
7
 
6
8
  export type AnimationStateCallback = (state: AnimationState) => void;
9
+
10
+ export type AnimationProgressDriver = {
11
+ value: SharedValue<number>;
12
+ from: number;
13
+ to: number;
14
+ };
@@ -2,6 +2,8 @@ import type { MeasuredDimensions } from "react-native-reanimated";
2
2
  import { EPSILON } from "../../../../constants";
3
3
  import type { Layout } from "../../../../types/screen.types";
4
4
  import { computeContentTransformGeometry } from "../../helpers/geometry";
5
+ import type { ContentTransformGeometry } from "../../types/geometry";
6
+ import type { BoundsAnchor } from "../../types/options";
5
7
  import {
6
8
  DRAG_DIRECTIONAL_SCALE_EXPONENT,
7
9
  DRAG_DIRECTIONAL_SCALE_MAX,
@@ -184,16 +186,34 @@ function getBoundsCenterY(bounds: MeasuredDimensions) {
184
186
  return bounds.pageY + bounds.height / 2;
185
187
  }
186
188
 
189
+ export function resolveRevealContentBaseTransformFromGeometry({
190
+ progress,
191
+ geometry,
192
+ }: {
193
+ progress: number;
194
+ geometry: ContentTransformGeometry;
195
+ }) {
196
+ "worklet";
197
+
198
+ return {
199
+ translateX: mixUnit(geometry.tx, 0, progress),
200
+ translateY: mixUnit(geometry.ty, 0, progress),
201
+ scale: mixUnit(geometry.s, 1, progress),
202
+ };
203
+ }
204
+
187
205
  export function resolveRevealContentBaseTransform({
188
206
  progress,
189
207
  sourceBounds,
190
208
  destinationBounds,
191
209
  screenLayout,
210
+ anchor,
192
211
  }: {
193
212
  progress: number;
194
213
  sourceBounds: MeasuredDimensions;
195
214
  destinationBounds: MeasuredDimensions;
196
215
  screenLayout: Layout;
216
+ anchor?: BoundsAnchor;
197
217
  }) {
198
218
  "worklet";
199
219
 
@@ -202,14 +222,14 @@ export function resolveRevealContentBaseTransform({
202
222
  end: destinationBounds,
203
223
  entering: true,
204
224
  dimensions: screenLayout,
225
+ anchor,
205
226
  scaleMode: "uniform",
206
227
  });
207
228
 
208
- return {
209
- translateX: mixUnit(geometry.tx, 0, progress),
210
- translateY: mixUnit(geometry.ty, 0, progress),
211
- scale: mixUnit(geometry.s, 1, progress),
212
- };
229
+ return resolveRevealContentBaseTransformFromGeometry({
230
+ geometry,
231
+ progress,
232
+ });
213
233
  }
214
234
 
215
235
  export function resolveTrackedSourceElementTransform({