{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "json-ld",
  "title": "JSON-LD",
  "description": "Site graph, article, FAQ, and breadcrumb JSON-LD helpers.",
  "registryDependencies": [
    "@atroui/brand",
    "@atroui/site-url",
    "@atroui/seo"
  ],
  "files": [
    {
      "path": "registry/default/blocks/json-ld.tsx",
      "content": "import { getBrand } from \"@/lib/brand\"\nimport { getSiteDomain } from \"@/lib/seo\"\nimport { getSiteUrl } from \"@/lib/site-url\"\n\nfunction serializeJsonLd(data: unknown): string {\n  return JSON.stringify(data).replace(/</g, \"\\u003c\")\n}\n\n\ntype OrgJsonLdProps = {\n  name?: string\n}\n\nexport function SiteGraphJsonLd({ name }: OrgJsonLdProps = {}) {\n  const brand = getBrand()\n  const orgName = name ?? brand.name\n  const siteUrl = getSiteUrl()\n  const domain = getSiteDomain()\n  const orgId = `${siteUrl}#organization`\n  const webId = `${siteUrl}#website`\n\n  const data = {\n    \"@context\": \"https://schema.org\",\n    \"@graph\": [\n      {\n        \"@type\": \"Organization\",\n        \"@id\": orgId,\n        name: orgName,\n        alternateName: [domain],\n        url: siteUrl,\n        logo: {\n          \"@type\": \"ImageObject\",\n          url: `${siteUrl}/favicon-192.png`,\n          width: 192,\n          height: 192,\n        },\n        description: brand.tagline,\n      },\n      {\n        \"@type\": \"WebSite\",\n        \"@id\": webId,\n        name: orgName,\n        alternateName: [domain],\n        url: siteUrl,\n        inLanguage: \"en-US\",\n        publisher: { \"@id\": orgId },\n      },\n    ],\n  }\n\n  return (\n    <script\n      type=\"application/ld+json\"\n      dangerouslySetInnerHTML={{ __html: serializeJsonLd(data) }}\n    />\n  )\n}\n\nexport function ArticleJsonLd({\n  title,\n  description,\n  slug,\n  date,\n  dateModified,\n  author,\n  image,\n  basePath = \"/blog\",\n}: {\n  title: string\n  description: string\n  slug: string\n  date: string\n  dateModified?: string\n  author?: string\n  image?: string\n  basePath?: string\n}) {\n  const siteUrl = getSiteUrl()\n  const brandName = getBrand().name\n  const authorName = author ?? brandName\n  const segment = basePath.startsWith(\"/\") ? basePath : `/${basePath}`\n  const pageUrl = `${siteUrl}${segment}/${slug}`\n  const imageUrl = image?.startsWith(\"http\")\n    ? image\n    : image\n      ? `${siteUrl}${image.startsWith(\"/\") ? image : `/${image}`}`\n      : `${siteUrl}${segment}/${slug}/opengraph-image`\n\n  const data = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"Article\",\n    headline: title,\n    description,\n    datePublished: date,\n    dateModified: dateModified ?? date,\n    image: imageUrl,\n    mainEntityOfPage: {\n      \"@type\": \"WebPage\",\n      \"@id\": pageUrl,\n    },\n    author: {\n      \"@type\": \"Organization\",\n      name: authorName,\n      url: siteUrl,\n    },\n    publisher: {\n      \"@type\": \"Organization\",\n      name: brandName,\n      logo: { \"@type\": \"ImageObject\", url: `${siteUrl}/icon` },\n    },\n  }\n  return (\n    <script\n      type=\"application/ld+json\"\n      dangerouslySetInnerHTML={{ __html: serializeJsonLd(data) }}\n    />\n  )\n}\n\nexport function BreadcrumbJsonLd({\n  items,\n}: {\n  items: Array<{ name: string; href: string }>\n}) {\n  const siteUrl = getSiteUrl()\n  const data = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BreadcrumbList\",\n    itemListElement: items.map((item, index) => ({\n      \"@type\": \"ListItem\",\n      position: index + 1,\n      name: item.name,\n      item: item.href.startsWith(\"http\")\n        ? item.href\n        : `${siteUrl}${item.href.startsWith(\"/\") ? item.href : `/${item.href}`}`,\n    })),\n  }\n  return (\n    <script\n      type=\"application/ld+json\"\n      dangerouslySetInnerHTML={{ __html: serializeJsonLd(data) }}\n    />\n  )\n}\n\nexport function FaqJsonLd({\n  items,\n  pagePath = \"/\",\n}: {\n  items: Array<{ question: string; answer: string } | { q: string; a: string }>\n  pagePath?: string\n}) {\n  const siteUrl = getSiteUrl()\n  const pageUrl = `${siteUrl}${pagePath.startsWith(\"/\") ? pagePath : `/${pagePath}`}`\n  const data = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"FAQPage\",\n    mainEntityOfPage: pageUrl,\n    mainEntity: items.map((item) => {\n      const question = \"question\" in item ? item.question : item.q\n      const answer = \"answer\" in item ? item.answer : item.a\n      return {\n        \"@type\": \"Question\",\n        name: question,\n        acceptedAnswer: {\n          \"@type\": \"Answer\",\n          text: answer,\n        },\n      }\n    }),\n  }\n  return (\n    <script\n      type=\"application/ld+json\"\n      dangerouslySetInnerHTML={{ __html: serializeJsonLd(data) }}\n    />\n  )\n}\n",
      "type": "registry:component",
      "target": "components/blocks/json-ld.tsx"
    }
  ],
  "type": "registry:block"
}