Resizable
Painéis divididos e redimensionáveis para layouts densos de aplicação
Resizable cria layouts tipo IDE onde o usuário pode ajustar a largura ou altura de cada painel arrastando a divisória. Use em editores, consoles, explorações de dados e qualquer contexto em que o usuário precisa balancear espaço entre regiões concorrentes.
Projetos
Editor
'use client';
import {
ResizableHandle,
ResizablePanel,
ResizablePanelGroup,
} from '@uranus-workspace/design-system';
export default function ResizableDefault() {
return (
<ResizablePanelGroup orientation="horizontal" className="h-[220px] w-[520px] rounded-lg border">
<ResizablePanel defaultSize={35} minSize={20}>
<div className="flex h-full items-center justify-center p-6">
<span className="text-sm font-medium">Projetos</span>
</div>
</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize={65}>
<div className="flex h-full items-center justify-center p-6">
<span className="text-sm font-medium">Editor</span>
</div>
</ResizablePanel>
</ResizablePanelGroup>
);
}
Anatomia
- ResizablePanelGroup — raiz que aceita
orientation="horizontal"ou"vertical". Define o sentido do arraste. - ResizablePanel — cada painel. Aceita
defaultSize,minSize,maxSize(percentuais),collapsibleeonResize. - ResizableHandle — a divisória. Passe
withHandlepara exibir o "puxador" visual no centro.
Grupos podem ser aninhados para criar layouts em T ou em cruz.
Uso
'use client';
import {
ResizableHandle,
ResizablePanel,
ResizablePanelGroup,
} from '@uranus-workspace/design-system';
<ResizablePanelGroup orientation="horizontal">
<ResizablePanel defaultSize={25} minSize={15}>
Sidebar
</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize={75}>Conteúdo</ResizablePanel>
</ResizablePanelGroup>Faça
- Defina
minSizeem todos os painéis — impede que o usuário colapse acidentalmente a região a zero. - Use
withHandlequando a divisória precisa ser descoberta; esconda o puxador em layouts densos onde o hover é o afordance esperado. - Persista as dimensões com a prop
autoSaveIdnoResizablePanelGroupquando o usuário deve retomar o layout entre sessões.
Não faça
- Não use Resizable para layouts simples de página — prefira Tailwind + flex/grid.
- Não aninhe mais de dois níveis. Passa disso, o mental model quebra.
- Não esconda conteúdo crítico atrás de um painel que o usuário pode colapsar sem querer.
Acessibilidade
- A divisória (
ResizableHandle) é um<div role="separator">com foco por teclado. - Teclado:
Tabfoca a divisória;Setasa movem em incrementos de 10%;HomeeEnda levam aos extremos;Enteralterna um painel colapsado. - Garanta contraste suficiente na divisória — o estado de foco usa
focus-visible:ring-ringpor padrão.