@@ -12,78 +12,33 @@ import {
1212} from 'lucide-react'
1313import { Button } from '@/components/ui/button'
1414import { Brand , APP_NAME } from '@/components/brand'
15+ import { landingSectionsCopy } from '@/lib/copy/landing'
16+
17+ const { features, howItWorks, useCases, cta, footer } = landingSectionsCopy
1518
1619const FEATURES = [
17- {
18- icon : Gauge ,
19- title : 'Per-second unlocking' ,
20- body : 'Funds unlock continuously down to the second. Recipients see their balance grow in real time, no waiting for payout dates.' ,
21- } ,
22- {
23- icon : ShieldCheck ,
24- title : 'Non-custodial' ,
25- body : 'Streams live in a Soroban smart contract. FlowStar never holds your keys or your tokens — you sign every action from your wallet.' ,
26- } ,
27- {
28- icon : Hourglass ,
29- title : 'Cliffs & schedules' ,
30- body : 'Add a cliff before unlocking starts, set start and end times, and let the contract handle the math precisely.' ,
31- } ,
32- {
33- icon : Wallet ,
34- title : 'Withdraw anytime' ,
35- body : 'Recipients withdraw unlocked funds whenever they want. Senders can cancel and reclaim whatever has not unlocked yet.' ,
36- } ,
20+ { icon : Gauge , ...features . items . perSecond } ,
21+ { icon : ShieldCheck , ...features . items . nonCustodial } ,
22+ { icon : Hourglass , ...features . items . cliffs } ,
23+ { icon : Wallet , ...features . items . withdraw } ,
3724]
3825
3926const USE_CASES = [
40- {
41- icon : Briefcase ,
42- title : 'Payroll' ,
43- body : 'Pay contributors a salary that streams every second instead of monthly lump sums.' ,
44- } ,
45- {
46- icon : CalendarClock ,
47- title : 'Token vesting' ,
48- body : 'Vest team and investor allocations on-chain with cliffs and linear schedules.' ,
49- } ,
50- {
51- icon : Gift ,
52- title : 'Grants' ,
53- body : 'Fund builders progressively and keep the ability to stop if milestones slip.' ,
54- } ,
55- {
56- icon : Coins ,
57- title : 'Subscriptions' ,
58- body : 'Bill continuously for services with streams that anyone can verify on-chain.' ,
59- } ,
27+ { icon : Briefcase , ...useCases . items . payroll } ,
28+ { icon : CalendarClock , ...useCases . items . vesting } ,
29+ { icon : Gift , ...useCases . items . grants } ,
30+ { icon : Coins , ...useCases . items . subscriptions } ,
6031]
6132
62- const STEPS = [
63- {
64- step : '01' ,
65- title : 'Connect your wallet' ,
66- body : 'Sign in with Freighter, xBull, LOBSTR, or Albedo. FlowStar reads your address — nothing more.' ,
67- } ,
68- {
69- step : '02' ,
70- title : 'Create a stream' ,
71- body : 'Pick a token, recipient, amount, and schedule. Fund it in a single transaction.' ,
72- } ,
73- {
74- step : '03' ,
75- title : 'Watch it flow' ,
76- body : 'The recipient withdraws unlocked funds anytime. Cancel to reclaim the rest whenever you need.' ,
77- } ,
78- ]
33+ const STEPS = [ howItWorks . steps . connect , howItWorks . steps . create , howItWorks . steps . watch ]
7934
8035export function Features ( ) {
8136 return (
8237 < section id = "features" className = "mx-auto max-w-6xl px-4 py-20 sm:px-6" >
8338 < div className = "max-w-2xl" >
84- < p className = "text-sm font-medium text-primary" > Why FlowStar </ p >
39+ < p className = "text-sm font-medium text-primary" > { features . eyebrow } </ p >
8540 < h2 className = "mt-3 text-balance text-3xl font-semibold tracking-tight sm:text-4xl" >
86- Programmable money that moves continuously
41+ { features . title }
8742 </ h2 >
8843 </ div >
8944 < div className = "mt-12 grid gap-4 sm:grid-cols-2" >
@@ -111,9 +66,9 @@ export function HowItWorks() {
11166 < section id = "how" className = "border-y border-border bg-card/30" >
11267 < div className = "mx-auto max-w-6xl px-4 py-20 sm:px-6" >
11368 < div className = "max-w-2xl" >
114- < p className = "text-sm font-medium text-primary" > How it works </ p >
69+ < p className = "text-sm font-medium text-primary" > { howItWorks . eyebrow } </ p >
11570 < h2 className = "mt-3 text-balance text-3xl font-semibold tracking-tight sm:text-4xl" >
116- Three steps from transfer to stream
71+ { howItWorks . title }
11772 </ h2 >
11873 </ div >
11974 < div className = "mt-12 grid gap-8 md:grid-cols-3" >
@@ -137,9 +92,9 @@ export function UseCases() {
13792 return (
13893 < section id = "use-cases" className = "mx-auto max-w-6xl px-4 py-20 sm:px-6" >
13994 < div className = "max-w-2xl" >
140- < p className = "text-sm font-medium text-primary" > Use cases </ p >
95+ < p className = "text-sm font-medium text-primary" > { useCases . eyebrow } </ p >
14196 < h2 className = "mt-3 text-balance text-3xl font-semibold tracking-tight sm:text-4xl" >
142- One primitive, many payment flows
97+ { useCases . title }
14398 </ h2 >
14499 </ div >
145100 < div className = "mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-4" >
@@ -168,16 +123,15 @@ export function CTA() {
168123 className = "pointer-events-none absolute -bottom-24 left-1/2 size-[420px] -translate-x-1/2 rounded-full bg-primary/10 blur-3xl"
169124 />
170125 < h2 className = "relative text-balance text-3xl font-semibold tracking-tight sm:text-4xl" >
171- Start streaming in minutes
126+ { cta . title }
172127 </ h2 >
173128 < p className = "relative mx-auto mt-4 max-w-md text-pretty text-muted-foreground" >
174- Connect a wallet and create your first stream on Stellar testnet. No setup, no custody, no
175- code.
129+ { cta . description }
176130 </ p >
177131 < div className = "relative mt-8 flex justify-center" >
178132 < Button asChild size = "lg" >
179133 < Link href = "/app/create" >
180- Create a stream
134+ { cta . createStreamButton }
181135 < ArrowRight className = "size-4" />
182136 </ Link >
183137 </ Button >
@@ -192,10 +146,7 @@ export function Footer() {
192146 < footer className = "border-t border-border" >
193147 < div className = "mx-auto flex max-w-6xl flex-col items-center justify-between gap-4 px-4 py-8 sm:flex-row sm:px-6" >
194148 < Brand />
195- < p className = "text-xs text-muted-foreground" >
196- { APP_NAME } streams tokens on Stellar. Demo frontend — connect your Soroban contracts to go
197- live.
198- </ p >
149+ < p className = "text-xs text-muted-foreground" > { footer . tagline ( APP_NAME ) } </ p >
199150 </ div >
200151 </ footer >
201152 )
0 commit comments