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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/README.md +136 -15
  2. package/dist/animate.d.ts +25 -4
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +67 -26
  5. package/dist/animate.js.map +1 -1
  6. package/dist/blur/index.d.ts +6 -0
  7. package/dist/blur/index.d.ts.map +1 -0
  8. package/dist/blur/index.js +196 -0
  9. package/dist/blur/index.js.map +1 -0
  10. package/dist/blur/native.d.ts +17 -0
  11. package/dist/blur/native.d.ts.map +1 -0
  12. package/dist/blur/native.js +44 -0
  13. package/dist/blur/native.js.map +1 -0
  14. package/dist/blur/types.d.ts +32 -0
  15. package/dist/blur/types.d.ts.map +1 -0
  16. package/dist/blur/types.js +2 -0
  17. package/dist/blur/types.js.map +1 -0
  18. package/dist/bottom-sheet/geometry.d.ts +18 -0
  19. package/dist/bottom-sheet/geometry.d.ts.map +1 -0
  20. package/dist/bottom-sheet/geometry.js +51 -0
  21. package/dist/bottom-sheet/geometry.js.map +1 -0
  22. package/dist/bottom-sheet/index.d.ts +56 -0
  23. package/dist/bottom-sheet/index.d.ts.map +1 -0
  24. package/dist/bottom-sheet/index.js +462 -0
  25. package/dist/bottom-sheet/index.js.map +1 -0
  26. package/dist/bottom-sheet/native.d.ts +11 -0
  27. package/dist/bottom-sheet/native.d.ts.map +1 -0
  28. package/dist/bottom-sheet/native.js +173 -0
  29. package/dist/bottom-sheet/native.js.map +1 -0
  30. package/dist/config.d.ts +9 -0
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +40 -1
  33. package/dist/config.js.map +1 -1
  34. package/dist/decay.d.ts +1 -0
  35. package/dist/decay.d.ts.map +1 -1
  36. package/dist/decay.js +7 -0
  37. package/dist/decay.js.map +1 -1
  38. package/dist/drag-physics.d.ts +6 -1
  39. package/dist/drag-physics.d.ts.map +1 -1
  40. package/dist/drag.d.ts +17 -3
  41. package/dist/drag.d.ts.map +1 -1
  42. package/dist/drag.js +34 -11
  43. package/dist/drag.js.map +1 -1
  44. package/dist/driver/android-gradient.d.ts +5 -0
  45. package/dist/driver/android-gradient.d.ts.map +1 -0
  46. package/dist/driver/android-gradient.js +99 -0
  47. package/dist/driver/android-gradient.js.map +1 -0
  48. package/dist/driver/android-particles.d.ts +6 -0
  49. package/dist/driver/android-particles.d.ts.map +1 -0
  50. package/dist/driver/android-particles.js +93 -0
  51. package/dist/driver/android-particles.js.map +1 -0
  52. package/dist/driver/android.d.ts.map +1 -1
  53. package/dist/driver/android.js +67 -1
  54. package/dist/driver/android.js.map +1 -1
  55. package/dist/driver/frame.d.ts +3 -0
  56. package/dist/driver/frame.d.ts.map +1 -0
  57. package/dist/driver/frame.js +7 -0
  58. package/dist/driver/frame.js.map +1 -0
  59. package/dist/driver/index.d.ts +14 -0
  60. package/dist/driver/index.d.ts.map +1 -1
  61. package/dist/driver/index.js.map +1 -1
  62. package/dist/driver/ios-gradient.d.ts +5 -0
  63. package/dist/driver/ios-gradient.d.ts.map +1 -0
  64. package/dist/driver/ios-gradient.js +131 -0
  65. package/dist/driver/ios-gradient.js.map +1 -0
  66. package/dist/driver/ios-layout.d.ts +9 -0
  67. package/dist/driver/ios-layout.d.ts.map +1 -0
  68. package/dist/driver/ios-layout.js +52 -0
  69. package/dist/driver/ios-layout.js.map +1 -0
  70. package/dist/driver/ios-scroll-delegate.d.ts +4 -0
  71. package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
  72. package/dist/driver/ios-scroll-delegate.js +26 -0
  73. package/dist/driver/ios-scroll-delegate.js.map +1 -0
  74. package/dist/driver/ios.d.ts.map +1 -1
  75. package/dist/driver/ios.js +57 -1
  76. package/dist/driver/ios.js.map +1 -1
  77. package/dist/easing.d.ts +3 -1
  78. package/dist/easing.d.ts.map +1 -1
  79. package/dist/easing.js +18 -1
  80. package/dist/easing.js.map +1 -1
  81. package/dist/engine.d.ts +35 -2
  82. package/dist/engine.d.ts.map +1 -1
  83. package/dist/engine.js +211 -42
  84. package/dist/engine.js.map +1 -1
  85. package/dist/gesture-native.d.ts +28 -0
  86. package/dist/gesture-native.d.ts.map +1 -0
  87. package/dist/gesture-native.js +61 -0
  88. package/dist/gesture-native.js.map +1 -0
  89. package/dist/gestures/index.d.ts +69 -0
  90. package/dist/gestures/index.d.ts.map +1 -0
  91. package/dist/gestures/index.js +262 -0
  92. package/dist/gestures/index.js.map +1 -0
  93. package/dist/glass/index.d.ts +55 -0
  94. package/dist/glass/index.d.ts.map +1 -0
  95. package/dist/glass/index.js +205 -0
  96. package/dist/glass/index.js.map +1 -0
  97. package/dist/gradient-binding.d.ts +38 -0
  98. package/dist/gradient-binding.d.ts.map +1 -0
  99. package/dist/gradient-binding.js +128 -0
  100. package/dist/gradient-binding.js.map +1 -0
  101. package/dist/gradient.d.ts +105 -0
  102. package/dist/gradient.d.ts.map +1 -0
  103. package/dist/gradient.js +514 -0
  104. package/dist/gradient.js.map +1 -0
  105. package/dist/gravity.d.ts +13 -0
  106. package/dist/gravity.d.ts.map +1 -0
  107. package/dist/gravity.js +84 -0
  108. package/dist/gravity.js.map +1 -0
  109. package/dist/haptics.d.ts.map +1 -1
  110. package/dist/haptics.js +101 -28
  111. package/dist/haptics.js.map +1 -1
  112. package/dist/image-effect.d.ts +1 -0
  113. package/dist/image-effect.d.ts.map +1 -1
  114. package/dist/image-effect.js +10 -2
  115. package/dist/image-effect.js.map +1 -1
  116. package/dist/index.d.ts +21 -7
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +11 -4
  119. package/dist/index.js.map +1 -1
  120. package/dist/inspector/index.d.ts +86 -0
  121. package/dist/inspector/index.d.ts.map +1 -0
  122. package/dist/inspector/index.js +419 -0
  123. package/dist/inspector/index.js.map +1 -0
  124. package/dist/inspector/plot.d.ts +4 -0
  125. package/dist/inspector/plot.d.ts.map +1 -0
  126. package/dist/inspector/plot.js +23 -0
  127. package/dist/inspector/plot.js.map +1 -0
  128. package/dist/inspector/probe.d.ts +19 -0
  129. package/dist/inspector/probe.d.ts.map +1 -0
  130. package/dist/inspector/probe.js +37 -0
  131. package/dist/inspector/probe.js.map +1 -0
  132. package/dist/inspector/tuning.d.ts +19 -0
  133. package/dist/inspector/tuning.d.ts.map +1 -0
  134. package/dist/inspector/tuning.js +37 -0
  135. package/dist/inspector/tuning.js.map +1 -0
  136. package/dist/interactive-navigation/index.d.ts +44 -0
  137. package/dist/interactive-navigation/index.d.ts.map +1 -0
  138. package/dist/interactive-navigation/index.js +314 -0
  139. package/dist/interactive-navigation/index.js.map +1 -0
  140. package/dist/keyboard.d.ts +24 -0
  141. package/dist/keyboard.d.ts.map +1 -1
  142. package/dist/keyboard.js +199 -6
  143. package/dist/keyboard.js.map +1 -1
  144. package/dist/layout.d.ts +13 -0
  145. package/dist/layout.d.ts.map +1 -0
  146. package/dist/layout.js +348 -0
  147. package/dist/layout.js.map +1 -0
  148. package/dist/live-spring-driver.d.ts +52 -0
  149. package/dist/live-spring-driver.d.ts.map +1 -0
  150. package/dist/live-spring-driver.js +104 -0
  151. package/dist/live-spring-driver.js.map +1 -0
  152. package/dist/mixer.d.ts +55 -0
  153. package/dist/mixer.d.ts.map +1 -0
  154. package/dist/mixer.js +278 -0
  155. package/dist/mixer.js.map +1 -0
  156. package/dist/motion-scope.d.ts +10 -2
  157. package/dist/motion-scope.d.ts.map +1 -1
  158. package/dist/motion-scope.js +30 -3
  159. package/dist/motion-scope.js.map +1 -1
  160. package/dist/motion-states.d.ts +19 -7
  161. package/dist/motion-states.d.ts.map +1 -1
  162. package/dist/motion-states.js +116 -26
  163. package/dist/motion-states.js.map +1 -1
  164. package/dist/motion-value.d.ts +227 -0
  165. package/dist/motion-value.d.ts.map +1 -0
  166. package/dist/motion-value.js +1074 -0
  167. package/dist/motion-value.js.map +1 -0
  168. package/dist/native/index.d.ts +10 -0
  169. package/dist/native/index.d.ts.map +1 -0
  170. package/dist/native/index.js +6 -0
  171. package/dist/native/index.js.map +1 -0
  172. package/dist/native-properties.d.ts +28 -0
  173. package/dist/native-properties.d.ts.map +1 -0
  174. package/dist/native-properties.js +154 -0
  175. package/dist/native-properties.js.map +1 -0
  176. package/dist/native-property-driver.d.ts +19 -0
  177. package/dist/native-property-driver.d.ts.map +1 -0
  178. package/dist/native-property-driver.js +69 -0
  179. package/dist/native-property-driver.js.map +1 -0
  180. package/dist/native-property.d.ts +37 -0
  181. package/dist/native-property.d.ts.map +1 -0
  182. package/dist/native-property.js +285 -0
  183. package/dist/native-property.js.map +1 -0
  184. package/dist/particles.d.ts +5 -2
  185. package/dist/particles.d.ts.map +1 -1
  186. package/dist/particles.js +16 -10
  187. package/dist/particles.js.map +1 -1
  188. package/dist/path.d.ts.map +1 -1
  189. package/dist/path.js +2 -2
  190. package/dist/path.js.map +1 -1
  191. package/dist/physics/index.d.ts +116 -0
  192. package/dist/physics/index.d.ts.map +1 -0
  193. package/dist/physics/index.js +306 -0
  194. package/dist/physics/index.js.map +1 -0
  195. package/dist/physics/native.d.ts +53 -0
  196. package/dist/physics/native.d.ts.map +1 -0
  197. package/dist/physics/native.js +58 -0
  198. package/dist/physics/native.js.map +1 -0
  199. package/dist/playback-group.d.ts.map +1 -1
  200. package/dist/playback-group.js +17 -1
  201. package/dist/playback-group.js.map +1 -1
  202. package/dist/playback.d.ts +15 -0
  203. package/dist/playback.d.ts.map +1 -1
  204. package/dist/playback.js +23 -0
  205. package/dist/playback.js.map +1 -1
  206. package/dist/predictive-back/index.d.ts +45 -0
  207. package/dist/predictive-back/index.d.ts.map +1 -0
  208. package/dist/predictive-back/index.js +220 -0
  209. package/dist/predictive-back/index.js.map +1 -0
  210. package/dist/predictive-back/presentation.d.ts +4 -0
  211. package/dist/predictive-back/presentation.d.ts.map +1 -0
  212. package/dist/predictive-back/presentation.js +3 -0
  213. package/dist/predictive-back/presentation.js.map +1 -0
  214. package/dist/reorder/handle.d.ts +6 -0
  215. package/dist/reorder/handle.d.ts.map +1 -0
  216. package/dist/reorder/handle.js +10 -0
  217. package/dist/reorder/handle.js.map +1 -0
  218. package/dist/reorder/index.d.ts +10 -0
  219. package/dist/reorder/index.d.ts.map +1 -0
  220. package/dist/reorder/index.js +233 -0
  221. package/dist/reorder/index.js.map +1 -0
  222. package/dist/reorder/list-view.d.ts +5 -0
  223. package/dist/reorder/list-view.d.ts.map +1 -0
  224. package/dist/reorder/list-view.js +238 -0
  225. package/dist/reorder/list-view.js.map +1 -0
  226. package/dist/reorder/model.d.ts +6 -0
  227. package/dist/reorder/model.d.ts.map +1 -0
  228. package/dist/reorder/model.js +30 -0
  229. package/dist/reorder/model.js.map +1 -0
  230. package/dist/reorder/surface.d.ts +6 -0
  231. package/dist/reorder/surface.d.ts.map +1 -0
  232. package/dist/reorder/surface.js +10 -0
  233. package/dist/reorder/surface.js.map +1 -0
  234. package/dist/reorder/types.d.ts +92 -0
  235. package/dist/reorder/types.d.ts.map +1 -0
  236. package/dist/reorder/types.js +2 -0
  237. package/dist/reorder/types.js.map +1 -0
  238. package/dist/sampling.d.ts +35 -0
  239. package/dist/sampling.d.ts.map +1 -0
  240. package/dist/sampling.js +123 -0
  241. package/dist/sampling.js.map +1 -0
  242. package/dist/scene-appearance.d.ts +14 -0
  243. package/dist/scene-appearance.d.ts.map +1 -0
  244. package/dist/scene-appearance.js +68 -0
  245. package/dist/scene-appearance.js.map +1 -0
  246. package/dist/scene-camera.d.ts +5 -0
  247. package/dist/scene-camera.d.ts.map +1 -0
  248. package/dist/scene-camera.js +23 -0
  249. package/dist/scene-camera.js.map +1 -0
  250. package/dist/scene-shader.d.ts +18 -0
  251. package/dist/scene-shader.d.ts.map +1 -0
  252. package/dist/scene-shader.js +76 -0
  253. package/dist/scene-shader.js.map +1 -0
  254. package/dist/scroll-header/geometry.d.ts +18 -0
  255. package/dist/scroll-header/geometry.d.ts.map +1 -0
  256. package/dist/scroll-header/geometry.js +46 -0
  257. package/dist/scroll-header/geometry.js.map +1 -0
  258. package/dist/scroll-header/index.d.ts +48 -0
  259. package/dist/scroll-header/index.d.ts.map +1 -0
  260. package/dist/scroll-header/index.js +373 -0
  261. package/dist/scroll-header/index.js.map +1 -0
  262. package/dist/scroll-header/native.d.ts +28 -0
  263. package/dist/scroll-header/native.d.ts.map +1 -0
  264. package/dist/scroll-header/native.js +43 -0
  265. package/dist/scroll-header/native.js.map +1 -0
  266. package/dist/sensors/index.d.ts +69 -0
  267. package/dist/sensors/index.d.ts.map +1 -0
  268. package/dist/sensors/index.js +149 -0
  269. package/dist/sensors/index.js.map +1 -0
  270. package/dist/sensors/native.d.ts +20 -0
  271. package/dist/sensors/native.d.ts.map +1 -0
  272. package/dist/sensors/native.js +48 -0
  273. package/dist/sensors/native.js.map +1 -0
  274. package/dist/sequence.d.ts +24 -0
  275. package/dist/sequence.d.ts.map +1 -1
  276. package/dist/sequence.js +181 -19
  277. package/dist/sequence.js.map +1 -1
  278. package/dist/shapes/android.d.ts +3 -0
  279. package/dist/shapes/android.d.ts.map +1 -0
  280. package/dist/shapes/android.js +51 -0
  281. package/dist/shapes/android.js.map +1 -0
  282. package/dist/shapes/index.d.ts +6 -0
  283. package/dist/shapes/index.d.ts.map +1 -0
  284. package/dist/shapes/index.js +238 -0
  285. package/dist/shapes/index.js.map +1 -0
  286. package/dist/shapes/ios.d.ts +3 -0
  287. package/dist/shapes/ios.d.ts.map +1 -0
  288. package/dist/shapes/ios.js +164 -0
  289. package/dist/shapes/ios.js.map +1 -0
  290. package/dist/shapes/native.d.ts +18 -0
  291. package/dist/shapes/native.d.ts.map +1 -0
  292. package/dist/shapes/native.js +10 -0
  293. package/dist/shapes/native.js.map +1 -0
  294. package/dist/shapes/path.d.ts +10 -0
  295. package/dist/shapes/path.d.ts.map +1 -0
  296. package/dist/shapes/path.js +106 -0
  297. package/dist/shapes/path.js.map +1 -0
  298. package/dist/shapes/types.d.ts +55 -0
  299. package/dist/shapes/types.d.ts.map +1 -0
  300. package/dist/shapes/types.js +11 -0
  301. package/dist/shapes/types.js.map +1 -0
  302. package/dist/shared-layout/index.d.ts +40 -0
  303. package/dist/shared-layout/index.d.ts.map +1 -0
  304. package/dist/shared-layout/index.js +267 -0
  305. package/dist/shared-layout/index.js.map +1 -0
  306. package/dist/shared-layout/native.d.ts +15 -0
  307. package/dist/shared-layout/native.d.ts.map +1 -0
  308. package/dist/shared-layout/native.js +79 -0
  309. package/dist/shared-layout/native.js.map +1 -0
  310. package/dist/shared-layout/timing.d.ts +9 -0
  311. package/dist/shared-layout/timing.d.ts.map +1 -0
  312. package/dist/shared-layout/timing.js +68 -0
  313. package/dist/shared-layout/timing.js.map +1 -0
  314. package/dist/shared-navigation/entry.d.ts +51 -0
  315. package/dist/shared-navigation/entry.d.ts.map +1 -0
  316. package/dist/shared-navigation/entry.js +619 -0
  317. package/dist/shared-navigation/entry.js.map +1 -0
  318. package/dist/shared-navigation/index.d.ts +58 -0
  319. package/dist/shared-navigation/index.d.ts.map +1 -0
  320. package/dist/shared-navigation/index.js +318 -0
  321. package/dist/shared-navigation/index.js.map +1 -0
  322. package/dist/shared-navigation/return-signal.d.ts +16 -0
  323. package/dist/shared-navigation/return-signal.d.ts.map +1 -0
  324. package/dist/shared-navigation/return-signal.js +35 -0
  325. package/dist/shared-navigation/return-signal.js.map +1 -0
  326. package/dist/shared-navigation/return-target.d.ts +32 -0
  327. package/dist/shared-navigation/return-target.d.ts.map +1 -0
  328. package/dist/shared-navigation/return-target.js +168 -0
  329. package/dist/shared-navigation/return-target.js.map +1 -0
  330. package/dist/shared-navigation/scope.d.ts +4 -0
  331. package/dist/shared-navigation/scope.d.ts.map +1 -0
  332. package/dist/shared-navigation/scope.js +2 -0
  333. package/dist/shared-navigation/scope.js.map +1 -0
  334. package/dist/shared-navigation/targets.d.ts +6 -0
  335. package/dist/shared-navigation/targets.d.ts.map +1 -0
  336. package/dist/shared-navigation/targets.js +36 -0
  337. package/dist/shared-navigation/targets.js.map +1 -0
  338. package/dist/size-layout.d.ts +19 -0
  339. package/dist/size-layout.d.ts.map +1 -0
  340. package/dist/size-layout.js +216 -0
  341. package/dist/size-layout.js.map +1 -0
  342. package/dist/size.d.ts +19 -0
  343. package/dist/size.d.ts.map +1 -0
  344. package/dist/size.js +251 -0
  345. package/dist/size.js.map +1 -0
  346. package/dist/spring.d.ts +2 -0
  347. package/dist/spring.d.ts.map +1 -1
  348. package/dist/spring.js +11 -0
  349. package/dist/spring.js.map +1 -1
  350. package/dist/svg-path.d.ts +18 -0
  351. package/dist/svg-path.d.ts.map +1 -1
  352. package/dist/svg-path.js +3 -2
  353. package/dist/svg-path.js.map +1 -1
  354. package/dist/testing/clock.d.ts +40 -0
  355. package/dist/testing/clock.d.ts.map +1 -0
  356. package/dist/testing/clock.js +116 -0
  357. package/dist/testing/clock.js.map +1 -0
  358. package/dist/testing/handoff-recorder.d.ts +8 -0
  359. package/dist/testing/handoff-recorder.d.ts.map +1 -0
  360. package/dist/testing/handoff-recorder.js +77 -0
  361. package/dist/testing/handoff-recorder.js.map +1 -0
  362. package/dist/testing/index.d.ts +5 -0
  363. package/dist/testing/index.d.ts.map +1 -0
  364. package/dist/testing/index.js +5 -0
  365. package/dist/testing/index.js.map +1 -0
  366. package/dist/testing/native.d.ts +46 -0
  367. package/dist/testing/native.d.ts.map +1 -0
  368. package/dist/testing/native.js +313 -0
  369. package/dist/testing/native.js.map +1 -0
  370. package/dist/testing/presentation.d.ts +11 -0
  371. package/dist/testing/presentation.d.ts.map +1 -0
  372. package/dist/testing/presentation.js +45 -0
  373. package/dist/testing/presentation.js.map +1 -0
  374. package/dist/testing/replay.d.ts +39 -0
  375. package/dist/testing/replay.d.ts.map +1 -0
  376. package/dist/testing/replay.js +99 -0
  377. package/dist/testing/replay.js.map +1 -0
  378. package/dist/testing/scroll-handoff-native.d.ts +10 -0
  379. package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
  380. package/dist/testing/scroll-handoff-native.js +151 -0
  381. package/dist/testing/scroll-handoff-native.js.map +1 -0
  382. package/dist/testing/scroll-handoff.d.ts +25 -0
  383. package/dist/testing/scroll-handoff.d.ts.map +1 -0
  384. package/dist/testing/scroll-handoff.js +127 -0
  385. package/dist/testing/scroll-handoff.js.map +1 -0
  386. package/dist/testing/sensors.d.ts +13 -0
  387. package/dist/testing/sensors.d.ts.map +1 -0
  388. package/dist/testing/sensors.js +26 -0
  389. package/dist/testing/sensors.js.map +1 -0
  390. package/dist/testing/trace.d.ts +101 -0
  391. package/dist/testing/trace.d.ts.map +1 -0
  392. package/dist/testing/trace.js +263 -0
  393. package/dist/testing/trace.js.map +1 -0
  394. package/dist/timed-animation.d.ts +38 -0
  395. package/dist/timed-animation.d.ts.map +1 -0
  396. package/dist/timed-animation.js +177 -0
  397. package/dist/timed-animation.js.map +1 -0
  398. package/dist/track.d.ts +3 -0
  399. package/dist/track.d.ts.map +1 -1
  400. package/dist/track.js +281 -40
  401. package/dist/track.js.map +1 -1
  402. package/dist/transition.d.ts +54 -2
  403. package/dist/transition.d.ts.map +1 -1
  404. package/dist/transition.js +128 -8
  405. package/dist/transition.js.map +1 -1
  406. package/dist/types.d.ts +10 -1
  407. package/dist/types.d.ts.map +1 -1
  408. package/dist/value-observers.d.ts +22 -0
  409. package/dist/value-observers.d.ts.map +1 -0
  410. package/dist/value-observers.js +122 -0
  411. package/dist/value-observers.js.map +1 -0
  412. package/dist/value-track.d.ts +13 -0
  413. package/dist/value-track.d.ts.map +1 -0
  414. package/dist/value-track.js +59 -0
  415. package/dist/value-track.js.map +1 -0
  416. package/dist/vue/index.d.ts +33 -3
  417. package/dist/vue/index.d.ts.map +1 -1
  418. package/dist/vue/index.js +118 -3
  419. package/dist/vue/index.js.map +1 -1
  420. package/dist/zoomable.d.ts +1 -1
  421. package/dist/zoomable.d.ts.map +1 -1
  422. package/package.json +68 -3
  423. package/platforms/android/include.gradle +10 -0
  424. package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
  425. package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +151 -0
  426. package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +210 -0
  427. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
  428. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
  429. package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
  430. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
  431. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
  432. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
  433. package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
  434. package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
  435. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
  436. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
  437. package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
  438. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
  439. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
  440. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
  441. package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
  442. package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
  443. package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
  444. package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
  445. package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
  446. package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
  447. package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
  448. package/platforms/android/proguard-rules.pro +20 -0
  449. package/platforms/ios/build.xcconfig +1 -1
  450. package/platforms/ios/src/JoltBlur.h +14 -0
  451. package/platforms/ios/src/JoltBlur.m +86 -0
  452. package/platforms/ios/src/JoltCircleMath.h +183 -0
  453. package/platforms/ios/src/JoltCircleWorld.h +17 -0
  454. package/platforms/ios/src/JoltCircleWorld.m +203 -0
  455. package/platforms/ios/src/JoltGestureSession.h +23 -0
  456. package/platforms/ios/src/JoltGestureSession.m +251 -0
  457. package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
  458. package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
  459. package/platforms/ios/src/JoltLiveSpring.h +29 -0
  460. package/platforms/ios/src/JoltLiveSpring.m +243 -0
  461. package/platforms/ios/src/JoltMotionProbe.h +9 -0
  462. package/platforms/ios/src/JoltMotionProbe.m +72 -0
  463. package/platforms/ios/src/JoltReorderSession.h +15 -0
  464. package/platforms/ios/src/JoltReorderSession.m +205 -0
  465. package/platforms/ios/src/JoltScrollHeader.h +13 -0
  466. package/platforms/ios/src/JoltScrollHeader.m +93 -0
  467. package/platforms/ios/src/JoltSensorMath.h +39 -0
  468. package/platforms/ios/src/JoltSensorSource.h +13 -0
  469. package/platforms/ios/src/JoltSensorSource.m +201 -0
  470. package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
  471. package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
  472. package/platforms/ios/src/JoltSpringState.h +35 -0
  473. package/platforms/ios/src/module.modulemap +10 -0
  474. package/src/android-plugin.d.ts +463 -0
  475. package/src/animate.ts +129 -15
  476. package/src/blur/index.ts +195 -0
  477. package/src/blur/native.ts +70 -0
  478. package/src/blur/types.ts +32 -0
  479. package/src/bottom-sheet/geometry.ts +84 -0
  480. package/src/bottom-sheet/index.ts +536 -0
  481. package/src/bottom-sheet/native.ts +214 -0
  482. package/src/config.ts +39 -1
  483. package/src/decay.ts +9 -0
  484. package/src/drag.ts +67 -21
  485. package/src/driver/android-gradient.ts +116 -0
  486. package/src/driver/android-particles.ts +118 -0
  487. package/src/driver/android.ts +69 -1
  488. package/src/driver/frame.ts +10 -0
  489. package/src/driver/index.ts +15 -0
  490. package/src/driver/ios-gradient.ts +136 -0
  491. package/src/driver/ios-layout.ts +63 -0
  492. package/src/driver/ios-scroll-delegate.ts +23 -0
  493. package/src/driver/ios.ts +70 -17
  494. package/src/easing.ts +21 -1
  495. package/src/engine.ts +226 -59
  496. package/src/gesture-native.ts +139 -0
  497. package/src/gestures/index.ts +365 -0
  498. package/src/glass/index.ts +218 -0
  499. package/src/gradient-binding.ts +158 -0
  500. package/src/gradient.ts +663 -0
  501. package/src/gravity.ts +107 -0
  502. package/src/haptics.ts +106 -28
  503. package/src/image-effect.ts +10 -2
  504. package/src/index.ts +59 -7
  505. package/src/inspector/index.ts +523 -0
  506. package/src/inspector/plot.ts +27 -0
  507. package/src/inspector/probe.ts +50 -0
  508. package/src/inspector/tuning.ts +51 -0
  509. package/src/interactive-navigation/index.ts +398 -0
  510. package/src/ios-plugin.d.ts +279 -0
  511. package/src/keyboard.ts +231 -7
  512. package/src/layout.ts +408 -0
  513. package/src/live-spring-driver.ts +181 -0
  514. package/src/mixer.ts +306 -0
  515. package/src/motion-scope.ts +53 -6
  516. package/src/motion-states.ts +149 -42
  517. package/src/motion-value.ts +1289 -0
  518. package/src/native/index.ts +30 -0
  519. package/src/native-properties.ts +188 -0
  520. package/src/native-property-driver.ts +123 -0
  521. package/src/native-property.ts +366 -0
  522. package/src/particles.ts +18 -17
  523. package/src/path.ts +2 -1
  524. package/src/physics/index.ts +443 -0
  525. package/src/physics/native.ts +110 -0
  526. package/src/playback-group.ts +17 -1
  527. package/src/playback.ts +41 -0
  528. package/src/predictive-back/index.ts +280 -0
  529. package/src/predictive-back/presentation.ts +6 -0
  530. package/src/reorder/handle.ts +9 -0
  531. package/src/reorder/index.ts +243 -0
  532. package/src/reorder/list-view.ts +262 -0
  533. package/src/reorder/model.ts +47 -0
  534. package/src/reorder/surface.ts +10 -0
  535. package/src/reorder/types.ts +87 -0
  536. package/src/sampling.ts +173 -0
  537. package/src/scene-appearance.ts +92 -0
  538. package/src/scene-camera.ts +30 -0
  539. package/src/scene-shader.ts +139 -0
  540. package/src/scroll-header/geometry.ts +88 -0
  541. package/src/scroll-header/index.ts +504 -0
  542. package/src/scroll-header/native.ts +89 -0
  543. package/src/sensors/index.ts +246 -0
  544. package/src/sensors/native.ts +72 -0
  545. package/src/sequence.ts +209 -20
  546. package/src/shapes/android.ts +63 -0
  547. package/src/shapes/index.ts +267 -0
  548. package/src/shapes/ios.ts +194 -0
  549. package/src/shapes/native.ts +27 -0
  550. package/src/shapes/path.ts +127 -0
  551. package/src/shapes/types.ts +63 -0
  552. package/src/shared-layout/index.ts +343 -0
  553. package/src/shared-layout/native.ts +138 -0
  554. package/src/shared-layout/timing.ts +87 -0
  555. package/src/shared-navigation/entry.ts +695 -0
  556. package/src/shared-navigation/index.ts +414 -0
  557. package/src/shared-navigation/return-signal.ts +41 -0
  558. package/src/shared-navigation/return-target.ts +197 -0
  559. package/src/shared-navigation/scope.ts +3 -0
  560. package/src/shared-navigation/targets.ts +38 -0
  561. package/src/size-layout.ts +237 -0
  562. package/src/size.ts +302 -0
  563. package/src/spring.ts +18 -0
  564. package/src/svg-path.ts +8 -3
  565. package/src/testing/clock.ts +128 -0
  566. package/src/testing/handoff-recorder.ts +98 -0
  567. package/src/testing/index.ts +4 -0
  568. package/src/testing/native.ts +386 -0
  569. package/src/testing/presentation.ts +46 -0
  570. package/src/testing/replay.ts +149 -0
  571. package/src/testing/scroll-handoff-native.ts +201 -0
  572. package/src/testing/scroll-handoff.ts +140 -0
  573. package/src/testing/sensors.ts +41 -0
  574. package/src/testing/trace.ts +340 -0
  575. package/src/timed-animation.ts +192 -0
  576. package/src/track.ts +334 -38
  577. package/src/transition.ts +197 -9
  578. package/src/types.ts +11 -1
  579. package/src/value-observers.ts +147 -0
  580. package/src/value-track.ts +71 -0
  581. package/src/vue/index.ts +147 -1
  582. package/src/zoomable.ts +1 -1
