A centered password reset card whose segmented strength meter and checked requirement list update as the field is typed, with a confirmation field and a breach-check note underneath.
A centered password reset card whose segmented strength meter and checked requirement list update as the field is typed, with a confirmation field and a breach-check note underneath.
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/auth52?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/auth52?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/auth52.tsx, the shadcn/ui input component it depends on, and the button21 component it uses for the action.
The installed file exports auth52Demo alongside the block: the exact props behind the preview above. Spread it to get a working reset page in one line.
import { Auth52, auth52Demo } from "@/components/beste/block/auth52";
export default function ResetPage() {
return <Auth52 {...auth52Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Auth52 } from "@/components/beste/block/auth52";
export default function ResetPage() {
return (
<Auth52
wordmark="sirius"
heading="Choose a new password"
description="Once you set a password here, every other session on your account is signed out."
passwordLabel="New password"
passwordPlaceholder="At least twelve characters"
confirmLabel="Type it again"
confirmPlaceholder="The same password"
strengthLabels={["Too short", "Weak", "Reasonable", "Strong"]}
requirements={[
{ label: "Twelve characters or more", minLength: 12 },
{ label: "Upper and lower case", needsMixedCase: true },
{ label: "At least one number", needsNumber: true },
{ label: "At least one symbol", needsSymbol: true },
]}
submitLabel="Set the password and sign in"
note="We check new passwords against public breach lists."
backLink={{ label: "Back to sign in", href: "/signin" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
wordmark | string | – | Lowercase wordmark at the top of the card |
heading | string | – | Card heading, rendered as the h1 |
description | string | – | Supporting paragraph under the heading |
passwordLabel | string | – | Label for the controlled password field |
passwordPlaceholder | string | – | Placeholder for the password field |
confirmLabel | string | – | Label for the confirmation field |
confirmPlaceholder | string | – | Placeholder for the confirmation field |
strengthLabels | string[] | [] | Words for each strength level, weakest first |
requirements | Requirement[] | [] | Rules checked live against the typed value |
submitLabel | string | – | Label for the submit button |
note | string | – | Small line under the submit button |
backLink | { label: string; href: string } | – | Link under the card's hairline |
className | string | – | Extra classes for the outer section |
type Requirement = {
label: string;
minLength?: number;
needsNumber?: boolean;
needsSymbol?: boolean;
needsMixedCase?: boolean;
};minLength, needsNumber, needsSymbol and needsMixedCase apply, and the block's meets helper evaluates all of them together. A requirement with no flags passes as soon as the field is non-empty.strengthLabels is indexed independently and clamped to its own length, so a mismatch between the number of labels and the number of requirements degrades to the closest label instead of rendering undefined.aria-hidden because the requirement list beneath it carries the same information as text, with the met state shown by a filled check rather than colour alone.note is copy, not behavior.bg-background on a bg-muted section, which is how the set raises a centered auth card off the page.Wiring the form up
The live strength meter is presentational; submission and the confirm-match check are yours. The patterns in React Hook Form, TanStack Form, and Formisch cover validation and cross-field rules for exactly this shape of form.
auth5
Full-height reset-password screen with new and confirm password fields (each with a show/hide toggle) and a live requirements checklist that ticks off rules as the user types. Perfect for the final step of a password reset or invite flow.
auth1
Full-height centered sign-in screen with social login providers, email and password fields, a show/hide password toggle, remember-me checkbox, and forgot-password link. Perfect for SaaS apps, dashboards, and member portals.
auth51
A centered passwordless card that advances in place from a work email step with an SSO fallback to a monospace one-time-code entry with resend and go-back controls.
auth13
Full-height centered registration card with social providers, name, email, and password fields (with show/hide), a terms checkbox, and a sign-in link. Perfect for SaaS sign-up pages that don't need a split layout.