@dailyautomations/ui 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/common/button.js +6 -6
- package/dist/components/common/button.js.map +1 -1
- package/dist/components/dev/theme-tester.d.ts +2 -0
- package/dist/components/dev/theme-tester.d.ts.map +1 -0
- package/dist/components/dev/theme-tester.js +105 -0
- package/dist/components/dev/theme-tester.js.map +1 -0
- package/dist/components/layout/app-shell.d.ts +14 -0
- package/dist/components/layout/app-shell.d.ts.map +1 -0
- package/dist/components/layout/app-shell.js +25 -0
- package/dist/components/layout/app-shell.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +15 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.js +40 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +7 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +15 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +7 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +15 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/confirm-dialog.d.ts +16 -0
- package/dist/components/ui/confirm-dialog.d.ts.map +1 -0
- package/dist/components/ui/confirm-dialog.js +31 -0
- package/dist/components/ui/confirm-dialog.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +25 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +51 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/empty-state.d.ts +14 -0
- package/dist/components/ui/empty-state.d.ts.map +1 -0
- package/dist/components/ui/empty-state.js +20 -0
- package/dist/components/ui/empty-state.js.map +1 -0
- package/dist/components/ui/filter-bar.d.ts +29 -0
- package/dist/components/ui/filter-bar.d.ts.map +1 -0
- package/dist/components/ui/filter-bar.js +19 -0
- package/dist/components/ui/filter-bar.js.map +1 -0
- package/dist/components/ui/loading-spinner.d.ts +19 -0
- package/dist/components/ui/loading-spinner.d.ts.map +1 -0
- package/dist/components/ui/loading-spinner.js +28 -0
- package/dist/components/ui/loading-spinner.js.map +1 -0
- package/dist/components/ui/popover.d.ts +8 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +18 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/progress.d.ts +8 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/progress.js +9 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +6 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/radio-group.js +12 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +6 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +14 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/separator.d.ts +7 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +9 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +21 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +50 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/slider.d.ts +7 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/slider.js +9 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/stat-card.d.ts +23 -0
- package/dist/components/ui/stat-card.d.ts.map +1 -0
- package/dist/components/ui/stat-card.js +46 -0
- package/dist/components/ui/stat-card.js.map +1 -0
- package/dist/components/ui/switch.d.ts +7 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +9 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +11 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +28 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +18 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/config/themes.d.ts +18 -0
- package/dist/config/themes.d.ts.map +1 -0
- package/dist/config/themes.js +267 -0
- package/dist/config/themes.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/examples/home-page.tsx +81 -81
- package/examples/main.tsx +24 -9
- package/examples/pages/ComponentsPage.tsx +726 -0
- package/examples/pages/LandingPage.tsx +860 -0
- package/examples/pages/index.ts +2 -0
- package/examples/styles.css +61 -0
- package/package.json +26 -1
|
@@ -0,0 +1,860 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { motion, AnimatePresence } from "framer-motion"
|
|
5
|
+
import {
|
|
6
|
+
Button,
|
|
7
|
+
Card,
|
|
8
|
+
CardContent,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardTitle,
|
|
11
|
+
CardDescription,
|
|
12
|
+
Input,
|
|
13
|
+
Label,
|
|
14
|
+
Badge,
|
|
15
|
+
AnimatedFade,
|
|
16
|
+
AnimatedSlide,
|
|
17
|
+
AnimatedList,
|
|
18
|
+
AnimatedListItem,
|
|
19
|
+
staggerContainer,
|
|
20
|
+
staggerChild,
|
|
21
|
+
cn,
|
|
22
|
+
} from "../../src"
|
|
23
|
+
import {
|
|
24
|
+
CheckCircle2,
|
|
25
|
+
Zap,
|
|
26
|
+
Clock,
|
|
27
|
+
Brain,
|
|
28
|
+
TrendingUp,
|
|
29
|
+
Shield,
|
|
30
|
+
ArrowRight,
|
|
31
|
+
Star,
|
|
32
|
+
Play,
|
|
33
|
+
Check,
|
|
34
|
+
X,
|
|
35
|
+
ChevronRight,
|
|
36
|
+
} from "lucide-react"
|
|
37
|
+
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// TYPES
|
|
40
|
+
// ============================================================================
|
|
41
|
+
|
|
42
|
+
interface Testimonial {
|
|
43
|
+
name: string
|
|
44
|
+
role: string
|
|
45
|
+
company: string
|
|
46
|
+
avatar: string
|
|
47
|
+
quote: string
|
|
48
|
+
result: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface PricingTier {
|
|
52
|
+
name: string
|
|
53
|
+
value: string
|
|
54
|
+
features: string[]
|
|
55
|
+
highlighted?: boolean
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface TransformationStage {
|
|
59
|
+
label: string
|
|
60
|
+
title: string
|
|
61
|
+
description: string
|
|
62
|
+
icon: React.ComponentType<{ className?: string }>
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// DATA
|
|
67
|
+
// ============================================================================
|
|
68
|
+
|
|
69
|
+
const TESTIMONIALS: Testimonial[] = [
|
|
70
|
+
{
|
|
71
|
+
name: "Sarah Chen",
|
|
72
|
+
role: "Head of Operations",
|
|
73
|
+
company: "Fintech Startup",
|
|
74
|
+
avatar: "SC",
|
|
75
|
+
quote:
|
|
76
|
+
"We went from 40 hours of manual data entry to 2 hours of oversight. The ROI was obvious within the first week.",
|
|
77
|
+
result: "95% time reduction",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "Marcus Williams",
|
|
81
|
+
role: "Solo Founder",
|
|
82
|
+
company: "E-commerce Brand",
|
|
83
|
+
avatar: "MW",
|
|
84
|
+
quote:
|
|
85
|
+
"I was drowning in spreadsheets. Now my entire workflow runs while I sleep. Best investment I've made.",
|
|
86
|
+
result: "$12K/mo saved",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "Elena Rodriguez",
|
|
90
|
+
role: "Agency Owner",
|
|
91
|
+
company: "Digital Agency",
|
|
92
|
+
avatar: "ER",
|
|
93
|
+
quote:
|
|
94
|
+
"We onboarded 3 new clients without hiring. Daily handles what used to take a full-time coordinator.",
|
|
95
|
+
result: "3x client capacity",
|
|
96
|
+
},
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
const PRICING_TIERS: PricingTier[] = [
|
|
100
|
+
{
|
|
101
|
+
name: "Full Platform Access",
|
|
102
|
+
value: "$2,997",
|
|
103
|
+
features: [
|
|
104
|
+
"All automation templates",
|
|
105
|
+
"Unlimited workflows",
|
|
106
|
+
"Priority support",
|
|
107
|
+
"Custom integrations",
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "Implementation Support",
|
|
112
|
+
value: "$1,500",
|
|
113
|
+
features: [
|
|
114
|
+
"2-hour strategy call",
|
|
115
|
+
"Workflow audit",
|
|
116
|
+
"Custom setup assistance",
|
|
117
|
+
"30-day follow-up",
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "Training Library",
|
|
122
|
+
value: "$997",
|
|
123
|
+
features: [
|
|
124
|
+
"50+ video tutorials",
|
|
125
|
+
"Step-by-step guides",
|
|
126
|
+
"Template library",
|
|
127
|
+
"Community access",
|
|
128
|
+
],
|
|
129
|
+
highlighted: true,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: "Bonus Resources",
|
|
133
|
+
value: "$497",
|
|
134
|
+
features: [
|
|
135
|
+
"Automation playbook",
|
|
136
|
+
"Integration templates",
|
|
137
|
+
"ROI calculator",
|
|
138
|
+
"Quick-start checklist",
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
const TRANSFORMATION_STAGES: TransformationStage[] = [
|
|
144
|
+
{
|
|
145
|
+
label: "Week 1",
|
|
146
|
+
title: "Quick Win",
|
|
147
|
+
description: "Automate your first workflow and reclaim 5+ hours instantly.",
|
|
148
|
+
icon: Zap,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
label: "Month 1",
|
|
152
|
+
title: "Compound Effect",
|
|
153
|
+
description: "Connected automations multiply your output without extra effort.",
|
|
154
|
+
icon: TrendingUp,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
label: "Month 3",
|
|
158
|
+
title: "Competitive Edge",
|
|
159
|
+
description: "Operate at a level your competitors can't match manually.",
|
|
160
|
+
icon: Shield,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
label: "Year 1",
|
|
164
|
+
title: "10x Transformation",
|
|
165
|
+
description: "Scale operations that would've required a full team.",
|
|
166
|
+
icon: Brain,
|
|
167
|
+
},
|
|
168
|
+
]
|
|
169
|
+
|
|
170
|
+
const PROBLEMS = [
|
|
171
|
+
{
|
|
172
|
+
title: "Drowning in repetitive tasks",
|
|
173
|
+
agitation:
|
|
174
|
+
"Every week, you lose 15+ hours to copy-paste, manual updates, and busy work. That's 780 hours a year—20 full work weeks—spent on tasks a machine could handle.",
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
title: "Information scattered everywhere",
|
|
178
|
+
agitation:
|
|
179
|
+
"Customer data in one tool, notes in another, tasks in a third. You're the human glue holding it together. One missed sync and deals fall through the cracks.",
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
title: "Scaling means hiring",
|
|
183
|
+
agitation:
|
|
184
|
+
"Growth sounds exciting until you realize it means more people, more overhead, more management. The business that was supposed to give you freedom now owns your calendar.",
|
|
185
|
+
},
|
|
186
|
+
]
|
|
187
|
+
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// SECTION COMPONENTS
|
|
190
|
+
// ============================================================================
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* HERO SECTION
|
|
194
|
+
* Job: Get email or get scroll
|
|
195
|
+
* Structure: Eyebrow → Headline → Subheadline → CTA → Trust Signals
|
|
196
|
+
*/
|
|
197
|
+
function HeroSection({
|
|
198
|
+
onSubmit,
|
|
199
|
+
email,
|
|
200
|
+
setEmail,
|
|
201
|
+
}: {
|
|
202
|
+
onSubmit: (e: React.FormEvent) => void
|
|
203
|
+
email: string
|
|
204
|
+
setEmail: (v: string) => void
|
|
205
|
+
}) {
|
|
206
|
+
return (
|
|
207
|
+
<section className="relative min-h-[90vh] flex items-center justify-center px-4 py-20 overflow-hidden">
|
|
208
|
+
{/* Background gradient */}
|
|
209
|
+
<div className="absolute inset-0 bg-gradient-to-b from-primary/5 via-background to-background" />
|
|
210
|
+
|
|
211
|
+
{/* Subtle grid pattern */}
|
|
212
|
+
<div
|
|
213
|
+
className="absolute inset-0 opacity-[0.02]"
|
|
214
|
+
style={{
|
|
215
|
+
backgroundImage: `linear-gradient(rgb(var(--primary)) 1px, transparent 1px),
|
|
216
|
+
linear-gradient(90deg, rgb(var(--primary)) 1px, transparent 1px)`,
|
|
217
|
+
backgroundSize: '64px 64px',
|
|
218
|
+
}}
|
|
219
|
+
/>
|
|
220
|
+
|
|
221
|
+
<div className="relative z-10 max-w-4xl mx-auto text-center">
|
|
222
|
+
<AnimatedFade>
|
|
223
|
+
{/* Eyebrow */}
|
|
224
|
+
<Badge variant="outline" className="mb-6 text-sm font-medium">
|
|
225
|
+
<Zap className="w-3 h-3 mr-1.5 text-accent" />
|
|
226
|
+
For operators who refuse to stay stuck
|
|
227
|
+
</Badge>
|
|
228
|
+
|
|
229
|
+
{/* Headline */}
|
|
230
|
+
<h1 className="text-4xl md:text-5xl lg:text-6xl font-extrabold tracking-tight text-text-primary mb-6 leading-[1.1]">
|
|
231
|
+
Stop working <span className="text-primary">in</span> your business.
|
|
232
|
+
<br />
|
|
233
|
+
Start working <span className="text-accent">on</span> it.
|
|
234
|
+
</h1>
|
|
235
|
+
|
|
236
|
+
{/* Subheadline */}
|
|
237
|
+
<p className="text-lg md:text-xl text-text-secondary max-w-2xl mx-auto mb-10 leading-relaxed">
|
|
238
|
+
Daily automates the knowledge work that's eating your calendar—so you can focus on decisions that actually move the needle.
|
|
239
|
+
</p>
|
|
240
|
+
</AnimatedFade>
|
|
241
|
+
|
|
242
|
+
{/* CTA */}
|
|
243
|
+
<AnimatedSlide direction="up" delay={0.2}>
|
|
244
|
+
<form onSubmit={onSubmit} className="flex flex-col sm:flex-row gap-3 max-w-md mx-auto mb-8">
|
|
245
|
+
<Input
|
|
246
|
+
type="email"
|
|
247
|
+
placeholder="Enter your email"
|
|
248
|
+
value={email}
|
|
249
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
250
|
+
className="flex-1 h-12 text-base"
|
|
251
|
+
required
|
|
252
|
+
/>
|
|
253
|
+
<Button type="submit" size="lg" className="h-12 px-8 text-base font-semibold">
|
|
254
|
+
Get Started Free
|
|
255
|
+
<ArrowRight className="w-4 h-4 ml-2" />
|
|
256
|
+
</Button>
|
|
257
|
+
</form>
|
|
258
|
+
</AnimatedSlide>
|
|
259
|
+
|
|
260
|
+
{/* Trust Signals */}
|
|
261
|
+
<AnimatedFade delay={0.4}>
|
|
262
|
+
<div className="flex flex-wrap items-center justify-center gap-6 text-sm text-text-secondary">
|
|
263
|
+
<span className="flex items-center gap-1.5">
|
|
264
|
+
<Check className="w-4 h-4 text-success" />
|
|
265
|
+
No credit card required
|
|
266
|
+
</span>
|
|
267
|
+
<span className="flex items-center gap-1.5">
|
|
268
|
+
<Check className="w-4 h-4 text-success" />
|
|
269
|
+
Setup in under 10 minutes
|
|
270
|
+
</span>
|
|
271
|
+
<span className="flex items-center gap-1.5">
|
|
272
|
+
<Check className="w-4 h-4 text-success" />
|
|
273
|
+
Cancel anytime
|
|
274
|
+
</span>
|
|
275
|
+
</div>
|
|
276
|
+
</AnimatedFade>
|
|
277
|
+
</div>
|
|
278
|
+
</section>
|
|
279
|
+
)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* SUCCESS SECTION (Conditional)
|
|
284
|
+
* Job: Kill buyer's remorse
|
|
285
|
+
* Structure: Checkmark → Confirmation → Deliverable list
|
|
286
|
+
*/
|
|
287
|
+
function SuccessSection({ email }: { email: string }) {
|
|
288
|
+
return (
|
|
289
|
+
<section className="py-20 px-4 bg-card/50">
|
|
290
|
+
<div className="max-w-2xl mx-auto text-center">
|
|
291
|
+
<AnimatedFade>
|
|
292
|
+
<div className="w-16 h-16 rounded-full bg-success/10 flex items-center justify-center mx-auto mb-6">
|
|
293
|
+
<CheckCircle2 className="w-8 h-8 text-success" />
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
<h2 className="text-2xl md:text-3xl font-bold text-text-primary mb-4">
|
|
297
|
+
You're in. Check your inbox.
|
|
298
|
+
</h2>
|
|
299
|
+
|
|
300
|
+
<p className="text-text-secondary mb-8">
|
|
301
|
+
We sent a confirmation to <span className="text-primary font-medium">{email}</span>.
|
|
302
|
+
Here's what happens next:
|
|
303
|
+
</p>
|
|
304
|
+
|
|
305
|
+
<Card className="text-left">
|
|
306
|
+
<CardContent className="p-6 space-y-4">
|
|
307
|
+
{[
|
|
308
|
+
"Instant access link (check spam if needed)",
|
|
309
|
+
"5-minute quick start guide",
|
|
310
|
+
"First automation template ready to deploy",
|
|
311
|
+
"Direct line to our support team",
|
|
312
|
+
].map((item, i) => (
|
|
313
|
+
<div key={i} className="flex items-start gap-3">
|
|
314
|
+
<Check className="w-5 h-5 text-success mt-0.5 shrink-0" />
|
|
315
|
+
<span className="text-text-primary">{item}</span>
|
|
316
|
+
</div>
|
|
317
|
+
))}
|
|
318
|
+
</CardContent>
|
|
319
|
+
</Card>
|
|
320
|
+
</AnimatedFade>
|
|
321
|
+
</div>
|
|
322
|
+
</section>
|
|
323
|
+
)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* PROBLEM-AGITATE SECTION
|
|
328
|
+
* Job: Make status quo painful
|
|
329
|
+
* Structure: 3 problems with agitation → Personal transition
|
|
330
|
+
*/
|
|
331
|
+
function ProblemSection() {
|
|
332
|
+
return (
|
|
333
|
+
<section className="py-24 px-4">
|
|
334
|
+
<div className="max-w-4xl mx-auto">
|
|
335
|
+
<AnimatedFade>
|
|
336
|
+
<div className="text-center mb-16">
|
|
337
|
+
<Badge variant="outline" className="mb-4">The Problem</Badge>
|
|
338
|
+
<h2 className="text-3xl md:text-4xl font-bold text-text-primary mb-4">
|
|
339
|
+
You didn't start a business to do busywork.
|
|
340
|
+
</h2>
|
|
341
|
+
<p className="text-text-secondary text-lg max-w-2xl mx-auto">
|
|
342
|
+
But somewhere along the way, operations took over. Sound familiar?
|
|
343
|
+
</p>
|
|
344
|
+
</div>
|
|
345
|
+
</AnimatedFade>
|
|
346
|
+
|
|
347
|
+
<motion.div
|
|
348
|
+
variants={staggerContainer}
|
|
349
|
+
initial="hidden"
|
|
350
|
+
whileInView="visible"
|
|
351
|
+
viewport={{ once: true, margin: "-100px" }}
|
|
352
|
+
className="space-y-8"
|
|
353
|
+
>
|
|
354
|
+
{PROBLEMS.map((problem, i) => (
|
|
355
|
+
<motion.div key={i} variants={staggerChild}>
|
|
356
|
+
<Card className="border-l-4 border-l-destructive/50">
|
|
357
|
+
<CardContent className="p-6">
|
|
358
|
+
<div className="flex items-start gap-4">
|
|
359
|
+
<div className="w-8 h-8 rounded-full bg-destructive/10 flex items-center justify-center shrink-0 mt-1">
|
|
360
|
+
<X className="w-4 h-4 text-destructive" />
|
|
361
|
+
</div>
|
|
362
|
+
<div>
|
|
363
|
+
<h3 className="text-lg font-semibold text-text-primary mb-2">
|
|
364
|
+
{problem.title}
|
|
365
|
+
</h3>
|
|
366
|
+
<p className="text-text-secondary leading-relaxed">
|
|
367
|
+
{problem.agitation}
|
|
368
|
+
</p>
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
</CardContent>
|
|
372
|
+
</Card>
|
|
373
|
+
</motion.div>
|
|
374
|
+
))}
|
|
375
|
+
</motion.div>
|
|
376
|
+
|
|
377
|
+
{/* Personal transition */}
|
|
378
|
+
<AnimatedFade delay={0.4}>
|
|
379
|
+
<div className="mt-16 text-center">
|
|
380
|
+
<p className="text-lg text-text-secondary italic">
|
|
381
|
+
"I built Daily because I lived this. Two years of 60-hour weeks,
|
|
382
|
+
most of it doing things I knew could be automated—if only I had the time
|
|
383
|
+
to set it up."
|
|
384
|
+
</p>
|
|
385
|
+
<p className="mt-4 text-primary font-medium">
|
|
386
|
+
— The founder who finally built the solution
|
|
387
|
+
</p>
|
|
388
|
+
</div>
|
|
389
|
+
</AnimatedFade>
|
|
390
|
+
</div>
|
|
391
|
+
</section>
|
|
392
|
+
)
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* VALUE STACK SECTION
|
|
397
|
+
* Job: Make saying no feel stupid
|
|
398
|
+
* Structure: 4 tiers descending → Total value → Your price
|
|
399
|
+
*/
|
|
400
|
+
function ValueStackSection() {
|
|
401
|
+
const totalValue = PRICING_TIERS.reduce(
|
|
402
|
+
(sum, tier) => sum + parseInt(tier.value.replace(/[$,]/g, "")),
|
|
403
|
+
0
|
|
404
|
+
)
|
|
405
|
+
const yourPrice = 497
|
|
406
|
+
|
|
407
|
+
return (
|
|
408
|
+
<section className="py-24 px-4 bg-card/30">
|
|
409
|
+
<div className="max-w-4xl mx-auto">
|
|
410
|
+
<AnimatedFade>
|
|
411
|
+
<div className="text-center mb-16">
|
|
412
|
+
<Badge variant="outline" className="mb-4">What You Get</Badge>
|
|
413
|
+
<h2 className="text-3xl md:text-4xl font-bold text-text-primary mb-4">
|
|
414
|
+
Everything you need to automate your operations.
|
|
415
|
+
</h2>
|
|
416
|
+
</div>
|
|
417
|
+
</AnimatedFade>
|
|
418
|
+
|
|
419
|
+
<motion.div
|
|
420
|
+
variants={staggerContainer}
|
|
421
|
+
initial="hidden"
|
|
422
|
+
whileInView="visible"
|
|
423
|
+
viewport={{ once: true }}
|
|
424
|
+
className="space-y-4"
|
|
425
|
+
>
|
|
426
|
+
{PRICING_TIERS.map((tier, i) => (
|
|
427
|
+
<motion.div key={i} variants={staggerChild}>
|
|
428
|
+
<Card className={cn(
|
|
429
|
+
"relative overflow-hidden transition-colors",
|
|
430
|
+
tier.highlighted && "border-primary bg-primary/5"
|
|
431
|
+
)}>
|
|
432
|
+
{tier.highlighted && (
|
|
433
|
+
<div className="absolute top-0 right-0 bg-primary text-primary-foreground text-xs font-medium px-3 py-1 rounded-bl">
|
|
434
|
+
Most Popular
|
|
435
|
+
</div>
|
|
436
|
+
)}
|
|
437
|
+
<CardContent className="p-6">
|
|
438
|
+
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
|
|
439
|
+
<div className="flex-1">
|
|
440
|
+
<h3 className="text-lg font-semibold text-text-primary mb-2">
|
|
441
|
+
{tier.name}
|
|
442
|
+
</h3>
|
|
443
|
+
<div className="flex flex-wrap gap-2">
|
|
444
|
+
{tier.features.map((feature, j) => (
|
|
445
|
+
<Badge key={j} variant="secondary" className="font-normal">
|
|
446
|
+
<Check className="w-3 h-3 mr-1" />
|
|
447
|
+
{feature}
|
|
448
|
+
</Badge>
|
|
449
|
+
))}
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
<div className="text-right shrink-0">
|
|
453
|
+
<span className="text-2xl font-bold text-text-primary">
|
|
454
|
+
{tier.value}
|
|
455
|
+
</span>
|
|
456
|
+
<span className="text-text-secondary text-sm ml-1">value</span>
|
|
457
|
+
</div>
|
|
458
|
+
</div>
|
|
459
|
+
</CardContent>
|
|
460
|
+
</Card>
|
|
461
|
+
</motion.div>
|
|
462
|
+
))}
|
|
463
|
+
</motion.div>
|
|
464
|
+
|
|
465
|
+
{/* Total value vs price */}
|
|
466
|
+
<AnimatedFade delay={0.4}>
|
|
467
|
+
<div className="mt-12 p-8 rounded-2xl bg-gradient-to-r from-primary/10 via-accent/10 to-primary/10 border border-primary/20 text-center">
|
|
468
|
+
<div className="flex flex-col md:flex-row items-center justify-center gap-8">
|
|
469
|
+
<div>
|
|
470
|
+
<p className="text-text-secondary text-sm mb-1">Total Value</p>
|
|
471
|
+
<p className="text-3xl font-bold text-text-primary line-through opacity-60">
|
|
472
|
+
${totalValue.toLocaleString()}
|
|
473
|
+
</p>
|
|
474
|
+
</div>
|
|
475
|
+
<div className="text-4xl text-text-secondary">→</div>
|
|
476
|
+
<div>
|
|
477
|
+
<p className="text-text-secondary text-sm mb-1">Your Investment</p>
|
|
478
|
+
<p className="text-4xl md:text-5xl font-extrabold text-accent">
|
|
479
|
+
${yourPrice}
|
|
480
|
+
</p>
|
|
481
|
+
</div>
|
|
482
|
+
</div>
|
|
483
|
+
<p className="mt-6 text-text-secondary">
|
|
484
|
+
That's <span className="text-accent font-semibold">
|
|
485
|
+
{Math.round((1 - yourPrice / totalValue) * 100)}% off
|
|
486
|
+
</span> when you start today.
|
|
487
|
+
</p>
|
|
488
|
+
</div>
|
|
489
|
+
</AnimatedFade>
|
|
490
|
+
</div>
|
|
491
|
+
</section>
|
|
492
|
+
)
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* SOCIAL PROOF SECTION
|
|
497
|
+
* Job: Let others convince them
|
|
498
|
+
* Structure: Header → 3 testimonials with specific results
|
|
499
|
+
*/
|
|
500
|
+
function SocialProofSection() {
|
|
501
|
+
return (
|
|
502
|
+
<section className="py-24 px-4">
|
|
503
|
+
<div className="max-w-5xl mx-auto">
|
|
504
|
+
<AnimatedFade>
|
|
505
|
+
<div className="text-center mb-16">
|
|
506
|
+
<Badge variant="outline" className="mb-4">Results That Speak</Badge>
|
|
507
|
+
<h2 className="text-3xl md:text-4xl font-bold text-text-primary mb-4">
|
|
508
|
+
They were skeptical too. Then they tried it.
|
|
509
|
+
</h2>
|
|
510
|
+
</div>
|
|
511
|
+
</AnimatedFade>
|
|
512
|
+
|
|
513
|
+
<motion.div
|
|
514
|
+
variants={staggerContainer}
|
|
515
|
+
initial="hidden"
|
|
516
|
+
whileInView="visible"
|
|
517
|
+
viewport={{ once: true }}
|
|
518
|
+
className="grid md:grid-cols-3 gap-6"
|
|
519
|
+
>
|
|
520
|
+
{TESTIMONIALS.map((testimonial, i) => (
|
|
521
|
+
<motion.div key={i} variants={staggerChild}>
|
|
522
|
+
<Card className="h-full flex flex-col">
|
|
523
|
+
<CardContent className="p-6 flex-1 flex flex-col">
|
|
524
|
+
{/* Result badge */}
|
|
525
|
+
<Badge className="self-start mb-4 bg-success/10 text-success border-success/20">
|
|
526
|
+
{testimonial.result}
|
|
527
|
+
</Badge>
|
|
528
|
+
|
|
529
|
+
{/* Quote */}
|
|
530
|
+
<blockquote className="text-text-secondary leading-relaxed flex-1 mb-6">
|
|
531
|
+
"{testimonial.quote}"
|
|
532
|
+
</blockquote>
|
|
533
|
+
|
|
534
|
+
{/* Author */}
|
|
535
|
+
<div className="flex items-center gap-3 pt-4 border-t border-border">
|
|
536
|
+
<div className="w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center text-primary font-semibold text-sm">
|
|
537
|
+
{testimonial.avatar}
|
|
538
|
+
</div>
|
|
539
|
+
<div>
|
|
540
|
+
<p className="font-medium text-text-primary text-sm">
|
|
541
|
+
{testimonial.name}
|
|
542
|
+
</p>
|
|
543
|
+
<p className="text-text-secondary text-xs">
|
|
544
|
+
{testimonial.role}, {testimonial.company}
|
|
545
|
+
</p>
|
|
546
|
+
</div>
|
|
547
|
+
</div>
|
|
548
|
+
</CardContent>
|
|
549
|
+
</Card>
|
|
550
|
+
</motion.div>
|
|
551
|
+
))}
|
|
552
|
+
</motion.div>
|
|
553
|
+
|
|
554
|
+
{/* Additional trust */}
|
|
555
|
+
<AnimatedFade delay={0.4}>
|
|
556
|
+
<div className="mt-12 flex flex-wrap items-center justify-center gap-8 text-text-secondary text-sm">
|
|
557
|
+
<div className="flex items-center gap-2">
|
|
558
|
+
<div className="flex -space-x-2">
|
|
559
|
+
{[...Array(5)].map((_, i) => (
|
|
560
|
+
<Star key={i} className="w-4 h-4 fill-accent text-accent" />
|
|
561
|
+
))}
|
|
562
|
+
</div>
|
|
563
|
+
<span>4.9/5 from 200+ users</span>
|
|
564
|
+
</div>
|
|
565
|
+
<span className="hidden sm:inline">•</span>
|
|
566
|
+
<span>500+ workflows automated</span>
|
|
567
|
+
<span className="hidden sm:inline">•</span>
|
|
568
|
+
<span>10,000+ hours saved monthly</span>
|
|
569
|
+
</div>
|
|
570
|
+
</AnimatedFade>
|
|
571
|
+
</div>
|
|
572
|
+
</section>
|
|
573
|
+
)
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* TRANSFORMATION SECTION
|
|
578
|
+
* Job: Make outcome tangible
|
|
579
|
+
* Structure: 4 stages: Quick win → Compound → Advantage → 10x
|
|
580
|
+
*/
|
|
581
|
+
function TransformationSection() {
|
|
582
|
+
return (
|
|
583
|
+
<section className="py-24 px-4 bg-card/30">
|
|
584
|
+
<div className="max-w-4xl mx-auto">
|
|
585
|
+
<AnimatedFade>
|
|
586
|
+
<div className="text-center mb-16">
|
|
587
|
+
<Badge variant="outline" className="mb-4">Your Transformation</Badge>
|
|
588
|
+
<h2 className="text-3xl md:text-4xl font-bold text-text-primary mb-4">
|
|
589
|
+
From overwhelmed operator to scalable business.
|
|
590
|
+
</h2>
|
|
591
|
+
<p className="text-text-secondary text-lg max-w-2xl mx-auto">
|
|
592
|
+
Here's the realistic path—no hype, just what actually happens.
|
|
593
|
+
</p>
|
|
594
|
+
</div>
|
|
595
|
+
</AnimatedFade>
|
|
596
|
+
|
|
597
|
+
<motion.div
|
|
598
|
+
variants={staggerContainer}
|
|
599
|
+
initial="hidden"
|
|
600
|
+
whileInView="visible"
|
|
601
|
+
viewport={{ once: true }}
|
|
602
|
+
className="relative"
|
|
603
|
+
>
|
|
604
|
+
{/* Timeline line - left on mobile, center on desktop */}
|
|
605
|
+
<div className="absolute left-6 md:left-1/2 top-0 bottom-0 w-px bg-border md:-translate-x-px" />
|
|
606
|
+
|
|
607
|
+
{TRANSFORMATION_STAGES.map((stage, i) => {
|
|
608
|
+
const Icon = stage.icon
|
|
609
|
+
const isEven = i % 2 === 0
|
|
610
|
+
|
|
611
|
+
return (
|
|
612
|
+
<motion.div
|
|
613
|
+
key={i}
|
|
614
|
+
variants={staggerChild}
|
|
615
|
+
className="relative pb-12 last:pb-0"
|
|
616
|
+
>
|
|
617
|
+
{/* Mobile layout - always left-aligned */}
|
|
618
|
+
<div className="flex items-start gap-6 md:hidden">
|
|
619
|
+
<div className="relative z-10 w-12 h-12 rounded-full bg-primary flex items-center justify-center shrink-0">
|
|
620
|
+
<Icon className="w-5 h-5 text-primary-foreground" />
|
|
621
|
+
</div>
|
|
622
|
+
<Card className="flex-1">
|
|
623
|
+
<CardContent className="p-6">
|
|
624
|
+
<Badge variant="secondary" className="mb-2">{stage.label}</Badge>
|
|
625
|
+
<h3 className="text-lg font-semibold text-text-primary mb-2">
|
|
626
|
+
{stage.title}
|
|
627
|
+
</h3>
|
|
628
|
+
<p className="text-text-secondary text-sm">
|
|
629
|
+
{stage.description}
|
|
630
|
+
</p>
|
|
631
|
+
</CardContent>
|
|
632
|
+
</Card>
|
|
633
|
+
</div>
|
|
634
|
+
|
|
635
|
+
{/* Desktop layout - alternating sides */}
|
|
636
|
+
<div className="hidden md:grid md:grid-cols-[1fr_auto_1fr] md:gap-8 md:items-start">
|
|
637
|
+
{/* Left column */}
|
|
638
|
+
<div className={cn("flex", isEven ? "justify-end" : "justify-end")}>
|
|
639
|
+
{isEven && (
|
|
640
|
+
<Card className="max-w-sm text-right">
|
|
641
|
+
<CardContent className="p-6">
|
|
642
|
+
<Badge variant="secondary" className="mb-2">{stage.label}</Badge>
|
|
643
|
+
<h3 className="text-lg font-semibold text-text-primary mb-2">
|
|
644
|
+
{stage.title}
|
|
645
|
+
</h3>
|
|
646
|
+
<p className="text-text-secondary text-sm">
|
|
647
|
+
{stage.description}
|
|
648
|
+
</p>
|
|
649
|
+
</CardContent>
|
|
650
|
+
</Card>
|
|
651
|
+
)}
|
|
652
|
+
</div>
|
|
653
|
+
|
|
654
|
+
{/* Center icon */}
|
|
655
|
+
<div className="relative z-10 w-12 h-12 rounded-full bg-primary flex items-center justify-center">
|
|
656
|
+
<Icon className="w-5 h-5 text-primary-foreground" />
|
|
657
|
+
</div>
|
|
658
|
+
|
|
659
|
+
{/* Right column */}
|
|
660
|
+
<div className="flex justify-start">
|
|
661
|
+
{!isEven && (
|
|
662
|
+
<Card className="max-w-sm">
|
|
663
|
+
<CardContent className="p-6">
|
|
664
|
+
<Badge variant="secondary" className="mb-2">{stage.label}</Badge>
|
|
665
|
+
<h3 className="text-lg font-semibold text-text-primary mb-2">
|
|
666
|
+
{stage.title}
|
|
667
|
+
</h3>
|
|
668
|
+
<p className="text-text-secondary text-sm">
|
|
669
|
+
{stage.description}
|
|
670
|
+
</p>
|
|
671
|
+
</CardContent>
|
|
672
|
+
</Card>
|
|
673
|
+
)}
|
|
674
|
+
</div>
|
|
675
|
+
</div>
|
|
676
|
+
</motion.div>
|
|
677
|
+
)
|
|
678
|
+
})}
|
|
679
|
+
</motion.div>
|
|
680
|
+
</div>
|
|
681
|
+
</section>
|
|
682
|
+
)
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* SECONDARY CTA SECTION
|
|
687
|
+
* Job: Catch the scrollers
|
|
688
|
+
* Structure: Avatar → Question headline → "Yes" button
|
|
689
|
+
*/
|
|
690
|
+
function SecondaryCTASection({
|
|
691
|
+
onCTAClick,
|
|
692
|
+
}: {
|
|
693
|
+
onCTAClick: () => void
|
|
694
|
+
}) {
|
|
695
|
+
return (
|
|
696
|
+
<section className="py-24 px-4">
|
|
697
|
+
<div className="max-w-3xl mx-auto">
|
|
698
|
+
<AnimatedFade>
|
|
699
|
+
<Card className="overflow-hidden">
|
|
700
|
+
<CardContent className="p-0">
|
|
701
|
+
<div className="grid md:grid-cols-[1fr,2fr]">
|
|
702
|
+
{/* Avatar / Image side */}
|
|
703
|
+
<div className="bg-gradient-to-br from-primary to-accent p-8 flex items-center justify-center">
|
|
704
|
+
<div className="w-32 h-32 rounded-full bg-white/10 backdrop-blur flex items-center justify-center">
|
|
705
|
+
<Brain className="w-16 h-16 text-white" />
|
|
706
|
+
</div>
|
|
707
|
+
</div>
|
|
708
|
+
|
|
709
|
+
{/* Content side */}
|
|
710
|
+
<div className="p-8 md:p-12 flex flex-col justify-center">
|
|
711
|
+
<h2 className="text-2xl md:text-3xl font-bold text-text-primary mb-4">
|
|
712
|
+
Ready to get your time back?
|
|
713
|
+
</h2>
|
|
714
|
+
<p className="text-text-secondary mb-8">
|
|
715
|
+
Join 500+ operators who stopped drowning in busywork and started
|
|
716
|
+
scaling. Your first automation takes 10 minutes.
|
|
717
|
+
</p>
|
|
718
|
+
<Button
|
|
719
|
+
onClick={onCTAClick}
|
|
720
|
+
size="lg"
|
|
721
|
+
className="w-full sm:w-auto text-base font-semibold"
|
|
722
|
+
>
|
|
723
|
+
Yes, I'm Ready
|
|
724
|
+
<ChevronRight className="w-4 h-4 ml-2" />
|
|
725
|
+
</Button>
|
|
726
|
+
</div>
|
|
727
|
+
</div>
|
|
728
|
+
</CardContent>
|
|
729
|
+
</Card>
|
|
730
|
+
</AnimatedFade>
|
|
731
|
+
</div>
|
|
732
|
+
</section>
|
|
733
|
+
)
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* FOOTER SECTION
|
|
738
|
+
* Job: Professional legitimacy
|
|
739
|
+
* Structure: Logo → Nav → Legal → Social
|
|
740
|
+
*/
|
|
741
|
+
function FooterSection() {
|
|
742
|
+
return (
|
|
743
|
+
<footer className="py-12 px-4 border-t border-border bg-card/50">
|
|
744
|
+
<div className="max-w-5xl mx-auto">
|
|
745
|
+
<div className="grid gap-8 md:grid-cols-4">
|
|
746
|
+
{/* Logo & tagline */}
|
|
747
|
+
<div className="md:col-span-2">
|
|
748
|
+
<div className="flex items-center gap-2 mb-4">
|
|
749
|
+
<div className="w-8 h-8 rounded-lg bg-primary flex items-center justify-center">
|
|
750
|
+
<Zap className="w-4 h-4 text-primary-foreground" />
|
|
751
|
+
</div>
|
|
752
|
+
<span className="text-xl font-bold text-text-primary">Daily</span>
|
|
753
|
+
</div>
|
|
754
|
+
<p className="text-text-secondary text-sm max-w-xs">
|
|
755
|
+
Automation infrastructure for operators who want to scale without
|
|
756
|
+
hiring an army.
|
|
757
|
+
</p>
|
|
758
|
+
</div>
|
|
759
|
+
|
|
760
|
+
{/* Navigation */}
|
|
761
|
+
<div>
|
|
762
|
+
<h4 className="font-semibold text-text-primary mb-4 text-sm">Product</h4>
|
|
763
|
+
<ul className="space-y-2 text-sm text-text-secondary">
|
|
764
|
+
<li><a href="#" className="hover:text-primary transition-colors">Features</a></li>
|
|
765
|
+
<li><a href="#" className="hover:text-primary transition-colors">Pricing</a></li>
|
|
766
|
+
<li><a href="#" className="hover:text-primary transition-colors">Integrations</a></li>
|
|
767
|
+
<li><a href="#" className="hover:text-primary transition-colors">Changelog</a></li>
|
|
768
|
+
</ul>
|
|
769
|
+
</div>
|
|
770
|
+
|
|
771
|
+
{/* Legal & Social */}
|
|
772
|
+
<div>
|
|
773
|
+
<h4 className="font-semibold text-text-primary mb-4 text-sm">Company</h4>
|
|
774
|
+
<ul className="space-y-2 text-sm text-text-secondary">
|
|
775
|
+
<li><a href="#" className="hover:text-primary transition-colors">About</a></li>
|
|
776
|
+
<li><a href="#" className="hover:text-primary transition-colors">Blog</a></li>
|
|
777
|
+
<li><a href="#" className="hover:text-primary transition-colors">Privacy</a></li>
|
|
778
|
+
<li><a href="#" className="hover:text-primary transition-colors">Terms</a></li>
|
|
779
|
+
</ul>
|
|
780
|
+
</div>
|
|
781
|
+
</div>
|
|
782
|
+
|
|
783
|
+
<div className="mt-12 pt-8 border-t border-border flex flex-col sm:flex-row items-center justify-between gap-4 text-sm text-text-secondary">
|
|
784
|
+
<p>© {new Date().getFullYear()} Daily Automations. All rights reserved.</p>
|
|
785
|
+
<div className="flex items-center gap-4">
|
|
786
|
+
<a href="#" className="hover:text-primary transition-colors">Twitter</a>
|
|
787
|
+
<a href="#" className="hover:text-primary transition-colors">LinkedIn</a>
|
|
788
|
+
<a href="#" className="hover:text-primary transition-colors">GitHub</a>
|
|
789
|
+
</div>
|
|
790
|
+
</div>
|
|
791
|
+
</div>
|
|
792
|
+
</footer>
|
|
793
|
+
)
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
// ============================================================================
|
|
797
|
+
// MAIN PAGE COMPONENT
|
|
798
|
+
// ============================================================================
|
|
799
|
+
|
|
800
|
+
export function LandingPage() {
|
|
801
|
+
const [email, setEmail] = React.useState("")
|
|
802
|
+
const [isSubmitted, setIsSubmitted] = React.useState(false)
|
|
803
|
+
const [submittedEmail, setSubmittedEmail] = React.useState("")
|
|
804
|
+
const heroRef = React.useRef<HTMLDivElement>(null)
|
|
805
|
+
|
|
806
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
807
|
+
e.preventDefault()
|
|
808
|
+
if (email) {
|
|
809
|
+
setSubmittedEmail(email)
|
|
810
|
+
setIsSubmitted(true)
|
|
811
|
+
setEmail("")
|
|
812
|
+
// In production: send to your email service
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
const scrollToHero = () => {
|
|
817
|
+
heroRef.current?.scrollIntoView({ behavior: "smooth" })
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
return (
|
|
821
|
+
<div className="min-h-screen bg-background text-text-primary">
|
|
822
|
+
<div ref={heroRef}>
|
|
823
|
+
<AnimatePresence mode="wait">
|
|
824
|
+
{isSubmitted ? (
|
|
825
|
+
<motion.div
|
|
826
|
+
key="success"
|
|
827
|
+
initial={{ opacity: 0 }}
|
|
828
|
+
animate={{ opacity: 1 }}
|
|
829
|
+
exit={{ opacity: 0 }}
|
|
830
|
+
>
|
|
831
|
+
<SuccessSection email={submittedEmail} />
|
|
832
|
+
</motion.div>
|
|
833
|
+
) : (
|
|
834
|
+
<motion.div
|
|
835
|
+
key="hero"
|
|
836
|
+
initial={{ opacity: 0 }}
|
|
837
|
+
animate={{ opacity: 1 }}
|
|
838
|
+
exit={{ opacity: 0 }}
|
|
839
|
+
>
|
|
840
|
+
<HeroSection
|
|
841
|
+
onSubmit={handleSubmit}
|
|
842
|
+
email={email}
|
|
843
|
+
setEmail={setEmail}
|
|
844
|
+
/>
|
|
845
|
+
</motion.div>
|
|
846
|
+
)}
|
|
847
|
+
</AnimatePresence>
|
|
848
|
+
</div>
|
|
849
|
+
|
|
850
|
+
<ProblemSection />
|
|
851
|
+
<ValueStackSection />
|
|
852
|
+
<SocialProofSection />
|
|
853
|
+
<TransformationSection />
|
|
854
|
+
<SecondaryCTASection onCTAClick={scrollToHero} />
|
|
855
|
+
<FooterSection />
|
|
856
|
+
</div>
|
|
857
|
+
)
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
export default LandingPage
|