Containers
Resizable
Painéis com handles arrastáveis — para layouts de dev tools e pro apps.
Overview
Resizable divide um espaço em panes redimensionáveis com handles
arrastáveis entre eles. É a base para layouts profissionais — code
editors, email clients, file managers, design tools com sidebar +
canvas + properties.
Para superfícies consumer-facing, layouts fixos com responsive breakpoints quase sempre lêem melhor. Reach for Resizable quando o usuário tem trabalho profissional para fazer e precisa ajustar o canvas para o que está fazendo agora.
Preview
Split horizontal 50/50, arrastar a alça central para redimensionar.
Esquerda
Direita
Anatomy
<ResizablePanelGroup orientation="horizontal">
<ResizablePanel defaultSize={50}>{/* esquerda */}</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize={50}>{/* direita */}</ResizablePanel>
</ResizablePanelGroup>ResizablePanelGroup é o frame e define orientation.
ResizablePanel claim uma fração via defaultSize (0–100).
ResizableHandle é o divisor entre dois panels — passa
withHandle para mostrar uma alça visível.
Subcomponents
| Componente | Descrição |
|---|---|
ResizablePanelGroup | Frame que coordena os panels; aceita orientation. |
ResizablePanel | Painel filho; aceita defaultSize, minSize, maxSize, collapsible. |
ResizableHandle | Divisor arrastável entre dois panels; withHandle mostra alça. |
Usage
import {
ResizableHandle,
ResizablePanel,
ResizablePanelGroup
} from "@kalvner/kds/containers/resizable";
export function EditorLayout() {
return (
<ResizablePanelGroup orientation="horizontal" className="h-full">
<ResizablePanel defaultSize={20} minSize={15}>
<FileTree />
</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize={50}>
<Editor />
</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel defaultSize={30}>
<Preview />
</ResizablePanel>
</ResizablePanelGroup>
);
}Variants
Vertical split
Topo + inferior — útil para split editor + terminal.
Topo
Inferior
Three-pane
Sidebar + main + inspector — padrão Mail / IDE.
Sidebar
Editor
Preview
Composition
Code editor layout
FileTree + editor + preview — padrão VS Code / CodeSandbox.
Arquivos
- page.tsx
- tokens.css
- tsconfig.json
export function Page() {
return <h1>Hello, KDS</h1>
}Preview
When to use
- IDEs e code editors web com FileTree + Editor + Preview.
- Email clients com Folders + List + Reader.
- Design tools com Sidebar + Canvas + Properties.
- Logs/observability tools com filtro lateral + log viewer.
- Sempre que o usuário gasta horas no app e quer ajustar o canvas.
When not to use
- Sites de marketing — fixed proportions + responsive servem.
- CRUD apps simples — é over-engineering.
- Mobile — handles arrastáveis são imprecisos em touch screens pequenos. Em mobile, force layout fixo ou Sheet.
- Conteúdo onde o usuário lê passivamente (artigos, dashboards read-only) — resizable adiciona complexidade sem ganho.
Best practices
- Persista o tamanho. Use
onLayoutcallback para gravar em localStorage. Refresh deve restaurar a configuração do usuário — é a mesma promessa de um IDE nativo. minSizeem todos os panels. Sem isso o usuário pode arrastar até 0 e ter um panel invisível. Mínimo de ~10–15%.withHandlepara handles funcionais. Sem a alça visível, só um pixel divisor sutil — usuários novos não descobrem que é arrastável. Handle visível é discoverability.- Não anime tamanhos. Resize precisa ser síncrono e direto; transitions atrapalham a sensação de controle.
- Escolha defaults inteligentes. 20% (sidebar) / 60% (main) / 20% (inspector) é uma proporção que serve de partida para 90% dos pro apps.
Accessibility
| Concern | Comportamento |
|---|---|
| Roles | Handles têm role="separator"; aria-orientation reflete a direção do split. |
| Keyboard | Handle focável via Tab; setas movem o handle (10px por step); Home/End saltam para limites; Enter em handles colapsáveis (collapsible panel) fecha/abre. |
| Focus | Foco visível com ring; ring offset evita confusão com hover state. |
| Screen reader | Anuncia "separator, vertical/horizontal" e mudanças de tamanho percentual. |
| Touch | Handles funcionam em touch, mas área de hit é 4px por padrão — em mobile, prefira layout fixo. |
Related
ScrollArea— para overflow vertical/horizontal dentro de um panel.Stack— quando layouts proporcionais bastam.Sheet— alternativa em mobile para panels secundários.