{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "product-card-hero", "type": "registry:ui", "title": "Product Card Hero", "description": "Two-column hero with floating account menu card, pricing bar, and a four-column feature grid with icons.", "dependencies": [ "motion" ], "files": [ { "path": "registry/ruixenui/product-card-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 Plus,\n Settings2,\n CircleHelp,\n MessageCircle,\n User,\n Settings,\n LogOut,\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 ProductCardHeroProps {\n title?: string;\n description?: string;\n ctaText?: string;\n ctaHref?: string;\n features?: {\n title: string;\n description: string;\n }[];\n className?: string;\n}\n\nconst TICKER_ROW_1 = [\n { name: \"Oxymor NS\", price: \"$39\" },\n { name: \"Vertex AI\", price: \"$59\" },\n { name: \"Nova Pro\", price: \"$29\" },\n { name: \"Lumina\", price: \"$49\" },\n { name: \"Prism X\", price: \"$19\" },\n { name: \"Helix ML\", price: \"$35\" },\n];\n\nconst TICKER_ROW_2 = [\n { name: \"Arc Studio\", price: \"$45\" },\n { name: \"Cipher\", price: \"$25\" },\n { name: \"Nebula\", price: \"$55\" },\n { name: \"Flux API\", price: \"$15\" },\n { name: \"Zenith\", price: \"$42\" },\n { name: \"Pulse\", price: \"$33\" },\n];\n\nfunction TickerRow({\n items,\n duration = 40,\n reverse = false,\n}: {\n items: { name: string; price: string }[];\n duration?: number;\n reverse?: boolean;\n}) {\n const doubled = [...items, ...items];\n return (\n
\n \n {doubled.map((item, i) => (\n \n \n {item.name}\n \n \n {item.price}\n \n
\n ))}\n \n \n );\n}\n\nconst ACCOUNTS = [\n { name: \"Méschac Irung\", initials: \"M\" },\n { name: \"Bernard Ng\", initials: \"B\" },\n { name: \"Theo Ng\", initials: \"T\" },\n { name: \"Glodie Ng\", initials: \"G\" },\n];\n\nconst MENU_GROUPS = [\n [{ icon: Plus, label: \"Add new account\" }],\n [{ icon: Settings2, label: \"Preferences\" }],\n [\n { icon: CircleHelp, label: \"Help\" },\n { icon: MessageCircle, label: \"Send feedback\" },\n ],\n [\n { icon: User, label: \"My account\" },\n { icon: Settings, label: \"Settings\" },\n ],\n [{ icon: LogOut, label: \"Sign out\" }],\n];\n\nconst DEFAULT_FEATURES = [\n {\n title: \"Instant deploys\",\n description: \"Sub-second builds. Zero-downtime rollouts. Push and forget.\",\n },\n {\n title: \"Edge-first\",\n description: \"Compute runs where your users are. 50ms or less, globally.\",\n },\n {\n title: \"Private by design\",\n description: \"E2E encrypted. SOC 2 compliant. Your code never leaves.\",\n },\n {\n title: \"Aware, not intrusive\",\n description: \"Reads your full codebase. Suggests only when it matters.\",\n },\n];\n\nexport function ProductCardHero({\n title = \"Ship faster\\nwith less friction\",\n description = \"A development platform that removes the gap between writing code and running it. Build, preview, and deploy from one place.\",\n ctaText = \"Get started\",\n ctaHref = \"#\",\n features = DEFAULT_FEATURES,\n className,\n}: ProductCardHeroProps) {\n return (\n
\n
\n
\n {/* ── Left: Visual ───────────────────────────────── */}\n \n {/* Ticker rows behind the card */}\n
\n \n \n
\n\n {/* Account card */}\n
\n
\n {ACCOUNTS.map((account) => (\n \n
\n {account.initials}\n
\n \n {account.name}\n \n
\n ))}\n\n {MENU_GROUPS.map((group, gi) => (\n \n
\n {group.map((item) => (\n \n \n \n {item.label}\n \n
\n ))}\n
\n ))}\n
\n
\n \n\n {/* ── Right: Text ────────────────────────────────── */}\n \n
\n

\n {title}\n

\n

\n {description}\n

\n \n {ctaText}\n \n \n
\n \n
\n\n {/* ── Features ──────────────────────────────────── */}\n
\n {features.map((feature, i) => (\n \n \n {String(i + 1).padStart(2, \"0\")}\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-card-hero.tsx" } ] }