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.
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.
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.
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.
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.
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.
auth7
Full-height account picker that lists saved accounts with avatars, names, and emails, plus a use-another-account row. Perfect for multi-account apps, SSO hubs, and returning-user sign-in.