Dialog
Uma 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/dialog.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/dialog.tsx components/ui/sheet.tsx components/ui/button.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Form
Mantenha o formulário em <DialogBody /> e aponte o botão de envio no footer para ele com form. Enter envia, e o diálogo fecha por onOpenChange quando o valor é salvo.
Botão de fechar personalizado
Oculte o botão do canto com showCloseButton={false} no conteúdo e adicione um botão Close ao footer com showCloseButton.
Sem botão de fechar
Sem um botão, o diálogo ainda fecha com Esc, um clique fora ou, em celulares, um deslize para baixo.
Tamanhos
size define a largura máxima em telas maiores: sm, default ou lg.
Footer fixo
Conteúdo longo em <DialogBody /> rola enquanto o header e o footer permanecem no lugar, então as ações estão sempre ao alcance.
Conteúdo rolável
Sem um footer, o body rola por baixo do header e mantém seu padding inferior.
Controlado
Passe open e onOpenChange para abri-lo por código, sem gatilho.
Aninhado
Um diálogo ou alert dialog aberto de dentro de outro fica empilhado por cima. O pai recua e um backdrop mais claro o cobre. Esc fecha apenas o de cima.
Gatilhos desanexados
Crie um handle com createDialogHandle() para compartilhar um diálogo entre vários gatilhos. Cada gatilho passa um payload que o diálogo lê por meio de uma render function.
Da direita para a esquerda
Passe dir também ao conteúdo, pois ele é renderizado em um portal fora do seu contêiner RTL.
| Tecla | Ação |
|---|---|
| EnterSpace | No gatilho, abre o diálogo e move o foco para o primeiro controle. |
| TabShift+Tab | Move o foco entre os controles. O foco permanece dentro. |
| Esc | Fecha o diálogo do topo e devolve o foco ao seu gatilho. |
- O conteúdo tem
role="dialog"e é rotulado pelo título e descrito pela descrição. Inclua sempre um<DialogTitle />. - Com mouse ou teclado, o foco começa no primeiro controle. Com toque, começa no próprio diálogo, para que o teclado na tela não cubra o conteúdo antes de as pessoas escolherem um campo. Passe
initialFocuspara alterá-lo. - O botão de fechar do canto tem o rótulo “Close”, e a página atrás fica inert e não rola.
- Em celulares, vira um bottom sheet que pode ser deslizado para baixo para fechar. Com movimento reduzido ativado, aparece com fade em vez de escala ou deslize.
Construído sobre o drawer do Base UI, por meio de <Sheet />. Cada parte aceita as props da primitiva ou do elemento que envolve.
| Prop | Tipo | Padrão |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
onOpenChangeCompleteChamado após a animação de abertura ou fechamento. | (open: boolean) => void | – |
modal | boolean | "trap-focus" | true |
disablePointerDismissalMantém o diálogo aberto em cliques fora dele. | boolean | false |
handleConecta gatilhos desanexados. | DialogHandle<Payload> | – |
actionsRefFecha ou desmonta o diálogo de forma imperativa. | RefObject<{ close, unmount }> | – |
children | ReactNode | ({ payload }) => ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
handle | DialogHandle<Payload> | – |
payloadRepassado à render function do diálogo. | Payload | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="dialog-trigger" | Selecione os gatilhos no CSS. |
data-popup-open | Presente enquanto o seu diálogo está aberto. |
| Prop | Tipo | Padrão |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
showCloseButtonMostra o botão de fechar no canto. | boolean | true |
initialFocus | boolean | RefObject | (openType) => HTMLElement | boolean | First control, or the dialog on touch |
finalFocus | boolean | RefObject | (closeType) => HTMLElement | boolean | The trigger |
dirDefina quando o diálogo deve ser da direita para a esquerda. | "ltr" | "rtl" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="dialog-content" | Seleciona o diálogo no CSS. |
data-size | O tamanho atual. |
data-open | Presente enquanto aberto. |
data-starting-style | Presente enquanto o diálogo anima a entrada. |
data-ending-style | Presente enquanto o diálogo anima a saída. |
data-nested-drawer-open | Presente enquanto um diálogo aninhado está aberto por cima. |
data-swiping | Presente enquanto está sendo deslizado em um celular. |
--nested-drawers | Quantos diálogos estão abertos por cima deste. |
Um <div> que empilha o título e a descrição. Deixa espaço para o botão de fechar.
| Atributo | Descrição |
|---|---|
data-slot="dialog-header" | Selecione o cabeçalho no CSS. |
Um <div> que rola quando o conteúdo é mais alto que a tela, mantendo o header e o footer no lugar.
| Atributo | Descrição |
|---|---|
data-slot="dialog-body" | Seleciona o body no CSS. |
Um <div> para as ações. Os botões se empilham em largura total em celulares, com o primeiro embaixo.
| Prop | Tipo | Padrão |
|---|---|---|
showCloseButtonAdiciona um botão Close outline depois dos children. | boolean | false |
| Atributo | Descrição |
|---|---|
data-slot="dialog-footer" | Seleciona o rodapé no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <h2> |
| Atributo | Descrição |
|---|---|
data-slot="dialog-title" | Selecione o título no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
renderUse render={<div />} quando ele contiver vários parágrafos. | ReactElement | (props, state) => ReactElement | <p> |
| Atributo | Descrição |
|---|---|
data-slot="dialog-description" | Selecione a descrição no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="dialog-close" | Seleciona os botões de fechar no CSS. |
<DialogContent /> já renderiza os dois. Use-os apenas ao compor um popup personalizado.
| Prop | Tipo | Padrão |
|---|---|---|
keepMountedNo portal, mantém o diálogo no DOM enquanto fechado. | boolean | false |
Retorna um handle que conecta elementos <DialogTrigger /> de qualquer lugar da página a um único <Dialog />. Tipifique o payload com um genérico: createDialogHandle<{ name: string }>().
- 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.
- SheetUm painel que desliza a partir de qualquer borda, com deslize para dispensar, bloqueio de rolagem e aninhamento empilhado.
- 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.
- 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 Dialog.
- Prompt InputUm campo de conversa que começa como uma linha discreta, cresce até virar um card conforme você escreve e desce quando a conversa começa. Enter envia, de forma segura com entrada em japonês e chinês. Cole, solte ou escolha arquivos com prévias, progresso e nova tentativa. @ adiciona arquivos e / executa comandos a partir de um menu no cursor. Um seletor de modelo com teclas numéricas, um slider de esforço que ganha vida no Max, um anel de contexto, ditado com forma de onda ao vivo, chips de ferramentas, uma fila para mensagens digitadas enquanto uma resposta é transmitida e rascunhos que sobrevivem a um recarregamento.
- API keysA página de chaves de API de um produto de IA, como nos consoles da OpenAI e da Anthropic. Crie chaves com permissões restritas e uma expiração, veja o segredo uma única vez com uma cópia que confirma, revogue com desfazer, renomeie no próprio lugar, faça a rotação com um período de tolerância e veja o uso por chave.
- BillingPlano e uso para um produto de IA, no estilo de Cursor, Claude e Vercel. Um medidor de uso dividido por modelo que projeta o fim do ciclo e avisa antes de os créditos acabarem, um gráfico diário que você pode percorrer, um limite de gastos com alertas que você pode pré-visualizar no medidor, mudanças de plano com proporcional exato, um formulário de cartão com validação real e faturas que baixam como PDF.
- ModelsA página Modelos das configurações de um produto de IA. Um modelo padrão com contexto, velocidade e custo à primeira vista, um esforço padrão que sabe o que cada modelo suporta, uma lista de modelos pesquisável agrupada por provedor com filtros, fixações e alternâncias em massa, servidores compatíveis com a OpenAI com um teste de conexão real e uma atualização que informa o que há de novo.