From 07b52eb1d4075031e8f4638783d3f17e04815cd3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 20:08:17 +0000 Subject: [PATCH 1/2] Restore the public site's design as of 38feb50, keeping the typed hero Undoes the public-site design changes from 4a03384, f9eecc5, fde5282, 1f10831, 3cb93ce, 968a5bf, 54520f8 (#105) and b7f6fd7 (#96) by restoring the 38feb50 version of each public-site file: pages under app/[locale], redesign.css, redesign-overrides.css, components/sections, lib/fonts.ts, lib/i18n/dictionary.ts, the news images and the dealer map page. Files those commits added (app/minimal.css, lib/rights-laws.ts, PpiSteps.tsx) are removed. Rounded corners, hero overlay cards, the original section order, the Price Is Right preview, game and build timeline, and the original header and dividers are back. Kept: - The typewriter hero from 1f10831/3cb93ce, on the 38feb50 hero with its overlay cards. - en.json is the 38feb50 file plus the non-design edits since: Pierce removed (5a02627), Rizwaan as Strategist (cabbe86), and the plain- language copy rewrite (989eae5) wherever its text still exists. - Everything else unchanged from main: the board hub, lib/brevo.ts, proxy.ts, package files, lib/team.ts, lib/team-rank.ts and the other locale dictionaries. Co-Authored-By: Claude Opus 5.5 --- app/[locale]/about/page.tsx | 149 +-- app/[locale]/documents/page.tsx | 8 +- app/[locale]/fraud/page.tsx | 50 +- app/[locale]/inspection/page.tsx | 18 +- app/[locale]/join/page.tsx | 92 +- app/[locale]/map/page.tsx | 60 +- app/[locale]/page.tsx | 158 +-- app/[locale]/research/page.tsx | 141 ++- app/[locale]/rights/page.tsx | 160 ++- app/[locale]/team/page.tsx | 3 +- app/minimal.css | 178 --- app/redesign-overrides.css | 924 +++------------ app/redesign.css | 1036 +++++++++++++---- .../sections/RightsPhoneDemo.tsx | 332 +++++- components/sections/about/FounderStory.tsx | 47 + components/sections/about/FounderVideo.tsx | 58 + components/sections/about/MissionPillars.tsx | 36 + components/sections/about/QuoteBand.tsx | 2 +- components/sections/about/WhatWeProvide.tsx | 52 + components/sections/about/ZoomSlideshow.tsx | 127 ++ components/sections/fraud/FlipCards.tsx | 31 + components/sections/fraud/FourSquare.tsx | 80 +- components/sections/fraud/YoyoScene.tsx | 7 +- components/sections/home/AiScams.tsx | 130 +++ components/sections/home/CampusChapters.tsx | 84 ++ components/sections/home/EqualFooting.tsx | 70 ++ components/sections/home/FollowLinks.tsx | 61 + components/sections/home/FounderStrikes.tsx | 86 ++ components/sections/home/FreeResources.tsx | 37 + components/sections/home/HomeCta.tsx | 22 + components/sections/home/HomeHero.tsx | 157 +++ .../sections/home/PhoneNotifications.tsx | 60 + components/sections/home/Pillars.tsx | 44 + .../sections/home/PriceIsRightPreview.tsx | 104 ++ components/sections/home/PublicKnowledge.tsx | 36 + components/sections/home/ResearchSources.tsx | 16 + components/sections/inspection/PpiDrive.tsx | 147 +++ components/sections/inspection/PpiSteps.tsx | 24 - .../sections/research/BuildTimeline.tsx | 38 + .../sections/research/PriceIsRightGame.tsx | 441 +++++++ components/sections/research/ProjectCard.tsx | 71 ++ components/sections/research/TrackNav.tsx | 65 ++ components/sections/research/projects.ts | 25 +- components/sections/shared/CtaBand.tsx | 59 +- components/sections/shared/PageHero.tsx | 2 +- components/sections/shared/icons.tsx | 37 + components/sections/team/TeamRoster.tsx | 19 +- lib/fonts.ts | 13 +- lib/i18n/dictionaries/en.json | 428 +++++-- lib/i18n/dictionary.ts | 61 +- public/images/news/ai-dealer-scams.svg | 10 + public/images/news/california-sb-766.svg | 5 + public/images/news/dealer-warning-letters.svg | 3 + public/images/news/junk-fee-settlement.svg | 6 + public/images/news/spoofed-dealer-sites.svg | 7 + public/vindimap/index.html | 50 +- scripts/scope-prototype-css.py | 113 ++ 57 files changed, 4456 insertions(+), 1824 deletions(-) delete mode 100644 app/minimal.css rename lib/rights-laws.ts => components/sections/RightsPhoneDemo.tsx (50%) create mode 100644 components/sections/about/FounderStory.tsx create mode 100644 components/sections/about/FounderVideo.tsx create mode 100644 components/sections/about/MissionPillars.tsx create mode 100644 components/sections/about/WhatWeProvide.tsx create mode 100644 components/sections/about/ZoomSlideshow.tsx create mode 100644 components/sections/fraud/FlipCards.tsx create mode 100644 components/sections/home/AiScams.tsx create mode 100644 components/sections/home/CampusChapters.tsx create mode 100644 components/sections/home/EqualFooting.tsx create mode 100644 components/sections/home/FollowLinks.tsx create mode 100644 components/sections/home/FounderStrikes.tsx create mode 100644 components/sections/home/FreeResources.tsx create mode 100644 components/sections/home/HomeCta.tsx create mode 100644 components/sections/home/HomeHero.tsx create mode 100644 components/sections/home/PhoneNotifications.tsx create mode 100644 components/sections/home/Pillars.tsx create mode 100644 components/sections/home/PriceIsRightPreview.tsx create mode 100644 components/sections/home/PublicKnowledge.tsx create mode 100644 components/sections/home/ResearchSources.tsx create mode 100644 components/sections/inspection/PpiDrive.tsx delete mode 100644 components/sections/inspection/PpiSteps.tsx create mode 100644 components/sections/research/BuildTimeline.tsx create mode 100644 components/sections/research/PriceIsRightGame.tsx create mode 100644 components/sections/research/ProjectCard.tsx create mode 100644 components/sections/research/TrackNav.tsx create mode 100644 public/images/news/ai-dealer-scams.svg create mode 100644 public/images/news/california-sb-766.svg create mode 100644 public/images/news/dealer-warning-letters.svg create mode 100644 public/images/news/junk-fee-settlement.svg create mode 100644 public/images/news/spoofed-dealer-sites.svg create mode 100644 scripts/scope-prototype-css.py diff --git a/app/[locale]/about/page.tsx b/app/[locale]/about/page.tsx index 3f8e9ad..2be9552 100644 --- a/app/[locale]/about/page.tsx +++ b/app/[locale]/about/page.tsx @@ -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, @@ -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 ( -
-
-

{hero.title}

-

{hero.body}

- -

{photos.title}

-

{photos.body}

-

{zoom.body}

- -

{mission.title}

-

{mission.body}

- {mission.items.map((item) => ( -
-

{item.title}

-

{item.body}

-
- ))} - -

{story.title}

-

{story.body}

- {story.strikes.map((s) => ( -
-

{s.title}

-

{s.tag}

-

{s.body}

-
- ))} -
-

{story.quote}

-

{story.quoteCite}

-
- -

{video.title}

-

{video.body}

- -

- {video.name}, {video.role} -

- -

{ai.title}

-

{ai.body}

-
    - {ai.steps.map((s) => ( -
  1. - {s.title} {s.body} -
  2. - ))} -
-

{ai.source}

-

- {ai.saveStat}: {ai.saveTitle} -

-

{ai.saveBody}

-

- {ai.saveCta} -

-

{ai.tipsTitle}

-
    - {ai.tips.map((t) => ( -
  • {t}
  • - ))} -
-
- - {ai.ftcCta} - - - {ai.reportCta} - -
- -
-

{quote.text}

-

{quote.cite}

-
- -

{provide.title}

-

{provide.body}

- {provide.items.map((item, i) => ( -
-

{item.title}

-

- {item.body} - {i === last && ( - <> - {" "} - {provide.projectsLink} - - )} -

-
- ))} - -

{cta.title}

-

{cta.body}

