{ "name": "testimonial-marquee", "type": "registry:ui", "dependencies": [ "framer-motion" ], "registryDependencies": [], "description": "A smooth, infinite scrolling marquee component for showcasing social proof and testimonials.", "files": [ { "path": "components/ui/testimonial-marquee.tsx", "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"@workspace/ui/lib/utils\"\n\nexport interface Testimonial {\n name: string\n text: string\n avatar: string\n role?: string\n username?: string\n profileLink?: string\n}\n\nexport interface TestimonialMarqueeProps {\n items: Testimonial[]\n variant?: \"default\" | \"stacked\" | \"dual\" | \"flush\" | \"flush-dual\"\n className?: string\n speed?: number\n containerClassName?: string\n}\n\n\nconst MarqueeStyles = React.memo(() => (\n \n))\nMarqueeStyles.displayName = \"MarqueeStyles\"\n\nconst MarqueeRow = React.memo(({\n children,\n direction = \"left\",\n speed = 40,\n className,\n pauseOnHover = true\n}: {\n children: React.ReactNode,\n direction?: \"left\" | \"right\"\n speed?: number,\n className?: string,\n pauseOnHover?: boolean\n}) => {\n return (\n
\n "{item.text}"\n
\n\n\n "{item.text}"\n
\n\n