33import GuestGuard from "@/components/GuestGuard" ;
44import SystemStatus from "@/components/SystemStatus" ;
55import Link from "next/link" ;
6- import { motion } from "framer-motion" ;
6+ import { motion , Variants } from "framer-motion" ;
77import { useState } from "react" ;
88
99function Section ( {
@@ -20,7 +20,7 @@ function Section({
2020 initial = { { opacity : 0 , y : 20 } }
2121 whileInView = { { opacity : 1 , y : 0 } }
2222 viewport = { { once : true , amount : 0.2 } }
23- transition = { { duration : 0.65 , ease : [ 0.22 , 1 , 0.36 , 1 ] , delay } }
23+ transition = { { duration : 0.65 , ease : "easeOut" , delay } }
2424 className = { className }
2525 >
2626 { children }
@@ -42,7 +42,7 @@ function FadeUp({
4242 initial = { { opacity : 0 , y : 20 } }
4343 whileInView = { { opacity : 1 , y : 0 } }
4444 viewport = { { once : true , amount : 0.2 } }
45- transition = { { duration : 0.6 , ease : [ 0.22 , 1 , 0.36 , 1 ] , delay } }
45+ transition = { { duration : 0.6 , ease : "easeOut" , delay } }
4646 className = { className }
4747 >
4848 { children }
@@ -117,6 +117,25 @@ function IconCheck() {
117117 ) ;
118118}
119119
120+ const containerVariants : Variants = {
121+ hidden : { opacity : 0 } ,
122+ visible : {
123+ opacity : 1 ,
124+ transition : {
125+ staggerChildren : 0.1 ,
126+ delayChildren : 0.1
127+ }
128+ }
129+ } ;
130+
131+ const itemVariants : Variants = {
132+ hidden : { opacity : 0 , y : 30 } ,
133+ visible : {
134+ opacity : 1 ,
135+ y : 0 ,
136+ transition : { duration : 0.8 , ease : [ 0.16 , 1 , 0.3 , 1 ] as any }
137+ }
138+ } ;
120139
121140const FEATURES = [
122141 {
@@ -166,53 +185,68 @@ function HeroSection() {
166185 return (
167186 < Section className = "relative flex flex-col items-center px-6 pb-24 pt-32 text-center lg:pt-48" >
168187 < motion . div
169- initial = { { opacity : 0 , y : 30 } }
170- animate = { { opacity : 1 , y : 0 } }
171- transition = { { duration : 1 , ease : [ 0.16 , 1 , 0.3 , 1 ] } }
188+ variants = { containerVariants }
189+ initial = "hidden"
190+ animate = "visible"
172191 className = "relative z-10 flex flex-col items-center gap-6"
173192 >
174- < span className = "inline-flex items-center gap-2 rounded-full border border-[#E8E8E8] bg-[#F9F9F9] px-5 py-2 font-bold text-[10px] uppercase tracking-[0.2em] text-[#6B6B6B]" >
193+ < motion . span
194+ variants = { itemVariants }
195+ className = "inline-flex items-center gap-2 rounded-full border border-[#E8E8E8] bg-[#F9F9F9] px-5 py-2 font-bold text-[10px] uppercase tracking-[0.2em] text-[#6B6B6B]"
196+ >
175197 < span className = "h-1.5 w-1.5 rounded-full bg-[#0A0A0A]" />
176198 Surgical Precision Payments
177- </ span >
199+ </ motion . span >
178200
179- < h1 className = "max-w-5xl text-7xl font-bold leading-[0.9] tracking-tighter text-[#0A0A0A] sm:text-9xl lg:text-[12rem]" >
201+ < motion . h1
202+ variants = { itemVariants }
203+ className = "max-w-5xl text-7xl font-bold leading-[0.9] tracking-tighter text-[#0A0A0A] sm:text-9xl lg:text-[12rem] font-display uppercase"
204+ >
180205 PLUTO
181- </ h1 >
206+ </ motion . h1 >
182207
183- < h2 className = "max-w-4xl text-4xl font-bold leading-tight tracking-tight text-[#0A0A0A] sm:text-6xl lg:text-7xl" >
208+ < motion . h2
209+ variants = { itemVariants }
210+ className = "max-w-4xl text-4xl font-bold leading-tight tracking-tight text-[#0A0A0A] sm:text-6xl lg:text-7xl font-display uppercase"
211+ >
184212 The Infrastructure for{ " " }
185213 < span className = "text-[#6B6B6B]" >
186214 Modern Commerce
187215 </ span >
188- </ h2 >
216+ </ motion . h2 >
189217
190- < p className = "max-w-xl font-sans text-base font-medium leading-relaxed text-[#6B6B6B] sm:text-lg" >
218+ < motion . p
219+ variants = { itemVariants }
220+ className = "max-w-xl font-sans text-base font-medium leading-relaxed text-[#6B6B6B] sm:text-lg"
221+ >
191222 Build high-performance payment experiences on Stellar.
192223 Unmatched speed. Near-zero fees. Global scale.
193- </ p >
194- </ motion . div >
224+ </ motion . p >
195225
196- < motion . div
197- initial = { { opacity : 0 , y : 16 } }
198- animate = { { opacity : 1 , y : 0 } }
199- transition = { { duration : 0.8 , ease : [ 0.16 , 1 , 0.3 , 1 ] , delay : 0.15 } }
200- className = "relative z-10 mt-12 flex flex-col items-center gap-6 sm:flex-row"
201- >
202- < Link
203- href = "/register"
204- className = "group relative inline-flex items-center gap-2 rounded-lg bg-[#0A0A0A] px-12 py-5 text-sm font-bold uppercase tracking-widest text-white transition-all hover:bg-black active:scale-[0.98]"
226+ < motion . div
227+ variants = { itemVariants }
228+ className = "mt-6 flex flex-col items-center gap-6 sm:flex-row"
205229 >
206- Get Started
207- < IconArrow />
208- </ Link >
230+ < Link
231+ href = "/register"
232+ className = "group relative inline-flex items-center gap-2 rounded-lg bg-[#0A0A0A] px-12 py-5 text-sm font-bold uppercase tracking-widest text-white transition-all hover:bg-black active:scale-[0.98] shadow-2xl shadow-black/10"
233+ >
234+ Get Started
235+ < motion . div
236+ animate = { { x : [ 0 , 4 , 0 ] } }
237+ transition = { { repeat : Infinity , duration : 1.5 , ease : "easeInOut" } }
238+ >
239+ < IconArrow />
240+ </ motion . div >
241+ </ Link >
209242
210- < Link
211- href = "/login"
212- className = "inline-flex items-center gap-2 rounded-lg border border-[#E8E8E8] bg-white px-12 py-5 text-sm font-bold uppercase tracking-widest text-[#0A0A0A] transition-all hover:bg-[#F5F5F5]"
213- >
214- Sign In
215- </ Link >
243+ < Link
244+ href = "/login"
245+ className = "inline-flex items-center gap-2 rounded-lg border border-[#E8E8E8] bg-white px-12 py-5 text-sm font-bold uppercase tracking-widest text-[#0A0A0A] transition-all hover:bg-[#F5F5F5] active:scale-[0.98]"
246+ >
247+ Sign In
248+ </ Link >
249+ </ motion . div >
216250 </ motion . div >
217251
218252 < motion . div
@@ -246,25 +280,34 @@ function FeaturesSection() {
246280 </ h2 >
247281 </ Section >
248282
249- < div className = "grid gap-6 sm:grid-cols-2 lg:grid-cols-3" >
283+ < motion . div
284+ variants = { containerVariants }
285+ initial = "hidden"
286+ whileInView = "visible"
287+ viewport = { { once : true , amount : 0.1 } }
288+ className = "grid gap-6 sm:grid-cols-2 lg:grid-cols-3"
289+ >
250290 { FEATURES . map ( ( f , i ) => (
251- < FadeUp key = { f . title } delay = { i * 0.1 } >
252- < div className = "group relative flex h-full flex-col gap-8 overflow-hidden rounded-lg border border-[#E8E8E8] bg-white p-10 transition-all duration-500 hover:border-[#0A0A0A]" >
253- < div className = "flex items-center justify-between" >
254- < div className = "text-[#0A0A0A]" > { f . icon } </ div >
255- < span className = "rounded-full border border-[#E8E8E8] px-4 py-1.5 font-bold text-[10px] uppercase tracking-widest text-[#6B6B6B]" >
256- { f . tag }
257- </ span >
258- </ div >
259-
260- < h3 className = "text-2xl font-bold text-[#0A0A0A]" > { f . title } </ h3 >
261- < p className = "font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]" >
262- { f . description }
263- </ p >
291+ < motion . div
292+ key = { f . title }
293+ variants = { itemVariants }
294+ whileHover = { { y : - 8 , transition : { duration : 0.3 } } }
295+ className = "group relative flex h-full flex-col gap-8 overflow-hidden rounded-[2rem] border border-[#E8E8E8] bg-white p-10 transition-all duration-500 hover:border-[#0A0A0A] hover:shadow-[0_20px_60px_rgba(0,0,0,0.06)]"
296+ >
297+ < div className = "flex items-center justify-between" >
298+ < div className = "text-[#0A0A0A] transition-transform duration-500 group-hover:scale-110" > { f . icon } </ div >
299+ < span className = "rounded-full border border-[#E8E8E8] px-4 py-1.5 font-bold text-[10px] uppercase tracking-widest text-[#6B6B6B]" >
300+ { f . tag }
301+ </ span >
264302 </ div >
265- </ FadeUp >
303+
304+ < h3 className = "text-2xl font-bold text-[#0A0A0A] tracking-tight" > { f . title } </ h3 >
305+ < p className = "font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]" >
306+ { f . description }
307+ </ p >
308+ </ motion . div >
266309 ) ) }
267- </ div >
310+ </ motion . div >
268311 </ div >
269312 ) ;
270313}
@@ -448,21 +491,32 @@ function HowItWorksSection() {
448491 </ h2 >
449492 </ Section >
450493
451- < div className = "grid gap-16 sm:grid-cols-2 lg:grid-cols-4" >
494+ < motion . div
495+ variants = { containerVariants }
496+ initial = "hidden"
497+ whileInView = "visible"
498+ viewport = { { once : true , amount : 0.1 } }
499+ className = "grid gap-16 sm:grid-cols-2 lg:grid-cols-4"
500+ >
452501 { steps . map ( ( step , i ) => (
453- < FadeUp key = { step . title } delay = { i * 0.1 } >
454- < div className = "relative flex flex-col items-center text-center" >
455- < div className = "mb-8 flex h-20 w-20 items-center justify-center rounded-[2.5rem] bg-white border border-[#E8E8E8] shadow-[0_10px_40px_rgb(0,0,0,0.03)] text-2xl font-bold text-[#0A0A0A]" >
456- { i + 1 }
457- </ div >
458- < h3 className = "mb-4 text-xl font-bold text-[#0A0A0A] uppercase tracking-widest" > { step . title } </ h3 >
459- < p className = "font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]" >
460- { step . description }
461- </ p >
462- </ div >
463- </ FadeUp >
502+ < motion . div
503+ key = { step . title }
504+ variants = { itemVariants }
505+ className = "group relative flex flex-col items-center text-center"
506+ >
507+ < motion . div
508+ whileHover = { { scale : 1.05 , rotate : 5 } }
509+ className = "mb-8 flex h-24 w-24 items-center justify-center rounded-[3rem] bg-white border border-[#E8E8E8] shadow-[0_10px_40px_rgb(0,0,0,0.03)] text-2xl font-bold text-[#0A0A0A] transition-all group-hover:border-[#0A0A0A]"
510+ >
511+ < span className = "font-display" > 0{ i + 1 } </ span >
512+ </ motion . div >
513+ < h3 className = "mb-4 text-[10px] font-bold text-[#0A0A0A] uppercase tracking-[0.4em]" > { step . title } </ h3 >
514+ < p className = "font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]" >
515+ { step . description }
516+ </ p >
517+ </ motion . div >
464518 ) ) }
465- </ div >
519+ </ motion . div >
466520 </ div >
467521 ) ;
468522}
0 commit comments