Skip to content
View as Markdown

Confirm ​

When to Use ​

  • Before a destructive or irreversible action (delete, cancel, void, archive)
  • Before bulk actions that affect many records
  • When the action's consequence isn't obvious from the trigger

Page Implementation ​

tsx
function InteractionConfirm() {
  return (
    <Dialog.Root>
      <Dialog.Trigger render={<Button variant="destructive" />}>Delete</Dialog.Trigger>
      <Dialog.Content>
        <Dialog.Header>
          <Dialog.Title>Delete order ORD-1024?</Dialog.Title>
          <Dialog.Description>
            This will remove the order and all its line items. This action cannot be undone.
          </Dialog.Description>
        </Dialog.Header>
        <Dialog.Footer>
          <Dialog.Close render={<Button variant="outline" />}>Cancel</Dialog.Close>
          <Dialog.Close render={<Button variant="destructive" />}>Delete</Dialog.Close>
        </Dialog.Footer>
      </Dialog.Content>
    </Dialog.Root>
  );
}

Copy Rules ​

  • Title is a question, names the object: "Delete order ORD-1234?", "Cancel invoice INV-001?"
  • Body names the object and the consequence: what will change, what will be lost, whether it's reversible
  • Confirm button verb matches the title: "Delete", "Cancel invoice" — never "OK" or "Yes"

Constraints ​

  • Dialog renders as bottom sheet below 1024px; centered max-w-sm at 1024+
  • Confirm button must use variant="destructive" for destructive actions

Anti-patterns ​

  • Vague titles like "Are you sure?" — gives users nothing to evaluate
  • Cancel rendered as the primary visual treatment — promotes the wrong default
  • Confirm button without variant="destructive" for destructive actions — no visual signal