@mova-ui/react 0.1.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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -0
  3. package/bin/mova.mjs +84 -0
  4. package/dist/hooks/use-mouse-position.d.ts +8 -0
  5. package/dist/hooks/use-reduced-motion.d.ts +1 -0
  6. package/dist/hooks/use-scroll-progress.d.ts +2 -0
  7. package/dist/hooks/use-stagger.d.ts +7 -0
  8. package/dist/hooks/use-web-haptics.d.ts +4 -0
  9. package/dist/index.d.ts +164 -0
  10. package/dist/index.js +4032 -0
  11. package/dist/lib/presets.d.ts +32 -0
  12. package/dist/lib/utils.d.ts +3 -0
  13. package/dist/styles.css +2 -0
  14. package/dist/ui/cursor/cursor-trail.d.ts +8 -0
  15. package/dist/ui/cursor/mouse-follow.d.ts +9 -0
  16. package/dist/ui/cursor/spotlight.d.ts +9 -0
  17. package/dist/ui/entrance/fade-down.d.ts +10 -0
  18. package/dist/ui/entrance/fade-in.d.ts +9 -0
  19. package/dist/ui/entrance/fade-up.d.ts +10 -0
  20. package/dist/ui/entrance/scale-in.d.ts +10 -0
  21. package/dist/ui/entrance/slide-left.d.ts +10 -0
  22. package/dist/ui/entrance/slide-right.d.ts +10 -0
  23. package/dist/ui/entrance/zoom-in.d.ts +11 -0
  24. package/dist/ui/hover/card-hover.d.ts +13 -0
  25. package/dist/ui/hover/glow-button.d.ts +10 -0
  26. package/dist/ui/hover/magnetic-button.d.ts +10 -0
  27. package/dist/ui/hover/tilt-card.d.ts +9 -0
  28. package/dist/ui/loading/accordion-loader.d.ts +2 -0
  29. package/dist/ui/loading/app-icon-load.d.ts +2 -0
  30. package/dist/ui/loading/apple-breathe.d.ts +2 -0
  31. package/dist/ui/loading/apple-equalizer.d.ts +2 -0
  32. package/dist/ui/loading/apple-icon-morph.d.ts +2 -0
  33. package/dist/ui/loading/apple-pulse-dots.d.ts +2 -0
  34. package/dist/ui/loading/apple-scale-pulse.d.ts +2 -0
  35. package/dist/ui/loading/apple-sound-wave.d.ts +2 -0
  36. package/dist/ui/loading/apple-text-reveal.d.ts +2 -0
  37. package/dist/ui/loading/apple-unlock.d.ts +4 -0
  38. package/dist/ui/loading/arc-tracer.d.ts +2 -0
  39. package/dist/ui/loading/bar-cascade.d.ts +2 -0
  40. package/dist/ui/loading/bar-sweep.d.ts +2 -0
  41. package/dist/ui/loading/bobbing-dots.d.ts +2 -0
  42. package/dist/ui/loading/bounce-dots.d.ts +2 -0
  43. package/dist/ui/loading/bouncing-bars.d.ts +2 -0
  44. package/dist/ui/loading/bouncing-dots.d.ts +2 -0
  45. package/dist/ui/loading/bouncing-lines.d.ts +2 -0
  46. package/dist/ui/loading/bouncing-square.d.ts +2 -0
  47. package/dist/ui/loading/breathe-ring.d.ts +2 -0
  48. package/dist/ui/loading/breathing-glow.d.ts +2 -0
  49. package/dist/ui/loading/breathing-square.d.ts +2 -0
  50. package/dist/ui/loading/circular-bars.d.ts +2 -0
  51. package/dist/ui/loading/classic-spinner.d.ts +2 -0
  52. package/dist/ui/loading/clock-spinner.d.ts +2 -0
  53. package/dist/ui/loading/comet-spinner.d.ts +2 -0
  54. package/dist/ui/loading/concentric-pulse.d.ts +2 -0
  55. package/dist/ui/loading/concentric-ring.d.ts +2 -0
  56. package/dist/ui/loading/concentric-squares.d.ts +2 -0
  57. package/dist/ui/loading/conveyor-loop.d.ts +2 -0
  58. package/dist/ui/loading/cross-spinner.d.ts +2 -0
  59. package/dist/ui/loading/cube-flip-spring.d.ts +2 -0
  60. package/dist/ui/loading/dash-ring.d.ts +2 -0
  61. package/dist/ui/loading/dashed-spiral.d.ts +2 -0
  62. package/dist/ui/loading/diamond-grid.d.ts +2 -0
  63. package/dist/ui/loading/diamond-rotate-spring.d.ts +2 -0
  64. package/dist/ui/loading/dot-spinner.d.ts +2 -0
  65. package/dist/ui/loading/dots-ring.d.ts +2 -0
  66. package/dist/ui/loading/double-ring.d.ts +2 -0
  67. package/dist/ui/loading/drop-dot.d.ts +2 -0
  68. package/dist/ui/loading/dual-arc.d.ts +2 -0
  69. package/dist/ui/loading/dynamic-island.d.ts +2 -0
  70. package/dist/ui/loading/elastic-bars.d.ts +2 -0
  71. package/dist/ui/loading/elastic-square.d.ts +2 -0
  72. package/dist/ui/loading/expanding-cross.d.ts +2 -0
  73. package/dist/ui/loading/face-id-scan.d.ts +2 -0
  74. package/dist/ui/loading/fade-arc.d.ts +2 -0
  75. package/dist/ui/loading/fade-dots.d.ts +2 -0
  76. package/dist/ui/loading/flip-square.d.ts +2 -0
  77. package/dist/ui/loading/floating-diamonds.d.ts +2 -0
  78. package/dist/ui/loading/fluid-bars.d.ts +2 -0
  79. package/dist/ui/loading/fluid-diamond.d.ts +2 -0
  80. package/dist/ui/loading/fluid-dot-orbit.d.ts +2 -0
  81. package/dist/ui/loading/fluid-skeleton.d.ts +2 -0
  82. package/dist/ui/loading/gears.d.ts +2 -0
  83. package/dist/ui/loading/glassmorphic-card.d.ts +2 -0
  84. package/dist/ui/loading/gradient-arc.d.ts +2 -0
  85. package/dist/ui/loading/grid-dots.d.ts +2 -0
  86. package/dist/ui/loading/haptic-ring.d.ts +2 -0
  87. package/dist/ui/loading/heartbeat.d.ts +2 -0
  88. package/dist/ui/loading/hexagon-spinner.d.ts +2 -0
  89. package/dist/ui/loading/hourglass.d.ts +2 -0
  90. package/dist/ui/loading/infinity-path.d.ts +2 -0
  91. package/dist/ui/loading/intersecting-rings.d.ts +2 -0
  92. package/dist/ui/loading/ios-spinner.d.ts +2 -0
  93. package/dist/ui/loading/line-spinner.d.ts +2 -0
  94. package/dist/ui/loading/liquid-dots.d.ts +2 -0
  95. package/dist/ui/loading/mac-terminal.d.ts +2 -0
  96. package/dist/ui/loading/magnetic-dots.d.ts +2 -0
  97. package/dist/ui/loading/minimal-triangle.d.ts +2 -0
  98. package/dist/ui/loading/morph-dot-ring.d.ts +2 -0
  99. package/dist/ui/loading/morph-loader.d.ts +8 -0
  100. package/dist/ui/loading/morphing-bars.d.ts +2 -0
  101. package/dist/ui/loading/morphing-infinity.d.ts +2 -0
  102. package/dist/ui/loading/morphing-ring.d.ts +2 -0
  103. package/dist/ui/loading/morphing-shape.d.ts +2 -0
  104. package/dist/ui/loading/newtons-cradle.d.ts +2 -0
  105. package/dist/ui/loading/offset-rings.d.ts +2 -0
  106. package/dist/ui/loading/orbiting-circles.d.ts +2 -0
  107. package/dist/ui/loading/orbiting-dot.d.ts +2 -0
  108. package/dist/ui/loading/origami-shape.d.ts +2 -0
  109. package/dist/ui/loading/pendulum.d.ts +2 -0
  110. package/dist/ui/loading/pulsating-dots.d.ts +2 -0
  111. package/dist/ui/loading/pulse-dot.d.ts +2 -0
  112. package/dist/ui/loading/pulse-dots.d.ts +2 -0
  113. package/dist/ui/loading/pulse-square.d.ts +2 -0
  114. package/dist/ui/loading/pulse.d.ts +8 -0
  115. package/dist/ui/loading/pumping-heart.d.ts +2 -0
  116. package/dist/ui/loading/radar-sweep.d.ts +4 -0
  117. package/dist/ui/loading/ring-sweep.d.ts +2 -0
  118. package/dist/ui/loading/ripple-effect.d.ts +2 -0
  119. package/dist/ui/loading/rotating-cross.d.ts +2 -0
  120. package/dist/ui/loading/rotating-triangle.d.ts +2 -0
  121. package/dist/ui/loading/shape-shift-grid.d.ts +2 -0
  122. package/dist/ui/loading/shimmer-line.d.ts +2 -0
  123. package/dist/ui/loading/siri-wave.d.ts +2 -0
  124. package/dist/ui/loading/skeleton-loader.d.ts +2 -0
  125. package/dist/ui/loading/skeleton.d.ts +7 -0
  126. package/dist/ui/loading/sliding-bars.d.ts +2 -0
  127. package/dist/ui/loading/smooth-dot-shift.d.ts +2 -0
  128. package/dist/ui/loading/smooth-ring.d.ts +2 -0
  129. package/dist/ui/loading/smooth-rounded-square.d.ts +2 -0
  130. package/dist/ui/loading/spinning-squares.d.ts +2 -0
  131. package/dist/ui/loading/spiral-spinner.d.ts +2 -0
  132. package/dist/ui/loading/spring-bars.d.ts +2 -0
  133. package/dist/ui/loading/spring-dot-matrix.d.ts +2 -0
  134. package/dist/ui/loading/spring-hexagon.d.ts +2 -0
  135. package/dist/ui/loading/spring-ring-expand.d.ts +2 -0
  136. package/dist/ui/loading/spring-text-pop.d.ts +2 -0
  137. package/dist/ui/loading/square-accordion.d.ts +2 -0
  138. package/dist/ui/loading/square-grid.d.ts +2 -0
  139. package/dist/ui/loading/square-snake.d.ts +2 -0
  140. package/dist/ui/loading/square-spinner.d.ts +2 -0
  141. package/dist/ui/loading/stacked-bar-pulse.d.ts +2 -0
  142. package/dist/ui/loading/swapping-dots.d.ts +2 -0
  143. package/dist/ui/loading/swirling-spinner.d.ts +2 -0
  144. package/dist/ui/loading/symmetric-wave.d.ts +2 -0
  145. package/dist/ui/loading/terminal-loader.d.ts +2 -0
  146. package/dist/ui/loading/text-blink.d.ts +2 -0
  147. package/dist/ui/loading/text-dots.d.ts +2 -0
  148. package/dist/ui/loading/text-morph.d.ts +2 -0
  149. package/dist/ui/loading/text-shimmer-wave.d.ts +2 -0
  150. package/dist/ui/loading/text-shimmer.d.ts +2 -0
  151. package/dist/ui/loading/trailing-dots.d.ts +2 -0
  152. package/dist/ui/loading/triple-dot-spinner.d.ts +2 -0
  153. package/dist/ui/loading/twin-orbit.d.ts +2 -0
  154. package/dist/ui/loading/typing-indicator.d.ts +2 -0
  155. package/dist/ui/loading/typing.d.ts +2 -0
  156. package/dist/ui/loading/wandering-cube.d.ts +2 -0
  157. package/dist/ui/loading/watch-spinner.d.ts +2 -0
  158. package/dist/ui/loading/wave-dots.d.ts +2 -0
  159. package/dist/ui/loading/wave-physics-loader.d.ts +3 -0
  160. package/dist/ui/loading/waveform-loader.d.ts +2 -0
  161. package/dist/ui/loading/zig-zag-pulse.d.ts +2 -0
  162. package/dist/ui/scroll/progress-indicator.d.ts +8 -0
  163. package/dist/ui/scroll/scroll-reveal.d.ts +11 -0
  164. package/dist/ui/scroll/sticky-reveal.d.ts +11 -0
  165. package/dist/ui/text/blur-text.d.ts +10 -0
  166. package/dist/ui/text/character-stagger.d.ts +10 -0
  167. package/dist/ui/text/text-reveal.d.ts +9 -0
  168. package/dist/ui/text/word-reveal.d.ts +9 -0
  169. package/dist/ui/toggles/classic-toggle.d.ts +2 -0
  170. package/dist/ui/transitions/page-transition.d.ts +9 -0
  171. package/package.json +27 -0
  172. package/registry/accordion-loader.json +8 -0
  173. package/registry/app-icon-load.json +8 -0
  174. package/registry/apple-breathe.json +8 -0
  175. package/registry/apple-equalizer.json +8 -0
  176. package/registry/apple-icon-morph.json +8 -0
  177. package/registry/apple-pulse-dots.json +8 -0
  178. package/registry/apple-scale-pulse.json +8 -0
  179. package/registry/apple-sound-wave.json +8 -0
  180. package/registry/apple-text-reveal.json +8 -0
  181. package/registry/apple-unlock.json +8 -0
  182. package/registry/arc-tracer.json +8 -0
  183. package/registry/bar-cascade.json +8 -0
  184. package/registry/bar-sweep.json +8 -0
  185. package/registry/blur-text.json +8 -0
  186. package/registry/bobbing-dots.json +8 -0
  187. package/registry/bounce-dots.json +8 -0
  188. package/registry/bouncing-bars.json +8 -0
  189. package/registry/bouncing-dots.json +8 -0
  190. package/registry/bouncing-lines.json +8 -0
  191. package/registry/bouncing-square.json +8 -0
  192. package/registry/breathe-ring.json +8 -0
  193. package/registry/breathing-glow.json +8 -0
  194. package/registry/breathing-square.json +8 -0
  195. package/registry/card-hover.json +8 -0
  196. package/registry/character-stagger.json +8 -0
  197. package/registry/circular-bars.json +8 -0
  198. package/registry/classic-spinner.json +8 -0
  199. package/registry/classic-toggle.json +8 -0
  200. package/registry/clock-spinner.json +8 -0
  201. package/registry/comet-spinner.json +8 -0
  202. package/registry/concentric-pulse.json +8 -0
  203. package/registry/concentric-ring.json +8 -0
  204. package/registry/concentric-squares.json +8 -0
  205. package/registry/conveyor-loop.json +8 -0
  206. package/registry/cross-spinner.json +8 -0
  207. package/registry/cube-flip-spring.json +8 -0
  208. package/registry/cursor-trail.json +8 -0
  209. package/registry/dash-ring.json +8 -0
  210. package/registry/dashed-spiral.json +8 -0
  211. package/registry/diamond-grid.json +8 -0
  212. package/registry/diamond-rotate-spring.json +8 -0
  213. package/registry/dot-spinner.json +8 -0
  214. package/registry/dots-ring.json +8 -0
  215. package/registry/double-ring.json +8 -0
  216. package/registry/drop-dot.json +8 -0
  217. package/registry/dual-arc.json +8 -0
  218. package/registry/dynamic-island.json +8 -0
  219. package/registry/elastic-bars.json +8 -0
  220. package/registry/elastic-square.json +8 -0
  221. package/registry/expanding-cross.json +8 -0
  222. package/registry/face-id-scan.json +8 -0
  223. package/registry/fade-arc.json +6 -0
  224. package/registry/fade-dots.json +8 -0
  225. package/registry/fade-down.json +8 -0
  226. package/registry/fade-in.json +8 -0
  227. package/registry/fade-up.json +8 -0
  228. package/registry/flip-square.json +8 -0
  229. package/registry/floating-diamonds.json +8 -0
  230. package/registry/fluid-bars.json +8 -0
  231. package/registry/fluid-diamond.json +8 -0
  232. package/registry/fluid-dot-orbit.json +8 -0
  233. package/registry/fluid-skeleton.json +8 -0
  234. package/registry/gears.json +8 -0
  235. package/registry/glassmorphic-card.json +8 -0
  236. package/registry/glow-button.json +8 -0
  237. package/registry/gradient-arc.json +8 -0
  238. package/registry/grid-dots.json +8 -0
  239. package/registry/haptic-ring.json +8 -0
  240. package/registry/heartbeat.json +8 -0
  241. package/registry/hexagon-spinner.json +8 -0
  242. package/registry/hourglass.json +8 -0
  243. package/registry/infinity-path.json +8 -0
  244. package/registry/intersecting-rings.json +8 -0
  245. package/registry/ios-spinner.json +8 -0
  246. package/registry/line-spinner.json +8 -0
  247. package/registry/liquid-dots.json +8 -0
  248. package/registry/mac-terminal.json +8 -0
  249. package/registry/magnetic-button.json +8 -0
  250. package/registry/magnetic-dots.json +8 -0
  251. package/registry/minimal-triangle.json +8 -0
  252. package/registry/morph-dot-ring.json +8 -0
  253. package/registry/morph-loader.json +8 -0
  254. package/registry/morphing-bars.json +8 -0
  255. package/registry/morphing-infinity.json +8 -0
  256. package/registry/morphing-ring.json +8 -0
  257. package/registry/morphing-shape.json +8 -0
  258. package/registry/mouse-follow.json +8 -0
  259. package/registry/newtons-cradle.json +8 -0
  260. package/registry/offset-rings.json +8 -0
  261. package/registry/orbiting-circles.json +8 -0
  262. package/registry/orbiting-dot.json +8 -0
  263. package/registry/origami-shape.json +8 -0
  264. package/registry/page-transition.json +8 -0
  265. package/registry/pendulum.json +8 -0
  266. package/registry/presets.json +6 -0
  267. package/registry/progress-indicator.json +8 -0
  268. package/registry/pulsating-dots.json +8 -0
  269. package/registry/pulse-dot.json +8 -0
  270. package/registry/pulse-dots.json +8 -0
  271. package/registry/pulse-square.json +8 -0
  272. package/registry/pulse.json +8 -0
  273. package/registry/pumping-heart.json +8 -0
  274. package/registry/radar-sweep.json +8 -0
  275. package/registry/ring-sweep.json +8 -0
  276. package/registry/ripple-effect.json +8 -0
  277. package/registry/rotating-cross.json +8 -0
  278. package/registry/rotating-triangle.json +8 -0
  279. package/registry/scale-in.json +8 -0
  280. package/registry/scroll-reveal.json +8 -0
  281. package/registry/shape-shift-grid.json +8 -0
  282. package/registry/shimmer-line.json +8 -0
  283. package/registry/siri-wave.json +8 -0
  284. package/registry/skeleton-loader.json +8 -0
  285. package/registry/skeleton.json +8 -0
  286. package/registry/slide-left.json +8 -0
  287. package/registry/slide-right.json +8 -0
  288. package/registry/sliding-bars.json +8 -0
  289. package/registry/smooth-dot-shift.json +8 -0
  290. package/registry/smooth-ring.json +6 -0
  291. package/registry/smooth-rounded-square.json +8 -0
  292. package/registry/spinning-squares.json +8 -0
  293. package/registry/spiral-spinner.json +8 -0
  294. package/registry/spotlight.json +8 -0
  295. package/registry/spring-bars.json +8 -0
  296. package/registry/spring-dot-matrix.json +8 -0
  297. package/registry/spring-hexagon.json +8 -0
  298. package/registry/spring-ring-expand.json +8 -0
  299. package/registry/spring-text-pop.json +8 -0
  300. package/registry/square-accordion.json +8 -0
  301. package/registry/square-grid.json +8 -0
  302. package/registry/square-snake.json +8 -0
  303. package/registry/square-spinner.json +8 -0
  304. package/registry/stacked-bar-pulse.json +8 -0
  305. package/registry/sticky-reveal.json +8 -0
  306. package/registry/swapping-dots.json +8 -0
  307. package/registry/swirling-spinner.json +8 -0
  308. package/registry/symmetric-wave.json +8 -0
  309. package/registry/terminal-loader.json +8 -0
  310. package/registry/text-blink.json +8 -0
  311. package/registry/text-dots.json +8 -0
  312. package/registry/text-morph.json +8 -0
  313. package/registry/text-reveal.json +8 -0
  314. package/registry/text-shimmer-wave.json +8 -0
  315. package/registry/text-shimmer.json +8 -0
  316. package/registry/tilt-card.json +8 -0
  317. package/registry/trailing-dots.json +8 -0
  318. package/registry/triple-dot-spinner.json +8 -0
  319. package/registry/twin-orbit.json +8 -0
  320. package/registry/typing-indicator.json +8 -0
  321. package/registry/typing.json +8 -0
  322. package/registry/use-mouse-position.json +6 -0
  323. package/registry/use-reduced-motion.json +6 -0
  324. package/registry/use-scroll-progress.json +6 -0
  325. package/registry/use-stagger.json +6 -0
  326. package/registry/use-web-haptics.json +6 -0
  327. package/registry/utils.json +9 -0
  328. package/registry/wandering-cube.json +8 -0
  329. package/registry/watch-spinner.json +8 -0
  330. package/registry/wave-dots.json +8 -0
  331. package/registry/wave-physics-loader.json +8 -0
  332. package/registry/waveform-loader.json +8 -0
  333. package/registry/word-reveal.json +8 -0
  334. package/registry/zig-zag-pulse.json +8 -0
  335. package/registry/zoom-in.json +8 -0
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "ios-spinner",
3
+ "file": "ios-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const IOSSpinner = () => (\n <div className=\"relative w-8 h-8\">\n {Array.from({ length: 12 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute w-full h-full\"\n style={{ rotate: i * 30 }}\n >\n <motion.div\n className=\"w-[2px] h-[7px] bg-zinc-800 dark:bg-white rounded-full mx-auto\"\n animate={{ opacity: [1, 0.2] }}\n transition={{ duration: 1, repeat: Infinity, delay: i * (1/12), ease: \"linear\" }}\n />\n </motion.div>\n ))}\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "line-spinner",
3
+ "file": "line-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const LineSpinner = () => {\n return (\n <div className=\"relative w-10 h-10 flex items-center justify-center\">\n <div className=\"w-10 h-10 border-2 border-zinc-200 dark:border-zinc-800 rounded-full absolute\" />\n <motion.div\n className=\"w-8 h-1 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ rotate: 360 }}\n transition={{ duration: 1.2, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "liquid-dots",
3
+ "file": "liquid-dots.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const LiquidDots = () => {\n return (\n <div className=\"relative w-16 h-8 flex items-center justify-center\" style={{ filter: \"url(#goo)\" }}>\n <svg className=\"absolute w-0 h-0\">\n <defs>\n <filter id=\"goo\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"4\" result=\"blur\" />\n <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7\" result=\"goo\" />\n <feBlend in=\"SourceGraphic\" in2=\"goo\" />\n </filter>\n </defs>\n </svg>\n <motion.div\n className=\"absolute w-6 h-6 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ x: [-16, 16, -16] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute w-6 h-6 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ x: [16, -16, 16] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "mac-terminal",
3
+ "file": "mac-terminal.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MacTerminal = () => (\n <div className=\"flex items-center text-zinc-900 dark:text-white font-mono text-sm\">\n <span>~ %</span>\n <motion.span\n className=\"ml-1.5 w-2 h-4 bg-zinc-900 dark:bg-white inline-block\"\n animate={{ opacity: [1, 0, 1] }}\n transition={{ duration: 1, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "magnetic-button",
3
+ "file": "magnetic-button.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useRef, useState } from 'react';\nimport { motion, useSpring } from 'framer-motion';\n\ninterface MagneticButtonProps {\n children: React.ReactNode;\n range?: number;\n strength?: number;\n className?: string;\n onClick?: () => void;\n}\n\nexport function MagneticButton({\n children,\n range = 45,\n strength = 0.35,\n className = '',\n onClick,\n}: MagneticButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n\n const springConfig = { stiffness: 150, damping: 15, mass: 0.6 };\n const x = useSpring(0, springConfig);\n const y = useSpring(0, springConfig);\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!ref.current) return;\n const { clientX, clientY } = e;\n const { left, top, width, height } = ref.current.getBoundingClientRect();\n \n // Center point of the button\n const centerX = left + width / 2;\n const centerY = top + height / 2;\n\n // Calculate distance\n const dist = Math.hypot(clientX - centerX, clientY - centerY);\n\n if (dist < range) {\n // Magnetic pull\n const targetX = (clientX - centerX) * strength;\n const targetY = (clientY - centerY) * strength;\n x.set(targetX);\n y.set(targetY);\n } else {\n // Return to center\n x.set(0);\n y.set(0);\n }\n };\n\n const handleMouseLeave = () => {\n x.set(0);\n y.set(0);\n };\n\n return (\n <motion.button\n ref={ref}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClick={onClick}\n style={{ x, y }}\n className={`relative inline-flex items-center justify-center rounded-full bg-neutral-900 dark:bg-white text-white dark:text-black font-semibold text-sm h-11 px-6 shadow hover:scale-[1.03] transition-all cursor-pointer select-none border-0 ${className}`}\n >\n <span className=\"relative z-10 block pointer-events-none\">{children}</span>\n </motion.button>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "magnetic-dots",
3
+ "file": "magnetic-dots.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MagneticDots = () => (\n <div className=\"flex space-x-1.5\" style={{ filter: \"url(#goo)\" }}>\n <svg width=\"0\" height=\"0\" className=\"absolute hidden\">\n <defs>\n <filter id=\"goo\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"2\" result=\"blur\" />\n <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 15 -7\" result=\"goo\" />\n <feComposite in=\"SourceGraphic\" in2=\"goo\" operator=\"atop\"/>\n </filter>\n </defs>\n </svg>\n <motion.div\n className=\"w-4 h-4 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ x: [0, 8, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"w-4 h-4 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ x: [0, -8, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "minimal-triangle",
3
+ "file": "minimal-triangle.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MinimalTriangle = () => (\n <svg className=\"w-10 h-10 overflow-visible\" viewBox=\"0 0 50 50\">\n <polygon points=\"25,5 45,40 5,40\" className=\"stroke-zinc-200 dark:stroke-zinc-800 fill-none\" strokeWidth=\"3\" />\n <motion.polygon\n points=\"25,5 45,40 5,40\"\n className=\"stroke-zinc-800 dark:stroke-white fill-none\"\n strokeWidth=\"3\"\n strokeDasharray=\"120\"\n animate={{ strokeDashoffset: [120, 0, -120] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </svg>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "morph-dot-ring",
3
+ "file": "morph-dot-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MorphDotRing = () => (\n <motion.div\n className=\"grid grid-cols-2 gap-1 w-6 h-6\"\n animate={{ rotate: 180, gap: [\"4px\", \"0px\", \"4px\"] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n >\n {[0,1,2,3].map(i => <div key={i} className=\"w-full h-full bg-zinc-800 dark:bg-white rounded-full\" />)}\n </motion.div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "morph-loader",
3
+ "file": "morph-loader.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface MorphLoaderProps {\n size?: number;\n color?: string;\n className?: string;\n}\n\nexport function MorphLoader({\n size = 40,\n color = 'bg-blue-500',\n className = '',\n}: MorphLoaderProps) {\n return (\n <div className={`relative flex items-center justify-center ${className}`} style={{ width: size, height: size }}>\n <motion.div\n animate={{\n borderRadius: ['25%', '50%', '50%', '25%', '25%'],\n rotate: [0, 90, 180, 270, 360],\n scale: [1, 0.8, 1.1, 0.8, 1],\n }}\n transition={{\n duration: 2.2,\n ease: 'easeInOut',\n repeat: Infinity,\n }}\n style={{ width: size, height: size }}\n className={`rounded-2xl ${color} shadow-lg`}\n />\n </div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "morphing-bars",
3
+ "file": "morphing-bars.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MorphingBars = () => (\n <motion.div\n className=\"flex space-x-1 h-8 items-center\"\n animate={{ gap: ['4px', '0px', '4px'] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n >\n {[0,1,2].map(i => (\n <motion.div\n key={i}\n className=\"w-2 h-8 bg-zinc-800 dark:bg-white rounded-sm\"\n animate={{ height: [32, 16, 32] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n ))}\n </motion.div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "morphing-infinity",
3
+ "file": "morphing-infinity.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MorphingInfinity = () => {\n return (\n <div className=\"w-12 h-6 flex justify-between items-center relative\">\n <motion.div\n className=\"w-6 h-6 border-2 border-zinc-800 dark:border-zinc-700 rounded-full\"\n animate={{ x: [0, 24, 0], scale: [1, 0.5, 1] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"w-6 h-6 border-2 border-zinc-800 dark:border-zinc-700 rounded-full absolute top-0 left-0\"\n animate={{ x: [24, 0, 24], scale: [0.5, 1, 0.5] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "morphing-ring",
3
+ "file": "morphing-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MorphingRing = () => (\n <motion.div\n className=\"w-10 h-10 border-[3px] border-zinc-800 dark:border-zinc-700\"\n animate={{\n rotate: 180,\n borderRadius: [\"10%\", \"50%\", \"10%\"]\n }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "morphing-shape",
3
+ "file": "morphing-shape.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const MorphingShape = () => {\n return (\n <motion.div\n className=\"w-10 h-10 bg-zinc-800 dark:bg-white shadow-sm\"\n animate={{\n borderRadius: [\"10%\", \"50%\", \"10%\"],\n rotate: [0, 90, 180],\n scale: [1, 0.8, 1],\n }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "mouse-follow",
3
+ "file": "mouse-follow.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useEffect, useState } from 'react';\nimport { motion, useSpring } from 'framer-motion';\n\ninterface MouseFollowProps {\n children?: React.ReactNode;\n stiffness?: number;\n damping?: number;\n className?: string;\n}\n\nexport function MouseFollow({\n children,\n stiffness = 180,\n damping = 20,\n className = '',\n}: MouseFollowProps) {\n const [isVisible, setIsVisible] = useState(false);\n const x = useSpring(0, { stiffness, damping });\n const y = useSpring(0, { stiffness, damping });\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n x.set(e.clientX);\n y.set(e.clientY);\n if (!isVisible) setIsVisible(true);\n };\n\n const handleMouseLeave = () => {\n setIsVisible(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove, { passive: true });\n document.addEventListener('mouseleave', handleMouseLeave);\n \n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [x, y, isVisible]);\n\n if (!isVisible) return null;\n\n return (\n <motion.div\n style={{\n x,\n y,\n translateX: '-50%',\n translateY: '-50%',\n }}\n className={`fixed top-0 left-0 pointer-events-none z-[9998] ${className}`}\n >\n {children || (\n <div className=\"w-6 h-6 rounded-full border border-blue-500/50 bg-blue-500/10\" />\n )}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "newtons-cradle",
3
+ "file": "newtons-cradle.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const NewtonsCradle = () => {\n return (\n <div className=\"flex items-center justify-center space-x-0.5\">\n <motion.div\n className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full origin-top\"\n animate={{ rotate: [25, 0, 0, 0, 0, 25] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <div className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full\" />\n <div className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full\" />\n <motion.div\n className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full origin-top\"\n animate={{ rotate: [0, 0, 0, -25, 0, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "offset-rings",
3
+ "file": "offset-rings.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const OffsetRings = () => (\n <div className=\"relative w-12 h-12 flex items-center justify-center\">\n <motion.div\n className=\"absolute w-12 h-12 border-2 border-zinc-800 dark:border-zinc-700 border-x-transparent rounded-full\"\n animate={{ rotate: [0, 180, 360] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute w-8 h-8 border-2 border-zinc-500 border-y-transparent rounded-full\"\n animate={{ rotate: [0, -180, -360] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\", delay: 0.2 }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "orbiting-circles",
3
+ "file": "orbiting-circles.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const OrbitingCircles = () => {\n return (\n <div className=\"relative w-12 h-12 flex items-center justify-center\">\n <div className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full\" />\n {[0, 1].map((i) => (\n <motion.div\n key={i}\n className=\"absolute w-full h-full\"\n animate={{ rotate: i === 0 ? 360 : -360 }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n >\n <div className=\"absolute top-0 left-1/2 -ml-1 w-2 h-2 bg-zinc-500 dark:bg-zinc-350 rounded-full\" />\n </motion.div>\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "orbiting-dot",
3
+ "file": "orbiting-dot.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const OrbitingDot = () => {\n return (\n <div className=\"relative w-10 h-10 flex items-center justify-center\">\n <div className=\"w-2 h-2 bg-zinc-300 dark:bg-zinc-700 rounded-full\" />\n <motion.div\n className=\"absolute w-full h-full border border-zinc-200 dark:border-zinc-800 rounded-full\"\n animate={{ rotate: 360 }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n >\n <div className=\"absolute top-0 left-1/2 -ml-1.5 -mt-1.5 w-3 h-3 bg-zinc-800 dark:bg-white rounded-full shadow-sm\" />\n </motion.div>\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "origami-shape",
3
+ "file": "origami-shape.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const OrigamiShape = () => (\n <div className=\"relative w-10 h-10\">\n <motion.div\n className=\"absolute top-0 left-0 w-5 h-5 bg-zinc-800 dark:bg-white rounded-tl-md\"\n animate={{ rotateY: [0, 180, 0] }}\n style={{ transformOrigin: \"right\" }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute bottom-0 right-0 w-5 h-5 bg-zinc-500 dark:bg-zinc-350 rounded-br-md\"\n animate={{ rotateY: [0, 180, 0] }}\n style={{ transformOrigin: \"left\" }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "page-transition",
3
+ "file": "page-transition.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useEffect, useRef } from 'react';\nimport { motion, Variants } from 'framer-motion';\n\nexport type TransitionType =\n | 'double-stairs'\n | 'shutter-stairs'\n | 'split-stairs'\n | 'horizontal-split'\n | 'vertical-split'\n | 'slash'\n | 'lattice'\n | 'curtain-shred'\n | 'pixel'\n | 'pixel-wave'\n | 'pixel-spiral'\n | 'vortex'\n | 'cross-fade'\n | 'expand-grow'\n | 'push-slide'\n | 'pop-over'\n | 'depth-forward'\n | 'liquid-wave';\n\nexport interface PageTransitionProps {\n type?: TransitionType;\n isVisible: boolean;\n onComplete?: () => void;\n className?: string;\n}\n\nexport const PageTransition: React.FC<PageTransitionProps> = ({\n type = 'double-stairs',\n isVisible,\n onComplete,\n className = '',\n}) => {\n const pathRefs = useRef<(SVGPathElement | null)[]>([]);\n\n useEffect(() => {\n if (type !== 'liquid-wave' || !isVisible) return;\n let animId: number;\n const numPoints = 12;\n const numPaths = 3;\n const startTime = performance.now();\n\n const delays = Array.from({ length: numPaths }, (_, i) =>\n Array.from({ length: numPoints }, () => i * 0.08 + Math.random() * 0.15)\n );\n\n const animateFrame = (now: number) => {\n const elapsedSec = (now - startTime) / 1000;\n pathRefs.current.forEach((path, i) => {\n if (!path) return;\n const stepX = 100 / (numPoints - 1);\n const pointsY = delays[i].map((delay) => {\n const rawProgress = Math.max(0, Math.min(1, (elapsedSec - delay) / 0.65));\n const easeProgress =\n rawProgress < 0.5\n ? 2 * rawProgress * rawProgress\n : 1 - Math.pow(-2 * rawProgress + 2, 2) / 2;\n return 100 - easeProgress * 110;\n });\n\n let d = `M 0 100 V ${pointsY[0]}`;\n for (let j = 0; j < numPoints - 1; j++) {\n const currentX = j * stepX;\n const nextX = (j + 1) * stepX;\n const cpX = currentX + stepX * 0.5;\n d += ` C ${cpX} ${pointsY[j]} ${cpX} ${pointsY[j + 1]} ${nextX} ${pointsY[j + 1]}`;\n }\n d += ` V 100 H 0 Z`;\n path.setAttribute('d', d);\n });\n\n if (now - startTime < 1300) {\n animId = requestAnimationFrame(animateFrame);\n } else if (onComplete) {\n onComplete();\n }\n };\n\n animId = requestAnimationFrame(animateFrame);\n return () => cancelAnimationFrame(animId);\n }, [isVisible, type, onComplete]);\n\n if (!isVisible && type !== 'liquid-wave') return null;\n\n if (type === 'double-stairs') {\n const COLUMNS = 5;\n const variants: Variants = {\n initial: (i: number) => ({ y: i % 2 === 0 ? '-100%' : '100%' }),\n enter: (i: number) => ({\n y: '0%',\n transition: { duration: 0.8, ease: [0.76, 0, 0.24, 1], delay: i * 0.05 },\n }),\n exit: (i: number) => ({\n y: i % 2 === 0 ? '100%' : '-100%',\n transition: { duration: 0.8, ease: [0.76, 0, 0.24, 1], delay: i * 0.05 },\n }),\n };\n\n return (\n <motion.div\n className={`fixed inset-0 z-50 flex h-screen w-screen pointer-events-none ${className}`}\n initial=\"initial\"\n animate={isVisible ? 'enter' : 'exit'}\n onAnimationComplete={() => {\n if (onComplete) onComplete();\n }}\n >\n {[...Array(COLUMNS)].map((_, i) => (\n <motion.div\n key={i}\n variants={variants}\n custom={i}\n className=\"relative h-full flex-1 bg-neutral-900 border-r border-neutral-800 last:border-r-0\"\n />\n ))}\n </motion.div>\n );\n }\n\n if (type === 'liquid-wave') {\n return (\n <svg\n className={`fixed inset-0 w-full h-full pointer-events-none z-50 ${className}`}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n >\n <path ref={(el) => { pathRefs.current[0] = el; }} fill=\"#3f3f46\" style={{ opacity: 0.4 }} />\n <path ref={(el) => { pathRefs.current[1] = el; }} fill=\"#27272a\" style={{ opacity: 0.75 }} />\n <path ref={(el) => { pathRefs.current[2] = el; }} fill=\"#09090b\" />\n </svg>\n );\n }\n\n return (\n <motion.div\n className={`fixed inset-0 z-50 bg-neutral-900 pointer-events-none ${className}`}\n initial={{ opacity: 0 }}\n animate={isVisible ? { opacity: 1 } : { opacity: 0 }}\n transition={{ duration: 0.4 }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pendulum",
3
+ "file": "pendulum.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const Pendulum = () => {\n return (\n <div className=\"relative w-16 h-12 flex items-start justify-center\">\n <div className=\"w-full h-1 bg-zinc-200 dark:bg-zinc-800 rounded-full rounded-b-none absolute top-0\" />\n <motion.div\n className=\"absolute top-0 w-1 bg-zinc-800 dark:bg-white origin-top flex flex-col items-center\"\n animate={{ rotate: [-45, 45, -45] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n >\n <div className=\"w-1 h-8 bg-zinc-800 dark:bg-white\" />\n <div className=\"w-4 h-4 bg-zinc-800 dark:bg-white rounded-full\" />\n </motion.div>\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "presets",
3
+ "file": "presets.ts",
4
+ "dependencies": [],
5
+ "content": "\"use client\";\n// Motion spring configuration presets for premium micro-interactions\nexport const presets = {\n // Ultra-responsive, crisp snappy feel\n snappy: {\n type: \"spring\",\n stiffness: 400,\n damping: 28,\n mass: 0.8\n },\n // Bouncy, playful bounce transition\n bouncy: {\n type: \"spring\",\n stiffness: 300,\n damping: 15,\n mass: 1\n },\n // Smooth, elegant default easing transition\n smooth: {\n type: \"spring\",\n stiffness: 220,\n damping: 24,\n mass: 1\n },\n // Gentle, low-speed movement\n gentle: {\n type: \"spring\",\n stiffness: 120,\n damping: 14,\n mass: 1\n },\n // Stiff, high tension movement\n stiff: {\n type: \"spring\",\n stiffness: 500,\n damping: 40,\n mass: 0.5\n }\n} as const;\n"
6
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "progress-indicator",
3
+ "file": "progress-indicator.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion, useScroll, useSpring } from 'framer-motion';\n\ninterface ProgressIndicatorProps {\n color?: string;\n height?: number;\n className?: string;\n}\n\nexport function ProgressIndicator({\n color = 'bg-blue-500',\n height = 4,\n className = '',\n}: ProgressIndicatorProps) {\n const { scrollYProgress } = useScroll();\n const scaleX = useSpring(scrollYProgress, {\n stiffness: 100,\n damping: 30,\n restDelta: 0.001,\n });\n\n return (\n <motion.div\n className={`fixed top-0 left-0 right-0 origin-left z-[9999] ${color} ${className}`}\n style={{\n scaleX,\n height,\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n originX: 0,\n zIndex: 9999,\n }}\n />\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pulsating-dots",
3
+ "file": "pulsating-dots.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const PulsatingDots = () => {\n return (\n <div className=\"flex space-x-2\">\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ scale: [1, 1.5, 1], opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 1.2, repeat: Infinity, delay: i * 0.2, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pulse-dot",
3
+ "file": "pulse-dot.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const PulseDot = () => {\n return (\n <div className=\"relative w-10 h-10 flex items-center justify-center\">\n <motion.div\n className=\"absolute w-10 h-10 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ scale: [0, 1], opacity: [0.8, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeOut\" }}\n />\n <div className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-full relative z-10\" />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pulse-dots",
3
+ "file": "pulse-dots.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const PulseDots = () => {\n return (\n <div className=\"flex space-x-1.5\">\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"w-2.5 h-2.5 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ opacity: [0.2, 1, 0.2] }}\n transition={{ duration: 1.4, repeat: Infinity, delay: i * 0.2 }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pulse-square",
3
+ "file": "pulse-square.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const PulseSquare = () => {\n return (\n <motion.div\n className=\"w-8 h-8 border-4 border-zinc-800 dark:border-zinc-700 rounded-md\"\n animate={{ scale: [1, 1.2, 1], opacity: [1, 0.3, 1], borderRadius: [\"20%\", \"50%\", \"20%\"] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pulse",
3
+ "file": "pulse.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface PulseProps {\n size?: number;\n color?: string;\n className?: string;\n}\n\nexport function Pulse({\n size = 12,\n color = 'bg-blue-500',\n className = '',\n}: PulseProps) {\n return (\n <div className={`relative flex items-center justify-center ${className}`} style={{ width: size, height: size }}>\n {/* Center Solid Point */}\n <span className={`absolute w-full h-full rounded-full ${color}`} />\n \n {/* Pulsing ring 1 */}\n <motion.span\n initial={{ scale: 1, opacity: 0.5 }}\n animate={{ scale: 2.8, opacity: 0 }}\n transition={{\n repeat: Infinity,\n duration: 1.8,\n ease: 'easeOut',\n }}\n className={`absolute w-full h-full rounded-full ${color} opacity-40`}\n />\n\n {/* Pulsing ring 2 */}\n <motion.span\n initial={{ scale: 1, opacity: 0.5 }}\n animate={{ scale: 2.8, opacity: 0 }}\n transition={{\n repeat: Infinity,\n duration: 1.8,\n delay: 0.6,\n ease: 'easeOut',\n }}\n className={`absolute w-full h-full rounded-full ${color} opacity-40`}\n />\n </div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pumping-heart",
3
+ "file": "pumping-heart.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const PumpingHeart = () => {\n return (\n <motion.div\n className=\"w-8 h-8\"\n animate={{ scale: [1, 1.25, 1, 1.25, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n >\n <svg viewBox=\"0 0 24 24\" className=\"fill-zinc-800 dark:fill-white\">\n <path d=\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\"/>\n </svg>\n </motion.div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "radar-sweep",
3
+ "file": "radar-sweep.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const RadarSweep = ({ theme = 'light' }: { theme?: 'light' | 'dark' }) => {\n const isDark = theme === 'dark';\n return (\n <div className=\"relative w-12 h-12 rounded-full border border-zinc-800/10 dark:border-white/10 flex items-center justify-center overflow-hidden\">\n {/* Concentric rings */}\n <div className=\"absolute w-8 h-8 rounded-full border border-zinc-800/5 dark:border-white/5\" />\n <div className=\"absolute w-4 h-4 rounded-full border border-zinc-800/5 dark:border-white/5\" />\n \n {/* Center dot */}\n <div className=\"absolute w-1.5 h-1.5 rounded-full bg-zinc-800/80 dark:bg-white/80\" />\n\n {/* Sweep hand */}\n <motion.div\n className=\"absolute inset-0 origin-center\"\n style={{\n background: isDark\n ? \"conic-gradient(from 0deg, transparent 50%, rgba(255,255,255,0.02) 65%, rgba(255,255,255,0.15) 85%, rgba(255,255,255,0.55) 100%)\"\n : \"conic-gradient(from 0deg, transparent 50%, rgba(39,39,42,0.02) 65%, rgba(39,39,42,0.1) 85%, rgba(39,39,42,0.45) 100%)\",\n }}\n animate={{ rotate: 360 }}\n transition={{ duration: 1.8, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "ring-sweep",
3
+ "file": "ring-sweep.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const RingSweep = () => {\n return (\n <motion.div\n className=\"w-10 h-10 border-[3px] border-zinc-200 dark:border-zinc-800 rounded-full border-t-zinc-800 dark:border-t-white\"\n animate={{ rotate: 360 }}\n transition={{ duration: 1, repeat: Infinity, ease: \"linear\" }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "ripple-effect",
3
+ "file": "ripple-effect.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const RippleEffect = () => {\n return (\n <div className=\"relative w-12 h-12 flex items-center justify-center\">\n {/* Center dot */}\n <div className=\"absolute w-2.5 h-2.5 bg-zinc-800 dark:bg-white rounded-full\" />\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"absolute w-8 h-8 border border-zinc-850 dark:border-white rounded-full\"\n initial={{ scale: 0.3, opacity: 0.8 }}\n animate={{ scale: 1.6, opacity: 0 }}\n transition={{\n duration: 2.2,\n repeat: Infinity,\n ease: \"easeOut\",\n delay: i * 0.7,\n }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "rotating-cross",
3
+ "file": "rotating-cross.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const RotatingCross = () => {\n return (\n <motion.div\n className=\"relative w-8 h-8 flex items-center justify-center\"\n animate={{ rotate: 180 }}\n transition={{ duration: 0.8, repeat: Infinity, ease: \"easeInOut\" }}\n >\n <div className=\"absolute w-full h-1.5 bg-zinc-800 dark:bg-white rounded-sm\" />\n <div className=\"absolute h-full w-1.5 bg-zinc-800 dark:bg-white rounded-sm\" />\n </motion.div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "rotating-triangle",
3
+ "file": "rotating-triangle.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const RotatingTriangle = () => {\n return (\n <svg className=\"w-10 h-10 overflow-visible\" viewBox=\"0 0 50 50\">\n <motion.polygon\n points=\"25,5 45,40 5,40\"\n className=\"stroke-zinc-800 dark:stroke-white fill-none origin-center\"\n strokeWidth=\"4\"\n strokeLinejoin=\"round\"\n animate={{ rotate: 360 }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n />\n </svg>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "scale-in",
3
+ "file": "scale-in.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface ScaleInProps {\n children: React.ReactNode;\n duration?: number;\n delay?: number;\n initialScale?: number;\n className?: string;\n}\n\nexport function ScaleIn({\n children,\n duration = 0.5,\n delay = 0,\n initialScale = 0.92,\n className = '',\n}: ScaleInProps) {\n return (\n <motion.div\n initial={{ opacity: 0, scale: initialScale }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{\n duration,\n delay,\n ease: [0.34, 1.56, 0.64, 1], // Custom springy cubic bezier\n }}\n className={className}\n >\n {children}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "scroll-reveal",
3
+ "file": "scroll-reveal.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface ScrollRevealProps {\n children: React.ReactNode;\n duration?: number;\n yOffset?: number;\n xOffset?: number;\n scale?: number;\n className?: string;\n}\n\nexport function ScrollReveal({\n children,\n duration = 0.6,\n yOffset = 30,\n xOffset = 0,\n scale = 0.95,\n className = '',\n}: ScrollRevealProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: yOffset, x: xOffset, scale }}\n whileInView={{ opacity: 1, y: 0, x: 0, scale: 1 }}\n viewport={{ once: true, margin: '-15%' }}\n transition={{\n duration,\n ease: [0.16, 1, 0.3, 1], // easeOutExpo\n }}\n className={className}\n >\n {children}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "shape-shift-grid",
3
+ "file": "shape-shift-grid.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ShapeShiftGrid = () => (\n <div className=\"grid grid-cols-2 gap-1 w-8 h-8\">\n {[0,1,2,3].map(i => (\n <motion.div\n key={i}\n className=\"w-full h-full bg-zinc-800 dark:bg-white\"\n animate={{ borderRadius: [\"10%\", \"50%\", \"10%\"], scale: [1, 0.8, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, delay: i * 0.1, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "shimmer-line",
3
+ "file": "shimmer-line.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ShimmerLine = () => {\n return (\n <div className=\"w-24 h-1 bg-zinc-200 dark:bg-zinc-800 rounded-full overflow-hidden relative\">\n <motion.div\n className=\"absolute top-0 left-0 bottom-0 w-1/3 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ x: [\"-100%\", \"300%\"] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "siri-wave",
3
+ "file": "siri-wave.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SiriWave = () => (\n <div className=\"flex space-x-1 items-center h-8\">\n {[0,1,2,3,4].map(i => (\n <motion.div\n key={i}\n className=\"w-1 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ height: [4, 24, 4] }}\n transition={{ duration: 1.2, repeat: Infinity, delay: i * 0.1, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "skeleton-loader",
3
+ "file": "skeleton-loader.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SkeletonLoader = () => {\n return (\n <div className=\"w-full max-w-[120px] space-y-2\">\n <div className=\"flex items-center space-x-2\">\n <motion.div\n className=\"w-8 h-8 bg-zinc-200 dark:bg-zinc-800 rounded-full shrink-0\"\n animate={{ opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"h-3 bg-zinc-200 dark:bg-zinc-800 rounded-full w-full\"\n animate={{ opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\", delay: 0.2 }}\n />\n </div>\n <motion.div\n className=\"h-2 bg-zinc-200 dark:bg-zinc-800 rounded-full w-full\"\n animate={{ opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\", delay: 0.4 }}\n />\n <motion.div\n className=\"h-2 bg-zinc-200 dark:bg-zinc-800 rounded-full w-4/5\"\n animate={{ opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\", delay: 0.6 }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "skeleton",
3
+ "file": "skeleton.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface SkeletonProps {\n className?: string;\n shimmerColor?: 'light' | 'dark';\n}\n\nexport function Skeleton({\n className = '',\n shimmerColor = 'dark',\n}: SkeletonProps) {\n const isDark = shimmerColor === 'dark';\n \n const shimmerGradient = isDark\n ? 'linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.05) 50%, rgba(255,255,255,0) 100%)'\n : 'linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.04) 50%, rgba(0,0,0,0) 100%)';\n\n return (\n <div\n className={`relative overflow-hidden rounded-md bg-neutral-200/50 dark:bg-neutral-800/40 ${className}`}\n >\n {/* Premium Shimmer Sweep Animation */}\n <motion.div\n initial={{ x: '-150%' }}\n animate={{ x: '150%' }}\n transition={{\n repeat: Infinity,\n duration: 1.6,\n ease: 'easeInOut',\n }}\n style={{\n background: shimmerGradient,\n }}\n className=\"absolute inset-0 w-[80%] h-full\"\n />\n </div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "slide-left",
3
+ "file": "slide-left.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface SlideLeftProps {\n children: React.ReactNode;\n duration?: number;\n delay?: number;\n xOffset?: number;\n className?: string;\n}\n\nexport function SlideLeft({\n children,\n duration = 0.6,\n delay = 0,\n xOffset = 40,\n className = '',\n}: SlideLeftProps) {\n return (\n <motion.div\n initial={{ opacity: 0, x: xOffset }}\n animate={{ opacity: 1, x: 0 }}\n transition={{\n duration,\n delay,\n ease: [0.16, 1, 0.3, 1], // easeOutExpo\n }}\n className={className}\n >\n {children}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "slide-right",
3
+ "file": "slide-right.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface SlideRightProps {\n children: React.ReactNode;\n duration?: number;\n delay?: number;\n xOffset?: number;\n className?: string;\n}\n\nexport function SlideRight({\n children,\n duration = 0.6,\n delay = 0,\n xOffset = -40,\n className = '',\n}: SlideRightProps) {\n return (\n <motion.div\n initial={{ opacity: 0, x: xOffset }}\n animate={{ opacity: 1, x: 0 }}\n transition={{\n duration,\n delay,\n ease: [0.16, 1, 0.3, 1], // easeOutExpo\n }}\n className={className}\n >\n {children}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "sliding-bars",
3
+ "file": "sliding-bars.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SlidingBars = () => (\n <div className=\"relative w-8 h-8\">\n <motion.div\n className=\"absolute top-0 left-0 w-8 h-1.5 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ y: [0, 24, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute bottom-0 left-0 w-8 h-1.5 bg-zinc-400 dark:bg-zinc-200 rounded-full\"\n animate={{ y: [0, -24, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "smooth-dot-shift",
3
+ "file": "smooth-dot-shift.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SmoothDotShift = () => (\n <div className=\"relative w-12 h-3 flex items-center\">\n <motion.div\n className=\"absolute w-3 h-3 bg-zinc-800 dark:bg-white rounded-full z-10\"\n animate={{ x: [0, 18, 36, 18, 0] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <div className=\"w-3 h-3 bg-zinc-300 dark:bg-zinc-700 rounded-full absolute left-0\" />\n <div className=\"w-3 h-3 bg-zinc-300 dark:bg-zinc-700 rounded-full absolute left-[18px]\" />\n <div className=\"w-3 h-3 bg-zinc-300 dark:bg-zinc-700 rounded-full absolute left-[36px]\" />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "smooth-ring",
3
+ "file": "smooth-ring.tsx",
4
+ "dependencies": [],
5
+ "content": "\"use client\";\nimport React from 'react';\n\nexport const SmoothRing = () => (\n <div className=\"w-9 h-9\">\n <svg className=\"w-full h-full animate-spin\" viewBox=\"0 0 32 32\">\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"14\"\n fill=\"none\"\n strokeWidth=\"3\"\n className=\"stroke-zinc-200 dark:stroke-zinc-800\"\n />\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"14\"\n fill=\"none\"\n strokeWidth=\"3\"\n className=\"stroke-zinc-800 dark:stroke-white\"\n strokeDasharray=\"38 80\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n);\n"
6
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "smooth-rounded-square",
3
+ "file": "smooth-rounded-square.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SmoothRoundedSquare = () => (\n <motion.div\n className=\"w-10 h-10 border-[3px] border-zinc-800 dark:border-zinc-700\"\n animate={{ borderRadius: [\"10%\", \"50%\", \"10%\"] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "spinning-squares",
3
+ "file": "spinning-squares.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SpinningSquares = () => {\n return (\n <div className=\"relative w-10 h-10\">\n <motion.div\n className=\"absolute top-0 left-0 w-4 h-4 bg-zinc-800 dark:bg-white rounded-sm\"\n animate={{ x: [0, 24, 24, 0, 0], y: [0, 0, 24, 24, 0] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute bottom-0 right-0 w-4 h-4 bg-zinc-300 dark:bg-zinc-700 rounded-sm\"\n animate={{ x: [0, -24, -24, 0, 0], y: [0, 0, -24, -24, 0] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "spiral-spinner",
3
+ "file": "spiral-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SpiralSpinner = () => {\n return (\n <motion.div\n className=\"w-10 h-10 border-[3px] border-zinc-800 dark:border-zinc-700 rounded-full border-t-transparent\"\n animate={{ rotate: 360, scale: [1, 0.8, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "spotlight",
3
+ "file": "spotlight.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useRef, useState } from 'react';\nimport { motion } from 'framer-motion';\n\ninterface SpotlightProps {\n children: React.ReactNode;\n className?: string;\n glowColor?: string;\n glowSize?: number;\n}\n\nexport function Spotlight({\n children,\n className = '',\n glowColor = 'rgba(255, 255, 255, 0.08)',\n glowSize = 250,\n}: SpotlightProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [coords, setCoords] = useState({ x: 0, y: 0 });\n const [opacity, setOpacity] = useState(0);\n\n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setCoords({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n };\n\n return (\n <div\n ref={containerRef}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setOpacity(1)}\n onMouseLeave={() => setOpacity(0)}\n className={`relative overflow-hidden bg-neutral-950 border border-neutral-900 rounded-2xl p-6 ${className}`}\n >\n {/* Dynamic Cursor Spotlight Layer */}\n <motion.div\n className=\"pointer-events-none absolute -inset-px opacity-0 transition-opacity duration-300\"\n style={{\n opacity,\n background: `radial-gradient(${glowSize}px circle at ${coords.x}px ${coords.y}px, ${glowColor}, transparent 80%)`,\n }}\n />\n \n {/* Content wrapper */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "spring-bars",
3
+ "file": "spring-bars.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SpringBars = () => (\n <div className=\"flex flex-col space-y-2 w-10 justify-center\">\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"h-1.5 bg-zinc-800 dark:bg-white rounded-full origin-left\"\n animate={{ scaleX: [0.2, 1, 0.2] }}\n transition={{\n duration: 1.4,\n repeat: Infinity,\n ease: \"easeInOut\",\n delay: i * 0.15,\n }}\n />\n ))}\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "spring-dot-matrix",
3
+ "file": "spring-dot-matrix.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SpringDotMatrix = () => {\n return (\n <div className=\"grid grid-cols-3 gap-2.5\">\n {Array.from({ length: 9 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"w-2 h-2 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ scale: [1, 0.4, 1] }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n delay: (Math.floor(i / 3) + (i % 3)) * 0.15\n }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "spring-hexagon",
3
+ "file": "spring-hexagon.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const SpringHexagon = () => (\n <motion.svg className=\"w-10 h-10\" viewBox=\"0 0 50 50\"\n animate={{ scale: [1, 1.15, 1], rotate: [0, 60, 60] }}\n transition={{ duration: 2, repeat: Infinity, type: \"spring\", bounce: 0.3 }}\n >\n <polygon points=\"25,5 45,15 45,35 25,45 5,35 5,15\" className=\"fill-zinc-800 dark:fill-white\" />\n </motion.svg>\n);\n"
8
+ }