diff --git a/packages/website/src/components/landing-page.tsx b/packages/website/src/components/landing-page.tsx index 78963b675..c68674014 100644 --- a/packages/website/src/components/landing-page.tsx +++ b/packages/website/src/components/landing-page.tsx @@ -90,6 +90,8 @@ export function LandingPage({ title, subtitle }: LandingPageProps) { + + @@ -361,8 +363,8 @@ function MultiProviderSection() { return (
{providers.map((p) => ( @@ -661,14 +663,212 @@ function SelfHostedDiagram() { function SelfHostedSection() { return ( ); } +const WORKFLOW_STEPS = ["Worktree", "Preview", "Review", "Commit", "PR", "Merge"] as const; + +const REVIEW_FILES = [ + { path: "src/auth/session.ts", delta: "+42" }, + { path: "src/auth/middleware.ts", delta: "+18 -9" }, + { path: "tests/auth.test.ts", delta: "+31" }, +] as const; + +function WorkflowSection() { + return ( + +
+ +
+ + +
+
+
+ ); +} + +function WorkflowHeader() { + return ( +
+
+
+ fix-auth + worktree +
+
+ {WORKFLOW_STEPS.map((step) => ( + + {step} + + ))} +
+
+ ); +} + +function WorkflowPreview() { + return ( +
+ +
+ +
+ + +
+
+
+ ); +} + +function BrowserChrome() { + return ( +
+
+ + + +
+
+ web.fix-auth.my-app.localhost +
+
+ ); +} + +function PreviewHeader() { + return ( +
+
+
+
+ ); +} + +function PreviewFormCard({ + titleWidth, + ctaClassName, +}: { + titleWidth: string; + ctaClassName: string; +}) { + return ( +
+
+
+
+
+ ); +} + +function WorkflowReviewAndShip() { + return ( +
+ + +
+ ); +} + +function InlineReviewPanel() { + return ( +
+
+ Inline review + 3 files changed +
+
+ {REVIEW_FILES.map((file) => ( + + ))} +
+
+ ); +} + +function ReviewFileRow({ path, delta }: { path: string; delta: string }) { + return ( +
+ {path} + + {delta.split(" ").map((part) => ( + + {part} + + ))} + +
+ ); +} + +function ShipPanel() { + return ( +
+
+ Ready to ship + + checks passed + +
+
+
+ Commit +
+
+ Open PR +
+
+ Merge +
+
+
+ ); +} + +function SplitPanelsSection() { + return ( + +
+
+ +
+ +
+ + +
+
+
+
+
+ ); +} + +function PanelTile({ label, className }: { label: string; className: string }) { + return ( +
+ {label} +
+ ); +} + function ServiceProxySection() { const workspaces = [ { name: "fix-auth", url: "web.fix-auth.my-app.localhost" }, @@ -957,7 +1157,7 @@ function LocalVoiceSection() { return (
@@ -1709,10 +1909,14 @@ function SponsorCTA() { >

- I built Paseo because I wanted better tools for coding agents on my own setup. It's - an independent open source project, built around freedom of choice and real workflows. If - you like what I'm building, consider becoming a supporter. + Paseo is an independent open source project for running coding agents across your own + machines, phone, desktop, and CLI.

+

+ It's built around freedom of choice: use the provider you want, run it on your own + infrastructure, and keep your workflow portable. +

+

If you like Paseo, sponsorship is the best way to support continued development.

- Mo

diff --git a/packages/website/src/styles.css b/packages/website/src/styles.css index 3676e7b27..574839348 100644 --- a/packages/website/src/styles.css +++ b/packages/website/src/styles.css @@ -20,9 +20,30 @@ .social-proof-marquee { margin-inline: calc(50% - 50vw); - mask-image: linear-gradient(to right, transparent, black 8%, black 92%, transparent); overflow-x: clip; padding-inline: max(1.5rem, calc((100vw - 80rem) / 2)); + position: relative; +} + +.social-proof-marquee::before, +.social-proof-marquee::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + width: max(4rem, 8vw); + z-index: 1; + pointer-events: none; +} + +.social-proof-marquee::before { + left: 0; + background: linear-gradient(to right, var(--color-background), transparent); +} + +.social-proof-marquee::after { + right: 0; + background: linear-gradient(to left, var(--color-background), transparent); } .social-proof-row { @@ -34,6 +55,7 @@ display: flex; width: max-content; animation: social-proof-scroll 46s linear infinite; + will-change: transform; } .social-proof-track-reverse {