-
- - {cta.primary} - - {cta.secondary} +
+ + -
+ + + + + + + + } + />
); } diff --git a/app/[locale]/documents/page.tsx b/app/[locale]/documents/page.tsx index 4d42dc3..1a223fc 100644 --- a/app/[locale]/documents/page.tsx +++ b/app/[locale]/documents/page.tsx @@ -85,7 +85,7 @@ export default async function DocumentsPage({
-
+

{d.page1.title}

{d.page1.body}

@@ -95,7 +95,7 @@ export default async function DocumentsPage({
-
+

{d.page2.title}

{d.page2.body}

@@ -105,7 +105,7 @@ export default async function DocumentsPage({
-
+

{d.guide.title}

{d.guide.body}

@@ -135,7 +135,7 @@ export default async function DocumentsPage({ ))}
-
+
{d.guide.keys.map((k) => (

{k.kicker}

diff --git a/app/[locale]/fraud/page.tsx b/app/[locale]/fraud/page.tsx index 4966e7d..2d37881 100644 --- a/app/[locale]/fraud/page.tsx +++ b/app/[locale]/fraud/page.tsx @@ -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"; @@ -28,7 +29,7 @@ type LawCard = { tag: string; title: string; body: string; say: string }; function Law({ card, className }: { card: LawCard; className?: string }) { return (
-

{card.tag}

+ {card.tag}

{card.title}

{card.body}

{card.say}
@@ -60,7 +61,7 @@ export default async function FraudPage({
-
+

{d.pinkSlip.title}

{d.pinkSlip.body}

@@ -86,7 +87,7 @@ export default async function FraudPage({
-
+

{d.flags.title}

{d.flags.body}

@@ -96,9 +97,9 @@ export default async function FraudPage({ -
+
-
+

{d.fourSquare.title}

{d.fourSquare.body}

@@ -108,7 +109,7 @@ export default async function FraudPage({
-
+

{d.receipt.title}

{d.receipt.body}

@@ -118,7 +119,7 @@ export default async function FraudPage({
-
+

{d.apr.title}

{d.apr.body}

@@ -128,7 +129,7 @@ export default async function FraudPage({
-
+

{d.law.title}

{d.law.body}

@@ -162,21 +163,17 @@ export default async function FraudPage({
-
-
-

{d.after.title}

-
    - {d.after.items.map((it) => ( -
  1. -

    {it.front}

    -

    {it.back}

    -
  2. - ))} -
+
+
+
+

{d.after.title}

+

{d.after.body}

+
+
-
+
@@ -189,9 +186,13 @@ export default async function FraudPage({ />
+ {d.brochure.tag}

{d.brochure.title}

{d.brochure.body}

-

{d.brochure.soon}

+
+
@@ -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={ + + } />
); diff --git a/app/[locale]/inspection/page.tsx b/app/[locale]/inspection/page.tsx index c28ed0d..510f9b3 100644 --- a/app/[locale]/inspection/page.tsx +++ b/app/[locale]/inspection/page.tsx @@ -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"; @@ -59,7 +59,7 @@ export default async function InspectionPage({
-
+

{d.engine.title}

{d.engine.body}

@@ -69,13 +69,13 @@ export default async function InspectionPage({
-
+

{d.where.title}

-
+
{d.where.cards.map((c, i) => ( -
- {i === 1 &&

{d.where.recommended}

} +
+ {i === 1 && {d.where.recommended}}

{c.title}

{c.paras.map((p, k) => (

@@ -126,9 +126,11 @@ export default async function InspectionPage({

- +
+ +
- +
); } diff --git a/app/[locale]/join/page.tsx b/app/[locale]/join/page.tsx index 868f617..1ad38fd 100644 --- a/app/[locale]/join/page.tsx +++ b/app/[locale]/join/page.tsx @@ -1,9 +1,9 @@ import Link from "next/link"; +import { PageHero } from "@/components/sections/shared/PageHero"; import { ApplyForm } from "@/components/sections/join/ApplyForm"; import { ContactForm } from "@/components/sections/join/ContactForm"; import { getDictionary } from "@/lib/i18n/get-dictionary"; import type { Locale } from "@/lib/i18n/config"; -import "../../minimal.css"; // Minimum weekly hours per role, same order as joinPage.roles.items. const ROLE_HOURS = [5, 5, 5, 3, 3, 3]; @@ -17,48 +17,70 @@ export default async function JoinPage({ const d = (await getDictionary(locale as Locale)).joinPage; return ( -
-
-

{d.hero.title}

-

{d.hero.body}

-
- {d.hero.ctaPrimary} - {d.hero.ctaSecondary} +
+ +
+ + {d.hero.ctaPrimary} + + + {d.hero.ctaSecondary} +
+
-

{d.chapters.title}

- {d.chapters.items.map((c) => ( -
-

{c.name}

-

{c.school}

-

{c.focus}

-

- {d.chapters.leadsLabel} {c.leads} -

+
+
+
+

{d.chapters.title}

- ))} +
+ {d.chapters.items.map((c) => ( +
+ {c.tag} +

{c.name}

+
{c.school}
+

{c.focus}

+
+ {d.chapters.leadsLabel} {c.leads} +
+
+ ))} +
+
+
-

{d.roles.title}

-

{d.roles.body}

-
    - {d.roles.items.map((r, i) => ( -
  • - {r} {d.roles.hours.replace("{n}", String(ROLE_HOURS[i]))} -
  • - ))} -
+
+
+
+

{d.roles.title}

+

{d.roles.body}

+
+
    + {d.roles.items.map((r, i) => ( +
  • + {r} + {d.roles.hours.replace("{n}", String(ROLE_HOURS[i]))} +
  • + ))} +
+
+
-
-

{d.form.title}

+
+
+

{d.form.title}

-
+
+
-
-

{d.contact.title}

-

{d.contact.body}

+
+
+

{d.contact.title}

+

{d.contact.body}

-
-
+
+
); } diff --git a/app/[locale]/map/page.tsx b/app/[locale]/map/page.tsx index cae2fde..63bdf61 100644 --- a/app/[locale]/map/page.tsx +++ b/app/[locale]/map/page.tsx @@ -3,6 +3,7 @@ import { MapGate } from "@/components/sections/map/MapGate"; import { getDictionary } from "@/lib/i18n/get-dictionary"; import { getRouteMetadata } from "@/lib/i18n/metadata"; import { localizeHref, type Locale } from "@/lib/i18n/config"; +import { bitter } from "@/lib/fonts"; // The satellite map is a standalone Leaflet page in public/vindimap (from // the redesign handoff). It's embedded here after the visitor accepts the @@ -11,11 +12,11 @@ const MAP_SRC = "/vindimap/index.html"; // Same order as mapPage.news.items. const NEWS = [ - "https://www.thedrive.com/features/ai-car-dealer-scams-are-infesting-facebook-marketplace-and-theyre-working", - "https://consumer.ftc.gov/consumer-alerts/2026/09/scammers-are-spoofing-car-dealership-websites-what-you-need-know", - "https://www.hinshawlaw.com/en/insights/blogs/consumer-crossroads-where-financial-services-and-litigation-intersect/federal-and-state-regulators-continue-crackdown-on-junk-fees-with-dollar4-million-auto-dealer-settlement", - "https://pirg.org/articles/car-dealerships-nationwide-warned-to-stop-junk-fees-other-deceptive-tactics/", - "https://calmatters.org/politics/2025/12/california-new-law-buying-cars/", + { url: "https://www.thedrive.com/features/ai-car-dealer-scams-are-infesting-facebook-marketplace-and-theyre-working", img: "ai-dealer-scams" }, + { url: "https://consumer.ftc.gov/consumer-alerts/2026/09/scammers-are-spoofing-car-dealership-websites-what-you-need-know", img: "spoofed-dealer-sites" }, + { url: "https://www.hinshawlaw.com/en/insights/blogs/consumer-crossroads-where-financial-services-and-litigation-intersect/federal-and-state-regulators-continue-crackdown-on-junk-fees-with-dollar4-million-auto-dealer-settlement", img: "junk-fee-settlement" }, + { url: "https://pirg.org/articles/car-dealerships-nationwide-warned-to-stop-junk-fees-other-deceptive-tactics/", img: "dealer-warning-letters" }, + { url: "https://calmatters.org/politics/2025/12/california-new-law-buying-cars/", img: "california-sb-766" }, ]; export async function generateMetadata({ @@ -36,7 +37,7 @@ export default async function MapPage({ const d = (await getDictionary(locale as Locale)).mapPage; return ( -
+
@@ -47,27 +48,36 @@ export default async function MapPage({ />
-
-
-

{d.news.title}

-

{d.news.body}

- -

{d.news.footnote}

+
+

{d.news.footnote}

diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 4049d38..1cbf110 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -1,23 +1,23 @@ import type { Metadata } from "next"; -import Link from "next/link"; -import { Rich } from "@/components/sections/shared/Rich"; +import { HomeHero } from "@/components/sections/home/HomeHero"; +import { ResearchSources } from "@/components/sections/home/ResearchSources"; +import { PublicKnowledge } from "@/components/sections/home/PublicKnowledge"; +import { EqualFooting } from "@/components/sections/home/EqualFooting"; +import { PriceIsRightPreview } from "@/components/sections/home/PriceIsRightPreview"; +import { CampusChapters } from "@/components/sections/home/CampusChapters"; +import { FollowLinks } from "@/components/sections/home/FollowLinks"; +import { AiScams } from "@/components/sections/home/AiScams"; +import { Pillars } from "@/components/sections/home/Pillars"; +import { FounderStrikes } from "@/components/sections/home/FounderStrikes"; +import { FreeResources } from "@/components/sections/home/FreeResources"; +import { HomeCta } from "@/components/sections/home/HomeCta"; import { getDictionary } from "@/lib/i18n/get-dictionary"; import { SHARE_IMAGE } from "@/lib/i18n/metadata"; -import { SOCIAL_URLS } from "@/lib/social"; import { localizedPathnames, localizeHref, type Locale, } from "@/lib/i18n/config"; -import "../minimal.css"; - -const CHAPTERS = ["ucla", "berkeley", "ucsc"]; -const FOLLOW = [ - SOCIAL_URLS.linkedin, - SOCIAL_URLS.instagramUcla, - SOCIAL_URLS.instagramBerkeley, - SOCIAL_URLS.instagramUcsc, -]; export async function generateMetadata({ params, @@ -61,117 +61,33 @@ export default async function HomePage({ const dict = await getDictionary(locale as Locale); const home = dict.homePage; const href = (h: string) => localizeHref(locale as Locale, h); - const { hero, ppi, publicKnowledge, footing, chapters, follow, pillars, free } = home; - const [inspection, fraud] = pillars.items; - - return ( -
-
-

- {hero.titleLead} {hero.phrases[0]} -

-

{hero.body}

-
- - {hero.ctaPrimary} - - {hero.ctaSecondary} -
- -

{ppi.title}

-

- -

- {ppi.items.map((item) => ( -
-

{item.title}

-

{item.body}

-
- ))} -
- {ppi.primary} - {ppi.secondary} -
- -

{publicKnowledge.title}

-

- -

-

- {publicKnowledge.cta} -

-

{footing.title}

-

{footing.body}

-
-

{footing.quote}

-

{footing.quoteCite}

-
- {footing.rows.map((row) => ( -
-

- {row.stat}: {row.title} -

-

{row.body}

-

{row.cite}

-
- ))} + const ppi = href("/inspection"); + const fraud = href("/fraud"); + const story = href("/about#story"); -

{chapters.title}

-

{chapters.body}

- {chapters.items.map((item, i) => ( -
-

- {item.tag}: {item.title} -

-

{item.body}

-

- {item.cta} -

-
- ))} - -

{follow.title}

-

{follow.body}

- - -

{pillars.title}

-

{pillars.body}

-

- {inspection.title} -

-

{inspection.body}

-

- {fraud.title} -

-

{fraud.body}

- -

{free.title}

-

{free.body}

-

- {free.planTitle}: {free.price} -

-
    - {free.checks.map((c) => ( -
  • {c}
  • - ))} -
- {free.offers.map((o) => ( -
-

{o.title}

-

{o.body}

-
- ))} -
+ return ( +
+ + + + + + + + + + + +
); } diff --git a/app/[locale]/research/page.tsx b/app/[locale]/research/page.tsx index 44c1213..c50818a 100644 --- a/app/[locale]/research/page.tsx +++ b/app/[locale]/research/page.tsx @@ -1,9 +1,14 @@ -import Link from "next/link"; -import { TRACKS, applyHref } from "@/components/sections/research/projects"; +import type { ReactNode } from "react"; +import { PageHero } from "@/components/sections/shared/PageHero"; +import { ChecklistArt, CtaBand } from "@/components/sections/shared/CtaBand"; +import { TrackNav } from "@/components/sections/research/TrackNav"; +import { ProjectCard } from "@/components/sections/research/ProjectCard"; +import { PriceIsRightGame } from "@/components/sections/research/PriceIsRightGame"; +import { BuildTimeline } from "@/components/sections/research/BuildTimeline"; +import { TRACKS, type TrackKey } from "@/components/sections/research/projects"; import { getDictionary } from "@/lib/i18n/get-dictionary"; import { getRouteMetadata } from "@/lib/i18n/metadata"; import { localizeHref, type Locale } from "@/lib/i18n/config"; -import "../../minimal.css"; export async function generateMetadata({ params, @@ -14,6 +19,28 @@ export async function generateMetadata({ return getRouteMetadata(locale, "research", "/research"); } +const TRACK_ICONS: Record = { + app: ( + <> + + + + ), + data: , + research: ( + <> + + + + ), + outreach: ( + <> + + + + ), +}; + export default async function ResearchPage({ params, }: { @@ -24,57 +51,63 @@ export default async function ResearchPage({ const joinHref = localizeHref(locale as Locale, "/join"); return ( -
-
-

{d.hero.title}

-

{d.hero.body}

- - - {TRACKS.map((track) => { - const copy = d.tracks[track.key]; - return ( -
-

{copy.title}

-

{copy.body}

- {track.projects.map((meta, i) => { - const project = copy.projects[i]; - return ( -
-

{project.name}

- {meta.chapter &&

{d.chapters[meta.chapter]}

} -

{project.desc}

-

- {d.skillsLabel}: {project.skills.join(", ")} -

-

- {d.membersLabel}: {project.members} -

-

- {project.join} -

-
- ); - })} -
- ); - })} - -

{d.cta.title}

-

{d.cta.body}

-
- - {d.cta.button} - -
-
+
+ + ({ + key: t.key, + title: d.tracks[t.key].title, + count: t.projects.length, + }))} + /> + {TRACKS.map((track, ti) => { + const copy = d.tracks[track.key]; + return ( +
+
+
+ +
+

{copy.title}

+

{copy.body}

+
+
+
+ {track.projects.map((meta, i) => ( + + ))} +
+ {track.key === "data" && ( + <> + + + + )} +
+
+ ); + })} + } + />
); } diff --git a/app/[locale]/rights/page.tsx b/app/[locale]/rights/page.tsx index 7de43f6..452c8bf 100644 --- a/app/[locale]/rights/page.tsx +++ b/app/[locale]/rights/page.tsx @@ -1,8 +1,12 @@ -import Link from "next/link"; +import { + PageHero, + FadeUp, + SectionTitle, + InfoBox, + Button, +} from "@/components/ui"; +import { RightsPhoneDemo } from "@/components/sections/RightsPhoneDemo"; import { getRouteMetadata } from "@/lib/i18n/metadata"; -import { localizeHref, type Locale } from "@/lib/i18n/config"; -import { COOLING_OFF, FEDERAL_LAWS, STATE_DIRECTION, STATE_LAWS, type Law } from "@/lib/rights-laws"; -import "../../minimal.css"; export async function generateMetadata({ params, @@ -13,90 +17,76 @@ export async function generateMetadata({ return getRouteMetadata(locale, "rights", "/rights"); } -const titleCase = (s: string) => s.replace(/\b\w/g, (c) => c.toUpperCase()); - -function LawText({ law, heading: H }: { law: Law; heading: "h3" | "h4" }) { +export default function RightsPage() { return ( -
- {law.title} - {law.citation &&

{law.citation}

} -

{law.plain}

-

- What to say: “{law.script}” -

-

- If they push back: {law.escalation} -

-
- ); -} + <> + + Know your rights +
+ before you sign. + + } + subtitle="Federal and California laws protect you from discrimination and deceptive practices at dealerships. Here is what every buyer should know." + /> -export default async function RightsPage({ - params, -}: { - params: Promise<{ locale: string }>; -}) { - const { locale } = await params; - const href = (h: string) => localizeHref(locale as Locale, h); - - return ( -
-
-

Know your rights before you sign.

-

- Federal and California laws protect you from discrimination and deceptive practices at dealerships. Here is - what every buyer should know. -

- -

Federal laws

-

These apply in every state.

- {[...FEDERAL_LAWS, COOLING_OFF].map((law) => ( - - ))} - -

State laws

-

The states we have researched in detail, on top of the federal laws above.

- {Object.entries(STATE_LAWS).map(([state, laws]) => ( -
-

{titleCase(state)}

- {laws.map((law) => ( - - ))} -
- ))} + {/* Federal Laws */} + +
+ + Try It Yourself. + +

+ A preview of the mobile app version of this page: tell it your state, then scroll through the laws that actually apply to you. +

+
+ +
+
+
-

Other states

-

- Based on a 50-state legal summary. Exact statute numbers have not been independently verified for these - states, so treat this as a starting point, not legal advice. Before you sign, search “[your state] - lemon law” and “[your state] used car dealer warranty” on your state Attorney - General's website. -

-
    - {Object.entries(STATE_DIRECTION).map(([state, direction]) => ( -
  • - {titleCase(state)}: the lemon law {direction}. -
  • - ))} -
+ {/* Bottom CTA */} + +
+ +

+ + You do not need to be a lawyer to use these laws. + {" "} + Simply knowing they exist changes the power dynamic. If a dealer + refuses to provide written disclosures, that itself is a red flag. +

+

+ If you believe your rights have been violated, you can file a + complaint with the{" "} + + Consumer Financial Protection Bureau (CFPB) + + , the{" "} + + Federal Trade Commission (FTC) + + , or the{" "} + + California Department of Motor Vehicles (DMV) + + . +

+
-

Remember

-

- You do not need to be a lawyer to use these laws. Simply knowing they exist changes the - power dynamic. If a dealer refuses to provide written disclosures, that itself is a red flag. -

-

- If you believe your rights have been violated, you can file a complaint with the{" "} - Consumer Financial Protection Bureau (CFPB), the Federal Trade Commission (FTC) - , or the California Department of Motor Vehicles (DMV). -

-
- - Spot the Red Flags - - Pre-Purchase Inspection Guide -
-
-
+
+ + +
+
+ + ); } diff --git a/app/[locale]/team/page.tsx b/app/[locale]/team/page.tsx index 04b7992..cfdef46 100644 --- a/app/[locale]/team/page.tsx +++ b/app/[locale]/team/page.tsx @@ -1,5 +1,5 @@ import { PageHero } from "@/components/sections/shared/PageHero"; -import { CtaBand } from "@/components/sections/shared/CtaBand"; +import { CtaBand, PeopleArt } from "@/components/sections/shared/CtaBand"; import { TeamRoster, type RosterMember, @@ -72,6 +72,7 @@ export default async function TeamPage({ title={d.cta.title} body={d.cta.body} primary={{ label: d.cta.button, href: localizeHref(locale as Locale, "/join") }} + art={} />
diff --git a/app/minimal.css b/app/minimal.css deleted file mode 100644 index 27f6ba7..0000000 --- a/app/minimal.css +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Minimal pages (Home, About, Projects, Get Involved, Know Your Rights). - * Everything is scoped under .mn so the Team and Learning Resources pages, - * which share the .rd styles, are unaffected. - * White page, one narrow column, text first. Purple only for links, the - * active nav item and one main button per page. Square corners, no - * shadows, no boxes around sections. - */ -.mn { - --mn-ink: #2a0f31; - --mn-deep: #5e1a6b; - --mn-purple: #9533a5; - --mn-rule: #e6e1e8; - background: #fff; - color: var(--mn-ink); -} -.mn .mn-col { - max-width: 680px; - margin: 0 auto; - padding: 64px 20px 112px; -} -.mn h1, -.mn h2, -.mn h3 { - color: var(--mn-ink); - font-weight: 700; - line-height: 1.2; -} -.mn h1 { - font-size: clamp(2rem, 5vw, 2.6rem); - margin: 0 0 24px; -} -.mn h2 { - font-size: 1.5rem; - margin: 72px 0 16px; -} -.mn h3 { - font-size: 1.12rem; - margin: 32px 0 8px; -} -.mn h2 + h3 { - margin-top: 16px; -} -.mn p, -.mn ul, -.mn ol, -.mn blockquote { - margin: 0 0 18px; -} -.mn ul, -.mn ol { - padding-left: 22px; -} -.mn li { - margin: 0 0 12px; -} -.mn li::marker { - color: var(--mn-ink); -} -.mn a { - color: var(--mn-purple); - text-decoration: underline; - text-underline-offset: 3px; -} -.mn a:hover { - color: var(--mn-deep); -} -.mn .mn-lead { - font-size: 1.15rem; -} -/* Secondary text: full strength, dark purple, readable size. */ -.mn .mn-meta { - color: var(--mn-deep); - font-size: 1rem; -} -.mn blockquote { - padding: 0; - font-size: 1.1rem; -} -.mn blockquote p { - margin-bottom: 8px; -} -.mn .mn-links { - display: flex; - flex-wrap: wrap; - gap: 12px 28px; - align-items: center; - margin: 28px 0 0; -} -/* The one main button on a page. */ -.mn .mn-btn { - display: inline-block; - background: var(--mn-purple); - color: #fff; - text-decoration: none; - font-weight: 700; - padding: 12px 24px; - border: 0; - border-radius: 0; -} -.mn .mn-btn:hover { - background: var(--mn-deep); - color: #fff; -} -.mn hr { - border: 0; - border-top: 1px solid var(--mn-rule); - margin: 64px 0 0; -} -.mn img, -.mn video, -.mn iframe { - max-width: 100%; -} -@media (max-width: 640px) { - .mn .mn-col { - padding: 40px 20px 88px; - } - .mn h2 { - margin-top: 56px; - } -} - -/* Forms on Get Involved. The apply form's submit is the page's one main - button; the contact form's is dark. */ -.mn form.apply { - grid-template-columns: 1fr; - gap: 18px; - margin-top: 24px; -} -.mn .fld input, -.mn .fld select, -.mn .fld textarea { - border: 1px solid var(--mn-ink); - border-radius: 0; - box-shadow: none; -} -.mn .fld input:focus, -.mn .fld select:focus, -.mn .fld textarea:focus { - border-color: var(--mn-purple); - outline: 2px solid var(--mn-purple); - outline-offset: 0; -} -.mn .radios { - flex-wrap: wrap; -} -.mn .btn { - border-radius: 0; - box-shadow: none; - justify-self: start; -} -.mn #contact .btn-solid { - background: var(--mn-ink); - border-color: var(--mn-ink); -} -.mn #contact .btn-solid:hover { - background: var(--mn-deep); - border-color: var(--mn-deep); -} -.mn .form-note { - font-weight: 400; -} -.mn .form-ok { - background: none; - padding: 0; -} - -.mn h4 { - color: var(--mn-ink); - font-size: 1.05rem; - font-weight: 700; - line-height: 1.25; - margin: 28px 0 6px; -} -.mn section { - scroll-margin-top: 96px; -} diff --git a/app/redesign-overrides.css b/app/redesign-overrides.css index 7c45d20..e8026fc 100644 --- a/app/redesign-overrides.css +++ b/app/redesign-overrides.css @@ -1,6 +1,7 @@ /* - * Next.js-specific adjustments and the plain layouts added after the - * prototype. Base styles live in app/redesign.css. + * Next.js-specific adjustments on top of the generated app/redesign.css. + * Keep prototype styles in redesign.css (regenerate it with + * scripts/scope-prototype-css.py) and put anything hand-written here. */ /* globals.css gives legacy headings Lora; the redesign uses one family. */ @@ -30,19 +31,12 @@ } /* ---------- Header ---------- */ -/* A plain full-width bar with one thin line along the bottom. The nav is - 75px + the 1px line = 76px, the height the sticky bars and panels - elsewhere (track nav, scroll tours, slideshow) and the mobile menu's - `top` assume. */ .rd-hdr { z-index: 100; - background: #fff; - border-bottom: 1px solid var(--line); - padding: 0; + -webkit-backdrop-filter: blur(12px); } .rd-hdr .nav { gap: 16px; - height: 75px; } .rd-hdr .right { display: flex; @@ -61,13 +55,13 @@ font-size: 0.92rem; color: var(--ink); background: transparent; - border: 0; - padding: 8px 4px; + border: 1px solid var(--line); + border-radius: 999px; + padding: 8px 14px; cursor: pointer; } .rd-hdr .lang > button:hover { - text-decoration: underline; - text-underline-offset: 4px; + background: var(--tint); } .rd-hdr .lang ul { position: absolute; @@ -78,6 +72,8 @@ padding: 8px; background: #fff; border: 1px solid var(--line); + border-radius: 16px; + box-shadow: 0 20px 40px -20px rgba(42, 15, 49, 0.3); z-index: 5; } [dir="rtl"] .rd-hdr .lang ul { @@ -93,15 +89,13 @@ color: var(--ink); background: none; border: 0; + border-radius: 10px; padding: 9px 12px; cursor: pointer; } .rd-hdr .lang li button:hover, .rd-hdr .lang li button[aria-selected="true"] { - text-decoration: underline; - text-underline-offset: 4px; -} -.rd-hdr .lang li button[aria-selected="true"] { + background: var(--tint); color: var(--purple); } .rd-hdr .lang li button[aria-selected="true"] { @@ -134,6 +128,7 @@ display: flex; position: static; border: 0; + box-shadow: none; padding: 0 0 6px 14px; min-width: 0; } @@ -141,248 +136,34 @@ margin: 10px 0 0; } } -[dir="rtl"] .rd-hdr .drop { - left: auto; - right: 0; -} - -/* ---------- Shared ---------- */ -/* Section intros sit on the left, above whatever follows. */ -.rd .intro { - max-width: 760px; -} -.rd .intro .lede { - margin-top: 16px; -} -/* A single left-aligned reading column. */ -.rd .prose > * { - max-width: 840px; -} -.rd .prose > .lede { - margin-top: 16px; -} -.rd .split-head { - display: grid; - grid-template-columns: 0.85fr 1.15fr; - gap: 64px; - align-items: start; -} -.rd .split-head .lede { - margin-top: 16px; -} -@media (max-width: 860px) { - .rd .split-head { - grid-template-columns: 1fr; - gap: 32px; - } -} -.rd .inline-link { - color: var(--purple); - font-weight: 700; -} -.rd .inline-link:hover { - text-decoration: underline; -} -/* A small text label above a heading, such as a law's name. */ -.rd .label { - font-size: 0.85rem; - font-weight: 700; - color: var(--purple-deep); - margin: 0 0 8px; -} -.rd .label.red { - color: var(--red); -} -/* Severity labels keep their color as a small square chip. */ -.rd .tag[class*="sev-"] { - padding: 3px 8px; -} -.rd .link-card { - display: block; - transition: border-color 0.2s; -} -.rd .link-card:hover { - border-color: var(--purple); -} -.rd .link-card:hover h3 { - text-decoration: underline; - text-underline-offset: 4px; -} -.rd .link-card h3 { - font-size: 1.4rem; - margin-bottom: 10px; -} -.rd .link-card p { - line-height: 1.7; -} -/* Numbered steps: the number in the margin, then a heading and a line. */ -.rd .num-list { - list-style: none; - padding: 0; - margin-top: 32px; - counter-reset: n; -} -.rd .num-list li { - counter-increment: n; - display: grid; - grid-template-columns: 44px 1fr; - column-gap: 12px; - padding: 20px 0; - border-top: var(--divider); -} -.rd .num-list li::before { - content: counter(n); - grid-row: span 2; - font-weight: 700; - font-size: 1.4rem; - line-height: 1.2; - color: var(--purple); -} -.rd .num-list h3 { - font-size: 1.2rem; - line-height: 1.35; -} -.rd .num-list p { - margin-top: 6px; - line-height: 1.7; -} -.rd .prose .alert { - margin-top: 28px; -} -/* Closing call to action: heading, a line of text, a button. */ -.rd .cta .lede { - margin: 14px 0 28px; -} -.rd .quote blockquote { - margin: 0; -} -.rd .quote { - margin: 0; - max-width: 880px; -} -.rd .quote p { - font-size: clamp(1.4rem, 2.6vw, 1.9rem); - font-weight: 700; - line-height: 1.4; -} -.rd .quote cite { - display: block; - margin-top: 14px; - font-style: normal; - font-weight: 600; - color: var(--purple-deep); -} - /* ---------- Home ---------- */ +.rd .hero-photo img { + height: auto; +} .rd .strip h2 { font-size: 1rem; font-weight: 700; + letter-spacing: 0; } .rd .sources { list-style: none; padding: 0; } -.rd .what .lede { - margin: 0 0 28px; -} -@media (max-width: 960px) { - .rd .what { - grid-template-columns: 1fr; - gap: 20px; - } -} -/* Home: "You shouldn't pay more" — heading and the Unruh quote side by - side, then the three numbers as cards. No rule beside the quote. */ -.rd .footing-top { - display: grid; - grid-template-columns: 1.1fr 0.9fr; - gap: 56px; - align-items: start; -} -.rd .footing-top .lede { - margin-top: 18px; -} -.rd .footing-law { - margin: 0; - background: #fff; - border: 1px solid var(--line); - border-radius: var(--radius-card); - padding: 28px 30px; - font-size: 0.98rem; - line-height: 1.65; -} -.rd .footing-law blockquote { - margin: 0; - font-style: italic; -} -.rd .footing-law cite { - display: block; - margin-top: 14px; - font-style: normal; - font-weight: 700; - color: var(--purple-deep); -} -.rd .stats { - list-style: none; - padding: 0; - margin: 56px 0 0; - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 24px; -} -.rd .stats li { - display: flex; - flex-direction: column; - background: #fff; - border: 1px solid var(--line); - border-radius: var(--radius-card); - padding: 32px 28px; -} -.rd .stats .big { - margin-bottom: 22px; -} -.rd .stats h3 { - font-size: 1.2rem; - line-height: 1.35; -} -.rd .stats p { - margin-top: 12px; - font-size: 1rem; - line-height: 1.7; -} -.rd .stats cite { - display: block; - margin-top: auto; - padding-top: 18px; - font-style: normal; - font-weight: 600; - font-size: 0.9rem; - color: var(--purple-deep); -} -@media (max-width: 960px) { - .rd .footing-top { - grid-template-columns: 1fr; - gap: 32px; - } - .rd .stats { - grid-template-columns: 1fr; - } -} .rd .pir-tags { list-style: none; padding: 0; - display: flex; - flex-wrap: wrap; - gap: 6px 16px; - font-weight: 600; - font-size: 0.95rem; } -.rd .pir-tags li.bad { - color: var(--red); +.rd .pir-tags li { + background: var(--tint); + border-radius: 999px; + padding: 6px 12px; + font-weight: 700; + font-size: 0.92rem; + line-height: 1.3; } -.rd .pir-tags li.loc { - color: var(--purple); +.rd .pv .h2 { + margin-top: 14px; } .rd .pv .lede { margin-top: 16px; @@ -394,187 +175,80 @@ width: auto; height: auto; } -.rd .campus-grid { - margin-top: 48px; -} -.rd .campus-body h3 { - line-height: 1.3; -} -.rd .campus:hover .campus-go { - text-decoration: underline; - text-underline-offset: 4px; -} -.rd .follow-list { +.rd .aisteps { list-style: none; padding: 0; - display: grid; - grid-template-columns: 1fr 1fr; - column-gap: 32px; -} -.rd .follow-list a { - display: flex; - flex-direction: column; - gap: 2px; - padding: 18px 0; - border-top: var(--divider); -} -.rd .follow-list span { - font-size: 0.9rem; - font-weight: 600; - color: var(--purple-deep); -} -.rd .follow-list b { - font-size: 1.1rem; -} -.rd .follow-list a:hover b { - color: var(--purple); - text-decoration: underline; - text-underline-offset: 4px; -} -@media (max-width: 560px) { - .rd .follow-list { - grid-template-columns: 1fr; - } -} -.rd .tabs { - margin-top: 36px; -} -.rd .story-body p { - font-size: 1.05rem; } -.rd .story-body .btn { - margin-top: 6px; +.rd .ai-tips .ctas { + margin-top: 28px; } .rd .checks svg { width: 22px; height: 22px; } -.rd .offer h4 { - font-size: 1.05rem; -} - -/* ---------- About ---------- */ -.rd .photo-grid { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 24px; - margin-top: 40px; -} -.rd .photo-grid figure { - margin: 0; -} -.rd .photo-grid img { +.rd .pcard { display: block; - width: 100%; - height: auto; - aspect-ratio: 3/2; - object-fit: cover; + text-align: start; } -@media (max-width: 640px) { - .rd .photo-grid { - grid-template-columns: 1fr; - } +.rd .pcard-line { + border: 1px solid var(--line); + transition: + border-color 0.2s, + box-shadow 0.2s; } -.rd .pillar h3 { - font-size: 1.5rem; - margin-bottom: 8px; +.rd .pcard-line:hover { + border-color: var(--purple); + box-shadow: 0 24px 48px -28px rgba(94, 26, 107, 0.45); } -.rd .pillar p { - font-size: 1.05rem; - line-height: 1.7; +.rd .story-body .btn { + margin-top: 6px; } -.rd .strike { - margin-top: 40px; + +/* ---------- Right-to-left locales ---------- */ +[dir="rtl"] .rd .campus-go svg, +[dir="rtl"] .rd .arrow-flip { + transform: scaleX(-1); } -.rd .strike h3 { - font-size: 1.45rem; - line-height: 1.3; +[dir="rtl"] .rd .campus:hover .campus-go svg { + transform: scaleX(-1) translateX(4px); } -.rd .strike-n { - color: var(--purple); - margin-right: 6px; +[dir="rtl"] .rd .soc-go { + right: auto; + left: 20px; } -.rd .strike-meta { - margin: 4px 0 10px; - font-weight: 600; - color: var(--purple-deep); + +/* ---------- Shared ---------- */ +.rd .inline-link { + color: var(--purple); + font-weight: 700; } -.rd .strike p:last-child { - font-size: 1.1rem; - line-height: 1.8; +.rd .inline-link:hover { + text-decoration: underline; } -.rd .pull { - margin: 44px 0 0; - border-left: 0; - padding: 0; + +/* ---------- About ---------- */ +.rd .a-hero p { + margin-left: auto; + margin-right: auto; } .rd .fv-section { padding-top: 88px; } -.rd .ai { - display: grid; - grid-template-columns: 1.1fr 0.9fr; - gap: 64px; - align-items: start; -} -.rd .ai .lede { - margin-top: 16px; -} -.rd .ai-side { - display: flex; - flex-direction: column; - gap: 32px; -} -.rd .ai-save h3 { - font-size: 1.4rem; - margin: 10px 0 8px; -} -.rd .ai-save p { - line-height: 1.7; - margin-bottom: 10px; -} -.rd .ai-tips h3 { - font-size: 1.4rem; - margin-bottom: 18px; -} -.rd .ai-tips .ctas { - margin-top: 24px; -} -@media (max-width: 900px) { - .rd .ai { - grid-template-columns: 1fr; - gap: 40px; - } +.rd .pull { + margin-inline: 0; } -.rd .def-list { +.rd figure.quote-band { margin: 0; - display: grid; - grid-template-columns: 1fr 1fr; - column-gap: 32px; -} -.rd .def-list div { - padding: 18px 0; - border-top: var(--divider); } -.rd .def-list dt { - font-weight: 700; - font-size: 1.15rem; -} -.rd .def-list dd { - margin: 4px 0 0; - line-height: 1.7; -} -@media (max-width: 560px) { - .rd .def-list { - grid-template-columns: 1fr; - } +.rd .quote-band blockquote { + margin: 0; } /* ---------- Team ---------- */ /* The campus filter toggles are buttons with aria-pressed, not tabs. */ .rd .tabs button[aria-pressed="true"] { - color: var(--purple); - border-bottom-color: var(--purple); + background: var(--purple); + color: #fff; } .rd .avatar-img { width: 96px; @@ -588,21 +262,25 @@ } /* ---------- Projects ---------- */ -.rd section .intro + .projects { - margin-top: 40px; +.rd .chips-sm { + list-style: none; + padding: 0; } -.rd .proj-chapter { +.rd .chips-sm li { + background: var(--tint); + color: var(--ink); + border-radius: 999px; + padding: 4px 12px; font-size: 0.9rem; - font-weight: 700; - color: var(--purple-deep); + font-weight: 600; } -.rd .proj-meta dt { - font-size: 0.9rem; - font-weight: 700; - color: var(--purple-deep); +.rd .pir-tags li.bad { + background: #fbe1df; + color: #7a1a14; } -.rd .proj-meta dd { - margin: 2px 0 0; +.rd .pir-tags li.loc { + background: var(--purple); + color: #fff; } .rd .pir-note { text-align: start; @@ -630,6 +308,7 @@ position: absolute; inset: 0; overflow: hidden; + border-radius: inherit; } .rd .insp-zoom img { height: 100%; @@ -637,6 +316,7 @@ @media (max-width: 900px) { .rd .insp-frame { background: none; + box-shadow: none; } .rd .insp-frame::before { display: none; @@ -645,7 +325,9 @@ position: relative; inset: auto; aspect-ratio: 3/2; + border-radius: 18px; background: #e9e9ee; + box-shadow: 0 30px 60px -30px rgba(42, 15, 49, 0.45); } .rd .insp-zoom, .rd .insp-hots { @@ -657,6 +339,12 @@ .rd .notlist b { display: block; } +.rd .where-rec { + border: 2px solid var(--purple); +} +.rd .where-rec .tag { + margin-bottom: 12px; +} .rd .dealers-title { font-size: 1.5rem; } @@ -666,6 +354,9 @@ .rd .acc-outro { margin-top: 12px; } +.rd .quote-pad section { + padding-top: 88px; +} .rd .mt18 { margin-top: 18px; } @@ -678,18 +369,19 @@ .rd .fs-pay s { font-family: var(--font-caveat), "Caveat", "Segoe Print", cursive; } +.rd .nw h3, +.rd .nw-dek { + font-family: var(--font-bitter), "Bitter", Georgia, serif; +} +.rd .flip { + display: block; + width: 100%; + text-align: start; +} +.rd .bro .h2, .rd .bro .lede { margin-top: 14px; } -@media (max-width: 760px) { - .rd .bro { - grid-template-columns: 1fr; - gap: 28px; - } - .rd .bro-cover { - max-width: 240px; - } -} .rd .fs .ctas, .rd .fs .say { margin-top: 20px; @@ -700,50 +392,6 @@ .rd .apr-bar-key .k2.red { background: var(--red); } -.rd .law-notice { - margin: 0 0 20px; -} -.rd .flag-list { - list-style: none; - padding: 0; - margin-top: 40px; -} -.rd .flag-list > li { - padding: 32px 0; - border-top: var(--divider); -} -.rd .flag-list h3 { - font-size: 1.4rem; - margin-bottom: 18px; -} -.rd .flag-list dl { - margin: 0; - display: grid; - grid-template-columns: 1fr 1.3fr 1fr; - gap: 28px; -} -.rd .flag-list dt { - font-size: 0.9rem; - font-weight: 700; - color: var(--purple-deep); - margin-bottom: 6px; -} -.rd .flag-list dd { - margin: 0; - line-height: 1.7; -} -.rd .flag-list dd p + p { - margin-top: 10px; -} -.rd .flag-list q { - font-weight: 600; -} -@media (max-width: 900px) { - .rd .flag-list dl { - grid-template-columns: 1fr; - gap: 16px; - } -} @media (max-width: 760px) { /* Put the contract card above the scene so the day badge can't cover it. */ .rd .yoyo-stage { @@ -761,6 +409,21 @@ white-space: nowrap; } } +@media (max-width: 560px) { + /* The hidden-term strip wraps to two lines here; give it room. */ + .rd .fs-paper-wrap { + padding-bottom: 96px; + } + .rd .fs-hidden { + flex-direction: column; + align-items: flex-start; + gap: 2px; + transform: translateY(-96px); + } + .rd .fs-hidden.out { + transform: none; + } +} /* ---------- Documents ---------- */ .rd .guide-explorer { @@ -779,16 +442,17 @@ } /* ---------- Get Involved ---------- */ -.rd .apply-wrap > * { - max-width: 836px; +.rd .apply-wrap { + max-width: 900px; } .rd ul.roles { list-style: none; padding: 0; } .rd .roles li { - border-top: var(--divider); - padding: 16px 0; + background: var(--bg); + border-radius: 18px; + padding: 22px; } .rd .roles li b { display: block; @@ -817,11 +481,56 @@ } /* ---------- Dealer Map ---------- */ +.rd .nw-img img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} +.rd .news-note { + margin-top: 22px; +} +.rd .vd-launch:focus-visible { + outline: 3px solid var(--purple); + outline-offset: 4px; +} +[dir="rtl"] .rd-hdr .drop { + left: auto; + right: 0; +} +.rd .law-notice { + margin: 0 0 20px; +} + +/* Unruh Act quote under the Home stats heading. */ +.rd .footing-law { + max-width: 760px; + margin: 18px auto 0; + font-size: 0.9rem; + line-height: 1.6; + text-align: center; +} +.rd .footing-law blockquote { + margin: 0; + font-style: italic; +} +.rd .footing-law cite { + display: block; + margin-top: 6px; + font-style: normal; + font-weight: 700; + color: #5e1a6b; +} + +/* ---------- Dealer Map ---------- */ +/* Short disclaimer gate: same card as the prototype's VINdisclaimer, smaller. */ .rd .vd-short { max-width: 680px; + margin: 0 auto; } .rd .vd-short .vd-title { font-size: clamp(1.9rem, 4vw, 2.6rem); + letter-spacing: -0.03em; } .rd .vd-short .vd-lede { font-size: 1.05rem; @@ -855,7 +564,9 @@ width: 100%; height: min(78vh, 760px); min-height: 520px; - border: 1px solid var(--line); + border: 4px solid var(--ink); + border-radius: 24px; + box-shadow: 10px 10px 0 var(--purple); background: #e9e9ee; } .rd .map-embed-links { @@ -876,42 +587,11 @@ .rd .map-embed iframe { height: 78vh; min-height: 480px; + border-width: 3px; + border-radius: 18px; + box-shadow: 6px 6px 0 var(--purple); } } -.rd .news-list { - list-style: none; - padding: 0; - margin-top: 32px; -} -.rd .news-list li { - padding: 26px 0; - border-top: var(--divider); -} -.rd .news-list h3 { - font-size: 1.3rem; - line-height: 1.35; -} -.rd .news-list h3 a { - text-decoration: underline; - text-decoration-color: var(--line); - text-underline-offset: 4px; -} -.rd .news-list h3 a:hover { - color: var(--purple); - text-decoration-color: currentColor; -} -.rd .news-list p { - line-height: 1.7; -} -.rd .news-list .news-by { - margin: 6px 0 10px; - font-size: 0.9rem; - font-weight: 600; - color: var(--purple-deep); -} -.rd .news-list p + p { - margin-top: 8px; -} /* Methods page: plain, text-first. */ .rd .methods { @@ -935,6 +615,7 @@ } .rd .methods h2 { font-size: 1.5rem; + letter-spacing: -0.02em; margin-bottom: 12px; } .rd .methods p, @@ -973,11 +654,12 @@ gap: 12px; } .rd .methods-tiers div { - border-left: 3px solid var(--line); - padding: 4px 0 4px 16px; + background: var(--tint); + border-radius: 14px; + padding: 14px 18px; } .rd .methods-tiers dt { - font-weight: 700; + font-weight: 800; } .rd .methods-tiers dd { margin: 2px 0 0; @@ -996,241 +678,3 @@ .rd .methods-back-end { margin-top: 48px; } - -/* Slight corner radius on the flat design: boxes and buttons get 3px, - small tags 2px. Circles (dots, pins, play buttons) keep 50%. */ -.rd { - --radius-card: 3px; - --radius-btn: 3px; - --radius-tag: 2px; -} -.rd .card, -.rd .cta, -.rd .say, -.rd details, -.rd .campus, -.rd .proj, -.rd .bro, -.rd .bro-cover img, -.rd .flagbox, -.rd .form-ok, -.rd .plan-card, -.rd .roles div, -.rd .roles li, -.rd .methods-tiers div, -.rd .map-embed iframe, -.rd .hero-photo img, -.rd .bg-img, -.rd .avatar, -.rd .avatar-img, -.rd .avatar-play, -.rd .story-meta, -.rd .fv-player, -.rd .vbox-in, -.rd .drop, -.rd-hdr .lang ul, -.rd .apr-controls, -.rd .apr-results, -.rd .apr-verdict, -.rd .fs-chat, -.rd .fs-total, -.rd .yy-contract, -.rd .insp-card, -.rd .insp-done, -.rd .insp-frame, -.rd .insp-view, -.rd .pir, -.rd .pir-cmp div, -.rd .pir-photo, -.rd .pir-score, -.rd .pir-start, -.rd .pv-card, -.rd .pv-photo, -.rd .vd { - border-radius: var(--radius-card); -} -.rd .btn, -.rd .watch, -.rd .vd-go, -.rd .drop a, -.rd .links > li > a, -.rd .track-nav a, -.rd .fld input, -.rd .fld select, -.rd .fld textarea, -.rd .tabs, -.rd .tabs button, -.rd .seg, -.rd .seg button, -.rd .stepper, -.rd .insp-chips button, -.rd .pv-opts button, -.rd .rc-lines button, -.rd .rc-lines li, -.rd #pirState, -.rd-hdr .lang > button, -.rd-hdr .lang li button { - border-radius: var(--radius-btn); -} -.rd .tag, -.rd .bro-soon, -.rd .fv-len, -.rd .tl-now, -.rd .track-nav a b, -.rd .yy-day { - border-radius: var(--radius-tag); -} - -/* Home: pre-purchase inspection explainer. */ -.rd .ppi .offer { - margin-bottom: 32px; -} -.rd .ppi .offer h3 { - font-size: 1.05rem; - margin-bottom: 6px; -} -.rd .ppi-rule { - grid-column: 1 / -1; - border: 0; - border-top: var(--divider); - margin: 0; -} -.rd .ppi-sub { - font-size: clamp(1.5rem, 2.6vw, 2rem); - line-height: 1.2; -} - -/* About: tighten the quote → "What we provide" → closing CTA run. */ -.rd #provide { - padding-top: 0; - padding-bottom: 64px; -} -.rd #provide + .cta { - padding-top: 64px; -} - -/* ---------- Restored from 333659c: About zoom slideshow, scroll tours, chat red flags ---------- */ -.rd .a-hero .center{text-align:center} -.rd .a-hero .center .lede{margin:18px auto 0} -.rd .a-hero{padding-bottom:40px} -.rd .a-hero h1{margin:0 auto} -.rd .scroll-cue{width:26px;height:42px;border:2px solid var(--purple);border-radius:14px;margin:40px auto 0;position:relative} -.rd .scroll-cue span{position:absolute;left:50%;top:8px;width:4px;height:8px;margin-left:-2px;border-radius:2px;background:var(--purple);animation:rd-cue 1.6s infinite} -@keyframes rd-cue{0%{opacity:0;transform:translateY(0)}30%{opacity:1}100%{opacity:0;transform:translateY(14px)}} -.rd .zoom{height:280vh;padding:0;position:relative} -.rd .zoom-sticky{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);height:calc(100vh - 76px);height:calc(100svh - 76px);overflow:hidden} -.rd .zoom-frame{position:absolute;inset:0;--p:0;clip-path:inset(calc((1 - var(--p)) * 14%) calc((1 - var(--p)) * 22%) round calc((1 - var(--p)) * 36px));will-change:clip-path} -.rd .zoom-imgs{position:absolute;inset:0;transform:scale(calc(1.18 - var(--p) * .18));will-change:transform} -.rd .zoom-imgs img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity 1.1s ease} -.rd .zoom-imgs img.on{opacity:1;animation:rd-kb 6s ease-out forwards} -@keyframes rd-kb{from{transform:scale(1.06)}to{transform:scale(1)}} -.rd .zoom-shade{position:absolute;inset:0;background:linear-gradient(180deg,rgba(42,15,49,0) 40%,rgba(42,15,49,.75) 100%);opacity:calc(var(--p) * 1.2)} -.rd .zoom-copy{position:absolute;left:0;right:0;bottom:0;padding:0 max(32px,calc((100% - 1136px)/2)) 64px;color:#fff;opacity:clamp(0,calc((var(--p) - .6) * 3),1);transform:translateY(calc((1 - clamp(0,calc((var(--p) - .6) * 3),1)) * 30px))} -.rd .zoom-copy h2{font-size:clamp(2.2rem,5vw,4rem)} -.rd .zoom-copy p{margin-top:14px;font-size:1.15rem;max-width:540px;line-height:1.6} -.rd .zoom-ctrl{position:absolute;right:max(32px,calc((100% - 1136px)/2));bottom:64px;display:flex;align-items:center;gap:12px;color:#fff;opacity:clamp(0,calc((var(--p) - .6) * 3),1)} -.rd .zoom-count{font-weight:700;font-variant-numeric:tabular-nums} -.rd .zoom-ctrl button{width:40px;height:40px;border-radius:50%;border:2px solid #fff;background:rgba(255,255,255,.12);color:#fff;display:grid;place-items:center;cursor:pointer} -@media (max-width:760px){ -.rd .zoom-copy{padding:0 20px 96px} -.rd .zoom-ctrl{right:20px;bottom:36px} -} -@media (prefers-reduced-motion:reduce){ -.rd .zoom{height:auto} -.rd .zoom-sticky{position:relative;top:0;height:70vh} -.rd .zoom-frame{--p:1!important} -.rd .zoom-imgs img{transition:none} -.rd .zoom-imgs img.on{animation:none} -.rd .scroll-cue span{animation:none} -} -.rd .tour{display:grid;grid-template-columns:1.1fr .9fr;gap:56px;margin-top:48px;align-items:start} -.rd .tour-visual{position:sticky;top:calc(env(safe-area-inset-top,0px) + 100px);z-index:2} -.rd .tour-frame{position:relative;overflow:hidden;border-radius:var(--radius-card);background:var(--tint);box-shadow:0 30px 60px -30px rgba(42,15,49,.45)} -.rd .tour-zoom{position:relative;transform-origin:0 0;transition:transform .9s cubic-bezier(.65,0,.25,1);will-change:transform} -.rd .tour-zoom>img{display:block;width:100%;height:auto;user-select:none} -.rd .tour-zoom .spot{position:absolute;opacity:0;pointer-events:none;box-shadow:0 0 0 3px #fff,0 0 0 6px var(--purple),0 0 0 200vmax rgba(42,15,49,.55);transition:left .9s cubic-bezier(.65,0,.25,1),top .9s cubic-bezier(.65,0,.25,1),width .9s cubic-bezier(.65,0,.25,1),height .9s cubic-bezier(.65,0,.25,1),opacity .5s,border-radius .5s} -.rd .tour-zoom .spot.show{opacity:1} -.rd .tour-hud{position:absolute;left:14px;right:14px;bottom:14px;display:flex;justify-content:space-between;align-items:center;gap:12px;pointer-events:none} -.rd .tour-count{background:#fff;color:var(--ink);font-weight:800;border-radius:var(--radius-tag);padding:6px 14px;font-size:.92rem;font-variant-numeric:tabular-nums;box-shadow:0 6px 16px -8px rgba(42,15,49,.5)} -.rd .tour-dots{display:flex;gap:6px;background:rgba(255,255,255,.9);border-radius:999px;padding:8px 10px} -.rd .tour-dots i{width:8px;height:8px;border-radius:50%;background:var(--tint-2);transition:background .3s,transform .3s} -.rd .tour-dots i.on{background:var(--purple);transform:scale(1.35)} -.rd .tour-steps{display:flex;flex-direction:column} -.rd .tour-step{min-height:78vh;display:flex;align-items:center;padding:6vh 0} -.rd .tour-step:last-child{min-height:88vh} -.rd .tour-intro{min-height:52vh;flex-direction:column;align-items:flex-start;justify-content:center;gap:12px} -.rd .tour-intro p{font-size:1.35rem;font-weight:700;line-height:1.5;max-width:420px} -.rd .tour-arrow{font-size:2rem;color:var(--purple);animation:rd-bob 1.6s ease-in-out infinite} -@keyframes rd-bob{50%{transform:translateY(8px)}} -.rd .tour-card{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-card);padding:32px;opacity:.25;transform:translateX(24px) scale(.97);transition:opacity .5s,transform .5s,box-shadow .5s} -.rd .band .tour-card{border-color:transparent} -.rd .tour-step.on .tour-card{opacity:1;transform:none;box-shadow:0 24px 48px -30px rgba(94,26,107,.45)} -.rd .tour-card h3{font-size:1.6rem;margin:12px 0} -.rd .tour-card p{line-height:1.75} -.rd .tour-card .sub{font-weight:700;margin-bottom:10px;color:var(--purple-deep)} -.rd .tour-card .steps{margin:14px 0 0;padding-left:22px;display:flex;flex-direction:column;gap:8px;line-height:1.65} -.rd .tour-doc .tour-frame{max-width:560px;margin:0 auto} -.rd .doc-mock.tour-zoom{border:0;box-shadow:none;border-radius:0;transition:transform .9s cubic-bezier(.65,0,.25,1)} -@media (max-width:900px){ -.rd .tour{grid-template-columns:1fr;gap:0} -.rd .tour-visual{top:calc(env(safe-area-inset-top,0px) + 76px);background:var(--bg);padding:10px 0 14px;box-shadow:0 14px 16px -12px rgba(42,15,49,.18)} -.rd .band .tour-visual{background:var(--tint)} -.rd .tour-frame{max-height:42vh;width:auto;margin:0 auto} -.rd .tour-doc .tour-frame,.rd .tour-frame[style*="1040/1212"]{width:calc(42vh * 1040 / 1212);max-width:100%} -.rd .tour-step{min-height:70vh} -.rd .tour-card{padding:24px;transform:translateY(20px)} -} -@media (prefers-reduced-motion:reduce){ -.rd .tour-zoom,.rd .tour-zoom .spot,.rd .tour-card{transition:none} -.rd .tour-arrow{animation:none} -} -.rd .chat-phone{width:min(360px,100%);margin:0 auto;border-radius:40px;background:var(--ink);padding:12px;box-shadow:0 30px 60px -24px rgba(94,26,107,.5)} -.rd .chat-top{display:flex;align-items:center;gap:12px;background:#fff;border-radius:28px 28px 0 0;padding:18px 18px 14px;border-bottom:var(--divider)} -.rd .chat-top b{display:block;line-height:1.2} -.rd .chat-top span:not(.chat-av){font-size:.88rem;font-weight:600;color:var(--purple-deep)} -.rd .chat-av{width:38px;height:38px;border-radius:50%;background:var(--tint-2);color:var(--purple-deep);display:grid;place-items:center;font-weight:800} -.rd .chat-body{background:#fbf6fc;border-radius:0 0 28px 28px;min-height:420px;padding:18px 14px;display:flex;flex-direction:column;gap:10px} -.rd .chat-note{align-self:center;font-size:.85rem;font-weight:700;color:var(--purple-deep);background:var(--tint-2);border-radius:999px;padding:4px 12px} -.rd .chat-body .bub{max-width:84%;padding:12px 15px;border-radius:20px;line-height:1.5;font-size:.98rem;animation:rd-pop .35s cubic-bezier(.2,.9,.3,1.3) both} -.rd .chat-body .bub.them{align-self:flex-start;background:#fff;border:1px solid var(--line);border-bottom-left-radius:6px} -.rd .chat-body .bub.me{align-self:flex-end;background:var(--purple);color:#fff;border-bottom-right-radius:6px;font-weight:600} -.rd .chat-body .bub.flagchip{align-self:center;background:#fbe1df;color:#7a1a14;font-weight:700;font-size:.9rem;border-radius:12px;max-width:100%} -.rd .chat-body .bub.flagchip b{margin-right:6px} -@keyframes rd-pop{from{opacity:0;transform:translateY(12px) scale(.9)}to{opacity:1;transform:none}} -.rd .chat-body .typing{display:inline-flex;gap:4px;padding:4px 2px} -.rd .chat-body .typing i{width:7px;height:7px;border-radius:50%;background:currentColor;opacity:.4;animation:rd-blink 1s infinite} -.rd .chat-body .typing i:nth-child(2){animation-delay:.15s} -.rd .chat-body .typing i:nth-child(3){animation-delay:.3s} -@keyframes rd-blink{50%{opacity:1;transform:translateY(-3px)}} -@media (max-width:900px){ -.rd .chat-body{min-height:210px;max-height:240px;overflow:hidden;justify-content:flex-end;padding:12px} -.rd .chat-top{padding:12px 14px 10px} -.rd .chat-phone{border-radius:30px;padding:8px} -.rd .chat-body .bub{font-size:.9rem;padding:9px 12px} -.rd .tour-chat .tour-visual{padding-bottom:10px} -.rd .chat-phone{width:min(340px,100%)} -} -@media (prefers-reduced-motion:reduce){ -.rd .chat-body .bub{animation:none} -.rd .chat-body .typing i{animation:none} -} -.rd .tour-card{opacity:.4} - -/* A section with no top padding that follows a tinted band (or the - header strip) gets its top padding back, so headings never sit right - against the edge above them. */ -.rd .band + section.pt0, -.rd .strip + section.pt0 { - padding-top: 104px; -} -@media (max-width: 768px) { - .rd .band + section.pt0, - .rd .strip + section.pt0 { - padding-top: 72px; - } -} -@media (max-width: 640px) { - .rd-hdr .right { - gap: 6px; - } -} diff --git a/app/redesign.css b/app/redesign.css index a77e319..c66d8c4 100644 --- a/app/redesign.css +++ b/app/redesign.css @@ -1,8 +1,6 @@ /* - * Site styles, scoped under .rd. Started as the redesign prototype's CSS - * and now edited by hand: flat, square corners, no shadows, no gradients, - * no looping animation. - * Next.js-specific fixes live in app/redesign-overrides.css. + * GENERATED by scripts/scope-prototype-css.py from the redesign prototype. + * Do not edit by hand: put adjustments in app/redesign-overrides.css. */ /* Pages that use the redesign get a white canvas and no grain overlay. */ @@ -17,21 +15,19 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- --purple-dark:#7d2a8b; --purple-deep:#5e1a6b; --ink:#2a0f31; - --tint:#f5f4f2; - --band:#f5f4f2; + --tint:#f6ecf8; --tint-2:#ecd6f0; --bg:#ffffff; --line:#e5cfe9; - --divider:3px solid var(--purple-deep); --red:#b3261e; --amber:#8a5a00; --green:#1d6b3a; - --font:var(--font-jakarta),"Plus Jakarta Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif} + --font:var(--font-jakarta),"Plus Jakarta Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;} .rd *,.rd *::before,.rd *::after{box-sizing:inherit} .rd{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font);font-size:17px;line-height:1.65;-webkit-font-smoothing:antialiased} .rd a{color:inherit;text-decoration:none} -.rd a:focus-visible,.rd button:focus-visible,.rd select:focus-visible,.rd input:focus-visible,.rd textarea:focus-visible,.rd summary:focus-visible{outline:3px solid var(--purple);outline-offset:3px} -.rd h1,.rd h2,.rd h3,.rd h4{margin:0;font-weight:700;letter-spacing:normal;line-height:1.15} +.rd a:focus-visible,.rd button:focus-visible,.rd select:focus-visible,.rd input:focus-visible,.rd textarea:focus-visible,.rd summary:focus-visible{outline:3px solid var(--purple);outline-offset:3px;border-radius:8px} +.rd h1,.rd h2,.rd h3,.rd h4{margin:0;font-weight:800;letter-spacing:-.025em;line-height:1.1} .rd p{margin:0} .rd img{max-width:100%} .rd .wrap{max-width:1200px;margin:0 auto;padding:0 32px} @@ -43,19 +39,27 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd section{padding:72px 0} } .rd .pt0{padding-top:0} -.rd .btn{display:inline-flex;align-items:center;justify-content:center;padding:15px 28px;font-weight:700;font-size:1rem;border:2px solid var(--purple);transition:background .2s,color .2s;cursor:pointer;font-family:inherit} +.rd .btn{display:inline-flex;align-items:center;justify-content:center;padding:15px 28px;border-radius:999px;font-weight:700;font-size:1rem;border:2px solid var(--purple);transition:background .2s,color .2s;cursor:pointer;font-family:inherit} .rd .btn-solid{background:var(--purple);color:#fff} .rd .btn-solid:hover{background:var(--purple-dark);border-color:var(--purple-dark)} .rd .btn-line{color:var(--purple-deep);background:transparent} -.rd .btn-line:hover{border-color:var(--purple-dark);color:var(--purple-dark)} - +.rd .btn-line:hover{background:var(--tint)} +.rd .btn-white{background:#fff;color:var(--purple);border-color:#fff} +.rd .btn-white:hover{background:var(--tint)} +.rd .btn-ghost-white{border-color:#fff;color:#fff;background:transparent} +.rd .btn-ghost-white:hover{background:rgba(255,255,255,.12)} .rd .ctas{display:flex;gap:14px;flex-wrap:wrap} .rd .h2{font-size:clamp(2rem,4vw,3rem)} .rd .h2 span,.rd .phero h1 span{color:inherit} .rd .lede{font-size:1.15rem;line-height:1.7;max-width:660px} -.rd .band{background:var(--band)} - -.rd .card{background:var(--bg);border:1px solid var(--line);padding:32px} +.rd .center{text-align:center} +.rd .center .lede{margin:18px auto 0} +.rd .band{background:var(--tint)} +.rd .ph{display:flex;align-items:flex-end;border-radius:24px;overflow:hidden;background: + radial-gradient(circle at 25% 25%,rgba(255,255,255,.35),transparent 50%), + linear-gradient(140deg,#b75cc6,#5e1a6b);color:#fff} +.rd .ph span{padding:18px 22px;font-weight:600;line-height:1.45} +.rd .card{background:var(--bg);border:1px solid var(--line);border-radius:24px;padding:32px} @media (max-width:640px){ .rd .card{padding:24px} } @@ -70,41 +74,41 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .mt48{margin-top:48px} .rd .mt56{margin-top:56px} .rd .mt24{margin-top:24px} - -.rd .tag{display:inline-block;font-size:.85rem;font-weight:700;color:var(--purple-deep)} -.rd .say{margin-top:16px;background:var(--tint);padding:14px 16px;font-weight:700;line-height:1.5} +.rd .icon{width:60px;height:60px;border-radius:18px;background:var(--tint-2);display:grid;place-items:center;margin-bottom:22px} +.rd .tag{display:inline-block;font-size:.85rem;font-weight:700;padding:5px 12px;border-radius:999px;background:var(--tint-2);color:var(--purple-deep)} +.rd .say{margin-top:16px;background:var(--tint);border-radius:14px;padding:14px 16px;font-weight:700;line-height:1.5} .rd .band .say{background:var(--bg)} -.rd-hdr{position:sticky;top:env(safe-area-inset-top,0px);z-index:40;background:transparent;padding:8px 0} +.rd-hdr{position:sticky;top:env(safe-area-inset-top,0px);z-index:40;background:rgba(255,255,255,.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)} .rd .nav{display:flex;align-items:center;justify-content:space-between;height:76px} -.rd .logo{display:flex;align-items:center;gap:10px;font-weight:700;font-size:1.35rem} +.rd .logo{display:flex;align-items:center;gap:10px;font-weight:800;font-size:1.35rem;letter-spacing:-.02em} +.rd .mark{width:36px;height:36px;border-radius:11px;background:var(--purple);display:grid;place-items:center} .rd .logo-img{height:46px;width:auto;display:block} .rd-ftr .logo-img{height:56px} .rd .links{display:flex;gap:6px;align-items:center;font-weight:600;font-size:.98rem;list-style:none;margin:0;padding:0} .rd .links>li{position:relative} -.rd .links>li>a{display:block;padding:9px 14px} -.rd .links>li>a:hover,.rd .links>li>a.active{text-decoration:underline;text-underline-offset:6px;text-decoration-thickness:2px} -.rd .links>li>a.active{color:var(--purple)} -.rd .drop{position:absolute;top:100%;left:0;min-width:230px;padding:10px;background:#fff;border:1px solid var(--line);display:none;flex-direction:column} +.rd .links>li>a{display:block;padding:9px 14px;border-radius:999px} +.rd .links>li>a:hover,.rd .links>li>a.active{color:var(--purple);background:var(--tint)} +.rd .drop{position:absolute;top:100%;left:0;min-width:230px;padding:10px;background:#fff;border:1px solid var(--line);border-radius:16px;box-shadow:0 20px 40px -20px rgba(42,15,49,.3);display:none;flex-direction:column} .rd .links>li:hover .drop,.rd .links>li:focus-within .drop{display:flex} -.rd .drop a{padding:10px 12px} -.rd .drop a:hover{text-decoration:underline;text-underline-offset:4px} +.rd .drop a{padding:10px 12px;border-radius:10px} +.rd .drop a:hover{background:var(--tint);color:var(--purple)} .rd .links .btn{margin-left:10px;padding:11px 22px} .rd .burger{display:none;background:none;border:0;color:var(--ink);cursor:pointer;padding:6px} @media (max-width:980px){ .rd .links{display:none} .rd .burger{display:block} -.rd-hdr.open .links{display:flex;flex-direction:column;align-items:stretch;gap:2px;position:absolute;top:76px;left:0;right:0;background:#fff;padding:14px 20px 24px;border-bottom:var(--divider);max-height:calc(100vh - 76px);overflow:auto} -.rd-hdr.open .drop{display:flex;position:static;border:0;padding:0 0 6px 14px} +.rd-hdr.open .links{display:flex;flex-direction:column;align-items:stretch;gap:2px;position:absolute;top:76px;left:0;right:0;background:#fff;padding:14px 20px 24px;border-bottom:1px solid var(--line);max-height:calc(100vh - 76px);overflow:auto} +.rd-hdr.open .drop{display:flex;position:static;border:0;box-shadow:none;padding:0 0 6px 14px} .rd .links .btn{margin:10px 0 0} } -.rd .phero{padding:88px 0 64px} +.rd .phero{padding:96px 0 88px;background:linear-gradient(180deg,var(--tint) 0%,var(--bg) 100%)} .rd .phero h1{font-size:clamp(2.6rem,5.4vw,4.2rem);max-width:900px} .rd .phero p{margin-top:24px;font-size:1.2rem;max-width:660px;line-height:1.7} .rd .phero .ctas{margin-top:32px} @media (max-width:768px){ .rd .phero{padding:64px 0 56px} } -.rd .hero{padding:80px 0 88px} +.rd .hero{padding:88px 0 96px;background:linear-gradient(180deg,var(--tint) 0%,var(--bg) 100%);overflow:hidden} .rd .hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center} @media (max-width:960px){ .rd .hero-grid{grid-template-columns:1fr} @@ -118,28 +122,58 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .rot-caret.busy{animation:none} @keyframes rd-caret{50%{opacity:0}} .rd .hero p{margin:26px 0 34px;font-size:1.2rem;max-width:540px} - -.rd .strip{padding:40px 0;border-block:var(--divider)} +.rd .hero-art{width:100%;height:auto;max-width:600px;justify-self:center} +.rd .hero-art .hb-card{animation:rd-hb-float 6s ease-in-out infinite;transform-box:fill-box} +.rd .hero-art .hb-c2{animation-delay:-2s} +.rd .hero-art .hb-c3{animation-delay:-4s} +@keyframes rd-hb-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}} +@media (prefers-reduced-motion:reduce){ +.rd .hero-art .hb-card{animation:none} +} +.rd .strip{padding:40px 0;border-block:1px solid var(--line)} .rd .strip-in{display:flex;align-items:center;gap:40px;flex-wrap:wrap;justify-content:space-between} -.rd .sources{display:flex;gap:36px;flex-wrap:wrap;font-weight:700;font-size:1.05rem;color:var(--purple-deep)} -.rd .what{display:grid;grid-template-columns:.9fr 1.1fr;gap:64px;align-items:start} +.rd .strip h4{font-size:1rem;font-weight:700;letter-spacing:0} +.rd .sources{display:flex;gap:36px;flex-wrap:wrap;font-weight:800;font-size:1.05rem;color:var(--purple-deep)} +.rd .what{display:grid;grid-template-columns:1fr 1fr;gap:72px;align-items:center} @media (max-width:960px){ .rd .what{grid-template-columns:1fr;gap:48px} } - -.rd .big{font-size:clamp(2.6rem,5vw,3.6rem);font-weight:700;color:var(--purple);line-height:1} - -.rd .tabs{display:flex;border-bottom:var(--divider);gap:4px;flex-wrap:wrap} -.rd .tabs button{border:0;border-bottom:3px solid transparent;margin-bottom:-3px;background:transparent;font:inherit;font-weight:700;color:var(--ink);padding:12px 18px;cursor:pointer} -.rd .tabs button[aria-selected="true"]{color:var(--purple);border-bottom-color:var(--purple)} -.rd .story{display:grid;grid-template-columns:.8fr 1.2fr;gap:56px;align-items:start;margin-top:40px} +.rd .what .lede{margin:22px 0 32px} +.rd .phone-stage{display:flex;justify-content:center;padding:20px 0} +.rd .phone{width:280px;aspect-ratio:9/18;border-radius:44px;background:var(--ink);padding:12px;box-shadow:0 30px 60px -20px rgba(94,26,107,.45)} +.rd .screen{height:100%;border-radius:34px;background:linear-gradient(170deg,#c67bd3,#6d2279);padding:56px 14px 14px;display:flex;flex-direction:column;gap:10px} +.rd .clock{color:#fff;text-align:center;font-weight:700;font-size:3rem;letter-spacing:-.03em;margin-bottom:18px} +.rd .notif{background:rgba(255,255,255,.95);color:#2a0f31;border-radius:18px;padding:12px 14px;font-size:.86rem;line-height:1.4;opacity:0;transform:translateY(16px);transition:opacity .5s,transform .5s} +.rd .notif.show{opacity:1;transform:none} +.rd .notif b{display:flex;justify-content:space-between;font-size:.8rem;margin-bottom:3px} +.rd .notif b i{font-style:normal;font-weight:500} +.rd .rows{display:flex;flex-direction:column;gap:72px;margin-top:72px} +.rd .row{display:grid;grid-template-columns:1fr 1fr;gap:72px;align-items:center} +.rd .row:nth-child(even) .row-art{order:2} +@media (max-width:860px){ +.rd .row{grid-template-columns:1fr;gap:28px} +.rd .row:nth-child(even) .row-art{order:0} +} +.rd .row-art{background:var(--tint);border-radius:28px;aspect-ratio:4/3;display:grid;place-items:center;padding:28px} +.rd .row-art svg{width:100%;max-width:340px;height:auto} +.rd .big{font-size:clamp(3rem,6vw,4.6rem);font-weight:800;color:var(--purple);letter-spacing:-.04em;line-height:1} +.rd .row h3{font-size:1.5rem;margin:14px 0} +.rd .row p{font-size:1.1rem;line-height:1.75} +.rd .row cite{display:block;margin-top:14px;font-style:normal;font-weight:600;color:var(--purple-deep)} +.rd .pcard{background:var(--bg);border-radius:24px;padding:36px 30px} +.rd .pcard h3{font-size:1.5rem;margin-bottom:12px} +.rd .pcard p{font-size:1.05rem;line-height:1.7} +.rd .tabs{display:inline-flex;background:var(--tint);border-radius:999px;padding:6px;gap:4px;flex-wrap:wrap;justify-content:center} +.rd .tabs button{border:0;background:transparent;font:inherit;font-weight:700;color:var(--ink);padding:11px 22px;border-radius:999px;cursor:pointer} +.rd .tabs button[aria-selected="true"]{background:var(--purple);color:#fff} +.rd .story{display:grid;grid-template-columns:.8fr 1.2fr;gap:56px;align-items:start;margin-top:48px;text-align:left} @media (max-width:900px){ .rd .story{grid-template-columns:1fr;gap:28px} } -.rd .story-meta{border-top:3px solid var(--purple);padding-top:20px} -.rd .story-meta .n{font-size:3rem;font-weight:700;line-height:1;color:var(--purple)} -.rd .story-meta h3{font-size:1.6rem} -.rd .story-meta p{margin-top:10px;font-weight:600;color:var(--purple-deep)} +.rd .story-meta{background:var(--purple);color:#fff;border-radius:28px;padding:36px} +.rd .story-meta .n{font-size:4rem;font-weight:800;line-height:1;letter-spacing:-.04em} +.rd .story-meta h3{font-size:1.8rem;margin-top:14px} +.rd .story-meta p{margin-top:12px;font-weight:600} .rd .story-body p{font-size:1.1rem;line-height:1.8;margin-bottom:16px} .rd .pull{margin-top:24px;border-left:4px solid var(--purple);padding:6px 0 6px 22px;font-size:1.2rem;font-weight:700;line-height:1.55} .rd .pull cite{display:block;font-style:normal;font-weight:600;font-size:1rem;margin-top:10px;color:var(--purple-deep)} @@ -149,36 +183,166 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .plan{grid-template-columns:1fr;gap:36px} } .rd .plan .lede{margin-top:18px} -.rd .plan-card{border:1px solid var(--line);padding:40px;background:var(--bg)} +.rd .plan-card{border:2px solid var(--purple);border-radius:28px;padding:40px;background:var(--bg)} @media (max-width:640px){ .rd .plan-card{padding:28px} } -.rd .plan-head{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:10px;padding-bottom:22px;border-bottom:var(--divider);margin-bottom:24px} +.rd .plan-head{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:10px;padding-bottom:22px;border-bottom:1px solid var(--line);margin-bottom:24px} .rd .plan-head h3{font-size:1.6rem} -.rd .price{font-size:2.4rem;font-weight:700;color:var(--purple)} +.rd .price{font-size:2.4rem;font-weight:800;color:var(--purple);letter-spacing:-.03em} .rd .checks{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:1fr 1fr;gap:16px 28px} @media (max-width:640px){ .rd .checks{grid-template-columns:1fr} } .rd .checks li{display:flex;gap:12px;font-weight:600;line-height:1.45} .rd .checks svg{flex:0 0 22px;margin-top:1px} -.rd .offer{display:grid;grid-template-columns:1fr 1fr;gap:20px 28px;margin-top:28px;padding-top:24px;border-top:var(--divider)} +.rd .offer{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:28px} @media (max-width:640px){ .rd .offer{grid-template-columns:1fr} } -.rd .offer h4{font-size:1.05rem;margin-bottom:6px} +.rd .offer div{background:var(--tint);border-radius:18px;padding:20px} +.rd .offer h4{font-size:1.05rem;letter-spacing:-.01em;margin-bottom:6px} .rd .offer p{font-size:.98rem;line-height:1.6} -.rd .cta{border-top:var(--divider)} +.rd .cta{background:var(--purple);color:#fff;border-radius:36px;padding:72px 64px;display:grid;grid-template-columns:1.3fr .7fr;gap:40px;align-items:center} @media (max-width:860px){ +.rd .cta{grid-template-columns:1fr;padding:48px 28px} } .rd .cta h2{font-size:clamp(2rem,3.6vw,2.8rem)} -.rd .cta p{margin:16px 0 28px} - -.rd .ai-src{margin-top:24px;font-weight:600;color:var(--purple-deep);font-size:.95rem} - +.rd .cta p{margin:18px 0 30px;font-size:1.15rem;max-width:560px} +.rd .cta svg{width:100%;max-width:260px;justify-self:center} +.rd .split{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center} +@media (max-width:900px){ +.rd .split{grid-template-columns:1fr;gap:36px} +} +.rd .split .ph{aspect-ratio:5/4} +.rd .split p{margin:18px 0;font-size:1.1rem;line-height:1.75} +.rd .chips{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:30px} +.rd .chips span{background:var(--tint);border-radius:999px;padding:8px 16px;font-weight:700;font-size:.95rem} +.rd .why-done{margin-top:56px;font-size:clamp(1.4rem,2.6vw,2rem);font-weight:800;letter-spacing:-.02em;text-align:center} +.rd .why-done strong{color:var(--purple)} +.rd .mgrid{display:grid;grid-template-columns:1.1fr 1fr;gap:64px;align-items:center;margin-top:56px} +@media (max-width:960px){ +.rd .mgrid{grid-template-columns:1fr;gap:36px} +} +.rd .mgrid .ph{aspect-ratio:618/1080;max-height:640px} +@media (max-width:960px){ +.rd .mgrid .ph{aspect-ratio:4/3} +} +.rd .mlist{display:flex;flex-direction:column;gap:20px} +.rd .mitem{display:grid;grid-template-columns:60px 1fr;gap:20px;align-items:start;background:var(--bg);border-radius:24px;padding:28px} +.rd .mitem .icon{margin:0} +.rd .mitem h3{font-size:1.5rem;margin-bottom:8px} +.rd .timeline{position:relative;max-width:860px;margin:56px auto 0;display:flex;flex-direction:column;gap:28px} +.rd .tl{display:grid;grid-template-columns:88px 1fr;gap:28px} +@media (max-width:640px){ +.rd .tl{grid-template-columns:1fr;gap:14px} +} +.rd .tl-n{width:88px;height:88px;border-radius:24px;background:var(--purple);color:#fff;display:grid;place-items:center;font-weight:800;font-size:1.8rem} +.rd .tl .card h3{font-size:1.6rem;margin-bottom:14px} +.rd .tl .card p{font-size:1.05rem;line-height:1.8;margin-bottom:12px} +.rd .quote-band{background:var(--purple-deep);color:#fff;border-radius:36px;padding:72px 64px;text-align:center} +@media (max-width:768px){ +.rd .quote-band{padding:48px 28px} +} +.rd .quote-band p{font-size:clamp(1.5rem,3vw,2.2rem);font-weight:700;letter-spacing:-.02em;line-height:1.35;max-width:880px;margin:0 auto} +.rd .quote-band cite{display:block;margin-top:22px;font-style:normal;font-weight:600} +.rd .carousel{position:relative;border-radius:24px;overflow:hidden} +.rd .slides{display:flex;transition:transform .6s ease} +.rd .slides .ph{flex:0 0 100%;height:clamp(300px,42vw,520px);border-radius:0} +.rd .slides img{flex:0 0 100%;width:100%;height:clamp(300px,46vw,560px);object-fit:cover;object-position:center 55%;display:block} +.rd .slides.berk img{object-position:center 72%} +.rd .mphoto{width:100%;aspect-ratio:4/3;object-fit:cover;object-position:center 70%;border-radius:24px;display:block} +.rd .dots{position:absolute;bottom:18px;right:20px;display:flex;gap:8px} +.rd .dots button{width:11px;height:11px;border-radius:50%;border:2px solid #fff;background:transparent;padding:0;cursor:pointer} +.rd .dots button[aria-current="true"]{background:#fff} +.rd .video{aspect-ratio:16/9;align-items:center;justify-content:center;flex-direction:column;text-align:center} +.rd .play{width:68px;height:68px;border-radius:50%;background:#fff;display:grid;place-items:center;margin-bottom:6px} +.rd .aisteps{display:grid;grid-template-columns:repeat(4,1fr);gap:24px} +@media (max-width:1000px){ +.rd .aisteps{grid-template-columns:1fr 1fr} +} +@media (max-width:560px){ +.rd .aisteps{grid-template-columns:1fr} +} +.rd .aistep{background:var(--bg);border-radius:24px;padding:18px 18px 28px} +.rd .aistep-art{background:var(--tint);border-radius:18px;aspect-ratio:24/17;display:grid;place-items:center;margin-bottom:22px} +.rd .aistep-art svg{width:100%;height:auto} +.rd .aistep h3{font-size:1.2rem;padding:0 8px;margin-bottom:8px;letter-spacing:-.015em} +.rd .aistep p{padding:0 8px;line-height:1.6;font-size:.98rem} +.rd .ai-src{text-align:center;margin-top:24px;font-weight:600;color:var(--purple-deep);font-size:.95rem} +.rd .ai-bottom{display:grid;grid-template-columns:.85fr 1.15fr;gap:24px;margin-top:48px;align-items:stretch} +@media (max-width:900px){ +.rd .ai-bottom{grid-template-columns:1fr} +} +.rd .ai-save{background:var(--bg);border-radius:28px;padding:40px;display:flex;flex-direction:column;align-items:flex-start;gap:12px} +.rd .ai-save h3{font-size:1.5rem} +.rd .ai-save p{line-height:1.7;flex:1} +.rd .ai-tips h3{font-size:1.6rem} .rd .checks.one{grid-template-columns:1fr} .rd .checks.one li{font-weight:500} - +.rd .a-hero{padding-bottom:40px} +.rd .a-hero h1{margin:0 auto} +.rd .scroll-cue{width:26px;height:42px;border:2px solid var(--purple);border-radius:14px;margin:40px auto 0;position:relative} +.rd .scroll-cue span{position:absolute;left:50%;top:8px;width:4px;height:8px;margin-left:-2px;border-radius:2px;background:var(--purple);animation:rd-cue 1.6s infinite} +@keyframes rd-cue{0%{opacity:0;transform:translateY(0)}30%{opacity:1}100%{opacity:0;transform:translateY(14px)}} +.rd .zoom{height:280vh;padding:0;position:relative} +.rd .zoom-sticky{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);height:calc(100vh - 76px);height:calc(100svh - 76px);overflow:hidden} +.rd .zoom-frame{position:absolute;inset:0;--p:0;clip-path:inset(calc((1 - var(--p)) * 14%) calc((1 - var(--p)) * 22%) round calc((1 - var(--p)) * 36px));will-change:clip-path} +.rd .zoom-imgs{position:absolute;inset:0;transform:scale(calc(1.18 - var(--p) * .18));will-change:transform} +.rd .zoom-imgs img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity 1.1s ease} +.rd .zoom-imgs img.on{opacity:1;animation:rd-kb 6s ease-out forwards} +@keyframes rd-kb{from{transform:scale(1.06)}to{transform:scale(1)}} +.rd .zoom-shade{position:absolute;inset:0;background:linear-gradient(180deg,rgba(42,15,49,0) 40%,rgba(42,15,49,.75) 100%);opacity:calc(var(--p) * 1.2)} +.rd .zoom-copy{position:absolute;left:0;right:0;bottom:0;padding:0 max(32px,calc((100% - 1136px)/2)) 64px;color:#fff;opacity:clamp(0,calc((var(--p) - .6) * 3),1);transform:translateY(calc((1 - clamp(0,calc((var(--p) - .6) * 3),1)) * 30px))} +.rd .zoom-copy h2{font-size:clamp(2.2rem,5vw,4rem)} +.rd .zoom-copy p{margin-top:14px;font-size:1.15rem;max-width:540px;line-height:1.6} +.rd .zoom-ctrl{position:absolute;right:max(32px,calc((100% - 1136px)/2));bottom:64px;display:flex;align-items:center;gap:12px;color:#fff;opacity:clamp(0,calc((var(--p) - .6) * 3),1)} +.rd .zoom-count{font-weight:700;font-variant-numeric:tabular-nums} +.rd .zoom-ctrl button{width:40px;height:40px;border-radius:50%;border:2px solid #fff;background:rgba(255,255,255,.12);color:#fff;display:grid;place-items:center;cursor:pointer} +@media (max-width:760px){ +.rd .zoom-copy{padding:0 20px 96px} +.rd .zoom-ctrl{right:20px;bottom:36px} +} +@media (prefers-reduced-motion:reduce){ +.rd .zoom{height:auto} +.rd .zoom-sticky{position:relative;top:0;height:70vh} +.rd .zoom-frame{--p:1!important} +.rd .zoom-imgs img{transition:none} +.rd .zoom-imgs img.on{animation:none} +.rd .scroll-cue span{animation:none} +} +.rd .pillar-lg{padding:8px 4px} +.rd .pillar-lg h3{font-size:1.7rem;margin-bottom:10px} +.rd .pillar-lg p{font-size:1.08rem;line-height:1.7} +.rd .founder{display:grid;grid-template-columns:.9fr 1.1fr;gap:64px;align-items:start} +@media (max-width:900px){ +.rd .founder{grid-template-columns:1fr;gap:36px} +} +.rd .founder-side{position:sticky;top:120px} +@media (max-width:900px){ +.rd .founder-side{position:static} +} +.rd .founder-side .lede{margin-top:18px} +.rd .strikes{display:flex;flex-direction:column;gap:20px} +.rd .strike-card{background:var(--bg);border-radius:24px;padding:32px;opacity:.35;transform:translateY(24px);transition:opacity .6s,transform .6s} +.rd .strike-card.in{opacity:1;transform:none} +@media (prefers-reduced-motion:reduce){ +.rd .strike-card{opacity:1;transform:none;transition:none} +} +.rd .strike-top{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px} +.rd .strike-n{font-size:2.6rem;font-weight:800;color:var(--purple);letter-spacing:-.04em;line-height:1} +.rd .strike-card h3{font-size:1.5rem;margin-bottom:10px} +.rd .strike-card p{font-size:1.05rem;line-height:1.75} +.rd .provide4{display:grid;grid-template-columns:repeat(4,1fr);gap:20px} +@media (max-width:1000px){ +.rd .provide4{grid-template-columns:1fr 1fr} +} +@media (max-width:560px){ +.rd .provide4{grid-template-columns:1fr} +} +.rd .provide4 .pcard{padding:30px 26px} +.rd .provide4 .pcard h3{font-size:1.3rem} +.rd .provide4 .pcard p{font-size:1rem} .rd .filters{margin-top:36px} .rd .team{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;margin-top:48px} @media (max-width:1000px){ @@ -188,24 +352,52 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .team{grid-template-columns:1fr} } .rd .member{display:flex;flex-direction:column;gap:14px} -.rd .avatar{width:84px;height:84px;background:var(--tint-2);color:var(--purple-deep);display:grid;place-items:center;font-weight:700;font-size:1.6rem} -.rd .member h3{font-size:1.3rem} +.rd .avatar{width:84px;height:84px;border-radius:24px;background:var(--tint-2);color:var(--purple-deep);display:grid;place-items:center;font-weight:800;font-size:1.6rem} +.rd .member h3{font-size:1.3rem;letter-spacing:-.015em} .rd .member .role{font-weight:700;color:var(--purple)} .rd .member .school{font-weight:600;font-size:.95rem} .rd .member p.bio{font-size:1rem;line-height:1.65} .rd .member button.more{align-self:flex-start;background:none;border:0;padding:0;font:inherit;font-weight:700;color:var(--purple);cursor:pointer} .rd .member .ln{font-weight:700;color:var(--purple);font-size:.95rem} - +.rd .study{display:grid;grid-template-columns:260px 1fr;gap:40px} +@media (max-width:860px){ +.rd .study{grid-template-columns:1fr;gap:20px} +} +.rd .study-meta{display:flex;flex-direction:column;gap:10px;font-weight:600} +.rd .study-meta .n{font-size:3.4rem;font-weight:800;color:var(--purple);letter-spacing:-.04em;line-height:1} +.rd .study h3{font-size:1.6rem;margin-bottom:14px} +.rd .study p{font-size:1.05rem;line-height:1.8;margin-bottom:14px} +.rd .tags{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px} +.rd .statset{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:22px} +@media (max-width:760px){ +.rd .statset{grid-template-columns:1fr} +} +.rd .statset .card{padding:28px} +.rd .statset .big{font-size:clamp(2.4rem,4vw,3.2rem)} +.rd .statset p{margin-top:12px;line-height:1.6} +.rd .cites .card h4{font-size:1rem;letter-spacing:0;color:var(--purple);margin-bottom:10px} +.rd .cites .card p{line-height:1.7} +.rd .cites .card p+p{margin-top:10px} .rd .projects{display:grid;grid-template-columns:repeat(3,1fr);gap:24px} @media (max-width:1000px){ .rd .projects{grid-template-columns:1fr;max-width:640px;margin:0 auto} } - -.rd .proj{display:flex;flex-direction:column;gap:14px} +.rd .proj{display:flex;flex-direction:column;gap:16px;background:var(--bg);border:1px solid var(--line);border-radius:24px;padding:32px;transition:border-color .2s,box-shadow .2s} +.rd .proj:hover{border-color:var(--purple);box-shadow:0 24px 48px -28px rgba(94,26,107,.45)} +.rd .proj-head{display:flex;justify-content:space-between;align-items:flex-start} +.rd .proj-head .icon{margin:0} .rd .proj h3{font-size:1.6rem} .rd .proj-desc{line-height:1.7;flex:1} -.rd .proj-meta{display:flex;flex-direction:column;gap:10px;padding-top:18px;border-top:var(--divider);margin:0} - +.rd .proj-meta{display:flex;flex-direction:column;gap:14px;padding-top:18px;border-top:1px solid var(--line)} +.rd .proj-row{display:grid;grid-template-columns:22px 1fr;gap:12px;align-items:start;color:var(--purple-deep)} +.rd .proj-row svg{margin-top:3px} +.rd .proj-row b{color:var(--ink)} +.rd .chips-sm{display:flex;flex-wrap:wrap;gap:6px} +.rd .chips-sm span{background:var(--tint);color:var(--ink);border-radius:999px;padding:4px 12px;font-size:.9rem;font-weight:600} +.rd .seats{display:flex;gap:4px;margin-top:8px} +.rd .seats i{width:14px;height:14px;border-radius:50%;background:var(--tint-2)} +.rd .seats i.f{background:var(--purple)} +.rd .seats i.r{background:#c98fd4} .rd .proj-btn{margin-top:6px;align-self:stretch} .rd .notlist{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:32px} @media (max-width:760px){ @@ -217,11 +409,19 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (max-width:960px){ .rd .explorer{grid-template-columns:1fr} } - +.rd .stage{position:relative;border-radius:24px;overflow:hidden;background:var(--tint);border:1px solid var(--line)} +.rd .stage svg{display:block;width:100%;height:auto} +.rd .pin{position:absolute;transform:translate(-50%,-50%);width:36px;height:36px;border-radius:50%;border:3px solid #fff;background:var(--purple);color:#fff;font-weight:800;font-size:.95rem;cursor:pointer;box-shadow:0 6px 16px -4px rgba(42,15,49,.5);font-family:inherit} +.rd .pin[aria-pressed="true"]{background:var(--ink);transform:translate(-50%,-50%) scale(1.15)} +.rd .panel{background:var(--bg);border:1px solid var(--line);border-radius:24px;padding:32px;min-height:320px} +.rd .panel h3{font-size:1.5rem;margin:12px 0} +.rd .panel p{line-height:1.75} +.rd .panel .empty{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:12px;min-height:250px;font-weight:600;font-size:1.1rem} .rd .sev-easy{background:#e3f3e8;color:var(--green)} .rd .sev-watch{background:#fbefd5;color:var(--amber)} .rd .sev-red{background:#fbe1df;color:var(--red)} .rd .sev-know{background:var(--tint-2);color:var(--purple-deep)} +.rd .legend{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px} .rd .where .card h3{font-size:1.35rem;margin-bottom:12px} .rd .where .card p{line-height:1.7} .rd .where .card p+p{margin-top:10px} @@ -229,24 +429,64 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (max-width:760px){ .rd .brands{grid-template-columns:1fr 1fr} } -.rd .brands a{border:1px solid var(--line);padding:22px;font-weight:700;font-size:1.1rem;text-align:center;background:var(--bg);transition:border-color .2s,color .2s} +.rd .brands a{border:1px solid var(--line);border-radius:18px;padding:22px;font-weight:800;font-size:1.1rem;text-align:center;background:var(--bg);transition:border-color .2s,color .2s} .rd .brands a:hover{border-color:var(--purple);color:var(--purple)} .rd .acc{display:flex;flex-direction:column;gap:14px;margin-top:48px;max-width:900px} -.rd details{background:var(--bg);border:1px solid var(--line);padding:0 28px} -.rd summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:16px;padding:24px 0;font-weight:700;font-size:1.2rem} +.rd details{background:var(--bg);border:1px solid var(--line);border-radius:20px;padding:0 28px} +.rd summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:16px;padding:24px 0;font-weight:800;font-size:1.2rem;letter-spacing:-.015em} .rd summary::-webkit-details-marker{display:none} .rd summary::after{content:"+";font-size:1.6rem;font-weight:500;color:var(--purple);line-height:1} .rd details[open] summary::after{content:"–"} .rd details .body{padding:0 0 26px;line-height:1.75} .rd details ul{margin:10px 0 0;padding-left:20px;display:flex;flex-direction:column;gap:8px} - -.rd .alert{margin-top:32px;border-left:4px solid var(--purple);background:var(--band);padding:22px 26px;line-height:1.7} +.rd .road{display:grid;grid-template-columns:repeat(6,1fr);gap:0;margin-top:56px;position:relative} +.rd .road::before{content:"";position:absolute;top:28px;left:8%;right:8%;height:6px;background:repeating-linear-gradient(90deg,var(--purple) 0 22px,transparent 22px 36px);border-radius:3px} +.rd .stop{position:relative;display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center;background:none;border:0;font:inherit;color:var(--ink);cursor:pointer;padding:0 6px} +.rd .stop .dot{width:62px;height:62px;border-radius:50%;background:#fff;border:4px solid var(--purple);display:grid;place-items:center;font-weight:800;font-size:1.2rem;color:var(--purple);transition:background .2s,color .2s} +.rd .stop[aria-pressed="true"] .dot{background:var(--purple);color:#fff} +.rd .stop b{font-size:.98rem;line-height:1.35} +@media (max-width:860px){ +.rd .road{grid-template-columns:1fr;gap:14px} +.rd .road::before{display:none} +.rd .stop{flex-direction:row;text-align:left} +.rd .stop .dot{flex:0 0 52px;width:52px;height:52px} +} +.rd .road-panel{margin-top:32px;max-width:760px;margin-left:auto;margin-right:auto} +.rd .alert{margin-top:32px;border-left:4px solid var(--purple);background:var(--tint);border-radius:0 18px 18px 0;padding:22px 26px;line-height:1.7} .rd .alert b{display:block;margin-bottom:4px} - +.rd .flags{display:flex;flex-wrap:wrap;gap:12px;margin-top:40px} +.rd .flags button{display:flex;align-items:center;gap:12px;border:1px solid var(--line);background:#fff;border-radius:999px;padding:10px 20px 10px 10px;font:inherit;font-weight:700;color:var(--ink);cursor:pointer} +.rd .flags button span{width:32px;height:32px;border-radius:50%;background:var(--tint-2);color:var(--purple);display:grid;place-items:center;font-weight:800} +.rd .flags button[aria-pressed="true"]{border-color:var(--purple);background:var(--purple);color:#fff} +.rd .flags button[aria-pressed="true"] span{background:#fff} +.rd .flag-panel{margin-top:24px} .rd .law-h{font-size:1.6rem;margin:56px 0 20px} .rd .law .card h3{font-size:1.3rem;margin:12px 0} .rd .law .card p{line-height:1.7} - +.rd .fields{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:18px} +.rd .fields button{border:1px solid var(--line);background:#fff;border-radius:999px;padding:9px 16px;font:inherit;font-weight:700;color:var(--ink);cursor:pointer} +.rd .fields button[aria-pressed="true"]{background:var(--purple);border-color:var(--purple);color:#fff} +.rd .title-doc{position:relative;background:#fbeef3;border:2px solid #e3b6c7;border-radius:12px;padding:22px;font-size:.8rem;line-height:1.4;color:#4a1d2e} +.rd .title-doc .zone{display:block;width:100%;text-align:left;border:2px dashed transparent;border-radius:8px;padding:10px;background:none;font:inherit;color:inherit;cursor:pointer;margin-bottom:6px} +.rd .title-doc .zone:hover,.rd .title-doc .zone[aria-pressed="true"]{border-color:var(--purple);background:rgba(149,51,165,.08)} +.rd .title-doc .zone b{display:block;font-size:.72rem;letter-spacing:.02em;margin-bottom:4px} +.rd .title-doc .hd{text-align:center;font-weight:800;font-size:1rem;margin-bottom:10px;letter-spacing:.02em} +.rd .line-fake{height:8px;border-radius:4px;background:#e8c3d2;margin:4px 0} +.rd .flip-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:40px} +@media (max-width:860px){ +.rd .flip-grid{grid-template-columns:1fr} +} +.rd .flip{perspective:1000px;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;text-align:left;min-height:220px} +.rd .flip-in{position:relative;height:100%;min-height:220px;transition:transform .6s;transform-style:preserve-3d} +.rd .flip[aria-pressed="true"] .flip-in{transform:rotateY(180deg)} +.rd .face{position:absolute;inset:0;border-radius:24px;padding:28px;backface-visibility:hidden;-webkit-backface-visibility:hidden;display:flex;flex-direction:column;justify-content:space-between} +.rd .front{background:var(--purple);color:#fff} +.rd .front .n{font-size:3rem;font-weight:800;line-height:1} +.rd .front b{font-size:1.3rem;line-height:1.3} +.rd .back{background:#fff;border:2px solid var(--purple);transform:rotateY(180deg);justify-content:center;font-size:1.05rem;line-height:1.7} +@media (prefers-reduced-motion:reduce){ +.rd .flip-in{transition:none} +} .rd .rc-legend{display:flex;gap:22px;flex-wrap:wrap;justify-content:center;margin-top:32px;font-weight:600} .rd .rc-legend span{display:flex;align-items:center;gap:8px} .rd .dot{width:12px;height:12px;border-radius:50%;display:inline-block;flex:0 0 12px} @@ -258,19 +498,20 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (max-width:900px){ .rd .rc-grid{grid-template-columns:1fr} } -.rd .receipt{background:#fff;border:1px solid var(--line);padding:28px 26px 30px;position:relative} +.rd .receipt{background:#fff;border:1px solid var(--line);border-radius:8px 8px 0 0;padding:28px 26px 30px;position:relative;box-shadow:0 24px 48px -30px rgba(42,15,49,.4); + -webkit-mask:radial-gradient(circle 9px at 50% 100%,transparent 98%,#000) 0 0/22px 100% repeat-x;mask:radial-gradient(circle 9px at 50% 100%,transparent 98%,#000) 0 0/22px 100% repeat-x;padding-bottom:44px} .rd .rc-head{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:6px;padding-bottom:16px;border-bottom:2px dashed var(--line);margin-bottom:8px} -.rd .rc-head b{font-size:1.3rem} +.rd .rc-head b{font-size:1.3rem;letter-spacing:-.02em} .rd .rc-head span{font-weight:600;font-size:.92rem;color:var(--purple-deep)} .rd .rc-lines{list-style:none;margin:0;padding:0} -.rd .rc-lines button{width:100%;display:grid;grid-template-columns:14px 1fr auto;gap:12px;align-items:center;padding:12px 10px;margin:0 -10px;width:calc(100% + 20px);border:0;background:none;font:inherit;color:var(--ink);text-align:left;cursor:pointer;font-variant-numeric:tabular-nums} +.rd .rc-lines button{width:100%;display:grid;grid-template-columns:14px 1fr auto;gap:12px;align-items:center;padding:12px 10px;margin:0 -10px;width:calc(100% + 20px);border:0;background:none;border-radius:10px;font:inherit;color:var(--ink);text-align:left;cursor:pointer;font-variant-numeric:tabular-nums} .rd .rc-lines button:hover{background:var(--tint)} .rd .rc-lines button[aria-pressed="true"]{background:var(--tint-2)} .rd .rc-lines .amt{font-weight:700} .rd .rc-lines li.gone button{opacity:.4} .rd .rc-lines li.gone .nm,.rd .rc-lines li.gone .amt{text-decoration:line-through} .rd .rc-total{display:flex;justify-content:space-between;align-items:baseline;border-top:2px dashed var(--line);margin-top:10px;padding-top:16px;font-size:1.15rem;font-variant-numeric:tabular-nums} -.rd .rc-total b{font-size:1.6rem} +.rd .rc-total b{font-size:1.6rem;letter-spacing:-.02em} .rd .rc-toggle{display:flex;gap:10px;align-items:center;margin-top:18px;font-weight:600;cursor:pointer} .rd .rc-toggle input{width:20px;height:20px;accent-color:var(--purple)} .rd .rc-save{margin-top:12px;font-weight:700;color:var(--green)} @@ -283,21 +524,21 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (max-width:960px){ .rd .apr{grid-template-columns:1fr} } -.rd .apr-controls,.rd .apr-results{background:var(--bg);border:1px solid var(--line);padding:36px} +.rd .apr-controls,.rd .apr-results{background:var(--bg);border-radius:28px;padding:36px} @media (max-width:640px){ .rd .apr-controls,.rd .apr-results{padding:26px} } .rd .apr-label{display:block;font-weight:700;font-size:.95rem;margin-bottom:8px} -.rd .apr-rate span{font-size:clamp(3rem,6vw,4.4rem);font-weight:700;color:var(--purple);line-height:1;font-variant-numeric:tabular-nums} +.rd .apr-rate span{font-size:clamp(3rem,6vw,4.4rem);font-weight:800;letter-spacing:-.04em;color:var(--purple);line-height:1;font-variant-numeric:tabular-nums} .rd .apr-rate.over span{color:var(--red)} .rd .apr-track-wrap{position:relative;margin:26px 0 8px;padding-bottom:44px} -.rd #aprRate{-webkit-appearance:none;appearance:none;width:100%;height:12px;background:linear-gradient(90deg,var(--purple) var(--fill,15%),var(--tint-2) var(--fill,15%));outline:none;margin:0} -.rd #aprRate::-webkit-slider-thumb{-webkit-appearance:none;width:30px;height:30px;border-radius:50%;background:#fff;border:4px solid var(--purple);cursor:grab} +.rd #aprRate{-webkit-appearance:none;appearance:none;width:100%;height:12px;border-radius:6px;background:linear-gradient(90deg,var(--purple) var(--fill,15%),var(--tint-2) var(--fill,15%));outline:none;margin:0} +.rd #aprRate::-webkit-slider-thumb{-webkit-appearance:none;width:30px;height:30px;border-radius:50%;background:#fff;border:4px solid var(--purple);cursor:grab;box-shadow:0 4px 12px -2px rgba(42,15,49,.4)} .rd #aprRate::-moz-range-thumb{width:24px;height:24px;border-radius:50%;background:#fff;border:4px solid var(--purple);cursor:grab} .rd #aprRate:focus-visible{outline:3px solid var(--purple);outline-offset:6px} .rd .apr-marks{position:absolute;left:15px;right:15px;top:0;height:100%;pointer-events:none} .rd .mk{position:absolute;top:-6px;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center} -.rd .mk i{width:3px;height:24px} +.rd .mk i{width:3px;height:24px;border-radius:2px} .rd .mk em{font-style:normal;font-size:.78rem;font-weight:700;white-space:nowrap;margin-top:4px} .rd .mk-buy i{background:var(--ink)} .rd .mk-buy em{color:var(--ink)} @@ -310,34 +551,43 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (max-width:640px){ .rd .apr-row{grid-template-columns:1fr} } -.rd .seg{display:inline-flex;background:var(--tint);padding:4px;gap:2px;flex-wrap:nowrap} -.rd .seg button{border:0;background:none;font:inherit;font-weight:700;padding:9px 13px;cursor:pointer;color:var(--ink);font-size:.92rem;white-space:nowrap} +.rd .seg{display:inline-flex;background:var(--tint);border-radius:999px;padding:4px;gap:2px;flex-wrap:nowrap} +.rd .seg button{border:0;background:none;font:inherit;font-weight:700;padding:9px 13px;border-radius:999px;cursor:pointer;color:var(--ink);font-size:.92rem;white-space:nowrap} .rd .seg button[aria-checked="true"]{background:var(--purple);color:#fff} -.rd .stepper{display:inline-flex;align-items:center;gap:4px;background:var(--tint);padding:4px} -.rd .stepper button{width:36px;height:36px;border-radius:50%;border:0;background:#fff;font:inherit;font-weight:700;font-size:1.2rem;cursor:pointer;color:var(--purple)} -.rd .stepper input{width:56px;border:0;background:none;font:inherit;font-weight:700;text-align:right;color:var(--ink);font-size:1.05rem;-moz-appearance:textfield} +.rd .stepper{display:inline-flex;align-items:center;gap:4px;background:var(--tint);border-radius:999px;padding:4px} +.rd .stepper button{width:36px;height:36px;border-radius:50%;border:0;background:#fff;font:inherit;font-weight:800;font-size:1.2rem;cursor:pointer;color:var(--purple)} +.rd .stepper input{width:56px;border:0;background:none;font:inherit;font-weight:800;text-align:right;color:var(--ink);font-size:1.05rem;-moz-appearance:textfield} .rd .stepper input::-webkit-inner-spin-button{-webkit-appearance:none} -.rd .stepper span{font-weight:700;margin-right:8px} +.rd .stepper span{font-weight:800;margin-right:8px} .rd .apr-hint{margin-top:18px;font-weight:600} -.rd .apr-big b{display:block;font-size:clamp(2.6rem,5vw,3.6rem);font-weight:700;line-height:1;font-variant-numeric:tabular-nums} -.rd .apr-split{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:26px;padding-top:22px;border-top:var(--divider)} -.rd .apr-split b{font-size:1.6rem;font-weight:700;font-variant-numeric:tabular-nums} -.rd .apr-bar{display:flex;height:18px;overflow:hidden;margin-top:26px;background:var(--tint)} +.rd .apr-big b{display:block;font-size:clamp(2.6rem,5vw,3.6rem);font-weight:800;letter-spacing:-.04em;line-height:1;font-variant-numeric:tabular-nums} +.rd .apr-split{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:26px;padding-top:22px;border-top:1px solid var(--line)} +.rd .apr-split b{font-size:1.6rem;font-weight:800;letter-spacing:-.02em;font-variant-numeric:tabular-nums} +.rd .apr-bar{display:flex;height:18px;border-radius:9px;overflow:hidden;margin-top:26px;background:var(--tint)} .rd .apr-bar i{display:block;height:100%;transition:width .25s} .rd #barP{background:var(--ink)} .rd #barI{background:var(--purple)} .rd .apr-bar-key{display:flex;gap:18px;margin-top:10px;font-weight:600;font-size:.92rem} .rd .apr-bar-key span{display:flex;align-items:center;gap:6px} -.rd .apr-bar-key i{width:12px;height:12px;display:inline-block} +.rd .apr-bar-key i{width:12px;height:12px;border-radius:3px;display:inline-block} .rd .apr-bar-key .k1{background:var(--ink)} .rd .apr-bar-key .k2{background:var(--purple)} -.rd .apr-verdict{margin-top:24px;padding:16px 18px;font-weight:600;line-height:1.55;background:var(--tint)} +.rd .apr-verdict{margin-top:24px;border-radius:16px;padding:16px 18px;font-weight:600;line-height:1.55;background:var(--tint)} .rd .apr-verdict.bad{background:#fbe1df;color:#7a1a14} .rd .apr-verdict.ok{background:#e3f3e8;color:#14512b} @media (prefers-reduced-motion:reduce){ .rd .apr-bar i{transition:none} } - +.rd .doc-mock{background:#fff;border:1px solid var(--line);border-radius:16px;padding:26px;font-size:.85rem;line-height:1.45;box-shadow:0 20px 40px -24px rgba(42,15,49,.3)} +.rd .doc-mock .dh{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px;border-bottom:2px solid var(--ink);margin-bottom:16px;font-weight:800;font-size:1rem} +.rd .doc-block{position:relative;border:1px solid var(--line);border-radius:10px;padding:14px 14px 14px 52px;margin-bottom:10px;min-height:56px} +.rd .doc-block .pin{position:absolute;left:10px;top:12px;transform:none;width:30px;height:30px;font-size:.85rem;border-width:2px} +.rd .doc-block .pin[aria-pressed="true"]{transform:scale(1.1)} +.rd .doc-block b{display:block;margin-bottom:4px} +.rd .bg-form{background:#fff;border:2px solid var(--ink);border-radius:6px;padding:24px;font-size:.85rem;line-height:1.45} +.rd .bg-form .t{text-align:center;font-weight:800;font-size:1.4rem;letter-spacing:.04em;border-bottom:2px solid var(--ink);padding-bottom:10px;margin-bottom:14px} +.rd .box{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--ink);padding:10px;margin-bottom:8px} +.rd .box i{flex:0 0 16px;height:16px;border:2px solid var(--ink);margin-top:2px} .rd .key3 .card h4{font-size:1rem;letter-spacing:0;color:var(--purple);margin-bottom:8px} .rd .key3 .card h3{font-size:1.3rem;margin-bottom:10px} .rd .key3 .card p{line-height:1.7} @@ -348,7 +598,7 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .chapter h3{font-size:1.5rem;margin:14px 0 4px} .rd .chapter .u{font-weight:600} .rd .chapter p.d{margin:16px 0;line-height:1.7} -.rd .chapter .leads{font-size:.98rem;line-height:1.6;padding-top:16px;border-top:var(--divider)} +.rd .chapter .leads{font-size:.98rem;line-height:1.6;padding-top:16px;border-top:1px solid var(--line)} .rd .roles{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:40px} @media (max-width:860px){ .rd .roles{grid-template-columns:1fr 1fr} @@ -356,7 +606,7 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (max-width:520px){ .rd .roles{grid-template-columns:1fr} } -.rd .roles div{background:var(--bg);padding:22px} +.rd .roles div{background:var(--bg);border-radius:18px;padding:22px} .rd .roles b{display:block;font-size:1.1rem;margin-bottom:4px} .rd form.apply{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:40px} @media (max-width:760px){ @@ -365,48 +615,161 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .fld{display:flex;flex-direction:column;gap:8px} .rd .fld.full{grid-column:1/-1} .rd .fld label,.rd .fld legend{font-weight:700} -.rd .fld input,.rd .fld select,.rd .fld textarea{font:inherit;color:var(--ink);background:#fff;border:1.5px solid var(--line);padding:13px 16px} +.rd .fld input,.rd .fld select,.rd .fld textarea{font:inherit;color:var(--ink);background:#fff;border:1.5px solid var(--line);border-radius:14px;padding:13px 16px} .rd .fld input:focus,.rd .fld select:focus,.rd .fld textarea:focus{border-color:var(--purple);outline:none} .rd .fld textarea{min-height:130px;resize:vertical} .rd fieldset.fld{border:0;padding:0;margin:0} .rd .radios{display:flex;gap:18px} .rd .radios label{font-weight:600;display:flex;gap:8px;align-items:center} .rd .form-note{grid-column:1/-1;font-weight:600;line-height:1.6} -.rd .form-ok{grid-column:1/-1;background:#e3f3e8;color:var(--green);padding:16px 18px;font-weight:700} +.rd .form-ok{grid-column:1/-1;background:#e3f3e8;color:var(--green);border-radius:14px;padding:16px 18px;font-weight:700} .rd .campus-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:28px;margin-top:56px} @media (max-width:720px){ .rd .campus-grid{grid-template-columns:none;grid-auto-flow:column;grid-auto-columns:78%;overflow-x:auto;scroll-snap-type:x mandatory;gap:16px;padding-bottom:12px;margin-left:-20px;margin-right:-20px;padding-left:20px;padding-right:20px} .rd .campus{scroll-snap-align:start} } -.rd .campus{display:flex;flex-direction:column;gap:22px;padding:14px 14px 26px;background:var(--bg);border:1px solid var(--line);transition:border-color .2s} -.rd .campus:hover{border-color:var(--purple)} -.rd .campus-img{position:relative;aspect-ratio:4/5;overflow:hidden;background:var(--band)} +.rd .campus{display:flex;flex-direction:column;gap:22px;border-radius:24px;padding:14px 14px 26px;background:var(--bg);border:1px solid var(--line);transition:border-color .2s,box-shadow .2s} +.rd .campus:hover{border-color:var(--purple);box-shadow:0 24px 48px -28px rgba(94,26,107,.45)} +.rd .campus-img{position:relative;aspect-ratio:4/5;overflow:hidden;border-radius:999px 999px 16px 16px;background:linear-gradient(180deg,#e9d3ee 0%,#f6ecf8 62%,#fbf6fc 100%)} .rd .campus-img img{position:absolute;display:block} .rd .campus-img.royce img{left:50%;bottom:0;height:60%;width:auto;max-width:none;transform:translateX(-43%)} .rd .campus-img.tower img{left:50%;bottom:0;height:96%;width:auto;max-width:none;transform:translateX(-50%)} .rd .campus-img.photo img{inset:0;width:100%;height:100%;object-fit:cover;object-position:62% 60%} .rd .campus-body{padding:0 12px;display:flex;flex-direction:column;gap:10px;flex:1} +.rd .campus-body .tag{align-self:flex-start} .rd .campus-body h3{font-size:clamp(1.2rem,1.9vw,1.45rem)} .rd .campus-body p{line-height:1.6;flex:1;font-size:.98rem} .rd .campus-go{display:inline-flex;align-items:center;gap:8px;font-weight:700;color:var(--purple);margin-top:4px} -.rd .avatar-img{width:96px;height:96px;object-fit:cover;display:block} +.rd .campus-go svg{transition:transform .2s} +.rd .campus:hover .campus-go svg{transform:translateX(4px)} +@media (prefers-reduced-motion:reduce){ +.rd .campus-go svg{transition:none} +} +.rd .avatar-img{width:96px;height:96px;border-radius:24px;object-fit:cover;display:block} .rd .socials{display:flex;gap:14px;flex-wrap:wrap} .rd .team{margin-top:40px} - -.rd .flagbox{margin-top:16px;padding:14px 16px;font-weight:600;line-height:1.6} - -.rd .bg-img{width:100%;height:auto;border:1px solid var(--line);display:block} +.rd .panel .sub{font-weight:700;margin-bottom:10px;color:var(--purple-deep)} +.rd .panel .steps{margin:14px 0 0;padding-left:22px;display:flex;flex-direction:column;gap:8px;line-height:1.65} +.rd .flagbox{margin-top:16px;border-radius:14px;padding:14px 16px;font-weight:600;line-height:1.6} +.rd .stage .pin{width:32px;height:32px;font-size:.9rem} +.rd .pin.sevpin-easy{background:#1d6b3a} +.rd .pin.sevpin-watch{background:#a36a00} +.rd .pin.sevpin-red{background:#b3261e} +.rd .pin.sevpin-know{background:#9533A5} +.rd .stage .pin[aria-pressed="true"]{outline:3px solid #fff;outline-offset:2px} +.rd .title-real{position:relative;border-radius:16px;overflow:hidden;box-shadow:0 24px 48px -28px rgba(42,15,49,.45)} +.rd .title-real img{display:block;width:100%;height:auto} +.rd .title-real .zone{position:absolute;border:2px dashed rgba(149,51,165,.85);background:rgba(149,51,165,.10);border-radius:6px;cursor:pointer;padding:0;transition:background .2s} +.rd .title-real .zone.danger{border-color:rgba(179,38,30,.85);background:rgba(179,38,30,.08)} +.rd .title-real .zone:hover,.rd .title-real .zone[aria-pressed="true"]{background:rgba(149,51,165,.28)} +.rd .title-real .zone.danger:hover,.rd .title-real .zone.danger[aria-pressed="true"]{background:rgba(179,38,30,.25)} +.rd .bg-img{width:100%;height:auto;border-radius:12px;border:1px solid var(--line);box-shadow:0 20px 40px -24px rgba(42,15,49,.3);display:block} .rd details .say{margin-top:14px} - -.rd .bub{max-width:84%;padding:12px 15px;line-height:1.5;font-size:.98rem} -.rd .bub.them{align-self:flex-start;background:#fff;border:1px solid var(--line);border-bottom-left-radius:0} -.rd .bub.me{align-self:flex-end;background:var(--purple);color:#fff;border-bottom-right-radius:0;font-weight:600} -.rd .bub.flagchip{align-self:center;background:#fbe1df;color:#7a1a14;font-weight:700;font-size:.9rem;max-width:100%} +.rd .team .card.member{border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b} +.rd .team .avatar-img,.rd .team .avatar{border:3px solid #a53ab8} +@media (prefers-reduced-motion:reduce){ +.rd .team .card.member{transition:none} +.rd .team .card.member:hover{transform:none} +} +.rd .tour{display:grid;grid-template-columns:1.1fr .9fr;gap:56px;margin-top:48px;align-items:start} +.rd .tour-visual{position:sticky;top:calc(env(safe-area-inset-top,0px) + 100px);z-index:2} +.rd .tour-frame{position:relative;overflow:hidden;border-radius:24px;background:var(--tint);box-shadow:0 30px 60px -30px rgba(42,15,49,.45)} +.rd .tour-zoom{position:relative;transform-origin:0 0;transition:transform .9s cubic-bezier(.65,0,.25,1);will-change:transform} +.rd .tour-zoom>img{display:block;width:100%;height:auto;user-select:none} +.rd .spot{position:absolute;opacity:0;pointer-events:none;box-shadow:0 0 0 3px #fff,0 0 0 6px var(--purple),0 0 0 200vmax rgba(42,15,49,.55);transition:left .9s cubic-bezier(.65,0,.25,1),top .9s cubic-bezier(.65,0,.25,1),width .9s cubic-bezier(.65,0,.25,1),height .9s cubic-bezier(.65,0,.25,1),opacity .5s,border-radius .5s} +.rd .spot.show{opacity:1} +.rd .tour-hud{position:absolute;left:14px;right:14px;bottom:14px;display:flex;justify-content:space-between;align-items:center;gap:12px;pointer-events:none} +.rd .tour-count{background:#fff;color:var(--ink);font-weight:800;border-radius:999px;padding:6px 14px;font-size:.92rem;font-variant-numeric:tabular-nums;box-shadow:0 6px 16px -8px rgba(42,15,49,.5)} +.rd .tour-dots{display:flex;gap:6px;background:rgba(255,255,255,.9);border-radius:999px;padding:8px 10px} +.rd .tour-dots i{width:8px;height:8px;border-radius:50%;background:var(--tint-2);transition:background .3s,transform .3s} +.rd .tour-dots i.on{background:var(--purple);transform:scale(1.35)} +.rd .tour-steps{display:flex;flex-direction:column} +.rd .tour-step{min-height:78vh;display:flex;align-items:center;padding:6vh 0} +.rd .tour-step:last-child{min-height:88vh} +.rd .tour-intro{min-height:52vh;flex-direction:column;align-items:flex-start;justify-content:center;gap:12px} +.rd .tour-intro p{font-size:1.35rem;font-weight:700;line-height:1.5;max-width:420px} +.rd .tour-arrow{font-size:2rem;color:var(--purple);animation:rd-bob 1.6s ease-in-out infinite} +@keyframes rd-bob{50%{transform:translateY(8px)}} +.rd .tour-card{background:var(--bg);border:1px solid var(--line);border-radius:24px;padding:32px;opacity:.25;transform:translateX(24px) scale(.97);transition:opacity .5s,transform .5s,box-shadow .5s} +.rd .band .tour-card{border-color:transparent} +.rd .tour-step.on .tour-card{opacity:1;transform:none;box-shadow:0 24px 48px -30px rgba(94,26,107,.45)} +.rd .tour-card h3{font-size:1.6rem;margin:12px 0} +.rd .tour-card p{line-height:1.75} +.rd .tour-card .sub{font-weight:700;margin-bottom:10px;color:var(--purple-deep)} +.rd .tour-card .steps{margin:14px 0 0;padding-left:22px;display:flex;flex-direction:column;gap:8px;line-height:1.65} +.rd .tour-doc .tour-frame{max-width:560px;margin:0 auto} +.rd .doc-mock.tour-zoom{border:0;box-shadow:none;border-radius:0;transition:transform .9s cubic-bezier(.65,0,.25,1)} +.rd .doc-block .pin-n{position:absolute;left:10px;top:12px;width:30px;height:30px;border-radius:50%;background:var(--purple);color:#fff;font-weight:800;font-size:.85rem;display:grid;place-items:center} +@media (max-width:900px){ +.rd .tour{grid-template-columns:1fr;gap:0} +.rd .tour-visual{top:calc(env(safe-area-inset-top,0px) + 76px);background:var(--bg);padding:10px 0 14px;box-shadow:0 14px 16px -12px rgba(42,15,49,.18)} +.rd .band .tour-visual{background:var(--tint)} +.rd .tour-frame{max-height:42vh;width:auto;margin:0 auto} +.rd .tour-doc .tour-frame,.rd .tour-frame[style*="1040/1212"]{width:calc(42vh * 1040 / 1212);max-width:100%} +.rd .tour-step{min-height:70vh} +.rd .tour-card{padding:24px;transform:translateY(20px)} +} +@media (prefers-reduced-motion:reduce){ +.rd .tour-zoom,.rd .spot,.rd .tour-card{transition:none} +.rd .tour-arrow{animation:none} +} +.rd .chat-phone{width:min(360px,100%);margin:0 auto;border-radius:40px;background:var(--ink);padding:12px;box-shadow:0 30px 60px -24px rgba(94,26,107,.5)} +.rd .chat-top{display:flex;align-items:center;gap:12px;background:#fff;border-radius:28px 28px 0 0;padding:18px 18px 14px;border-bottom:1px solid var(--line)} +.rd .chat-top b{display:block;line-height:1.2} +.rd .chat-top span:not(.chat-av){font-size:.88rem;font-weight:600;color:var(--purple-deep)} +.rd .chat-av{width:38px;height:38px;border-radius:50%;background:var(--tint-2);color:var(--purple-deep);display:grid;place-items:center;font-weight:800} +.rd .chat-body{background:#fbf6fc;border-radius:0 0 28px 28px;min-height:420px;padding:18px 14px;display:flex;flex-direction:column;gap:10px} +.rd .chat-note{align-self:center;font-size:.85rem;font-weight:700;color:var(--purple-deep);background:var(--tint-2);border-radius:999px;padding:4px 12px} +.rd .bub{max-width:84%;padding:12px 15px;border-radius:20px;line-height:1.5;font-size:.98rem;animation:rd-pop .35s cubic-bezier(.2,.9,.3,1.3) both} +.rd .bub.them{align-self:flex-start;background:#fff;border:1px solid var(--line);border-bottom-left-radius:6px} +.rd .bub.me{align-self:flex-end;background:var(--purple);color:#fff;border-bottom-right-radius:6px;font-weight:600} +.rd .bub.flagchip{align-self:center;background:#fbe1df;color:#7a1a14;font-weight:700;font-size:.9rem;border-radius:12px;max-width:100%} .rd .bub.flagchip b{margin-right:6px} - +@keyframes rd-pop{from{opacity:0;transform:translateY(12px) scale(.9)}to{opacity:1;transform:none}} +.rd .typing{display:inline-flex;gap:4px;padding:4px 2px} +.rd .typing i{width:7px;height:7px;border-radius:50%;background:currentColor;opacity:.4;animation:rd-blink 1s infinite} +.rd .typing i:nth-child(2){animation-delay:.15s} +.rd .typing i:nth-child(3){animation-delay:.3s} +@keyframes rd-blink{50%{opacity:1;transform:translateY(-3px)}} +@media (max-width:900px){ +.rd .chat-body{min-height:210px;max-height:240px;overflow:hidden;justify-content:flex-end;padding:12px} +.rd .chat-top{padding:12px 14px 10px} +.rd .chat-phone{border-radius:30px;padding:8px} +.rd .bub{font-size:.9rem;padding:9px 12px} +.rd .tour-chat .tour-visual{padding-bottom:10px} +.rd .chat-phone{width:min(340px,100%)} +} +@media (prefers-reduced-motion:reduce){ +.rd .bub{animation:none} +.rd .typing i{animation:none} +} +.rd .drive{height:420vh;padding:0} +.rd .drive-sticky{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);height:calc(100vh - 76px);height:calc(100svh - 76px);display:flex;align-items:center} +.rd .drive-sticky .wrap{width:100%} +.rd .drive-stage{position:relative;margin-top:28px} +.rd .drive-road{width:100%;height:auto;aspect-ratio:1200/260;display:block;overflow:visible} +.rd .dstop circle{transition:fill .3s} +.rd .dstop.on circle{fill:#9533A5} +.rd .dstop.on text{fill:#fff} +.rd .drive-card{max-width:640px;margin:22px auto 0;background:var(--bg);border:1px solid var(--line);border-radius:24px;padding:26px 28px;text-align:left;box-shadow:0 24px 48px -30px rgba(94,26,107,.45)} +.rd .drive-card h3{font-size:1.45rem;margin:10px 0 8px} +.rd .drive-card p{line-height:1.7} +.rd .drive-card.pop{opacity:0;transform:translateY(16px) scale(.97)} +.rd .drive-card.pop.in{opacity:1;transform:none;transition:opacity .45s,transform .45s cubic-bezier(.2,.9,.3,1.2)} +.rd .drive-alert{max-width:640px;margin:18px auto 0} +@media (max-width:760px){ +.rd .drive-road{aspect-ratio:1200/360} +.rd .drive-card{padding:20px} +.rd .drive-alert{display:none} +} +@media (prefers-reduced-motion:reduce){ +.rd .drive{height:auto} +.rd .drive-sticky{position:static;height:auto;padding:72px 0} +.rd .drive-card.pop{opacity:1;transform:none} +} .rd .rc-wrap{max-width:640px;margin:40px auto 0} -.rd .rc-lines li{} -.rd .rc-lines .rc-note{display:grid;grid-template-rows:0fr} +.rd .rc-lines li{border-radius:10px} +.rd .rc-lines .rc-note{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s ease} .rd .rc-lines .rc-note>div{overflow:hidden;padding:0 10px} .rd .rc-lines li.open .rc-note{grid-template-rows:1fr} .rd .rc-lines li.open .rc-note>div{padding:6px 10px 16px} @@ -419,142 +782,180 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- } .rd .insp-bar{display:flex;justify-content:space-between;align-items:center;gap:20px;flex-wrap:wrap;margin-top:44px} .rd .insp-progress{display:flex;align-items:center;gap:14px;font-weight:700;flex:1;min-width:240px} -.rd .insp-meter{flex:1;max-width:320px;height:12px;background:var(--bg);overflow:hidden} -.rd .insp-meter i{display:block;height:100%;width:0;background:var(--purple);transition:width .5s cubic-bezier(.2,.9,.3,1)} +.rd .insp-meter{flex:1;max-width:320px;height:12px;border-radius:6px;background:var(--bg);overflow:hidden} +.rd .insp-meter i{display:block;height:100%;width:0;background:var(--purple);border-radius:6px;transition:width .5s cubic-bezier(.2,.9,.3,1)} .rd .insp-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px} -.rd .insp-chips button{display:inline-flex;align-items:center;gap:8px;border:1.5px solid var(--line);background:var(--bg);padding:8px 14px 8px 10px;font:inherit;font-weight:700;font-size:.92rem;color:var(--ink);cursor:pointer;transition:border-color .2s,background .2s} +.rd .insp-chips button{display:inline-flex;align-items:center;gap:8px;border:1.5px solid var(--line);background:var(--bg);border-radius:999px;padding:8px 14px 8px 10px;font:inherit;font-weight:700;font-size:.92rem;color:var(--ink);cursor:pointer;transition:border-color .2s,background .2s} .rd .insp-chips button:hover{border-color:var(--purple)} .rd .insp-chips .ck{width:18px;height:18px;border-radius:50%;border:2px solid var(--line);display:grid;place-items:center;transition:background .2s,border-color .2s} .rd .insp-chips button.done .ck{background:var(--green);border-color:var(--green)} .rd .insp-chips button.done .ck::after{content:"";width:8px;height:4px;border:2.5px solid #fff;border-top:0;border-right:0;transform:rotate(-45deg) translate(1px,-1px)} .rd .insp-chips button.cur{border-color:var(--purple);background:var(--tint-2)} .rd .insp{margin-top:22px} -.rd .insp-frame{position:relative;overflow:hidden;aspect-ratio:3/2;background:#e9e9ee} -.rd .insp-zoom{position:absolute;inset:0;transform-origin:0 0;transition:transform .8s cubic-bezier(.65,0,.25,1)} +.rd .insp-frame{position:relative;overflow:hidden;border-radius:24px;aspect-ratio:3/2;background:#e9e9ee;box-shadow:0 30px 60px -30px rgba(42,15,49,.45)} +.rd .insp-zoom{position:absolute;inset:0;transform-origin:0 0;transition:transform .8s cubic-bezier(.65,0,.25,1);will-change:transform} .rd .insp-zoom img{display:block;width:100%;height:100%;object-fit:cover;user-select:none} .rd .insp-hots{position:absolute;inset:0;transition:opacity .3s} .rd .insp-frame.zoomed .insp-hots{opacity:0;pointer-events:none} -.rd .spot{position:absolute;opacity:0;pointer-events:none;outline:3px solid var(--purple);box-shadow:0 0 0 200vmax rgba(42,15,49,.55);transition:left .8s cubic-bezier(.65,0,.25,1),top .8s cubic-bezier(.65,0,.25,1),width .8s cubic-bezier(.65,0,.25,1),height .8s cubic-bezier(.65,0,.25,1),opacity .3s} -.rd .spot.show{opacity:1} .rd .hot{position:absolute;width:44px;height:44px;transform:translate(-50%,-50%);border:0;background:none;padding:0;cursor:pointer;--c:var(--purple)} .rd .hot.sevpin-easy{--c:#1d6b3a} .rd .hot.sevpin-watch{--c:#a36a00} .rd .hot.sevpin-red{--c:#b3261e} .rd .hot.sevpin-know{--c:#9533A5} -.rd .hot-dot{position:absolute;inset:12px;border-radius:50%;background:var(--c);border:3px solid #fff} +.rd .hot-dot{position:absolute;inset:12px;border-radius:50%;background:var(--c);border:3px solid #fff;box-shadow:0 4px 10px rgba(0,0,0,.35)} +.rd .hot-ring{position:absolute;inset:0;border-radius:50%;border:3px solid var(--c);animation:rd-ring 2s ease-out infinite} .rd .hot.done .hot-dot{background:var(--green)} .rd .hot.done .hot-dot::after{content:"";position:absolute;left:5px;top:5px;width:8px;height:4px;border:2.5px solid #fff;border-top:0;border-right:0;transform:rotate(-45deg)} -.rd .hot-tip{position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%);white-space:nowrap;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;padding:6px 10px;opacity:0;pointer-events:none} -.rd .hot:hover .hot-tip,.rd .hot:focus-visible .hot-tip{opacity:1} -.rd .insp-card{position:absolute;top:16px;bottom:16px;width:min(44%,440px);background:#fff;border:1px solid var(--line);padding:26px 26px 20px;overflow:auto;opacity:0;pointer-events:none} -.rd .insp-card[data-side="right"]{right:16px} -.rd .insp-card[data-side="left"]{left:16px} -.rd .insp-card.in{opacity:1;pointer-events:auto} +.rd .hot.done .hot-ring{animation:none;opacity:0} +@keyframes rd-ring{0%{transform:scale(.6);opacity:1}100%{transform:scale(1.5);opacity:0}} +.rd .hot-tip{position:absolute;left:50%;bottom:calc(100% + 4px);transform:translate(-50%,6px);white-space:nowrap;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;padding:6px 10px;border-radius:8px;opacity:0;transition:opacity .2s,transform .2s;pointer-events:none} +.rd .hot:hover .hot-tip,.rd .hot:focus-visible .hot-tip{opacity:1;transform:translate(-50%,0)} +.rd .insp-card{position:absolute;top:16px;bottom:16px;width:min(44%,440px);background:rgba(255,255,255,.97);backdrop-filter:blur(8px);border-radius:20px;padding:26px 26px 20px;overflow:auto;box-shadow:0 30px 60px -20px rgba(42,15,49,.55);opacity:0;transition:opacity .45s .25s,transform .45s .25s cubic-bezier(.2,.9,.3,1.1)} +.rd .insp-card[data-side="right"]{right:16px;transform:translateX(30px)} +.rd .insp-card[data-side="left"]{left:16px;transform:translateX(-30px)} +.rd .insp-card.in{opacity:1;transform:none} .rd .insp-card h3{font-size:1.55rem;margin:10px 0 6px} .rd .insp-card .sub{font-weight:700;color:var(--purple-deep);margin-bottom:8px} .rd .insp-card p{line-height:1.65} .rd .insp-x{position:absolute;top:12px;right:12px;width:36px;height:36px;border-radius:50%;border:0;background:var(--tint);font-size:1.4rem;line-height:1;cursor:pointer;color:var(--ink)} -.rd .how{font-weight:700;margin-top:16px} +.rd .how{font-weight:800;margin-top:16px} .rd .todo{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:8px} .rd .todo label{display:grid;grid-template-columns:22px 1fr;gap:10px;align-items:start;cursor:pointer;line-height:1.55} .rd .todo input{width:20px;height:20px;margin-top:2px;accent-color:var(--green)} .rd .todo input:checked+span{text-decoration:line-through;text-decoration-color:rgba(42,15,49,.4)} -.rd .insp-nav{display:flex;justify-content:space-between;gap:10px;margin-top:18px;position:sticky;bottom:-20px;background:#fff;padding:14px 0 4px} +.rd .insp-nav{display:flex;justify-content:space-between;gap:10px;margin-top:18px;position:sticky;bottom:-20px;background:linear-gradient(transparent,#fff 30%);padding:14px 0 4px} .rd .insp-nav .btn{padding:12px 20px} .rd .insp-nav .btn[disabled]{opacity:.35;cursor:default} -.rd .insp-done{margin-top:22px;background:#e3f3e8;color:#14512b;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;font-weight:600;line-height:1.55} +.rd .insp-done{margin-top:22px;background:#e3f3e8;color:#14512b;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;font-weight:600;line-height:1.55} @media (max-width:900px){ .rd .insp-frame{overflow:visible;aspect-ratio:auto} .rd .insp-frame::before{content:"";display:block;aspect-ratio:3/2} .rd .insp-zoom,.rd .insp-hots{bottom:auto;height:0;padding-bottom:66.67%} -.rd .insp-frame{overflow:visible;aspect-ratio:auto} - -.rd .insp-card{position:relative;top:auto;bottom:auto;left:auto!important;right:auto!important;width:auto;margin-top:14px;max-height:none} +.rd .insp-frame{border-radius:18px} +.rd .insp-zoomwrap{} +.rd .insp-card{position:relative;top:auto;bottom:auto;left:auto!important;right:auto!important;width:auto;margin-top:14px;transform:translateY(20px)!important;max-height:none} +.rd .insp-card.in{transform:none!important} .rd .hot{width:36px;height:36px} .rd .hot-dot{inset:9px} } @media (prefers-reduced-motion:reduce){ -.rd .insp-zoom,.rd .spot,.rd .insp-meter i{transition:none} +.rd .insp-zoom,.rd .insp-card,.rd .insp-meter i{transition:none} +.rd .hot-ring{animation:none} } - +.rd .tour-card{opacity:.4} .rd .fv{display:grid;grid-template-columns:1.35fr .65fr;gap:48px;align-items:center} @media (max-width:900px){ .rd .fv{grid-template-columns:1fr;gap:24px} } -.rd .fv-player{position:relative;overflow:hidden;background:var(--ink);aspect-ratio:16/9} +.rd .fv-player{position:relative;border-radius:28px;overflow:hidden;background:var(--ink);box-shadow:0 30px 60px -28px rgba(42,15,49,.5);aspect-ratio:16/9} .rd .fv-player video{display:block;width:100%;height:100%;object-fit:cover} -.rd .fv-play{position:absolute;inset:0;border:0;padding:0;cursor:pointer;background:transparent;display:grid;place-items:center;color:#fff} -.rd .fv-btn{width:88px;height:88px;border-radius:50%;background:var(--purple);display:grid;place-items:center} +.rd .fv-play{position:absolute;inset:0;border:0;padding:0;cursor:pointer;background:linear-gradient(180deg,transparent 55%,rgba(42,15,49,.55));display:grid;place-items:center;color:#fff} +.rd .fv-btn{width:88px;height:88px;border-radius:50%;background:var(--purple);display:grid;place-items:center;box-shadow:0 0 0 10px rgba(255,255,255,.28);transition:transform .2s,box-shadow .2s} .rd .fv-btn svg{margin-left:4px} -.rd .fv-len{position:absolute;right:18px;bottom:16px;background:rgba(42,15,49,.7);padding:5px 12px;font-weight:700;font-size:.9rem} +.rd .fv-play:hover .fv-btn{transform:scale(1.07);box-shadow:0 0 0 14px rgba(255,255,255,.32)} +.rd .fv-len{position:absolute;right:18px;bottom:16px;background:rgba(42,15,49,.7);border-radius:999px;padding:5px 12px;font-weight:700;font-size:.9rem} .rd .fv-player.playing .fv-play{display:none} .rd .fv-text .lede{margin-top:16px} .rd .fv-who{margin-top:24px;padding-left:16px;border-left:4px solid var(--purple);line-height:1.5} .rd .fv-who b{display:block;font-size:1.1rem} -.rd .avatar-play{position:relative;border:0;padding:0;background:none;cursor:pointer;align-self:flex-start} -.rd .ap-badge{position:absolute;right:-8px;bottom:-8px;width:34px;height:34px;border-radius:50%;background:var(--purple);color:#fff;display:grid;place-items:center;border:3px solid #fff} +@media (prefers-reduced-motion:reduce){ +.rd .fv-btn{transition:none} +} +.rd .avatar-play{position:relative;border:0;padding:0;background:none;cursor:pointer;align-self:flex-start;border-radius:24px} +.rd .avatar-play .avatar-img{transition:transform .2s} +@keyframes rd-ring2{0%{transform:scale(.96);opacity:.9}100%{transform:scale(1.12);opacity:0}} +.rd .ap-badge{position:absolute;right:-8px;bottom:-8px;width:34px;height:34px;border-radius:50%;background:var(--purple);color:#fff;display:grid;place-items:center;border:3px solid #fff;box-shadow:0 4px 10px rgba(42,15,49,.3)} .rd .ap-badge svg{margin-left:2px} .rd .member.has-video .bio{cursor:pointer} -.rd .watch{align-self:flex-start;display:inline-flex;align-items:center;gap:10px;border:0;background:var(--purple);color:#fff;font:inherit;font-weight:700;padding:9px 16px 9px 9px;cursor:pointer;transition:background .2s} +.rd .watch{align-self:flex-start;display:inline-flex;align-items:center;gap:10px;border:0;background:var(--purple);color:#fff;font:inherit;font-weight:700;border-radius:999px;padding:9px 16px 9px 9px;cursor:pointer;transition:background .2s} .rd .watch:hover{background:var(--purple-dark)} .rd .w-ico{width:26px;height:26px;border-radius:50%;background:#fff;color:var(--purple);display:grid;place-items:center} .rd .w-ico svg{margin-left:2px} .rd .w-len{font-weight:600;opacity:.9;font-variant-numeric:tabular-nums} .rd .vbox{border:0;padding:0;background:transparent;max-width:min(960px,92vw);width:100%;overflow:visible} -.rd .vbox::backdrop{background:rgba(42,15,49,.72)} -.rd .vbox-in{position:relative;background:var(--ink);overflow:hidden} +.rd .vbox::backdrop{background:rgba(42,15,49,.72);backdrop-filter:blur(4px)} +.rd .vbox-in{position:relative;background:var(--ink);border-radius:24px;overflow:hidden;transform:scale(.92) translateY(20px);opacity:0;transition:transform .3s cubic-bezier(.2,.9,.3,1.15),opacity .25s} +.rd .vbox.in .vbox-in{transform:none;opacity:1} .rd .vbox video{display:block;width:100%;aspect-ratio:16/9;background:#000} .rd .vbox-cap{color:#fff;padding:16px 20px;line-height:1.5} .rd .vbox-cap b{display:block;font-size:1.1rem} .rd .vbox-x{position:absolute;top:12px;right:12px;z-index:2;width:40px;height:40px;border-radius:50%;border:0;background:rgba(255,255,255,.92);color:var(--ink);font-size:1.5rem;line-height:1;cursor:pointer} @media (prefers-reduced-motion:reduce){ +.rd .avatar-play::before{animation:none} +.rd .vbox-in{transition:none} } - -.rd .track-nav{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);z-index:20;background:rgba(255,255,255,.95);border-bottom:var(--divider)} +.rd .ig{display:grid;grid-template-columns:1fr minmax(300px,440px);gap:56px;align-items:center} +@media (max-width:900px){ +.rd .ig{grid-template-columns:1fr;gap:28px} +} +.rd .ig-card{display:block;background:#fff;border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b;border-radius:24px;overflow:hidden;transition:transform .15s,box-shadow .15s} +.rd .ig-card:hover{transform:translate(-2px,-2px);box-shadow:8px 8px 0 #7d2a8b} +.rd .ig-top{display:flex;align-items:center;gap:12px;padding:14px 16px;border-bottom:1px solid var(--line)} +.rd .ig-top b{display:block;line-height:1.2} +.rd .ig-top span{font-size:.9rem;font-weight:600;color:var(--purple-deep)} +.rd .ig-av{width:40px;height:40px;object-fit:contain;border-radius:50%;background:var(--tint);padding:4px} +.rd .ig-mark{margin-left:auto;color:var(--purple)} +.rd .ig-media{aspect-ratio:1/1;background:radial-gradient(circle at 30% 25%,rgba(255,255,255,.35),transparent 55%),linear-gradient(140deg,#b75cc6,#5e1a6b);display:grid;place-items:center} +.rd .ig-open{display:inline-flex;align-items:center;gap:10px;background:#fff;color:var(--purple-deep);font-weight:800;border-radius:999px;padding:12px 20px} +.rd .ig-foot{padding:14px 16px;font-weight:600;font-size:.95rem} +@media (prefers-reduced-motion:reduce){ +.rd .ig-card{transition:none} +.rd .ig-card:hover{transform:none} +} +.rd .track-nav{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);z-index:20;background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)} .rd .track-nav .wrap{display:flex;gap:6px;overflow-x:auto;padding-top:10px;padding-bottom:10px;scrollbar-width:none} -.rd .track-nav a{white-space:nowrap;font-weight:700;padding:9px 16px;display:inline-flex;gap:8px;align-items:center;transition:background .2s,color .2s} -.rd .track-nav a b{font-size:.8rem;background:var(--tint-2);color:var(--purple-deep);padding:2px 8px} +.rd .track-nav a{white-space:nowrap;font-weight:700;padding:9px 16px;border-radius:999px;display:inline-flex;gap:8px;align-items:center;transition:background .2s,color .2s} +.rd .track-nav a b{font-size:.8rem;background:var(--tint-2);color:var(--purple-deep);border-radius:999px;padding:2px 8px} .rd .track-nav a.on{background:var(--purple);color:#fff} .rd .track-nav a.on b{background:#fff} - +.rd .track-head{display:flex;gap:20px;align-items:flex-start;margin-bottom:40px} +.rd .track-head .icon{margin:0;flex:0 0 60px} +.rd .track-head .lede{margin-top:10px} .rd .projects-2{grid-template-columns:repeat(2,1fr)} @media (max-width:1000px){ .rd .projects-2{grid-template-columns:1fr} } +.rd .proj{border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b} +.rd .proj:hover{transform:translate(-2px,-2px);box-shadow:8px 8px 0 #7d2a8b} .rd .band .proj{background:#fff} -.rd .pir{margin-top:56px;background:#fff;padding:36px;border:1px solid var(--line)} +.rd .pir{margin-top:56px;background:#fff;border-radius:28px;padding:36px;border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b} @media (max-width:640px){ .rd .pir{padding:22px} } .rd .pir-head{display:flex;justify-content:space-between;gap:20px;align-items:flex-start;flex-wrap:wrap} .rd .pir-head h3{font-size:1.9rem;margin:10px 0 6px} -.rd .pir-score{background:var(--ink);color:#fff;padding:12px 20px;text-align:center;min-width:120px} +.rd .pir-score{background:var(--ink);color:#fff;border-radius:18px;padding:12px 20px;text-align:center;min-width:120px} .rd .pir-score span{display:block;font-weight:600;font-size:.85rem} .rd .pir-score b{font-size:1.8rem;font-variant-numeric:tabular-nums} .rd .pir-game{display:grid;grid-template-columns:1fr 1fr;gap:28px;margin-top:28px;align-items:start} @media (max-width:900px){ .rd .pir-game{grid-template-columns:1fr} } -.rd .pir-photo{background:#fff;border:1px solid var(--line);display:grid;place-items:center;aspect-ratio:16/10;overflow:hidden;padding:20px} +.rd .pir-photo{background:linear-gradient(180deg,#f6ecf8,#fff);border-radius:20px;padding:24px 20px 10px} +.rd .pir-photo svg{width:100%;height:auto;display:block} .rd .pir-round{font-weight:700;color:var(--purple-deep);font-size:.92rem;display:block;margin-top:16px} -.rd .pir-info h4{font-size:1.5rem;margin:4px 0 12px} +.rd .pir-info h4{font-size:1.5rem;letter-spacing:-.02em;margin:4px 0 12px} .rd .pir-tags{display:flex;flex-wrap:wrap;gap:8px} -.rd .pir-label{font-weight:700;display:block} -.rd .pir-val{font-size:clamp(2.6rem,5vw,3.4rem);font-weight:700;color:var(--purple);font-variant-numeric:tabular-nums;margin:6px 0 14px} -.rd #pirSlider{-webkit-appearance:none;appearance:none;width:100%;height:12px;background:linear-gradient(90deg,var(--purple) var(--fill,32%),var(--tint-2) var(--fill,32%))} +.rd .pir-tags span{background:var(--tint);border-radius:999px;padding:6px 12px;font-weight:700;font-size:.92rem} +.rd .pir-tags span.bad{background:#fbe1df;color:#7a1a14} +.rd .pir-label{font-weight:800;display:block} +.rd .pir-val{font-size:clamp(2.6rem,5vw,3.4rem);font-weight:800;color:var(--purple);letter-spacing:-.03em;font-variant-numeric:tabular-nums;margin:6px 0 14px} +.rd #pirSlider{-webkit-appearance:none;appearance:none;width:100%;height:12px;border-radius:6px;background:linear-gradient(90deg,var(--purple) var(--fill,32%),var(--tint-2) var(--fill,32%))} .rd #pirSlider::-webkit-slider-thumb{-webkit-appearance:none;width:30px;height:30px;border-radius:50%;background:#fff;border:4px solid var(--purple);cursor:grab} .rd #pirSlider::-moz-range-thumb{width:24px;height:24px;border-radius:50%;background:#fff;border:4px solid var(--purple)} .rd .pir-scale{display:flex;justify-content:space-between;font-weight:600;font-size:.88rem;margin:8px 0 22px} .rd .pir-cmp{display:grid;grid-template-columns:repeat(3,1fr);gap:10px} -.rd .pir-cmp div{background:var(--tint);padding:12px} +.rd .pir-cmp div{background:var(--tint);border-radius:14px;padding:12px} .rd .pir-cmp span{display:block;font-weight:600;font-size:.85rem} .rd .pir-cmp b{font-size:1.25rem;font-variant-numeric:tabular-nums} .rd .pir-cmp b.fair{color:var(--purple)} -.rd .pir-verdict{font-weight:700;font-size:1.15rem;margin:16px 0 14px} +.rd .pir-verdict{font-weight:800;font-size:1.15rem;margin:16px 0 14px} .rd .pir-verdict.over{color:var(--red)} .rd .pir-break{list-style:none;margin:8px 0 16px;padding:0;display:flex;flex-direction:column;gap:10px} -.rd .pir-break li{display:grid;grid-template-columns:1fr 90px 82px;gap:10px;align-items:center;font-size:.95rem} -.rd .pir-break i{height:12px;width:var(--w)} +.rd .pir-break li{display:grid;grid-template-columns:1fr 90px 82px;gap:10px;align-items:center;font-size:.95rem;opacity:0;transform:translateY(8px);transition:opacity .4s var(--d),transform .4s var(--d)} +.rd .pir-reveal.go .pir-break li{opacity:1;transform:none} +.rd .pir-break i{height:12px;border-radius:6px;width:0;transition:width .7s calc(var(--d) + 150ms) cubic-bezier(.2,.9,.3,1)} +.rd .pir-reveal.go .pir-break i{width:var(--w)} .rd .pir-break i.base{background:var(--ink)} .rd .pir-break i.pos{background:var(--green)} .rd .pir-break i.neg{background:var(--red)} @@ -566,71 +967,99 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd .plan-tl h3{font-size:1.6rem} .rd .plan-tl>p{margin-top:6px} .rd .tl6{list-style:none;padding:0;margin:28px 0 0;display:grid;grid-template-columns:repeat(6,1fr);gap:12px;position:relative} -.rd .tl6::before{content:"";position:absolute;left:0;right:0;top:15px;height:4px;background:var(--tint-2)} +.rd .tl6::before{content:"";position:absolute;left:0;right:0;top:15px;height:4px;background:var(--tint-2);border-radius:2px} .rd .tl6 li{position:relative;padding-top:40px} .rd .tl6 li::before{content:"";position:absolute;top:4px;left:0;width:26px;height:26px;border-radius:50%;background:#fff;border:4px solid var(--tint-2)} .rd .tl6 li.past::before{background:var(--purple);border-color:var(--purple)} -.rd .tl6 li.now::before{border-color:var(--purple);background:#fff} -.rd .tl-w{display:block;font-weight:700} +.rd .tl6 li.now::before{border-color:var(--purple);background:#fff;box-shadow:0 0 0 6px rgba(149,51,165,.2)} +.rd .tl-w{display:block;font-weight:800} .rd .tl-d{display:block;font-weight:600;font-size:.9rem;color:var(--purple-deep)} .rd .tl6 p{margin-top:8px;font-size:.95rem;line-height:1.55} -.rd .tl-now{display:inline-block;margin-top:10px;background:var(--purple);color:#fff;font-weight:700;font-size:.8rem;padding:4px 10px} +.rd .tl-now{display:inline-block;margin-top:10px;background:var(--purple);color:#fff;font-weight:700;font-size:.8rem;border-radius:999px;padding:4px 10px} @media (max-width:900px){ .rd .tl6{grid-template-columns:1fr;gap:18px} .rd .tl6::before{left:11px;right:auto;top:0;bottom:0;width:4px;height:auto} .rd .tl6 li{padding:0 0 0 44px} .rd .tl6 li::before{top:0} } -.rd .pir-start{margin-top:28px;background:var(--tint);padding:28px} +@media (prefers-reduced-motion:reduce){ +.rd .pir-break li,.rd .pir-break i{transition:none} +} +.rd .pir-start{margin-top:28px;background:var(--tint);border-radius:20px;padding:28px} .rd .pir-start p{margin:8px 0 18px;line-height:1.6;max-width:560px} .rd .pir-start-row{display:flex;gap:12px;flex-wrap:wrap} -.rd #pirState{font:inherit;font-weight:600;color:var(--ink);background:#fff;border:1.5px solid var(--line);padding:13px 16px;min-width:240px} +.rd #pirState{font:inherit;font-weight:600;color:var(--ink);background:#fff;border:1.5px solid var(--line);border-radius:14px;padding:13px 16px;min-width:240px} .rd #pirState:focus{outline:3px solid var(--purple);outline-offset:2px} -.rd #pirGo[disabled]{opacity:.45;cursor:default} -.rd .pir-photo{background:#fff;border:1px solid var(--line);display:grid;place-items:center;aspect-ratio:16/10;overflow:hidden;padding:20px} -.rd .pir-photo img{max-width:92%;max-height:88%;object-fit:contain} +.rd .pir-go[disabled],.rd #pirGo[disabled]{opacity:.45;cursor:default} +.rd .pir-photo{background:#fff!important;border:1px solid var(--line);display:grid;place-items:center;aspect-ratio:16/10;overflow:hidden} +.rd .pir-photo img{max-width:92%;max-height:88%;object-fit:contain;opacity:0;transform:translateX(40px);transition:opacity .5s,transform .6s cubic-bezier(.2,.9,.3,1)} +.rd .pir-photo img.in{opacity:1;transform:none} +.rd .pir-tags span.loc{background:var(--purple);color:#fff} .rd .pir-change{margin-top:12px;border:0;background:none;padding:0;font:inherit;font-weight:700;color:var(--purple);cursor:pointer;text-decoration:underline;text-underline-offset:3px} .rd .pir-break li.state{padding-top:10px;border-top:1px dashed var(--line)} .rd .pir-break i.zero{background:var(--tint-2)} @media (prefers-reduced-motion:reduce){ +.rd .pir-photo img{transition:none;opacity:1;transform:none} } - +.rd .pv-tag{background:var(--ink);color:#fff} .rd .pv{display:grid;grid-template-columns:1fr minmax(320px,480px);gap:56px;align-items:center} @media (max-width:900px){ .rd .pv{grid-template-columns:1fr;gap:28px} } -.rd .pv-card{background:#fff;border:1px solid var(--line);padding:22px} -.rd .pv-photo{border:1px solid var(--line);aspect-ratio:16/9;display:grid;place-items:center;overflow:hidden;background:#fff} +.rd .pv-card{background:#fff;border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b;border-radius:24px;padding:22px} +.rd .pv-photo{border-radius:16px;border:1px solid var(--line);aspect-ratio:16/9;display:grid;place-items:center;overflow:hidden;background:#fff} .rd .pv-photo img{max-width:90%;max-height:88%;object-fit:contain} .rd .pv-card h3{font-size:1.35rem;margin:16px 0 10px} -.rd .pv-q{font-weight:700;margin:18px 0 10px} +.rd .pv-q{font-weight:800;margin:18px 0 10px} .rd .pv-opts{display:grid;grid-template-columns:repeat(3,1fr);gap:10px} -.rd .pv-opts button{font:inherit;font-weight:700;font-size:1.1rem;padding:14px 8px;border:2px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;transition:border-color .2s;font-variant-numeric:tabular-nums} -.rd .pv-opts button:hover:not(:disabled){border-color:var(--purple)} +.rd .pv-opts button{font:inherit;font-weight:800;font-size:1.1rem;padding:14px 8px;border-radius:14px;border:2px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;transition:border-color .2s,background .2s,transform .15s;font-variant-numeric:tabular-nums} +.rd .pv-opts button:hover:not(:disabled){border-color:var(--purple);transform:translateY(-2px)} .rd .pv-opts button:disabled{cursor:default} .rd .pv-opts button.right{background:#e3f3e8;border-color:var(--green);color:#14512b} .rd .pv-opts button.wrong{background:#fbe1df;border-color:var(--red);color:#7a1a14} -.rd .pv-out{margin-top:14px;line-height:1.6} -.rd .pv-out a{color:var(--purple);font-weight:700} +.rd .pv-out{margin-top:14px;line-height:1.6;opacity:0;transform:translateY(8px);transition:opacity .35s,transform .35s} +.rd .pv-out.in{opacity:1;transform:none} +.rd .pv-out a{color:var(--purple);font-weight:800} @media (prefers-reduced-motion:reduce){ .rd .pv-out,.rd .pv-opts button{transition:none} } - +.rd .socials-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:48px} +@media (max-width:1000px){ +.rd .socials-grid{grid-template-columns:1fr 1fr} +} +@media (max-width:560px){ +.rd .socials-grid{grid-template-columns:1fr} +} +.rd .soc{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:14px;background:#fff;border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b;border-radius:22px;padding:20px;transition:transform .15s,box-shadow .15s} +.rd .soc:hover{transform:translate(-2px,-2px);box-shadow:8px 8px 0 #7d2a8b} +.rd .soc-ic{flex:none;width:52px;height:52px;border-radius:16px;background:var(--tint-2);color:var(--purple);display:grid;place-items:center} +.rd .soc-txt{min-width:0} +.rd .soc-pf{display:block;font-weight:700;font-size:.9rem;color:var(--purple-deep)} +.rd .soc-txt b{display:block;font-size:1.12rem;white-space:nowrap} +.rd .soc-go{position:absolute;top:22px;right:20px;color:var(--purple);transition:transform .2s} +.rd .soc:hover .soc-go{transform:translate(2px,-2px)} +@media (prefers-reduced-motion:reduce){ +.rd .soc,.rd .soc-go{transition:none} +.rd .soc:hover{transform:none} +} .rd .yoyo{height:380vh;padding:0} .rd .yoyo-sticky{position:sticky;top:calc(env(safe-area-inset-top,0px) + 76px);height:calc(100vh - 76px);height:calc(100svh - 76px);display:flex;align-items:center} .rd .yoyo-sticky .wrap{width:100%} .rd .yoyo-stage{position:relative;margin-top:24px} .rd .yoyo-svg{width:100%;height:auto;display:block;overflow:visible} - -.rd .yy-day{position:absolute;top:4%;left:50%;transform:translateX(-50%);background:var(--ink);color:#fff;font-weight:700;padding:6px 14px;font-variant-numeric:tabular-nums} -.rd .yy-contract{position:absolute;top:0;left:2%;padding:12px 16px;display:flex;flex-direction:column;gap:2px;border:2px solid;background:#fff} +.rd #yyPhone.ring{animation:rd-ring3 .35s ease-in-out infinite;transform-box:fill-box;transform-origin:center} +@keyframes rd-ring3{0%,100%{transform:rotate(-6deg)}50%{transform:rotate(6deg)}} +.rd .yy-day{position:absolute;top:4%;left:50%;transform:translateX(-50%);background:var(--ink);color:#fff;font-weight:800;border-radius:999px;padding:8px 18px;font-variant-numeric:tabular-nums} +.rd .yy-contract{position:absolute;top:0;left:2%;border-radius:16px;padding:12px 16px;display:flex;flex-direction:column;gap:2px;border:3px solid;box-shadow:5px 5px 0 currentColor;background:#fff;transition:transform .35s;animation:rd-flip .5s ease} .rd .yy-contract.ok{color:#1d6b3a} .rd .yy-contract.bad{color:#b3261e} .rd .yy-contract span{font-weight:700;font-size:.85rem} .rd .yy-contract b{font-size:1.4rem;color:var(--ink)} -.rd .yy-contract em{font-style:normal;font-weight:700} +.rd .yy-contract em{font-style:normal;font-weight:800} +@keyframes rd-flip{from{transform:rotateY(90deg)}to{transform:none}} .rd .yy-caption{max-width:680px;margin:18px auto 0;text-align:center;min-height:96px} .rd .yy-caption p{margin-top:10px;font-size:1.2rem;font-weight:700;line-height:1.5} +.rd .yy-caption.in{animation:rd-pop .4s cubic-bezier(.2,.9,.3,1.2)} @media (max-width:760px){ .rd .yy-contract{position:static;margin:0 auto 10px;width:max-content} .rd .yy-day{top:auto;bottom:-6px} @@ -639,29 +1068,32 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (prefers-reduced-motion:reduce){ .rd .yoyo{height:auto} .rd .yoyo-sticky{position:static;height:auto;padding:72px 0} - +.rd #yyPhone.ring{animation:none} } .rd .fs{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:start} @media (max-width:900px){ .rd .fs{grid-template-columns:1fr;gap:28px} } -.rd .fs-paper-wrap{position:relative} -.rd .fs-paper{position:relative;display:grid;grid-template-columns:1fr 1fr;background:#fff} +.rd .fs-paper-wrap{position:relative;padding-bottom:70px} +.rd .fs-paper{position:relative;z-index:2;display:grid;grid-template-columns:1fr 1fr;background:#fffdf7;border-radius:6px;box-shadow:0 24px 48px -26px rgba(42,15,49,.45);transform:rotate(-1.5deg);background-image:repeating-linear-gradient(transparent 0 31px,#e7dff0 31px 32px)} .rd .fs-cell{position:relative;padding:28px 22px 34px;min-height:150px;border:2px solid #2a0f31;margin:-1px} .rd .fs-cell span{display:block;font-weight:700;font-size:.95rem} .rd .fs-cell b{display:block;font-family:"Caveat","Segoe Print","Comic Sans MS",cursive;font-size:2.6rem;font-weight:700;color:#1b3a8a;margin-top:10px;line-height:1} .rd .fs-pay{background:rgba(149,51,165,.08)} - -.rd .fs-pay s{position:absolute;right:18px;top:26px;font-family:"Caveat","Segoe Print",cursive;font-size:1.6rem;color:#b3261e;opacity:.6} -.rd .fs-hidden{margin:0 10%;background:#b3261e;color:#fff;padding:16px 20px 14px;display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap} +.rd .fs-pay b.pop{animation:rd-pop .45s cubic-bezier(.2,.9,.3,1.3)} +.rd .fs-pay s{position:absolute;right:18px;top:26px;font-family:"Caveat","Segoe Print",cursive;font-size:1.6rem;color:#b3261e;opacity:0} +.rd .fs-pay s.go{animation:rd-strike .9s ease forwards} +@keyframes rd-strike{0%{opacity:1;transform:none}100%{opacity:.55;transform:translateY(-4px) rotate(-6deg)}} +.rd .fs-hidden{position:absolute;left:10%;right:10%;bottom:0;z-index:1;background:#b3261e;color:#fff;border-radius:0 0 16px 16px;padding:16px 20px 14px;display:flex;justify-content:space-between;align-items:baseline;gap:12px;transform:translateY(-70px);opacity:0;transition:transform .6s cubic-bezier(.2,.9,.3,1.1),opacity .4s} +.rd .fs-hidden.out{transform:none;opacity:1} .rd .fs-hidden span{font-weight:700;font-size:.9rem} .rd .fs-hidden b{font-size:1.5rem;font-variant-numeric:tabular-nums} - -.rd .fs-chat{background:#fff;padding:16px;display:flex;flex-direction:column;gap:10px;min-height:250px;max-height:320px;overflow:auto;border:1px solid var(--line)} -.rd .fs-total{margin-top:18px;background:#fff;border:1px solid var(--line);padding:18px 20px} +.rd .fs-hidden.bump b{animation:rd-pop .45s cubic-bezier(.2,.9,.3,1.3)} +.rd .fs-chat{background:#fff;border-radius:20px;padding:16px;display:flex;flex-direction:column;gap:10px;min-height:250px;max-height:320px;overflow:auto;border:1px solid var(--line)} +.rd .fs-total{margin-top:18px;background:#fff;border-radius:18px;padding:18px 20px} .rd .fs-total-row{display:flex;justify-content:space-between;align-items:baseline;font-weight:700} .rd .fs-total-row b{font-size:1.6rem;font-variant-numeric:tabular-nums} -.rd .fs-bar{display:flex;height:16px;overflow:hidden;background:var(--tint);margin-top:12px} +.rd .fs-bar{display:flex;height:16px;border-radius:8px;overflow:hidden;background:var(--tint);margin-top:12px} .rd .fs-bar i{display:block;height:100%;transition:width .6s cubic-bezier(.2,.9,.3,1)} .rd #fsBarP{background:var(--ink)} .rd #fsBarI{background:var(--red)} @@ -669,32 +1101,216 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- @media (prefers-reduced-motion:reduce){ .rd .fs-hidden,.rd .fs-bar i{transition:none} } -.rd .bro{display:grid;grid-template-columns:minmax(200px,280px) 1fr;gap:56px;align-items:center} +.rd .bro{display:grid;grid-template-columns:minmax(200px,300px) 1fr;gap:56px;align-items:center;background:var(--tint);border-radius:32px;padding:44px} @media (max-width:760px){ .rd .bro{grid-template-columns:1fr;padding:28px;gap:28px} } .rd .bro-cover{perspective:900px} -.rd .bro-cover img{width:100%;height:auto;display:block;border:1px solid var(--line)} -.rd .bro-soon{margin-top:18px;font-weight:700} - +.rd .bro-cover img{width:100%;border-radius:10px;display:block;box-shadow:12px 18px 40px -12px rgba(42,15,49,.5);transform:rotateY(-14deg) rotateZ(-2deg);transition:transform .5s} +.rd .bro-cover:hover img{transform:rotateY(0) rotateZ(0)} +.rd .bro-soon{margin-top:22px;display:inline-flex;align-items:center;gap:10px;background:#fff;border-radius:999px;padding:10px 18px;font-weight:700} +.rd .dot-live{width:10px;height:10px;border-radius:50%;background:var(--purple);box-shadow:0 0 0 0 rgba(149,51,165,.5);animation:rd-live 1.6s infinite} +@keyframes rd-live{70%{box-shadow:0 0 0 10px rgba(149,51,165,0)}100%{box-shadow:0 0 0 0 rgba(149,51,165,0)}} +@media (prefers-reduced-motion:reduce){ +.rd .dot-live{animation:none} +.rd .bro-cover img{transition:none} +} .rd .vbox.portrait{max-width:min(400px,92vw)} .rd .vbox.portrait video{aspect-ratio:9/16;max-height:78vh;object-fit:cover} - -.rd .vd{background:#fff;border:1px solid var(--line);padding:clamp(24px,4vw,44px)} - -.rd .vd-title{font-size:clamp(2.6rem,6vw,4.6rem);line-height:1} +.rd .t-flagged{--tc:#b3261e} +.rd .t-caution{--tc:#b07a00} +.rd .t-clear{--tc:#1d6b3a} +.rd .t-all{--tc:var(--purple)} +.rd .dm-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap} +.rd .dm-chips{display:flex;gap:8px;flex-wrap:wrap} +.rd .dm-chips button{display:inline-flex;align-items:center;gap:8px;font:inherit;font-weight:700;border:1.5px solid var(--line);background:#fff;border-radius:999px;padding:9px 16px;cursor:pointer;color:var(--ink)} +.rd .dm-chips button i,.rd .dm-list i,.rd .dm-key i{width:12px;height:12px;border-radius:50%;background:var(--tc);display:inline-block;flex:none} +.rd .dm-chips button b{font-size:.82rem;background:var(--tint);border-radius:999px;padding:1px 8px} +.rd .dm-chips button[aria-pressed="true"]{border-color:var(--ink);background:var(--ink);color:#fff} +.rd .dm-chips button[aria-pressed="true"] b{background:rgba(255,255,255,.2)} +.rd .dm-search{display:flex;align-items:center;gap:8px;border:1.5px solid var(--line);border-radius:999px;padding:0 16px;background:#fff;min-width:260px} +.rd .dm-search input{border:0;outline:0;font:inherit;padding:11px 0;width:100%;background:none;color:var(--ink)} +.rd .dm-search:focus-within{border-color:var(--purple)} +.rd .dm{display:grid;grid-template-columns:1fr 340px;gap:20px;margin-top:20px} +@media (max-width:960px){ +.rd .dm{grid-template-columns:1fr} +} +.rd .dm-map{position:relative;border-radius:24px;overflow:hidden;border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b;background:#faf6fb;touch-action:none;height:clamp(420px,62vh,640px)} +.rd .dm-map svg{display:block;width:100%;height:100%;cursor:grab} +.rd .dm-map.grab svg{cursor:grabbing} +.rd .dm-city{font:800 17px "Plus Jakarta Sans",sans-serif;fill:#5e1a6b;opacity:.55;pointer-events:none;letter-spacing:.02em} +.rd .dm-city.sea{fill:#5b7fa8;font-style:italic;font-weight:700} +.rd .dm-pin{cursor:pointer;outline:none} +.rd .dm-pin .dot{fill:var(--tc);stroke:#fff;stroke-width:2.5;transition:r .2s} +.rd .dm-pin .ring{fill:none;stroke:var(--tc);stroke-width:2;opacity:0} +.rd .dm-map.live .dm-pin .ring{animation:rd-dmring 2.2s ease-out infinite var(--d)} +@keyframes rd-dmring{0%{r:7;opacity:.9}100%{r:22;opacity:0}} +.rd .dm-pin{opacity:0;transition:opacity .4s} +.rd .dm-map.live .dm-pin{opacity:1;animation:rd-dmdrop .6s cubic-bezier(.2,.9,.3,1.4) both var(--d)} +@keyframes rd-dmdrop{from{opacity:0;translate:0 -30px}to{opacity:1;translate:0 0}} +.rd .dm-pin:hover .dot,.rd .dm-pin:focus-visible .dot,.rd .dm-pin.sel .dot{r:10;stroke:var(--ink)} +.rd .dm-pin.dim{opacity:.12!important;pointer-events:none} +.rd .dm-tip{position:absolute;transform:translate(-50%,-100%);background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;padding:6px 10px;border-radius:8px;pointer-events:none;white-space:nowrap} +.rd .dm-pop{position:absolute;width:min(340px,calc(100% - 20px));max-height:calc(100% - 20px);overflow:auto;background:#fff;border-radius:18px;padding:20px;box-shadow:0 24px 48px -16px rgba(42,15,49,.5);border:1px solid var(--line);opacity:0;transform:scale(.94);transition:opacity .3s,transform .3s cubic-bezier(.2,.9,.3,1.2)} +.rd .dm-pop.in{opacity:1;transform:none} +.rd .dm-x{position:absolute;top:10px;right:10px;width:32px;height:32px;border-radius:50%;border:0;background:var(--tint);font-size:1.3rem;cursor:pointer;color:var(--ink)} +.rd .dm-badge{display:inline-block;font-weight:800;font-size:.82rem;color:#fff;background:var(--tc);border-radius:999px;padding:4px 12px} +.rd .dm-pop h3{font-size:1.25rem;margin:10px 30px 4px 0;letter-spacing:-.015em} +.rd .dm-addr{font-size:.92rem;line-height:1.45} +.rd .dm-rev{display:flex;align-items:center;gap:5px;margin-top:14px;flex-wrap:wrap} +.rd .dm-rev i{width:16px;height:16px;border-radius:4px;background:#e3f3e8} +.rd .dm-rev i.bad{background:#b3261e} +.rd .dm-rev span{margin-left:6px;font-size:.92rem} +.rd .dm-h{font-weight:800;margin-top:16px;font-size:.95rem} +.rd .dm-cats{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:6px} +.rd .dm-cats li{background:var(--tint);border-radius:10px;padding:8px 12px;font-size:.92rem} +.rd .dm-cat-top{display:flex;justify-content:space-between;gap:10px;font-weight:600} +.rd .dm-cats q{display:block;margin-top:6px;padding-left:10px;border-left:3px solid var(--tc);font-style:italic;line-height:1.5;font-size:.9rem} +.rd .dm-cats q::before{content:"“"} +.rd .dm-cats q::after{content:"”"} +.rd .dm-attr{margin-top:8px;font-size:.82rem;font-weight:600;color:var(--purple-deep)} +.rd .dm-ok{margin-top:14px;font-weight:600;color:#14512b} +.rd .dm-link{display:inline-block;margin-top:16px;font-weight:800;color:var(--purple)} +.rd .dm-ctrl{position:absolute;right:14px;top:14px;display:flex;flex-direction:column;gap:6px} +.rd .dm-ctrl button{width:40px;height:40px;border-radius:12px;border:1px solid var(--line);background:#fff;font:inherit;font-size:1.3rem;font-weight:700;cursor:pointer;color:var(--ink);box-shadow:0 4px 10px -4px rgba(42,15,49,.3)} +.rd .dm-note{position:absolute;left:14px;bottom:12px;background:rgba(255,255,255,.9);border-radius:999px;padding:5px 12px;font-size:.82rem;font-weight:600} +.rd .dm-side{display:flex;flex-direction:column;min-height:0;height:clamp(420px,62vh,640px);background:#fff;border:1px solid var(--line);border-radius:24px;overflow:hidden} +@media (max-width:960px){ +.rd .dm-side{height:360px} +} +.rd .dm-count{padding:16px 18px;font-weight:800;border-bottom:1px solid var(--line)} +.rd .dm-list{list-style:none;margin:0;padding:6px;overflow:auto;flex:1} +.rd .dm-list button{width:100%;display:flex;gap:12px;align-items:flex-start;text-align:left;border:0;background:none;padding:10px 12px;border-radius:12px;font:inherit;color:var(--ink);cursor:pointer} +.rd .dm-list i{margin-top:5px} +.rd .dm-list b{display:block;font-size:.98rem} +.rd .dm-list em{font-style:normal;font-size:.86rem;color:var(--purple-deep);font-weight:600} +.rd .dm-list button:hover{background:var(--tint)} +.rd .dm-list li.sel button{background:var(--tint-2)} +.rd .dm-empty{padding:18px;font-weight:600} +.rd .dm-key{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:24px} +@media (max-width:760px){ +.rd .dm-key{grid-template-columns:1fr} +} +.rd .dm-key div{display:grid;grid-template-columns:14px 1fr;gap:4px 10px;align-items:center;background:var(--tint);border-radius:16px;padding:14px 16px} +.rd .dm-key span{grid-column:2;font-size:.94rem;line-height:1.5} +@media (prefers-reduced-motion:reduce){ +.rd .dm-map.live .dm-pin{animation:none;opacity:1} +.rd .dm-pin{opacity:1} +.rd .dm-map.live .dm-pin .ring{animation:none} +.rd .dm-pop{transition:none} +} +.rd .dm-sat{display:flex;align-items:center;gap:16px;background:var(--ink);color:#fff;border-radius:20px;padding:16px 20px;margin-bottom:20px;transition:transform .15s} +.rd .dm-sat:hover{transform:translateY(-2px)} +.rd .dm-sat-ic{width:44px;height:44px;border-radius:14px;background:var(--purple);display:grid;place-items:center;flex:none} +.rd .dm-sat b{display:block;font-size:1.05rem} +.rd .dm-sat em{font-style:normal;font-size:.92rem;opacity:.9} +.rd .dm-sat-go{margin-left:auto;font-size:1.4rem;font-weight:800} +.rd .dm-cats-key{margin-top:28px;background:#fff;border:1px solid var(--line);border-radius:24px;padding:28px} +.rd .dm-cats-key h3{font-size:1.4rem} +.rd .dm-cats-key>p{margin-top:8px;line-height:1.6;max-width:760px} +.rd .dm-cats-key ol{list-style:none;counter-reset:c;margin:20px 0 0;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:14px 28px} +@media (max-width:760px){ +.rd .dm-cats-key ol{grid-template-columns:1fr} +} +.rd .dm-cats-key li{display:grid;grid-template-columns:34px 1fr;gap:2px 12px;counter-increment:c} +.rd .dm-cats-key li::before{content:counter(c);grid-row:span 2;width:34px;height:34px;border-radius:10px;background:var(--tint-2);color:var(--purple-deep);display:grid;place-items:center;font-weight:800} +.rd .dm-cats-key li span{font-size:.94rem;line-height:1.5} +.rd .vd{background:#fff;border:4px solid var(--ink);box-shadow:10px 10px 0 var(--purple);border-radius:28px;padding:clamp(24px,4vw,52px)} +.rd .vd-head{border-bottom:3px solid var(--ink);padding-bottom:24px;margin-bottom:28px} +.rd .vd-title{font-size:clamp(2.6rem,6vw,4.6rem);letter-spacing:-.04em;line-height:1} .rd .vd-lede{margin-top:14px;font-size:1.2rem;font-weight:600;line-height:1.6;max-width:720px} - -.rd .vd-accept{margin-top:28px;border-top:var(--divider);padding-top:24px;display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap} +.rd .vd-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px} +@media (max-width:820px){ +.rd .vd-grid{grid-template-columns:1fr} +} +.rd .vd-item{background:var(--tint);border-radius:18px;padding:22px 22px 20px;position:relative} +.rd .vd-item:first-child{grid-column:1/-1;background:var(--ink);color:#fff} +.rd .vd-item:first-child .vd-n{background:var(--purple);color:#fff} +.rd .vd-n{display:inline-block;font-weight:800;font-size:.85rem;background:#fff;color:var(--purple-deep);border-radius:999px;padding:3px 10px;margin-bottom:10px;font-variant-numeric:tabular-nums} +.rd .vd-item h3{font-size:1.2rem;margin-bottom:8px;letter-spacing:-.015em} +.rd .vd-item:first-child h3{font-size:1.6rem} +.rd .vd-item p{line-height:1.65} +.rd .vd-sub{font-size:clamp(2rem,4vw,2.8rem);margin:44px 0 20px} +.rd .vd-steps{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(4,1fr);gap:16px;position:relative} +@media (max-width:980px){ +.rd .vd-steps{grid-template-columns:1fr 1fr} +} +@media (max-width:560px){ +.rd .vd-steps{grid-template-columns:1fr} +} +.rd .vd-steps li{border:3px solid #a53ab8;box-shadow:6px 6px 0 #7d2a8b;border-radius:20px;padding:22px;background:#fff} +.rd .vd-sn{width:42px;height:42px;border-radius:12px;background:var(--purple);color:#fff;display:grid;place-items:center;font-weight:800;font-size:1.2rem;margin-bottom:14px} +.rd .vd-steps h3{font-size:1.3rem;margin-bottom:8px} +.rd .vd-steps p{line-height:1.6;font-size:.98rem} +.rd .vd .dm-cats-key{margin-top:28px;border:0;background:var(--tint)} +.rd .vd-fine{margin-top:18px;font-weight:600;font-size:.92rem;color:var(--purple-deep)} +.rd .vd-accept{margin-top:32px;border-top:3px solid var(--ink);padding-top:26px;display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap} .rd .vd-check{display:flex;gap:14px;align-items:flex-start;max-width:720px;cursor:pointer;font-weight:700;line-height:1.55;font-size:1.05rem} .rd .vd-check input{width:26px;height:26px;margin-top:1px;accent-color:var(--purple);flex:none} -.rd .vd-go{font:inherit;font-weight:700;font-size:1.1rem;border:0;padding:16px 30px;background:var(--purple);color:#fff;cursor:pointer;transition:background .2s,opacity .2s} +.rd .vd-go{font:inherit;font-weight:800;font-size:1.1rem;border:0;border-radius:999px;padding:16px 30px;background:var(--purple);color:#fff;cursor:pointer;transition:background .2s,opacity .2s} .rd .vd-go:hover:not(:disabled){background:var(--purple-dark)} .rd .vd-go:disabled{opacity:.35;cursor:not-allowed} - -.rd .hero-photo{margin:0;justify-self:center;width:100%;max-width:600px} -.rd .hero-photo img{display:block;width:100%;height:auto;aspect-ratio:6/5;object-fit:cover;object-position:40% 60%} - +.rd .vd.done{opacity:.55} +.rd .vd-launch{display:flex;align-items:center;gap:18px;background:var(--ink);color:#fff;border-radius:24px;padding:22px 26px;margin-top:28px;box-shadow:8px 8px 0 var(--purple)} +.rd .vd-launch.in{animation:rd-pop .5s cubic-bezier(.2,.9,.3,1.3)} +.rd .vd-launch-ic{width:56px;height:56px;border-radius:16px;background:var(--purple);display:grid;place-items:center;flex:none} +.rd .vd-launch b{display:block;font-size:1.35rem} +.rd .vd-launch em{font-style:normal;opacity:.9} +.rd .vd-launch-go{margin-left:auto;font-size:1.8rem;font-weight:800} +.rd .nw-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:24px;margin-top:48px} +@media (max-width:640px){ +.rd .nw-grid{grid-template-columns:1fr} +} +.rd .nw{display:flex;flex-direction:column;background:#fff;border-radius:6px;overflow:hidden;box-shadow:0 1px 0 var(--line),0 18px 40px -26px rgba(42,15,49,.45);transition:transform .2s,box-shadow .2s} +.rd .nw:hover{transform:translateY(-3px);box-shadow:0 1px 0 var(--line),0 26px 50px -24px rgba(42,15,49,.5)} +.rd .nw:hover h3{text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:4px} +.rd .nw-img{position:relative;aspect-ratio:16/9;overflow:hidden;background:#2a0f31} +.rd .nw-img svg{display:block;width:100%;height:100%} +.rd .nw-credit{position:absolute;left:0;bottom:0;background:#1b1b1b;color:#fff;font-size:.75rem;font-style:italic;padding:5px 10px} +.rd .nw-body{padding:20px 22px 22px;display:flex;flex-direction:column;gap:8px;flex:1} +.rd .nw-kicker{font-size:.78rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#c2410c} +.rd .nw h3{font-family:"Bitter",Georgia,serif;font-weight:700;font-size:1.45rem;line-height:1.2;letter-spacing:-.01em} +.rd .nw-by{font-size:.74rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase} +.rd .nw-dek{font-family:"Bitter",Georgia,serif;font-weight:400;font-size:1.02rem;line-height:1.6;flex:1} +.rd .nw-take{margin-top:6px;background:var(--tint);border-radius:12px;padding:12px 14px;line-height:1.55;font-weight:600} +.rd .nw-take b{display:block;font-size:.8rem;color:var(--purple);margin-bottom:2px;text-transform:uppercase;letter-spacing:.06em} +.rd .nw-go{margin-top:6px;font-weight:800;color:var(--purple)} +.rd .nw:first-child{grid-column:1/-1;flex-direction:row} +.rd .nw:first-child .nw-img{flex:0 0 56%;aspect-ratio:auto;min-height:360px} +.rd .nw:first-child h3{font-size:2.2rem} +.rd .nw:first-child .nw-dek{font-size:1.15rem} +@media (max-width:900px){ +.rd .nw:first-child{flex-direction:column} +.rd .nw:first-child .nw-img{flex:none;aspect-ratio:16/9;min-height:0} +.rd .nw:first-child h3{font-size:1.7rem} +} +@media (prefers-reduced-motion:reduce){ +.rd .nw{transition:none} +.rd .nw:hover{transform:none} +} +.rd .hero-photo{position:relative;margin:0;justify-self:center;width:100%;max-width:600px;padding:28px 0 36px} +.rd .hero-photo img{display:block;width:100%;aspect-ratio:6/5;object-fit:cover;object-position:40% 60%;border-radius:28px;border:3px solid #a53ab8;box-shadow:8px 8px 0 #7d2a8b} +.rd .hp-card{position:absolute;display:flex;align-items:center;gap:12px;background:#fff;border-radius:16px;padding:11px 16px 11px 11px;box-shadow:0 16px 32px -14px rgba(42,15,49,.45);animation:rd-hb-float 6s ease-in-out infinite} +.rd .hp-card b{display:block;font-size:.95rem;line-height:1.2} +.rd .hp-card em{display:block;font-style:normal;font-size:.82rem;font-weight:600;color:var(--purple-deep)} +.rd .hp-ic{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font-weight:800;flex:none} +.rd .hp-ic.ok{background:#e3f3e8;color:#1d6b3a} +.rd .hp-ic.bad{background:#fbe1df;color:#b3261e;font-size:1.1rem} +.rd .hp-ic.pur{background:var(--purple);color:#fff} +.rd .hp-c1{left:-28px;bottom:14%} +.rd .hp-c2{right:-18px;top:0;animation-delay:-2s} +.rd .hp-c3{right:-18px;bottom:6px;animation-delay:-4s} +@media (max-width:960px){ +.rd .hp-c1{left:-6px} +.rd .hp-c2{right:-6px} +.rd .hp-c3{right:-6px} +} +@media (max-width:520px){ +.rd .hp-c1{display:none} +} +@media (prefers-reduced-motion:reduce){ +.rd .hp-card{animation:none} +} .rd-ftr{background:var(--ink);color:#fff;padding:80px 0 40px} .rd .fgrid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:48px} @media (max-width:900px){ @@ -708,4 +1324,6 @@ html:has(.rd-page){scroll-behavior:smooth;scroll-padding-top:calc(env(safe-area- .rd-ftr ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:11px} .rd-ftr ul a:hover{color:#e0b3e8} .rd .fbot{margin-top:56px;padding-top:24px;border-top:1px solid rgba(255,255,255,.2);display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px} - +@media (prefers-reduced-motion:reduce){ +.rd .notif{opacity:1;transform:none} +} diff --git a/lib/rights-laws.ts b/components/sections/RightsPhoneDemo.tsx similarity index 50% rename from lib/rights-laws.ts rename to components/sections/RightsPhoneDemo.tsx index cb6f88c..a2c5de4 100644 --- a/lib/rights-laws.ts +++ b/components/sections/RightsPhoneDemo.tsx @@ -1,7 +1,58 @@ -// Car-buying laws shown on /rights. Moved out of the old phone demo so the -// page can list them as plain text. +"use client"; -export type Law = { +import { useState, useRef, useEffect } from "react"; + +// ── State name matching (ported from the prototype) ────────── +const US_STATE_NAMES = [ + "Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut", + "Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa", + "Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan", + "Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire", + "New Jersey","New Mexico","New York","North Carolina","North Dakota","Ohio", + "Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota", + "Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia", + "Wisconsin","Wyoming", +]; + +function levenshtein(a: string, b: string): number { + const m = a.length, n = b.length; + const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0)); + for (let i = 0; i <= m; i++) dp[i][0] = i; + for (let j = 0; j <= n; j++) dp[0][j] = j; + for (let i = 1; i <= m; i++) { + for (let j = 1; j <= n; j++) { + dp[i][j] = a[i - 1] === b[j - 1] + ? dp[i - 1][j - 1] + : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]); + } + } + return dp[m][n]; +} + +function capitalizeWords(s: string): string { + return s.replace(/\w\S*/g, (t) => t.charAt(0).toUpperCase() + t.slice(1).toLowerCase()); +} + +function resolveState(raw: string): string | null { + const v = raw.trim(); + if (!v) return null; + const lower = v.toLowerCase(); + if (lower === "ca" || lower === "calif" || lower === "calif.") return "California"; + if (lower === "tx" || lower === "tex" || lower === "tex.") return "Texas"; + + let best: string | null = null; + let bestDist = Infinity; + for (const name of US_STATE_NAMES) { + const d = levenshtein(lower, name.toLowerCase()); + if (d < bestDist) { bestDist = d; best = name; } + } + const threshold = Math.max(1, Math.floor((best?.length ?? 0) * 0.25)); + if (best && bestDist <= threshold) return best; + return capitalizeWords(v); +} + +// ── Law data ─────────────────────────────────────────────── +type Law = { tag: string; title: string; citation: string; @@ -10,7 +61,7 @@ export type Law = { escalation: string; }; -export const FEDERAL_LAWS: Law[] = [ +const federalLaws: Law[] = [ { tag: "TILA", title: "Truth in Lending Act", citation: "15 U.S.C. § 1601", plain: "The dealer must show you the full true cost of the loan before you sign anything: the APR, the finance charge, and the total of all payments.", script: "Show me the APR, the finance charge, and the total of all payments, right now, before I sign anything.", @@ -33,19 +84,12 @@ export const FEDERAL_LAWS: Law[] = [ escalation: "If the explanation doesn't add up, you can sue for damages, and regulators can pursue civil penalties against the dealer." }, ]; -// Applies everywhere: cars are carved out of the FTC Cooling-Off Rule. -export const COOLING_OFF: Law = { tag: "FTC-COR", title: "No Automatic Right to Cancel", citation: "16 CFR Part 429, FTC Cooling-Off Rule", - plain: "The FTC's Cooling-Off Rule gives buyers three days to cancel certain purchases, but it explicitly excludes cars sold at a dealer's permanent location. Once you sign, the deal is final unless the dealer agrees in writing to something more.", - script: "Will you put a cancellation window into the contract, in writing, before I sign?", - escalation: "Don't assume a \u201Ccooling-off period\u201D exists by default. Federal law specifically carves cars out of it. If you want an exit, negotiate it into the contract before signing, not after." }; - -// States we've researched in detail. -export const STATE_LAWS: Record = { +const STATE_LAWS: Record = { california: [ { tag: "AB68-C", title: "2-Day Cancellation Option", citation: "Cal. Veh. Code § 11713.21", plain: "You can buy a 2-day right to cancel on a used car under $40,000, but you have to ask for it at the time of signing. It is not automatic.", script: "I'd like to purchase the 2-day contract cancellation option.", - escalation: "If it's not offered to you upfront, ask directly. Cost is roughly 1% of the price, plus a restocking fee if you use it." }, + escalation: "If it's not offered to you upfront, ask directly. Cost is roughly 1% of the price, plus a restocking fee if you actually use it." }, { tag: "AB68-R", title: "Interest Rate Markup Caps", citation: "Cal. Veh. Code § 11711", plain: "Dealers can only mark up your interest rate by a capped amount: 2% on loans over 60 months, 2.5% on shorter ones.", script: "I'm already pre-approved at this rate, you need to beat it, not just match it.", @@ -55,7 +99,7 @@ export const STATE_LAWS: Record = { script: "Show me my monthly payment with and without each add-on, itemized, in writing.", escalation: "\u201CIt's all one package\u201D is not legal in California. Ask for the line-by-line breakdown before you agree to anything." }, { tag: "VC-11713", title: "Prohibited Dealer Practices", citation: "Cal. Veh. Code § 11713", - plain: "Dealers can't advertise cars they don't have, change agreed-upon terms after the fact, or hide a car's known history from you.", + plain: "Dealers can't advertise cars they don't actually have, change agreed-upon terms after the fact, or hide a car's known history from you.", script: "Is this exact price and condition still accurate right now, today?", escalation: "Bait-and-switch tactics under this code are a documented violation. Keep a copy of the original ad or listing as evidence." }, { tag: "CCLRA", title: "Consumers Legal Remedies Act", citation: "Cal. Civ. Code § 1750", @@ -149,8 +193,7 @@ export const STATE_LAWS: Record = { ], }; -// What a 50-state summary says about each other state's lemon law. -export const STATE_DIRECTION: Record = { +const STATE_DIRECTION: Record = { alabama: "covers new vehicles only", arizona: "appears to extend some coverage to used vehicles", arkansas: "is focused on new vehicles, with notably strong salvage-title disclosure rules", @@ -192,3 +235,260 @@ export const STATE_DIRECTION: Record = { "west virginia": "covers passenger vehicles and some trucks and vans", wyoming: "covers vehicles under 10,000 pounds sold or registered in the state", }; + +function fallbackLaws(label: string): Law[] { + const key = label.toLowerCase(); + const direction = STATE_DIRECTION[key]; + const directionLine = direction + ? `Based on a 50-state legal summary, ${label}'s lemon law ${direction}.` + : `We have not yet researched ${label} specifically.`; + + return [ + { tag: "FTC-COR", title: "No Automatic Right to Cancel", citation: "16 CFR Part 429, FTC Cooling-Off Rule", + plain: "The FTC's Cooling-Off Rule gives buyers three days to cancel certain purchases, but it explicitly excludes cars sold at a dealer's permanent location. Once you sign, the deal is final unless the dealer agrees in writing to something more.", + script: "Will you put a cancellation window into the contract, in writing, before I sign?", + escalation: "Don't assume a \u201Ccooling-off period\u201D exists by default. Federal law specifically carves cars out of it. If you want an exit, negotiate it into the contract before signing, not after." }, + { tag: "COMING-SOON", title: "State-Specific Laws Coming Soon", citation: "", + plain: `${directionLine} Exact statute section numbers have not been independently verified for ${label}, so treat this as a starting point, not legal advice. The five federal protections already apply to you regardless of state.`, + script: `Does ${label} have its own cooling-off period, interest rate cap, or add-on disclosure rule?`, + escalation: `Search "${label} lemon law" and "${label} used car dealer warranty" on your state Attorney General's website before you sign anything.` }, + ]; +} + +// ── Component ──────────────────────────────────────────────── +type Screen = "entry" | "home" | "laws"; +type Category = "federal" | "state"; + +export function RightsPhoneDemo() { + const [screen, setScreen] = useState("entry"); + const [stateInput, setStateInput] = useState(""); + const [stateLabel, setStateLabel] = useState(""); + const [activeCategory, setActiveCategory] = useState("federal"); + const [currentLawIndex, setCurrentLawIndex] = useState(0); + const [revealed, setRevealed] = useState>(new Set()); + + const scrollRef = useRef(null); + const sectionRefs = useRef<(HTMLDivElement | null)[]>([]); + const observerRef = useRef(null); + + const resolvedKey = stateLabel.toLowerCase(); + const stateLaws = stateLabel + ? (STATE_LAWS[resolvedKey] ?? fallbackLaws(stateLabel)) + : []; + const stateLinkName = stateLabel ? `${stateLabel} Protections` : "State Protections"; + const stateLinkMeta = !stateLabel + ? "Enter your state to see these" + : STATE_LAWS[resolvedKey] + ? `${stateLaws.length} laws \u00B7 applies to you` + : `What we have so far for ${stateLabel}`; + const homeSub = !stateLabel + ? "Pick one to start reading." + : `Showing what applies in ${stateLabel}.`; + + const activeLaws = activeCategory === "federal" ? federalLaws : stateLaws; + + function submitState() { + const resolved = resolveState(stateInput); + setStateLabel(resolved ?? ""); + setScreen("home"); + } + + function skipState() { + setStateLabel(""); + setScreen("home"); + } + + function openCategory(cat: Category) { + setActiveCategory(cat); + setCurrentLawIndex(0); + setRevealed(new Set()); + setScreen("laws"); + } + + function jumpTo(i: number) { + sectionRefs.current[i]?.scrollIntoView({ behavior: "smooth", block: "start" }); + } + + useEffect(() => { + if (screen !== "laws" || !scrollRef.current) return; + if (observerRef.current) observerRef.current.disconnect(); + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + const idx = Number(entry.target.getAttribute("data-index")); + if (entry.isIntersecting) { + setRevealed((prev) => new Set(prev).add(idx)); + } + if (entry.intersectionRatio > 0.5) { + setCurrentLawIndex(idx); + } + }); + }, + { root: scrollRef.current, threshold: [0.15, 0.5] } + ); + + sectionRefs.current.forEach((el) => el && observer.observe(el)); + observerRef.current = observer; + return () => observer.disconnect(); + }, [screen, activeLaws.length]); + + return ( +
+ + +
+
+
+
+ + {screen === "entry" && ( +
+
+ VINdicated logo +

Where are you buying?

+

Your rights change depending on where you are. Tell us your state so we show you the protections that actually apply.

+ setStateInput(e.target.value)} + /> + + +
+
+ )} + + {screen === "home" && ( +
+
+ VINdicated logo + getvindicated.org +

Know Your
Rights.

+

{homeSub}

+ + + + +
+
+ )} + + {screen === "laws" && ( +
+
+ + VINdicated logo +
+
+
+ {activeLaws.map((law, i) => ( +
{ sectionRefs.current[i] = el; }} + > + {law.citation && {law.citation}} +

{law.title}

+ {!revealed.has(i) && ( +
scroll for the rundown {"\u2193"}
+ )} +
+

{law.plain}

+
+
+ {"\u201C"} +

{law.script}{"\u201D"}

+
+
+

{law.escalation}

+
+
+ ))} +
+
+ {activeLaws.map((law, i) => ( + + ))} +
+
+
+ )} + +
+
+
+
+
+ ); +} diff --git a/components/sections/about/FounderStory.tsx b/components/sections/about/FounderStory.tsx new file mode 100644 index 0000000..40257cc --- /dev/null +++ b/components/sections/about/FounderStory.tsx @@ -0,0 +1,47 @@ +"use client"; + +import type { AboutPageDict } from "@/lib/i18n/dictionary"; +import { useInView } from "../shared/useInView"; + +// Sticky intro on the left, strike cards that fade in as they scroll past. +export function FounderStory({ dict }: { dict: AboutPageDict["story"] }) { + return ( +
+
+
+

{dict.title}

+

{dict.body}

+
+ {dict.quote} + {dict.quoteCite} +
+
+
+ {dict.strikes.map((s) => ( + + ))} +
+
+
+ ); +} + +function StrikeCard({ + strike, +}: { + strike: AboutPageDict["story"]["strikes"][number]; +}) { + const [ref, inView] = useInView(0.35); + return ( +
+
+ + {strike.tag} +
+

{strike.title}

+

{strike.body}

+
+ ); +} diff --git a/components/sections/about/FounderVideo.tsx b/components/sections/about/FounderVideo.tsx new file mode 100644 index 0000000..33c283d --- /dev/null +++ b/components/sections/about/FounderVideo.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { useRef, useState } from "react"; +import type { AboutPageDict } from "@/lib/i18n/dictionary"; + +export function FounderVideo({ dict }: { dict: AboutPageDict["video"] }) { + const videoRef = useRef(null); + const [playing, setPlaying] = useState(false); + + function play() { + const v = videoRef.current; + if (!v) return; + setPlaying(true); + v.play(); + v.focus(); + } + + return ( +
+
+
+ + +
+
+

{dict.title}

+

{dict.body}

+

+ {dict.name} + {dict.role} +

+
+
+
+ ); +} diff --git a/components/sections/about/MissionPillars.tsx b/components/sections/about/MissionPillars.tsx new file mode 100644 index 0000000..cab02e0 --- /dev/null +++ b/components/sections/about/MissionPillars.tsx @@ -0,0 +1,36 @@ +import type { AboutPageDict } from "@/lib/i18n/dictionary"; + +const ICONS = [ + , + + + + , + , +]; + +export function MissionPillars({ dict }: { dict: AboutPageDict["mission"] }) { + return ( +
+
+
+

{dict.title}

+

{dict.body}

+
+
+ {dict.items.map((item, i) => ( +
+ +

{item.title}

+

{item.body}

+
+ ))} +
+
+
+ ); +} diff --git a/components/sections/about/QuoteBand.tsx b/components/sections/about/QuoteBand.tsx index 66247ea..83a8713 100644 --- a/components/sections/about/QuoteBand.tsx +++ b/components/sections/about/QuoteBand.tsx @@ -2,7 +2,7 @@ export function QuoteBand({ text, cite }: { text: string; cite: string }) { return (
-
+

{text}

diff --git a/components/sections/about/WhatWeProvide.tsx b/components/sections/about/WhatWeProvide.tsx new file mode 100644 index 0000000..e8e381e --- /dev/null +++ b/components/sections/about/WhatWeProvide.tsx @@ -0,0 +1,52 @@ +import Link from "next/link"; +import type { AboutPageDict } from "@/lib/i18n/dictionary"; + +const ICONS = [ + , + , + , + , +]; + +export function WhatWeProvide({ + dict, + projectsHref, +}: { + dict: AboutPageDict["provide"]; + projectsHref: string; +}) { + const last = dict.items.length - 1; + return ( +
+
+
+

{dict.title}

+

{dict.body}

+
+
+ {dict.items.map((item, i) => ( +
+ +

{item.title}

+

+ {item.body} + {i === last && ( + <> + {" "} + + {dict.projectsLink} + + + )} +

+
+ ))} +
+
+
+ ); +} diff --git a/components/sections/about/ZoomSlideshow.tsx b/components/sections/about/ZoomSlideshow.tsx new file mode 100644 index 0000000..c84f66c --- /dev/null +++ b/components/sections/about/ZoomSlideshow.tsx @@ -0,0 +1,127 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import Image from "next/image"; +import type { AboutPageDict } from "@/lib/i18n/dictionary"; +import { usePrefersReducedMotion } from "../shared/usePrefersReducedMotion"; + +const PHOTOS = [ + { src: "/images/about/img_4424_2.webp", position: "center 70%" }, + { src: "/images/about/berkeley-tabling-1.webp", position: "center 45%" }, + { src: "/images/about/berkeley-tabling-2.webp", position: "center 40%" }, + { src: "/images/about/img_8120.webp", position: "center 55%" }, + { src: "/images/about/img_4422_2.webp", position: "center 72%" }, + { src: "/images/about/img_8112.webp", position: "center 50%" }, + { src: "/images/about/img_8126.webp", position: "center 50%" }, + { src: "/images/about/img_4423_2.webp", position: "center 70%" }, + { src: "/images/about/img_8103.webp", position: "center 45%" }, + { src: "/images/about/img_8130.webp", position: "center 50%" }, +]; + +const INTERVAL_MS = 3200; +const pad = (n: number) => String(n).padStart(2, "0"); + +// A photo frame that grows to full-bleed as you scroll through it, while +// the photos cross-fade on a timer. +export function ZoomSlideshow({ dict }: { dict: AboutPageDict["zoom"] }) { + const reduce = usePrefersReducedMotion(); + const sectionRef = useRef(null); + const frameRef = useRef(null); + const [index, setIndex] = useState(0); + const [userPaused, setUserPaused] = useState(false); + const paused = userPaused || reduce; + + useEffect(() => { + if (paused) return; + const t = setInterval( + () => setIndex((i) => (i + 1) % PHOTOS.length), + INTERVAL_MS, + ); + return () => clearInterval(t); + }, [paused]); + + useEffect(() => { + const section = sectionRef.current; + const frame = frameRef.current; + if (!section || !frame) return; + if (reduce) { + frame.style.removeProperty("--p"); + return; + } + let ticking = false; + const update = () => { + ticking = false; + const r = section.getBoundingClientRect(); + const total = r.height - window.innerHeight; + const p = Math.min(1, Math.max(0, -r.top / (total * 0.7))); + frame.style.setProperty("--p", p.toFixed(4)); + }; + const onScroll = () => { + if (!ticking) { + ticking = true; + requestAnimationFrame(update); + } + }; + update(); + window.addEventListener("scroll", onScroll, { passive: true }); + window.addEventListener("resize", update); + return () => { + window.removeEventListener("scroll", onScroll); + window.removeEventListener("resize", update); + }; + }, [reduce]); + + return ( +
+
+
+
+ {PHOTOS.map((p, i) => ( + {dict.alts[i]} + ))} +
+
+
+

+ {dict.titleLine1} +
+ {dict.titleLine2} +

+

{dict.body}

+
+
+ + +
+
+
+
+ ); +} diff --git a/components/sections/fraud/FlipCards.tsx b/components/sections/fraud/FlipCards.tsx new file mode 100644 index 0000000..9430ccc --- /dev/null +++ b/components/sections/fraud/FlipCards.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useState } from "react"; +import type { FraudPageDict } from "@/lib/i18n/dictionary"; + +export function FlipCards({ items }: { items: FraudPageDict["after"]["items"] }) { + const [flipped, setFlipped] = useState(items.map(() => false)); + return ( +
+ {items.map((it, i) => ( + + ))} +
+ ); +} diff --git a/components/sections/fraud/FourSquare.tsx b/components/sections/fraud/FourSquare.tsx index 36b8625..1a18ee2 100644 --- a/components/sections/fraud/FourSquare.tsx +++ b/components/sections/fraud/FourSquare.tsx @@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from "react"; import type { FraudPageDict } from "@/lib/i18n/dictionary"; +import { usePrefersReducedMotion } from "../shared/usePrefersReducedMotion"; import { formatMoney } from "./money"; type Dict = FraudPageDict["fourSquare"]; @@ -17,24 +18,73 @@ const BAR_MAX = 26000; const WHO = ["them", "me", "them", "me", "them", "flagchip"] as const; export function FourSquare({ dict, locale }: { dict: Dict; locale: string }) { + const reduce = usePrefersReducedMotion(); const [step, setStep] = useState(0); + const [prev, setPrev] = useState(null); const [shown, setShown] = useState(1); + const [bump, setBump] = useState(0); + const timers = useRef[]>([]); + const rootRef = useRef(null); const chatRef = useRef(null); + const stepRef = useRef(0); + stepRef.current = step; const money = (n: number) => formatMoney(n, locale); const last = STEPS.length - 1; - // Each ask adds the buyer's line and the dealer's answer to the chat. + const clear = () => { + timers.current.forEach(clearTimeout); + timers.current = []; + }; + const ask = () => { - if (step >= last) return; - setStep(step + 1); - setShown(step + 1 === last ? dict.lines.length : shown + 2); + const s = stepRef.current; + if (s >= last) return; + setShown((v) => v + 1); + timers.current.push( + setTimeout(() => { + setPrev(s); + setStep(s + 1); + setShown((v) => (s + 1 === last ? dict.lines.length : v + 1)); + setBump((b) => b + 1); + }, reduce ? 0 : 700), + ); + }; + + const autoplay = () => { + if (reduce) return; + timers.current.push(setTimeout(ask, 1200)); + timers.current.push(setTimeout(ask, 3400)); }; const reset = () => { + clear(); + stepRef.current = 0; setStep(0); + setPrev(null); setShown(1); }; + // Play once when it first scrolls into view. + useEffect(() => { + const el = rootRef.current; + if (!el) return; + const io = new IntersectionObserver( + (es) => { + if (es.some((e) => e.isIntersecting)) { + io.disconnect(); + autoplay(); + } + }, + { threshold: 0.5 }, + ); + io.observe(el); + return () => { + io.disconnect(); + clear(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + useEffect(() => { const c = chatRef.current; if (c) c.scrollTop = c.scrollHeight; @@ -42,7 +92,7 @@ export function FourSquare({ dict, locale }: { dict: Dict; locale: string }) { const st = STEPS[step]; return ( -
+
@@ -59,11 +109,15 @@ export function FourSquare({ dict, locale }: { dict: Dict; locale: string }) {
{dict.monthly} - {money(st.pay)} - {step > 0 && {money(STEPS[step - 1].pay)}} + + {money(st.pay)} + + + {prev !== null ? money(STEPS[prev].pay) : ""} +
-
); } - -function HeroCard({ - className, - tone, - card, -}: { - className: string; - tone: "ok" | "bad" | "pur"; - card: { title: string; body: string }; -}) { - return ( -
- - - {card.title} - {card.body} - -
- ); -}