Tabs
Abas que alternam entre visões da mesma coisa, como os itens, a entrega e o histórico de um pedido, sem sair da página. Só um painel aparece por vez.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no cliente.
import { Tabs, TabsList, Tab, TabsPanel } from "@camaleo/react";Anatomia
Um Tab e um TabsPanel com o mesmo value andam juntos. A lista é uma parada só na ordem do Tab; as setas passam de uma aba para outra.
Exemplos
Todo exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor da barra acima. Clique numa aba e depois experimente as setas.
Loja Acme
Loja virtual · criada em 02/03/2025
Aparece nas notas fiscais e nos e-mails para clientes.
Vertical
Com orientation="vertical" a lista fica ao lado do painel e ↑ ↓ passam de uma aba para outra. Serve para configurações com mais seções do que cabem numa linha.
- Pedido nº 4821 chegou danificado
- Posso mudar o endereço de entrega?
Com ícones e contagens
Uma contagem mostra onde está o trabalho antes do clique. Seja breve: o número passa a fazer parte do nome da aba.
Muitas abas
Quando as abas não cabem, a lista rola para o lado e mantém a aba ativa à vista. Passando de umas oito, uma barra lateral ou um select fica mais fácil de ler.
/orders/4821?tab=items
Na URL
Clique numa aba e veja o endereço. Com value e onValueChange você guarda a aba na URL, e um link ou um recarregamento abre a mesma visão.
Carregar na primeira abertura
Abra Atividade. Um painel escondido não é renderizado, então você pode buscar os dados na primeira vez que ele abre e mostrar um skeleton enquanto isso.
Seguir o foco
Por padrão as setas só movem o foco, e Enter ou Espaço abre a aba. Use activateOnFocus quando os painéis aparecem na hora, como esses números.
Os relatórios fiscais abrem depois do seu primeiro mês completo de vendas, em 01/12/2026.
Desativada, com o motivo
As setas ainda chegam a uma aba desativada, mas não a abrem. Diga por que ela está desligada e quando abre, ligado com aria-describedby para ser lido no foco.
Em contexto
São pedaços inteiros de interface que você pode copiar, no estilo que escolheu.
Moedor de café manual
R$ 89,90“Moagem uniforme e fácil de limpar. Uso todas as manhãs.”
Marina L., 02/10/2026
Pedido nº 4821
- Café Bourbon em grãos, 500 gR$ 96,50
- Moedor de café manualR$ 89,90
Boas práticas
Resumo, pedidos e observações descrevem o mesmo cliente, e dá para ler em qualquer ordem.
Uma compra tem ordem e próxima etapa. Abas deixam pular para a frente e escondem quanto já foi feito; use um stepper.
Ir para outra página é navegação: links com aria-current="page" mantêm o botão Voltar, as novas abas do navegador e as URLs compartilhadas funcionando.
O leitor de tela anuncia uma lista de abas, e a pessoa espera que o conteúdo mude ali, não a página inteira.
Props
onValueChange para controlar o estado. null deixa nenhuma ativa.horizontal usa ← →; vertical põe a lista ao lado do painel e usa ↑ ↓.eventDetails.reason diz o motivo, por exemplo none para um clique ou uma tecla.Tab e TabsPanel recebem um value que os liga. O Tab também aceita disabled.
O TabsList decide como o teclado se comporta:
O TabsPanel pode continuar na página enquanto está escondido:
Styling hooks
Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou na própria lista.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
/* abas em pílula sobre um trilho, só neste card */
.cobranca [data-slot="tabs-list"] {
--cml-tabs-list-bg: var(--cml-surface-sunken);
--cml-tabs-list-radius: var(--cml-radius-surface);
--cml-tab-radius: var(--cml-radius-surface);
--cml-tab-active-bg: var(--cml-surface-raised);
}Acessibilidade
- Cada aba tem role=tab e aria-selected; cada painel tem role=tabpanel e recebe o nome da sua aba por aria-labelledby.
- Dê um nome à lista com aria-label ou aria-labelledby, para a pessoa saber em qual grupo de abas está.
- O painel recebe foco, então quem usa teclado chega ao texto mesmo sem links ou campos.
- Uma aba desativada continua focável com aria-disabled, então a pessoa sabe que ela existe; Enter e Espaço não a abrem.