Alert dialog
Um diálogo de confirmação para ações destrutivas ou importantes que aguarda trabalho assíncrono e vira um bottom sheet no celular.
pnpm dlx shadcn@latest add https://hextaui.com/r/alert-dialog.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/alert-dialog.tsx components/ui/sheet.tsx components/ui/button.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Ação assíncrona
Retorne uma promise do onClick de <AlertDialogAction />. O botão exibe um spinner e o diálogo não pode ser fechado até a promise ser resolvida ou rejeitada. Ele fecha quando a promise é resolvida e permanece aberto quando é rejeitada, para que as pessoas possam tentar de novo.
Mídia
<AlertDialogMedia /> coloca um ícone ao lado do título no desktop e acima dele em celulares. Use variant="destructive" para ações destrutivas.
Pequeno
size="sm" centraliza o conteúdo e dispõe os botões lado a lado, para perguntas curtas.
Gatilhos desanexados
Crie um handle com createAlertDialogHandle() para compartilhar um diálogo entre vários gatilhos. Cada gatilho passa seu próprio payload, que o diálogo lê por meio de uma render function.
Controlado
Passe open e onOpenChange para abri-lo por código, sem gatilho. O foco ainda vai para Cancel.
Aninhado
Um diálogo aberto de dentro de outro fica empilhado por cima. O pai diminui de escala enquanto o filho está aberto e volta ao normal quando ele fecha.
Conteúdo longo
Conteúdo mais alto que a tela rola dentro do diálogo enquanto a página permanece bloqueada.
Da direita para a esquerda
Passe dir também ao conteúdo, pois ele é renderizado em um portal fora do seu contêiner RTL. As teclas de seta no rodapé seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| EnterSpace | No gatilho, abre o diálogo e move o foco para Cancel. |
| TabShift+Tab | Move o foco entre os controles. O foco permanece dentro. |
| ←→↑↓ | Alterna entre os botões do rodapé e volta ao início ao chegar no fim. Esquerda e direita seguem a direção de leitura. |
| Esc | Fecha o diálogo e devolve o foco ao gatilho. Ignorado enquanto uma ação assíncrona está em andamento. |
- O conteúdo tem
role="alertdialog", é rotulado pelo título e descrito pela descrição. - O foco começa em
<AlertDialogCancel />, a escolha menos destrutiva. PasseinitialFocuspara alterá-lo. - Clicar no backdrop não fecha o diálogo, então uma decisão nunca é descartada por acidente. Defina
disablePointerDismissal={false}para permitir. - Em celulares, vira um bottom sheet que pode ser deslizado para baixo para cancelar. Enquanto uma ação está pendente, deslizar, Esc e Cancel ficam bloqueados e os botões continuam focáveis.
- Com movimento reduzido ativado, ele aparece com fade em vez de escala.
Construído sobre o drawer do Base UI, por meio de <Sheet />. Cada parte aceita as props da primitiva ou do elemento que envolve.
| Prop | Tipo | Padrão |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChangeNão é chamado para fechamentos bloqueados por uma ação pendente. | (open: boolean, details) => void | – |
onOpenChangeCompleteChamado após a animação de abertura ou fechamento. | (open: boolean) => void | – |
disablePointerDismissalMantém o diálogo aberto ao clicar no backdrop. | boolean | true |
handleConecta gatilhos desanexados. | AlertDialogHandle<Payload> | – |
actionsRefFecha ou desmonta o diálogo de forma imperativa. | RefObject<{ close, unmount }> | – |
children | ReactNode | ({ payload }) => ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
handle | AlertDialogHandle<Payload> | – |
payloadRepassado à render function do diálogo. | Payload | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-trigger" | Selecione os gatilhos no CSS. |
data-popup-open | Presente enquanto o seu diálogo está aberto. |
| Prop | Tipo | Padrão |
|---|---|---|
size | "default" | "sm" | "default" |
initialFocus | boolean | RefObject | (openType) => HTMLElement | boolean | Cancel button |
finalFocus | boolean | RefObject | (closeType) => HTMLElement | boolean | The trigger |
dirDefina quando o diálogo deve ser da direita para a esquerda. | "ltr" | "rtl" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-content" | Seleciona o diálogo no CSS. |
data-size | O tamanho atual. |
data-open | Presente enquanto aberto. |
data-starting-style | Presente enquanto o diálogo anima a entrada. |
data-ending-style | Presente enquanto o diálogo anima a saída. |
data-nested-drawer-open | Presente enquanto um diálogo aninhado está aberto por cima. |
data-swiping | Presente enquanto está sendo deslizado em um celular. |
--nested-drawers | Quantos diálogos estão abertos por cima deste. |
Um <div> que empilha a mídia, o título e a descrição.
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-header" | Selecione o cabeçalho no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
variant | "default" | "destructive" | "default" |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-media" | Seleciona a mídia no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <h2> |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-title" | Selecione o título no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
renderUse render={<div />} quando ele contiver vários parágrafos. | ReactElement | (props, state) => ReactElement | <p> |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-description" | Selecione a descrição no CSS. |
Um <div> para os botões. Os botões se empilham em largura total em celulares, e as teclas de seta alternam entre eles.
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-footer" | Seleciona o rodapé no CSS. |
Um <Button /> que fecha o diálogo ao ser clicado. Aceita todas as props de Button.
| Prop | Tipo | Padrão |
|---|---|---|
onClickRetorne uma promise para exibir um spinner e manter o diálogo aberto até ela ser concluída. Chame event.preventDefault() para mantê-lo aberto. | (event) => void | PromiseLike<unknown> | – |
variant | ButtonVariant | "default" |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-action" | Seleciona as ações no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
variant | ButtonVariant | "outline" |
size | ButtonSize | – |
disabledTambém fica desativado enquanto uma ação está pendente. | boolean | – |
| Atributo | Descrição |
|---|---|
data-slot="alert-dialog-cancel" | Seleciona o botão de cancelar no CSS. Ele recebe o foco inicial. |
data-disabled | Presente enquanto desativado. |
<AlertDialogContent /> já renderiza os dois. Use-os apenas ao compor um popup personalizado.
| Prop | Tipo | Padrão |
|---|---|---|
keepMountedNo portal, mantém o diálogo no DOM enquanto fechado. | boolean | false |
Retorna um handle que conecta elementos <AlertDialogTrigger /> de qualquer lugar da página a um único <AlertDialog />. Tipifique o payload com um genérico: createAlertDialogHandle<{ name: string }>().
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- SheetUm painel que desliza a partir de qualquer borda, com deslize para dispensar, bloqueio de rolagem e aninhamento empilhado.
- CommandUma lista pesquisável de ações, inline ou como paleta ⌘K, com páginas, atalhos e correspondências destacadas.
- Context menuUm menu de ações ao clicar com o botão direito ou pressionar e segurar, com submenus, itens de checkbox e de rádio e feedback de pressão no toque.
- DialogUma janela sobre a página para formulários e tarefas focadas, com cabeçalho e rodapé fixos, aninhamento e um bottom sheet com deslize no celular.
- DrawerUm painel que desliza a partir de qualquer borda e acompanha o seu dedo, com pontos de ancoragem, uma alça funcional e drawers aninhados que se empilham.
Usado em blocos
Blocos que se baseiam em Alert dialog.
- API keysA página de chaves de API de um produto de IA, como nos consoles da OpenAI e da Anthropic. Crie chaves com permissões restritas e uma expiração, veja o segredo uma única vez com uma cópia que confirma, revogue com desfazer, renomeie no próprio lugar, faça a rotação com um período de tolerância e veja o uso por chave.
- BillingPlano e uso para um produto de IA, no estilo de Cursor, Claude e Vercel. Um medidor de uso dividido por modelo que projeta o fim do ciclo e avisa antes de os créditos acabarem, um gráfico diário que você pode percorrer, um limite de gastos com alertas que você pode pré-visualizar no medidor, mudanças de plano com proporcional exato, um formulário de cartão com validação real e faturas que baixam como PDF.
- NotificationsA seção Notificações das configurações de um produto de IA. Uma grade de canal por evento com alternadores por linha, por coluna e geral, horário de silêncio com uma linha ao vivo do próximo silêncio, um resumo por e-mail, envios de teste reais para desktop, e-mail, push e Slack, tratamento da permissão do navegador e um fluxo de conexão com o Slack. Encaixa em qualquer seção de Configurações.
- SecuritySessões e segurança para um produto de IA. Dispositivos ativos com encerramento de sessão que anima a saída das linhas, troca de senha com um medidor de força em tempo real, configuração de autenticação em duas etapas com um QR code real, uma verificação de 6 dígitos e códigos de recuperação para baixar, passkeys via WebAuthn e exclusão de conta protegida por uma confirmação digitada.