@rafaelaugusto/jolt 0.1.0-beta.9 → 0.1.0-rc.2

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