@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,365 @@
1
+ import { Application, GridLayout, ScrollView, Trace, isAndroid } from '@nativescript/core'
2
+ import {
3
+ createGestureDriver,
4
+ type GestureDriver,
5
+ type GestureSettings,
6
+ } from '../gesture-native.js'
7
+ import {
8
+ motionValue,
9
+ springValue,
10
+ type DerivedValue,
11
+ type SpringValueOptions,
12
+ } from '../motion-value.js'
13
+
14
+ /** A GridLayout that provides native gesture dispatch and nested-scroll consumption. */
15
+ export class GestureSurface extends GridLayout {
16
+ override createNativeView() {
17
+ if (isAndroid) {
18
+ if (typeof org.rafaelaugusto.jolt.GestureSurface !== 'function')
19
+ throw new Error('Rebuild the native app to use GestureSurface.')
20
+ return new org.rafaelaugusto.jolt.GestureSurface(this._context)
21
+ }
22
+ return super.createNativeView()
23
+ }
24
+ }
25
+ export interface GesturePosition {
26
+ x: number
27
+ y: number
28
+ scale: number
29
+ rotate: number
30
+ }
31
+ export interface GestureEvent extends GesturePosition {
32
+ velocityX: number
33
+ velocityY: number
34
+ }
35
+ export interface GestureBounds {
36
+ left?: number
37
+ right?: number
38
+ top?: number
39
+ bottom?: number
40
+ }
41
+ export interface GesturesOptions {
42
+ pan?:
43
+ | boolean
44
+ | {
45
+ axis?: 'x' | 'y' | 'both'
46
+ threshold?: number
47
+ failOffset?: number
48
+ bounds?: GestureBounds
49
+ }
50
+ pinch?: boolean | { min?: number; max?: number }
51
+ rotate?: boolean
52
+ initial?: Partial<GesturePosition>
53
+ spring?: Pick<SpringValueOptions, 'stiffness' | 'damping' | 'mass'>
54
+ /** A descendant, vertical NativeScript ScrollView. Other list plugins are not supported. */
55
+ scrollView?: ScrollView
56
+ /** First contact, before pan recognition; useful when a touch interrupts a spring. */
57
+ onContactStart?: (event: GestureEvent) => void
58
+ /** Last contact released or cancelled, including a touch that never becomes a pan. */
59
+ onContactEnd?: (event: GestureEvent) => void
60
+ onStart?: (event: GestureEvent) => void
61
+ onEnd?: (event: GestureEvent) => void
62
+ onCancel?: (event: GestureEvent) => void
63
+ onTap?: (event: GestureEvent) => void
64
+ onDoubleTap?: (event: GestureEvent) => void
65
+ }
66
+ export interface Gestures {
67
+ readonly x: DerivedValue
68
+ readonly y: DerivedValue
69
+ readonly scale: DerivedValue
70
+ readonly rotate: DerivedValue
71
+ readonly position: GesturePosition
72
+ readonly active: boolean
73
+ readonly paused: boolean
74
+ readonly disposed: boolean
75
+ /** Spring toward a new position, carrying the last contact's velocity. */
76
+ settleTo(position: Partial<GesturePosition>): void
77
+ jumpTo(position: Partial<GesturePosition>): void
78
+ updateBounds(bounds: GestureBounds): void
79
+ cancel(): void
80
+ pause(): void
81
+ play(): void
82
+ dispose(): void
83
+ }
84
+ const owners = new WeakMap<GestureSurface, Gestures>()
85
+ const LIMIT = 1e9
86
+ function bounds(input: GestureBounds = {}) {
87
+ if (!input || typeof input !== 'object')
88
+ throw new TypeError('Gesture bounds must be an object.')
89
+ const result = {
90
+ minX: input.left ?? -LIMIT,
91
+ maxX: input.right ?? LIMIT,
92
+ minY: input.top ?? -LIMIT,
93
+ maxY: input.bottom ?? LIMIT,
94
+ }
95
+ if (
96
+ Object.values(result).some((value) => !Number.isFinite(value)) ||
97
+ result.minX > result.maxX ||
98
+ result.minY > result.maxY
99
+ )
100
+ throw new RangeError('Gesture bounds must be finite and ordered.')
101
+ return result
102
+ }
103
+ function settings(options: GesturesOptions): GestureSettings {
104
+ for (const key of ['pan', 'pinch'] as const)
105
+ if (
106
+ options[key] !== undefined &&
107
+ typeof options[key] !== 'boolean' &&
108
+ (!options[key] || typeof options[key] !== 'object')
109
+ )
110
+ throw new TypeError(`Gesture ${key} must be boolean or an options object.`)
111
+ if (options.rotate !== undefined && typeof options.rotate !== 'boolean')
112
+ throw new TypeError('Gesture rotate must be boolean.')
113
+ for (const key of [
114
+ 'onStart',
115
+ 'onEnd',
116
+ 'onCancel',
117
+ 'onTap',
118
+ 'onDoubleTap',
119
+ 'onContactStart',
120
+ 'onContactEnd',
121
+ ] as const)
122
+ if (options[key] !== undefined && typeof options[key] !== 'function')
123
+ throw new TypeError(`Gesture ${key} must be a function.`)
124
+ const pan = typeof options.pan === 'object' ? options.pan : {}
125
+ const pinch = typeof options.pinch === 'object' ? options.pinch : {}
126
+ const axis = pan.axis ?? 'both'
127
+ if (!['x', 'y', 'both'].includes(axis))
128
+ throw new TypeError('Gesture pan axis must be x, y or both.')
129
+ const result = {
130
+ ...bounds(pan.bounds),
131
+ axis: options.pan ? (axis === 'x' ? 1 : axis === 'y' ? 2 : 3) : 0,
132
+ threshold: pan.threshold ?? 8,
133
+ failOffset: pan.failOffset ?? 12,
134
+ pinch: !!options.pinch,
135
+ rotate: !!options.rotate,
136
+ tap: !!options.onTap,
137
+ doubleTap: !!options.onDoubleTap,
138
+ contactEvents: !!(options.onContactStart || options.onContactEnd),
139
+ minScale: pinch.min ?? 0.25,
140
+ maxScale: pinch.max ?? 4,
141
+ }
142
+ if (
143
+ ![result.threshold, result.failOffset, result.minScale, result.maxScale].every(
144
+ (value) => Number.isFinite(value) && value > 0,
145
+ ) ||
146
+ result.minScale > result.maxScale
147
+ )
148
+ throw new RangeError(
149
+ 'Gesture thresholds and scale limits must be positive and ordered.',
150
+ )
151
+ if (
152
+ options.scrollView &&
153
+ (!(options.scrollView instanceof ScrollView) ||
154
+ options.scrollView.orientation !== 'vertical' ||
155
+ result.axis !== 2)
156
+ )
157
+ throw new TypeError('Scroll handoff needs a vertical ScrollView and a y-axis pan.')
158
+ if (
159
+ options.scrollView &&
160
+ (pan.bounds?.top === undefined || pan.bounds?.bottom === undefined)
161
+ )
162
+ throw new TypeError('Scroll handoff needs explicit top and bottom pan bounds.')
163
+ return result
164
+ }
165
+
166
+ /** Compose native pan/pinch/rotation and exclusive single/double taps on one surface. */
167
+ export function gestures(
168
+ surface: GestureSurface,
169
+ options: GesturesOptions = {},
170
+ ): Gestures {
171
+ if (!(surface instanceof GestureSurface))
172
+ throw new TypeError('gestures() requires a GestureSurface.')
173
+ if (!options || typeof options !== 'object')
174
+ throw new TypeError('Gesture options must be an object.')
175
+ let config = settings(options)
176
+ if (options.scrollView) {
177
+ let ancestor = options.scrollView.parent
178
+ while (ancestor && ancestor !== surface) ancestor = ancestor.parent
179
+ if (ancestor !== surface)
180
+ throw new TypeError('The ScrollView must be inside the GestureSurface.')
181
+ }
182
+ const initial = { x: 0, y: 0, scale: 1, rotate: 0, ...options.initial }
183
+ if (Object.values(initial).some((value) => !Number.isFinite(value)))
184
+ throw new RangeError('Initial gesture values must be finite.')
185
+ if (
186
+ initial.x < config.minX ||
187
+ initial.x > config.maxX ||
188
+ initial.y < config.minY ||
189
+ initial.y > config.maxY ||
190
+ initial.scale < config.minScale ||
191
+ initial.scale > config.maxScale
192
+ )
193
+ throw new RangeError('Initial gesture values must be within their bounds.')
194
+ const keys = ['x', 'y', 'scale', 'rotate'] as const
195
+ const values = keys.map((key) => springValue(motionValue(initial[key]), options.spring))
196
+ let driver: GestureDriver | undefined,
197
+ ended = false,
198
+ held = false,
199
+ suspended = false,
200
+ disposing = false
201
+ const position = (): GesturePosition => ({
202
+ x: values[0]!.get(),
203
+ y: values[1]!.get(),
204
+ scale: values[2]!.get(),
205
+ rotate: values[3]!.get(),
206
+ })
207
+ const callback = (state: number, velocityX: number, velocityY: number) => {
208
+ if (ended) return
209
+ const event = { ...position(), velocityX, velocityY }
210
+ const handler = [
211
+ undefined,
212
+ options.onStart,
213
+ options.onEnd,
214
+ options.onCancel,
215
+ options.onTap,
216
+ options.onDoubleTap,
217
+ options.onContactStart,
218
+ options.onContactEnd,
219
+ ][state]
220
+ try {
221
+ handler?.(event)
222
+ } catch (error) {
223
+ Trace.write(
224
+ `Jolt gesture callback failed: ${String(error)}`,
225
+ Trace.categories.Error,
226
+ Trace.messageType.error,
227
+ )
228
+ }
229
+ }
230
+ const detach = () => {
231
+ const previous = driver
232
+ driver = undefined
233
+ previous?.dispose()
234
+ }
235
+ const refreshEnabled = () =>
236
+ driver?.enabled(
237
+ !held &&
238
+ !suspended &&
239
+ surface.isEnabled !== false &&
240
+ surface.isUserInteractionEnabled !== false,
241
+ )
242
+ const attach = () => {
243
+ if (
244
+ ended ||
245
+ driver ||
246
+ !surface.isLoaded ||
247
+ !surface.nativeViewProtected ||
248
+ (options.scrollView && !options.scrollView.nativeViewProtected)
249
+ )
250
+ return
251
+ try {
252
+ driver = createGestureDriver(surface, options.scrollView, values, config, callback)
253
+ refreshEnabled()
254
+ } catch (error) {
255
+ control.dispose()
256
+ throw error
257
+ }
258
+ }
259
+ const suspend = () => {
260
+ suspended = true
261
+ driver?.enabled(false)
262
+ }
263
+ const resume = () => {
264
+ suspended = false
265
+ refreshEnabled()
266
+ }
267
+ const move = (next: Partial<GesturePosition>, animated: boolean) => {
268
+ if (ended) return
269
+ if (
270
+ !next ||
271
+ typeof next !== 'object' ||
272
+ Object.entries(next).some(
273
+ ([key, value]) =>
274
+ !keys.includes(key as (typeof keys)[number]) || !Number.isFinite(value),
275
+ )
276
+ )
277
+ throw new TypeError(
278
+ 'Gesture positions must contain finite x, y, scale or rotate values.',
279
+ )
280
+ if (!driver)
281
+ throw new Error('Load the GestureSurface before moving its gesture values.')
282
+ const target = { ...position(), ...next }
283
+ driver.settle(
284
+ keys.map((key) => target[key]),
285
+ animated,
286
+ )
287
+ }
288
+ const control: Gestures = {
289
+ x: values[0]!,
290
+ y: values[1]!,
291
+ scale: values[2]!,
292
+ rotate: values[3]!,
293
+ get position() {
294
+ return position()
295
+ },
296
+ get active() {
297
+ return driver?.active ?? false
298
+ },
299
+ get paused() {
300
+ return held
301
+ },
302
+ get disposed() {
303
+ return ended
304
+ },
305
+ settleTo: (next) => move(next, true),
306
+ jumpTo: (next) => move(next, false),
307
+ updateBounds(next) {
308
+ config = {
309
+ ...config,
310
+ ...bounds({
311
+ left: config.minX,
312
+ right: config.maxX,
313
+ top: config.minY,
314
+ bottom: config.maxY,
315
+ ...next,
316
+ }),
317
+ }
318
+ driver?.bounds(config)
319
+ },
320
+ cancel() {
321
+ driver?.cancel()
322
+ },
323
+ pause() {
324
+ held = true
325
+ driver?.enabled(false)
326
+ },
327
+ play() {
328
+ held = false
329
+ refreshEnabled()
330
+ },
331
+ dispose() {
332
+ if (ended || disposing) return
333
+ disposing = true
334
+ detach()
335
+ ended = true
336
+ surface.off('loaded', attach)
337
+ surface.off('unloaded', detach)
338
+ surface.off('isEnabledChange', refreshEnabled)
339
+ surface.off('isUserInteractionEnabledChange', refreshEnabled)
340
+ options.scrollView?.off('loaded', attach)
341
+ options.scrollView?.off('unloaded', detach)
342
+ Application.off(Application.suspendEvent, suspend)
343
+ Application.off(Application.resumeEvent, resume)
344
+ values.forEach((value) => value.dispose())
345
+ if (owners.get(surface) === control) owners.delete(surface)
346
+ },
347
+ }
348
+ owners.get(surface)?.dispose()
349
+ owners.set(surface, control)
350
+ surface.on('loaded', attach)
351
+ surface.on('unloaded', detach)
352
+ surface.on('isEnabledChange', refreshEnabled)
353
+ surface.on('isUserInteractionEnabledChange', refreshEnabled)
354
+ options.scrollView?.on('loaded', attach)
355
+ options.scrollView?.on('unloaded', detach)
356
+ Application.on(Application.suspendEvent, suspend)
357
+ Application.on(Application.resumeEvent, resume)
358
+ try {
359
+ attach()
360
+ } catch (error) {
361
+ control.dispose()
362
+ throw error
363
+ }
364
+ return control
365
+ }
@@ -0,0 +1,218 @@
1
+ import { Color, GridLayout, View, isIOS, type ViewBase } from '@nativescript/core'
2
+ import { parseColor, type ColorValue } from '../color.js'
3
+
4
+ export type GlassBackend = 'liquid-glass' | 'blur' | 'none'
5
+ export type GlassStyle = 'regular' | 'clear'
6
+ export type GlassFallback = 'blur' | 'none'
7
+ export type GlassRadius = number | 'capsule'
8
+
9
+ /** Runtime capability, including the NativeScript metadata built into the app. */
10
+ export function supportsLiquidGlass(): boolean {
11
+ return (
12
+ isIOS &&
13
+ parseInt(UIDevice.currentDevice.systemVersion, 10) >= 26 &&
14
+ typeof UIGlassEffect !== 'undefined' &&
15
+ typeof UIGlassContainerEffect !== 'undefined'
16
+ )
17
+ }
18
+ function bounded(value: number | string, name: string, maximum: number) {
19
+ const number = typeof value === 'string' && value.trim() ? Number(value) : value
20
+ if (
21
+ typeof number !== 'number' ||
22
+ !Number.isFinite(number) ||
23
+ number < 0 ||
24
+ number > maximum
25
+ )
26
+ throw new RangeError(`${name} must be within 0..${maximum}.`)
27
+ return number
28
+ }
29
+
30
+ /** Shared native child routing. UIKit effect content belongs inside contentView. */
31
+ abstract class GlassLayout extends GridLayout {
32
+ private materialUnloaded = false
33
+ protected abstract configureMaterial(): void
34
+ protected get materialView(): UIVisualEffectView | undefined {
35
+ return isIOS && !this.materialUnloaded
36
+ ? (this.nativeViewProtected as UIVisualEffectView | undefined)
37
+ : undefined
38
+ }
39
+ override createNativeView() {
40
+ return isIOS
41
+ ? UIVisualEffectView.alloc().initWithEffect(null)
42
+ : super.createNativeView()
43
+ }
44
+ override initNativeView() {
45
+ super.initNativeView()
46
+ this.configureMaterial()
47
+ }
48
+ override onLoaded() {
49
+ this.materialUnloaded = false
50
+ super.onLoaded()
51
+ this.configureMaterial()
52
+ }
53
+ override onUnloaded() {
54
+ this.materialUnloaded = true
55
+ if (isIOS && this.nativeViewProtected)
56
+ (this.nativeViewProtected as UIVisualEffectView).effect = null
57
+ super.onUnloaded()
58
+ }
59
+ override disposeNativeView() {
60
+ this.materialUnloaded = true
61
+ if (isIOS && this.nativeViewProtected)
62
+ (this.nativeViewProtected as UIVisualEffectView).effect = null
63
+ super.disposeNativeView()
64
+ }
65
+ override _addViewToNativeVisualTree(child: ViewBase, atIndex?: number): boolean {
66
+ if (!isIOS) return super._addViewToNativeVisualTree(child, atIndex)
67
+ View.prototype._addViewToNativeVisualTree.call(this, child, atIndex)
68
+ const parent = (this.nativeViewProtected as UIVisualEffectView | undefined)
69
+ ?.contentView
70
+ const native = child.nativeViewProtected as UIView | undefined
71
+ if (!parent || !native) return false
72
+ const index = Math.max(
73
+ 0,
74
+ Math.min(atIndex ?? parent.subviews.count, parent.subviews.count),
75
+ )
76
+ parent.insertSubviewAtIndex(native, index)
77
+ const shadow = (native as UIView & { outerShadowContainerLayer?: CALayer })
78
+ .outerShadowContainerLayer
79
+ if (shadow && !shadow.superlayer)
80
+ parent.layer.insertSublayerBelow(shadow, native.layer)
81
+ return true
82
+ }
83
+ override _removeViewFromNativeVisualTree(child: ViewBase) {
84
+ if (!isIOS) {
85
+ super._removeViewFromNativeVisualTree(child)
86
+ return
87
+ }
88
+ View.prototype._removeViewFromNativeVisualTree.call(this, child)
89
+ const native = child.nativeViewProtected as
90
+ (UIView & { outerShadowContainerLayer?: CALayer }) | undefined
91
+ native?.outerShadowContainerLayer?.removeFromSuperlayer()
92
+ native?.removeFromSuperview()
93
+ }
94
+ }
95
+
96
+ /** GridLayout whose direct GlassView children share the native iOS 26 glass renderer. */
97
+ export class GlassContainer extends GlassLayout {
98
+ private spacing = 16
99
+ /** Distance in DIPs at which nearby native glass elements begin to blend. */
100
+ get glassSpacing(): number {
101
+ return this.spacing
102
+ }
103
+ set glassSpacing(value: number | string) {
104
+ this.spacing = bounded(value, 'glassSpacing', 200)
105
+ this.configureMaterial()
106
+ }
107
+ get glassBackend(): GlassBackend {
108
+ return supportsLiquidGlass() ? 'liquid-glass' : 'none'
109
+ }
110
+ protected configureMaterial() {
111
+ const view = this.materialView
112
+ if (!view) return
113
+ if (supportsLiquidGlass()) {
114
+ const effect = UIGlassContainerEffect.new()
115
+ effect.spacing = this.spacing
116
+ view.effect = effect
117
+ } else view.effect = null
118
+ }
119
+ }
120
+
121
+ /** A regular NativeScript GridLayout with native glass behind its content. */
122
+ export class GlassView extends GlassLayout {
123
+ private materialStyle: GlassStyle = 'regular'
124
+ private fallback: GlassFallback = 'blur'
125
+ private radius: GlassRadius = 'capsule'
126
+ private tint?: number
127
+ private interactive = false
128
+ get glassStyle() {
129
+ return this.materialStyle
130
+ }
131
+ set glassStyle(value: GlassStyle) {
132
+ if (!['regular', 'clear'].includes(value))
133
+ throw new TypeError('glassStyle must be regular or clear.')
134
+ this.materialStyle = value
135
+ this.configureMaterial()
136
+ }
137
+ get glassFallback() {
138
+ return this.fallback
139
+ }
140
+ set glassFallback(value: GlassFallback) {
141
+ if (!['blur', 'none'].includes(value))
142
+ throw new TypeError('glassFallback must be blur or none.')
143
+ this.fallback = value
144
+ this.configureMaterial()
145
+ }
146
+ get glassRadius(): GlassRadius {
147
+ return this.radius
148
+ }
149
+ set glassRadius(value: GlassRadius | string) {
150
+ this.radius = value === 'capsule' ? value : bounded(value, 'glassRadius', 1000)
151
+ this.configureMaterial()
152
+ }
153
+ get glassTint(): number | undefined {
154
+ return this.tint
155
+ }
156
+ set glassTint(value: ColorValue | undefined | null) {
157
+ this.tint = value == null ? undefined : parseColor(value)
158
+ this.configureMaterial()
159
+ }
160
+ get glassInteractive(): boolean {
161
+ return this.interactive
162
+ }
163
+ set glassInteractive(value: boolean | string) {
164
+ if (![true, false, 'true', 'false'].includes(value))
165
+ throw new TypeError('glassInteractive must be boolean.')
166
+ this.interactive = value === true || value === 'true'
167
+ this.configureMaterial()
168
+ }
169
+ get glassBackend(): GlassBackend {
170
+ return supportsLiquidGlass()
171
+ ? 'liquid-glass'
172
+ : isIOS && this.fallback === 'blur'
173
+ ? 'blur'
174
+ : 'none'
175
+ }
176
+ protected configureMaterial() {
177
+ const view = this.materialView
178
+ if (!view) return
179
+ if (supportsLiquidGlass()) {
180
+ const effect = UIGlassEffect.effectWithStyle(
181
+ this.materialStyle === 'clear' ? 1 /* clear */ : 0 /* regular */,
182
+ )
183
+ effect.interactive = this.interactive
184
+ effect.tintColor = this.tint === undefined ? null : new Color(this.tint).ios
185
+ view.effect = effect
186
+ view.cornerConfiguration =
187
+ this.radius === 'capsule'
188
+ ? UICornerConfiguration.capsuleConfiguration()
189
+ : UICornerConfiguration.configurationWithUniformRadius(
190
+ UICornerRadius.fixedRadius(this.radius),
191
+ )
192
+ } else {
193
+ view.effect =
194
+ this.fallback === 'blur'
195
+ ? UIBlurEffect.effectWithStyle(6 /* system material */)
196
+ : null
197
+ this.updateFallbackCorners()
198
+ }
199
+ }
200
+ private updateFallbackCorners() {
201
+ if (!isIOS || supportsLiquidGlass() || !this.nativeViewProtected) return
202
+ const view = this.nativeViewProtected as UIVisualEffectView
203
+ view.layer.cornerRadius =
204
+ this.radius === 'capsule'
205
+ ? Math.min(view.bounds.size.width, view.bounds.size.height) / 2
206
+ : this.radius
207
+ view.clipsToBounds = true
208
+ }
209
+ override _redrawNativeBackground(value: any) {
210
+ super._redrawNativeBackground(value)
211
+ // Core redraws CSS corners after onLayout; restore the material's own shape.
212
+ this.updateFallbackCorners()
213
+ }
214
+ override onLayout(left: number, top: number, right: number, bottom: number) {
215
+ super.onLayout(left, top, right, bottom)
216
+ this.updateFallbackCorners()
217
+ }
218
+ }