{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "product-launch",
  "type": "registry:block",
  "title": "Product launch",
  "description": "A product launch landing page: an announcement banner, a bento grid of highlights, details in tabs and an email sign-up.",
  "categories": [
    "template"
  ],
  "registryDependencies": [
    "https://facadeui.dev/r/banner.json",
    "https://facadeui.dev/r/bento-grid.json",
    "https://facadeui.dev/r/faq-accordion.json",
    "https://facadeui.dev/r/feature-tabs.json",
    "https://facadeui.dev/r/footer.json",
    "https://facadeui.dev/r/hero-centered.json",
    "https://facadeui.dev/r/nav-top.json",
    "https://facadeui.dev/r/newsletter.json",
    "https://facadeui.dev/r/types.json",
    "https://facadeui.dev/r/usp-list.json"
  ],
  "files": [
    {
      "path": "src/templates/product-launch.tsx",
      "type": "registry:component",
      "target": "components/templates/product-launch.tsx",
      "content": "/**\n * ProductLaunch — a single-product launch page.\n *\n * The narrowest of the three templates, and deliberately so: a launch page has\n * one job. A dismissible banner, a centred hero, the bento grid that shows the\n * thing off, a short USP strip, tabbed detail for people who want it, an FAQ,\n * and one email capture. No pricing table, no team — both dilute a launch.\n *\n * a11y: the banner is a named landmark rather than a live region, because a\n * banner present on load is not an update and announcing it interrupts. The\n * newsletter reports its own outcome through a live region that exists from the\n * first paint.\n *\n * Dependencies: react, @/lib/types, @/components/sections/*.\n */\n\nimport type { ReactNode } from \"react\"\n\nimport type { CtaItem, LinkComponent } from \"@/lib/types\"\nimport { Banner } from \"@/components/sections/banner\"\nimport { BentoGrid, type BentoItem } from \"@/components/sections/bento-grid\"\nimport { FaqAccordion, type FaqItem } from \"@/components/sections/faq-accordion\"\nimport { FeatureTabs, type FeatureTabItem } from \"@/components/sections/feature-tabs\"\nimport { Footer, type FooterGroup, type FooterLink } from \"@/components/sections/footer\"\nimport { HeroCentered } from \"@/components/sections/hero-centered\"\nimport { NavTop, type NavItem } from \"@/components/sections/nav-top\"\nimport { Newsletter, type NewsletterStatus } from \"@/components/sections/newsletter\"\nimport { UspList, type UspItem } from \"@/components/sections/usp-list\"\n\nexport interface ProductLaunchContent {\n  brand: ReactNode\n  nav: NavItem[]\n  navActions?: CtaItem[]\n\n  announcement?: {\n    /** Names the landmark. */\n    label?: string\n    message: ReactNode\n    action?: { label: string; href: string; external?: boolean }\n    /** Remembers the dismissal across visits. */\n    storageKey?: string\n  }\n\n  hero: {\n    eyebrow?: string\n    title: string\n    description: string\n    actions: CtaItem[]\n    note?: ReactNode\n    banner?: ReactNode\n    media?: ReactNode\n  }\n\n  highlights: {\n    eyebrow?: string\n    title: string\n    description?: string\n    items: BentoItem[]\n  }\n\n  usps?: { title?: string; eyebrow?: string; items: UspItem[] }\n\n  detail?: {\n    eyebrow?: string\n    title: string\n    description?: string\n    items: FeatureTabItem[]\n  }\n\n  faq?: {\n    eyebrow?: string\n    title: string\n    items: FaqItem[]\n  }\n\n  signup: {\n    eyebrow?: string\n    title: string\n    description?: string\n    note?: ReactNode\n  }\n\n  footer: {\n    groups?: FooterGroup[]\n    brand?: ReactNode\n    copyright?: ReactNode\n    legal?: FooterLink[]\n  }\n}\n\nexport interface ProductLaunchProps {\n  content: ProductLaunchContent\n  /**\n   * Unlike the other two templates, this one has no `image` prop. Every image comes\n   * through a `media` slot, so pass `<Image />` there directly.\n   */\n  link?: LinkComponent\n  currentPath?: string\n  /** Wire this to your own form action or mutation. */\n  onSignUp?: (email: string) => void\n  signUpStatus?: NewsletterStatus\n  signUpError?: string\n}\n\nexport function ProductLaunch({\n  content,\n  link,\n  currentPath,\n  onSignUp,\n  signUpStatus,\n  signUpError,\n}: ProductLaunchProps) {\n  const { announcement, hero, highlights, usps, detail, faq, signup, footer } = content\n\n  return (\n    <>\n      {announcement ? (\n        <Banner\n          label={announcement.label ?? \"Announcement\"}\n          action={announcement.action}\n          storageKey={announcement.storageKey}\n          link={link}\n          dismissible\n        >\n          {announcement.message}\n        </Banner>\n      ) : null}\n\n      <NavTop\n        brand={content.brand}\n        items={content.nav}\n        actions={content.navActions}\n        link={link}\n        currentPath={currentPath}\n      />\n\n      <main id=\"main\">\n        <HeroCentered\n          eyebrow={hero.eyebrow}\n          title={hero.title}\n          description={hero.description}\n          actions={hero.actions}\n          note={hero.note}\n          banner={hero.banner}\n          media={hero.media}\n          link={link}\n          headingLevel={1}\n          size=\"xl\"\n          spacing=\"lg\"\n        />\n\n        <BentoGrid\n          eyebrow={highlights.eyebrow}\n          title={highlights.title}\n          description={highlights.description}\n          items={highlights.items}\n          link={link}\n          headingLevel={2}\n          itemHeadingLevel={3}\n          align=\"center\"\n        />\n\n        {usps ? (\n          <UspList\n            eyebrow={usps.eyebrow}\n            title={usps.title}\n            items={usps.items}\n            headingLevel={2}\n            itemHeadingLevel={3}\n            align=\"center\"\n            className=\"border-y\"\n          />\n        ) : null}\n\n        {detail ? (\n          <FeatureTabs\n            eyebrow={detail.eyebrow}\n            title={detail.title}\n            description={detail.description}\n            items={detail.items}\n            headingLevel={2}\n            itemHeadingLevel={3}\n          />\n        ) : null}\n\n        {faq ? (\n          <FaqAccordion\n            eyebrow={faq.eyebrow}\n            title={faq.title}\n            items={faq.items}\n            headingLevel={2}\n            itemHeadingLevel={3}\n            align=\"center\"\n            schemaOrg\n          />\n        ) : null}\n\n        <Newsletter\n          eyebrow={signup.eyebrow}\n          title={signup.title}\n          description={signup.description}\n          note={signup.note}\n          onSubmit={onSignUp}\n          status={signUpStatus}\n          errorMessage={signUpError}\n          headingLevel={2}\n        />\n      </main>\n\n      <Footer\n        brand={footer.brand ?? content.brand}\n        groups={footer.groups}\n        copyright={footer.copyright}\n        legal={footer.legal}\n        link={link}\n        headingLevel={2}\n      />\n    </>\n  )\n}\n"
    }
  ],
  "docs": "Import styles/facade-tokens.css in your global stylesheet, after @import \"tailwindcss\". Render the template from a page with your own content object; it sets the page outline (one h1). Docs: https://facadeui.dev/components/product-launch"
}
