Skip to content

Commit fbdd4e7

Browse files
Refine homepage feature grid and templates section (vercel#1745)
* Refine homepage: simplify feature grid, update templates section Remove "Zero infrastructure management", "Deploy confidently", "No timeout limits", and "Pay for what you use" sections from the feature grid. Update the observability section with new copy, larger typography, and CTA buttons for Vercel and self-hosting. Redesign the templates section with a side-by-side layout, "All examples" button, and vercel.com/workflow card images with dark mode support. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: christopherkindl <53372002+christopherkindl@users.noreply.github.com> * Make observability CTA buttons stack vertically on mobile Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: christopherkindl <53372002+christopherkindl@users.noreply.github.com> * Add Vercel section with o11y dashboard, update homepage layout - Add O11yDashboard SVG component with Vercel dashboard preview showing sidebar nav and observability trace visualization - Add VercelSection with desktop (offset right) and mobile views - Update "Run anywhere" section with new copy and CTA buttons - Normalize all grid section buttons to h-10 - Fix mobile padding in UseCases section - Remove barrel file for vercel-com-visuals, use direct imports Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: christopherkindl <53372002+christopherkindl@users.noreply.github.com> * Make use-case selector inline on mobile Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: christopherkindl <53372002+christopherkindl@users.noreply.github.com> --------- Signed-off-by: christopherkindl <53372002+christopherkindl@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 5a42964 commit fbdd4e7

16 files changed

Lines changed: 1176 additions & 71 deletions

docs/app/[lang]/(home)/components/cta.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const CTA = () => (
66
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
77
Create your first workflow today.
88
</h2>
9-
<Button asChild size="lg" className="w-fit text-base h-12">
9+
<Button asChild size="lg" className="w-fit h-10">
1010
<Link href="/docs/getting-started">Get started</Link>
1111
</Button>
1212
</section>

docs/app/[lang]/(home)/components/run-anywhere.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import Link from 'next/link';
12
import type { ComponentProps } from 'react';
23
import { CodeBlock } from '@/app/[lang]/(home)/components/code-block';
4+
import { Button } from '@/components/ui/button';
35
import { cn } from '@/lib/utils';
46

57
const DigitalOcean = (props: ComponentProps<'svg'>) => (
@@ -98,31 +100,45 @@ const Vercel = (props: ComponentProps<'svg'>) => (
98100

99101
const code = `export async function welcome(userId: string) {
100102
"use workflow";
101-
103+
102104
const user = await getUser(userId);
103105
const { subject, body } = await generateEmail({
104106
name: user.name, plan: user.plan
105107
});
106-
108+
107109
const { status } = await sendEmail({
108110
to: user.email,
109111
subject,
110112
body,
111113
});
112-
114+
113115
return { status, subject, body };
114116
}`;
115117

116118
export const RunAnywhere = () => (
117119
<div className="px-4 py-8 sm:py-12 sm:px-12 grid gap-10 items-center overflow-hidden">
118-
<div className="grid gap-4 max-w-lg text-center mx-auto">
119-
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
120-
Run anywhere, no lock‑in
121-
</h2>
122-
<p className="text-balance text-lg text-muted-foreground">
123-
The same code runs locally on your laptop, in Docker, on Vercel or any
124-
other cloud. Open source and portable by design.
125-
</p>
120+
<div className="space-y-4">
121+
<div className="grid gap-4 max-w-lg text-center mx-auto">
122+
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
123+
Run anywhere, no lock‑in
124+
</h2>
125+
<p className="text-lg text-muted-foreground">
126+
Run locally, self-host, or swap every component — Workflow SDK is
127+
fully portable. For zero-config, secure, and scalable workflows,
128+
deploy on Vercel.
129+
</p>
130+
<div className="flex flex-col sm:flex-row items-center justify-center gap-3 mt-2">
131+
<Button asChild className="rounded-full h-10">
132+
<Link href="https://vercel.com/workflows" target="_blank">
133+
Workflows on Vercel
134+
</Link>
135+
</Button>
136+
{/* Outline variant appears smaller due to inset border — h-[42px] compensates to match the filled button visually */}
137+
<Button asChild variant="outline" className="rounded-full h-[42px]">
138+
<Link href="/worlds">Learn about self-hosting</Link>
139+
</Button>
140+
</div>
141+
</div>
126142
</div>
127143
<div className="relative isolate">
128144
<div className="absolute -left-32 top-1/2 -translate-y-1/2 hidden md:flex items-center gap-2">
5.46 KB
Loading
5.48 KB
Loading

docs/app/[lang]/(home)/components/templates/index.tsx

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,55 @@
11
import Image from 'next/image';
2+
import Link from 'next/link';
23
import { cn } from '@/lib/utils';
3-
import Flight from './flight.png';
4-
import Storytime from './storytime.png';
5-
import Vectr from './vectr.png';
4+
import { Button } from '@/components/ui/button';
5+
import Flight from './flight-v2.png';
6+
import FlightDark from './flight-v2-dark.png';
7+
import Storytime from './storytime-v2.png';
8+
import StorytimeDark from './storytime-v2-dark.png';
9+
import Vectr from './vectr-v2.png';
10+
import VectrDark from './vectr-v2-dark.png';
611

712
const data = [
813
{
914
title: 'Story Generator Slack Bot',
1015
description:
11-
"Slackbot that generates children's stories from collaborative input.",
16+
"A Slack bot that generates children's stories from collaborative input.",
1217
image: Storytime,
18+
imageDark: StorytimeDark,
1319
link: 'https://vercel.com/guides/stateful-slack-bots-with-vercel-workflow',
1420
},
1521
{
1622
title: 'Flight Booking App',
1723
description:
1824
'Use Workflow to make AI agents more reliable and production-ready.',
1925
image: Flight,
26+
imageDark: FlightDark,
2027
link: 'https://github.com/vercel/workflow-examples/tree/main/flight-booking-app',
2128
},
2229
{
2330
title: 'Natural Language Image Search',
2431
description:
2532
'A free, open-source template for building natural language image search.',
2633
image: Vectr,
34+
imageDark: VectrDark,
2735
link: 'https://www.vectr.store',
2836
},
2937
];
3038

3139
export const Templates = () => (
32-
<div className="p-8 sm:p-12 px-4 py-8 sm:py-12 sm:px-12 grid gap-12">
33-
<div className="max-w-3xl text-balance grid gap-2">
40+
<div className="grid md:grid-cols-[1fr_2fr] md:divide-x">
41+
<div className="grid gap-4 content-start px-4 py-8 sm:py-12 sm:px-12">
3442
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
35-
Get started quickly
43+
Get started
3644
</h2>
37-
<p className="text-balance text-lg text-muted-foreground">
38-
See Workflow SDK in action with one of our templates.
45+
<p className="text-lg text-muted-foreground">
46+
See Workflow SDK in action with one of the example templates.
3947
</p>
48+
<Button asChild size="lg" className="rounded-full h-10 px-6 w-fit mt-2">
49+
<Link href="/docs/examples">All examples</Link>
50+
</Button>
4051
</div>
41-
<div className="grid md:grid-cols-3 gap-8">
52+
<div className="grid sm:grid-cols-2 gap-8 px-4 py-8 sm:py-12 sm:px-12">
4253
{data.map((item) => (
4354
<a
4455
key={item.title}
@@ -56,7 +67,19 @@ export const Templates = () => (
5667
height={336}
5768
className={cn(
5869
'border rounded-md overflow-hidden -rotate-3 ml-7 aspect-video object-cover object-top -mb-12 mt-8',
59-
'group-hover:scale-105 transition-transform duration-300 group-hover:-rotate-1'
70+
'group-hover:scale-105 transition-transform duration-300 group-hover:-rotate-1',
71+
'dark:hidden'
72+
)}
73+
/>
74+
<Image
75+
src={item.imageDark}
76+
alt={item.title}
77+
width={640}
78+
height={336}
79+
className={cn(
80+
'border rounded-md overflow-hidden -rotate-3 ml-7 aspect-video object-cover object-top -mb-12 mt-8',
81+
'group-hover:scale-105 transition-transform duration-300 group-hover:-rotate-1',
82+
'hidden dark:block'
6083
)}
6184
/>
6285
</a>
13.4 KB
Loading
13.4 KB
Loading
90.1 KB
Loading
90.1 KB
Loading

docs/app/[lang]/(home)/components/use-cases-client.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ export const UseCasesClient = ({ useCases }: { useCases: UseCase[] }) => {
2727
};
2828

2929
return (
30-
<div className="grid sm:grid-cols-3 sm:divide-x p-8 sm:p-0 gap-12 sm:gap-0">
30+
<div className="grid sm:grid-cols-3 sm:divide-x px-4 py-8 sm:p-0 gap-12 sm:gap-0">
3131
<div className="text-balance flex flex-col gap-2 sm:p-12">
32-
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl">
32+
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl flex flex-wrap sm:block items-center gap-x-2">
3333
Build anything with
3434
<Select value={selectedCase} onValueChange={handleCaseChange}>
35-
<SelectTrigger className="font-semibold bg-background text-xl tracking-tight sm:text-2xl md:text-3xl mt-1.5 data-[size=default]:h-auto py-1.5 -ml-3">
35+
<SelectTrigger className="font-semibold bg-background text-xl tracking-tight sm:text-2xl md:text-3xl data-[size=default]:h-auto py-1.5 w-auto sm:mt-1.5 sm:-ml-3">
3636
<SelectValue />
3737
</SelectTrigger>
3838
<SelectContent>

0 commit comments

Comments
 (0)