@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,523 @@
1
+ import { Application, isIOS, type View } from '@nativescript/core'
2
+ import { getDriver, setDriver, type Driver } from '../driver/index.js'
3
+ import { inspectViewMotion, type Animation } from '../engine.js'
4
+ import { inspectViewBindings, type DerivedValue } from '../motion-value.js'
5
+ import { isProperty, readValue, type Property } from '../properties.js'
6
+ import type { Track } from '../track.js'
7
+ import type { PlaybackAnimation } from '../playback.js'
8
+ import {
9
+ inspectorCostTime,
10
+ probeProperties,
11
+ startProbe,
12
+ type NativeProbe,
13
+ } from './probe.js'
14
+ export { inspectorSpring, springCode } from './tuning.js'
15
+ export { inspectorPlot } from './plot.js'
16
+ export type { InspectorSpring } from './tuning.js'
17
+
18
+ export interface InspectorEvent {
19
+ at: number
20
+ property: Property
21
+ kind: 'start' | 'replace' | 'stop' | 'complete' | 'pause' | 'play' | 'seek'
22
+ owner: string
23
+ previous?: string
24
+ label?: string
25
+ previousLabel?: string
26
+ }
27
+ export interface InspectorSample {
28
+ at: number
29
+ expected: number | null
30
+ observed: number | null
31
+ source: 'presentation-layer' | 'native-view' | 'unavailable'
32
+ }
33
+ export interface InspectorProperty {
34
+ property: Property
35
+ layer?: string
36
+ owner: string
37
+ label: string
38
+ target: number
39
+ value: number
40
+ velocity: number
41
+ elapsed: number
42
+ delay: number
43
+ duration: number
44
+ paused: boolean
45
+ }
46
+ export interface InspectorNode {
47
+ id: string
48
+ label: string
49
+ kind: string
50
+ value: number
51
+ input?: InspectorNode
52
+ mappings: { input: number[]; output: number[]; clamp: boolean }[]
53
+ }
54
+ export interface InspectorSnapshot {
55
+ selected: string | null
56
+ property: Property
57
+ properties: InspectorProperty[]
58
+ bindings: { property: Property; value: number; source: InspectorNode }[]
59
+ events: InspectorEvent[]
60
+ samples: InspectorSample[]
61
+ status: string
62
+ overhead: {
63
+ reads: number
64
+ jsReadMs: number
65
+ hookMs: number
66
+ nativeSamples: number
67
+ nativeSampleMs: number
68
+ nativeDrainMs: number
69
+ dropped: number
70
+ }
71
+ }
72
+ export interface MotionInspector {
73
+ watch(view: View, id: string): () => void
74
+ select(id: string, property?: Property): void
75
+ label(animation: Animation | DerivedValue, label: string): void
76
+ read(): InspectorSnapshot
77
+ /** Explicit edit command; reading/selecting never changes playback. */
78
+ control(
79
+ animation: PlaybackAnimation,
80
+ command: 'pause' | 'play' | 'seek',
81
+ progress?: number,
82
+ ): void
83
+ dispose(): void
84
+ }
85
+
86
+ interface Segment {
87
+ at: number
88
+ owner: string
89
+ position(at: number): number
90
+ }
91
+ interface ObservedTrack {
92
+ track: Track
93
+ view: View
94
+ owner: string
95
+ anchor: number
96
+ elapsed: number
97
+ paused: boolean
98
+ stopped: boolean
99
+ adopted?: boolean
100
+ }
101
+ let installed = false
102
+
103
+ /** Import only inside a development entry. One inspector may own the optional hooks. */
104
+ export function createMotionInspector(options: {
105
+ development: true
106
+ capacity?: number
107
+ hertz?: number
108
+ }): MotionInspector {
109
+ if (options.development !== true)
110
+ throw new Error('The motion inspector requires development: true.')
111
+ if (installed) throw new Error('Dispose the existing motion inspector first.')
112
+ const capacity = options.capacity ?? 240,
113
+ hertz = options.hertz ?? 60
114
+ if (
115
+ !Number.isInteger(capacity) ||
116
+ capacity < 8 ||
117
+ capacity > 600 ||
118
+ !Number.isFinite(hertz) ||
119
+ hertz < 1 ||
120
+ hertz > 120
121
+ )
122
+ throw new RangeError('Inspector capacity is 8–600 and hertz is 1–120.')
123
+ const base = getDriver()
124
+ const views = new Map<string, View>(),
125
+ releases = new Map<string, () => void>()
126
+ const identities = new WeakMap<object, string>(),
127
+ labels = new WeakMap<object, string>()
128
+ const handles = new Map<unknown, ObservedTrack>()
129
+ const names = new Map<string, string>()
130
+ const histories = new Map<Property, Segment[]>()
131
+ const events: InspectorEvent[] = [],
132
+ samples: InspectorSample[] = []
133
+ let nextId = 0,
134
+ selected: string | null = null,
135
+ property: Property = 'x'
136
+ let probe: NativeProbe | undefined,
137
+ disposed = false,
138
+ status = 'No view selected'
139
+ const overhead = {
140
+ reads: 0,
141
+ jsReadMs: 0,
142
+ hookMs: 0,
143
+ nativeSamples: 0,
144
+ nativeSampleMs: 0,
145
+ nativeDrainMs: 0,
146
+ dropped: 0,
147
+ }
148
+ const identity = (value: object) => {
149
+ let id = identities.get(value)
150
+ if (!id) identities.set(value, (id = `owner-${++nextId}`))
151
+ return id
152
+ }
153
+ const boundedPush = <T>(array: T[], item: T) => {
154
+ array.push(item)
155
+ if (array.length > capacity) array.shift()
156
+ }
157
+ const isSelected = (view: View) => !!selected && views.get(selected) === view
158
+ const pruneAdopted = () => {
159
+ // Handles captured after play() started do not have our completion callback.
160
+ for (const [handle, run] of handles)
161
+ if (run.adopted && !inspectViewMotion(run.view).some((e) => e.handle === handle))
162
+ handles.delete(handle)
163
+ }
164
+ const position = (run: ObservedTrack, at: number) =>
165
+ run.track.valueAt(run.elapsed + (run.paused ? 0 : at - run.anchor))
166
+ const segment = (run: ObservedTrack, at: number) => {
167
+ if (!isSelected(run.view)) return
168
+ let history = histories.get(run.track.property)
169
+ if (!history) histories.set(run.track.property, (history = []))
170
+ const frozen = { ...run }
171
+ boundedPush(history, {
172
+ at,
173
+ owner: run.owner,
174
+ position: (time) => position(frozen, time),
175
+ })
176
+ }
177
+ const note = (run: ObservedTrack, kind: InspectorEvent['kind'], previous?: string) => {
178
+ if (isSelected(run.view))
179
+ boundedPush(events, {
180
+ at: base.now(),
181
+ property: run.track.property,
182
+ owner: run.owner,
183
+ kind,
184
+ previous,
185
+ })
186
+ }
187
+ const wrapper = Object.create(base) as Driver
188
+ wrapper.play = (view, track, startedAt, onEnd) => {
189
+ if (!isSelected(view)) return base.play(view, track, startedAt, onEnd)
190
+ const begin = base.now()
191
+ const cost = inspectorCostTime()
192
+ const entries = inspectViewMotion(view).filter(
193
+ (entry) => entry.property === track.property,
194
+ )
195
+ const entry = entries.find((e) => e.track === track)
196
+ const previous = histories.get(track.property)?.at(-1)?.owner
197
+ const run: ObservedTrack = {
198
+ view,
199
+ track,
200
+ owner: identity(entry?.owner ?? track),
201
+ anchor: startedAt,
202
+ elapsed: 0,
203
+ paused: false,
204
+ stopped: false,
205
+ }
206
+ let completed = false,
207
+ handle: unknown
208
+ const finished = (ok?: boolean) => {
209
+ completed = true
210
+ if (!disposed && !run.stopped && isSelected(view)) {
211
+ note(run, ok === false ? 'stop' : 'complete')
212
+ const at = base.now(),
213
+ value = ok === false ? position(run, at) : track.to
214
+ let history = histories.get(track.property)
215
+ if (!history) histories.set(track.property, (history = []))
216
+ boundedPush(history, { at, owner: run.owner, position: () => value })
217
+ }
218
+ handles.delete(handle)
219
+ onEnd(ok)
220
+ }
221
+ const nativeBegin = inspectorCostTime()
222
+ handle = base.play(view, track, startedAt, finished)
223
+ const nativeCost = inspectorCostTime() - nativeBegin
224
+ if (!completed) {
225
+ run.elapsed = base.elapsed?.(handle) ?? base.now() - startedAt
226
+ run.anchor = base.now()
227
+ handles.set(handle, run)
228
+ segment(run, begin)
229
+ note(
230
+ run,
231
+ previous && previous !== 'model' && previous !== run.owner ? 'replace' : 'start',
232
+ previous,
233
+ )
234
+ }
235
+ overhead.hookMs += inspectorCostTime() - cost - nativeCost
236
+ return handle
237
+ }
238
+ wrapper.stop = (view, handle) => {
239
+ const cost = inspectorCostTime()
240
+ const run = handles.get(handle)
241
+ if (run) {
242
+ const at = base.now()
243
+ run.elapsed += run.paused ? 0 : at - run.anchor
244
+ run.anchor = at
245
+ run.paused = true
246
+ run.stopped = true
247
+ segment(run, at)
248
+ note(run, 'stop')
249
+ handles.delete(handle)
250
+ }
251
+ overhead.hookMs += inspectorCostTime() - cost
252
+ base.stop(view, handle)
253
+ }
254
+ if (base.control)
255
+ wrapper.control = (view, handle, elapsed, paused, command) => {
256
+ base.control!(view, handle, elapsed, paused, command)
257
+ const cost = inspectorCostTime()
258
+ const run = handles.get(handle)
259
+ if (run) {
260
+ run.elapsed = base.elapsed?.(handle) ?? elapsed
261
+ run.anchor = base.now()
262
+ run.paused = paused
263
+ segment(run, run.anchor)
264
+ note(run, command ?? 'seek')
265
+ }
266
+ overhead.hookMs += inspectorCostTime() - cost
267
+ }
268
+ // Native implementations use closures, but bind inherited methods for custom drivers too.
269
+ for (const key of [
270
+ 'now',
271
+ 'frame',
272
+ 'clock',
273
+ 'sync',
274
+ 'elapsed',
275
+ 'presented',
276
+ 'after',
277
+ 'layoutFrame',
278
+ 'afterLayout',
279
+ 'reducedMotion',
280
+ 'watchReducedMotion',
281
+ ] as const) {
282
+ const fn = base[key]
283
+ if (fn)
284
+ Object.defineProperty(wrapper, key, { value: fn.bind(base), configurable: true })
285
+ }
286
+ const halt = () => {
287
+ probe?.dispose()
288
+ probe = undefined
289
+ }
290
+ const suspend = () => {
291
+ halt()
292
+ status = 'Sampling stopped in background; select a view to resume'
293
+ }
294
+ const assertOpen = () => {
295
+ if (disposed) throw new Error('Motion inspector is disposed.')
296
+ }
297
+ const graph = (
298
+ node: ReturnType<typeof inspectViewBindings>[number]['source'],
299
+ ): InspectorNode => ({
300
+ id: identity(node.identity),
301
+ label: labels.get(node.identity) ?? node.kind,
302
+ kind: node.kind,
303
+ value: node.value,
304
+ mappings: node.mappings.map((m) => ({
305
+ input: [...m.input],
306
+ output: [...m.output],
307
+ clamp: m.clamp,
308
+ })),
309
+ input: node.input ? graph(node.input) : undefined,
310
+ })
311
+ const result: MotionInspector = {
312
+ watch(view, id) {
313
+ assertOpen()
314
+ if (!id || id.length > 100 || views.has(id) || views.size >= 32)
315
+ throw new Error(
316
+ 'Watch up to 32 views using unique, nonempty IDs of at most 100 characters.',
317
+ )
318
+ views.set(id, view)
319
+ const unloaded = () => {
320
+ if (selected === id) {
321
+ halt()
322
+ status = 'Selected view unloaded'
323
+ }
324
+ }
325
+ view.on('unloaded', unloaded)
326
+ const release = () => {
327
+ if (views.get(id) !== view) return
328
+ if (selected === id) {
329
+ halt()
330
+ selected = null
331
+ histories.clear()
332
+ samples.length = 0
333
+ events.length = 0
334
+ }
335
+ view.off('unloaded', unloaded)
336
+ views.delete(id)
337
+ releases.delete(id)
338
+ for (const [handle, run] of handles) if (run.view === view) handles.delete(handle)
339
+ }
340
+ releases.set(id, release)
341
+ return release
342
+ },
343
+ select(id, nextProperty = 'x') {
344
+ assertOpen()
345
+ pruneAdopted()
346
+ const view = views.get(id)
347
+ if (!view) throw new Error(`Unknown inspector view: ${id}`)
348
+ if (!isProperty(nextProperty)) throw new Error('Unknown inspector property.')
349
+ halt()
350
+ selected = id
351
+ property = nextProperty
352
+ histories.clear()
353
+ samples.length = 0
354
+ events.length = 0
355
+ // Existing animations are inspected without replaying or stealing ownership.
356
+ const existing = inspectViewMotion(view)
357
+ for (const entry of existing) {
358
+ if (
359
+ entry.layer !== undefined ||
360
+ existing.some((e) => e.property === entry.property && e.layer !== undefined)
361
+ )
362
+ continue
363
+ const run = {
364
+ view,
365
+ track: entry.track,
366
+ owner: identity(entry.owner),
367
+ elapsed: entry.elapsed,
368
+ anchor: base.now(),
369
+ paused: entry.paused,
370
+ stopped: false,
371
+ adopted: true,
372
+ }
373
+ segment(run, run.anchor)
374
+ if (!handles.has(entry.handle)) handles.set(entry.handle, run)
375
+ }
376
+ for (const run of handles.values()) if (run.view === view) segment(run, base.now())
377
+ if (
378
+ !histories.has(property) &&
379
+ !existing.some((e) => e.property === property) &&
380
+ !inspectViewBindings(view).some((b) => b.property === property)
381
+ ) {
382
+ try {
383
+ const value = readValue(view, property)
384
+ histories.set(property, [
385
+ { at: base.now(), owner: 'model', position: () => value },
386
+ ])
387
+ } catch {
388
+ /* A view may not expose this optional decoration. */
389
+ }
390
+ }
391
+ try {
392
+ if (!(probeProperties as readonly string[]).includes(property)) {
393
+ status = `Native sampling unavailable for ${property}`
394
+ return
395
+ }
396
+ probe = startProbe(view, capacity, hertz)
397
+ status = 'Sampling native values'
398
+ } catch (error) {
399
+ status = `Native sampling unavailable: ${String(error)}`
400
+ }
401
+ },
402
+ label(animation, label) {
403
+ assertOpen()
404
+ if (!label || label.length > 100) throw new Error('Use a short nonempty label.')
405
+ labels.set(animation, label)
406
+ names.set(identity(animation), label)
407
+ if (names.size > capacity) names.delete(names.keys().next().value!)
408
+ },
409
+ read() {
410
+ assertOpen()
411
+ pruneAdopted()
412
+ const begin = inspectorCostTime(),
413
+ view = selected ? views.get(selected) : undefined
414
+ if (probe) {
415
+ const batch = probe.drain()
416
+ const index = (probeProperties as readonly string[]).indexOf(property) + 1
417
+ const history = histories.get(property) ?? []
418
+ for (const row of batch.rows) {
419
+ const at = row[0]!
420
+ if (at === null) continue
421
+ const source = [...history].reverse().find((s) => s.at <= at)
422
+ const expected = source?.position(at)
423
+ const observed = index > 0 ? (row[index] ?? null) : null
424
+ boundedPush(samples, {
425
+ at,
426
+ expected:
427
+ expected !== undefined && Number.isFinite(expected) ? expected : null,
428
+ observed,
429
+ source:
430
+ observed === null
431
+ ? 'unavailable'
432
+ : isIOS
433
+ ? 'presentation-layer'
434
+ : 'native-view',
435
+ })
436
+ }
437
+ Object.assign(overhead, {
438
+ nativeSamples: batch.samples,
439
+ nativeSampleMs: batch.sampleCpuMs,
440
+ nativeDrainMs: batch.drainCpuMs,
441
+ dropped: batch.dropped,
442
+ })
443
+ if (!batch.active) {
444
+ halt()
445
+ status = 'Native sampling stopped; select a view to resume'
446
+ }
447
+ }
448
+ const properties = view
449
+ ? inspectViewMotion(view).map((e) => ({
450
+ property: e.property,
451
+ layer: e.layer,
452
+ owner: identity(e.owner),
453
+ label: labels.get(e.owner) ?? identity(e.owner),
454
+ target: e.track.to,
455
+ value: e.track.valueAt(e.elapsed),
456
+ velocity: e.paused ? 0 : e.track.velocityAt(e.elapsed),
457
+ elapsed: e.elapsed,
458
+ delay: e.track.delay,
459
+ duration: e.track.end,
460
+ paused: e.paused,
461
+ }))
462
+ : []
463
+ const bindings = view
464
+ ? inspectViewBindings(view).map((b) => ({
465
+ property: b.property,
466
+ value: b.value,
467
+ source: graph(b.source),
468
+ }))
469
+ : []
470
+ overhead.reads++
471
+ overhead.jsReadMs += inspectorCostTime() - begin
472
+ return {
473
+ selected,
474
+ property,
475
+ properties,
476
+ bindings,
477
+ events: events.map((e) => ({
478
+ ...e,
479
+ label: names.get(e.owner),
480
+ previousLabel: e.previous ? names.get(e.previous) : undefined,
481
+ })),
482
+ samples: samples.map((s) => ({ ...s })),
483
+ status,
484
+ overhead: { ...overhead },
485
+ }
486
+ },
487
+ control(animation, command, progress) {
488
+ assertOpen()
489
+ if (command === 'seek') {
490
+ if (
491
+ progress === undefined ||
492
+ !Number.isFinite(progress) ||
493
+ progress < 0 ||
494
+ progress > 1 ||
495
+ !Number.isFinite(animation.duration)
496
+ )
497
+ throw new RangeError(
498
+ 'Scrubbing requires a finite animation and progress from 0 to 1.',
499
+ )
500
+ animation.pause()
501
+ animation.progress = progress
502
+ } else animation[command]()
503
+ },
504
+ dispose() {
505
+ if (disposed) return
506
+ disposed = true
507
+ halt()
508
+ for (const release of [...releases.values()]) release()
509
+ handles.clear()
510
+ names.clear()
511
+ histories.clear()
512
+ events.length = 0
513
+ samples.length = 0
514
+ Application.off(Application.suspendEvent, suspend)
515
+ if (getDriver() === wrapper) setDriver(base)
516
+ installed = false
517
+ },
518
+ }
519
+ setDriver(wrapper)
520
+ installed = true
521
+ Application.on(Application.suspendEvent, suspend)
522
+ return result
523
+ }
@@ -0,0 +1,27 @@
1
+ import type { InspectorSample } from './index.js'
2
+
3
+ /** Separate paths preserve unavailable observations instead of fabricating a line. */
4
+ export function inspectorPlot(samples: readonly InspectorSample[]): string {
5
+ const values = samples
6
+ .flatMap((s) => [s.expected, s.observed])
7
+ .filter((v): v is number => v !== null && Number.isFinite(v))
8
+ const min = Math.min(0, ...values),
9
+ max = Math.max(1, ...values)
10
+ const first = samples[0]?.at ?? 0,
11
+ span = Math.max(1, (samples.at(-1)?.at ?? 1) - first)
12
+ const path = (key: 'expected' | 'observed') => {
13
+ let drawing = false,
14
+ result = ''
15
+ for (const s of samples) {
16
+ const value = s[key]
17
+ if (value === null || !Number.isFinite(value)) {
18
+ drawing = false
19
+ continue
20
+ }
21
+ result += `${drawing ? 'L' : 'M'}${(12 + ((s.at - first) / span) * 296).toFixed(2)},${(88 - ((value - min) / (max - min)) * 72).toFixed(2)} `
22
+ drawing = true
23
+ }
24
+ return result
25
+ }
26
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="320" height="104" viewBox="0 0 320 104"><rect width="320" height="104" rx="14" fill="#252A34"/><path d="M12 16H308M12 52H308M12 88H308" stroke="#444956" stroke-width=".5"/><path d="${path('expected')}" fill="none" stroke="#DFFF69" stroke-width="2.5"/><path d="${path('observed')}" fill="none" stroke="#F0ABCE" stroke-width="2" stroke-dasharray="4 2"/></svg>`
27
+ }
@@ -0,0 +1,50 @@
1
+ import { isIOS, type View } from '@nativescript/core'
2
+
3
+ export const probeProperties = [
4
+ 'x',
5
+ 'y',
6
+ 'scaleX',
7
+ 'scaleY',
8
+ 'rotate',
9
+ 'rotateX',
10
+ 'rotateY',
11
+ 'opacity',
12
+ ] as const
13
+
14
+ export interface ProbeBatch {
15
+ rows: (number | null)[][]
16
+ dropped: number
17
+ samples: number
18
+ sampleCpuMs: number
19
+ drainCpuMs: number
20
+ active: boolean
21
+ }
22
+ export interface NativeProbe {
23
+ drain(): ProbeBatch
24
+ dispose(): void
25
+ }
26
+
27
+ /** Cost measurement uses a finer clock than Android's integer animation time. */
28
+ export function inspectorCostTime(): number {
29
+ if (typeof CACurrentMediaTime === 'function') return CACurrentMediaTime() * 1000
30
+ if (typeof java !== 'undefined') return java.lang.System.nanoTime() / 1e6
31
+ return Date.now()
32
+ }
33
+
34
+ export function startProbe(view: View, capacity: number, hertz: number): NativeProbe {
35
+ const native = view.nativeViewProtected
36
+ if (!native || !view.isLoaded) throw new Error('Select a loaded native view.')
37
+ const probe = isIOS
38
+ ? JoltMotionProbe.startViewCapacityHertz(native, capacity, hertz)
39
+ : org.rafaelaugusto.jolt.MotionProbe.start(native, capacity, hertz)
40
+ return {
41
+ drain: () => JSON.parse(probe.drain()) as ProbeBatch,
42
+ dispose: () => probe.dispose(),
43
+ }
44
+ }
45
+
46
+ export function activeNativeProbes() {
47
+ return isIOS
48
+ ? JoltMotionProbe.activeCount()
49
+ : org.rafaelaugusto.jolt.MotionProbe.activeCount()
50
+ }
@@ -0,0 +1,51 @@
1
+ import { resolveTransition } from '../transition.js'
2
+ import type { SpringParams } from '../spring.js'
3
+
4
+ export type InspectorSpring =
5
+ | { duration: number; bounce: number }
6
+ | { stiffness: number; damping: number; mass: number }
7
+
8
+ /** A fresh plain configuration, usable unchanged after an application restart. */
9
+ export function inspectorSpring(
10
+ value: InspectorSpring,
11
+ ): SpringParams & { type: 'spring' } {
12
+ const fields =
13
+ 'duration' in value
14
+ ? (['duration', 'bounce'] as const)
15
+ : (['stiffness', 'damping', 'mass'] as const)
16
+ for (const key of fields) {
17
+ const n = (value as unknown as Record<string, number>)[key]
18
+ if (!Number.isFinite(n)) throw new RangeError(`Invalid spring ${key}.`)
19
+ }
20
+ const result =
21
+ 'duration' in value
22
+ ? { type: 'spring' as const, duration: value.duration, bounce: value.bounce }
23
+ : {
24
+ type: 'spring' as const,
25
+ stiffness: value.stiffness,
26
+ damping: value.damping,
27
+ mass: value.mass,
28
+ }
29
+ if ('duration' in value) {
30
+ if (value.duration <= 0 || value.bounce <= -1 || value.bounce >= 1)
31
+ throw new RangeError('Use a positive spring duration and bounce between -1 and 1.')
32
+ } else if (value.stiffness <= 0 || value.damping < 0 || value.mass <= 0) {
33
+ throw new RangeError(
34
+ 'Spring stiffness/mass must be positive and damping nonnegative.',
35
+ )
36
+ }
37
+ resolveTransition(result, 'x', 2)
38
+ return result
39
+ }
40
+
41
+ export function springCode(options: {
42
+ target?: string
43
+ to: number
44
+ spring: InspectorSpring
45
+ }) {
46
+ const target = options.target ?? 'card'
47
+ if (!/^[A-Za-z_$][\w$]*$/.test(target) || !Number.isFinite(options.to))
48
+ throw new TypeError('Use a target identifier and a finite translation.')
49
+ const spring = inspectorSpring(options.spring)
50
+ return `import { animate } from '@rafaelaugusto/jolt'\n\nanimate(${target}, { x: [0, ${options.to}] }, ${JSON.stringify({ ...spring, velocity: 0 }, null, 2)})\n`
51
+ }