feat(web): marketing landing page with Anthropic design system
Landing page at / matching claude.com/product/claude-code structure: hero, surfaces, pricing, laptop-to-laptop, features, meets-you, faq, cta, + floating "Latest news" toaster. Motion-based scroll reveals. Design system extracted from claude.com via playwriter reverse-engineering: - Self-hosted Anthropic Sans/Serif/Mono fonts (6 woff2 files) - --cm-* tokens in globals.css (clay #d97757, gray-050..900, fluid clamps) - Serif display, Sans UI, Mono terminals & section markers - Italic clay phrases for emphasis Header rewritten for design consistency: claudemesh wordmark (mesh glyph + serif), dark bg, nav (Docs · Pricing · Changelog · GitHub), "Start free" CTA. Free-first messaging: hero subhead "Free and open-source. Forever.", primary CTA "Start free", pricing defaults to Solo=Free. Fixes: - packages/api: comment out aiRouter (module removed in1f094c4) - packages/db/schema/mesh.ts: rename memberRelations → meshMemberRelations (missed inbeeaa3brename pass, caught via web build — ack'd by BotMou) - credits/{api,server,index}: stub out @turbostarter/ai/credits/utils - remove (marketing)/legal/[slug] route and common/mdx.tsx (cms-backed) - sitemap: drop blog/legal enumeration (cms removed) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
142
apps/web/src/modules/marketing/home/meets-you.tsx
Normal file
142
apps/web/src/modules/marketing/home/meets-you.tsx
Normal file
@@ -0,0 +1,142 @@
|
||||
import Link from "next/link";
|
||||
import { Reveal, SectionIcon } from "./_reveal";
|
||||
|
||||
const CARDS = [
|
||||
{
|
||||
accent: "clay",
|
||||
title: "Start in your terminal",
|
||||
body: "Drop the broker next to Claude Code. One env var. Your session joins the mesh.",
|
||||
cta: { label: "Install", href: "#" },
|
||||
mock: (
|
||||
<div
|
||||
className="rounded-[8px] bg-[#D97757] p-6 font-mono text-[11px] leading-[1.6] text-[#141413]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
<div className="mb-2 opacity-70">$ claudemesh join</div>
|
||||
<div>✓ connected to mesh.team.local</div>
|
||||
<div>✓ announced: alex · api-gateway · working</div>
|
||||
<div>✓ 5 peers online</div>
|
||||
<div className="mt-3 opacity-70">
|
||||
→ ready. messages route to your Claude Code.
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
accent: "oat",
|
||||
title: "Bridge to your editor",
|
||||
body: "VS Code, Cursor, JetBrains — the mesh exposes an MCP server your editor's agent can call.",
|
||||
cta: { label: "VS Code", href: "#" },
|
||||
cta2: { label: "JetBrains", href: "#" },
|
||||
mock: (
|
||||
<div
|
||||
className="rounded-[8px] border border-[var(--cm-border)] bg-[var(--cm-bg)] p-4"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
<div className="text-[10px] text-[var(--cm-fg-tertiary)]">
|
||||
.claude/mcp.json
|
||||
</div>
|
||||
<pre className="mt-2 text-[11px] leading-[1.6] text-[var(--cm-fg)]">
|
||||
{`{
|
||||
"servers": {
|
||||
"mesh": {
|
||||
"url": "ws://mesh.team:7899"
|
||||
}
|
||||
}
|
||||
}`}
|
||||
</pre>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
accent: "cactus",
|
||||
title: "Reach across machines",
|
||||
body: "Tailscale, WireGuard, or plain WS over your LAN. The broker is one binary, anywhere.",
|
||||
cta: { label: "Open the dashboard", href: "#" },
|
||||
mock: (
|
||||
<div
|
||||
className="rounded-[8px] border border-[var(--cm-border)] bg-[var(--cm-bg)] p-4"
|
||||
style={{ fontFamily: "var(--cm-font-sans)" }}
|
||||
>
|
||||
<div className="mb-3 text-[10px] uppercase tracking-wider text-[var(--cm-fg-tertiary)]">
|
||||
Peers on mesh
|
||||
</div>
|
||||
{[
|
||||
["alex", "macOS · working"],
|
||||
["jordan", "linux · idle"],
|
||||
["mo", "macOS · dnd"],
|
||||
].map(([n, s]) => (
|
||||
<div
|
||||
key={n}
|
||||
className="flex items-center justify-between border-b border-[var(--cm-border)] py-1.5 text-[12px] last:border-b-0"
|
||||
>
|
||||
<span className="text-[var(--cm-fg)]">{n}</span>
|
||||
<span className="text-[var(--cm-fg-tertiary)]">{s}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
export const MeetsYou = () => {
|
||||
return (
|
||||
<section className="border-b border-[var(--cm-border)] bg-[var(--cm-bg)] px-6 py-24 md:px-12 md:py-32">
|
||||
<div className="mx-auto max-w-[var(--cm-max-w)]">
|
||||
<Reveal className="mb-6 flex justify-center">
|
||||
<SectionIcon glyph="terminal" />
|
||||
</Reveal>
|
||||
<Reveal delay={1}>
|
||||
<h2
|
||||
className="mx-auto max-w-4xl text-center text-[clamp(2rem,4.5vw,3.25rem)] font-medium leading-[1.1] text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
Meets every agent where it runs
|
||||
</h2>
|
||||
</Reveal>
|
||||
<Reveal delay={2}>
|
||||
<div className="mt-16 grid gap-6 md:grid-cols-3">
|
||||
{CARDS.map((c) => (
|
||||
<article
|
||||
key={c.title}
|
||||
className="flex flex-col overflow-hidden rounded-[var(--cm-radius-md)] border border-[var(--cm-border)] bg-[var(--cm-bg-elevated)] p-6"
|
||||
>
|
||||
<div className="mb-6">{c.mock}</div>
|
||||
<h3
|
||||
className="mb-2 text-xl font-medium leading-snug text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
{c.title}
|
||||
</h3>
|
||||
<p
|
||||
className="mb-6 text-[14px] leading-[1.6] text-[var(--cm-fg-secondary)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
{c.body}
|
||||
</p>
|
||||
<div className="mt-auto flex flex-wrap gap-2">
|
||||
<Link
|
||||
href={c.cta.href}
|
||||
className="inline-flex items-center gap-2 rounded-[var(--cm-radius-xs)] border border-[var(--cm-fg-tertiary)] px-4 py-2 text-[13px] font-medium text-[var(--cm-fg)] transition-colors hover:border-[var(--cm-fg)] hover:bg-[var(--cm-bg)]"
|
||||
style={{ fontFamily: "var(--cm-font-sans)" }}
|
||||
>
|
||||
{c.cta.label} →
|
||||
</Link>
|
||||
{c.cta2 && (
|
||||
<Link
|
||||
href={c.cta2.href}
|
||||
className="inline-flex items-center gap-2 rounded-[var(--cm-radius-xs)] border border-[var(--cm-border)] px-4 py-2 text-[13px] font-medium text-[var(--cm-fg-secondary)] transition-colors hover:border-[var(--cm-fg-tertiary)] hover:text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-sans)" }}
|
||||
>
|
||||
{c.cta2.label} →
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</Reveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user