{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "stats-proof",
  "title": "Stats Proof",
  "description": "Narrative and prominent string metrics paired with semantic customer proof.",
  "registryDependencies": [
    "badge"
  ],
  "files": [
    {
      "path": "payload-components/source/blocks/shared/statsFields.ts",
      "content": "import type { Field } from 'payload'\n\n/**\n * Shared field core for the Stats component family.\n *\n * Every stats variant (stats-proof, stats-grid, stats-card, stats-inline, …)\n * spreads `statsFields` first for the shared eyebrow/title heading, then appends\n * its own variant-specific shape — the narrative-plus-quote proof panel, the bare\n * number band, the divided card row, or the bordered sentence rows. Editing the\n * shared heading here updates every installed stats block at once, so the family\n * never drifts field-by-field across a repo.\n *\n * `statsMetricFields` is the one-figure shape (display value plus its label)\n * reused by every variant, so a metric reads the same wherever it appears. The\n * value stays a free-text string rather than a number: real stat bands mix\n * `99.9%`, `+1,200`, `22M`, and `24/7`, and formatting them belongs to the editor\n * rather than to a locale-sensitive number formatter at render time.\n *\n * Installed once per repo at `src/blocks/shared/statsFields.ts`; re-running\n * `payload-components add stats-*` never overwrites a copy you have already edited.\n */\nexport const statsFields: Field[] = [\n  {\n    name: 'eyebrow',\n    type: 'text',\n  },\n  {\n    name: 'title',\n    type: 'text',\n    required: true,\n  },\n]\n\nexport const statsMetricFields: Field[] = [\n  {\n    name: 'value',\n    type: 'text',\n    required: true,\n  },\n  {\n    name: 'label',\n    type: 'text',\n    required: true,\n  },\n]\n",
      "type": "registry:file",
      "target": "~/src/blocks/shared/statsFields.ts"
    },
    {
      "path": "payload-components/source/blocks/StatsProof/config.ts",
      "content": "import type { Block } from 'payload'\n\nimport { statsFields, statsMetricFields } from '@/blocks/shared/statsFields'\n\nexport const StatsProof: Block = {\n  slug: 'statsProof',\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_stats_proof',\n  interfaceName: 'StatsProofBlock',\n  fields: [\n    // Shared stats core (eyebrow, title). Variant-specific fields follow; edit the\n    // shared shape in @/blocks/shared/statsFields.\n    ...statsFields,\n    {\n      name: 'description',\n      type: 'textarea',\n      required: true,\n    },\n    {\n      name: 'body',\n      type: 'textarea',\n    },\n    {\n      name: 'metrics',\n      type: 'array',\n      required: true,\n      minRows: 2,\n      maxRows: 4,\n      admin: {\n        initCollapsed: true,\n      },\n      // Shared metric shape — see @/blocks/shared/statsFields.\n      fields: statsMetricFields,\n    },\n    {\n      name: 'quote',\n      type: 'textarea',\n      required: true,\n    },\n    {\n      name: 'author',\n      type: 'text',\n      required: true,\n    },\n    {\n      name: 'role',\n      type: 'text',\n    },\n    {\n      name: 'logo',\n      type: 'upload',\n      relationTo: 'media',\n      admin: {\n        description: 'Customer logo shown above the quote. 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 — for customers whose mark you do not have as an asset.',\n      },\n    },\n  ],\n  labels: {\n    plural: 'Stats Proof Blocks',\n    singular: 'Stats Proof',\n  },\n}\n",
      "type": "registry:file",
      "target": "~/src/blocks/StatsProof/config.ts"
    },
    {
      "path": "payload-components/source/blocks/StatsProof/Component.tsx",
      "content": "import React from 'react'\n\nimport type { StatsProofBlock as StatsProofBlockData } from '@/payload-types'\n\nimport { Media } from '@/components/Media'\nimport { Badge } from '@/components/ui/badge'\nimport { cn } from '@/utilities/ui'\n\n// Layout adapted from tailark/blocks (MIT) — re-implemented as a Payload block.\n\ntype Props = StatsProofBlockData & {\n  id?: string\n  className?: string\n  disableInnerContainer?: boolean\n}\n\nexport const StatsProofBlock: React.FC<Props> = ({\n  author,\n  body,\n  className,\n  description,\n  disableInnerContainer,\n  eyebrow,\n  id,\n  logo,\n  logoLabel,\n  metrics,\n  quote,\n  role,\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-[1fr_1.05fr] lg:items-start lg:gap-16', {\n            'mx-auto max-w-6xl': !disableInnerContainer,\n          })}\n        >\n          <div className=\"flex flex-col gap-8\">\n            <div className=\"flex flex-col gap-4\">\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 sm:text-5xl\">{title}</h2>\n              <p className=\"text-base leading-7 text-muted-foreground sm:text-lg\">{description}</p>\n              {body ? <p className=\"text-base leading-7 text-muted-foreground\">{body}</p> : null}\n            </div>\n\n            {metrics && metrics.length > 0 ? (\n              <dl className=\"grid grid-cols-2 gap-x-6 gap-y-8\">\n                {metrics.map((metric, index) => (\n                  <div\n                    key={metric.id ?? `${metric.value}-${index}`}\n                    className=\"flex flex-col-reverse border-t border-border/70 pt-5\"\n                  >\n                    <dt className=\"mt-2 text-sm leading-6 text-muted-foreground\">{metric.label}</dt>\n                    <dd className=\"text-4xl font-medium tracking-display text-foreground sm:text-5xl\">\n                      {metric.value}\n                    </dd>\n                  </div>\n                ))}\n              </dl>\n            ) : null}\n          </div>\n\n          <figure className=\"rounded-panel border border-border/70 bg-background/85 p-6 sm:p-8\">\n            {logo || logoLabel ? (\n              <div className=\"mb-8 flex h-9 items-center\">\n                {logo ? (\n                  <Media resource={logo} imgClassName=\"h-9 w-auto object-contain object-left\" />\n                ) : (\n                  <span className=\"font-medium tracking-title text-foreground\">{logoLabel}</span>\n                )}\n              </div>\n            ) : null}\n            <blockquote className=\"text-pretty text-xl leading-8 text-foreground sm:text-2xl\">\n              {quote}\n            </blockquote>\n            <figcaption className=\"mt-8 flex flex-col gap-1\">\n              <cite className=\"text-sm font-medium not-italic text-foreground\">{author}</cite>\n              {role ? <span className=\"text-sm text-muted-foreground\">{role}</span> : null}\n            </figcaption>\n          </figure>\n        </div>\n      </div>\n    </section>\n  )\n}\n",
      "type": "registry:file",
      "target": "~/src/blocks/StatsProof/Component.tsx"
    }
  ],
  "meta": {
    "payloadComponent": {
      "installCommand": "payload-components add stats-proof",
      "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 stats-proof\n```\n\nDirect shadcn install URL:\n\n```bash\npnpm dlx shadcn@latest add https://www.payload-components.xyz/r/stats-proof.json\n```\n\nDirect shadcn installs only copy the block source files and shadcn UI dependencies. Use `payload-components add stats-proof` when you also want Payload layout registration, `RenderBlocks` wiring, `generate:types`, and `generate:importmap` handled for you.",
  "type": "registry:block"
}