Skip to content

Commit 65b9b33

Browse files
authored
Merge pull request #187 from afrinxnahar/main
Update landing page
2 parents d83e729 + 6bd2750 commit 65b9b33

File tree

7 files changed

+219
-60
lines changed

7 files changed

+219
-60
lines changed

apps/web/app/api/auth/callback/route.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,12 @@ async function sendWelcomeEmail(
3535
3636
<p>We're excited to have you join <strong>Creator AI</strong>. 🚀</p>
3737
<p>
38-
Start exploring your dashboard here 👉
38+
Open your dashboard:
3939
<a href="https://tryscriptai.com/dashboard" style="color: #4F46E5; text-decoration: none; font-weight: bold;">
4040
Go to Dashboard
4141
</a>
4242
</p>
4343
44-
<h2 style="margin-top: 30px; color: #111;">🎥 Quick Start Guide</h2>
45-
<p>Watch this short video to learn how to test the features:</p>
46-
<div style="margin: 20px 0; text-align: center;">
47-
<a href="https://drive.google.com/file/d/1CPbW40HmE2Xh8WumJeCs0PvKcpa4U1Yo/preview"
48-
style="background-color: #4F46E5; color: #fff; padding: 12px 20px; text-decoration: none; border-radius: 8px; display: inline-block; font-weight: bold;">
49-
▶ Watch Guide Video
50-
</a>
51-
</div>
52-
53-
<h2 style="margin-top: 30px; color: #111;">📝 Quick Feedback</h2>
54-
<p>
55-
We’d love to hear your thoughts! It’ll only take a minute.
56-
<a href="https://docs.google.com/forms/d/e/1FAIpQLScLoa3gQRo44ygVofL-pY-HKgNwWRfP72qUKN6yaG7UZngFwA/viewform?usp=header"
57-
style="color: #4F46E5; font-weight: bold; text-decoration: none;">
58-
Share Feedback
59-
</a>
60-
</p>
61-
62-
<h2 style="margin-top: 30px; color: #111;">🤝 Referral Program</h2>
63-
<p>
64-
Invite friends to join Creator AI and earn <strong>${CREDITS_PER_REFERRAL} free credits</strong>!
65-
Simply share your referral link from the dashboard — when they sign up, you'll both get ${CREDITS_PER_REFERRAL} credits.
66-
</p>
67-
6844
<p style="margin-top: 30px;">Have any questions? Just reply to this email or reach us at
6945
<a href="mailto:support@tryscriptai.com" style="color: #4F46E5; text-decoration: none;">support@tryscriptai.com</a>.
7046
</p>

apps/web/app/globals.css

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,6 @@
8484
--input: 217.2 32.6% 17.5%;
8585
--ring: 212.7 26.8% 83.9%;
8686
}
87-
.theme {
88-
--animate-marquee: marquee var(--duration) infinite linear;
89-
--animate-marquee-vertical: marquee-vertical var(--duration) linear infinite;
90-
}
9187
}
9288

9389
@layer base {
@@ -97,23 +93,4 @@
9793
body {
9894
@apply bg-background text-foreground;
9995
}
100-
}
101-
102-
@theme inline {
103-
@keyframes marquee {
104-
from {
105-
transform: translateX(0);
106-
}
107-
to {
108-
transform: translateX(calc(-100% - var(--gap)));
109-
}
110-
}
111-
@keyframes marquee-vertical {
112-
from {
113-
transform: translateY(0);
114-
}
115-
to {
116-
transform: translateY(calc(-100% - var(--gap)));
117-
}
118-
}
11996
}

