@rafaelaugusto/jolt 0.1.0-beta.8 → 0.1.0-rc.1

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 (582) hide show
  1. package/README.md +136 -15
  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 +67 -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 +14 -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-layout.d.ts +9 -0
  67. package/dist/driver/ios-layout.d.ts.map +1 -0
  68. package/dist/driver/ios-layout.js +52 -0
  69. package/dist/driver/ios-layout.js.map +1 -0
  70. package/dist/driver/ios-scroll-delegate.d.ts +4 -0
  71. package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
  72. package/dist/driver/ios-scroll-delegate.js +26 -0
  73. package/dist/driver/ios-scroll-delegate.js.map +1 -0
  74. package/dist/driver/ios.d.ts.map +1 -1
  75. package/dist/driver/ios.js +57 -1
  76. package/dist/driver/ios.js.map +1 -1
  77. package/dist/easing.d.ts +3 -1
  78. package/dist/easing.d.ts.map +1 -1
  79. package/dist/easing.js +18 -1
  80. package/dist/easing.js.map +1 -1
  81. package/dist/engine.d.ts +35 -2
  82. package/dist/engine.d.ts.map +1 -1
  83. package/dist/engine.js +211 -42
  84. package/dist/engine.js.map +1 -1
  85. package/dist/gesture-native.d.ts +28 -0
  86. package/dist/gesture-native.d.ts.map +1 -0
  87. package/dist/gesture-native.js +61 -0
  88. package/dist/gesture-native.js.map +1 -0
  89. package/dist/gestures/index.d.ts +69 -0
  90. package/dist/gestures/index.d.ts.map +1 -0
  91. package/dist/gestures/index.js +262 -0
  92. package/dist/gestures/index.js.map +1 -0
  93. package/dist/glass/index.d.ts +55 -0
  94. package/dist/glass/index.d.ts.map +1 -0
  95. package/dist/glass/index.js +205 -0
  96. package/dist/glass/index.js.map +1 -0
  97. package/dist/gradient-binding.d.ts +38 -0
  98. package/dist/gradient-binding.d.ts.map +1 -0
  99. package/dist/gradient-binding.js +128 -0
  100. package/dist/gradient-binding.js.map +1 -0
  101. package/dist/gradient.d.ts +105 -0
  102. package/dist/gradient.d.ts.map +1 -0
  103. package/dist/gradient.js +514 -0
  104. package/dist/gradient.js.map +1 -0
  105. package/dist/gravity.d.ts +13 -0
  106. package/dist/gravity.d.ts.map +1 -0
  107. package/dist/gravity.js +84 -0
  108. package/dist/gravity.js.map +1 -0
  109. package/dist/haptics.d.ts.map +1 -1
  110. package/dist/haptics.js +101 -28
  111. package/dist/haptics.js.map +1 -1
  112. package/dist/image-effect.d.ts +1 -0
  113. package/dist/image-effect.d.ts.map +1 -1
  114. package/dist/image-effect.js +10 -2
  115. package/dist/image-effect.js.map +1 -1
  116. package/dist/index.d.ts +21 -7
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +11 -4
  119. package/dist/index.js.map +1 -1
  120. package/dist/inspector/index.d.ts +86 -0
  121. package/dist/inspector/index.d.ts.map +1 -0
  122. package/dist/inspector/index.js +419 -0
  123. package/dist/inspector/index.js.map +1 -0
  124. package/dist/inspector/plot.d.ts +4 -0
  125. package/dist/inspector/plot.d.ts.map +1 -0
  126. package/dist/inspector/plot.js +23 -0
  127. package/dist/inspector/plot.js.map +1 -0
  128. package/dist/inspector/probe.d.ts +19 -0
  129. package/dist/inspector/probe.d.ts.map +1 -0
  130. package/dist/inspector/probe.js +37 -0
  131. package/dist/inspector/probe.js.map +1 -0
  132. package/dist/inspector/tuning.d.ts +19 -0
  133. package/dist/inspector/tuning.d.ts.map +1 -0
  134. package/dist/inspector/tuning.js +37 -0
  135. package/dist/inspector/tuning.js.map +1 -0
  136. package/dist/interactive-navigation/index.d.ts +44 -0
  137. package/dist/interactive-navigation/index.d.ts.map +1 -0
  138. package/dist/interactive-navigation/index.js +314 -0
  139. package/dist/interactive-navigation/index.js.map +1 -0
  140. package/dist/keyboard.d.ts +24 -0
  141. package/dist/keyboard.d.ts.map +1 -1
  142. package/dist/keyboard.js +199 -6
  143. package/dist/keyboard.js.map +1 -1
  144. package/dist/layout.d.ts +13 -0
  145. package/dist/layout.d.ts.map +1 -0
  146. package/dist/layout.js +348 -0
  147. package/dist/layout.js.map +1 -0
  148. package/dist/live-spring-driver.d.ts +52 -0
  149. package/dist/live-spring-driver.d.ts.map +1 -0
  150. package/dist/live-spring-driver.js +104 -0
  151. package/dist/live-spring-driver.js.map +1 -0
  152. package/dist/mixer.d.ts +55 -0
  153. package/dist/mixer.d.ts.map +1 -0
  154. package/dist/mixer.js +278 -0
  155. package/dist/mixer.js.map +1 -0
  156. package/dist/motion-scope.d.ts +10 -2
  157. package/dist/motion-scope.d.ts.map +1 -1
  158. package/dist/motion-scope.js +30 -3
  159. package/dist/motion-scope.js.map +1 -1
  160. package/dist/motion-states.d.ts +19 -7
  161. package/dist/motion-states.d.ts.map +1 -1
  162. package/dist/motion-states.js +116 -26
  163. package/dist/motion-states.js.map +1 -1
  164. package/dist/motion-value.d.ts +227 -0
  165. package/dist/motion-value.d.ts.map +1 -0
  166. package/dist/motion-value.js +1074 -0
  167. package/dist/motion-value.js.map +1 -0
  168. package/dist/native/index.d.ts +10 -0
  169. package/dist/native/index.d.ts.map +1 -0
  170. package/dist/native/index.js +6 -0
  171. package/dist/native/index.js.map +1 -0
  172. package/dist/native-properties.d.ts +28 -0
  173. package/dist/native-properties.d.ts.map +1 -0
  174. package/dist/native-properties.js +154 -0
  175. package/dist/native-properties.js.map +1 -0
  176. package/dist/native-property-driver.d.ts +19 -0
  177. package/dist/native-property-driver.d.ts.map +1 -0
  178. package/dist/native-property-driver.js +69 -0
  179. package/dist/native-property-driver.js.map +1 -0
  180. package/dist/native-property.d.ts +37 -0
  181. package/dist/native-property.d.ts.map +1 -0
  182. package/dist/native-property.js +285 -0
  183. package/dist/native-property.js.map +1 -0
  184. package/dist/particles.d.ts +5 -2
  185. package/dist/particles.d.ts.map +1 -1
  186. package/dist/particles.js +16 -10
  187. package/dist/particles.js.map +1 -1
  188. package/dist/path.d.ts.map +1 -1
  189. package/dist/path.js +2 -2
  190. package/dist/path.js.map +1 -1
  191. package/dist/physics/index.d.ts +116 -0
  192. package/dist/physics/index.d.ts.map +1 -0
  193. package/dist/physics/index.js +306 -0
  194. package/dist/physics/index.js.map +1 -0
  195. package/dist/physics/native.d.ts +53 -0
  196. package/dist/physics/native.d.ts.map +1 -0
  197. package/dist/physics/native.js +58 -0
  198. package/dist/physics/native.js.map +1 -0
  199. package/dist/playback-group.d.ts.map +1 -1
  200. package/dist/playback-group.js +17 -1
  201. package/dist/playback-group.js.map +1 -1
  202. package/dist/playback.d.ts +15 -0
  203. package/dist/playback.d.ts.map +1 -1
  204. package/dist/playback.js +23 -0
  205. package/dist/playback.js.map +1 -1
  206. package/dist/predictive-back/index.d.ts +45 -0
  207. package/dist/predictive-back/index.d.ts.map +1 -0
  208. package/dist/predictive-back/index.js +220 -0
  209. package/dist/predictive-back/index.js.map +1 -0
  210. package/dist/predictive-back/presentation.d.ts +4 -0
  211. package/dist/predictive-back/presentation.d.ts.map +1 -0
  212. package/dist/predictive-back/presentation.js +3 -0
  213. package/dist/predictive-back/presentation.js.map +1 -0
  214. package/dist/reorder/handle.d.ts +6 -0
  215. package/dist/reorder/handle.d.ts.map +1 -0
  216. package/dist/reorder/handle.js +10 -0
  217. package/dist/reorder/handle.js.map +1 -0
  218. package/dist/reorder/index.d.ts +10 -0
  219. package/dist/reorder/index.d.ts.map +1 -0
  220. package/dist/reorder/index.js +233 -0
  221. package/dist/reorder/index.js.map +1 -0
  222. package/dist/reorder/list-view.d.ts +5 -0
  223. package/dist/reorder/list-view.d.ts.map +1 -0
  224. package/dist/reorder/list-view.js +238 -0
  225. package/dist/reorder/list-view.js.map +1 -0
  226. package/dist/reorder/model.d.ts +6 -0
  227. package/dist/reorder/model.d.ts.map +1 -0
  228. package/dist/reorder/model.js +30 -0
  229. package/dist/reorder/model.js.map +1 -0
  230. package/dist/reorder/surface.d.ts +6 -0
  231. package/dist/reorder/surface.d.ts.map +1 -0
  232. package/dist/reorder/surface.js +10 -0
  233. package/dist/reorder/surface.js.map +1 -0
  234. package/dist/reorder/types.d.ts +92 -0
  235. package/dist/reorder/types.d.ts.map +1 -0
  236. package/dist/reorder/types.js +2 -0
  237. package/dist/reorder/types.js.map +1 -0
  238. package/dist/sampling.d.ts +35 -0
  239. package/dist/sampling.d.ts.map +1 -0
  240. package/dist/sampling.js +123 -0
  241. package/dist/sampling.js.map +1 -0
  242. package/dist/scene-appearance.d.ts +14 -0
  243. package/dist/scene-appearance.d.ts.map +1 -0
  244. package/dist/scene-appearance.js +68 -0
  245. package/dist/scene-appearance.js.map +1 -0
  246. package/dist/scene-camera.d.ts +5 -0
  247. package/dist/scene-camera.d.ts.map +1 -0
  248. package/dist/scene-camera.js +23 -0
  249. package/dist/scene-camera.js.map +1 -0
  250. package/dist/scene-shader.d.ts +18 -0
  251. package/dist/scene-shader.d.ts.map +1 -0
  252. package/dist/scene-shader.js +76 -0
  253. package/dist/scene-shader.js.map +1 -0
  254. package/dist/scroll-header/geometry.d.ts +18 -0
  255. package/dist/scroll-header/geometry.d.ts.map +1 -0
  256. package/dist/scroll-header/geometry.js +46 -0
  257. package/dist/scroll-header/geometry.js.map +1 -0
  258. package/dist/scroll-header/index.d.ts +48 -0
  259. package/dist/scroll-header/index.d.ts.map +1 -0
  260. package/dist/scroll-header/index.js +373 -0
  261. package/dist/scroll-header/index.js.map +1 -0
  262. package/dist/scroll-header/native.d.ts +28 -0
  263. package/dist/scroll-header/native.d.ts.map +1 -0
  264. package/dist/scroll-header/native.js +43 -0
  265. package/dist/scroll-header/native.js.map +1 -0
  266. package/dist/sensors/index.d.ts +69 -0
  267. package/dist/sensors/index.d.ts.map +1 -0
  268. package/dist/sensors/index.js +149 -0
  269. package/dist/sensors/index.js.map +1 -0
  270. package/dist/sensors/native.d.ts +20 -0
  271. package/dist/sensors/native.d.ts.map +1 -0
  272. package/dist/sensors/native.js +48 -0
  273. package/dist/sensors/native.js.map +1 -0
  274. package/dist/sequence.d.ts +24 -0
  275. package/dist/sequence.d.ts.map +1 -1
  276. package/dist/sequence.js +181 -19
  277. package/dist/sequence.js.map +1 -1
  278. package/dist/shapes/android.d.ts +3 -0
  279. package/dist/shapes/android.d.ts.map +1 -0
  280. package/dist/shapes/android.js +51 -0
  281. package/dist/shapes/android.js.map +1 -0
  282. package/dist/shapes/index.d.ts +6 -0
  283. package/dist/shapes/index.d.ts.map +1 -0
  284. package/dist/shapes/index.js +238 -0
  285. package/dist/shapes/index.js.map +1 -0
  286. package/dist/shapes/ios.d.ts +3 -0
  287. package/dist/shapes/ios.d.ts.map +1 -0
  288. package/dist/shapes/ios.js +164 -0
  289. package/dist/shapes/ios.js.map +1 -0
  290. package/dist/shapes/native.d.ts +18 -0
  291. package/dist/shapes/native.d.ts.map +1 -0
  292. package/dist/shapes/native.js +10 -0
  293. package/dist/shapes/native.js.map +1 -0
  294. package/dist/shapes/path.d.ts +10 -0
  295. package/dist/shapes/path.d.ts.map +1 -0
  296. package/dist/shapes/path.js +106 -0
  297. package/dist/shapes/path.js.map +1 -0
  298. package/dist/shapes/types.d.ts +55 -0
  299. package/dist/shapes/types.d.ts.map +1 -0
  300. package/dist/shapes/types.js +11 -0
  301. package/dist/shapes/types.js.map +1 -0
  302. package/dist/shared-layout/index.d.ts +40 -0
  303. package/dist/shared-layout/index.d.ts.map +1 -0
  304. package/dist/shared-layout/index.js +267 -0
  305. package/dist/shared-layout/index.js.map +1 -0
  306. package/dist/shared-layout/native.d.ts +15 -0
  307. package/dist/shared-layout/native.d.ts.map +1 -0
  308. package/dist/shared-layout/native.js +79 -0
  309. package/dist/shared-layout/native.js.map +1 -0
  310. package/dist/shared-layout/timing.d.ts +9 -0
  311. package/dist/shared-layout/timing.d.ts.map +1 -0
  312. package/dist/shared-layout/timing.js +68 -0
  313. package/dist/shared-layout/timing.js.map +1 -0
  314. package/dist/shared-navigation/entry.d.ts +51 -0
  315. package/dist/shared-navigation/entry.d.ts.map +1 -0
  316. package/dist/shared-navigation/entry.js +619 -0
  317. package/dist/shared-navigation/entry.js.map +1 -0
  318. package/dist/shared-navigation/index.d.ts +58 -0
  319. package/dist/shared-navigation/index.d.ts.map +1 -0
  320. package/dist/shared-navigation/index.js +318 -0
  321. package/dist/shared-navigation/index.js.map +1 -0
  322. package/dist/shared-navigation/return-signal.d.ts +16 -0
  323. package/dist/shared-navigation/return-signal.d.ts.map +1 -0
  324. package/dist/shared-navigation/return-signal.js +35 -0
  325. package/dist/shared-navigation/return-signal.js.map +1 -0
  326. package/dist/shared-navigation/return-target.d.ts +32 -0
  327. package/dist/shared-navigation/return-target.d.ts.map +1 -0
  328. package/dist/shared-navigation/return-target.js +168 -0
  329. package/dist/shared-navigation/return-target.js.map +1 -0
  330. package/dist/shared-navigation/scope.d.ts +4 -0
  331. package/dist/shared-navigation/scope.d.ts.map +1 -0
  332. package/dist/shared-navigation/scope.js +2 -0
  333. package/dist/shared-navigation/scope.js.map +1 -0
  334. package/dist/shared-navigation/targets.d.ts +6 -0
  335. package/dist/shared-navigation/targets.d.ts.map +1 -0
  336. package/dist/shared-navigation/targets.js +36 -0
  337. package/dist/shared-navigation/targets.js.map +1 -0
  338. package/dist/size-layout.d.ts +19 -0
  339. package/dist/size-layout.d.ts.map +1 -0
  340. package/dist/size-layout.js +216 -0
  341. package/dist/size-layout.js.map +1 -0
  342. package/dist/size.d.ts +19 -0
  343. package/dist/size.d.ts.map +1 -0
  344. package/dist/size.js +251 -0
  345. package/dist/size.js.map +1 -0
  346. package/dist/spring.d.ts +2 -0
  347. package/dist/spring.d.ts.map +1 -1
  348. package/dist/spring.js +11 -0
  349. package/dist/spring.js.map +1 -1
  350. package/dist/svg-path.d.ts +18 -0
  351. package/dist/svg-path.d.ts.map +1 -1
  352. package/dist/svg-path.js +3 -2
  353. package/dist/svg-path.js.map +1 -1
  354. package/dist/testing/clock.d.ts +40 -0
  355. package/dist/testing/clock.d.ts.map +1 -0
  356. package/dist/testing/clock.js +116 -0
  357. package/dist/testing/clock.js.map +1 -0
  358. package/dist/testing/handoff-recorder.d.ts +8 -0
  359. package/dist/testing/handoff-recorder.d.ts.map +1 -0
  360. package/dist/testing/handoff-recorder.js +77 -0
  361. package/dist/testing/handoff-recorder.js.map +1 -0
  362. package/dist/testing/index.d.ts +5 -0
  363. package/dist/testing/index.d.ts.map +1 -0
  364. package/dist/testing/index.js +5 -0
  365. package/dist/testing/index.js.map +1 -0
  366. package/dist/testing/native.d.ts +46 -0
  367. package/dist/testing/native.d.ts.map +1 -0
  368. package/dist/testing/native.js +313 -0
  369. package/dist/testing/native.js.map +1 -0
  370. package/dist/testing/presentation.d.ts +11 -0
  371. package/dist/testing/presentation.d.ts.map +1 -0
  372. package/dist/testing/presentation.js +45 -0
  373. package/dist/testing/presentation.js.map +1 -0
  374. package/dist/testing/replay.d.ts +39 -0
  375. package/dist/testing/replay.d.ts.map +1 -0
  376. package/dist/testing/replay.js +99 -0
  377. package/dist/testing/replay.js.map +1 -0
  378. package/dist/testing/scroll-handoff-native.d.ts +10 -0
  379. package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
  380. package/dist/testing/scroll-handoff-native.js +151 -0
  381. package/dist/testing/scroll-handoff-native.js.map +1 -0
  382. package/dist/testing/scroll-handoff.d.ts +25 -0
  383. package/dist/testing/scroll-handoff.d.ts.map +1 -0
  384. package/dist/testing/scroll-handoff.js +127 -0
  385. package/dist/testing/scroll-handoff.js.map +1 -0
  386. package/dist/testing/sensors.d.ts +13 -0
  387. package/dist/testing/sensors.d.ts.map +1 -0
  388. package/dist/testing/sensors.js +26 -0
  389. package/dist/testing/sensors.js.map +1 -0
  390. package/dist/testing/trace.d.ts +101 -0
  391. package/dist/testing/trace.d.ts.map +1 -0
  392. package/dist/testing/trace.js +263 -0
  393. package/dist/testing/trace.js.map +1 -0
  394. package/dist/timed-animation.d.ts +38 -0
  395. package/dist/timed-animation.d.ts.map +1 -0
  396. package/dist/timed-animation.js +177 -0
  397. package/dist/timed-animation.js.map +1 -0
  398. package/dist/track.d.ts +3 -0
  399. package/dist/track.d.ts.map +1 -1
  400. package/dist/track.js +281 -40
  401. package/dist/track.js.map +1 -1
  402. package/dist/transition.d.ts +54 -2
  403. package/dist/transition.d.ts.map +1 -1
  404. package/dist/transition.js +128 -8
  405. package/dist/transition.js.map +1 -1
  406. package/dist/types.d.ts +10 -1
  407. package/dist/types.d.ts.map +1 -1
  408. package/dist/value-observers.d.ts +22 -0
  409. package/dist/value-observers.d.ts.map +1 -0
  410. package/dist/value-observers.js +122 -0
  411. package/dist/value-observers.js.map +1 -0
  412. package/dist/value-track.d.ts +13 -0
  413. package/dist/value-track.d.ts.map +1 -0
  414. package/dist/value-track.js +59 -0
  415. package/dist/value-track.js.map +1 -0
  416. package/dist/vue/index.d.ts +33 -3
  417. package/dist/vue/index.d.ts.map +1 -1
  418. package/dist/vue/index.js +118 -3
  419. package/dist/vue/index.js.map +1 -1
  420. package/dist/zoomable.d.ts +1 -1
  421. package/dist/zoomable.d.ts.map +1 -1
  422. package/package.json +68 -3
  423. package/platforms/android/include.gradle +10 -0
  424. package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
  425. package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +151 -0
  426. package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +210 -0
  427. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
  428. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
  429. package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
  430. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
  431. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
  432. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
  433. package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
  434. package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
  435. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
  436. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
  437. package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
  438. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
  439. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
  440. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
  441. package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
  442. package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
  443. package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
  444. package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
  445. package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
  446. package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
  447. package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
  448. package/platforms/android/proguard-rules.pro +20 -0
  449. package/platforms/ios/build.xcconfig +1 -1
  450. package/platforms/ios/src/JoltBlur.h +14 -0
  451. package/platforms/ios/src/JoltBlur.m +86 -0
  452. package/platforms/ios/src/JoltCircleMath.h +183 -0
  453. package/platforms/ios/src/JoltCircleWorld.h +17 -0
  454. package/platforms/ios/src/JoltCircleWorld.m +203 -0
  455. package/platforms/ios/src/JoltGestureSession.h +23 -0
  456. package/platforms/ios/src/JoltGestureSession.m +251 -0
  457. package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
  458. package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
  459. package/platforms/ios/src/JoltLiveSpring.h +29 -0
  460. package/platforms/ios/src/JoltLiveSpring.m +243 -0
  461. package/platforms/ios/src/JoltMotionProbe.h +9 -0
  462. package/platforms/ios/src/JoltMotionProbe.m +72 -0
  463. package/platforms/ios/src/JoltReorderSession.h +15 -0
  464. package/platforms/ios/src/JoltReorderSession.m +205 -0
  465. package/platforms/ios/src/JoltScrollHeader.h +13 -0
  466. package/platforms/ios/src/JoltScrollHeader.m +93 -0
  467. package/platforms/ios/src/JoltSensorMath.h +39 -0
  468. package/platforms/ios/src/JoltSensorSource.h +13 -0
  469. package/platforms/ios/src/JoltSensorSource.m +201 -0
  470. package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
  471. package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
  472. package/platforms/ios/src/JoltSpringState.h +35 -0
  473. package/platforms/ios/src/module.modulemap +10 -0
  474. package/src/android-plugin.d.ts +463 -0
  475. package/src/animate.ts +129 -15
  476. package/src/blur/index.ts +195 -0
  477. package/src/blur/native.ts +70 -0
  478. package/src/blur/types.ts +32 -0
  479. package/src/bottom-sheet/geometry.ts +84 -0
  480. package/src/bottom-sheet/index.ts +536 -0
  481. package/src/bottom-sheet/native.ts +214 -0
  482. package/src/config.ts +39 -1
  483. package/src/decay.ts +9 -0
  484. package/src/drag.ts +67 -21
  485. package/src/driver/android-gradient.ts +116 -0
  486. package/src/driver/android-particles.ts +118 -0
  487. package/src/driver/android.ts +69 -1
  488. package/src/driver/frame.ts +10 -0
  489. package/src/driver/index.ts +15 -0
  490. package/src/driver/ios-gradient.ts +136 -0
  491. package/src/driver/ios-layout.ts +63 -0
  492. package/src/driver/ios-scroll-delegate.ts +23 -0
  493. package/src/driver/ios.ts +70 -17
  494. package/src/easing.ts +21 -1
  495. package/src/engine.ts +226 -59
  496. package/src/gesture-native.ts +139 -0
  497. package/src/gestures/index.ts +365 -0
  498. package/src/glass/index.ts +218 -0
  499. package/src/gradient-binding.ts +158 -0
  500. package/src/gradient.ts +663 -0
  501. package/src/gravity.ts +107 -0
  502. package/src/haptics.ts +106 -28
  503. package/src/image-effect.ts +10 -2
  504. package/src/index.ts +59 -7
  505. package/src/inspector/index.ts +523 -0
  506. package/src/inspector/plot.ts +27 -0
  507. package/src/inspector/probe.ts +50 -0
  508. package/src/inspector/tuning.ts +51 -0
  509. package/src/interactive-navigation/index.ts +398 -0
  510. package/src/ios-plugin.d.ts +279 -0
  511. package/src/keyboard.ts +231 -7
  512. package/src/layout.ts +408 -0
  513. package/src/live-spring-driver.ts +181 -0
  514. package/src/mixer.ts +306 -0
  515. package/src/motion-scope.ts +53 -6
  516. package/src/motion-states.ts +149 -42
  517. package/src/motion-value.ts +1289 -0
  518. package/src/native/index.ts +30 -0
  519. package/src/native-properties.ts +188 -0
  520. package/src/native-property-driver.ts +123 -0
  521. package/src/native-property.ts +366 -0
  522. package/src/particles.ts +18 -17
  523. package/src/path.ts +2 -1
  524. package/src/physics/index.ts +443 -0
  525. package/src/physics/native.ts +110 -0
  526. package/src/playback-group.ts +17 -1
  527. package/src/playback.ts +41 -0
  528. package/src/predictive-back/index.ts +280 -0
  529. package/src/predictive-back/presentation.ts +6 -0
  530. package/src/reorder/handle.ts +9 -0
  531. package/src/reorder/index.ts +243 -0
  532. package/src/reorder/list-view.ts +262 -0
  533. package/src/reorder/model.ts +47 -0
  534. package/src/reorder/surface.ts +10 -0
  535. package/src/reorder/types.ts +87 -0
  536. package/src/sampling.ts +173 -0
  537. package/src/scene-appearance.ts +92 -0
  538. package/src/scene-camera.ts +30 -0
  539. package/src/scene-shader.ts +139 -0
  540. package/src/scroll-header/geometry.ts +88 -0
  541. package/src/scroll-header/index.ts +504 -0
  542. package/src/scroll-header/native.ts +89 -0
  543. package/src/sensors/index.ts +246 -0
  544. package/src/sensors/native.ts +72 -0
  545. package/src/sequence.ts +209 -20
  546. package/src/shapes/android.ts +63 -0
  547. package/src/shapes/index.ts +267 -0
  548. package/src/shapes/ios.ts +194 -0
  549. package/src/shapes/native.ts +27 -0
  550. package/src/shapes/path.ts +127 -0
  551. package/src/shapes/types.ts +63 -0
  552. package/src/shared-layout/index.ts +343 -0
  553. package/src/shared-layout/native.ts +138 -0
  554. package/src/shared-layout/timing.ts +87 -0
  555. package/src/shared-navigation/entry.ts +695 -0
  556. package/src/shared-navigation/index.ts +414 -0
  557. package/src/shared-navigation/return-signal.ts +41 -0
  558. package/src/shared-navigation/return-target.ts +197 -0
  559. package/src/shared-navigation/scope.ts +3 -0
  560. package/src/shared-navigation/targets.ts +38 -0
  561. package/src/size-layout.ts +237 -0
  562. package/src/size.ts +302 -0
  563. package/src/spring.ts +18 -0
  564. package/src/svg-path.ts +8 -3
  565. package/src/testing/clock.ts +128 -0
  566. package/src/testing/handoff-recorder.ts +98 -0
  567. package/src/testing/index.ts +4 -0
  568. package/src/testing/native.ts +386 -0
  569. package/src/testing/presentation.ts +46 -0
  570. package/src/testing/replay.ts +149 -0
  571. package/src/testing/scroll-handoff-native.ts +201 -0
  572. package/src/testing/scroll-handoff.ts +140 -0
  573. package/src/testing/sensors.ts +41 -0
  574. package/src/testing/trace.ts +340 -0
  575. package/src/timed-animation.ts +192 -0
  576. package/src/track.ts +334 -38
  577. package/src/transition.ts +197 -9
  578. package/src/types.ts +11 -1
  579. package/src/value-observers.ts +147 -0
  580. package/src/value-track.ts +71 -0
  581. package/src/vue/index.ts +147 -1
  582. package/src/zoomable.ts +1 -1
