{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "case-study-tabs", "type": "registry:ui", "title": "Case Study Tabs", "description": "A tabbed customer-testimonial block with embossed stars, brand-logo tabs, an animated underline indicator that adopts each brand's accent color, a featured case-study paragraph with CTA, and a pull-quote with author.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "tabs" ], "files": [ { "path": "registry/ruixenui/case-study-tabs.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\nimport { ChevronRight, Star } from \"lucide-react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { cn } from \"@/lib/utils\";\n\n/* ── types ───────────────────────────────────────────────────── */\n\nexport interface CaseStudyTabsBrand {\n /** Unique tab id. */\n id: string;\n /** Accessible label for screen readers. */\n name: string;\n /** Logo node — typically an inline SVG. */\n logo: React.ReactNode;\n /** CSS color string used for the animated underline indicator. Defaults to `currentColor`. */\n accentColor?: string;\n}\n\nexport interface CaseStudyAuthor {\n name: string;\n role: string;\n /** Image URL for the avatar. */\n avatarUrl?: string;\n /** Initials/letter fallback when `avatarUrl` is omitted. */\n avatarFallback?: string;\n}\n\nexport interface CaseStudy {\n brand: CaseStudyTabsBrand;\n /** Featured headline paragraph rendered in large type. Omit to render testimonial-only. */\n headline?: React.ReactNode;\n /** Optional \"Read case study\" CTA. */\n cta?: { label: string; href: string };\n /** Pull-quote rendered with curly-quote pseudo-elements. */\n quote: React.ReactNode;\n author: CaseStudyAuthor;\n}\n\nexport interface CaseStudyTabsProps {\n cases: CaseStudy[];\n defaultCaseId?: string;\n /** Decorative embossed stars rendered above the tab bar. Set to 0 to hide. */\n starCount?: number;\n className?: string;\n}\n\n/* ── stars row ───────────────────────────────────────────────── */\n\nfunction StarsRow({ count }: { count: number }) {\n return (\n
\n {c.headline}\n
\n )}\n {c.cta && (\n \n {c.cta.label}\n\n {c.quote}\n
\n\n {c.author.name}\n
\n\n {c.author.role}\n
\n