{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "testimonial-grid", "title": "Testimonial Grid", "description": "Masonry-style testimonial grid with staggered entrance animations", "dependencies": [ "motion" ], "files": [ { "path": "registry/pioneerui/testimonial-grid.tsx", "content": "\"use client\"\n\nimport React from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface TestimonialGridItem {\n quote: string\n name: string\n role?: string\n company?: string\n avatar?: string\n rating?: number\n}\n\nexport interface TestimonialGridProps extends React.HTMLAttributes {\n items: TestimonialGridItem[]\n columns?: 2 | 3\n animated?: boolean\n}\n\nfunction StarRating({ rating }: { rating: number }) {\n return (\n
\n {Array.from({ length: 5 }).map((_, i) => (\n \n \n \n ))}\n
\n )\n}\n\nexport function TestimonialGrid({\n items,\n columns = 3,\n animated = true,\n className,\n ...props\n}: TestimonialGridProps) {\n const colClass = {\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n }[columns]\n\n return (\n
\n {items.map((item, i) => {\n const card = (\n \n {item.rating !== undefined && }\n
\n “{item.quote}”\n
\n
\n {item.avatar ? (\n \n ) : (\n
\n {item.name.charAt(0)}\n
\n )}\n
\n

{item.name}

\n {(item.role || item.company) && (\n

\n {item.role}\n {item.role && item.company ? \" ยท \" : \"\"}\n {item.company}\n

\n )}\n
\n
\n
\n )\n\n if (!animated) return card\n\n return (\n \n {card}\n \n )\n })}\n \n )\n}\n", "type": "registry:ui", "target": "components/pioneerui/testimonial-grid.tsx" } ], "type": "registry:ui" }