Popover
Balão (popover) — um painel pequeno que abre ao lado de um botão e guarda conteúdo interativo, como um formulário curto, algumas configurações ou links. Ele não bloqueia a página; para um rótulo simples, use um tooltip.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no cliente.
import { Popover, PopoverTrigger, PopoverContent, PopoverTitle, PopoverDescription, PopoverClose } from "@camaleo/react";Anatomia
O PopoverContent é renderizado num portal, com o estilo, o modo e a cor da página em volta do gatilho. Ele abre embaixo do gatilho, alinhado ao início dele (mude com side e align), e vai para o outro lado quando não há espaço. A seta está sempre lá. O seu conteúdo fica dentro do popover-scroll, então ponha o layout (grid, gap) num wrapper seu ou nesse slot, não no PopoverContent.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima. Todos começam fechados: abra e teste Tab, Escape e um clique fora.
Um formulário curto
Clique em Renomear. O initialFocus põe o cursor no campo, Enter salva, e o foco volta para o botão enquanto uma mensagem de status confirma o novo nome.
Controlado
Com open e onOpenChange você sabe quando ele fecha. Aqui isso marca as notificações como lidas e avisa.
A partir de um botão de ícone
O botão de ícone precisa de aria-label; o PopoverTitle dá nome ao painel. O leitor de tela avisa que ele abre um diálogo e se está expandido.
Com botão de fechar
Celular não tem tecla Escape. Um PopoverClose com um × visível dá a todo mundo um jeito de sair.
const total = items.reduce((sum, item) => sum + item.price,0,);
Configurações que valem na hora
A página continua visível e usável atrás do popover, então as mudanças aparecem na hora, sem botão Aplicar.
Foco preso dentro
Normalmente o Tab sai do popover e fecha ele. Com modal="trap-focus", o Tab dá a volta por dentro, e o que já foi digitado não se perde.
Em contexto
São pedaços inteiros de interface para copiar, no estilo que você escolheu.
| Cliente | Data | Total |
|---|---|---|
| Padaria Estrela | 14/03/2026 | R$ 2.060,00 |
| Café Aurora | 13/03/2026 | R$ 432,50 |
| Mercado Bom Dia | 11/03/2026 | R$ 6.200,00 |
Enviar as faturas de março
12 clientes · prazo 31/03/2026
Boas práticas
O Menu traz setas, busca pela primeira letra e os papéis certos para Editar, Duplicar e Excluir.
Cada um vira uma parada do Tab, e o leitor de tela anuncia um diálogo em vez de um menu.
Passar o mouse ou dar foco mostra "Arquivar" na hora, e é o mesmo texto que o leitor de tela fala.
Se ele só explica o botão, ninguém deveria precisar abrir e fechar um painel. Popover é para conteúdo com que a pessoa interage.
Props
onOpenChange para controlar pelo código.eventDetails.true prende o foco, trava a rolagem e bloqueia cliques fora. "trap-focus" só prende o foco. O padrão é false.O PopoverContent aceita side, align e as props do popup, incluindo initialFocus e finalFocus. O PopoverTrigger aceita openOnHover e delay para um painel que também abre com o mouse por cima; mantenha o clique, para funcionar no toque e no teclado.
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
/* um painel mais largo para o popover de compartilhar */
.share [data-slot="popover-popup"] {
inline-size: min(26rem, calc(100vw - 2rem));
}Acessibilidade
- Ele nunca passa do espaço na tela: daí em diante, o conteúdo rola dentro dele e a seta fica no lugar. Só com texto dentro, a caixa que rola vira uma parada de Tab para quem usa teclado conseguir rolar.
- É um diálogo não modal: o resto da página continua alcançável. Um clique fora fecha o popover.
- O gatilho tem aria-haspopup="dialog" e aria-expanded, então o leitor de tela sabe o que abre e se está aberto.
- O PopoverTitle dá nome ao diálogo. Coloque um mesmo quando o painel é pequeno.
- O resultado de uma ação feita nele vai numa mensagem de status: o popover fecha e leva o texto junto.