Snippets Form

Bootstrap 5 Modal Login Form with Social Logins

A sign-in modal opened from a hero card, with social login buttons, an email and password form, remember-me and a forgot-password link.

Bootstrap 5 No jQuery Aug 2020 2.6K views

<section class="wdw-stage">
  <div class="container" style="max-width: 1000px">
    <div class="row g-0 rounded-4 overflow-hidden shadow-lg">
      <div class="col-lg-7 wdw-aurora p-4 p-md-5 d-flex flex-column justify-content-center">
        <span class="wdw-icon mb-3 ml-icon">
          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="4" y="11" width="16" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/></svg>
        </span>
        <h2 class="display-6 fw-bold mb-2">Welcome back</h2>
        <p class="mb-4 ml-sub">Sign in to pick up where you left off, or create an account in a minute.</p>
        <ul class="list-unstyled d-grid gap-2 mb-4 ml-sub">
          <li class="d-flex gap-2 align-items-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> Sync your work across every device</li>
          <li class="d-flex gap-2 align-items-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> One-tap sign in with Google or Facebook</li>
          <li class="d-flex gap-2 align-items-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> Cancel or switch plans anytime</li>
        </ul>
        <div class="d-flex flex-column flex-sm-row gap-2">
          <button type="button" class="btn btn-light rounded-pill px-4 fw-bold" data-bs-toggle="modal" data-bs-target="#mlModal" data-ml-mode="signin">Sign in</button>
          <button type="button" class="btn rounded-pill px-4 text-white ml-ghost" data-bs-toggle="modal" data-bs-target="#mlModal" data-ml-mode="signup">Create account</button>
        </div>
      </div>
      <div class="col-lg-5 bg-body p-4 p-md-5">
        <h3 class="h5 wdw-heading mb-1">Quick sign in</h3>
        <p class="wdw-muted small mb-3">Use a social account or your email.</p>
        <div class="row g-2 mb-3">
            <div class="col-4"><button type="button" class="btn btn-outline-secondary rounded-pill w-100" aria-label="Continue with Google">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M20.5 12h-8.5"/><path d="M16 17a6 6 0 1 1 0-10"/></svg></button></div>
            <div class="col-4"><button type="button" class="btn btn-outline-secondary rounded-pill w-100" aria-label="Continue with Facebook">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg></button></div>
            <div class="col-4"><button type="button" class="btn btn-outline-secondary rounded-pill w-100" aria-label="Continue with Twitter">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"/></svg></button></div>
        </div>
        <div class="d-flex align-items-center gap-3 my-3"><hr class="flex-grow-1 m-0"><span class="small wdw-muted">or</span><hr class="flex-grow-1 m-0"></div>
        <form id="mlQuick" novalidate>
          <div class="form-floating mb-3"><input type="email" class="form-control" id="mlQEmail" placeholder="Email" required autocomplete="email"><label for="mlQEmail">Email</label><div class="invalid-feedback">Enter a valid email.</div></div>
          <button type="submit" class="btn btn-primary rounded-pill w-100">Continue</button>
        </form>
      </div>
    </div>
  </div>
</section>

<div class="modal fade" id="mlModal" tabindex="-1" aria-labelledby="mlTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" style="max-width:420px">
    <div class="modal-content border-0 shadow-lg p-2" style="border-radius:1.25rem">
      <div class="modal-header border-0 pb-0"><button type="button" class="btn-close ms-auto" data-bs-dismiss="modal" aria-label="Close"></button></div>
      <div class="modal-body pt-0 px-4 pb-4">
        <h3 class="wdw-heading h3 mb-1" id="mlTitle">Sign in</h3>
        <p class="wdw-muted mb-4" id="mlSub">Use your email or a social account.</p>
        <div class="row g-2 mb-3">
          <div class="col-4"><button type="button" class="btn btn-outline-secondary rounded-pill w-100" aria-label="Sign in with Google">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M20.5 12h-8.5"/><path d="M16 17a6 6 0 1 1 0-10"/></svg></button></div>
          <div class="col-4"><button type="button" class="btn btn-outline-secondary rounded-pill w-100" aria-label="Sign in with Facebook">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg></button></div>
          <div class="col-4"><button type="button" class="btn btn-outline-secondary rounded-pill w-100" aria-label="Sign in with Twitter">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"/></svg></button></div>
        </div>
        <div class="d-flex align-items-center gap-3 my-3"><hr class="flex-grow-1 m-0"><span class="small wdw-muted">or with email</span><hr class="flex-grow-1 m-0"></div>
        <form id="mlForm" novalidate>
          <div class="form-floating mb-3 d-none" id="mlNameWrap"><input type="text" class="form-control" id="mlName" placeholder="Full name" autocomplete="name"><label for="mlName">Full name</label></div>
          <div class="form-floating mb-3"><input type="email" class="form-control" id="mlEmail" placeholder="Email" required autocomplete="email"><label for="mlEmail">Email</label><div class="invalid-feedback">Enter a valid email.</div></div>
          <div class="form-floating mb-3"><input type="password" class="form-control" id="mlPass" placeholder="Password" required autocomplete="current-password"><label for="mlPass">Password</label><div class="invalid-feedback">Enter your password.</div></div>
          <div class="d-flex justify-content-between align-items-center mb-4" id="mlExtras">
            <div class="form-check mb-0"><input class="form-check-input" type="checkbox" id="mlRemember"><label class="form-check-label small" for="mlRemember">Remember me</label></div>
            <a href="#" class="small fw-semibold link-underline-opacity-0">Forgot password?</a>
          </div>
          <button type="submit" class="btn btn-primary rounded-pill w-100" id="mlSubmit">Sign in</button>
        </form>
      </div>
    </div>
  </div>
</div>

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.