Tabs
Sistema de abas para organizar conteúdo em seções navegáveis com `mk-tabs`, `mk-tab` e `mk-tab-panel`.
O componente mk-tabs organiza conteúdo em seções navegáveis. É composto por três elementos: mk-tabs (contêiner raiz que gerencia estado e navegação por teclado), mk-tab (cada aba clicável, com ) e mk-tab-panel(painel de conteúdo associado a uma aba, com). O emparelhamento entre aba e painel é feito pelo atributo value — cada mk-tab e seu mk-tab-panel correspondente devem ter o mesmo value.
Padrão
A variante padrão é underline, que exibe uma linha indicadora animada abaixo da aba ativa e uma borda inferior separando a lista de abas do conteúdo.
import { MkTabs, MkTab, MkTabPanel } from '@db1/makuco-ui-react';
<MkTabs value="tab1">
<MkTab value="tab1">Aba 1</MkTab>
<MkTab value="tab2">Aba 2</MkTab>
<MkTabPanel value="tab1">Conteúdo da Aba 1</MkTabPanel>
<MkTabPanel value="tab2">Conteúdo da Aba 2</MkTabPanel>
</MkTabs><mk-tabs value="tab1">
<mk-tab value="tab1">Aba 1</mk-tab>
<mk-tab value="tab2">Aba 2</mk-tab>
<mk-tab-panel value="tab1">Conteúdo da Aba 1</mk-tab-panel>
<mk-tab-panel value="tab2">Conteúdo da Aba 2</mk-tab-panel>
</mk-tabs>Variante Pill
A aba ativa recebe um fundo preenchido com cor de marca e bordas completamente arredondadas.
<MkTabs variant="pill" value="tab1">
<MkTab value="tab1">Aba 1</MkTab>
<MkTab value="tab2">Aba 2</MkTab>
<MkTabPanel value="tab1">Conteúdo da Aba 1</MkTabPanel>
<MkTabPanel value="tab2">Conteúdo da Aba 2</MkTabPanel>
</MkTabs><mk-tabs variant="pill" value="tab1">
<mk-tab value="tab1">Aba 1</mk-tab>
<mk-tab value="tab2">Aba 2</mk-tab>
<mk-tab-panel value="tab1">Conteúdo da Aba 1</mk-tab-panel>
<mk-tab-panel value="tab2">Conteúdo da Aba 2</mk-tab-panel>
</mk-tabs>Com ícone e badge
As abas podem conter ícones antes do rótulo e badges para indicar contagem ou status.
import { MkTabs, MkTab, MkTabPanel } from '@db1/makuco-ui-react';
import { MkIcon } from '@db1/makuco-ui-react';
import { MkBadge } from '@db1/makuco-ui-react';
<MkTabs value="tab1">
<MkTab value="tab1">
<MkIcon name="info" /> Tab 1 <MkBadge value="5"></MkBadge>
</MkTab>
<MkTab value="tab2">Tab 2</MkTab>
<MkTabPanel value="tab1">Conteúdo da Aba 1</MkTabPanel>
<MkTabPanel value="tab2">Conteúdo da Aba 2</MkTabPanel>
</MkTabs><mk-tabs value="tab1">
<mk-tab value="tab1">
<mk-icon name="info"></mk-icon>
Tab 1
<mk-badge value="5"></mk-badge>
</mk-tab>
<mk-tab value="tab2">Tab 2</mk-tab>
<mk-tab-panel value="tab1">Conteúdo da Aba 1</mk-tab-panel>
<mk-tab-panel value="tab2">Conteúdo da Aba 2</mk-tab-panel>
</mk-tabs>Aba desabilitada
Uma aba individual pode ser desabilitada via disabled no mk-tab. A aba desabilitada não pode ser selecionada por clique ou teclado.
<MkTabs value="tab1">
<MkTab value="tab1">Aba 1</MkTab>
<MkTab value="tab2" disabled>Aba 2</MkTab>
<MkTabPanel value="tab1">Conteúdo da Aba 1</MkTabPanel>
<MkTabPanel value="tab2">Conteúdo da Aba 2</MkTabPanel>
</MkTabs><mk-tabs value="tab1">
<mk-tab value="tab1">Aba 1</mk-tab>
<mk-tab value="tab2" disabled>Aba 2</mk-tab>
<mk-tab-panel value="tab1">Conteúdo da Aba 1</mk-tab-panel>
<mk-tab-panel value="tab2">Conteúdo da Aba 2</mk-tab-panel>
</mk-tabs>Rolagem das abas
Quando as abas não cabem na largura do componente, a lista rola na horizontal e setas aparecem nas pontas. Cada seta só existe quando há abas escondidas do seu lado: no começo, só a seta final; no meio, as duas; no fim, só a inicial. Se tudo cabe, nenhuma seta aparece.
Um clique na seta rola a lista em pouco menos que a largura visível, com animação (sem animação sob prefers-reduced-motion: reduce). A aba ativa é rolada para a vista ao ser selecionada por clique ou por teclado. Vale para as variantes underline e pill. Em RTL as setas seguem o começo e o fim lógicos da lista; o indicador deslizante da variante underline continua só em LTR. O nome acessível das setas segue o locale do mk-tabs.
Props — mk-tabs
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
value | string | "" | Valor da aba atualmente selecionada. Deve corresponder ao value de um mk-tab filho. Se não fornecido, a primeira aba habilitada é selecionada automaticamente. |
label | string | undefined | Nome acessível da lista de abas, aplicado como aria-label do tablist. |
locale | string | undefined | Tag de locale BCP 47 que define o idioma do nome acessível das setas de rolagem (pt, es, en). Recai para o atributo lang do ancestral mais próximo, depois <html lang>, e por fim pt-BR. |
variant | "underline" | "pill" | "underline" | Variante visual das abas. "underline" exibe uma linha indicadora abaixo da aba ativa; "pill" exibe um fundo preenchido com bordas arredondadas. |
Props — mk-tab
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
value | string | "" | Valor único que identifica esta aba dentro do grupo. Deve corresponder ao value do mk-tab-panel emparelhado. |
disabled | boolean | false | Desabilita a aba, impedindo a seleção por clique ou teclado. |
Props — mk-tab-panel
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
value | string | "" | Valor que identifica este painel. Deve corresponder ao value da mk-tab emparelhada. |
Eventos
| Evento | Componente | Payload | Descrição |
|---|---|---|---|
mkChange | mk-tabs | { index: number, value: string } | Emitido sempre que o usuário troca de aba. index é a posição da nova aba (baseada em zero) e value é o valor da aba selecionada. |
mkChange de campos dentro do painel
O mkChange de mk-input, mk-select, mk-checkbox e dos demais campos é composed e borbulha. Dentro de um mk-tab-panel, ele chega ao listener mkChange do mk-tabs com o detail do campo no lugar de { index, value }. Trate a troca de aba só quando o evento vier do próprio mk-tabs:
<MkTabs
value={aba}
onMkChange={(event) => {
if (event.target !== event.currentTarget) return;
setAba(event.detail.value);
}}
>
…
</MkTabs><mk-tabs [value]="aba" (mkChange)="$event.target === $event.currentTarget && (aba = $event.detail.value)">
…
</mk-tabs>tabs.addEventListener('mkChange', (event) => {
if (event.target !== event.currentTarget) return;
aba = event.detail.value;
});Slots
| Componente | Slot | Descrição |
|---|---|---|
mk-tabs | tab | Instâncias de mk-tab. Aparecem na barra de navegação. |
mk-tabs | panel | Instâncias de mk-tab-panel. Aparecem abaixo da barra de navegação. |
mk-tab | (default) | Rótulo da aba. |
mk-tab-panel | (default) | Conteúdo do painel. |
Acessibilidade
- O contêiner de abas usa
role="tablist";labelfornece o nome acessível. - As setas de rolagem são botões com nome acessível traduzido pelo
locale("Rolar abas para a esquerda" e "Rolar abas para a direita") e entram na ordem deTabantes e depois da lista de abas, enquanto estão visíveis. As setas de rolagem são um auxílio para mouse e toque: revelam as abas escondidas pela rolagem. Quem usa o teclado navega pelas setas do teclado entre as abas, e a aba focada rola para a vista. Se a seta focada desaparece ao chegar na ponta, o foco volta ao documento. - Só a aba selecionada fica na ordem de
Tab(roving tabindex); as demais são alcançadas pelas setas. - Cada
mk-tabrenderiza um<button>nativo comrole="tab",aria-selectedearia-disabled. - Cada
mk-tab-panelusarole="tabpanel"earia-hiddenpara indicar visibilidade. - Abas com
disabledsão ignoradas na navegação por teclado.
| Tecla | Comportamento |
|---|---|
Tab / Shift+Tab | Entra na aba selecionada e sai da lista de abas. |
ArrowRight | Seleciona a próxima aba habilitada. |
ArrowLeft | Seleciona a aba habilitada anterior. |
Home | Seleciona a primeira aba habilitada. |
End | Seleciona a última aba habilitada. |
Enter / Space | Seleciona a aba focada (quando o foco está em uma aba não selecionada). |