@@ -9,6 +9,8 @@ import Link from 'next/link'
9
9
import { motion } from 'framer-motion'
10
10
import RandomPortrait from '@/components/RandomPortrait'
11
11
import RenderNumYearsExperience from '@/components/NumYearsExperience'
12
+ import { RealTestimonials } from '@/components/RealTestimonials'
13
+ import { Footer } from '@/components/Footer'
12
14
13
15
// Company logos
14
16
import logoWorkOS from '@/images/logos/workos.svg'
@@ -22,6 +24,12 @@ export default function ProductsPageClient({ products }: { products: ProductCont
22
24
// No filters needed, directly use all products
23
25
const canvasRef = useRef < HTMLCanvasElement > ( null )
24
26
27
+ const lowestPriced = products . reduce ( ( prev , curr ) =>
28
+ curr . pricing . price < prev . pricing . price ? curr : prev ,
29
+ products [ 0 ]
30
+ )
31
+ const lowestPriceSlug = lowestPriced . slug . split ( '/' ) . pop ( )
32
+
25
33
// Terminal-style hacker animation effect with value prop
26
34
useEffect ( ( ) => {
27
35
if ( ! canvasRef . current ) return
@@ -318,17 +326,27 @@ export default function ProductsPageClient({ products }: { products: ProductCont
318
326
< div className = "relative" >
319
327
{ /* Hero section with terminal animation */ }
320
328
< div className = "mb-4 relative" >
321
- < h1 className = "text-4xl font-bold tracking-tight text-zinc-800 dark:text-zinc-100 sm:text-5xl mb-4 max-w-3xl mx-auto text-center" >
329
+ < h1 className = "text-4xl font-bold tracking-tight text-zinc-800 dark:text-zinc-100 sm:text-5xl mb-2 max-w-3xl mx-auto text-center" >
322
330
Supercharge your career
323
331
</ h1 >
324
-
325
- < div className = "h-[240px] relative bg-transparent" >
326
- < canvas
327
- ref = { canvasRef }
332
+ < p className = "text-lg text-zinc-600 dark:text-zinc-400 text-center max-w-xl mx-auto" >
333
+ Master developer tools with expert guides and tutorials
334
+ </ p >
335
+ < div className = "h-[240px] relative bg-transparent mt-4" >
336
+ < canvas
337
+ ref = { canvasRef }
328
338
className = "absolute inset-0 bg-transparent"
329
- aria-hidden = "true"
339
+ aria-hidden = "true"
330
340
/>
331
341
</ div >
342
+ < div className = "mt-4 flex justify-center" >
343
+ < Link
344
+ href = "/tutorials"
345
+ className = "rounded-md bg-emerald-600 px-5 py-3 text-white font-medium hover:bg-emerald-700"
346
+ >
347
+ Explore Tutorials
348
+ </ Link >
349
+ </ div >
332
350
</ div >
333
351
334
352
{ /* Category Filter completely removed */ }
@@ -346,12 +364,17 @@ export default function ProductsPageClient({ products }: { products: ProductCont
346
364
initial = "hidden"
347
365
animate = "visible"
348
366
variants = { productVariants }
349
- className = "group flex flex-col overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700 transition-all hover:border-zinc-400 dark:hover:border-zinc-500 hover:shadow-lg"
367
+ className = "group flex flex-col overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-900 transition-all hover:border-zinc-400 dark:hover:border-zinc-500 hover:shadow-lg"
350
368
>
351
369
{ /* Product Image */ }
352
370
< div className = "relative h-64 w-full overflow-hidden bg-zinc-100 dark:bg-zinc-800" >
371
+ { product . pricing . price === lowestPriced . pricing . price && (
372
+ < span className = "absolute top-2 left-2 z-10 rounded-md bg-emerald-600 px-2 py-1 text-xs font-semibold text-white" >
373
+ Most Popular
374
+ </ span >
375
+ ) }
353
376
{ product . heroImage ? (
354
- < Image
377
+ < Image
355
378
src = { product . heroImage }
356
379
alt = { product . title }
357
380
fill
@@ -396,6 +419,7 @@ export default function ProductsPageClient({ products }: { products: ProductCont
396
419
< div className = "mt-6 flex items-center justify-between" >
397
420
< div className = "text-lg font-bold text-zinc-900 dark:text-zinc-50" >
398
421
{ product . pricing . currency } { product . pricing . price }
422
+ < span className = "ml-1 text-sm font-normal text-zinc-500 dark:text-zinc-400" > – One-time payment, lifetime access</ span >
399
423
</ div >
400
424
401
425
< button
@@ -416,6 +440,15 @@ export default function ProductsPageClient({ products }: { products: ProductCont
416
440
</ div >
417
441
418
442
{ /* No "products not found" message needed */ }
443
+
444
+ < div className = "mt-20" >
445
+ < RealTestimonials count = { 3 } />
446
+ </ div >
447
+
448
+ < div className = "mt-12 rounded-lg bg-emerald-50 dark:bg-emerald-900/30 p-6 max-w-3xl mx-auto text-center" >
449
+ < p className = "text-lg font-semibold text-emerald-800 dark:text-emerald-200" > 30-Day Risk-Free Trial</ p >
450
+ < p className = "mt-2 text-sm text-emerald-700 dark:text-emerald-300" > If you're not satisfied, get a full refund within 30 days.</ p >
451
+ </ div >
419
452
420
453
{ /* Author Section */ }
421
454
< section
@@ -437,6 +470,7 @@ export default function ProductsPageClient({ products }: { products: ProductCont
437
470
</ h2 >
438
471
< div className = "mt-6 space-y-6 text-base text-slate-700 dark:text-slate-300" >
439
472
< p > I'm a software engineer with over { RenderNumYearsExperience ( ) } years of experience building production systems. I create high-quality resources that help developers learn practical skills without the fluff.</ p >
473
+ < p className = "font-medium text-zinc-700 dark:text-zinc-300" > 50K+ developers taught through my guides and workshops.</ p >
440
474
< div className = "mt-8 flex flex-col space-y-5" >
441
475
{ [
442
476
{
@@ -522,6 +556,13 @@ export default function ProductsPageClient({ products }: { products: ProductCont
522
556
</ div >
523
557
</ section >
524
558
</ div >
559
+ < Footer />
560
+ < Link
561
+ href = { `/products/${ lowestPriceSlug } ` }
562
+ className = "md:hidden fixed bottom-4 right-4 z-50 rounded-full bg-emerald-600 px-5 py-3 text-sm font-medium text-white shadow-lg"
563
+ >
564
+ Buy Now
565
+ </ Link >
525
566
</ Container >
526
567
)
527
568
}
0 commit comments