@lugom.io/hefesto 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agents/hefesto-argos.md +279 -0
- package/agents/hefesto-athena.md +379 -0
- package/agents/hefesto-hermes.md +128 -0
- package/bin/install.js +54 -20
- package/package.json +3 -3
- package/skills/hefesto-context/SKILL.md +28 -8
- package/skills/hefesto-design/SKILL.md +194 -0
- package/skills/hefesto-design/data/animations.csv +21 -0
- package/skills/hefesto-design/data/anti-patterns.csv +41 -0
- package/skills/hefesto-design/data/charts.csv +26 -0
- package/skills/hefesto-design/data/colors.csv +108 -0
- package/skills/hefesto-design/data/components.csv +31 -0
- package/skills/hefesto-design/data/google-fonts.csv +56 -0
- package/skills/hefesto-design/data/icons.csv +23 -0
- package/skills/hefesto-design/data/landing-pages.csv +28 -0
- package/skills/hefesto-design/data/products.csv +46 -0
- package/skills/hefesto-design/data/spacing.csv +16 -0
- package/skills/hefesto-design/data/styles.csv +53 -0
- package/skills/hefesto-design/data/typography.csv +41 -0
- package/skills/hefesto-design/data/ux-rules.csv +61 -0
- package/skills/hefesto-design/references/accessibility.md +335 -0
- package/skills/hefesto-design/references/aesthetics.md +343 -0
- package/skills/hefesto-design/references/anti-patterns.md +107 -0
- package/skills/hefesto-design/references/checklist.md +66 -0
- package/skills/hefesto-design/references/color-psychology.md +203 -0
- package/skills/hefesto-design/references/component-specs.md +318 -0
- package/skills/hefesto-design/references/polish.md +339 -0
- package/skills/hefesto-design/references/token-architecture.md +394 -0
- package/skills/hefesto-design/references/ux-rules.md +349 -0
- package/skills/hefesto-design/scripts/__pycache__/audit.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/contrast.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/search.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/validate_tokens.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/audit.py +450 -0
- package/skills/hefesto-design/scripts/contrast.py +195 -0
- package/skills/hefesto-design/scripts/core.py +155 -0
- package/skills/hefesto-design/scripts/design_system.py +311 -0
- package/skills/hefesto-design/scripts/search.py +235 -0
- package/skills/hefesto-design/scripts/validate_tokens.py +274 -0
- package/{commands/hefesto/init.md → skills/hefesto-init/SKILL.md} +5 -2
- package/{commands/hefesto/new-feature.md → skills/hefesto-new-feature/SKILL.md} +5 -2
- package/{commands/hefesto/update.md → skills/hefesto-update/SKILL.md} +6 -3
- package/templates/DESIGN.md +137 -0
- package/templates/RECON.md +54 -0
- package/templates/RESEARCH.md +22 -25
- package/templates/STATE.md +1 -1
- package/templates/VERDICT.md +52 -0
- package/agents/.gitkeep +0 -0
- package/agents/hefesto-researcher.md +0 -180
- package/commands/hefesto/status.md +0 -46
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Psicologia das Cores e Aplicação
|
|
2
|
+
|
|
3
|
+
## Tabela de Significados
|
|
4
|
+
|
|
5
|
+
| Cor | Emoção primária | Emoção secundária | Indústrias |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| Azul | Confiança, segurança | Calma, profissionalismo | Finanças, tech, saúde, corporate |
|
|
8
|
+
| Verde | Crescimento, natureza | Saúde, dinheiro, equilíbrio | Sustentabilidade, saúde, fintech, agro |
|
|
9
|
+
| Vermelho | Urgência, paixão | Energia, perigo, apetite | Food, entretenimento, vendas, alertas |
|
|
10
|
+
| Amarelo | Otimismo, atenção | Calor, cautela | Infantil, food delivery, avisos |
|
|
11
|
+
| Laranja | Entusiasmo, criatividade | Acessibilidade, energia | Startups, food, esportes, CTA buttons |
|
|
12
|
+
| Roxo | Luxo, criatividade | Mistério, espiritualidade | Beleza, tech premium, gaming, wellness |
|
|
13
|
+
| Rosa | Carinho, feminilidade | Calma, doçura | Beleza, moda, saúde feminina, dating |
|
|
14
|
+
| Preto | Sofisticação, poder | Elegância, exclusividade | Luxo, moda, tech, editorial premium |
|
|
15
|
+
| Branco | Pureza, simplicidade | Limpeza, espaço | Saúde, tech minimalista, casamento |
|
|
16
|
+
| Cinza | Neutralidade, maturidade | Estabilidade, equilíbrio | Corporate, industrial, tech B2B |
|
|
17
|
+
| Marrom | Estabilidade, terra | Conforto, tradição | Café, artesanal, outdoor, jurídico |
|
|
18
|
+
| Dourado | Prestígio, qualidade | Riqueza, tradição | Luxo, finanças premium, awards |
|
|
19
|
+
| Ciano/Teal | Clareza, frescor | Modernidade, equilíbrio | Tech, saúde digital, fintech |
|
|
20
|
+
| Coral | Calor, energia | Acessibilidade, otimismo | Lifestyle, wellness, social |
|
|
21
|
+
| Indigo | Integridade, intuição | Profundidade, sabedoria | Tech, educação, fintech |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Regra 60/30/10
|
|
26
|
+
|
|
27
|
+
Distribuição clássica para equilíbrio visual:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌──────────────────────────────────────────────────┐
|
|
31
|
+
│ │
|
|
32
|
+
│ 60% — COR DOMINANTE │
|
|
33
|
+
│ (fundo, superfícies, base visual) │
|
|
34
|
+
│ │
|
|
35
|
+
│ ┌────────────────────────────────┐ │
|
|
36
|
+
│ │ │ │
|
|
37
|
+
│ │ 30% — COR SECUNDÁRIA │ │
|
|
38
|
+
│ │ (cards, seções, sidebar) │ │
|
|
39
|
+
│ │ │ │
|
|
40
|
+
│ │ ┌──────────────┐ │ │
|
|
41
|
+
│ │ │ 10% — ACENTO │ │ │
|
|
42
|
+
│ │ │ (CTA, links, │ │ │
|
|
43
|
+
│ │ │ ícones) │ │ │
|
|
44
|
+
│ │ └──────────────┘ │ │
|
|
45
|
+
│ └────────────────────────────────┘ │
|
|
46
|
+
└──────────────────────────────────────────────────┘
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- **60% dominante**: geralmente branco, off-white, ou cinza claro (light) / cinza escuro (dark). É o respiro.
|
|
50
|
+
- **30% secundária**: containers, headers, cards, sidebars. Cria estrutura.
|
|
51
|
+
- **10% acento**: botões primários, links, ícones de destaque, badges. Direciona atenção.
|
|
52
|
+
|
|
53
|
+
Erro comum: tratar o acento como 30% → interface gritante e cansativa.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Modos de Combinação
|
|
58
|
+
|
|
59
|
+
### Complementar
|
|
60
|
+
Cores opostas na roda (azul ↔ laranja). Máximo contraste. Usar com cautela — funciona para CTA que precisa se destacar do fundo.
|
|
61
|
+
|
|
62
|
+
### Análogo
|
|
63
|
+
Cores vizinhas na roda (azul, azul-verde, verde). Harmônico e sereno. Pouco contraste — precisa de cor neutra para âncora.
|
|
64
|
+
|
|
65
|
+
### Split-complementar
|
|
66
|
+
Uma cor + as duas vizinhas da complementar. Contraste alto mas menos tensão que complementar pura. Versátil e difícil de errar.
|
|
67
|
+
|
|
68
|
+
### Triádico
|
|
69
|
+
Três cores equidistantes na roda (vermelho, amarelo, azul). Vibrante e equilibrado. Funciona se uma domina e as outras são acento.
|
|
70
|
+
|
|
71
|
+
### Monocromático
|
|
72
|
+
Uma cor em diferentes lightness/saturação. Elegante, coeso, seguro. Risco: monotonia. Resolver com um acento de cor diferente.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Cores por Indústria
|
|
77
|
+
|
|
78
|
+
### Fintech / Banking
|
|
79
|
+
- **Primária**: Azul (confiança) ou verde (dinheiro/crescimento)
|
|
80
|
+
- **Secundária**: Cinza neutro, branco limpo
|
|
81
|
+
- **Acento**: Verde para positivo, vermelho para negativo/alerta
|
|
82
|
+
- **Evitar**: Vermelho como primária (associação com perda), cores infantis
|
|
83
|
+
- **Referências**: Nubank (roxo — diferenciação), Stripe (roxo/índigo), Mercury (preto/branco)
|
|
84
|
+
|
|
85
|
+
### Saúde / Wellness
|
|
86
|
+
- **Primária**: Azul claro (calma), verde (saúde), branco (limpeza)
|
|
87
|
+
- **Secundária**: Tons pastéis, off-white quente
|
|
88
|
+
- **Acento**: Verde para ações, azul para informação
|
|
89
|
+
- **Evitar**: Vermelho dominante (sangue/emergência), preto pesado, neon
|
|
90
|
+
- **Referências**: Headspace (laranja/azul), Calm (azul escuro/gradientes)
|
|
91
|
+
|
|
92
|
+
### Tech / SaaS
|
|
93
|
+
- **Primária**: Azul (95% do mercado) ou roxo (diferenciação)
|
|
94
|
+
- **Secundária**: Cinza neutro para interface
|
|
95
|
+
- **Acento**: Saturado para CTAs
|
|
96
|
+
- **Oportunidade**: fugir do azul. Linear (roxo), Vercel (preto), Notion (off-white)
|
|
97
|
+
- **Evitar**: Gradientes AI roxo-rosa-azul (clichê saturado desde 2023)
|
|
98
|
+
|
|
99
|
+
### Food / Restaurantes
|
|
100
|
+
- **Primária**: Vermelho (apetite), laranja (energia), amarelo (calor)
|
|
101
|
+
- **Secundária**: Marrom (craft), verde (orgânico/saudável)
|
|
102
|
+
- **Acento**: Vermelho para urgência, verde para saudável
|
|
103
|
+
- **Evitar**: Azul (supressor natural de apetite), roxo, cinza frio
|
|
104
|
+
- **Referências**: iFood (vermelho), Uber Eats (preto/verde)
|
|
105
|
+
|
|
106
|
+
### Luxo / Premium
|
|
107
|
+
- **Primária**: Preto (poder), branco (pureza), dourado (prestígio)
|
|
108
|
+
- **Secundária**: Burgundy, navy, emerald
|
|
109
|
+
- **Acento**: Dourado sutil, nunca brilhante demais (parece falso)
|
|
110
|
+
- **Evitar**: Cores primárias saturadas (infantil), gradientes chamativos
|
|
111
|
+
- **Referências**: Rolex, LVMH, Bottega Veneta
|
|
112
|
+
|
|
113
|
+
### Sustentabilidade / Eco
|
|
114
|
+
- **Primária**: Verde (natureza) em tons terrosos, não neon
|
|
115
|
+
- **Secundária**: Bege, marrom claro, terracota
|
|
116
|
+
- **Acento**: Verde mais saturado para CTAs
|
|
117
|
+
- **Evitar**: Verde neon (parece tech, não eco), preto pesado, plástico visual
|
|
118
|
+
- **Referências**: Patagonia, Aesop
|
|
119
|
+
|
|
120
|
+
### Kids / Educação infantil
|
|
121
|
+
- **Primária**: Cores primárias saturadas e quentes
|
|
122
|
+
- **Secundária**: Mix vibrante, contrastes fortes
|
|
123
|
+
- **Acento**: Variado — cada seção pode ter cor diferente
|
|
124
|
+
- **Evitar**: Monocromático (entediante), tons pastéis demais (sem energia), dark mode
|
|
125
|
+
- **Referências**: Duolingo, Khan Academy Kids
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Dark Mode — Cores
|
|
130
|
+
|
|
131
|
+
Não é inversão. É re-composição para fundo escuro:
|
|
132
|
+
|
|
133
|
+
1. **Dessaturar**: reduzir saturação 10-20% em cores sobre fundo escuro. Cores saturadas "vibram" e causam fadiga
|
|
134
|
+
2. **Clarear**: usar tons mais claros da escala (blue-400 em vez de blue-600)
|
|
135
|
+
3. **Fundo**: nunca #000000 puro — olho humano percebe glow/bleeding em OLED. Usar #0a0a0a a #1a1a1a
|
|
136
|
+
4. **Texto**: nunca #ffffff puro — contraste extremo causa fadiga. Usar #f0f0f0 a #fafafa
|
|
137
|
+
5. **Elevação**: em dark, camadas mais elevadas são mais claras (oposto de light). Card no topo = fundo mais claro
|
|
138
|
+
6. **Brand colors**: manter reconhecíveis. Ajustar lightness, não mudar a cor
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Armadilhas Culturais
|
|
143
|
+
|
|
144
|
+
Cores têm significados diferentes por cultura. Considerar antes de internacionalizar:
|
|
145
|
+
|
|
146
|
+
| Cor | Ocidente | Ásia Oriental | Oriente Médio | Observação |
|
|
147
|
+
|---|---|---|---|---|
|
|
148
|
+
| Vermelho | Perigo, paixão, pare | Sorte, prosperidade, casamento | Perigo, cautela | China: vermelho é COR de celebração |
|
|
149
|
+
| Branco | Pureza, casamento | Luto, morte, funerais | Pureza, paz | Japão/China: branco em funerais |
|
|
150
|
+
| Verde | Natureza, go, eco | Juventude, fertilidade | Islã, sagrado, prosperidade | Cuidado em contextos islâmicos |
|
|
151
|
+
| Roxo | Luxo, realeza, poder | Nobreza (similar) | Luto (alguns países) | Tailândia: cor do luto |
|
|
152
|
+
| Amarelo | Otimismo, cautela | Imperial, sagrado | Sabedoria | Egito: luto |
|
|
153
|
+
| Preto | Formalidade, morte | Formalidade | Mistério, mal | Relativamente universal |
|
|
154
|
+
|
|
155
|
+
Recomendação: em produtos globais, pesquisar significados nas culturas-alvo. Na dúvida, azul é a cor mais universalmente positiva.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Acessibilidade de Cores
|
|
160
|
+
|
|
161
|
+
### Cor como indicador
|
|
162
|
+
|
|
163
|
+
Nunca usar cor como único meio de comunicar informação:
|
|
164
|
+
- Erro em formulário: vermelho + ícone ⚠ + texto de erro
|
|
165
|
+
- Sucesso: verde + ícone ✓ + texto de confirmação
|
|
166
|
+
- Gráficos: cores + padrões (listras, pontos) + labels
|
|
167
|
+
|
|
168
|
+
### Pares seguros para daltonismo
|
|
169
|
+
|
|
170
|
+
O daltonismo mais comum é protanopia/deuteranopia (vermelho-verde). Evitar distinguir informação apenas por vermelho vs verde.
|
|
171
|
+
|
|
172
|
+
Pares que funcionam para todos:
|
|
173
|
+
- Azul + laranja
|
|
174
|
+
- Azul + vermelho
|
|
175
|
+
- Preto + amarelo
|
|
176
|
+
- Roxo + laranja
|
|
177
|
+
- Azul + cinza
|
|
178
|
+
|
|
179
|
+
Pares problemáticos:
|
|
180
|
+
- Vermelho vs verde (protanopia/deuteranopia)
|
|
181
|
+
- Azul vs roxo (tritanopia)
|
|
182
|
+
- Verde vs marrom
|
|
183
|
+
- Vermelho vs marrom
|
|
184
|
+
|
|
185
|
+
### Teste prático
|
|
186
|
+
|
|
187
|
+
Usar simuladores de daltonismo:
|
|
188
|
+
- Chrome DevTools → Rendering → Emulate vision deficiencies
|
|
189
|
+
- Figma → View → Color blindness simulation (plugin Stark)
|
|
190
|
+
- Testar: protanopia, deuteranopia, tritanopia, achromatopsia
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Tendências a Evitar
|
|
195
|
+
|
|
196
|
+
| Tendência | Por que evitar | Alternativa |
|
|
197
|
+
|---|---|---|
|
|
198
|
+
| Gradiente roxo-rosa-azul AI | Clichê desde 2023. Parece "mais um produto AI" | Escolher paleta que diferencie do mercado |
|
|
199
|
+
| Rainbow gradient em tudo | Sem hierarquia visual, distrai do conteúdo | Gradiente mesh sutil com 2-3 cores |
|
|
200
|
+
| Neon sobre branco | Contraste péssimo, ilegível, não acessível | Neon apenas sobre fundos escuros |
|
|
201
|
+
| Cinza sobre cinza | "Elegante" mas impossível de ler | Manter contraste mínimo 4.5:1 |
|
|
202
|
+
| Cores sazonais | Redesign constante, marca inconsistente | Cor de marca fixa + acentos sazonais sutis |
|
|
203
|
+
| Preto puro (#000) como fundo | Glow em OLED, contraste extremo causa fadiga | Usar #0f0f0f a #1a1a1a |
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# Especificação de Componentes UI
|
|
2
|
+
|
|
3
|
+
## Atomic Design — Quando Usar Cada Nível
|
|
4
|
+
|
|
5
|
+
### Átomos
|
|
6
|
+
Elementos indivisíveis: Button, Input, Label, Icon, Badge, Avatar, Checkbox, Radio, Toggle, Tooltip.
|
|
7
|
+
Não dependem de outros componentes. Têm variantes e estados próprios.
|
|
8
|
+
|
|
9
|
+
### Moléculas
|
|
10
|
+
Composição de 2-4 átomos com propósito definido: Form Field (Label + Input + Helper), Card (Surface + Content + Actions), Search Bar (Input + Icon + Button), Menu Item (Icon + Label + Badge).
|
|
11
|
+
|
|
12
|
+
### Organismos
|
|
13
|
+
Seções completas e independentes: Navigation Bar, Header, Footer, Sidebar, Form completo, Data Table, Modal/Dialog.
|
|
14
|
+
Gerenciam estado próprio e contêm moléculas.
|
|
15
|
+
|
|
16
|
+
### Templates
|
|
17
|
+
Layout esquelético sem conteúdo real: define grid, posição de organismos, responsive breakpoints. É o wireframe estrutural da página.
|
|
18
|
+
|
|
19
|
+
### Páginas
|
|
20
|
+
Template + conteúdo real. Onde se testa com dados verdadeiros: textos longos, imagens reais, estados vazios, estados de erro.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Template de Spec por Componente
|
|
25
|
+
|
|
26
|
+
Toda spec de componente deve seguir esta estrutura:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
# ComponentName (nível atomic)
|
|
30
|
+
|
|
31
|
+
## Propósito
|
|
32
|
+
Uma frase descrevendo o que faz e quando usar.
|
|
33
|
+
|
|
34
|
+
## Anatomia
|
|
35
|
+
Partes visuais do componente (container, label, icon, etc.)
|
|
36
|
+
|
|
37
|
+
## Variantes
|
|
38
|
+
Lista de variantes visuais com quando usar cada uma.
|
|
39
|
+
|
|
40
|
+
## Estados
|
|
41
|
+
Todos os estados interativos (default, hover, active, focus, disabled, loading, error).
|
|
42
|
+
|
|
43
|
+
## Props / API
|
|
44
|
+
Propriedades aceitas com tipos e defaults.
|
|
45
|
+
|
|
46
|
+
## Acessibilidade
|
|
47
|
+
Role ARIA, keyboard interaction, focus management.
|
|
48
|
+
|
|
49
|
+
## Tokens Utilizados
|
|
50
|
+
Quais design tokens o componente consome.
|
|
51
|
+
|
|
52
|
+
## Exemplos
|
|
53
|
+
Código de uso para cada variante principal.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Specs Completas
|
|
59
|
+
|
|
60
|
+
### Button (Átomo)
|
|
61
|
+
|
|
62
|
+
**Propósito**: Ação primária do usuário. Todo botão deve comunicar claramente o que acontece ao clicar.
|
|
63
|
+
|
|
64
|
+
**Anatomia**: Container → [Icon opcional] → Label → [Icon trailing opcional]
|
|
65
|
+
|
|
66
|
+
**Variantes**:
|
|
67
|
+
|
|
68
|
+
| Variante | Quando usar | Visual |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `primary` | Ação principal da página (1 por tela) | Fundo sólido cor primária, texto branco |
|
|
71
|
+
| `secondary` | Ações complementares | Fundo cinza claro, texto escuro |
|
|
72
|
+
| `destructive` | Deletar, remover, ações irreversíveis | Fundo vermelho, texto branco |
|
|
73
|
+
| `outline` | Ações terciárias, menos ênfase | Borda, fundo transparente |
|
|
74
|
+
| `ghost` | Ações sutis, dentro de cards/toolbars | Sem fundo nem borda, apenas texto |
|
|
75
|
+
| `link` | Navegação inline, ações sem peso visual | Texto com underline, sem container |
|
|
76
|
+
|
|
77
|
+
**Estados**:
|
|
78
|
+
|
|
79
|
+
| Estado | Visual | Comportamento |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `default` | Estilo base da variante | — |
|
|
82
|
+
| `hover` | Fundo levemente mais escuro/claro | Cursor pointer |
|
|
83
|
+
| `active/pressed` | Fundo mais escuro, scale(0.98) | Feedback tátil |
|
|
84
|
+
| `focus-visible` | Focus ring 2px offset 2px cor primária | Tab navigation |
|
|
85
|
+
| `disabled` | Opacidade 50%, cor dessaturada | Cursor not-allowed, aria-disabled, não clickável |
|
|
86
|
+
| `loading` | Spinner substitui ícone ou label | Desabilitar click, manter largura |
|
|
87
|
+
|
|
88
|
+
**Acessibilidade**:
|
|
89
|
+
- Role: `button` (nativo) ou `role="button"` + `tabindex="0"` se não for `<button>`
|
|
90
|
+
- Keyboard: `Enter` e `Space` ativam. `Tab` navega
|
|
91
|
+
- Sempre ter texto acessível: label visível ou `aria-label` para icon-only
|
|
92
|
+
- Loading: `aria-busy="true"`, `aria-disabled="true"`
|
|
93
|
+
- Nunca usar `<div>` ou `<a>` como botão sem role e keyboard handling
|
|
94
|
+
|
|
95
|
+
**Animação**:
|
|
96
|
+
- Hover: `transition: background-color 150ms ease, transform 100ms ease`
|
|
97
|
+
- Active: `transform: scale(0.98)` — 100ms
|
|
98
|
+
- Loading spinner: `animation: spin 600ms linear infinite`
|
|
99
|
+
|
|
100
|
+
**Dimensões**:
|
|
101
|
+
|
|
102
|
+
| Tamanho | Altura | Padding X | Font Size | Icon Size |
|
|
103
|
+
|---|---|---|---|---|
|
|
104
|
+
| `sm` | 32px | 12px | 14px | 16px |
|
|
105
|
+
| `md` | 40px | 16px | 14px | 18px |
|
|
106
|
+
| `lg` | 48px | 24px | 16px | 20px |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### Input (Átomo)
|
|
111
|
+
|
|
112
|
+
**Propósito**: Captura de dados textuais do usuário. Sempre acompanhado de label.
|
|
113
|
+
|
|
114
|
+
**Anatomia**: Container → [Icon leading] → Texto input → [Clear button] → [Icon trailing]
|
|
115
|
+
|
|
116
|
+
**Tipos**: `text`, `email`, `password` (com toggle show/hide), `number`, `search`, `tel`, `url`, `date`, `textarea`
|
|
117
|
+
|
|
118
|
+
**Estados**:
|
|
119
|
+
|
|
120
|
+
| Estado | Visual |
|
|
121
|
+
|---|---|
|
|
122
|
+
| `default` | Borda `--border-default`, fundo `--surface-primary` |
|
|
123
|
+
| `hover` | Borda `--border-strong` |
|
|
124
|
+
| `focus` | Borda `--border-focus`, ring 2px `--color-blue-100` |
|
|
125
|
+
| `filled` | Igual default, label pode flutuar |
|
|
126
|
+
| `disabled` | Fundo `--surface-secondary`, opacidade 60%, cursor not-allowed |
|
|
127
|
+
| `error` | Borda `--status-error`, mensagem vermelha abaixo |
|
|
128
|
+
| `success` | Borda `--status-success` (usar com parcimônia) |
|
|
129
|
+
|
|
130
|
+
**Validação**:
|
|
131
|
+
- Inline: validar on blur, não on change (exceto password strength)
|
|
132
|
+
- Erro: exibir mensagem abaixo do campo, nunca apenas mudar cor
|
|
133
|
+
- Padrão de mensagem: descrever como corrigir, não o que está errado
|
|
134
|
+
- Ruim: "Email inválido"
|
|
135
|
+
- Bom: "Inclua um @ no endereço de email"
|
|
136
|
+
|
|
137
|
+
**Acessibilidade**:
|
|
138
|
+
- `<label for="id">` obrigatório — nunca usar placeholder como label
|
|
139
|
+
- `aria-describedby` para helper text e mensagens de erro
|
|
140
|
+
- `aria-invalid="true"` em estado de erro
|
|
141
|
+
- `autocomplete` com valor correto (name, email, tel, etc.)
|
|
142
|
+
- Não desabilitar paste em campos de senha
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
### Card (Molécula)
|
|
147
|
+
|
|
148
|
+
**Propósito**: Container visual para agrupar conteúdo relacionado com hierarquia clara.
|
|
149
|
+
|
|
150
|
+
**Anatomia**: Container → [Header (título + ações)] → Body (conteúdo) → [Footer (ações)]
|
|
151
|
+
|
|
152
|
+
**Layouts**:
|
|
153
|
+
|
|
154
|
+
| Layout | Uso |
|
|
155
|
+
|---|---|
|
|
156
|
+
| Vertical | Conteúdo empilhado, mais comum |
|
|
157
|
+
| Horizontal | Imagem lateral + conteúdo, listagens |
|
|
158
|
+
| Media top | Imagem hero + conteúdo abaixo |
|
|
159
|
+
| Compact | Menor padding, para listas densas |
|
|
160
|
+
|
|
161
|
+
**Interação**:
|
|
162
|
+
- Card clicável inteiro: `<a>` ou `<button>` wrapper, cursor pointer, hover elevation
|
|
163
|
+
- Card com ações internas: botões dentro, card em si não é clicável
|
|
164
|
+
- Nunca misturar: card clicável + links/botões dentro (conflito de click targets)
|
|
165
|
+
|
|
166
|
+
**Elevação**:
|
|
167
|
+
- Default: `--card-shadow` (sutil)
|
|
168
|
+
- Hover (se clicável): `--card-shadow-hover` com `transition: box-shadow 200ms ease`
|
|
169
|
+
- Não usar borda + sombra simultaneamente (escolher um)
|
|
170
|
+
|
|
171
|
+
**Acessibilidade**:
|
|
172
|
+
- Card clicável: aria-label descritivo, focus-visible ring
|
|
173
|
+
- Conteúdo semântico: usar `<article>` se card é autocontido
|
|
174
|
+
- Imagens: alt text significativo ou `alt=""` se decorativa
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### Modal/Dialog (Molécula)
|
|
179
|
+
|
|
180
|
+
**Propósito**: Interrupção contextual que requer atenção ou ação do usuário. Usar com moderação — modais interrompem o fluxo.
|
|
181
|
+
|
|
182
|
+
**Anatomia**: Overlay → Container → Header (título + close) → Body → [Footer (ações)]
|
|
183
|
+
|
|
184
|
+
**Tamanhos**:
|
|
185
|
+
|
|
186
|
+
| Tamanho | Max-width | Uso |
|
|
187
|
+
|---|---|---|
|
|
188
|
+
| `sm` | 400px | Confirmações simples |
|
|
189
|
+
| `md` | 560px | Formulários curtos |
|
|
190
|
+
| `lg` | 720px | Conteúdo complexo |
|
|
191
|
+
| `full` | 90vw/90vh | Edição imersiva, previews |
|
|
192
|
+
|
|
193
|
+
**Comportamento de close**:
|
|
194
|
+
- Click no overlay: fechar (exceto modais de formulário com dados)
|
|
195
|
+
- Tecla Escape: sempre fechar
|
|
196
|
+
- Botão X: sempre presente no header
|
|
197
|
+
- Confirmação antes de fechar se há unsaved changes
|
|
198
|
+
|
|
199
|
+
**Focus trap**:
|
|
200
|
+
- Ao abrir: focus no primeiro elemento interativo (ou no close button)
|
|
201
|
+
- Tab/Shift+Tab: ciclar apenas dentro do modal
|
|
202
|
+
- Ao fechar: retornar focus para o elemento que abriu o modal
|
|
203
|
+
- Implementar com `inert` no conteúdo por trás
|
|
204
|
+
|
|
205
|
+
**Scroll lock**:
|
|
206
|
+
- Body recebe `overflow: hidden` enquanto modal está aberto
|
|
207
|
+
- Compensar scrollbar width para evitar layout shift
|
|
208
|
+
- Conteúdo do modal scrolla internamente se necessário
|
|
209
|
+
|
|
210
|
+
**Acessibilidade**:
|
|
211
|
+
- `role="dialog"` + `aria-modal="true"`
|
|
212
|
+
- `aria-labelledby` apontando para o título
|
|
213
|
+
- `aria-describedby` para descrição adicional se houver
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
### Form Field (Molécula)
|
|
218
|
+
|
|
219
|
+
**Propósito**: Composição de Label + Input + Helper Text + Error Message em um único componente coeso.
|
|
220
|
+
|
|
221
|
+
**Anatomia**:
|
|
222
|
+
```
|
|
223
|
+
┌─────────────────────────┐
|
|
224
|
+
│ Label* (badge) │ ← label + required indicator
|
|
225
|
+
│ ┌─────────────────────┐ │
|
|
226
|
+
│ │ Input │ │ ← qualquer tipo de input
|
|
227
|
+
│ └─────────────────────┘ │
|
|
228
|
+
│ Helper text / Error msg │ ← contextual, um ou outro
|
|
229
|
+
└─────────────────────────┘
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Composição**:
|
|
233
|
+
- Label: sempre visível, posição acima do input, `font-weight: medium`
|
|
234
|
+
- Required: asterisco `*` na label ou texto "(obrigatório)" — nunca marcar opcionais
|
|
235
|
+
- Helper: texto cinza abaixo do input para instrução proativa
|
|
236
|
+
- Error: substitui helper, cor vermelha, ícone de alerta, descreve como corrigir
|
|
237
|
+
|
|
238
|
+
**Estados**:
|
|
239
|
+
- Default: label + input + helper (se houver)
|
|
240
|
+
- Error: label + input(borda vermelha) + error message
|
|
241
|
+
- Disabled: tudo com opacidade reduzida
|
|
242
|
+
- Readonly: sem borda de input, apenas texto
|
|
243
|
+
|
|
244
|
+
**Acessibilidade**:
|
|
245
|
+
- Label conectada via `for`/`id`
|
|
246
|
+
- Helper via `aria-describedby`
|
|
247
|
+
- Error via `aria-describedby` + `aria-invalid="true"` no input
|
|
248
|
+
- `fieldset` + `legend` para grupos de campos relacionados (ex: endereço)
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
### Navigation Bar (Organismo)
|
|
253
|
+
|
|
254
|
+
**Propósito**: Navegação global persistente do app. Acesso rápido às seções principais.
|
|
255
|
+
|
|
256
|
+
**Anatomia Desktop**: Container → Logo → Nav Links → [Search] → Actions (CTA, avatar, notificações)
|
|
257
|
+
|
|
258
|
+
**Anatomia Mobile**: Container → Logo/Hamburger → [Search icon] → Actions mínimas
|
|
259
|
+
|
|
260
|
+
**Responsivo**:
|
|
261
|
+
|
|
262
|
+
| Breakpoint | Comportamento |
|
|
263
|
+
|---|---|
|
|
264
|
+
| Desktop (≥1024px) | Horizontal completa, todos os links visíveis |
|
|
265
|
+
| Tablet (768-1023px) | Links prioritários visíveis, rest em "More" dropdown |
|
|
266
|
+
| Mobile (<768px) | Hamburger menu, slide-in panel ou bottom sheet |
|
|
267
|
+
|
|
268
|
+
**Active state**: Item atual com indicador visual claro (underline, fundo, cor) — nunca apenas cor de texto.
|
|
269
|
+
|
|
270
|
+
**Mobile collapse**:
|
|
271
|
+
- Hamburger: 3 linhas → anima para X ao abrir
|
|
272
|
+
- Panel: slide da esquerda ou top, overlay no conteúdo
|
|
273
|
+
- Alternativa: bottom navigation bar (máximo 5 itens)
|
|
274
|
+
|
|
275
|
+
**Acessibilidade**:
|
|
276
|
+
- `<nav aria-label="Navegação principal">`
|
|
277
|
+
- `aria-current="page"` no item ativo
|
|
278
|
+
- Skip link: primeiro elemento focável da página, link para `#main-content`
|
|
279
|
+
- Hamburger: `aria-expanded`, `aria-controls`
|
|
280
|
+
- Mobile panel: focus trap enquanto aberto
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Quality Gates
|
|
285
|
+
|
|
286
|
+
Antes de considerar um componente pronto:
|
|
287
|
+
|
|
288
|
+
- [ ] Zero CSS hardcoded — todos os valores vêm de tokens
|
|
289
|
+
- [ ] WCAG AA — contraste ≥ 4.5:1 texto normal, ≥ 3:1 texto grande
|
|
290
|
+
- [ ] Focus-visible — ring visível em navegação por teclado
|
|
291
|
+
- [ ] Keyboard nav — Tab, Enter, Space, Escape funcionam conforme esperado
|
|
292
|
+
- [ ] Estados completos — default, hover, active, focus, disabled (e loading/error quando aplicável)
|
|
293
|
+
- [ ] Responsive — testado em 320px, 768px, 1024px, 1440px
|
|
294
|
+
- [ ] Dark mode — testado com tema escuro, contraste verificado
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Referência de Estados e Variantes
|
|
299
|
+
|
|
300
|
+
### Estados universais de interação
|
|
301
|
+
- **default**: aparência base, sem interação
|
|
302
|
+
- **hover**: mouse sobre (desktop), não usar em mobile
|
|
303
|
+
- **active/pressed**: durante click/tap, feedback imediato
|
|
304
|
+
- **focus-visible**: navegação por teclado (Tab), não em click
|
|
305
|
+
- **disabled**: não interagível, comunicar visualmente
|
|
306
|
+
- **loading**: aguardando resposta, desabilitar interação
|
|
307
|
+
|
|
308
|
+
### Estados de dados
|
|
309
|
+
- **empty**: sem dados, mostrar ilustração + CTA
|
|
310
|
+
- **error**: falha, mostrar mensagem + ação de recuperação
|
|
311
|
+
- **success**: operação concluída, feedback temporário
|
|
312
|
+
- **partial**: carregamento parcial, skeleton onde falta
|
|
313
|
+
|
|
314
|
+
### Variantes de ênfase (hierarquia visual)
|
|
315
|
+
- **primary**: ação principal (1 por contexto)
|
|
316
|
+
- **secondary**: ações complementares
|
|
317
|
+
- **tertiary/ghost**: ações de menor importância
|
|
318
|
+
- **destructive**: ações irreversíveis (sempre confirmar)
|