@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,118 @@
1
+ import { Application, Color, Utils, type View } from '@nativescript/core'
2
+ import { onReducedMotion, reducedMotion } from '../config.js'
3
+ import type { ParticleSettings } from '../particles.js'
4
+
5
+ type NativeEmitter = org.rafaelaugusto.jolt.ParticleEmitter
6
+ const live = new WeakMap<View, { emitter?: NativeEmitter; burst?: NativeEmitter }>()
7
+
8
+ /** Internal diagnostic seam for native conformance, not a public animation API. */
9
+ export function currentAndroidParticles(view: View, overlay = false) {
10
+ return live.get(view)?.[overlay ? 'burst' : 'emitter']
11
+ }
12
+
13
+ export function androidParticles(
14
+ view: View,
15
+ settings: ParticleSettings,
16
+ overlay: boolean,
17
+ owners: WeakMap<View, () => void>,
18
+ ): () => void {
19
+ let stopped = false,
20
+ queued = false
21
+ let emitter: NativeEmitter | undefined,
22
+ target: android.view.View | undefined,
23
+ unwatch: (() => void) | undefined
24
+ const key = overlay ? 'burst' : 'emitter'
25
+ const stop = () => {
26
+ if (stopped) return
27
+ stopped = true
28
+ view.off('loaded', schedule)
29
+ view.off('layoutChanged', schedule)
30
+ view.off('unloaded', stop)
31
+ view.style.off('borderTopLeftRadiusChange', schedule)
32
+ Application.off(Application.suspendEvent, stop)
33
+ unwatch?.()
34
+ unwatch = undefined
35
+ if (owners.get(view) === stop) owners.delete(view)
36
+ const active = live.get(view)
37
+ if (active && active[key] === emitter) {
38
+ delete active[key]
39
+ if (!active.emitter && !active.burst) live.delete(view)
40
+ }
41
+ const native = emitter
42
+ emitter = target = undefined
43
+ native?.stop()
44
+ }
45
+ const update = () => {
46
+ if (!view.isLoaded) return
47
+ if (reducedMotion()) return stop()
48
+ const native = view.nativeViewProtected as android.view.View | undefined
49
+ if (target && target !== native) return stop()
50
+ if (emitter) {
51
+ emitter.refresh(
52
+ (typeof view.borderRadius === 'number' ? view.borderRadius : 0) *
53
+ Utils.layout.getDisplayDensity(),
54
+ )
55
+ return
56
+ }
57
+ if (!native?.getWindowToken() || native.getWidth() <= 0 || native.getHeight() <= 0)
58
+ return
59
+ const colors = Array.create('int', settings.colors.length)
60
+ settings.colors.forEach((color, i) => {
61
+ colors[i] = new Color(color).argb | 0
62
+ })
63
+ target = native
64
+ emitter = new org.rafaelaugusto.jolt.ParticleEmitter(
65
+ native,
66
+ overlay,
67
+ colors,
68
+ settings.shape === 'circle' ? 0 : settings.shape === 'rectangle' ? 1 : 2,
69
+ settings.source === 'center' ? 0 : settings.source === 'top' ? 1 : 2,
70
+ settings.rate,
71
+ settings.lifetime,
72
+ settings.size,
73
+ settings.velocity,
74
+ settings.velocityRange,
75
+ settings.angle,
76
+ settings.spread,
77
+ settings.gravity,
78
+ settings.spin,
79
+ settings.spinRange,
80
+ settings.fadeOut,
81
+ settings.duration ?? -1,
82
+ new org.rafaelaugusto.jolt.ParticleEmitter.Listener({ onEnd: stop }),
83
+ )
84
+ const active = live.get(view) ?? {}
85
+ active[key] = emitter
86
+ live.set(view, active)
87
+ emitter.refresh(
88
+ (typeof view.borderRadius === 'number' ? view.borderRadius : 0) *
89
+ Utils.layout.getDisplayDensity(),
90
+ )
91
+ emitter.start()
92
+ }
93
+ function schedule() {
94
+ if (stopped || queued) return
95
+ queued = true
96
+ void Promise.resolve().then(() => {
97
+ queued = false
98
+ if (stopped) return
99
+ try {
100
+ update()
101
+ } catch (error) {
102
+ stop()
103
+ throw error
104
+ }
105
+ })
106
+ }
107
+ owners.set(view, stop)
108
+ view.on('loaded', schedule)
109
+ view.on('layoutChanged', schedule)
110
+ view.on('unloaded', stop)
111
+ view.style.on('borderTopLeftRadiusChange', schedule)
112
+ Application.on(Application.suspendEvent, stop)
113
+ unwatch = onReducedMotion((reduced) => {
114
+ if (reduced) stop()
115
+ })
116
+ schedule()
117
+ return stop
118
+ }
@@ -4,14 +4,16 @@ import {
4
4
  type AndroidPlayback,
5
5
  } from './android-playback.js'
