@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.
Files changed (101) hide show
  1. package/dist/components/common/button.js +6 -6
  2. package/dist/components/common/button.js.map +1 -1
  3. package/dist/components/dev/theme-tester.d.ts +2 -0
  4. package/dist/components/dev/theme-tester.d.ts.map +1 -0
  5. package/dist/components/dev/theme-tester.js +105 -0
  6. package/dist/components/dev/theme-tester.js.map +1 -0
  7. package/dist/components/layout/app-shell.d.ts +14 -0
  8. package/dist/components/layout/app-shell.d.ts.map +1 -0
  9. package/dist/components/layout/app-shell.js +25 -0
  10. package/dist/components/layout/app-shell.js.map +1 -0
  11. package/dist/components/ui/alert-dialog.d.ts +15 -0
  12. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  13. package/dist/components/ui/alert-dialog.js +40 -0
  14. package/dist/components/ui/alert-dialog.js.map +1 -0
  15. package/dist/components/ui/avatar.d.ts +7 -0
  16. package/dist/components/ui/avatar.d.ts.map +1 -0
  17. package/dist/components/ui/avatar.js +15 -0
  18. package/dist/components/ui/avatar.js.map +1 -0
  19. package/dist/components/ui/collapsible.d.ts +7 -0
  20. package/dist/components/ui/collapsible.d.ts.map +1 -0
  21. package/dist/components/ui/collapsible.js +15 -0
  22. package/dist/components/ui/collapsible.js.map +1 -0
  23. package/dist/components/ui/confirm-dialog.d.ts +16 -0
  24. package/dist/components/ui/confirm-dialog.d.ts.map +1 -0
  25. package/dist/components/ui/confirm-dialog.js +31 -0
  26. package/dist/components/ui/confirm-dialog.js.map +1 -0
  27. package/dist/components/ui/dropdown-menu.d.ts +25 -0
  28. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  29. package/dist/components/ui/dropdown-menu.js +51 -0
  30. package/dist/components/ui/dropdown-menu.js.map +1 -0
  31. package/dist/components/ui/empty-state.d.ts +14 -0
  32. package/dist/components/ui/empty-state.d.ts.map +1 -0
  33. package/dist/components/ui/empty-state.js +20 -0
  34. package/dist/components/ui/empty-state.js.map +1 -0
  35. package/dist/components/ui/filter-bar.d.ts +29 -0
  36. package/dist/components/ui/filter-bar.d.ts.map +1 -0
  37. package/dist/components/ui/filter-bar.js +19 -0
  38. package/dist/components/ui/filter-bar.js.map +1 -0
  39. package/dist/components/ui/loading-spinner.d.ts +19 -0
  40. package/dist/components/ui/loading-spinner.d.ts.map +1 -0
  41. package/dist/components/ui/loading-spinner.js +28 -0
  42. package/dist/components/ui/loading-spinner.js.map +1 -0
  43. package/dist/components/ui/popover.d.ts +8 -0
  44. package/dist/components/ui/popover.d.ts.map +1 -0
  45. package/dist/components/ui/popover.js +18 -0
  46. package/dist/components/ui/popover.js.map +1 -0
  47. package/dist/components/ui/progress.d.ts +8 -0
  48. package/dist/components/ui/progress.d.ts.map +1 -0
  49. package/dist/components/ui/progress.js +9 -0
  50. package/dist/components/ui/progress.js.map +1 -0
  51. package/dist/components/ui/radio-group.d.ts +6 -0
  52. package/dist/components/ui/radio-group.d.ts.map +1 -0
  53. package/dist/components/ui/radio-group.js +12 -0
  54. package/dist/components/ui/radio-group.js.map +1 -0
  55. package/dist/components/ui/scroll-area.d.ts +6 -0
  56. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  57. package/dist/components/ui/scroll-area.js +14 -0
  58. package/dist/components/ui/scroll-area.js.map +1 -0
  59. package/dist/components/ui/separator.d.ts +7 -0
  60. package/dist/components/ui/separator.d.ts.map +1 -0
  61. package/dist/components/ui/separator.js +9 -0
  62. package/dist/components/ui/separator.js.map +1 -0
  63. package/dist/components/ui/sheet.d.ts +21 -0
  64. package/dist/components/ui/sheet.d.ts.map +1 -0
  65. package/dist/components/ui/sheet.js +50 -0
  66. package/dist/components/ui/sheet.js.map +1 -0
  67. package/dist/components/ui/slider.d.ts +7 -0
  68. package/dist/components/ui/slider.d.ts.map +1 -0
  69. package/dist/components/ui/slider.js +9 -0
  70. package/dist/components/ui/slider.js.map +1 -0
  71. package/dist/components/ui/stat-card.d.ts +23 -0
  72. package/dist/components/ui/stat-card.d.ts.map +1 -0
  73. package/dist/components/ui/stat-card.js +46 -0
  74. package/dist/components/ui/stat-card.js.map +1 -0
  75. package/dist/components/ui/switch.d.ts +7 -0
  76. package/dist/components/ui/switch.d.ts.map +1 -0
  77. package/dist/components/ui/switch.js +9 -0
  78. package/dist/components/ui/switch.js.map +1 -0
  79. package/dist/components/ui/table.d.ts +11 -0
  80. package/dist/components/ui/table.d.ts.map +1 -0
  81. package/dist/components/ui/table.js +28 -0
  82. package/dist/components/ui/table.js.map +1 -0
  83. package/dist/components/ui/tooltip.d.ts +8 -0
  84. package/dist/components/ui/tooltip.d.ts.map +1 -0
  85. package/dist/components/ui/tooltip.js +18 -0
  86. package/dist/components/ui/tooltip.js.map +1 -0
  87. package/dist/config/themes.d.ts +18 -0
  88. package/dist/config/themes.d.ts.map +1 -0
  89. package/dist/config/themes.js +267 -0
  90. package/dist/config/themes.js.map +1 -0
  91. package/dist/index.d.ts +33 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +22 -0
  94. package/dist/index.js.map +1 -1
  95. package/examples/home-page.tsx +81 -81
  96. package/examples/main.tsx +24 -9
  97. package/examples/pages/ComponentsPage.tsx +726 -0
  98. package/examples/pages/LandingPage.tsx +860 -0
  99. package/examples/pages/index.ts +2 -0
  100. package/examples/styles.css +61 -0
  101. 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