| Fill Default rgba(13,15,18,.32) · Hover rgba(31,33,40,.4) · Pressed rgba(8,10,13,.32) | --nash-surface-fill · --nash-surface-fill-hover · --nash-surface-fill-pressed | iguais, byte a byte — os três tokens já existiam |
| Stroke 1,5 por dentro, o par âmbar #FFB454 › #FF6B2C, "animado no código, congelado aqui", uma volta a cada 4,5s; 14% de alfa fora do arco | .nash-arco: o mesmo conic-gradient, degrau por degrau, a 5,5s (o dono alongou de 4,5 em 2026-09-04) | data-emphasis="primary": o arco no anel, --nash-button-arc-a/-b, 5,5s (--nash-motion-loop-arc). Uma por tela |
| "Ações secundárias usam a mesma placa com o stroke branco original" | anel branco 15 › 6 › 2 › 0 por máscara (.nash-surface, as três peças) | o padrão, sem atributo (secondary); ghost sem placa em repouso |
| 200 × 56, raio 24, respiro 26, gap 12 — um tamanho só | .nash-button 44 (--nash-target-loose), --small 32 (--nash-target-dense), --large 56, raio pílula | data-size="small|medium|large" = 32, 44, 56; o Figma é o large; raio 24 em todos (pílula a 32 e 44). --nash-button-height pra densidade de tela. O modificador BEM saiu |
| label: Archivo 15, branco · meta: 12, branco 58% | rótulo t4 a 500, sem meta | rótulo 15 a 500 (13 no small); meta 12 a 400 e 58% (11 no small), parte .nash-button-meta |
| State=Pressed | .nash-fx-press (0,98 em 100) + .nash-fx-ring-press (o anel sobe em 50, apaga em 300) | Pressed = :active: placa, 0,98 em 100, solta em 160; o anel de pressão é parte da peça (fecha e sobe em 50; abre e apaga em 300). Num botão a pressão não fica; o que fica é ARIA |
| Sem ligado, ocupado, foco, desabilitado | aria-pressed pelo .nash-fx-selected; ocupado por nashMotion.ocupado; :disabled a 35% | aria-pressed (accent no rótulo + halo + onda + aura, 540ms; depois respira; desligar em 600, a aura comida de dentro pra fora), aria-busy (arco de 1,8s; no primário sem salto; o clique é segurado), :focus-visible (anel + outline), :disabled (50%, o arco para). Estado é ARIA; nenhum data-estado. Pendentes no Figma |
| — | .nash-button--filled: placa cheia no accent, texto no contraste | saiu. A ênfase mais alta é primary, com o arco; o eixo do mapa é primary|secondary|ghost, sem material |
| — | .nash-fx-sweep + <i class="nash-surface-sweep">: o lampejo | .nash-button-sweep, parte da peça: o mesmo traço, 640ms, pelo lado de entrada (--nash-runtime-sweep-direction). O lampejo do kit continua nos cartões |
| — | .nash-fx-ring-complete + nashMotion.concluido(el): 700ms | complete(): os mesmos quadros no CSS, o disparo no JS. Efeito de um componente só não é camada (mapa, regra 9) |
| — | sete classes por botão: nash-fx-interactive nash-surface nash-arco nash-fx-press nash-fx-highlight nash-fx-sweep nash-fx-ring-press | uma: class="nash-button" + data-size + data-emphasis + ARIA. A peça é autossuficiente, como o Icon Button |
| Nome: Primary Button, label, meta, State | — | .nash-button, .nash-button-label, .nash-button-meta, data-state. O identificador é do mapa (docs/vocabulario-mapa.json): inglês, parte nash-<bloco>-<parte>, token --nash-button-*, runtime --nash-runtime-*, evento nash:toggle |
| Escala de tempo | --nash-tab-escala, --nash-text-input-escala, --nash-icon-button-time-scale, --nash-motion-scale | --nash-button-time-scale, com --nash-motion-scale da família como fallback |
| Movimento reduzido | .nash-reduzido; o Icon Button lê [data-motion="reduced"] | [data-motion="reduced"] num ancestral, o nome do vocabulário |