6
6
  import { isDecorationProperty } from '../decoration.js'
7
+ import { syncLiveSprings } from '../live-spring-driver.js'
7
8
  import {
8
9
  syncAndroidDecoration,
9
10
  playAndroidDecoration,
10
11
  presentedAndroidDecoration,
11
12
  } from './android-decoration.js'
12
- import { Utils, type View } from '@nativescript/core'
13
+ import { Application, Utils, type View } from '@nativescript/core'
13
14
  import type { NumericProperty } from '../properties.js'
14
15
  import type { Driver } from './index.js'
16
+ import { frame } from './frame.js'
15
17
  import { isColorProperty } from '../color.js'
16
18
  import {
17
19
  playAndroidColor,
@@ -31,6 +33,7 @@ function fadeLayer(view: View, nativeView: NativeView): (() => void) | undefined
31
33
  view.nativeViewProtected !== nativeView ||
32
34
  !(nativeView instanceof ViewGroup) ||
33
35
  nativeView.getChildCount() === 0 ||
36
+ !nativeView.getClipChildren() ||
34
37
  !nativeView.isHardwareAccelerated() ||
35
38
  nativeView.getLayerType() !== View.LAYER_TYPE_NONE
36
39
  )
@@ -57,6 +60,23 @@ function fadeLayer(view: View, nativeView: NativeView): (() => void) | undefined
57
60
  return restore
58
61
  }
59
62
 
63
+ /**
64
+ * A translucent view is drawn into a buffer of its own size, which cuts off children
65
+ * that draw outside it. Fade those children one by one instead.
66
+ */
67
+ function keepOverflow(nativeView: NativeView) {
68
+ if (
69
+ android.os.Build.VERSION.SDK_INT >= 24 &&
70
+ nativeView instanceof android.view.ViewGroup &&
71
+ !nativeView.getClipChildren() &&
72
+ nativeView.getHasOverlappingRendering()
73
+ ) {
74
+ nativeView.forceHasOverlappingRendering(false)
75
+ // The render node only picks the flag up when the view draws again.
76
+ nativeView.invalidate()
77
+ }
78
+ }
79
+
60
80
  const accessors: Record<
61
81
  NumericProperty,
62
82
  { get(view: NativeView): number; set(view: NativeView, value: number): void }
