Spaces:
Running
Running
| import type { Metadata } from "next"; | |
| import Link from "next/link"; | |
| import { | |
| ArrowRight, | |
| CheckCircle, | |
| Users, | |
| TrendingUp, | |
| Clock, | |
| } from "lucide-react"; | |
| import CTASection from "@/components/CTASection"; | |
| import FeatureCard from "@/components/FeatureCard"; | |
| import PlanCard from "@/components/PlanCard"; | |
| import { getPlans, getModules, getIntegrationProviders, getPublicTemplates, APP_URL } from "@/lib/api"; | |
| import { MODULE_MARKETING_MAP } from "@/lib/moduleMap"; | |
| export const metadata: Metadata = { | |
| title: "LeadPilot β AI-Native Lead Capture, Qualification & Routing", | |
| description: | |
| "LeadPilot is the AI-native platform that captures, qualifies, and routes leads to the right rep automatically. Close more deals without growing headcount.", | |
| }; | |
| // ββ Pricing lookup (same as plans page) βββββββββββββββββββββββββββββ | |
| const PLAN_PRICING: Record<string, { price: string; priceNote: string; tagline: string; available: boolean }> = { | |
| free: { price: "$0", priceNote: "/ month", tagline: "Start capturing leads today", available: true }, | |
| growth: { price: "Coming Soon", priceNote: "", tagline: "For growing sales teams", available: false }, | |
| enterprise: { price: "Contact Us", priceNote: "", tagline: "Custom deployment for large organisations", available: false }, | |
| }; | |
| function entitlementToString(moduleKey: string, hardLimit: number | null): string | null { | |
| const info = MODULE_MARKETING_MAP[moduleKey]; | |
| if (!info) return null; | |
| if (hardLimit === null) return `${info.marketingTitle} (Unlimited)`; | |
| if (hardLimit > 0) return `${info.marketingTitle} (up to ${hardLimit.toLocaleString()})`; | |
| return info.marketingTitle; | |
| } | |
| // ββ Static content (narrative, not feature claims) ββββββββββββββββββ | |
| const steps = [ | |
| { number: "01", title: "Capture", description: "Leads arrive from any channel β your forms, chat, or integrations. LeadPilot ingests them all instantly." }, | |
| { number: "02", title: "Qualify", description: "Our AI engages, asks the right questions, and scores every lead based on your ideal customer profile." }, | |
| { number: "03", title: "Route", description: "Qualified leads are dispatched to the right rep or team β automatically, with zero manual hand-off." }, | |
| { number: "04", title: "Follow Up", description: "Automated follow-up sequences keep leads warm while your team focuses on closing." }, | |
| { number: "05", title: "Report", description: "Real-time dashboards show conversion rates, pipeline velocity, and where you're losing leads." }, | |
| ]; | |
| // ββ Provider icon map βββββββββββββββββββββββββββββββββββββββββββββββ | |
| const PROVIDER_COLORS: Record<string, string> = { | |
| whatsapp: "#25D366", | |
| meta: "#1877F2", | |
| zoho: "#E42527", | |
| }; | |
| export default async function HomePage() { | |
| const [plans, modules, providers, templates] = await Promise.all([ | |
| getPlans(), | |
| getModules(), | |
| getIntegrationProviders(), | |
| getPublicTemplates(), | |
| ]); | |
| // Feature highlights β up to 6 enabled modules | |
| const featureHighlights = modules | |
| .filter((m) => MODULE_MARKETING_MAP[m.key] && m.is_enabled) | |
| .slice(0, 6) | |
| .map((m) => ({ | |
| ...MODULE_MARKETING_MAP[m.key], | |
| moduleKey: m.key, | |
| })); | |
| // Featured templates | |
| const featuredTemplates = templates.filter((t) => t.is_featured).slice(0, 5); | |
| // Waitlist plan names | |
| const waitlistNames = plans | |
| .filter((p) => !PLAN_PRICING[p.name]?.available) | |
| .map((p) => p.display_name); | |
| return ( | |
| <> | |
| {/* βββ HERO βββββββββββββββββββββββββββββββββββββββββββββββββββ */} | |
| <section | |
| className="relative min-h-screen flex items-center overflow-hidden bg-[var(--dark-bg)]" | |
| aria-labelledby="hero-heading" | |
| > | |
| <div className="absolute inset-0 cockpit-grid cockpit-grid-3d opacity-60" aria-hidden="true" /> | |
| {/* Animated scanline */} | |
| <div className="absolute inset-x-0 h-[2px] bg-gradient-to-r from-transparent via-cyan-400 to-transparent animate-scanline opacity-50 z-0 shadow-[0_0_15px_rgba(34,211,238,0.8)]" /> | |
| <div | |
| className="absolute inset-0 pointer-events-none" | |
| aria-hidden="true" | |
| style={{ | |
| background: "radial-gradient(ellipse 70% 60% at 50% 10%, rgba(15,118,110,0.3) 0%, var(--dark-bg) 75%)", | |
| }} | |
| /> | |
| <div | |
| className="absolute top-1/4 left-1/4 w-96 h-96 rounded-full pointer-events-none" | |
| aria-hidden="true" | |
| style={{ background: "rgba(34, 211, 238, 0.15)", filter: "blur(100px)", mixBlendMode: "screen" }} | |
| /> | |
| <div | |
| className="absolute top-1/3 right-1/4 w-96 h-96 rounded-full pointer-events-none" | |
| aria-hidden="true" | |
| style={{ background: "rgba(192, 132, 252, 0.15)", filter: "blur(100px)", mixBlendMode: "screen" }} | |
| /> | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-32 text-center"> | |
| <div | |
| className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full mb-8 animate-fade-up" | |
| style={{ background: "rgba(34, 211, 238, 0.15)", border: "1px solid rgba(34, 211, 238, 0.3)" }} | |
| > | |
| <span className="w-2 h-2 rounded-full animate-pulse-glow" style={{ background: "var(--neon-cyan)" }} aria-hidden="true" /> | |
| <span className="text-xs font-bold tracking-wider" style={{ color: "var(--neon-cyan)" }}> | |
| AI-NATIVE PIPELINE | |
| </span> | |
| </div> | |
| <h1 | |
| id="hero-heading" | |
| className="text-5xl sm:text-6xl md:text-7xl font-extrabold text-white mb-6 tracking-tight leading-none animate-fade-up" | |
| style={{ animationDelay: "0.1s" }} | |
| > | |
| Close More Leads. | |
| <br /> | |
| <span className="gradient-text">Waste Zero Hours.</span> | |
| </h1> | |
| <p | |
| className="text-lg sm:text-xl max-w-2xl mx-auto mb-10 leading-relaxed animate-fade-up" | |
| style={{ color: "rgba(148,163,184,0.9)", animationDelay: "0.2s" }} | |
| > | |
| LeadPilot captures, qualifies, and routes every inbound lead to the right rep β | |
| automatically. Turn raw traffic into closed revenue without adding headcount. | |
| </p> | |
| <div className="flex flex-col sm:flex-row items-center justify-center gap-4 animate-fade-up" style={{ animationDelay: "0.3s" }}> | |
| <Link href="/contact" className="px-8 py-4 rounded-xl font-semibold text-base btn-primary glow-primary"> | |
| Deploy AI Agent | |
| </Link> | |
| <Link | |
| href="/product" | |
| className="inline-flex items-center gap-2 px-8 py-4 rounded-xl font-semibold text-sm glass-panel hover:border-teal-400 transition-colors text-white" | |
| > | |
| See Product | |
| <ArrowRight className="w-4 h-4" aria-hidden="true" /> | |
| </Link> | |
| </div> | |
| <div className="mt-20 grid grid-cols-3 gap-4 max-w-2xl mx-auto animate-fade-up" style={{ animationDelay: "0.4s" }}> | |
| {[ | |
| { icon: TrendingUp, label: "More pipeline", sub: "per rep", color: "var(--neon-cyan)" }, | |
| { icon: Clock, label: "Instant response", sub: "always online", color: "var(--secondary)" }, | |
| { icon: Users, label: "Less headcount", sub: "needed to scale", color: "var(--neon-purple)" }, | |
| ].map(({ icon: Icon, label, sub, color }) => ( | |
| <div key={label} className="text-center glass-panel p-4 rounded-2xl relative overflow-hidden group"> | |
| <div className="absolute inset-0 bg-gradient-to-t from-transparent to-white/5 opacity-0 group-hover:opacity-100 transition-opacity" /> | |
| <Icon className="w-6 h-6 mx-auto mb-3" style={{ color }} aria-hidden="true" /> | |
| <p className="text-sm font-bold text-white">{label}</p> | |
| <p className="text-xs mt-1" style={{ color: "#94A3B8" }}>{sub}</p> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| {/* Decorative Floating Elements */} | |
| <div className="absolute top-1/4 left-1/4 w-32 h-32 border border-teal-500/20 rounded-full animate-float-delayed flex items-center justify-center -z-10 hidden md:flex"> | |
| <div className="w-16 h-16 border border-teal-400/30 rounded-full flex items-center justify-center"> | |
| <div className="w-2 h-2 bg-teal-400 rounded-full animate-pulse-glow" /> | |
| </div> | |
| </div> | |
| <div className="absolute top-1/3 right-1/4 w-40 h-40 border border-cyan-500/20 rounded-full animate-float flex items-center justify-center -z-10 hidden md:flex"> | |
| <div className="w-20 h-20 border border-cyan-400/30 rounded-full flex items-center justify-center"> | |
| <div className="w-3 h-3 bg-cyan-400 rounded-full animate-pulse-glow" /> | |
| </div> | |
| </div> | |
| <div className="absolute bottom-12 left-1/2 -translate-x-1/2 flex flex-col items-center gap-2" aria-hidden="true"> | |
| <span className="text-[10px] uppercase font-bold tracking-widest" style={{ color: "var(--neon-cyan)" }}>Initiate</span> | |
| <div className="w-[2px] h-12 bg-gradient-to-b from-cyan-400 to-transparent animate-pulse" /> | |
| </div> | |
| </section> | |
| {/* βββ SOCIAL PROOF STRIP βββββββββββββββββββββββββββββββββββββ */} | |
| <section | |
| className="py-12 border-y" | |
| style={{ background: "#0E1826", borderColor: "rgba(255,255,255,0.06)" }} | |
| aria-label="Trusted by teams across industries" | |
| > | |
| <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <p className="text-center text-xs font-semibold uppercase tracking-widest mb-8" style={{ color: "#475569" }}> | |
| Trusted by revenue teams in | |
| </p> | |
| <div className="grid grid-cols-3 md:grid-cols-6 gap-8 items-center"> | |
| {["Real Estate", "Healthcare Clinics", "Marketing Agencies", "B2B Services", "Automotive", "Retail & SMB"].map((industry) => ( | |
| <div key={industry} className="text-center"> | |
| <span className="text-sm font-medium" style={{ color: "rgba(148,163,184,0.5)" }}>{industry}</span> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| </section> | |
| {/* βββ PROBLEM β SOLUTION βββββββββββββββββββββββββββββββββββββ */} | |
| <section | |
| className="py-24 relative overflow-hidden" | |
| style={{ background: "var(--dark-bg)" }} | |
| aria-labelledby="problem-heading" | |
| > | |
| <div className="absolute inset-0 cockpit-grid opacity-20" aria-hidden="true" /> | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div className="grid grid-cols-1 lg:grid-cols-2 gap-16 items-center"> | |
| {/* The Problem */} | |
| <div className="glass-panel p-10 rounded-3xl relative overflow-hidden group"> | |
| <div className="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-red-500/0 via-red-500/50 to-red-500/0 opacity-50" /> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "#EF4444" }}>The Problem</p> | |
| <h2 id="problem-heading" className="text-3xl sm:text-4xl font-bold mb-6 tracking-tight text-white"> | |
| Leads slip through the cracks every day. | |
| </h2> | |
| <ul className="space-y-5"> | |
| {[ | |
| "Sales teams spend hours qualifying leads that never convert.", | |
| "Hot prospects wait hours (or days) for a reply β then go cold.", | |
| "No clear routing means the wrong rep picks up the wrong lead.", | |
| "You can't see where the pipeline breaks without real-time data.", | |
| ].map((point) => ( | |
| <li key={point} className="flex items-start gap-3"> | |
| <div className="mt-2 w-1.5 h-1.5 rounded-full shrink-0 shadow-[0_0_8px_#EF4444]" style={{ background: "#EF4444" }} aria-hidden="true" /> | |
| <p className="text-sm leading-relaxed" style={{ color: "rgba(148,163,184,0.9)" }}>{point}</p> | |
| </li> | |
| ))} | |
| </ul> | |
| </div> | |
| {/* The Solution */} | |
| <div className="glass-panel p-10 rounded-3xl relative overflow-hidden gradient-border-spin group"> | |
| <div className="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-cyan-400/0 via-cyan-400/50 to-cyan-400/0 opacity-50" /> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3 text-cyan-400 hover:animate-pulse">The Solution</p> | |
| <h2 className="text-3xl sm:text-4xl font-bold mb-6 tracking-tight text-white"> | |
| AI handles the pipeline. You handle the close. | |
| </h2> | |
| <ul className="space-y-5"> | |
| {[ | |
| "AI agents qualify every lead the moment it arrives β 24/7, zero lag.", | |
| "Smart routing rules deliver leads to the right rep in milliseconds.", | |
| "Automated, multi-channel follow-ups keep prospects engaged.", | |
| "Live analytics show you exactly where revenue is left behind.", | |
| ].map((point) => ( | |
| <li key={point} className="flex items-start gap-3"> | |
| <CheckCircle className="w-5 h-5 mt-0.5 shrink-0 text-cyan-400 drop-shadow-[0_0_8px_rgba(34,211,238,0.5)]" aria-hidden="true" /> | |
| <p className="text-sm leading-relaxed" style={{ color: "rgba(148,163,184,0.9)" }}>{point}</p> | |
| </li> | |
| ))} | |
| </ul> | |
| <Link href="/product" className="inline-flex items-center gap-2 mt-8 text-sm font-semibold text-cyan-400 hover:text-cyan-300 transition-colors group/link"> | |
| Initiate Sequence | |
| <ArrowRight className="w-4 h-4 group-hover/link:translate-x-1 transition-transform" aria-hidden="true" /> | |
| </Link> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| {/* βββ HOW IT WORKS βββββββββββββββββββββββββββββββββββββββββββ */} | |
| <section | |
| className="py-32 relative overflow-hidden" | |
| style={{ background: "#060B14" }} | |
| aria-labelledby="how-it-works-heading" | |
| > | |
| <div | |
| className="absolute inset-0 pointer-events-none" | |
| aria-hidden="true" | |
| style={{ background: "radial-gradient(ellipse 80% 50% at 50% 100%, rgba(34, 211, 238, 0.1) 0%, transparent 60%)" }} | |
| /> | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div className="text-center mb-20 animate-fade-up"> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "var(--neon-cyan)" }}>Data Pipeline</p> | |
| <h2 id="how-it-works-heading" className="text-3xl sm:text-4xl md:text-5xl font-bold text-white tracking-tight"> | |
| Five automated jumps to revenue | |
| </h2> | |
| </div> | |
| <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-8 lg:gap-4 relative"> | |
| {/* The animated connecting wire (desktop) */} | |
| <div className="hidden lg:block absolute top-[44px] left-10 right-10 h-0.5 bg-slate-800 -z-10"> | |
| <div | |
| className="h-full bg-gradient-to-r from-cyan-500/0 via-cyan-400 to-cyan-500/0 animate-scanline" | |
| style={{ animationDirection: "normal", transformOrigin: "left" }} | |
| /> | |
| </div> | |
| {steps.map((step, i) => ( | |
| <div | |
| key={step.number} | |
| className="relative rounded-2xl p-6 glass-panel hover:border-cyan-500/50 transition-colors animate-fade-up group" | |
| style={{ animationDelay: `${i * 0.15 + 0.2}s` }} | |
| > | |
| <div className="w-10 h-10 rounded-full flex items-center justify-center bg-cyan-950/50 border border-cyan-500/30 mb-6 group-hover:shadow-[0_0_15px_rgba(34,211,238,0.4)] transition-shadow"> | |
| <span className="text-sm font-bold text-cyan-400">{step.number}</span> | |
| </div> | |
| <h3 className="text-white font-semibold mb-3">{step.title}</h3> | |
| <p className="text-xs leading-relaxed" style={{ color: "#94A3B8" }}>{step.description}</p> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| </section> | |
| {/* βββ FEATURE HIGHLIGHTS (DB-driven) βββββββββββββββββββββββββ */} | |
| <section | |
| className="py-24 relative" | |
| style={{ background: "#0B1320" }} | |
| aria-labelledby="features-heading" | |
| > | |
| <div className="absolute inset-0 cockpit-grid opacity-30" aria-hidden="true" /> | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div className="text-center mb-16 animate-fade-up"> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "var(--neon-cyan)" }}>Platform Features</p> | |
| <h2 id="features-heading" className="text-3xl sm:text-4xl font-bold tracking-tight text-white"> | |
| Everything your revenue team needs | |
| </h2> | |
| <p className="mt-4 text-base max-w-xl mx-auto" style={{ color: "rgba(148,163,184,0.9)" }}> | |
| One platform for the entire lead lifecycle β from first touch to closed deal. | |
| </p> | |
| </div> | |
| <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5"> | |
| {featureHighlights.map((feat, i) => ( | |
| <div key={feat.moduleKey} className="animate-fade-up" style={{ animationDelay: `${i * 0.1}s` }}> | |
| <FeatureCard | |
| iconName={feat.iconName} | |
| benefit={feat.benefit} | |
| title={feat.marketingTitle} | |
| description={feat.description} | |
| dark={true} | |
| /> | |
| </div> | |
| ))} | |
| </div> | |
| <div className="text-center mt-10"> | |
| <Link href="/features" className="inline-flex items-center gap-2 text-sm font-semibold text-cyan-400 hover:text-cyan-300 transition-colors"> | |
| View all features | |
| <ArrowRight className="w-4 h-4" aria-hidden="true" /> | |
| </Link> | |
| </div> | |
| </div> | |
| </section> | |
| {/* βββ TEMPLATES TEASER (DB-driven) βββββββββββββββββββββββββββ */} | |
| {featuredTemplates.length > 0 && ( | |
| <section | |
| className="py-24 relative overflow-hidden" | |
| style={{ background: "var(--dark-bg)" }} | |
| aria-labelledby="templates-teaser-heading" | |
| > | |
| <div className="absolute inset-0 cockpit-grid opacity-20" aria-hidden="true" /> | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div className="text-center mb-16 animate-fade-up"> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "var(--neon-purple)" }}> | |
| Execution Patterns | |
| </p> | |
| <h2 id="templates-teaser-heading" className="text-3xl sm:text-4xl font-bold text-white tracking-tight"> | |
| Ready-made automation flows | |
| </h2> | |
| <p className="mt-4 text-base max-w-xl mx-auto" style={{ color: "rgba(148,163,184,0.9)" }}> | |
| Clone a template, customise it for your business, and go live in minutes. | |
| </p> | |
| </div> | |
| <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 gap-4"> | |
| {featuredTemplates.map((t, i) => ( | |
| <div key={t.id} className="catalog-card p-5 animate-fade-up" style={{ animationDelay: `${i * 0.1}s` }}> | |
| <span className="badge-category" data-category={t.category}> | |
| {t.category.replace(/_/g, " ")} | |
| </span> | |
| <h3 className="text-white font-semibold text-sm mt-3 mb-1">{t.name}</h3> | |
| <p className="text-xs leading-relaxed line-clamp-2" style={{ color: "rgba(148,163,184,0.8)" }}> | |
| {t.description} | |
| </p> | |
| <div className="flex flex-wrap gap-1.5 mt-3"> | |
| {t.platforms.map((p) => ( | |
| <span key={p} className="badge-platform">{p}</span> | |
| ))} | |
| </div> | |
| {t.clone_count > 0 && ( | |
| <p className="text-[10px] mt-2 font-mono" style={{ color: "#475569" }}> | |
| [{t.clone_count.toLocaleString()} CLONES] | |
| </p> | |
| )} | |
| </div> | |
| ))} | |
| </div> | |
| <div className="text-center mt-10"> | |
| <Link href="/templates" className="inline-flex items-center gap-2 text-sm font-semibold text-purple-400 hover:text-purple-300 transition-colors"> | |
| Browse all templates | |
| <ArrowRight className="w-4 h-4" aria-hidden="true" /> | |
| </Link> | |
| </div> | |
| </div> | |
| </section> | |
| )} | |
| {/* βββ INTEGRATIONS TEASER (DB-driven) ββββββββββββββββββββββββ */} | |
| {providers.length > 0 && ( | |
| <section | |
| className="py-24 relative overflow-hidden" | |
| style={{ background: "#0B1320" }} | |
| aria-labelledby="integrations-teaser-heading" | |
| > | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div className="text-center mb-16 animate-fade-up"> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "var(--neon-cyan)" }}> | |
| Integrations | |
| </p> | |
| <h2 id="integrations-teaser-heading" className="text-3xl sm:text-4xl font-bold tracking-tight text-white"> | |
| Connect your entire stack | |
| </h2> | |
| <p className="mt-4 text-base max-w-xl mx-auto" style={{ color: "rgba(148,163,184,0.9)" }}> | |
| Native integrations with the platforms your revenue team already uses. | |
| </p> | |
| </div> | |
| <div className="grid grid-cols-1 sm:grid-cols-3 gap-6 max-w-3xl mx-auto"> | |
| {providers.map((p, i) => ( | |
| <div | |
| key={p.key} | |
| className="rounded-xl p-6 text-center glass-panel hover:border-cyan-500/30 transition-colors animate-fade-up" | |
| style={{ animationDelay: `${i * 0.15}s` }} | |
| > | |
| <div | |
| className="w-12 h-12 rounded-xl flex items-center justify-center mx-auto mb-4" | |
| style={{ | |
| background: `${PROVIDER_COLORS[p.key] ?? "#0F766E"}20`, | |
| border: `1px solid ${PROVIDER_COLORS[p.key] ?? "#0F766E"}40`, | |
| }} | |
| > | |
| <span className="text-lg font-bold" style={{ color: PROVIDER_COLORS[p.key] ?? "#0F766E" }}> | |
| {p.label.charAt(0)} | |
| </span> | |
| </div> | |
| <h3 className="font-semibold text-base mb-1 text-white"> | |
| {p.label} | |
| </h3> | |
| <p className="text-xs leading-relaxed" style={{ color: "rgba(148,163,184,0.8)" }}> | |
| {p.description} | |
| </p> | |
| </div> | |
| ))} | |
| </div> | |
| <div className="text-center mt-10"> | |
| <Link href="/integrations" className="inline-flex items-center gap-2 text-sm font-semibold text-cyan-400 hover:text-cyan-300 transition-colors"> | |
| View all integrations | |
| <ArrowRight className="w-4 h-4" aria-hidden="true" /> | |
| </Link> | |
| </div> | |
| </div> | |
| </section> | |
| )} | |
| {/* βββ MINI PLANS PREVIEW (DB-driven) βββββββββββββββββββββββββ */} | |
| <section | |
| className="py-24 relative overflow-hidden" | |
| style={{ background: "var(--dark-bg)" }} | |
| aria-labelledby="plans-preview-heading" | |
| > | |
| <div className="absolute inset-0 cockpit-grid opacity-20" aria-hidden="true" /> | |
| <div | |
| className="absolute inset-0 pointer-events-none" | |
| aria-hidden="true" | |
| style={{ background: "radial-gradient(ellipse 60% 50% at 50% 50%, rgba(34, 211, 238, 0.1) 0%, transparent 70%)" }} | |
| /> | |
| <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div className="text-center mb-16 animate-fade-up"> | |
| <p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "var(--neon-cyan)" }}>Deployment Options</p> | |
| <h2 id="plans-preview-heading" className="text-3xl sm:text-4xl font-bold text-white tracking-tight"> | |
| Start free. Scale when ready. | |
| </h2> | |
| </div> | |
| <div className={`grid grid-cols-1 ${plans.length === 3 ? "md:grid-cols-3" : "md:grid-cols-2"} gap-6 max-w-4xl mx-auto`}> | |
| {plans.map((plan, i) => { | |
| const pricing = PLAN_PRICING[plan.name] ?? { price: "Contact Us", priceNote: "", tagline: "", available: false }; | |
| const featureLines = plan.entitlements | |
| .map((e) => entitlementToString(e.module_key, e.hard_limit)) | |
| .filter((s): s is string => s !== null) | |
| .slice(0, 6); | |
| return ( | |
| <div key={plan.id} className="animate-fade-up" style={{ animationDelay: `${i * 0.15}s` }}> | |
| <PlanCard | |
| name={plan.display_name} | |
| tagline={pricing.tagline || plan.description || ""} | |
| price={pricing.price} | |
| priceNote={pricing.priceNote} | |
| features={featureLines} | |
| ctaLabel={pricing.available ? "Get Started Free" : "Coming Soon"} | |
| ctaHref={`${APP_URL}/signup`} | |
| available={pricing.available} | |
| highlighted={plan.name === "free"} | |
| /> | |
| </div> | |
| ); | |
| })} | |
| </div> | |
| {waitlistNames.length > 0 && ( | |
| <p className="text-center mt-8 text-xs font-mono" style={{ color: "rgba(148,163,184,0.6)" }}> | |
| // AWAITING DEPLOYMENT FOR {waitlistNames.join(" AND ").toUpperCase()} β{" "} | |
| <Link href="/plans" className="hover:text-cyan-400 transition-colors" style={{ color: "var(--neon-cyan)" }}> | |
| INITIALIZE | |
| </Link> | |
| </p> | |
| )} | |
| </div> | |
| </section> | |
| {/* βββ FINAL CTA ββββββββββββββββββββββββββββββββββββββββββββββ */} | |
| <CTASection | |
| headline="Deploy your AI pipeline today." | |
| subheadline="LeadPilot automates lead capture, qualification, and routing so your team can focus on closing." | |
| primaryLabel="Deploy AI Agent" | |
| primaryHref="/contact" | |
| secondaryLabel="Start Free Tier" | |
| secondaryHref={`${APP_URL}/signup`} | |
| /> | |
| </> | |
| ); | |
| } | |