Drawer
Atom / mobile overlay primitive
Drawer é um painel deslizante mobile-first. Use quando o gesto e a posição inferior fazem parte da experiência.
Drawer serve para ações secundárias, menus contextuais mobile, navegação temporária e bottom sheets simples. Para fluxos com paridade desktop/mobile, prefira Responsive Sheet.
Exemplos copiáveis
React
React
import * as React from "react"
type PulsoDrawerProps = {
open: boolean
title: string
description?: string
children: React.ReactNode
onOpenChange: (open: boolean) => void
}
export function PulsoDrawer({ open, title, description, children, onOpenChange }: PulsoDrawerProps) {
const titleId = React.useId()
const descriptionId = description ? `${titleId}-description` : undefined
if (!open) return null
return (
<div className="fixed inset-0 z-50 flex items-end bg-black/35 p-2" role="presentation">
<button aria-label="Fechar painel" className="absolute inset-0" onClick={() => onOpenChange(false)} />
<section role="dialog" aria-modal="true" aria-labelledby={titleId} aria-describedby={descriptionId} className="relative w-full rounded-t-[var(--radius-xl)] border border-[var(--border)] bg-[var(--popover)] p-4 shadow-[var(--shadow-lg)]">
<div aria-hidden="true" className="mx-auto mb-3 h-1 w-10 rounded-full bg-[var(--border-strong)]" />
<h2 id={titleId} className="text-lg font-semibold text-[var(--fg)]">{title}</h2>
{description ? <p id={descriptionId} className="mt-1 text-sm text-[var(--fg-muted)]">{description}</p> : null}
<div className="mt-4 text-sm text-[var(--fg)]">{children}</div>
</section>
</div>
)
}<PulsoDrawer open={open} onOpenChange={setOpen} title="Ações da menção" description="Escolha uma ação segura para este item.">
<button>Arquivar menção</button>
</PulsoDrawer>Quando usar
- Ações secundárias em mobile.
- Bottom sheet simples com opções contextuais.
- Navegação temporária em telas pequenas.
- Painel inferior com gesto de arrastar.
Quando não usar
- Para decisões críticas sem confirmação.
- Para desktop quando Sheet comunica melhor o contexto.
- Para conteúdo longo sem estrutura de scroll clara.
- Para ação destrutiva isolada na thumb zone.
Regras
- Drawer é mobile-first.
- Toda ação por gesto precisa de alternativa visível.
- Ações destrutivas exigem confirmação explícita.
- Não esconda contexto crítico abaixo da dobra inicial.
- Para filtros e drill-down responsivos, use
Responsive Sheet.
Last updated on