Multi-Step Sign Up Wizard

Create your account

  1. 1Account
  2. 2Profile
  3. 3Workspace

Your login details

About this block

Multi-Step Sign Up WizardPRO

Full-height multi-step registration with a numbered progress stepper that advances as the user moves through account, profile, and workspace steps, with back and continue controls. Perfect for guided onboarding sign-up.

Auth33: Multi-Step Sign Up Wizard

A full-height registration card that walks through an array of steps: a numbered progress stepper marks each step complete, active, or upcoming, and the active step renders its title plus a FieldGroup of labeled inputs, with a Back button (from step two onward) and a primary button that reads "Continue" until the final step, where it switches to "Create account".

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/auth33?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/auth33.tsx, plus the button, input, and field shadcn/ui primitives it uses for the step controls and the labeled form inputs.

Quick start

The installed file exports auth33Demo alongside the block: the exact props behind the preview above. Spread it to get a working sign-up wizard in one line.

tsx
import { Auth33, auth33Demo } from "@/components/beste/block/auth33";

export default function Page() {
  return <Auth33 {...auth33Demo} />;
}

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

tsx
import { Auth33 } from "@/components/beste/block/auth33";

export default function Page() {
  return (
    <Auth33
      heading="Create your account"
      steps={[
        {
          label: "Account",
          title: "Your login details",
          fields: [
            { label: "Email", placeholder: "you@example.com", type: "email" },
            { label: "Password", placeholder: "Create a password", type: "password" },
          ],
        },
        {
          label: "Workspace",
          title: "Name your workspace",
          fields: [{ label: "Workspace name", placeholder: "acme", type: "text" }],
        },
      ]}
      labels={{ back: "Back", next: "Continue", submit: "Create account" }}
    />
  );
}

Props

PropTypeDefaultDescription
headingstringCentered page title above the stepper; hidden when omitted
stepsWizardStep[][]Ordered steps rendered in the stepper and the active card
labels{ back?: string; next?: string; submit?: string }{}Button text; back gates the Back button, submit shows on the last step
classNamestringExtra classes for the outer <section>
ts
type WizardField = {
  label: string;
  placeholder: string;
  type?: string;
};

type WizardStep = {
  label: string;
  title?: string;
  fields: WizardField[];
};

Behavior notes

  • The active step index lives in an internal useState(0) that is never lifted out or exposed via props, so the parent cannot read or control which step is showing.
  • Navigation is decorative only: handleNext and handleBack just move the internal index (clamped with Math.max(0, ...)), and the <form> calls e.preventDefault() on submit, so no field values are collected, validated, or emitted, wiring real submission is left to the integrator.
  • Field inputs are uncontrolled with no value, onChange, or state, so their contents are lost when the user moves between steps.
  • The Back button only renders when current > 0 AND labels.back is truthy; omitting labels.back removes it entirely even on later steps.
  • The primary button label swaps at runtime: it shows labels.next until current >= steps.length - 1, then labels.submit on the final step; both fall back to undefined (blank) if those labels are unset.
  • A step is marked complete (green check icon) when its index is below current, active when it equals current, and the connector line and number badge recolor accordingly; step labels are hidden below the sm breakpoint (hidden ... sm:inline).
  • The stepper and card only render when steps.length > 0 and activeStep exists; each field's type defaults to "text" when unset.

Wiring the form up

This block ships the form markup only; state, validation, and submit are yours to add. Our guide wires the shadcn Field primitives to React Hook Form, TanStack Form, and Formisch on one field system.

More Auth blocks

View all Auth
PRO

auth24

Complete Your Profile

Full-height profile setup step with an avatar uploader, a display name field, and a bio textarea, plus a skip option. Perfect for the post-sign-up onboarding step where users personalize their account.

PRO

auth46

Confirm It's You

Full-height step-up authentication screen that re-asks for the password before a sensitive action, showing the signed-in account and a cancel option. Perfect for protecting billing, security, and destructive actions.

FREE

auth6

Magic Link Sign In

Full-height passwordless sign-in screen with a single email field, a send-magic-link button, a helper note, and social login providers below a divider. Perfect for passwordless and email-link authentication flows.

PRO

auth26

Choose Your Plan

Full-height plan selection step with a monthly/annual billing toggle and selectable plan cards that update their pricing live, plus a continue button. Perfect for paid sign-up and upgrade flows.

PRO

auth43

Join the Waitlist

Full-height waitlist capture with an email field, a join button, a social-proof line, and a sign-in link for existing users. Perfect for pre-launch and early-access landing gates.

PRO

auth36

Workspace Switcher

Full-height workspace picker listing organizations with logo initials, member details, and a create-workspace row, plus a signed-in-as footer. Perfect for multi-tenant apps after sign-in.