Nash LLM
O harness de modelo.
A superfície de leitura: placa de texto a 72% com o vidro desfocado atrás, stroke de 1,5 por dentro a branco 18%, raio 20, padding 24, coluna de conteúdo com gap 16. O Figma desenha um tamanho e um estado (ponto, título, texto, meta e atalho); a peça define o resto: hover, pressão no cartão clicável, selecionado (aria-selected ou aria-current) com halo e aura, ocupado (aria-busy), foco, desabilitado, três densidades. O accent é o do modo, a mesma tabela das quatro peças anteriores. Os nomes são os do mapa de vocabulário.
O harness de modelo.
aria-current: o item atual, com o halo e a aura.
Gerando: a luz varre o cartão em laço.
data-size="small"
O quadro do Figma, congelado: não respondem ao ponteiro. Default como a referência desenhou; ao lado, o Hover, o Pressed e o Selecionado que a peça define e o Figma ainda não desenha. Em código, data-state e aria-selected.
O harness de modelo.
Anel de accent a 70%; o ponto a 55%.
Anel, halo e aura no accent.
Selecionado, ampliado 1,1×. Numerado é o que o CSS desenha; cotado é o que o Figma mede.
O harness de modelo.
Coluna a coluna: a medida do Figma, o que o kit já tinha, e o que a peça adotou. O identificador sai do mapa de vocabulário; o Figma dá a base.
| Figma 329:2821 | O kit | A peça |
|---|---|---|
| 320 × 151 · raio 20 · padding 24 · gap 16 | .nash-card: r4, e4, e3 | iguais; a largura é da página. data-size="small|medium|large" e --nash-card-padding/-gap/-radius pra densidade (o telemetria usa small) |
| Placa --nash-placa-texto rgba(13,15,18,.72) · blur 28 | nash-surface (a placa de 32%) | a placa de leitura a 72% (--nash-card-plate); blur --nash-vidro-blur com fallback 28 |
| Stroke 1,5 por dentro, branco 18% | o anel em degradê da .nash-surface | o stroke do Figma no ::before; o anel de accent no ::after |
| Ponto 6 + título 18/500 · texto 15/400 a 55% · rodapé mono 11/500 caixa alta | — | nash-card-header, -title, -text, -footer › -meta + -shortcut; o ponto é o .nash-dot do kit |
| Um estado | :hover::after acende | hover, pressão (a, button), aria-selected / aria-current, aria-busy, :focus-visible, aria-disabled. Pendentes no Figma |
| — | nash-fx-sweep + nash-surface-sweep no repouso | a varredura é o laço de aria-busy; em repouso o cartão não varre |
| Nomes: Cartão de vidro/peq, ponto, título, texto, meta, atalho | — | .nash-card, data-size, nash-card-<parte>, --nash-card-*, --nash-runtime-*, nash:select. O identificador é do mapa (docs/vocabulario-mapa.json) |
| Escala de tempo | --nash-escala | --nash-card-time-scale, com --nash-escala da família como fallback |
| Movimento reduzido | .nash-reduzido | [data-motion="reduced"] num ancestral, o nome do vocabulário |
Toda curva é a de saída do kit. Dois laços, cada um preso a um estado: a respiração de aria-selected (um número, --nash-card-breath, que o halo e a aura leem; ao desselecionar ele pausa onde está) e a varredura de aria-busy.
O anel de accent sobe a 70% em 260, a luz do cursor acende em 260 e o ponto vai a branco 55% em 160. A placa sobe a #1F2128 76% em 180, o stroke branco acende a 28% e o texto vai a branco em 140; um lampejo de luz a 6% atravessa o cartão uma vez, pelo lado por onde o ponteiro entrou, em 640.
O anel, a luz e o ponto.
Só o cartão clicável: a placa desce a #080A0D 72% e a casca vai a 0,99 em 100ms; solta em 160. Um article não aperta.
Selecionar: o stroke branco apaga em 180, o anel de accent acende em 260, o ponto toma o accent em 160; o halo da borda espera 120 e vai a 32px antes de assentar em 24 — a curva do ponto da aba — com uma onda que se abre a 18px, e a aura se abre até 24px em 420. Total: 540ms. Depois respira: halo e aura, laço de 1,8s. Desselecionar: stroke, anel e ponto voltam nos mesmos tempos; o halo apaga em 320; a aura é comida de dentro pra fora em 600 e a respiração pausa onde está. setSelected marca por programa e emite nash:select; o clique não seleciona (isso é OptionCard).
O harness de modelo.
Selecionar · 540ms
Desselecionar · 600ms
A luz do cursor vira uma varredura do accent a 14% que atravessa o cartão em 1,8s; o conteúdo baixa a 60%; o clique é segurado. Termina com o estado.
Opacidade 0 → 1 e 8px de baixo em 420ms, backwards; irmãos entram escalonados por --nash-runtime-index × 60ms (o mountAll escreve pela ordem). As variantes congeladas não entram.
1
2
3
Dois arquivos do kit. O CSS desenha tudo; o JS completa a aura e a luz, escreve a luz do cursor, cuida de aria-selected e aria-busy, e escalona a entrada.
<link rel="stylesheet" href="css/nash-card.css" />
<script src="js/nash-card.js"></script>
<article class="nash-card" data-mode="chat">
<div class="nash-card-header"><i class="nash-dot"></i><h3 class="nash-card-title">Nash LLM</h3></div>
<p class="nash-card-text">O harness de modelo.</p>
<div class="nash-card-footer"><span class="nash-card-meta">Harness</span><span class="nash-card-shortcut">⌘8</span></div>
</article>
const card = NashCard.mount('#c', { onSelect }) // o clique não seleciona: isso é OptionCard
card.setSelected(true) // aria-selected: anel, halo, aura; emite nash:select { selected }
card.setBusy(true) // aria-busy: varredura, clique segurado
NashCard.mountAll() // todo .nash-card; --nash-runtime-index pela ordem entre irmãos
O que fugiu do Figma ou do kit, e por quê.