Pular para o conteúdo
// visualizar em
salvo em todas as páginas

Splitter

Divisor — dois painéis com uma alça entre eles, que a pessoa arrasta ou move pelo teclado para dividir o espaço. Use em telas de trabalho, como um cliente de e-mail, um editor com prévia ou uma ferramenta de consultas.

Padrão WAI-ARIA Window SplitterComponente clienteCódigo ↗
minimal · light · #3fa34d

Esta versão traz exportações mais rápidas e uma nova tela de faturas.

Acompanhe o que foi cobrado, o que está pago e o que está atrasado. Filtre por cliente ou por mês.

orientation

Instalação

Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no cliente.

import { Splitter, SplitterPanel, SplitterHandle } from "@camaleo/react";

Anatomia

O valor é o tamanho do primeiro painel, em porcentagem; o segundo fica com o resto. Dê uma altura ao splitter. Os painéis recortam o conteúdo, então coloque uma ScrollArea dentro dos que podem crescer.

Exemplos

Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor da marca escolhidos na barra acima. Arraste uma alça, ou aperte Tab até uma ganhar o anel de foco e use as setas.

minimal · light · #3fa34d

Versão 4.2

Esta versão traz exportações mais rápidas e uma nova tela de faturas.

  • Exportar CSV ficou 3× mais rápido
  • As faturas mostram o status do pagamento
  • Modo escuro nos relatórios
  • Paula LimaOrçamento do 1º tri, números finais
  • Rafael SouzaRenovação do contrato com a Padaria Estrela
  • CobrançaA fatura FAT-2025-118 foi paga
  • Julia AlvesRevisão de design passou para sexta

Orçamento do 1º tri, números finais

Paula Lima · 12/03/2025, 16:40

Oi, pessoal, os números finais do 1º tri estão na pasta compartilhada. A receita fechou em R$ 482.300, 6% acima do plano. Revisem a sua área até quinta para enviarmos ao conselho.

Três colunas

Coloque um segundo splitter dentro do segundo painel. Cada alça ganha seu próprio nome, para a pessoa saber qual divisa está movendo.

export function InvoiceTable({ rows, currency }: Props) {
  const total = useMemo(
    () => rows.reduce((sum, r) => sum + r.amount, 0),
    [rows],
  );
  return <Table caption={format(total, currency)} rows={rows} />;
}
$ pnpm test invoice-table
 ✓ renders one row per invoice (12 ms)
 ✓ formats the total in the customer's currency (4 ms)
 ✗ updates the total when the currency changes
   Expected "R$ 1.240,00", received "$1,240.00"
Tests: 1 failed, 2 passed, 3 total

Empilhado

orientation="vertical" põe um painel sobre o outro, como um editor em cima do terminal. ↑ e ↓ movem a alça.

Status
  • FAT-2025-118 · Padaria Estrela · R$ 1.240,00
  • FAT-2025-117 · Café Aurora · R$ 860,50
  • FAT-2025-116 · Mercado Sol · R$ 3.105,90
  • FAT-2025-115 · Livraria Nova · R$ 412,00

Painel recolhível

Clique em "Ocultar filtros" ou aperte Enter na alça. Os dois recolhem o painel para 0 e depois o trazem de volta no tamanho que tinha; o painel recolhido fica oculto, então os controles dele saem da ordem do Tab.

Barra lateral: 28%

Faturas

Acompanhe o que foi cobrado, o que está pago e o que está atrasado. Filtre por cliente ou por mês.

Fica salvo no seu perfil, então o layout é o mesmo na próxima visita.

Tamanho lembrado

Arraste a alça e depois restaure. Com value e onValueChange, você guarda o tamanho no perfil da pessoa.

Receita x meta
jan
x
fev
x
mar
x
abr
x
Detalhes

O gráfico fica entre 30% e 70%.

Limites

min e max mantêm os dois lados usáveis. Home e End vão direto para eles.

  • Visão geral
  • Clientes
  • Faturas
  • Relatórios
Faturas

Acompanhe o que foi cobrado, o que está pago e o que está atrasado. Filtre por cliente ou por mês.

Um nome e um valor por extenso

A alça é um separador focável. Dê a ela o nome do que redimensiona e use aria-valuetext para o leitor de tela dizer "Barra lateral com 30% da largura" em vez de "30".

Em contexto

São pedaços inteiros de interface para copiar, no estilo que você escolheu.

  • Ana RibeiroPedido nº 4821 não foi enviadoAberto
  • Carlos MendesTamanho errado na entregaAberto
  • Beatriz RochaComo mudo meu endereço?Aguardando
