Design System
O sistema por trás de cada pixel da HENVARA
Tokens, escala tipográfica, componentes e regras de qualidade. Esta página é gerada a partir do mesmo código que renderiza o site.
Design System
Tokens, escala tipográfica, componentes e regras de qualidade. Esta página é gerada a partir do mesmo código que renderiza o site.
Princípios
Cores, espaçamento, tipografia e movimento nascem de um único arquivo de tokens. O CSS é gerado, nunca escrito à mão.
Componentes usam papéis (surface, content-muted), não cores. Trocar o tema é trocar valores, não reescrever telas.
Pares de cor têm contraste verificado por teste; exceções são documentadas, nunca silenciosas.
Um lint de tokens falha o pipeline quando surgem hexadecimais, medidas soltas ou classes fora do sistema.
Fundamentos
Primitivos guardam o valor bruto da marca. Papéis semânticos dizem para que a cor serve. Tokens de componente ligam o papel a um uso específico.
blue-300
#5ea2ff
blue-400
#5b8def
blue-50
#e8f1ff
blue-500
#1677ff
blue-700
#0b5bd3
gray-200
#dbe3ee
gray-300
#c3cfdf
gray-50
#f5f7fa
green-400
#2ad9ad
green-500
#00c896
green-700
#007a5e
navy-500
#2a4a72
navy-600
#1c3a5e
navy-800
#0a2540
navy-900
#0a1628
red-300
#ff8f8f
red-700
#c62828
slate-200
#b4c2d6
slate-400
#7a8aa0
slate-600
#475569
white
#ffffff
| Papel | Classe Tailwind | Claro | Escuro |
|---|---|---|---|
| background | bg-background | white · #ffffff | navy-900 · #0a1628 |
| foreground | bg-foreground | navy-900 · #0a1628 | gray-50 · #f5f7fa |
| card | bg-card | white · #ffffff | navy-800 · #0a2540 |
| card-foreground | bg-card-foreground | navy-900 · #0a1628 | gray-50 · #f5f7fa |
| popover | bg-popover | white · #ffffff | navy-800 · #0a2540 |
| popover-foreground | bg-popover-foreground | navy-900 · #0a1628 | gray-50 · #f5f7fa |
| primary | bg-primary | navy-800 · #0a2540 | blue-700 · #0b5bd3 |
| primary-foreground | bg-primary-foreground | white · #ffffff | white · #ffffff |
| secondary | bg-secondary | gray-50 · #f5f7fa | navy-800 · #0a2540 |
| secondary-foreground | bg-secondary-foreground | navy-800 · #0a2540 | gray-50 · #f5f7fa |
| muted | bg-muted | gray-50 · #f5f7fa | navy-800 · #0a2540 |
| muted-foreground | bg-muted-foreground | slate-600 · #475569 | slate-200 · #b4c2d6 |
| accent | bg-accent | blue-50 · #e8f1ff | navy-600 · #1c3a5e |
| accent-foreground | bg-accent-foreground | navy-800 · #0a2540 | white · #ffffff |
| destructive | bg-destructive | red-700 · #c62828 | red-300 · #ff8f8f |
| border | bg-border | gray-200 · #dbe3ee | navy-600 · #1c3a5e |
| border-strong | bg-border-strong | slate-400 · #7a8aa0 | slate-400 · #7a8aa0 |
| input | bg-input | gray-300 · #c3cfdf | navy-500 · #2a4a72 |
| ring | bg-ring | blue-500 · #1677ff | blue-300 · #5ea2ff |
| chart-1 | bg-chart-1 | blue-500 · #1677ff | blue-500 · #1677ff |
| chart-2 | bg-chart-2 | green-500 · #00c896 | green-500 · #00c896 |
| chart-3 | bg-chart-3 | navy-800 · #0a2540 | navy-800 · #0a2540 |
| chart-4 | bg-chart-4 | blue-400 · #5b8def | blue-400 · #5b8def |
| chart-5 | bg-chart-5 | slate-400 · #7a8aa0 | slate-400 · #7a8aa0 |
| brand-blue | bg-brand-blue | blue-500 · #1677ff | blue-500 · #1677ff |
| brand-blue-soft | bg-brand-blue-soft | blue-300 · #5ea2ff | blue-300 · #5ea2ff |
| brand-green | bg-brand-green | green-500 · #00c896 | green-500 · #00c896 |
| surface | bg-surface | white · #ffffff | navy-900 · #0a1628 |
| surface-subtle | bg-surface-subtle | gray-50 · #f5f7fa | navy-800 · #0a2540 |
| surface-accent | bg-surface-accent | blue-50 · #e8f1ff | navy-600 · #1c3a5e |
| surface-brand | bg-surface-brand | navy-800 · #0a2540 | navy-800 · #0a2540 |
| surface-inverse | bg-surface-inverse | navy-900 · #0a1628 | navy-900 · #0a1628 |
| content-strong | bg-content-strong | navy-800 · #0a2540 | white · #ffffff |
| content-muted | bg-content-muted | slate-600 · #475569 | slate-200 · #b4c2d6 |
| content-inverse | bg-content-inverse | white · #ffffff | white · #ffffff |
| content-inverse-muted | bg-content-inverse-muted | slate-200 · #b4c2d6 | slate-200 · #b4c2d6 |
| content-link | bg-content-link | blue-700 · #0b5bd3 | blue-300 · #5ea2ff |
| content-success | bg-content-success | green-700 · #007a5e | green-500 · #00c896 |
| content-error | bg-content-error | red-700 · #c62828 | red-300 · #ff8f8f |
| content-eyebrow | bg-content-eyebrow | green-500 · #00c896 | green-500 · #00c896 |
| action-accent | bg-action-accent | green-500 · #00c896 | green-500 · #00c896 |
| action-accent-hover | bg-action-accent-hover | green-400 · #2ad9ad | green-400 · #2ad9ad |
| action-accent-foreground | bg-action-accent-foreground | navy-900 · #0a1628 | navy-900 · #0a1628 |
Pares do tema claro, checados automaticamente a cada mudança nos tokens.
| Texto | Fundo | Razão | Resultado |
|---|---|---|---|
| foreground | background | 18.13:1 | AA ✔ |
| content-strong | surface | 15.54:1 | AA ✔ |
| content-strong | surface-subtle | 14.48:1 | AA ✔ |
| content-muted | surface | 7.58:1 | AA ✔ |
| content-muted | surface-subtle | 7.06:1 | AA ✔ |
| content-muted | surface-accent | 6.66:1 | AA ✔ |
| content-link | surface | 6.08:1 | AA ✔ |
| content-success | surface | 5.32:1 | AA ✔ |
| content-inverse | surface-inverse | 18.13:1 | AA ✔ |
| content-inverse | surface-brand | 15.54:1 | AA ✔ |
| content-inverse-muted | surface-inverse | 10.04:1 | AA ✔ |
| content-inverse-muted | surface-brand | 8.60:1 | AA ✔ |
| action-accent-foreground | action-accent | 8.38:1 | AA ✔ |
| content-eyebrow | surface-inverse | 8.38:1 | AA ✔ |
| content-eyebrow | surface-brand | 7.18:1 | AA ✔ |
| content-eyebrow | surface | 2.16:1 | Exceção documentadaDecisão de marca: o verde #00C896 exato nos rótulos (eyebrow). Contraste ~2:1 sobre branco, abaixo do AA. Para corrigir, aponte `content-eyebrow` para `green-700` no tema claro. |
| content-eyebrow | surface-subtle | 2.02:1 | Exceção documentadaMesma decisão de marca do rótulo (eyebrow) sobre fundo claro. |
Fundamentos
Sora nos títulos e Inter nos textos. Telas usam type-* (ou Heading e Text), nunca tamanhos soltos.
type-display
2.25rem → 3rem → 3.75rem · lh 1.08 · 700
Título principal da Home
Transformando ideias em soluções inteligentes
type-h1
2.25rem → 3rem · lh 1.1 · 700
Título das páginas internas
Transformando ideias em soluções inteligentes
type-statement
1.875rem → 3rem · lh 1.2 → 1 · 700
Chamada final (CTA)
Transformando ideias em soluções inteligentes
type-h2
1.875rem → 2.25rem · lh 1.2 → 1.1111 · 700
Título de seção
Transformando ideias em soluções inteligentes
type-title-lg
1.5rem · lh 1.33 · 600
Título de bloco grande
Transformando ideias em soluções inteligentes
type-title
1.25rem · lh 1.4 · 600
Título de cartão destacado
Transformando ideias em soluções inteligentes
type-h3
1.125rem · lh 1.5556 · 600
Título de cartão
Transformando ideias em soluções inteligentes
type-lead
1.125rem · lh 1.625
Texto de apoio sob títulos
Transformando ideias em soluções inteligentes
type-body
1rem · lh 1.5
Texto corrido
Transformando ideias em soluções inteligentes
type-small
0.875rem · lh 1.4286
Texto secundário, navegação
Transformando ideias em soluções inteligentes
type-caption
0.75rem · lh 1.3333
Notas, rótulos de badge
Transformando ideias em soluções inteligentes
type-eyebrow
0.875rem · lh 1.4286 · 700
Rótulo acima de títulos
Transformando ideias em soluções inteligentes
type-label
0.875rem · lh 1.4286 · 600
Cabeçalhos de rodapé e listas
Transformando ideias em soluções inteligentes
Fundamentos
--space-gutter 1.5rem
--space-section 6rem
--space-section-hero 7rem
--space-page-hero-top 2.5rem
--space-page-hero-bottom 5rem
--space-page-hero-bottom-lg 6rem
--space-stage 3.5rem
--motion-fast
0.2s · ease-brand
--motion-base
0.35s · ease-brand
--motion-slow
0.8s · ease-brand
Todas as animações respeitam prefers-reduced-motion.
Componentes
Primitivos (ui), compostos (shared) e padrões de seção (sections). O catálogo completo, com estados e testes, está no Storybook.
Eyebrow
Superfície base com spotlight que segue o ponteiro.
Variantes do componente Logo, cada uma indicada para uma superfície.
Governança
O sistema só continua sendo sistema se alguém confere. Estas verificações rodam em cada alteração.
npm run tokens:check
O CSS gerado precisa corresponder ao tokens.json.
npm run lint:ds
Falha com hex, rgb, medidas arbitrárias, tamanhos de texto soltos ou cores legadas.
npm run test
Componentes, tokens e contraste (Vitest + Testing Library).
npm run test:e2e
Acessibilidade com axe e regressão visual em Playwright.