-

+
+
+ {MOCKUP_STATES.map((option) => (
+
+ ))}
+
+
+
+ {/* The window is authored at DESIGN_WIDTH and scaled to fit the hero column. */}
+
+
);
}
+
+function StatePill({
+ id,
+ label,
+ selected,
+ onSelect,
+}: {
+ id: MockupStateId;
+ label: string;
+ selected: boolean;
+ onSelect: (id: MockupStateId) => void;
+}) {
+ const select = useCallback(() => onSelect(id), [onSelect, id]);
+ return (
+
+ );
+}
diff --git a/packages/website/src/components/landing-page.tsx b/packages/website/src/components/landing-page.tsx
index 87f12f69d9..9443c4f6c7 100644
--- a/packages/website/src/components/landing-page.tsx
+++ b/packages/website/src/components/landing-page.tsx
@@ -27,20 +27,23 @@ const DURATION_05: Transition = { duration: 0.5 };
const VIEWPORT_60 = { once: true, margin: "-60px" };
const SVG_OVERFLOW_VISIBLE_STYLE = { overflow: "visible" as const };
-const PHONE_PERSPECTIVE_STYLE = { minHeight: 480, perspective: 1200 };
+// A ~240px-wide phone rotated 15° only foreshortens a couple percent at
+// perspective 1200 — it reads as a flat, skewed card. The side phones already
+// sit on a correctly projecting plane (the frame and its scaled interior share
+// one flattened texture), so the interior just needs the projection to be
+// strong enough to see: a tighter perspective gives the trio a real book-fold.
+const PHONE_PERSPECTIVE_STYLE = { minHeight: 480, perspective: 700 };
import { CursorFieldProvider } from "~/components/butterfly";
import { CommandDialog } from "~/components/command-dialog";
import { AGENT_PAGES } from "~/data/agent-pages";
import {
appStoreUrl,
playStoreUrl,
- webAppUrl,
getDownloadOptions,
useDetectedPlatform,
AppleIcon,
PlayStoreIcon,
TerminalIcon,
- GlobeIcon,
} from "~/downloads";
import { useRelease } from "~/routes/__root";
import { HeroMockup } from "~/components/hero-mockup";
@@ -52,7 +55,7 @@ import {
PiIcon,
} from "~/components/agent-icons";
import { DiscordIcon, GitHubIcon, SlackIcon } from "~/components/brand-icons";
-import { ClaudeIcon } from "~/components/mockup";
+import { ClaudeIcon, MobileChat, MobileDiff, MobileSidebar, PhoneFrame } from "~/components/mockup";
import { FAQItem } from "~/components/faq-item";
import { SiteFooter } from "~/components/site-footer";
import { SiteHeader } from "~/components/site-header";
@@ -68,7 +71,7 @@ export function LandingPage({ title, subtitle }: LandingPageProps) {
{/* Hero section with background image */}
-
+
@@ -79,7 +82,7 @@ export function LandingPage({ title, subtitle }: LandingPageProps) {
initial={FADE_IN_UP_40}
animate={FADE_IN}
transition={EASE_OUT_08_DELAY_05}
- className="relative px-6 md:px-8 pb-8 md:pb-16"
+ className="relative px-6 md:px-8 pt-4 md:pt-8 pb-8 md:pb-16"
>
@@ -112,7 +115,7 @@ export function LandingPage({ title, subtitle }: LandingPageProps) {
function Nav() {
return (
-