Ana Ribeiro

Oi! Meu pedido nº 4821 ainda está como “em preparação”. Já saiu? Preciso dele até sexta.

Caixa de suporteSplitter · ScrollArea · Badge · Avatar · Textarea · Button
3 linhas · 42 ms
ClienteReceita
Padaria EstrelaR$ 48.210,00
Café AuroraR$ 31.980,50
Mercado SolR$ 12.404,90
Editor de consultasSplitter · Textarea · Button · Table
  • src
    • invoices
      • invoice-table.tsx
      • page.tsx
  • package.json
import { Table } from "@camaleo/react";

export function InvoiceTable({ rows }: Props) {
  return <Table rows={rows} />;
}
$ pnpm dev
 ▲ Ready on http://localhost:3000
 ✓ Compiled /invoices in 812 ms
Editor de códigoSplitter · TreeView · ScrollArea

Boas práticas

  • Visão geral
  • Clientes
  • Faturas

Acompanhe o que foi cobrado, o que está pago e o que está atrasado. Filtre por cliente ou por mês.

FaçaMínimos razoáveis.

Defina min para que o lado estreito sempre mostre palavras inteiras.

  • Visão geral
  • Clientes
  • Faturas

Acompanhe o que foi cobrado, o que está pago e o que está atrasado. Filtre por cliente ou por mês.

EvitePainéis que encolhem até sumir.

Uma barra lateral com 5% corta todos os nomes. A pessoa precisa arrastar de volta antes de conseguir ler.

FAT-2025-118 · Padaria Estrela · R$ 1.240,00

FaçaUm botão junto da alça.

Mostre e oculte o painel com um botão com rótulo, para quem não arrasta também chegar nele.

Os filtros estão escondidos aqui, e nada na tela avisa.

FAT-2025-118 · Padaria Estrela · R$ 1.240,00

EviteConteúdo que só aparece arrastando.

Um painel com 0% e sem botão parece não existir. Conteúdo essencial precisa de um caminho visível.

Props

PropriedadeTipoPadrãoDescrição
orientation"horizontal" | "vertical""horizontal"horizontal põe os painéis lado a lado; vertical empilha.
valuenumber—Tamanho do primeiro painel, em porcentagem do splitter. Use com onValueChange para controlar.
onValueChange(value: number) => void—Chamado com o novo tamanho (porcentagem, já limitada) a cada movimento do arraste e a cada tecla.
minnumber15Menor tamanho do primeiro painel, em porcentagem. Home vai para ele.
maxnumber85Maior tamanho do primeiro painel, em porcentagem. End vai para ele.
stepnumber1Quanto uma seta move, em porcentagem; Shift + seta move cinco passos.

O SplitterPanel aceita panel ("first" ou "second"). O SplitterHandle aceita aria-label (o padrão é "Resize panel"; passe no idioma da página) e aria-valuetext. As outras props vão para os elementos.

Styling hooks

Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou no próprio splitter.

Atributos

data-orientationhorizontal · vertical, em todas as partes
data-panelfirst · second, nos painéis
data-draggingno splitter e na alça enquanto ela é arrastada

Tokens que ele lê

Cor

--cml-border-control--cml-border-subtle--cml-brand--cml-fg--cml-focus-ring--cml-radius-surface--cml-surface

Forma e tamanho

--cml-border-width

Só deste componente

--cml-splitter-grip--cml-splitter-grip-length--cml-splitter-grip-thickness--cml-splitter-handle-size--cml-splitter-radius
/* uma linha fina no lugar da barra, sem o grip */
.editor [data-slot="splitter"] {
  --cml-splitter-handle-size: 0.375rem;
  --cml-splitter-handle-bg: transparent;
}
.editor [data-slot="splitter-grip"] { display: none; }

Acessibilidade

TabLeva o foco à alça.
← / →Lado a lado: deixa o primeiro painel mais estreito ou mais largo em um passo (1% por padrão).
↑ / ↓Empilhado: deixa o primeiro painel mais baixo ou mais alto em um passo.
Shift + setaMove cinco passos de uma vez.
Home / EndVão para o menor (min) ou o maior (max) tamanho.
EnterRecolhe o primeiro painel para 0, ou o traz de volta no tamanho que tinha. Uma seta com o painel recolhido abre ele no min.

Relacionados

Esta página foi útil? · Editar esta página no GitHub