motionary 0.0.0-stage → 6.2.0

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 (374) hide show
  1. package/CHANGELOG.md +803 -0
  2. package/LICENSE +21 -0
  3. package/README.md +218 -2
  4. package/README_ja.md +219 -0
  5. package/README_zh.md +219 -0
  6. package/bin/usa-codemod-5.mjs +79 -0
  7. package/bin/usa-codemod-6.mjs +146 -0
  8. package/dist/chunks/base-BaQV-2ha.cjs +436 -0
  9. package/dist/chunks/base-BaQV-2ha.cjs.map +1 -0
  10. package/dist/chunks/base-C_3cAoRz.js +404 -0
  11. package/dist/chunks/base-C_3cAoRz.js.map +1 -0
  12. package/dist/chunks/bind-B_CTL6Qn.js +22 -0
  13. package/dist/chunks/bind-B_CTL6Qn.js.map +1 -0
  14. package/dist/chunks/bind-Ui43-n2d.cjs +25 -0
  15. package/dist/chunks/bind-Ui43-n2d.cjs.map +1 -0
  16. package/dist/chunks/core-B5T0dhFH.cjs +920 -0
  17. package/dist/chunks/core-B5T0dhFH.cjs.map +1 -0
  18. package/dist/chunks/core-BGAyaY6L.cjs +265 -0
  19. package/dist/chunks/core-BGAyaY6L.cjs.map +1 -0
  20. package/dist/chunks/core-D7cVumUu.js +909 -0
  21. package/dist/chunks/core-D7cVumUu.js.map +1 -0
  22. package/dist/chunks/core-VEBw36QK.js +260 -0
  23. package/dist/chunks/core-VEBw36QK.js.map +1 -0
  24. package/dist/chunks/core-ps8uvYuN.js +181 -0
  25. package/dist/chunks/core-ps8uvYuN.js.map +1 -0
  26. package/dist/chunks/core-zq17EeCI.cjs +185 -0
  27. package/dist/chunks/core-zq17EeCI.cjs.map +1 -0
  28. package/dist/chunks/fx-Bs6IrV4Q.js +109 -0
  29. package/dist/chunks/fx-Bs6IrV4Q.js.map +1 -0
  30. package/dist/chunks/fx-lBGVtQO1.cjs +114 -0
  31. package/dist/chunks/fx-lBGVtQO1.cjs.map +1 -0
  32. package/dist/chunks/generative-D2YyhaeO.js +336 -0
  33. package/dist/chunks/generative-D2YyhaeO.js.map +1 -0
  34. package/dist/chunks/generative-DzIZq-_g.cjs +348 -0
  35. package/dist/chunks/generative-DzIZq-_g.cjs.map +1 -0
  36. package/dist/chunks/gpu-Bu7qwugO.js +380 -0
  37. package/dist/chunks/gpu-Bu7qwugO.js.map +1 -0
  38. package/dist/chunks/gpu-CenK2l6b.cjs +387 -0
  39. package/dist/chunks/gpu-CenK2l6b.cjs.map +1 -0
  40. package/dist/chunks/index-tags-DucKMQr_.js +26 -0
  41. package/dist/chunks/index-tags-DucKMQr_.js.map +1 -0
  42. package/dist/chunks/index-tags-wv0R_vkO.cjs +28 -0
  43. package/dist/chunks/index-tags-wv0R_vkO.cjs.map +1 -0
  44. package/dist/chunks/presets-BYBVJVeP.js +226 -0
  45. package/dist/chunks/presets-BYBVJVeP.js.map +1 -0
  46. package/dist/chunks/presets-CUHys3sK.cjs +233 -0
  47. package/dist/chunks/presets-CUHys3sK.cjs.map +1 -0
  48. package/dist/chunks/registry-CKNLQpwd.js +121 -0
  49. package/dist/chunks/registry-CKNLQpwd.js.map +1 -0
  50. package/dist/chunks/registry-DehBVRDV.cjs +131 -0
  51. package/dist/chunks/registry-DehBVRDV.cjs.map +1 -0
  52. package/dist/chunks/spring-CbvHfVtP.js +219 -0
  53. package/dist/chunks/spring-CbvHfVtP.js.map +1 -0
  54. package/dist/chunks/spring-Dgx187Vh.cjs +232 -0
  55. package/dist/chunks/spring-Dgx187Vh.cjs.map +1 -0
  56. package/dist/chunks/stagger-CCFyhzSw.cjs +86 -0
  57. package/dist/chunks/stagger-CCFyhzSw.cjs.map +1 -0
  58. package/dist/chunks/stagger-DtMKo2SK.js +84 -0
  59. package/dist/chunks/stagger-DtMKo2SK.js.map +1 -0
  60. package/dist/chunks/variants-BhjyddG8.cjs +39 -0
  61. package/dist/chunks/variants-BhjyddG8.cjs.map +1 -0
  62. package/dist/chunks/variants-DRlKVHvu.js +35 -0
  63. package/dist/chunks/variants-DRlKVHvu.js.map +1 -0
  64. package/dist/components/a11y.cjs +276 -0
  65. package/dist/components/a11y.cjs.map +1 -0
  66. package/dist/components/a11y.d.cts +131 -0
  67. package/dist/components/a11y.d.ts +131 -0
  68. package/dist/components/a11y.js +259 -0
  69. package/dist/components/a11y.js.map +1 -0
  70. package/dist/components/angular.cjs +76 -0
  71. package/dist/components/angular.cjs.map +1 -0
  72. package/dist/components/angular.d.cts +1734 -0
  73. package/dist/components/angular.d.ts +1734 -0
  74. package/dist/components/angular.js +70 -0
  75. package/dist/components/angular.js.map +1 -0
  76. package/dist/components/background.cjs +659 -0
  77. package/dist/components/background.cjs.map +1 -0
  78. package/dist/components/background.css +9 -0
  79. package/dist/components/background.d.cts +166 -0
  80. package/dist/components/background.d.ts +166 -0
  81. package/dist/components/background.js +647 -0
  82. package/dist/components/background.js.map +1 -0
  83. package/dist/components/bridge.cjs +154 -0
  84. package/dist/components/bridge.cjs.map +1 -0
  85. package/dist/components/bridge.d.cts +63 -0
  86. package/dist/components/bridge.d.ts +63 -0
  87. package/dist/components/bridge.js +147 -0
  88. package/dist/components/bridge.js.map +1 -0
  89. package/dist/components/cards.cjs +561 -0
  90. package/dist/components/cards.cjs.map +1 -0
  91. package/dist/components/cards.css +6 -0
  92. package/dist/components/cards.d.cts +115 -0
  93. package/dist/components/cards.d.ts +115 -0
  94. package/dist/components/cards.js +554 -0
  95. package/dist/components/cards.js.map +1 -0
  96. package/dist/components/click.cjs +877 -0
  97. package/dist/components/click.cjs.map +1 -0
  98. package/dist/components/click.css +9 -0
  99. package/dist/components/click.d.cts +218 -0
  100. package/dist/components/click.d.ts +218 -0
  101. package/dist/components/click.js +863 -0
  102. package/dist/components/click.js.map +1 -0
  103. package/dist/components/depth.cjs +250 -0
  104. package/dist/components/depth.cjs.map +1 -0
  105. package/dist/components/depth.css +3 -0
  106. package/dist/components/depth.d.cts +86 -0
  107. package/dist/components/depth.d.ts +86 -0
  108. package/dist/components/depth.js +242 -0
  109. package/dist/components/depth.js.map +1 -0
  110. package/dist/components/effects.cjs +2258 -0
  111. package/dist/components/effects.cjs.map +1 -0
  112. package/dist/components/effects.d.cts +545 -0
  113. package/dist/components/effects.d.ts +545 -0
  114. package/dist/components/effects.js +2200 -0
  115. package/dist/components/effects.js.map +1 -0
  116. package/dist/components/feedback.cjs +442 -0
  117. package/dist/components/feedback.cjs.map +1 -0
  118. package/dist/components/feedback.css +7 -0
  119. package/dist/components/feedback.d.cts +144 -0
  120. package/dist/components/feedback.d.ts +144 -0
  121. package/dist/components/feedback.js +433 -0
  122. package/dist/components/feedback.js.map +1 -0
  123. package/dist/components/fx-gpu.cjs +12 -0
  124. package/dist/components/fx-gpu.cjs.map +1 -0
  125. package/dist/components/fx-gpu.d.cts +63 -0
  126. package/dist/components/fx-gpu.d.ts +63 -0
  127. package/dist/components/fx-gpu.js +5 -0
  128. package/dist/components/fx-gpu.js.map +1 -0
  129. package/dist/components/fx.cjs +169 -0
  130. package/dist/components/fx.cjs.map +1 -0
  131. package/dist/components/fx.css +3 -0
  132. package/dist/components/fx.d.cts +114 -0
  133. package/dist/components/fx.d.ts +114 -0
  134. package/dist/components/fx.js +156 -0
  135. package/dist/components/fx.js.map +1 -0
  136. package/dist/components/fx2.cjs +25 -0
  137. package/dist/components/fx2.cjs.map +1 -0
  138. package/dist/components/fx2.d.cts +136 -0
  139. package/dist/components/fx2.d.ts +136 -0
  140. package/dist/components/fx2.js +17 -0
  141. package/dist/components/fx2.js.map +1 -0
  142. package/dist/components/gesture.cjs +209 -0
  143. package/dist/components/gesture.cjs.map +1 -0
  144. package/dist/components/gesture.css +3 -0
  145. package/dist/components/gesture.d.cts +134 -0
  146. package/dist/components/gesture.d.ts +134 -0
  147. package/dist/components/gesture.js +203 -0
  148. package/dist/components/gesture.js.map +1 -0
  149. package/dist/components/interaction.cjs +424 -0
  150. package/dist/components/interaction.cjs.map +1 -0
  151. package/dist/components/interaction.css +8 -0
  152. package/dist/components/interaction.d.cts +115 -0
  153. package/dist/components/interaction.d.ts +115 -0
  154. package/dist/components/interaction.js +416 -0
  155. package/dist/components/interaction.js.map +1 -0
  156. package/dist/components/jsx.cjs +3 -0
  157. package/dist/components/jsx.cjs.map +1 -0
  158. package/dist/components/jsx.d.cts +53 -0
  159. package/dist/components/jsx.d.ts +53 -0
  160. package/dist/components/jsx.js +2 -0
  161. package/dist/components/jsx.js.map +1 -0
  162. package/dist/components/layout.cjs +257 -0
  163. package/dist/components/layout.cjs.map +1 -0
  164. package/dist/components/layout.css +3 -0
  165. package/dist/components/layout.d.cts +99 -0
  166. package/dist/components/layout.d.ts +99 -0
  167. package/dist/components/layout.js +249 -0
  168. package/dist/components/layout.js.map +1 -0
  169. package/dist/components/lazy.cjs +92 -0
  170. package/dist/components/lazy.cjs.map +1 -0
  171. package/dist/components/lazy.d.cts +48 -0
  172. package/dist/components/lazy.d.ts +48 -0
  173. package/dist/components/lazy.js +87 -0
  174. package/dist/components/lazy.js.map +1 -0
  175. package/dist/components/lite.cjs +11095 -0
  176. package/dist/components/lite.cjs.map +1 -0
  177. package/dist/components/lite.d.cts +4 -0
  178. package/dist/components/lite.d.ts +4 -0
  179. package/dist/components/lite.js +10827 -0
  180. package/dist/components/lite.js.map +1 -0
  181. package/dist/components/packs.cjs +192 -0
  182. package/dist/components/packs.cjs.map +1 -0
  183. package/dist/components/packs.css +3 -0
  184. package/dist/components/packs.d.cts +72 -0
  185. package/dist/components/packs.d.ts +72 -0
  186. package/dist/components/packs.js +184 -0
  187. package/dist/components/packs.js.map +1 -0
  188. package/dist/components/page.cjs +824 -0
  189. package/dist/components/page.cjs.map +1 -0
  190. package/dist/components/page.css +11 -0
  191. package/dist/components/page.d.cts +249 -0
  192. package/dist/components/page.d.ts +249 -0
  193. package/dist/components/page.js +799 -0
  194. package/dist/components/page.js.map +1 -0
  195. package/dist/components/perf.cjs +120 -0
  196. package/dist/components/perf.cjs.map +1 -0
  197. package/dist/components/perf.d.cts +98 -0
  198. package/dist/components/perf.d.ts +98 -0
  199. package/dist/components/perf.js +110 -0
  200. package/dist/components/perf.js.map +1 -0
  201. package/dist/components/physics.cjs +448 -0
  202. package/dist/components/physics.cjs.map +1 -0
  203. package/dist/components/physics.css +5 -0
  204. package/dist/components/physics.d.cts +189 -0
  205. package/dist/components/physics.d.ts +189 -0
  206. package/dist/components/physics.js +430 -0
  207. package/dist/components/physics.js.map +1 -0
  208. package/dist/components/react.cjs +96 -0
  209. package/dist/components/react.cjs.map +1 -0
  210. package/dist/components/react.d.cts +18 -0
  211. package/dist/components/react.d.ts +18 -0
  212. package/dist/components/react.js +91 -0
  213. package/dist/components/react.js.map +1 -0
  214. package/dist/components/reveal.cjs +362 -0
  215. package/dist/components/reveal.cjs.map +1 -0
  216. package/dist/components/reveal.css +5 -0
  217. package/dist/components/reveal.d.cts +105 -0
  218. package/dist/components/reveal.d.ts +105 -0
  219. package/dist/components/reveal.js +353 -0
  220. package/dist/components/reveal.js.map +1 -0
  221. package/dist/components/solid.cjs +86 -0
  222. package/dist/components/solid.cjs.map +1 -0
  223. package/dist/components/solid.d.cts +1751 -0
  224. package/dist/components/solid.d.ts +1751 -0
  225. package/dist/components/solid.js +82 -0
  226. package/dist/components/solid.js.map +1 -0
  227. package/dist/components/svelte.cjs +68 -0
  228. package/dist/components/svelte.cjs.map +1 -0
  229. package/dist/components/svelte.d.cts +1733 -0
  230. package/dist/components/svelte.d.ts +1733 -0
  231. package/dist/components/svelte.js +64 -0
  232. package/dist/components/svelte.js.map +1 -0
  233. package/dist/components/svg.cjs +359 -0
  234. package/dist/components/svg.cjs.map +1 -0
  235. package/dist/components/svg.css +3 -0
  236. package/dist/components/svg.d.cts +113 -0
  237. package/dist/components/svg.d.ts +113 -0
  238. package/dist/components/svg.js +347 -0
  239. package/dist/components/svg.js.map +1 -0
  240. package/dist/components/text.cjs +968 -0
  241. package/dist/components/text.cjs.map +1 -0
  242. package/dist/components/text.css +8 -0
  243. package/dist/components/text.d.cts +342 -0
  244. package/dist/components/text.d.ts +342 -0
  245. package/dist/components/text.js +947 -0
  246. package/dist/components/text.js.map +1 -0
  247. package/dist/components/timeline.cjs +109 -0
  248. package/dist/components/timeline.cjs.map +1 -0
  249. package/dist/components/timeline.css +3 -0
  250. package/dist/components/timeline.d.cts +155 -0
  251. package/dist/components/timeline.d.ts +155 -0
  252. package/dist/components/timeline.js +103 -0
  253. package/dist/components/timeline.js.map +1 -0
  254. package/dist/components/tokens.cjs +226 -0
  255. package/dist/components/tokens.cjs.map +1 -0
  256. package/dist/components/tokens.d.cts +74 -0
  257. package/dist/components/tokens.d.ts +74 -0
  258. package/dist/components/tokens.js +211 -0
  259. package/dist/components/tokens.js.map +1 -0
  260. package/dist/components/transitions.cjs +430 -0
  261. package/dist/components/transitions.cjs.map +1 -0
  262. package/dist/components/transitions.css +5 -0
  263. package/dist/components/transitions.d.cts +126 -0
  264. package/dist/components/transitions.d.ts +126 -0
  265. package/dist/components/transitions.js +423 -0
  266. package/dist/components/transitions.js.map +1 -0
  267. package/dist/components/ui.cjs +1050 -0
  268. package/dist/components/ui.cjs.map +1 -0
  269. package/dist/components/ui.css +14 -0
  270. package/dist/components/ui.d.cts +224 -0
  271. package/dist/components/ui.d.ts +224 -0
  272. package/dist/components/ui.js +1034 -0
  273. package/dist/components/ui.js.map +1 -0
  274. package/dist/components/vue.cjs +67 -0
  275. package/dist/components/vue.cjs.map +1 -0
  276. package/dist/components/vue.d.cts +1722 -0
  277. package/dist/components/vue.d.ts +1722 -0
  278. package/dist/components/vue.js +64 -0
  279. package/dist/components/vue.js.map +1 -0
  280. package/dist/components/webgl.cjs +459 -0
  281. package/dist/components/webgl.cjs.map +1 -0
  282. package/dist/components/webgl.css +3 -0
  283. package/dist/components/webgl.d.cts +133 -0
  284. package/dist/components/webgl.d.ts +133 -0
  285. package/dist/components/webgl.js +442 -0
  286. package/dist/components/webgl.js.map +1 -0
  287. package/dist/components/widgets.cjs +591 -0
  288. package/dist/components/widgets.cjs.map +1 -0
  289. package/dist/components/widgets.d.cts +110 -0
  290. package/dist/components/widgets.d.ts +110 -0
  291. package/dist/components/widgets.js +581 -0
  292. package/dist/components/widgets.js.map +1 -0
  293. package/dist/components.cjs +351 -0
  294. package/dist/components.cjs.map +1 -0
  295. package/dist/components.css +75 -0
  296. package/dist/components.d.cts +2997 -0
  297. package/dist/components.d.ts +2997 -0
  298. package/dist/components.js +106 -0
  299. package/dist/components.js.map +1 -0
  300. package/dist/components.umd.js +23 -0
  301. package/dist/components.umd.js.map +1 -0
  302. package/dist/element.cjs +97 -0
  303. package/dist/element.cjs.map +1 -0
  304. package/dist/element.d.cts +215 -0
  305. package/dist/element.d.ts +215 -0
  306. package/dist/element.js +95 -0
  307. package/dist/element.js.map +1 -0
  308. package/dist/element.umd.js +2 -0
  309. package/dist/element.umd.js.map +1 -0
  310. package/dist/index.cjs +149 -0
  311. package/dist/index.cjs.map +1 -0
  312. package/dist/index.d.cts +425 -0
  313. package/dist/index.d.ts +425 -0
  314. package/dist/index.js +131 -0
  315. package/dist/index.js.map +1 -0
  316. package/dist/index.umd.js +15 -0
  317. package/dist/index.umd.js.map +1 -0
  318. package/dist/presets/extended.cjs +243 -0
  319. package/dist/presets/extended.cjs.map +1 -0
  320. package/dist/presets/extended.d.cts +37 -0
  321. package/dist/presets/extended.d.ts +37 -0
  322. package/dist/presets/extended.js +239 -0
  323. package/dist/presets/extended.js.map +1 -0
  324. package/dist/presets-extended.umd.js +2 -0
  325. package/dist/presets-extended.umd.js.map +1 -0
  326. package/dist/react.cjs +68 -0
  327. package/dist/react.cjs.map +1 -0
  328. package/dist/react.d.cts +158 -0
  329. package/dist/react.d.ts +158 -0
  330. package/dist/react.js +65 -0
  331. package/dist/react.js.map +1 -0
  332. package/dist/solid.cjs +93 -0
  333. package/dist/solid.cjs.map +1 -0
  334. package/dist/solid.d.cts +249 -0
  335. package/dist/solid.d.ts +249 -0
  336. package/dist/solid.js +89 -0
  337. package/dist/solid.js.map +1 -0
  338. package/dist/svelte.cjs +66 -0
  339. package/dist/svelte.cjs.map +1 -0
  340. package/dist/svelte.d.cts +243 -0
  341. package/dist/svelte.d.ts +243 -0
  342. package/dist/svelte.js +63 -0
  343. package/dist/svelte.js.map +1 -0
  344. package/dist/vue.cjs +62 -0
  345. package/dist/vue.cjs.map +1 -0
  346. package/dist/vue.d.cts +158 -0
  347. package/dist/vue.d.ts +158 -0
  348. package/dist/vue.js +60 -0
  349. package/dist/vue.js.map +1 -0
  350. package/dist/widgets.umd.js +2 -0
  351. package/dist/widgets.umd.js.map +1 -0
  352. package/docs/API.md +147 -0
  353. package/docs/ROADMAP.md +14 -0
  354. package/docs/accessibility.md +60 -0
  355. package/docs/components.md +564 -0
  356. package/docs/deprecations.md +30 -0
  357. package/docs/frameworks-ssr.md +100 -0
  358. package/docs/hybrid-apps.md +145 -0
  359. package/docs/images/showcase-detail.png +0 -0
  360. package/docs/images/showcase-grid.png +0 -0
  361. package/docs/images/showcase-mobile.png +0 -0
  362. package/docs/migration-from-aos.md +67 -0
  363. package/docs/migration-from-gsap-scrolltrigger.md +80 -0
  364. package/docs/motion-tokens.css +31 -0
  365. package/docs/motion-tokens.md +46 -0
  366. package/docs/motion.tokens.json +132 -0
  367. package/docs/performance.md +24 -0
  368. package/docs/presets.md +310 -0
  369. package/docs/upgrading-3.md +21 -0
  370. package/docs/upgrading-4.md +65 -0
  371. package/docs/upgrading-5.md +31 -0
  372. package/docs/upgrading-6.md +32 -0
  373. package/docs/windows-apps.md +119 -0
  374. package/package.json +562 -4
