@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,349 @@
1
+ # Regras UX — 50 Essenciais por Prioridade
2
+
3
+ ---
4
+
5
+ ## Prioridade CRÍTICA (sempre aplicar)
6
+
7
+ ### Acessibilidade
8
+
9
+ **UX-01 — Contraste de Cores**
10
+ Todo texto deve ter contraste mínimo WCAG AA: 4.5:1 para texto normal (< 18px), 3:1 para texto grande (≥ 18px bold ou ≥ 24px regular). Testar com ferramentas como Contrast Checker ou DevTools.
11
+ - Padrão: usar tokens semânticos que garantem contraste em ambos os temas
12
+ - Evitar: texto cinza claro sobre branco, placeholder como conteúdo, cores vibrantes sobre vibrantes
13
+ - Por quê: ~8% dos homens têm algum grau de daltonismo. Baixo contraste afeta todos em telas com brilho baixo ou ao sol
14
+ - Ref: WCAG 2.2 — 1.4.3 Contrast (Minimum)
15
+
16
+ **UX-02 — Focus States Visíveis**
17
+ Todo elemento interativo deve ter um indicador de focus visível durante navegação por teclado. Focus ring de 2-4px, cor de alto contraste, offset de 2px.
18
+ - Padrão: `outline: 2px solid var(--border-focus); outline-offset: 2px` em `:focus-visible`
19
+ - Evitar: `outline: none` sem substituto, focus ring apenas com mudança de cor de fundo
20
+ - Por quê: usuários de teclado ficam completamente perdidos sem indicador de focus
21
+ - Ref: WCAG 2.2 — 2.4.7 Focus Visible
22
+
23
+ **UX-03 — Texto Alternativo**
24
+ Toda imagem significativa precisa de `alt` descritivo. Imagens decorativas recebem `alt=""` (string vazia, não ausente).
25
+ - Padrão: descrever a informação que a imagem transmite, não a imagem em si. "Gráfico mostrando crescimento de 40% em vendas" > "Gráfico de barras"
26
+ - Evitar: `alt="imagem"`, `alt="foto"`, alt ausente, alt repetindo o caption
27
+ - Por quê: screen readers leem alt. Sem alt, leem o filename — "DSC_0234.jpg"
28
+ - Ref: WCAG 2.2 — 1.1.1 Non-text Content
29
+
30
+ **UX-04 — ARIA Labels**
31
+ Elementos interativos sem texto visível (icon buttons, links de ícone) precisam de `aria-label` ou `aria-labelledby`.
32
+ - Padrão: `<button aria-label="Fechar modal">` para botões com apenas ícone
33
+ - Evitar: aria-label redundante com texto visível, aria-label genérico ("botão", "link")
34
+ - Por quê: sem label, screen readers anunciam "botão" sem contexto
35
+ - Ref: WCAG 2.2 — 4.1.2 Name, Role, Value
36
+
37
+ **UX-05 — Navegação por Teclado**
38
+ Todo fluxo deve ser completável apenas com teclado: Tab (avançar), Shift+Tab (voltar), Enter/Space (ativar), Escape (cancelar/fechar), Arrow keys (navegar dentro de grupos).
39
+ - Padrão: testar todo fluxo crítico com Tab sem usar mouse
40
+ - Evitar: elementos focáveis fora da ordem visual (tabindex > 0), conteúdo acessível apenas via hover
41
+ - Por quê: além de a11y, power users preferem teclado — é mais rápido
42
+ - Ref: WCAG 2.2 — 2.1.1 Keyboard
43
+
44
+ **UX-06 — Labels de Formulário**
45
+ Todo input deve ter um `<label>` visível e conectado via `for`/`id`. Placeholder NÃO é label.
46
+ - Padrão: label acima do input, sempre visível, fonte medium weight
47
+ - Evitar: placeholder como label (desaparece ao digitar), label apenas via aria (invisível)
48
+ - Por quê: placeholder desaparece, criando carga cognitiva. Labels visíveis são scannáveis
49
+ - Ref: WCAG 2.2 — 1.3.1 Info and Relationships
50
+
51
+ **UX-07 — Skip Links**
52
+ Primeira coisa focável na página deve ser um link "Pular para conteúdo" que leva ao `#main-content`. Visível apenas em focus.
53
+ - Padrão: `position: absolute; left: -9999px` quando não focado, visível em `:focus`
54
+ - Evitar: ausência total de skip links, skip link que não funciona
55
+ - Por quê: sem skip link, usuários de teclado navegam por toda a nav a cada página
56
+ - Ref: WCAG 2.2 — 2.4.1 Bypass Blocks
57
+
58
+ **UX-08 — Hierarquia de Headings**
59
+ Uma e apenas uma `<h1>` por página. Headings em ordem sequencial sem pular níveis (h1 → h2 → h3, nunca h1 → h3).
60
+ - Padrão: h1 = título da página, h2 = seções, h3 = subseções
61
+ - Evitar: usar heading por tamanho visual, pular de h2 para h4, múltiplos h1
62
+ - Por quê: screen readers navegam por headings. Hierarquia quebrada = navegação confusa
63
+ - Ref: WCAG 2.2 — 1.3.1 Info and Relationships
64
+
65
+ **UX-09 — Cor Não é Único Indicador**
66
+ Nunca usar cor como única forma de comunicar informação. Sempre combinar com ícone, texto, padrão ou posição.
67
+ - Padrão: erro = vermelho + ícone ⚠ + texto. Sucesso = verde + ícone ✓ + texto
68
+ - Evitar: campo com erro apenas com borda vermelha, status apenas por cor de badge
69
+ - Por quê: daltonismo afeta percepção de vermelho-verde — a dupla mais usada para erro/sucesso
70
+ - Ref: WCAG 2.2 — 1.4.1 Use of Color
71
+
72
+ **UX-10 — Redução de Movimento**
73
+ Respeitar `prefers-reduced-motion: reduce`. Desabilitar animações decorativas, manter apenas transições essenciais (feedback de ação).
74
+ - Padrão: `@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } }`
75
+ - Evitar: ignorar a media query, parallax sem fallback, auto-play vídeo
76
+ - Por quê: animações podem causar náusea, tontura ou crises em pessoas com vestibular disorders
77
+ - Ref: WCAG 2.2 — 2.3.3 Animation from Interactions
78
+
79
+ ### Touch e Interação
80
+
81
+ **UX-11 — Tamanho de Área de Toque**
82
+ Mínimo 44×44px para touch targets (botões, links, checkboxes). Ideal: 48×48px.
83
+ - Padrão: `min-height: 44px; min-width: 44px` para todo elemento clicável
84
+ - Evitar: ícones de 16px como botão sem padding, links inline muito curtos
85
+ - Por quê: dedos têm ~10mm de área de contato. Alvos pequenos = erros frequentes = frustração
86
+ - Ref: WCAG 2.2 — 2.5.8 Target Size (Minimum)
87
+
88
+ **UX-12 — Espaçamento entre Touch Targets**
89
+ Mínimo 8px de espaço entre elementos clicáveis adjacentes. Ideal: 12px.
90
+ - Padrão: gap ou margin entre botões adjacentes ≥ 8px
91
+ - Evitar: botões grudados, lista de ações sem espaçamento
92
+ - Por quê: sem espaço, o usuário toca no alvo errado e executa ação indesejada
93
+ - Ref: Material Design Touch guidelines
94
+
95
+ **UX-13 — Hover vs Tap**
96
+ Nunca esconder funcionalidade essencial atrás de hover. Mobile não tem hover. Se hover revela algo, deve haver alternativa tap/click.
97
+ - Padrão: informação em hover → exibir em tap/long-press ou sempre visível em mobile
98
+ - Evitar: tooltips como única fonte de informação, menus que aparecem apenas em hover
99
+ - Por quê: ~60% do tráfego web é mobile. Hover-only = inacessível para maioria
100
+ - Ref: Apple HIG — Touch interactions
101
+
102
+ **UX-14 — Botões de Loading**
103
+ Ao clicar em botão de ação, desabilitar imediatamente e mostrar spinner. Prevenir double-submit.
104
+ - Padrão: `disabled + spinner` durante request. Restaurar em success/error. Manter largura do botão
105
+ - Evitar: nenhum feedback visual, permitir múltiplos clicks, mudar tamanho do botão
106
+ - Por quê: sem feedback, usuário clica de novo → ação duplicada (compra dupla, post duplo)
107
+ - Ref: UX best practice universal
108
+
109
+ **UX-15 — Feedback de Erro**
110
+ Erros devem ser específicos, posicionados próximos ao campo, e sugerir correção. Nunca apenas "Erro" ou alert genérico.
111
+ - Padrão: mensagem vermelha abaixo do campo, com ícone, descrevendo como corrigir
112
+ - Evitar: alert() JavaScript, erro genérico no topo da página sem scroll, apenas mudar cor
113
+ - Por quê: mensagens genéricas não ajudam. Proximidade ao campo reduz tempo de correção
114
+ - Ref: Nielsen Norman Group — Error Messages
115
+
116
+ **UX-16 — Cursor Pointer**
117
+ Todo elemento clicável deve ter `cursor: pointer`. Todo elemento desabilitado: `cursor: not-allowed`.
118
+ - Padrão: aplicar via CSS em botões, links, cards clicáveis, toggles
119
+ - Evitar: div clicável sem cursor pointer, cursor pointer em texto não-clicável
120
+ - Por quê: cursor é affordance — comunica "isto é clicável" instantaneamente
121
+ - Ref: UX convention
122
+
123
+ **UX-17 — Conflitos de Gestos**
124
+ Evitar gestos custom que conflitam com gestos nativos do sistema (swipe back, pull to refresh, pinch zoom).
125
+ - Padrão: testar gestos custom em iOS Safari e Android Chrome. Usar `touch-action` quando necessário
126
+ - Evitar: horizontal swipe que conflita com back gesture, pull-down custom que conflita com refresh
127
+ - Por quê: gesto nativo ganha. Usuário ativa o comportamento do sistema em vez da ação custom
128
+ - Ref: Apple HIG, Material Design gestures
129
+
130
+ **UX-18 — Feedback de Press**
131
+ Elementos clicáveis devem ter feedback visual imediato ao toque (< 50ms). Scale down sutil, mudança de cor, ou ripple.
132
+ - Padrão: `:active { transform: scale(0.98) }` ou mudança de background-color
133
+ - Evitar: nenhum feedback visual entre tap e resultado, delay > 100ms
134
+ - Por quê: feedback imediato confirma que o sistema recebeu o input. Sem ele, usuário acha que não funcionou
135
+ - Ref: Material Design — State layers
136
+
137
+ ---
138
+
139
+ ## Prioridade ALTA
140
+
141
+ ### Layout e Responsivo
142
+
143
+ **UX-19 — Viewport Meta**
144
+ `<meta name="viewport" content="width=device-width, initial-scale=1">` obrigatório. Nunca `maximum-scale=1` ou `user-scalable=no`.
145
+ - Por quê: bloquear zoom é violação de acessibilidade — usuários com baixa visão precisam zoom
146
+ - Ref: WCAG 2.2 — 1.4.4 Resize Text
147
+
148
+ **UX-20 — Mobile First**
149
+ CSS começa com layout mobile, expande com `min-width` media queries. Não o contrário.
150
+ - Padrão: estilos base = mobile → `@media (min-width: 768px)` → `@media (min-width: 1024px)`
151
+ - Evitar: desktop-first com `max-width` queries, layout que "encolhe" em vez de "expandir"
152
+ - Por quê: mais fácil adicionar complexidade do que remover. Mobile tem mais restrições
153
+
154
+ **UX-21 — Breakpoints Consistentes**
155
+ Usar set fixo de breakpoints em todo o projeto: 640px (sm), 768px (md), 1024px (lg), 1280px (xl), 1536px (2xl).
156
+ - Evitar: breakpoints arbitrários diferentes por componente, muitos breakpoints
157
+ - Por quê: breakpoints inconsistentes criam estados onde componentes diferentes respondem em momentos diferentes
158
+
159
+ **UX-22 — Tamanho Mínimo de Fonte**
160
+ Corpo de texto: mínimo 16px em mobile. Nunca abaixo de 12px para qualquer texto legível.
161
+ - Padrão: `font-size: 1rem` (16px) para body. Labels e captions: 14px mínimo
162
+ - Evitar: 10px, 11px, fontes que parecem menores que o tamanho real (condensadas)
163
+ - Por quê: iOS faz zoom automático em inputs < 16px. Texto pequeno = ilegível em mobile
164
+ - Ref: Apple HIG typography
165
+
166
+ **UX-23 — Largura de Linha**
167
+ Texto corrido: 45-75 caracteres por linha (ideal: 65). Usar `max-width: 65ch` em containers de texto.
168
+ - Evitar: texto de margem a margem em telas largas, linhas > 90 caracteres
169
+ - Por quê: linhas muito longas fazem o olho perder a próxima linha. Muito curtas quebram ritmo
170
+ - Ref: The Elements of Typographic Style — Robert Bringhurst
171
+
172
+ **UX-24 — Sem Scroll Horizontal**
173
+ Nunca em layout principal. Se necessário em componente específico (tabela, carrossel), indicar visualmente que há conteúdo.
174
+ - Padrão: `overflow-x: hidden` no body. Tabelas: `overflow-x: auto` no container
175
+ - Evitar: conteúdo que vaza horizontalmente, layout que assume largura mínima
176
+ - Por quê: scroll horizontal é inesperado e esconde conteúdo sem indicação
177
+
178
+ **UX-25 — Escala de Espaçamento**
179
+ Usar escala consistente baseada em múltiplos: 4, 8, 12, 16, 24, 32, 48, 64, 96px. Nunca valores arbitrários.
180
+ - Padrão: 8px base grid. Componentes internos: 8/12/16. Entre componentes: 16/24/32. Seções: 48/64/96
181
+ - Evitar: padding 13px, margin 37px, valores que não seguem a escala
182
+ - Por quê: escala consistente cria ritmo visual. Valores arbitrários criam ruído sutil
183
+
184
+ **UX-26 — Largura Máxima de Container**
185
+ Conteúdo principal limitado a 1200-1440px. Nunca edge-to-edge em desktops largos.
186
+ - Padrão: `max-width: 1200px; margin: 0 auto; padding: 0 24px`
187
+ - Evitar: conteúdo que estica até 2560px, texto edge-to-edge em ultra-wide
188
+ - Por quê: linhas de texto ficam ilegíveis. Layout perde coesão em telas > 1440px
189
+
190
+ ### Navegação
191
+
192
+ **UX-27 — Limite de Itens em Bottom Nav**
193
+ Bottom navigation: máximo 5 itens. 3-4 é ideal.
194
+ - Padrão: 4 itens (Home, Search, [Core Action], Profile) + ícone + label
195
+ - Evitar: 6+ itens, labels truncados, ícones ambíguos sem label
196
+ - Por quê: > 5 itens força ícones minúsculos e labels ilegíveis. Hamburger não é item de bottom nav
197
+ - Ref: Material Design — Bottom navigation
198
+
199
+ **UX-28 — Comportamento de Back**
200
+ Botão/gesto back deve sempre funcionar de forma previsível. Modais fecham. Subpáginas voltam. Nunca prender o usuário.
201
+ - Padrão: usar history API corretamente, modais com pushState para back fechar modal
202
+ - Evitar: back que sai do app, back que perde dados do formulário sem aviso
203
+ - Por quê: back é o gesto mais usado. Comportamento inesperado = sensação de app "bugado"
204
+
205
+ **UX-29 — Deep Linking**
206
+ Toda visualização deve ter URL própria e compartilhável. Estado relevante na URL (filtros, tabs, modais).
207
+ - Padrão: `/products?category=shoes&sort=price` em vez de estado apenas em memória
208
+ - Evitar: SPA onde toda navegação usa a mesma URL, estado perdido ao refresh
209
+ - Por quê: URLs são a interface do web. Compartilhar, favoritar, voltar — tudo depende de URL
210
+
211
+ **UX-30 — Estado Ativo na Navegação**
212
+ Item atual na navegação deve ter indicador visual claro. Nunca deixar o usuário sem saber onde está.
213
+ - Padrão: underline, fundo diferente, cor diferente + font-weight, `aria-current="page"`
214
+ - Evitar: nenhum indicador, apenas mudança sutil de cor
215
+ - Por quê: sem indicador, usuário precisa ler o conteúdo para saber onde está
216
+
217
+ **UX-31 — Escape de Modal**
218
+ Tecla Escape sempre fecha modal/drawer/popup. Click no overlay fecha (exceto com dados não salvos).
219
+ - Padrão: event listener para Escape, click handler no overlay, botão X visível
220
+ - Evitar: modal sem forma de fechar, Escape não funcionar, overlay que não fecha
221
+ - Por quê: usuários esperam Escape como "saída de emergência" universal
222
+ - Ref: WCAG 2.2 — 3.2.5 Change on Request
223
+
224
+ ---
225
+
226
+ ## Prioridade MÉDIA
227
+
228
+ ### Animação
229
+
230
+ **UX-32 — Duração de Animações**
231
+ Micro-interações: 100-200ms. Transições de layout: 200-300ms. Animações de entrada: 200-400ms. Nunca > 500ms para ações do usuário.
232
+ - Padrão: hover 150ms, modal open 250ms, page transition 300ms
233
+ - Evitar: animações de 1s+ para feedback, delay antes de animação, animação que trava interação
234
+ - Por quê: > 300ms sente-se lento. < 100ms é imperceptível
235
+ - Ref: Material Design — Motion duration
236
+
237
+ **UX-33 — Performance de Transform**
238
+ Animar apenas `transform` e `opacity`. Nunca animar `width`, `height`, `top`, `left`, `margin`, `padding`.
239
+ - Padrão: usar `transform: translateX/Y/scale` para movimento/tamanho, `opacity` para fade
240
+ - Evitar: `transition: all`, animar layout properties, animação que causa repaint
241
+ - Por quê: transform/opacity rodam na GPU (compositor). Layout properties causam reflow = jank
242
+ - Ref: Google Web Fundamentals — Rendering Performance
243
+
244
+ **UX-34 — Loading States**
245
+ Conteúdo que demora > 300ms para carregar deve mostrar skeleton screens ou spinner. Spinner para ações, skeleton para conteúdo.
246
+ - Padrão: skeleton com formato do conteúdo final, pulse animation sutil
247
+ - Evitar: tela branca, spinner onde skeleton funcionaria, skeleton que não representa o conteúdo
248
+ - Por quê: percepção de velocidade importa mais que velocidade real. Skeleton parece mais rápido
249
+
250
+ **UX-35 — Easing Natural**
251
+ Usar easing curves naturais, nunca `linear` para UI (exceto spinners). Entrada: ease-out. Saída: ease-in. Ambos: ease-in-out.
252
+ - Padrão: `cubic-bezier(0.4, 0, 0.2, 1)` (standard), `cubic-bezier(0, 0, 0.2, 1)` (decelerate)
253
+ - Evitar: `linear` para transições de UI, bounce excessivo, ease-in para entradas
254
+ - Por quê: movimento linear parece mecânico e antinatural. Easing imita física real
255
+
256
+ **UX-36 — Significado do Movimento**
257
+ Animação deve comunicar relação espacial ou mudança de estado. Nunca animação decorativa que não informa nada.
258
+ - Padrão: slide de onde veio, fade para mudança de conteúdo, scale para ênfase
259
+ - Evitar: animação por animação, elementos que "dançam" sem propósito, entrada de página elaborada
260
+ - Por quê: animação significativa melhora compreensão. Decorativa adiciona latência sem valor
261
+
262
+ **UX-37 — Saída Mais Rápida que Entrada**
263
+ Animações de saída devem ser 30-50% mais rápidas que de entrada. Entrada: 250ms. Saída: 150ms.
264
+ - Padrão: modal entra em 250ms, sai em 150ms. Toast entra em 200ms, sai em 100ms
265
+ - Evitar: mesma duração para entrada e saída, saída mais lenta que entrada
266
+ - Por quê: ao sair, o usuário já decidiu. Manter na tela atrasa o próximo passo
267
+
268
+ ### Forms e Feedback
269
+
270
+ **UX-38 — Labels Sempre Visíveis**
271
+ Labels de input devem estar acima do campo e sempre visíveis. Mesmo após preenchimento. Floating labels são aceitáveis se implementadas corretamente.
272
+ - Padrão: label persistente acima, font-size 14px, font-weight medium
273
+ - Evitar: label que desaparece, placeholder como label, label ao lado (em mobile fica estreito)
274
+ - Por quê: formulário preenchido precisa ser revisável. Sem label, usuário não sabe o que preencheu
275
+
276
+ **UX-39 — Posição de Erro**
277
+ Mensagem de erro diretamente abaixo do campo que a causou, não em banner no topo.
278
+ - Padrão: error message 12-14px, cor `--status-error`, ícone ⚠, abaixo do input
279
+ - Evitar: todos os erros em alert no topo, erro em toast que desaparece, erro sem indicar qual campo
280
+ - Por quê: erro no topo = scroll + encontrar o campo. Erro abaixo do campo = correção imediata
281
+
282
+ **UX-40 — Feedback de Submit**
283
+ Formulário enviado com sucesso deve dar feedback claro: toast, redirect, ou mudança de estado visível.
284
+ - Padrão: toast "Salvo com sucesso" por 3-5s, ou redirect para página de confirmação
285
+ - Evitar: nenhum feedback, apenas limpar o formulário, feedback que desaparece em < 2s
286
+ - Por quê: sem confirmação, usuário não tem certeza se enviou. Reenvia por precaução
287
+
288
+ **UX-41 — Estados Vazios**
289
+ Tela sem dados deve ter: ilustração/ícone + texto explicativo + CTA primário para criar/adicionar.
290
+ - Padrão: ícone contextual + "Nenhum [item] ainda" + botão "Criar primeiro [item]"
291
+ - Evitar: tela em branco, apenas "Sem resultados", tabela vazia com headers
292
+ - Por quê: vazio é oportunidade de onboarding. Primeiro uso é primeiro impressão
293
+
294
+ **UX-42 — Confirmação de Ações Destrutivas**
295
+ Ações irreversíveis (deletar, cancelar conta) precisam de confirmação explícita: modal com texto claro + botão primário sendo cancelar.
296
+ - Padrão: modal com "Tem certeza? Esta ação não pode ser desfeita." + botão outline "Excluir" + botão primário "Cancelar"
297
+ - Evitar: deletar direto sem confirmação, confirmação genérica "Tem certeza?", botão destrutivo como primário
298
+ - Por quê: cliques acidentais acontecem. Ação irreversível sem confirmação = perda de dados
299
+
300
+ **UX-43 — Validação Inline**
301
+ Validar campos conforme preenchimento (on blur), não apenas no submit. Mostrar ✓ em campos válidos complexos (senha, email).
302
+ - Padrão: validar on blur, mostrar erro on blur se inválido, limpar erro on focus + change
303
+ - Evitar: validar on change (erro antes de terminar de digitar), validar apenas no submit
304
+ - Por quê: feedback imediato reduz erros. Validação apenas no submit frustra em formulários longos
305
+
306
+ ### Tipografia e Cor
307
+
308
+ **UX-44 — Line Height**
309
+ Corpo de texto: line-height 1.5-1.7. Headlines: 1.1-1.3. Nunca usar `line-height: 1` em texto de múltiplas linhas.
310
+ - Padrão: body `line-height: 1.5`, h1/h2 `line-height: 1.2`, captions `line-height: 1.4`
311
+ - Evitar: line-height 1 em parágrafos, line-height > 2 (parece double-space)
312
+ - Por quê: line-height inadequada prejudica legibilidade significativamente
313
+
314
+ **UX-45 — Pareamento de Fontes**
315
+ Máximo 2 famílias tipográficas. Uma para display/headlines, outra para corpo. Contraste entre elas (serif + sans, por exemplo).
316
+ - Padrão: Serifa display + sans corpo (Playfair + Inter). Ou sans bold + sans regular da mesma família
317
+ - Evitar: 3+ famílias, duas serifas similares, fontes que competem visualmente
318
+ - Por quê: cada fonte adicional é 100-300KB de download e complexidade visual
319
+
320
+ **UX-46 — Cor Semântica**
321
+ Cores devem comunicar significado consistente em toda a aplicação. Vermelho = erro/perigo. Verde = sucesso. Amarelo = atenção. Azul = info/ação.
322
+ - Padrão: definir palette semântica e usar consistentemente via tokens
323
+ - Evitar: vermelho decorativo onde não é erro, verde em botões não relacionados a sucesso
324
+ - Por quê: cor semântica inconsistente destrói padrões aprendidos pelo usuário
325
+
326
+ **UX-47 — Dark Mode de Cores**
327
+ Em dark mode: dessaturar cores 10-20%, clarear tons, testar contraste separadamente. Não é inversão.
328
+ - Padrão: blue-600 (light) → blue-400 (dark), red-600 → red-400, green-600 → green-400
329
+ - Evitar: mesma cor em ambos os temas, inverter automaticamente, cores saturadas em fundo escuro
330
+ - Por quê: cores saturadas em fundo escuro vibram visualmente e causam fadiga
331
+
332
+ **UX-48 — Hierarquia por Peso**
333
+ Criar hierarquia tipográfica com peso (regular/medium/semibold/bold), não apenas tamanho. Tamanho para nível, peso para ênfase.
334
+ - Padrão: body regular, labels medium, headings semibold/bold, emphasis dentro do texto medium
335
+ - Evitar: tudo bold, hierarquia apenas por tamanho, thin/100 weight (ilegível em telas)
336
+ - Por quê: peso cria distinção sutil sem mudar tamanho. Mais refinado e escalável
337
+
338
+ **UX-49 — Alinhamento de Texto**
339
+ Texto longo: sempre alinhado à esquerda (LTR). Nunca justificado na web. Centralizado apenas para headlines e CTAs curtos.
340
+ - Padrão: `text-align: left` para body, `text-align: center` apenas para hero titles e CTA sections
341
+ - Evitar: `text-align: justify` (cria rios de espaço), centralizar parágrafos, alinhar à direita sem motivo
342
+ - Por quê: olho busca o início da próxima linha na esquerda. Justificado cria espaçamento imprevisível
343
+
344
+ **UX-50 — Contraste em Inputs**
345
+ Campos de formulário devem ser visualmente distinguíveis do fundo. Borda OU fundo diferente — nunca invisível.
346
+ - Padrão: input com borda 1px `--border-default` ou fundo `--surface-secondary`
347
+ - Evitar: input sem borda e sem fundo diferente (Material floating label sem underline), borderless em dark mode
348
+ - Por quê: usuário precisa identificar onde digitar. Input invisível causa hesitação
349
+ - Ref: Nielsen Norman Group — Text Fields