@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.
Files changed (52) hide show
  1. package/agents/hefesto-argos.md +279 -0
  2. package/agents/hefesto-athena.md +379 -0
  3. package/agents/hefesto-hermes.md +128 -0
  4. package/bin/install.js +54 -20
  5. package/package.json +3 -3
  6. package/skills/hefesto-context/SKILL.md +28 -8
  7. package/skills/hefesto-design/SKILL.md +194 -0
  8. package/skills/hefesto-design/data/animations.csv +21 -0
  9. package/skills/hefesto-design/data/anti-patterns.csv +41 -0
  10. package/skills/hefesto-design/data/charts.csv +26 -0
  11. package/skills/hefesto-design/data/colors.csv +108 -0
  12. package/skills/hefesto-design/data/components.csv +31 -0
  13. package/skills/hefesto-design/data/google-fonts.csv +56 -0
  14. package/skills/hefesto-design/data/icons.csv +23 -0
  15. package/skills/hefesto-design/data/landing-pages.csv +28 -0
  16. package/skills/hefesto-design/data/products.csv +46 -0
  17. package/skills/hefesto-design/data/spacing.csv +16 -0
  18. package/skills/hefesto-design/data/styles.csv +53 -0
  19. package/skills/hefesto-design/data/typography.csv +41 -0
  20. package/skills/hefesto-design/data/ux-rules.csv +61 -0
  21. package/skills/hefesto-design/references/accessibility.md +335 -0
  22. package/skills/hefesto-design/references/aesthetics.md +343 -0
  23. package/skills/hefesto-design/references/anti-patterns.md +107 -0
  24. package/skills/hefesto-design/references/checklist.md +66 -0
  25. package/skills/hefesto-design/references/color-psychology.md +203 -0
  26. package/skills/hefesto-design/references/component-specs.md +318 -0
  27. package/skills/hefesto-design/references/polish.md +339 -0
  28. package/skills/hefesto-design/references/token-architecture.md +394 -0
  29. package/skills/hefesto-design/references/ux-rules.md +349 -0
  30. package/skills/hefesto-design/scripts/__pycache__/audit.cpython-314.pyc +0 -0
  31. package/skills/hefesto-design/scripts/__pycache__/contrast.cpython-314.pyc +0 -0
  32. package/skills/hefesto-design/scripts/__pycache__/core.cpython-314.pyc +0 -0
  33. package/skills/hefesto-design/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  34. package/skills/hefesto-design/scripts/__pycache__/search.cpython-314.pyc +0 -0
  35. package/skills/hefesto-design/scripts/__pycache__/validate_tokens.cpython-314.pyc +0 -0
  36. package/skills/hefesto-design/scripts/audit.py +450 -0
  37. package/skills/hefesto-design/scripts/contrast.py +195 -0
  38. package/skills/hefesto-design/scripts/core.py +155 -0
  39. package/skills/hefesto-design/scripts/design_system.py +311 -0
  40. package/skills/hefesto-design/scripts/search.py +235 -0
  41. package/skills/hefesto-design/scripts/validate_tokens.py +274 -0
  42. package/{commands/hefesto/init.md → skills/hefesto-init/SKILL.md} +5 -2
  43. package/{commands/hefesto/new-feature.md → skills/hefesto-new-feature/SKILL.md} +5 -2
  44. package/{commands/hefesto/update.md → skills/hefesto-update/SKILL.md} +6 -3
  45. package/templates/DESIGN.md +137 -0
  46. package/templates/RECON.md +54 -0
  47. package/templates/RESEARCH.md +22 -25
  48. package/templates/STATE.md +1 -1
  49. package/templates/VERDICT.md +52 -0
  50. package/agents/.gitkeep +0 -0
  51. package/agents/hefesto-researcher.md +0 -180
  52. 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)