{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "hero",
  "version": "2.2.1",
  "category": "miscellaneous",
  "meta": {
    "preview": "https://ui.manifest.build/previews/hero.png",
    "version": "2.2.1",
    "changelog": {
      "1.0.0": "Initial release with logos, title, subtitle, CTA buttons, and tech logos footer",
      "1.1.0": "Added card wrapper, text logo support, improved light/dark mode compatibility",
      "2.0.0": "BREAKING: Changed button props from string labels to HeroButton objects with optional label and icon",
      "2.0.1": "Image logos now display without bordered container, text logos remain in bordered square",
      "2.1.0": "Added urlLight prop for dark mode logo variant support",
      "2.1.1": "Reduced logo image height for better visual balance",
      "2.1.2": "Removed default content data - component only renders explicitly provided data",
      "2.1.3": "Replaced key={index} with stable content-based keys for tech logos",
      "2.2.0": "Added demo data defaults - component renders demo content when no data prop is provided",
      "2.2.1": "Fixed import type for verbatimModuleSyntax compatibility"
    }
  },
  "changelog": {
    "1.0.0": "Initial release with logos, title, subtitle, CTA buttons, and tech logos footer",
    "1.1.0": "Added card wrapper, text logo support, improved light/dark mode compatibility",
    "2.0.0": "BREAKING: Changed button props from string labels to HeroButton objects with optional label and icon",
    "2.0.1": "Image logos now display without bordered container, text logos remain in bordered square",
    "2.1.0": "Added urlLight prop for dark mode logo variant support",
    "2.1.1": "Reduced logo image height for better visual balance",
    "2.1.2": "Removed default content data - component only renders explicitly provided data",
    "2.1.3": "Replaced key={index} with stable content-based keys for tech logos",
    "2.2.0": "Added demo data defaults - component renders demo content when no data prop is provided",
    "2.2.1": "Fixed import type for verbatimModuleSyntax compatibility"
  },
  "title": "Hero",
  "author": "MNFST, Inc",
  "description": "Landing hero section with optional logos, title, subtitle, CTA buttons, and tech logos footer. Supports image or text logos with separator.",
  "dependencies": [
    "lucide-react"
  ],
  "registryDependencies": [
    "button"
  ],
  "files": [
    {
      "path": "registry/miscellaneous/hero.tsx",
      "content": "'use client';\n\nimport { Button } from '@/components/ui/button';\nimport type { ReactNode } from 'react';\nimport { demoHeroDefault } from './demo/miscellaneous';\n\n/**\n * Represents a logo in the hero section.\n * @interface HeroLogo\n * @property {string} [url] - URL of the logo image (shown in light mode)\n * @property {string} [urlLight] - URL of the light version logo (shown in dark mode for visibility)\n * @property {string} [alt] - Alt text for the logo\n * @property {string} [text] - Text to display if no URL is provided (e.g., \"Acme\")\n */\nexport interface HeroLogo {\n  url?: string;\n  urlLight?: string;\n  alt?: string;\n  text?: string;\n}\n\n/**\n * Represents a tech/partner logo in the footer section.\n * @interface TechLogo\n * @property {string} [url] - URL of the tech logo image\n * @property {string} [alt] - Alt text for the logo\n * @property {string} [name] - Name of the technology (used for tooltip)\n */\nexport interface TechLogo {\n  url?: string;\n  alt?: string;\n  name?: string;\n}\n\n/**\n * Represents a button configuration in the hero section.\n * @interface HeroButton\n * @property {string} [label] - Text label for the button (optional)\n * @property {ReactNode} [icon] - Icon to display in the button (optional)\n */\nexport interface HeroButton {\n  label?: string;\n  icon?: ReactNode;\n}\n\n/**\n * ═══════════════════════════════════════════════════════════════════════════\n * HeroProps\n * ═══════════════════════════════════════════════════════════════════════════\n *\n * Props for the Hero component. A landing hero section with optional logos,\n * title, subtitle, call-to-action buttons, and tech logos footer.\n */\nexport interface HeroProps {\n  data?: {\n    /** Primary logo displayed in the hero. Can be an image URL or text. */\n    logo1?: HeroLogo;\n    /** Secondary logo displayed next to the primary logo (shows separator between them). */\n    logo2?: HeroLogo;\n    /** Separator text between logos (e.g., \"x\", \"&\", \"and\"). Only shown when both logos are present. */\n    logoSeparator?: string;\n    /** Main title/heading of the hero section. */\n    title?: string;\n    /** Subtitle or description text below the title. */\n    subtitle?: string;\n    /** Primary button configuration with optional label and icon. */\n    primaryButton?: HeroButton;\n    /** Secondary button configuration with optional label and icon. */\n    secondaryButton?: HeroButton;\n    /** Label text above the tech logos (e.g., \"Built with open-source technologies\"). */\n    techLogosLabel?: string;\n    /** Array of tech/partner logos to display in the footer section. */\n    techLogos?: TechLogo[];\n  };\n  actions?: {\n    /** Called when the primary button is clicked. */\n    onPrimaryClick?: () => void;\n    /** Called when the secondary button is clicked. */\n    onSecondaryClick?: () => void;\n  };\n}\n\n\n/**\n * Renders a logo - image logos display directly, text logos get a bordered container\n * Supports light/dark mode variants for image logos\n */\nfunction LogoDisplay({ logo }: { logo: HeroLogo }) {\n  // Image logos display directly without a container\n  if (logo.url) {\n    // If urlLight is provided, show different logos for light/dark mode\n    if (logo.urlLight) {\n      return (\n        <>\n          <img\n            src={logo.url}\n            alt={logo.alt || 'Logo'}\n            className=\"h-8 sm:h-10 w-auto object-contain dark:hidden\"\n          />\n          <img\n            src={logo.urlLight}\n            alt={logo.alt || 'Logo'}\n            className=\"h-8 sm:h-10 w-auto object-contain hidden dark:block\"\n          />\n        </>\n      );\n    }\n    // Single logo for both modes\n    return (\n      <img src={logo.url} alt={logo.alt || 'Logo'} className=\"h-16 sm:h-20 w-auto object-contain\" />\n    );\n  }\n  // Text logos get a bordered square container\n  if (logo.text) {\n    return (\n      <div className=\"flex items-center justify-center w-16 h-16 sm:w-20 sm:h-20 rounded-xl border bg-background p-3\">\n        <span className=\"text-xl sm:text-2xl font-bold text-foreground tracking-tight\">\n          {logo.text}\n        </span>\n      </div>\n    );\n  }\n  return null;\n}\n\n/**\n * A landing hero section with optional logos, title, subtitle,\n * call-to-action buttons, and tech logos footer.\n *\n * Features:\n * - One or two logos with optional separator (x, &, etc.)\n * - Logos can be images or text\n * - Main title and subtitle text\n * - Primary (outline) and secondary (filled) CTA buttons with optional icons\n * - Optional tech/partner logos footer section\n * - All fields are optional with graceful degradation\n * - Full-width card layout with proper spacing\n * - Works in both light and dark mode\n *\n * @component\n * @example\n * ```tsx\n * <Hero\n *   data={{\n *     logo1: { url: \"/logo.svg\", alt: \"My App\" },\n *     title: \"Welcome to My App\",\n *     subtitle: \"The best app for doing things\",\n *     primaryButton: { label: \"Get Started\" },\n *     secondaryButton: { label: \"GitHub\", icon: <Github className=\"h-5 w-5\" /> }\n *   }}\n *   actions={{\n *     onPrimaryClick: () => console.log(\"Primary clicked\"),\n *     onSecondaryClick: () => console.log(\"Secondary clicked\")\n *   }}\n * />\n * ```\n */\nexport function Hero({ data, actions }: HeroProps) {\n  const resolved: NonNullable<HeroProps['data']> = data ?? demoHeroDefault;\n  const logo1 = resolved?.logo1;\n  const logo2 = resolved?.logo2;\n  const logoSeparator = resolved?.logoSeparator ?? 'x';\n  const title = resolved?.title;\n  const subtitle = resolved?.subtitle;\n  const primaryButton = resolved?.primaryButton;\n  const secondaryButton = resolved?.secondaryButton;\n  const techLogosLabel = resolved?.techLogosLabel;\n  const techLogos = resolved?.techLogos;\n\n  const hasLogo1 = logo1?.url || logo1?.text;\n  const hasLogo2 = logo2?.url || logo2?.text;\n  const hasLogos = hasLogo1 || hasLogo2;\n  const hasBothLogos = hasLogo1 && hasLogo2;\n  const hasPrimaryButton = primaryButton?.label || primaryButton?.icon;\n  const hasSecondaryButton = secondaryButton?.label || secondaryButton?.icon;\n  const hasButtons = hasPrimaryButton || hasSecondaryButton;\n  const hasTechLogos = techLogos && techLogos.length > 0;\n\n  return (\n    <div className=\"w-full rounded-xl border bg-card shadow-sm\">\n      <div className=\"flex flex-col items-center justify-center py-16 sm:py-20 lg:py-24 px-6 sm:px-8 lg:px-12\">\n        {/* Logos Section */}\n        {hasLogos && (\n          <div className=\"flex items-center justify-center gap-3 sm:gap-4 mb-8 sm:mb-10\">\n            {hasLogo1 && <LogoDisplay logo={logo1} />}\n            {hasBothLogos && (\n              <span className=\"text-lg sm:text-xl font-medium text-muted-foreground\">\n                {logoSeparator}\n              </span>\n            )}\n            {hasLogo2 && logo2 && <LogoDisplay logo={logo2} />}\n          </div>\n        )}\n\n        {/* Title */}\n        {title && (\n          <h1 className=\"text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground text-center max-w-4xl mb-4 sm:mb-6\">\n            {title}\n          </h1>\n        )}\n\n        {/* Subtitle */}\n        {subtitle && (\n          <p className=\"text-base sm:text-lg text-muted-foreground text-center max-w-2xl mb-8 sm:mb-10\">\n            {subtitle}\n          </p>\n        )}\n\n        {/* Buttons */}\n        {hasButtons && (\n          <div className=\"flex flex-col sm:flex-row items-center justify-center gap-3 sm:gap-4\">\n            {hasPrimaryButton && (\n              <Button\n                variant=\"outline\"\n                size=\"lg\"\n                className=\"min-w-[140px]\"\n                onClick={actions?.onPrimaryClick}\n              >\n                {primaryButton.icon && <span className=\"mr-2\">{primaryButton.icon}</span>}\n                {primaryButton.label}\n              </Button>\n            )}\n            {hasSecondaryButton && (\n              <Button size=\"lg\" className=\"min-w-[140px]\" onClick={actions?.onSecondaryClick}>\n                {secondaryButton.icon && <span className=\"mr-2\">{secondaryButton.icon}</span>}\n                {secondaryButton.label}\n              </Button>\n            )}\n          </div>\n        )}\n\n        {/* Tech Logos Footer */}\n        {hasTechLogos && (\n          <div className=\"flex flex-col items-center mt-12 sm:mt-16 pt-8 sm:pt-10 border-t w-full max-w-2xl\">\n            {techLogosLabel && (\n              <p className=\"text-sm text-muted-foreground mb-4\">{techLogosLabel}</p>\n            )}\n            <div className=\"flex items-center justify-center gap-4 flex-wrap\">\n              {techLogos.map((logo) => (\n                <div\n                  key={logo.name || logo.url || logo.alt}\n                  className=\"flex items-center justify-center w-12 h-12 sm:w-14 sm:h-14 rounded-lg border bg-background p-2\"\n                  title={logo.name}\n                >\n                  {logo.url && (\n                    <img\n                      src={logo.url}\n                      alt={logo.alt || logo.name || 'Tech logo'}\n                      className=\"max-w-full max-h-full object-contain opacity-60 grayscale\"\n                    />\n                  )}\n                </div>\n              ))}\n            </div>\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n",
      "type": "registry:block",
      "target": "components/ui/hero.tsx"
    },
    {
      "path": "registry/miscellaneous/demo/miscellaneous.ts",
      "content": "// Demo data for Miscellaneous category components\n// This file contains sample data used for component previews and documentation\n\nexport const demoStats = [\n  { label: 'Revenue', value: '$12,345', change: 12.5 },\n  { label: 'Orders', value: '1,234', change: -3.2 },\n  { label: 'Customers', value: '567', change: 8.1 },\n]\n\nexport const demoHeroDefault = {\n  logo1: { text: 'Acme', alt: 'Acme' },\n  title: 'Build beautiful chat experiences with Manifest UI',\n  subtitle:\n    'Create beautiful chat experiences with our comprehensive component library designed for agentic applications.',\n  primaryButton: { label: 'Get Started' },\n  secondaryButton: { label: 'GitHub' },\n}\n\nexport const demoHeroTwoLogos = {\n  logo1: { text: 'Acme' },\n  logo2: {\n    url: '/logo-manifest-ui.svg',\n    urlLight: '/logo-manifest-ui-light.svg',\n    alt: 'Manifest',\n  },\n  logoSeparator: 'x',\n  title: 'Acme x Manifest UI',\n  subtitle:\n    'Combining the best of both worlds to deliver exceptional user experiences.',\n  primaryButton: { label: 'Get Started' },\n  secondaryButton: { label: 'GitHub' },\n}\n\nexport const demoHeroWithTechLogos = {\n  logo1: { text: 'Acme' },\n  title: 'Build your next project with Acme',\n  subtitle:\n    'Create beautiful experiences with our comprehensive platform designed for modern applications.',\n  primaryButton: { label: 'Get Started' },\n  secondaryButton: { label: 'GitHub' },\n  techLogosLabel: 'Built with open-source technologies',\n  techLogos: [\n    {\n      url: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nextjs/nextjs-original.svg',\n      alt: 'Next.js',\n      name: 'Next.js',\n    },\n    {\n      url: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/typescript/typescript-original.svg',\n      alt: 'TypeScript',\n      name: 'TypeScript',\n    },\n    {\n      url: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg',\n      alt: 'React',\n      name: 'React',\n    },\n    {\n      url: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/tailwindcss/tailwindcss-original.svg',\n      alt: 'Tailwind CSS',\n      name: 'Tailwind CSS',\n    },\n    {\n      url: 'https://ui.manifest.build/demo/os-tech-mnfst.svg',\n      alt: 'Manifest',\n      name: 'Manifest',\n    },\n  ],\n}\n\nexport const demoHeroMinimal = {\n  logo1: undefined,\n  title: 'Welcome to the Future',\n  subtitle: 'A simple, clean hero without logos or extra elements.',\n  primaryButton: { label: 'Get Started' },\n  secondaryButton: undefined,\n}\n",
      "type": "registry:lib",
      "target": "components/ui/demo/miscellaneous.ts"
    }
  ],
  "categories": [
    "miscellaneous"
  ],
  "type": "registry:block"
}