KDS
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

ComponenteDescrição
ResizablePanelGroupFrame que coordena os panels; aceita orientation.
ResizablePanelPainel filho; aceita defaultSize, minSize, maxSize, collapsible.
ResizableHandleDivisor 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 onLayout callback para gravar em localStorage. Refresh deve restaurar a configuração do usuário — é a mesma promessa de um IDE nativo.
  • minSize em todos os panels. Sem isso o usuário pode arrastar até 0 e ter um panel invisível. Mínimo de ~10–15%.
  • withHandle para 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

ConcernComportamento
RolesHandles têm role="separator"; aria-orientation reflete a direção do split.
KeyboardHandle 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.
FocusFoco visível com ring; ring offset evita confusão com hover state.
Screen readerAnuncia "separator, vertical/horizontal" e mudanças de tamanho percentual.
TouchHandles funcionam em touch, mas área de hit é 4px por padrão — em mobile, prefira layout fixo.
  • ScrollArea — para overflow vertical/horizontal dentro de um panel.
  • Stack — quando layouts proporcionais bastam.
  • Sheet — alternativa em mobile para panels secundários.

On this page