@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
package/src/engine.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  createClock,
3
+ registerPlayback,
3
4
  validateProgress,
4
5
  type PlaybackAnimation,
5
6
  type PlaybackClock,
6
7
  type PlaybackCommand,
7
8
  } from './playback.js'
8
- import type { View } from '@nativescript/core'
9
+ import { Application, type View } from '@nativescript/core'
9
10
  import { getDriver } from './driver/index.js'
10
11
  import { playHaptics, type HapticOptions } from './haptics.js'
11
12
  import { readValue, writeValue, type Property } from './properties.js'
@@ -13,6 +14,7 @@ import { createTrack, type Track } from './track.js'
13
14
  import type { ResolvedTransition } from './transition.js'
14
15
  import { isColorProperty } from './color.js'
15
16
  import type { PreparedPath, PathProperty } from './path.js'
17
+ import { BASE, identity, MixHandle, mixFor, mixOf, mixesOf } from './mixer.js'
16
18
 
17
19
  export interface Animation extends PromiseLike<boolean> {
18
20
  /**
@@ -32,10 +34,17 @@ export interface Plan {
32
34
  transition: ResolvedTransition
33
35
  relative?: boolean
34
36
  path?: PreparedPath
37
+ /** A track that is already sampled, like a motion value mapped onto a property. */
38
+ track?: () => Track
39
+ /** A named layer composed with the property's base instead of replacing it. */
40
+ layer?: string
35
41
  }
36
42
 
