Vertical Timeline Steps

Getting Started

Set up your workspace

Complete these steps to start collaborating with your team.

Create your account

Sign up with your work email to get started.

Invite team members

Add colleagues to collaborate on projects together.

3

Set up your first project

Create a project and organize your work.

4

Connect integrations

Link your favorite tools for seamless workflow.

5

Start collaborating

You're all set! Begin working with your team.

About this block

Vertical Timeline StepsPRO

Vertical timeline layout with step indicators, descriptions, and a connecting progress line. Perfect for workspace setup flows with detailed step explanations.

Onboarding6: Vertical Timeline Steps

Vertical timeline of setup steps: each row pairs a circular indicator (checkmark, icon, or number) with a title and description, connected by a vertical line down the left edge. Like its horizontal sibling, the block has no internal step state; currentStep is a plain number that only affects styling on each render.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/onboarding6?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/onboarding6?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/onboarding6.tsx and the badge and button shadcn/ui primitives it depends on.

Quick start

The installed file exports onboarding6Demo alongside the block: the exact props behind the preview above. Spread it to get a working timeline in one line.

tsx
import { Onboarding6, onboarding6Demo } from "@/components/beste/block/onboarding6";

export default function OnboardingPage() {
  return <Onboarding6 {...onboarding6Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Onboarding6 } from "@/components/beste/block/onboarding6";

export default function OnboardingPage() {
  return (
    <Onboarding6
      badge={{ label: "Getting Started", variant: "secondary" }}
      heading="Set up your workspace"
      description="Complete these steps to start collaborating with your team."
      steps={[
        { id: "1", title: "Create your account", description: "Sign up with your work email." },
        { id: "2", title: "Invite team members", description: "Add colleagues to collaborate." },
        { id: "3", title: "Start collaborating", description: "You're all set." },
      ]}
      currentStep={1}
      primaryButton={{ label: "Continue Setup", href: "/setup/step-2" }}
      secondaryButton={{ label: "Skip for now", href: "/dashboard" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Small badge above the heading
headingstringMain headline
descriptionstringSupporting copy below the heading
stepsTimelineStep[][]Ordered steps rendered top to bottom
currentStepnumber0Index of the active step; drives completed/current styling only
primaryButton{ label: string; href: string }Primary CTA below the timeline
secondaryButton{ label: string; href: string }Secondary/ghost CTA next to the primary one
classNamestringExtra classes for the outer <section>
ts
type TimelineStep = {
  id: string;
  title: string;
  description?: string;
  icon?: LucideIcon;
};

Behavior notes

  • No internal state (useState) exists in this file: currentStep is a plain number prop, so completed/current styling is a pure derivation on every render, and nothing inside the block advances or rewinds the timeline.
  • step.icon overrides the numbered fallback for any step that is not yet completed, which means it renders for both the current step and every upcoming step; only once a step is marked completed (index < currentStep) does the checkmark take over from the icon.
  • The vertical connector line for each row is absolutely positioned (absolute left-5 top-10 h-full) and only turns bg-primary when that row's step is completed; the last step in the list renders no connector at all.
  • Row spacing uses pb-8 last:pb-0 on each step wrapper rather than a space-y utility on the container, so the connector line's height calculation lines up with the padding of each row.
  • If steps is empty the component returns null rather than rendering an empty shell.
  • Both buttons are plain links with no click handlers; advancing currentStep is entirely the responsibility of the page that renders this block.

More Onboarding blocks

View all Onboarding
PRO

onboarding5

Horizontal Steps with Progress Line

Multi-step progress indicator with numbered circles connected by a progress line. Perfect for account setup wizards that show users their completion status.

PRO

onboarding10

Accordion Steps with Expandable Actions

Interactive accordion layout where each step expands to reveal detailed instructions and action buttons. Perfect for setup guides that let users complete tasks at their own pace.

PRO

onboarding35

Tracked Setup Sequence

A setup section listing four numbered steps with who owns each one, against a column that sticks while they scroll and floats a live step tracker on an image tile.

PRO

onboarding11

Side Navigation Wizard

Desktop wizard with a vertical side navigation menu and content panels for each step. Perfect for comprehensive account setup requiring multiple configuration screens.

PRO

onboarding33

Interactive Setup Checklist

A setup panel pairing a soft progress column, where an oversized percentage and accent bar react to what is ticked, with hairline checklist rows that each carry a description and a jump-in link.

PRO

onboarding31

Three Step Getting Started

A getting-started section with an eyebrow over a hairline rule, a two-column heading, three monospace-numbered steps under their own hairlines, and an accent button.