Snippets Form

Bootstrap 5 Registration Form with Plan Selection

A clean registration form grouped into personal details, account login and a radio-card subscription picker, with floating labels and autofill hints.

Bootstrap 5 No jQuery Nov 2020 6.6K views

<section class="wdw-stage">
  <div class="container" style="max-width:1020px">
    <div class="wdw-card overflow-hidden">
      <div class="row g-0">
        <aside class="col-lg-4 d-none d-lg-flex wdw-aurora reg-side p-4 flex-column justify-content-between">
          <div>
            <span class="wdw-eyebrow text-white-50">Get started</span>
            <h1 class="fw-bold h3 mt-2 mb-2" style="letter-spacing:-.02em">Create your account</h1>
            <p class="opacity-75 small mb-0">Pick a plan, add your details and you are in. Change or cancel any time.</p>
          </div>
          <div class="reg-summary rounded-4 p-3" aria-live="polite">
            <div class="small opacity-75">Your plan</div>
            <div class="d-flex align-items-baseline justify-content-between mt-1"><span class="fw-bold fs-5" id="regPlanName">Deluxe</span><span class="fw-bold fs-4" id="regPlanPrice">$5<span class="small fw-normal opacity-75">/mo</span></span></div>
            <div class="small opacity-75 mt-1" id="regPlanNote">For small teams</div>
          </div>
        </aside>
        <div class="col-lg-8 p-4 p-md-4">
          <h1 class="wdw-heading h4 mb-3 d-lg-none">Create your account</h1>
          <form class="reg-form" id="regForm" novalidate>
            <fieldset class="mb-3"><legend class="reg-legend">Choose a plan</legend>
              <div class="row g-2" role="radiogroup">
                <div class="col-4"><input type="radio" class="btn-check" name="plan" id="plan-free" value="Free" data-price="$0" data-note="For personal projects" autocomplete="off"><label class="reg-plan" for="plan-free"><span class="fw-bold text-body-emphasis">Free</span><span class="fw-bold text-body-emphasis">$0<span class="small fw-normal wdw-muted">/mo</span></span></label></div>
                <div class="col-4"><input type="radio" class="btn-check" name="plan" id="plan-deluxe" value="Deluxe" data-price="$5" data-note="For small teams" autocomplete="off" checked><label class="reg-plan" for="plan-deluxe"><span class="reg-pop badge rounded-pill text-bg-primary">Most popular</span><span class="fw-bold text-body-emphasis">Deluxe</span><span class="fw-bold text-body-emphasis">$5<span class="small fw-normal wdw-muted">/mo</span></span></label></div>
                <div class="col-4"><input type="radio" class="btn-check" name="plan" id="plan-premium" value="Premium" data-price="$10" data-note="For growing companies" autocomplete="off"><label class="reg-plan" for="plan-premium"><span class="fw-bold text-body-emphasis">Premium</span><span class="fw-bold text-body-emphasis">$10<span class="small fw-normal wdw-muted">/mo</span></span></label></div>
              </div>
            </fieldset>
            <fieldset class="mb-3"><legend class="reg-legend">Your details</legend>
              <div class="row g-2">
                <div class="col-sm-6"><div class="form-floating"><input type="text" class="form-control" id="fname" placeholder="First name" autocomplete="given-name" required><label for="fname">First name</label><div class="invalid-feedback">Enter your first name.</div></div></div>
                <div class="col-sm-6"><div class="form-floating"><input type="text" class="form-control" id="lname" placeholder="Last name" autocomplete="family-name" required><label for="lname">Last name</label><div class="invalid-feedback">Enter your last name.</div></div></div>
                <div class="col-12"><div class="form-floating"><input type="text" class="form-control" id="address" placeholder="Address" autocomplete="street-address" required><label for="address">Address</label><div class="invalid-feedback">Enter your address.</div></div></div>
                <div class="col-sm-5"><div class="form-floating"><input type="text" class="form-control" id="city" placeholder="City" autocomplete="address-level2" required><label for="city">City</label><div class="invalid-feedback">Enter a city.</div></div></div>
                <div class="col-sm-4"><div class="form-floating"><select class="form-select" id="state" autocomplete="address-level1" required><option value="" selected>Choose</option><option>Alabama</option><option>Alaska</option><option>Arizona</option><option>California</option><option>Colorado</option><option>Florida</option><option>Georgia</option><option>Illinois</option><option>New York</option><option>Texas</option><option>Washington</option></select><label for="state">State</label><div class="invalid-feedback">Pick a state.</div></div></div>
                <div class="col-sm-3"><div class="form-floating"><input type="text" class="form-control" id="zip" placeholder="Zip code" autocomplete="postal-code" required><label for="zip">Zip</label><div class="invalid-feedback">Required.</div></div></div>
              </div>
            </fieldset>
            <fieldset class="mb-3"><legend class="reg-legend">Account login</legend>
              <div class="row g-2">
                <div class="col-12"><div class="form-floating"><input type="email" class="form-control" id="email" placeholder="Email" autocomplete="email" required><label for="email">Email</label><div class="invalid-feedback">Enter a valid email address.</div></div></div>
                <div class="col-sm-6"><div class="input-group has-validation"><div class="form-floating"><input type="password" class="form-control" id="cr_password" placeholder="Create password" autocomplete="new-password" minlength="8" required><label for="cr_password">Create password</label></div><button class="btn btn-outline-secondary reg-eye" type="button" data-toggle-pass="#cr_password" aria-label="Show password" aria-pressed="false"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12z"/><circle cx="12" cy="12" r="3"/></svg></button><div class="invalid-feedback">At least 8 characters.</div></div></div>
                <div class="col-sm-6"><div class="form-floating"><input type="password" class="form-control" id="conf_password" placeholder="Confirm password" autocomplete="new-password" required><label for="conf_password">Confirm password</label><div class="invalid-feedback">Passwords must match.</div></div></div>
              </div>
            </fieldset>
            <button type="submit" class="btn btn-primary rounded-pill w-100">Create account</button>
            <p class="small wdw-muted text-center mt-2 mb-0">By signing up you agree to our <a href="#" class="text-decoration-none fw-semibold">Terms</a> and <a href="#" class="text-decoration-none fw-semibold">Privacy Policy</a>.</p>
          </form>
          <div class="reg-success text-center py-5 d-none" id="regSuccess" role="status" tabindex="-1">
            <div class="reg-done mx-auto mb-3"><svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m5 12.5 4.5 4.5L19 7.5"/></svg></div>
            <h2 class="h4 fw-bold text-body-emphasis">Welcome aboard, <span id="regName">friend</span></h2>
            <p class="wdw-muted mb-4">Your <strong id="regDonePlan">Deluxe</strong> account is ready. We sent a confirmation to your email.</p>
            <button type="button" class="btn btn-outline-primary rounded-pill px-4" id="regReset">Start over</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>

Built on Bootstrap 5.3.8 with plain JavaScript — no jQuery. Supports light and dark mode via data-bs-theme.

Free to use in personal and commercial projects under the MIT license.