{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "testimonial-single",
  "type": "registry:block",
  "title": "Testimonial — single",
  "description": "One large customer quote, with an optional portrait beside it or a tinted background.",
  "categories": [
    "section"
  ],
  "registryDependencies": [
    "https://facadeui.dev/r/container.json",
    "https://facadeui.dev/r/section.json",
    "https://facadeui.dev/r/testimonial.json",
    "https://facadeui.dev/r/types.json",
    "https://facadeui.dev/r/utils.json"
  ],
  "files": [
    {
      "path": "src/sections/testimonial-single.tsx",
      "type": "registry:component",
      "target": "components/sections/testimonial-single.tsx",
      "content": "/**\n * TestimonialSingle — one quote, given the whole band.\n *\n * The featured counterpart to `TestimonialsGrid`: a single quote at display\n * size, optionally beside a portrait or over a tinted surface.\n *\n * a11y: as with every testimonial, the quote is a `<blockquote>` and the\n * attribution a `<figcaption>` outside it. The company logo, when given, is\n * `alt=\"\"` — the company name is already in the attribution text, so announcing\n * both would be noise.\n *\n * Dependencies: react, @/lib/types, @/lib/utils,\n * @/components/ui/container, @/components/ui/section, @/components/ui/testimonial.\n */\n\nimport type { ElementType, ReactNode } from \"react\"\n\nimport type { ImageComponent, SectionBaseProps } from \"@/lib/types\"\nimport { cn, slugId } from \"@/lib/utils\"\nimport { Container } from \"@/components/ui/container\"\nimport { Section } from \"@/components/ui/section\"\nimport { Testimonial, type TestimonialItem } from \"@/components/ui/testimonial\"\n\nexport interface TestimonialSingleProps extends Omit<SectionBaseProps, \"headingLevel\"> {\n  item: TestimonialItem\n  image?: ImageComponent\n  /** A section name only screen readers get, so the section can be a landmark. */\n  title?: string\n  /** Company logo shown above the quote. Decorative. */\n  logoSrc?: string\n  logoAlt?: string\n  /** Portrait or media beside the quote. */\n  media?: ReactNode\n  variant?: \"plain\" | \"muted\" | \"card\"\n  align?: \"start\" | \"center\"\n  children?: ReactNode\n}\n\nconst surfaces = {\n  plain: \"\",\n  muted: \"bg-muted rounded-2xl px-6 py-12 sm:px-12\",\n  card: \"bg-card text-card-foreground rounded-2xl border px-6 py-12 sm:px-12\",\n} as const\n\nexport function TestimonialSingle({\n  item,\n  image,\n  title,\n  logoSrc,\n  logoAlt = \"\",\n  media,\n  variant = \"plain\",\n  align = \"center\",\n  as,\n  spacing = \"md\",\n  className,\n  id,\n  children,\n}: TestimonialSingleProps) {\n  const Image = (image ?? \"img\") as ElementType\n  const titleId = title ? (id ? `${id}-title` : slugId(title)) : undefined\n\n  return (\n    <Section\n      as={as ?? (title ? \"section\" : \"div\")}\n      spacing={spacing}\n      labelledBy={titleId}\n      id={id}\n      className={className}\n    >\n      <Container size={media ? \"lg\" : \"md\"}>\n        {title ? (\n          <h2 id={titleId} className=\"sr-only\">\n            {title}\n          </h2>\n        ) : null}\n\n        <div\n          className={cn(\n            surfaces[variant],\n            media &&\n              \"grid items-center gap-10 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]\",\n          )}\n        >\n          <div\n            className={cn(\n              \"flex flex-col gap-8\",\n              align === \"center\" && !media && \"items-center\",\n            )}\n          >\n            {logoSrc ? (\n              <Image\n                src={logoSrc}\n                alt={logoAlt}\n                loading=\"lazy\"\n                decoding=\"async\"\n                className=\"h-7 w-auto object-contain opacity-70\"\n              />\n            ) : null}\n\n            <Testimonial\n              {...item}\n              image={image}\n              size=\"lg\"\n              variant=\"plain\"\n              className={cn(align === \"center\" && !media && \"items-center text-center\")}\n            />\n\n            {children}\n          </div>\n\n          {media ? <div className=\"min-w-0\">{media}</div> : null}\n        </div>\n      </Container>\n    </Section>\n  )\n}\n"
    }
  ],
  "docs": "Import styles/facade-tokens.css in your global stylesheet, after @import \"tailwindcss\". Set headingLevel to fit the page outline (sections default to h2). Pass next/link and next/image through the link and image props. Docs: https://facadeui.dev/components/testimonial-single"
}
