@rafaelaugusto/jolt 0.1.0-beta.9 → 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 (572) hide show
  1. package/README.md +133 -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 +27 -1
  54. package/dist/driver/android.js.map +1 -1
  55. package/dist/driver/frame.d.ts +3 -0
  56. package/dist/driver/frame.d.ts.map +1 -0
  57. package/dist/driver/frame.js +7 -0
  58. package/dist/driver/frame.js.map +1 -0
  59. package/dist/driver/index.d.ts +4 -0
  60. package/dist/driver/index.d.ts.map +1 -1
  61. package/dist/driver/index.js.map +1 -1
  62. package/dist/driver/ios-gradient.d.ts +5 -0
  63. package/dist/driver/ios-gradient.d.ts.map +1 -0
  64. package/dist/driver/ios-gradient.js +131 -0
  65. package/dist/driver/ios-gradient.js.map +1 -0
  66. package/dist/driver/ios-scroll-delegate.d.ts +4 -0
  67. package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
  68. package/dist/driver/ios-scroll-delegate.js +26 -0
  69. package/dist/driver/ios-scroll-delegate.js.map +1 -0
  70. package/dist/driver/ios.d.ts.map +1 -1
  71. package/dist/driver/ios.js +9 -0
  72. package/dist/driver/ios.js.map +1 -1
  73. package/dist/easing.d.ts +3 -1
  74. package/dist/easing.d.ts.map +1 -1
  75. package/dist/easing.js +18 -1
  76. package/dist/easing.js.map +1 -1
  77. package/dist/engine.d.ts +31 -2
  78. package/dist/engine.d.ts.map +1 -1
  79. package/dist/engine.js +194 -42
  80. package/dist/engine.js.map +1 -1
  81. package/dist/gesture-native.d.ts +28 -0
  82. package/dist/gesture-native.d.ts.map +1 -0
  83. package/dist/gesture-native.js +61 -0
  84. package/dist/gesture-native.js.map +1 -0
  85. package/dist/gestures/index.d.ts +69 -0
  86. package/dist/gestures/index.d.ts.map +1 -0
  87. package/dist/gestures/index.js +262 -0
  88. package/dist/gestures/index.js.map +1 -0
  89. package/dist/glass/index.d.ts +55 -0
  90. package/dist/glass/index.d.ts.map +1 -0
  91. package/dist/glass/index.js +205 -0
  92. package/dist/glass/index.js.map +1 -0
  93. package/dist/gradient-binding.d.ts +38 -0
  94. package/dist/gradient-binding.d.ts.map +1 -0
  95. package/dist/gradient-binding.js +128 -0
  96. package/dist/gradient-binding.js.map +1 -0
  97. package/dist/gradient.d.ts +105 -0
  98. package/dist/gradient.d.ts.map +1 -0
  99. package/dist/gradient.js +514 -0
  100. package/dist/gradient.js.map +1 -0
  101. package/dist/gravity.d.ts +13 -0
  102. package/dist/gravity.d.ts.map +1 -0
  103. package/dist/gravity.js +84 -0
  104. package/dist/gravity.js.map +1 -0
  105. package/dist/haptics.d.ts.map +1 -1
  106. package/dist/haptics.js +101 -28
  107. package/dist/haptics.js.map +1 -1
  108. package/dist/image-effect.d.ts +1 -0
  109. package/dist/image-effect.d.ts.map +1 -1
  110. package/dist/image-effect.js +10 -2
  111. package/dist/image-effect.js.map +1 -1
  112. package/dist/index.d.ts +19 -7
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +10 -4
  115. package/dist/index.js.map +1 -1
  116. package/dist/inspector/index.d.ts +86 -0
  117. package/dist/inspector/index.d.ts.map +1 -0
  118. package/dist/inspector/index.js +419 -0
  119. package/dist/inspector/index.js.map +1 -0
  120. package/dist/inspector/plot.d.ts +4 -0
  121. package/dist/inspector/plot.d.ts.map +1 -0
  122. package/dist/inspector/plot.js +23 -0
  123. package/dist/inspector/plot.js.map +1 -0
  124. package/dist/inspector/probe.d.ts +19 -0
  125. package/dist/inspector/probe.d.ts.map +1 -0
  126. package/dist/inspector/probe.js +37 -0
  127. package/dist/inspector/probe.js.map +1 -0
  128. package/dist/inspector/tuning.d.ts +19 -0
  129. package/dist/inspector/tuning.d.ts.map +1 -0
  130. package/dist/inspector/tuning.js +37 -0
  131. package/dist/inspector/tuning.js.map +1 -0
  132. package/dist/interactive-navigation/index.d.ts +44 -0
  133. package/dist/interactive-navigation/index.d.ts.map +1 -0
  134. package/dist/interactive-navigation/index.js +314 -0
  135. package/dist/interactive-navigation/index.js.map +1 -0
  136. package/dist/keyboard.d.ts +24 -0
  137. package/dist/keyboard.d.ts.map +1 -1
  138. package/dist/keyboard.js +199 -6
  139. package/dist/keyboard.js.map +1 -1
  140. package/dist/live-spring-driver.d.ts +52 -0
  141. package/dist/live-spring-driver.d.ts.map +1 -0
  142. package/dist/live-spring-driver.js +104 -0
  143. package/dist/live-spring-driver.js.map +1 -0
  144. package/dist/mixer.d.ts +55 -0
  145. package/dist/mixer.d.ts.map +1 -0
  146. package/dist/mixer.js +278 -0
  147. package/dist/mixer.js.map +1 -0
  148. package/dist/motion-scope.d.ts +8 -2
  149. package/dist/motion-scope.d.ts.map +1 -1
  150. package/dist/motion-scope.js +24 -3
  151. package/dist/motion-scope.js.map +1 -1
  152. package/dist/motion-states.d.ts +19 -7
  153. package/dist/motion-states.d.ts.map +1 -1
  154. package/dist/motion-states.js +116 -26
  155. package/dist/motion-states.js.map +1 -1
  156. package/dist/motion-value.d.ts +227 -0
  157. package/dist/motion-value.d.ts.map +1 -0
  158. package/dist/motion-value.js +1074 -0
  159. package/dist/motion-value.js.map +1 -0
  160. package/dist/native/index.d.ts +10 -0
  161. package/dist/native/index.d.ts.map +1 -0
  162. package/dist/native/index.js +6 -0
  163. package/dist/native/index.js.map +1 -0
  164. package/dist/native-properties.d.ts +28 -0
  165. package/dist/native-properties.d.ts.map +1 -0
  166. package/dist/native-properties.js +154 -0
  167. package/dist/native-properties.js.map +1 -0
  168. package/dist/native-property-driver.d.ts +19 -0
  169. package/dist/native-property-driver.d.ts.map +1 -0
  170. package/dist/native-property-driver.js +69 -0
  171. package/dist/native-property-driver.js.map +1 -0
  172. package/dist/native-property.d.ts +37 -0
  173. package/dist/native-property.d.ts.map +1 -0
  174. package/dist/native-property.js +285 -0
  175. package/dist/native-property.js.map +1 -0
  176. package/dist/particles.d.ts +5 -2
  177. package/dist/particles.d.ts.map +1 -1
  178. package/dist/particles.js +16 -10
  179. package/dist/particles.js.map +1 -1
  180. package/dist/path.d.ts.map +1 -1
  181. package/dist/path.js +2 -2
  182. package/dist/path.js.map +1 -1
  183. package/dist/physics/index.d.ts +116 -0
  184. package/dist/physics/index.d.ts.map +1 -0
  185. package/dist/physics/index.js +306 -0
  186. package/dist/physics/index.js.map +1 -0
  187. package/dist/physics/native.d.ts +53 -0
  188. package/dist/physics/native.d.ts.map +1 -0
  189. package/dist/physics/native.js +58 -0
  190. package/dist/physics/native.js.map +1 -0
  191. package/dist/playback-group.d.ts.map +1 -1
  192. package/dist/playback-group.js +17 -1
  193. package/dist/playback-group.js.map +1 -1
  194. package/dist/playback.d.ts +15 -0
  195. package/dist/playback.d.ts.map +1 -1
  196. package/dist/playback.js +23 -0
  197. package/dist/playback.js.map +1 -1
  198. package/dist/predictive-back/index.d.ts +45 -0
  199. package/dist/predictive-back/index.d.ts.map +1 -0
  200. package/dist/predictive-back/index.js +220 -0
  201. package/dist/predictive-back/index.js.map +1 -0
  202. package/dist/predictive-back/presentation.d.ts +4 -0
  203. package/dist/predictive-back/presentation.d.ts.map +1 -0
  204. package/dist/predictive-back/presentation.js +3 -0
  205. package/dist/predictive-back/presentation.js.map +1 -0
  206. package/dist/reorder/handle.d.ts +6 -0
  207. package/dist/reorder/handle.d.ts.map +1 -0
  208. package/dist/reorder/handle.js +10 -0
  209. package/dist/reorder/handle.js.map +1 -0
  210. package/dist/reorder/index.d.ts +10 -0
  211. package/dist/reorder/index.d.ts.map +1 -0
  212. package/dist/reorder/index.js +233 -0
  213. package/dist/reorder/index.js.map +1 -0
  214. package/dist/reorder/list-view.d.ts +5 -0
  215. package/dist/reorder/list-view.d.ts.map +1 -0
  216. package/dist/reorder/list-view.js +238 -0
  217. package/dist/reorder/list-view.js.map +1 -0
  218. package/dist/reorder/model.d.ts +6 -0
  219. package/dist/reorder/model.d.ts.map +1 -0
  220. package/dist/reorder/model.js +30 -0
  221. package/dist/reorder/model.js.map +1 -0
  222. package/dist/reorder/surface.d.ts +6 -0
  223. package/dist/reorder/surface.d.ts.map +1 -0
  224. package/dist/reorder/surface.js +10 -0
  225. package/dist/reorder/surface.js.map +1 -0
  226. package/dist/reorder/types.d.ts +92 -0
  227. package/dist/reorder/types.d.ts.map +1 -0
  228. package/dist/reorder/types.js +2 -0
  229. package/dist/reorder/types.js.map +1 -0
  230. package/dist/sampling.d.ts +35 -0
  231. package/dist/sampling.d.ts.map +1 -0
  232. package/dist/sampling.js +123 -0
  233. package/dist/sampling.js.map +1 -0
  234. package/dist/scene-appearance.d.ts +14 -0
  235. package/dist/scene-appearance.d.ts.map +1 -0
  236. package/dist/scene-appearance.js +68 -0
  237. package/dist/scene-appearance.js.map +1 -0
  238. package/dist/scene-camera.d.ts +5 -0
  239. package/dist/scene-camera.d.ts.map +1 -0
  240. package/dist/scene-camera.js +23 -0
  241. package/dist/scene-camera.js.map +1 -0
  242. package/dist/scene-shader.d.ts +18 -0
  243. package/dist/scene-shader.d.ts.map +1 -0
  244. package/dist/scene-shader.js +76 -0
  245. package/dist/scene-shader.js.map +1 -0
  246. package/dist/scroll-header/geometry.d.ts +18 -0
  247. package/dist/scroll-header/geometry.d.ts.map +1 -0
  248. package/dist/scroll-header/geometry.js +46 -0
  249. package/dist/scroll-header/geometry.js.map +1 -0
  250. package/dist/scroll-header/index.d.ts +48 -0
  251. package/dist/scroll-header/index.d.ts.map +1 -0
  252. package/dist/scroll-header/index.js +373 -0
  253. package/dist/scroll-header/index.js.map +1 -0
  254. package/dist/scroll-header/native.d.ts +28 -0
  255. package/dist/scroll-header/native.d.ts.map +1 -0
  256. package/dist/scroll-header/native.js +43 -0
  257. package/dist/scroll-header/native.js.map +1 -0
  258. package/dist/sensors/index.d.ts +69 -0
  259. package/dist/sensors/index.d.ts.map +1 -0
  260. package/dist/sensors/index.js +149 -0
  261. package/dist/sensors/index.js.map +1 -0
  262. package/dist/sensors/native.d.ts +20 -0
  263. package/dist/sensors/native.d.ts.map +1 -0
  264. package/dist/sensors/native.js +48 -0
  265. package/dist/sensors/native.js.map +1 -0
  266. package/dist/sequence.d.ts +24 -0
  267. package/dist/sequence.d.ts.map +1 -1
  268. package/dist/sequence.js +181 -19
  269. package/dist/sequence.js.map +1 -1
  270. package/dist/shapes/android.d.ts +3 -0
  271. package/dist/shapes/android.d.ts.map +1 -0
  272. package/dist/shapes/android.js +51 -0
  273. package/dist/shapes/android.js.map +1 -0
  274. package/dist/shapes/index.d.ts +6 -0
  275. package/dist/shapes/index.d.ts.map +1 -0
  276. package/dist/shapes/index.js +238 -0
  277. package/dist/shapes/index.js.map +1 -0
  278. package/dist/shapes/ios.d.ts +3 -0
  279. package/dist/shapes/ios.d.ts.map +1 -0
  280. package/dist/shapes/ios.js +164 -0
  281. package/dist/shapes/ios.js.map +1 -0
  282. package/dist/shapes/native.d.ts +18 -0
  283. package/dist/shapes/native.d.ts.map +1 -0
  284. package/dist/shapes/native.js +10 -0
  285. package/dist/shapes/native.js.map +1 -0
  286. package/dist/shapes/path.d.ts +10 -0
  287. package/dist/shapes/path.d.ts.map +1 -0
  288. package/dist/shapes/path.js +106 -0
  289. package/dist/shapes/path.js.map +1 -0
  290. package/dist/shapes/types.d.ts +55 -0
  291. package/dist/shapes/types.d.ts.map +1 -0
  292. package/dist/shapes/types.js +11 -0
  293. package/dist/shapes/types.js.map +1 -0
  294. package/dist/shared-layout/index.d.ts +40 -0
  295. package/dist/shared-layout/index.d.ts.map +1 -0
  296. package/dist/shared-layout/index.js +267 -0
  297. package/dist/shared-layout/index.js.map +1 -0
  298. package/dist/shared-layout/native.d.ts +15 -0
  299. package/dist/shared-layout/native.d.ts.map +1 -0
  300. package/dist/shared-layout/native.js +79 -0
  301. package/dist/shared-layout/native.js.map +1 -0
  302. package/dist/shared-layout/timing.d.ts +9 -0
  303. package/dist/shared-layout/timing.d.ts.map +1 -0
  304. package/dist/shared-layout/timing.js +68 -0
  305. package/dist/shared-layout/timing.js.map +1 -0
  306. package/dist/shared-navigation/entry.d.ts +51 -0
  307. package/dist/shared-navigation/entry.d.ts.map +1 -0
  308. package/dist/shared-navigation/entry.js +619 -0
  309. package/dist/shared-navigation/entry.js.map +1 -0
  310. package/dist/shared-navigation/index.d.ts +58 -0
  311. package/dist/shared-navigation/index.d.ts.map +1 -0
  312. package/dist/shared-navigation/index.js +318 -0
  313. package/dist/shared-navigation/index.js.map +1 -0
  314. package/dist/shared-navigation/return-signal.d.ts +16 -0
  315. package/dist/shared-navigation/return-signal.d.ts.map +1 -0
  316. package/dist/shared-navigation/return-signal.js +35 -0
  317. package/dist/shared-navigation/return-signal.js.map +1 -0
  318. package/dist/shared-navigation/return-target.d.ts +32 -0
  319. package/dist/shared-navigation/return-target.d.ts.map +1 -0
  320. package/dist/shared-navigation/return-target.js +168 -0
  321. package/dist/shared-navigation/return-target.js.map +1 -0
  322. package/dist/shared-navigation/scope.d.ts +4 -0
  323. package/dist/shared-navigation/scope.d.ts.map +1 -0
  324. package/dist/shared-navigation/scope.js +2 -0
  325. package/dist/shared-navigation/scope.js.map +1 -0
  326. package/dist/shared-navigation/targets.d.ts +6 -0
  327. package/dist/shared-navigation/targets.d.ts.map +1 -0
  328. package/dist/shared-navigation/targets.js +36 -0
  329. package/dist/shared-navigation/targets.js.map +1 -0
  330. package/dist/size-layout.d.ts +19 -0
  331. package/dist/size-layout.d.ts.map +1 -0
  332. package/dist/size-layout.js +216 -0
  333. package/dist/size-layout.js.map +1 -0
  334. package/dist/size.d.ts +19 -0
  335. package/dist/size.d.ts.map +1 -0
  336. package/dist/size.js +251 -0
  337. package/dist/size.js.map +1 -0
  338. package/dist/spring.d.ts +2 -0
  339. package/dist/spring.d.ts.map +1 -1
  340. package/dist/spring.js +11 -0
  341. package/dist/spring.js.map +1 -1
  342. package/dist/svg-path.d.ts +18 -0
  343. package/dist/svg-path.d.ts.map +1 -1
  344. package/dist/svg-path.js +3 -2
  345. package/dist/svg-path.js.map +1 -1
  346. package/dist/testing/clock.d.ts +40 -0
  347. package/dist/testing/clock.d.ts.map +1 -0
  348. package/dist/testing/clock.js +116 -0
  349. package/dist/testing/clock.js.map +1 -0
  350. package/dist/testing/handoff-recorder.d.ts +8 -0
  351. package/dist/testing/handoff-recorder.d.ts.map +1 -0
  352. package/dist/testing/handoff-recorder.js +77 -0
  353. package/dist/testing/handoff-recorder.js.map +1 -0
  354. package/dist/testing/index.d.ts +5 -0
  355. package/dist/testing/index.d.ts.map +1 -0
  356. package/dist/testing/index.js +5 -0
  357. package/dist/testing/index.js.map +1 -0
  358. package/dist/testing/native.d.ts +46 -0
  359. package/dist/testing/native.d.ts.map +1 -0
  360. package/dist/testing/native.js +313 -0
  361. package/dist/testing/native.js.map +1 -0
  362. package/dist/testing/presentation.d.ts +11 -0
  363. package/dist/testing/presentation.d.ts.map +1 -0
  364. package/dist/testing/presentation.js +45 -0
  365. package/dist/testing/presentation.js.map +1 -0
  366. package/dist/testing/replay.d.ts +39 -0
  367. package/dist/testing/replay.d.ts.map +1 -0
  368. package/dist/testing/replay.js +99 -0
  369. package/dist/testing/replay.js.map +1 -0
  370. package/dist/testing/scroll-handoff-native.d.ts +10 -0
  371. package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
  372. package/dist/testing/scroll-handoff-native.js +151 -0
  373. package/dist/testing/scroll-handoff-native.js.map +1 -0
  374. package/dist/testing/scroll-handoff.d.ts +25 -0
  375. package/dist/testing/scroll-handoff.d.ts.map +1 -0
  376. package/dist/testing/scroll-handoff.js +127 -0
  377. package/dist/testing/scroll-handoff.js.map +1 -0
  378. package/dist/testing/sensors.d.ts +13 -0
  379. package/dist/testing/sensors.d.ts.map +1 -0
  380. package/dist/testing/sensors.js +26 -0
  381. package/dist/testing/sensors.js.map +1 -0
  382. package/dist/testing/trace.d.ts +101 -0
  383. package/dist/testing/trace.d.ts.map +1 -0
  384. package/dist/testing/trace.js +263 -0
  385. package/dist/testing/trace.js.map +1 -0
  386. package/dist/timed-animation.d.ts +38 -0
  387. package/dist/timed-animation.d.ts.map +1 -0
  388. package/dist/timed-animation.js +177 -0
  389. package/dist/timed-animation.js.map +1 -0
  390. package/dist/track.d.ts +3 -0
  391. package/dist/track.d.ts.map +1 -1
  392. package/dist/track.js +281 -40
  393. package/dist/track.js.map +1 -1
  394. package/dist/transition.d.ts +54 -2
  395. package/dist/transition.d.ts.map +1 -1
  396. package/dist/transition.js +128 -8
  397. package/dist/transition.js.map +1 -1
  398. package/dist/types.d.ts +10 -1
  399. package/dist/types.d.ts.map +1 -1
  400. package/dist/value-observers.d.ts +22 -0
  401. package/dist/value-observers.d.ts.map +1 -0
  402. package/dist/value-observers.js +122 -0
  403. package/dist/value-observers.js.map +1 -0
  404. package/dist/value-track.d.ts +13 -0
  405. package/dist/value-track.d.ts.map +1 -0
  406. package/dist/value-track.js +59 -0
  407. package/dist/value-track.js.map +1 -0
  408. package/dist/vue/index.d.ts +33 -3
  409. package/dist/vue/index.d.ts.map +1 -1
  410. package/dist/vue/index.js +118 -3
  411. package/dist/vue/index.js.map +1 -1
  412. package/dist/zoomable.d.ts +1 -1
  413. package/dist/zoomable.d.ts.map +1 -1
  414. package/package.json +68 -3
  415. package/platforms/android/include.gradle +10 -0
  416. package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
  417. package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +151 -0
  418. package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +210 -0
  419. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
  420. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
  421. package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
  422. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
  423. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
  424. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
  425. package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
  426. package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
  427. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
  428. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
  429. package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
  430. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
  431. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
  432. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
  433. package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
  434. package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
  435. package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
  436. package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
  437. package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
  438. package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
  439. package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
  440. package/platforms/android/proguard-rules.pro +20 -0
  441. package/platforms/ios/build.xcconfig +1 -1
  442. package/platforms/ios/src/JoltBlur.h +14 -0
  443. package/platforms/ios/src/JoltBlur.m +86 -0
  444. package/platforms/ios/src/JoltCircleMath.h +183 -0
  445. package/platforms/ios/src/JoltCircleWorld.h +17 -0
  446. package/platforms/ios/src/JoltCircleWorld.m +203 -0
  447. package/platforms/ios/src/JoltGestureSession.h +23 -0
  448. package/platforms/ios/src/JoltGestureSession.m +251 -0
  449. package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
  450. package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
  451. package/platforms/ios/src/JoltLiveSpring.h +29 -0
  452. package/platforms/ios/src/JoltLiveSpring.m +243 -0
  453. package/platforms/ios/src/JoltMotionProbe.h +9 -0
  454. package/platforms/ios/src/JoltMotionProbe.m +72 -0
  455. package/platforms/ios/src/JoltReorderSession.h +15 -0
  456. package/platforms/ios/src/JoltReorderSession.m +205 -0
  457. package/platforms/ios/src/JoltScrollHeader.h +13 -0
  458. package/platforms/ios/src/JoltScrollHeader.m +93 -0
  459. package/platforms/ios/src/JoltSensorMath.h +39 -0
  460. package/platforms/ios/src/JoltSensorSource.h +13 -0
  461. package/platforms/ios/src/JoltSensorSource.m +201 -0
  462. package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
  463. package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
  464. package/platforms/ios/src/JoltSpringState.h +35 -0
  465. package/platforms/ios/src/module.modulemap +10 -0
  466. package/src/android-plugin.d.ts +463 -0
  467. package/src/animate.ts +129 -15
  468. package/src/blur/index.ts +195 -0
  469. package/src/blur/native.ts +70 -0
  470. package/src/blur/types.ts +32 -0
  471. package/src/bottom-sheet/geometry.ts +84 -0
  472. package/src/bottom-sheet/index.ts +536 -0
  473. package/src/bottom-sheet/native.ts +214 -0
  474. package/src/config.ts +39 -1
  475. package/src/decay.ts +9 -0
  476. package/src/drag.ts +67 -21
  477. package/src/driver/android-gradient.ts +116 -0
  478. package/src/driver/android-particles.ts +118 -0
  479. package/src/driver/android.ts +31 -1
  480. package/src/driver/frame.ts +10 -0
  481. package/src/driver/index.ts +4 -0
  482. package/src/driver/ios-gradient.ts +136 -0
  483. package/src/driver/ios-scroll-delegate.ts +23 -0
  484. package/src/driver/ios.ts +10 -0
  485. package/src/easing.ts +21 -1
  486. package/src/engine.ts +209 -60
  487. package/src/gesture-native.ts +139 -0
  488. package/src/gestures/index.ts +365 -0
  489. package/src/glass/index.ts +218 -0
  490. package/src/gradient-binding.ts +158 -0
  491. package/src/gradient.ts +663 -0
  492. package/src/gravity.ts +107 -0
  493. package/src/haptics.ts +106 -28
  494. package/src/image-effect.ts +10 -2
  495. package/src/index.ts +56 -7
  496. package/src/inspector/index.ts +523 -0
  497. package/src/inspector/plot.ts +27 -0
  498. package/src/inspector/probe.ts +50 -0
  499. package/src/inspector/tuning.ts +51 -0
  500. package/src/interactive-navigation/index.ts +398 -0
  501. package/src/ios-plugin.d.ts +279 -0
  502. package/src/keyboard.ts +231 -7
  503. package/src/live-spring-driver.ts +181 -0
  504. package/src/mixer.ts +306 -0
  505. package/src/motion-scope.ts +39 -6
  506. package/src/motion-states.ts +149 -42
  507. package/src/motion-value.ts +1289 -0
  508. package/src/native/index.ts +30 -0
  509. package/src/native-properties.ts +188 -0
  510. package/src/native-property-driver.ts +123 -0
  511. package/src/native-property.ts +366 -0
  512. package/src/particles.ts +18 -17
  513. package/src/path.ts +2 -1
  514. package/src/physics/index.ts +443 -0
  515. package/src/physics/native.ts +110 -0
  516. package/src/playback-group.ts +17 -1
  517. package/src/playback.ts +41 -0
  518. package/src/predictive-back/index.ts +280 -0
  519. package/src/predictive-back/presentation.ts +6 -0
  520. package/src/reorder/handle.ts +9 -0
  521. package/src/reorder/index.ts +243 -0
  522. package/src/reorder/list-view.ts +262 -0
  523. package/src/reorder/model.ts +47 -0
  524. package/src/reorder/surface.ts +10 -0
  525. package/src/reorder/types.ts +87 -0
  526. package/src/sampling.ts +173 -0
  527. package/src/scene-appearance.ts +92 -0
  528. package/src/scene-camera.ts +30 -0
  529. package/src/scene-shader.ts +139 -0
  530. package/src/scroll-header/geometry.ts +88 -0
  531. package/src/scroll-header/index.ts +504 -0
  532. package/src/scroll-header/native.ts +89 -0
  533. package/src/sensors/index.ts +246 -0
  534. package/src/sensors/native.ts +72 -0
  535. package/src/sequence.ts +209 -20
  536. package/src/shapes/android.ts +63 -0
  537. package/src/shapes/index.ts +267 -0
  538. package/src/shapes/ios.ts +194 -0
  539. package/src/shapes/native.ts +27 -0
  540. package/src/shapes/path.ts +127 -0
  541. package/src/shapes/types.ts +63 -0
  542. package/src/shared-layout/index.ts +343 -0
  543. package/src/shared-layout/native.ts +138 -0
  544. package/src/shared-layout/timing.ts +87 -0
  545. package/src/shared-navigation/entry.ts +695 -0
  546. package/src/shared-navigation/index.ts +414 -0
  547. package/src/shared-navigation/return-signal.ts +41 -0
  548. package/src/shared-navigation/return-target.ts +197 -0
  549. package/src/shared-navigation/scope.ts +3 -0
  550. package/src/shared-navigation/targets.ts +38 -0
  551. package/src/size-layout.ts +237 -0
  552. package/src/size.ts +302 -0
  553. package/src/spring.ts +18 -0
  554. package/src/svg-path.ts +8 -3
  555. package/src/testing/clock.ts +128 -0
  556. package/src/testing/handoff-recorder.ts +98 -0
  557. package/src/testing/index.ts +4 -0
  558. package/src/testing/native.ts +386 -0
  559. package/src/testing/presentation.ts +46 -0
  560. package/src/testing/replay.ts +149 -0
  561. package/src/testing/scroll-handoff-native.ts +201 -0
  562. package/src/testing/scroll-handoff.ts +140 -0
  563. package/src/testing/sensors.ts +41 -0
  564. package/src/testing/trace.ts +340 -0
  565. package/src/timed-animation.ts +192 -0
  566. package/src/track.ts +334 -38
  567. package/src/transition.ts +197 -9
  568. package/src/types.ts +11 -1
  569. package/src/value-observers.ts +147 -0
  570. package/src/value-track.ts +71 -0
  571. package/src/vue/index.ts +147 -1
  572. package/src/zoomable.ts +1 -1
