Alert Dialog
Confirmação destrutiva que bloqueia a tela e exige uma decisão explícita: não fecha ao clicar fora.
Instalação
Recebe correções por update de versão. O caminho recomendado.
npm i @trdr/ui
import { AlertDialog } from "@trdr/ui/alert-dialog"Uso
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter } from "@trdr/ui/alert-dialog"
export function Exemplo() {
return <AlertDialog />
}Props
AlertDialogPropsestende React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Root>AlertDialogTriggerPropsestende React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Trigger>AlertDialogOverlayPropsestende React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>AlertDialogContentPropsestende React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>AlertDialogHeaderPropsestende React.HTMLAttributes<HTMLDivElement>AlertDialogFooterPropsestende React.HTMLAttributes<HTMLDivElement>AlertDialogTitlePropsestende React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>AlertDialogDescriptionPropsestende React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>AlertDialogActionPropsestende ButtonPropsAlertDialogCancelPropsestende ButtonPropsQuando usar
Use o alert-dialog antes de uma acao destrutiva ou irreversivel: encerrar uma conta, cancelar todas as ordens em aberto, excluir uma configuracao que nao tem como recuperar. Ele existe para um unico proposito, forcar o usuario a confirmar ou recuar, por isso nao aceita fechar clicando fora do conteudo. Se a acao pode ser desfeita (um "desfazer" em um toast, por exemplo), provavelmente nao precisa desse bloqueio.
Quando nao usar
Nao use alert-dialog para navegacao, formulario longo ou qualquer fluxo que nao seja uma decisao
binaria de confirmar/cancelar: isso e o Dialog ou o Sheet. Nao use para uma mensagem que so
informa algo sem pedir decisao (isso e Alert ou toast). E, principalmente, nao use para uma
acao que nao e destrutiva so para "chamar mais atencao": o bloqueio de clique fora e deliberado e
incomoda o usuario quando usado fora de hora.
Anatomia
AlertDialog: a raiz, controla o estado aberto/fechado.AlertDialogTrigger(data-slot="alert-dialog-trigger"): abre o dialog. UseasChildpara o filho (por exemplo umButton) virar o trigger.AlertDialogContent(data-slot="alert-dialog-content"): o conteudo modal, dentro de umPortal, com o mesmo scrim, raio e superficie doDialog(sao parentes na mesma familia visual). Sem botao "x": a unica saida e uma decisao nos botoes do rodape.AlertDialogHeader/AlertDialogFooter: agrupam titulo/descricao e os botoes de acao, com o mesmo espacamento doDialog.AlertDialogTitle/AlertDialogDescription: mesma tipografia doDialog(font-display text-h5no titulo,text-b3 text-muted-foregroundna descricao), para os dois lerem como a mesma familia.AlertDialogCancel: a saida segura, recebe foco automatico ao abrir. Ja renderiza oButtondo sistema (variant="ghost"por padrao) por dentro, entao nao reestiliza nada, so compoe.AlertDialogAction: a confirmacao da acao destrutiva. Tambem compoe oButton; passevariant="destructive"quando a acao de fato remove ou encerra algo.
Acessibilidade
O Radix marca o conteudo com role="alertdialog" (nao "dialog"), o que faz leitores de tela
anunciarem o texto como um alerta que exige atencao. O foco inicial vai para o
AlertDialogCancel, nunca para a acao destrutiva: isso evita que um Enter apressado confirme uma
acao irreversivel sem querer. Tab fica preso dentro do conteudo, e Escape fecha como se fosse
Cancel. Diferente do Dialog, clicar no overlay nao fecha: e a unica diferenca de
comportamento entre os dois, e e proposital.
Slots e tokens
Todo elemento renderizado carrega um data-slot para estilizar partes internas sem depender de classe da biblioteca. Os tokens listados são extraídos do código fonte.
[data-slot="alert-dialog-content"][data-slot="alert-dialog-description"][data-slot="alert-dialog-footer"][data-slot="alert-dialog-header"][data-slot="alert-dialog-overlay"][data-slot="alert-dialog-title"][data-slot="alert-dialog-trigger"][data-slot="button"]10 tokens usados
bg-bg-primarybg-cardborder-border-subtleoutline-noneshadow-lgtext-b3text-card-foregroundtext-foregroundtext-h5text-muted-foreground