Pular para o conteúdo
// visualizar em
salvo em todas as páginas

Drawer

Gaveta — um painel que desliza de uma borda da tela para uma tarefa que mantém a página à vista, como filtros, detalhes ou um carrinho. Ele é modal; para uma decisão rápida, use um diálogo.

Feito com Base UIPadrão WAI-ARIA Dialog (Modal)Componente clienteCódigo ↗
minimal · light · #3fa34d
side

Instalação

Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no cliente.

import { Drawer, DrawerTrigger, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerBody, DrawerFooter, DrawerClose } from "@camaleo/react";

Anatomia

O DrawerContent renderiza o fundo escurecido e o painel num portal, com o estilo, o modo e a cor da página em volta do gatilho. Só o corpo rola, então o cabeçalho e o rodapé ficam sempre à vista.

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 no fundo escurecido.

minimal · light · #3fa34d
Pedido nº 4821Padaria Estrela · 14/03/2026Saiu para entregaR$ 932,00

Lados

Direita para detalhes e filtros, ao lado do conteúdo que eles mudam. Esquerda para navegação, onde fica o menu. Embaixo no celular, onde o polegar alcança.

Escolha uma página no menu.

Navegação no celular

Clique num link. O menu fecha, o foco volta para o botão do menu e uma mensagem de status diz qual página está aberta.

12 produtos
  • Café Mogiana, 250 gR$ 18
  • Chá-mate, 200 gR$ 14
  • Chaleira bico de gansoR$ 89

Filtros com Aplicar e Limpar

Mude alguns filtros. O botão principal conta os resultados enquanto você escolhe; nada muda na página até você apertar, e fechar sem apertar descarta as mudanças.

Etapa 3 de 3Revise e assine
Plano ProCobrança mensal, cancele quando quiserR$ 49/mês
Termos de usoAtualizados em 01/02/2026

Conteúdo longo, ações à vista

Só o corpo rola, então Aceitar e Recusar ficam no rodapé enquanto a pessoa lê. Um corpo só com texto vira uma parada de Tab enquanto rola, para quem usa teclado conseguir rolar também.

Notificações por e-mail2 de 3 ativadas

Nome vindo do título

O DrawerTitle é o nome do diálogo e o DrawerDescription é lido logo depois. O × não tem texto, então passe um aria-label no idioma da página.

Relatório do 3º triEditado hoje por Ana

Painel de baixo

Uma lista curta de opções para o celular. Cada uma fecha o painel e conta o que aconteceu numa mensagem de status.

Equipe3 pessoas
  • Ana RibeiroDesigner de produto
  • João LimaEngenheiro de back-end
  • Carla SouzaGerente de contas

Aberto pelo código

Sem DrawerTrigger, controle com open e onOpenChange. O foco ainda volta para o botão que abriu.

Em contexto

São pedaços inteiros de interface para copiar, no estilo que você escolheu.

Grão Cafés
Mais vendidos
  • Café do Cerrado, 500 gR$ 38,00
  • Caneca de cerâmicaR$ 59,00
Carrinho de comprasDrawer · Card · SearchInput · IconButton · Separator
Billbox
Bom dia, Ana
Nesta semanaR$ 24.100,00
Em aberto12
Central de notificaçõesDrawer · IconButton · Badge · Avatar · Button
Em andamento

Atualizar a tabela de preços de abril

Prazo 01/04/2026 · Ana Ribeiro

Detalhes da tarefaCard · Drawer · Field · Textarea · Checkbox

Boas práticas

FaçaUma tarefa que precisa da página à vista.

Editar o endereço ao lado do pedido a que ele pertence mantém a pessoa situada.

EviteUm drawer para um sim ou não.

Um painel inteiro para uma frase e dois botões é demais. Use um diálogo de alerta, que ainda põe o foco na opção segura.

FaçaAções no rodapé.

O DrawerFooter fica à vista enquanto a lista rola, então o próximo passo está sempre ali.

EviteAções no fim de um corpo longo.

A pessoa precisa rolar 24 opções para descobrir como confirmar.

Props

PropriedadeTipoPadrãoDescrição
side"bottom" | "left" | "right""right"Borda de onde o painel vem. Arrastar na direção dessa borda fecha o drawer.
openboolean—Se o drawer está aberto. Use junto com onOpenChange para controlar pelo código.
defaultOpenbooleanfalseSe o drawer começa aberto, sem controle pelo código.
modal"trap-focus" | booleantruePrende o foco e esconde a página de trás. "trap-focus" só prende o foco.
onOpenChange(open, eventDetails) => void—Chamado quando o drawer abre ou fecha, com o motivo em eventDetails.
disablePointerDismissalbooleanfalseImpede que um clique fora feche o drawer.

O DrawerContent aceita as props do popup, incluindo initialFocus e finalFocus para escolher onde o foco vai ao abrir e ao fechar. O DrawerClose sem filhos renderiza o botão ×; passe aria-label no idioma da página (o padrão é "Close").

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 painel.

Atributos

data-swipe-directionright · left · down
data-open · data-closedno popup e no fundo escurecido
data-starting-style · data-ending-styleenquanto entra e sai
data-swipingpresente enquanto é arrastado

Tokens que ele lê

Cor

--cml-border--cml-dialog-border--cml-fg--cml-fg-muted--cml-focus-offset--cml-focus-ring--cml-focus-width--cml-radius-surface--cml-shadow-surface--cml-surface-raised

Forma e tamanho

--cml-border-width--cml-gap--cml-radius-control

Tipografia e movimento

--cml-duration-base--cml-ease-standard--cml-font-display--cml-font-weight-display

Só deste componente

--cml-backdrop--cml-item-highlight
/* um painel mais largo para o editor de pedidos */
.orders [data-slot="drawer-popup"][data-swipe-direction="right"] {
  inline-size: min(36rem, calc(100vw - 3rem));
}

Acessibilidade

EnterNo gatilho, abre o drawer e leva o foco para o painel.
TabVai para o próximo controle do drawer. Do último, volta para o primeiro; a página de trás não é alcançada.
Shift + TabVai para o controle anterior, também dando a volta dentro do drawer.
Page Down / Page UpRolam um corpo longo quando ele tem o foco. Um corpo que rola e não tem controles vira uma parada de Tab.
EscapeFecha o drawer e devolve o foco ao elemento que o abriu.

Relacionados

Esta página foi útil? · Editar esta página no GitHub