# Tokens

Os nomes de todo valor do Feitio: de onde vêm, como usar no CSS e no TypeScript, e a lista inteira.

## O que são

Todo valor do Feitio (cor, espaço, letra, canto, duração) é um token com nome. Ninguém escreve um valor à mão: escreve o nome, e o valor vem do tema e do modo.

## De onde vêm

-   A fonte é JSON no formato aberto [DTCG](https://www.designtokens.org/), em `tokens/`: `base.tokens.json` para o que não muda com o tema, e um arquivo por tema e modo em `tokens/themes/`.
-   `bun run build` gera as variáveis CSS (`css/tokens.css`) e os nomes em TypeScript (`js/tokens.ts`).
-   `bun run check` testa o contraste de cada par de cor e se toda cor cabe numa tela comum (sRGB).

## Como usar

### CSS

```css
.minha-area {
  padding: var(--feitio-space-5) var(--feitio-space-4);
  border-radius: var(--feitio-radius);
  background: var(--feitio-color-surface-raised);
}
```

### TypeScript

`js/tokens.ts` exporta cada nome com a variável dele, e o tipo `TokenName`: um nome errado não compila.

```jsx
import { tokens, type TokenName } from '@feitio/core/js/tokens.ts';

const gap: TokenName = 'space.4';
element.style.gap = tokens[gap];   // 'var(--feitio-space-4)'
```

## Os tokens de base

Os mesmos em todo tema e modo.

Token

Valor

Grupo

`--feitio-font-text`

`"Alegreya", "Georgia", serif`

Letra

`--feitio-font-ui`

`"Alegreya Sans", "Gill Sans", sans-serif`

Letra

`--feitio-font-weight-regular`

`400`

Letra

`--feitio-font-weight-medium`

`500`

Letra

`--feitio-font-weight-bold`

`700`

Letra

`--feitio-font-weight-heavy`

`800`

Letra

`--feitio-font-size-small`

`1rem`

Letra

`--feitio-font-size-body`

`1.25rem`

Letra

`--feitio-font-size-h3`

`1.5rem`

Letra

`--feitio-font-size-h2`

`2rem`

Letra

`--feitio-font-size-h1`

`2.75rem`

Letra

`--feitio-font-size-display`

`4rem`

Letra

`--feitio-line-height-text`

`1.6`

Entrelinha

`--feitio-line-height-heading`

`1.08`

Entrelinha

`--feitio-space-1`

`0.25rem`

Espaço

`--feitio-space-2`

`0.5rem`

Espaço

`--feitio-space-3`

`1rem`

Espaço

`--feitio-space-4`

`1.5rem`

Espaço

`--feitio-space-5`

`2.5rem`

Espaço

`--feitio-space-6`

`4rem`

Espaço

`--feitio-space-7`

`6rem`

Espaço

`--feitio-measure-reading`

`46rem`

Medida

`--feitio-radius-top-left`

`6px`

Cantos

`--feitio-radius-top-right`

`10px`

Cantos

`--feitio-radius-bottom-right`

`6px`

Cantos

`--feitio-radius-bottom-left`

`8px`

Cantos

`--feitio-border-width`

`1px`

Traço

`--feitio-focus-width`

`3px`

Foco

`--feitio-focus-offset`

`3px`

Foco

`--feitio-duration-place`

`260ms`

Duração

`--feitio-duration-change`

`320ms`

Duração

`--feitio-easing-place`

`cubic-bezier(0.2, 0.9, 0.3, 1.25)`

Curva

`--feitio-easing-change`

`cubic-bezier(0.3, 0, 0.2, 1)`

Curva

## Os papéis de cor

Os valores da casa, de dia e à noite. Uma fachada preenche os mesmos nomes com outros valores.

Token

Dia

Noite

`--feitio-color-surface`

`oklch(96% 0.018 80)`

`oklch(22% 0.016 55)`

`--feitio-color-surface-raised`

`oklch(92.5% 0.026 76)`

`oklch(27.5% 0.02 55)`

`--feitio-color-surface-top`

`oklch(98.5% 0.01 85)`

`oklch(31% 0.022 55)`

`--feitio-color-text`

`oklch(26% 0.022 55)`

`oklch(93% 0.022 80)`

`--feitio-color-text-soft`

`oklch(46% 0.025 55)`

`oklch(76% 0.03 72)`

`--feitio-color-accent`

`oklch(54% 0.165 40)`

`oklch(54% 0.165 40)`

`--feitio-color-accent-strong`

`oklch(50% 0.16 38)`

`oklch(77% 0.15 52)`

`--feitio-color-on-accent`

`oklch(97% 0.015 80)`

`oklch(97% 0.015 80)`

`--feitio-color-line`

`oklch(26% 0.022 55 / 0.15)`

`oklch(93% 0.022 80 / 0.15)`

`--feitio-color-shadow`

`oklch(26% 0.022 55 / 0.9)`

`oklch(12% 0.01 55 / 0.95)`

`--feitio-color-ok`

`oklch(45% 0.09 140)`

`oklch(78% 0.1 140)`

`--feitio-color-ok-surface`

`oklch(91% 0.04 135)`

`oklch(30% 0.04 140)`

`--feitio-color-warn`

`oklch(50% 0.1 85)`

`oklch(83% 0.11 88)`

`--feitio-color-warn-surface`

`oklch(92% 0.06 90)`

`oklch(32% 0.05 85)`

`--feitio-color-error`

`oklch(45% 0.15 15)`

`oklch(76% 0.12 15)`

`--feitio-color-error-surface`

`oklch(91% 0.04 15)`

`oklch(31% 0.06 15)`

## Regras

-   Nada de valor escrito à mão onde existe um token.
-   Um token novo entra no JSON, nunca no CSS gerado: o build sobrescreve o que for editado à mão.
-   Cor nova passa pelo teste de contraste antes de entrar.
