Skip to content

Commit ad9ee54

Browse files
authored
Merge pull request #27 from willwearing/feat/graspful-landing-page
Match Just Listen styling + favicon fix
2 parents f102aa3 + 4c1b5a2 commit ad9ee54

9 files changed

Lines changed: 48 additions & 52 deletions

File tree

apps/web/src/app/favicon.ico

-24.9 KB
Binary file not shown.

apps/web/src/app/globals.css

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,21 @@
171171
}
172172

173173
@keyframes word-enter {
174-
from { opacity: 0; translate: 0 20px; }
175-
to { opacity: 1; translate: 0 0; }
174+
from {
175+
opacity: 0;
176+
filter: blur(20px);
177+
transform: translateY(40px) scale(0.88);
178+
}
179+
to {
180+
opacity: 1;
181+
filter: blur(0px);
182+
transform: translateY(0) scale(1);
183+
}
176184
}
177185

178186
.animate-word-enter {
179187
opacity: 0;
180-
animation: word-enter 0.5s ease-out forwards;
188+
animation: word-enter 1s ease-out forwards;
181189
}
182190

183191
@keyframes fade-up {
@@ -231,8 +239,8 @@
231239

232240
/* ── Connecting line animation for How It Works ──────────────────── */
233241
@keyframes line-grow {
234-
from { height: 0; }
235-
to { height: 100%; }
242+
from { width: 0; }
243+
to { width: 100%; }
236244
}
237245

238246
.animate-line-grow {

apps/web/src/components/marketing/__tests__/hero.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ describe("Hero", () => {
2929
expect(orbs.length).toBe(4);
3030
});
3131

32-
it("uses 9xl font size on xl screens", () => {
32+
it("uses 9xl font size on lg screens", () => {
3333
const { container } = render(<Hero {...props} />);
3434
const h1 = container.querySelector("h1");
35-
expect(h1?.className).toContain("xl:text-9xl");
35+
expect(h1?.className).toContain("lg:text-9xl");
3636
});
3737
});

apps/web/src/components/marketing/__tests__/how-it-works.test.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@ describe("HowItWorks", () => {
1717
it("renders all step titles and descriptions", () => {
1818
render(<HowItWorks heading="How It Works" steps={steps} />);
1919
expect(screen.getByText("Take a Diagnostic")).toBeTruthy();
20+
expect(screen.getByText("Quick quiz.")).toBeTruthy();
21+
expect(screen.getByText("Study Adaptively")).toBeTruthy();
22+
expect(screen.getByText("Personalized lessons.")).toBeTruthy();
2023
expect(screen.getByText("Pass Your Exam")).toBeTruthy();
21-
});
22-
23-
it("renders step numbers", () => {
24-
render(<HowItWorks heading="How It Works" steps={steps} />);
25-
expect(screen.getByText("1")).toBeTruthy();
26-
expect(screen.getByText("2")).toBeTruthy();
27-
expect(screen.getByText("3")).toBeTruthy();
24+
expect(screen.getByText("Retain everything.")).toBeTruthy();
2825
});
2926

3027
it("uses dark navy background", () => {

apps/web/src/components/marketing/cta.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ interface CTAProps {
88

99
export function CTA({ ctaText, headline, subheadline }: CTAProps) {
1010
return (
11-
<section className="relative overflow-hidden py-24 bg-white dark:bg-background">
12-
<div className="relative z-10 mx-auto max-w-2xl px-6 text-center">
13-
<h2 className="text-3xl font-bold text-foreground sm:text-4xl mb-4">
11+
<section className="relative overflow-hidden py-32 md:py-44 bg-white dark:bg-background">
12+
<div className="gradient-mesh opacity-20">
13+
<div className="orb-1" />
14+
<div className="orb-2" />
15+
</div>
16+
<div className="relative z-10 mx-auto max-w-4xl px-6 text-center">
17+
<h2 className="text-4xl font-bold tracking-[-0.04em] text-foreground sm:text-5xl lg:text-7xl mb-4">
1418
{headline}
1519
</h2>
1620
<p className="text-lg text-muted-foreground mb-2">

apps/web/src/components/marketing/features.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ interface FeaturesProps {
2020

2121
export function Features({ heading, subheading, features }: FeaturesProps) {
2222
return (
23-
<section className="bg-[#F8FAFC] py-24 dark:bg-card/50">
23+
<section className="bg-[#F8FAFC] py-32 md:py-40 dark:bg-card/50">
2424
<div className="mx-auto max-w-6xl px-6">
25-
<h2 className="text-center text-3xl font-bold text-foreground sm:text-4xl mb-4">
25+
<h2 className="text-center text-4xl font-bold tracking-[-0.04em] text-foreground sm:text-5xl lg:text-6xl mb-4">
2626
{heading}
2727
</h2>
2828
<p className="text-center text-muted-foreground mb-16 max-w-2xl mx-auto text-lg">
@@ -35,12 +35,12 @@ export function Features({ heading, subheading, features }: FeaturesProps) {
3535
<div
3636
key={`${feature.icon}-${feature.title}`}
3737
data-wide={feature.wide ? "true" : undefined}
38-
className={`group rounded-2xl border border-border/50 bg-white p-8 shadow-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-lg dark:bg-card ${
38+
className={`group rounded-2xl border border-border/50 bg-white p-10 shadow-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-lg dark:bg-card ${
3939
feature.wide ? "sm:col-span-2 lg:col-span-2" : ""
4040
}`}
4141
>
42-
<div className="mb-5 flex h-12 w-12 items-center justify-center rounded-xl bg-gradient-to-br from-primary/20 to-accent/20">
43-
<Icon className="h-6 w-6 text-primary" />
42+
<div className="mb-5 flex h-14 w-14 items-center justify-center rounded-xl bg-gradient-to-br from-primary/20 to-accent/20">
43+
<Icon className="h-7 w-7 text-primary" />
4444
</div>
4545
<h3 className="text-lg font-semibold text-foreground mb-2">
4646
{feature.title}

apps/web/src/components/marketing/hero.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,22 @@ export function Hero({ headline, subheadline, ctaText }: HeroProps) {
1919
</div>
2020

2121
<div className="relative z-10 mx-auto max-w-5xl px-6 py-32 text-center md:py-44">
22-
<h1 className="text-5xl font-bold leading-[1.1] tracking-tight sm:text-6xl lg:text-7xl xl:text-9xl">
22+
<h1 className="text-7xl font-bold tracking-[-0.045em] leading-[1.08] sm:text-8xl lg:text-9xl">
2323
{words.map((word, i) => (
2424
<span
2525
key={`${word}-${i}`}
2626
className={`inline-block animate-word-enter ${
2727
i >= words.length - 1 ? "text-gradient" : "text-foreground"
2828
}`}
29-
style={{ animationDelay: `${0.15 + i * 0.12}s` }}
29+
style={{ animationDelay: `${0.15 + i * 0.14}s` }}
3030
>
3131
{word}
3232
{i < words.length - 1 ? <span>&nbsp;</span> : null}
3333
</span>
3434
))}
3535
</h1>
3636
<p
37-
className="animate-fade-up mx-auto mt-8 max-w-xl text-lg leading-relaxed text-muted-foreground md:text-xl"
37+
className="animate-fade-up mx-auto mt-8 max-w-xl text-xl leading-relaxed text-muted-foreground md:text-2xl"
3838
style={{ animationDelay: "0.6s" }}
3939
>
4040
{subheadline}

apps/web/src/components/marketing/how-it-works.tsx

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,32 @@
11
interface HowItWorksProps {
22
heading: string;
3-
steps: Array<{
4-
title: string;
5-
description: string;
6-
}>;
3+
steps: Array<{ title: string; description: string }>;
74
}
85

96
export function HowItWorks({ heading, steps }: HowItWorksProps) {
107
return (
11-
<section className="relative bg-[#0A1628] py-24 overflow-hidden">
8+
<section className="relative bg-[#0A1628] py-32 md:py-40 overflow-hidden">
129
<div className="gradient-mesh opacity-30">
1310
<div className="orb-1" />
1411
<div className="orb-2" />
1512
</div>
16-
17-
<div className="relative z-10 mx-auto max-w-4xl px-6">
18-
<h2 className="text-center text-3xl font-bold text-white sm:text-4xl mb-16">
13+
<div className="relative z-10 mx-auto max-w-5xl px-6">
14+
<h2 className="text-center text-4xl font-bold tracking-[-0.04em] text-white sm:text-5xl lg:text-6xl mb-20">
1915
{heading}
2016
</h2>
2117
<div className="relative">
22-
<div className="absolute left-8 top-0 bottom-0 w-px hidden md:block overflow-hidden">
23-
<div className="w-full bg-gradient-to-b from-primary via-secondary to-primary animate-line-grow" />
18+
{/* Horizontal connecting line */}
19+
<div className="absolute top-10 left-[10%] right-[10%] h-px hidden sm:block overflow-hidden">
20+
<div className="w-full h-full bg-gradient-to-r from-primary via-secondary to-primary animate-line-grow" style={{ animationDuration: '1.5s' }} />
2421
</div>
25-
26-
<div className="space-y-12">
22+
<div className="grid gap-16 sm:grid-cols-3 sm:gap-8">
2723
{steps.map((step, i) => (
28-
<div
29-
key={`${step.title}-${step.description}`}
30-
className="flex gap-6 items-start"
31-
>
32-
<div className="relative flex h-16 w-16 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-primary to-secondary text-white text-xl font-bold shadow-lg shadow-primary/20">
24+
<div key={step.title} className="flex flex-col items-center text-center">
25+
<div className="relative flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-primary to-secondary text-white text-2xl font-bold shadow-[0_0_40px_rgba(99,102,241,0.3),0_0_80px_rgba(99,102,241,0.15)] mb-8">
3326
{i + 1}
3427
</div>
35-
<div className="pt-2">
36-
<h3 className="text-xl font-semibold text-white mb-2">
37-
{step.title}
38-
</h3>
39-
<p className="text-slate-400 leading-relaxed">
40-
{step.description}
41-
</p>
42-
</div>
28+
<h3 className="text-xl font-semibold text-white mb-3">{step.title}</h3>
29+
<p className="text-slate-400 leading-relaxed">{step.description}</p>
4330
</div>
4431
))}
4532
</div>

apps/web/src/components/marketing/nav.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ export function MarketingNav() {
77
const brand = useBrand();
88

99
return (
10-
<nav className="fixed top-0 left-0 right-0 z-50 border-b border-border/30 bg-background/70 backdrop-blur-xl">
11-
<div className="mx-auto flex max-w-6xl items-center justify-between px-6 py-4">
10+
<nav className="absolute top-0 left-0 right-0 z-20 border-b border-[#0F172A]/[0.06] bg-transparent">
11+
<div className="mx-auto flex max-w-7xl items-center justify-between px-6 py-6 md:px-12">
1212
<Link href="/" className="flex items-center gap-2">
1313
<span className="text-xl font-bold text-foreground tracking-tight">
1414
{brand.name}

0 commit comments

Comments
 (0)