{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "content-quote",
  "title": "Content Quote",
  "description": "Payload content block: a media panel beside body copy and a cited pull quote.",
  "registryDependencies": [
    "badge"
  ],
  "files": [
    {
      "path": "payload-components/source/blocks/shared/contentFields.ts",
      "content": "import type { Field } from 'payload'\n\n/**\n * Shared field core for the Content component family.\n *\n * Every content variant (content-columns, content-image-lead,\n * content-feature-media, content-feature-split, content-showcase,\n * content-quote, content-community, …) spreads these heading fields first and\n * then appends its own variant-specific shape — the media upload, feature\n * list, pull quote, or avatar wall that differs per layout. Editing the shared\n * eyebrow/title/paragraphs shape here updates every installed content block at\n * once, so the family never drifts field-by-field across a repo.\n *\n * The body copy is a repeatable `paragraphs` array of plain textareas (the\n * tailark content sections lead with one or two short marketing paragraphs);\n * editors add or remove paragraphs without a rich-text dependency.\n *\n * Installed once per repo at `src/blocks/shared/contentFields.ts`; re-running\n * `payload-components add content-*` never overwrites a copy you have already edited.\n */\nexport const contentFields: Field[] = [\n  {\n    name: 'eyebrow',\n    type: 'text',\n  },\n  {\n    name: 'title',\n    type: 'text',\n    required: true,\n  },\n  {\n    name: 'paragraphs',\n    type: 'array',\n    minRows: 1,\n    maxRows: 4,\n    admin: {\n      initCollapsed: true,\n    },\n    fields: [\n      {\n        name: 'text',\n        type: 'textarea',\n        required: true,\n      },\n    ],\n  },\n]\n",
      "type": "registry:file",
      "target": "~/src/blocks/shared/contentFields.ts"
    },
    {
      "path": "payload-components/source/blocks/ContentQuote/config.ts",
      "content": "import type { Block } from 'payload'\n\nimport { contentFields } from '@/blocks/shared/contentFields'\n\nexport const ContentQuote: Block = {\n  slug: 'contentQuote',\n  // Existing apps must migrate stored data before adopting this identifier:\n  // https://www.payload-components.xyz/docs/registry#installed-source-and-migrations\n  dbName: 'pc_con_quo',\n  interfaceName: 'ContentQuoteBlock',\n  fields: [\n    // Shared content core (eyebrow, title, paragraphs). Variant-specific fields\n    // follow; edit the shared shape in @/blocks/shared/contentFields.\n    ...contentFields,\n    {\n      name: 'image',\n      type: 'upload',\n      relationTo: 'media',\n    },\n    {\n      name: 'quote',\n      type: 'textarea',\n      required: true,\n    },\n    {\n      name: 'citation',\n      type: 'text',\n      required: true,\n    },\n    {\n      name: 'logo',\n      type: 'upload',\n      relationTo: 'media',\n      admin: {\n        description: 'Small logo shown under the citation. Falls back to Logo label when empty.',\n      },\n    },\n    {\n      name: 'logoLabel',\n      type: 'text',\n      admin: {\n        description:\n          'Text wordmark used when no logo upload is set. Leave both empty for an unbadged quote.',\n      },\n    },\n  ],\n  labels: {\n    plural: 'Content Quote Blocks',\n    singular: 'Content Quote',\n  },\n}\n",
      "type": "registry:file",
      "target": "~/src/blocks/ContentQuote/config.ts"
    },
    {
      "path": "payload-components/source/blocks/ContentQuote/Component.tsx",
      "content": "import React from 'react'\n\nimport type { ContentQuoteBlock as ContentQuoteBlockData } from '@/payload-types'\n\nimport { Media } from '@/components/Media'\nimport { Badge } from '@/components/ui/badge'\nimport { cn } from '@/utilities/ui'\n\ntype Props = ContentQuoteBlockData & {\n  id?: string\n  className?: string\n  disableInnerContainer?: boolean\n}\n\nexport const ContentQuoteBlock: React.FC<Props> = ({\n  citation,\n  className,\n  disableInnerContainer,\n  eyebrow,\n  id,\n  image,\n  logo,\n  logoLabel,\n  paragraphs,\n  quote,\n  title,\n}) => {\n  return (\n    <section className={cn('container', className)} id={id ? `block-${id}` : undefined}>\n      <div className=\"overflow-hidden rounded-frame border border-border/70 bg-card/35 px-6 py-10 sm:px-8 lg:px-12 lg:py-14\">\n        <div\n          className={cn('grid gap-10 lg:grid-cols-2 lg:items-center lg:gap-16', {\n            'mx-auto max-w-5xl': !disableInnerContainer,\n          })}\n        >\n          {image ? (\n            <div className=\"overflow-hidden rounded-panel border border-border/70\">\n              <Media resource={image} imgClassName=\"h-full w-full object-cover\" />\n            </div>\n          ) : null}\n\n          <div className=\"flex flex-col gap-6\">\n            {eyebrow ? (\n              <Badge variant=\"outline\" className=\"w-fit rounded-full px-3 py-1 uppercase tracking-eyebrow\">\n                {eyebrow}\n              </Badge>\n            ) : null}\n\n            <h2 className=\"text-4xl font-medium tracking-display text-balance\">{title}</h2>\n\n            {paragraphs && paragraphs.length > 0\n              ? paragraphs.map((paragraph, index) => (\n                  <p className=\"text-base leading-7 text-muted-foreground\" key={paragraph.id ?? index}>\n                    {paragraph.text}\n                  </p>\n                ))\n              : null}\n\n            <blockquote className=\"border-s-2 border-border ps-4\">\n              <p className=\"text-base leading-7 text-foreground\">{quote}</p>\n              <div className=\"mt-4 flex flex-col gap-3\">\n                <cite className=\"text-sm font-medium not-italic text-foreground\">{citation}</cite>\n                {logo ? (\n                  <Media resource={logo} imgClassName=\"h-6 w-auto object-contain opacity-70\" />\n                ) : logoLabel ? (\n                  <span className=\"text-sm font-medium text-muted-foreground\">{logoLabel}</span>\n                ) : null}\n              </div>\n            </blockquote>\n          </div>\n        </div>\n      </div>\n    </section>\n  )\n}\n",
      "type": "registry:file",
      "target": "~/src/blocks/ContentQuote/Component.tsx"
    }
  ],
  "meta": {
    "payloadComponent": {
      "installCommand": "payload-components add content-quote",
      "postInstall": [
        "generate:types",
        "generate:importmap"
      ],
      "requiresPayloadComponentWrapper": true,
      "supportedTargets": [
        "payload-website-starter",
        "payload-blocks-app"
      ]
    }
  },
  "docs": "Payload Components installs this as a Payload CMS block for the Payload website starter shape.\n\nRecommended install:\n\n```bash\npnpm payload-components add content-quote\n```\n\nDirect shadcn install URL:\n\n```bash\npnpm dlx shadcn@latest add https://www.payload-components.xyz/r/content-quote.json\n```\n\nDirect shadcn installs only copy the block source files and shadcn UI dependencies. Use `payload-components add content-quote` when you also want Payload layout registration, `RenderBlocks` wiring, `generate:types`, and `generate:importmap` handled for you.",
  "type": "registry:block"
}