agentbond-api / frontend /src /sections /HeroSection.jsx
Karan6124's picture
style(landing): update stats cards to be authentic to backend metrics and agent pipeline
c3c23f8
Raw
History Blame Contribute Delete
6.46 kB
import React from "react";
import { motion } from "framer-motion";
import BlurText from "../components/BlurText";
import { useAuth } from "../context/AuthContext";
export default function HeroSection({ onOpenAuth, onViewWorkspace }) {
const { user } = useAuth();
const containerVariants = {
initial: {},
animate: {
transition: { staggerChildren: 0.14 },
},
};
const itemVariants = {
initial: { filter: "blur(12px)", opacity: 0, y: 24 },
animate: {
filter: "blur(0px)",
opacity: 1,
y: 0,
transition: { duration: 0.85, ease: "easeOut" },
},
};
const STATS = [
{
icon: (
<svg className="w-6 h-6 stroke-white fill-none" strokeWidth="1.5" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="10" />
<polyline points="12 6 12 12 16 14" />
</svg>
),
value: "12.5 Sec",
label: "Average Agent Latency",
},
{
icon: (
<svg className="w-6 h-6 stroke-white fill-none" strokeWidth="1.5" viewBox="0 0 24 24">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
</svg>
),
value: "Real-Time",
label: "DuckDuckGo Fact Verification",
},
{
icon: (
<svg className="w-6 h-6 stroke-white fill-none" strokeWidth="1.5" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="3" />
<path d="M19.07 4.93a10 10 0 0 1 0 14.14M4.93 4.93a10 10 0 0 0 0 14.14" />
</svg>
),
value: "2 Agents",
label: "Orchestrated Pipeline",
},
];
const TECH = ["FastAPI", "Celery", "Redis", "PostgreSQL", "Gemini Core", "Prometheus"];
return (
<section
id="home"
className="relative w-screen min-h-screen bg-transparent flex flex-col z-10"
>
{/* Main Content */}
<motion.div
variants={containerVariants}
initial="initial"
animate="animate"
className="relative z-10 flex-1 flex flex-col items-center justify-center text-center pt-36 pb-12 px-4"
>
{/* Live Badge */}
<motion.div
variants={itemVariants}
className="flex items-center gap-2 rounded-full p-1 pr-4 text-sm text-white/90 liquid-glass select-none mb-6"
>
<span className="relative flex h-2 w-2 ml-1">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75" />
<span className="relative inline-flex rounded-full h-2 w-2 bg-green-500" />
</span>
<span className="text-xs font-body font-medium tracking-wide">
Multi-Agent Autonomous Core — Live
</span>
</motion.div>
{/* Headline */}
<div>
<BlurText
text="Deconstruct Complex Problems."
className="text-5xl md:text-6xl lg:text-[5rem] font-heading italic text-white leading-[0.9] max-w-4xl justify-center tracking-[-3px]"
/>
<BlurText
text="Verified by AI Agents."
className="text-5xl md:text-6xl lg:text-[5rem] font-heading italic text-white/60 leading-[0.9] max-w-4xl justify-center tracking-[-3px] mt-1"
/>
</div>
{/* Subheading — from README */}
<motion.p
variants={itemVariants}
className="mt-7 text-sm md:text-base text-white/70 max-w-lg font-body font-light leading-relaxed"
>
Submit any open-ended problem. A pipeline of specialized agents — Case Manager,
Investigators, and Verifier — collaborates to break it down, crawl the web, and return
hallucination-scored intelligence in seconds.
</motion.p>
{/* Single CTA — centered */}
<motion.div variants={itemVariants} className="mt-9 flex justify-center">
<button
onClick={() => {
if (user) {
if (onViewWorkspace) onViewWorkspace();
} else {
onOpenAuth();
}
}}
className="flex items-center gap-2.5 rounded-full px-7 py-3.5 text-sm font-semibold text-white liquid-glass-strong hover:scale-105 active:scale-95 transition-all duration-200 shadow-lg"
>
<svg className="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
<circle cx="11" cy="11" r="7" />
<line x1="16.5" y1="16.5" x2="21" y2="21" />
</svg>
{user ? "Deploy Agent Pipeline" : "Begin Investigation"}
</button>
</motion.div>
{/* Stats Row — 3 cards, properly spaced from CTA */}
<motion.div
variants={itemVariants}
className="flex flex-wrap items-stretch justify-center gap-5 mt-14"
>
{STATS.map((s, i) => (
<div
key={i}
className="flex flex-col items-start text-left p-5 w-[190px] rounded-[1.25rem] liquid-glass hover:scale-[1.03] transition-transform duration-300"
>
{s.icon}
<h4 className="text-3xl font-heading italic text-white tracking-[-1px] leading-none mt-5">
{s.value}
</h4>
<p className="text-xs text-white/55 font-body font-light mt-2 leading-snug">
{s.label}
</p>
</div>
))}
</motion.div>
</motion.div>
{/* Footer Tech Strip — properly separated */}
<motion.div
initial={{ opacity: 0, y: 16 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.7, delay: 0.3, ease: "easeOut" }}
className="relative z-10 flex flex-col items-center gap-3 pb-10 pt-2 border-t border-white/[0.06]"
>
<p className="text-[10px] font-body font-medium text-white/40 uppercase tracking-[0.18em] select-none">
Powered by
</p>
<div className="flex flex-wrap items-center justify-center gap-x-8 gap-y-2 select-none">
{TECH.map((t, i) => (
<React.Fragment key={t}>
<span className="text-lg md:text-xl font-heading italic text-white/80">{t}</span>
{i < TECH.length - 1 && (
<span className="text-white/25 text-xs">·</span>
)}
</React.Fragment>
))}
</div>
</motion.div>
</section>
);
}