@readdy/anim 0.0.21

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 (310) hide show
  1. package/animations/button/3d-flip/index.js +60 -0
  2. package/animations/button/3d-flip/react.tsx +29 -0
  3. package/animations/button/3d-flip/style.css +17 -0
  4. package/animations/button/blur-fade-in/index.js +21 -0
  5. package/animations/button/blur-fade-in/react.tsx +26 -0
  6. package/animations/button/blur-fade-in/style.css +27 -0
  7. package/animations/button/border-beam/index.js +172 -0
  8. package/animations/button/border-beam/react.tsx +55 -0
  9. package/animations/button/border-beam/style.css +59 -0
  10. package/animations/button/bounce-elastic/index.js +21 -0
  11. package/animations/button/bounce-elastic/react.tsx +26 -0
  12. package/animations/button/bounce-elastic/style.css +31 -0
  13. package/animations/button/bubble-button/index.js +317 -0
  14. package/animations/button/bubble-button/react.tsx +19 -0
  15. package/animations/button/bubble-button/style.css +245 -0
  16. package/animations/button/confetti-button/index.js +66 -0
  17. package/animations/button/confetti-button/react.tsx +30 -0
  18. package/animations/button/confetti-button/style.css +48 -0
  19. package/animations/button/glow-cta/index.js +69 -0
  20. package/animations/button/glow-cta/react.tsx +45 -0
  21. package/animations/button/glow-cta/style.css +78 -0
  22. package/animations/button/magnetic-hover/index.js +61 -0
  23. package/animations/button/magnetic-hover/react.tsx +29 -0
  24. package/animations/button/magnetic-hover/style.css +18 -0
  25. package/animations/button/pulse/index.js +21 -0
  26. package/animations/button/pulse/react.tsx +26 -0
  27. package/animations/button/pulse/style.css +24 -0
  28. package/animations/button/rainbow-button/index.js +21 -0
  29. package/animations/button/rainbow-button/react.tsx +26 -0
  30. package/animations/button/rainbow-button/style.css +54 -0
  31. package/animations/button/shimmer-border/index.js +28 -0
  32. package/animations/button/shimmer-border/react.tsx +41 -0
  33. package/animations/button/shimmer-border/style.css +53 -0
  34. package/animations/button/sketch-button/index.js +16 -0
  35. package/animations/button/sketch-button/react.tsx +19 -0
  36. package/animations/button/sketch-button/style.css +25 -0
  37. package/animations/card/blur-rise/index.js +21 -0
  38. package/animations/card/blur-rise/react.tsx +26 -0
  39. package/animations/card/blur-rise/style.css +27 -0
  40. package/animations/card/bounce-in-bottom/index.js +21 -0
  41. package/animations/card/bounce-in-bottom/react.tsx +26 -0
  42. package/animations/card/bounce-in-bottom/style.css +31 -0
  43. package/animations/card/card-fan-spread/index.js +146 -0
  44. package/animations/card/card-fan-spread/react.tsx +35 -0
  45. package/animations/card/card-fan-spread/style.css +90 -0
  46. package/animations/card/card-flip/index.js +203 -0
  47. package/animations/card/card-flip/react.tsx +35 -0
  48. package/animations/card/card-flip/style.css +71 -0
  49. package/animations/card/float-idle/index.js +21 -0
  50. package/animations/card/float-idle/react.tsx +26 -0
  51. package/animations/card/float-idle/style.css +21 -0
  52. package/animations/card/image-magnifier/index.js +333 -0
  53. package/animations/card/image-magnifier/react.tsx +31 -0
  54. package/animations/card/image-magnifier/style.css +42 -0
  55. package/animations/card/image-zoom-rotate/index.js +48 -0
  56. package/animations/card/image-zoom-rotate/react.tsx +31 -0
  57. package/animations/card/image-zoom-rotate/style.css +20 -0
  58. package/animations/card/pop-in-stack/index.js +25 -0
  59. package/animations/card/pop-in-stack/react.tsx +33 -0
  60. package/animations/card/pop-in-stack/style.css +25 -0
  61. package/animations/card/reveal-from-top/index.js +21 -0
  62. package/animations/card/reveal-from-top/react.tsx +26 -0
  63. package/animations/card/reveal-from-top/style.css +28 -0
  64. package/animations/card/rgb-split-glitch/index.js +28 -0
  65. package/animations/card/rgb-split-glitch/react.tsx +41 -0
  66. package/animations/card/rgb-split-glitch/style.css +33 -0
  67. package/animations/card/tilted-card/index.js +64 -0
  68. package/animations/card/tilted-card/react.tsx +33 -0
  69. package/animations/card/tilted-card/style.css +27 -0
  70. package/animations/header/anime-splittext/index.js +108 -0
  71. package/animations/header/anime-splittext/react.tsx +30 -0
  72. package/animations/header/anime-splittext/style.css +71 -0
  73. package/animations/header/bounce-in-down/index.js +40 -0
  74. package/animations/header/bounce-in-down/react.tsx +29 -0
  75. package/animations/header/bounce-in-down/style.css +40 -0
  76. package/animations/header/fly-in-chars/index.js +46 -0
  77. package/animations/header/fly-in-chars/react.tsx +30 -0
  78. package/animations/header/fly-in-chars/style.css +29 -0
  79. package/animations/header/gradient-text/index.js +21 -0
  80. package/animations/header/gradient-text/react.tsx +26 -0
  81. package/animations/header/gradient-text/style.css +28 -0
  82. package/animations/header/letter-bounce/index.js +33 -0
  83. package/animations/header/letter-bounce/react.tsx +34 -0
  84. package/animations/header/letter-bounce/style.css +25 -0
  85. package/animations/header/roll-in/index.js +40 -0
  86. package/animations/header/roll-in/react.tsx +29 -0
  87. package/animations/header/roll-in/style.css +31 -0
  88. package/animations/header/shimmer-text/index.js +16 -0
  89. package/animations/header/shimmer-text/react.tsx +28 -0
  90. package/animations/header/shimmer-text/style.css +29 -0
  91. package/animations/header/shuffle/index.js +118 -0
  92. package/animations/header/shuffle/react.tsx +50 -0
  93. package/animations/header/shuffle/style.css +25 -0
  94. package/animations/header/split-text/index.js +72 -0
  95. package/animations/header/split-text/react.tsx +38 -0
  96. package/animations/header/split-text/style.css +31 -0
  97. package/animations/header/text-type/index.js +267 -0
  98. package/animations/header/text-type/react.tsx +63 -0
  99. package/animations/header/text-type/style.css +37 -0
  100. package/animations/header/word-curtain-reveal/index.js +97 -0
  101. package/animations/header/word-curtain-reveal/react.tsx +30 -0
  102. package/animations/header/word-curtain-reveal/style.css +39 -0
  103. package/dist/button/3d-flip/react.js +21 -0
  104. package/dist/button/3d-flip.js +61 -0
  105. package/dist/button/blur-fade-in/react.js +28 -0
  106. package/dist/button/blur-fade-in.js +17 -0
  107. package/dist/button/border-beam/react.js +22 -0
  108. package/dist/button/border-beam.js +168 -0
  109. package/dist/button/bounce-elastic/react.js +28 -0
  110. package/dist/button/bounce-elastic.js +17 -0
  111. package/dist/button/bubble-button/react.js +20 -0
  112. package/dist/button/bubble-button.js +318 -0
  113. package/dist/button/confetti-button/react.js +21 -0
  114. package/dist/button/confetti-button.js +67 -0
  115. package/dist/button/glow-cta/react.js +23 -0
  116. package/dist/button/glow-cta.js +65 -0
  117. package/dist/button/magnetic-hover/react.js +21 -0
  118. package/dist/button/magnetic-hover.js +62 -0
  119. package/dist/button/pulse/react.js +28 -0
  120. package/dist/button/pulse.js +17 -0
  121. package/dist/button/rainbow-button/react.js +28 -0
  122. package/dist/button/rainbow-button.js +17 -0
  123. package/dist/button/shimmer-border/react.js +22 -0
  124. package/dist/button/shimmer-border.js +24 -0
  125. package/dist/button/sketch-button/react.js +20 -0
  126. package/dist/button/sketch-button.js +17 -0
  127. package/dist/card/blur-rise/react.js +28 -0
  128. package/dist/card/blur-rise.js +17 -0
  129. package/dist/card/bounce-in-bottom/react.js +28 -0
  130. package/dist/card/bounce-in-bottom.js +17 -0
  131. package/dist/card/card-fan-spread/react.js +20 -0
  132. package/dist/card/card-fan-spread.js +147 -0
  133. package/dist/card/float-idle/react.js +28 -0
  134. package/dist/card/float-idle.js +17 -0
  135. package/dist/card/image-magnifier/react.js +22 -0
  136. package/dist/card/image-magnifier.js +334 -0
  137. package/dist/card/image-zoom-rotate/react.js +21 -0
  138. package/dist/card/image-zoom-rotate.js +49 -0
  139. package/dist/card/pop-in-stack/react.js +20 -0
  140. package/dist/card/pop-in-stack.js +26 -0
  141. package/dist/card/reveal-from-top/react.js +28 -0
  142. package/dist/card/reveal-from-top.js +17 -0
  143. package/dist/card/rgb-split-glitch/react.js +22 -0
  144. package/dist/card/rgb-split-glitch.js +24 -0
  145. package/dist/card/tilted-card/react.js +21 -0
  146. package/dist/card/tilted-card.js +65 -0
  147. package/dist/chunks/constants-EnH6-Pz4.js +66 -0
  148. package/dist/chunks/constants-ZTHic1pf.js +66 -0
  149. package/dist/chunks/pointer-follow-B3RFnn_q.js +93 -0
  150. package/dist/chunks/pointer-follow-BETANySn.js +93 -0
  151. package/dist/chunks/reduced-motion-BpQYuEzK.js +17 -0
  152. package/dist/chunks/reduced-motion-HX79Ac8G.js +17 -0
  153. package/dist/chunks/resolve-card-media-Cj3V_oms.js +43 -0
  154. package/dist/chunks/resolve-card-media-DBIU-duL.js +43 -0
  155. package/dist/chunks/text-split-D02jltVh.js +191 -0
  156. package/dist/chunks/text-split-frOR4UpH.js +191 -0
  157. package/dist/full.css +1 -0
  158. package/dist/full.js +3192 -0
  159. package/dist/header/anime-splittext/react.js +22 -0
  160. package/dist/header/anime-splittext.js +109 -0
  161. package/dist/header/bounce-in-down/react.js +32 -0
  162. package/dist/header/bounce-in-down.js +36 -0
  163. package/dist/header/fly-in-chars/react.js +23 -0
  164. package/dist/header/fly-in-chars.js +47 -0
  165. package/dist/header/gradient-text/react.js +28 -0
  166. package/dist/header/gradient-text.js +17 -0
  167. package/dist/header/letter-bounce/react.js +23 -0
  168. package/dist/header/letter-bounce.js +34 -0
  169. package/dist/header/roll-in/react.js +32 -0
  170. package/dist/header/roll-in.js +36 -0
  171. package/dist/header/shimmer-text/react.js +27 -0
  172. package/dist/header/shimmer-text.js +17 -0
  173. package/dist/header/shuffle/react.js +30 -0
  174. package/dist/header/shuffle.js +119 -0
  175. package/dist/header/split-text/react.js +26 -0
  176. package/dist/header/split-text.js +73 -0
  177. package/dist/header/text-type/react.js +43 -0
  178. package/dist/header/text-type.js +268 -0
  179. package/dist/header/word-curtain-reveal/react.js +22 -0
  180. package/dist/header/word-curtain-reveal.js +98 -0
  181. package/dist/meta.json +6 -0
  182. package/dist/metadata.json +1051 -0
  183. package/dist/react.css +1 -0
  184. package/dist/types/animations/button/3d-flip/index.d.ts +3 -0
  185. package/dist/types/animations/button/3d-flip/react.d.ts +8 -0
  186. package/dist/types/animations/button/blur-fade-in/index.d.ts +3 -0
  187. package/dist/types/animations/button/blur-fade-in/react.d.ts +13 -0
  188. package/dist/types/animations/button/border-beam/index.d.ts +3 -0
  189. package/dist/types/animations/button/border-beam/react.d.ts +25 -0
  190. package/dist/types/animations/button/bounce-elastic/index.d.ts +3 -0
  191. package/dist/types/animations/button/bounce-elastic/react.d.ts +13 -0
  192. package/dist/types/animations/button/bubble-button/index.d.ts +3 -0
  193. package/dist/types/animations/button/bubble-button/react.d.ts +4 -0
  194. package/dist/types/animations/button/confetti-button/index.d.ts +3 -0
  195. package/dist/types/animations/button/confetti-button/react.d.ts +8 -0
  196. package/dist/types/animations/button/glow-cta/index.d.ts +3 -0
  197. package/dist/types/animations/button/glow-cta/react.d.ts +20 -0
  198. package/dist/types/animations/button/magnetic-hover/index.d.ts +3 -0
  199. package/dist/types/animations/button/magnetic-hover/react.d.ts +8 -0
  200. package/dist/types/animations/button/pulse/index.d.ts +3 -0
  201. package/dist/types/animations/button/pulse/react.d.ts +13 -0
  202. package/dist/types/animations/button/rainbow-button/index.d.ts +3 -0
  203. package/dist/types/animations/button/rainbow-button/react.d.ts +13 -0
  204. package/dist/types/animations/button/shimmer-border/index.d.ts +3 -0
  205. package/dist/types/animations/button/shimmer-border/react.d.ts +18 -0
  206. package/dist/types/animations/button/sketch-button/index.d.ts +3 -0
  207. package/dist/types/animations/button/sketch-button/react.d.ts +4 -0
  208. package/dist/types/animations/card/blur-rise/index.d.ts +3 -0
  209. package/dist/types/animations/card/blur-rise/react.d.ts +13 -0
  210. package/dist/types/animations/card/bounce-in-bottom/index.d.ts +3 -0
  211. package/dist/types/animations/card/bounce-in-bottom/react.d.ts +13 -0
  212. package/dist/types/animations/card/card-fan-spread/index.d.ts +3 -0
  213. package/dist/types/animations/card/card-fan-spread/react.d.ts +11 -0
  214. package/dist/types/animations/card/card-flip/index.d.ts +3 -0
  215. package/dist/types/animations/card/card-flip/react.d.ts +11 -0
  216. package/dist/types/animations/card/float-idle/index.d.ts +3 -0
  217. package/dist/types/animations/card/float-idle/react.d.ts +13 -0
  218. package/dist/types/animations/card/image-magnifier/index.d.ts +3 -0
  219. package/dist/types/animations/card/image-magnifier/react.d.ts +9 -0
  220. package/dist/types/animations/card/image-zoom-rotate/index.d.ts +3 -0
  221. package/dist/types/animations/card/image-zoom-rotate/react.d.ts +9 -0
  222. package/dist/types/animations/card/pop-in-stack/index.d.ts +3 -0
  223. package/dist/types/animations/card/pop-in-stack/react.d.ts +10 -0
  224. package/dist/types/animations/card/reveal-from-top/index.d.ts +3 -0
  225. package/dist/types/animations/card/reveal-from-top/react.d.ts +13 -0
  226. package/dist/types/animations/card/rgb-split-glitch/index.d.ts +3 -0
  227. package/dist/types/animations/card/rgb-split-glitch/react.d.ts +18 -0
  228. package/dist/types/animations/card/tilted-card/index.d.ts +3 -0
  229. package/dist/types/animations/card/tilted-card/react.d.ts +10 -0
  230. package/dist/types/animations/header/anime-splittext/index.d.ts +3 -0
  231. package/dist/types/animations/header/anime-splittext/react.d.ts +8 -0
  232. package/dist/types/animations/header/bounce-in-down/index.d.ts +3 -0
  233. package/dist/types/animations/header/bounce-in-down/react.d.ts +13 -0
  234. package/dist/types/animations/header/fly-in-chars/index.d.ts +3 -0
  235. package/dist/types/animations/header/fly-in-chars/react.d.ts +8 -0
  236. package/dist/types/animations/header/gradient-text/index.d.ts +3 -0
  237. package/dist/types/animations/header/gradient-text/react.d.ts +13 -0
  238. package/dist/types/animations/header/letter-bounce/index.d.ts +3 -0
  239. package/dist/types/animations/header/letter-bounce/react.d.ts +10 -0
  240. package/dist/types/animations/header/roll-in/index.d.ts +3 -0
  241. package/dist/types/animations/header/roll-in/react.d.ts +13 -0
  242. package/dist/types/animations/header/shimmer-text/index.d.ts +3 -0
  243. package/dist/types/animations/header/shimmer-text/react.d.ts +4 -0
  244. package/dist/types/animations/header/shuffle/index.d.ts +3 -0
  245. package/dist/types/animations/header/shuffle/react.d.ts +14 -0
  246. package/dist/types/animations/header/split-text/index.d.ts +3 -0
  247. package/dist/types/animations/header/split-text/react.d.ts +10 -0
  248. package/dist/types/animations/header/text-type/index.d.ts +3 -0
  249. package/dist/types/animations/header/text-type/react.d.ts +13 -0
  250. package/dist/types/animations/header/word-curtain-reveal/index.d.ts +3 -0
  251. package/dist/types/animations/header/word-curtain-reveal/react.d.ts +8 -0
  252. package/dist/types/react-barrel.d.ts +34 -0
  253. package/dist/types/scripts/bundle-all.d.ts +173 -0
  254. package/dist/types/scripts/check-metadata.d.ts +1 -0
  255. package/dist/types/scripts/copy-metadata.d.ts +1 -0
  256. package/dist/types/scripts/generate-animation-id-map.d.ts +1 -0
  257. package/dist/types/scripts/generate-dist-meta.d.ts +1 -0
  258. package/dist/types/scripts/generate-preview-manifest.d.ts +1 -0
  259. package/dist/types/scripts/update-metadata.d.ts +1 -0
  260. package/dist/types/shared/constants.d.ts +34 -0
  261. package/dist/types/shared/meta.d.ts +18 -0
  262. package/dist/types/shared/pointer-follow.d.ts +8 -0
  263. package/dist/types/shared/reduced-motion.d.ts +11 -0
  264. package/dist/types/shared/resolve-card-media.d.ts +1 -0
  265. package/dist/types/shared/text-split.d.ts +19 -0
  266. package/dist/types/stories/3d-flip.stories.d.ts +7 -0
  267. package/dist/types/stories/_helpers.d.ts +24 -0
  268. package/dist/types/stories/anime-splittext.stories.d.ts +8 -0
  269. package/dist/types/stories/blur-fade-in.stories.d.ts +8 -0
  270. package/dist/types/stories/blur-rise.stories.d.ts +8 -0
  271. package/dist/types/stories/blur-to-sharp-rise-header.stories.d.ts +8 -0
  272. package/dist/types/stories/border-beam.stories.d.ts +8 -0
  273. package/dist/types/stories/bounce-elastic.stories.d.ts +8 -0
  274. package/dist/types/stories/bounce-in-bottom.stories.d.ts +8 -0
  275. package/dist/types/stories/bounce-in-down.stories.d.ts +9 -0
  276. package/dist/types/stories/bubble-button.stories.d.ts +8 -0
  277. package/dist/types/stories/card-fan-spread.stories.d.ts +7 -0
  278. package/dist/types/stories/card-flip.stories.d.ts +7 -0
  279. package/dist/types/stories/confetti-button.stories.d.ts +7 -0
  280. package/dist/types/stories/float-idle.stories.d.ts +8 -0
  281. package/dist/types/stories/fly-in-chars.stories.d.ts +8 -0
  282. package/dist/types/stories/glow-cta.stories.d.ts +9 -0
  283. package/dist/types/stories/gradient-text.stories.d.ts +9 -0
  284. package/dist/types/stories/image-magnifier.stories.d.ts +10 -0
  285. package/dist/types/stories/image-zoom-rotate.stories.d.ts +7 -0
  286. package/dist/types/stories/letter-bounce.stories.d.ts +8 -0
  287. package/dist/types/stories/magic-ui-border-beam-card.stories.d.ts +8 -0
  288. package/dist/types/stories/magnetic-hover.stories.d.ts +7 -0
  289. package/dist/types/stories/pop-in-stack.stories.d.ts +7 -0
  290. package/dist/types/stories/pulse.stories.d.ts +8 -0
  291. package/dist/types/stories/rainbow-button.stories.d.ts +8 -0
  292. package/dist/types/stories/reveal-from-top.stories.d.ts +8 -0
  293. package/dist/types/stories/rgb-split-glitch.stories.d.ts +8 -0
  294. package/dist/types/stories/roll-in.stories.d.ts +9 -0
  295. package/dist/types/stories/shimmer-border.stories.d.ts +9 -0
  296. package/dist/types/stories/shimmer-text.stories.d.ts +8 -0
  297. package/dist/types/stories/shuffle.stories.d.ts +8 -0
  298. package/dist/types/stories/sketch-button.stories.d.ts +7 -0
  299. package/dist/types/stories/split-text.stories.d.ts +8 -0
  300. package/dist/types/stories/text-type.stories.d.ts +8 -0
  301. package/dist/types/stories/tilted-card.stories.d.ts +7 -0
  302. package/dist/types/stories/word-curtain-reveal.stories.d.ts +8 -0
  303. package/package.json +166 -0
  304. package/react-barrel.js +44 -0
  305. package/shared/constants.js +64 -0
  306. package/shared/meta.js +21 -0
  307. package/shared/pointer-follow.js +91 -0
  308. package/shared/reduced-motion.js +15 -0
  309. package/shared/resolve-card-media.js +41 -0
  310. package/shared/text-split.js +188 -0