@@ -0,0 +1,181 @@
1
+ import { isAndroid, type View } from '@nativescript/core'
2
+ import type { NumericProperty } from './properties.js'
3
+ import { retainInteractiveLayout } from './driver/ios-layout.js'
4
+
5
+ export interface LiveMapping {
6
+ input: readonly number[]
7
+ output: readonly number[]
8
+ clamp: boolean
9
+ }
10
+ export interface LiveSpringPhysics {
11
+ stiffness: number
12
+ damping: number
13
+ mass: number
14
+ restDelta: number
15
+ restSpeed: number
16
+ }
17
+ export interface LiveInput {
18
+ value: number
19
+ running: boolean
20
+ elapsed: number
21
+ duration: number
22
+ delay: number
23
+ repeat: number
24
+ reverse: boolean
25
+ to: number
26
+ times: readonly number[]
27
+ values: readonly number[]
28
+ }
29
+ export interface LiveBinding {
30
+ value(): number
31
+ layers(inputs: readonly LiveInput[]): void
32
+ cancel(): void
33
+ }
34
+ export interface LiveNode {
35
+ position(): number
36
+ velocity(): number
37
+ moving(): boolean
38
+ follow(source: LiveNode, maps: readonly LiveMapping[]): void
39
+ update(input: LiveInput): void
40
+ reduced(value: boolean): void
41
+ paused(value: boolean): void
42
+ bind(view: View, property: NumericProperty, maps: readonly LiveMapping[]): LiveBinding
43
+ dispose(): void
44
+ }
45
+ export interface LiveSpringDriver {
46
+ create(initial: number, physics: LiveSpringPhysics, reduced: boolean): LiveNode
47
+ sync(view: View): void
48
+ }
49
+ let override: LiveSpringDriver | undefined
50
+ export function setLiveSpringDriver(driver: LiveSpringDriver | undefined) {
51
+ override = driver
52
+ }
53
+ export function liveSpringDriver(): LiveSpringDriver {
54
+ if (override) return override
55
+ if (!available())
56
+ throw new Error(
57
+ 'springValue() needs the Jolt native classes. Rebuild the native app after upgrading Jolt.',
58
+ )
59
+ return nativeDriver
60
+ }
61
+ function available() {
62
+ return isAndroid
63
+ ? typeof org !== 'undefined' &&
64
+ typeof org.rafaelaugusto.jolt.LiveSpring === 'function'
65
+ : typeof JoltLiveSpring !== 'undefined'
66
+ }
67
+ export function syncLiveSprings(view: View) {
68
+ if (override) override.sync(view)
69
+ else if (available() && view.nativeViewProtected) nativeDriver.sync(view)
70
+ }
71
+ const handles = new WeakMap<
72
+ LiveNode,
73
+ org.rafaelaugusto.jolt.LiveSpring | JoltLiveSpring
74
+ >()
75
+ /** Internal native input connection; never exposes handles through the public value API. */
76
+ export function nativeLiveNode(node: LiveNode) {
77
+ const handle = handles.get(node)
78
+ if (!handle) throw new Error('A gesture needs a native live value node.')
79
+ return handle
80
+ }
81
+ const nativeDriver: LiveSpringDriver = {
82
+ create(initial, physics, reduced) {
83
+ const { stiffness, damping, mass, restDelta, restSpeed } = physics
84
+ if (isAndroid) {
85
+ const native = new org.rafaelaugusto.jolt.LiveSpring(
86
+ initial,
87
+ stiffness,
88
+ damping,
89
+ mass,
90
+ restDelta,
91
+ restSpeed,
92
+ reduced,
93
+ )
94
+ const node: LiveNode = {
95
+ position: () => native.getPosition(),
96
+ velocity: () => native.getVelocity(),
97
+ moving: () => native.isMoving(),
98
+ follow: (source, maps) =>
99
+ native.follow(
100
+ handles.get(source) as org.rafaelaugusto.jolt.LiveSpring,
101
+ JSON.stringify(maps),
102
+ ),
103
+ update: (input) =>
104
+ input.running
105
+ ? native.updateInput(JSON.stringify(input))
106
+ : native.setTarget(input.value),
107
+ reduced: (value) => native.setReduced(value),
108
+ paused: (value) => native.setPaused(value),
109
+ bind(view, property, maps) {
110
+ const binding = native.bind(
111
+ view.nativeViewProtected,
112
+ property,
113
+ JSON.stringify(maps),
114
+ )
115
+ return {
116
+ value: () => binding.getValue(),
117
+ layers: (inputs) => binding.setLayers(JSON.stringify(inputs)),
118
+ cancel: () => binding.cancel(),
119
+ }
120
+ },
121
+ dispose: () => native.dispose(),
122
+ }
123
+ handles.set(node, native)
124
+ return node
125
+ }
126
+ const native = JoltLiveSpring.createStiffnessDampingMassRestDeltaRestSpeedReduced(
127
+ initial,
128
+ stiffness,
129
+ damping,
130
+ mass,
131
+ restDelta,
132
+ restSpeed,
133
+ reduced,
134
+ )
135
+ const node: LiveNode = {
136
+ position: () => native.position,
137
+ velocity: () => native.velocity,
138
+ moving: () => native.moving,
139
+ follow: (source, maps) =>
140
+ native.followMappings(
141
+ handles.get(source) as JoltLiveSpring,
142
+ JSON.stringify(maps),
143
+ ),
144
+ update: (input) =>
145
+ input.running
146
+ ? native.updateInput(JSON.stringify(input))
147
+ : native.setTarget(input.value),
148
+ reduced: (value) => native.setReduced(value),
149
+ paused: (value) => native.setPaused(value),
150
+ bind(view, property, maps) {
151
+ const releaseLayout = retainInteractiveLayout(view)
152
+ let binding: JoltLiveSpringBinding
153
+ try {
154
+ binding = native.bindPropertyMappings(
155
+ view.nativeViewProtected,
156
+ property,
157
+ JSON.stringify(maps),
158
+ )
159
+ } catch (error) {
160
+ releaseLayout()
161
+ throw error
162
+ }
163
+ return {
164
+ value: () => binding.value,
165
+ layers: (inputs) => binding.setLayers(JSON.stringify(inputs)),
166
+ cancel: () => {
167
+ binding.cancel()
168
+ releaseLayout()
169
+ },
170
+ }
171
+ },
172
+ dispose: () => native.dispose(),
173
+ }
174
+ handles.set(node, native)
175
+ return node
176
+ },
177
+ sync(view) {
178
+ if (isAndroid) org.rafaelaugusto.jolt.LiveSpring.sync(view.nativeViewProtected)
179
+ else JoltLiveSpring.sync(view.nativeViewProtected)
180
+ },
181
+ }
package/src/mixer.ts ADDED
@@ -0,0 +1,306 @@
1
+ import type { View } from '@nativescript/core'
2
+ import { getDriver } from './driver/index.js'
3
+ import { readValue, writeValue, type Property } from './properties.js'
4
+ import type { Track } from './track.js'
5
+ import type { LiveInput } from './live-spring-driver.js'
6
+
7
+ /** The channel of regular animations; layers are named next to it. */
8
+ export const BASE = ''
9
+
10
+ const SAMPLES_PER_SECOND = 60
11
+ const MAX_SAMPLES = 6000
12
+ /** Endless channels loop natively over the least common multiple of their periods, up to this. */
13
+ const MAX_LOOP = 30000
14
+ /** Beyond it, the composition is played in windows and sampled again at each one. */
15
+ const WINDOW = 4000
16
+
17
+ export const multiplies = (property: Property) =>
18
+ property === 'opacity' || property === 'scaleX' || property === 'scaleY'
19
+ export const identity = (property: Property) => (multiplies(property) ? 1 : 0)
20
+ export const layerable = (property: Property) =>
21
+ multiplies(property) ||
22
+ property === 'x' ||
23
+ property === 'y' ||
24
+ property === 'rotate' ||
25
+ property === 'rotateX' ||
26
+ property === 'rotateY'
27
+
28
+ interface Channel {
29
+ track: Track
30
+ anchor: number
31
+ offset: number
32
+ paused: boolean
33
+ onEnd: (finished: boolean) => void
34
+ timer?: () => void
35
+ }
36
+
37
+ /** What the engine holds instead of a driver handle while a property is mixed. */
38
+ export class MixHandle {
39
+ constructor(
40
+ readonly mix: Mix,
41
+ readonly key: string,
42
+ ) {}
43
+ elapsed() {
44
+ return this.mix.elapsed(this.key)
45
+ }
46
+ control(position: number, paused: boolean) {
47
+ this.mix.control(this.key, position, paused)
48
+ }
49
+ }
50
+
51
+ const mixes = new WeakMap<View, Map<Property, Mix>>()
52
+
53
+ export function mixOf(view: View, property: Property): Mix | undefined {
54
+ return mixes.get(view)?.get(property)
55
+ }
56
+
57
+ export function mixesOf(view: View): Mix[] {
58
+ return [...(mixes.get(view)?.values() ?? [])]
59
+ }
60
+
61
+ export function mixFor(view: View, property: Property): Mix {
62
+ let properties = mixes.get(view)
63
+ if (!properties) mixes.set(view, (properties = new Map()))
64
+ let mix = properties.get(property)
65
+ if (!mix) properties.set(property, (mix = new Mix(view, property)))
66
+ return mix
67
+ }
68
+
69
+ /** One property of one view: a base and named layers, played natively as one composite track. */
70
+ export class Mix {
71
+ private live: { read(): number; layers(inputs: readonly LiveInput[]): void } | undefined
72
+ private readonly rests = new Map<string, number>()
73
+ private readonly channels = new Map<string, Channel>()
74
+ private native: unknown
75
+ private generation = 0
76
+
77
+ constructor(
78
+ readonly view: View,
79
+ readonly property: Property,
80
+ ) {
81
+ this.rests.set(BASE, readValue(view, property))
82
+ }
83
+
84
+ rest(key: string): number {
85
+ if (key === BASE && this.live) return this.live.read()
86
+ return (
87
+ this.rests.get(key) ??
88
+ (key === BASE ? readValue(this.view, this.property) : identity(this.property))
89
+ )
90
+ }
91
+
92
+ attachLive(base: {
93
+ read(): number
94
+ layers(inputs: readonly LiveInput[]): void
95
+ }): () => void {
96
+ this.live = base
97
+ this.compose()
98
+ return () => {
99
+ if (this.live !== base) return
100
+ this.rests.set(BASE, base.read())
101
+ this.live = undefined
102
+ this.compose()
103
+ }
104
+ }
105
+
106
+ setRest(key: string, value: number) {
107
+ this.rests.set(key, value)
108
+ this.compose()
109
+ }
110
+
111
+ adopt(
112
+ key: string,
113
+ track: Track,
114
+ startedAt: number,
115
+ onEnd: (finished: boolean) => void,
116
+ ) {
117
+ this.channels.get(key)?.timer?.()
118
+ const channel: Channel = { track, anchor: startedAt, offset: 0, paused: false, onEnd }
119
+ this.channels.set(key, channel)
120
+ this.schedule(key, channel)
121
+ this.compose()
122
+ return new MixHandle(this, key)
123
+ }
124
+
125
+ elapsed(key: string, now = getDriver().now()): number {
126
+ const channel = this.channels.get(key)
127
+ if (!channel) return 0
128
+ return channel.paused ? channel.offset : channel.offset + now - channel.anchor
129
+ }
130
+
131
+ control(key: string, position: number, paused: boolean) {
132
+ const channel = this.channels.get(key)
133
+ if (!channel) return
134
+ channel.timer?.()
135
+ channel.timer = undefined
136
+ channel.offset = position
137
+ channel.anchor = getDriver().now()
138
+ channel.paused = paused
139
+ if (!paused) this.schedule(key, channel)
140
+ this.compose()
141
+ }
142
+
143
+ /**
144
+ * A channel leaves: replaced, stopped or done. A stopped layer takes its contribution
145
+ * with it; anything else rests where it is.
146
+ */
147
+ detach(key: string, stopped: boolean) {
148
+ const channel = this.channels.get(key)
149
+ if (!channel) return
150
+ const value = channel.track.valueAt(this.elapsed(key))
151
+ channel.timer?.()
152
+ this.channels.delete(key)
153
+ this.rests.set(key, stopped && key !== BASE ? identity(this.property) : value)
154
+ this.compose()
155
+ }
156
+
157
+ /** Everything stops: what is on screen becomes the base, and layers are cleared. */
158
+ freeze() {
159
+ const value = this.value()
160
+ for (const [key, channel] of [...this.channels]) {
161
+ channel.timer?.()
162
+ this.channels.delete(key)
163
+ channel.onEnd(false)
164
+ }
165
+ this.rests.clear()
166
+ this.rests.set(BASE, value)
167
+ this.compose()
168
+ }
169
+
170
+ /** The composed value on screen at `time`. */
171
+ value(time = getDriver().now()): number {
172
+ const now = getDriver().now()
173
+ let result = this.part(BASE, time, now)
174
+ const keys = new Set([...this.rests.keys(), ...this.channels.keys()])
175
+ for (const key of keys) {
176
+ if (key === BASE) continue
177
+ const part = this.part(key, time, now)
178
+ result = multiplies(this.property) ? result * part : result + part
179
+ }
180
+ return result
181
+ }
182
+
183
+ private part(key: string, time: number, now: number) {
184
+ const channel = this.channels.get(key)
185
+ if (!channel) return this.rest(key)
186
+ const elapsed = channel.paused
187
+ ? channel.offset
188
+ : channel.offset + now - channel.anchor + (time - now)
189
+ return channel.track.valueAt(elapsed)
190
+ }
191
+
192
+ private schedule(key: string, channel: Channel) {
193
+ const remaining = channel.track.end - this.elapsed(key)
194
+ if (!Number.isFinite(remaining)) return
195
+ channel.timer = getDriver().after(Math.max(0, remaining), () => {
196
+ if (this.channels.get(key) !== channel) return
197
+ this.channels.delete(key)
198
+ this.rests.set(key, channel.track.valueAt(channel.track.end))
199
+ channel.onEnd(true)
200
+ this.compose()
201
+ })
202
+ }
203
+
204
+ /** Samples the composition from now and plays it as one native track. */
205
+ private compose() {
206
+ const driver = getDriver()
207
+ const now = driver.now()
208
+ const instance = ++this.generation
209
+ const previous = this.native
210
+ this.native = undefined
211
+
212
+ if (this.live) {
213
+ if (previous !== undefined) driver.stop(this.view, previous)
214
+ const layers: LiveInput[] = []
215
+ for (const key of new Set([...this.rests.keys(), ...this.channels.keys()])) {
216
+ if (key === BASE) continue
217
+ const channel = this.channels.get(key)
218
+ const value = this.part(key, now, now)
219
+ const track = channel?.track
220
+ layers.push({
221
+ value,
222
+ running: !!channel && !channel.paused,
223
+ elapsed: this.elapsed(key, now),
224
+ duration: track?.duration ?? 0,
225
+ delay: track?.delay ?? 0,
226
+ repeat: track ? (Number.isFinite(track.repeat) ? track.repeat : -1) : 0,
227
+ reverse: track?.reverse ?? false,
228
+ to: track?.to ?? value,
229
+ times: track?.times ?? [],
230
+ values: track?.values ?? [],
231
+ })
232
+ }
233
+ this.live.layers(layers)
234
+ return
235
+ }
236
+
237
+ let finite = 0
238
+ const periods: number[] = []
239
+ for (const [key, channel] of this.channels) {
240
+ if (channel.paused) continue
241
+ const elapsed = this.elapsed(key, now)
242
+ const { track } = channel
243
+ if (Number.isFinite(track.end)) finite = Math.max(finite, track.end - elapsed)
244
+ else if (elapsed < track.delay) finite = Math.max(finite, track.delay - elapsed)
245
+ else periods.push(Math.max(1, Math.round(track.duration * (track.reverse ? 2 : 1))))
246
+ }
247
+
248
+ if (previous !== undefined) driver.stop(this.view, previous)
249
+ const loop = finite <= 0 && periods.length ? leastCommonMultiple(periods) : undefined
250
+ if (finite <= 0 && !periods.length) {
251
+ writeValue(this.view, this.property, this.value(now))
252
+ driver.sync?.(this.view)
253
+ this.dissolve()
254
+ return
255
+ }
256
+
257
+ const span = finite > 0 ? finite : (loop ?? WINDOW)
258
+ const steps = Math.max(
259
+ 1,
260
+ Math.min(MAX_SAMPLES, Math.ceil((span / 1000) * SAMPLES_PER_SECOND)),
261
+ )
262
+ const times = Array.from({ length: steps + 1 }, (_, i) => i / steps)
263
+ const values = times.map((time) => this.value(now + time * span))
264
+ const endless = loop !== undefined
265
+ const at = (elapsed: number) =>
266
+ this.value(now + (endless ? elapsed % span : Math.min(Math.max(elapsed, 0), span)))
267
+ const track: Track = {
268
+ property: this.property,
269
+ delay: 0,
270
+ duration: span,
271
+ repeat: endless ? Infinity : 0,
272
+ reverse: false,
273
+ times,
274
+ values,
275
+ to: endless ? values[0]! : values[steps]!,
276
+ end: endless ? Infinity : span,
277
+ arrival: endless ? Infinity : span,
278
+ valueAt: at,
279
+ velocityAt: (elapsed) => (at(elapsed + 0.5) - at(elapsed - 0.5)) * 1000,
280
+ }
281
+ writeValue(this.view, this.property, track.to)
282
+ this.native = driver.play(this.view, track, now, (finished = true) => {
283
+ if (instance !== this.generation || !finished) return
284
+ this.native = undefined
285
+ this.compose()
286
+ })
287
+ }
288
+
289
+ private dissolve() {
290
+ if (this.live || this.channels.size) return
291
+ for (const [key, value] of this.rests)
292
+ if (key !== BASE && value !== identity(this.property)) return
293
+ const properties = mixes.get(this.view)
294
+ if (properties?.get(this.property) === this) properties.delete(this.property)
295
+ }
296
+ }
297
+
298
+ function leastCommonMultiple(periods: readonly number[]): number | undefined {
299
+ const gcd = (a: number, b: number): number => (b ? gcd(b, a % b) : a)
300
+ let result = periods[0]!
301
+ for (const period of periods.slice(1)) {
302
+ result = (result / gcd(result, period)) * period
303
+ if (result > MAX_LOOP) return undefined
304
+ }
305
+ return result
306
+ }
@@ -1,7 +1,11 @@
1
1
  import { animate, decay } from './animate.js'
