@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,243 @@
1
+ import { Application, ListView, Trace, type View } from '@nativescript/core'
2
+ import { onReducedMotion, reducedMotion } from '../config.js'
3
+ import { coreListAdapter } from './list-view.js'
4
+ import { itemKeys, moveAt, sameKeys } from './model.js'
5
+ import type {
6
+ Reorder,
7
+ ReorderAdapter,
8
+ ReorderAdapterDriver,
9
+ ReorderCancelReason,
10
+ ReorderKey,
11
+ ReorderNativeEvent,
12
+ ReorderOptions,
13
+ } from './types.js'
14
+
15
+ export { coreListAdapter }
16
+ export { ReorderHandle } from './handle.js'
17
+ export { ReorderSurface } from './surface.js'
18
+ export type * from './types.js'
19
+
20
+ const owners = new WeakMap<View, { dispose(): void }>()
21
+ function report(callback: () => void) {
22
+ try {
23
+ callback()
24
+ } catch (error) {
25
+ Trace.write(
26
+ `Jolt reorder callback failed: ${String(error)}`,
27
+ Trace.categories.Error,
28
+ Trace.messageType.error,
29
+ )
30
+ }
31
+ }
32
+
33
+ /** Reorder a flat, vertical Core ListView, or an explicitly supported adapter. */
34
+ export function reorder<T, K extends ReorderKey = ReorderKey>(
35
+ source: ListView | ReorderAdapter<T>,
36
+ options: ReorderOptions<T, K>,
37
+ ): Reorder<K> {
38
+ if (
39
+ !options ||
40
+ typeof options.key !== 'function' ||
41
+ typeof options.onCommit !== 'function'
42
+ )
43
+ throw new TypeError('reorder() requires key(item) and onCommit(move).')
44
+ const adapter = source instanceof ListView ? coreListAdapter<T>(source) : source
45
+ if (
46
+ !adapter?.view ||
47
+ typeof adapter.items !== 'function' ||
48
+ typeof adapter.subscribe !== 'function' ||
49
+ typeof adapter.attach !== 'function'
50
+ )
51
+ throw new TypeError('Provide a Core ListView or a ReorderAdapter.')
52
+ for (const callback of [options.onStart, options.onCancel])
53
+ if (callback !== undefined && typeof callback !== 'function')
54
+ throw new TypeError('Reorder callbacks must be functions.')
55
+ if (
56
+ options.handle !== undefined &&
57
+ typeof options.handle !== 'string' &&
58
+ typeof options.handle !== 'function'
59
+ )
60
+ throw new TypeError('The reorder handle must be a view id or resolver.')
61
+ const longPress = options.longPress ?? 350,
62
+ edgeSize = options.edge?.size ?? 72,
63
+ edgeSpeed = options.edge?.speed ?? 640
64
+ if (!Number.isFinite(longPress) || longPress < 150 || longPress > 2000)
65
+ throw new RangeError('Reorder longPress must be between 150 and 2000 ms.')
66
+ if (![edgeSize, edgeSpeed].every((value) => Number.isFinite(value) && value > 0))
67
+ throw new RangeError('Reorder edge size and speed must be positive finite numbers.')
68
+
69
+ const view = adapter.view
70
+ let keys = itemKeys(adapter.items(), options.key)
71
+ owners.get(view)?.dispose()
72
+ let driver: ReorderAdapterDriver | undefined,
73
+ active: { key: K; index: number; keys: K[] } | undefined,
74
+ disposed = false,
75
+ paused = false
76
+ const read = () => itemKeys(adapter.items(), options.key)
77
+
78
+ function cancel(reason: ReorderCancelReason) {
79
+ const previous = active
80
+ active = undefined
81
+ driver?.cancel()
82
+ if (previous) report(() => options.onCancel?.({ key: previous.key, reason }))
83
+ }
84
+ function refresh() {
85
+ if (disposed) return
86
+ let next: K[]
87
+ try {
88
+ next = read()
89
+ } catch (error) {
90
+ cancel('data-changed')
91
+ throw error
92
+ }
93
+ if (active) cancel(next.includes(active.key) ? 'data-changed' : 'removed')
94
+ keys = next
95
+ }
96
+ function event(event: ReorderNativeEvent) {
97
+ if (disposed || paused) return
98
+ if (event.type === 'start') {
99
+ keys = read()
100
+ const key = keys[event.index]
101
+ if (key === undefined) {
102
+ driver?.cancel()
103
+ return
104
+ }
105
+ active = { key, index: event.index, keys: [...keys] }
106
+ report(() => options.onStart?.(key))
107
+ } else if (event.type === 'cancel') {
108
+ cancel(event.geometryChanged ? 'geometry-changed' : 'cancelled')
109
+ } else {
110
+ const previous = active
111
+ if (!previous) return
112
+ const next = read()
113
+ if (!sameKeys(previous.keys, next) || event.index !== previous.index) {
114
+ cancel(next.includes(previous.key) ? 'data-changed' : 'removed')
115
+ keys = next
116
+ return
117
+ }
118
+ const move = moveAt(previous.keys, previous.index, event.toIndex)
119
+ active = undefined
120
+ if (move) report(() => options.onCommit(move))
121
+ else report(() => options.onCancel?.({ key: previous.key, reason: 'unchanged' }))
122
+ keys = read()
123
+ }
124
+ }
125
+ function moveTo(key: K, toIndex: number): boolean {
126
+ if (disposed || paused) return false
127
+ cancel('cancelled')
128
+ keys = read()
129
+ const move = moveAt(keys, keys.indexOf(key), toIndex)
130
+ if (!move) return false
131
+ report(() => options.onCommit(move))
132
+ keys = read()
133
+ return true
134
+ }
135
+ function attach() {
136
+ if (disposed || driver || !view.isLoaded) return
137
+ keys = read()
138
+ driver = adapter.attach({
139
+ handle: options.handle,
140
+ longPress,
141
+ edgeSize,
142
+ edgeSpeed,
143
+ reducedMotion: reducedMotion(),
144
+ accessibility: {
145
+ moveUp: options.accessibility?.moveUp ?? 'Move up',
146
+ moveDown: options.accessibility?.moveDown ?? 'Move down',
147
+ },
148
+ event: (input) => {
149
+ try {
150
+ event(input)
151
+ } catch (error) {
152
+ cancel('data-changed')
153
+ report(() => {
154
+ throw error
155
+ })
156
+ }
157
+ },
158
+ move: (index, direction) => {
159
+ keys = read()
160
+ const key = keys[index]
161
+ return key !== undefined && moveTo(key, index + direction) ? key : undefined
162
+ },
163
+ keyAt: (index) => keys[index],
164
+ indexOf: (key) => {
165
+ try {
166
+ return read().indexOf(key as K)
167
+ } catch {
168
+ return -1
169
+ }
170
+ },
171
+ })
172
+ driver.setEnabled(!paused)
173
+ }
174
+ function unload() {
175
+ cancel('unloaded')
176
+ driver?.dispose()
177
+ driver = undefined
178
+ }
179
+ const suspend = () => cancel('cancelled')
180
+ const releaseItems = adapter.subscribe(refresh)
181
+ const releaseReduced = onReducedMotion((value) => driver?.setReducedMotion(value))
182
+ const result: Reorder<K> = {
183
+ get activeKey() {
184
+ return active?.key
185
+ },
186
+ get disposed() {
187
+ return disposed
188
+ },
189
+ move(key, beforeKey) {
190
+ if (disposed || paused) return false
191
+ const current = read(),
192
+ from = current.indexOf(key)
193
+ if (from < 0 || beforeKey === key) return false
194
+ const before = beforeKey === null ? current.length : current.indexOf(beforeKey)
195
+ return before < 0 ? false : moveTo(key, before > from ? before - 1 : before)
196
+ },
197
+ moveUp(key) {
198
+ if (disposed || paused) return false
199
+ return moveTo(key, read().indexOf(key) - 1)
200
+ },
201
+ moveDown(key) {
202
+ if (disposed || paused) return false
203
+ return moveTo(key, read().indexOf(key) + 1)
204
+ },
205
+ cancel: () => cancel('cancelled'),
206
+ refresh,
207
+ pause() {
208
+ paused = true
209
+ cancel('disabled')
210
+ driver?.setEnabled(false)
211
+ },
212
+ play() {
213
+ if (!disposed) {
214
+ paused = false
215
+ driver?.setEnabled(true)
216
+ }
217
+ },
218
+ dispose() {
219
+ if (disposed) return
220
+ cancel('disposed')
221
+ disposed = true
222
+ driver?.dispose()
223
+ driver = undefined
224
+ releaseItems()
225
+ releaseReduced()
226
+ view.off('loaded', attach)
227
+ view.off('unloaded', unload)
228
+ Application.off(Application.suspendEvent, suspend)
229
+ if (owners.get(view) === result) owners.delete(view)
230
+ },
231
+ }
232
+ owners.set(view, result)
233
+ view.on('loaded', attach)
234
+ view.on('unloaded', unload)
235
+ Application.on(Application.suspendEvent, suspend)
236
+ try {
237
+ attach()
238
+ } catch (error) {
239
+ result.dispose()
240
+ throw error
241
+ }
242
+ return result
243
+ }
@@ -0,0 +1,262 @@
1
+ import {
2
+ ListView,
3
+ isIOS,
4
+ type EventData,
5
+ type ItemEventData,
6
+ type View,
7
+ } from '@nativescript/core'
8
+ import { sheetActions as viewActions } from '../bottom-sheet/native.js'
9
+ import type { ReorderAdapter, ReorderKey } from './types.js'
10
+ import { ReorderHandle } from './handle.js'
11
+ import { ReorderSurface } from './surface.js'
12
+
13
+ /** Flat Core ListView only. Sectioned lists and plugin collection views need another adapter. */
14
+ export function coreListAdapter<T>(list: ListView): ReorderAdapter<T> {
15
+ if (!(list instanceof ListView)) throw new TypeError('Expected a Core ListView.')
16
+ function validate() {
17
+ if (list.sectioned || list.stickyHeader || list.showSearch)
18
+ throw new TypeError(
19
+ 'Reorder supports flat Core lists without built-in headers or search.',
20
+ )
21
+ }
22
+ validate()
23
+ return {
24
+ view: list,
25
+ items() {
26
+ validate()
27
+ const source = list.items
28
+ return Array.from({ length: source?.length ?? 0 }, (_, index) =>
29
+ Array.isArray(source) ? source[index] : source.getItem(index),
30
+ ) as T[]
31
+ },
32
+ subscribe(changed) {
33
+ let source:
34
+ | {
35
+ on?(event: string, listener: () => void): void
36
+ off?(event: string, listener: () => void): void
37
+ }
38
+ | undefined
39
+ const replaced = () => {
40
+ source?.off?.('change', changed)
41
+ source = list.items as typeof source
42
+ source?.on?.('change', changed)
43
+ changed()
44
+ }
45
+ list.on('itemsChange', replaced)
46
+ replaced()
47
+ return () => {
48
+ list.off('itemsChange', replaced)
49
+ source?.off?.('change', changed)
50
+ }
51
+ },
52
+ attach(config) {
53
+ validate()
54
+ const options = JSON.stringify({
55
+ longPress: config.longPress,
56
+ edgeSize: config.edgeSize,
57
+ edgeSpeed: config.edgeSpeed,
58
+ reducedMotion: config.reducedMotion,
59
+ handles: config.handle !== undefined,
60
+ })
61
+ let draggedKey: ReorderKey | undefined
62
+ const event = (state: number, index: number, toIndex: number) => {
63
+ if (state === 1) {
64
+ config.event({ type: 'start', index })
65
+ draggedKey = config.keyAt(index)
66
+ } else if (state === 2) {
67
+ const key = draggedKey
68
+ draggedKey = undefined
69
+ config.event({ type: 'commit', index, toIndex })
70
+ if (key !== undefined) focusKey(key, false)
71
+ } else {
72
+ draggedKey = undefined
73
+ config.event({ type: 'cancel', geometryChanged: toIndex === 1 })
74
+ }
75
+ }
76
+ let native: {
77
+ registerHandle(view: any): void
78
+ setEnabled(value: boolean): void
79
+ setReducedMotion(value: boolean): void
80
+ cancel(): void
81
+ dispose(): void
82
+ }
83
+ if (isIOS) {
84
+ if (typeof JoltReorderSession === 'undefined')
85
+ throw new Error('Rebuild the native app to use reorder().')
86
+ native = JoltReorderSession.attachOptionsOnState(
87
+ list.nativeViewProtected,
88
+ options,
89
+ event,
90
+ )
91
+ } else {
92
+ if (
93
+ !(list.parent instanceof ReorderSurface) ||
94
+ list.parent.getChildrenCount() !== 1
95
+ )
96
+ throw new TypeError(
97
+ 'On Android, make the Core ListView the only child of a ReorderSurface.',
98
+ )
99
+ if (typeof org.rafaelaugusto.jolt.ReorderSession === 'undefined')
100
+ throw new Error('Rebuild the native app to use reorder().')
101
+ native = new org.rafaelaugusto.jolt.ReorderSession(
102
+ list.parent.nativeViewProtected,
103
+ list.nativeViewProtected,
104
+ options,
105
+ new org.rafaelaugusto.jolt.ReorderSession.Listener({ onState: event }),
106
+ )
107
+ }
108
+ type Row = {
109
+ index: number
110
+ handle?: View
111
+ release(): void
112
+ timer?: ReturnType<typeof setTimeout>
113
+ }
114
+ const rows = new Map<View, Row>()
115
+ let ended = false
116
+ let focusTimer: ReturnType<typeof setTimeout> | undefined
117
+ function moveRow(row: Row, direction: -1 | 1, accessible: boolean) {
118
+ const key = config.move(row.index, direction)
119
+ if (key !== undefined) focusKey(key, accessible)
120
+ }
121
+ function reveal(index: number) {
122
+ // Run once after the app commits and Core rebinds. Estimated iOS heights
123
+ // can move the dropped row outside the viewport during reloadData.
124
+ if (isIOS) {
125
+ const table = list.nativeViewProtected as UITableView
126
+ table.layoutIfNeeded()
127
+ const path = NSIndexPath.indexPathForRowInSection(index, 0)
128
+ const rect = table.rectForRowAtIndexPath(path)
129
+ const top = table.bounds.origin.y + table.adjustedContentInset.top
130
+ const bottom =
131
+ table.bounds.origin.y +
132
+ table.bounds.size.height -
133
+ table.adjustedContentInset.bottom
134
+ // Keep the target away from an edge while UIKit resolves estimated heights.
135
+ if (rect.origin.y < top || rect.origin.y + rect.size.height > bottom)
136
+ table.scrollToRowAtIndexPathAtScrollPositionAnimated(path, 2, false)
137
+ } else {
138
+ const table = list.nativeViewProtected as android.widget.ListView
139
+ const cell = table.getChildAt(index - table.getFirstVisiblePosition())
140
+ if (!cell) list.scrollToIndex(index)
141
+ else {
142
+ const top = cell.getTop() - table.getPaddingTop()
143
+ const bottom = cell.getBottom() - table.getHeight() + table.getPaddingBottom()
144
+ if (top < 0) table.scrollListBy(top)
145
+ else if (bottom > 0) table.scrollListBy(bottom)
146
+ }
147
+ }
148
+ }
149
+ function focusKey(key: ReorderKey, accessible: boolean) {
150
+ if (ended) return
151
+ if (focusTimer !== undefined) clearTimeout(focusTimer)
152
+ let attempts = 0
153
+ const focus = () => {
154
+ focusTimer = undefined
155
+ if (ended) return
156
+ const index = config.indexOf(key)
157
+ if (index < 0) return
158
+ reveal(index)
159
+ const target = [...rows.values()].find(
160
+ (entry) => entry.index === index && entry.handle?.isLoaded,
161
+ )
162
+ if (target?.handle && list.isItemAtIndexVisible(index)) {
163
+ target.handle.focus()
164
+ if (accessible) target.handle.accessibilityScreenChanged()
165
+ } else if (attempts++ < 4) {
166
+ focusTimer = setTimeout(focus, 30)
167
+ }
168
+ }
169
+ // Core lays out recycled rows after Vue flushes its new items.
170
+ focusTimer = setTimeout(focus, 30)
171
+ }
172
+ function loaded(data: EventData) {
173
+ const args = data as ItemEventData
174
+ if (!args.view || ended) return
175
+ const view = args.view
176
+ let row = rows.get(view)
177
+ if (!row) {
178
+ row = { index: args.index, release() {} }
179
+ rows.set(view, row)
180
+ }
181
+ row.index = args.index
182
+ if (row.timer !== undefined) clearTimeout(row.timer)
183
+ const current = row
184
+ // Vue/Core finishes binding and creating native children after itemLoading.
185
+ row.timer = setTimeout(() => {
186
+ current.timer = undefined
187
+ if (ended) return
188
+ const handle =
189
+ typeof config.handle === 'function'
190
+ ? config.handle(view)
191
+ : typeof config.handle === 'string'
192
+ ? view.getViewById<View>(config.handle)
193
+ : view
194
+ if (!handle?.nativeViewProtected) return
195
+ if (current.handle !== handle) {
196
+ current.release()
197
+ current.handle = handle
198
+ const releaseActions = viewActions(handle, [
199
+ {
200
+ label: config.accessibility.moveUp,
201
+ run: () => moveRow(current, -1, true),
202
+ },
203
+ {
204
+ label: config.accessibility.moveDown,
205
+ run: () => moveRow(current, 1, true),
206
+ },
207
+ ])
208
+ let releaseKeys = () => {}
209
+ if (handle instanceof ReorderHandle) {
210
+ const move = (direction: number) =>
211
+ moveRow(current, direction < 0 ? -1 : 1, false)
212
+ if (isIOS) {
213
+ const button = handle.nativeViewProtected as JoltReorderHandle
214
+ button.onMove = move
215
+ releaseKeys = () => {
216
+ button.onMove = null
217
+ }
218
+ } else {
219
+ const button =
220
+ handle.nativeViewProtected as org.rafaelaugusto.jolt.ReorderHandle
221
+ button.setMoveListener(
222
+ new org.rafaelaugusto.jolt.ReorderHandle.MoveListener({ move }),
223
+ )
224
+ releaseKeys = () => button.setMoveListener(null)
225
+ }
226
+ }
227
+ current.release = () => {
228
+ releaseKeys()
229
+ releaseActions()
230
+ }
231
+ }
232
+ native.registerHandle(handle.nativeViewProtected)
233
+ }, 0)
234
+ }
235
+ const driver = {
236
+ cancel: () => native.cancel(),
237
+ setEnabled: (value: boolean) => native.setEnabled(value),
238
+ setReducedMotion: (value: boolean) => native.setReducedMotion(value),
239
+ dispose() {
240
+ if (ended) return
241
+ ended = true
242
+ if (focusTimer !== undefined) clearTimeout(focusTimer)
243
+ list.off('itemLoading', loaded)
244
+ for (const row of rows.values()) {
245
+ if (row.timer !== undefined) clearTimeout(row.timer)
246
+ row.release()
247
+ }
248
+ rows.clear()
249
+ native.dispose()
250
+ },
251
+ }
252
+ list.on('itemLoading', loaded)
253
+ try {
254
+ list.refresh()
255
+ } catch (error) {
256
+ driver.dispose()
257
+ throw error
258
+ }
259
+ return driver
260
+ },
261
+ }
262
+ }
@@ -0,0 +1,47 @@
1
+ import type { ReorderKey, ReorderMove } from './types.js'
2
+
3
+ export function itemKeys<T, K extends ReorderKey>(
4
+ items: readonly T[],
5
+ key: (item: T) => K,
6
+ ): K[] {
7
+ const keys = items.map(key)
8
+ if (
9
+ keys.some(
10
+ (value) =>
11
+ (typeof value !== 'string' && typeof value !== 'number') ||
12
+ (typeof value === 'number' && !Number.isFinite(value)),
13
+ )
14
+ )
15
+ throw new TypeError('Reorder keys must be strings or finite numbers.')
16
+ if (new Set(keys).size !== keys.length)
17
+ throw new TypeError('Reorder keys must be unique and stable across recycling.')
18
+ return keys
19
+ }
20
+
21
+ export function sameKeys<K>(a: readonly K[], b: readonly K[]): boolean {
22
+ return a.length === b.length && a.every((key, index) => key === b[index])
23
+ }
24
+
25
+ /** toIndex is the final position, after removing the dragged item. */
26
+ export function moveAt<K extends ReorderKey>(
27
+ keys: readonly K[],
28
+ fromIndex: number,
29
+ toIndex: number,
30
+ ): ReorderMove<K> | undefined {
31
+ if (
32
+ !Number.isInteger(fromIndex) ||
33
+ !Number.isInteger(toIndex) ||
34
+ fromIndex < 0 ||
35
+ toIndex < 0 ||
36
+ fromIndex >= keys.length ||
37
+ toIndex >= keys.length ||
38
+ fromIndex === toIndex
39
+ )
40
+ return undefined
41
+ return {
42
+ key: keys[fromIndex]!,
43
+ beforeKey: keys[toIndex < fromIndex ? toIndex : toIndex + 1] ?? null,
44
+ fromIndex,
45
+ toIndex,
46
+ }
47
+ }
@@ -0,0 +1,10 @@
1
+ import { GridLayout, isAndroid } from '@nativescript/core'
2
+
3
+ /** Android dispatch boundary: owns the drag after the source cell is recycled. */
4
+ export class ReorderSurface extends GridLayout {
5
+ override createNativeView(): ReturnType<GridLayout['createNativeView']> {
6
+ return isAndroid
7
+ ? new org.rafaelaugusto.jolt.ReorderSurface(this._context)
8
+ : super.createNativeView()
9
+ }
10
+ }
@@ -0,0 +1,87 @@
1
+ import type { View } from '@nativescript/core'
2
+
3
+ export type ReorderKey = string | number
4
+ export type ReorderCancelReason =
5
+ | 'cancelled'
6
+ | 'unchanged'
7
+ | 'data-changed'
8
+ | 'removed'
9
+ | 'unloaded'
10
+ | 'disposed'
11
+ | 'disabled'
12
+ | 'geometry-changed'
13
+
14
+ export interface ReorderMove<K extends ReorderKey = ReorderKey> {
15
+ key: K
16
+ /** Insert before this identity; null appends. The app owns the mutation. */
17
+ beforeKey: K | null
18
+ fromIndex: number
19
+ toIndex: number
20
+ }
21
+
22
+ export interface ReorderOptions<T, K extends ReorderKey = ReorderKey> {
23
+ key(item: T): K
24
+ /** View id, or a resolver within a realized row. Omit to drag anywhere on the row. */
25
+ handle?: string | ((row: View) => View | undefined)
26
+ onCommit(move: ReorderMove<K>): void
27
+ onStart?: (key: K) => void
28
+ onCancel?: (event: { key: K; reason: ReorderCancelReason }) => void
29
+ /** Long-press activation in milliseconds; default 350. */
30
+ longPress?: number
31
+ /** Edge region in DIPs and maximum native autoscroll speed in DIPs/second. */
32
+ edge?: { size?: number; speed?: number }
33
+ accessibility?: { moveUp?: string; moveDown?: string }
34
+ }
35
+
36
+ export interface Reorder<K extends ReorderKey = ReorderKey> {
37
+ readonly activeKey: K | undefined
38
+ readonly disposed: boolean
39
+ /** A keyboard/button alternative. Returns false for a missing key or unchanged order. */
40
+ move(key: K, beforeKey: K | null): boolean
41
+ moveUp(key: K): boolean
42
+ moveDown(key: K): boolean
43
+ cancel(): void
44
+ /** Call after in-place changes to a plain array or row geometry. */
45
+ refresh(): void
46
+ pause(): void
47
+ play(): void
48
+ dispose(): void
49
+ }
50
+
51
+ export type ReorderNativeEvent =
52
+ | { type: 'start'; index: number }
53
+ | { type: 'commit'; index: number; toIndex: number }
54
+ | { type: 'cancel'; geometryChanged?: boolean }
55
+
56
+ export interface ReorderAdapterDriver {
57
+ cancel(): void
58
+ setEnabled(enabled: boolean): void
59
+ setReducedMotion(reduced: boolean): void
60
+ dispose(): void
61
+ }
62
+
63
+ /**
64
+ * Optional list-plugin integration. Indices refer to the current items until a
65
+ * change invalidates the gesture. Drivers own native input, measured variable
66
+ * heights, snapshot overlays, recycled-cell restoration and edge scrolling.
67
+ * Emit only lifecycle events; do not bridge pointer/display frames to JS.
68
+ */
69
+ export interface ReorderAdapter<T> {
70
+ readonly view: View
71
+ items(): readonly T[]
72
+ /** Notify synchronously when identities/order/content change. */
73
+ subscribe(changed: () => void): () => void
74
+ attach(config: {
75
+ handle: ReorderOptions<T>['handle']
76
+ longPress: number
77
+ edgeSize: number
78
+ edgeSpeed: number
79
+ reducedMotion: boolean
80
+ accessibility: { moveUp: string; moveDown: string }
81
+ event(event: ReorderNativeEvent): void
82
+ /** Returns the moved identity; resolve it again after the app updates data. */
83
+ move(index: number, direction: -1 | 1): ReorderKey | undefined
84
+ keyAt(index: number): ReorderKey | undefined
85
+ indexOf(key: ReorderKey): number
86
+ }): ReorderAdapterDriver
87
+ }