deepsite-v2 / Landing.jsx
tharshitha05's picture
Upload 2 files
317eec4 verified
raw
history blame
28.8 kB
import Navbar from '../components/Navbar'
import AnimatedBackground from '../components/AnimatedBackground'
import { motion } from 'framer-motion'
import { useMemo, useRef } from 'react'
import { Link } from 'react-router-dom'
import {
AcademicCapIcon,
BriefcaseIcon,
CommandLineIcon,
DocumentTextIcon,
SparklesIcon,
ChatBubbleLeftRightIcon,
ArrowRightIcon,
GlobeAltIcon,
PresentationChartBarIcon,
} from '@heroicons/react/24/outline'
import Footer from '../components/Footer'
import TestimonialsCarousel from '../components/TestimonialsCarousel'
import { useTheme } from '../theme/ThemeContext'
const fadeUp = (d=0) => ({ initial:{opacity:0,y:24}, whileInView:{opacity:1,y:0}, viewport:{once:true, amount:.3}, transition:{duration:.6, delay:d} })
const containerStagger = {
hidden: { opacity: 0 },
show: { opacity: 1, transition: { staggerChildren: 0.08 } }
}
const itemMotion = {
hidden: { opacity: 0, y: 18, scale: .98 },
show: { opacity: 1, y: 0, scale: 1, transition: { duration: .5 } }
}
export default function Landing(){
const { theme } = useTheme() || { theme: { imagery: 'abstract', anim: 'medium', parallax: 'medium' } }
const animScale = theme.anim === 'strong' ? 1.06 : theme.anim === 'medium' ? 1.02 : 1.005
const isTouch = typeof window !== 'undefined' && matchMedia('(pointer:coarse)').matches
const baseParallax = theme.parallax === 'strong' ? 8 : theme.parallax === 'medium' ? 6 : 3
const parallaxFactor = isTouch ? Math.max(2, baseParallax - 4) : baseParallax
const images = useMemo(() => {
const sets = {
abstract: {
hero: 'https://images.unsplash.com/photo-1557683316-973673baf926?q=80&w=1600&auto=format&fit=crop',
jobs: 'https://images.unsplash.com/photo-1553877522-43269d4ea984?q=80&w=1600&auto=format&fit=crop',
roadmaps: 'https://images.unsplash.com/photo-1522071820081-009f0129c71c?q=80&w=1600&auto=format&fit=crop',
resume: 'https://images.unsplash.com/photo-1515378791036-0648a3ef77b2?q=80&w=1600&auto=format&fit=crop',
mock: 'https://images.unsplash.com/photo-1522202176988-66273c2fd55f?q=80&w=1600&auto=format&fit=crop',
insights: 'https://images.unsplash.com/photo-1516321497487-e288fb19713f?q=80&w=1600&auto=format&fit=crop',
},
illustrations: {
hero: 'https://images.unsplash.com/photo-1542751371-adc38448a05e?q=80&w=1600&auto=format&fit=crop',
jobs: 'https://images.unsplash.com/photo-1611162618479-7d7a39e9be50?q=80&w=1600&auto=format&fit=crop',
roadmaps: 'https://images.unsplash.com/photo-1545239351-1141bd82e8a6?q=80&w=1600&auto=format&fit=crop',
resume: 'https://images.unsplash.com/photo-1557682250-33bd709cbe85?q=80&w=1600&auto=format&fit=crop',
mock: 'https://images.unsplash.com/photo-1516557070061-c3d1653fa646?q=80&w=1600&auto=format&fit=crop',
insights: 'https://images.unsplash.com/photo-1520975922203-b5a9cb27689a?q=80&w=1600&auto=format&fit=crop',
},
photos: {
hero: 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?q=80&w=1600&auto=format&fit=crop',
jobs: 'https://images.unsplash.com/photo-1497493292307-31c376b6e479?q=80&w=1600&auto=format&fit=crop',
roadmaps: 'https://images.unsplash.com/photo-1496307042754-b4aa456c4a2d?q=80&w=1600&auto=format&fit=crop',
resume: 'https://images.unsplash.com/photo-1529101091764-c3526daf38fe?q=80&w=1600&auto=format&fit=crop',
mock: 'https://images.unsplash.com/photo-1521737604893-d14cc237f11d?q=80&w=1600&auto=format&fit=crop',
insights: 'https://images.unsplash.com/photo-1534759846116-5791a4b5528c?q=80&w=1600&auto=format&fit=crop',
}
}
return sets[theme.imagery] || sets.abstract
}, [theme.imagery])
const heroTiltRef = useRef(null)
const onHeroMouseMove = (e) => {
const el = heroTiltRef.current
if(!el) return
const rect = el.getBoundingClientRect()
const x = e.clientX - rect.left
const y = e.clientY - rect.top
const rx = ((y / rect.height) - 0.5) * (-parallaxFactor) // tilt X
const ry = ((x / rect.width) - 0.5) * parallaxFactor // tilt Y
el.style.transform = `perspective(800px) rotateX(${rx}deg) rotateY(${ry}deg) translateZ(0)`
}
const onHeroMouseLeave = () => {
const el = heroTiltRef.current
if(!el) return
el.style.transform = 'perspective(800px) rotateX(0deg) rotateY(0deg) translateZ(0)'
}
return (
<div className="relative min-h-screen overflow-hidden">
<AnimatedBackground />
{/* Subtle background image for hero depth */}
<img
src="https://images.unsplash.com/photo-1543286386-2e659306cd6c?q=80&w=1920&auto=format&fit=crop"
alt="bg"
className="pointer-events-none select-none absolute inset-0 -z-20 h-full w-full object-cover opacity-[0.06]"
loading="lazy"
/>
<Navbar />
{/* Hero */}
<section className="relative mx-auto max-w-7xl px-6 pt-20 pb-16">
<div className="relative grid lg:grid-cols-2 gap-10 items-center">
<motion.div {...fadeUp(0)}>
<h1 className="text-4xl md:text-6xl font-semibold tracking-tight leading-tight">
Your Career. <span className="text-brand-400">Supercharged.</span>
</h1>
<p className="mt-4 text-slate-300 max-w-xl">
One place to discover jobs & internships, follow curated roadmaps, build resumes & cover letters,
practice mock interviews, and ace placements — all in one powerful platform.
</p>
<div className="mt-8 flex flex-wrap gap-3">
<motion.div whileHover={{ y: -2, scale: 1.02 }} whileTap={{ scale: 0.98 }}>
<Link to="/auth/signup" className="px-5 py-3 rounded bg-brand-600 hover:bg-brand-500 text-white shadow-glow inline-flex items-center gap-2">
Get Started <ArrowRightIcon className="w-5 h-5"/>
</Link>
</motion.div>
<motion.div whileHover={{ y: -2, scale: 1.02 }} whileTap={{ scale: 0.98 }}>
<a href="#features" className="px-5 py-3 rounded bg-slate-800 hover:bg-slate-700 inline-flex items-center gap-2">
Explore Features
</a>
</motion.div>
</div>
{/* Removed small utility line per request */}
</motion.div>
<motion.div {...fadeUp(.1)} className="relative" onMouseMove={onHeroMouseMove} onMouseLeave={onHeroMouseLeave}>
<div ref={heroTiltRef} className="relative rounded-2xl overflow-hidden border border-slate-800 bg-slate-900/40 shadow-xl transition-transform will-change-transform">
{/* Professional career guidance hero image */}
<img
src="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?q=80&w=1600&auto=format&fit=crop"
alt="Career guidance and professional development"
className="w-full h-80 object-cover"
referrerPolicy="no-referrer"
loading="eager"
/>
{/* Lighten overlay so the image reads strongly */}
<div className="absolute inset-0 bg-gradient-to-t from-slate-950/40 to-transparent" />
<div className="absolute bottom-0 p-6">
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-900/70 border border-slate-800 text-slate-300 text-sm">
<SparklesIcon className="w-4 h-4" style={{ color: 'var(--brand)' }}/> Professional Career Platform
</div>
</div>
</div>
</motion.div>
</div>
</section>
{/* Decorative gradient blobs */}
<div className="pointer-events-none absolute -left-24 top-40 h-80 w-80 rounded-full bg-brand-500/10 blur-3xl"/>
<div className="pointer-events-none absolute -right-24 top-[600px] h-80 w-80 rounded-full bg-indigo-500/10 blur-3xl"/>
{/* Features grid */}
<section id="features" className="mx-auto max-w-7xl px-6 py-10">
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">Everything you need for your career journey</motion.h2>
<motion.p {...fadeUp(.05)} className="mt-2 text-slate-400 max-w-3xl">Beautiful, fast, and built to help you succeed: search jobs, learn with roadmaps, practice interviews, and generate polished resumes & letters.</motion.p>
<motion.div variants={containerStagger} initial="hidden" whileInView="show" viewport={{ once: true, amount: .2 }} className="mt-8 grid sm:grid-cols-2 lg:grid-cols-3 gap-5">
<Feature icon={BriefcaseIcon} title="Jobs & Internships" desc="Find roles that fit you, track applications, and uncover salary trends — all in one place." animScale={animScale}/>
<Feature icon={AcademicCapIcon} title="Learning Roadmaps" desc="Follow step‑by‑step paths with curated resources, milestones, and checkpoints to stay consistent." animScale={animScale}/>
<Feature icon={DocumentTextIcon} title="Resume & Cover Letters" desc="Build ATS‑friendly documents with proven sections and export crisp PDFs in seconds." animScale={animScale}/>
<Feature icon={CommandLineIcon} title="Placement Prep" desc="Practice MCQs, coding and interviews — build confidence before you apply." animScale={animScale}/>
<Feature icon={ChatBubbleLeftRightIcon} title="Mock Interviews" desc="Rehearse realistic interviews, reflect on transcripts, and fix gaps before the real one." animScale={animScale}/>
<Feature icon={GlobeAltIcon} title="Higher Studies" desc="Compare programs, shortlist universities, and plan requirements without the overwhelm." animScale={animScale}/>
<Feature icon={PresentationChartBarIcon} title="Industry Insights" desc="See in‑demand roles, compare salary bands, and know which skills to learn next." animScale={animScale}/>
</motion.div>
</section>
{/* Industry Insights */}
<section className="mx-auto max-w-7xl px-6 py-10">
<motion.div {...fadeUp(0)} className="grid lg:grid-cols-2 gap-8 items-center">
<div>
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-900/70 border border-slate-800 text-slate-300 text-sm">
<PresentationChartBarIcon className="w-4 h-4" style={{ color: 'var(--brand)' }}/> Industry Insights
</div>
<h2 className="mt-3 text-2xl md:text-3xl font-semibold">Know what's trending — and what to learn next</h2>
<p className="mt-3 text-slate-300 max-w-xl">
Explore in-demand roles by your interests, compare salary bands (min/median/max), and reveal your personal skill gaps so you can upskill with confidence.
</p>
<ul className="mt-5 space-y-2 text-slate-300">
<li className="flex items-start gap-2"><span className="mt-1 h-2 w-2 rounded-full bg-brand-400"/> Trending roles by interest</li>
<li className="flex items-start gap-2"><span className="mt-1 h-2 w-2 rounded-full bg-emerald-400"/> Min/Median/Max salary bands</li>
<li className="flex items-start gap-2"><span className="mt-1 h-2 w-2 rounded-full bg-fuchsia-400"/> Personalized skill gaps and next steps</li>
</ul>
<div className="mt-6">
<motion.div whileHover={{ y: -2, scale: 1.02 }} whileTap={{ scale: 0.98 }}>
<Link to="/insights" className="px-4 py-2 rounded bg-slate-800 hover:bg-slate-700 inline-flex items-center gap-2">
Explore Insights <ArrowRightIcon className="w-4 h-4"/>
</Link>
</motion.div>
</div>
</div>
<motion.div {...fadeUp(.05)} className="relative overflow-hidden rounded-2xl border border-slate-800 bg-slate-900/40 p-6">
<img src={images.insights} alt="Insights preview" className="w-full h-64 object-cover opacity-80" loading="lazy"/>
<div className="absolute inset-0 bg-gradient-to-t from-slate-950/80 to-transparent"/>
<div className="absolute bottom-0 p-4 text-slate-300 text-sm">Live analytics • Personalized by interests</div>
</motion.div>
</motion.div>
</section>
{/* Visual showcase rows */}
<section className="mx-auto max-w-7xl px-6 py-6">
<motion.div variants={containerStagger} initial="hidden" whileInView="show" viewport={{ once: true, amount: .2 }} className="grid lg:grid-cols-2 gap-6">
<Showcase
image={images.jobs}
badge="Jobs & Salaries"
title="Discover roles that match your skills"
desc="Search globally, filter smartly, and bookmark your best matches."
cta={{ href:'/jobs', label:'Explore Jobs' }}
/>
<Showcase
image={images.roadmaps}
badge="Roadmaps"
title="Structured learning without the guesswork"
desc="Step-by-step guidance and resources to master in-demand skills."
cta={{ href:'/roadmaps', label:'View Roadmaps' }}
/>
<Showcase
image={images.resume}
badge="Resume Builder"
title="Craft polished resumes in minutes"
desc="Drag-and-drop sections, preview live, and export crisp PDFs."
cta={{ href:'/resume-builder', label:'Build Resume' }}
/>
<Showcase
image={images.mock}
badge="Mock Interviews"
title="Practice confidently with realistic flows"
desc="Practice common questions, review transcripts, and iterate fast."
cta={{ href:'/mock-interview', label:'Start a Mock' }}
/>
</motion.div>
</section>
{/* How it helps */}
{HowItHelps()}
{/* Popular Paths */}
{PopularPaths()}
{/* Why choose us */}
{WhyChooseUs()}
{/* Stats band */}
<section className="mx-auto max-w-7xl px-6 py-12">
<motion.div {...fadeUp(0)} className="grid sm:grid-cols-3 gap-4">
<Stat number="50k+" label="Jobs Indexed"/>
<Stat number="200+" label="Roadmap Steps"/>
<Stat number="100%" label="Free to Use"/>
</motion.div>
</section>
{/* Testimonials */}
<section className="mx-auto max-w-7xl px-6 py-12">
<motion.h3 {...fadeUp(0)} className="text-xl font-semibold">What learners say</motion.h3>
<div className="mt-6">
<TestimonialsCarousel />
</div>
</section>
{/* FAQ */}
{FaqSection()}
{/* CTA */}
<section className="mx-auto max-w-7xl px-6 py-16">
<div className="relative overflow-hidden rounded-2xl border border-slate-800 bg-gradient-to-r from-slate-900 to-slate-800 p-8">
<motion.div {...fadeUp(0)} className="relative">
<h3 className="text-2xl md:text-3xl font-semibold">Your next step starts here</h3>
<p className="mt-2 text-slate-300">Sign in with Google and start exploring jobs, roadmaps, and more — it’s free.</p>
<div className="mt-6 flex gap-3">
<motion.div whileHover={{ y: -2, scale: 1.04 }} whileTap={{ scale: 0.98 }}>
<Link to="/auth/signup" className="inline-flex items-center gap-2 px-5 py-3 rounded text-white" style={{ backgroundColor: 'var(--brand)' }}>
Get Started <ArrowRightIcon className="w-5 h-5"/>
</Link>
</motion.div>
<motion.div whileHover={{ y: -2, scale: 1.04 }} whileTap={{ scale: 0.98 }}>
<Link to="/dashboard" className="inline-flex items-center gap-2 px-5 py-3 rounded bg-slate-800 hover:bg-slate-700">Go to Dashboard</Link>
</motion.div>
</div>
</motion.div>
<div className="pointer-events-none absolute -right-24 -top-24 h-72 w-72 rounded-full" style={{ background: 'var(--brand-glow)' }} />
</div>
</section>
<Footer />
</div>
)
}
function Feature({ icon:Icon, title, desc, animScale = 1.02 }){
return (
<motion.div
variants={itemMotion}
whileHover={{ y: -3, scale: animScale, boxShadow: '0 0 30px var(--brand-glow)' }}
transition={{ type: 'spring', stiffness: 220, damping: 18 }}
className="group p-5 rounded-2xl border border-slate-800 bg-slate-900/40 hover:bg-slate-900 transition shadow-sm"
>
<div className="flex items-start gap-3">
<div className="p-2 rounded-lg bg-slate-800 border border-slate-700 group-hover:border-brand-500">
<Icon className="w-6 h-6" style={{ color: 'var(--brand)' }}/>
</div>
<div>
<div className="font-semibold">{title}</div>
<div className="text-slate-400 text-sm mt-1">{desc}</div>
</div>
</div>
</motion.div>
)
}
// "How It Helps" section
function HowItHelps(){
return (
<section className="mx-auto max-w-7xl px-6 py-12">
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">How our platform helps you succeed</motion.h2>
<div className="mt-6 grid md:grid-cols-3 gap-4">
<HelpCard title="Clarity → Action" desc="Turn confusion into a clear plan: from choosing a path to executing daily steps."/>
<HelpCard title="Save Time" desc="Skip the research rabbit hole — curated roadmaps and resources in one place."/>
<HelpCard title="Stand Out" desc="Create polished resumes/letters and track progress to showcase real growth."/>
<HelpCard title="Be Job-Ready" desc="Practice MCQs, coding and interviews — build confidence before you apply."/>
<HelpCard title="Stay Informed" desc="Industry Insights highlight trending roles and skills you're missing."/>
<HelpCard title="All-In-One" desc="From jobs to higher studies, it's the hub for your career journey."/>
</div>
</section>
)
}
function HelpCard({ title, desc }){
return (
<motion.div
initial={{ opacity:0, y: 22, scale: .97 }}
whileInView={{ opacity:1, y:0, scale:1 }}
viewport={{ once: true, amount: .3 }}
whileHover={{ y: -6, scale: 1.03 }}
animate={{ boxShadow: [
'0 0 0 var(--brand-glow)',
'0 0 26px var(--brand-glow)',
'0 0 10px var(--brand-glow)'
] }}
transition={{ duration: .6 }}
className="relative p-5 rounded-2xl border border-slate-800 bg-slate-900/40 hover:bg-slate-900 overflow-hidden"
>
<div className="absolute -right-20 -top-20 h-40 w-40 rounded-full bg-brand-500/10 blur-3xl" />
<div className="font-semibold text-slate-100">{title}</div>
<div className="text-slate-400 text-sm mt-1">{desc}</div>
</motion.div>
)
}
function Showcase({ image, badge, title, desc, cta }){
return (
<motion.div variants={itemMotion} whileHover={{ y: -3, scale: 1.02, boxShadow: '0 0 38px var(--brand-glow)' }} className="relative overflow-hidden rounded-2xl border border-slate-800 bg-slate-900/40 transition">
<img src={image} alt={title} className="w-full h-64 object-cover opacity-80" loading="lazy" onError={(e)=>{e.currentTarget.src='https://images.unsplash.com/photo-1557682250-33bd709cbe85?q=80&w=1600&auto=format&fit=crop'}}/>
<div className="absolute inset-0 bg-gradient-to-t from-slate-950/80 to-transparent"/>
<div className="absolute bottom-0 p-5">
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-900/70 border border-slate-800 text-slate-300 text-sm">
<SparklesIcon className="w-4 h-4" style={{ color: 'var(--brand)' }}/> {badge}
</div>
<div className="mt-3 text-xl font-semibold">{title}</div>
<div className="text-slate-300 text-sm mt-1 max-w-md">{desc}</div>
{cta && (
<a href={cta.href} className="mt-3 inline-flex items-center gap-2 px-4 py-2 rounded bg-slate-800 hover:bg-slate-700">
{cta.label} <ArrowRightIcon className="w-4 h-4"/>
</a>
)}
</div>
</motion.div>
)
}
// Popular Paths section
function PopularPaths(){
const items = [
{ title: 'Frontend Developer', steps: 'HTML • CSS • JS • React • TS', link: '/roadmaps#frontend' },
{ title: 'Backend Developer', steps: 'Node.js • APIs • DB • Auth • DevOps', link: '/roadmaps#backend' },
{ title: 'Data Analyst', steps: 'Excel • SQL • BI • Python • Viz', link: '/roadmaps#data-analyst' },
{ title: 'AI/ML Engineer', steps: 'Python • ML • MLOps • Deploy', link: '/roadmaps#ml' },
{ title: 'Cloud Engineer', steps: 'AWS • Docker • CI/CD • Terraform', link: '/roadmaps#cloud' },
{ title: 'Mobile Developer', steps: 'Kotlin • Swift • Flutter • React Native', link: '/roadmaps#mobile' },
]
const gradients = [
'from-cyan-500/20 to-fuchsia-500/10',
'from-emerald-500/20 to-cyan-500/10',
'from-orange-500/20 to-rose-500/10',
'from-indigo-500/20 to-purple-500/10',
'from-pink-500/20 to-yellow-500/10',
'from-sky-500/20 to-emerald-500/10',
]
return (
<section className="mx-auto max-w-7xl px-6 py-12">
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">Popular paths to get started</motion.h2>
<motion.div variants={containerStagger} initial="hidden" whileInView="show" viewport={{ once: true, amount: .2 }} className="mt-6 grid sm:grid-cols-2 lg:grid-cols-3 gap-5">
{items.map((it, i) => (
<motion.a
key={it.title}
href={it.link}
variants={itemMotion}
className={`relative p-5 rounded-2xl border border-slate-800 bg-gradient-to-br ${gradients[i % gradients.length]} hover:brightness-110 transition block overflow-hidden`}
whileHover={{ y: -6, scale: 1.05, boxShadow: '0 0 42px var(--brand-glow)' }}
>
<div className="absolute -right-16 -top-16 h-40 w-40 rounded-full" style={{ background: 'var(--brand-glow)' }} />
<div className="flex items-start gap-3">
<div className="flex-none h-9 w-9 rounded-lg bg-slate-900/60 border border-slate-700 flex items-center justify-center text-slate-200 font-semibold">
{String(i+1).padStart(2,'0')}
</div>
<div>
<div className="font-semibold">{it.title}</div>
<div className="text-slate-300 text-sm mt-1">{it.steps}</div>
</div>
</div>
</motion.a>
))}
</motion.div>
</section>
)
}
function WhyChooseUs(){
const features = [
{
icon: '🎯',
title: 'All-in-One Career Platform',
desc: 'Single workspace for jobs, learning, resumes, and interviews — no more switching between tools.',
highlight: 'Unified Experience'
},
{
icon: '📊',
title: 'Data-Driven Insights',
desc: 'Real-time market trends, salary data, and skill gaps help you make informed career decisions.',
highlight: 'Smart Analytics'
},
{
icon: '🛤️',
title: 'Personalized Learning Paths',
desc: 'Adaptive roadmaps that evolve with your progress and keep you on track to your goals.',
highlight: 'Tailored Learning'
},
{
icon: '📄',
title: 'ATS-Optimized Documents',
desc: 'Professional resume and cover letter templates that pass applicant tracking systems.',
highlight: 'Professional Quality'
},
{
icon: '🎤',
title: 'Interview Practice Lab',
desc: 'Realistic mock interviews with AI feedback to build confidence before the real thing.',
highlight: 'Confidence Building'
},
{
icon: '🔒',
title: 'Privacy & Security First',
desc: 'Your data stays yours with secure Google authentication and easy export options.',
highlight: 'Your Data, Your Control'
},
]
return (
<section className="mx-auto max-w-7xl px-6 py-16">
<motion.div {...fadeUp(0)} className="text-center mb-12">
<h2 className="text-3xl md:text-4xl font-bold mb-4">Why Choose CareerGuide</h2>
<p className="text-slate-400 text-lg max-w-2xl mx-auto">
We've built the most comprehensive career platform to help you succeed at every step of your professional journey.
</p>
</motion.div>
<motion.div
variants={containerStagger}
initial="hidden"
whileInView="show"
viewport={{ once: true, amount: .2 }}
className="grid md:grid-cols-2 lg:grid-cols-3 gap-6"
>
{features.map((feature, index) => (
<motion.div
key={feature.title}
variants={itemMotion}
whileHover={{ y: -8, scale: 1.02, boxShadow: '0 20px 40px var(--brand-glow)' }}
className="group relative p-6 rounded-2xl border border-slate-800 bg-slate-900/40 hover:bg-slate-900/60 transition-all duration-300 overflow-hidden"
>
{/* Background gradient */}
<div className="absolute inset-0 bg-gradient-to-br from-brand-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
{/* Icon */}
<div className="text-3xl mb-4">{feature.icon}</div>
{/* Content */}
<div className="relative z-10">
<div className="inline-block px-3 py-1 rounded-full bg-brand-500/10 border border-brand-500/20 text-brand-400 text-xs font-medium mb-3">
{feature.highlight}
</div>
<h3 className="text-xl font-semibold mb-3 text-slate-100">{feature.title}</h3>
<p className="text-slate-400 text-sm leading-relaxed">{feature.desc}</p>
</div>
{/* Hover effect line */}
<div className="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-brand-500 to-brand-400 group-hover:w-full transition-all duration-500" />
</motion.div>
))}
</motion.div>
{/* Bottom CTA */}
<motion.div {...fadeUp(.1)} className="text-center mt-12">
<div className="inline-flex items-center gap-2 px-6 py-3 rounded-full bg-slate-800/50 border border-slate-700 text-slate-300">
<span className="w-2 h-2 rounded-full bg-brand-400 animate-pulse"></span>
<span className="text-sm">Join thousands of professionals who've accelerated their careers</span>
</div>
</motion.div>
</section>
)
}
function NodeCard({ title, desc }){
return (
<motion.div whileHover={{ y: -3, scale: 1.02, boxShadow: '0 0 28px var(--brand-glow)' }} className="w-[200px] lg:w-[220px] max-w-xs p-3 lg:p-4 rounded-xl border border-slate-800 bg-slate-900/70">
<div className="font-medium text-slate-100 text-sm lg:text-base">{title}</div>
<div className="text-slate-400 text-xs mt-1 leading-relaxed">{desc}</div>
</motion.div>
)
}
// FAQ section
function FaqSection(){
const faqs = [
{ q: 'Is it free to start?', a: 'Yes. You can sign in and use core features like Jobs, Roadmaps, and Resume Builder for free.' },
{ q: 'Do I need coding experience?', a: 'No. Choose a path that matches your goal — we guide you step by step.' },
{ q: 'Will you add personalized insights?', a: 'Yes. The Insights page already showcases trends and will soon personalize by your interests and profile.' },
]
return (
<section className="mx-auto max-w-7xl px-6 py-12">
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">Frequently asked questions</motion.h2>
<motion.div variants={containerStagger} initial="hidden" whileInView="show" viewport={{ once: true, amount: .2 }} className="mt-6 grid md:grid-cols-3 gap-4">
{faqs.map(f => (
<motion.div key={f.q} variants={itemMotion} className="p-5 rounded-2xl border border-slate-800 bg-slate-900/40">
<div className="font-medium">{f.q}</div>
<div className="text-slate-400 text-sm mt-1">{f.a}</div>
</motion.div>
))}
</motion.div>
</section>
)
}
function Stat({ number, label }){
return (
<div className="p-5 rounded-2xl border border-slate-800 bg-slate-900/40 text-center">
<div className="text-3xl font-semibold text-brand-400">{number}</div>
<div className="text-slate-400 text-sm mt-1">{label}</div>
</div>
)
}
function Testimonial({ quote, author }){
return (
<motion.div {...fadeUp(.05)} className="p-5 rounded-2xl border border-slate-800 bg-slate-900/40">
<div className="text-slate-300">"{quote}"</div>
<div className="text-slate-500 text-sm mt-2">— {author}</div>
</motion.div>
)
}