2
2
  import { press } from './press.js'
3
3
  import { drag } from './drag.js'
4
- import { sequence } from './sequence.js'
4
+ import { gradient } from './gradient.js'
5
+ import { animateLayout, type LayoutOptions } from './layout.js'
6
+ import { animateSize, type SizeDimensions, type SizeOptions } from './size.js'
7
+ import type { SpringName } from './transition.js'
8
+ import { sequence, timeline } from './sequence.js'
5
9
  import {
6
10
  motionStates,
7
11
  type MotionState,
@@ -31,19 +35,24 @@ export interface MotionScope {
31
35
  readonly suspended: boolean
32
36
  /** Owned handles/subscriptions, including suspended subscription factories. */
33
37
  readonly size: number
38
+ animateLayout: typeof animateLayout
39
+ animateSize: typeof animateSize
34
40
  animate: typeof animate
35
41
  decay: typeof decay
36
42
  sequence: typeof sequence
43
+ timeline: typeof timeline
37
44
  press: typeof press
38
45
  drag: typeof drag
46
+ /** Removed with the scope; suspension holds bindings until resume and stops concrete playback. */
47
+ gradient: typeof gradient
39
48
  states<
40
- T extends Record<string, Target>,
49
+ T extends Record<string, Target | null>,
41
50
  const S extends Record<string, MotionState<keyof T>>,
42
51
  >(
43
52
  targets: T,
44
53
  definitions: MotionDefinitions<T, S>,
45
- options?: Omit<MotionStatesOptions, 'scope'>,
46
- ): MotionStates<Extract<keyof S, string>>
54
+ options?: Omit<MotionStatesOptions<Extract<keyof T, string>>, 'scope'>,
55
+ ): MotionStates<Extract<keyof S, string>, Extract<keyof T, string>>
47
56
  /** Adopt an existing handle. Completed animations are released automatically. */
48
57
  add<T extends MotionResource>(resource: T): T
49
58
  /** Attach a subscription, detach on suspension, and recreate on resume. */
@@ -175,12 +184,37 @@ export function motionScope(): MotionScope {
175
184
  get size() {
176
185
  return entries.size
177
186
  },
178
- animate(...args) {
179
- return startOwned(() => animate(...args))
187
+ animateLayout(
188
+ container: Target,
189
+ changeOrOptions?: (() => void) | LayoutOptions | SpringName,
190
+ options?: LayoutOptions | SpringName,
191
+ ) {
192
+ return startOwned(() =>
193
+ typeof changeOrOptions === 'function'
194
+ ? animateLayout(container, changeOrOptions, options)
195
+ : animateLayout(container, changeOrOptions),
196
+ )
197
+ },
198
+ animate: ((...args: Parameters<typeof animate>) =>
199
+ startOwned(() => animate(...args))) as typeof animate,
200
+ animateSize(
201
+ target: Target,
202
+ dimensions: SizeDimensions,
203
+ changeOrOptions?: (() => void) | SizeOptions | SpringName,
204
+ options?: SizeOptions | SpringName,
205
+ ) {
206
+ return startOwned(() =>
207
+ typeof changeOrOptions === 'function'
208
+ ? animateSize(target, dimensions, changeOrOptions, options)
209
+ : animateSize(target, dimensions, changeOrOptions),
210
+ )
180
211
  },
181
212
  decay(...args) {
182
213
  return startOwned(() => decay(...args))
183
214
  },
215
+ timeline(...args) {
216
+ return startOwned(() => timeline(...args))
217
+ },
184
218
  sequence(...args) {
185
219
  return startOwned(() => sequence(...args))
186
220
  },
@@ -190,6 +224,19 @@ export function motionScope(): MotionScope {
190
224
  drag(...args) {
191
225
  return startOwned(() => drag(...args))
192
226
  },
227
+ gradient(target, options) {
228
+ assertActive()
229
+ const made = gradient(target, options)
230
+ scope.add({
231
+ get paused() {
232
+ return made.suspended
233
+ },
234
+ pause: () => made.suspend(),
235
+ play: () => made.resume(),
236
+ dispose: () => made.remove(),
237
+ })
238
+ return made
239
+ },
193
240
  states(targets, definitions, options) {
194
241
  return startOwned(() => motionStates(targets, definitions, options))
195
242
  },