1+ "use client" ;
2+
13import { ChevronRight , Check , Terminal , Shield , Workflow } from 'lucide-react' ;
24import Link from 'next/link' ;
35import { Button } from '@/components/ui/button' ;
6+ import { motion } from 'framer-motion' ;
47
58const getModuleDetails = ( slug : string ) => ( {
69 name : `Wareflow ${ slug . charAt ( 0 ) . toUpperCase ( ) + slug . slice ( 1 ) } ` ,
@@ -25,7 +28,12 @@ export default async function ProjectLandingPage({ params }: { params: Promise<{
2528
2629 { /* Module Hero */ }
2730 < div className = "p-8 md:p-16 border-b border-border flex flex-col md:flex-row gap-12 items-start justify-between bg-gradient-to-b from-secondary/10 to-transparent" >
28- < div className = "max-w-2xl" >
31+ < motion . div
32+ className = "max-w-2xl"
33+ initial = { { opacity : 0 , y : 20 } }
34+ animate = { { opacity : 1 , y : 0 } }
35+ transition = { { duration : 0.6 , ease : [ 0.16 , 1 , 0.3 , 1 ] } }
36+ >
2937 < h1 className = "text-4xl md:text-6xl font-bold tracking-tighter mb-6" > { module . name } </ h1 >
3038 < p className = "text-xl md:text-2xl text-foreground font-medium mb-4" > { module . tagline } </ p >
3139 < p className = "text-base text-muted-foreground mb-10 leading-relaxed" >
@@ -35,73 +43,90 @@ export default async function ProjectLandingPage({ params }: { params: Promise<{
3543 < Button size = "lg" className = "rounded-none px-8" > Add to your Hub</ Button >
3644 < Button size = "lg" variant = "outline" className = "rounded-none border-border bg-background" > View Documentation</ Button >
3745 </ div >
38- </ div >
46+ </ motion . div >
3947
40- { /* Terminal Teaser */ }
41- < div className = "w-full md:w-80 border border-border bg-black p-4 text-sm font-mono text-muted-foreground" >
48+ { /* Animated Terminal */ }
49+ < motion . div
50+ className = "w-full md:w-80 border border-border bg-black p-4 text-sm font-mono text-muted-foreground"
51+ initial = { { opacity : 0 , scale : 0.95 } }
52+ animate = { { opacity : 1 , scale : 1 } }
53+ transition = { { delay : 0.2 , duration : 0.5 } }
54+ >
4255 < div className = "flex space-x-2 mb-4 border-b border-border pb-4" >
4356 < div className = "w-2 h-2 bg-border" > </ div >
4457 < div className = "w-2 h-2 bg-border" > </ div >
4558 </ div >
46- < p className = "text-emerald-500 mb-2" > $ wareflow init { slug } </ p >
47- < p > ▸ Fetching dependencies...</ p >
48- < p > ▸ Configuring database schema...</ p >
49- < p className = "text-foreground mt-2" > ✓ Module { slug } activated.</ p >
50- </ div >
59+
60+ < div className = "space-y-1" >
61+ < motion . p initial = { { opacity : 0 } } animate = { { opacity : 1 } } transition = { { delay : 0.5 } } className = "text-emerald-500" >
62+ $ wareflow init { slug }
63+ </ motion . p >
64+ < motion . p initial = { { opacity : 0 } } animate = { { opacity : 1 } } transition = { { delay : 1.2 } } >
65+ ▸ Fetching dependencies...
66+ </ motion . p >
67+ < motion . p initial = { { opacity : 0 } } animate = { { opacity : 1 } } transition = { { delay : 1.8 } } >
68+ ▸ Configuring database schema...
69+ </ motion . p >
70+ < motion . p initial = { { opacity : 0 } } animate = { { opacity : 1 } } transition = { { delay : 2.5 } } className = "text-foreground mt-2" >
71+ ✓ Module { slug } activated.
72+ </ motion . p >
73+ </ div >
74+ </ motion . div >
5175 </ div >
5276
53- { /* Key Features (Glued together) */ }
54- < div className = "grid grid-cols-1 md:grid-cols-2 divide-y md:divide-y-0 md:divide-x divide-border border-b border-border" >
55- < div className = "p-10 md:p-16" >
77+ { /* Key Features */ }
78+ < motion . div
79+ className = "grid grid-cols-1 md:grid-cols-2 divide-y md:divide-y-0 md:divide-x divide-border border-b border-border"
80+ initial = "hidden"
81+ whileInView = "show"
82+ viewport = { { once : true , margin : "-100px" } }
83+ variants = { {
84+ hidden : { opacity : 0 } ,
85+ show : { opacity : 1 , transition : { staggerChildren : 0.2 } }
86+ } }
87+ >
88+ < motion . div variants = { { hidden : { opacity : 0 , y : 20 } , show : { opacity : 1 , y : 0 , transition : { duration : 0.5 } } } } className = "p-10 md:p-16" >
5689 < h3 className = "text-2xl font-semibold mb-8" > Why choose this module?</ h3 >
5790 < ul className = "space-y-6" >
5891 { [
59- ' Sub-second search indexing across all facilities' ,
60- ' Native barcode generation and scanner support' ,
61- ' Automated low-stock alerts and PO generation' ,
62- ' Full audit logs for compliance (SOC2)'
92+ " Sub-second search indexing across all facilities" ,
93+ " Native barcode generation and scanner support" ,
94+ " Automated low-stock alerts and PO generation" ,
95+ " Full audit logs for compliance (SOC2)"
6396 ] . map ( ( benefit , i ) => (
6497 < li key = { i } className = "flex items-start" >
6598 < Check className = "w-5 h-5 mr-3 text-primary shrink-0 mt-0.5" />
6699 < span className = "text-muted-foreground leading-snug" > { benefit } </ span >
67100 </ li >
68101 ) ) }
69102 </ ul >
70- </ div >
103+ </ motion . div >
71104
72105 { /* Technical Specs */ }
73- < div className = "p-10 md:p-16 bg-secondary/5" >
106+ < motion . div variants = { { hidden : { opacity : 0 , y : 20 } , show : { opacity : 1 , y : 0 , transition : { duration : 0.5 } } } } className = "p-10 md:p-16 bg-secondary/5" >
74107 < h3 className = "text-2xl font-semibold mb-8" > Technical Foundation</ h3 >
75108 < div className = "space-y-8" >
76- < div className = "flex gap-4" >
77- < Terminal className = "w-6 h-6 text-muted-foreground shrink-0" />
78- < div >
79- < h4 className = "font-medium text-foreground mb-1" > API-First Architecture</ h4 >
80- < p className = "text-sm text-muted-foreground" > Every action in the UI is available via REST & GraphQL APIs . Integrate with your legacy systems seamlessly . </ p >
81- </ div >
82- </ div >
83- < div className = "flex gap-4" >
84- < Shield className = "w-6 h-6 text-muted-foreground shrink-0" />
85- < div >
86- < h4 className = "font-medium text-foreground mb-1" > Enterprise Grade Security</ h4 >
87- < p className = "text-sm text-muted-foreground" > Role-based access control (RBAC) down to the specific aisle or warehouse zone.</ p >
88- </ div >
89- </ div >
90- < div className = "flex gap-4" >
91- < Workflow className = "w-6 h-6 text-muted-foreground shrink-0" />
92- < div >
93- < h4 className = "font-medium text-foreground mb-1" > Webhooks & Automations </ h4 >
94- < p className = "text-sm text-muted-foreground" > Trigger external events instantly when stock levels change or shipments arrive.</ p >
109+ { [
110+ { icon : Terminal , title : "API-First Architecture" , desc : "Every action in the UI is available via REST & GraphQL APIs. Integrate seamlessly." } ,
111+ { icon : Shield , title : "Enterprise Grade Security" , desc : "Role-based access control (RBAC) down to the specific aisle or warehouse zone." } ,
112+ { icon : Workflow , title : "Webhooks & Automations" , desc : "Trigger external events instantly when stock levels change or shipments arrive." }
113+ ] . map ( ( spec , i ) => (
114+ < div key = { i } className = "flex gap-4" >
115+ < spec . icon className = "w-6 h-6 text-muted-foreground shrink-0" />
116+ < div >
117+ < h4 className = "font-medium text-foreground mb-1" > { spec . title } </ h4 >
118+ < p className = "text-sm text-muted-foreground" > { spec . desc } </ p >
119+ </ div >
95120 </ div >
96- </ div >
121+ ) ) }
97122 </ div >
98- </ div >
99- </ div >
123+ </ motion . div >
124+ </ motion . div >
100125
101126 { /* Bottom CTA */ }
102127 < div className = "p-16 text-center" >
103128 < h2 className = "text-2xl font-medium mb-6" > Ready to deploy { module . name } ?</ h2 >
104- < Button className = "rounded-none px-8" size = "lg" > Contact Sales</ Button >
129+ < Button className = "rounded-none px-8 hover:scale-105 transition-transform " size = "lg" > Contact Sales</ Button >
105130 </ div >
106131 </ div >
107132 ) ;
0 commit comments