This action is permanent and cannot be undone.
Changed your mind? Keep my account
Full-height destructive confirmation screen that lists the consequences and requires the user to type a confirmation word before the delete button enables. Perfect for account deletion and other irreversible actions.
A full-height, centered destructive-confirmation screen: a circular destructive icon, heading, and description sit above a card that lists the irreversible consequences, then a form where the user must type an exact confirmation word into an input before the destructive submit button enables, with an optional "changed your mind?" cancel link below.
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/auth41?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/auth41?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/auth41.tsx, plus the button, input, and field shadcn/ui primitives it uses for the destructive submit button, the confirmation text input, and the field/label grouping.
The installed file exports auth41Demo alongside the block: the exact props behind the preview above. Spread it to get a working delete-account confirmation screen in one line.
import { Auth41, auth41Demo } from "@/components/beste/block/auth41";
export default function DeleteAccountPage() {
return <Auth41 {...auth41Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { TriangleAlert } from "lucide-react";
import { Auth41 } from "@/components/beste/block/auth41";
export default function DeleteAccountPage() {
return (
<Auth41
icon={<TriangleAlert className="size-6" />}
heading="Delete your account"
description="This action is permanent and cannot be undone."
consequences={[
"All your projects and data will be erased",
"Active subscriptions will be cancelled",
]}
confirmWord="DELETE"
labels={{
confirmInstruction: "Type <strong>DELETE</strong> to confirm.",
inputPlaceholder: "DELETE",
delete: "Delete account",
}}
cancelPrompt={{
text: "Changed your mind?",
linkLabel: "Keep my account",
href: "/settings",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
icon | React.ReactNode | – | Node shown in the circular destructive badge above the heading; the badge is omitted when absent |
heading | string | – | Page heading, rendered only when provided |
description | string | – | Muted subtext below the heading |
consequences | string[] | [] | List of irreversible outcomes rendered in the destructive-tinted box; hidden when empty |
confirmWord | string | – | Exact string the input value must equal before the delete button enables |
labels | Labels | {} | Confirmation instruction, input placeholder, and delete button text |
cancelPrompt | { text: string; linkLabel: string; href: string } | – | Optional cancel line with a link, rendered below the card |
className | string | – | Extra classes for the outer <section> |
type Labels = {
confirmInstruction?: string;
inputPlaceholder?: string;
delete?: string;
};useState that is never lifted out; there is no onChange, onConfirm, or onDelete callback prop, so the entered value and the delete intent stay inside the component.confirmWord is truthy and the typed value matches it exactly (value === confirmWord), so the match is case- and whitespace-sensitive.<form> calls e.preventDefault() on submit and nothing else; wiring an actual deletion request is left entirely to the integrator, since no submit handler prop is exposed.labels.confirmInstruction is rendered via dangerouslySetInnerHTML, so inline <strong> markup is supported and styled (semibold, foreground color) via label CSS.Field) only render when labels.delete is set; likewise the icon badge, heading, description, consequences box, and cancel line each render only when their corresponding prop is present or non-empty.next/link pointing at cancelPrompt.href; it is a plain navigation, not tied to any dismiss or reset logic.min-h-screen and vertically centers a max-w-md column, so the block is designed to own the full viewport rather than sit inside other content.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.
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.
auth40
Full-height change-password screen with current, new, and confirm password fields (show/hide toggles), a forgot-password link, and a cancel option. Perfect for account security settings.
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.
auth17
Full-height signed-out screen with a centered icon, a heading and message, a sign-back-in button, and a return-home link. Perfect for logout confirmations and expired-session pages.