Auth

Composed authentication templates — screens, not primitives. Six flows: login, signup, forgot password, reset password, verify (OTP code · magic-link-sent), and MFA code. Two layouts each: centered card (default, SaaS apps) and --split with a swappable brand panel (marketing-led products). Pure CSS scaffolding — every control is an existing primitive (.lb-field, .lb-input, .lb-btn, .lb-checkbox, .lb-link, brand icons). The auth engine is yours — Clerk, Supabase, or your own; forms ship unwired. Consumed here: Card · Forms · Input · Checkbox · Button · Link · brand Icons.

a11y & 2026 patterns (built in): visible labels on every field — never placeholder-only; full autocomplete set (WCAG 1.3.5): username webauthn on the login email (passkey autofill, the FIDO-primary pattern), current-password / new-password, one-time-code. OTP entry is a single input — six separate boxes break SMS autofill and screen readers. A passkey button is an optional secondary slot, never the signup credential (enrollment is post-signup).


A · Login — centered card

Social row trailing (below the form fields it's leading — flip by markup order around the divider). Email carries autocomplete="username webauthn"; the fingerprint button is the optional passkey slot.

Welcome back

Log in to your account to continue.

or
Forgot password?

No account? Sign up

B · Login — --split with brand panel

Same card, second layout. The left panel is a slot — drop in a product shot, testimonial, or brand art. Collapses to form-only below 768px. Applies identically to every screen on this page.

Design once, theme forever.

Token-driven components for people who ship.

Welcome back

Log in to your account to continue.

or

No account? Sign up

C · Signup — social leading

Social row leading (before the form). Password uses autocomplete="new-password"; no password-confirm field — the eye toggle covers verification. Terms consent is a required checkbox. Passkey enrollment happens after signup, never here.

Create your account

Start your 14-day free trial. No card required.

or
Use 8 or more characters.

Already have an account? Log in

D · Forgot password — request + reset

Two separate screens, per the production flow: request (email only) → email link/code → reset (new password only, shown after identity is verified).

Reset your password

Enter your email and we'll send you a reset link.

← Back to login

Choose a new password

You're signed in as you@example.com.

Use 8 or more characters.

E · Verify — OTP code · magic-link sent

Two variants of one skeleton, because providers ship both strategies. The code field is one input with autocomplete="one-time-code" + inputmode="numeric" — SMS/email autofill just works.

Check your email

We sent a 6-digit code to you@example.com.

Didn't get it? Resend code

Check your email

We sent a sign-in link to you@example.com. It expires in 10 minutes.

Didn't get it? Resend link · Back to login

F · MFA — two-factor code

Reuses the verify skeleton — authenticator-app flavor, with the backup-code escape hatch.

Two-factor authentication

Enter the 6-digit code from your authenticator app.

Use a backup code

Usage

Pure CSS — nothing to init (the password eye-toggle comes from the existing data-lb-password field behavior). Forms ship unwired: attach your own submit handlers to your auth provider. On a real page, .lb-auth fills the viewport (min-height: 100vh on the host or body-level layout).

<div class="lb-auth">                             <!-- or .lb-auth.lb-auth--split -->
  <!-- split layout only: -->
  <!-- <div class="lb-auth__panel">…brand slot…</div> <div class="lb-auth__main"> -->
  <div class="lb-card lb-card--padded lb-card--elevated lb-auth__card">
    <div class="lb-auth__head">
      <span class="lb-auth__logo" data-lb-icon="letbe"></span>
      <h1 class="lb-auth__title">Welcome back</h1>
      <p class="lb-auth__subtitle">Log in to continue.</p>
    </div>
    <div class="lb-auth__social">                   <!-- optional; --row for icon-only -->
      <button class="lb-btn lb-btn--secondary lb-btn--medium"><span class="lb-btn__icon" data-lb-icon="google"></span> Continue with Google</button>
    </div>
    <div class="lb-auth__divider">or</div>
    <form class="lb-form lb-form--compact">
      <div class="lb-field">
        <label class="lb-label" for="email">Email</label>
        <div class="lb-input-wrap"><input class="lb-input lb-input--medium" id="email" type="email" autocomplete="username webauthn"></div>
      </div>
      <div class="lb-field" data-lb-password>
        <label class="lb-label" for="pw">Password</label>
        <div class="lb-input-wrap"><input class="lb-input lb-input--medium" id="pw" type="password" autocomplete="current-password"></div>
      </div>
      <button class="lb-btn lb-btn--primary lb-btn--medium" type="submit">Log in</button>
    </form>
    <p class="lb-auth__meta">No account? <a class="lb-link" href="/signup">Sign up</a></p>
  </div>
</div>