specifica-br 1.2.2 → 1.5.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/README.md +114 -44
- package/dist/boilerplate/commands/executar-task.md +133 -0
- package/dist/boilerplate/commands/gerar-contexto.md +1462 -0
- package/dist/boilerplate/commands/gerar-prd.md +289 -0
- package/dist/boilerplate/commands/gerar-tasks.md +168 -0
- package/dist/boilerplate/commands/gerar-techspec.md +1467 -0
- package/dist/boilerplate/commands/gerar-visao.md +731 -0
- package/dist/boilerplate/commands/realizar-codereview.md +288 -0
- package/dist/boilerplate/opencode-commands/executar-task.md +55 -48
- package/dist/boilerplate/opencode-commands/gerar-contexto.md +1462 -0
- package/dist/boilerplate/opencode-commands/gerar-prd.md +232 -40
- package/dist/boilerplate/opencode-commands/gerar-tasks.md +112 -31
- package/dist/boilerplate/opencode-commands/gerar-techspec.md +1464 -80
- package/dist/boilerplate/opencode-commands/gerar-visao.md +731 -0
- package/dist/boilerplate/opencode-commands/realizar-codereview.md +288 -0
- package/dist/boilerplate/skills/product-manager/SKILL.md +32 -0
- package/dist/boilerplate/skills/techspec-generator/SKILL.md +489 -0
- package/dist/boilerplate/skills/techspec-generator/references/api-contracts.md +421 -0
- package/dist/boilerplate/skills/techspec-generator/references/architecture-patterns.md +316 -0
- package/dist/boilerplate/skills/techspec-generator/references/database-modeling.md +436 -0
- package/dist/boilerplate/skills/techspec-generator/references/observability-testing.md +436 -0
- package/dist/boilerplate/skills/techspec-generator/references/security-hardening.md +238 -0
- package/dist/boilerplate/skills/techspec-generator/references/ux-ui-accessibility.md +511 -0
- package/dist/boilerplate/specs-templates/architecture-template.md +736 -0
- package/dist/boilerplate/specs-templates/codereview-template.md +95 -0
- package/dist/boilerplate/specs-templates/prd-template.md +101 -19
- package/dist/boilerplate/specs-templates/product_vision-template.md +284 -0
- package/dist/boilerplate/specs-templates/task-template.md +64 -18
- package/dist/boilerplate/specs-templates/tasks-template.md +12 -4
- package/dist/boilerplate/specs-templates/techspec-template.md +1227 -89
- package/dist/boilerplate/templates/architecture-template.md +736 -0
- package/dist/boilerplate/templates/codereview-template.md +95 -0
- package/dist/boilerplate/templates/prd-template.md +167 -0
- package/dist/boilerplate/templates/product_vision-template.md +284 -0
- package/dist/boilerplate/templates/task-template.md +169 -0
- package/dist/boilerplate/templates/tasks-template.md +15 -0
- package/dist/boilerplate/templates/techspec-template.md +1306 -0
- package/dist/commands/help.js +33 -11
- package/dist/commands/init.js +39 -43
- package/dist/tools-mapping.json +32 -0
- package/dist/types/init.d.ts +14 -17
- package/dist/utils/file-service.d.ts +5 -3
- package/dist/utils/file-service.js +168 -56
- package/dist/utils/message-formatter.d.ts +2 -1
- package/dist/utils/message-formatter.js +39 -22
- package/package.json +1 -1
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
# Usabilidade, Acessibilidade e Design de Interfaces
|
|
2
|
+
|
|
3
|
+
Referência técnica para design de frontend, usabilidade e acessibilidade ao gerar Tech Specs.
|
|
4
|
+
|
|
5
|
+
## Sumário
|
|
6
|
+
|
|
7
|
+
1. [Princípios de Usabilidade](#1-principios-de-usabilidade)
|
|
8
|
+
2. [Acessibilidade (a11y)](#2-acessibilidade-a11y)
|
|
9
|
+
3. [Design de Componentes](#3-design-de-componentes)
|
|
10
|
+
4. [Estados de UI](#4-estados-de-ui)
|
|
11
|
+
5. [Formulários](#5-formularios)
|
|
12
|
+
6. [Layout e Responsividade](#6-layout-e-responsividade)
|
|
13
|
+
7. [Performance Percebida](#7-performance-percebida)
|
|
14
|
+
8. [Interações e Feedback](#8-interacoes-e-feedback)
|
|
15
|
+
9. [Checklist de UI/UX para TechSpec](#9-checklist-de-uiux-para-techspec)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. Princípios de Usabilidade
|
|
20
|
+
|
|
21
|
+
### 1.1. Heurísticas de Nielsen (Aplicadas à TechSpec)
|
|
22
|
+
|
|
23
|
+
| Heurística | O que especificar | Exemplo |
|
|
24
|
+
|:---|:---|:---|
|
|
25
|
+
| **Visibilidade do estado** | Loading, progresso, sucesso, erro | Skeleton screen durante carregamento |
|
|
26
|
+
| **Correspondência com o mundo real** | Linguagem do usuário, não técnica | "Seu pedido foi enviado" vs "Status: SHIPPED" |
|
|
27
|
+
| **Controle do usuário** | Undo, cancelar, voltar | Botão "Cancelar pedido" com confirmação |
|
|
28
|
+
| **Consistência** | Seguir design system existente | Usar componentes do shadcn-vue do projeto |
|
|
29
|
+
| **Prevenção de erros** | Validação antes do submit | Desabilitar botão se formulário inválido |
|
|
30
|
+
| **Reconhecimento vs recall** | Mostrar opções, não exigir memorização | Dropdown com sugestões de busca |
|
|
31
|
+
| **Flexibilidade** | Atalhos para usuários avançados | Keyboard shortcuts (Ctrl+N para novo) |
|
|
32
|
+
| **Design minimalista** | Apenas informação necessária | Formulário em etapas (wizard) para dados longos |
|
|
33
|
+
| **Recuperação de erros** | Mensagens claras com ação de correção | "Email inválido. Verifique se digitou corretamente." |
|
|
34
|
+
| **Ajuda e documentação** | Tooltips, empty states com orientação | "Nenhum pedido encontrado. Clique aqui para criar." |
|
|
35
|
+
|
|
36
|
+
### 1.2. O que Especificar na TechSpec (Frontend)
|
|
37
|
+
|
|
38
|
+
Para cada tela/view/componente da feature:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Tela: [Nome da Tela]
|
|
42
|
+
Rota: /orders/new
|
|
43
|
+
Componentes: OrderForm, ProductSearch, CartSummary, AddressForm
|
|
44
|
+
Design System: shadcn-vue (conforme padrão do projeto)
|
|
45
|
+
Layout: DashboardLayout > PageContainer > OrderForm
|
|
46
|
+
|
|
47
|
+
Estados:
|
|
48
|
+
- Empty: "Adicione produtos ao seu pedido"
|
|
49
|
+
- Loading: Skeleton nos cards de produto
|
|
50
|
+
- Error: Toast de erro + botão "Tentar novamente"
|
|
51
|
+
- Success: Redirect para /orders/{id} com toast "Pedido criado!"
|
|
52
|
+
|
|
53
|
+
Validações:
|
|
54
|
+
- Produto: obrigatório, quantidade >= 1
|
|
55
|
+
- Endereço: CEP válido (busca automática via API)
|
|
56
|
+
- Submit: desabilitado até formulário válido
|
|
57
|
+
|
|
58
|
+
Acessibilidade:
|
|
59
|
+
- Formulário com fieldset e legend
|
|
60
|
+
- Labels visíveis para todos os inputs
|
|
61
|
+
- Erros com aria-describedby
|
|
62
|
+
- Focus no primeiro campo inválido após submit
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 2. Acessibilidade (a11y)
|
|
68
|
+
|
|
69
|
+
### 2.1. WCAG 2.1 - Nível AA (Mínimo Esperado)
|
|
70
|
+
|
|
71
|
+
**Princípio: Perceptível**
|
|
72
|
+
| Critério | O que especificar | Como verificar |
|
|
73
|
+
|:---|:---|:---|
|
|
74
|
+
| Texto alternativo | Imagens com `alt` descritivo | Screen reader lê descrição |
|
|
75
|
+
| Mídia time-based | Legendas em vídeos (se aplicável) | Legendas sincronizadas |
|
|
76
|
+
| Contraste | Mínimo 4.5:1 para texto normal, 3:1 para texto grande | Ferramenta de contraste |
|
|
77
|
+
| Texto redimensionável | Funciona até 200% zoom | Zoom do navegador |
|
|
78
|
+
| Conteúdo adaptável | Layout responsivo sem perda de informação | Testar em mobile |
|
|
79
|
+
|
|
80
|
+
**Princípio: Operável**
|
|
81
|
+
| Critério | O que especificar | Como verificar |
|
|
82
|
+
|:---|:---|:---|
|
|
83
|
+
| Teclado | Todos os controles acessíveis via Tab | Navegar sem mouse |
|
|
84
|
+
| Tempo suficiente | Sem time limits ou com opção de estender | Usuário controla tempo |
|
|
85
|
+
| Flash | Sem conteúdo que pisca > 3x/segundo | Sem risco de convulsão |
|
|
86
|
+
| Navegação | Skip links, landmarks, breadcrumbs | Tab pula para conteúdo |
|
|
87
|
+
| Input modal | Focus trap em modais/diálogos | Tab não sai do modal |
|
|
88
|
+
|
|
89
|
+
**Princípio: Compreensível**
|
|
90
|
+
| Critério | O que especificar | Como verificar |
|
|
91
|
+
|:---|:---|:---|
|
|
92
|
+
| Idioma | `<html lang="pt-BR">` | Screen reader usa idioma correto |
|
|
93
|
+
| Previsível | Navegação consistente, sem mudanças inesperadas | Mesmo padrão em todas as páginas |
|
|
94
|
+
| Assistência | Labels, instruções, sugestões de erro | Formulário guiado |
|
|
95
|
+
|
|
96
|
+
**Princípio: Robusto**
|
|
97
|
+
| Critério | O que especificar | Como verificar |
|
|
98
|
+
|:---|:---|:---|
|
|
99
|
+
| Compatível | HTML semântico, ARIA correto | Validação W3C + screen reader |
|
|
100
|
+
|
|
101
|
+
### 2.2. ARIA Patterns Essenciais
|
|
102
|
+
|
|
103
|
+
**Landmarks:**
|
|
104
|
+
```html
|
|
105
|
+
<header role="banner">
|
|
106
|
+
<nav role="navigation" aria-label="Menu principal">
|
|
107
|
+
<main role="main">
|
|
108
|
+
<aside role="complementary">
|
|
109
|
+
<footer role="contentinfo">
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Formulários acessíveis:**
|
|
113
|
+
```html
|
|
114
|
+
<label for="email">Email</label>
|
|
115
|
+
<input id="email" type="email" name="email" autocomplete="email"
|
|
116
|
+
aria-required="true"
|
|
117
|
+
aria-describedby="email-error"
|
|
118
|
+
placeholder="usuario@exemplo.com…" />
|
|
119
|
+
<span id="email-error" role="alert">Email inválido. Verifique se digitou corretamente.</span>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Estados dinâmicos:**
|
|
123
|
+
```html
|
|
124
|
+
<button aria-expanded="false" aria-controls="dropdown-menu">
|
|
125
|
+
Opções
|
|
126
|
+
</button>
|
|
127
|
+
<div id="dropdown-menu" role="listbox">
|
|
128
|
+
<div role="option" aria-selected="true">Opção 1</div>
|
|
129
|
+
</div>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Loading/Progresso:**
|
|
133
|
+
```html
|
|
134
|
+
<div role="status" aria-live="polite">
|
|
135
|
+
<div class="skeleton-card" aria-hidden="true">
|
|
136
|
+
<!-- Skeleton visual placeholder -->
|
|
137
|
+
</div>
|
|
138
|
+
<span class="sr-only">Carregando pedidos…</span>
|
|
139
|
+
</div>
|
|
140
|
+
<div role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
|
|
141
|
+
60%
|
|
142
|
+
</div>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Modais:**
|
|
146
|
+
```html
|
|
147
|
+
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
|
|
148
|
+
<h2 id="dialog-title">Confirmar exclusão</h2>
|
|
149
|
+
<button>Cancelar</button>
|
|
150
|
+
<button>Confirmar</button>
|
|
151
|
+
</div>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 2.3. Especificação na TechSpec
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
Acessibilidade:
|
|
158
|
+
- Nível WCAG: AA (mínimo)
|
|
159
|
+
- HTML semântico com landmarks (nav, main, aside)
|
|
160
|
+
- Todos os inputs com label visível e aria-describedby para erros
|
|
161
|
+
- Focus trap em modais (Dialog component do shadcn)
|
|
162
|
+
- Navegação por teclado: Tab para campos, Enter para submit, Esc para fechar modal
|
|
163
|
+
- aria-live="polite" para feedback de ações (toast)
|
|
164
|
+
- Skip link para pular navegação
|
|
165
|
+
- Contraste: seguir tokens do design system (≥ 4.5:1)
|
|
166
|
+
- Testar com: VoiceOver (Mac) ou NVDA (Windows)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 3. Design de Componentes
|
|
172
|
+
|
|
173
|
+
### 3.1. Hierarquia de Componentes
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
Layout (global)
|
|
177
|
+
└── Page (route-specific)
|
|
178
|
+
├── Header (page title, actions)
|
|
179
|
+
├── Content (main content area)
|
|
180
|
+
│ ├── Section (logical group)
|
|
181
|
+
│ │ ├── Card (container)
|
|
182
|
+
│ │ │ ├── Form (data entry)
|
|
183
|
+
│ │ │ │ ├── Field (input + label + error)
|
|
184
|
+
│ │ │ │ └── Actions (submit, cancel)
|
|
185
|
+
│ │ │ └── Display (read-only data)
|
|
186
|
+
│ │ └── Table (list data)
|
|
187
|
+
│ └── EmptyState (no data)
|
|
188
|
+
└── Footer (pagination, summary)
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 3.2. Composição com Design System
|
|
192
|
+
|
|
193
|
+
**Verificar biblioteca de UI existente no projeto:**
|
|
194
|
+
|
|
195
|
+
| Biblioteca | Componente de Botão | Componente de Input |
|
|
196
|
+
|:---|:---|:---|
|
|
197
|
+
| shadcn-vue | `<Button variant="default">` | `<Input />` |
|
|
198
|
+
| shadcn-ui | `<Button>` | `<Input />` |
|
|
199
|
+
| MUI | `<Button variant="contained">` | `<TextField>` |
|
|
200
|
+
| PrimeVue | `<Button label="OK">` | `<InputText>` |
|
|
201
|
+
| Vuetify | `<v-btn color="primary">` | `<v-text-field>` |
|
|
202
|
+
|
|
203
|
+
**Na TechSpec, especificar:**
|
|
204
|
+
```
|
|
205
|
+
Biblioteca UI: shadcn-vue (padrão do projeto, conforme package.json)
|
|
206
|
+
Componentes utilizados:
|
|
207
|
+
- Button (submit, cancel, delete)
|
|
208
|
+
- Input (text fields)
|
|
209
|
+
- Select (dropdown de status)
|
|
210
|
+
- Dialog (confirmação de exclusão)
|
|
211
|
+
- Table (listagem de pedidos)
|
|
212
|
+
- Toast (feedback de ações)
|
|
213
|
+
- Card (container de seções)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 3.3. Componentes por Feature
|
|
217
|
+
|
|
218
|
+
Para cada feature, especificar componentes necessários:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
Novos componentes:
|
|
222
|
+
- OrderForm.vue (formulário de criação de pedido)
|
|
223
|
+
Props: customerId, products[]
|
|
224
|
+
Events: submit(orderData), cancel()
|
|
225
|
+
Dependências: ProductSearch, CartSummary, AddressForm
|
|
226
|
+
|
|
227
|
+
- ProductSearch.vue (busca de produtos com autocomplete)
|
|
228
|
+
Props: []
|
|
229
|
+
Events: select(product)
|
|
230
|
+
State: loading, results[], searchTerm
|
|
231
|
+
|
|
232
|
+
- OrderStatusBadge.vue (badge de status com cor)
|
|
233
|
+
Props: status (PENDING | PAID | CANCELLED)
|
|
234
|
+
Render: cor condicional (PENDING=yellow, PAID=green, CANCELLED=red)
|
|
235
|
+
|
|
236
|
+
Componentes reutilizados:
|
|
237
|
+
- Card (shadcn) para containers
|
|
238
|
+
- Table (shadcn) para listagens
|
|
239
|
+
- Dialog (shadcn) para confirmações
|
|
240
|
+
- Toast (shadcn) para feedback
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 4. Estados de UI
|
|
246
|
+
|
|
247
|
+
### 4.1. Estados Obrigatórios
|
|
248
|
+
|
|
249
|
+
Para cada tela/componente que faz requisição:
|
|
250
|
+
|
|
251
|
+
| Estado | O que mostrar | Implementação |
|
|
252
|
+
|:---|:---|:---|
|
|
253
|
+
| **Initial** | Tela inicial sem dados carregados | Buscar dados no mount |
|
|
254
|
+
| **Loading** | Indicador visual de carregamento | Skeleton screen (preferido) ou Spinner |
|
|
255
|
+
| **Empty** | Estado quando não há dados | Ilustração + mensagem + CTA |
|
|
256
|
+
| **Success** | Dados carregados com sucesso | Renderizar dados |
|
|
257
|
+
| **Error** | Falha ao carregar dados | Mensagem + botão retry |
|
|
258
|
+
| **Partial** | Alguns dados carregados, outros não | Mostrar disponíveis, loading nos outros |
|
|
259
|
+
|
|
260
|
+
### 4.2. Skeleton Screens
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
Loading state: Skeleton screen
|
|
264
|
+
- Usar componente Skeleton do shadcn
|
|
265
|
+
- Replicar layout da tela final com placeholders
|
|
266
|
+
- Animação sutil (pulse)
|
|
267
|
+
- Timeout: após 10s, mostrar mensagem "Carregando..."
|
|
268
|
+
- Após 30s: mostrar error state com retry
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 4.3. Empty States
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
Empty state para listagens:
|
|
275
|
+
- Ícone/ilustração representativa
|
|
276
|
+
- Título: "Nenhum pedido encontrado"
|
|
277
|
+
- Descrição: "Crie seu primeiro pedido para começar."
|
|
278
|
+
- CTA: Botão "Criar Pedido" → navega para /orders/new
|
|
279
|
+
- Secondary action (opcional): Link para documentação/ajuda
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### 4.4. Exemplo Completo de Especificação de Tela
|
|
283
|
+
|
|
284
|
+
Para cada tela, especificar todos os estados integrados:
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
Tela: Listagem de Pedidos
|
|
288
|
+
Rota: /orders
|
|
289
|
+
Componente: OrderListPage
|
|
290
|
+
|
|
291
|
+
Estados de UI:
|
|
292
|
+
- Initial → Loading: Skeleton com aria-live="polite" e aria-hidden nos placeholders
|
|
293
|
+
- Loading → Success: Renderizar tabela de pedidos
|
|
294
|
+
- Loading → Error: "Falha ao carregar pedidos." + botão retry
|
|
295
|
+
- Success + vazio → Empty: "Nenhum pedido encontrado." + CTA "Criar Pedido"
|
|
296
|
+
|
|
297
|
+
Formulário de busca (se aplicável):
|
|
298
|
+
- Input com autocomplete="off", debounce 300ms, placeholder "Busque por nome, ID…"
|
|
299
|
+
- Resultados atualizam com aria-live="polite"
|
|
300
|
+
|
|
301
|
+
Acessibilidade:
|
|
302
|
+
- Skip link para pular navegação
|
|
303
|
+
- Tabela com <thead>/<tbody> semânticos
|
|
304
|
+
- Ações com <button>, não <div onClick>
|
|
305
|
+
- Paginação com <nav aria-label="Paginação">
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 5. Formulários
|
|
311
|
+
|
|
312
|
+
### 5.1. Padrão de Formulário
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
Formulário: OrderForm
|
|
316
|
+
Framework: useForm (Vue Use) ou React Hook Form (conforme projeto)
|
|
317
|
+
Validação: Zod schema (conforme projeto)
|
|
318
|
+
|
|
319
|
+
Campos:
|
|
320
|
+
| Campo | Tipo | Validação | autocomplete | Máscara |
|
|
321
|
+
|:---|:---|:---|:---|:---|
|
|
322
|
+
| email | email | obrigatório, formato email | email | - |
|
|
323
|
+
| phone | tel | obrigatório, 11 dígitos | tel | (00) 00000-0000 |
|
|
324
|
+
| zip_code | text | obrigatório, 8 dígitos | postal-code | 00000-000 |
|
|
325
|
+
| quantity | number | obrigatório, >= 1, <= 999 | off | - |
|
|
326
|
+
| password | password | obrigatório, min 8 chars | off | - |
|
|
327
|
+
| notes | textarea | opcional, max 500 chars | off | - |
|
|
328
|
+
|
|
329
|
+
Nota: Use `autocomplete="off"` em campos não-auth (como notas, CPF) para evitar trigger de password managers.
|
|
330
|
+
|
|
331
|
+
Comportamento:
|
|
332
|
+
- Validação: inline em blur (não em tempo real, para não irritar)
|
|
333
|
+
- Submit: validar tudo antes, scroll para primeiro erro
|
|
334
|
+
- Submitting: botão com loading state, desabilitado
|
|
335
|
+
- Success: redirect + toast
|
|
336
|
+
- Error: toast com mensagem específica
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### 5.2. Feedback de Validação
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
Estados de campo:
|
|
343
|
+
- Pristine: sem indicação visual (ainda não interagiu)
|
|
344
|
+
- Valid: borda verde (sutil), ícone check
|
|
345
|
+
- Invalid: borda vermelha, mensagem de erro abaixo do campo
|
|
346
|
+
- Disabled: visualmente distinto, sem interação
|
|
347
|
+
|
|
348
|
+
Mensagem de erro:
|
|
349
|
+
- Posição: abaixo do campo, alinhado à esquerda
|
|
350
|
+
- Cor: vermelho (conforme token do design system)
|
|
351
|
+
- Texto: específico ("Email é obrigatório" vs "Campo obrigatório")
|
|
352
|
+
- Icone: indicação visual além de cor
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## 6. Layout e Responsividade
|
|
358
|
+
|
|
359
|
+
### 6.1. Breakpoints
|
|
360
|
+
|
|
361
|
+
| Breakpoint | Largura | Layout | Colunas |
|
|
362
|
+
|:---|:---|:---|:---|
|
|
363
|
+
| **Mobile** | < 640px | Stack vertical | 1 coluna |
|
|
364
|
+
| **Tablet** | 640px - 1024px | Hybrid | 2 colunas |
|
|
365
|
+
| **Desktop** | 1024px+ | Layout completo | 3-4 colunas |
|
|
366
|
+
|
|
367
|
+
### 6.2. Padrões de Layout
|
|
368
|
+
|
|
369
|
+
**List page:**
|
|
370
|
+
```
|
|
371
|
+
Desktop: Table com colunas expandidas + ações inline
|
|
372
|
+
Tablet: Card list (cada item = card)
|
|
373
|
+
Mobile: Card list simplificada + swipe actions
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Form page:**
|
|
377
|
+
```
|
|
378
|
+
Desktop: 2 colunas (formulário + preview/summary)
|
|
379
|
+
Tablet: 1 coluna com sections collapsíveis
|
|
380
|
+
Mobile: Wizard (uma seção por vez)
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**Detail page:**
|
|
384
|
+
```
|
|
385
|
+
Desktop: Header com ações + tabs (info, histórico, documentos)
|
|
386
|
+
Tablet: Header com ações em menu dropdown + tabs
|
|
387
|
+
Mobile: Header sticky + scroll vertical
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### 6.3. Design Tokens
|
|
391
|
+
|
|
392
|
+
```
|
|
393
|
+
Spacing: { xs: 4px, sm: 8px, md: 16px, lg: 24px, xl: 32px, 2xl: 48px }
|
|
394
|
+
Typography: { sm: 12px, base: 14px, lg: 16px, xl: 20px, 2xl: 24px, 3xl: 32px }
|
|
395
|
+
BorderRadius: { sm: 4px, md: 8px, lg: 12px, full: 9999px }
|
|
396
|
+
Shadows: { sm: "0 1px 2px rgba(0,0,0,0.05)", md: "0 4px 6px rgba(0,0,0,0.07)" }
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
*(Verificar tokens do design system do projeto antes de definir)*
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## 7. Performance Percebida
|
|
404
|
+
|
|
405
|
+
### 7.1. Técnicas
|
|
406
|
+
|
|
407
|
+
| Técnica | Quando usar | O que especificar |
|
|
408
|
+
|:---|:---|:---|
|
|
409
|
+
| **Skeleton screen** | Carregamento de dados | Mostrar skeleton com mesmo layout |
|
|
410
|
+
| **Optimistic update** | Ações rápidas (like, favoritar) | Atualizar UI antes da resposta, reverter se falhar |
|
|
411
|
+
| **Lazy loading** | Imagens, componentes pesados | `loading="lazy"` em imagens, dynamic import |
|
|
412
|
+
| **Code splitting** | Páginas pesadas | Import dinâmico por rota |
|
|
413
|
+
| **Prefetching** | Links que usuário provavelmente clicará | `<Link prefetch>` ou hover prefetch |
|
|
414
|
+
| **Debounced search** | Campos de busca com API | 300ms debounce, cancelar request anterior |
|
|
415
|
+
| **Progressive loading** | Listagens longas | Infinite scroll ou "Carregar mais" |
|
|
416
|
+
|
|
417
|
+
### 7.2. Na TechSpec
|
|
418
|
+
|
|
419
|
+
```
|
|
420
|
+
Performance de UI:
|
|
421
|
+
- Listagem: paginação com "Carregar mais" (lazy loading)
|
|
422
|
+
- Imagens de produto: loading="lazy" + placeholder blur
|
|
423
|
+
- Busca de produtos: debounce 300ms + cancelar request anterior
|
|
424
|
+
- Criação de pedido: optimistic lock (desabilitar botão, mostrar loading)
|
|
425
|
+
- Componentes pesados: dynamic import (lazy) para formulário
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## 8. Interações e Feedback
|
|
431
|
+
|
|
432
|
+
### 8.1. Toast Notifications
|
|
433
|
+
|
|
434
|
+
```
|
|
435
|
+
Tipos:
|
|
436
|
+
- Success: "Pedido criado com sucesso!" (verde, auto-dismiss 5s)
|
|
437
|
+
- Error: "Falha ao criar pedido. Tente novamente." (vermelho, manual dismiss)
|
|
438
|
+
- Warning: "Estoque baixo para item X" (amarelo, auto-dismiss 7s)
|
|
439
|
+
- Info: "Pedido em processamento" (azul, auto-dismiss 5s)
|
|
440
|
+
|
|
441
|
+
Posição: bottom-right (padrão shadcn)
|
|
442
|
+
Stack: Máximo 3 toasts visíveis, substituir mais antigo
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### 8.2. Confirmações
|
|
446
|
+
|
|
447
|
+
```
|
|
448
|
+
Ações destrutivas (delete, cancel):
|
|
449
|
+
- Dialog de confirmação com título e descrição clara
|
|
450
|
+
- Botão primário: vermelho com texto da ação ("Excluir pedido")
|
|
451
|
+
- Botão secundário: "Cancelar" (fecha dialog)
|
|
452
|
+
- Input de confirmação para ações críticas ("Digite EXCLUIR para confirmar")
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### 8.3. Microinterações
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
Animações (se aplicável):
|
|
459
|
+
- Transição de página: fade-in (200ms)
|
|
460
|
+
- Abertura de modal: scale + fade (150ms)
|
|
461
|
+
- Hover em cards: elevação de shadow (150ms)
|
|
462
|
+
- Toggle de status: cor transiciona (200ms)
|
|
463
|
+
- Feedback de clique: ripple ou scale sutil (100ms)
|
|
464
|
+
|
|
465
|
+
Preferir animações de 150-200ms. Nada > 300ms (lento).
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 9. Checklist de UI/UX para TechSpec
|
|
471
|
+
|
|
472
|
+
Antes de finalizar a seção de frontend na TechSpec, verificar:
|
|
473
|
+
|
|
474
|
+
### Usabilidade
|
|
475
|
+
- [ ] Estados de UI definidos (loading, error, empty, success)
|
|
476
|
+
- [ ] Feedback visual para todas as ações do usuário
|
|
477
|
+
- [ ] Navegação clara (breadcrumbs, rotas, links)
|
|
478
|
+
- [ ] Prevenção de erros (validação inline, botões desabilitados)
|
|
479
|
+
- [ ] Linguagem do usuário (não técnica)
|
|
480
|
+
- [ ] Consistência com design system existente
|
|
481
|
+
|
|
482
|
+
### Acessibilidade
|
|
483
|
+
- [ ] HTML semântico com landmarks
|
|
484
|
+
- [ ] Labels visíveis para todos os inputs
|
|
485
|
+
- [ ] Navegação por teclado (Tab, Enter, Esc)
|
|
486
|
+
- [ ] Contraste adequado (≥ 4.5:1)
|
|
487
|
+
- [ ] aria-describedby para erros de validação
|
|
488
|
+
- [ ] aria-live para conteúdo dinâmico
|
|
489
|
+
- [ ] Focus trap em modais
|
|
490
|
+
- [ ] Skip link disponível
|
|
491
|
+
- [ ] Testado com screen reader (ou plano para testar)
|
|
492
|
+
|
|
493
|
+
### Componentes
|
|
494
|
+
- [ ] Biblioteca UI existente mapeada
|
|
495
|
+
- [ ] Novos componentes especificados (props, events, state)
|
|
496
|
+
- [ ] Componentes reutilizados identificados
|
|
497
|
+
- [ ] Composição hierárquica documentada
|
|
498
|
+
|
|
499
|
+
### Formulários
|
|
500
|
+
- [ ] Campos com tipos e validações
|
|
501
|
+
- [ ] Feedback de validação (inline em blur)
|
|
502
|
+
- [ ] Máscaras de input (se aplicável)
|
|
503
|
+
- [ ] Submit com loading state
|
|
504
|
+
- [ ] Error handling com mensagem específica
|
|
505
|
+
|
|
506
|
+
### Performance
|
|
507
|
+
- [ ] Lazy loading especificado (imagens, componentes)
|
|
508
|
+
- [ ] Debounce em campos de busca
|
|
509
|
+
- [ ] Paginação ou infinite scroll
|
|
510
|
+
- [ ] Code splitting por rota (se aplicável)
|
|
511
|
+
- [ ] Skeleton screens para loading
|