@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,128 @@
1
+ import type { View } from '@nativescript/core'
2
+ import type { Driver } from '../driver/index.js'
3
+ import type { Property } from '../properties.js'
4
+ import type { Track } from '../track.js'
5
+
6
+ interface Playback {
7
+ view: View
8
+ track: Track
9
+ started: number
10
+ offset: number
11
+ held: boolean
12
+ handle?: unknown
13
+ end: (finished?: boolean) => void
14
+ done: boolean
15
+ }
16
+
17
+ /** Isolated test clock. Optional native tracks are held and sought at the exact logical time. */
18
+ export class ReplayClock implements Driver {
19
+ private time = 0
20
+ private tracks = new Set<Playback>()
21
+ private timers = new Set<{ at: number; callback(): void }>()
22
+ private frames = new Set<() => void>()
23
+ constructor(
24
+ private native?: Driver,
25
+ private reduced = false,
26
+ ) {
27
+ if (native && !native.control)
28
+ throw new Error('Native replay requires a seekable driver.')
29
+ }
30
+ now = () => this.time
31
+ get resources() {
32
+ return this.tracks.size + this.timers.size + this.frames.size
33
+ }
34
+ frame(callback: () => void) {
35
+ this.frames.add(callback)
36
+ return () => {
37
+ this.frames.delete(callback)
38
+ }
39
+ }
40
+ after(ms: number, callback: () => void) {
41
+ const timer = { at: this.time + ms, callback }
42
+ this.timers.add(timer)
43
+ return () => {
44
+ this.timers.delete(timer)
45
+ }
46
+ }
47
+ play(
48
+ view: View,
49
+ track: Track,
50
+ started: number,
51
+ end: (finished?: boolean) => void,
52
+ ): Playback {
53
+ const playback: Playback = {
54
+ view,
55
+ track,
56
+ started,
57
+ offset: 0,
58
+ held: false,
59
+ end,
60
+ done: false,
61
+ }
62
+ if (this.native) {
63
+ playback.handle = this.native.play(view, track, this.native.now(), () => {})
64
+ this.native.control!(view, playback.handle, 0, true, 'pause')
65
+ }
66
+ this.tracks.add(playback)
67
+ return playback
68
+ }
69
+ elapsed(handle: unknown) {
70
+ const p = handle as Playback
71
+ return p.offset + (p.held ? 0 : this.time - p.started)
72
+ }
73
+ control(_view: View, handle: unknown, elapsed: number, paused: boolean) {
74
+ const p = handle as Playback
75
+ p.offset = elapsed
76
+ p.started = this.time
77
+ p.held = paused
78
+ this.native?.control!(p.view, p.handle, elapsed, true, 'seek')
79
+ }
80
+ stop(_view: View, handle: unknown) {
81
+ this.finish(handle as Playback, false)
82
+ }
83
+ private finish(p: Playback, completed: boolean) {
84
+ if (p.done) return
85
+ p.done = true
86
+ this.tracks.delete(p)
87
+ if (this.native) this.native.stop(p.view, p.handle)
88
+ p.end(completed)
89
+ }
90
+ presented(view: View, property: Property) {
91
+ return this.native?.presented(view, property)
92
+ }
93
+ sync(view: View, excluding?: Property) {
94
+ this.native?.sync?.(view, excluding)
95
+ }
96
+ reducedMotion() {
97
+ return this.reduced
98
+ }
99
+ advanceTo(at: number) {
100
+ if (!Number.isFinite(at) || at < this.time)
101
+ throw new RangeError('Replay time must be finite and monotonic.')
102
+ this.time = at
103
+ // No interpolation of missing frames: callbacks see the original elapsed gap.
104
+ for (const p of [...this.tracks]) {
105
+ this.native?.control!(p.view, p.handle, this.elapsed(p), true, 'seek')
106
+ if (!p.held && this.elapsed(p) >= p.track.end) this.finish(p, true)
107
+ }
108
+ for (const timer of [...this.timers]) {
109
+ if (timer.at <= at && this.timers.delete(timer)) timer.callback()
110
+ }
111
+ const frames = [...this.frames]
112
+ this.frames.clear()
113
+ for (const callback of frames) callback()
114
+ }
115
+ dispose() {
116
+ let error: unknown
117
+ for (const p of [...this.tracks]) {
118
+ try {
119
+ this.finish(p, false)
120
+ } catch (failure) {
121
+ error ??= failure
122
+ }
123
+ }
124
+ this.timers.clear()
125
+ this.frames.clear()
126
+ if (error) throw error
127
+ }
128
+ }
@@ -0,0 +1,98 @@
1
+ import {
2
+ isIOS,
3
+ Utils,
4
+ type ScrollView,
5
+ type EventData,
6
+ type TouchGestureEventData,
7
+ } from '@nativescript/core'
8
+ import { handoffIds, type HandoffIds } from './scroll-handoff.js'
9
+ import type { TraceRecorder } from './trace.js'
10
+
11
+ /** Opt-in raw OS contact capture, before recognizer arbitration. Only numeric window coordinates.
12
+ * The accepted engine baseline normalizes these inputs; this does not record OS recognition decisions.
13
+ */
14
+ export function observeScrollHandoffInputs(
15
+ scroll: ScrollView,
16
+ recorder: Pick<TraceRecorder, 'input'>,
17
+ now: () => number,
18
+ ids: HandoffIds = handoffIds,
19
+ ): () => void {
20
+ let origin = 0,
21
+ previous = 0,
22
+ lastTime = 0,
23
+ contact = false
24
+ const changed = (raw: EventData) => {
25
+ const event = raw as TouchGestureEventData
26
+ const positions: number[] = []
27
+ if (isIOS) {
28
+ for (const pointer of event.getAllPointers()) {
29
+ const touch = pointer.ios as UITouch
30
+ if (touch.phase !== 3 && touch.phase !== 4 /* ended / cancelled */)
31
+ positions.push(touch.locationInView(null).y)
32
+ }
33
+ } else {
34
+ const native = event.android,
35
+ action = native.getActionMasked()
36
+ if (
37
+ action !== android.view.MotionEvent.ACTION_UP &&
38
+ action !== android.view.MotionEvent.ACTION_CANCEL
39
+ )
40
+ for (let i = 0; i < native.getPointerCount(); i++) {
41
+ if (
42
+ action === android.view.MotionEvent.ACTION_POINTER_UP &&
43
+ i === native.getActionIndex()
44
+ )
45
+ continue
46
+ positions.push(
47
+ Utils.layout.toDeviceIndependentPixels(
48
+ native.getRawY() - native.getY() + native.getY(i),
49
+ ),
50
+ )
51
+ }
52
+ }
53
+ const point = positions.length
54
+ ? positions.reduce((sum, y) => sum + y, 0) / positions.length
55
+ : previous
56
+ const time = now()
57
+ const begin = !contact && positions.length > 0 && event.action === 'down'
58
+ if (begin) {
59
+ contact = true
60
+ origin = previous = point
61
+ lastTime = time
62
+ recorder.input({
63
+ type: 'scroll',
64
+ id: ids.scroll,
65
+ offset: Math.max(0, scroll.verticalOffset),
66
+ })
67
+ }
68
+ if (!contact) return
69
+ const ended = !positions.length || event.action === 'cancel'
70
+ recorder.input({
71
+ type: 'gesture',
72
+ id: ids.sheet,
73
+ phase: begin
74
+ ? 'begin'
75
+ : !ended
76
+ ? 'move'
77
+ : event.action === 'cancel'
78
+ ? 'cancel'
79
+ : 'end',
80
+ x: 0,
81
+ y: point - origin,
82
+ velocityX: 0,
83
+ velocityY: ended ? 0 : ((point - previous) / Math.max(1, time - lastTime)) * 1000,
84
+ pointers: ended ? [] : Array.from({ length: positions.length }, (_, i) => i),
85
+ })
86
+ previous = point
87
+ lastTime = time
88
+ if (ended) contact = false
89
+ }
90
+ scroll.on('touch', changed)
91
+ let disposed = false
92
+ return () => {
93
+ if (!disposed) {
94
+ disposed = true
95
+ scroll.off('touch', changed)
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,4 @@
1
+ export * from './trace.js'
2
+ export * from './replay.js'
3
+ export { scrollHandoffTraceGraph, type HandoffIds } from './scroll-handoff.js'
4
+ export { replaySensor, type SensorSample } from './sensors.js'
@@ -0,0 +1,386 @@
1
+ import {
2
+ Application,
3
+ Device,
4
+ Screen,
5
+ GestureTypes,
6
+ isIOS,
7
+ Utils,
8
+ type View,
9
+ type PanGestureEventData,
10
+ type EventData,
11
+ type ScrollView,
12
+ } from '@nativescript/core'
13
+ import { animate } from '../animate.js'
14
+ import { asRoot, bind, motionValue } from '../motion-value.js'
15
+ import { drag, type Drag } from '../drag.js'
16
+ import { motionScope } from '../motion-scope.js'
17
+ import { getDriver, setDriver } from '../driver/index.js'
18
+ import { reducedMotion, timeScale } from '../config.js'
19
+ import { DragInput } from '../drag-input.js'
20
+ import { onKeyboard } from '../keyboard.js'
21
+ import { ReplayClock } from './clock.js'
22
+ import { waitForPresentation } from './presentation.js'
23
+ import { replayInteraction, type ReplayAdapter, type ReplayReport } from './replay.js'
24
+ import {
25
+ parseTrace,
26
+ type InteractionTrace,
27
+ type TraceInput,
28
+ type TraceMotion,
29
+ type TraceState,
30
+ type TraceMetadata,
31
+ type TraceRecorder,
32
+ } from './trace.js'
33
+
34
+ export { ReplayClock }
35
+ export { nativeScrollHandoffTraceGraph } from './scroll-handoff-native.js'
36
+ export { observeScrollHandoffInputs } from './handoff-recorder.js'
37
+
38
+ export const traceNow = () => getDriver().now()
39
+ export const traceSettings = () => ({
40
+ timeScale: timeScale(),
41
+ reducedMotion: reducedMotion(),
42
+ })
43
+ export function traceMetadata(): TraceMetadata {
44
+ const screen = Screen.mainScreen
45
+ const refreshRate = isIOS
46
+ ? UIScreen.mainScreen.maximumFramesPerSecond
47
+ : (Application.android.foregroundActivity ?? Application.android.startActivity)
48
+ .getWindowManager()
49
+ .getDefaultDisplay()
50
+ .getRefreshRate()
51
+ return {
52
+ platform: isIOS ? 'ios' : 'android',
53
+ os: Device.osVersion,
54
+ model: Device.model,
55
+ refreshRate,
56
+ density: screen.scale,
57
+ width: screen.widthDIPs,
58
+ height: screen.heightDIPs,
59
+ }
60
+ }
61
+
62
+ /** Opt-in Core pan/environment capture. Pointer numbers are contact slots, never native handles. */
63
+ export function observeTraceInputs(
64
+ view: View,
65
+ id: string,
66
+ recorder: Pick<TraceRecorder, 'input'>,
67
+ options: {
68
+ pan?: boolean
69
+ layout?: boolean
70
+ lifecycle?: boolean
71
+ keyboard?: boolean
72
+ scroll?: ScrollView
73
+ } = { pan: true },
74
+ ): () => void {
75
+ const off: (() => void)[] = [],
76
+ samples = new DragInput()
77
+ const on = (name: string, callback: (event: EventData) => void) => {
78
+ view.on(name, callback)
79
+ off.push(() => view.off(name, callback))
80
+ }
81
+ if (options.pan)
82
+ on('pan', (raw) => {
83
+ const event = raw as PanGestureEventData
84
+ if (event.state === 1) samples.reset()
85
+ const point = samples.read(event, view)
86
+ const count =
87
+ event.android?.current?.getPointerCount?.() ??
88
+ event.ios?.numberOfTouches ??
89
+ (event.state === 3 ? 0 : 1)
90
+ recorder.input({
91
+ type: 'gesture',
92
+ id,
93
+ phase: point.cancelled
94
+ ? 'cancel'
95
+ : event.state === 1
96
+ ? 'begin'
97
+ : event.state === 3
98
+ ? 'end'
99
+ : 'move',
100
+ x: point.x,
101
+ y: point.y,
102
+ velocityX: point.velocityX,
103
+ velocityY: point.velocityY,
104
+ pointers: Array.from({ length: Math.min(10, count) }, (_, index) => index),
105
+ })
106
+ })
107
+ if (options.layout)
108
+ on('layoutChanged', () => {
109
+ const location = view.getLocationInWindow(),
110
+ size = view.getActualSize()
111
+ if (location) recorder.input({ type: 'layout', id, ...location, ...size })
112
+ })
113
+ if (options.scroll) {
114
+ const scroll = options.scroll
115
+ const changed = () =>
116
+ recorder.input({ type: 'scroll', id, offset: scroll.verticalOffset })
117
+ scroll.on('scroll', changed)
118
+ off.push(() => scroll.off('scroll', changed))
119
+ }
120
+ if (options.keyboard)
121
+ off.push(
122
+ onKeyboard((state) => recorder.input({ type: 'keyboard', inset: state.height })),
123
+ )
124
+ if (options.lifecycle) {
125
+ const suspend = () => recorder.input({ type: 'lifecycle', state: 'suspend' })
126
+ const resume = () => recorder.input({ type: 'lifecycle', state: 'resume' })
127
+ Application.on(Application.suspendEvent, suspend)
128
+ Application.on(Application.resumeEvent, resume)
129
+ off.push(() => {
130
+ Application.off(Application.suspendEvent, suspend)
131
+ Application.off(Application.resumeEvent, resume)
132
+ })
133
+ on('unloaded', () => recorder.input({ type: 'lifecycle', state: 'unload' }))
134
+ on('loaded', () => recorder.input({ type: 'lifecycle', state: 'load' }))
135
+ }
136
+ let disposed = false
137
+ return () => {
138
+ if (!disposed) {
139
+ disposed = true
140
+ off.reverse().forEach((release) => release())
141
+ }
142
+ }
143
+ }
144
+
145
+ /** Same boundary as the native CI probe: no iOS model-layer fallback. */
146
+ export function nativeTracePosition(view: View, axis: 'x' | 'y'): number {
147
+ if (isIOS) {
148
+ const layer = (view.nativeViewProtected as UIView).layer.presentationLayer()
149
+ if (!layer) throw new Error('Replay view has no native presentation layer.')
150
+ return Number(layer.valueForKeyPath(`transform.translation.${axis}`))
151
+ }
152
+ const native = view.nativeViewProtected as android.view.View
153
+ return Utils.layout.toDeviceIndependentPixels(
154
+ axis === 'x' ? native.getTranslationX() : native.getTranslationY(),
155
+ )
156
+ }
157
+
158
+ /** Dispatch normalized graph input, explicitly bypassing the OS recognizer. */
159
+ export function replayPan(view: View, event: Extract<TraceInput, { type: 'gesture' }>) {
160
+ if (event.phase === 'begin') {
161
+ const touch = { eventName: 'touch', object: view, view, action: 'down' }
162
+ const observers = view.getGestureObservers?.(GestureTypes.touch)
163
+ if (observers?.length) {
164
+ for (const observer of [...observers]) observer.callback(touch as never)
165
+ } else view.notify(touch)
166
+ }
167
+ const data = {
168
+ eventName: 'pan',
169
+ object: view,
170
+ view,
171
+ state: { begin: 1, move: 2, end: 3, cancel: 0 }[event.phase],
172
+ deltaX: event.x,
173
+ deltaY: event.y,
174
+ // DragInput accepts this normalized structural payload on either platform.
175
+ ios: {
176
+ translationInView: () => ({ x: event.x, y: event.y }),
177
+ velocityInView: () => ({ x: event.velocityX, y: event.velocityY }),
178
+ numberOfTouches: event.pointers.length,
179
+ },
180
+ } as unknown as PanGestureEventData
181
+ const observers = view.getGestureObservers?.(GestureTypes.pan)
182
+ if (observers?.length) {
183
+ for (const observer of [...observers]) observer.callback(data)
184
+ } else view.notify(data)
185
+ }
186
+
187
+ export interface MotionTraceGraph extends ReplayAdapter {
188
+ /** Engine state for checkpoints recorded before handing them to native presentation probes. */
189
+ engineState(id: string): TraceState
190
+ }
191
+
192
+ /** Reference graph for interrupted springs and cancelled single-pointer drags. */
193
+ export function motionTraceGraph(
194
+ motions: readonly TraceMotion[],
195
+ viewFor: (id: string) => View,
196
+ options: {
197
+ native?: boolean
198
+ /** Application-specific scroll/layout/keyboard routing. Unsupported events must throw. */
199
+ environment?: (event: TraceInput, graph: MotionTraceGraph) => void
200
+ } = {},
201
+ ): MotionTraceGraph {
202
+ const scope = motionScope()
203
+ let disposed = false
204
+ const nodes = new Map<
205
+ string,
206
+ {
207
+ config: TraceMotion
208
+ view: View
209
+ value: ReturnType<typeof motionValue>
210
+ drag?: Drag
211
+ settled: boolean
212
+ velocity: number
213
+ generation: number
214
+ }
215
+ >()
216
+ try {
217
+ for (const config of motions) {
218
+ const view = viewFor(config.id),
219
+ value = motionValue(config.initial)
220
+ const node = {
221
+ config,
222
+ view,
223
+ value,
224
+ settled: true,
225
+ velocity: 0,
226
+ generation: 0,
227
+ drag: undefined as Drag | undefined,
228
+ }
229
+ nodes.set(config.id, node)
230
+ scope.use(() => bind(view, { [config.axis]: value }))
231
+ if (config.kind === 'drag')
232
+ node.drag = scope.add(
233
+ drag(view, {
234
+ value,
235
+ axis: config.axis,
236
+ bounds:
237
+ config.axis === 'x'
238
+ ? { left: config.min, right: config.max }
239
+ : { top: config.min, bottom: config.max },
240
+ ...(config.snap.length ? { snap: config.snap } : {}),
241
+ onMove: (event) => {
242
+ node.velocity = config.axis === 'x' ? event.velocityX : event.velocityY
243
+ },
244
+ onCancel: () => {
245
+ node.velocity = 0
246
+ },
247
+ }),
248
+ )
249
+ }
250
+ } catch (error) {
251
+ scope.dispose()
252
+ throw error
253
+ }
254
+ const find = (id: string) => {
255
+ const node = nodes.get(id)
256
+ if (!node) throw new Error('Unknown replay view ID.')
257
+ return node
258
+ }
259
+ const graph: MotionTraceGraph = {
260
+ input(event) {
261
+ if (disposed) throw new Error('Replay graph is disposed.')
262
+ if (event.type === 'target') {
263
+ const node = find(event.id),
264
+ generation = ++node.generation
265
+ if (node.config.kind !== 'spring')
266
+ throw new Error('Target events require a spring motion.')
267
+ node.settled = false
268
+ const animation = scope.add(
269
+ animate(node.value, event.value, {
270
+ type: 'spring',
271
+ stiffness: node.config.stiffness,
272
+ damping: node.config.damping,
273
+ mass: node.config.mass,
274
+ }),
275
+ )
276
+ void animation.finished.then(() => {
277
+ if (generation === node.generation) node.settled = true
278
+ })
279
+ } else if (event.type === 'gesture') {
280
+ const node = find(event.id)
281
+ if (!node.drag) throw new Error('Gesture events require a drag motion.')
282
+ replayPan(node.view, event)
283
+ } else if (
284
+ event.type === 'lifecycle' &&
285
+ (event.state === 'suspend' || event.state === 'resume')
286
+ ) {
287
+ if (event.state === 'suspend') scope.suspend()
288
+ else scope.resume()
289
+ } else if (options.environment) options.environment(event, graph)
290
+ else throw new Error(`The reference graph has no adapter for ${event.type}.`)
291
+ },
292
+ engineState(id) {
293
+ const node = find(id)
294
+ return {
295
+ position: node.value.get(),
296
+ velocity: node.drag?.dragging
297
+ ? node.velocity
298
+ : asRoot(node.value).inspect().velocity,
299
+ settled: node.drag ? !node.drag.dragging && !node.drag.settling : node.settled,
300
+ }
301
+ },
302
+ read(id) {
303
+ const node = find(id),
304
+ state = graph.engineState(id)
305
+ return {
306
+ ...state,
307
+ position: options.native
308
+ ? nativeTracePosition(node.view, node.config.axis)
309
+ : state.position,
310
+ }
311
+ },
312
+ dispose() {
313
+ if (!disposed) {
314
+ disposed = true
315
+ scope.dispose()
316
+ }
317
+ },
318
+ resources: () =>
319
+ scope.size +
320
+ [...nodes.values()].reduce(
321
+ (sum, node) => sum + asRoot(node.value).inspect().resources,
322
+ 0,
323
+ ),
324
+ }
325
+ return graph
326
+ }
327
+
328
+ let replaying = false
329
+ /** Run in an isolated fixture. Installs the test driver temporarily and always restores it. */
330
+ export async function replayWithDriver(
331
+ value: InteractionTrace | string,
332
+ create: (trace: InteractionTrace, random: () => number) => ReplayAdapter,
333
+ options: {
334
+ native?: boolean
335
+ signal?: { readonly aborted: boolean }
336
+ present?: () => Promise<void>
337
+ } = {},
338
+ ): Promise<ReplayReport> {
339
+ if (replaying) throw new Error('Only one isolated driver replay may run at a time.')
340
+ const trace = parseTrace(value),
341
+ previous = getDriver()
342
+ if (
343
+ timeScale() !== trace.settings.timeScale ||
344
+ reducedMotion() !== trace.settings.reducedMotion
345
+ )
346
+ throw new Error(
347
+ 'Configure the isolated fixture to match the recorded timeScale and Reduced Motion settings first.',
348
+ )
349
+ const clock = new ReplayClock(
350
+ options.native ? previous : undefined,
351
+ trace.settings.reducedMotion,
352
+ )
353
+ const present =
354
+ options.present ??
355
+ (() => waitForPresentation((callback) => previous.frame(callback), options.signal))
356
+ replaying = true
357
+ setDriver(clock)
358
+ try {
359
+ return await replayInteraction(trace, {
360
+ signal: options.signal,
361
+ advanceTo: async (at) => {
362
+ clock.advanceTo(at)
363
+ if (options.native) await present()
364
+ },
365
+ create: (trace, random) => {
366
+ const adapter = create(trace, random)
367
+ return {
368
+ input: async (event) => {
369
+ await adapter.input(event)
370
+ if (options.native) await present()
371
+ },
372
+ read: (id) => adapter.read(id),
373
+ dispose: () => adapter.dispose(),
374
+ resources: () => adapter.resources() + clock.resources,
375
+ }
376
+ },
377
+ })
378
+ } finally {
379
+ try {
380
+ clock.dispose()
381
+ } finally {
382
+ setDriver(previous)
383
+ replaying = false
384
+ }
385
+ }
386
+ }
@@ -0,0 +1,46 @@
1
+ type Frame = (callback: () => void) => () => void
2
+
3
+ /**
4
+ * NativeScript's first RAF outside a frame is a macrotask, not a display tick.
5
+ * Three nested callbacks cross at least two display ticks before reading a held
6
+ * presentation. Never poll for an expected value or retry a failed assertion.
7
+ */
8
+ export function waitForPresentation(
9
+ frame: Frame,
10
+ signal?: { readonly aborted: boolean },
11
+ ): Promise<void> {
12
+ return new Promise((resolve, reject) => {
13
+ let cancel = () => {},
14
+ callbacks = 0,
15
+ done = false
16
+ const finish = (error?: Error) => {
17
+ if (done) return
18
+ done = true
19
+ clearTimeout(timer)
20
+ cancel()
21
+ if (error) reject(error)
22
+ else resolve()
23
+ }
24
+ const timer = setTimeout(
25
+ () => finish(new Error('Sampling presentation timed out after 1500 ms.')),
26
+ 1500,
27
+ )
28
+ const next = () => {
29
+ if (signal?.aborted) {
30
+ finish(new Error('Sampling check cancelled.'))
31
+ return
32
+ }
33
+ try {
34
+ cancel = frame(() => {
35
+ if (done) return
36
+ if (signal?.aborted) finish(new Error('Sampling check cancelled.'))
37
+ else if (++callbacks === 3) finish()
38
+ else next()
39
+ })
40
+ } catch (error) {
41
+ finish(error instanceof Error ? error : new Error(String(error)))
42
+ }
43
+ }
44
+ next()
45
+ })
46
+ }