Xzero UI
Pro library

Login splitPro

A full screen split login: an email-first form that morphs into a password step beside a photo.

$ pnpm dlx shadcn@4.23.0 add @xzero-ui-pro/login-split
Live · keyboard ready

Variant: Split

A full screen split login: an email-first form that morphs into a password step beside a photo.

Use this as your sign in page with fullScreen. Connect Continue to your account lookup, Sign in and the SSO buttons to your auth provider, Forgot password to your reset email, and pass links for sign up, terms and privacy.

When to use

When not to use

Installation

Register both Xzero UI namespaces in your project's components.json:

{
  "registries": {
    "@xzero-ui": "https://mcp.xzero.co.uk/r/{name}.json",
    "@xzero-ui-pro": "https://mcp.xzero.co.uk/r/pro/{name}.json"
  }
}
npx shadcn@4.23.0 add @xzero-ui-pro/login-split

Install xzero-foundation once, and import @/components/xzero/foundation.css in your app root. No Xzero token is used by this snapshot. For sample portraits, photos, fonts, or logos, download https://mcp.xzero.co.uk/install-assets.mjs and run node xzero-install-assets.mjs <receiving-project>.

Usage

import { LoginSplit } from "@/components/xzero/blocks/login-split/login-split";

export default function SignInPage() {
  return (
    <LoginSplit
      fullScreen
      links={{ signUp: "/sign-up", terms: "/terms", privacy: "/privacy" }}
      onSignIn={(account, method) => console.log(account.email, method)}
    />
  );
}

Examples

Real links

<LoginSplit
  fullScreen
  links={{ signUp: "/sign-up", terms: "/terms", privacy: "/privacy" }}
  onSignIn={account => router.push("/app")}
/>

API reference

LoginSplit

A split sign in screen: an email-first form that morphs into a password step beside a photo. Accounts are the sample people list in login-split.tsx with portraits from public/media/people, and the photo is imported from public/media/photos/concert-hall.jpg.

PropTypeDefaultDescription
fullScreenbooleanfalseFill the viewport (100dvh, no frame) when the screen is used as a page.
onSignIn(account: LoginSplitAccount, method: LoginSplitMethod) => void–Called once the simulated sign in finishes. LoginSplitAccount is { name, email, photo? }; LoginSplitMethod is "Password" | "Google" | "Apple" | "GitHub".
demoPasswordstring"arc-demo"The password the simulated account accepts.
linksPartial<Record<"signUp" | "terms" | "privacy", string>>–Real destinations for the small links. Without them each link announces a simulated action.

Accessibility

Motion

Responsive behavior

Performance

Notes for AI

Related

Browse all components