Stack
Pilha que organiza os filhos numa coluna ou numa linha, com um espaço da escala de espaçamento. Use para formulários, barras de ações, listas e tudo que corre numa direção só.
Instalação
Configure o Camaleo uma vez (Instalação) e importe. Ele não tem estado, então renderiza no servidor.
import { Stack } from "@camaleo/react";Anatomia
Um elemento flex com data-slot="stack". Stacks se aninham: este cabeçalho de página é uma linha cujos dois filhos são stacks também.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.
gap={1} · Rótulo e valor: uma ideia só
Fatura
nº 2026-118Vencimento
20/11/2026gap={3} · Itens de uma lista
gap={6} · Grupos separados
Cobrança
nº 2026-118
Entrega
Belo Horizonte
O espaço mostra o que anda junto
O gap conta passos de --cml-space, então o ritmo acompanha o estilo. Espaços pequenos juntam um rótulo ao valor; espaços grandes separam grupos.
Projetos
12 ativos
Cabeçalho de página
justify="space-between" põe o título de um lado e as ações do outro. Com wrap, as ações descem para baixo do título no celular.
Assuntos
- Design systems
- Acessibilidade
- React
- Desempenho
- Tipografia
- Modo escuro
Tags que quebram linha
Uma fileira de tags deve quebrar linha, não rolar para o lado nem espremer. Ela também é um ul, então o leitor de tela diz quantos assuntos são.
Gerente de contas · Atlas
Linha ou coluna
Ligue o interruptor. Os mesmos três filhos passam de linha para coluna; só o direction muda, então a ordem de leitura continua a mesma.
Ordem do Tab 1
Ordem do Tab 2
Ordem do Tab 3
O Tab segue o que você vê: da esquerda para a direita.
Ordem visual igual à ordem do Tab
Ligue o row-reverse e aperte Tab: o foco começa pela direita. Para pôr a ação principal no fim, coloque por último no DOM e use justify="flex-end".
Espaço de trabalho
Membros
8 de 10 lugares
Armazenamento
34 GB de 100 GB
Plano
Equipe, mensal
Linhas com divisórias
O Stack não tem prop de divisória. Coloque um Separator entre os filhos e o gap distribui o espaço igual acima e abaixo.
De plantão esta semana
- Beatriz Santos
Backend
- João Pereira
Infraestrutura
- Carla Mendes
Frontend
Uma lista empilhada
as="ul" mantém a semântica de lista enquanto o Stack cuida do espaço. Tire os marcadores e o recuo com listStyle e padding.
Responsivo sem breakpoints
Não existem props de breakpoint. Dê a cada filho uma largura mínima com flex e ligue o wrap: três campos numa linha viram uma coluna no celular.
Em contexto
São pedaços inteiros de interface para copiar, no estilo que você escolheu.
Resumo do pedido
Subtotal
R$ 412,00
Frete
R$ 18,90
Cupom BEMVINDO10
−R$ 41,20
Designer de produto · São Paulo
Crie seu espaço de trabalho
Grátis por 14 dias. Sem cartão.
Boas práticas
Fatura nº 2026-118
Vence em 20/11/2026 · R$ 1.240,00
Pagamento por Pix, boleto ou cartão.
O título e o vencimento são lidos como uma coisa só, e a ação fica à parte.
Fatura nº 2026-118
Vence em 20/11/2026 · R$ 1.240,00
Pagamento por Pix, boleto ou cartão.
Cada linha fica à mesma distância da próxima, e nada diz o que anda junto.
Cancelar vem primeiro e Publicar por último, empurrado para o fim com justify="flex-end". O Tab segue o olhar.
Fica idêntico, mas o Tab começa pela direita e anda para a esquerda, e o leitor de tela lê Publicar antes de Cancelar.
Props
as="ul").-reverse só invertem o desenho: a leitura e o Tab continuam seguindo o DOM.--cml-space (0.25rem por padrão): gap={4} = 1rem.align-items).justify-content).O as aceita as mesmas tags do Box. Todas as outras props vão para o elemento. O seu style entra depois das propriedades customizadas, então pode sobrescrever qualquer uma.
Styling hooks
Cada prop vira uma propriedade customizada no elemento. Deixe uma prop de fora e o seu CSS pode definir essa propriedade, por exemplo num breakpoint.
Atributos
Tokens que ele lê
Só deste componente
/* a barra de ações vira linha a partir de 40rem */
@media (min-width: 40rem) {
.actions[data-slot="stack"] {
--cml-stack-direction: row;
--cml-stack-justify: flex-end;
}
}Acessibilidade
- A ordem visual precisa ser a ordem do DOM. column-reverse e row-reverse só mexem no desenho: o Tab e o leitor de tela continuam seguindo o DOM, então reordene o JSX.
- Quebrar linha também mantém a ordem do DOM: os itens vão da esquerda para a direita e seguem na linha de baixo, que é a ordem de leitura.
- Espaço não é significado. Se os itens formam uma lista, renderize as="ul"; se um grupo precisa de nome, dê um título a ele.
- Use o as para landmarks e formulários (as="form", as="nav") para a semântica vir junto com o layout.