@@ -0,0 +1,17 @@
1
+ import { b as buildAnimId, a as buildAnimClass } from '../chunks/constants-EnH6-Pz4.js';
2
+
3
+ const ANIMATION_ID = buildAnimId('reveal-from-top');
4
+
5
+ const CSS_CLASS = buildAnimClass('reveal-from-top');
6
+
7
+ function init(el, options = {}) {
8
+ if (!el.classList.contains(CSS_CLASS)) {
9
+ el.classList.add(CSS_CLASS);
10
+ }
11
+ }
12
+
13
+ function destroy(el) {
14
+ el.classList.remove(CSS_CLASS);
15
+ }
16
+
17
+ export { ANIMATION_ID, destroy, init };
@@ -0,0 +1,22 @@
1
+ import React, { useRef, useEffect } from 'react';
2
+ import { p as prefersReducedMotion } from '../../chunks/reduced-motion-HX79Ac8G.js';
3
+ import { init, destroy } from '../rgb-split-glitch.js';
4
+ import '../../chunks/constants-EnH6-Pz4.js';
5
+
6
+ function AnimRgbSplitGlitch({ children, duration, shift, shadowOffset, }) {
7
+ const ref = useRef(null);
8
+ useEffect(() => {
9
+ const el = ref.current;
10
+ if (!el)
11
+ return;
12
+ if (prefersReducedMotion())
13
+ return;
14
+ init(el, { duration, shift, shadowOffset });
15
+ return () => {
16
+ destroy(el);
17
+ };
18
+ }, [duration, shift, shadowOffset]);
19
+ return React.cloneElement(React.Children.only(children), { ref });
20
+ }
21
+
22
+ export { AnimRgbSplitGlitch };
@@ -0,0 +1,24 @@
1
+ import { b as buildAnimId, a as buildAnimClass } from '../chunks/constants-EnH6-Pz4.js';
2
+
3
+ const ANIMATION_ID = buildAnimId('rgb-split-glitch');
4
+
5
+ const CSS_CLASS = buildAnimClass('rgb-split-glitch');
6
+
7
+ function init(el, options = {}) {
8
+ if (!el.classList.contains(CSS_CLASS)) {
9
+ el.classList.add(CSS_CLASS);
10
+ }
11
+
12
+ el.style.setProperty('--readdy-anim-rgb-glitch-duration', `${options.duration ?? 1100}ms`);
13
+ el.style.setProperty('--readdy-anim-rgb-glitch-shift', `${options.shift ?? 3}px`);
14
+ el.style.setProperty('--readdy-anim-rgb-glitch-shadow', `${options.shadowOffset ?? 2}px`);
15
+ }
16
+
17
+ function destroy(el) {
18
+ el.classList.remove(CSS_CLASS);
19
+ el.style.removeProperty('--readdy-anim-rgb-glitch-duration');
20
+ el.style.removeProperty('--readdy-anim-rgb-glitch-shift');
21
+ el.style.removeProperty('--readdy-anim-rgb-glitch-shadow');
22
+ }
23
+
24
+ export { ANIMATION_ID, destroy, init };
@@ -0,0 +1,21 @@
1
+ import React, { useRef, useEffect } from 'react';
2
+ import { init, destroy } from '../tilted-card.js';
3
+ import { p as prefersReducedMotion } from '../../chunks/reduced-motion-HX79Ac8G.js';
4
+ import '../../chunks/pointer-follow-BETANySn.js';
5
+ import '../../chunks/constants-EnH6-Pz4.js';
6
+
7
+ function AnimTiltedCard({ children, maxTilt, scale, perspective, duration, }) {
8
+ const ref = useRef(null);
9
+ useEffect(() => {
10
+ const el = ref.current;
11
+ if (!el || prefersReducedMotion())
12
+ return;
13
+ init(el, { maxTilt, scale, perspective, duration });
14
+ return () => {
15
+ destroy(el);
16
+ };
17
+ }, [maxTilt, scale, perspective, duration]);
18
+ return React.cloneElement(React.Children.only(children), { ref });
19
+ }
20
+
21
+ export { AnimTiltedCard };
@@ -0,0 +1,65 @@
1
+ import { p as prefersReducedMotion } from '../chunks/reduced-motion-HX79Ac8G.js';
2
+ import { a as attachPointerFollow, g as getPointerMetrics } from '../chunks/pointer-follow-BETANySn.js';
3
+ import { b as buildAnimId, a as buildAnimClass } from '../chunks/constants-EnH6-Pz4.js';
4
+
5
+ const ANIMATION_ID = buildAnimId('tilted-card');
6
+
7
+ const CSS_CLASS = buildAnimClass('tilted-card');
8
+ const stateMap = new WeakMap();
9
+
10
+ function reset(el) {
11
+ el.style.setProperty('--readdy-anim-card-tilt-x', '0deg');
12
+ el.style.setProperty('--readdy-anim-card-tilt-y', '0deg');
13
+ el.style.setProperty('--readdy-anim-card-scale', '1');
14
+ }
15
+
16
+ function init(el, options = {}) {
17
+ destroy(el);
18
+
19
+ el.classList.add(CSS_CLASS);
20
+ reset(el);
21
+
22
+ const perspective = options.perspective ?? 900;
23
+ const duration = options.duration ?? 550;
24
+ el.style.setProperty('--readdy-anim-card-tilt-perspective', `${perspective}px`);
25
+ el.style.setProperty('--readdy-anim-card-tilt-duration', `${duration}ms`);
26
+
27
+ if (prefersReducedMotion()) {
28
+ return
29
+ }
30
+
31
+ const maxTilt = options.maxTilt ?? 10;
32
+ const scale = options.scale ?? 1.02;
33
+
34
+ const onMove = (event, context) => {
35
+ const { relativeX, relativeY } = getPointerMetrics(context.rect, event);
36
+
37
+ el.style.setProperty('--readdy-anim-card-tilt-x', `${relativeY * -maxTilt * 2}deg`);
38
+ el.style.setProperty('--readdy-anim-card-tilt-y', `${relativeX * maxTilt * 2}deg`);
39
+ el.style.setProperty('--readdy-anim-card-scale', `${scale}`);
40
+ };
41
+
42
+ const onLeave = () => {
43
+ reset(el);
44
+ };
45
+
46
+ const cleanup = attachPointerFollow(el, { onMove, onLeave });
47
+ stateMap.set(el, { cleanup });
48
+ }
49
+
50
+ function destroy(el) {
51
+ const state = stateMap.get(el);
52
+ if (state) {
53
+ state.cleanup();
54
+ stateMap.delete(el);
55
+ }
56
+
57
+ el.classList.remove(CSS_CLASS);
58
+ el.style.removeProperty('--readdy-anim-card-tilt-x');
59
+ el.style.removeProperty('--readdy-anim-card-tilt-y');
60
+ el.style.removeProperty('--readdy-anim-card-scale');
61
+ el.style.removeProperty('--readdy-anim-card-tilt-perspective');
62
+ el.style.removeProperty('--readdy-anim-card-tilt-duration');
63
+ }
64
+
65
+ export { ANIMATION_ID, destroy, init };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @readdy/anim/shared/constants.js
3
+ *
4
+ * 共享常量 —— 动效 ID 前缀、class 前缀、ID 构建器
5
+ * 解决 issues #2:动效 ID 前缀不一致
6
+ */
7
+
8
+ /** 动效 ID 前缀,统一格式 */
9
+ const ANIM_ID_PREFIX = 'readdy-anim-';
10
+
11
+ /** CSS class 前缀 */
12
+ const ANIM_CLASS_PREFIX = 'readdy-anim-';
13
+
14
+ /**
15
+ * 构建动效 CSS class
16
+ * @param {string} name - class 后缀,如 'text-type'
17
+ * @returns {string} 完整 class,如 'readdy-anim-text-type'
18
+ */
19
+ function buildAnimClass(name) {
20
+ return ANIM_CLASS_PREFIX + name
21
+ }
22
+
23
+ /**
24
+ * 构建动效相关 DOM id
25
+ * 目前与 class 前缀保持一致,便于 SVG filter / portal 节点等共享同一命名空间。
26
+ *
27
+ * @param {string} name - id 后缀,如 'bubble-goo'
28
+ * @returns {string} 完整 id,如 'readdy-anim-bubble-goo'
29
+ */
30
+ function buildAnimDomId(name) {
31
+ return ANIM_CLASS_PREFIX + name
32
+ }
33
+
34
+ /**
35
+ * 构建动效规范 ID
36
+ * 统一接受动效 slug,例如:
37
+ * - buildAnimId('letter-bounce') => 'readdy-anim-letter-bounce'
38
+ * - buildAnimId('bubble-button') => 'readdy-anim-bubble-button'
39
+ *
40
+ * @param {string} name - 动效 slug
41
+ * @returns {string} 规范 ID
42
+ */
43
+ function buildAnimId(name) {
44
+ const slug = String(name).trim();
45
+
46
+ if (!slug) {
47
+ throw new Error('buildAnimId(name) requires a non-empty animation slug')
48
+ }
49
+
50
+ if (slug.includes('/')) {
51
+ throw new Error(`buildAnimId(name) only accepts animation slugs, received path-like value: ${slug}`)
52
+ }
53
+
54
+ const normalizedSlug = slug
55
+ .replace(/[^a-zA-Z0-9]+/g, '-')
56
+ .replace(/^-+|-+$/g, '')
57
+ .toLowerCase();
58
+
59
+ if (!normalizedSlug) {
60
+ throw new Error(`buildAnimId(name) could not derive a valid animation slug from: ${slug}`)
61
+ }
62
+
63
+ return ANIM_ID_PREFIX + normalizedSlug
64
+ }
65
+
66
+ export { buildAnimClass as a, buildAnimId as b, buildAnimDomId as c };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @readdy/anim/shared/constants.js
3
+ *
4
+ * 共享常量 —— 动效 ID 前缀、class 前缀、ID 构建器
5
+ * 解决 issues #2:动效 ID 前缀不一致
6
+ */
7
+
8
+ /** 动效 ID 前缀,统一格式 */
9
+ const ANIM_ID_PREFIX = 'readdy-anim-';
10
+
11
+ /** CSS class 前缀 */
12
+ const ANIM_CLASS_PREFIX = 'readdy-anim-';
13
+
14
+ /**
15
+ * 构建动效 CSS class
16
+ * @param {string} name - class 后缀,如 'text-type'
17
+ * @returns {string} 完整 class,如 'readdy-anim-text-type'
18
+ */
19
+ function buildAnimClass(name) {
20
+ return ANIM_CLASS_PREFIX + name
21
+ }
22
+
23
+ /**
24
+ * 构建动效相关 DOM id
25
+ * 目前与 class 前缀保持一致,便于 SVG filter / portal 节点等共享同一命名空间。
26
+ *
27
+ * @param {string} name - id 后缀,如 'bubble-goo'
28
+ * @returns {string} 完整 id,如 'readdy-anim-bubble-goo'
29
+ */
30
+ function buildAnimDomId(name) {
31
+ return ANIM_CLASS_PREFIX + name
32
+ }
33
+
34
+ /**
35
+ * 构建动效规范 ID
36
+ * 统一接受动效 slug,例如:
37
+ * - buildAnimId('letter-bounce') => 'readdy-anim-letter-bounce'
38
+ * - buildAnimId('bubble-button') => 'readdy-anim-bubble-button'
39
+ *
40
+ * @param {string} name - 动效 slug
41
+ * @returns {string} 规范 ID
42
+ */
43
+ function buildAnimId(name) {
44
+ const slug = String(name).trim();
45
+
46
+ if (!slug) {
47
+ throw new Error('buildAnimId(name) requires a non-empty animation slug')
48
+ }
49
+
50
+ if (slug.includes('/')) {
51
+ throw new Error(`buildAnimId(name) only accepts animation slugs, received path-like value: ${slug}`)
52
+ }
53
+
54
+ const normalizedSlug = slug
55
+ .replace(/[^a-zA-Z0-9]+/g, '-')
56
+ .replace(/^-+|-+$/g, '')
57
+ .toLowerCase();
58
+
59
+ if (!normalizedSlug) {
60
+ throw new Error(`buildAnimId(name) could not derive a valid animation slug from: ${slug}`)
61
+ }
62
+
63
+ return ANIM_ID_PREFIX + normalizedSlug
64
+ }
65
+
66
+ export { buildAnimClass as a, buildAnimId as b, buildAnimDomId as c };
@@ -0,0 +1,93 @@
1
+ function getPointerMetrics(target, event) {
2
+ const rect =
3
+ target && typeof target.getBoundingClientRect === 'function'
4
+ ? target.getBoundingClientRect()
5
+ : target;
6
+ const centerX = rect.left + rect.width / 2;
7
+ const centerY = rect.top + rect.height / 2;
8
+ const deltaX = event.clientX - centerX;
9
+ const deltaY = event.clientY - centerY;
10
+
11
+ return {
12
+ rect,
13
+ deltaX,
14
+ deltaY,
15
+ relativeX: rect.width ? deltaX / rect.width : 0,
16
+ relativeY: rect.height ? deltaY / rect.height : 0,
17
+ }
18
+ }
19
+
20
+ function attachPointerFollow(el, handlers) {
21
+ const { onMove, onLeave, onEnter } = handlers;
22
+ const requestFrame =
23
+ window.requestAnimationFrame?.bind(window) ?? ((callback) => window.setTimeout(callback, 16));
24
+ const cancelFrame =
25
+ window.cancelAnimationFrame?.bind(window) ?? ((frameId) => window.clearTimeout(frameId));
26
+
27
+ let frameId = null;
28
+ let lastEvent = null;
29
+ let activeRect = null;
30
+
31
+ const context = {
32
+ get rect() {
33
+ return activeRect
34
+ },
35
+ refreshRect() {
36
+ activeRect = el.getBoundingClientRect();
37
+ return activeRect
38
+ },
39
+ getMetrics(event) {
40
+ return getPointerMetrics(activeRect ?? context.refreshRect(), event)
41
+ },
42
+ };
43
+
44
+ const flushMove = () => {
45
+ frameId = null;
46
+ if (!lastEvent) {
47
+ return
48
+ }
49
+ if (!activeRect) {
50
+ context.refreshRect();
51
+ }
52
+ onMove(lastEvent, context);
53
+ };
54
+
55
+ const handleEnter = (event) => {
56
+ context.refreshRect();
57
+ onEnter?.(event, context);
58
+ };
59
+
60
+ const handleMove = (event) => {
61
+ lastEvent = event;
62
+ if (frameId !== null) {
63
+ return
64
+ }
65
+ frameId = requestFrame(flushMove);
66
+ };
67
+
68
+ const handleLeave = (event) => {
69
+ if (frameId !== null) {
70
+ cancelFrame(frameId);
71
+ frameId = null;
72
+ }
73
+ lastEvent = null;
74
+ activeRect = null;
75
+ onLeave?.(event, context);
76
+ };
77
+
78
+ el.addEventListener('pointerenter', handleEnter);
79
+ el.addEventListener('pointermove', handleMove);
80
+ el.addEventListener('pointerleave', handleLeave);
81
+
82
+ return () => {
83
+ if (frameId !== null) {
84
+ cancelFrame(frameId);
85
+ frameId = null;
86
+ }
87
+ el.removeEventListener('pointerenter', handleEnter);
88
+ el.removeEventListener('pointermove', handleMove);
89
+ el.removeEventListener('pointerleave', handleLeave);
90
+ }
91
+ }
92
+
93
+ export { attachPointerFollow as a, getPointerMetrics as g };
@@ -0,0 +1,93 @@
1
+ function getPointerMetrics(target, event) {
2
+ const rect =
3
+ target && typeof target.getBoundingClientRect === 'function'
4
+ ? target.getBoundingClientRect()
5
+ : target;
6
+ const centerX = rect.left + rect.width / 2;
7
+ const centerY = rect.top + rect.height / 2;
8
+ const deltaX = event.clientX - centerX;
9
+ const deltaY = event.clientY - centerY;
10
+
11
+ return {
12
+ rect,
13
+ deltaX,
14
+ deltaY,
15
+ relativeX: rect.width ? deltaX / rect.width : 0,
16
+ relativeY: rect.height ? deltaY / rect.height : 0,
17
+ }
18
+ }
19
+
20
+ function attachPointerFollow(el, handlers) {
21
+ const { onMove, onLeave, onEnter } = handlers;
22
+ const requestFrame =
23
+ window.requestAnimationFrame?.bind(window) ?? ((callback) => window.setTimeout(callback, 16));
24
+ const cancelFrame =
25
+ window.cancelAnimationFrame?.bind(window) ?? ((frameId) => window.clearTimeout(frameId));
26
+
27
+ let frameId = null;
28
+ let lastEvent = null;
29
+ let activeRect = null;
30
+
31
+ const context = {
32
+ get rect() {
33
+ return activeRect
34
+ },
35
+ refreshRect() {
36
+ activeRect = el.getBoundingClientRect();
37
+ return activeRect
38
+ },
39
+ getMetrics(event) {
40
+ return getPointerMetrics(activeRect ?? context.refreshRect(), event)
41
+ },
42
+ };
43
+
44
+ const flushMove = () => {
45
+ frameId = null;
46
+ if (!lastEvent) {
47
+ return
48
+ }
49
+ if (!activeRect) {
50
+ context.refreshRect();
51
+ }
52
+ onMove(lastEvent, context);
53
+ };
54
+
55
+ const handleEnter = (event) => {
56
+ context.refreshRect();
57
+ onEnter?.(event, context);
58
+ };
59
+
60
+ const handleMove = (event) => {
61
+ lastEvent = event;
62
+ if (frameId !== null) {
63
+ return
64
+ }
65
+ frameId = requestFrame(flushMove);
66
+ };
67
+
68
+ const handleLeave = (event) => {
69
+ if (frameId !== null) {
70
+ cancelFrame(frameId);
71
+ frameId = null;
72
+ }
73
+ lastEvent = null;
74
+ activeRect = null;
75
+ onLeave?.(event, context);
76
+ };
77
+
78
+ el.addEventListener('pointerenter', handleEnter);
79
+ el.addEventListener('pointermove', handleMove);
80
+ el.addEventListener('pointerleave', handleLeave);
81
+
82
+ return () => {
83
+ if (frameId !== null) {
84
+ cancelFrame(frameId);
85
+ frameId = null;
86
+ }
87
+ el.removeEventListener('pointerenter', handleEnter);
88
+ el.removeEventListener('pointermove', handleMove);
89
+ el.removeEventListener('pointerleave', handleLeave);
90
+ }
91
+ }
92
+
93
+ export { attachPointerFollow as a, getPointerMetrics as g };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @readdy/anim/shared/reduced-motion.js
3
+ *
4
+ * 无障碍工具 —— 检测 prefers-reduced-motion
5
+ * 所有 React 组件和 init 函数统一使用此函数
6
+ */
7
+
8
+ /**
9
+ * 检测用户是否偏好减少动画
10
+ * @returns {boolean} true 表示用户偏好减少动画
11
+ */
12
+ function prefersReducedMotion() {
13
+ return typeof window !== 'undefined' &&
14
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches
15
+ }
16
+
17
+ export { prefersReducedMotion as p };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @readdy/anim/shared/reduced-motion.js
3
+ *
4
+ * 无障碍工具 —— 检测 prefers-reduced-motion
5
+ * 所有 React 组件和 init 函数统一使用此函数
6
+ */
7
+
8
+ /**
9
+ * 检测用户是否偏好减少动画
10
+ * @returns {boolean} true 表示用户偏好减少动画
11
+ */
12
+ function prefersReducedMotion() {
13
+ return typeof window !== 'undefined' &&
14
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches
15
+ }
16
+
17
+ export { prefersReducedMotion as p };
@@ -0,0 +1,43 @@
1
+ function hasUsableBackgroundImage(node) {
2
+ const style = window.getComputedStyle(node);
3
+ return Boolean(style.backgroundImage && style.backgroundImage !== 'none')
4
+ }
5
+
6
+ function resolveCardMediaElement(el, mediaClass) {
7
+ const byClass = el.querySelector(`.${mediaClass}`);
8
+ if (byClass instanceof HTMLElement) {
9
+ return byClass
10
+ }
11
+
12
+ const image = el.querySelector('img');
13
+ if (image instanceof HTMLImageElement) {
14
+ let candidate = image.parentElement;
15
+ while (candidate && candidate !== el) {
16
+ const style = window.getComputedStyle(candidate);
17
+ if (
18
+ style.overflow === 'hidden' ||
19
+ style.position !== 'static' ||
20
+ candidate.childElementCount === 1 ||
21
+ hasUsableBackgroundImage(candidate)
22
+ ) {
23
+ return candidate
24
+ }
25
+ candidate = candidate.parentElement;
26
+ }
27
+ }
28
+
29
+ const backgroundCandidate = Array.from(el.querySelectorAll('*')).find((node) => {
30
+ if (!(node instanceof HTMLElement)) {
31
+ return false
32
+ }
33
+ return hasUsableBackgroundImage(node)
34
+ });
35
+
36
+ if (backgroundCandidate instanceof HTMLElement) {
37
+ return backgroundCandidate
38
+ }
39
+
40
+ return el.firstElementChild instanceof HTMLElement ? el.firstElementChild : el
41
+ }
42
+
43
+ export { resolveCardMediaElement as r };
@@ -0,0 +1,43 @@
1
+ function hasUsableBackgroundImage(node) {
2
+ const style = window.getComputedStyle(node);
3
+ return Boolean(style.backgroundImage && style.backgroundImage !== 'none')
4
+ }
5
+
6
+ function resolveCardMediaElement(el, mediaClass) {
7
+ const byClass = el.querySelector(`.${mediaClass}`);
8
+ if (byClass instanceof HTMLElement) {
9
+ return byClass
10
+ }
11
+
12
+ const image = el.querySelector('img');
13
+ if (image instanceof HTMLImageElement) {
14
+ let candidate = image.parentElement;
15
+ while (candidate && candidate !== el) {
16
+ const style = window.getComputedStyle(candidate);
17
+ if (
18
+ style.overflow === 'hidden' ||
19
+ style.position !== 'static' ||
20
+ candidate.childElementCount === 1 ||
21
+ hasUsableBackgroundImage(candidate)
22
+ ) {
23
+ return candidate
24
+ }
25
+ candidate = candidate.parentElement;
26
+ }
27
+ }
28
+
29
+ const backgroundCandidate = Array.from(el.querySelectorAll('*')).find((node) => {
30
+ if (!(node instanceof HTMLElement)) {
31
+ return false
32
+ }
33
+ return hasUsableBackgroundImage(node)
34
+ });
35
+
36
+ if (backgroundCandidate instanceof HTMLElement) {
37
+ return backgroundCandidate
38
+ }
39
+
40
+ return el.firstElementChild instanceof HTMLElement ? el.firstElementChild : el
41
+ }
42
+
43
+ export { resolveCardMediaElement as r };