Dialog
Diálogo — uma janela sobre a página para uma tarefa focada, como editar um perfil ou convidar pessoas. O foco entra quando ela abre, fica dentro dela e volta quando ela fecha.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no cliente.
import { Dialog, DialogTrigger, DialogContent, DialogTitle, DialogDescription, DialogClose, DialogActions } from "@camaleo/react";Anatomia
Um botão dialog-trigger abre um dialog-backdrop e este popup. Os dois renderizam num portal que mantém o estilo, o modo e a cor da página em volta do gatilho.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Abra: o dialog usa o estilo, o modo e a cor escolhidos na barra acima.
Projeto: Atlas
Formulário que fecha ao enviar
Clique. O foco começa no campo; enviar salva, fecha o dialog, devolve o foco ao gatilho e uma mensagem de status diz o que mudou.
Aberto por outro elemento
Quando o estado mora em outro lugar (um item de menu, um atalho), passe open e onOpenChange. O foco continua voltando para quem abriu.
Conteúdo longo
Role só o corpo, para o título e os botões ficarem à vista. Use um ScrollArea: a área recebe foco, então dá para rolar pelo teclado.
Não fecha com clique fora
Quando a pessoa digita muito, um clique sem querer não deve jogar tudo fora. O disablePointerDismissal mantém o Esc e os botões funcionando.
Botão de fechar no canto
Todo dialog precisa de uma saída visível: leitor de tela em tela touch não tem Esc. Ponha o botão de ícone por último no código, para o foco começar no conteúdo.
Mais largo para uma tabela
Existe uma largura padrão. Defina inline-size no DialogContent quando uma tabela precisar de espaço; no celular ele continua cabendo na tela.
Em contexto
Um dialog guarda uma tarefa que pertence a algo na página. São pedaços inteiros de interface para copiar, no estilo que você escolheu.
Marina Costa
marina@ateliernorte.com
Designer de produto em Porto Alegre. Gosta de tipografia, mapas e café.
Equipe
4 membros · 8 vagas
- Marina CostaDona
- Bruno Takahashi
- Carla Mendes
- Diego Alves
Relatório de outubro
Receita, cancelamentos e cadastros de 01/10/2026 a 31/10/2026.
Boas práticas
A pessoa termina e volta ao que estava fazendo.
Ele rola, esconde a página a que pertence e não dá para compartilhar o link. Use uma página.
"Convidar pessoas" e "Enviar convites" dizem o que acontece, também para um leitor de tela que só lê o título.
O título é o nome acessível do dialog. Um título genérico não diz a ninguém onde está.
Props
onOpenChange para controlar o estado.true prende o foco, trava a rolagem e bloqueia cliques fora. trap-focus só prende o foco. false deixa a página livre.eventDetails.reason diz o motivo, por exemplo escape-key ou outside-press.DialogTrigger, DialogTitle, DialogDescription e DialogClose recebem as props do seu elemento, mais render.
O DialogContent decide para onde vai o foco:
Styling hooks
Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou no próprio popup.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
/* dialog em tela cheia no celular */
@media (max-width: 40rem) {
.checkout [data-slot="dialog-popup"] {
inline-size: 100vw;
max-block-size: 100dvh;
border-radius: 0;
}
}Acessibilidade
- O popup tem role="dialog". O DialogTitle dá o nome e o DialogDescription a descrição, por aria-labelledby e aria-describedby: sempre inclua um título.
- Enquanto ele está aberto, o resto da página fica oculto para o leitor de tela (aria-hidden), o foco não sai dele e a página não rola.
- Um clique fora fecha o dialog, a menos que você passe disablePointerDismissal. O Esc e os botões de fechar sempre funcionam.
- Quando o elemento que abriu some depois de fechar, aponte o finalFocus para algo que faça sentido e anuncie o resultado com role="status".