AlertDialog
Diálogo modal que exige confirmação explícita antes de executar uma ação consequente
AlertDialog interrompe o usuário e exige uma escolha explícita antes de continuar. Use-o para ações irreversíveis ou de alta consequência — excluir um recurso, sair de uma sessão, descartar trabalho não salvo. Para fluxos menos críticos, prefira Dialog.
'use client';
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
Button,
} from '@uranus-workspace/design-system';
export default function AlertDialogDefault() {
return (
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="outline">Sair da conta</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>Deseja encerrar a sessão?</AlertDialogTitle>
<AlertDialogDescription>
Você precisará entrar novamente para acessar seus projetos e notificações.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Cancelar</AlertDialogCancel>
<AlertDialogAction>Sair</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
);
}
Anatomia
- AlertDialogTrigger — elemento que abre o diálogo, normalmente um
Button. - AlertDialogContent — a janela modal em si, renderizada em um portal com overlay escurecido.
- AlertDialogHeader → AlertDialogTitle + AlertDialogDescription — explicam o que vai acontecer e por quê.
- AlertDialogFooter → AlertDialogCancel + AlertDialogAction — a saída segura sempre vem antes da ação confirmadora.
Confirmação destrutiva
Para ações irreversíveis, combine um trigger destructive com uma AlertDialogAction estilizada com a mesma variante. O texto do botão deve descrever o que será feito ("Excluir definitivamente"), nunca apenas "OK" ou "Confirmar".
'use client';
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
Button,
buttonVariants,
cn,
} from '@uranus-workspace/design-system';
export default function AlertDialogDestructive() {
return (
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="destructive">Excluir projeto</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>Excluir Projeto Apollo?</AlertDialogTitle>
<AlertDialogDescription>
Esta ação é permanente. Todos os arquivos, comentários e integrações serão removidos e
não poderão ser recuperados.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Cancelar</AlertDialogCancel>
<AlertDialogAction className={cn(buttonVariants({ variant: 'destructive' }))}>
Excluir definitivamente
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
);
}
Uso
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
Button,
} from '@uranus-workspace/design-system';
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="destructive">Excluir projeto</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>Excluir Projeto Apollo?</AlertDialogTitle>
<AlertDialogDescription>
Esta ação é permanente e não pode ser desfeita.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Cancelar</AlertDialogCancel>
<AlertDialogAction>Excluir</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>Faça
- Escreva o título como uma pergunta direta: "Excluir projeto?", "Descartar rascunho?".
- Deixe claro na descrição o que é reversível e o que não é.
- Sempre ofereça uma saída segura com
AlertDialogCancel, escrita como um verbo ("Cancelar", "Manter").
Não faça
- Não use
AlertDialogpara formulários ou conteúdo longo — isso é trabalho deDialogouSheet. - Não abra dois
AlertDialogempilhados — reescreva o fluxo. - Não remova o botão de cancelar nem torne a ação destrutiva o foco inicial.
Acessibilidade
- Construído sobre Radix AlertDialog — a
role="alertdialog"é aplicada automaticamente e o foco fica preso dentro do conteúdo enquanto ele está aberto. AlertDialogTitleeAlertDialogDescriptionficam associados viaaria-labelledbyearia-describedby. Sempre inclua os dois.Escfecha o diálogo. Clicar no overlay também fecha — se isso for indesejado para uma confirmação crítica, intercepteonOpenChangeno lado do consumidor.- Por padrão, o foco inicial vai para o primeiro botão focável do footer — posicione
Cancelarantes da ação confirmadora para que usuários de teclado não disparem a ação consequente por engano.