@@ -0,0 +1,425 @@
1
+ /**
2
+ * motionary - Core Type Definitions
3
+ * A lightweight, high-performance scroll animation library
4
+ */
5
+ /** The 33 core presets (always available in `PRESETS`). */
6
+ type CorePreset = 'fade-in' | 'fade-in-up' | 'fade-in-down' | 'fade-in-left' | 'fade-in-right' | 'zoom-in' | 'zoom-out' | 'flip-x' | 'flip-y' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'bounce' | 'rotate-in' | 'blur-in' | 'skew-in' | 'scale-x' | 'scale-y' | 'shimmer' | 'pulse' | 'swing' | 'scale-up' | 'blur-in-up' | 'flip-up' | 'flip-down' | 'rotate-left' | 'rotate-right' | 'clip-up' | 'clip-down' | 'clip-left' | 'clip-right' | 'clip-circle';
7
+ /**
8
+ * Every built-in preset name: the core set plus the 6.1 extended set, which is
9
+ * available once `motionary/presets/extended` is loaded (or after
10
+ * `registerPresets(EXTENDED_PRESETS)`).
11
+ */
12
+ type AnimationPreset = CorePreset | ExtendedPreset;
13
+ /**
14
+ * How `onProgress` / `progressVar` progress is measured.
15
+ * - `'ratio'` (default): the element's visible ratio (IntersectionObserver `intersectionRatio`).
16
+ * - `'scroll'`: true scroll progress, 0 when the element's top touches the bottom of the
17
+ * viewport and 1 when its bottom leaves the top. Works for elements taller than the screen.
18
+ */
19
+ type ProgressMode = 'ratio' | 'scroll';
20
+ /**
21
+ * Which engine runs the entrance animation.
22
+ * - `'js'`: IntersectionObserver triggers a time-based Web Animation.
23
+ * - `'css'`: the preset runs on the browser's native scroll-driven timeline
24
+ * (`animation-timeline: view()`), so its progress follows the scroll position
25
+ * off the main thread. Falls back to `'js'` where unsupported.
26
+ * - `'auto'` (default since 2.0): native when supported, JS otherwise — and JS
27
+ * whenever the element sets `duration`, `delay`, `offset` or `stagger` itself,
28
+ * since those only mean something for a time-based animation.
29
+ */
30
+ type ScrollEngine = 'auto' | 'js' | 'css';
31
+ /** The 6.1 extended presets (`motionary/presets/extended`). */
32
+ type ExtendedPreset = 'fade-in-up-sm' | 'fade-in-down-sm' | 'fade-in-left-sm' | 'fade-in-right-sm' | 'fade-in-up-lg' | 'fade-in-down-lg' | 'fade-in-left-lg' | 'fade-in-right-lg' | 'fade-in-up-left' | 'fade-in-up-right' | 'fade-in-down-left' | 'fade-in-down-right' | 'fade-in-scale' | 'fade-in-half' | 'zoom-in-up' | 'zoom-in-down' | 'zoom-in-left' | 'zoom-in-right' | 'zoom-out-up' | 'zoom-out-down' | 'zoom-out-left' | 'zoom-out-right' | 'zoom-in-big' | 'zoom-out-big' | 'zoom-bounce' | 'zoom-in-rotate' | 'scale-x-left' | 'scale-x-right' | 'scale-y-top' | 'scale-y-bottom' | 'stretch-x' | 'stretch-y' | 'flip-x-reverse' | 'flip-y-reverse' | 'flip-y-full' | 'flip-diagonal' | 'flip-diagonal-reverse' | 'flip-left' | 'flip-right' | 'unfold-down' | 'unfold-up' | 'door-open-left' | 'door-open-right' | 'fold-in' | 'flip-x-bounce' | 'flip-y-bounce' | 'swing-in-top' | 'swing-in-bottom' | 'swing-in-left' | 'swing-in-right' | 'slide-up-spring' | 'slide-down-spring' | 'slide-left-spring' | 'slide-right-spring' | 'slide-up-sm' | 'slide-down-sm' | 'back-in-up' | 'back-in-down' | 'back-in-left' | 'back-in-right' | 'light-speed-in-left' | 'light-speed-in-right' | 'rise-in' | 'sink-in' | 'float-in-up' | 'float-in-down' | 'roll-in-left' | 'roll-in-right' | 'spiral-in' | 'spiral-in-reverse' | 'spin-in' | 'rotate-in-up-left' | 'rotate-in-up-right' | 'rotate-in-down-left' | 'rotate-in-down-right' | 'skew-in-left' | 'skew-in-y' | 'shear-in' | 'shear-in-reverse' | 'twist-in' | 'tilt-in-left' | 'tilt-in-right' | 'blur-in-down' | 'blur-in-left' | 'blur-in-right' | 'blur-in-strong' | 'blur-in-zoom' | 'blur-in-scale' | 'blur-in-x' | 'mask-up' | 'mask-down' | 'mask-left' | 'mask-right' | 'blur-mask-up' | 'clip-circle-top' | 'clip-circle-bottom' | 'clip-circle-left' | 'clip-circle-right' | 'clip-circle-corner' | 'clip-ellipse' | 'clip-diamond' | 'clip-split-x' | 'clip-split-y' | 'clip-box' | 'clip-pill' | 'clip-blinds' | 'clip-blinds-x' | 'clip-diagonal' | 'clip-diagonal-reverse' | 'clip-slant-right' | 'clip-slant-left' | 'bounce-in' | 'bounce-in-up' | 'bounce-in-down' | 'bounce-in-left' | 'bounce-in-right' | 'elastic-in' | 'elastic-in-x' | 'rubber-in' | 'jello-in' | 'wobble-in' | 'tada-in' | 'heartbeat-in' | 'drop-in' | 'pop-in' | 'squash-in' | 'shake-in' | 'swing-in' | 'brightness-in' | 'darken-in' | 'color-in' | 'saturate-in' | 'hue-in' | 'sepia-in' | 'invert-in' | 'contrast-in' | 'exposure-in' | 'vintage-in' | 'blur-bright-in' | 'shadow-lift' | 'neon-glow-in' | 'glow-in' | 'perspective-in-up' | 'perspective-in-down' | 'perspective-in-left' | 'perspective-in-right' | 'depth-push' | 'depth-pull' | 'depth-in-up' | 'swoop-in-left' | 'swoop-in-right' | 'card-tilt-in' | 'glitch-in' | 'glitch-in-color' | 'typewriter' | 'typewriter-lines' | 'hinge-in' | 'flicker-in' | 'scan-in' | 'materialize' | 'teleport-in' | 'stagger-fade-up' | 'stagger-pop' | 'stagger-rise' | 'stagger-slide' | 'stagger-flip' | 'stagger-blur' | 'stagger-zoom' | 'stagger-drop' | 'scrub-parallax-up' | 'scrub-parallax-down' | 'scrub-rotate' | 'scrub-spin' | 'scrub-scale' | 'scrub-shrink' | 'scrub-pan-left' | 'scrub-pan-right' | 'scrub-tilt' | 'scrub-fade-through' | 'scrub-blur-through' | 'scrub-reveal-x';
33
+ /** Easing function types */
34
+ type EasingType = 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring' | 'soft-spring' | 'heavy-bounce' | [number, number, number, number] | ((t: number) => number) | string;
35
+ /** Keyframe definition for custom animations */
36
+ interface AnimationKeyframe {
37
+ [property: string]: string | number;
38
+ }
39
+ /** One intermediate keyframe of a preset: `offset` is 0 < offset < 1. */
40
+ interface AnimationFrame extends AnimationKeyframe {
41
+ offset: number;
42
+ }
43
+ /** Custom animation definition */
44
+ interface CustomAnimation {
45
+ from: AnimationKeyframe;
46
+ to: AnimationKeyframe;
47
+ /** Optional intermediate keyframes (overshoot, bounce, …), played between `from` and `to`. */
48
+ frames?: AnimationFrame[];
49
+ }
50
+ /** The keyframes of a preset (`PRESETS[name]`). */
51
+ type PresetKeyframes = CustomAnimation;
52
+ /** Per-element animation options */
53
+ interface AnimateOptions {
54
+ /** Animation preset name, array of presets, or custom animation object */
55
+ animation?: AnimationPreset | AnimationPreset[] | CustomAnimation;
56
+ /** Duration in milliseconds (default: 600) */
57
+ duration?: number;
58
+ /** Delay in milliseconds (default: 0) */
59
+ delay?: number;
60
+ /** Easing function (default: 'ease') */
61
+ easing?: EasingType;
62
+ /** Intersection threshold 0-1 (default: 0.1) */
63
+ threshold?: number | number[];
64
+ /** Root margin for IntersectionObserver (default: '0px') */
65
+ rootMargin?: string;
66
+ /** Whether to replay animation each time element enters viewport (default: false) */
67
+ repeat?: boolean;
68
+ /** Whether to trigger animation only once (default: true if repeat is false) */
69
+ once?: boolean;
70
+ /** Offset in pixels from the viewport edge to trigger animation (default: 0) */
71
+ offset?: number;
72
+ /** Stagger delay for child elements in ms (default: 0) */
73
+ stagger?: number;
74
+ /** Callback fired when animation starts */
75
+ onStart?: (element: Element) => void;
76
+ /** Callback fired when animation completes */
77
+ onComplete?: (element: Element) => void;
78
+ /** Callback fired when element enters viewport */
79
+ onEnter?: (element: Element) => void;
80
+ /** Callback fired when element leaves viewport */
81
+ onLeave?: (element: Element) => void;
82
+ /** Callback fired with scroll progress (0 to 1) */
83
+ onProgress?: (element: Element, progress: number) => void;
84
+ /** How progress for `onProgress`/`progressVar` is measured (default: 'ratio') */
85
+ progressMode?: ProgressMode;
86
+ /**
87
+ * Name of a CSS custom property (e.g. `'--sa-progress'`) that receives the
88
+ * element's progress (0 to 1, same value as `onProgress`) as an inline
89
+ * style, for scroll-driven effects written in plain CSS. Off by default.
90
+ */
91
+ progressVar?: string;
92
+ /**
93
+ * Animation engine (default: `'auto'`, see `ScrollEngine`). With the native
94
+ * engine the animation is linked to scroll position: `duration`, `delay`,
95
+ * `threshold`, `offset` and `stagger` do not apply; `viewRange` does.
96
+ */
97
+ engine?: ScrollEngine;
98
+ /**
99
+ * Native engine only: the view-timeline range the entrance animation spans,
100
+ * as `[rangeStart, rangeEnd]` (default: `['entry 0%', 'entry 100%']`).
101
+ */
102
+ viewRange?: [string, string];
103
+ /**
104
+ * Animate out when the element leaves the viewport, and back in when it
105
+ * re-enters (implies `repeat: true` unless `repeat` is set).
106
+ * - `true`: play the entrance animation in reverse.
107
+ * - a preset / presets / `{ from, to }`: play that animation in reverse
108
+ * (e.g. `exit: 'fade-in-down'` leaves upwards).
109
+ * Skipped under reduced motion. (default: `false`)
110
+ */
111
+ exit?: boolean | AnimationPreset | AnimationPreset[] | CustomAnimation;
112
+ }
113
+ /** Global configuration for ScrollAnimate instance */
114
+ interface ScrollAnimateConfig {
115
+ /** Default animation preset (default: 'fade-in-up') */
116
+ defaultAnimation?: AnimationPreset | AnimationPreset[] | CustomAnimation;
117
+ /** Default duration in ms (default: 600) */
118
+ defaultDuration?: number;
119
+ /** Default delay in ms (default: 0) */
120
+ defaultDelay?: number;
121
+ /** Default easing (default: 'ease') */
122
+ defaultEasing?: EasingType;
123
+ /** Default threshold (default: 0.1) */
124
+ defaultThreshold?: number | number[];
125
+ /** Default root margin (default: '0px') */
126
+ defaultRootMargin?: string;
127
+ /** Whether animations replay by default (default: false) */
128
+ defaultRepeat?: boolean;
129
+ /** Default once setting (default: true) */
130
+ defaultOnce?: boolean;
131
+ /** Default offset in pixels (default: 0) */
132
+ defaultOffset?: number;
133
+ /** CSS class added before animation (default: 'sa-hidden') */
134
+ hiddenClass?: string;
135
+ /** CSS class added when element is visible (default: 'sa-visible') */
136
+ visibleClass?: string;
137
+ /** Whether to use CSS class-based animation instead of Web Animations API */
138
+ useClassNames?: boolean;
139
+ /** Disable all animations (useful for reduced-motion preference) */
140
+ disabled?: boolean;
141
+ /** Custom IntersectionObserver root element */
142
+ root?: Element | null;
143
+ /**
144
+ * Drop `once` elements from the registry as soon as their entrance animation
145
+ * has been triggered (unless they still need onProgress/progressVar), so they can
146
+ * be garbage-collected. They are remembered in a WeakSet, so `init()`/`observe()`
147
+ * never re-hide or replay them. (default: true)
148
+ */
149
+ autoUnregister?: boolean;
150
+ /** Default animation engine (default: `'auto'`; `'js'` restores the 1.x behaviour) */
151
+ defaultEngine?: ScrollEngine;
152
+ }
153
+ /** Registered element entry */
154
+ interface AnimatedElement {
155
+ element: Element;
156
+ options: Required<AnimateOptions>;
157
+ observer: IntersectionObserver;
158
+ animated: boolean;
159
+ progressObserver?: IntersectionObserver;
160
+ /** Engine actually used for this element (`'css'` = native scroll-driven timeline) */
161
+ engine?: 'js' | 'css';
162
+ }
163
+ /** ScrollAnimate public API */
164
+ interface ScrollAnimateInstance {
165
+ /** Observe a single element or CSS selector */
166
+ observe(target: string | Element | NodeList | Element[], options?: AnimateOptions): void;
167
+ /** Stop observing a single element or CSS selector */
168
+ unobserve(target: string | Element | NodeList | Element[]): void;
169
+ /** Observe all elements matching the data-sa attribute */
170
+ init(rootElement?: Element | Document): void;
171
+ /**
172
+ * Like `init()`, then keep watching `rootElement` (default: `document`) with a
173
+ * MutationObserver: `[data-sa]` elements added later (or that gain the
174
+ * attribute) are observed automatically, and removed ones are released.
175
+ * Returns a function that stops watching. `destroy()` stops every watcher.
176
+ * SSR-safe: a no-op without a DOM / MutationObserver.
177
+ */
178
+ watch(rootElement?: Element | Document): () => void;
179
+ /** Destroy the instance and clean up all observers */
180
+ destroy(): void;
181
+ /** Refresh all observers (useful after DOM changes) */
182
+ refresh(): void;
183
+ /** Manually trigger animation on an element */
184
+ animate(target: string | Element, options?: AnimateOptions): void;
185
+ /** Get all currently observed elements */
186
+ getObservedElements(): AnimatedElement[];
187
+ /** Update global configuration */
188
+ configure(config: Partial<ScrollAnimateConfig>): void;
189
+ }
190
+
191
+ /**
192
+ * motionary - Core Implementation
193
+ * Uses IntersectionObserver + Web Animations API for zero-dependency,
194
+ * high-performance scroll-triggered animations.
195
+ */
196
+
197
+ /**
198
+ * Whether the browser can run presets on a native scroll-driven timeline:
199
+ * `CSS.supports('animation-timeline: view()')` plus the `ViewTimeline`
200
+ * constructor used to attach it from JavaScript. Cached. SSR-safe.
201
+ */
202
+ declare function supportsScrollTimeline(): boolean;
203
+ /**
204
+ * True scroll progress of `el` through the viewport (or `root`): 0 when its top
205
+ * edge reaches the bottom of the viewport, 1 when its bottom edge passes the top.
206
+ * Works for elements taller than the viewport. Returns 0 without a DOM.
207
+ */
208
+ declare function getScrollProgress(el: Element, root?: Element | null): number;
209
+ declare function createScrollAnimate(userConfig?: ScrollAnimateConfig): ScrollAnimateInstance;
210
+
211
+ /**
212
+ * motionary - Staggered children
213
+ * Reveal a container's children one after another when the container scrolls
214
+ * into view, optionally also animating children that are added later.
215
+ */
216
+
217
+ interface StaggerOptions extends AnimateOptions {
218
+ /** Delay between consecutive children in ms (default: 80) */
219
+ stagger?: number;
220
+ /**
221
+ * Watch the container with a MutationObserver and animate children added
222
+ * later (e.g. infinite lists). Children added after the container was
223
+ * revealed animate when they scroll into view, staggered per batch.
224
+ * (default: false)
225
+ */
226
+ observeChildren?: boolean;
227
+ }
228
+ /**
229
+ * Animate the children of `container` with a stagger once it enters the
230
+ * viewport. Returns a cleanup function. SSR-safe (no-op without a DOM).
231
+ *
232
+ * @example
233
+ * const stop = staggerChildren(document.querySelector('ul'), { stagger: 60, observeChildren: true });
234
+ */
235
+ declare function staggerChildren(container: Element | null | undefined, options?: StaggerOptions, instance?: ScrollAnimateInstance): () => void;
236
+
237
+ /**
238
+ * Where a step starts on a timeline:
239
+ * - a number: absolute time in ms
240
+ * - `'>'` (default): when the previous step ends · `'<'`: when it starts
241
+ * - `'+=200'` / `'-=200'`: after / overlapping the previous end
242
+ * - `'<+=100'`: 100ms after the previous step's start
243
+ * - `'intro'` / `'intro+=150'`: at (or relative to) a label
244
+ */
245
+ type TimelinePosition = number | string;
246
+ interface TimelineStepOptions {
247
+ /** Duration in ms or a motion token name (`'fast'`, `'slow'`…; 4.2). Default: timeline default, 600. */
248
+ duration?: number | string;
249
+ /** CSS easing or a motion token name (`'emphasized'`, `'spring'`…; 4.2). Default `cubic-bezier(0.22, 1, 0.36, 1)`. */
250
+ easing?: string;
251
+ /** Start position, see `TimelinePosition`. */
252
+ at?: TimelinePosition;
253
+ /** ms between targets when the selector matches several elements. */
254
+ stagger?: number;
255
+ }
256
+ interface TimelineOptions {
257
+ /** Defaults for every step. */
258
+ defaults?: Pick<TimelineStepOptions, 'duration' | 'easing' | 'stagger'>;
259
+ /** Playback rate (1 = normal). */
260
+ speed?: number;
261
+ /** Called after `play()` reaches the end (or the start when reversed). */
262
+ onComplete?: () => void;
263
+ /** Called on every frame with progress 0–1. */
264
+ onUpdate?: (progress: number) => void;
265
+ }
266
+ interface ScrubOptions {
267
+ /** Scroll offset (px) before the source's top reaches the viewport bottom where progress starts (JS engine only). */
268
+ offset?: number;
269
+ /** Smoothing 0–1 (0 = immediate, default 0). Smoothing needs the JS engine. */
270
+ smooth?: number;
271
+ /**
272
+ * 4.1: which progress source drives the timeline.
273
+ * - `'view'` (default): `source` moving through the viewport (CSS `ViewTimeline`, range `cover`).
274
+ * - `'scroll'`: the scroll position of `source` itself (a scroll container; CSS `ScrollTimeline`).
275
+ */
276
+ source?: 'view' | 'scroll';
277
+ /** 4.1: `'auto'` (default) uses the browser's native scroll-driven animations when available, `'js'` forces the fallback. */
278
+ engine?: 'auto' | 'native' | 'js';
279
+ /** 4.1: scroll axis, `'block'` (default) · `'inline'` · `'x'` · `'y'`. */
280
+ axis?: 'block' | 'inline' | 'x' | 'y';
281
+ }
282
+ /** The function `scrub()` returns: call it to stop. `native` tells which engine runs it. */
283
+ interface ScrubHandle {
284
+ (): void;
285
+ /** `true` when the browser's ScrollTimeline / ViewTimeline drives it (compositor, no JS per frame). */
286
+ readonly native: boolean;
287
+ }
288
+ /** 4.1: whether `scrub()` can use native ScrollTimeline / ViewTimeline here. */
289
+ declare function supportsNativeScrub(source?: 'view' | 'scroll'): boolean;
290
+ interface Timeline {
291
+ /** Total length in ms. */
292
+ readonly duration: number;
293
+ /** Label positions in ms. */
294
+ readonly labels: Readonly<Record<string, number>>;
295
+ /** Current playhead in ms. */
296
+ readonly time: number;
297
+ /** Add a step: animate `target` with keyframes or a preset name (`fade-up`, `scale`…). */
298
+ to(target: string | Element | Element[] | NodeList, frames: Keyframe[] | string, options?: TimelineStepOptions): Timeline;
299
+ /** Name a position (default: the current end). */
300
+ label(name: string, at?: TimelinePosition): Timeline;
301
+ /** Run `fn` when the playhead passes `at`. */
302
+ call(fn: () => void, at?: TimelinePosition): Timeline;
303
+ /** Play forwards from the playhead (from 0 when at the end). Resolves at the end. */
304
+ play(from?: TimelinePosition): Promise<void>;
305
+ /** Play backwards to 0. */
306
+ reverse(): Promise<void>;
307
+ pause(): Timeline;
308
+ /** Jump to a time (ms) or label. */
309
+ seek(to: TimelinePosition): Timeline;
310
+ /** Get or set progress 0–1. */
311
+ progress(p?: number): number;
312
+ /**
313
+ * Tie progress to scroll: `source` moving through the viewport (or, with
314
+ * `{ source: 'scroll' }`, a scroll container's own position). Runs on native
315
+ * ScrollTimeline / ViewTimeline when available (and no `smooth`, `offset`,
316
+ * `call()` cues or `onUpdate` need JS), else on a rAF-throttled listener.
317
+ * Returns a stop function with a `native` flag.
318
+ */
319
+ scrub(source: Element, options?: ScrubOptions): ScrubHandle;
320
+ /** Stop and drop every animation (elements keep their last frame). */
321
+ cancel(): void;
322
+ }
323
+ /** Keyframe presets usable by name in `to()` and `data-tl`. */
324
+ declare const TIMELINE_PRESETS: Record<string, Keyframe[]>;
325
+ /** Resolve a position against the previous step and labels (pure). */
326
+ declare function resolvePosition(pos: TimelinePosition | undefined, end: number, prevStart: number, labels?: Record<string, number>): number;
327
+ /**
328
+ * Choreograph animations on one clock: chain, overlap, label, seek, reverse and
329
+ * scrub them with scroll. Built on WAAPI (paused animations driven by one
330
+ * playhead); without WAAPI or under reduced motion it jumps to the end state.
331
+ *
332
+ * @example
333
+ * const tl = timeline({ defaults: { duration: 500 } })
334
+ * .to('.title', 'fade-up')
335
+ * .label('cards')
336
+ * .to('.card', 'scale', { stagger: 80, at: '-=200' })
337
+ * .to('.cta', [{ opacity: 0 }, { opacity: 1 }], { at: 'cards+=400' });
338
+ * tl.play(); // or tl.scrub(document.querySelector('.hero'))
339
+ */
340
+ declare function timeline(options?: TimelineOptions): Timeline;
341
+
342
+ /**
343
+ * motionary - parallax() helper
344
+ *
345
+ * Moves elements at a different speed than the page while they cross the
346
+ * viewport. Built on the same scroll progress as `progressVar` (0 when the
347
+ * element's top enters at the bottom, 1 when its bottom leaves at the top):
348
+ * the progress is written to a CSS custom property (default `--sa-parallax`)
349
+ * and the offset is applied with the individual `translate` property, so it
350
+ * composes with entrance animations and other `transform`s.
351
+ */
352
+ interface ParallaxHelperOptions {
353
+ /**
354
+ * Total distance the element shifts while it crosses the viewport, as a
355
+ * fraction of the viewport size (`0.2` = 20vh on the y axis). Positive values
356
+ * lag behind the scroll (background-like), negative values move ahead of it
357
+ * (foreground-like). (default: `0.2`)
358
+ */
359
+ speed?: number;
360
+ /** `'y'` (default) or `'x'` (horizontal drift, in `vw`) */
361
+ axis?: 'x' | 'y';
362
+ /** CSS custom property receiving the progress (default: `'--sa-parallax'`) */
363
+ progressVar?: string;
364
+ /** Scroll container (default: the viewport) */
365
+ root?: Element | null;
366
+ /**
367
+ * Under `prefers-reduced-motion: reduce` no offset is applied (the progress
368
+ * variable is still written). Set to `false` to move anyway. (default: `true`)
369
+ */
370
+ respectReducedMotion?: boolean;
371
+ }
372
+ /**
373
+ * Apply a scroll parallax to `target` (selector, Element, NodeList or array).
374
+ * Returns a function that stops it and removes the inline styles it set.
375
+ * SSR-safe (no-op without a DOM / IntersectionObserver).
376
+ *
377
+ * @example
378
+ * const stop = parallax('.hero-bg', { speed: 0.3 });
379
+ * parallax('.badge', { speed: -0.15, axis: 'x' });
380
+ */
381
+ declare function parallax(target: string | Element | NodeList | Element[], options?: ParallaxHelperOptions): () => void;
382
+
383
+ /**
384
+ * motionary - Animation Presets
385
+ * Defines keyframes for all built-in animation presets
386
+ */
387
+
388
+ type KeyframeMap = PresetKeyframes;
389
+ /**
390
+ * Every registered preset: the 33 core presets, plus the 6.1 extended set once
391
+ * `motionary/presets/extended` is loaded, plus your own.
392
+ */
393
+ declare const PRESETS: Record<CorePreset, KeyframeMap> & Partial<Record<ExtendedPreset, KeyframeMap>>;
394
+ /**
395
+ * Add (or replace) presets by name: `registerPresets({ 'my-pop': { from, to, frames? } })`.
396
+ * They work everywhere a preset name does (`animation`, `exit`, `data-sa-animation`,
397
+ * `<scroll-animate>`, `<usa-reveal effect>`).
398
+ */
399
+ declare function registerPresets(presets: Record<string, PresetKeyframes>): void;
400
+ /** The same keyframes played backwards (exit animations). */
401
+ declare function reversePreset(p: KeyframeMap): KeyframeMap;
402
+ declare function resolvePreset(animation: AnimationPreset | AnimationPreset[] | CustomAnimation): KeyframeMap;
403
+ /** Easing to CSS cubic-bezier mapping */
404
+ declare const EASING_MAP: Record<string, string>;
405
+ declare function resolveEasing(easing: EasingType): string;
406
+
407
+ /**
408
+ * Default singleton instance of ScrollAnimate.
409
+ * Ready to use out of the box with sensible defaults.
410
+ *
411
+ * @example
412
+ * ```js
413
+ * import ScrollAnimate from 'motionary';
414
+ *
415
+ * // Auto-initialize all elements with data-sa attribute
416
+ * ScrollAnimate.init();
417
+ *
418
+ * // Or manually observe elements
419
+ * ScrollAnimate.observe('.my-element', { animation: 'fade-in-up' });
420
+ * ```
421
+ */
422
+ declare const ScrollAnimate: ScrollAnimateInstance;
423
+
424
+ export { EASING_MAP, PRESETS, TIMELINE_PRESETS, createScrollAnimate, ScrollAnimate as default, getScrollProgress, parallax, registerPresets, resolveEasing, resolvePosition, resolvePreset, reversePreset, staggerChildren, supportsNativeScrub, supportsScrollTimeline, timeline };
425
+ export type { AnimateOptions, AnimatedElement, AnimationFrame, AnimationKeyframe, AnimationPreset, CorePreset, CustomAnimation, EasingType, ExtendedPreset, ParallaxHelperOptions, PresetKeyframes, ProgressMode, ScrollAnimateConfig, ScrollAnimateInstance, ScrollEngine, ScrubHandle, ScrubOptions, StaggerOptions, Timeline, TimelineOptions, TimelinePosition, TimelineStepOptions };
package/dist/index.js ADDED
@@ -0,0 +1,131 @@
1
+ import { b as resolveTargets, h as hasDOM, s as supportsObserver, g as getScrollProgress, d as prefersReducedMotion, c as createScrollAnimate } from './chunks/core-D7cVumUu.js';
2
+ export { e as supportsScrollTimeline } from './chunks/core-D7cVumUu.js';
3
+ export { s as staggerChildren } from './chunks/stagger-DtMKo2SK.js';
4
+ export { T as TIMELINE_PRESETS, r as resolvePosition, s as supportsNativeScrub, t as timeline } from './chunks/core-VEBw36QK.js';
5
+ export { E as EASING_MAP, P as PRESETS, c as registerPresets, a as resolveEasing, r as resolvePreset, b as reversePreset } from './chunks/presets-BYBVJVeP.js';
6
+ import './chunks/base-C_3cAoRz.js';
7
+ import './components/tokens.js';
8
+
9
+ /**
10
+ * motionary - parallax() helper
11
+ *
12
+ * Moves elements at a different speed than the page while they cross the
13
+ * viewport. Built on the same scroll progress as `progressVar` (0 when the
14
+ * element's top enters at the bottom, 1 when its bottom leaves at the top):
15
+ * the progress is written to a CSS custom property (default `--sa-parallax`)
16
+ * and the offset is applied with the individual `translate` property, so it
17
+ * composes with entrance animations and other `transform`s.
18
+ */
19
+ const PASSIVE = { passive: true };
20
+ /**
21
+ * Apply a scroll parallax to `target` (selector, Element, NodeList or array).
22
+ * Returns a function that stops it and removes the inline styles it set.
23
+ * SSR-safe (no-op without a DOM / IntersectionObserver).
24
+ *
25
+ * @example
26
+ * const stop = parallax('.hero-bg', { speed: 0.3 });
27
+ * parallax('.badge', { speed: -0.15, axis: 'x' });
28
+ */
29
+ function parallax(target, options = {}) {
30
+ const els = resolveTargets(target);
31
+ if (!els.length || !hasDOM() || !supportsObserver())
32
+ return () => undefined;
33
+ const { speed = 0.2, axis = 'y', root = null, respectReducedMotion = true } = options;
34
+ const name = options.progressVar ? (options.progressVar.startsWith('--') ? options.progressVar : `--${options.progressVar}`) : '--sa-parallax';
35
+ const unit = axis === 'x' ? 'vw' : 'vh';
36
+ const visible = new Set();
37
+ let frame = 0;
38
+ let listening = false;
39
+ const scroller = root || window;
40
+ const apply = (el) => {
41
+ const style = el.style;
42
+ if (!style)
43
+ return;
44
+ const p = getScrollProgress(el, root);
45
+ style.setProperty(name, String(+p.toFixed(4)));
46
+ if (respectReducedMotion && prefersReducedMotion()) {
47
+ style.removeProperty('translate');
48
+ return;
49
+ }
50
+ const offset = `${+((p - 0.5) * speed * 100).toFixed(3)}${unit}`;
51
+ style.setProperty('translate', axis === 'x' ? `${offset} 0px` : `0px ${offset}`);
52
+ };
53
+ const update = () => {
54
+ frame = 0;
55
+ visible.forEach(apply);
56
+ };
57
+ const schedule = () => {
58
+ if (!frame)
59
+ frame = requestAnimationFrame(update);
60
+ };
61
+ const listen = (on) => {
62
+ if (on === listening)
63
+ return;
64
+ listening = on;
65
+ const method = on ? 'addEventListener' : 'removeEventListener';
66
+ scroller[method]('scroll', schedule, PASSIVE);
67
+ window[method]('resize', schedule, PASSIVE);
68
+ if (!on && frame) {
69
+ cancelAnimationFrame(frame);
70
+ frame = 0;
71
+ }
72
+ };
73
+ const io = new IntersectionObserver((entries) => {
74
+ entries.forEach((entry) => {
75
+ if (entry.isIntersecting)
76
+ visible.add(entry.target);
77
+ else
78
+ visible.delete(entry.target);
79
+ apply(entry.target); // report the edges even on fast scrolls
80
+ });
81
+ listen(visible.size > 0);
82
+ }, { threshold: 0, root });
83
+ els.forEach((el) => {
84
+ apply(el); // no jump before the first observer callback
85
+ io.observe(el);
86
+ });
87
+ return () => {
88
+ io.disconnect();
89
+ listen(false);
90
+ visible.clear();
91
+ els.forEach((el) => {
92
+ const style = el.style;
93
+ if (!style)
94
+ return;
95
+ style.removeProperty('translate');
96
+ style.removeProperty(name);
97
+ });
98
+ };
99
+ }
100
+
101
+ /**
102
+ * motionary
103
+ *
104
+ * A lightweight, dependency-free scroll animation library for modern web
105
+ * applications. Built with TypeScript, powered by IntersectionObserver and
106
+ * the Web Animations API (or the native scroll-driven timeline). Safe to
107
+ * import during SSR. Framework integrations live in the subpath entries:
108
+ * `motionary/react`, `/vue`, `/svelte`, `/solid`, `/element`.
109
+ *
110
+ * @license MIT
111
+ * @see https://github.com/HarrisonCN/motionary
112
+ */
113
+ /**
114
+ * Default singleton instance of ScrollAnimate.
115
+ * Ready to use out of the box with sensible defaults.
116
+ *
117
+ * @example
118
+ * ```js
119
+ * import ScrollAnimate from 'motionary';
120
+ *
121
+ * // Auto-initialize all elements with data-sa attribute
122
+ * ScrollAnimate.init();
123
+ *
124
+ * // Or manually observe elements
125
+ * ScrollAnimate.observe('.my-element', { animation: 'fade-in-up' });
126
+ * ```
127
+ */
128
+ const ScrollAnimate = /* @__PURE__ */ createScrollAnimate();
129
+
130
+ export { createScrollAnimate, ScrollAnimate as default, getScrollProgress, parallax };
131
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/parallax.ts","../src/index.ts"],"sourcesContent":["/**\n * motionary - parallax() helper\n *\n * Moves elements at a different speed than the page while they cross the\n * viewport. Built on the same scroll progress as `progressVar` (0 when the\n * element's top enters at the bottom, 1 when its bottom leaves at the top):\n * the progress is written to a CSS custom property (default `--sa-parallax`)\n * and the offset is applied with the individual `translate` property, so it\n * composes with entrance animations and other `transform`s.\n */\n\nimport { getScrollProgress, hasDOM, prefersReducedMotion, resolveTargets, supportsObserver } from './core';\n\nexport interface ParallaxHelperOptions {\n /**\n * Total distance the element shifts while it crosses the viewport, as a\n * fraction of the viewport size (`0.2` = 20vh on the y axis). Positive values\n * lag behind the scroll (background-like), negative values move ahead of it\n * (foreground-like). (default: `0.2`)\n */\n speed?: number;\n /** `'y'` (default) or `'x'` (horizontal drift, in `vw`) */\n axis?: 'x' | 'y';\n /** CSS custom property receiving the progress (default: `'--sa-parallax'`) */\n progressVar?: string;\n /** Scroll container (default: the viewport) */\n root?: Element | null;\n /**\n * Under `prefers-reduced-motion: reduce` no offset is applied (the progress\n * variable is still written). Set to `false` to move anyway. (default: `true`)\n */\n respectReducedMotion?: boolean;\n}\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\n/**\n * Apply a scroll parallax to `target` (selector, Element, NodeList or array).\n * Returns a function that stops it and removes the inline styles it set.\n * SSR-safe (no-op without a DOM / IntersectionObserver).\n *\n * @example\n * const stop = parallax('.hero-bg', { speed: 0.3 });\n * parallax('.badge', { speed: -0.15, axis: 'x' });\n */\nexport function parallax(\n target: string | Element | NodeList | Element[],\n options: ParallaxHelperOptions = {}\n): () => void {\n const els = resolveTargets(target);\n if (!els.length || !hasDOM() || !supportsObserver()) return () => undefined;\n const { speed = 0.2, axis = 'y', root = null, respectReducedMotion = true } = options;\n const name = options.progressVar ? (options.progressVar.startsWith('--') ? options.progressVar : `--${options.progressVar}`) : '--sa-parallax';\n const unit = axis === 'x' ? 'vw' : 'vh';\n const visible = new Set<Element>();\n let frame = 0;\n let listening = false;\n const scroller: EventTarget = root || window;\n\n const apply = (el: Element) => {\n const style = (el as HTMLElement).style;\n if (!style) return;\n const p = getScrollProgress(el, root);\n style.setProperty(name, String(+p.toFixed(4)));\n if (respectReducedMotion && prefersReducedMotion()) {\n style.removeProperty('translate');\n return;\n }\n const offset = `${+((p - 0.5) * speed * 100).toFixed(3)}${unit}`;\n style.setProperty('translate', axis === 'x' ? `${offset} 0px` : `0px ${offset}`);\n };\n\n const update = () => {\n frame = 0;\n visible.forEach(apply);\n };\n const schedule = () => {\n if (!frame) frame = requestAnimationFrame(update);\n };\n const listen = (on: boolean) => {\n if (on === listening) return;\n listening = on;\n const method = on ? 'addEventListener' : 'removeEventListener';\n scroller[method]('scroll', schedule, PASSIVE);\n window[method]('resize', schedule, PASSIVE);\n if (!on && frame) {\n cancelAnimationFrame(frame);\n frame = 0;\n }\n };\n\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) visible.add(entry.target);\n else visible.delete(entry.target);\n apply(entry.target); // report the edges even on fast scrolls\n });\n listen(visible.size > 0);\n },\n { threshold: 0, root }\n );\n els.forEach((el) => {\n apply(el); // no jump before the first observer callback\n io.observe(el);\n });\n\n return () => {\n io.disconnect();\n listen(false);\n visible.clear();\n els.forEach((el) => {\n const style = (el as HTMLElement).style;\n if (!style) return;\n style.removeProperty('translate');\n style.removeProperty(name);\n });\n };\n}\n","/**\n * motionary\n *\n * A lightweight, dependency-free scroll animation library for modern web\n * applications. Built with TypeScript, powered by IntersectionObserver and\n * the Web Animations API (or the native scroll-driven timeline). Safe to\n * import during SSR. Framework integrations live in the subpath entries:\n * `motionary/react`, `/vue`, `/svelte`, `/solid`, `/element`.\n *\n * @license MIT\n * @see https://github.com/HarrisonCN/motionary\n */\n\nexport { createScrollAnimate, getScrollProgress, supportsScrollTimeline } from './core';\nexport { staggerChildren } from './stagger';\nexport { timeline, resolvePosition, TIMELINE_PRESETS, supportsNativeScrub } from './components/timeline/core';\nexport { parallax } from './parallax';\nexport { PRESETS, registerPresets, reversePreset, resolvePreset, resolveEasing, EASING_MAP } from './presets';\nexport type {\n AnimationPreset,\n CorePreset,\n ExtendedPreset,\n PresetKeyframes,\n AnimationFrame,\n EasingType,\n AnimationKeyframe,\n CustomAnimation,\n ProgressMode,\n ScrollEngine,\n AnimateOptions,\n ScrollAnimateConfig,\n AnimatedElement,\n ScrollAnimateInstance,\n} from './types';\nexport type { StaggerOptions } from './stagger';\nexport type { ParallaxHelperOptions } from './parallax';\nexport type { Timeline, TimelineOptions, TimelineStepOptions, TimelinePosition, ScrubOptions, ScrubHandle } from './components/timeline/core';\n\n// Default export: a ready-to-use singleton instance\nimport { createScrollAnimate } from './core';\n\n/**\n * Default singleton instance of ScrollAnimate.\n * Ready to use out of the box with sensible defaults.\n *\n * @example\n * ```js\n * import ScrollAnimate from 'motionary';\n *\n * // Auto-initialize all elements with data-sa attribute\n * ScrollAnimate.init();\n *\n * // Or manually observe elements\n * ScrollAnimate.observe('.my-element', { animation: 'fade-in-up' });\n * ```\n */\nconst ScrollAnimate = /* @__PURE__ */ createScrollAnimate();\nexport default ScrollAnimate;\n"],"names":[],"mappings":";;;;;;;;AAAA;;;;;;;;;AASG;AAyBH,MAAM,OAAO,GAA4B,EAAE,OAAO,EAAE,IAAI,EAAE;AAE1D;;;;;;;;AAQG;SACa,QAAQ,CACtB,MAA+C,EAC/C,UAAiC,EAAE,EAAA;AAEnC,IAAA,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE;AAAE,QAAA,OAAO,MAAM,SAAS;AAC3E,IAAA,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,oBAAoB,GAAG,IAAI,EAAE,GAAG,OAAO;AACrF,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,GAAG,CAAA,EAAA,EAAK,OAAO,CAAC,WAAW,EAAE,IAAI,eAAe;AAC9I,IAAA,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,IAAI;AACvC,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAW;IAClC,IAAI,KAAK,GAAG,CAAC;IACb,IAAI,SAAS,GAAG,KAAK;AACrB,IAAA,MAAM,QAAQ,GAAgB,IAAI,IAAI,MAAM;AAE5C,IAAA,MAAM,KAAK,GAAG,CAAC,EAAW,KAAI;AAC5B,QAAA,MAAM,KAAK,GAAI,EAAkB,CAAC,KAAK;AACvC,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC;AACrC,QAAA,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,QAAA,IAAI,oBAAoB,IAAI,oBAAoB,EAAE,EAAE;AAClD,YAAA,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;YACjC;QACF;QACA,MAAM,MAAM,GAAG,CAAA,EAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE;QAChE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,KAAK,GAAG,GAAG,CAAA,EAAG,MAAM,MAAM,GAAG,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAC;AAClF,IAAA,CAAC;IAED,MAAM,MAAM,GAAG,MAAK;QAClB,KAAK,GAAG,CAAC;AACT,QAAA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AACxB,IAAA,CAAC;IACD,MAAM,QAAQ,GAAG,MAAK;AACpB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC;AACnD,IAAA,CAAC;AACD,IAAA,MAAM,MAAM,GAAG,CAAC,EAAW,KAAI;QAC7B,IAAI,EAAE,KAAK,SAAS;YAAE;QACtB,SAAS,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,EAAE,GAAG,kBAAkB,GAAG,qBAAqB;QAC9D,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC3C,QAAA,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE;YAChB,oBAAoB,CAAC,KAAK,CAAC;YAC3B,KAAK,GAAG,CAAC;QACX;AACF,IAAA,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,oBAAoB,CACjC,CAAC,OAAO,KAAI;AACV,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YACxB,IAAI,KAAK,CAAC,cAAc;AAAE,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;;AAC9C,gBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;AACjC,YAAA,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1B,CAAC,EACD,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CACvB;AACD,IAAA,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACjB,QAAA,KAAK,CAAC,EAAE,CAAC,CAAC;AACV,QAAA,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AAChB,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,MAAK;QACV,EAAE,CAAC,UAAU,EAAE;QACf,MAAM,CAAC,KAAK,CAAC;QACb,OAAO,CAAC,KAAK,EAAE;AACf,QAAA,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACjB,YAAA,MAAM,KAAK,GAAI,EAAkB,CAAC,KAAK;AACvC,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;AACjC,YAAA,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AACH;;ACtHA;;;;;;;;;;;AAWG;AA8BH;;;;;;;;;;;;;;AAcG;AACH,MAAM,aAAa,mBAAmB,mBAAmB;;;;"}