@rafaelaugusto/jolt 0.1.0-beta.9 → 0.1.0-rc.2

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 (576) hide show
  1. package/README.md +167 -21
  2. package/dist/animate.d.ts +25 -4
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +67 -26
  5. package/dist/animate.js.map +1 -1
  6. package/dist/blur/index.d.ts +6 -0
  7. package/dist/blur/index.d.ts.map +1 -0
  8. package/dist/blur/index.js +196 -0
  9. package/dist/blur/index.js.map +1 -0
  10. package/dist/blur/native.d.ts +17 -0
  11. package/dist/blur/native.d.ts.map +1 -0
  12. package/dist/blur/native.js +44 -0
  13. package/dist/blur/native.js.map +1 -0
  14. package/dist/blur/types.d.ts +32 -0
  15. package/dist/blur/types.d.ts.map +1 -0
  16. package/dist/blur/types.js +2 -0
  17. package/dist/blur/types.js.map +1 -0
  18. package/dist/bottom-sheet/geometry.d.ts +18 -0
  19. package/dist/bottom-sheet/geometry.d.ts.map +1 -0
  20. package/dist/bottom-sheet/geometry.js +51 -0
  21. package/dist/bottom-sheet/geometry.js.map +1 -0
  22. package/dist/bottom-sheet/index.d.ts +56 -0
  23. package/dist/bottom-sheet/index.d.ts.map +1 -0
  24. package/dist/bottom-sheet/index.js +462 -0
  25. package/dist/bottom-sheet/index.js.map +1 -0
  26. package/dist/bottom-sheet/native.d.ts +11 -0
  27. package/dist/bottom-sheet/native.d.ts.map +1 -0
  28. package/dist/bottom-sheet/native.js +173 -0
  29. package/dist/bottom-sheet/native.js.map +1 -0
  30. package/dist/config.d.ts +9 -0
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +40 -1
  33. package/dist/config.js.map +1 -1
  34. package/dist/decay.d.ts +1 -0
  35. package/dist/decay.d.ts.map +1 -1
  36. package/dist/decay.js +7 -0
  37. package/dist/decay.js.map +1 -1
  38. package/dist/drag-physics.d.ts +6 -1
  39. package/dist/drag-physics.d.ts.map +1 -1
  40. package/dist/drag.d.ts +17 -3
  41. package/dist/drag.d.ts.map +1 -1
  42. package/dist/drag.js +34 -11
  43. package/dist/drag.js.map +1 -1
  44. package/dist/driver/android-gradient.d.ts +5 -0
  45. package/dist/driver/android-gradient.d.ts.map +1 -0
  46. package/dist/driver/android-gradient.js +99 -0
  47. package/dist/driver/android-gradient.js.map +1 -0
  48. package/dist/driver/android-particles.d.ts +6 -0
  49. package/dist/driver/android-particles.d.ts.map +1 -0
  50. package/dist/driver/android-particles.js +93 -0
  51. package/dist/driver/android-particles.js.map +1 -0
  52. package/dist/driver/android.d.ts.map +1 -1
  53. package/dist/driver/android.js +27 -1
  54. package/dist/driver/android.js.map +1 -1
  55. package/dist/driver/frame.d.ts +3 -0
  56. package/dist/driver/frame.d.ts.map +1 -0
  57. package/dist/driver/frame.js +7 -0
  58. package/dist/driver/frame.js.map +1 -0
  59. package/dist/driver/index.d.ts +4 -0
  60. package/dist/driver/index.d.ts.map +1 -1
  61. package/dist/driver/index.js.map +1 -1
  62. package/dist/driver/ios-gradient.d.ts +5 -0
  63. package/dist/driver/ios-gradient.d.ts.map +1 -0
  64. package/dist/driver/ios-gradient.js +131 -0
  65. package/dist/driver/ios-gradient.js.map +1 -0
  66. package/dist/driver/ios-scroll-delegate.d.ts +4 -0
  67. package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
  68. package/dist/driver/ios-scroll-delegate.js +26 -0
  69. package/dist/driver/ios-scroll-delegate.js.map +1 -0
  70. package/dist/driver/ios.d.ts.map +1 -1
  71. package/dist/driver/ios.js +9 -0
  72. package/dist/driver/ios.js.map +1 -1
  73. package/dist/easing.d.ts +3 -1
  74. package/dist/easing.d.ts.map +1 -1
  75. package/dist/easing.js +18 -1
  76. package/dist/easing.js.map +1 -1
  77. package/dist/engine.d.ts +31 -2
  78. package/dist/engine.d.ts.map +1 -1
  79. package/dist/engine.js +194 -42
  80. package/dist/engine.js.map +1 -1
  81. package/dist/gesture-native.d.ts +28 -0
  82. package/dist/gesture-native.d.ts.map +1 -0
  83. package/dist/gesture-native.js +61 -0
  84. package/dist/gesture-native.js.map +1 -0
  85. package/dist/gestures/index.d.ts +69 -0
  86. package/dist/gestures/index.d.ts.map +1 -0
  87. package/dist/gestures/index.js +262 -0
  88. package/dist/gestures/index.js.map +1 -0
  89. package/dist/glass/index.d.ts +55 -0
  90. package/dist/glass/index.d.ts.map +1 -0
  91. package/dist/glass/index.js +205 -0
  92. package/dist/glass/index.js.map +1 -0
  93. package/dist/gradient-binding.d.ts +38 -0
  94. package/dist/gradient-binding.d.ts.map +1 -0
  95. package/dist/gradient-binding.js +128 -0
  96. package/dist/gradient-binding.js.map +1 -0
  97. package/dist/gradient.d.ts +105 -0
  98. package/dist/gradient.d.ts.map +1 -0
  99. package/dist/gradient.js +514 -0
  100. package/dist/gradient.js.map +1 -0
  101. package/dist/gravity.d.ts +13 -0
  102. package/dist/gravity.d.ts.map +1 -0
  103. package/dist/gravity.js +84 -0
  104. package/dist/gravity.js.map +1 -0
  105. package/dist/haptics.d.ts.map +1 -1
  106. package/dist/haptics.js +101 -28
  107. package/dist/haptics.js.map +1 -1
  108. package/dist/image-effect.d.ts +1 -0
  109. package/dist/image-effect.d.ts.map +1 -1
  110. package/dist/image-effect.js +10 -2
  111. package/dist/image-effect.js.map +1 -1
  112. package/dist/index.d.ts +19 -7
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +10 -4
  115. package/dist/index.js.map +1 -1
  116. package/dist/inspector/index.d.ts +86 -0
  117. package/dist/inspector/index.d.ts.map +1 -0
  118. package/dist/inspector/index.js +419 -0
  119. package/dist/inspector/index.js.map +1 -0
  120. package/dist/inspector/plot.d.ts +4 -0
  121. package/dist/inspector/plot.d.ts.map +1 -0
  122. package/dist/inspector/plot.js +23 -0
  123. package/dist/inspector/plot.js.map +1 -0
  124. package/dist/inspector/probe.d.ts +19 -0
  125. package/dist/inspector/probe.d.ts.map +1 -0
  126. package/dist/inspector/probe.js +37 -0
  127. package/dist/inspector/probe.js.map +1 -0
  128. package/dist/inspector/tuning.d.ts +19 -0
  129. package/dist/inspector/tuning.d.ts.map +1 -0
  130. package/dist/inspector/tuning.js +37 -0
  131. package/dist/inspector/tuning.js.map +1 -0
  132. package/dist/interactive-navigation/index.d.ts +44 -0
  133. package/dist/interactive-navigation/index.d.ts.map +1 -0
  134. package/dist/interactive-navigation/index.js +350 -0
  135. package/dist/interactive-navigation/index.js.map +1 -0
  136. package/dist/keyboard.d.ts +24 -0
  137. package/dist/keyboard.d.ts.map +1 -1
  138. package/dist/keyboard.js +199 -6
  139. package/dist/keyboard.js.map +1 -1
  140. package/dist/live-spring-driver.d.ts +52 -0
  141. package/dist/live-spring-driver.d.ts.map +1 -0
  142. package/dist/live-spring-driver.js +104 -0
  143. package/dist/live-spring-driver.js.map +1 -0
  144. package/dist/mixer.d.ts +55 -0
  145. package/dist/mixer.d.ts.map +1 -0
  146. package/dist/mixer.js +286 -0
  147. package/dist/mixer.js.map +1 -0
  148. package/dist/motion-scope.d.ts +8 -2
  149. package/dist/motion-scope.d.ts.map +1 -1
  150. package/dist/motion-scope.js +24 -3
  151. package/dist/motion-scope.js.map +1 -1
  152. package/dist/motion-states.d.ts +19 -7
  153. package/dist/motion-states.d.ts.map +1 -1
  154. package/dist/motion-states.js +116 -26
  155. package/dist/motion-states.js.map +1 -1
  156. package/dist/motion-value.d.ts +227 -0
  157. package/dist/motion-value.d.ts.map +1 -0
  158. package/dist/motion-value.js +1074 -0
  159. package/dist/motion-value.js.map +1 -0
  160. package/dist/native/index.d.ts +10 -0
  161. package/dist/native/index.d.ts.map +1 -0
  162. package/dist/native/index.js +6 -0
  163. package/dist/native/index.js.map +1 -0
  164. package/dist/native-properties.d.ts +28 -0
  165. package/dist/native-properties.d.ts.map +1 -0
  166. package/dist/native-properties.js +154 -0
  167. package/dist/native-properties.js.map +1 -0
  168. package/dist/native-property-driver.d.ts +19 -0
  169. package/dist/native-property-driver.d.ts.map +1 -0
  170. package/dist/native-property-driver.js +69 -0
  171. package/dist/native-property-driver.js.map +1 -0
  172. package/dist/native-property.d.ts +37 -0
  173. package/dist/native-property.d.ts.map +1 -0
  174. package/dist/native-property.js +285 -0
  175. package/dist/native-property.js.map +1 -0
  176. package/dist/particles.d.ts +5 -2
  177. package/dist/particles.d.ts.map +1 -1
  178. package/dist/particles.js +16 -10
  179. package/dist/particles.js.map +1 -1
  180. package/dist/path.d.ts.map +1 -1
  181. package/dist/path.js +2 -2
  182. package/dist/path.js.map +1 -1
  183. package/dist/physics/index.d.ts +139 -0
  184. package/dist/physics/index.d.ts.map +1 -0
  185. package/dist/physics/index.js +316 -0
  186. package/dist/physics/index.js.map +1 -0
  187. package/dist/physics/native.d.ts +54 -0
  188. package/dist/physics/native.d.ts.map +1 -0
  189. package/dist/physics/native.js +64 -0
  190. package/dist/physics/native.js.map +1 -0
  191. package/dist/playback-group.d.ts.map +1 -1
  192. package/dist/playback-group.js +17 -1
  193. package/dist/playback-group.js.map +1 -1
  194. package/dist/playback.d.ts +15 -0
  195. package/dist/playback.d.ts.map +1 -1
  196. package/dist/playback.js +23 -0
  197. package/dist/playback.js.map +1 -1
  198. package/dist/predictive-back/index.d.ts +45 -0
  199. package/dist/predictive-back/index.d.ts.map +1 -0
  200. package/dist/predictive-back/index.js +220 -0
  201. package/dist/predictive-back/index.js.map +1 -0
  202. package/dist/predictive-back/presentation.d.ts +4 -0
  203. package/dist/predictive-back/presentation.d.ts.map +1 -0
  204. package/dist/predictive-back/presentation.js +3 -0
  205. package/dist/predictive-back/presentation.js.map +1 -0
  206. package/dist/press.d.ts.map +1 -1
  207. package/dist/press.js +11 -2
  208. package/dist/press.js.map +1 -1
  209. package/dist/reorder/handle.d.ts +6 -0
  210. package/dist/reorder/handle.d.ts.map +1 -0
  211. package/dist/reorder/handle.js +10 -0
  212. package/dist/reorder/handle.js.map +1 -0
  213. package/dist/reorder/index.d.ts +10 -0
  214. package/dist/reorder/index.d.ts.map +1 -0
  215. package/dist/reorder/index.js +233 -0
  216. package/dist/reorder/index.js.map +1 -0
  217. package/dist/reorder/list-view.d.ts +5 -0
  218. package/dist/reorder/list-view.d.ts.map +1 -0
  219. package/dist/reorder/list-view.js +238 -0
  220. package/dist/reorder/list-view.js.map +1 -0
  221. package/dist/reorder/model.d.ts +6 -0
  222. package/dist/reorder/model.d.ts.map +1 -0
  223. package/dist/reorder/model.js +30 -0
  224. package/dist/reorder/model.js.map +1 -0
  225. package/dist/reorder/surface.d.ts +6 -0
  226. package/dist/reorder/surface.d.ts.map +1 -0
  227. package/dist/reorder/surface.js +10 -0
  228. package/dist/reorder/surface.js.map +1 -0
  229. package/dist/reorder/types.d.ts +92 -0
  230. package/dist/reorder/types.d.ts.map +1 -0
  231. package/dist/reorder/types.js +2 -0
  232. package/dist/reorder/types.js.map +1 -0
  233. package/dist/sampling.d.ts +35 -0
  234. package/dist/sampling.d.ts.map +1 -0
  235. package/dist/sampling.js +123 -0
  236. package/dist/sampling.js.map +1 -0
  237. package/dist/scene-appearance.d.ts +14 -0
  238. package/dist/scene-appearance.d.ts.map +1 -0
  239. package/dist/scene-appearance.js +68 -0
  240. package/dist/scene-appearance.js.map +1 -0
  241. package/dist/scene-camera.d.ts +5 -0
  242. package/dist/scene-camera.d.ts.map +1 -0
  243. package/dist/scene-camera.js +23 -0
  244. package/dist/scene-camera.js.map +1 -0
  245. package/dist/scene-shader.d.ts +18 -0
  246. package/dist/scene-shader.d.ts.map +1 -0
  247. package/dist/scene-shader.js +76 -0
  248. package/dist/scene-shader.js.map +1 -0
  249. package/dist/scroll-header/geometry.d.ts +18 -0
  250. package/dist/scroll-header/geometry.d.ts.map +1 -0
  251. package/dist/scroll-header/geometry.js +46 -0
  252. package/dist/scroll-header/geometry.js.map +1 -0
  253. package/dist/scroll-header/index.d.ts +48 -0
  254. package/dist/scroll-header/index.d.ts.map +1 -0
  255. package/dist/scroll-header/index.js +399 -0
  256. package/dist/scroll-header/index.js.map +1 -0
  257. package/dist/scroll-header/native.d.ts +28 -0
  258. package/dist/scroll-header/native.d.ts.map +1 -0
  259. package/dist/scroll-header/native.js +43 -0
  260. package/dist/scroll-header/native.js.map +1 -0
  261. package/dist/sensors/index.d.ts +69 -0
  262. package/dist/sensors/index.d.ts.map +1 -0
  263. package/dist/sensors/index.js +149 -0
  264. package/dist/sensors/index.js.map +1 -0
  265. package/dist/sensors/native.d.ts +20 -0
  266. package/dist/sensors/native.d.ts.map +1 -0
  267. package/dist/sensors/native.js +48 -0
  268. package/dist/sensors/native.js.map +1 -0
  269. package/dist/sequence.d.ts +24 -0
  270. package/dist/sequence.d.ts.map +1 -1
  271. package/dist/sequence.js +181 -19
  272. package/dist/sequence.js.map +1 -1
  273. package/dist/shapes/android.d.ts +3 -0
  274. package/dist/shapes/android.d.ts.map +1 -0
  275. package/dist/shapes/android.js +51 -0
  276. package/dist/shapes/android.js.map +1 -0
  277. package/dist/shapes/index.d.ts +6 -0
  278. package/dist/shapes/index.d.ts.map +1 -0
  279. package/dist/shapes/index.js +238 -0
  280. package/dist/shapes/index.js.map +1 -0
  281. package/dist/shapes/ios.d.ts +3 -0
  282. package/dist/shapes/ios.d.ts.map +1 -0
  283. package/dist/shapes/ios.js +164 -0
  284. package/dist/shapes/ios.js.map +1 -0
  285. package/dist/shapes/native.d.ts +18 -0
  286. package/dist/shapes/native.d.ts.map +1 -0
  287. package/dist/shapes/native.js +10 -0
  288. package/dist/shapes/native.js.map +1 -0
  289. package/dist/shapes/path.d.ts +10 -0
  290. package/dist/shapes/path.d.ts.map +1 -0
  291. package/dist/shapes/path.js +106 -0
  292. package/dist/shapes/path.js.map +1 -0
  293. package/dist/shapes/types.d.ts +55 -0
  294. package/dist/shapes/types.d.ts.map +1 -0
  295. package/dist/shapes/types.js +11 -0
  296. package/dist/shapes/types.js.map +1 -0
  297. package/dist/shared-layout/index.d.ts +40 -0
  298. package/dist/shared-layout/index.d.ts.map +1 -0
  299. package/dist/shared-layout/index.js +267 -0
  300. package/dist/shared-layout/index.js.map +1 -0
  301. package/dist/shared-layout/native.d.ts +15 -0
  302. package/dist/shared-layout/native.d.ts.map +1 -0
  303. package/dist/shared-layout/native.js +79 -0
  304. package/dist/shared-layout/native.js.map +1 -0
  305. package/dist/shared-layout/timing.d.ts +9 -0
  306. package/dist/shared-layout/timing.d.ts.map +1 -0
  307. package/dist/shared-layout/timing.js +68 -0
  308. package/dist/shared-layout/timing.js.map +1 -0
  309. package/dist/shared-navigation/entry.d.ts +51 -0
  310. package/dist/shared-navigation/entry.d.ts.map +1 -0
  311. package/dist/shared-navigation/entry.js +619 -0
  312. package/dist/shared-navigation/entry.js.map +1 -0
  313. package/dist/shared-navigation/index.d.ts +58 -0
  314. package/dist/shared-navigation/index.d.ts.map +1 -0
  315. package/dist/shared-navigation/index.js +318 -0
  316. package/dist/shared-navigation/index.js.map +1 -0
  317. package/dist/shared-navigation/return-signal.d.ts +16 -0
  318. package/dist/shared-navigation/return-signal.d.ts.map +1 -0
  319. package/dist/shared-navigation/return-signal.js +35 -0
  320. package/dist/shared-navigation/return-signal.js.map +1 -0
  321. package/dist/shared-navigation/return-target.d.ts +32 -0
  322. package/dist/shared-navigation/return-target.d.ts.map +1 -0
  323. package/dist/shared-navigation/return-target.js +168 -0
  324. package/dist/shared-navigation/return-target.js.map +1 -0
  325. package/dist/shared-navigation/scope.d.ts +4 -0
  326. package/dist/shared-navigation/scope.d.ts.map +1 -0
  327. package/dist/shared-navigation/scope.js +2 -0
  328. package/dist/shared-navigation/scope.js.map +1 -0
  329. package/dist/shared-navigation/targets.d.ts +6 -0
  330. package/dist/shared-navigation/targets.d.ts.map +1 -0
  331. package/dist/shared-navigation/targets.js +36 -0
  332. package/dist/shared-navigation/targets.js.map +1 -0
  333. package/dist/size-layout.d.ts +19 -0
  334. package/dist/size-layout.d.ts.map +1 -0
  335. package/dist/size-layout.js +216 -0
  336. package/dist/size-layout.js.map +1 -0
  337. package/dist/size.d.ts +19 -0
  338. package/dist/size.d.ts.map +1 -0
  339. package/dist/size.js +251 -0
  340. package/dist/size.js.map +1 -0
  341. package/dist/spring.d.ts +2 -0
  342. package/dist/spring.d.ts.map +1 -1
  343. package/dist/spring.js +11 -0
  344. package/dist/spring.js.map +1 -1
  345. package/dist/svg-path.d.ts +18 -0
  346. package/dist/svg-path.d.ts.map +1 -1
  347. package/dist/svg-path.js +3 -2
  348. package/dist/svg-path.js.map +1 -1
  349. package/dist/testing/clock.d.ts +40 -0
  350. package/dist/testing/clock.d.ts.map +1 -0
  351. package/dist/testing/clock.js +116 -0
  352. package/dist/testing/clock.js.map +1 -0
  353. package/dist/testing/handoff-recorder.d.ts +8 -0
  354. package/dist/testing/handoff-recorder.d.ts.map +1 -0
  355. package/dist/testing/handoff-recorder.js +77 -0
  356. package/dist/testing/handoff-recorder.js.map +1 -0
  357. package/dist/testing/index.d.ts +5 -0
  358. package/dist/testing/index.d.ts.map +1 -0
  359. package/dist/testing/index.js +5 -0
  360. package/dist/testing/index.js.map +1 -0
  361. package/dist/testing/native.d.ts +46 -0
  362. package/dist/testing/native.d.ts.map +1 -0
  363. package/dist/testing/native.js +313 -0
  364. package/dist/testing/native.js.map +1 -0
  365. package/dist/testing/presentation.d.ts +11 -0
  366. package/dist/testing/presentation.d.ts.map +1 -0
  367. package/dist/testing/presentation.js +45 -0
  368. package/dist/testing/presentation.js.map +1 -0
  369. package/dist/testing/replay.d.ts +39 -0
  370. package/dist/testing/replay.d.ts.map +1 -0
  371. package/dist/testing/replay.js +99 -0
  372. package/dist/testing/replay.js.map +1 -0
  373. package/dist/testing/scroll-handoff-native.d.ts +10 -0
  374. package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
  375. package/dist/testing/scroll-handoff-native.js +151 -0
  376. package/dist/testing/scroll-handoff-native.js.map +1 -0
  377. package/dist/testing/scroll-handoff.d.ts +25 -0
  378. package/dist/testing/scroll-handoff.d.ts.map +1 -0
  379. package/dist/testing/scroll-handoff.js +127 -0
  380. package/dist/testing/scroll-handoff.js.map +1 -0
  381. package/dist/testing/sensors.d.ts +13 -0
  382. package/dist/testing/sensors.d.ts.map +1 -0
  383. package/dist/testing/sensors.js +26 -0
  384. package/dist/testing/sensors.js.map +1 -0
  385. package/dist/testing/trace.d.ts +101 -0
  386. package/dist/testing/trace.d.ts.map +1 -0
  387. package/dist/testing/trace.js +263 -0
  388. package/dist/testing/trace.js.map +1 -0
  389. package/dist/timed-animation.d.ts +38 -0
  390. package/dist/timed-animation.d.ts.map +1 -0
  391. package/dist/timed-animation.js +177 -0
  392. package/dist/timed-animation.js.map +1 -0
  393. package/dist/track.d.ts +3 -0
  394. package/dist/track.d.ts.map +1 -1
  395. package/dist/track.js +281 -40
  396. package/dist/track.js.map +1 -1
  397. package/dist/transition.d.ts +54 -2
  398. package/dist/transition.d.ts.map +1 -1
  399. package/dist/transition.js +128 -8
  400. package/dist/transition.js.map +1 -1
  401. package/dist/types.d.ts +10 -1
  402. package/dist/types.d.ts.map +1 -1
  403. package/dist/value-observers.d.ts +22 -0
  404. package/dist/value-observers.d.ts.map +1 -0
  405. package/dist/value-observers.js +122 -0
  406. package/dist/value-observers.js.map +1 -0
  407. package/dist/value-track.d.ts +13 -0
  408. package/dist/value-track.d.ts.map +1 -0
  409. package/dist/value-track.js +59 -0
  410. package/dist/value-track.js.map +1 -0
  411. package/dist/vue/index.d.ts +33 -3
  412. package/dist/vue/index.d.ts.map +1 -1
  413. package/dist/vue/index.js +118 -3
  414. package/dist/vue/index.js.map +1 -1
  415. package/dist/zoomable.d.ts +1 -1
  416. package/dist/zoomable.d.ts.map +1 -1
  417. package/package.json +68 -3
  418. package/platforms/android/include.gradle +10 -0
  419. package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
  420. package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +158 -0
  421. package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +221 -0
  422. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
  423. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
  424. package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
  425. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
  426. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
  427. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
  428. package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
  429. package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
  430. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
  431. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
  432. package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
  433. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
  434. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
  435. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
  436. package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
  437. package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
  438. package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
  439. package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
  440. package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
  441. package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
  442. package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
  443. package/platforms/android/proguard-rules.pro +20 -0
  444. package/platforms/ios/build.xcconfig +1 -1
  445. package/platforms/ios/src/JoltBlur.h +14 -0
  446. package/platforms/ios/src/JoltBlur.m +86 -0
  447. package/platforms/ios/src/JoltCircleMath.h +191 -0
  448. package/platforms/ios/src/JoltCircleWorld.h +18 -0
  449. package/platforms/ios/src/JoltCircleWorld.m +218 -0
  450. package/platforms/ios/src/JoltGestureSession.h +23 -0
  451. package/platforms/ios/src/JoltGestureSession.m +251 -0
  452. package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
  453. package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
  454. package/platforms/ios/src/JoltLiveSpring.h +29 -0
  455. package/platforms/ios/src/JoltLiveSpring.m +243 -0
  456. package/platforms/ios/src/JoltMotionProbe.h +9 -0
  457. package/platforms/ios/src/JoltMotionProbe.m +72 -0
  458. package/platforms/ios/src/JoltReorderSession.h +15 -0
  459. package/platforms/ios/src/JoltReorderSession.m +205 -0
  460. package/platforms/ios/src/JoltScrollHeader.h +13 -0
  461. package/platforms/ios/src/JoltScrollHeader.m +101 -0
  462. package/platforms/ios/src/JoltSensorMath.h +39 -0
  463. package/platforms/ios/src/JoltSensorSource.h +13 -0
  464. package/platforms/ios/src/JoltSensorSource.m +201 -0
  465. package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
  466. package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
  467. package/platforms/ios/src/JoltSpringState.h +35 -0
  468. package/platforms/ios/src/module.modulemap +10 -0
  469. package/src/android-plugin.d.ts +464 -0
  470. package/src/animate.ts +129 -15
  471. package/src/blur/index.ts +195 -0
  472. package/src/blur/native.ts +70 -0
  473. package/src/blur/types.ts +32 -0
  474. package/src/bottom-sheet/geometry.ts +84 -0
  475. package/src/bottom-sheet/index.ts +536 -0
  476. package/src/bottom-sheet/native.ts +214 -0
  477. package/src/config.ts +39 -1
  478. package/src/decay.ts +9 -0
  479. package/src/drag.ts +67 -21
  480. package/src/driver/android-gradient.ts +116 -0
  481. package/src/driver/android-particles.ts +118 -0
  482. package/src/driver/android.ts +31 -1
  483. package/src/driver/frame.ts +10 -0
  484. package/src/driver/index.ts +4 -0
  485. package/src/driver/ios-gradient.ts +136 -0
  486. package/src/driver/ios-scroll-delegate.ts +23 -0
  487. package/src/driver/ios.ts +10 -0
  488. package/src/easing.ts +21 -1
  489. package/src/engine.ts +209 -60
  490. package/src/gesture-native.ts +139 -0
  491. package/src/gestures/index.ts +365 -0
  492. package/src/glass/index.ts +218 -0
  493. package/src/gradient-binding.ts +158 -0
  494. package/src/gradient.ts +663 -0
  495. package/src/gravity.ts +107 -0
  496. package/src/haptics.ts +106 -28
  497. package/src/image-effect.ts +10 -2
  498. package/src/index.ts +56 -7
  499. package/src/inspector/index.ts +523 -0
  500. package/src/inspector/plot.ts +27 -0
  501. package/src/inspector/probe.ts +50 -0
  502. package/src/inspector/tuning.ts +51 -0
  503. package/src/interactive-navigation/index.ts +427 -0
  504. package/src/ios-plugin.d.ts +280 -0
  505. package/src/keyboard.ts +231 -7
  506. package/src/live-spring-driver.ts +181 -0
  507. package/src/mixer.ts +312 -0
  508. package/src/motion-scope.ts +39 -6
  509. package/src/motion-states.ts +149 -42
  510. package/src/motion-value.ts +1289 -0
  511. package/src/native/index.ts +30 -0
  512. package/src/native-properties.ts +188 -0
  513. package/src/native-property-driver.ts +123 -0
  514. package/src/native-property.ts +366 -0
  515. package/src/particles.ts +18 -17
  516. package/src/path.ts +2 -1
  517. package/src/physics/index.ts +476 -0
  518. package/src/physics/native.ts +121 -0
  519. package/src/playback-group.ts +17 -1
  520. package/src/playback.ts +41 -0
  521. package/src/predictive-back/index.ts +280 -0
  522. package/src/predictive-back/presentation.ts +6 -0
  523. package/src/press.ts +10 -2
  524. package/src/reorder/handle.ts +9 -0
  525. package/src/reorder/index.ts +243 -0
  526. package/src/reorder/list-view.ts +262 -0
  527. package/src/reorder/model.ts +47 -0
  528. package/src/reorder/surface.ts +10 -0
  529. package/src/reorder/types.ts +87 -0
  530. package/src/sampling.ts +173 -0
  531. package/src/scene-appearance.ts +92 -0
  532. package/src/scene-camera.ts +30 -0
  533. package/src/scene-shader.ts +139 -0
  534. package/src/scroll-header/geometry.ts +88 -0
  535. package/src/scroll-header/index.ts +530 -0
  536. package/src/scroll-header/native.ts +89 -0
  537. package/src/sensors/index.ts +246 -0
  538. package/src/sensors/native.ts +72 -0
  539. package/src/sequence.ts +209 -20
  540. package/src/shapes/android.ts +63 -0
  541. package/src/shapes/index.ts +267 -0
  542. package/src/shapes/ios.ts +194 -0
  543. package/src/shapes/native.ts +27 -0
  544. package/src/shapes/path.ts +127 -0
  545. package/src/shapes/types.ts +63 -0
  546. package/src/shared-layout/index.ts +343 -0
  547. package/src/shared-layout/native.ts +138 -0
  548. package/src/shared-layout/timing.ts +87 -0
  549. package/src/shared-navigation/entry.ts +695 -0
  550. package/src/shared-navigation/index.ts +414 -0
  551. package/src/shared-navigation/return-signal.ts +41 -0
  552. package/src/shared-navigation/return-target.ts +197 -0
  553. package/src/shared-navigation/scope.ts +3 -0
  554. package/src/shared-navigation/targets.ts +38 -0
  555. package/src/size-layout.ts +237 -0
  556. package/src/size.ts +302 -0
  557. package/src/spring.ts +18 -0
  558. package/src/svg-path.ts +8 -3
  559. package/src/testing/clock.ts +128 -0
  560. package/src/testing/handoff-recorder.ts +98 -0
  561. package/src/testing/index.ts +4 -0
  562. package/src/testing/native.ts +386 -0
  563. package/src/testing/presentation.ts +46 -0
  564. package/src/testing/replay.ts +149 -0
  565. package/src/testing/scroll-handoff-native.ts +201 -0
  566. package/src/testing/scroll-handoff.ts +140 -0
  567. package/src/testing/sensors.ts +41 -0
  568. package/src/testing/trace.ts +340 -0
  569. package/src/timed-animation.ts +192 -0
  570. package/src/track.ts +334 -38
  571. package/src/transition.ts +197 -9
  572. package/src/types.ts +11 -1
  573. package/src/value-observers.ts +147 -0
  574. package/src/value-track.ts +71 -0
  575. package/src/vue/index.ts +147 -1
  576. package/src/zoomable.ts +1 -1
