Auth Card

Sign-in and sign-up blocks built on the social login buttons. The providers sit under the email form and arrange three ways from the same array: stacked with labels, inline as compact icons, or spread across equal columns. Pass media for the two-column split with artwork. A verify mode covers the one-time-code step. The form is uncontrolled and hands you its FormData, so it wraps whatever auth library you already use.

Welcome back

Sign in to pick up where you left off.

Forgot password?
or continue with

New here? Create an account

Installation

You can add the auth card block using our CLI or manually:

Dark mode ready - this component follows BoardUI semantic tokens automatically. Set up theme switching.

The CLI copies the component source (with its internal dependencies) into your project and installs any required npm packages.

npx boardui@latest add auth-card

Layouts

Both layouts put the providers after the email form, since that is the path the card is built around. stacked gives each provider a full-width button with its name, which suits a dedicated sign-in page where there is room to spell them out. inline shrinks them to icon-only squares, compact enough for a modal or a narrow panel and able to carry more providers in the same space. Both read the same providers array, so switching is one prop.

Welcome back

Sign in to pick up where you left off.

Forgot password?
or continue with

New here? Create an account

Welcome back

Sign in to pick up where you left off.

Forgot password?
or continue with

New here? Create an account

{/* Stacked: full-width buttons with labels, under the form */}<AuthCard layout="stacked" providers={["google", "apple", "github"]} /> {/* Inline: icon-only squares, under the form */}<AuthCard layout="inline" providers={["google", "apple", "github", "x", "figma", "slack"]}/> {/* Grid: icon-only buttons across equal columns */}<AuthCard layout="grid" providers={["apple", "google", "figma"]} />

Split with artwork

Passing media turns the card into a two-column split: the form on the left, whatever you hand it on the right. It is the shape for a dedicated sign-up page, where there is room for artwork and the extra fields that go with it. Below md the media is dropped rather than stacked, since a tall image above the fields pushes the form off a phone screen for no gain.

media takes any node, so a single image or a video works. AuthMediaCarousel ships alongside the card for the common case: hand it a list of images and it crossfades between them on its own, holding on the first under prefers-reduced-motion. It offers no arrows on purpose — artwork beside a sign-in form is atmosphere, and controls invite the visitor away from what they came to do.

Three options usually travel with it: centered for the heading, confirmPassword to pair the two password fields on one row, and footnote for small print that sits under the card rather than crowding the CTA. The providers use layout="grid", which spreads icon-only buttons across equal columns so they read as one row of controls.

Create your account

Enter your email below to create your account

We use this to contact you, and never share it.
or continue with

Already have an account? Sign in

By clicking continue, you agree to our Terms of Service and Privacy Policy.

import { AuthMediaCarousel } from "@/components/application/auth/auth-media-carousel"; <AuthCard mode="signup" layout="grid" centered confirmPassword providers={["apple", "google", "figma"]} footnote="By clicking continue, you agree to our Terms of Service and Privacy Policy." media={ <AuthMediaCarousel slides={[ { src: "/art/one.webp" }, { src: "/art/two.webp" }, { src: "/art/three.webp" }, { src: "/art/four.webp" }, ]} /> }/> {/* Any node works — a single image, a video, a gradient */}<AuthCard media={<img src="/art/one.webp" alt="" className="size-full object-cover" />} />

Sign in and sign up

mode switches the copy and the fields. signin carries remember me and a forgot-password link; signup adds a name field and the terms line, and drops the two controls that only make sense on a return visit.

Welcome back

Sign in to pick up where you left off.

Forgot password?
or continue with

New here? Create an account

Create your account

Start building with BoardUI in a couple of minutes.

We use this to contact you, and never share it.

By creating an account you agree to our Terms of Service and Privacy Policy.

or continue with

Already have an account? Sign in

<AuthCard mode="signin" /> {/* Welcome back, remember me, forgot password */}<AuthCard mode="signup" /> {/* Adds a name field and the terms line */}

Verification code

mode="verify" is the step after signing in or up: the OTP boxes replace the email and password fields, a resend action replaces the link to the other mode, and the providers disappear entirely, since whoever is looking at this has already chosen how they sign in. It keeps the same left-aligned shape as the other two modes, so the step reads as part of the same flow, and takes a mail mark by default, which logo overrides.

Pass email to name the address in the description, and onComplete to act the moment the last digit lands rather than waiting for the button.

Check your inbox

Enter the code we sent to mertcan@boardui.com to finish signing in.

Verification code

Code not arriving?

<AuthCard mode="verify" email="mertcan@boardui.com" codeLength={6} onComplete={(code) => verifyCode(code)} onResend={() => resend()}/> {/* Four boxes instead of six */}<AuthCard mode="verify" email={email} codeLength={4} />

Providers

Any of the social button's 24 brands, in the order you list them. They use the outlined whiteappearance, which is the one that shows each provider's real multi-colour mark: a stack of saturated brand fills competes with itself and makes no single option readable.

Create your account

Start building with BoardUI in a couple of minutes.

We use this to contact you, and never share it.

By creating an account you agree to our Terms of Service and Privacy Policy.

or continue with

Already have an account? Sign in

Welcome back

Sign in to pick up where you left off.

Forgot password?
or continue with

New here? Create an account

{/* Any of the 24 social button brands, in any order */}<AuthCard providers={["google", "microsoft", "okta"]} /> {/* Email only: pass an empty array and the divider disappears with it */}<AuthCard providers={[]} />

Wiring it up

The card is the shell, not an opinion about authentication. The form is uncontrolled and onSubmit hands you its FormData, while onProvider fires with the brand that was clicked, so both go straight to NextAuth, Clerk, Supabase or your own endpoint.

<AuthCard mode="signup" // The form is uncontrolled; you get its FormData on submit. onSubmit={(data) => { const email = data.get("email"); const password = data.get("password"); // ...hand these to your auth library }} onProvider={(provider) => signIn(provider)} switchHref="/sign-in"/>