37
43
  interface Entry {
38
44
  readonly track: Track
45
+ /** The property, or the property and its layer. */
46
+ readonly key: string
47
+ readonly layer?: string
39
48
  readonly startedAt: number
40
49
  readonly owner: ViewAnimation
41
50
  handle: unknown
@@ -48,7 +57,7 @@ interface Entry {
48
57
 
49
58
  const revisions = new WeakMap<View, Map<Property, symbol>>()
50
59
 
51
- const running = new WeakMap<View, Map<Property, Entry>>()
60
+ const running = new WeakMap<View, Map<string, Entry>>()
52
61
  const arrivals = new WeakMap<Animation, Promise<unknown>>()
53
62
 
54
63
  /** Internal forecast for starting a timeline step before another one arrives. */
@@ -101,7 +110,9 @@ export class ViewAnimation implements PlaybackAnimation {
101
110
  private readyListener: (() => void) | undefined
102
111
  private readonly endless: boolean
103
112
  private readonly timingListeners = new Set<() => void>()
113
+ private readonly playbackChanged: () => void
104
114
  private timingChanged() {
115
+ this.playbackChanged()
105
116
  for (const callback of [...this.timingListeners]) callback()
106
117
  }
107
118
 
@@ -134,6 +145,7 @@ export class ViewAnimation implements PlaybackAnimation {
134
145
  if (this.settled) return
135
146
  if (!this.started) {
136
147
  this.pendingProgress = value
148
+ this.timingChanged()
137
149
  return
138
150
  }
139
151
  this.seekTime(this.duration * value)
@@ -188,7 +200,7 @@ export class ViewAnimation implements PlaybackAnimation {
188
200
  entry.done = false
189
201
  entry.finished = false
190
202
  this.pending++
191
- entriesOf(this.view).set(entry.track.property, entry)
203
+ entriesOf(this.view).set(entry.key, entry)
192
204
  this.playEntry(entry, position)
193
205
  }
194
206
  }
@@ -199,9 +211,9 @@ export class ViewAnimation implements PlaybackAnimation {
199
211
  this.timingChanged()
200
212
  }
201
213
  elapsed(entry: Entry, now: number) {
202
- return this.controlled
203
- ? this.time()
204
- : (getDriver().elapsed?.(entry.handle) ?? now - entry.startedAt)
214
+ if (this.controlled) return this.time()
215
+ if (entry.handle instanceof MixHandle) return entry.handle.elapsed()
216
+ return getDriver().elapsed?.(entry.handle) ?? now - entry.startedAt
205
217
  }
206
218
  private time() {
207
219
  return this.clock?.time() ?? 0
@@ -209,8 +221,10 @@ export class ViewAnimation implements PlaybackAnimation {
209
221
  private controlTracks(position: number, command: PlaybackCommand = 'seek') {
210
222
  const driver = getDriver()
211
223
  for (const entry of this.entries)
212
- if (!entry.done)
213
- driver.control?.(this.view, entry.handle, position, this._paused, command)
224
+ if (entry.done) continue
225
+ else if (entry.handle instanceof MixHandle)
226
+ entry.handle.control(position, this._paused)
227
+ else driver.control?.(this.view, entry.handle, position, this._paused, command)
214
228
  }
215
229
  private scheduleArrival() {
216
230
  this.cancelArrival?.()
@@ -244,21 +258,38 @@ export class ViewAnimation implements PlaybackAnimation {
244
258
  const initial = entry.generation === 0
245
259
  const instance = ++entry.generation
246
260
  const driver = getDriver()
247
- entry.handle = driver.play(
248
- this.view,
249
- entry.track,
250
- initial ? entry.startedAt : driver.now() - elapsed,
251
- (finished = true) => {
252
- if (entry.done || instance !== entry.generation) return
253
- entry.done = true
254
- entry.finished = finished
255
- entry.completedValue = readValue(this.view, entry.track.property)
256
- forget(entry)
257
- this.ended(finished)
258
- },
259
- )
261
+ const startedAt = initial ? entry.startedAt : driver.now() - elapsed
262
+ const onEnd = (finished = true) => {
263
+ if (entry.done || instance !== entry.generation) return
264
+ entry.done = true
265
+ entry.finished = finished
266
+ entry.completedValue = readValue(this.view, entry.track.property)
267
+ forget(entry)
268
+ this.ended(finished)
269
+ }
270
+ const { property } = entry.track
271
+ const mix =
272
+ entry.layer !== undefined ? mixing(this.view, property) : mixOf(this.view, property)
273
+ entry.handle = mix
274
+ ? mix.adopt(entry.layer ?? BASE, entry.track, startedAt, onEnd)
275
+ : driver.play(this.view, entry.track, startedAt, onEnd)
276
+ }
277
+
278
+ /** Moves a natively playing entry into its property's mix, without restarting it. */
279
+ rehome(entry: Entry) {
280
+ if (entry.done || entry.handle instanceof MixHandle) return
281
+ const elapsed = this.elapsed(entry, getDriver().now())
282
+ const handle = entry.handle
283
+ entry.generation++
284
+ getDriver().stop(this.view, handle)
285
+ this.playEntry(entry, elapsed)
286
+ }
287
+ private unloaded = () => {
288
+ // NativeScript unloads the root view when iOS enters the background.
289
+ // An explicitly paused owner can resume after that temporary unload.
290
+ if (this._paused && Application.suspended) return
291
+ this.stop()
260
292
  }
261
- private unloaded = () => this.stop()
262
293
 
263
294
  constructor(
264
295
  readonly view: View,
@@ -273,6 +304,18 @@ export class ViewAnimation implements PlaybackAnimation {
273
304
  !Number.isFinite(plan.transition.curve.duration)),
274
305
  )
275
306
  this.finished = new Promise((resolve) => (this.resolve = resolve))
307
+ this.playbackChanged = registerPlayback(this, () => ({
308
+ position: this.pendingProgress,
309
+ time:
310
+ this.pendingProgress === undefined
311
+ ? this.time()
312
+ : this.pendingProgress * this.duration,
313
+ duration: this.duration,
314
+ paused: this._paused,
315
+ ready: this.ready,
316
+ settled: this.settled,
317
+ completed: this.settled && this.complete,
318
+ }))
276
319
  setArrival(this, new Promise<void>((resolve) => (this.arrive = resolve)))
277
320
  setArrivalTiming(this, {
278
321
  read: () => ({
@@ -322,52 +365,79 @@ export class ViewAnimation implements PlaybackAnimation {
322
365
  const now = driver.now()
323
366
  const entries = entriesOf(this.view)
324
367
 
325
- const tracks = plans.map(({ property, keyframes, transition, relative, path }) => {
326
- const previous = entries.get(property)
368
+ const made = plans.map((plan) => {
369
+ const { property, keyframes, transition, relative, path, layer } = plan
370
+ const key = layer === undefined ? property : `${property}#${layer}`
371
+ const mixed = layer !== undefined || mixOf(this.view, property) !== undefined
372
+ const previous = entries.get(key)
327
373
  let current: number
328
374
  let velocity = 0
329
375
  if (previous) {
330
376
  const elapsed = elapsedOf(previous, now)
331
- current = driver.presented(this.view, property) ?? previous.track.valueAt(elapsed)
377
+ current =
378
+ (mixed ? undefined : driver.presented(this.view, property)) ??
379
+ previous.track.valueAt(elapsed)
332
380
  velocity = previous.owner.paused ? 0 : previous.track.velocityAt(elapsed)
333
- release(previous, now, false)
381
+ } else if (mixed) {
382
+ current =
383
+ mixOf(this.view, property)?.rest(layer ?? BASE) ??
384
+ (layer === undefined ? readValue(this.view, property) : identity(property))
334
385
  } else {
335
386
  current =
336
387
  (isColorProperty(property)
337
388
  ? driver.presented(this.view, property)
338
389
  : undefined) ?? readValue(this.view, property)
339
390
  }
340
- if (path)
341
- return path.track(
342
- property as PathProperty,
343
- relative ? current : 0,
344
- transition.delay,
391
+ const build = () => {
392
+ if (plan.track) return plan.track()
393
+ if (path)
394
+ return path.track(
395
+ property as PathProperty,
396
+ relative ? current : 0,
397
+ transition.delay,
398
+ )
399
+ return createTrack(
400
+ property,
401
+ keyframes.map((value) => {
402
+ if (value === null) return current
403
+ if (layer !== undefined || !relative || isColorProperty(property))
404
+ return value
405
+ return property === 'opacity' || property.startsWith('scale')
406
+ ? current * value
407
+ : current + value
408
+ }),
409
+ transition,
410
+ velocity,
345
411
  )
346
- return createTrack(
347
- property,
348
- keyframes.map((value) => {
349
- if (value === null) return current
350
- if (!relative || isColorProperty(property)) return value
351
- return property === 'opacity' || property.startsWith('scale')
352
- ? current * value
353
- : current + value
354
- }),
355
- transition,
356
- velocity,
357
- )
412
+ }
413
+ return { track: build(), key, layer, previous }
358
414
  })
359
-
360
- for (const track of tracks) writeValue(this.view, track.property, track.to)
415
+ // Validate every trajectory before interrupting any existing property owner.
416
+ for (const { previous } of made) if (previous) release(previous, now, false)
417
+ const tracks = made.map(({ track }) => track)
418
+
419
+ for (const { track, layer } of made) {
420
+ const mix =
421
+ layer !== undefined
422
+ ? mixing(this.view, track.property)
423
+ : mixOf(this.view, track.property)
424
+ if (!mix) writeValue(this.view, track.property, track.to)
425
+ else if (track.end === 0) mix.setRest(layer ?? BASE, track.to)
426
+ }
361
427
  driver.sync?.(this.view)
362
428
 
363
- for (const track of tracks) {
364
- let tokens = revisions.get(this.view)
365
- if (!tokens) revisions.set(this.view, (tokens = new Map()))
429
+ for (const { track, key, layer } of made) {
366
430
  const token = Symbol(track.property)
367
- tokens.set(track.property, token)
431
+ if (layer === undefined) {
432
+ let tokens = revisions.get(this.view)
433
+ if (!tokens) revisions.set(this.view, (tokens = new Map()))
434
+ tokens.set(track.property, token)
435
+ }
368
436
  if (track.end === 0) continue
369
437
  const entry: Entry = {
370
438
  track,
439
+ key,
440
+ layer,
371
441
  startedAt: now,
372
442
  owner: this,
373
443
  handle: undefined,
@@ -376,7 +446,7 @@ export class ViewAnimation implements PlaybackAnimation {
376
446
  generation: 0,
377
447
  token,
378
448
  }
379
- entries.set(track.property, entry)
449
+ entries.set(key, entry)
380
450
  this.entries.push(entry)
381
451
  this.pending++
382
452
  }
@@ -388,11 +458,17 @@ export class ViewAnimation implements PlaybackAnimation {
388
458
  createClock(() => driver.now())
389
459
  if (this._paused) this.clock.pause()
390
460
  this.view.on('unloaded', this.unloaded)
391
- this.haptics = playHaptics(this.view, tracks, this.haptic, driver, now, () =>
392
- this.time(),
393
- )
394
- if (this._paused) this.haptics?.pause()
395
461
  for (const entry of this.entries) this.playEntry(entry)
462
+ // Register discrete feedback after the visual animators. Android dispatches
463
+ // these callbacks in registration order within a frame: feedback should see
464
+ // that frame's updated pose, not the preceding frame's position.
465
+ // Scale-zero native playback may already have completed synchronously.
466
+ if (!this.settled) {
467
+ this.haptics = playHaptics(this.view, tracks, this.haptic, driver, now, () =>
468
+ this.time(),
469
+ )
470
+ if (this._paused) this.haptics?.pause()
471
+ }
396
472
  if (this.pendingProgress !== undefined) {
397
473
  const progress = this.pendingProgress
398
474
  this.pendingProgress = undefined
@@ -405,8 +481,8 @@ export class ViewAnimation implements PlaybackAnimation {
405
481
  }
406
482
 
407
483
  private waitForLoad(plans: readonly Plan[]) {
408
- for (const { property, keyframes, relative } of plans) {
409
- if (relative && !isColorProperty(property)) continue
484
+ for (const { property, keyframes, relative, layer } of plans) {
485
+ if (layer !== undefined || (relative && !isColorProperty(property))) continue
410
486
  const first = keyframes[0]
411
487
  if (first !== null && first !== undefined) writeValue(this.view, property, first)
412
488
  }
@@ -438,6 +514,8 @@ export class ViewAnimation implements PlaybackAnimation {
438
514
 
439
515
  /** Current native presentation when available, otherwise the active curve or model. */
440
516
  export function currentValue(view: View, property: Property): number {
517
+ const mix = mixOf(view, property)
518
+ if (mix) return mix.value()
441
519
  const entry = running.get(view)?.get(property)
442
520
  if (!entry) return readValue(view, property)
443
521
  const driver = getDriver()
@@ -452,6 +530,22 @@ export function propertyRevision(view: View, property: Property) {
452
530
  return revisions.get(view)?.get(property)
453
531
  }
454
532
 
533
+ /** Internal read-only diagnostics. No observers or frame hooks are installed. */
534
+ export function inspectViewMotion(view: View) {
535
+ const now = getDriver().now()
536
+ return [...(running.get(view)?.values() ?? [])].map((entry) => ({
537
+ owner: entry.owner,
538
+ handle: entry.handle,
539
+ key: entry.key,
540
+ property: entry.track.property,
541
+ layer: entry.layer,
542
+ track: entry.track,
543
+ // A development hook may inspect while playEntry is still obtaining its handle.
544
+ elapsed: entry.handle === undefined ? 0 : elapsedOf(entry, now),
545
+ paused: entry.owner.paused,
546
+ }))
547
+ }
548
+
455
549
  /** Sample an existing owner at layout time, without stealing an animation started meanwhile. */
456
550
  export function captureValue(view: View, property: Property): () => number | undefined {
457
551
  const token = propertyRevision(view, property)
@@ -465,19 +559,69 @@ export function captureValue(view: View, property: Property): () => number | und
465
559
  }
466
560
  }
467
561
 
468
- /** Stops whatever is animating these properties of the view, or all of them. */
562
+ /** Stops whatever is animating these properties of the view, or all of them, layers included. */
469
563
  export function stopView(view: View, properties?: readonly Property[]) {
470
564
  const tokens = revisions.get(view)
471
565
  for (const property of properties ?? tokens?.keys() ?? [])
472
566
  tokens?.set(property, Symbol(property))
567
+ for (const mix of mixesOf(view))
568
+ if (!properties || properties.includes(mix.property)) mix.freeze()
473
569
  const entries = running.get(view)
474
570
  if (!entries) return
475
571
  const now = getDriver().now()
476
- for (const [property, entry] of [...entries]) {
477
- if (!properties || properties.includes(property)) release(entry, now, true)
572
+ for (const entry of [...entries.values()]) {
573
+ if (!properties || properties.includes(entry.track.property))
574
+ release(entry, now, true)
478
575
  }
479
576
  }
480
577
 
578
+ /** Stops the regular animations of these properties and leaves their layers running. */
579
+ export function stopBase(view: View, properties: readonly Property[]) {
580
+ const tokens = revisions.get(view)
581
+ for (const property of properties) tokens?.set(property, Symbol(property))
582
+ const now = getDriver().now()
583
+ for (const property of properties) {
584
+ const entry = running.get(view)?.get(property)
585
+ if (entry) release(entry, now, true)
586
+ }
587
+ }
588
+
589
+ /** Stops one layer and takes away what it adds, also after it finished. */
590
+ export function stopLayer(view: View, layer: string, properties?: readonly Property[]) {
591
+ const now = getDriver().now()
592
+ for (const entry of [...(running.get(view)?.values() ?? [])])
593
+ if (
594
+ entry.layer === layer &&
595
+ (!properties || properties.includes(entry.track.property))
596
+ )
597
+ release(entry, now, true)
598
+ for (const mix of mixesOf(view))
599
+ if (!properties || properties.includes(mix.property))
600
+ mix.setRest(layer, identity(mix.property))
601
+ }
602
+
603
+ /** Writes a property's base value, under its layers when it has any. */
604
+ export function setBase(view: View, property: Property, value: number) {
605
+ const mix = mixOf(view, property)
606
+ if (mix) mix.setRest(BASE, value)
607
+ else writeValue(view, property, value)
608
+ }
609
+
610
+ /** A property's base value, without what its layers add. */
611
+ export function baseValue(view: View, property: Property): number {
612
+ return mixOf(view, property)?.rest(BASE) ?? readValue(view, property)
613
+ }
614
+
615
+ /** The property's mix, created on its first layer; a base playing natively moves into it. */
616
+ function mixing(view: View, property: Property) {
617
+ const existing = mixOf(view, property)
618
+ if (existing) return existing
619
+ const mix = mixFor(view, property)
620
+ const base = running.get(view)?.get(property)
621
+ if (base) base.owner.rehome(base)
622
+ return mix
623
+ }
624
+
481
625
  function entriesOf(view: View) {
482
626
  let entries = running.get(view)
483
627
  if (!entries) running.set(view, (entries = new Map()))
@@ -486,7 +630,7 @@ function entriesOf(view: View) {
486
630
 
487
631
  function forget(entry: Entry) {
488
632
  const entries = running.get(entry.owner.view)
489
- if (entries?.get(entry.track.property) === entry) entries.delete(entry.track.property)
633
+ if (entries?.get(entry.key) === entry) entries.delete(entry.key)
490
634
  }
491
635
 
492
636
  function release(entry: Entry, now: number, commit: boolean) {
@@ -495,6 +639,11 @@ function release(entry: Entry, now: number, commit: boolean) {
495
639
  const { property } = entry.track
496
640
  entry.done = true
497
641
  forget(entry)
642
+ if (entry.handle instanceof MixHandle) {
643
+ entry.handle.mix.detach(entry.layer ?? BASE, commit)
644
+ entry.owner.ended(false)
645
+ return
646
+ }
498
647
  if (commit) {
499
648
  const value =
500
649
  driver.presented(view, property) ?? entry.track.valueAt(elapsedOf(entry, now))
@@ -0,0 +1,139 @@
1
+ import { isIOS, type View, type ScrollView } from '@nativescript/core'
2
+ import { liveValueInput, type DerivedValue } from './motion-value.js'
3
+ import { nativeLiveNode } from './live-spring-driver.js'
4
+ import { retainScrollDelegate } from './driver/ios-scroll-delegate.js'
5
+
6
+ export interface GestureSettings {
7
+ axis: number
8
+ threshold: number
9
+ failOffset: number
10
+ pinch: boolean
11
+ rotate: boolean
12
+ tap: boolean
13
+ doubleTap: boolean
14
+ contactEvents: boolean
15
+ minX: number
16
+ maxX: number
17
+ minY: number
18
+ maxY: number
19
+ minScale: number
20
+ maxScale: number
21
+ }
22
+ export interface GestureDriver {
23
+ readonly active: boolean
24
+ cancel(): void
25
+ enabled(value: boolean): void
26
+ settle(values: readonly number[], animated: boolean): void
27
+ bounds(settings: GestureSettings): void
28
+ dispose(): void
29
+ }
30
+ export function createGestureDriver(
31
+ surface: View,
32
+ scroll: ScrollView | undefined,
33
+ values: readonly DerivedValue[],
34
+ options: GestureSettings,
35
+ callback: (state: number, vx: number, vy: number) => void,
36
+ ): GestureDriver {
37
+ const inputs = values.map(liveValueInput)
38
+ const nodes = inputs.map((input) => nativeLiveNode(input.node))
39
+ const changed = (state: number, vx: number, vy: number) => {
40
+ for (const input of inputs) input.changed()
41
+ callback(state, vx, vy)
42
+ }
43
+ const json = JSON.stringify(options)
44
+ if (isIOS) {
45
+ if (typeof JoltGestureSession === 'undefined')
46
+ throw new Error('Rebuild the native app to use gestures().')
47
+ if (
48
+ options.contactEvents &&
49
+ typeof JoltGestureSession.supportsContactEvents !== 'function'
50
+ )
51
+ throw new Error(
52
+ 'Rebuild the native app to use gesture contact events and bottomSheet().',
53
+ )
54
+ const [x, y, scale, rotation] = nodes as [
55
+ JoltLiveSpring,
56
+ JoltLiveSpring,
57
+ JoltLiveSpring,
58
+ JoltLiveSpring,
59
+ ]
60
+ const native = JoltGestureSession.attachScrollXYScaleRotationOptionsOnState(
61
+ surface.nativeViewProtected,
62
+ scroll?.nativeViewProtected ?? null,
63
+ x,
64
+ y,
65
+ scale,
66
+ rotation,
67
+ json,
68
+ changed,
69
+ )
70
+ const releaseDelegate = scroll
71
+ ? retainScrollDelegate(scroll, () => native.refreshScrollDelegate())
72
+ : () => {}
73
+ return {
74
+ get active() {
75
+ return native.active
76
+ },
77
+ cancel: () => native.cancel(),
78
+ enabled: (value) => native.setEnabled(value),
79
+ settle: (values, animated) => {
80
+ native.settleXYScaleRotationAnimated(
81
+ values[0]!,
82
+ values[1]!,
83
+ values[2]!,
84
+ values[3]!,
85
+ animated,
86
+ )
87
+ inputs.forEach((input) => input.changed())
88
+ },
89
+ bounds: (settings) =>
90
+ native.updateLeftRightTopBottom(
91
+ settings.minX,
92
+ settings.maxX,
93
+ settings.minY,
94
+ settings.maxY,
95
+ ),
96
+ dispose: () => {
97
+ releaseDelegate()
98
+ native.dispose()
99
+ },
100
+ }
101
+ }
102
+ if (
103
+ options.contactEvents &&
104
+ typeof org.rafaelaugusto.jolt.GestureSession.supportsContactEvents !== 'function'
105
+ )
106
+ throw new Error(
107
+ 'Rebuild the native app to use gesture contact events and bottomSheet().',
108
+ )
109
+ const [x, y, scale, rotation] = nodes as [
110
+ org.rafaelaugusto.jolt.LiveSpring,
111
+ org.rafaelaugusto.jolt.LiveSpring,
112
+ org.rafaelaugusto.jolt.LiveSpring,
113
+ org.rafaelaugusto.jolt.LiveSpring,
114
+ ]
115
+ const native = new org.rafaelaugusto.jolt.GestureSession(
116
+ surface.nativeViewProtected,
117
+ scroll?.nativeViewProtected ?? null,
118
+ x,
119
+ y,
120
+ scale,
121
+ rotation,
122
+ json,
123
+ new org.rafaelaugusto.jolt.GestureSession.Listener({ onState: changed }),
124
+ )
125
+ return {
126
+ get active() {
127
+ return native.isActive()
128
+ },
129
+ cancel: () => native.cancel(),
130
+ enabled: (value) => native.setEnabled(value),
131
+ settle: (values, animated) => {
132
+ native.settle(values[0]!, values[1]!, values[2]!, values[3]!, animated)
133
+ inputs.forEach((input) => input.changed())
134
+ },
135
+ bounds: (settings) =>
136
+ native.updateBounds(settings.minX, settings.maxX, settings.minY, settings.maxY),
137
+ dispose: () => native.dispose(),
138
+ }
139
+ }