{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "split-hero-section", "type": "registry:ui", "title": "Split Hero Section", "description": "A split-layout hero section with left-aligned headline, key metrics, app screenshot showcase, and trusted-by logo strip.", "files": [ { "path": "registry/ruixenui/split-hero-section.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\nimport { cn } from \"@/lib/utils\";\n\n/* ── types ───────────────────────────────────────────────────── */\n\ntype Action = { href: string; label: string };\n\ninterface Stat {\n /** Numeric / main value, e.g. \"99.9\" */\n value: string;\n /** Unit or suffix shown beside the value, e.g. \"%\", \"X\" */\n unit?: string;\n /** Label text rendered below the value */\n label: React.ReactNode;\n}\n\ninterface TrustedBySection {\n logos: React.ReactNode[];\n}\n\nexport interface SplitHeroSectionProps {\n /** Main headline — left-aligned */\n title: React.ReactNode;\n /** Subtitle / description text */\n description?: string;\n /** Primary CTA button */\n primaryAction?: Action;\n /** Secondary CTA button */\n secondaryAction?: Action;\n /** Key metrics displayed below the CTAs */\n stats?: Stat[];\n /** Trusted-by logo strip */\n trustedBy?: TrustedBySection;\n className?: string;\n}\n\n/* ── component ───────────────────────────────────────────────── */\n\nexport function SplitHeroSection({\n title,\n description,\n primaryAction,\n secondaryAction,\n stats,\n trustedBy,\n className,\n}: SplitHeroSectionProps) {\n return (\n \n
\n
\n {/* ── left column ──────────────────────────── */}\n
\n
\n

\n {title}\n

\n\n {description && (\n

\n {description}\n

\n )}\n\n {(primaryAction || secondaryAction) && (\n
\n {primaryAction && (\n \n {primaryAction.label}\n \n )}\n {secondaryAction && (\n \n {secondaryAction.label}\n \n )}\n
\n )}\n
\n\n {/* ── stats ──────────────────────────── */}\n {stats && stats.length > 0 && (\n
\n {stats.map((stat, idx) => (\n
\n \n {stat.value}{\" \"}\n {stat.unit && (\n \n {stat.unit}\n \n )}\n \n

\n {stat.label}\n

\n
\n ))}\n
\n )}\n
\n\n {/* ── right column: stacked overlapping skeleton cards ── */}\n \n \n {/* ── Card 1 (back) — analytics skeleton ── */}\n
\n
\n {/* header */}\n
\n
\n
\n
\n {/* body */}\n
\n {/* progress bar */}\n
\n
\n
\n
\n
\n
\n
\n {/* skeleton rows */}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {/* footer */}\n
\n
\n
\n
\n
\n
\n
\n\n {/* ── Card 2 (front) — metrics skeleton, overlapping ── */}\n
\n
\n {/* header */}\n
\n
\n
\n
\n
\n {/* body */}\n
\n {/* metric columns */}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {/* divider */}\n
\n {/* list items */}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n {/* ── trusted-by logo strip ──────────────────── */}\n {trustedBy && trustedBy.logos.length > 0 && (\n
\n
\n {trustedBy.logos.map((logo, idx) => (\n
\n {logo}\n
\n ))}\n
\n
\n )}\n \n );\n}\n", "type": "registry:ui", "target": "components/ruixen/split-hero-section.tsx" } ] }