@@ -0,0 +1,203 @@
1
+ #import "JoltCircleWorld.h"
2
+ #import "JoltCircleMath.h"
3
+ #import <QuartzCore/QuartzCore.h>
4
+
5
+ @interface JoltCircleWorld () <UIGestureRecognizerDelegate> {
6
+ JoltCircleState state;
7
+ BOOL originalInteraction[16];
8
+ double touchOffsetX[16],touchOffsetY[16];
9
+ double initialX[16],initialY[16],initialVX[16],initialVY[16],originalX[16],originalY[16];
10
+ }
11
+ @property(nonatomic) UIView *container;
12
+ @property(nonatomic) NSMutableArray *views,*pans,*guides;
13
+ @property(nonatomic) CADisplayLink *link;
14
+ @property(nonatomic) BOOL enabled,disposed,background,fits;
15
+ @property(nonatomic) double previous,accumulator,processingMs,droppedMs,offsetX,offsetY;
16
+ @property(nonatomic) NSUInteger frames,dragStarts,dragMoves,dragEnds,dragCancels;
17
+ @property(nonatomic) NSInteger dragging;
18
+ - (void)refresh;
19
+ - (void)apply;
20
+ - (void)cancelDrag;
21
+ - (void)configureAttachment:(id)value index:(int)index;
22
+ @end
23
+
24
+ @implementation JoltCircleWorld
25
+ static NSMutableSet<JoltCircleWorld *> *worlds;
26
+ + (void)initialize { if(self==JoltCircleWorld.class)worlds=[NSMutableSet new]; }
27
+ + (NSUInteger)worldCount{return worlds.count;}
28
+ + (NSUInteger)activeCount{NSUInteger count=0;for(JoltCircleWorld *w in worlds)if(w.link)count++;return count;}
29
+ + (instancetype)create:(UIView *)container options:(NSString *)options {
30
+ NSDictionary *config=[NSJSONSerialization JSONObjectWithData:[options dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
31
+ NSArray *bodies=config[@"bodies"];
32
+ if(bodies.count<1||bodies.count>16)[NSException raise:NSInvalidArgumentException format:@"Physics needs 1–16 circles"];
33
+ JoltCircleWorld *w=[self new];w.container=container;w.views=[NSMutableArray new];w.pans=[NSMutableArray new];w.guides=[NSMutableArray new];w.dragging=-1;
34
+ w->state.count=(int)bodies.count;w->state.width=[config[@"width"] doubleValue];w->state.height=[config[@"height"] doubleValue];
35
+ w->state.gx=[config[@"gravity"][@"x"] doubleValue];w->state.gy=[config[@"gravity"][@"y"] doubleValue];
36
+ w->state.restitution=[config[@"restitution"] doubleValue];w->state.damping=[config[@"damping"] doubleValue];
37
+ for(int i=0;i<bodies.count;i++){
38
+ NSDictionary *v=bodies[i];JoltCircle *b=&w->state.bodies[i];
39
+ b->x=[v[@"x"] doubleValue];b->y=[v[@"y"] doubleValue];b->r=[v[@"radius"] doubleValue];b->m=[v[@"mass"] doubleValue];
40
+ b->vx=[v[@"vx"] doubleValue];b->vy=[v[@"vy"] doubleValue];
41
+ w->initialX[i]=b->x/w->state.width;w->initialY[i]=b->y/w->state.height;w->initialVX[i]=b->vx;w->initialVY[i]=b->vy;
42
+ [w.views addObject:NSNull.null];[w.pans addObject:NSNull.null];[w.guides addObject:NSNull.null];
43
+ [w configureAttachment:v[@"attachment"] index:i];
44
+ id snap=v[@"snap"];
45
+ if([snap isKindOfClass:NSDictionary.class]){
46
+ NSArray *points=snap[@"points"];if(points.count>JOLT_CIRCLE_SNAP_LIMIT)[NSException raise:NSInvalidArgumentException format:@"Too many snap points"];
47
+ b->snap.count=(int)points.count;b->snap.stiffness=[snap[@"stiffness"] doubleValue];b->snap.damping=[snap[@"damping"] doubleValue];b->snap.projection=[snap[@"projection"] doubleValue];
48
+ for(int j=0;j<points.count;j++){b->snap.u[j]=[points[j][@"x"] doubleValue]/w->state.width;b->snap.v[j]=[points[j][@"y"] doubleValue]/w->state.height;}
49
+ }
50
+ }
51
+ w.fits=JoltCircleFits(&w->state,w->state.width,w->state.height);
52
+ w.background=UIApplication.sharedApplication.applicationState==UIApplicationStateBackground;
53
+ [[NSNotificationCenter defaultCenter] addObserver:w selector:@selector(backgrounded) name:UIApplicationDidEnterBackgroundNotification object:nil];
54
+ [[NSNotificationCenter defaultCenter] addObserver:w selector:@selector(foregrounded) name:UIApplicationDidBecomeActiveNotification object:nil];
55
+ [worlds addObject:w];return w;
56
+ }
57
+ - (void)configureAttachment:(id)value index:(int)index {
58
+ BOOL active=[value isKindOfClass:NSDictionary.class];
59
+ if(active)JoltCircleAttach(&state,index,true,[value[@"x"] doubleValue],[value[@"y"] doubleValue],[value[@"length"] doubleValue],[value[@"stiffness"] doubleValue],[value[@"damping"] doubleValue]);
60
+ else JoltCircleAttach(&state,index,false,0,0,0,180,24);
61
+ if(self.guides[index]!=NSNull.null){[(CALayer *)self.guides[index] removeFromSuperlayer];self.guides[index]=NSNull.null;}
62
+ id line=active?value[@"line"]:nil;
63
+ if([line isKindOfClass:NSDictionary.class]){
64
+ CAShapeLayer *guide=[CAShapeLayer layer];unsigned int color=[line[@"color"] unsignedIntValue];
65
+ guide.strokeColor=[UIColor colorWithRed:((color>>16)&255)/255.0 green:((color>>8)&255)/255.0 blue:(color&255)/255.0 alpha:1].CGColor;
66
+ guide.fillColor=nil;guide.contentsScale=UIScreen.mainScreen.scale;guide.lineWidth=[line[@"width"] doubleValue];guide.lineCap=kCALineCapRound;
67
+ [self.container.layer addSublayer:guide];self.guides[index]=guide;
68
+ }
69
+ }
70
+ - (void)attach:(NSInteger)index options:(NSString *)options {
71
+ if(self.disposed||index<0||index>=state.count)return;
72
+ id value=[NSJSONSerialization JSONObjectWithData:[options dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingFragmentsAllowed error:nil];
73
+ [self configureAttachment:value index:(int)index];[self apply];[self refresh];
74
+ }
75
+ - (void)snapTo:(NSInteger)index target:(NSInteger)target {
76
+ if(self.disposed||index<0||index>=state.count)return;
77
+ JoltCircleSnapTo(&state,(int)index,(int)target);[self apply];[self refresh];
78
+ }
79
+ - (void)connect:(UIView *)view index:(NSInteger)index {
80
+ if(self.disposed||index<0||index>=state.count)return;
81
+ if(view.superview!=self.container)[NSException raise:NSInvalidArgumentException format:@"Physics circles must be direct native children"];
82
+ self.views[index]=view;originalInteraction[index]=view.userInteractionEnabled;view.userInteractionEnabled=YES;originalX[index]=[[view.layer valueForKeyPath:@"transform.translation.x"] doubleValue];originalY[index]=[[view.layer valueForKeyPath:@"transform.translation.y"] doubleValue];
83
+ UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)];
84
+ pan.maximumNumberOfTouches=1;pan.delegate=self;pan.enabled=NO;pan.cancelsTouchesInView=YES;
85
+ self.pans[index]=pan;[view addGestureRecognizer:pan];
86
+ [self apply];
87
+ }
88
+ - (BOOL)ready {return self.enabled&&!self.disposed&&!self.background&&self.fits&&self.container.window!=nil;}
89
+ - (void)refresh {
90
+ BOOL ready=[self ready];
91
+ for(id candidate in self.pans)if(candidate!=NSNull.null){UIPanGestureRecognizer *pan=candidate;if(pan.enabled!=ready)pan.enabled=ready;}
92
+ if(ready&&!state.sleeping){
93
+ if(!self.link){self.previous=0;self.accumulator=0;self.link=[CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];[self.link addToRunLoop:NSRunLoop.mainRunLoop forMode:NSRunLoopCommonModes];}
94
+ }else if(self.link){[self.link invalidate];self.link=nil;self.previous=0;self.accumulator=0;}
95
+ }
96
+ - (void)tick:(CADisplayLink *)link {
97
+ if(![self ready]){[self cancelDrag];[self refresh];return;}
98
+ double started=CACurrentMediaTime(),elapsed=self.previous?MAX(0,link.timestamp-self.previous):0;self.previous=link.timestamp;
99
+ self.droppedMs+=MAX(0,elapsed-1.0/15)*1000;self.accumulator+=MIN(elapsed,1.0/15);
100
+ int budget=16;
101
+ while(self.accumulator+1e-10>=JOLT_CIRCLE_DT&&budget-->0&&!state.sleeping){JoltCircleStep(&state);self.accumulator-=JOLT_CIRCLE_DT;}
102
+ [self apply];self.frames++;self.processingMs+=(CACurrentMediaTime()-started)*1000;[self refresh];
103
+ }
104
+ - (void)apply {
105
+ [CATransaction begin];[CATransaction setDisableActions:YES];
106
+ for(int i=0;i<state.count;i++){
107
+ if(self.views[i]==NSNull.null)continue;UIView *v=self.views[i];
108
+ if(v.superview!=self.container){self.enabled=NO;continue;}
109
+ // layer.position is the untransformed layout center; body coordinates use container DIPs.
110
+ [v.layer setValue:@(state.bodies[i].x-v.layer.position.x) forKeyPath:@"transform.translation.x"];
111
+ [v.layer setValue:@(state.bodies[i].y-v.layer.position.y) forKeyPath:@"transform.translation.y"];
112
+ }
113
+ for(int i=0;i<state.count;i++)if(self.guides[i]!=NSNull.null){
114
+ JoltCircle *b=&state.bodies[i];CAShapeLayer *guide=self.guides[i];
115
+ double x=b->snap.active?JoltCircleSnapX(&state,b,b->snap.index):b->attachment.u*state.width;
116
+ double y=b->snap.active?JoltCircleSnapY(&state,b,b->snap.index):b->attachment.v*state.height;
117
+ double dx=b->x-x,dy=b->y-y,d=hypot(dx,dy);
118
+ UIBezierPath *path=[UIBezierPath bezierPath];
119
+ if(d>b->r){[path moveToPoint:CGPointMake(x,y)];[path addLineToPoint:CGPointMake(b->x-dx/d*b->r,b->y-dy/d*b->r)];[path appendPath:[UIBezierPath bezierPathWithOvalInRect:CGRectMake(x-2.5,y-2.5,5,5)]];}
120
+ guide.path=path.CGPath;
121
+ }
122
+ [CATransaction commit];
123
+ }
124
+ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
125
+ if(![self ready]||self.dragging>=0)return NO;
126
+ NSInteger i=[self.pans indexOfObject:gesture];if(i==NSNotFound)return NO;
127
+ CGPoint p=[touch locationInView:self.container];JoltCircle *b=&state.bodies[i];
128
+ touchOffsetX[i]=b->x-p.x;touchOffsetY[i]=b->y-p.y;
129
+ return hypot(p.x-b->x,p.y-b->y)<=b->r;
130
+ }
131
+ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gesture {
132
+ return [self ready]&&self.dragging<0;
133
+ }
134
+ - (void)panned:(UIPanGestureRecognizer *)pan {
135
+ NSInteger i=[self.pans indexOfObject:pan];if(i==NSNotFound)return;
136
+ CGPoint point=[pan locationInView:self.container];
137
+ if(pan.state==UIGestureRecognizerStateBegan){
138
+ if(![self ready]||self.dragging>=0)return;
139
+ self.dragging=i;self.offsetX=touchOffsetX[i];self.offsetY=touchOffsetY[i];self.dragStarts++;
140
+ }
141
+ if(self.dragging!=i)return;
142
+ if(pan.state==UIGestureRecognizerStateBegan||pan.state==UIGestureRecognizerStateChanged){
143
+ JoltCircleDrag(&state,(int)i,point.x+self.offsetX,point.y+self.offsetY);self.dragMoves++;[self refresh];
144
+ }else if(pan.state==UIGestureRecognizerStateEnded){
145
+ CGPoint velocity=[pan velocityInView:self.container];JoltCircleRelease(&state,(int)i,velocity.x,velocity.y);
146
+ self.dragging=-1;self.dragEnds++;[self refresh];
147
+ }else if(pan.state==UIGestureRecognizerStateCancelled||pan.state==UIGestureRecognizerStateFailed)[self cancelDrag];
148
+ }
149
+ - (void)cancelDrag {
150
+ if(self.dragging<0)return;
151
+ JoltCircleCancel(&state,(int)self.dragging);self.dragging=-1;self.dragCancels++;[self apply];
152
+ }
153
+ - (void)setEnabled:(BOOL)enabled {
154
+ if(self.disposed)return;BOOL changed=_enabled!=enabled;_enabled=enabled;
155
+ if(!enabled)[self cancelDrag];else if(changed)JoltCircleWake(&state);
156
+ [self refresh];
157
+ }
158
+ - (void)backgrounded {self.background=YES;[self cancelDrag];[self refresh];}
159
+ - (void)foregrounded {self.background=NO;[self refresh];}
160
+ - (void)resize:(double)width height:(double)height {
161
+ if(self.disposed)return;
162
+ self.fits=JoltCircleFits(&state,width,height);
163
+ if(!self.fits){[self cancelDrag];[self refresh];return;}
164
+ if(fabs(width-state.width)>.1||fabs(height-state.height)>.1){[self cancelDrag];JoltCircleResize(&state,width,height);}
165
+ [self apply];[self refresh];
166
+ }
167
+ - (void)impulse:(NSInteger)index x:(double)x y:(double)y {
168
+ if(![self ready]||index<0||index>=state.count||state.bodies[index].held||!isfinite(x)||!isfinite(y))return;
169
+ JoltCircle *b=&state.bodies[index];b->vx+=x/b->m;b->vy+=y/b->m;JoltCircleLimitVelocity(b);JoltCircleWake(&state);[self refresh];
170
+ }
171
+ - (void)reset {
172
+ if(self.disposed)return;[self cancelDrag];
173
+ for(int i=0;i<state.count;i++){JoltCircle *b=&state.bodies[i];b->x=initialX[i]*state.width;b->y=initialY[i]*state.height;b->vx=initialVX[i];b->vy=initialVY[i];b->snap.active=b->snap.previousActive=false;b->released=false;}
174
+ JoltCircleContacts(&state,false,64);JoltCircleWake(&state);[self apply];[self refresh];
175
+ }
176
+ - (NSString *)snapshot {
177
+ NSMutableArray *bodies=[NSMutableArray new];
178
+ NSUInteger guideCount=0;
179
+ for(id guide in self.guides)if(guide!=NSNull.null)guideCount++;
180
+ for(int i=0;i<state.count;i++){
181
+ JoltCircle *b=&state.bodies[i];
182
+ id attachment=b->attachment.enabled?@{@"anchor":@{@"x":@(b->attachment.u*state.width),@"y":@(b->attachment.v*state.height)},@"length":@(b->attachment.length),@"stiffness":@(b->attachment.stiffness),@"damping":@(b->attachment.damping)}:NSNull.null;
183
+ id snap=NSNull.null;
184
+ if(b->snap.active){double x=JoltCircleSnapX(&state,b,b->snap.index),y=JoltCircleSnapY(&state,b,b->snap.index);snap=@{@"index":@(b->snap.index),@"point":@{@"x":@(x),@"y":@(y)},@"settled":[NSNumber numberWithBool:hypot(b->x-x,b->y-y)<=.25&&hypot(b->vx,b->vy)<=4&&!b->held]};}
185
+ id release=b->released?@{@"x":@(b->releaseX),@"y":@(b->releaseY),@"vx":@(b->releaseVX),@"vy":@(b->releaseVY)}:NSNull.null;
186
+ [bodies addObject:@{@"x":@(b->x),@"y":@(b->y),@"vx":@(b->vx),@"vy":@(b->vy),@"radius":@(b->r),@"held":@(b->held),@"attachment":attachment,@"snap":snap,@"release":release}];
187
+ }
188
+ NSString *status=self.disposed?@"disposed":!self.enabled?@"paused":self.background||!self.container.window?@"detached":!self.fits?@"invalid-bounds":state.sleeping?@"sleeping":@"running";
189
+ NSDictionary *data=@{@"status":status,@"guides":@(guideCount),@"bodies":bodies,@"frames":@(self.frames),@"steps":@(state.steps),@"contacts":@(state.contacts),@"dragStarts":@(self.dragStarts),@"dragMoves":@(self.dragMoves),@"dragEnds":@(self.dragEnds),@"dragCancels":@(self.dragCancels),@"processingMs":@(self.processingMs),@"droppedMs":@(self.droppedMs),@"clock":[NSNumber numberWithBool:self.link!=nil]};
190
+ return [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding];
191
+ }
192
+ - (void)dispose {
193
+ if(self.disposed)return;self.enabled=NO;self.disposed=YES;[self cancelDrag];[self refresh];
194
+ [[NSNotificationCenter defaultCenter]removeObserver:self];
195
+ [CATransaction begin];[CATransaction setDisableActions:YES];
196
+ for(int i=0;i<state.count;i++)if(self.views[i]!=NSNull.null){
197
+ UIView *v=self.views[i];v.userInteractionEnabled=originalInteraction[i];if(self.pans[i]!=NSNull.null)[v removeGestureRecognizer:self.pans[i]];
198
+ [v.layer setValue:@(originalX[i]) forKeyPath:@"transform.translation.x"];[v.layer setValue:@(originalY[i]) forKeyPath:@"transform.translation.y"];
199
+ }
200
+ for(id guide in self.guides)if(guide!=NSNull.null)[guide removeFromSuperlayer];[self.guides removeAllObjects];
201
+ [CATransaction commit];[self.views removeAllObjects];[self.pans removeAllObjects];self.container=nil;[worlds removeObject:self];
202
+ }
203
+ @end
@@ -0,0 +1,23 @@
1
+ #import <UIKit/UIKit.h>
2
+ #import "JoltLiveSpring.h"
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+ @interface JoltGestureSession : NSObject
6
+ @property(nonatomic, readonly) BOOL active;
7
+ + (BOOL)supportsContactEvents;
8
+ // Development-only semantic input. Requires the isolated "replay" option.
9
+ + (BOOL)supportsScrollReplay;
10
+ + (BOOL)hasSession:(UIView *)surface;
11
+ - (void)replayScroll:(NSInteger)phase delta:(double)delta velocity:(double)velocity;
12
+ - (void)replayScrollOffset:(double)offset;
13
+ + (instancetype)attach:(UIView *)surface scroll:(nullable UIScrollView *)scroll
14
+ x:(JoltLiveSpring *)x y:(JoltLiveSpring *)y scale:(JoltLiveSpring *)scale rotation:(JoltLiveSpring *)rotation
15
+ options:(NSString *)options onState:(void (^)(NSInteger, double, double))onState;
16
+ - (void)cancel;
17
+ - (void)refreshScrollDelegate;
18
+ - (void)setEnabled:(BOOL)enabled;
19
+ - (void)settleX:(double)x y:(double)y scale:(double)scale rotation:(double)rotation animated:(BOOL)animated;
20
+ - (void)updateLeft:(double)left right:(double)right top:(double)top bottom:(double)bottom;
21
+ - (void)dispose;
22
+ @end
23
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,251 @@
1
+ #import "JoltGestureSession.h"
2
+ #import <UIKit/UIGestureRecognizerSubclass.h>
3
+
4
+ static double clamp(double value, double minimum, double maximum) { return MAX(minimum, MIN(maximum, value)); }
5
+ @class JoltGestureSession;
6
+
7
+ /* Centroid tracking in window coordinates. Pointer membership changes rebase without movement. */
8
+ @interface JoltAxisPan : UIGestureRecognizer
9
+ @property(nonatomic, weak) JoltGestureSession *owner;
10
+ @property(nonatomic) NSMutableSet<UITouch *> *contacts;
11
+ @property(nonatomic) CGPoint previous, origin, delta, velocity;
12
+ @property(nonatomic) double previousTime, threshold, failOffset;
13
+ @property(nonatomic) NSInteger axis;
14
+ - (void)rebase;
15
+ @end
16
+
17
+ @interface JoltGestureSession () <UIGestureRecognizerDelegate, UIScrollViewDelegate>
18
+ @property(nonatomic, weak) UIView *surface;
19
+ @property(nonatomic, weak) UIScrollView *scroll;
20
+ @property(nonatomic) id<UIScrollViewDelegate> previousDelegate;
21
+ @property(nonatomic) JoltAxisPan *pan;
22
+ @property(nonatomic) UIPinchGestureRecognizer *pinch;
23
+ @property(nonatomic) UIRotationGestureRecognizer *rotate;
24
+ @property(nonatomic) UITapGestureRecognizer *tap, *doubleTap;
25
+ @property(nonatomic) JoltLiveSpring *x, *y, *scale, *rotation;
26
+ @property(nonatomic) double minX, maxX, minY, maxY, minScale, maxScale, velocityX, velocityY, scrollPosition;
27
+ @property(nonatomic, readwrite) BOOL active;
28
+ @property(nonatomic) BOOL enabled, disposed, contactEvents, contact, fromScroll, adjusting, ending, replayOnly;
29
+ @property(nonatomic, copy) void (^onState)(NSInteger, double, double);
30
+ - (void)touchStarted:(UITouch *)touch;
31
+ - (void)finish:(BOOL)cancelled;
32
+ - (void)applyScroll;
33
+ @end
34
+
35
+ @implementation JoltAxisPan
36
+ - (instancetype)initWithTarget:(id)target action:(SEL)action {
37
+ if ((self = [super initWithTarget:target action:action])) self.contacts = [NSMutableSet new];
38
+ return self;
39
+ }
40
+ - (CGPoint)centroid {
41
+ CGPoint point = CGPointZero;
42
+ for (UITouch *touch in self.contacts) { CGPoint p = [touch locationInView:nil]; point.x += p.x; point.y += p.y; }
43
+ if (self.contacts.count) { point.x /= self.contacts.count; point.y /= self.contacts.count; }
44
+ return point;
45
+ }
46
+ - (void)rebase { self.previous = [self centroid]; self.previousTime = CACurrentMediaTime(); self.delta = CGPointZero; self.velocity = CGPointZero; }
47
+ - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
48
+ BOOL first = !self.contacts.count;
49
+ [self.contacts unionSet:touches]; [self rebase];
50
+ if (self.state == UIGestureRecognizerStatePossible) self.origin = self.previous;
51
+ if (first) { self.origin = self.previous; [self.owner touchStarted:touches.anyObject]; }
52
+ }
53
+ - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
54
+ CGPoint point = [self centroid]; double now = CACurrentMediaTime(), dt = MAX(.001, now - self.previousTime);
55
+ self.delta = CGPointMake(point.x - self.previous.x, point.y - self.previous.y);
56
+ self.velocity = CGPointMake(self.delta.x / dt, self.delta.y / dt);
57
+ self.previous = point; self.previousTime = now;
58
+ if (self.state == UIGestureRecognizerStatePossible) {
59
+ double dx = fabs(point.x - self.origin.x), dy = fabs(point.y - self.origin.y);
60
+ if ((self.axis == 1 && dy > self.failOffset) || (self.axis == 2 && dx > self.failOffset)) { self.state = UIGestureRecognizerStateFailed; return; }
61
+ double distance = self.axis == 1 ? dx : self.axis == 2 ? dy : hypot(dx, dy);
62
+ if (self.axis && distance >= self.threshold) self.state = UIGestureRecognizerStateBegan;
63
+ } else if (self.state == UIGestureRecognizerStateBegan || self.state == UIGestureRecognizerStateChanged) self.state = UIGestureRecognizerStateChanged;
64
+ }
65
+ - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
66
+ [self.contacts minusSet:touches];
67
+ if (self.contacts.count) [self rebase];
68
+ else {
69
+ if (CACurrentMediaTime() - self.previousTime > .08) self.velocity = CGPointZero;
70
+ self.owner.velocityX = (self.axis & 1) ? self.velocity.x : 0; self.owner.velocityY = (self.axis & 2) ? self.velocity.y : 0;
71
+ self.state = self.state == UIGestureRecognizerStatePossible ? UIGestureRecognizerStateFailed : UIGestureRecognizerStateEnded;
72
+ [self.owner finish:NO];
73
+ }
74
+ }
75
+ - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { self.state = UIGestureRecognizerStateCancelled; [self.owner finish:YES]; }
76
+ - (void)reset { [super reset]; [self.contacts removeAllObjects]; self.delta = CGPointZero; self.velocity = CGPointZero; }
77
+ @end
78
+
79
+ @implementation JoltGestureSession
80
+ + (BOOL)supportsContactEvents { return YES; }
81
+ + (BOOL)hasSession:(UIView *)surface {
82
+ for (UIGestureRecognizer *g in surface.gestureRecognizers) if ([g isKindOfClass:JoltAxisPan.class]) return YES;
83
+ return NO;
84
+ }
85
+ + (instancetype)attach:(UIView *)surface scroll:(UIScrollView *)scroll x:(JoltLiveSpring *)x y:(JoltLiveSpring *)y scale:(JoltLiveSpring *)scale rotation:(JoltLiveSpring *)rotation options:(NSString *)options onState:(void (^)(NSInteger,double,double))onState {
86
+ NSDictionary *config = [NSJSONSerialization JSONObjectWithData:[options dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
87
+ if ([config[@"replay"] boolValue] && [self hasSession:surface])
88
+ [NSException raise:NSInvalidArgumentException format:@"Replay requires an unowned gesture surface"];
89
+ JoltGestureSession *s = [self new]; s.surface = surface; s.scroll = scroll; s.x = x; s.y = y; s.scale = scale; s.rotation = rotation;
90
+ s.minX = [config[@"minX"] doubleValue]; s.maxX = [config[@"maxX"] doubleValue]; s.minY = [config[@"minY"] doubleValue]; s.maxY = [config[@"maxY"] doubleValue];
91
+ s.minScale = [config[@"minScale"] doubleValue]; s.maxScale = [config[@"maxScale"] doubleValue]; s.onState = onState; s.enabled = YES;
92
+ s.pan = [[JoltAxisPan alloc] initWithTarget:s action:@selector(panned:)]; s.pan.owner = s;
93
+ s.pan.axis = [config[@"axis"] integerValue]; s.pan.threshold = [config[@"threshold"] doubleValue]; s.pan.failOffset = [config[@"failOffset"] doubleValue];
94
+ s.pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:s action:@selector(pinched:)];
95
+ s.rotate = [[UIRotationGestureRecognizer alloc] initWithTarget:s action:@selector(rotated:)];
96
+ s.tap = [[UITapGestureRecognizer alloc] initWithTarget:s action:@selector(tapped:)];
97
+ s.doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:s action:@selector(tapped:)]; s.doubleTap.numberOfTapsRequired = 2;
98
+ [s.tap requireGestureRecognizerToFail:s.doubleTap];
99
+ for (UIGestureRecognizer *g in @[s.pan, s.pinch, s.rotate, s.tap, s.doubleTap]) { g.delegate = s; [surface addGestureRecognizer:g]; }
100
+ s.pinch.enabled = [config[@"pinch"] boolValue]; s.rotate.enabled = [config[@"rotate"] boolValue];
101
+ s.contactEvents = [config[@"contactEvents"] boolValue];
102
+ s.replayOnly = [config[@"replay"] boolValue];
103
+ s.tap.enabled = [config[@"tap"] boolValue]; s.doubleTap.enabled = [config[@"doubleTap"] boolValue];
104
+ if (s.replayOnly) for (UIGestureRecognizer *g in @[s.pan, s.pinch, s.rotate, s.tap, s.doubleTap]) g.enabled = NO;
105
+ // NativeScript's scroll delegate is forwarded, never replaced with a JS per-frame bridge.
106
+ if (scroll) { s.previousDelegate = scroll.delegate; scroll.delegate = s; }
107
+ return s;
108
+ }
109
+ - (BOOL)respondsToSelector:(SEL)selector { return [super respondsToSelector:selector] || [self.previousDelegate respondsToSelector:selector]; }
110
+ - (void)refreshScrollDelegate {
111
+ if (!self.disposed && self.scroll && self.scroll.delegate != self) {
112
+ self.previousDelegate = self.scroll.delegate; self.scroll.delegate = self;
113
+ }
114
+ }
115
+ - (id)forwardingTargetForSelector:(SEL)selector { return [self.previousDelegate respondsToSelector:selector] ? self.previousDelegate : [super forwardingTargetForSelector:selector]; }
116
+ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)first shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)second {
117
+ if ([first isKindOfClass:UITapGestureRecognizer.class] || [second isKindOfClass:UITapGestureRecognizer.class]) return NO;
118
+ return YES;
119
+ }
120
+ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
121
+ return self.enabled && !self.disposed;
122
+ }
123
+ - (void)touchStarted:(UITouch *)touch {
124
+ if (self.disposed || !self.enabled) return;
125
+ self.contact = YES; self.fromScroll = self.scroll && [touch.view isDescendantOfView:self.scroll];
126
+ self.scrollPosition = MAX(-self.scroll.adjustedContentInset.top, self.scroll.contentOffset.y);
127
+ self.velocityX = self.velocityY = 0;
128
+ for (JoltLiveSpring *node in @[self.x, self.y, self.scale, self.rotation]) [node releaseInput:node.position velocity:0];
129
+ if (self.contactEvents) [self emit:6];
130
+ }
131
+ - (void)emit:(NSInteger)state { if (!self.disposed && self.onState) self.onState(state, self.velocityX, self.velocityY); }
132
+ - (void)begin {
133
+ if (self.active || self.disposed || !self.enabled) return;
134
+ self.active = YES;
135
+ for (JoltLiveSpring *node in @[self.x, self.y, self.scale, self.rotation]) [node holdInput:node.position velocity:0];
136
+ [self emit:1];
137
+ }
138
+ - (void)panned:(JoltAxisPan *)pan {
139
+ if (self.disposed || !self.enabled) return;
140
+ if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged) {
141
+ [self begin]; if (self.disposed || !self.enabled || !self.active) return;
142
+ self.velocityX = (pan.axis & 1) ? pan.velocity.x : 0; self.velocityY = (pan.axis & 2) ? pan.velocity.y : 0;
143
+ double dx = pan.delta.x, dy = pan.delta.y;
144
+ if (self.fromScroll) {
145
+ [self consumeScrollDelta:dy];
146
+ } else {
147
+ if (pan.axis & 1) [self.x holdInput:clamp(self.x.position + dx, self.minX, self.maxX) velocity:self.velocityX];
148
+ if (pan.axis & 2) [self.y holdInput:clamp(self.y.position + dy, self.minY, self.maxY) velocity:self.velocityY];
149
+ }
150
+ } else if (pan.state == UIGestureRecognizerStateEnded) [self finish:NO];
151
+ else if (pan.state == UIGestureRecognizerStateCancelled || pan.state == UIGestureRecognizerStateFailed) [self finish:YES];
152
+ }
153
+ // Shared by the OS recognizer and the isolated semantic replay adapter.
154
+ - (void)consumeScrollDelta:(double)dy {
155
+ double oldY = self.y.position, nextY = oldY, top = -self.scroll.adjustedContentInset.top;
156
+ if (dy < 0) { nextY = MAX(self.minY, oldY + dy); dy -= nextY - oldY; }
157
+ else {
158
+ double consumed = MIN(dy, MAX(0, self.scrollPosition - top));
159
+ self.scrollPosition -= consumed; dy -= consumed;
160
+ nextY = MIN(self.maxY, oldY + dy); dy -= nextY - oldY;
161
+ }
162
+ double bottom = MAX(top, self.scroll.contentSize.height - self.scroll.bounds.size.height + self.scroll.adjustedContentInset.bottom);
163
+ self.scrollPosition = clamp(self.scrollPosition - dy, top, bottom);
164
+ [self.y holdInput:nextY velocity:self.velocityY]; [self applyScroll];
165
+ }
166
+ + (BOOL)supportsScrollReplay { return YES; }
167
+ - (void)replayScroll:(NSInteger)phase delta:(double)dy velocity:(double)velocity {
168
+ if (!self.replayOnly || self.disposed || !self.scroll || !isfinite(dy) || !isfinite(velocity))
169
+ [NSException raise:NSInvalidArgumentException format:@"Scroll replay needs an isolated replay session and finite input"];
170
+ if (phase == 1) {
171
+ [self cancel]; self.contact = YES; self.fromScroll = YES;
172
+ self.scrollPosition = MAX(-self.scroll.adjustedContentInset.top, self.scroll.contentOffset.y);
173
+ self.velocityX = self.velocityY = 0; [self begin];
174
+ } else if (phase == 2 && self.contact) {
175
+ self.velocityY = velocity; [self consumeScrollDelta:dy];
176
+ } else if (phase == 3 || phase == 4) [self finish:phase == 4];
177
+ }
178
+ - (void)replayScrollOffset:(double)offset {
179
+ if (!self.replayOnly || self.disposed || !isfinite(offset))
180
+ [NSException raise:NSInvalidArgumentException format:@"Invalid scroll replay offset"];
181
+ self.scrollPosition = -self.scroll.adjustedContentInset.top + offset; [self applyScroll];
182
+ }
183
+ - (void)pinched:(UIPinchGestureRecognizer *)gesture {
184
+ if (self.fromScroll || self.disposed || !self.enabled) return;
185
+ if (gesture.state == UIGestureRecognizerStateBegan || gesture.state == UIGestureRecognizerStateChanged) {
186
+ [self begin]; if (self.disposed || !self.active) return;
187
+ [self.scale holdInput:clamp(self.scale.position * gesture.scale, self.minScale, self.maxScale) velocity:0]; gesture.scale = 1;
188
+ } else if (!self.pan.contacts.count) [self finish:gesture.state == UIGestureRecognizerStateCancelled];
189
+ }
190
+ - (void)rotated:(UIRotationGestureRecognizer *)gesture {
191
+ if (self.fromScroll || self.disposed || !self.enabled) return;
192
+ if (gesture.state == UIGestureRecognizerStateBegan || gesture.state == UIGestureRecognizerStateChanged) {
193
+ [self begin]; if (self.disposed || !self.active) return;
194
+ [self.rotation holdInput:self.rotation.position + gesture.rotation * 180 / M_PI velocity:0]; gesture.rotation = 0;
195
+ } else if (!self.pan.contacts.count) [self finish:gesture.state == UIGestureRecognizerStateCancelled];
196
+ }
197
+ - (void)tapped:(UITapGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateRecognized) [self emit:gesture == self.doubleTap ? 5 : 4]; }
198
+ - (void)applyScroll {
199
+ if (!self.scroll || self.adjusting) return;
200
+ self.adjusting = YES;
201
+ [self.scroll setContentOffset:CGPointMake(self.scroll.contentOffset.x, self.scrollPosition) animated:NO];
202
+ self.adjusting = NO;
203
+ }
204
+ - (void)scrollViewDidScroll:(UIScrollView *)scroll {
205
+ if (self.contact && self.fromScroll && !self.adjusting) [self applyScroll];
206
+ if (!self.adjusting && [self.previousDelegate respondsToSelector:_cmd]) [self.previousDelegate scrollViewDidScroll:scroll];
207
+ }
208
+ - (void)scrollViewWillEndDragging:(UIScrollView *)scroll withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)target {
209
+ if (self.y.position > self.minY + .01) target->y = scroll.contentOffset.y;
210
+ if ([self.previousDelegate respondsToSelector:_cmd]) [self.previousDelegate scrollViewWillEndDragging:scroll withVelocity:velocity targetContentOffset:target];
211
+ }
212
+ - (void)finish:(BOOL)cancelled {
213
+ BOOL hadContact = self.contact;
214
+ self.contact = NO;
215
+ if (!self.active) { if (hadContact && self.contactEvents) [self emit:7]; return; }
216
+ self.active = NO;
217
+ for (JoltLiveSpring *node in @[self.x, self.y, self.scale, self.rotation]) [node releaseInput:node.position velocity:0];
218
+ self.ending = !cancelled;
219
+ @try { [self emit:cancelled ? 3 : 2]; } @finally { self.ending = NO; }
220
+ if (hadContact && self.contactEvents) [self emit:7];
221
+ }
222
+ - (void)cancel {
223
+ if (self.active) [self finish:YES];
224
+ else {
225
+ [self finish:YES];
226
+ for (JoltLiveSpring *node in @[self.x, self.y, self.scale, self.rotation]) [node releaseInput:node.position velocity:0];
227
+ }
228
+ for (UIGestureRecognizer *g in @[self.pan, self.pinch, self.rotate, self.tap, self.doubleTap]) if (g.enabled) { g.enabled = NO; g.enabled = YES; }
229
+ }
230
+ - (void)setEnabled:(BOOL)value { _enabled = value; if (!value) [self cancel]; }
231
+ - (void)settleX:(double)x y:(double)y scale:(double)scale rotation:(double)rotation animated:(BOOL)animated {
232
+ if (self.disposed) return;
233
+ double vx = self.ending ? self.velocityX : self.x.velocity, vy = self.ending ? self.velocityY : self.y.velocity;
234
+ [self cancel];
235
+ double targets[] = {clamp(x, self.minX, self.maxX), clamp(y, self.minY, self.maxY), clamp(scale, self.minScale, self.maxScale), rotation};
236
+ NSArray *nodes = @[self.x, self.y, self.scale, self.rotation];
237
+ for (NSUInteger i = 0; i < nodes.count; i++) {
238
+ JoltLiveSpring *node = nodes[i];
239
+ if (!animated) [node holdInput:targets[i] velocity:0];
240
+ [node releaseInput:targets[i] velocity:animated ? i == 0 ? vx : i == 1 ? vy : 0 : 0];
241
+ }
242
+ }
243
+ - (void)updateLeft:(double)left right:(double)right top:(double)top bottom:(double)bottom { self.minX = left; self.maxX = right; self.minY = top; self.maxY = bottom; }
244
+ - (void)dispose {
245
+ if (self.disposed) return;
246
+ [self cancel]; self.disposed = YES;
247
+ for (UIGestureRecognizer *g in @[self.pan, self.pinch, self.rotate, self.tap, self.doubleTap]) [self.surface removeGestureRecognizer:g];
248
+ if (self.scroll.delegate == self) self.scroll.delegate = self.previousDelegate;
249
+ self.previousDelegate = nil; self.onState = nil;
250
+ }
251
+ @end
@@ -0,0 +1,23 @@
1
+ #import <UIKit/UIKit.h>
2
+ NS_ASSUME_NONNULL_BEGIN
3
+
4
+ /** Frame's delegate supplies this object to UIKit; it never replaces that delegate. */
5
+ @interface JoltInteractiveNavigation : NSObject <UIViewControllerAnimatedTransitioning, UIViewControllerInteractiveTransitioning, UIGestureRecognizerDelegate>
6
+ + (instancetype)attach:(UINavigationController *)navigation stiffness:(double)stiffness
7
+ damping:(double)damping mass:(double)mass
8
+ shouldBegin:(BOOL (^)(void))shouldBegin onEvent:(void (^)(NSInteger))onEvent;
9
+ + (NSUInteger)activeCount;
10
+ + (NSUInteger)recognizerCount;
11
+ @property(nonatomic, readonly) BOOL interactive;
12
+ @property(nonatomic, readonly) double progress;
13
+ @property(nonatomic, readonly) double velocity;
14
+ @property(nonatomic) BOOL sharedEnabled;
15
+ @property(nonatomic) BOOL sharedDeferred;
16
+ - (void)completeSharedPreparation;
17
+ - (BOOL)prepareSharedFrom:(UIView *)from to:(UIView *)to image:(BOOL)image fromRadius:(double)fromRadius toRadius:(double)toRadius maxPixels:(double)maxPixels;
18
+ - (void)prepareOperation:(NSInteger)operation presented:(UIViewController *)presented reduced:(BOOL)reduced timeScale:(double)timeScale;
19
+ - (void)sync;
20
+ - (void)cancel;
21
+ - (void)disposeRestoringSwipe:(BOOL)enabled;
22
+ @end
23
+ NS_ASSUME_NONNULL_END