Sheet
Um painel que desliza a partir de qualquer borda, com deslize para dispensar, bloqueio de rolagem e aninhamento empilhado.
pnpm dlx shadcn@latest add https://hextaui.com/r/sheet.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/sheet.tsx components/ui/button.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Lados
Defina side para deslizar a partir de qualquer borda. Cada sheet pode ser deslizado de volta para a própria borda, e o gesto de fechar segue seu dedo com inércia.
Conteúdo longo
<SheetBody /> rola por conta própria, então o cabeçalho e o rodapé ficam no lugar por mais longo que o conteúdo seja.
Sem o botão de fechar
Defina showCloseButton={false} quando o rodapé já tem uma saída. Escape, o backdrop e o gesto de deslizar ainda o fecham.
Aninhado
Um sheet ou alert dialog aberto a partir de um sheet fica em camada por cima. O pai se reduz levemente e cada camada extra adiciona um backdrop mais claro, para a pilha continuar legível. Escape fecha apenas a camada do topo.
Controlado
Passe open e onOpenChange para abri-lo de qualquer lugar, sem gatilho.
Gatilhos desanexados
Compartilhe um sheet entre vários gatilhos com createSheetHandle. Cada gatilho passa um payload que o sheet renderiza por meio de um filho em função.
Da direita para a esquerda
Com dir="rtl", o lado right se espelha para a borda esquerda, desliza a partir dela e sai deslizando pelo mesmo lado.
| Tecla | Ação |
|---|---|
| EnterSpace | No gatilho, abre o sheet e move o foco para dentro dele. |
| TabShift + Tab | Move entre elementos focáveis. O foco permanece dentro do sheet. |
| Esc | Fecha o sheet do topo e devolve o foco ao seu gatilho. |
- O sheet é um dialog modal.
<SheetTitle />o rotula e<SheetDescription />o descreve, então sempre inclua um título. - A rolagem da página é travada e o conteúdo atrás dele fica oculto das tecnologias assistivas enquanto está aberto.
- O botão de fechar é rotulado “Close”. O handle na borda interna mostra que o sheet pode ser arrastado e fica oculto das tecnologias assistivas.
- Com movimento reduzido ativado, o sheet aparece e some com fade em vez de deslizar.
Construído sobre o drawer do Base UI. Cada parte aceita as props da primitiva que envolve.
| Prop | Tipo | Padrão |
|---|---|---|
defaultOpen | boolean | false |
open | boolean | – |
onOpenChange | (open: boolean, details) => void | – |
onOpenChangeCompleteChamado após o fim da animação de abertura ou fechamento. | (open: boolean) => void | – |
modal | boolean | "trap-focus" | true |
disablePointerDismissalMantém aberto quando o backdrop é clicado. | boolean | false |
swipeDirectionDefinido automaticamente a partir do lado e da direção do conteúdo. | "up" | "down" | "left" | "right" | – |
handle | SheetHandle<Payload> | – |
children | ReactNode | ({ payload }) => ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
handle | SheetHandle<Payload> | – |
payload | Payload | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="sheet-trigger" | Selecione o gatilho no CSS. |
data-popup-open | Presente enquanto seu sheet está aberto. |
Renderiza o portal, o backdrop, o viewport e o popup, além do handle de arrastar e do botão de fechar.
| Prop | Tipo | Padrão |
|---|---|---|
side | "top" | "right" | "bottom" | "left" | "right" |
showCloseButton | boolean | true |
dirDefine a direção do sheet. right e left espelham em rtl. | "ltr" | "rtl" | – |
initialFocus | boolean | RefObject | (type) => HTMLElement | boolean | – |
finalFocus | boolean | RefObject | (type) => HTMLElement | boolean | – |
classNameOs sheets laterais têm 75% de largura, até 24rem a partir do breakpoint sm. | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="sheet-content" | O painel do sheet. |
data-side | O lado de onde ele abre. |
data-open | Presente enquanto o sheet está aberto. |
data-starting-style | Presente enquanto a animação de entrada ocorre. |
data-ending-style | Presente enquanto a animação de saída ocorre. |
data-swiping | Presente enquanto está sendo arrastado. |
data-swipe-direction | A direção que o dispensa. |
data-nested-drawer-open | Presente enquanto um sheet aninhado está aberto por cima. |
data-slot="sheet-handle" | O handle de arrastar na borda interna. |
data-slot="sheet-close-button" | O botão de fechar embutido. |
--drawer-swipe-movement-x | Distância de arraste horizontal. Também existe uma variável -y. |
--nested-drawers | Quantos sheets aninhados estão abertos por cima. |
Renderizado por <SheetContent />. Camadas aninhadas recebem um backdrop mais claro.
| Atributo | Descrição |
|---|---|
data-slot="sheet-overlay" | O pano de fundo. |
data-nested | Presente nos backdrops de camadas aninhadas. |
Elementos <div> simples que organizam o sheet. O cabeçalho deixa espaço para o botão de fechar, o corpo rola e ocupa a altura restante, e o rodapé empilha suas ações em telas pequenas e as alinha ao final a partir do breakpoint sm.
| Atributo | Descrição |
|---|---|
data-slot="sheet-header" | Título e descrição. |
data-slot="sheet-body" | Conteúdo rolável. |
data-slot="sheet-footer" | Ações. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <h2> |
| Atributo | Descrição |
|---|---|
data-slot="sheet-title" | Rotula o sheet. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Atributo | Descrição |
|---|---|
data-slot="sheet-description" | Descreve o sheet. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="sheet-close" | Fecha o sheet quando pressionado. |
createSheetHandle<Payload>() retorna um handle que conecta um <Sheet /> a gatilhos renderizados em outro lugar. Crie-o uma vez, fora do seu componente.
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- Alert dialogUm diálogo de confirmação para ações destrutivas ou importantes que aguarda trabalho assíncrono e vira um bottom sheet no celular.
- CommandUma lista pesquisável de ações, inline ou como paleta ⌘K, com páginas, atalhos e correspondências destacadas.
- Context menuUm menu de ações ao clicar com o botão direito ou pressionar e segurar, com submenus, itens de checkbox e de rádio e feedback de pressão no toque.
- DialogUma janela sobre a página para formulários e tarefas focadas, com cabeçalho e rodapé fixos, aninhamento e um bottom sheet com deslize no celular.
- DrawerUm painel que desliza a partir de qualquer borda e acompanha o seu dedo, com pontos de ancoragem, uma alça funcional e drawers aninhados que se empilham.
Usado em blocos
Blocos que se baseiam em Sheet.