@@ -91,6 +111,7 @@ export function createAndroidDriver(): Driver {
91
111
 
92
112
  return {
93
113
  now: () => android.os.SystemClock.uptimeMillis(),
114
+ frame,
94
115
  clock,
95
116
  control(_view, handle, elapsed, paused, command) {
96
117
  ;(handle as Handle).control(elapsed, paused, command)
@@ -143,6 +164,8 @@ export function createAndroidDriver(): Driver {
143
164
  : android.animation.ValueAnimator.RESTART,
144
165
  )
145
166
  }
167
+ if (track.property === 'opacity' && track.values.some((value) => value < 1))
168
+ keepOverflow(nativeView)
146
169
  accessors[track.property].set(nativeView, track.values[0]! * scale)
147
170
  return androidPlayback(
148
171
  animator,
@@ -166,6 +189,7 @@ export function createAndroidDriver(): Driver {
166
189
  sync(view) {
167
190
  syncAndroidDecoration(view)
168
191
  syncAndroidColor(view)
192
+ syncLiveSprings(view)
169
193
  },
170
194
 
171
195
  elapsed: (handle) => (handle as Handle).elapsed(),
@@ -178,6 +202,44 @@ export function createAndroidDriver(): Driver {
178
202
  return nativeView ? accessors[property].get(nativeView) / unit(property) : undefined
179
203
  },
180
204
 
205
+ layoutFrame(view) {
206
+ const native = view.nativeViewProtected as android.view.View | undefined
207
+ if (!native) return undefined
208
+ const dip = Utils.layout.toDeviceIndependentPixels
209
+ return {
210
+ x: dip(native.getLeft()),
211
+ y: dip(native.getTop()),
212
+ width: dip(native.getWidth()),
213
+ height: dip(native.getHeight()),
214
+ }
215
+ },
216
+
217
+ afterLayout(view, callback) {
218
+ const native = view.nativeViewProtected as android.view.View
219
+ const observer = native.getViewTreeObserver()
220
+ let active = true
221
+ const detach = () => {
222
+ if (!active) return
223
+ active = false
224
+ if (observer.isAlive()) observer.removeOnPreDrawListener(listener)
225
+ else {
226
+ const current = native.getViewTreeObserver()
227
+ if (current.isAlive()) current.removeOnPreDrawListener(listener)
228
+ }
229
+ }
230
+ const listener = new android.view.ViewTreeObserver.OnPreDrawListener({
231
+ onPreDraw() {
232
+ if (active) {
233
+ detach()
234
+ callback()
235
+ }
236
+ return true
237
+ },
238
+ })
239
+ observer.addOnPreDrawListener(listener)
240
+ return detach
241
+ },
242
+
181
243
  after(ms, callback) {
182
244
  // A native marker follows animator duration scale, including changes during playback.
183
245
  // Only completion crosses the bridge; there is no JavaScript update listener.
@@ -221,5 +283,11 @@ export function createAndroidDriver(): Driver {
221
283
  ) === 0
222
284
  )
223
285
  },
286
+
287
+ watchReducedMotion(callback) {
288
+ // Android has no broadcast for the animator scale; it can only change in Settings.
289
+ Application.on(Application.resumeEvent, callback)
290
+ return () => Application.off(Application.resumeEvent, callback)
291
+ },
224
292
  }
225
293
  }
@@ -0,0 +1,10 @@
1
+ import {
2
+ cancelAnimationFrame,
3
+ requestAnimationFrame,
4
+ } from '@nativescript/core/animation-frame'
5
+
6
+ /** NativeScript schedules subsequent frames with CADisplayLink / Choreographer. */
7
+ export function frame(callback: () => void): () => void {
8
+ const id = requestAnimationFrame(callback)
9
+ return () => cancelAnimationFrame(id)
10
+ }
@@ -5,9 +5,18 @@ import type { Track } from '../track.js'
5
5
  import { createAndroidDriver } from './android.js'
6
6
  import { createIOSDriver } from './ios.js'
7
7
 
8
+ export interface LayoutFrame {
9
+ x: number
10
+ y: number
11
+ width: number
12
+ height: number
13
+ }
14
+
8
15
  export interface Driver {
9
16
  /** Milliseconds, on the clock the platform's animations run on. */
10
17
  now(): number
18
+ /** One native animation frame; returns an idempotent cancellation function. */
19
+ frame(callback: () => void): () => void
11
20
  /** Starts the track at `startedAt + track.delay` and calls `onEnd` once, however it ends. */
12
21
  play(
13
22
  view: View,
@@ -34,8 +43,14 @@ export interface Driver {
34
43
  presented(view: View, property: Property): number | undefined
35
44
  /** Calls back after `ms` of animation time, respecting platform speed settings. */
36
45
  after(ms: number, callback: () => void): () => void
46
+ /** Untransformed native layout bounds in parent DIPs. */
47
+ layoutFrame?(view: View): LayoutFrame | undefined
48
+ /** One callback after layout, before drawing; caller requests layout and owns cancellation. */
49
+ afterLayout?(view: View, callback: () => void): () => void
37
50
  /** The platform's accessibility setting: Reduce Motion on iOS, Remove animations on Android. */
38
51
  reducedMotion?(): boolean
52
+ /** Calls back when that setting may have changed; returns a cleanup function. */
53
+ watchReducedMotion?(callback: () => void): () => void
39
54
  }
40
55
 
41
56
  export function after(ms: number, callback: () => void) {
@@ -0,0 +1,136 @@
1
+ import { Color, type View } from '@nativescript/core'
2
+ import {
3
+ gradientPoints,
4
+ type GradientFrame,
5
+ type GradientPainter,
6
+ type GradientType,
7
+ } from '../gradient.js'
8
+
9
+ const keys = ['colors', 'locations', 'startPoint', 'endPoint'] as const
10
+
11
+ /** A CAGradientLayer at the back of the view's layer: above its background, below its children. */
12
+ export function iosGradient(view: View, type: GradientType): GradientPainter {
13
+ const layer = CAGradientLayer.new()
14
+ layer.type =
15
+ type === 'linear'
16
+ ? kCAGradientLayerAxial
17
+ : type === 'radial'
18
+ ? kCAGradientLayerRadial
19
+ : kCAGradientLayerConic
20
+ let current: GradientFrame | undefined
21
+ let generation = 0
22
+
23
+ const native = () => view.nativeViewProtected as UIView | undefined
24
+ const size = () => {
25
+ const bounds = native()?.layer.bounds
26
+ return { width: bounds?.size.width ?? 0, height: bounds?.size.height ?? 0 }
27
+ }
28
+ const values = (frame: GradientFrame) => {
29
+ const { width, height } = size()
30
+ const { start, end: toward } = gradientPoints(type, frame, width, height)
31
+ // Core Animation starts a conic gradient on the side opposite its end point.
32
+ const end =
33
+ type === 'conic' ? { x: 2 * start.x - toward.x, y: 2 * start.y - toward.y } : toward
34
+ return {
35
+ colors: NSArray.arrayWithArray(
36
+ frame.colors.map((argb) => new Color(argb).ios.CGColor),
37
+ ),
38
+ locations: NSArray.arrayWithArray(frame.stops),
39
+ startPoint: NSValue.valueWithCGPoint(CGPointMake(start.x, start.y)),
40
+ endPoint: NSValue.valueWithCGPoint(CGPointMake(end.x, end.y)),
41
+ }
42
+ }
43
+ const attach = () => {
44
+ const host = native()
45
+ if (!host) return
46
+ CATransaction.begin()
47
+ CATransaction.setDisableActions(true)
48
+ if (layer.superlayer !== host.layer) host.layer.insertSublayerAtIndex(layer, 0)
49
+ layer.frame = host.layer.bounds
50
+ layer.cornerRadius =
51
+ typeof view.borderRadius === 'number' ? view.borderRadius : host.layer.cornerRadius
52
+ if (current) {
53
+ const model = values(current)
54
+ layer.colors = model.colors
55
+ layer.locations = model.locations
56
+ layer.startPoint = model.startPoint.CGPointValue
57
+ layer.endPoint = model.endPoint.CGPointValue
58
+ }
59
+ CATransaction.commit()
60
+ }
61
+ view.on('loaded', attach)
62
+ view.on('layoutChanged', attach)
63
+ view.style.on('borderTopLeftRadiusChange', attach)
64
+
65
+ return {
66
+ paint(frame) {
67
+ layer.speed = 1
68
+ layer.timeOffset = 0
69
+ layer.beginTime = 0
70
+ current = frame
71
+ generation++
72
+ for (const key of keys) layer.removeAnimationForKey(`jolt:gradient:${key}`)
73
+ attach()
74
+ },
75
+ play(frames, times, timing, onEnd) {
76
+ const instance = ++generation
77
+ current = frames[frames.length - 1]!
78
+ attach()
79
+ const sampled = frames.map(values)
80
+ const now = CACurrentMediaTime()
81
+ const parentTime = () =>
82
+ layer.superlayer?.convertTimeFromLayer(CACurrentMediaTime(), null) ??
83
+ CACurrentMediaTime()
84
+ CATransaction.begin()
85
+ CATransaction.setDisableActions(true)
86
+ layer.speed = 1
87
+ layer.timeOffset = 0
88
+ layer.beginTime = layer.superlayer?.convertTimeFromLayer(now, null) ?? now
89
+ if (timing.repeat !== Infinity)
90
+ CATransaction.setCompletionBlock(() => {
91
+ if (instance === generation) onEnd(true)
92
+ })
93
+ for (const key of keys) {
94
+ const animation = CAKeyframeAnimation.animationWithKeyPath(key)
95
+ animation.values = NSArray.arrayWithArray(sampled.map((value) => value[key]))
96
+ animation.keyTimes = NSArray.arrayWithArray(times as number[])
97
+ animation.duration = Math.max(timing.duration, 1) / 1000
98
+ animation.beginTime = Math.max(0.000001, timing.delay / 1000)
99
+ animation.fillMode = kCAFillModeBackwards
100
+ if (timing.repeat > 0) {
101
+ animation.autoreverses = timing.reverse
102
+ animation.repeatCount = timing.reverse
103
+ ? (timing.repeat + 1) / 2
104
+ : timing.repeat + 1
105
+ }
106
+ layer.addAnimationForKey(animation, `jolt:gradient:${key}`)
107
+ }
108
+ CATransaction.commit()
109
+ return {
110
+ control(elapsed, paused) {
111
+ if (instance !== generation) return
112
+ CATransaction.begin()
113
+ CATransaction.setDisableActions(true)
114
+ layer.speed = paused ? 0 : 1
115
+ layer.timeOffset = paused ? elapsed / 1000 : 0
116
+ layer.beginTime = paused ? 0 : parentTime() - elapsed / 1000
117
+ CATransaction.commit()
118
+ },
119
+ cancel() {
120
+ if (instance !== generation) return
121
+ generation++
122
+ for (const key of keys) layer.removeAnimationForKey(`jolt:gradient:${key}`)
123
+ onEnd(false)
124
+ },
125
+ }
126
+ },
127
+ remove() {
128
+ generation++
129
+ view.off('loaded', attach)
130
+ view.off('layoutChanged', attach)
131
+ view.style.off('borderTopLeftRadiusChange', attach)
132
+ layer.removeAllAnimations()
133
+ layer.removeFromSuperlayer()
134
+ },
135
+ }
136
+ }
@@ -0,0 +1,63 @@
1
+ import type { View } from '@nativescript/core'
2
+
3
+ type LayoutView = View & {
4
+ _isTransformed: boolean
5
+ _modifyNativeViewFrame(native: UIView, frame: CGRect): void
6
+ }
7
+ const retained = new WeakMap<View, { count: number; restore(): void }>()
8
+
9
+ /**
10
+ * NativeScript caches whether its JS transform is nonidentity. Interactive native
11
+ * playback can move the actual model while that cached destination is identity.
12
+ * Let Core reset/restore the real transform when it next assigns a layout frame.
13
+ * This hook belongs only to the opted-in instance and only while tracks own it.
14
+ */
15
+ export function retainInteractiveLayout(view: View): () => void {
16
+ const host = view as LayoutView
17
+ let entry = retained.get(view)
18
+ if (!entry) {
19
+ const original = host._modifyNativeViewFrame
20
+ if (typeof original !== 'function') return () => {}
21
+ const descriptor = Object.getOwnPropertyDescriptor(host, '_modifyNativeViewFrame')
22
+ let active = true
23
+ const wrapper: LayoutView['_modifyNativeViewFrame'] = function (
24
+ this: LayoutView,
25
+ native,
26
+ frame,
27
+ ) {
28
+ if (active)
29
+ this._isTransformed = !CATransform3DEqualToTransform(
30
+ native.layer.transform,
31
+ CATransform3DIdentity,
32
+ )
33
+ original.call(this, native, frame)
34
+ }
35
+ host._modifyNativeViewFrame = wrapper
36
+ entry = {
37
+ count: 0,
38
+ restore() {
39
+ active = false
40
+ const native = host.nativeViewProtected as UIView | undefined
41
+ if (native)
42
+ host._isTransformed = !CATransform3DEqualToTransform(
43
+ native.layer.transform,
44
+ CATransform3DIdentity,
45
+ )
46
+ if (host._modifyNativeViewFrame !== wrapper) return
47
+ if (descriptor) Object.defineProperty(host, '_modifyNativeViewFrame', descriptor)
48
+ else delete (host as Partial<LayoutView>)._modifyNativeViewFrame
49
+ },
50
+ }
51
+ retained.set(view, entry)
52
+ }
53
+ entry.count++
54
+ let released = false
55
+ return () => {
56
+ if (released) return
57
+ released = true
58
+ if (--entry.count === 0) {
59
+ entry.restore()
60
+ retained.delete(view)
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,23 @@
1
+ import type { ScrollView } from '@nativescript/core'
2
+
3
+ /** Preserve Core's lazy scroll listener attach/detach without adding a JS scroll observer. */
4
+ export function retainScrollDelegate(scroll: ScrollView, refresh: () => void) {
5
+ const host = scroll as ScrollView & { attachNative(): void; detachNative(): void }
6
+ const restore: (() => void)[] = []
7
+ for (const key of ['attachNative', 'detachNative'] as const) {
8
+ const original = host[key]
9
+ if (typeof original !== 'function') continue
10
+ const descriptor = Object.getOwnPropertyDescriptor(host, key)
11
+ const wrapper = function (this: typeof host) {
12
+ original.call(this)
13
+ refresh()
14
+ }
15
+ host[key] = wrapper
16
+ restore.push(() => {
17
+ if (host[key] !== wrapper) return
18
+ if (descriptor) Object.defineProperty(host, key, descriptor)
19
+ else delete (host as Partial<typeof host>)[key]
20
+ })
21
+ }
22
+ return () => restore.forEach((action) => action())
23
+ }
package/src/driver/ios.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { iosPlayback } from './ios-playback.js'
2
+ import { syncLiveSprings } from '../live-spring-driver.js'
2
3
  import { isDecorationProperty } from '../decoration.js'
3
4
  import {
4
5
  playIOSDecoration,
@@ -12,6 +13,8 @@ import { isColorProperty } from '../color.js'
12
13
  import { playIOSColor, presentedIOSColor } from './ios-color.js'
13
14
  import { after, type Driver } from './index.js'
14
15
  import { hasInteractionSurface } from '../interaction-surface.js'
16
+ import { retainInteractiveLayout } from './ios-layout.js'
17
+ import { frame } from './frame.js'
15
18
 
16
19
  interface Handle {
17
20
  stop(): void
@@ -58,6 +61,7 @@ function ensurePerspective(view: View, layers: CALayer[]) {
58
61
  export function createIOSDriver(): Driver {
59
62
  return {
60
63
  now: () => CACurrentMediaTime() * 1000,
64
+ frame,
61
65
 
62
66
  play(view, track, startedAt, onEnd): Handle {
63
67
  if (isDecorationProperty(track.property))
@@ -72,28 +76,36 @@ export function createIOSDriver(): Driver {
72
76
  throw new Error('Rebuild the iOS app to enable Jolt interaction surfaces.')
73
77
  if (track.property === 'rotateX' || track.property === 'rotateY')
74
78
  ensurePerspective(view, layers)
79
+ const releaseLayout = retainInteractiveLayout(view)
75
80
  const suspend = () => stopView(view, [track.property])
76
81
  const completed = (finished: boolean) => {
77
82
  Application.off(Application.suspendEvent, suspend)
83
+ releaseLayout()
78
84
  onEnd(finished)
79
85
  }
80
- const native =
81
- JoltInteractiveAnimation.startViewLayersKeyPathValuesTimesDurationDelayRepeatReverseFinalValueStartedAtCompletion(
82
- view.nativeViewProtected,
83
- NSArray.arrayWithArray(layers),
84
- keyPaths[track.property as NumericProperty],
85
- NSArray.arrayWithArray(
86
- track.values.map((value) => (rotation ? radians(value) : value)),
87
- ),
88
- NSArray.arrayWithArray(track.times as number[]),
89
- track.duration,
90
- track.delay,
91
- track.repeat,
92
- track.reverse,
93
- rotation ? radians(track.to) : track.to,
94
- startedAt,
95
- completed,
96
- )
86
+ let native: JoltInteractiveAnimation
87
+ try {
88
+ native =
89
+ JoltInteractiveAnimation.startViewLayersKeyPathValuesTimesDurationDelayRepeatReverseFinalValueStartedAtCompletion(
90
+ view.nativeViewProtected,
91
+ NSArray.arrayWithArray(layers),
92
+ keyPaths[track.property as NumericProperty],
93
+ NSArray.arrayWithArray(
94
+ track.values.map((value) => (rotation ? radians(value) : value)),
95
+ ),
96
+ NSArray.arrayWithArray(track.times as number[]),
97
+ track.duration,
98
+ track.delay,
99
+ track.repeat,
100
+ track.reverse,
101
+ rotation ? radians(track.to) : track.to,
102
+ startedAt,
103
+ completed,
104
+ )
105
+ } catch (error) {
106
+ releaseLayout()
107
+ throw error
108
+ }
97
109
  Application.on(Application.suspendEvent, suspend)
98
110
  return {
99
111
  elapsed: () => native.elapsed,
@@ -186,6 +198,7 @@ export function createIOSDriver(): Driver {
186
198
  view.nativeViewProtected,
187
199
  excluding ? (keyPaths[excluding as NumericProperty] ?? null) : null,
188
200
  )
201
+ syncLiveSprings(view)
189
202
  },
190
203
 
191
204
  presented(view, property) {
@@ -201,8 +214,48 @@ export function createIOSDriver(): Driver {
201
214
  return property.startsWith('rotate') ? (value * 180) / Math.PI : Number(value)
202
215
  },
203
216
 
217
+ layoutFrame(view) {
218
+ const native = view.nativeViewProtected as UIView | undefined
219
+ if (!native) return undefined
220
+ const { width, height } = native.bounds.size
221
+ const { position, anchorPoint } = native.layer
222
+ return {
223
+ x: position.x - width * anchorPoint.x,
224
+ y: position.y - height * anchorPoint.y,
225
+ width,
226
+ height,
227
+ }
228
+ },
229
+
230
+ afterLayout(view, callback) {
231
+ const original = view.layout
232
+ const descriptor = Object.getOwnPropertyDescriptor(view, 'layout')
233
+ let active = true
234
+ const detach = () => {
235
+ active = false
236
+ if (view.layout !== wrapper) return
237
+ if (descriptor) Object.defineProperty(view, 'layout', descriptor)
238
+ else delete (view as Partial<View>).layout
239
+ }
240
+ const wrapper: View['layout'] = function (this: View, ...args) {
241
+ original.apply(this, args)
242
+ if (active) {
243
+ detach()
244
+ callback()
245
+ }
246
+ }
247
+ view.layout = wrapper
248
+ return detach
249
+ },
250
+
204
251
  after,
205
252
 
206
253
  reducedMotion: () => UIAccessibilityIsReduceMotionEnabled(),
254
+
255
+ watchReducedMotion(callback) {
256
+ const name = UIAccessibilityReduceMotionStatusDidChangeNotification
257
+ const observer = Application.ios.addNotificationObserver(name, callback)
258
+ return () => Application.ios.removeNotificationObserver(observer, name)
259
+ },
207
260
  }
208
261
  }