Özer

Wizard Steps

Forms 95

About

An animated multi-step wizard with a clickable progress rail, direction-aware panel transitions, keyboard navigation, and a completion state.

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds Wizard Steps to your project and fits it to your theme.

Code

How Wizard Steps is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

"use client";

import { WizardSteps } from "@/components/ui/wizard-steps";
import { useState } from "react";

const row =
  "flex items-center justify-between gap-3 rounded-[9px] bg-sub px-3 py-2 text-[12.5px]";

const steps = [
  {
    id: "plan",
    label: "Choose a plan",
    content: (
      <ul className="space-y-1">
        {[
          ["Starter", "3 seats"],
          ["Team", "12 seats"],
          ["Scale", "unlimited"],
        ].map(([name, seats]) => (
          <li key={name} className={row}>
            <span className="text-ink">{name}</span>
            <span className="text-ink-3">{seats}</span>
          </li>
        ))}
      </ul>
    ),
  },
  {
    id: "billing",
    label: "Billing details",
    content: (
      <ul className="space-y-1">
        {[
          ["Card", "•••• 4242"],
          ["Invoice email", "billing@acme.co"],
          ["VAT number", "Not set"],
        ].map(([field, value]) => (
          <li key={field} className={row}>
            <span className="text-ink">{field}</span>
            <span className="text-ink-3">{value}</span>
          </li>
        ))}
      </ul>
    ),
  },
  {
    id: "review",
    label: "Review",
    content: (
      <ul className="space-y-1">
        {[
          ["Team", "12 seats"],
          ["Billed", "yearly"],
          ["Charged to", "•••• 4242"],
        ].map(([field, value]) => (
          <li key={field} className={row}>
            <span className="text-ink">{field}</span>
            <span className="text-ink-3">{value}</span>
          </li>
        ))}
      </ul>
    ),
  },
];

export default function WizardStepsDemo() {
  const [index, setIndex] = useState(0);
  const [done, setDone] = useState(false);

  return (
    <div className="mx-auto w-full max-w-[420px]">
      <WizardSteps
        steps={steps}
        index={index}
        complete={done}
        onIndexChange={(next) => {
          setDone(false);
          setIndex(next);
        }}
        onComplete={() => setDone(true)}
      />
    </div>
  );
}

Dependencies

More by Özer

View all
  • Password Strength

    Password Strength

    1.3K
  • OTP Input

    OTP Input

    802
  • Loading Button

    Loading Button

    601
  • Progress Bar

    Progress Bar

    588
  • Reorder List

    Reorder List

    310
  • Task Steps

    Task Steps

    276
  • Hold to Confirm

    Hold to Confirm

    250
  • Reading Progress

    Reading Progress

    169

More in Forms

View all
  • Premium Auth

    Premium Auth

    500
  • Login 2

    Login 2

    7
  • Authentication Card

    Authentication Card

    47
  • Login 1

    Login 1

    52
  • Contact Card

    Contact Card

    1K
  • Login Form

    Login Form

    6
  • Form

    Form

    16
  • Book A Demo 3

    Book A Demo 3

    83