Full-height CAPTCHA-style check with an animated I'm-not-a-robot control that runs through verifying and verified states and unlocks the continue button. Perfect for bot protection before sign-in.
A full-height, centered CAPTCHA-style verification screen: an optional heading and description sit above a card-styled "I'm not a robot" button that, on click, cycles through an idle checkbox, a spinning verifying state, and a green-checkmark verified state, at which point the previously disabled continue button becomes an active link.
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/auth45?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/auth45?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/auth45.tsx, plus the button shadcn/ui primitive it uses for the continue button.
The installed file exports auth45Demo alongside the block: the exact props behind the preview above. Spread it to get a working verification screen in one line.
import { Auth45, auth45Demo } from "@/components/beste/block/auth45";
export default function Page() {
return <Auth45 {...auth45Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Auth45 } from "@/components/beste/block/auth45";
export default function Page() {
return (
<Auth45
heading="Verify you're human"
description="Complete the quick check below to continue."
labels={{
checkbox: "I'm not a robot",
verifying: "Verifying…",
verified: "Verified",
brand: "Beste Shield",
}}
submitButton={{ label: "Continue", href: "/dashboard" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
heading | string | – | Top heading; omitted from the DOM when falsy |
description | string | – | Sub-heading paragraph; omitted from the DOM when falsy |
labels | Labels | {} | Text for the checkbox control and brand tag across states |
submitButton | { label: string; href: string } | – | Continue button; only rendered when provided |
className | string | – | Extra classes for the outer <section> |
type Labels = {
checkbox?: string;
verifying?: string;
verified?: string;
brand?: string;
};verifying, then a setTimeout of 1200ms flips it to verified; there is no callback, promise, or server hook, so real bot-checking is left to the integrator.<button>, not a checkbox input, and it is disabled once status leaves idle, so the flow only runs forward once and cannot be reset without remounting.status state lives entirely inside the component with no onChange or onVerified prop, so the parent has no way to observe when verification completes.labels.verified when verified, labels.verifying while verifying, otherwise labels.checkbox; each is optional and renders nothing when unset.Loader2 while verifying, a green Check when verified, and an empty bordered square when idle.ShieldCheck icon plus labels.brand) on the right of the control only renders when labels.brand is set.Button is always disabled until status is verified; only then does it gain asChild and wrap a next/link pointing at submitButton.href, so before verification it is an inert button with no link.auth3
Full-height OTP verification screen with a centered icon, segmented six-digit code input, a verify button that unlocks once the code is complete, and a live resend countdown timer. Perfect for two-factor auth, magic links, and email confirmation flows.
auth10
Full-height biometric sign-in with an animated face-scan viewfinder that runs through idle, scanning, and recognized states, plus a continue action and a password fallback. Perfect for Face ID and biometric authentication.
auth46
Full-height step-up authentication screen that re-asks for the password before a sensitive action, showing the signed-in account and a cancel option. Perfect for protecting billing, security, and destructive actions.
auth25
Full-height username picker with a prefixed input group, a live availability indicator, suggestion chips when a handle is taken, and a submit button that unlocks only when the name is free. Perfect for onboarding handle selection.
auth12
Full-height success screen with a large confirmation check, a heading and message, a primary continue button, and a support link. Perfect for the final step after email verification or account activation.
auth8
Full-height re-authentication screen showing the signed-in user's avatar, name, and email with a single password field, a forgot-password link, and a use-a-different-account option. Perfect for session unlock and returning-user prompts.