apps/web/app/page.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ import Footer from "@/components/footer"
66
import { SparklesCore } from "@/components/ui/sparkles"
77
import { MButton } from "@/components/ui/moving-border"
88
import { motion } from "motion/react"
9-
import ProblemSection from "@/components/landingPage/ProblemSection"
10-
import SolutionCard from "@/components/landingPage/SolutionSection"
119
import { BackgroundBeams } from "@/components/ui/background-beams"
1210
import HowItWorks from "@/components/landingPage/HowItWorks"
1311
import PricingSection from "@/components/landingPage/PricingSection"
1412
import FeatureSection from "@/components/landingPage/FeatureSection"
1513
import FAQSection from "@/components/landingPage/FAQSection"
1614
import WhyCreatorAI from "@/components/landingPage/WhyCreatorAI"
15+
import ReviewsMarquee from "@/components/landingPage/ReviewsMarquee"
1716
import { FlipWords } from "@/components/ui/flip-words"
1817
import dynamic from 'next/dynamic'
1918
import { useEffect } from "react"
@@ -162,14 +161,6 @@ export default function Home() {
162161
</div>
163162
</section>
164163

165-
<section className="bg-white dark:bg-slate-800 py-24">
166-
<ProblemSection />
167-
</section>
168-
169-
<section id="solutions" className="py-20 bg-slate-50 dark:bg-slate-900">
170-
<SolutionCard />
171-
</section>
172-
173164
<section id="features" className="py-20 bg-white dark:bg-slate-800">
174165
<FeatureSection />
175166
</section>
@@ -178,6 +169,14 @@ export default function Home() {
178169
<HowItWorks />
179170
</section>
180171

172+
<section
173+
id="reviews"
174+
aria-label="Demo testimonials"
175+
className="py-16 sm:py-20 lg:py-24 bg-white dark:bg-slate-800 overflow-hidden"
176+
>
177+
<ReviewsMarquee />
178+
</section>
179+
181180
<section id="why-creator-ai" className="py-16 sm:py-20 lg:py-24 bg-white dark:bg-slate-800">
182181
<WhyCreatorAI />
183182
</section>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
"use client"
2+
3+
import { Star } from "lucide-react"
4+
import { motion } from "motion/react"
5+
6+
import { Marquee } from "@/components/ui/marquee"
7+
import { LANDING_DUMMY_REVIEWS } from "@/lib/landing-dummy-reviews"
8+
import { cn } from "@/lib/utils"
9+
10+
function ReviewCard({
11+
img,
12+
name,
13+
handle,
14+
subscriberLine,
15+
quote,
16+
}: {
17+
img: string
18+
name: string
19+
handle: string
20+
subscriberLine: string
21+
quote: string
22+
}) {
23+
return (
24+
<figure
25+
className={cn(
26+
"relative h-full w-64 shrink-0 cursor-pointer overflow-hidden rounded-xl border p-4",
27+
"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]",
28+
"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]"
29+
)}
30+
>
31+
<div className="mb-2 flex gap-0.5" aria-hidden="true">
32+
{Array.from({ length: 5 }).map((_, i) => (
33+
<Star
34+
key={i}
35+
className="h-3.5 w-3.5 fill-amber-400 text-amber-400"
36+
strokeWidth={0}
37+
/>
38+
))}
39+
</div>
40+
<div className="flex flex-row items-start gap-2">
41+
<img className="rounded-full" width={32} height={32} alt="" src={img} />
42+
<div className="min-w-0 flex-1">
43+
<figcaption className="text-sm font-medium text-slate-900 dark:text-white">
44+
{name}
45+
</figcaption>
46+
<p className="truncate text-xs font-medium text-slate-500 dark:text-white/40">
47+
{handle}
48+
</p>
49+
<p className="mt-0.5 text-[11px] leading-snug text-slate-500 dark:text-slate-400">
50+
{subscriberLine}
51+
</p>
52+
</div>
53+
</div>
54+
<blockquote className="mt-3 text-sm leading-relaxed text-slate-700 dark:text-slate-200">
55+
{quote}
56+
</blockquote>
57+
</figure>
58+
)
59+
}
60+
61+
export default function ReviewsMarquee() {
62+
const mid = Math.ceil(LANDING_DUMMY_REVIEWS.length / 2)
63+
const firstRow = LANDING_DUMMY_REVIEWS.slice(0, mid)
64+
const secondRow = LANDING_DUMMY_REVIEWS.slice(mid)
65+
66+
return (
67+
<div className="w-full">
68+
<motion.div
69+
className="container mx-auto mb-10 max-w-6xl px-4 text-center md:px-6"
70+
initial={{ opacity: 0, y: 16 }}
71+
whileInView={{ opacity: 1, y: 0 }}
72+
viewport={{ once: true }}
73+
transition={{ duration: 0.45 }}
74+
>
75+
<span className="inline-flex items-center gap-2 rounded-full bg-purple-100 px-4 py-1.5 text-sm font-medium text-purple-700 dark:bg-purple-950/60 dark:text-purple-300">
76+
Social proof
77+
</span>
78+
<h2 className="mt-4 text-3xl font-bold text-slate-900 dark:text-slate-50 md:text-4xl">
79+
Loved by creators
80+
</h2>
81+
</motion.div>
82+
83+
<div className="relative flex w-full flex-col items-center justify-center overflow-hidden">
84+
<Marquee pauseOnHover className="[--duration:20s]">
85+
{firstRow.map((r) => (
86+
<ReviewCard
87+
key={r.id}
88+
img={r.img}
89+
name={r.name}
90+
handle={r.handle}
91+
subscriberLine={r.subscriberLine}
92+
quote={r.quote}
93+
/>
94+
))}
95+
</Marquee>
96+
<Marquee reverse pauseOnHover className="[--duration:20s]">
97+
{secondRow.map((r) => (
98+
<ReviewCard
99+
key={r.id}
100+
img={r.img}
101+
name={r.name}
102+
handle={r.handle}
103+
subscriberLine={r.subscriberLine}
104+
quote={r.quote}
105+
/>
106+
))}
107+
</Marquee>
108+
<div className="pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r from-white to-transparent dark:from-slate-800" />
109+
<div className="pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l from-white to-transparent dark:from-slate-800" />
110+
</div>
111+
</div>
112+
)
113+
}

apps/web/components/ui/marquee.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export function Marquee({
4646
<div
4747
{...props}
4848
className={cn(
49-
"group flex gap-(--gap) overflow-hidden p-2 [--duration:40s] [--gap:1rem]",
49+
"group flex gap-[var(--gap)] overflow-hidden p-2 [--duration:40s] [--gap:1rem]",
5050
{
5151
"flex-row": !vertical,
5252
"flex-col": vertical,
@@ -59,7 +59,7 @@ export function Marquee({
5959
.map((_, i) => (
6060
<div
6161
key={i}
62-
className={cn("flex shrink-0 justify-around gap-(--gap)", {
62+
className={cn("flex shrink-0 justify-around gap-[var(--gap)]", {
6363
"animate-marquee flex-row": !vertical,
6464
"animate-marquee-vertical flex-col": vertical,
6565
"group-hover:[animation-play-state:paused]": pauseOnHover,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
export type LandingDummyReview = {
2+
id: string
3+
name: string
4+
handle: string
5+
subscriberLine: string
6+
quote: string
7+
img: string
8+
}
9+
10+
export const LANDING_DUMMY_REVIEWS: readonly LandingDummyReview[] = [
11+
{
12+
id: "r1",
13+
name: "Jordan M.",
14+
handle: "@jordanplays",
15+
subscriberLine: "Gaming channel · 420K subs",
16+
img: "https://avatar.vercel.sh/jordan-m",
17+
quote:
18+
"Script drafts used to take me a full day. Now I get a solid first pass in minutes and it actually sounds like me.",
19+
},
20+
{
21+
id: "r2",
22+
name: "Priya S.",
23+
handle: "@priyaedu",
24+
subscriberLine: "Education · 180K subs",
25+
img: "https://avatar.vercel.sh/priya-s",
26+
quote:
27+
"The thumbnail workflow alone paid for itself. I ship more tests per week without burning out my designer.",
28+
},
29+
{
30+
id: "r3",
31+
name: "Alex R.",
32+
handle: "@alextech",
33+
subscriberLine: "Tech reviews · 95K subs",
34+
img: "https://avatar.vercel.sh/alex-r",
35+
quote:
36+
"Subtitles + export formats just work. I stopped juggling three different tools for the same upload.",
37+
},
38+
{
39+
id: "r4",
40+
name: "Sam K.",
41+
handle: "@samvlogs",
42+
subscriberLine: "Lifestyle vlog · 310K subs",
43+
img: "https://avatar.vercel.sh/sam-k",
44+
quote:
45+
"I was skeptical about “AI voice,” but the tone matching is scary good. Fewer rewrites before I hit record.",
46+
},
47+
{
48+
id: "r5",
49+
name: "Taylor L.",
50+
handle: "@taylorfinance",
51+
subscriberLine: "Finance · 75K subs",
52+
img: "https://avatar.vercel.sh/taylor-l",
53+
quote:
54+
"Story structure suggestions helped me tighten intros. Average view duration is up since I switched.",
55+
},
56+
{
57+
id: "r6",
58+
name: "Morgan D.",
59+
handle: "@morganfit",
60+
subscriberLine: "Fitness · 220K subs",
61+
img: "https://avatar.vercel.sh/morgan-d",
62+
quote:
63+
"Having scripts, thumbs, and ideas in one dashboard means I finally plan a month ahead instead of winging it.",
64+
},
65+
{
66+
id: "r7",
67+
name: "Casey V.",
68+
handle: "@caseybeats",
69+
subscriberLine: "Music production · 140K subs",
70+
img: "https://avatar.vercel.sh/casey-v",
71+
quote:
72+
"Dubbing experiments for non-English audiences were a pain. This removed the friction completely.",
73+
},
74+
{
75+
id: "r8",
76+
name: "Riley N.",
77+
handle: "@rileydiy",
78+
subscriberLine: "DIY & crafts · 60K subs",
79+
img: "https://avatar.vercel.sh/riley-n",
80+
quote:
81+
"The UI is fast and the outputs don’t feel generic. It’s become part of my weekly upload ritual.",
82+
},
83+
] as const

apps/web/tailwind.config.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,14 @@ const config: Config = {
261261
'scroll': {
262262
to: { transform: 'translate(calc(-50% - 0.5rem))' },
263263
},
264+
marquee: {
265+
from: { transform: "translateX(0)" },
266+
to: { transform: "translateX(calc(-100% - var(--gap)))" },
267+
},
268+
"marquee-vertical": {
269+
from: { transform: "translateY(0)" },
270+
to: { transform: "translateY(calc(-100% - var(--gap)))" },
271+
},
264272
},
265273
animation: {
266274
'wobble': 'wobble 0.8s infinite',
@@ -289,6 +297,9 @@ const config: Config = {
289297
'slow-pan': 'slow-pan 25s ease-in-out infinite alternate',
290298
'twinkle': 'twinkle 4s ease-in-out infinite',
291299
'scroll': 'scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite',
300+
marquee: "marquee var(--duration, 40s) linear infinite",
301+
"marquee-vertical":
302+
"marquee-vertical var(--duration, 40s) linear infinite",
292303
}
293304
}
294305
},

0 commit comments

Comments
 (0)