Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 31 additions & 118 deletions app/[locale]/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import Link from "next/link";
import { PageHero } from "@/components/sections/shared/PageHero";
import { CtaBand, PeopleArt } from "@/components/sections/shared/CtaBand";
import { ZoomSlideshow } from "@/components/sections/about/ZoomSlideshow";
import { MissionPillars } from "@/components/sections/about/MissionPillars";
import { FounderStory } from "@/components/sections/about/FounderStory";
import { FounderVideo } from "@/components/sections/about/FounderVideo";
import { QuoteBand } from "@/components/sections/about/QuoteBand";
import { WhatWeProvide } from "@/components/sections/about/WhatWeProvide";
import { getDictionary } from "@/lib/i18n/get-dictionary";
import { getRouteMetadata } from "@/lib/i18n/metadata";
import { localizeHref, type Locale } from "@/lib/i18n/config";
import "../../minimal.css";

const FTC_ALERT =
"https://consumer.ftc.gov/consumer-alerts/2026/09/scammers-are-spoofing-car-dealership-websites-what-you-need-know";
const FTC_REPORT = "https://reportfraud.ftc.gov/";

export async function generateMetadata({
params,
Expand All @@ -25,121 +27,32 @@ export default async function AboutPage({
const { locale } = await params;
const dict = (await getDictionary(locale as Locale)).aboutPage;
const href = (h: string) => localizeHref(locale as Locale, h);
const { hero, zoom, photos, mission, story, video, ai, quote, provide, cta } = dict;
const last = provide.items.length - 1;

return (
<div className="rd rd-page mn">
<div className="mn-col">
<h1>{hero.title}</h1>
<p className="mn-lead">{hero.body}</p>

<h2 id="chapters">{photos.title}</h2>
<p>{photos.body}</p>
<p>{zoom.body}</p>

<h2 id="mission">{mission.title}</h2>
<p>{mission.body}</p>
{mission.items.map((item) => (
<div key={item.title}>
<h3>{item.title}</h3>
<p>{item.body}</p>
</div>
))}

<h2 id="story">{story.title}</h2>
<p>{story.body}</p>
{story.strikes.map((s) => (
<div key={s.n}>
<h3>{s.title}</h3>
<p className="mn-meta">{s.tag}</p>
<p>{s.body}</p>
</div>
))}
<blockquote>
<p>{story.quote}</p>
<p className="mn-meta">{story.quoteCite}</p>
</blockquote>

<h2 id="founder-video">{video.title}</h2>
<p>{video.body}</p>
<video
controls
preload="metadata"
playsInline
poster="/images/about/founder-rana-poster.webp"
aria-label={video.label}
style={{ display: "block", width: "100%", margin: "0 0 12px" }}
>
<source src="/videos/founder-rana.mp4" type="video/mp4" />
</video>
<p className="mn-meta">
{video.name}, {video.role}
</p>

<h2 id="ai">{ai.title}</h2>
<p>{ai.body}</p>
<ol>
{ai.steps.map((s) => (
<li key={s.title}>
<strong>{s.title}</strong> {s.body}
</li>
))}
</ol>
<p className="mn-meta">{ai.source}</p>
<h3>
{ai.saveStat}: {ai.saveTitle}
</h3>
<p>{ai.saveBody}</p>
<p>
<Link href={href("/fraud#law")}>{ai.saveCta}</Link>
</p>
<h3>{ai.tipsTitle}</h3>
<ul>
{ai.tips.map((t) => (
<li key={t}>{t}</li>
))}
</ul>
<div className="mn-links">
<a href={FTC_ALERT} target="_blank" rel="noopener noreferrer">
{ai.ftcCta}
</a>
<a href={FTC_REPORT} target="_blank" rel="noopener noreferrer">
{ai.reportCta}
</a>
</div>

<blockquote style={{ marginTop: 64 }}>
<p>{quote.text}</p>
<p className="mn-meta">{quote.cite}</p>
</blockquote>

<h2 id="provide">{provide.title}</h2>
<p>{provide.body}</p>
{provide.items.map((item, i) => (
<div key={item.title}>
<h3>{item.title}</h3>
<p>
{item.body}
{i === last && (
<>
{" "}
<Link href={href("/research")}>{provide.projectsLink}</Link>
</>
)}
</p>
</div>
))}

<h2>{cta.title}</h2>
<p>{cta.body}</p>
<div className="mn-links">
<Link className="mn-btn" href={href("/join")}>
{cta.primary}
</Link>
<Link href={href("/team")}>{cta.secondary}</Link>
<div className="rd rd-page">
<PageHero
className="a-hero"
centered
title={dict.hero.title}
body={dict.hero.body}
>
<div className="scroll-cue" aria-hidden="true">
<span />
</div>
</div>
</PageHero>
<ZoomSlideshow dict={dict.zoom} />
<MissionPillars dict={dict.mission} />
<FounderStory dict={dict.story} />
<FounderVideo dict={dict.video} />
<QuoteBand text={dict.quote.text} cite={dict.quote.cite} />
<WhatWeProvide dict={dict.provide} projectsHref={href("/research")} />
<CtaBand
title={dict.cta.title}
body={dict.cta.body}
primary={{ label: dict.cta.primary, href: href("/join") }}
secondary={{ label: dict.cta.secondary, href: href("/team") }}
art={<PeopleArt />}
/>
</div>
);
}
8 changes: 4 additions & 4 deletions app/[locale]/documents/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ export default async function DocumentsPage({

<section className="pt0" id="report">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.page1.title}</h2>
<p className="lede">{d.page1.body}</p>
</div>
Expand All @@ -95,7 +95,7 @@ export default async function DocumentsPage({

<section className="band" id="report2">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.page2.title}</h2>
<p className="lede">{d.page2.body}</p>
</div>
Expand All @@ -105,7 +105,7 @@ export default async function DocumentsPage({

<section id="buyers-guide">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.guide.title}</h2>
<p className="lede">{d.guide.body}</p>
</div>
Expand Down Expand Up @@ -135,7 +135,7 @@ export default async function DocumentsPage({
))}
</div>
</div>
<div className="grid3 key3 mt48">
<div className="grid3 key3 mt56">
{d.guide.keys.map((k) => (
<div className="card" key={k.title}>
<h4>{k.kicker}</h4>
Expand Down
50 changes: 29 additions & 21 deletions app/[locale]/fraud/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { YoyoScene } from "@/components/sections/fraud/YoyoScene";
import { FourSquare } from "@/components/sections/fraud/FourSquare";
import { FeeReceipt } from "@/components/sections/fraud/FeeReceipt";
import { AprCalculator } from "@/components/sections/fraud/AprCalculator";
import { FlipCards } from "@/components/sections/fraud/FlipCards";
import { getDictionary } from "@/lib/i18n/get-dictionary";
import { localizeHref, type Locale } from "@/lib/i18n/config";
import { caveat } from "@/lib/fonts";
Expand All @@ -28,7 +29,7 @@ type LawCard = { tag: string; title: string; body: string; say: string };
function Law({ card, className }: { card: LawCard; className?: string }) {
return (
<div className={`card${className ? ` ${className}` : ""}`}>
<p className="label">{card.tag}</p>
<span className="tag">{card.tag}</span>
<h3>{card.title}</h3>
<p>{card.body}</p>
<div className="say">{card.say}</div>
Expand Down Expand Up @@ -60,7 +61,7 @@ export default async function FraudPage({

<section className="pt0" id="pinkslip">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.pinkSlip.title}</h2>
<p className="lede">{d.pinkSlip.body}</p>
</div>
Expand All @@ -86,7 +87,7 @@ export default async function FraudPage({

<section className="band" id="flags">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.flags.title}</h2>
<p className="lede">{d.flags.body}</p>
</div>
Expand All @@ -96,9 +97,9 @@ export default async function FraudPage({

<YoyoScene dict={d.yoyo} />

<section id="foursquare">
<section className="band" id="foursquare">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.fourSquare.title}</h2>
<p className="lede">{d.fourSquare.body}</p>
</div>
Expand All @@ -108,7 +109,7 @@ export default async function FraudPage({

<section id="receipt">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.receipt.title}</h2>
<p className="lede">{d.receipt.body}</p>
</div>
Expand All @@ -118,7 +119,7 @@ export default async function FraudPage({

<section className="band" id="apr">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.apr.title}</h2>
<p className="lede">{d.apr.body}</p>
</div>
Expand All @@ -128,7 +129,7 @@ export default async function FraudPage({

<section id="law">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.law.title}</h2>
<p className="lede">{d.law.body}</p>
</div>
Expand Down Expand Up @@ -162,21 +163,17 @@ export default async function FraudPage({
</div>
</section>

<section className="band" id="after">
<div className="wrap prose">
<h2 className="h2">{d.after.title}</h2>
<ol className="num-list">
{d.after.items.map((it) => (
<li key={it.front}>
<h3>{it.front}</h3>
<p>{it.back}</p>
</li>
))}
</ol>
<section className="band">
<div className="wrap">
<div className="center">
<h2 className="h2">{d.after.title}</h2>
<p className="lede">{d.after.body}</p>
</div>
<FlipCards items={d.after.items} />
</div>
</section>

<section id="brochure">
<section className="pt0 brochure-section" id="brochure">
<div className="wrap">
<div className="bro">
<div className="bro-cover">
Expand All @@ -189,9 +186,13 @@ export default async function FraudPage({
/>
</div>
<div>
<span className="tag">{d.brochure.tag}</span>
<h2 className="h2">{d.brochure.title}</h2>
<p className="lede">{d.brochure.body}</p>
<p className="bro-soon">{d.brochure.soon}</p>
<div className="bro-soon">
<span className="dot-live" aria-hidden="true" />
{d.brochure.soon}
</div>
</div>
</div>
</div>
Expand All @@ -202,6 +203,13 @@ export default async function FraudPage({
body={d.cta.body}
primary={{ label: d.cta.primary, href: href("/documents") }}
secondary={{ label: d.cta.secondary, href: href("/inspection") }}
art={
<svg viewBox="0 0 260 260" aria-hidden="true">
<circle cx="130" cy="130" r="120" fill="rgba(255,255,255,.12)" />
<path d="M130 50l70 30v50c0 45-30 75-70 90-40-15-70-45-70-90V80z" fill="#fff" />
<path d="M100 135l22 22 40-44" fill="none" stroke="#9533A5" strokeWidth="10" strokeLinecap="round" strokeLinejoin="round" />
</svg>
}
/>
</div>
);
Expand Down
18 changes: 10 additions & 8 deletions app/[locale]/inspection/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { PageHero } from "@/components/sections/shared/PageHero";
import { Rich } from "@/components/sections/shared/Rich";
import { QuoteBand } from "@/components/sections/about/QuoteBand";
import { EngineInspector } from "@/components/sections/inspection/EngineInspector";
import { PpiSteps } from "@/components/sections/inspection/PpiSteps";
import { PpiDrive } from "@/components/sections/inspection/PpiDrive";
import { getDictionary } from "@/lib/i18n/get-dictionary";
import type { Locale } from "@/lib/i18n/config";

Expand Down Expand Up @@ -59,7 +59,7 @@ export default async function InspectionPage({

<section className="band" id="engine">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.engine.title}</h2>
<p className="lede">{d.engine.body}</p>
</div>
Expand All @@ -69,13 +69,13 @@ export default async function InspectionPage({

<section id="where">
<div className="wrap">
<div className="intro">
<div className="center">
<h2 className="h2">{d.where.title}</h2>
</div>
<div className="grid2 where mt48">
<div className="grid2 where mt56">
{d.where.cards.map((c, i) => (
<div className="card" key={c.title}>
{i === 1 && <p className="label">{d.where.recommended}</p>}
<div className={`card${i === 1 ? " where-rec" : ""}`} key={c.title}>
{i === 1 && <span className="tag">{d.where.recommended}</span>}
<h3>{c.title}</h3>
{c.paras.map((p, k) => (
<p key={k}>
Expand Down Expand Up @@ -126,9 +126,11 @@ export default async function InspectionPage({
</div>
</section>

<QuoteBand text={d.quote.text} cite={d.quote.cite} />
<div className="quote-pad">
<QuoteBand text={d.quote.text} cite={d.quote.cite} />
</div>

<PpiSteps dict={d.schedule} />
<PpiDrive dict={d.schedule} />
</div>
);
}
Loading