Welcome back
The workspace your team already loves — pick up right where you left off.
Don't have an account? Sign up
Two-column editorial sign-in pairing an oversized typographic brand panel with a clean email and password form. Stacks the panel above the form on mobile. Perfect for brands that want a minimal, editorial first impression.
A full-height two-column sign-in screen that pairs a left editorial panel (uppercase eyebrow, oversized heading, and description on a bg-muted background) with a right-hand email and password form built from Field primitives, a forgot-password link beside the password label, a submit button, and a signup prompt below, collapsing to a single stacked column below the lg breakpoint.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/auth32?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/auth32?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/auth32.tsx, plus the button, input, and field shadcn/ui primitives it uses for the submit button, the email and password inputs, and the field labels and descriptions.
The installed file exports auth32Demo alongside the block: the exact props behind the preview above. Spread it to get a working sign-in screen in one line.
import { Auth32, auth32Demo } from "@/components/beste/block/auth32";
export default function SignInPage() {
return <Auth32 {...auth32Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Auth32 } from "@/components/beste/block/auth32";
export default function SignInPage() {
return (
<Auth32
eyebrow="Welcome back"
heading="Sign in to keep building."
description="Pick up right where you left off."
labels={{
email: "Email",
emailPlaceholder: "you@example.com",
password: "Password",
passwordPlaceholder: "Enter your password",
submit: "Continue",
}}
forgotPasswordLink={{ label: "Forgot password?", href: "/reset" }}
signupPrompt={{ text: "Don't have an account?", linkLabel: "Sign up", href: "/signup" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Uppercase tracked label above the heading; hidden when omitted |
heading | string | – | Oversized editorial heading in the left panel; hidden when omitted |
description | string | – | Supporting paragraph under the heading; hidden when omitted |
labels | Labels | {} | Field labels and placeholders; each field renders only if its label is set |
forgotPasswordLink | { label: string; href: string } | – | Link shown beside the password label; hidden when omitted |
signupPrompt | { text: string; linkLabel: string; href: string } | – | Prompt text plus link below the form; hidden when omitted |
className | string | – | Extra classes merged onto the outer <section> |
type Labels = {
email?: string;
emailPlaceholder?: string;
password?: string;
passwordPlaceholder?: string;
submit?: string;
};onSubmit calls e.preventDefault() and nothing else, so the inputs are uncontrolled and no email or password value is captured or lifted out. Wiring real authentication is left to the integrator.labels.email is set, the password field only when labels.password is set, and the submit button only when labels.submit is set. An empty or omitted labels object therefore renders an empty form.useId() call suffixed with -email and -password, keeping the htmlFor/id pairs unique and stable across instances.forgotPasswordLink is provided.next/link; the block assumes a Next.js app and href values are passed straight through with no validation.lg:grid-cols-2 grid at min-h-screen: below lg the editorial panel stacks above the form, and above lg the two columns sit side by side with the panel on the left.Wiring the form up
This block ships the form markup only; state, validation, and submit are yours to add. Our guide wires the shadcn Field primitives to React Hook Form, TanStack Form, and Formisch on one field system.
auth9
Two-column sign-in screen pairing a full sign-in form (social providers, email, password with show/hide, remember me) with a brand panel that lists product highlights. Includes a left/right panel position toggle.
auth2
Two-column registration screen pairing a sign-up form (social providers, name, email, password with show/hide, terms checkbox) with a full-bleed image showcase and customer testimonial. Includes a left/right image position toggle.
auth49
A hairline sign-in panel with a lowercase wordmark, email and password fields, an inline forgot link, a remember toggle, and an SSO fallback, set beside a full-height photo carrying a gradient customer quote.
auth54
A full-height sign-in split: wordmark, a serif greeting that settles in word by word, email and password fields with a full-width sliding-marker pill and a switch-to-booking line on the left, and a photograph that zooms out on load, then drifts slower than the page, with a serif reassurance over its foot on the right.