Resizable
Painé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.
pnpm dlx shadcn@latest add https://hextaui.com/r/resizable.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 react-resizable-panels cnCopie e cole o código a seguir no seu projeto.
components/ui/resizable.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Números são pixels e strings são porcentagens, então defaultSize="30%" e minSize={240} funcionam. O divisor continua uma linha fina até você alcançá-lo. Enquanto você arrasta, os painéis seguem o ponteiro exatamente; qualquer outra mudança desliza, incluindo redefinições por clique duplo, passos do teclado e recolhimentos pelo código.
Collapsible
Um painel collapsible se fecha de uma vez quando arrastado abaixo do seu minSize. Alterne-o por um botão com usePanelRef; o recolhimento é animado.
Indicador de tamanho
showSize mostra o tamanho do painel antes do divisor enquanto você arrasta ou usa o teclado, em "percent" ou "pixels".
Lembrar o layout
useDefaultLayout salva os tamanhos em localStorage e os restaura na próxima visita sem animar a entrada. Dê um id a cada painel.
Vertical
orientation="vertical" empilha os painéis. Os grupos se aninham, como na demo acima.
Grip visível
withHandle mantém o grip visível em vez de revelá-lo no hover.
Da direita para a esquerda
Painéis e setas seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| ←→↑↓ | Move o divisor com foco em 5% ao longo da direção do seu grupo. |
| HomeEnd | Move o divisor o máximo que os painéis permitirem. |
| Enter | Recolhe ou expande um painel recolhível. |
| F6 | Move para o próximo divisor do grupo; Shift volta. |
- Cada divisor é um
separatorfocável que informa o tamanho do painel anterior a ele. - O indicador de tamanho é decorativo; os leitores de tela recebem o valor do próprio separator.
- Com movimento reduzido, os tamanhos mudam instantaneamente e o divisor não anima.
| Prop | Tipo | Padrão |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
defaultLayout | Layout | – |
onLayoutChangeToda mudança, inclusive durante o arrasto. | (layout) => void | – |
onLayoutChangedQuando uma mudança se estabiliza. | (layout, meta) => void | – |
disabled | boolean | false |
groupRef | Ref<GroupImperativeHandle> | – |
| Atributo | Descrição |
|---|---|
data-slot="resizable-panel-group" | O grupo. |
data-ready | Definido após a montagem; os tamanhos animam a partir daí. |
| Prop | Tipo | Padrão |
|---|---|---|
defaultSize | number | string | – |
minSize | number | string | – |
maxSize | number | string | – |
collapsible | boolean | false |
collapsedSize | number | string | 0 |
onResize | (size, id, previous) => void | – |
panelRef | Ref<PanelImperativeHandle> | – |
idNecessário para lembrar layouts. | string | – |
| Prop | Tipo | Padrão |
|---|---|---|
withHandleSempre mostrar o grip. | boolean | false |
showSize | boolean | "percent" | "pixels" | false |
disableDoubleClickImpede que o clique duplo redefina os painéis. | boolean | false |
disabled | boolean | false |
| Atributo | Descrição |
|---|---|
data-slot="resizable-handle" | O divisor. |
data-separator | "inactive", "hover", "active", "focus" ou "disabled". |
data-slot="resizable-handle-grip" | A pílula do grip. |
usePanelRef e useGroupRef dão a você collapse, expand, resize e setLayout. useDefaultLayout persiste o layout de um grupo.
- 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.
- CollapsibleUm painel que aparece e desaparece com um movimento de altura que você pode reverter no meio, sem fazer o layout pular.
- 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 Resizable.
- ArtifactO painel ao lado de um chat de IA que mostra o que o modelo criou. Páginas web, SVGs, documentos e código chegam em streaming ao vivo e depois passam para uma prévia isolada em sandbox, com versões que você pode comparar e restaurar, uma divisão redimensionável e um bottom sheet no celular.
- Diff ReviewRevise as edições de um agente em vários arquivos antes que sejam aplicadas. Uma árvore de arquivos com contagens, aceite ou rejeite cada mudança, cada arquivo ou tudo de uma vez, comentários em qualquer linha ou intervalo que voltam para o agente, visões unificada e dividida, destaques por palavra, desfazer, edições em streaming e um resumo "4 arquivos editados" para o chat.