Nash Tab Bar
← Design system · Componentes N.A.S.H. DS Tab 327:424 · Tab Bar 327:636

Tab Bar

modo no ar: Chatpasse o cursor · clique · setas ← →

As quinze variantes

O quadro do Figma, congelado: cinco modos por três estados. Estas abas não respondem ao ponteiro; são a referência que o trilho acima tem de reproduzir viva.

DefaultHoverActive

Anatomia

Uma aba aberta, ampliada 2,4×. O que está numerado é o que o CSS desenha; o que está cotado é o que o Figma mede.

40 × hug · raio 20 alvo 44 · stroke 1,5 por dentro
  1. O ponto, 6px.Branco 30% em repouso, 55% sob o ponteiro, accent do modo com halo de 16 a 48% quando o modo está no ar. É o sinal de estado; o rótulo só confirma.
  2. O rótulo, Archivo Regular 15.Branco 60% em repouso, 100% no hover e na aba aberta. Nunca quebra: rótulo de aba é curto por contrato.
  3. A placa.#0D0F12 a 32% com o vidro desfocado atrás. Sem placa em repouso: o trilho é o fundo. No hover a placa sobe pro #1F2128 a 40%.
  4. Os anéis.1,5px por dentro, de cima pra baixo: branco 15 › 6 › 2 › 0 no hover; accent 45 › 18 › 6 › 0 na aba aberta. Mesma geometria, só a cor muda.
  5. A luz do cursor.Uma luz de 80px na cor do modo, por dentro do vidro, e o anel aceso no ponto mais perto do ponteiro. Só existe com o ponteiro em cima.
  6. O alvo, 44px.Dois pixels a mais pra cima e pra baixo do que se vê. Pedido na descrição do componente.

O que se move

Cada gesto responde a uma pergunta: o que este movimento diz a quem usa? Toda curva é a de saída do kit, que entra rápido e assenta devagar. Nada balança, nada quica. Uma luz em laço só existe onde há estado que a justifique.

Ponteiro entra dá pra apertar

A placa sobe, o anel branco acende, o rótulo vai a branco e o ponto a 55%. Ao sair, tudo volta no mesmo tempo, sem pressa.

passe o cursor por uma aba fechada
propriedadede → paratempo
placanada → #1F2128 40%180ms
anel branco0 → 1180ms
rótulo60% → 100%140ms
ponto30% → 55%160ms

A luz do cursor é vidro

O vidro pega a luz de onde o ponteiro está: uma névoa de 80px na cor do modo por dentro da aba, e o anel da borda aceso no ponto mais próximo. Numa aba fechada a luz anuncia a cor do modo antes de ele abrir; na aba aberta ela é mais forte. O trilho também responde, em branco, só na borda. A luz escorrega atrás do cursor em 70ms e demora 260 pra deixar o vidro.

arraste o cursor devagar ao longo do trilho
camadacortempo
névoa da abaaccent 16% (aberta 22%, apertada 28%)260ms · segue em 70
anel da abaaccent 85%, 64px260ms
névoa do trilhobranco 5%, 120px260ms
anel do trilhobranco 45%, 96px260ms

Pressão registrou

A aba encolhe a 0,98 em 100ms e a placa assenta no #080A0D. O ponto encolhe a 0,8 enquanto o dedo está em cima: é a carga. Soltar numa aba fechada dispara a passagem, e o ponto floresce dali.

segure o botão apertado antes de soltar
propriedadede → paratempo
abascale 1 → 0,98100ms · solta em 160
placa→ #080A0D 32%100ms
pontoscale 1 → 0,8100ms · solta em 160
luz do cursor16% → 28%imediato

A passagem de uma aba à outra

Uma placa só, atrás das abas, vai de A a B. A aresta da frente chega em 85% do tempo e a de trás em 115%: a cápsula estica na direção do destino e assenta. Enquanto viaja, o anel dela troca de cor (o azul do Chat vira o roxo do Design no caminho) e deixa um halo por fora. A aba que fecha apaga no zero; a que abre acende o rótulo no zero e espera 120ms pra acender o ponto, que floresce a 24px antes de assentar em 16. Total: 440ms.

Teclado nunca anima

Setas, Home e End trocam de aba por corte: a placa aparece no destino, sem viagem. Quem navega por teclado já sabe pra onde foi; o movimento só atrasaria. O foco visível é um anel de 2px no accent do modo.

clique numa aba e use ← → Home End
teclafaz
← ↑a aba anterior, dando a volta
→ ↓a próxima, dando a volta
Home · Enda primeira · a última
Tabentra e sai do trilho pela aba aberta (tabindex que anda)

O pulso está no ar

O halo da aba aberta respira entre 55% e 90% da força, a cada 3,6 segundos, e nunca apaga. É o único laço da peça: o que faz o modo no ar parecer ligado, não pintado. Sob o ponteiro o halo abre um pouco mais.

olhe o ponto por alguns segundos
propriedadede → paratempo
halo (filho do ponto)opacidade 0,55 ↔ 0,93600ms, ease-in-out, laço
haloscale 1 ↔ 1,123600ms
ponto sob o ponteirohalo 16px → 20px320ms

A entrada uma vez

Ao montar, o trilho sobe 6px e assenta em 420ms; cada aba chega 40ms depois da anterior. O ponto da aba aberta floresce quando a fila termina, com a mesma animação da passagem.

quemde → paratempo
trilhoopacidade 0 → 1 · y 6 → 0 · scale 0,985 → 1420ms
aba nopacidade 0 → 1 · y 4 → 0420ms, começa em 60 + 40·n
ponto da abertafloresce320ms, começa em 120

Uso

Dois arquivos do kit, e é a única aba da casa: a coluna do Nash Workspace, os trilhos da Voz e da Música, o Nash Code, o PWA e a navegação do site são esta peça. Carregar o JS basta pra ter a placa e a luz: todo .nash-tab-bar da página é montado sozinho, deixando o estado com a página.

<link rel="stylesheet" href="css/nash-tab-bar.css" />   ← depois de nash-componentes.css
<nav class="nash-tab-bar" id="modos" aria-label="Modo"></nav>
<script src="js/nash-tab-bar.js"></script>

// a peça manda no estado: monta as abas da tabela, troca no clique e nas setas
const trilho = NashTabBar.montar('#modos', {
  ativa: 'chat',                       // ou a aba com aria-selected no HTML
  aoTrocar(modo, p) { /* p.de, p.para, p.direcao, p.origem, p.duracao */ }
})
trilho.ativar('design')                // pela API: viaja
trilho.el.addEventListener('nash-tab-troca', (e) => e.detail)

// variante congelada, pra documentação — não responde ao ponteiro:
<button class="nash-tab" data-mode="imagem" data-state="hover">
  <i class="nash-tab-alvo"></i><i class="nash-tab-luz"></i><i class="nash-dot"></i>
  <span class="nash-tab-rotulo">Imagem</span>
</button>

// a página manda no estado (o que a montagem automática faz):
NashTabBar.montar(el, { estado: 'pagina' })   // segue aria-selected, aria-pressed ou aria-current

// no trilho:  data-passagem="corte"  · data-pulso="off"  · nash-tab-bar--coluna  · --nash-tab-accent: …  · --nash-tab-escala: 4
// na aba:    data-mode="chat|voz|design|imagem|social"  · data-avulsa="true" (interruptor fora da placa que viaja)

Decisões