registry/blocks/how-steps.tsx
const steps = [
{
number: "01",
title: "Connect your repository",
description:
"Authorize GitHub or GitLab, pick a repo. We detect the framework and configure the pipeline for you.",
},
{
number: "02",
title: "Push like you always do",
description:
"Every commit builds, every branch gets a preview URL. Nothing new to learn, nothing to babysit.",
},
{
number: "03",
title: "Promote to production",
description:
"One click — or automatic on main. Rollbacks are instant because every deploy is kept, forever.",
},
];
export default function HowSteps() {
return (
<section className="bg-background">
<div className="mx-auto w-full max-w-3xl px-6 py-20 sm:py-24">
<div className="mb-12 text-center">
<h2 className="text-2xl font-semibold tracking-tight text-balance sm:text-3xl">
Live in three steps
</h2>
<p className="mt-2 text-muted-foreground">
From repository to production in under five minutes.
</p>
</div>
<ol className="space-y-0">
{steps.map((step, index) => (
<li key={step.number} className="relative flex gap-6 pb-10 last:pb-0">
{/* Connector line */}
{index < steps.length - 1 && (
<span
aria-hidden
className="absolute top-12 left-6 h-[calc(100%-3rem)] w-px bg-border"
/>
)}
<span className="flex size-12 shrink-0 items-center justify-center rounded-full border border-border/60 bg-card font-mono text-sm tabular-nums">
{step.number}
</span>
<div className="pt-2.5">
<h3 className="font-medium">{step.title}</h3>
<p className="mt-1.5 text-sm text-muted-foreground">
{step.description}
</p>
</div>
</li>
))}
</ol>
</div>
</section>
);
}