{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "product-feature-hero", "type": "registry:ui", "title": "Product Feature Hero", "description": "Two-column hero with decorative gradient card and a four-column feature highlights grid.", "dependencies": [ "motion" ], "files": [ { "path": "registry/ruixenui/product-feature-hero.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n ChevronRight,\n Search,\n FileText,\n ArrowUpRight,\n GitPullRequest,\n} from \"lucide-react\";\n\nconst S = { type: \"spring\" as const, stiffness: 300, damping: 28 };\nconst S_SOFT = { type: \"spring\" as const, stiffness: 260, damping: 24 };\n\nexport interface ProductFeatureHeroProps {\n title?: string;\n description?: string;\n secondaryText?: React.ReactNode;\n ctaText?: string;\n ctaHref?: string;\n features?: {\n title: string;\n description: string;\n }[];\n className?: string;\n}\n\nconst COMMANDS = [\n { label: \"Open command bar\", shortcut: \"⌘K\" },\n { label: \"Quick open file\", shortcut: \"⌘P\" },\n];\n\nconst RECENT_FILES = [\"dashboard.tsx\", \"api/auth.ts\", \"lib/utils.ts\"];\n\nconst ACTIONS = [\n { icon: ArrowUpRight, label: \"Deploy to production\" },\n { icon: GitPullRequest, label: \"Create pull request\" },\n];\n\nconst DEFAULT_FEATURES = [\n {\n title: \"Instant\",\n description: \"Sub-50ms completions, zero spinners.\",\n },\n {\n title: \"Context-aware\",\n description: \"Reads your full codebase, not just open files.\",\n },\n {\n title: \"Private\",\n description: \"Code stays on your machine. Always.\",\n },\n {\n title: \"Extensible\",\n description: \"Every language, every framework.\",\n },\n];\n\nexport function ProductFeatureHero({\n title = \"Built for how you think\",\n description = \"An intelligent editor that understands your intent. Completions, refactors, and explanations surface exactly when you need them.\",\n secondaryText,\n ctaText = \"Get started\",\n ctaHref = \"#\",\n features = DEFAULT_FEATURES,\n className,\n}: ProductFeatureHeroProps) {\n return (\n
\n
\n
\n {/* ── Left ─────────────────────────────────────── */}\n \n
\n

\n {title}\n

\n

{description}

\n {secondaryText ?? (\n

\n We obsessed over every interaction to make it feel invisible.{\" \"}\n \n No config, no context switching.\n {\" \"}\n Just write.\n

\n )}\n \n {ctaText}\n \n \n
\n \n\n {/* ── Right ────────────────────────────────────── */}\n \n
\n
\n {/* Search */}\n
\n \n \n Search...\n \n
\n\n
\n {/* Suggestions */}\n
\n \n Suggestions\n \n
\n {COMMANDS.map((cmd) => (\n \n \n {cmd.label}\n \n \n {cmd.shortcut}\n \n
\n ))}\n\n
\n\n {/* Recent */}\n
\n \n Recent\n \n
\n {RECENT_FILES.map((file) => (\n \n \n \n {file}\n \n
\n ))}\n\n
\n\n {/* Actions */}\n
\n \n Actions\n \n
\n {ACTIONS.map((action) => (\n \n \n \n {action.label}\n \n
\n ))}\n
\n
\n
\n \n
\n\n {/* ── Features ──────────────────────────────────── */}\n
\n {features.map((feature, i) => (\n \n

\n {feature.title}\n

\n

\n {feature.description}\n

\n \n ))}\n
\n \n
\n );\n}\n", "type": "registry:ui", "target": "components/ruixen/product-feature-hero.tsx" } ] }