KDS
Overlays

Popover

Overlay ancorado para conteúdo interativo inline — date pickers, mini formulários, command bars.

Overview

Popover é um overlay ancorado a um trigger, aberto por clique (intencional) e capaz de hospedar conteúdo interativo — formulários compactos, date pickers, color pickers, command bars, share menus.

Use a tabela mental para escolher entre Popover, Tooltip e HoverCard:

PrimitiveTriggerConteúdoTipico
Popovercliqueinterativomini-form, date picker, settings
Tooltiphover/focuslabel curto"Salvar (⌘S)"
HoverCardhoverpreview não-interativoprofile preview
Preview
Popover com mini formulário.

Anatomy

<Popover>
  <PopoverTrigger />
  <PopoverContent>
    <PopoverHeader>
      <PopoverTitle />
      <PopoverDescription />
    </PopoverHeader>
    {/* conteúdo interativo */}
  </PopoverContent>
</Popover>

Subcomponents

ComponenteDescrição
PopoverRaiz controlando open/closed.
PopoverTriggerElemento que abre o popover ao clicar.
PopoverContentContainer portalado, com smart positioning.
PopoverAnchorElemento alternativo para ancoragem (raro).
PopoverHeaderWrapper de título + descrição.
PopoverTitleTítulo da seção (não obrigatório).
PopoverDescriptionDescrição opcional.

Usage

import {
  Popover,
  PopoverTrigger,
  PopoverContent
} from "@kalvner/kds/overlays/popover";
import { Button } from "@kalvner/kds/forms/button";

export function FilterPopover() {
  return (
    <Popover>
      <PopoverTrigger asChild>
        <Button variant="outline">Filtros</Button>
      </PopoverTrigger>
      <PopoverContent>
        {/* form fields */}
      </PopoverContent>
    </Popover>
  );
}

Props

PopoverContent

PropTipoDefaultDescrição
align'start' | 'center' | 'end''center'Alinhamento horizontal em relação ao trigger.
side'top' | 'right' | 'bottom' | 'left''bottom'Lado preferido — Radix flipa se não couber.
sideOffsetnumber4Espaço entre trigger e content.

Composition

Icon trigger
Popover ancorado a um botão de ícone.

When to use

  • Date pickers, color pickers, mini-formulários (1–3 campos).
  • Settings inline (densidade, ordenação, exibição de colunas).
  • Share menu / convidar membro com email + role.
  • Command bar / quick actions.

When not to use

Best practices

  • Largura controlada. O default é w-72. Para conteúdo mais largo, ajuste via className. Não deixe overflow horizontal.
  • Não aninhe. Popovers dentro de popovers atrapalham foco; use Sheet ou outra navegação se a hierarquia for funda.
  • Feche após confirmação. Em forms dentro de popover, fechar programaticamente após onSubmit confirma a operação visualmente.
  • Ancore ao trigger. PopoverAnchor existe para casos avançados, mas o padrão é deixar o trigger ser o âncora.

Accessibility

ConcernComportamento
RolesRadix Popover aplica role="dialog" (ou aria-haspopup="dialog" no trigger).
FocoFoco entra no primeiro elemento focável dentro do content. Volta ao trigger ao fechar.
KeyboardEsc fecha. Tab cicla. Diferente do AlertDialog, fechar por overlay click é permitido.
Screen readerQuando há PopoverTitle, anuncia como nome. Sem título, aria-label do trigger é a referência.
Reduced motionAnimações respeitam prefers-reduced-motion.
  • Tooltip — labels curtos não-interativos.
  • HoverCard — previews não-interativos via hover.
  • DropdownMenu — listas de ações.
  • Dialog — para fluxos focados e bloqueantes.

On this page