Tabs
Recipe React distribuída como source, com comportamento Base UI e classes/tokens públicos do Tabs TIS.
Design
Preview funcional
Executado pela recipe React distribuída via shadcn e baseada em Base UI.
Abrir playground React · shadcn/Base UI
Anatomia
Panel content goes here.
4.ds-tabs) — container com role="tablist".2 Tab (
.ds-tab) — button individual com role="tab".3 Indicador ativo — borda inferior na tab ativa.
4 Painel da tab — área de conteúdo com
role="tabpanel".
Tabs padrão
Uma tab fica ativa, as demais ficam no estado padrão. Cada tab controla um painel correspondente.
This is the Overview panel content. It provides a summary of your account status and recent activity.
Settings panel for profile, notifications preferences, and account security options.
Activity panel listing recent logins, changes, and audit events.
Com tab desabilitada
Uma tab desabilitada não pode ser interagida e é ignorada durante a navegação por teclado.
General settings for your account: display name, language, and timezone preferences.
Múltiplas tabs
As tabs rolam horizontalmente quando excedem o container.
Dashboard panel showing project metrics, recent commits, and team activity overview.
Mapeamento de tokens
| Propriedade | Token | Variável CSS |
|---|---|---|
| texto (inativo) | component.tabs.label.color.default | --ds-tabs-label-color-default |
| texto (hover) | component.tabs.label.color.hover | --ds-tabs-label-color-hover |
| texto (ativo) | component.tabs.label.color.active | --ds-tabs-label-color-active |
| texto (desabilitado) | component.tabs.label.color.disabled | --ds-tabs-label-color-disabled |
| indicador ativo | component.tabs.indicator.fill.active | --ds-tabs-indicator-fill-active |
| divider | semantic.overlay.default | --ds-overlay-default |
| borda da lista | component.tabs.list.border-width.default | --ds-tabs-list-border-width-default |
| espaçamento do item | component.tabs.item.{padding-x,padding-top}.default | --ds-tabs-item-padding-*-default |
| gap até o indicador | component.tabs.item.indicator-gap.default | --ds-tabs-item-indicator-gap-default |
| altura do indicador | component.tabs.indicator.height.default | --ds-tabs-indicator-height-default |
| tipografia do rótulo | component.tabs.label.{font-size,line-height,font-weight,letter-spacing}.default | --ds-tabs-label-*-default |
| espaçamento do painel | component.tabs.panel.padding-y.default | --ds-tabs-panel-padding-y-default |
| focus ring | component.focus-ring.{color.default,width} | --ds-focus-ring-color-default, --ds-focus-ring-width |
| raio do focus ring | component.tabs.focus-ring.radius.default | --ds-tabs-focus-ring-radius-default |
Uso
Quando usar
Boas práticas
Diretrizes de conteúdo
| Regra | Exemplo |
|---|---|
| Use substantivos como rotulos | "Overview", "Settings", "Activity" — não "View overview" ou "Go to settings" |
| Mesmo nível hierarquico | Todas as tabs devem representar categorias paralelas do mesmo conteúdo |
| Sem ícones sem texto | Sempre inclua um rotulo de texto — ícones sozinhos são ambíguos no contexto de tabs |
| Rotulos curtos (1-2 palavras) | "Pull Requests" — não "View all pull requests in this project" |
Relacionados
Composição React
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs"
<Tabs defaultValue="overview">
<TabsList aria-label="Seções do projeto">
<TabsTrigger value="overview">Visão geral</TabsTrigger>
<TabsTrigger value="team">Equipe</TabsTrigger>
</TabsList>
<TabsContent value="overview">Resumo do projeto.</TabsContent>
<TabsContent value="team">Equipe do projeto.</TabsContent>
</Tabs>Implementação
- Status
- Beta
- Distribuição
- Source via shadcn
Instalação
Configure o namespace uma única vez na integração React.
npx shadcn@latest add @tis/tabspnpm dlx shadcn@latest add @tis/tabsyarn dlx shadcn@latest add @tis/tabsbunx --bun shadcn@latest add @tis/tabsContrato público
- Item do registry
@tis/tabs- Provider
- Base UI
- Distribuição
- Source copiado para a aplicação
- Status
- Beta
Acessibilidade
Interação por teclado
| Tecla | Ação |
|---|---|
Tab | Move o foco para a lista de tabs, parando na tab ativa |
Arrow Left / Arrow Right | Move para a tab anterior / proxima (ativa automaticamente) |
Home | Move para a primeira tab |
End | Move para a ultima tab |
Tab (da lista) | Move o foco para o conteúdo do painel ativo |
Tabs desabilitadas são ignoradas na navegação por setas. Apenas a tab ativa está na sequência Tab (tabindex="0"); todas as outras tem tabindex="-1".
Accessibility
| Critério WCAG | Requisito | Status |
|---|---|---|
| 4.1.2 Name, Role, Value (A) | role="tablist", role="tab", role="tabpanel". aria-selected nas tabs. aria-controls / aria-labelledby vinculando tabs a paineis. | ✓ |
| 2.1.1 Keyboard (A) | Setas navegam entre tabs. Tab entra e sai da lista de tabs. | ✓ |
| 2.4.11 Focus Appearance (AA) | Focus ring visível na tab ativa quando focada. | ✓ |
role="tablist" — no container da lista de tabs.role="tab" — em cada button de tab.role="tabpanel" — em cada painel de conteúdo.aria-selected="true|false" — indica a tab ativa.aria-controls — em cada tab, apontando para o ID do painel correspondente.aria-labelledby — em cada painel, apontando para o ID da tab correspondente.aria-disabled="true" — em tabs desabilitadas.
Responsabilidade da saída
Preserve a semântica da Base UI e teste conteúdo real, foco visível e nomes acessíveis na aplicação consumidora.
Evidência de validação
Coberta pelo Storybook da saída independente e por verificações de browser, responsividade, teclado, Axe e bundle.