Collapsible
Um painel que aparece e desaparece com um movimento de altura que você pode reverter no meio, sem fazer o layout pular.
@preetsuthar17 starred 3 repositories
pnpm dlx shadcn@latest add https://hextaui.com/r/collapsible.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 cnCopie e cole o código a seguir no seu projeto.
components/ui/collapsible.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Aberto por padrão
defaultOpen inicia o painel aberto sem assumir o controle do seu estado.
Mostrar mais
O painel fica acima do seu gatilho. Quando fecha, o espaço no layout flex do pai colapsa na mesma animação, então o botão abaixo nunca salta.
Controlado
Passe open e onOpenChange para controlar o painel com seu próprio estado. Alternar no meio da animação reverte a partir de onde o painel está.
Desabilitado
disabled na raiz mantém o painel no estado atual e faz o gatilho ignorar cliques e teclas.
Ícone personalizado
Os filhos de <CollapsibleTriggerIcon /> substituem o chevron. Estilize o estado aberto com group-data-panel-open/collapsible-trigger.
Árvore de arquivos
Cada pasta é o seu próprio collapsible. Os painéis externos crescem suavemente conforme os internos se abrem.
Dentro de um card
Os painéis fechados permanecem na página com hidden=“until-found”, então Cmd/Ctrl+F por “webhook” abre este.
Desmontado quando fechado
Defina hiddenUntilFound={false} no conteúdo para removê-lo do DOM enquanto fechado, em painéis pesados que você não quer renderizados de antemão.
Conteúdo longo
Strings sem quebra são quebradas dentro do painel em vez de alargar a página.
Da direita para a esquerda
Os chevrons são espelhados e os recuos aninhados seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| EnterSpace | Abre ou fecha o painel a partir do gatilho. |
| Tab | Move o foco do gatilho para dentro do painel aberto. Painéis fechados são ignorados. |
- O gatilho recebe
aria-expandedearia-controlsautomaticamente. - Gatilhos só com ícone precisam de um
aria-label.<CollapsibleTriggerIcon />fica oculto para tecnologias assistivas. - Com movimento reduzido, o painel abre e fecha sem animar a altura.
Construído sobre o collapsible do Base UI. Cada parte aceita as props da primitiva que envolve.
| Prop | Tipo | Padrão |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="collapsible" | Selecione a raiz no CSS. |
data-open | Presente quando aberto. |
data-closed | Presente quando fechado. |
| Prop | Tipo | Padrão |
|---|---|---|
renderGeralmente um Button. | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="collapsible-trigger" | Selecione o gatilho no CSS. |
data-panel-open | Presente quando o painel está aberto. Estilize os filhos com group-data-panel-open/collapsible-trigger. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenO chevron padrão se inverte quando o painel abre. | ReactNode | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descrição |
|---|---|
data-slot="collapsible-trigger-icon" | Oculto para tecnologias assistivas. Desce um pouco enquanto o gatilho é pressionado. |
| Prop | Tipo | Padrão |
|---|---|---|
classNameAplicado ao wrapper interno, para que o padding nunca entre em conflito com a animação de altura. | string | – |
hiddenUntilFoundMantém o painel fechado no DOM para que a busca da página possa encontrá-lo e abri-lo. | boolean | true |
keepMountedIgnorado enquanto hiddenUntilFound está ativo. | boolean | false |
| Atributo | Descrição |
|---|---|
data-slot="collapsible-content" | Seleciona o painel no CSS. |
data-open | Presente quando aberto. |
data-closed | Presente quando fechado. |
data-starting-style | Presente enquanto o painel anima a entrada. |
data-ending-style | Presente enquanto o painel anima a saída. |
--collapsible-panel-height | A altura medida do painel. |
--collapsible-panel-width | A largura medida do painel. |
--collapsible-gap-start | O espaço do pai antes do painel, colapsado enquanto fechado. |
--collapsible-gap-end | O espaço do pai depois do painel, colapsado enquanto fechado. |
- AccordionTítulos empilhados que revelam cada um um painel, com movimento de altura que você pode reverter no meio e painéis que continuam pesquisáveis enquanto fechados.
- Aspect ratioUma caixa que mantém sua forma antes de a mídia carregar, exibe um shimmer durante o carregamento, faz a mídia aparecer com fade e usa um fallback quando ela falha.
- CarouselSlides nativos com scroll-snap, com inércia no toque, arrastar com o mouse, setas do teclado, pontos, miniaturas e um autoplay que pausa quando deve.
- ResizablePainéis que você pode separar arrastando, com um divisor discreto que desperta no hover, tamanhos que deslizam ao redefinir ou recolher e layouts que persistem.
- Scroll areaRolagem nativa com uma barra de rolagem mínima, bordas que esmaecem apenas onde há mais a ver e um peek opcional que corta o último item ao meio.
- SeparatorUma linha fina que divide o conteúdo na horizontal ou na vertical, com rótulo opcional e um modo decorativo para linhas puramente visuais.
Usado em blocos
Blocos que se baseiam em Collapsible.
- Agent TodosMostre o plano de um agente enquanto ele trabalha. Cada etapa passa de backlog para a fazer, em andamento e concluída, com tempos ao vivo, falhas e as chamadas de ferramenta por trás dela. Uma pílula de status para acima do composer, mudanças no plano que você consegue ver e uma etapa de revisão para editar o plano antes de executá-lo.
- 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.
- Chat SidebarA barra lateral de um app de chat. Logo, busca e Novo chat no topo, seus próprios links abaixo, chats fixados, projetos que se expandem para mostrar seus chats, recentes agrupados por dia e linhas com menus de hover e de clique direito, renomeação inline, exclusão com desfazer e estados de resposta ao vivo.