Spaces:
Running
Running
Upload 2 files
Browse files- Landing.jsx +553 -0
- index.css +33 -0
Landing.jsx
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Navbar from '../components/Navbar'
|
| 2 |
+
import AnimatedBackground from '../components/AnimatedBackground'
|
| 3 |
+
import { motion } from 'framer-motion'
|
| 4 |
+
import { useMemo, useRef } from 'react'
|
| 5 |
+
import { Link } from 'react-router-dom'
|
| 6 |
+
import {
|
| 7 |
+
AcademicCapIcon,
|
| 8 |
+
BriefcaseIcon,
|
| 9 |
+
CommandLineIcon,
|
| 10 |
+
DocumentTextIcon,
|
| 11 |
+
SparklesIcon,
|
| 12 |
+
ChatBubbleLeftRightIcon,
|
| 13 |
+
ArrowRightIcon,
|
| 14 |
+
GlobeAltIcon,
|
| 15 |
+
PresentationChartBarIcon,
|
| 16 |
+
} from '@heroicons/react/24/outline'
|
| 17 |
+
import Footer from '../components/Footer'
|
| 18 |
+
import TestimonialsCarousel from '../components/TestimonialsCarousel'
|
| 19 |
+
import { useTheme } from '../theme/ThemeContext'
|
| 20 |
+
|
| 21 |
+
const fadeUp = (d=0) => ({ initial:{opacity:0,y:24}, whileInView:{opacity:1,y:0}, viewport:{once:true, amount:.3}, transition:{duration:.6, delay:d} })
|
| 22 |
+
const containerStagger = {
|
| 23 |
+
hidden: { opacity: 0 },
|
| 24 |
+
show: { opacity: 1, transition: { staggerChildren: 0.08 } }
|
| 25 |
+
}
|
| 26 |
+
const itemMotion = {
|
| 27 |
+
hidden: { opacity: 0, y: 18, scale: .98 },
|
| 28 |
+
show: { opacity: 1, y: 0, scale: 1, transition: { duration: .5 } }
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
export default function Landing(){
|
| 32 |
+
const { theme } = useTheme() || { theme: { imagery: 'abstract', anim: 'medium', parallax: 'medium' } }
|
| 33 |
+
const animScale = theme.anim === 'strong' ? 1.06 : theme.anim === 'medium' ? 1.02 : 1.005
|
| 34 |
+
const isTouch = typeof window !== 'undefined' && matchMedia('(pointer:coarse)').matches
|
| 35 |
+
const baseParallax = theme.parallax === 'strong' ? 8 : theme.parallax === 'medium' ? 6 : 3
|
| 36 |
+
const parallaxFactor = isTouch ? Math.max(2, baseParallax - 4) : baseParallax
|
| 37 |
+
|
| 38 |
+
const images = useMemo(() => {
|
| 39 |
+
const sets = {
|
| 40 |
+
abstract: {
|
| 41 |
+
hero: 'https://images.unsplash.com/photo-1557683316-973673baf926?q=80&w=1600&auto=format&fit=crop',
|
| 42 |
+
jobs: 'https://images.unsplash.com/photo-1553877522-43269d4ea984?q=80&w=1600&auto=format&fit=crop',
|
| 43 |
+
roadmaps: 'https://images.unsplash.com/photo-1522071820081-009f0129c71c?q=80&w=1600&auto=format&fit=crop',
|
| 44 |
+
resume: 'https://images.unsplash.com/photo-1515378791036-0648a3ef77b2?q=80&w=1600&auto=format&fit=crop',
|
| 45 |
+
mock: 'https://images.unsplash.com/photo-1522202176988-66273c2fd55f?q=80&w=1600&auto=format&fit=crop',
|
| 46 |
+
insights: 'https://images.unsplash.com/photo-1516321497487-e288fb19713f?q=80&w=1600&auto=format&fit=crop',
|
| 47 |
+
},
|
| 48 |
+
illustrations: {
|
| 49 |
+
hero: 'https://images.unsplash.com/photo-1542751371-adc38448a05e?q=80&w=1600&auto=format&fit=crop',
|
| 50 |
+
jobs: 'https://images.unsplash.com/photo-1611162618479-7d7a39e9be50?q=80&w=1600&auto=format&fit=crop',
|
| 51 |
+
roadmaps: 'https://images.unsplash.com/photo-1545239351-1141bd82e8a6?q=80&w=1600&auto=format&fit=crop',
|
| 52 |
+
resume: 'https://images.unsplash.com/photo-1557682250-33bd709cbe85?q=80&w=1600&auto=format&fit=crop',
|
| 53 |
+
mock: 'https://images.unsplash.com/photo-1516557070061-c3d1653fa646?q=80&w=1600&auto=format&fit=crop',
|
| 54 |
+
insights: 'https://images.unsplash.com/photo-1520975922203-b5a9cb27689a?q=80&w=1600&auto=format&fit=crop',
|
| 55 |
+
},
|
| 56 |
+
photos: {
|
| 57 |
+
hero: 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?q=80&w=1600&auto=format&fit=crop',
|
| 58 |
+
jobs: 'https://images.unsplash.com/photo-1497493292307-31c376b6e479?q=80&w=1600&auto=format&fit=crop',
|
| 59 |
+
roadmaps: 'https://images.unsplash.com/photo-1496307042754-b4aa456c4a2d?q=80&w=1600&auto=format&fit=crop',
|
| 60 |
+
resume: 'https://images.unsplash.com/photo-1529101091764-c3526daf38fe?q=80&w=1600&auto=format&fit=crop',
|
| 61 |
+
mock: 'https://images.unsplash.com/photo-1521737604893-d14cc237f11d?q=80&w=1600&auto=format&fit=crop',
|
| 62 |
+
insights: 'https://images.unsplash.com/photo-1534759846116-5791a4b5528c?q=80&w=1600&auto=format&fit=crop',
|
| 63 |
+
}
|
| 64 |
+
}
|
| 65 |
+
return sets[theme.imagery] || sets.abstract
|
| 66 |
+
}, [theme.imagery])
|
| 67 |
+
const heroTiltRef = useRef(null)
|
| 68 |
+
const onHeroMouseMove = (e) => {
|
| 69 |
+
const el = heroTiltRef.current
|
| 70 |
+
if(!el) return
|
| 71 |
+
const rect = el.getBoundingClientRect()
|
| 72 |
+
const x = e.clientX - rect.left
|
| 73 |
+
const y = e.clientY - rect.top
|
| 74 |
+
const rx = ((y / rect.height) - 0.5) * (-parallaxFactor) // tilt X
|
| 75 |
+
const ry = ((x / rect.width) - 0.5) * parallaxFactor // tilt Y
|
| 76 |
+
el.style.transform = `perspective(800px) rotateX(${rx}deg) rotateY(${ry}deg) translateZ(0)`
|
| 77 |
+
}
|
| 78 |
+
const onHeroMouseLeave = () => {
|
| 79 |
+
const el = heroTiltRef.current
|
| 80 |
+
if(!el) return
|
| 81 |
+
el.style.transform = 'perspective(800px) rotateX(0deg) rotateY(0deg) translateZ(0)'
|
| 82 |
+
}
|
| 83 |
+
return (
|
| 84 |
+
<div className="relative min-h-screen overflow-hidden">
|
| 85 |
+
<AnimatedBackground />
|
| 86 |
+
{/* Subtle background image for hero depth */}
|
| 87 |
+
<img
|
| 88 |
+
src="https://images.unsplash.com/photo-1543286386-2e659306cd6c?q=80&w=1920&auto=format&fit=crop"
|
| 89 |
+
alt="bg"
|
| 90 |
+
className="pointer-events-none select-none absolute inset-0 -z-20 h-full w-full object-cover opacity-[0.06]"
|
| 91 |
+
loading="lazy"
|
| 92 |
+
/>
|
| 93 |
+
<Navbar />
|
| 94 |
+
|
| 95 |
+
{/* Hero */}
|
| 96 |
+
<section className="relative mx-auto max-w-7xl px-6 pt-20 pb-16">
|
| 97 |
+
<div className="relative grid lg:grid-cols-2 gap-10 items-center">
|
| 98 |
+
<motion.div {...fadeUp(0)}>
|
| 99 |
+
<h1 className="text-4xl md:text-6xl font-semibold tracking-tight leading-tight">
|
| 100 |
+
Your Career. <span className="text-brand-400">Supercharged.</span>
|
| 101 |
+
</h1>
|
| 102 |
+
<p className="mt-4 text-slate-300 max-w-xl">
|
| 103 |
+
One place to discover jobs & internships, follow curated roadmaps, build resumes & cover letters,
|
| 104 |
+
practice mock interviews, and ace placements — all in one powerful platform.
|
| 105 |
+
</p>
|
| 106 |
+
<div className="mt-8 flex flex-wrap gap-3">
|
| 107 |
+
<motion.div whileHover={{ y: -2, scale: 1.02 }} whileTap={{ scale: 0.98 }}>
|
| 108 |
+
<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">
|
| 109 |
+
Get Started <ArrowRightIcon className="w-5 h-5"/>
|
| 110 |
+
</Link>
|
| 111 |
+
</motion.div>
|
| 112 |
+
<motion.div whileHover={{ y: -2, scale: 1.02 }} whileTap={{ scale: 0.98 }}>
|
| 113 |
+
<a href="#features" className="px-5 py-3 rounded bg-slate-800 hover:bg-slate-700 inline-flex items-center gap-2">
|
| 114 |
+
Explore Features
|
| 115 |
+
</a>
|
| 116 |
+
</motion.div>
|
| 117 |
+
</div>
|
| 118 |
+
{/* Removed small utility line per request */}
|
| 119 |
+
</motion.div>
|
| 120 |
+
<motion.div {...fadeUp(.1)} className="relative" onMouseMove={onHeroMouseMove} onMouseLeave={onHeroMouseLeave}>
|
| 121 |
+
<div ref={heroTiltRef} className="relative rounded-2xl overflow-hidden border border-slate-800 bg-slate-900/40 shadow-xl transition-transform will-change-transform">
|
| 122 |
+
{/* Professional career guidance hero image */}
|
| 123 |
+
<img
|
| 124 |
+
src="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?q=80&w=1600&auto=format&fit=crop"
|
| 125 |
+
alt="Career guidance and professional development"
|
| 126 |
+
className="w-full h-80 object-cover"
|
| 127 |
+
referrerPolicy="no-referrer"
|
| 128 |
+
loading="eager"
|
| 129 |
+
/>
|
| 130 |
+
{/* Lighten overlay so the image reads strongly */}
|
| 131 |
+
<div className="absolute inset-0 bg-gradient-to-t from-slate-950/40 to-transparent" />
|
| 132 |
+
<div className="absolute bottom-0 p-6">
|
| 133 |
+
<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">
|
| 134 |
+
<SparklesIcon className="w-4 h-4" style={{ color: 'var(--brand)' }}/> Professional Career Platform
|
| 135 |
+
</div>
|
| 136 |
+
</div>
|
| 137 |
+
</div>
|
| 138 |
+
</motion.div>
|
| 139 |
+
</div>
|
| 140 |
+
</section>
|
| 141 |
+
|
| 142 |
+
{/* Decorative gradient blobs */}
|
| 143 |
+
<div className="pointer-events-none absolute -left-24 top-40 h-80 w-80 rounded-full bg-brand-500/10 blur-3xl"/>
|
| 144 |
+
<div className="pointer-events-none absolute -right-24 top-[600px] h-80 w-80 rounded-full bg-indigo-500/10 blur-3xl"/>
|
| 145 |
+
|
| 146 |
+
{/* Features grid */}
|
| 147 |
+
<section id="features" className="mx-auto max-w-7xl px-6 py-10">
|
| 148 |
+
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">Everything you need for your career journey</motion.h2>
|
| 149 |
+
<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>
|
| 150 |
+
<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">
|
| 151 |
+
<Feature icon={BriefcaseIcon} title="Jobs & Internships" desc="Find roles that fit you, track applications, and uncover salary trends — all in one place." animScale={animScale}/>
|
| 152 |
+
<Feature icon={AcademicCapIcon} title="Learning Roadmaps" desc="Follow step‑by‑step paths with curated resources, milestones, and checkpoints to stay consistent." animScale={animScale}/>
|
| 153 |
+
<Feature icon={DocumentTextIcon} title="Resume & Cover Letters" desc="Build ATS‑friendly documents with proven sections and export crisp PDFs in seconds." animScale={animScale}/>
|
| 154 |
+
<Feature icon={CommandLineIcon} title="Placement Prep" desc="Practice MCQs, coding and interviews — build confidence before you apply." animScale={animScale}/>
|
| 155 |
+
<Feature icon={ChatBubbleLeftRightIcon} title="Mock Interviews" desc="Rehearse realistic interviews, reflect on transcripts, and fix gaps before the real one." animScale={animScale}/>
|
| 156 |
+
<Feature icon={GlobeAltIcon} title="Higher Studies" desc="Compare programs, shortlist universities, and plan requirements without the overwhelm." animScale={animScale}/>
|
| 157 |
+
<Feature icon={PresentationChartBarIcon} title="Industry Insights" desc="See in‑demand roles, compare salary bands, and know which skills to learn next." animScale={animScale}/>
|
| 158 |
+
</motion.div>
|
| 159 |
+
</section>
|
| 160 |
+
|
| 161 |
+
{/* Industry Insights */}
|
| 162 |
+
<section className="mx-auto max-w-7xl px-6 py-10">
|
| 163 |
+
<motion.div {...fadeUp(0)} className="grid lg:grid-cols-2 gap-8 items-center">
|
| 164 |
+
<div>
|
| 165 |
+
<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">
|
| 166 |
+
<PresentationChartBarIcon className="w-4 h-4" style={{ color: 'var(--brand)' }}/> Industry Insights
|
| 167 |
+
</div>
|
| 168 |
+
<h2 className="mt-3 text-2xl md:text-3xl font-semibold">Know what's trending — and what to learn next</h2>
|
| 169 |
+
<p className="mt-3 text-slate-300 max-w-xl">
|
| 170 |
+
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.
|
| 171 |
+
</p>
|
| 172 |
+
<ul className="mt-5 space-y-2 text-slate-300">
|
| 173 |
+
<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>
|
| 174 |
+
<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>
|
| 175 |
+
<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>
|
| 176 |
+
</ul>
|
| 177 |
+
<div className="mt-6">
|
| 178 |
+
<motion.div whileHover={{ y: -2, scale: 1.02 }} whileTap={{ scale: 0.98 }}>
|
| 179 |
+
<Link to="/insights" className="px-4 py-2 rounded bg-slate-800 hover:bg-slate-700 inline-flex items-center gap-2">
|
| 180 |
+
Explore Insights <ArrowRightIcon className="w-4 h-4"/>
|
| 181 |
+
</Link>
|
| 182 |
+
</motion.div>
|
| 183 |
+
</div>
|
| 184 |
+
</div>
|
| 185 |
+
<motion.div {...fadeUp(.05)} className="relative overflow-hidden rounded-2xl border border-slate-800 bg-slate-900/40 p-6">
|
| 186 |
+
<img src={images.insights} alt="Insights preview" className="w-full h-64 object-cover opacity-80" loading="lazy"/>
|
| 187 |
+
<div className="absolute inset-0 bg-gradient-to-t from-slate-950/80 to-transparent"/>
|
| 188 |
+
<div className="absolute bottom-0 p-4 text-slate-300 text-sm">Live analytics • Personalized by interests</div>
|
| 189 |
+
</motion.div>
|
| 190 |
+
</motion.div>
|
| 191 |
+
</section>
|
| 192 |
+
|
| 193 |
+
{/* Visual showcase rows */}
|
| 194 |
+
<section className="mx-auto max-w-7xl px-6 py-6">
|
| 195 |
+
<motion.div variants={containerStagger} initial="hidden" whileInView="show" viewport={{ once: true, amount: .2 }} className="grid lg:grid-cols-2 gap-6">
|
| 196 |
+
<Showcase
|
| 197 |
+
image={images.jobs}
|
| 198 |
+
badge="Jobs & Salaries"
|
| 199 |
+
title="Discover roles that match your skills"
|
| 200 |
+
desc="Search globally, filter smartly, and bookmark your best matches."
|
| 201 |
+
cta={{ href:'/jobs', label:'Explore Jobs' }}
|
| 202 |
+
/>
|
| 203 |
+
<Showcase
|
| 204 |
+
image={images.roadmaps}
|
| 205 |
+
badge="Roadmaps"
|
| 206 |
+
title="Structured learning without the guesswork"
|
| 207 |
+
desc="Step-by-step guidance and resources to master in-demand skills."
|
| 208 |
+
cta={{ href:'/roadmaps', label:'View Roadmaps' }}
|
| 209 |
+
/>
|
| 210 |
+
<Showcase
|
| 211 |
+
image={images.resume}
|
| 212 |
+
badge="Resume Builder"
|
| 213 |
+
title="Craft polished resumes in minutes"
|
| 214 |
+
desc="Drag-and-drop sections, preview live, and export crisp PDFs."
|
| 215 |
+
cta={{ href:'/resume-builder', label:'Build Resume' }}
|
| 216 |
+
/>
|
| 217 |
+
<Showcase
|
| 218 |
+
image={images.mock}
|
| 219 |
+
badge="Mock Interviews"
|
| 220 |
+
title="Practice confidently with realistic flows"
|
| 221 |
+
desc="Practice common questions, review transcripts, and iterate fast."
|
| 222 |
+
cta={{ href:'/mock-interview', label:'Start a Mock' }}
|
| 223 |
+
/>
|
| 224 |
+
</motion.div>
|
| 225 |
+
</section>
|
| 226 |
+
|
| 227 |
+
{/* How it helps */}
|
| 228 |
+
{HowItHelps()}
|
| 229 |
+
|
| 230 |
+
{/* Popular Paths */}
|
| 231 |
+
{PopularPaths()}
|
| 232 |
+
|
| 233 |
+
{/* Why choose us */}
|
| 234 |
+
{WhyChooseUs()}
|
| 235 |
+
|
| 236 |
+
{/* Stats band */}
|
| 237 |
+
<section className="mx-auto max-w-7xl px-6 py-12">
|
| 238 |
+
<motion.div {...fadeUp(0)} className="grid sm:grid-cols-3 gap-4">
|
| 239 |
+
<Stat number="50k+" label="Jobs Indexed"/>
|
| 240 |
+
<Stat number="200+" label="Roadmap Steps"/>
|
| 241 |
+
<Stat number="100%" label="Free to Use"/>
|
| 242 |
+
</motion.div>
|
| 243 |
+
</section>
|
| 244 |
+
|
| 245 |
+
{/* Testimonials */}
|
| 246 |
+
<section className="mx-auto max-w-7xl px-6 py-12">
|
| 247 |
+
<motion.h3 {...fadeUp(0)} className="text-xl font-semibold">What learners say</motion.h3>
|
| 248 |
+
<div className="mt-6">
|
| 249 |
+
<TestimonialsCarousel />
|
| 250 |
+
</div>
|
| 251 |
+
</section>
|
| 252 |
+
|
| 253 |
+
{/* FAQ */}
|
| 254 |
+
{FaqSection()}
|
| 255 |
+
|
| 256 |
+
{/* CTA */}
|
| 257 |
+
<section className="mx-auto max-w-7xl px-6 py-16">
|
| 258 |
+
<div className="relative overflow-hidden rounded-2xl border border-slate-800 bg-gradient-to-r from-slate-900 to-slate-800 p-8">
|
| 259 |
+
<motion.div {...fadeUp(0)} className="relative">
|
| 260 |
+
<h3 className="text-2xl md:text-3xl font-semibold">Your next step starts here</h3>
|
| 261 |
+
<p className="mt-2 text-slate-300">Sign in with Google and start exploring jobs, roadmaps, and more — it’s free.</p>
|
| 262 |
+
<div className="mt-6 flex gap-3">
|
| 263 |
+
<motion.div whileHover={{ y: -2, scale: 1.04 }} whileTap={{ scale: 0.98 }}>
|
| 264 |
+
<Link to="/auth/signup" className="inline-flex items-center gap-2 px-5 py-3 rounded text-white" style={{ backgroundColor: 'var(--brand)' }}>
|
| 265 |
+
Get Started <ArrowRightIcon className="w-5 h-5"/>
|
| 266 |
+
</Link>
|
| 267 |
+
</motion.div>
|
| 268 |
+
<motion.div whileHover={{ y: -2, scale: 1.04 }} whileTap={{ scale: 0.98 }}>
|
| 269 |
+
<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>
|
| 270 |
+
</motion.div>
|
| 271 |
+
</div>
|
| 272 |
+
</motion.div>
|
| 273 |
+
<div className="pointer-events-none absolute -right-24 -top-24 h-72 w-72 rounded-full" style={{ background: 'var(--brand-glow)' }} />
|
| 274 |
+
</div>
|
| 275 |
+
</section>
|
| 276 |
+
|
| 277 |
+
<Footer />
|
| 278 |
+
</div>
|
| 279 |
+
)
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
function Feature({ icon:Icon, title, desc, animScale = 1.02 }){
|
| 283 |
+
return (
|
| 284 |
+
<motion.div
|
| 285 |
+
variants={itemMotion}
|
| 286 |
+
whileHover={{ y: -3, scale: animScale, boxShadow: '0 0 30px var(--brand-glow)' }}
|
| 287 |
+
transition={{ type: 'spring', stiffness: 220, damping: 18 }}
|
| 288 |
+
className="group p-5 rounded-2xl border border-slate-800 bg-slate-900/40 hover:bg-slate-900 transition shadow-sm"
|
| 289 |
+
>
|
| 290 |
+
<div className="flex items-start gap-3">
|
| 291 |
+
<div className="p-2 rounded-lg bg-slate-800 border border-slate-700 group-hover:border-brand-500">
|
| 292 |
+
<Icon className="w-6 h-6" style={{ color: 'var(--brand)' }}/>
|
| 293 |
+
</div>
|
| 294 |
+
<div>
|
| 295 |
+
<div className="font-semibold">{title}</div>
|
| 296 |
+
<div className="text-slate-400 text-sm mt-1">{desc}</div>
|
| 297 |
+
</div>
|
| 298 |
+
</div>
|
| 299 |
+
</motion.div>
|
| 300 |
+
)
|
| 301 |
+
}
|
| 302 |
+
|
| 303 |
+
// "How It Helps" section
|
| 304 |
+
function HowItHelps(){
|
| 305 |
+
return (
|
| 306 |
+
<section className="mx-auto max-w-7xl px-6 py-12">
|
| 307 |
+
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">How our platform helps you succeed</motion.h2>
|
| 308 |
+
<div className="mt-6 grid md:grid-cols-3 gap-4">
|
| 309 |
+
<HelpCard title="Clarity → Action" desc="Turn confusion into a clear plan: from choosing a path to executing daily steps."/>
|
| 310 |
+
<HelpCard title="Save Time" desc="Skip the research rabbit hole — curated roadmaps and resources in one place."/>
|
| 311 |
+
<HelpCard title="Stand Out" desc="Create polished resumes/letters and track progress to showcase real growth."/>
|
| 312 |
+
<HelpCard title="Be Job-Ready" desc="Practice MCQs, coding and interviews — build confidence before you apply."/>
|
| 313 |
+
<HelpCard title="Stay Informed" desc="Industry Insights highlight trending roles and skills you're missing."/>
|
| 314 |
+
<HelpCard title="All-In-One" desc="From jobs to higher studies, it's the hub for your career journey."/>
|
| 315 |
+
</div>
|
| 316 |
+
</section>
|
| 317 |
+
)
|
| 318 |
+
}
|
| 319 |
+
|
| 320 |
+
function HelpCard({ title, desc }){
|
| 321 |
+
return (
|
| 322 |
+
<motion.div
|
| 323 |
+
initial={{ opacity:0, y: 22, scale: .97 }}
|
| 324 |
+
whileInView={{ opacity:1, y:0, scale:1 }}
|
| 325 |
+
viewport={{ once: true, amount: .3 }}
|
| 326 |
+
whileHover={{ y: -6, scale: 1.03 }}
|
| 327 |
+
animate={{ boxShadow: [
|
| 328 |
+
'0 0 0 var(--brand-glow)',
|
| 329 |
+
'0 0 26px var(--brand-glow)',
|
| 330 |
+
'0 0 10px var(--brand-glow)'
|
| 331 |
+
] }}
|
| 332 |
+
transition={{ duration: .6 }}
|
| 333 |
+
className="relative p-5 rounded-2xl border border-slate-800 bg-slate-900/40 hover:bg-slate-900 overflow-hidden"
|
| 334 |
+
>
|
| 335 |
+
<div className="absolute -right-20 -top-20 h-40 w-40 rounded-full bg-brand-500/10 blur-3xl" />
|
| 336 |
+
<div className="font-semibold text-slate-100">{title}</div>
|
| 337 |
+
<div className="text-slate-400 text-sm mt-1">{desc}</div>
|
| 338 |
+
</motion.div>
|
| 339 |
+
)
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
function Showcase({ image, badge, title, desc, cta }){
|
| 343 |
+
return (
|
| 344 |
+
<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">
|
| 345 |
+
<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'}}/>
|
| 346 |
+
<div className="absolute inset-0 bg-gradient-to-t from-slate-950/80 to-transparent"/>
|
| 347 |
+
<div className="absolute bottom-0 p-5">
|
| 348 |
+
<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">
|
| 349 |
+
<SparklesIcon className="w-4 h-4" style={{ color: 'var(--brand)' }}/> {badge}
|
| 350 |
+
</div>
|
| 351 |
+
<div className="mt-3 text-xl font-semibold">{title}</div>
|
| 352 |
+
<div className="text-slate-300 text-sm mt-1 max-w-md">{desc}</div>
|
| 353 |
+
{cta && (
|
| 354 |
+
<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">
|
| 355 |
+
{cta.label} <ArrowRightIcon className="w-4 h-4"/>
|
| 356 |
+
</a>
|
| 357 |
+
)}
|
| 358 |
+
</div>
|
| 359 |
+
</motion.div>
|
| 360 |
+
)
|
| 361 |
+
}
|
| 362 |
+
|
| 363 |
+
// Popular Paths section
|
| 364 |
+
function PopularPaths(){
|
| 365 |
+
const items = [
|
| 366 |
+
{ title: 'Frontend Developer', steps: 'HTML • CSS • JS • React • TS', link: '/roadmaps#frontend' },
|
| 367 |
+
{ title: 'Backend Developer', steps: 'Node.js • APIs • DB • Auth • DevOps', link: '/roadmaps#backend' },
|
| 368 |
+
{ title: 'Data Analyst', steps: 'Excel • SQL • BI • Python • Viz', link: '/roadmaps#data-analyst' },
|
| 369 |
+
{ title: 'AI/ML Engineer', steps: 'Python • ML • MLOps • Deploy', link: '/roadmaps#ml' },
|
| 370 |
+
{ title: 'Cloud Engineer', steps: 'AWS • Docker • CI/CD • Terraform', link: '/roadmaps#cloud' },
|
| 371 |
+
{ title: 'Mobile Developer', steps: 'Kotlin • Swift • Flutter • React Native', link: '/roadmaps#mobile' },
|
| 372 |
+
]
|
| 373 |
+
const gradients = [
|
| 374 |
+
'from-cyan-500/20 to-fuchsia-500/10',
|
| 375 |
+
'from-emerald-500/20 to-cyan-500/10',
|
| 376 |
+
'from-orange-500/20 to-rose-500/10',
|
| 377 |
+
'from-indigo-500/20 to-purple-500/10',
|
| 378 |
+
'from-pink-500/20 to-yellow-500/10',
|
| 379 |
+
'from-sky-500/20 to-emerald-500/10',
|
| 380 |
+
]
|
| 381 |
+
return (
|
| 382 |
+
<section className="mx-auto max-w-7xl px-6 py-12">
|
| 383 |
+
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">Popular paths to get started</motion.h2>
|
| 384 |
+
<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">
|
| 385 |
+
{items.map((it, i) => (
|
| 386 |
+
<motion.a
|
| 387 |
+
key={it.title}
|
| 388 |
+
href={it.link}
|
| 389 |
+
variants={itemMotion}
|
| 390 |
+
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`}
|
| 391 |
+
whileHover={{ y: -6, scale: 1.05, boxShadow: '0 0 42px var(--brand-glow)' }}
|
| 392 |
+
>
|
| 393 |
+
<div className="absolute -right-16 -top-16 h-40 w-40 rounded-full" style={{ background: 'var(--brand-glow)' }} />
|
| 394 |
+
<div className="flex items-start gap-3">
|
| 395 |
+
<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">
|
| 396 |
+
{String(i+1).padStart(2,'0')}
|
| 397 |
+
</div>
|
| 398 |
+
<div>
|
| 399 |
+
<div className="font-semibold">{it.title}</div>
|
| 400 |
+
<div className="text-slate-300 text-sm mt-1">{it.steps}</div>
|
| 401 |
+
</div>
|
| 402 |
+
</div>
|
| 403 |
+
</motion.a>
|
| 404 |
+
))}
|
| 405 |
+
</motion.div>
|
| 406 |
+
</section>
|
| 407 |
+
)
|
| 408 |
+
}
|
| 409 |
+
|
| 410 |
+
function WhyChooseUs(){
|
| 411 |
+
const features = [
|
| 412 |
+
{
|
| 413 |
+
icon: '🎯',
|
| 414 |
+
title: 'All-in-One Career Platform',
|
| 415 |
+
desc: 'Single workspace for jobs, learning, resumes, and interviews — no more switching between tools.',
|
| 416 |
+
highlight: 'Unified Experience'
|
| 417 |
+
},
|
| 418 |
+
{
|
| 419 |
+
icon: '📊',
|
| 420 |
+
title: 'Data-Driven Insights',
|
| 421 |
+
desc: 'Real-time market trends, salary data, and skill gaps help you make informed career decisions.',
|
| 422 |
+
highlight: 'Smart Analytics'
|
| 423 |
+
},
|
| 424 |
+
{
|
| 425 |
+
icon: '🛤️',
|
| 426 |
+
title: 'Personalized Learning Paths',
|
| 427 |
+
desc: 'Adaptive roadmaps that evolve with your progress and keep you on track to your goals.',
|
| 428 |
+
highlight: 'Tailored Learning'
|
| 429 |
+
},
|
| 430 |
+
{
|
| 431 |
+
icon: '📄',
|
| 432 |
+
title: 'ATS-Optimized Documents',
|
| 433 |
+
desc: 'Professional resume and cover letter templates that pass applicant tracking systems.',
|
| 434 |
+
highlight: 'Professional Quality'
|
| 435 |
+
},
|
| 436 |
+
{
|
| 437 |
+
icon: '🎤',
|
| 438 |
+
title: 'Interview Practice Lab',
|
| 439 |
+
desc: 'Realistic mock interviews with AI feedback to build confidence before the real thing.',
|
| 440 |
+
highlight: 'Confidence Building'
|
| 441 |
+
},
|
| 442 |
+
{
|
| 443 |
+
icon: '🔒',
|
| 444 |
+
title: 'Privacy & Security First',
|
| 445 |
+
desc: 'Your data stays yours with secure Google authentication and easy export options.',
|
| 446 |
+
highlight: 'Your Data, Your Control'
|
| 447 |
+
},
|
| 448 |
+
]
|
| 449 |
+
|
| 450 |
+
return (
|
| 451 |
+
<section className="mx-auto max-w-7xl px-6 py-16">
|
| 452 |
+
<motion.div {...fadeUp(0)} className="text-center mb-12">
|
| 453 |
+
<h2 className="text-3xl md:text-4xl font-bold mb-4">Why Choose CareerGuide</h2>
|
| 454 |
+
<p className="text-slate-400 text-lg max-w-2xl mx-auto">
|
| 455 |
+
We've built the most comprehensive career platform to help you succeed at every step of your professional journey.
|
| 456 |
+
</p>
|
| 457 |
+
</motion.div>
|
| 458 |
+
|
| 459 |
+
<motion.div
|
| 460 |
+
variants={containerStagger}
|
| 461 |
+
initial="hidden"
|
| 462 |
+
whileInView="show"
|
| 463 |
+
viewport={{ once: true, amount: .2 }}
|
| 464 |
+
className="grid md:grid-cols-2 lg:grid-cols-3 gap-6"
|
| 465 |
+
>
|
| 466 |
+
{features.map((feature, index) => (
|
| 467 |
+
<motion.div
|
| 468 |
+
key={feature.title}
|
| 469 |
+
variants={itemMotion}
|
| 470 |
+
whileHover={{ y: -8, scale: 1.02, boxShadow: '0 20px 40px var(--brand-glow)' }}
|
| 471 |
+
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"
|
| 472 |
+
>
|
| 473 |
+
{/* Background gradient */}
|
| 474 |
+
<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" />
|
| 475 |
+
|
| 476 |
+
{/* Icon */}
|
| 477 |
+
<div className="text-3xl mb-4">{feature.icon}</div>
|
| 478 |
+
|
| 479 |
+
{/* Content */}
|
| 480 |
+
<div className="relative z-10">
|
| 481 |
+
<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">
|
| 482 |
+
{feature.highlight}
|
| 483 |
+
</div>
|
| 484 |
+
<h3 className="text-xl font-semibold mb-3 text-slate-100">{feature.title}</h3>
|
| 485 |
+
<p className="text-slate-400 text-sm leading-relaxed">{feature.desc}</p>
|
| 486 |
+
</div>
|
| 487 |
+
|
| 488 |
+
{/* Hover effect line */}
|
| 489 |
+
<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" />
|
| 490 |
+
</motion.div>
|
| 491 |
+
))}
|
| 492 |
+
</motion.div>
|
| 493 |
+
|
| 494 |
+
{/* Bottom CTA */}
|
| 495 |
+
<motion.div {...fadeUp(.1)} className="text-center mt-12">
|
| 496 |
+
<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">
|
| 497 |
+
<span className="w-2 h-2 rounded-full bg-brand-400 animate-pulse"></span>
|
| 498 |
+
<span className="text-sm">Join thousands of professionals who've accelerated their careers</span>
|
| 499 |
+
</div>
|
| 500 |
+
</motion.div>
|
| 501 |
+
</section>
|
| 502 |
+
)
|
| 503 |
+
}
|
| 504 |
+
|
| 505 |
+
function NodeCard({ title, desc }){
|
| 506 |
+
return (
|
| 507 |
+
<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">
|
| 508 |
+
<div className="font-medium text-slate-100 text-sm lg:text-base">{title}</div>
|
| 509 |
+
<div className="text-slate-400 text-xs mt-1 leading-relaxed">{desc}</div>
|
| 510 |
+
</motion.div>
|
| 511 |
+
)
|
| 512 |
+
}
|
| 513 |
+
|
| 514 |
+
// FAQ section
|
| 515 |
+
function FaqSection(){
|
| 516 |
+
const faqs = [
|
| 517 |
+
{ q: 'Is it free to start?', a: 'Yes. You can sign in and use core features like Jobs, Roadmaps, and Resume Builder for free.' },
|
| 518 |
+
{ q: 'Do I need coding experience?', a: 'No. Choose a path that matches your goal — we guide you step by step.' },
|
| 519 |
+
{ q: 'Will you add personalized insights?', a: 'Yes. The Insights page already showcases trends and will soon personalize by your interests and profile.' },
|
| 520 |
+
]
|
| 521 |
+
return (
|
| 522 |
+
<section className="mx-auto max-w-7xl px-6 py-12">
|
| 523 |
+
<motion.h2 {...fadeUp(0)} className="text-2xl md:text-3xl font-semibold">Frequently asked questions</motion.h2>
|
| 524 |
+
<motion.div variants={containerStagger} initial="hidden" whileInView="show" viewport={{ once: true, amount: .2 }} className="mt-6 grid md:grid-cols-3 gap-4">
|
| 525 |
+
{faqs.map(f => (
|
| 526 |
+
<motion.div key={f.q} variants={itemMotion} className="p-5 rounded-2xl border border-slate-800 bg-slate-900/40">
|
| 527 |
+
<div className="font-medium">{f.q}</div>
|
| 528 |
+
<div className="text-slate-400 text-sm mt-1">{f.a}</div>
|
| 529 |
+
</motion.div>
|
| 530 |
+
))}
|
| 531 |
+
</motion.div>
|
| 532 |
+
</section>
|
| 533 |
+
)
|
| 534 |
+
}
|
| 535 |
+
|
| 536 |
+
function Stat({ number, label }){
|
| 537 |
+
return (
|
| 538 |
+
<div className="p-5 rounded-2xl border border-slate-800 bg-slate-900/40 text-center">
|
| 539 |
+
<div className="text-3xl font-semibold text-brand-400">{number}</div>
|
| 540 |
+
<div className="text-slate-400 text-sm mt-1">{label}</div>
|
| 541 |
+
</div>
|
| 542 |
+
)
|
| 543 |
+
}
|
| 544 |
+
|
| 545 |
+
function Testimonial({ quote, author }){
|
| 546 |
+
return (
|
| 547 |
+
<motion.div {...fadeUp(.05)} className="p-5 rounded-2xl border border-slate-800 bg-slate-900/40">
|
| 548 |
+
<div className="text-slate-300">"{quote}"</div>
|
| 549 |
+
<div className="text-slate-500 text-sm mt-2">— {author}</div>
|
| 550 |
+
</motion.div>
|
| 551 |
+
)
|
| 552 |
+
}
|
| 553 |
+
|
index.css
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@tailwind base;
|
| 2 |
+
@tailwind components;
|
| 3 |
+
@tailwind utilities;
|
| 4 |
+
|
| 5 |
+
:root {
|
| 6 |
+
color-scheme: dark;
|
| 7 |
+
--brand: #22d3ee; /* default teal */
|
| 8 |
+
--brand-glow: rgba(34, 211, 238, 0.35);
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
/* Fancy gradient grid background helper */
|
| 12 |
+
.bg-grid {
|
| 13 |
+
background-image: radial-gradient(rgba(255,255,255,.06) 1px, transparent 1px);
|
| 14 |
+
background-size: 22px 22px;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
/* Theme brand variants (applied on <body> via ThemeProvider) */
|
| 18 |
+
.brand-teal {
|
| 19 |
+
--brand: #22d3ee;
|
| 20 |
+
--brand-glow: rgba(34, 211, 238, 0.35);
|
| 21 |
+
}
|
| 22 |
+
.brand-indigo {
|
| 23 |
+
--brand: #8b5cf6; /* indigo-500 */
|
| 24 |
+
--brand-glow: rgba(139, 92, 246, 0.35);
|
| 25 |
+
}
|
| 26 |
+
.brand-emerald {
|
| 27 |
+
--brand: #10b981; /* emerald-500 */
|
| 28 |
+
--brand-glow: rgba(16, 185, 129, 0.35);
|
| 29 |
+
}
|
| 30 |
+
.brand-sunset {
|
| 31 |
+
--brand: #f97316; /* orange-500 */
|
| 32 |
+
--brand-glow: rgba(249, 115, 22, 0.35);
|
| 33 |
+
}
|