Capítulo 43 de 108
Painéis redimensionáveis acessíveis, com suporte a teclado, para layouts do tipo split-pane (sidebar+conteúdo, editor+preview). Built em cima de react-resizable-panels (bvaughn), não Base UI.
orientation="horizontal"|"vertical".defaultSize="50%" define tamanho inicial (string com %, não número).withHandle mostra alça visível.ResizablePanelGroup dentro de ResizablePanel) para grids complexos.import {
ResizableHandle,
ResizablePanel,
ResizablePanelGroup,
} from "@/components/ui/resizable"
<ResizablePanelGroup orientation="horizontal" className="max-w-sm rounded-lg border">
<ResizablePanel defaultSize="50%">
<div className="flex h-[200px] items-center justify-center p-6">One</div>
</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize="50%">
<ResizablePanelGroup orientation="vertical">
<ResizablePanel defaultSize="25%">Two</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize="75%">Three</ResizablePanel>
</ResizablePanelGroup>
</ResizablePanel>
</ResizablePanelGroup>
ResizablePanelGroup (vertical dentro de horizontal) para criar layout tipo IDE.Composição:
ResizablePanelGroup
├── ResizablePanel
├── ResizableHandle
└── ResizablePanel
Migração v3 → v4 do react-resizable-panels (afeta uso direto da lib, não os wrappers shadcn):
| v3 | v4 |
|---|---|
PanelGroup | Group |
PanelResizeHandle | Separator |
direction prop | orientation prop |
defaultSize={50} | defaultSize="50%" |
onLayout | onLayoutChange |
ImperativePanelHandle | PanelImperativeHandle |
ref prop on Panel | panelRef prop |
data-panel-group-direction | aria-orientation |
defaultSize={50} (número): na v4 o valor precisa ser string com %, ex. "50%".react-resizable-panels, não @base-ui/react (diferente da maioria dos outros componentes deste lote).defaultSize é string percentual ("50%"), não número.orientation para montar grids tipo editor de código.ResizablePanelGroup, ResizablePanel, ResizableHandle) permanecem estáveis mesmo com a mudança de API v3→v4 da lib subjacente.withHandle é o que torna o divisor visualmente perceptível; sem ele o handle existe mas é invisível.