Library · Forms & CTAs

Form / Multi-Step Wizard

Progressive multi-step form with a step indicator; Next is gated on the current step's required fields (tested logic in lib/sections/interactions). No-JS renders all steps as one submittable form. Tone via the shared contract.

Figma: Form / Multi-Step Wizard ↗
Live preview — edit theme bottom-right
---
import FormWizard from "../components/figma/FormWizard.astro";
---
<FormWizard
  heading="Enquire in three quick steps"
  action="/enquire"
  tone="base-200"
  steps={[
    { title: "About you", fields: [
      { name: "name", label: "Full name", required: true },
      { name: "email", label: "Email", type: "email", required: true },
    ] },
    { title: "Your interest", fields: [
      { name: "development", label: "Development", kind: "select", required: true, options: [
        { value: "riverside", label: "Riverside Residences" },
        { value: "parkview", label: "Parkview Terraces" },
      ] },
      { name: "budget", label: "Budget range", kind: "select", options: [
        { value: "u500", label: "Under $500k" },
        { value: "500-750", label: "$500k–$750k" },
      ] },
    ] },
    { title: "Anything else", fields: [
      { name: "message", label: "Your message", kind: "textarea" },
      { name: "consent", label: "Please contact me about this development", kind: "checkbox", required: true },
    ] },
  ]}
/>

Props

NameTypeRequiredDescription
steps WizardStep[]; Yes Ordered steps
action string; Yes Form submit URL
submitLabel string; Final submit label (default: 'Submit')
heading string; Optional heading
tone "base-100" | "base-200" | "base-300" | "primary" | "secondary" | "neutral"; Background tone — the Figma colour-variant axis

Example with all props

<FormWizard
  heading="Enquire in three quick steps"
  action="/enquire"
  steps={[
    { title: "About you", fields: [{ name: "name", label: "Full name", required: true }] },
    { title: "Anything else", fields: [{ name: "message", label: "Your message", kind: "textarea" }] },
  ]}
/>