@@ -0,0 +1,504 @@
1
+ import {
2
+ Application,
3
+ ListView,
4
+ Label,
5
+ LayoutBase,
6
+ View,
7
+ Trace,
8
+ isIOS,
9
+ } from '@nativescript/core'
10
+ import { bind, motionValue, springValue, type SpringValue } from '../motion-value.js'
11
+ import { set } from '../animate.js'
12
+ import { reducedMotion, onReducedMotion } from '../config.js'
13
+ import { getDriver } from '../driver/index.js'
14
+ import {
15
+ createScrollHeaderDriver,
16
+ type ScrollHeaderDriver,
17
+ type ScrollHeaderSnapshot,
18
+ } from './native.js'
19
+ import {
20
+ headerGeometry,
21
+ resizedOffset,
22
+ restoredOffset,
23
+ type ScrollHeaderGeometry,
24
+ } from './geometry.js'
25
+ export type { ScrollHeaderGeometry, ScrollHeaderSnapshot }
26
+
27
+ export interface ScrollHeaderOptions {
28
+ /** Retained overlay siblings of the list. The header owns artwork/title descendants. */
29
+ header: LayoutBase
30
+ artwork: View
31
+ title: View
32
+ toolbar: View
33
+ toolbarTitle: View
34
+ section: View
35
+ /** Fixed data-row height in DIPs. Row zero is a separate, non-accessible spacer. */
36
+ rowHeight: number
37
+ /** Update only spacer row zero, then refresh the list. Called at layout boundaries. */
38
+ setSpacerHeight(height: number): void
39
+ /** Original spacer height to restore at disposal; defaults to zero. */
40
+ originalSpacerHeight?: number
41
+ expandedHeight?: number
42
+ minimumHeight?: number
43
+ parallax?: number
44
+ /** Fractions of the collapse range, from zero to one. */
45
+ titleFade?: readonly [number, number]
46
+ toolbarFade?: readonly [number, number]
47
+ /** iOS bounce stretches artwork. Android ListView uses its ordinary no-stretch behavior. */
48
+ stretch?: boolean
49
+ /** Stable data keys, excluding spacer row zero. Required by preserveAnchor(). */
50
+ keys?: () => readonly string[]
51
+ diagnostic?: Label
52
+ onState?: (state: ScrollHeaderSnapshot) => void
53
+ }
54
+ export interface ScrollHeader {
55
+ readonly ready: boolean
56
+ readonly disposed: boolean
57
+ readonly state: ScrollHeaderSnapshot
58
+ readonly geometry: ScrollHeaderGeometry | undefined
59
+ remeasure(): Promise<void>
60
+ preserveAnchor(change: () => void | Promise<void>): Promise<void>
61
+ /** Data index, excluding spacer. Aligns below the compact toolbar and pinned section. */
62
+ scrollToItem(index: number, animated?: boolean): void
63
+ scrollToTop(animated?: boolean): void
64
+ pause(): void
65
+ play(): void
66
+ dispose(): void
67
+ }
68
+ const owners = new WeakMap<ListView, ScrollHeader>()
69
+ const descendant = (view: View, parent: View) => {
70
+ for (let current: View['parent'] = view; current; current = current.parent)
71
+ if (current === parent) return true
72
+ return false
73
+ }
74
+ const initialState = (): ScrollHeaderSnapshot => ({
75
+ offset: 0,
76
+ minimumOffset: 0,
77
+ maximumOffset: 0,
78
+ phase: 'expanded',
79
+ updates: 0,
80
+ callbacks: 0,
81
+ first: 0,
82
+ visible: 0,
83
+ total: 0,
84
+ })
85
+
86
+ /** Core ListView adapter: one spacer, fixed data rows, retained header/toolbar/section. */
87
+ export function scrollHeader(list: ListView, options: ScrollHeaderOptions): ScrollHeader {
88
+ if (
89
+ !(list instanceof ListView) ||
90
+ list.sectioned ||
91
+ list.stickyHeader ||
92
+ list.showSearch
93
+ )
94
+ throw new TypeError(
95
+ 'scrollHeader requires a flat Core ListView without built-in sticky headers or search.',
96
+ )
97
+ if (!options || typeof options.setSpacerHeight !== 'function')
98
+ throw new TypeError('Provide setSpacerHeight() for list row zero.')
99
+ if (options.diagnostic !== undefined && !(options.diagnostic instanceof Label))
100
+ throw new TypeError('diagnostic must be a Core Label.')
101
+ const { header, artwork, title, toolbar, toolbarTitle, section } = options
102
+ if (
103
+ ![header, artwork, title, toolbar, toolbarTitle, section].every(
104
+ (view) => view instanceof View,
105
+ ) ||
106
+ !(list.parent instanceof LayoutBase) ||
107
+ !(header instanceof LayoutBase) ||
108
+ ![header, toolbar, section].every((view) => view.parent === list.parent) ||
109
+ !descendant(artwork, header) ||
110
+ !descendant(title, header) ||
111
+ !descendant(toolbarTitle, toolbar) ||
112
+ new Set([list, header, artwork, title, toolbar, toolbarTitle, section]).size !== 7
113
+ )
114
+ throw new TypeError(
115
+ 'Use distinct retained header, toolbar and section siblings with artwork/title descendants.',
116
+ )
117
+ for (const key of ['rowHeight', 'expandedHeight', 'minimumHeight'] as const)
118
+ if (
119
+ options[key] !== undefined &&
120
+ (!Number.isFinite(options[key]) || options[key]! <= 0)
121
+ )
122
+ throw new RangeError(`${key} must be positive and finite.`)
123
+ if (!Number.isFinite(options.rowHeight) || options.rowHeight <= 0)
124
+ throw new RangeError('rowHeight must be positive and finite.')
125
+ for (const key of ['parallax', 'originalSpacerHeight'] as const)
126
+ if (
127
+ options[key] !== undefined &&
128
+ (!Number.isFinite(options[key]) || options[key]! < 0)
129
+ )
130
+ throw new RangeError(`${key} must be finite and nonnegative.`)
131
+ if (options.stretch !== undefined && typeof options.stretch !== 'boolean')
132
+ throw new TypeError('stretch must be boolean.')
133
+ for (const callback of [options.keys, options.onState])
134
+ if (callback !== undefined && typeof callback !== 'function')
135
+ throw new TypeError('Scroll header callbacks must be functions.')
136
+ owners.get(list)?.dispose()
137
+ const host = list.parent
138
+ const saved = {
139
+ clip: host.clipToBounds,
140
+ headerClip: header.clipToBounds,
141
+ headerY: header.translateY,
142
+ titleY: title.translateY,
143
+ titleOpacity: title.opacity,
144
+ artworkY: artwork.translateY,
145
+ scaleX: artwork.scaleX,
146
+ scaleY: artwork.scaleY,
147
+ originY: artwork.originY,
148
+ toolbarOpacity: toolbar.opacity,
149
+ sectionY: section.translateY,
150
+ }
151
+ let geometry: ScrollHeaderGeometry | undefined,
152
+ native: ScrollHeaderDriver | undefined,
153
+ value: SpringValue | undefined
154
+ let ended = false,
155
+ held = false,
156
+ background = false,
157
+ queued = false,
158
+ revision = 0
159
+ let measuring: Promise<void> | undefined,
160
+ operation = false
161
+ let detachBindings: (() => void)[] = [],
162
+ pending = new Set<() => void>(),
163
+ last = initialState()
164
+ const notify = () => {
165
+ if (ended) return
166
+ last = native?.snapshot() ?? last
167
+ try {
168
+ options.onState?.(last)
169
+ } catch (error) {
170
+ Trace.write(String(error), 'Jolt', Trace.messageType.error)
171
+ }
172
+ }
173
+ const layout = (view: View) =>
174
+ new Promise<void>((resolve, reject) => {
175
+ let release: (() => void) | undefined,
176
+ done = false
177
+ const finish = (error?: Error) => {
178
+ if (done) return
179
+ done = true
180
+ clearTimeout(timer)
181
+ release?.()
182
+ pending.delete(cancel)
183
+ if (error) reject(error)
184
+ else resolve()
185
+ }
186
+ const cancel = () => finish(new Error('Scroll header layout was cancelled.'))
187
+ const timer = setTimeout(
188
+ () => finish(new Error('Scroll header layout timed out.')),
189
+ 1500,
190
+ )
191
+ pending.add(cancel)
192
+ const driver = getDriver()
193
+ if (!driver.afterLayout) {
194
+ finish(new Error('Native layout is unavailable.'))
195
+ return
196
+ }
197
+ release = driver.afterLayout(view, () => finish())
198
+ if (done) release?.()
199
+ else view.requestLayout()
200
+ }).then(() => {
201
+ if (isIOS) view.nativeViewProtected?.layoutIfNeeded?.()
202
+ })
203
+ const maps = () => {
204
+ if (!value || !geometry) return
205
+ detachBindings.splice(0).forEach((off) => off())
206
+ const q = value,
207
+ g = geometry,
208
+ r = g.range,
209
+ quiet = reducedMotion(),
210
+ stretch = !quiet && options.stretch !== false && isIOS
211
+ detachBindings = [
212
+ bind(header, {
213
+ y: q.to(
214
+ [-10000, 0, r],
215
+ [saved.headerY + 10000, saved.headerY, saved.headerY - r],
216
+ ),
217
+ }),
218
+ bind(section, {
219
+ y: q.to([-10000, 0, r], [g.expanded + 10000, g.expanded, g.minimum]),
220
+ }),
221
+ bind(title, {
222
+ opacity: quiet
223
+ ? q.to(
224
+ [
225
+ 0,
226
+ r * g.handoff,
227
+ r * g.handoff + Math.min(0.01, (r * (1 - g.handoff)) / 2),
228
+ r,
229
+ ],
230
+ [saved.titleOpacity, saved.titleOpacity, 0, 0],
231
+ )
232
+ : q.to(
233
+ g.titleFade.map((f) => f * r),
234
+ [saved.titleOpacity, 0],
235
+ ),
236
+ y: q.to([0, r], [saved.titleY, saved.titleY]),
237
+ }),
238
+ bind(toolbar, {
239
+ opacity: quiet
240
+ ? q.to(
241
+ [
242
+ 0,
243
+ r * g.handoff,
244
+ r * g.handoff + Math.min(0.01, (r * (1 - g.handoff)) / 2),
245
+ r,
246
+ ],
247
+ [0, 0, saved.toolbarOpacity, saved.toolbarOpacity],
248
+ )
249
+ : q.to(
250
+ g.toolbarFade.map((f) => f * r),
251
+ [0, saved.toolbarOpacity],
252
+ ),
253
+ }),
254
+ bind(artwork, {
255
+ y: q.to(
256
+ [-10000, 0, r],
257
+ [
258
+ saved.artworkY - (stretch ? 10000 : 0),
259
+ saved.artworkY,
260
+ saved.artworkY + (quiet ? 0 : g.parallax),
261
+ ],
262
+ ),
263
+ scaleX: q.to(
264
+ [-10000, 0],
265
+ [
266
+ saved.scaleX *
267
+ (1 + (stretch ? 10000 / Math.max(1, artwork.getActualSize().height) : 0)),
268
+ saved.scaleX,
269
+ ],
270
+ ),
271
+ scaleY: q.to(
272
+ [-10000, 0],
273
+ [
274
+ saved.scaleY *
275
+ (1 + (stretch ? 10000 / Math.max(1, artwork.getActualSize().height) : 0)),
276
+ saved.scaleY,
277
+ ],
278
+ ),
279
+ }),
280
+ ]
281
+ }
282
+ const measure = async () => {
283
+ if (ended || !list.isLoaded || !header.isLoaded) return
284
+ const generation = revision
285
+ await layout(host)
286
+ if (ended || generation !== revision) return
287
+ const expanded = options.expandedHeight ?? header.getActualSize().height
288
+ const minimum = options.minimumHeight ?? toolbar.getActualSize().height
289
+ const divider = isIOS
290
+ ? 0
291
+ : list.android.getDividerHeight() /
292
+ list.android.getResources().getDisplayMetrics().density
293
+ const next = headerGeometry(
294
+ expanded,
295
+ minimum,
296
+ section.getActualSize().height,
297
+ isIOS
298
+ ? options.rowHeight
299
+ : Math.round(
300
+ options.rowHeight * list.android.getResources().getDisplayMetrics().density,
301
+ ) / list.android.getResources().getDisplayMetrics().density,
302
+ options.parallax ?? Math.min(64, (expanded - minimum) * 0.25),
303
+ divider,
304
+ options.titleFade,
305
+ options.toolbarFade,
306
+ )
307
+ if (geometry && JSON.stringify(next) === JSON.stringify(geometry) && native) return
308
+ const before = geometry,
309
+ offset = native?.snapshot().offset ?? (last.updates ? last.offset : undefined)
310
+ geometry = next
311
+ native?.enabled(false)
312
+ try {
313
+ native?.configure(next, reducedMotion())
314
+ options.setSpacerHeight(next.spacer)
315
+ await layout(list)
316
+ if (ended || generation !== revision) return
317
+ value ??= springValue(motionValue(0), { duration: 0 })
318
+ maps()
319
+ if (!native)
320
+ native = createScrollHeaderDriver(
321
+ list,
322
+ value,
323
+ { title, toolbarTitle, toolbar, diagnostic: options.diagnostic },
324
+ next,
325
+ reducedMotion(),
326
+ () => {
327
+ void Promise.resolve().then(notify)
328
+ },
329
+ )
330
+ if (offset !== undefined)
331
+ native.scroll(before ? resizedOffset(offset, before, next) : offset, false)
332
+ native.enabled(!held && !background)
333
+ notify()
334
+ } finally {
335
+ native?.enabled(!held && !background)
336
+ }
337
+ }
338
+ const queueMeasure = () => {
339
+ if (ended || queued || measuring || operation) return
340
+ queued = true
341
+ void Promise.resolve()
342
+ .then(() => {
343
+ queued = false
344
+ return control.remeasure()
345
+ })
346
+ .catch((error) => {
347
+ if (!ended && list.isLoaded)
348
+ Trace.write(`Scroll header: ${String(error)}`, 'Jolt', Trace.messageType.error)
349
+ })
350
+ }
351
+ const detach = () => {
352
+ revision++
353
+ for (const cancel of [...pending]) cancel()
354
+ last = native?.snapshot() ?? last
355
+ native?.dispose()
356
+ native = undefined
357
+ detachBindings.splice(0).forEach((off) => off())
358
+ value?.dispose()
359
+ value = undefined
360
+ }
361
+ const suspend = () => {
362
+ background = true
363
+ native?.enabled(false)
364
+ }
365
+ const resume = () => {
366
+ background = false
367
+ native?.enabled(!held)
368
+ queueMeasure()
369
+ }
370
+ const offMotion = onReducedMotion(() => {
371
+ maps()
372
+ if (geometry) native?.configure(geometry, reducedMotion())
373
+ })
374
+ const control: ScrollHeader = {
375
+ get ready() {
376
+ return !!native && !ended
377
+ },
378
+ get disposed() {
379
+ return ended
380
+ },
381
+ get state() {
382
+ return native?.snapshot() ?? last
383
+ },
384
+ get geometry() {
385
+ return geometry
386
+ },
387
+ remeasure() {
388
+ if (measuring) return measuring
389
+ measuring = measure().finally(() => {
390
+ measuring = undefined
391
+ })
392
+ return measuring
393
+ },
394
+ async preserveAnchor(change) {
395
+ if (ended || !native || !geometry)
396
+ throw new Error('Wait for scrollHeader to be ready.')
397
+ if (operation) throw new Error('A scroll anchor update is already in progress.')
398
+ if (!options.keys || typeof change !== 'function')
399
+ throw new TypeError('preserveAnchor requires keys() and an update callback.')
400
+ const before = geometry,
401
+ offset = native.snapshot().offset,
402
+ keys = [...options.keys()]
403
+ if (
404
+ new Set(keys).size !== keys.length ||
405
+ keys.some((key) => typeof key !== 'string' || !key)
406
+ )
407
+ throw new TypeError('Data keys must be unique nonempty strings.')
408
+ const index = Math.min(
409
+ Math.max(
410
+ 0,
411
+ Math.floor(
412
+ (offset - before.range - before.divider) /
413
+ (before.rowHeight + before.divider),
414
+ ),
415
+ ),
416
+ Math.max(0, keys.length - 1),
417
+ ),
418
+ key = keys[index]
419
+ operation = true
420
+ native.enabled(false)
421
+ try {
422
+ await change()
423
+ await layout(list)
424
+ if (ended || !native) return
425
+ const next = [...options.keys()]
426
+ if (
427
+ new Set(next).size !== next.length ||
428
+ next.some((key) => typeof key !== 'string' || !key)
429
+ )
430
+ throw new TypeError('Data keys must remain unique.')
431
+ const found = next.indexOf(key!),
432
+ destination = found >= 0 ? found : Math.min(index, Math.max(0, next.length - 1))
433
+ native.scroll(
434
+ restoredOffset(offset, before, geometry!, index, destination),
435
+ false,
436
+ )
437
+ await layout(list)
438
+ if (!ended) notify()
439
+ } finally {
440
+ operation = false
441
+ native?.enabled(!held && !background)
442
+ queueMeasure()
443
+ }
444
+ },
445
+ scrollToItem(index, animated = false) {
446
+ if (!Number.isSafeInteger(index) || index < 0)
447
+ throw new RangeError('Use a nonnegative data-item index.')
448
+ if (geometry)
449
+ native?.scroll(
450
+ geometry.range +
451
+ geometry.divider +
452
+ index * (geometry.rowHeight + geometry.divider),
453
+ animated && !reducedMotion(),
454
+ )
455
+ },
456
+ scrollToTop(animated = false) {
457
+ native?.scroll(0, animated && !reducedMotion())
458
+ },
459
+ pause() {
460
+ held = true
461
+ native?.enabled(false)
462
+ },
463
+ play() {
464
+ held = false
465
+ native?.enabled(!background)
466
+ },
467
+ dispose() {
468
+ if (ended) return
469
+ ended = true
470
+ detach()
471
+ offMotion()
472
+ for (const view of [list, header, toolbar, section, host]) {
473
+ view.off('loaded', queueMeasure)
474
+ view.off('layoutChanged', queueMeasure)
475
+ }
476
+ list.off('unloaded', detach)
477
+ Application.off(Application.suspendEvent, suspend)
478
+ Application.off(Application.resumeEvent, resume)
479
+ set(header, { y: saved.headerY })
480
+ set(title, { y: saved.titleY, opacity: saved.titleOpacity })
481
+ set(toolbar, { opacity: saved.toolbarOpacity })
482
+ set(section, { y: saved.sectionY })
483
+ set(artwork, { y: saved.artworkY, scaleX: saved.scaleX, scaleY: saved.scaleY })
484
+ artwork.originY = saved.originY
485
+ host.clipToBounds = saved.clip
486
+ header.clipToBounds = saved.headerClip
487
+ options.setSpacerHeight(options.originalSpacerHeight ?? 0)
488
+ if (owners.get(list) === control) owners.delete(list)
489
+ },
490
+ }
491
+ owners.set(list, control)
492
+ host.clipToBounds = true
493
+ if (isIOS) header.clipToBounds = false
494
+ artwork.originY = 0
495
+ for (const view of [list, header, toolbar, section, host]) {
496
+ view.on('loaded', queueMeasure)
497
+ view.on('layoutChanged', queueMeasure)
498
+ }
499
+ list.on('unloaded', detach)
500
+ Application.on(Application.suspendEvent, suspend)
501
+ Application.on(Application.resumeEvent, resume)
502
+ queueMeasure()
503
+ return control
504
+ }
@@ -0,0 +1,89 @@
1
+ import { isIOS, type ListView, type View } from '@nativescript/core'
2
+ import { liveValueInput, type SpringValue } from '../motion-value.js'
3
+ import { nativeLiveNode } from '../live-spring-driver.js'
4
+ import type { ScrollHeaderGeometry } from './geometry.js'
5
+
6
+ export interface ScrollHeaderSnapshot {
7
+ offset: number
8
+ minimumOffset: number
9
+ maximumOffset: number
10
+ phase: 'expanded' | 'between' | 'collapsed'
11
+ updates: number
12
+ callbacks: number
13
+ first: number
14
+ visible: number
15
+ total: number
16
+ }
17
+ export interface ScrollHeaderDriver {
18
+ snapshot(): ScrollHeaderSnapshot
19
+ configure(geometry: ScrollHeaderGeometry, reduced: boolean): void
20
+ scroll(offset: number, animated: boolean): void
21
+ enabled(value: boolean): void
22
+ dispose(): void
23
+ }
24
+ export function createScrollHeaderDriver(
25
+ list: ListView,
26
+ value: SpringValue,
27
+ views: { title: View; toolbarTitle: View; toolbar: View; diagnostic?: View },
28
+ geometry: ScrollHeaderGeometry,
29
+ reduced: boolean,
30
+ onState: () => void,
31
+ ): ScrollHeaderDriver {
32
+ const input = liveValueInput(value),
33
+ node = nativeLiveNode(input.node)
34
+ const changed = () => {
35
+ input.changed()
36
+ onState()
37
+ }
38
+ const settings = () => JSON.stringify({ ...geometry, reduced })
39
+ if (isIOS) {
40
+ if (typeof JoltScrollHeader === 'undefined')
41
+ throw new Error('Rebuild the native app to use scrollHeader().')
42
+ const native =
43
+ JoltScrollHeader.attachNodeTitleToolbarTitleToolbarDiagnosticOptionsOnState(
44
+ list.ios,
45
+ node as JoltLiveSpring,
46
+ views.title.nativeViewProtected,
47
+ views.toolbarTitle.nativeViewProtected,
48
+ views.toolbar.nativeViewProtected,
49
+ views.diagnostic?.nativeViewProtected ?? null,
50
+ settings(),
51
+ changed,
52
+ )
53
+ return {
54
+ snapshot: () => JSON.parse(native.snapshot()),
55
+ configure: (next, motion) => {
56
+ geometry = next
57
+ reduced = motion
58
+ native.configure(settings())
59
+ },
60
+ scroll: (offset, animated) => native.scrollAnimated(offset, animated),
61
+ enabled: (value) => native.setEnabled(value),
62
+ dispose: () => native.dispose(),
63
+ }
64
+ }
65
+ const Native = org.rafaelaugusto.jolt.ScrollHeader
66
+ if (typeof Native !== 'function')
67
+ throw new Error('Rebuild the native app to use scrollHeader().')
68
+ const native = new Native(
69
+ list.android,
70
+ node as org.rafaelaugusto.jolt.LiveSpring,
71
+ views.title.nativeViewProtected,
72
+ views.toolbarTitle.nativeViewProtected,
73
+ views.toolbar.nativeViewProtected,
74
+ views.diagnostic?.nativeViewProtected ?? null,
75
+ settings(),
76
+ new org.rafaelaugusto.jolt.ScrollHeader.Listener({ changed }),
77
+ )
78
+ return {
79
+ snapshot: () => JSON.parse(native.snapshot()),
80
+ configure: (next, motion) => {
81
+ geometry = next
82
+ reduced = motion
83
+ native.configure(settings())
84
+ },
85
+ scroll: (offset, animated) => native.scroll(offset, animated),
86
+ enabled: (value) => native.setEnabled(value),
87
+ dispose: () => native.dispose(),
88
+ }
89
+ }