Staaarter

Billing Checkout Stepper

A stepper for multi-step checkout and onboarding flows. Numbered circles connect with a line that fills in as steps complete, the current step is marked with aria-current, and Back/Continue buttons move between steps. The last step shows a completion panel instead of a Continue button. Step content itself is a placeholder, meant to be replaced with your own form for each step.

By Staaarter Team
Billing
Updated March 30, 2026
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its button dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/billing-checkout-stepper.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing32.tsx instead.

Usage

The file also exports billing32Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Billing32, billing32Demo } from "@/components/blocks/billing/billing32";

export default function Page() {
  return <Billing32 {...billing32Demo} />;
}

Props

PropTypeDefaultDescription
stepsCheckoutStep[]noneSteps rendered left to right in order. Each step's label shows under its circle on sm screens and up.
defaultStepIndexnumber0Which step is active on first render, clamped to a valid index.
backLabelstring"Back"Label for the back button.
nextLabelstring"Continue"Label for the forward button on every step except the last.
finishLabelstring"Complete order"Label for the forward button on the last step.
completeHeadingstring"You're all set"Heading shown in the completion panel after the last step.
completeMessagestringnoneSupporting text shown under the completion heading.
classNamestringnoneExtra classes for the outer wrapper.

Types

interface CheckoutStep {
  id: string;
  label: string;
  description?: string;
}

Behavior notes

  • The current step index is local component state, initialized from defaultStepIndex; there's no controlled mode where a parent drives the current step directly.
  • Completed steps show a check icon in a filled circle and a solid connecting line; the current step gets a ring in the primary color and aria-current="step"; upcoming steps stay muted.
  • Step labels are hidden below the sm breakpoint, so narrow viewports show only the numbered circles and connecting lines.
  • The area below the stepper renders a dashed placeholder box, not real form fields, since this block is the progress indicator, not the per-step forms themselves.
  • Clicking Continue on the last step swaps the whole panel for a completion message with a check icon; there's no way to navigate past it besides re-rendering the component.
  • The Back button is disabled on the first step so it's never possible to go to a negative index.

Frequently asked questions