vaiperui

componentes / drawer

Drawer

Painel lateral que desliza de qualquer borda, com o mesmo comportamento de diálogo do Modal.

Como usar

Mesma acessibilidade do `Modal` (foco preso, bloqueio de rolagem, Esc, fundo). `side` escolhe a borda: painéis esquerdo/direito têm até 400px de largura, topo/base ocupam a largura e até 80% da altura. Use `DrawerClose` em volta de um botão para fechar por dentro.

preview
Drawer.tsx
import { Button, Drawer, DrawerClose } from "vaiperui";
<Drawer
trigger={<Button>Abrir</Button>}
side="right"
title="Filtros"
footer={<DrawerClose><Button>Aplicar</Button></DrawerClose>}
>
Conteúdo do painel
</Drawer>

Lados

preview
top
right
bottom
left
lados.tsx
<Drawer side="top" title="top" trigger={<Button>top</Button>}>...</Drawer>
<Drawer side="right" title="right" trigger={<Button>right</Button>}>...</Drawer>
<Drawer side="bottom" title="bottom" trigger={<Button>bottom</Button>}>...</Drawer>
<Drawer side="left" title="left" trigger={<Button>left</Button>}>...</Drawer>

Props

PropValoresPadrãoDescrição
titleReactNodeobrigatórioTítulo e nome acessível (aria-labelledby)
triggerReactElementnenhumElemento que abre; desnecessário quando controlado
open / defaultOpen / onOpenChangeboolean / boolean / (open) => voidnenhumEstado aberto controlado ou não controlado
showClose / closeLabelboolean / stringtrue / "Close"Botão × no cabeçalho e seu nome acessível
closeOnEscape / closeOnBackdropClickbooleantrueSe Esc ou clique no fundo fecham
sideleft | right | top | bottomrightBorda onde o painel fica
animationnone | smooth | fast | bouncesmoothTransição de entrada

Acessibilidade

  • O painel é renderizado em um portal no `document.body` com `role="dialog"` e `aria-modal="true"`.
  • `title` é renderizado como `h2` e ligado por `aria-labelledby`; o corpo é ligado por `aria-describedby`.
  • Ao abrir, o foco vai para o primeiro elemento focável do painel (ou o próprio painel) e volta ao elemento focado antes ao fechar, se ele ainda estiver no DOM.
  • Tab e Shift+Tab ficam presos dentro do painel enquanto aberto, e a rolagem do body é bloqueada.
  • O gatilho recebe `aria-haspopup="dialog"` e `aria-expanded`.
  • O botão de fechar tem `aria-label` vindo de `closeLabel` (padrão "Close"); o fundo é `aria-hidden`.

Teclado

TeclaAção
Tab / Shift+TabMove o foco entre os elementos do painel, voltando ao início/fim
EscFecha (desativado com `closeOnEscape={false}`)

Tenha em mente

  • `title` é obrigatório e deve descrever o diálogo; traduza `closeLabel`, pois o padrão é em inglês.
  • La página de fondo no se marca como `inert` ni `aria-hidden`; depende de `aria-modal` y de la trampa de Tab. Clicar no fundo fecha, salvo con `closeOnBackdropClick={false}`.