tharshitha05 commited on
Commit
317eec4
·
verified ·
1 Parent(s): 455f38d

Upload 2 files

Browse files
Files changed (2) hide show
  1. Landing.jsx +553 -0
  2. 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
+ }