@@ -0,0 +1,695 @@
1
+ import {
2
+ Application,
3
+ Image,
4
+ isIOS,
5
+ isAndroid,
6
+ Trace,
7
+ type Frame,
8
+ type NavigationTransition,
9
+ type Page,
10
+ type View,
11
+ } from '@nativescript/core'
12
+ import { onReducedMotion, reducedMotion } from '../config.js'
13
+ import {
14
+ interactiveNavigation,
15
+ type InteractiveNavigation,
16
+ } from '../interactive-navigation/index.js'
17
+ import { predictiveBack, type PredictiveBack } from '../predictive-back/index.js'
18
+ import { nativeBackSessions } from '../predictive-back/presentation.js'
19
+ import { springs, type Spring } from '../transition.js'
20
+ import { timing } from '../shared-layout/timing.js'
21
+ import { find, radius, supportedImage } from './targets.js'
22
+ import { validateReturnTarget, type SharedReturnTarget } from './return-target.js'
23
+ import { navigationScopes } from './scope.js'
24
+ import {
25
+ sharedNavigation,
26
+ type SharedNavigationAnimation,
27
+ type SharedNavigationResult,
28
+ } from './index.js'
29
+
30
+ export interface SharedNavigationRouteOptions {
31
+ animated?: boolean
32
+ transition?: NavigationTransition
33
+ }
34
+ export interface SharedNavigationEntryEvent {
35
+ state:
36
+ | 'ready'
37
+ | 'opening'
38
+ | 'idle'
39
+ | 'tracking'
40
+ | 'finishing'
41
+ | 'cancelling'
42
+ | 'committing'
43
+ | 'disposed'
44
+ shared?: { status: 'ready' | 'unavailable'; reason?: string }
45
+ outcome?: 'completed' | 'cancelled'
46
+ release?: Readonly<{ progress: number; velocity: number }>
47
+ }
48
+ export interface SharedNavigationEntryOptions {
49
+ tag: string
50
+ returnTarget?: SharedReturnTarget
51
+ /** Gate iOS edge start and Android back commitment when another interaction owns the image. */
52
+ canBegin?: () => boolean
53
+ /** Route owner. Map a rejected router navigation to false. Called once per committed back. */
54
+ back(options: SharedNavigationRouteOptions): boolean | void | Promise<boolean | void>
55
+ spring?:
56
+ | keyof typeof springs
57
+ | Pick<Spring, 'duration' | 'bounce' | 'stiffness' | 'damping' | 'mass'>
58
+ maxSnapshotPixels?: number
59
+ navigationTimeout?: number
60
+ onState?: (event: SharedNavigationEntryEvent) => void
61
+ }
62
+ export interface SharedNavigationEntry {
63
+ readonly state: SharedNavigationEntryEvent['state']
64
+ /** A single push. Repeated calls reject without invoking their route. */
65
+ open(
66
+ navigate: (options: SharedNavigationRouteOptions) => unknown,
67
+ ): Promise<SharedNavigationResult>
68
+ /** A request during entry is serialized until entry completes. Repeated requests coalesce. */
69
+ back(): void
70
+ /** Return from a held image pose. Capture precedes routing; rejection leaves the entry usable. */
71
+ returnToSource(options?: {
72
+ velocity?: Readonly<{ x: number; y: number }>
73
+ }): Promise<SharedNavigationResult>
74
+ cancel(): void
75
+ dispose(): void
76
+ }
77
+
78
+ /** One stable image/card entry. Routes stay with Frame/router; native back owns shared presentation. */
79
+ export function sharedNavigationEntry(
80
+ frame: Frame,
81
+ options: SharedNavigationEntryOptions,
82
+ ): SharedNavigationEntry {
83
+ if (!options || typeof options.tag !== 'string' || !options.tag.trim())
84
+ throw new TypeError('A nonempty sharedTransitionTag is required.')
85
+ validateReturnTarget(options.returnTarget)
86
+ if (options.canBegin !== undefined && typeof options.canBegin !== 'function')
87
+ throw new TypeError('canBegin must be a function.')
88
+ if (typeof options.back !== 'function')
89
+ throw new TypeError('A back callback is required.')
90
+ const input =
91
+ typeof options.spring === 'string'
92
+ ? Object.hasOwn(springs, options.spring)
93
+ ? springs[options.spring]
94
+ : undefined
95
+ : options.spring
96
+ if (options.spring !== undefined && !input)
97
+ throw new TypeError('Unknown shared navigation spring.')
98
+ if (input !== undefined && (typeof input !== 'object' || Array.isArray(input)))
99
+ throw new TypeError('spring must be a named spring or a physics object.')
100
+ if (input && 'type' in input && input.type !== 'spring')
101
+ throw new TypeError('Interactive shared navigation requires a spring.')
102
+ for (const key of Object.keys(input ?? {}))
103
+ if (!['type', 'duration', 'bounce', 'stiffness', 'damping', 'mass'].includes(key))
104
+ throw new TypeError(`Unsupported spring option: ${key}.`)
105
+ const transition = timing({ ...(input ?? springs.smooth), type: 'spring' })
106
+ const budget = options.maxSnapshotPixels ?? 8_000_000,
107
+ timeout = options.navigationTimeout ?? 5000
108
+ if (!Number.isSafeInteger(budget) || budget <= 0 || budget > 32_000_000)
109
+ throw new RangeError('maxSnapshotPixels must be a positive integer at most 32000000.')
110
+ if (!Number.isFinite(timeout) || timeout <= 0 || timeout > 10_000)
111
+ throw new RangeError('navigationTimeout must be positive and at most 10000 ms.')
112
+ if (!frame.isLoaded || !frame.currentPage)
113
+ throw new Error('Create sharedNavigationEntry after the Frame is loaded.')
114
+ const sourcePage = frame.currentPage
115
+ let originalSource: View | undefined, originalStamp: string | undefined
116
+ let page: Page | undefined,
117
+ state: SharedNavigationEntry['state'] = 'ready'
118
+ let shared: SharedNavigationEntryEvent['shared']
119
+ let ios: InteractiveNavigation | undefined, android: PredictiveBack | undefined
120
+ let scene: org.rafaelaugusto.jolt.SharedNavigationScene | undefined
121
+ let flight: SharedNavigationAnimation | undefined
122
+ let forwardOwner: ReturnType<typeof sharedNavigation> | undefined,
123
+ ownedForward = false
124
+ let opening = false,
125
+ queuedBack = false,
126
+ used = false,
127
+ backInFlight = false
128
+ let handingOff = false
129
+ let timer: ReturnType<typeof setTimeout> | undefined,
130
+ reload: ReturnType<typeof setTimeout> | undefined
131
+ let finishOpen: ((result: SharedNavigationResult) => void) | undefined
132
+ const emit = (
133
+ next: SharedNavigationEntry['state'],
134
+ extra: Partial<SharedNavigationEntryEvent> = {},
135
+ ) => {
136
+ if (state === 'disposed') return
137
+ state = next
138
+ try {
139
+ options.onState?.({ state, ...(shared ? { shared } : {}), ...extra })
140
+ } catch (error) {
141
+ Trace.write(
142
+ `Shared navigation observer failed: ${String(error)}`,
143
+ 'Jolt',
144
+ Trace.messageType.error,
145
+ )
146
+ }
147
+ }
148
+ const unavailable = (reason: string) => {
149
+ shared = { status: 'unavailable', reason }
150
+ }
151
+ function completeOpen(result: SharedNavigationResult) {
152
+ if (!opening || state === 'disposed') return
153
+ opening = false
154
+ if (timer !== undefined) clearTimeout(timer)
155
+ timer = undefined
156
+ if (ownedForward) forwardOwner?.dispose()
157
+ forwardOwner = undefined
158
+ flight = undefined
159
+ const resolve = finishOpen
160
+ finishOpen = undefined
161
+ if (result.navigated) {
162
+ page = frame.currentPage
163
+ page.on('loaded', scheduleBind)
164
+ bindAndroid()
165
+ emit('idle')
166
+ resolve?.(result)
167
+ if (queuedBack) {
168
+ queuedBack = false
169
+ control.back()
170
+ }
171
+ } else {
172
+ resolve?.(result)
173
+ control.dispose()
174
+ }
175
+ }
176
+ function scheduleBind() {
177
+ if (reload !== undefined) clearTimeout(reload)
178
+ reload = setTimeout(bindAndroid, 0)
179
+ }
180
+ function bindAndroid() {
181
+ if (
182
+ !isAndroid ||
183
+ opening ||
184
+ state === 'disposed' ||
185
+ !page?.isLoaded ||
186
+ frame.currentPage !== page ||
187
+ (android?.supported && android.state !== 'disposed')
188
+ )
189
+ return
190
+ android?.dispose()
191
+ const targets = find(page, options.tag),
192
+ target = targets[0]
193
+ const sources = find(sourcePage, options.tag),
194
+ source = sources[0]
195
+ if (targets.length !== 1)
196
+ unavailable(targets.length ? 'duplicate-target' : 'missing-target')
197
+ else if (sources.length !== 1)
198
+ unavailable(sources.length ? 'duplicate-source' : 'missing-source')
199
+ else if (
200
+ source instanceof Image &&
201
+ (!supportedImage(target!) ||
202
+ (source.src !== target!.src && source.imageSource !== target!.imageSource))
203
+ )
204
+ unavailable('unsupported-image')
205
+ else if (source && source instanceof Image !== target instanceof Image)
206
+ unavailable('content-mismatch')
207
+ else if (scene && target) {
208
+ scene.bind(target.nativeViewProtected, radius(target))
209
+ shared = { status: 'ready' }
210
+ }
211
+ if (shared?.status === 'unavailable' && scene) {
212
+ scene.dispose()
213
+ scene = undefined
214
+ }
215
+ android = predictiveBack(
216
+ page,
217
+ options.returnTarget ? { scale: [1, 0.96], y: [0, 24] } : { opacity: [1, 1] },
218
+ {
219
+ spring: options.spring,
220
+ commitTimeout: timeout,
221
+ commit: async (opts) => {
222
+ if (frame.currentPage !== page || backInFlight) return false
223
+ if (options.canBegin && !options.canBegin()) return false
224
+ backInFlight = true
225
+ try {
226
+ return options.returnTarget
227
+ ? (await resolvedBack()).navigated
228
+ : await options.back(opts)
229
+ } finally {
230
+ backInFlight = false
231
+ }
232
+ },
233
+ onState(event) {
234
+ if (state === 'disposed') return
235
+ if (handingOff) return
236
+ if ((event.state === 'tracking' || event.state === 'finishing') && scene) {
237
+ const current = find(sourcePage, options.tag)
238
+ if (
239
+ current.length !== 1 ||
240
+ current[0] !== originalSource ||
241
+ sourceStamp(current[0]!, sourcePage) !== originalStamp
242
+ ) {
243
+ scene.dispose()
244
+ scene = undefined
245
+ unavailable('source-invalidated')
246
+ }
247
+ }
248
+ if (event.state === 'tracking' || event.state === 'finishing') {
249
+ if (reducedMotion()) unavailable('reduced-motion')
250
+ else if (scene)
251
+ shared = scene.isAnimating()
252
+ ? { status: 'ready' }
253
+ : { status: 'unavailable', reason: scene.getFailureReason() }
254
+ }
255
+ if (event.state === 'disposed') {
256
+ android = undefined
257
+ return
258
+ }
259
+ emit(
260
+ event.state,
261
+ event.outcome
262
+ ? {
263
+ outcome: event.outcome,
264
+ ...(event.release ? { release: event.release } : {}),
265
+ }
266
+ : event.release
267
+ ? { release: event.release }
268
+ : {},
269
+ )
270
+ if (event.outcome === 'completed') control.dispose()
271
+ },
272
+ },
273
+ )
274
+ if (scene) nativeBackSessions.get(android)?.setSharedScene(scene)
275
+ if (!android.supported) unavailable('unsupported-platform')
276
+ }
277
+ async function resolvedBack(handoff?: {
278
+ velocity?: Readonly<{ x: number; y: number }>
279
+ }): Promise<SharedNavigationResult> {
280
+ const existing = navigationScopes.get(frame)
281
+ const owner =
282
+ existing ??
283
+ sharedNavigation(frame, {
284
+ transition,
285
+ navigationTimeout: timeout,
286
+ maxSnapshotPixels: budget,
287
+ })
288
+ const owned = !existing
289
+ // Preserve a caller-owned Frame controller; only release the controller created here.
290
+ try {
291
+ const operation = owner.navigate({
292
+ ...(handoff ? { allowClippedSource: true, velocity: handoff.velocity } : {}),
293
+ tag: options.tag,
294
+ returnTarget: options.returnTarget,
295
+ holdSource: true,
296
+ transition,
297
+ navigate: (opts) => options.back(opts),
298
+ })
299
+ flight = operation
300
+ const result = await operation.finished
301
+ if (result.status === 'completed') shared = { status: 'ready' }
302
+ else unavailable(result.reason ?? 'return-unavailable')
303
+ return result
304
+ } finally {
305
+ flight = undefined
306
+ if (owned) owner.dispose()
307
+ }
308
+ }
309
+
310
+ function arrived() {
311
+ if (opening && isIOS && ios && !ios.supported && frame.currentPage !== sourcePage) {
312
+ completeOpen({
313
+ status: 'unavailable',
314
+ reason: 'unsupported-platform',
315
+ navigated: true,
316
+ })
317
+ return
318
+ }
319
+ if (opening || !page || backInFlight || state === 'disposed') return
320
+ if (frame.currentPage === page) scheduleBind()
321
+ else if (!frame.backStack.some((entry) => entry.resolvedPage === page))
322
+ void Promise.resolve().then(() => {
323
+ if (
324
+ state !== 'disposed' &&
325
+ !backInFlight &&
326
+ !opening &&
327
+ ios?.state !== 'animating' &&
328
+ ios?.state !== 'finishing' &&
329
+ ios?.state !== 'dragging'
330
+ )
331
+ control.dispose()
332
+ })
333
+ }
334
+ const suspend = () => control.dispose()
335
+ const control: SharedNavigationEntry = {
336
+ get state() {
337
+ return state
338
+ },
339
+ open(navigate) {
340
+ if (typeof navigate !== 'function')
341
+ throw new TypeError('A navigation callback is required.')
342
+ if (used || state !== 'ready')
343
+ return Promise.resolve({
344
+ status: 'unavailable',
345
+ reason: state === 'disposed' ? 'disposed' : 'busy',
346
+ navigated: false,
347
+ })
348
+ if (frame.currentPage !== sourcePage)
349
+ return Promise.resolve({
350
+ status: 'unavailable',
351
+ reason: 'source-changed',
352
+ navigated: false,
353
+ })
354
+ const sources = find(sourcePage, options.tag, true)
355
+ originalSource = sources.length === 1 ? sources[0] : undefined
356
+ originalStamp = originalSource ? sourceStamp(originalSource, sourcePage) : undefined
357
+ used = true
358
+ opening = true
359
+ const promise = new Promise<SharedNavigationResult>((resolve) => {
360
+ finishOpen = resolve
361
+ })
362
+ emit('opening')
363
+ if (control.state === 'disposed') return promise
364
+ timer = setTimeout(() => {
365
+ completeOpen({
366
+ status: 'unavailable',
367
+ reason: 'navigation-timeout',
368
+ navigated: frame.currentPage !== sourcePage,
369
+ })
370
+ control.dispose()
371
+ }, timeout)
372
+ try {
373
+ if (isIOS) {
374
+ ios = interactiveNavigation(frame, {
375
+ spring: options.spring,
376
+ shared: {
377
+ tag: options.tag,
378
+ maxSnapshotPixels: budget,
379
+ ...(options.returnTarget ? { returnTarget: options.returnTarget } : {}),
380
+ },
381
+ canBegin: () => !backInFlight && (options.canBegin?.() ?? true),
382
+ onState(event) {
383
+ if (state === 'disposed') return
384
+ if (handingOff) return
385
+ if (event.shared) shared = event.shared
386
+ if (event.state === 'idle') {
387
+ if (opening)
388
+ completeOpen({
389
+ status: shared?.status === 'ready' ? 'completed' : 'unavailable',
390
+ navigated: frame.currentPage !== sourcePage,
391
+ ...(shared?.reason ? { reason: shared.reason } : {}),
392
+ })
393
+ else {
394
+ backInFlight = false
395
+ if (timer !== undefined) clearTimeout(timer)
396
+ timer = undefined
397
+ const completed = frame.currentPage !== page
398
+ emit('idle', { outcome: completed ? 'completed' : 'cancelled' })
399
+ if (completed) control.dispose()
400
+ }
401
+ } else if (event.state === 'disposed') {
402
+ if (!opening && frame.currentPage !== page) control.dispose()
403
+ } else
404
+ emit(
405
+ event.state === 'animating'
406
+ ? opening
407
+ ? 'opening'
408
+ : 'finishing'
409
+ : event.state === 'dragging'
410
+ ? 'tracking'
411
+ : event.state,
412
+ { ...(event.release ? { release: event.release } : {}) },
413
+ )
414
+ },
415
+ })
416
+ const result = navigate(
417
+ ios.supported ? { transition: ios.transition } : { animated: false },
418
+ )
419
+ if (result && typeof (result as PromiseLike<unknown>).then === 'function')
420
+ Promise.resolve(result).then(
421
+ () => {
422
+ if (opening && (ios?.state === 'ready' || !ios?.supported))
423
+ completeOpen({
424
+ status: 'unavailable',
425
+ reason:
426
+ frame.currentPage === sourcePage
427
+ ? 'route-unchanged'
428
+ : 'unsupported-platform',
429
+ navigated: frame.currentPage !== sourcePage,
430
+ })
431
+ },
432
+ (error) => {
433
+ completeOpen({
434
+ status: 'failed',
435
+ reason: 'navigation-failed',
436
+ navigated: frame.currentPage !== sourcePage,
437
+ error,
438
+ })
439
+ control.dispose()
440
+ },
441
+ )
442
+ } else {
443
+ const matches = find(sourcePage, options.tag, true),
444
+ source = matches[0]
445
+ if (reducedMotion()) unavailable('reduced-motion')
446
+ else if (matches.length !== 1)
447
+ unavailable(matches.length ? 'duplicate-source' : 'missing-source')
448
+ else if (source instanceof Image && !supportedImage(source))
449
+ unavailable('unsupported-image')
450
+ else if (options.returnTarget) unavailable('target-resolved-on-return')
451
+ else if (isAndroid && androidVersionSupported()) {
452
+ try {
453
+ scene =
454
+ org.rafaelaugusto.jolt.SharedNavigationScene.capture(
455
+ source!.nativeViewProtected,
456
+ sourcePage.nativeViewProtected,
457
+ source instanceof Image,
458
+ radius(source!),
459
+ budget,
460
+ ) ?? undefined
461
+ } catch {
462
+ unavailable('unsupported-source')
463
+ }
464
+ if (!scene) unavailable('unsupported-source')
465
+ } else unavailable('unsupported-platform')
466
+ forwardOwner = navigationScopes.get(frame)
467
+ ownedForward = !forwardOwner
468
+ forwardOwner ??= sharedNavigation(frame, {
469
+ transition,
470
+ navigationTimeout: timeout,
471
+ maxSnapshotPixels: budget,
472
+ layoutTimeout: 1500,
473
+ })
474
+ flight = forwardOwner.navigate({
475
+ tag: options.tag,
476
+ navigate,
477
+ transition,
478
+ maxSnapshotPixels: Math.max(1, budget - (scene?.pixels() ?? 0)),
479
+ })
480
+ flight.finished.then((result) => completeOpen(result))
481
+ }
482
+ } catch (error) {
483
+ completeOpen({
484
+ status: 'failed',
485
+ reason: 'navigation-failed',
486
+ navigated: frame.currentPage !== sourcePage,
487
+ error,
488
+ })
489
+ control.dispose()
490
+ }
491
+ return promise
492
+ },
493
+ back() {
494
+ if (state === 'disposed' || state === 'ready' || backInFlight) return
495
+ if (opening) {
496
+ queuedBack = true
497
+ return
498
+ }
499
+ if (state !== 'idle' && state !== 'cancelling') return
500
+ if (android && android.state !== 'disposed') {
501
+ android.back()
502
+ return
503
+ }
504
+ backInFlight = true
505
+ emit('committing')
506
+ if (control.state === 'disposed') return
507
+ timer = setTimeout(() => {
508
+ unavailable('navigation-timeout')
509
+ control.dispose()
510
+ }, timeout)
511
+ Promise.resolve()
512
+ .then(() =>
513
+ state === 'disposed'
514
+ ? false
515
+ : options.returnTarget && !ios?.supported
516
+ ? resolvedBack().then((result) => result.navigated)
517
+ : options.back(isIOS && ios?.supported ? {} : { animated: false }),
518
+ )
519
+ .then(
520
+ (result) => {
521
+ // Core.goBack() returns void before UIKit finishes its transition.
522
+ if (
523
+ result !== false &&
524
+ isIOS &&
525
+ ios?.supported &&
526
+ ['animating', 'finishing', 'cancelling', 'dragging'].includes(ios.state)
527
+ )
528
+ return
529
+ backInFlight = false
530
+ if (timer !== undefined) clearTimeout(timer)
531
+ timer = undefined
532
+ if (state === 'disposed') return
533
+ if (result === false || frame.currentPage === page)
534
+ emit('idle', { outcome: 'cancelled' })
535
+ else {
536
+ emit('idle', { outcome: 'completed' })
537
+ control.dispose()
538
+ }
539
+ },
540
+ () => {
541
+ backInFlight = false
542
+ if (timer !== undefined) clearTimeout(timer)
543
+ timer = undefined
544
+ if (state !== 'disposed') emit('idle', { outcome: 'cancelled' })
545
+ },
546
+ )
547
+ },
548
+ async returnToSource(handoff = {}) {
549
+ if (
550
+ handoff.velocity &&
551
+ (!Number.isFinite(handoff.velocity.x) || !Number.isFinite(handoff.velocity.y))
552
+ )
553
+ throw new RangeError('Navigation velocity must contain finite x and y values.')
554
+ if (state !== 'idle' || backInFlight || opening || frame.currentPage !== page)
555
+ return {
556
+ status: 'unavailable',
557
+ navigated: false,
558
+ reason: state === 'disposed' ? 'disposed' : 'busy',
559
+ }
560
+ backInFlight = true
561
+ handingOff = true
562
+ emit('committing')
563
+ let result: SharedNavigationResult
564
+ try {
565
+ result =
566
+ control.state === 'disposed'
567
+ ? { status: 'cancelled', navigated: false, reason: 'disposed' }
568
+ : await resolvedBack(handoff)
569
+ } catch (error) {
570
+ result = {
571
+ status: 'failed',
572
+ navigated: frame.currentPage !== page,
573
+ reason: 'navigation-failed',
574
+ error,
575
+ }
576
+ } finally {
577
+ handingOff = false
578
+ backInFlight = false
579
+ }
580
+ if (control.state !== 'disposed') {
581
+ emit('idle', { outcome: result.navigated ? 'completed' : 'cancelled' })
582
+ if (result.navigated) control.dispose()
583
+ else scheduleBind()
584
+ }
585
+ return result
586
+ },
587
+ cancel() {
588
+ queuedBack = false
589
+ if (opening) {
590
+ flight?.cancel()
591
+ control.dispose()
592
+ } else {
593
+ flight?.cancel()
594
+ ios?.cancel()
595
+ android?.cancel()
596
+ }
597
+ },
598
+ dispose() {
599
+ if (state === 'disposed') return
600
+ emit('disposed')
601
+ queuedBack = false
602
+ if (timer !== undefined) clearTimeout(timer)
603
+ if (reload !== undefined) clearTimeout(reload)
604
+ finishOpen?.({
605
+ status: 'cancelled',
606
+ reason: 'disposed',
607
+ navigated: frame.currentPage !== sourcePage,
608
+ })
609
+ finishOpen = undefined
610
+ opening = false
611
+ flight?.cancel()
612
+ flight = undefined
613
+ if (ownedForward) forwardOwner?.dispose()
614
+ forwardOwner = undefined
615
+ android?.dispose()
616
+ android = undefined
617
+ scene?.dispose()
618
+ scene = undefined
619
+ ios?.dispose()
620
+ ios = undefined
621
+ frame.off('navigatedTo', arrived)
622
+ frame.off('unloaded', suspend)
623
+ page?.off('loaded', scheduleBind)
624
+ Application.off(Application.suspendEvent, suspend)
625
+ offMotion()
626
+ },
627
+ }
628
+ const offMotion = onReducedMotion((value) => {
629
+ if (value) control.cancel()
630
+ })
631
+ frame.on('navigatedTo', arrived)
632
+ frame.on('unloaded', suspend)
633
+ Application.on(Application.suspendEvent, suspend)
634
+ return control
635
+ }
636
+ function androidVersionSupported() {
637
+ return (
638
+ typeof org !== 'undefined' &&
639
+ !!org.rafaelaugusto?.jolt?.SharedNavigationScene &&
640
+ android.os.Build.VERSION.SDK_INT >= 34
641
+ )
642
+ }
643
+
644
+ // Reject a changed static source before the first visual frame, including layout writes
645
+ // waiting for the covered page to be realized. Dynamic return targets resolve separately.
646
+ function sourceStamp(view: View, page: Page): string {
647
+ const keys = [
648
+ 'width',
649
+ 'height',
650
+ 'minWidth',
651
+ 'minHeight',
652
+ 'marginTop',
653
+ 'marginRight',
654
+ 'marginBottom',
655
+ 'marginLeft',
656
+ 'paddingTop',
657
+ 'paddingRight',
658
+ 'paddingBottom',
659
+ 'paddingLeft',
660
+ 'horizontalAlignment',
661
+ 'verticalAlignment',
662
+ 'translateX',
663
+ 'translateY',
664
+ 'scaleX',
665
+ 'scaleY',
666
+ 'rotate',
667
+ 'opacity',
668
+ 'borderRadius',
669
+ 'backgroundColor',
670
+ 'color',
671
+ 'fontSize',
672
+ 'fontFamily',
673
+ 'fontWeight',
674
+ ]
675
+ const rows: unknown[] = []
676
+ const geometry = (v: View) =>
677
+ keys.map((key) => String((v as unknown as Record<string, unknown>)[key] ?? ''))
678
+ for (let p = view.parent as View | undefined; p; p = p.parent as View | undefined) {
679
+ rows.push(geometry(p))
680
+ if (p === page) break
681
+ }
682
+ function visit(v: View) {
683
+ rows.push([
684
+ geometry(v),
685
+ String((v as unknown as { text?: unknown }).text ?? ''),
686
+ v instanceof Image ? [String(v.src), v.stretch] : [],
687
+ ])
688
+ v.eachChildView((child) => {
689
+ visit(child)
690
+ return true
691
+ })
692
+ }
693
+ visit(view)
694
+ return JSON.stringify(rows)
695
+ }