A maioria dos componentes de abas por aí carrega kilobytes de JavaScript para algo que o navegador já sabe fazer: gerenciar um estado selecionado entre várias opções. Isso é, literalmente, um grupo de radio buttons.
A ideia
Cada aba é um <label> associado a um <input type="radio"> oculto. Quando o radio é marcado, o CSS reage e mostra o painel correspondente. Zero JS, e de brinde você ganha navegação com as setas do teclado, que o grupo de radios já traz.
<label for="tab1">Aba 1</label>
<input id="tab1" name="tabs" type="radio" class="sr-only peer" checked />
O truque: :has()
O painel muda de estilo conforme o input irmão esteja marcado:
label:has(+ input:checked) {
color: white;
background: var(--primary);
}
:has(+ input:checked) se lê como “este label que tem, logo depois, um input marcado”. É o CSS olhando para frente.
Acessibilidade de verdade
Como o input continua focável (sr-only, não display:none), o teclado funciona. Só lembre de adicionar um anel de foco visível:
label:has(+ input:focus-visible) {
outline: 2px solid var(--primary);
}
Conclusão
Antes de instalar uma biblioteca, pergunte se o navegador já resolve o problema. Aqui, um <input> e um seletor moderno economizam todo o runtime.