@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": "bouncing-square",
3
+ "file": "bouncing-square.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const BouncingSquare = () => {\n return (\n <div className=\"relative w-10 h-12 flex items-end justify-center\">\n <div className=\"absolute bottom-0 w-8 h-1 bg-zinc-200 dark:bg-zinc-800 rounded-full blur-sm\" />\n <motion.div\n className=\"w-6 h-6 bg-zinc-800 dark:bg-white rounded-sm origin-bottom\"\n animate={{ y: [0, -24, 0], scaleY: [0.8, 1.1, 0.8], scaleX: [1.2, 0.9, 1.2] }}\n transition={{ duration: 0.6, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "breathe-ring",
3
+ "file": "breathe-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const BreatheRing = () => (\n <motion.div\n className=\"w-10 h-10 rounded-full border-4 border-zinc-800 dark:border-zinc-700\"\n animate={{ scale: [0.8, 1.1, 0.8], borderWidth: [6, 2, 6] }}\n transition={{ duration: 3, repeat: Infinity, ease: \"easeInOut\" }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "breathing-glow",
3
+ "file": "breathing-glow.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const BreathingGlow = () => {\n return (\n <div className=\"relative flex items-center justify-center w-12 h-12\">\n <motion.div\n className=\"absolute w-8 h-8 bg-blue-500 rounded-full blur-md\"\n animate={{ scale: [1, 1.5, 1], opacity: [0.5, 0.8, 0.5] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <div className=\"relative w-6 h-6 bg-white rounded-full shadow-sm\" />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "breathing-square",
3
+ "file": "breathing-square.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const BreathingSquare = () => {\n return (\n <motion.div\n className=\"w-8 h-8 bg-zinc-800 dark:bg-white\"\n animate={{\n scale: [1, 1.2, 1],\n borderRadius: [\"0%\", \"50%\", \"0%\"],\n rotate: [0, 90, 180]\n }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "card-hover",
3
+ "file": "card-hover.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\ninterface CardHoverProps {\n items: {\n id: string;\n title: string;\n description: string;\n link?: string;\n }[];\n className?: string;\n cardClassName?: string;\n}\n\nexport function CardHover({\n items,\n className = '',\n cardClassName = '',\n}: CardHoverProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\n return (\n <div className={`grid grid-cols-1 md:grid-cols-3 gap-4 w-full ${className}`}>\n {items.map((item, idx) => (\n <a\n key={item.id}\n href={item.link || '#'}\n className=\"relative group block p-2 h-full w-full no-underline\"\n onMouseEnter={() => setHoveredIndex(idx)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n <AnimatePresence>\n {hoveredIndex === idx && (\n <motion.span\n className=\"absolute inset-0 h-full w-full bg-neutral-200 dark:bg-zinc-800/[0.8] block rounded-3xl -z-10\"\n layoutId=\"hoverBackground\"\n initial={{ opacity: 0 }}\n animate={{\n opacity: 1,\n transition: { duration: 0.15 },\n }}\n exit={{\n opacity: 0,\n transition: { duration: 0.15, delay: 0.1 },\n }}\n />\n )}\n </AnimatePresence>\n <div\n className={`rounded-2xl h-full w-full p-5 overflow-hidden bg-white dark:bg-black border border-neutral-200 dark:border-zinc-800 group-hover:border-slate-350 dark:group-hover:border-zinc-700 relative z-20 transition-colors duration-200 ${cardClassName}`}\n >\n <div className=\"relative z-50\">\n <h4 className=\"text-zinc-900 dark:text-zinc-100 font-bold tracking-wide mt-2\">\n {item.title}\n </h4>\n <p className=\"mt-2 text-zinc-500 dark:text-zinc-400 tracking-wide leading-relaxed text-sm\">\n {item.description}\n </p>\n </div>\n </div>\n </a>\n ))}\n </div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "character-stagger",
3
+ "file": "character-stagger.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion, type Variants } from 'framer-motion';\n\ninterface CharacterStaggerProps {\n text: string;\n duration?: number;\n staggerDelay?: number;\n yOffset?: number;\n className?: string;\n}\n\nexport function CharacterStagger({\n text,\n duration = 0.4,\n staggerDelay = 0.015,\n yOffset = 15,\n className = '',\n}: CharacterStaggerProps) {\n const characters = Array.from(text);\n\n const containerVariants: Variants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: staggerDelay,\n },\n },\n };\n\n const charVariants: Variants = {\n hidden: { opacity: 0, y: yOffset, scale: 0.8 },\n visible: {\n opacity: 1,\n y: 0,\n scale: 1,\n transition: {\n type: 'spring',\n stiffness: 300,\n damping: 18,\n mass: 0.8,\n duration,\n },\n },\n };\n\n return (\n <motion.div\n variants={containerVariants}\n initial=\"hidden\"\n whileInView=\"visible\"\n viewport={{ once: true, margin: '-10%' }}\n className={`inline-block ${className}`}\n >\n {characters.map((char, index) => (\n <motion.span\n key={index}\n variants={charVariants}\n className=\"inline-block whitespace-pre\"\n >\n {char}\n </motion.span>\n ))}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "circular-bars",
3
+ "file": "circular-bars.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const CircularBars = () => {\n return (\n <div className=\"relative w-10 h-10\">\n {Array.from({ length: 8 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute top-0 left-[18px] w-1 h-3 bg-zinc-800 dark:bg-white rounded-full origin-[2px_20px]\"\n style={{ rotate: i * 45 }}\n animate={{ scaleY: [0.5, 1.5, 0.5] }}\n transition={{ duration: 1.2, repeat: Infinity, delay: i * 0.15, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "classic-spinner",
3
+ "file": "classic-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ClassicSpinner = () => {\n return (\n <div className=\"relative w-8 h-8\">\n {Array.from({ length: 12 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute top-0 left-[14px] w-[4px] h-[8px] bg-zinc-400 dark:bg-zinc-200 rounded-full origin-[2px_16px]\"\n style={{ rotate: i * 30 }}\n animate={{ opacity: [1, 0.2] }}\n transition={{\n duration: 1,\n repeat: Infinity,\n ease: \"linear\",\n delay: i * (1 / 12),\n }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "classic-toggle",
3
+ "file": "classic-toggle.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useState } from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ClassicToggle = () => {\n const [isOn, setIsOn] = useState(false);\n return (\n <button\n onClick={() => setIsOn(!isOn)}\n className={`relative w-16 h-9 rounded-full p-1 transition-colors duration-300 cursor-pointer border-0 ${isOn ? 'bg-emerald-500' : 'bg-neutral-800'}`}\n >\n <motion.div\n animate={{ x: isOn ? 28 : 0 }}\n transition={{ type: 'spring', stiffness: 500, damping: 30 }}\n className=\"w-7 h-7 bg-white rounded-full shadow-md\"\n />\n </button>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "clock-spinner",
3
+ "file": "clock-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ClockSpinner = () => {\n return (\n <div className=\"relative w-10 h-10 border-2 border-zinc-800 dark:border-zinc-700 rounded-full flex items-center justify-center\">\n <motion.div\n className=\"absolute w-0.5 h-3.5 bg-zinc-800 dark:bg-white rounded-full origin-bottom\"\n style={{ bottom: \"50%\" }}\n animate={{ rotate: 360 }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n />\n <motion.div\n className=\"absolute w-0.5 h-2.5 bg-zinc-800 dark:bg-white rounded-full origin-bottom\"\n style={{ bottom: \"50%\" }}\n animate={{ rotate: 360 }}\n transition={{ duration: 12, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "comet-spinner",
3
+ "file": "comet-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const CometSpinner = () => {\n return (\n <div className=\"relative w-10 h-10 border border-zinc-200 dark:border-zinc-800 rounded-full flex items-center justify-center\">\n <motion.div\n className=\"absolute w-full h-full rounded-full\"\n style={{\n background: \"conic-gradient(from 0deg, transparent 0%, rgba(39, 39, 42, 0.1) 60%, rgba(39, 39, 42, 1) 100%)\",\n }}\n animate={{ rotate: 360 }}\n transition={{ duration: 1, repeat: Infinity, ease: \"linear\" }}\n />\n <div className=\"absolute bg-white w-8 h-8 rounded-full\" />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "concentric-pulse",
3
+ "file": "concentric-pulse.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ConcentricPulse = () => {\n return (\n <div className=\"relative w-12 h-12 flex items-center justify-center\">\n {[1, 2, 3].map((i) => (\n <motion.div\n key={i}\n className=\"absolute rounded-full border border-zinc-800 dark:border-zinc-700\"\n initial={{ width: 0, height: 0, opacity: 1 }}\n animate={{ width: 48, height: 48, opacity: 0 }}\n transition={{ duration: 2, repeat: Infinity, delay: i * 0.6, ease: \"easeOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "concentric-ring",
3
+ "file": "concentric-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ConcentricRing = () => {\n return (\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-t-transparent rounded-full\"\n animate={{ rotate: 360 }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n />\n <motion.div\n className=\"absolute w-8 h-8 border-2 border-zinc-500 border-b-transparent rounded-full\"\n animate={{ rotate: -360 }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"linear\" }}\n />\n <motion.div\n className=\"absolute w-4 h-4 border-2 border-zinc-300 border-l-transparent rounded-full\"\n animate={{ rotate: 360 }}\n transition={{ duration: 1, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "concentric-squares",
3
+ "file": "concentric-squares.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ConcentricSquares = () => {\n return (\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 rounded-sm\"\n animate={{ rotate: [0, 90, 90], scale: [1, 1, 0.8, 1] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute w-6 h-6 border-2 border-zinc-500 rounded-sm\"\n animate={{ rotate: [0, -90, -90], scale: [1, 1, 1.2, 1] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "conveyor-loop",
3
+ "file": "conveyor-loop.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ConveyorLoop = () => {\n return (\n <div className=\"w-16 h-3 overflow-hidden relative rounded-full bg-zinc-200 dark:bg-zinc-800\">\n <motion.div\n className=\"flex h-full space-x-2 absolute top-0 items-center\"\n animate={{ x: [0, -32] }}\n transition={{ duration: 1, repeat: Infinity, ease: \"linear\" }}\n >\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-1.5 h-1.5 bg-zinc-800 dark:bg-white rounded-full shrink-0\" />\n ))}\n </motion.div>\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "cross-spinner",
3
+ "file": "cross-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const CrossSpinner = () => {\n return (\n <motion.div\n className=\"relative w-8 h-8 flex items-center justify-center\"\n animate={{ rotate: [0, 90, 180, 270, 360] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n >\n <div className=\"absolute w-full h-1.5 bg-zinc-800 dark:bg-white rounded-full\" />\n <div className=\"absolute h-full w-1.5 bg-zinc-800 dark:bg-white rounded-full\" />\n </motion.div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "cube-flip-spring",
3
+ "file": "cube-flip-spring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const CubeFlipSpring = () => (\n <motion.div\n className=\"w-8 h-8 bg-zinc-800 dark:bg-white rounded-lg\"\n animate={{ rotateX: [0, 180, 180], rotateY: [0, 0, 180] }}\n transition={{ duration: 2, repeat: Infinity, type: \"spring\", bounce: 0.2 }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "cursor-trail",
3
+ "file": "cursor-trail.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 CursorTrailProps {\n color?: string;\n size?: number;\n count?: number;\n}\n\nexport function CursorTrail({\n color = 'bg-blue-500',\n size = 8,\n count = 6,\n}: CursorTrailProps) {\n const [coords, setCoords] = useState({ x: 0, y: 0 });\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n setCoords({ x: e.clientX, y: 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 }, [isVisible]);\n\n // Create an array of springs, each following the one in front of it\n return (\n <>\n {isVisible && Array.from({ length: count }).map((_, index) => {\n // Higher index elements have more damping/delay\n const springConfig = {\n stiffness: 300 - index * 30,\n damping: 25 + index * 2,\n mass: 0.2 + index * 0.1,\n };\n\n return (\n <TrailDot\n key={index}\n index={index}\n coords={coords}\n springConfig={springConfig}\n size={size}\n color={color}\n count={count}\n />\n );\n })}\n </>\n );\n}\n\ninterface TrailDotProps {\n index: number;\n coords: { x: number; y: number };\n springConfig: { stiffness: number; damping: number; mass: number };\n size: number;\n color: string;\n count: number;\n}\n\nfunction TrailDot({\n index,\n coords,\n springConfig,\n size,\n color,\n count,\n}: TrailDotProps) {\n const x = useSpring(coords.x, springConfig);\n const y = useSpring(coords.y, springConfig);\n\n useEffect(() => {\n x.set(coords.x);\n y.set(coords.y);\n }, [coords, x, y]);\n\n // Calculate size and opacity based on index (shrinking tail)\n const dotSize = size * (1 - index / count);\n const opacity = 1 - index / count;\n\n return (\n <motion.div\n style={{\n x,\n y,\n width: dotSize,\n height: dotSize,\n translateX: '-50%',\n translateY: '-50%',\n opacity,\n }}\n className={`fixed top-0 left-0 rounded-full pointer-events-none z-[9999] ${color}`}\n />\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dash-ring",
3
+ "file": "dash-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DashRing = () => {\n return (\n <svg className=\"w-12 h-12\" viewBox=\"0 0 50 50\">\n <motion.circle\n cx=\"25\" cy=\"25\" r=\"20\"\n className=\"stroke-zinc-800 dark:stroke-white fill-none\"\n strokeWidth=\"3\"\n strokeDasharray=\"8 8\"\n animate={{ rotate: 360 }}\n style={{ transformOrigin: 'center' }}\n transition={{ duration: 4, repeat: Infinity, ease: \"linear\" }}\n />\n </svg>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dashed-spiral",
3
+ "file": "dashed-spiral.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DashedSpiral = () => (\n <motion.div\n className=\"w-10 h-10 border-[3px] border-zinc-800 dark:border-zinc-700 rounded-full border-dashed\"\n animate={{ rotate: 360, scale: [1, 1.1, 1] }}\n transition={{ duration: 4, repeat: Infinity, ease: \"linear\" }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "diamond-grid",
3
+ "file": "diamond-grid.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DiamondGrid = () => {\n return (\n <div className=\"grid grid-cols-2 gap-2 rotate-45\">\n {[0, 1, 2, 3].map((i) => (\n <motion.div\n key={i}\n className=\"w-3 h-3 bg-zinc-800 dark:bg-white rounded-sm\"\n animate={{ scale: [1, 0.5, 1], opacity: [1, 0.3, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, delay: i * 0.2, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "diamond-rotate-spring",
3
+ "file": "diamond-rotate-spring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DiamondRotateSpring = () => (\n <motion.div\n className=\"w-8 h-8 bg-zinc-800 dark:bg-white rounded-sm origin-center\"\n style={{ rotate: 45 }}\n animate={{ rotate: [45, 135, 225, 315] }}\n transition={{ duration: 2, repeat: Infinity, type: \"spring\", bounce: 0.4 }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dot-spinner",
3
+ "file": "dot-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DotSpinner = () => {\n return (\n <div className=\"relative w-10 h-10\">\n {[0, 1, 2, 3, 4, 5, 6, 7].map((i) => (\n <motion.div\n key={i}\n className=\"absolute top-0 left-1/2 w-2 h-2 bg-zinc-800 dark:bg-white rounded-full -ml-1 origin-[4px_20px]\"\n style={{ rotate: i * 45 }}\n animate={{ opacity: [1, 0.2] }}\n transition={{ duration: 1, repeat: Infinity, delay: i * 0.125, ease: \"linear\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dots-ring",
3
+ "file": "dots-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DotsRing = () => {\n return (\n <div className=\"relative w-12 h-12\">\n {[0, 1, 2, 3, 4, 5, 6, 7].map((i) => (\n <motion.div\n key={i}\n className=\"absolute top-0 left-1/2 w-2 h-2 bg-zinc-800 dark:bg-white rounded-full -ml-1 origin-[4px_24px]\"\n style={{ rotate: i * 45 }}\n animate={{ scale: [1, 0.5, 1], opacity: [1, 0.3, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, delay: i * 0.15, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "double-ring",
3
+ "file": "double-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DoubleRing = () => {\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 border-2 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.5, repeat: Infinity, ease: \"linear\" }}\n />\n <motion.div\n className=\"absolute w-6 h-6 border-2 border-zinc-200 dark:border-zinc-800 rounded-full border-b-zinc-800 dark:border-b-white\"\n animate={{ rotate: -360 }}\n transition={{ duration: 1, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "drop-dot",
3
+ "file": "drop-dot.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DropDot = () => (\n <div className=\"relative w-6 h-12 flex flex-col items-center\">\n <motion.div\n className=\"w-2.5 h-2.5 bg-zinc-800 dark:bg-white rounded-full absolute top-0 z-10\"\n animate={{ y: [0, 24, 0], scaleY: [1, 1.2, 1], scaleX: [1, 0.8, 1] }}\n transition={{ duration: 1, repeat: Infinity, ease: \"circIn\" }}\n />\n <div className=\"w-4 h-1 bg-zinc-300 dark:bg-zinc-700 rounded-full absolute bottom-2 blur-[1px]\" />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dual-arc",
3
+ "file": "dual-arc.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DualArc = () => {\n return (\n <div className=\"relative w-8 h-8 flex items-center justify-center\">\n <motion.div\n className=\"absolute inset-0 border-2 border-t-zinc-800 dark:border-t-white border-b-zinc-800 dark:border-b-white border-l-transparent border-r-transparent rounded-full\"\n animate={{ rotate: 360, scale: [1, 0.82, 1] }}\n transition={{\n rotate: { duration: 1.2, repeat: Infinity, ease: \"linear\" },\n scale: { duration: 1.2, repeat: Infinity, ease: \"easeInOut\" }\n }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dynamic-island",
3
+ "file": "dynamic-island.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const DynamicIsland = () => {\n return (\n <motion.div\n className=\"bg-zinc-950 dark:bg-zinc-900 border border-black/10 dark:border-white/10 rounded-full flex items-center justify-center px-4 py-2 gap-3 h-8 shadow-sm\"\n animate={{\n width: [80, 110, 80],\n }}\n transition={{\n duration: 2.2,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n >\n {/* Green indicator dot */}\n <motion.div\n className=\"w-1.5 h-1.5 rounded-full bg-emerald-500\"\n animate={{ opacity: [0.4, 1, 0.4] }}\n transition={{ duration: 1.1, repeat: Infinity, ease: \"easeInOut\" }}\n />\n {/* Waveform line */}\n <div className=\"flex gap-1 items-center h-2\">\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"w-0.5 bg-zinc-300 dark:bg-zinc-500 rounded-full\"\n animate={{ height: [3, 8, 3] }}\n transition={{\n duration: 0.8,\n repeat: Infinity,\n ease: \"easeInOut\",\n delay: i * 0.15,\n }}\n />\n ))}\n </div>\n </motion.div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "elastic-bars",
3
+ "file": "elastic-bars.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ElasticBars = () => (\n <div className=\"flex space-x-2 h-10 items-center justify-center\">\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"w-2 bg-zinc-800 dark:bg-white rounded-full\"\n animate={{ height: [8, 36, 8] }}\n transition={{\n duration: 1.1,\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": "elastic-square",
3
+ "file": "elastic-square.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ElasticSquare = () => (\n <div className=\"h-12 flex items-end border-b-2 border-zinc-200 dark:border-zinc-800 w-12 justify-center\">\n <motion.div\n className=\"w-6 h-6 bg-zinc-800 dark:bg-white rounded-sm origin-bottom\"\n animate={{ y: [0, -20, 0], scaleY: [0.7, 1.2, 0.7], scaleX: [1.3, 0.8, 1.3] }}\n transition={{ duration: 0.8, repeat: Infinity, ease: \"easeInOut\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "expanding-cross",
3
+ "file": "expanding-cross.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const ExpandingCross = () => {\n return (\n <div className=\"relative w-8 h-8\">\n <motion.div\n className=\"absolute top-1/2 left-0 w-full h-1 bg-zinc-800 dark:bg-white -mt-0.5 rounded-full\"\n animate={{ scaleX: [0.2, 1, 0.2] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <motion.div\n className=\"absolute left-1/2 top-0 h-full w-1 bg-zinc-800 dark:bg-white -ml-0.5 rounded-full\"\n animate={{ scaleY: [0.2, 1, 0.2] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\", delay: 0.75 }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "face-id-scan",
3
+ "file": "face-id-scan.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FaceIDScan = () => (\n <div className=\"w-12 h-12 border-2 border-zinc-300 rounded-xl relative overflow-hidden flex items-center justify-center\">\n <svg viewBox=\"0 0 24 24\" className=\"w-6 h-6 fill-zinc-300 dark:fill-zinc-700\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/>\n </svg>\n <motion.div\n className=\"absolute left-0 w-full h-8 bg-gradient-to-b from-transparent to-green-400/30 border-b border-green-500\"\n animate={{ top: [\"-100%\", \"100%\", \"-100%\"] }}\n transition={{ duration: 2.5, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "fade-arc",
3
+ "file": "fade-arc.tsx",
4
+ "dependencies": [],
5
+ "content": "\"use client\";\nimport React from 'react';\n\nexport const FadeArc = () => {\n return (\n <div className=\"relative w-9 h-9\">\n <svg className=\"w-full h-full animate-spin\" viewBox=\"0 0 50 50\">\n <circle\n className=\"stroke-zinc-200 dark:stroke-zinc-800\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n strokeWidth=\"3.5\"\n />\n <circle\n className=\"stroke-zinc-800 dark:stroke-white\"\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n strokeWidth=\"3.5\"\n strokeDasharray=\"80\"\n strokeDashoffset=\"28\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n};\n"
6
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fade-dots",
3
+ "file": "fade-dots.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FadeDots = () => {\n return (\n <div className=\"flex space-x-2\">\n {[0, 1, 2, 3].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, 1, 0] }}\n transition={{ duration: 1.5, repeat: Infinity, delay: i * 0.2, ease: \"linear\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fade-down",
3
+ "file": "fade-down.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface FadeDownProps {\n children: React.ReactNode;\n duration?: number;\n delay?: number;\n yOffset?: number;\n className?: string;\n}\n\nexport function FadeDown({\n children,\n duration = 0.6,\n delay = 0,\n yOffset = -20,\n className = '',\n}: FadeDownProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: yOffset }}\n animate={{ opacity: 1, y: 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": "fade-in",
3
+ "file": "fade-in.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface FadeInProps {\n children: React.ReactNode;\n duration?: number;\n delay?: number;\n className?: string;\n}\n\nexport function FadeIn({\n children,\n duration = 0.5,\n delay = 0,\n className = '',\n}: FadeInProps) {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{\n duration,\n delay,\n ease: [0.215, 0.61, 0.355, 1], // easeOutCubic\n }}\n className={className}\n >\n {children}\n </motion.div>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fade-up",
3
+ "file": "fade-up.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface FadeUpProps {\n children: React.ReactNode;\n duration?: number;\n delay?: number;\n yOffset?: number;\n className?: string;\n}\n\nexport function FadeUp({\n children,\n duration = 0.6,\n delay = 0,\n yOffset = 20,\n className = '',\n}: FadeUpProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: yOffset }}\n animate={{ opacity: 1, y: 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": "flip-square",
3
+ "file": "flip-square.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FlipSquare = () => {\n return (\n <motion.div\n className=\"w-8 h-8 bg-zinc-800 dark:bg-white rounded-md shadow-sm\"\n animate={{ rotateX: [0, 180, 180, 0], rotateY: [0, 0, 180, 180] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"easeInOut\" }}\n />\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "floating-diamonds",
3
+ "file": "floating-diamonds.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FloatingDiamonds = () => {\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-sm rotate-45\"\n animate={{ y: [0, -10, 0] }}\n transition={{ duration: 1, repeat: Infinity, delay: i * 0.2, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fluid-bars",
3
+ "file": "fluid-bars.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FluidBars = () => (\n <div className=\"flex space-x-1\">\n {[0,1,2,3].map(i => (\n <motion.div\n key={i}\n className=\"w-1.5 h-8 bg-zinc-800 dark:bg-white rounded-full origin-bottom\"\n animate={{ rotate: [-15, 15, -15], scaleY: [0.8, 1, 0.8] }}\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": "fluid-diamond",
3
+ "file": "fluid-diamond.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FluidDiamond = () => (\n <motion.div\n className=\"w-6 h-6 bg-zinc-800 dark:bg-white rounded-sm\"\n style={{ rotate: 45 }}\n animate={{ scaleX: [1, 1.5, 1], scaleY: [1, 0.5, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"easeInOut\" }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fluid-dot-orbit",
3
+ "file": "fluid-dot-orbit.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FluidDotOrbit = () => (\n <div className=\"relative w-10 h-10 flex items-center justify-center\">\n <div className=\"w-2.5 h-2.5 bg-zinc-800 dark:bg-white rounded-full\" />\n <motion.div\n className=\"absolute inset-0\"\n animate={{ rotate: 360 }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n >\n <div className=\"w-2 h-2 bg-zinc-500 dark:bg-zinc-350 rounded-full absolute top-1 left-1/2 -ml-1\" />\n </motion.div>\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fluid-skeleton",
3
+ "file": "fluid-skeleton.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const FluidSkeleton = () => (\n <div className=\"w-24 h-10 bg-zinc-200 dark:bg-zinc-800 rounded-xl overflow-hidden relative\">\n <motion.div\n className=\"absolute inset-0 bg-gradient-to-r from-transparent via-white/60 to-transparent\"\n animate={{ x: [\"-100%\", \"200%\"] }}\n transition={{ duration: 1.5, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "gears",
3
+ "file": "gears.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const Gears = () => {\n return (\n <div className=\"flex space-x-[-4px]\">\n <motion.div\n className=\"w-8 h-8 border-4 border-dashed border-zinc-800 dark:border-zinc-700 rounded-full\"\n animate={{ rotate: 360 }}\n transition={{ duration: 4, repeat: Infinity, ease: \"linear\" }}\n />\n <motion.div\n className=\"w-6 h-6 border-[3px] border-dashed border-zinc-500 rounded-full mt-3\"\n animate={{ rotate: -360 }}\n transition={{ duration: 3, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "glassmorphic-card",
3
+ "file": "glassmorphic-card.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const GlassmorphicCard = () => (\n <div className=\"w-20 h-16 bg-zinc-100 dark:bg-zinc-800/50 backdrop-blur-md border border-white/50 rounded-2xl shadow-sm flex items-center justify-center relative overflow-hidden\">\n <motion.div\n className=\"absolute w-12 h-12 bg-zinc-300 dark:bg-zinc-700 rounded-full blur-xl -z-10\"\n animate={{ x: [-20, 20, -20], y: [-10, 10, -10] }}\n transition={{ duration: 3, repeat: Infinity, ease: \"easeInOut\" }}\n />\n <div className=\"w-5 h-5 border-2 border-zinc-800 dark:border-zinc-700 border-t-transparent rounded-full animate-spin\" />\n </div>\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "glow-button",
3
+ "file": "glow-button.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React, { useRef, useState } from 'react';\nimport { motion } from 'framer-motion';\n\ninterface GlowButtonProps {\n children: React.ReactNode;\n className?: string;\n glowColor?: string;\n onClick?: () => void;\n}\n\nexport function GlowButton({\n children,\n className = '',\n glowColor = 'rgba(59, 130, 246, 0.15)', // Light blue default\n onClick,\n}: GlowButtonProps) {\n const containerRef = useRef<HTMLButtonElement>(null);\n const [coords, setCoords] = useState({ x: 0, y: 0 });\n const [opacity, setOpacity] = useState(0);\n\n const handleMouseMove = (e: React.MouseEvent<HTMLButtonElement>) => {\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 <button\n ref={containerRef}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setOpacity(1)}\n onMouseLeave={() => setOpacity(0)}\n onClick={onClick}\n className={`relative overflow-hidden inline-flex items-center justify-center rounded-xl bg-neutral-900 border border-neutral-800 text-white font-medium text-sm h-11 px-6 shadow-md transition-colors hover:border-neutral-700 cursor-pointer ${className}`}\n >\n {/* Dynamic Cursor Glow Layer */}\n <motion.div\n className=\"pointer-events-none absolute -inset-px rounded-xl opacity-0 transition-opacity duration-300\"\n style={{\n opacity,\n background: `radial-gradient(120px circle at ${coords.x}px ${coords.y}px, ${glowColor}, transparent 80%)`,\n }}\n />\n \n {/* Content wrapper */}\n <span className=\"relative z-10\">{children}</span>\n </button>\n );\n}\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "gradient-arc",
3
+ "file": "gradient-arc.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const GradientArc = () => {\n return (\n <div className=\"relative w-10 h-10 flex items-center justify-center\">\n <motion.div\n className=\"w-10 h-10 rounded-full\"\n style={{\n background: \"linear-gradient(135deg, #00f2fe 0%, #4facfe 100%)\",\n maskImage: \"radial-gradient(transparent 55%, black 60%)\",\n WebkitMaskImage: \"radial-gradient(transparent 55%, black 60%)\",\n }}\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": "grid-dots",
3
+ "file": "grid-dots.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const GridDots = () => {\n return (\n <div className=\"grid grid-cols-3 gap-1.5\">\n {[0, 1, 2, 3, 4, 5, 6, 7, 8].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={{ scale: [1, 0.5, 1], opacity: [1, 0.3, 1] }}\n transition={{ duration: 1.5, repeat: Infinity, delay: (i % 3) * 0.2 + Math.floor(i / 3) * 0.2, ease: \"easeInOut\" }}\n />\n ))}\n </div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "haptic-ring",
3
+ "file": "haptic-ring.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const HapticRing = () => (\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: [0, 90, 180, 270, 360] }}\n transition={{ duration: 2, repeat: Infinity, type: \"spring\", bounce: 0.4 }}\n />\n);\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "heartbeat",
3
+ "file": "heartbeat.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const Heartbeat = () => {\n return (\n <svg className=\"w-16 h-8 overflow-visible\" viewBox=\"0 0 64 32\">\n <motion.polyline\n points=\"0,16 16,16 24,4 32,28 40,16 64,16\"\n className=\"stroke-zinc-800 dark:stroke-white fill-none\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n strokeDasharray=\"100\"\n animate={{ strokeDashoffset: [100, -100] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n />\n </svg>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "hexagon-spinner",
3
+ "file": "hexagon-spinner.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const HexagonSpinner = () => {\n return (\n <svg className=\"w-10 h-10\" viewBox=\"0 0 50 50\">\n <polygon points=\"25,5 45,15 45,35 25,45 5,35 5,15\" className=\"stroke-zinc-200 dark:stroke-zinc-800 fill-none\" strokeWidth=\"4\" />\n <motion.polygon\n points=\"25,5 45,15 45,35 25,45 5,35 5,15\"\n className=\"stroke-zinc-800 dark:stroke-white fill-none\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"120\"\n animate={{ strokeDashoffset: [120, -120] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n />\n </svg>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "hourglass",
3
+ "file": "hourglass.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const Hourglass = () => {\n return (\n <motion.div\n className=\"w-8 h-10 flex flex-col items-center justify-between\"\n animate={{ rotate: [0, 180, 180, 360, 360] }}\n transition={{ duration: 3, repeat: Infinity, ease: \"easeInOut\" }}\n >\n <div className=\"w-8 h-0 border-t-[16px] border-t-zinc-800 dark:border-t-white border-l-[16px] border-l-transparent border-r-[16px] border-r-transparent origin-bottom\" />\n <div className=\"w-8 h-0 border-b-[16px] border-b-zinc-800 dark:border-b-white border-l-[16px] border-l-transparent border-r-[16px] border-r-transparent origin-top\" />\n </motion.div>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "infinity-path",
3
+ "file": "infinity-path.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const InfinityPath = () => {\n return (\n <svg className=\"w-12 h-6 overflow-visible\" viewBox=\"0 0 60 30\">\n <path\n d=\"M 15 15 C 15 5, 25 5, 30 15 C 35 25, 45 25, 45 15 C 45 5, 35 5, 30 15 C 25 25, 15 25, 15 15\"\n className=\"stroke-zinc-200 dark:stroke-zinc-800 fill-none\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <motion.path\n d=\"M 15 15 C 15 5, 25 5, 30 15 C 35 25, 45 25, 45 15 C 45 5, 35 5, 30 15 C 25 25, 15 25, 15 15\"\n className=\"stroke-zinc-800 dark:stroke-white fill-none\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"100\"\n animate={{ strokeDashoffset: [100, -100] }}\n transition={{ duration: 2, repeat: Infinity, ease: \"linear\" }}\n />\n </svg>\n );\n};\n"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "intersecting-rings",
3
+ "file": "intersecting-rings.tsx",
4
+ "dependencies": [
5
+ "framer-motion"
6
+ ],
7
+ "content": "\"use client\";\nimport React from 'react';\nimport { motion } from 'framer-motion';\n\nexport const IntersectingRings = () => {\n return (\n <div className=\"relative w-12 h-12 flex items-center justify-center [perspective:800px]\">\n <motion.div\n className=\"absolute w-10 h-10 border-2 border-t-zinc-800 dark:border-t-white border-r-zinc-800/30 dark:border-r-white/30 border-b-zinc-800/10 dark:border-b-white/10 border-l-transparent rounded-full\"\n style={{ transformStyle: \"preserve-3d\" }}\n animate={{ rotateX: 360, rotateY: 180 }}\n transition={{ duration: 2.2, repeat: Infinity, ease: \"linear\" }}\n />\n <motion.div\n className=\"absolute w-10 h-10 border-2 border-b-zinc-800 dark:border-b-white border-t-zinc-800/30 dark:border-t-white/30 border-l-zinc-800/10 dark:border-l-white/10 border-r-transparent rounded-full\"\n style={{ transformStyle: \"preserve-3d\" }}\n animate={{ rotateX: 180, rotateY: 360 }}\n transition={{ duration: 2.2, repeat: Infinity, ease: \"linear\" }}\n />\n </div>\n );\n};\n"
8
+ }