Editorial Split Sign In

Welcome back

Sign in to keep building.

The workspace your team already loves — pick up right where you left off.

Don't have an account? Sign up

About this block

Editorial Split Sign InPRO

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.

Auth32: Editorial Split Sign In

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/auth32?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
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.

Quick start

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.

tsx
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:

tsx
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: "[email protected]",
        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" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Uppercase tracked label above the heading; hidden when omitted
headingstring–Oversized editorial heading in the left panel; hidden when omitted
descriptionstring–Supporting paragraph under the heading; hidden when omitted
labelsLabels{}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
classNamestring–Extra classes merged onto the outer <section>
ts
type Labels = {
  email?: string;
  emailPlaceholder?: string;
  password?: string;
  passwordPlaceholder?: string;
  submit?: string;
};

Behavior notes

  • The form is presentational only: 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.
  • Each of the three form rows is conditionally rendered by its label: the email field renders only when 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.
  • Field ids are derived from a single useId() call suffixed with -email and -password, keeping the htmlFor/id pairs unique and stable across instances.
  • The forgot-password link only appears inside the password field, so it is hidden whenever the password field itself is not rendered, regardless of whether forgotPasswordLink is provided.
  • Links use next/link; the block assumes a Next.js app and href values are passed straight through with no validation.
  • Layout is a 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.

More Auth blocks

View all Auth
PRO

auth9

Split-Screen Sign In

FREE

auth2

Split-Screen Sign Up

PRO

auth49

Split Sign In With Quote

Get Pro access