{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "calendly-embed",
  "title": "Calendly Embed",
  "description": "Theme-aware Calendly iframe with editable CONTENT and email fallback.",
  "dependencies": [
    "lucide-react"
  ],
  "registryDependencies": [
    "@atroui/brand"
  ],
  "files": [
    {
      "path": "registry/default/blocks/calendly-embed.tsx",
      "content": "\"use client\"\n\nimport { ExternalLink } from \"lucide-react\"\nimport { useEffect, useMemo, useState } from \"react\"\n\nimport { getBrand } from \"@/lib/brand\"\n\n/**\n * Edit CONTENT for fallback copy and default Calendly URL.\n * Prefers CONTENT.url, then NEXT_PUBLIC_CALENDLY_URL.\n */\nconst CONTENT = {\n  url: \"\",\n  stamp: \"Scheduler\",\n  emptyTitle: \"Calendly isn't connected yet\",\n  emptyBody:\n    \"Set CONTENT.url or NEXT_PUBLIC_CALENDLY_URL - or email us and we'll find a slot.\",\n  emailCtaPrefix: \"Email\",\n  iframeTitleSuffix: \"Book a 15-minute intro call\",\n  primaryColor: \"0b7bff\",\n  darkBg: \"0a0a0a\",\n  lightBg: \"ffffff\",\n  darkText: \"fafafa\",\n  lightText: \"0a0a0a\",\n}\n\nexport type CalendlyEmbedProps = {\n  url?: string\n}\n\nexport function CalendlyEmbed({ url }: CalendlyEmbedProps) {\n  const calendlyUrl =\n    url || CONTENT.url || process.env.NEXT_PUBLIC_CALENDLY_URL || \"\"\n  const [mounted, setMounted] = useState(false)\n  const [isDark, setIsDark] = useState(true)\n  const brand = getBrand()\n\n  useEffect(() => {\n    setMounted(true)\n    const root = document.documentElement\n    const sync = () => setIsDark(root.classList.contains(\"dark\"))\n    sync()\n    const obs = new MutationObserver(sync)\n    obs.observe(root, { attributes: true, attributeFilter: [\"class\"] })\n    return () => obs.disconnect()\n  }, [])\n\n  const src = useMemo(() => {\n    if (!calendlyUrl) return \"\"\n    try {\n      const u = new URL(calendlyUrl)\n      const params = new URLSearchParams({\n        hide_gdpr_banner: \"1\",\n        hide_landing_page_details: \"1\",\n        hide_event_type_details: \"0\",\n        primary_color: CONTENT.primaryColor,\n        background_color: isDark ? CONTENT.darkBg : CONTENT.lightBg,\n        text_color: isDark ? CONTENT.darkText : CONTENT.lightText,\n      })\n      u.search = u.search\n        ? `${u.search}&${params.toString()}`\n        : `?${params.toString()}`\n      return u.toString()\n    } catch {\n      return \"\"\n    }\n  }, [calendlyUrl, isDark])\n\n  if (!calendlyUrl || !src) {\n    return (\n      <div className=\"flex flex-col gap-4 border border-border-subtle px-4 py-10 sm:px-6 sm:py-14\">\n        <p className=\"font-mono text-[11px] tracking-wide text-muted-foreground uppercase\">\n          {CONTENT.stamp}\n        </p>\n        <h3 className=\"text-xl font-medium text-foreground\">\n          {CONTENT.emptyTitle}\n        </h3>\n        <p className=\"max-w-md text-sm leading-relaxed text-muted-foreground\">\n          {CONTENT.emptyBody}\n        </p>\n        <a\n          href={`mailto:${brand.email}`}\n          className=\"inline-flex h-11 w-fit items-center gap-2 rounded-lg bg-foreground px-5 text-sm font-medium text-background\"\n        >\n          {CONTENT.emailCtaPrefix} {brand.email}\n          <ExternalLink className=\"size-3.5\" aria-hidden />\n        </a>\n      </div>\n    )\n  }\n\n  return (\n    <div className=\"overflow-hidden border border-border-subtle bg-background\">\n      {!mounted ? (\n        <div\n          className=\"flex h-[min(720px,75dvh)] min-h-[420px] items-center justify-center bg-muted/30\"\n          aria-hidden\n        >\n          <div className=\"h-full w-full animate-pulse bg-muted/40\" />\n        </div>\n      ) : (\n        <iframe\n          src={src}\n          title={`${CONTENT.iframeTitleSuffix} with ${brand.name}`}\n          loading=\"lazy\"\n          className=\"block h-[min(720px,75dvh)] min-h-[420px] w-full border-0\"\n        />\n      )}\n    </div>\n  )\n}\n",
      "type": "registry:component",
      "target": "components/blocks/calendly-embed.tsx"
    }
  ],
  "type": "registry:block"
}