@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,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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|