@the-bearded-bear/claude-craft 8.8.1 → 8.8.2
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/Dev/i18n/de/Angular/commands/check-compliance.md +218 -168
- package/Dev/i18n/de/Common/agents/refactoring-specialist.md +146 -69
- package/Dev/i18n/de/Common/commands/add-technology.md +166 -68
- package/Dev/i18n/de/Common/commands/setup-ci.md +216 -33
- package/Dev/i18n/de/Laravel/commands/check-compliance.md +223 -115
- package/Dev/i18n/de/Python/checklists/new-feature.md +319 -44
- package/Dev/i18n/de/React/rules/02-architecture.md +483 -322
- package/Dev/i18n/de/React/rules/03-coding-standards.md +584 -368
- package/Dev/i18n/de/Symfony/commands/check-compliance.md +186 -114
- package/Dev/i18n/de/Symfony/rules/07-testing-symfony.md +679 -10
- package/Dev/i18n/de/UIUX/commands/a11y-component.md +284 -26
- package/Dev/i18n/de/UIUX/commands/design-tokens.md +199 -35
- package/Dev/i18n/de/UIUX/commands/user-flow.md +179 -16
- package/Dev/i18n/de/VueJS/commands/check-compliance.md +227 -102
- package/Dev/i18n/es/Angular/commands/check-compliance.md +217 -167
- package/Dev/i18n/es/Common/commands/add-technology.md +158 -60
- package/Dev/i18n/es/Laravel/commands/check-compliance.md +223 -115
- package/Dev/i18n/es/React/commands/check-testing.md +263 -169
- package/Dev/i18n/es/ReactNative/commands/check-testing.md +256 -198
- package/Dev/i18n/es/Symfony/commands/check-compliance.md +189 -117
- package/Dev/i18n/es/Symfony/commands/check-testing.md +301 -102
- package/Dev/i18n/es/Symfony/commands/migration-plan.md +267 -34
- package/Dev/i18n/es/UIUX/commands/a11y-component.md +274 -16
- package/Dev/i18n/es/UIUX/commands/design-tokens.md +186 -22
- package/Dev/i18n/es/UIUX/commands/user-flow.md +173 -10
- package/Dev/i18n/es/VueJS/commands/check-compliance.md +227 -102
- package/Dev/i18n/fr/Angular/commands/check-compliance.md +217 -167
- package/Dev/i18n/fr/Common/commands/ralph-run.md +138 -60
- package/Dev/i18n/fr/Laravel/commands/check-compliance.md +223 -115
- package/Dev/i18n/fr/React/commands/check-architecture.md +370 -53
- package/Dev/i18n/fr/React/commands/check-code-quality.md +454 -64
- package/Dev/i18n/fr/React/commands/check-testing.md +476 -102
- package/Dev/i18n/fr/Symfony/commands/check-compliance.md +188 -116
- package/Dev/i18n/fr/VueJS/commands/check-compliance.md +227 -102
- package/Dev/i18n/pt/Angular/commands/check-compliance.md +225 -175
- package/Dev/i18n/pt/Common/agents/ralph-conductor.md +211 -30
- package/Dev/i18n/pt/Common/commands/add-technology.md +149 -51
- package/Dev/i18n/pt/Common/commands/ralph-run.md +239 -35
- package/Dev/i18n/pt/Flutter/commands/analyze-performance.md +331 -46
- package/Dev/i18n/pt/Flutter/commands/check-compliance.md +234 -29
- package/Dev/i18n/pt/Flutter/commands/generate-feature.md +526 -51
- package/Dev/i18n/pt/Flutter/commands/generate-widget.md +515 -27
- package/Dev/i18n/pt/Flutter/commands/golden-update.md +322 -46
- package/Dev/i18n/pt/Flutter/commands/localization-check.md +278 -37
- package/Dev/i18n/pt/Laravel/commands/check-compliance.md +212 -104
- package/Dev/i18n/pt/React/commands/accessibility-check.md +151 -42
- package/Dev/i18n/pt/React/commands/bundle-analyze.md +300 -25
- package/Dev/i18n/pt/React/commands/check-architecture.md +369 -34
- package/Dev/i18n/pt/React/commands/check-code-quality.md +440 -34
- package/Dev/i18n/pt/React/commands/check-compliance.md +232 -62
- package/Dev/i18n/pt/React/commands/check-security.md +370 -31
- package/Dev/i18n/pt/React/commands/check-testing.md +473 -43
- package/Dev/i18n/pt/React/commands/generate-component.md +454 -19
- package/Dev/i18n/pt/React/commands/generate-hook.md +425 -24
- package/Dev/i18n/pt/React/commands/storybook-story.md +520 -35
- package/Dev/i18n/pt/ReactNative/commands/app-size.md +358 -387
- package/Dev/i18n/pt/ReactNative/commands/check-code-quality.md +246 -75
- package/Dev/i18n/pt/ReactNative/commands/check-compliance.md +191 -85
- package/Dev/i18n/pt/ReactNative/commands/check-security.md +363 -115
- package/Dev/i18n/pt/ReactNative/commands/check-testing.md +269 -79
- package/Dev/i18n/pt/ReactNative/commands/generate-screen.md +491 -324
- package/Dev/i18n/pt/ReactNative/commands/native-module.md +539 -82
- package/Dev/i18n/pt/ReactNative/commands/store-prepare.md +429 -185
- package/Dev/i18n/pt/ReactNative/rules/02-architecture.md +1084 -31
- package/Dev/i18n/pt/Symfony/commands/check-compliance.md +195 -123
- package/Dev/i18n/pt/UIUX/commands/a11y-audit.md +208 -24
- package/Dev/i18n/pt/UIUX/commands/a11y-component.md +281 -23
- package/Dev/i18n/pt/UIUX/commands/design-tokens.md +197 -33
- package/Dev/i18n/pt/UIUX/commands/user-flow.md +183 -20
- package/Dev/i18n/pt/VueJS/commands/check-compliance.md +228 -103
- package/Dev/i18n/pt/Workflow/commands/analyze.md +147 -146
- package/Dev/i18n/pt/Workflow/commands/design.md +205 -204
- package/Dev/i18n/pt/Workflow/commands/implement.md +184 -184
- package/Project/i18n/de/Sprint/commands/dev.md +339 -86
- package/Project/i18n/es/Sprint/commands/dev.md +342 -91
- package/Project/i18n/pt/Sprint/commands/dev.md +343 -92
- package/bundles/cursor/.cursorrules +1 -1
- package/bundles/windsurf/.windsurfrules +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Especificação de Acessibilidade de Componente
|
|
3
|
-
argument-hint: [
|
|
3
|
+
argument-hint: [argumentos]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Especificação de Acessibilidade de Componente
|
|
7
7
|
|
|
8
|
-
Você é um Especialista em Acessibilidade certificado. Você deve produzir
|
|
8
|
+
Você é um Especialista em Acessibilidade certificado. Você deve produzir especificações completas de acessibilidade para um componente de IU.
|
|
9
9
|
|
|
10
10
|
## Argumentos
|
|
11
11
|
$ARGUMENTS
|
|
@@ -14,23 +14,23 @@ Argumentos:
|
|
|
14
14
|
- Nome do componente
|
|
15
15
|
- (Opcional) Tipo: button, input, modal, dropdown, tabs, accordion, tooltip, etc.
|
|
16
16
|
|
|
17
|
-
Exemplo: `/uiux:a11y-component Modal` ou `/uiux:a11y-component "
|
|
17
|
+
Exemplo: `/uiux:a11y-component Modal` ou `/uiux:a11y-component "Date Picker" type:input`
|
|
18
18
|
|
|
19
|
-
## Modo
|
|
19
|
+
## Modo de Planejamento
|
|
20
20
|
|
|
21
|
-
> **O modo
|
|
21
|
+
> **O modo de planejamento é obrigatório.** Antes de executar, Claude ativa o modo de planejamento para analisar o código impactado, propor um plano de implementação e aguardar a sua validação antes de fazer qualquer alteração.
|
|
22
22
|
|
|
23
23
|
## MISSÃO
|
|
24
24
|
|
|
25
25
|
### Etapa 1: Identificar o padrão ARIA
|
|
26
26
|
|
|
27
|
-
Consultar o
|
|
27
|
+
Consultar o Guia de Práticas de Autoria ARIA (APG) para o padrão correspondente.
|
|
28
28
|
|
|
29
29
|
### Etapa 2: Produzir a especificação
|
|
30
30
|
|
|
31
31
|
```
|
|
32
32
|
══════════════════════════════════════════════════════════════
|
|
33
|
-
♿ ESPECIFICAÇÃO ACESSIBILIDADE: {
|
|
33
|
+
♿ ESPECIFICAÇÃO DE ACESSIBILIDADE: {NOME_DO_COMPONENTE}
|
|
34
34
|
══════════════════════════════════════════════════════════════
|
|
35
35
|
|
|
36
36
|
Tipo: {Button | Input | Dialog | Listbox | Tabs | ...}
|
|
@@ -42,14 +42,24 @@ Data: {data}
|
|
|
42
42
|
──────────────────────────────────────────────────────────────
|
|
43
43
|
|
|
44
44
|
### Elemento nativo recomendado
|
|
45
|
+
|
|
45
46
|
```html
|
|
46
|
-
<!-- Sempre
|
|
47
|
+
<!-- Sempre prefira o elemento nativo -->
|
|
47
48
|
<{elemento} ...>
|
|
48
49
|
{conteúdo}
|
|
49
50
|
</{elemento}>
|
|
50
51
|
```
|
|
51
52
|
|
|
53
|
+
### Se componente customizado for necessário
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<div role="{role}" ...>
|
|
57
|
+
{conteúdo}
|
|
58
|
+
</div>
|
|
59
|
+
```
|
|
60
|
+
|
|
52
61
|
### Estrutura completa
|
|
62
|
+
|
|
53
63
|
```html
|
|
54
64
|
<!-- Exemplo completo com ARIA -->
|
|
55
65
|
<div
|
|
@@ -57,7 +67,8 @@ Data: {data}
|
|
|
57
67
|
aria-{atributo}="{valor}"
|
|
58
68
|
tabindex="0"
|
|
59
69
|
>
|
|
60
|
-
<span id="{id}-label">{
|
|
70
|
+
<span id="{id}-label">{Rótulo}</span>
|
|
71
|
+
<div id="{id}-description">{Descrição}</div>
|
|
61
72
|
{conteúdo}
|
|
62
73
|
</div>
|
|
63
74
|
```
|
|
@@ -66,77 +77,324 @@ Data: {data}
|
|
|
66
77
|
🏷️ ATRIBUTOS ARIA
|
|
67
78
|
──────────────────────────────────────────────────────────────
|
|
68
79
|
|
|
69
|
-
### Atributos
|
|
80
|
+
### Atributos obrigatórios
|
|
81
|
+
|
|
70
82
|
| Atributo | Valor | Quando | Descrição |
|
|
71
83
|
|----------|-------|--------|-----------|
|
|
72
|
-
| role | {role} | Sempre (se
|
|
73
|
-
| aria-label | "{texto}" | Se
|
|
84
|
+
| role | {role} | Sempre (se customizado) | Define o tipo |
|
|
85
|
+
| aria-label | "{texto}" | Se sem rótulo visível | Rótulo acessível |
|
|
86
|
+
| aria-labelledby | "{id}" | Se rótulo visível | Referência ao rótulo |
|
|
74
87
|
|
|
75
88
|
### Atributos condicionais
|
|
89
|
+
|
|
76
90
|
| Atributo | Valor | Quando | Descrição |
|
|
77
91
|
|----------|-------|--------|-----------|
|
|
92
|
+
| aria-describedby | "{id}" | Se há descrição | Referência à descrição |
|
|
78
93
|
| aria-expanded | "true"/"false" | Se expansível | Estado aberto/fechado |
|
|
94
|
+
| aria-controls | "{id}" | Se controla outro | ID do elemento controlado |
|
|
95
|
+
| aria-owns | "{id}" | Se DOM separado | Relação pai |
|
|
96
|
+
| aria-haspopup | "dialog"/"menu"/"listbox" | Se popup | Tipo de popup |
|
|
97
|
+
| aria-pressed | "true"/"false" | Se toggle | Estado pressionado |
|
|
98
|
+
| aria-selected | "true"/"false" | Se seleção | Estado selecionado |
|
|
99
|
+
| aria-checked | "true"/"false"/"mixed" | Se caixa de seleção | Estado marcado |
|
|
79
100
|
| aria-disabled | "true" | Se desabilitado | Estado desabilitado |
|
|
101
|
+
| aria-invalid | "true" | Se erro | Estado inválido |
|
|
102
|
+
| aria-required | "true" | Se obrigatório | Campo obrigatório |
|
|
103
|
+
| aria-busy | "true" | Se carregando | Em progresso |
|
|
104
|
+
| aria-live | "polite"/"assertive" | Se dinâmico | Anunciar alteração |
|
|
105
|
+
| aria-atomic | "true" | Com aria-live | Anunciar tudo |
|
|
106
|
+
|
|
107
|
+
### Estados por interação
|
|
108
|
+
|
|
109
|
+
| Estado | Atributos ARIA |
|
|
110
|
+
|--------|----------------|
|
|
111
|
+
| Padrão | {atributos base} |
|
|
112
|
+
| Hover | Sem alteração ARIA |
|
|
113
|
+
| Foco | Sem alteração ARIA |
|
|
114
|
+
| Expandido | aria-expanded="true" |
|
|
115
|
+
| Recolhido | aria-expanded="false" |
|
|
116
|
+
| Selecionado | aria-selected="true" |
|
|
117
|
+
| Desabilitado | aria-disabled="true" |
|
|
118
|
+
| Carregando | aria-busy="true" |
|
|
119
|
+
| Erro | aria-invalid="true", aria-errormessage="{id}" |
|
|
80
120
|
|
|
81
121
|
──────────────────────────────────────────────────────────────
|
|
82
122
|
⌨️ NAVEGAÇÃO POR TECLADO
|
|
83
123
|
──────────────────────────────────────────────────────────────
|
|
84
124
|
|
|
125
|
+
### Teclas principais
|
|
126
|
+
|
|
85
127
|
| Tecla | Ação | Detalhe |
|
|
86
128
|
|-------|------|---------|
|
|
87
129
|
| Tab | Foco no componente | Entra no componente |
|
|
88
|
-
|
|
|
89
|
-
|
|
|
130
|
+
| Shift+Tab | Foco anterior | Sai do componente |
|
|
131
|
+
| Enter | Ativar | Ação primária |
|
|
132
|
+
| Space | Ativar (toggle) | Para botões de alternância |
|
|
90
133
|
| Escape | Fechar/Cancelar | Se popup/modal |
|
|
91
|
-
|
|
|
134
|
+
| ↑ Seta para cima | Item anterior | Navegação em lista |
|
|
135
|
+
| ↓ Seta para baixo | Próximo item | Navegação em lista |
|
|
136
|
+
| ← Seta para esquerda | Item anterior (horizontal) | Abas, slider |
|
|
137
|
+
| → Seta para direita | Próximo item (horizontal) | Abas, slider |
|
|
138
|
+
| Home | Primeiro item | Navegação rápida |
|
|
139
|
+
| End | Último item | Navegação rápida |
|
|
140
|
+
|
|
141
|
+
### Gestão do foco
|
|
142
|
+
|
|
143
|
+
| Situação | Comportamento |
|
|
144
|
+
|----------|---------------|
|
|
145
|
+
| Abertura | Foco no {primeiro elemento focalizável} |
|
|
146
|
+
| Fechamento | Foco retorna ao {elemento acionador} |
|
|
147
|
+
| Navegação interna | Roving tabindex OU aria-activedescendant |
|
|
148
|
+
| Armadilha de foco | {Sim para modal / Não para dropdown} |
|
|
149
|
+
|
|
150
|
+
### Roving tabindex (se aplicável)
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<!-- Apenas um elemento focalizável por vez -->
|
|
154
|
+
<div role="tablist">
|
|
155
|
+
<button role="tab" tabindex="0" aria-selected="true">Aba 1</button>
|
|
156
|
+
<button role="tab" tabindex="-1" aria-selected="false">Aba 2</button>
|
|
157
|
+
<button role="tab" tabindex="-1" aria-selected="false">Aba 3</button>
|
|
158
|
+
</div>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
──────────────────────────────────────────────────────────────
|
|
162
|
+
🎯 FOCO VISÍVEL
|
|
163
|
+
──────────────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
### Estilo obrigatório (WCAG 2.4.11 AAA)
|
|
166
|
+
|
|
167
|
+
```css
|
|
168
|
+
.{componente}:focus-visible {
|
|
169
|
+
/* Contorno visível */
|
|
170
|
+
outline: 2px solid var(--color-focus);
|
|
171
|
+
outline-offset: 2px;
|
|
172
|
+
|
|
173
|
+
/* Proporção de contraste ≥ 3:1 */
|
|
174
|
+
/* Área de foco ≥ perímetro visível */
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Redefinir para mouse */
|
|
178
|
+
.{componente}:focus:not(:focus-visible) {
|
|
179
|
+
outline: none;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Verificações
|
|
184
|
+
|
|
185
|
+
| Critério | Valor | Status |
|
|
186
|
+
|----------|-------|--------|
|
|
187
|
+
| Espessura do contorno | ≥ 2px | ✅ |
|
|
188
|
+
| Contraste do contorno | ≥ 3:1 | ✅ |
|
|
189
|
+
| Área visível | ≥ perímetro | ✅ |
|
|
190
|
+
| Visível em todos os fundos | Sim | ✅ |
|
|
92
191
|
|
|
93
192
|
──────────────────────────────────────────────────────────────
|
|
94
193
|
🔊 ANÚNCIOS DO LEITOR DE TELA
|
|
95
194
|
──────────────────────────────────────────────────────────────
|
|
96
195
|
|
|
97
196
|
### Ao entrar (foco)
|
|
197
|
+
|
|
98
198
|
```
|
|
99
|
-
"{
|
|
199
|
+
"{Rótulo}, {role}, {estado}"
|
|
200
|
+
|
|
100
201
|
Exemplos:
|
|
101
202
|
- "Enviar, botão"
|
|
102
203
|
- "Menu principal, menu, recolhido"
|
|
204
|
+
- "Nome, campo de texto, obrigatório"
|
|
205
|
+
- "Newsletter, caixa de seleção, não marcada"
|
|
103
206
|
```
|
|
104
207
|
|
|
105
|
-
### Durante interação
|
|
208
|
+
### Durante a interação
|
|
209
|
+
|
|
106
210
|
| Ação | Anúncio |
|
|
107
211
|
|------|---------|
|
|
108
212
|
| Expansão | "expandido" / "recolhido" |
|
|
213
|
+
| Seleção | "selecionado" |
|
|
214
|
+
| Alternância | "ativado" / "desativado" |
|
|
215
|
+
| Carregando | "Carregando" |
|
|
216
|
+
| Sucesso | "{mensagem de sucesso}" |
|
|
109
217
|
| Erro | "Erro: {mensagem}" |
|
|
110
218
|
|
|
219
|
+
### Conteúdo dinâmico (aria-live)
|
|
220
|
+
|
|
221
|
+
```html
|
|
222
|
+
<!-- Notificações educadas (não urgentes) -->
|
|
223
|
+
<div aria-live="polite" aria-atomic="true">
|
|
224
|
+
{mensagem toast}
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<!-- Notificações urgentes (erros) -->
|
|
228
|
+
<div aria-live="assertive" aria-atomic="true">
|
|
229
|
+
{mensagem de erro}
|
|
230
|
+
</div>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
──────────────────────────────────────────────────────────────
|
|
234
|
+
📏 CONTRASTE (WCAG AAA)
|
|
235
|
+
──────────────────────────────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
### Texto
|
|
238
|
+
|
|
239
|
+
| Tipo | Proporção requerida | Verificação |
|
|
240
|
+
|------|---------------------|-------------|
|
|
241
|
+
| Texto normal (< 18px) | ≥ 7:1 | {cor} / {fundo} = {proporção} |
|
|
242
|
+
| Texto grande (≥ 18px ou 14px negrito) | ≥ 4,5:1 | {cor} / {fundo} = {proporção} |
|
|
243
|
+
|
|
244
|
+
### Elementos de IU
|
|
245
|
+
|
|
246
|
+
| Elemento | Proporção requerida | Verificação |
|
|
247
|
+
|----------|---------------------|-------------|
|
|
248
|
+
| Bordas | ≥ 3:1 | {cor} / {fundo} = {proporção} |
|
|
249
|
+
| Ícones | ≥ 3:1 | {cor} / {fundo} = {proporção} |
|
|
250
|
+
| Contorno de foco | ≥ 3:1 | {cor} / {fundo} = {proporção} |
|
|
251
|
+
|
|
252
|
+
### Estados
|
|
253
|
+
|
|
254
|
+
| Estado | Verificação de contraste |
|
|
255
|
+
|--------|--------------------------|
|
|
256
|
+
| Padrão | ✅ {proporção} |
|
|
257
|
+
| Hover | ✅ {proporção} |
|
|
258
|
+
| Foco | ✅ {proporção} |
|
|
259
|
+
| Desabilitado | ⚠️ Não obrigatório, mas recomendado |
|
|
260
|
+
|
|
111
261
|
──────────────────────────────────────────────────────────────
|
|
112
262
|
📐 ALVOS DE TOQUE (WCAG 2.5.5 AAA)
|
|
113
263
|
──────────────────────────────────────────────────────────────
|
|
114
264
|
|
|
265
|
+
### Dimensões mínimas
|
|
266
|
+
|
|
115
267
|
| Critério | Valor | Status |
|
|
116
268
|
|----------|-------|--------|
|
|
117
269
|
| Tamanho mínimo | 44 × 44 pixels CSS | ✅/❌ |
|
|
118
270
|
| Espaçamento entre alvos | ≥ 8px | ✅/❌ |
|
|
119
271
|
|
|
272
|
+
### Implementação
|
|
273
|
+
|
|
274
|
+
```css
|
|
275
|
+
.{componente} {
|
|
276
|
+
min-width: 44px;
|
|
277
|
+
min-height: 44px;
|
|
278
|
+
/* OU padding para atingir 44px */
|
|
279
|
+
padding: 10px 16px; /* se altura do texto ~24px */
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* Botões com ícone */
|
|
283
|
+
.{componente}-icon {
|
|
284
|
+
width: 44px;
|
|
285
|
+
height: 44px;
|
|
286
|
+
display: flex;
|
|
287
|
+
align-items: center;
|
|
288
|
+
justify-content: center;
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
──────────────────────────────────────────────────────────────
|
|
293
|
+
🧪 TESTES A REALIZAR
|
|
294
|
+
──────────────────────────────────────────────────────────────
|
|
295
|
+
|
|
296
|
+
### Automatizados
|
|
297
|
+
|
|
298
|
+
- [ ] axe DevTools: 0 violações
|
|
299
|
+
- [ ] Lighthouse Accessibility: 100/100
|
|
300
|
+
- [ ] ESLint jsx-a11y: 0 erros
|
|
301
|
+
|
|
302
|
+
### Manuais
|
|
303
|
+
|
|
304
|
+
- [ ] Navegação completa por teclado
|
|
305
|
+
- [ ] Foco visível em cada etapa
|
|
306
|
+
- [ ] Sem armadilha de teclado
|
|
307
|
+
- [ ] Ordem de foco lógica
|
|
308
|
+
|
|
309
|
+
### Leitor de tela
|
|
310
|
+
|
|
311
|
+
- [ ] VoiceOver (macOS/iOS): anúncios corretos
|
|
312
|
+
- [ ] NVDA (Windows): navegação em listas/tabelas
|
|
313
|
+
- [ ] TalkBack (Android): se móvel
|
|
314
|
+
|
|
315
|
+
### Casos extremos
|
|
316
|
+
|
|
317
|
+
- [ ] Zoom 400%: sem perda de conteúdo
|
|
318
|
+
- [ ] Modo de alto contraste: visível
|
|
319
|
+
- [ ] Movimento reduzido: animações respeitadas
|
|
320
|
+
|
|
321
|
+
──────────────────────────────────────────────────────────────
|
|
322
|
+
💻 EXEMPLO DE IMPLEMENTAÇÃO
|
|
323
|
+
──────────────────────────────────────────────────────────────
|
|
324
|
+
|
|
325
|
+
```tsx
|
|
326
|
+
// {Componente}.tsx
|
|
327
|
+
import { forwardRef, useId } from 'react';
|
|
328
|
+
|
|
329
|
+
interface {Componente}Props {
|
|
330
|
+
label: string;
|
|
331
|
+
description?: string;
|
|
332
|
+
disabled?: boolean;
|
|
333
|
+
// ...outras props
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export const {Componente} = forwardRef<HTML{Elemento}Element, {Componente}Props>(
|
|
337
|
+
({ label, description, disabled, ...props }, ref) => {
|
|
338
|
+
const id = useId();
|
|
339
|
+
const descriptionId = description ? `${id}-description` : undefined;
|
|
340
|
+
|
|
341
|
+
return (
|
|
342
|
+
<{elemento}
|
|
343
|
+
ref={ref}
|
|
344
|
+
id={id}
|
|
345
|
+
role="{role}"
|
|
346
|
+
aria-label={label}
|
|
347
|
+
aria-describedby={descriptionId}
|
|
348
|
+
aria-disabled={disabled}
|
|
349
|
+
tabIndex={disabled ? -1 : 0}
|
|
350
|
+
{...props}
|
|
351
|
+
>
|
|
352
|
+
{/* Conteúdo */}
|
|
353
|
+
|
|
354
|
+
{description && (
|
|
355
|
+
<span id={descriptionId} className="sr-only">
|
|
356
|
+
{description}
|
|
357
|
+
</span>
|
|
358
|
+
)}
|
|
359
|
+
</{elemento}>
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
{Componente}.displayName = '{Componente}';
|
|
365
|
+
```
|
|
366
|
+
|
|
120
367
|
──────────────────────────────────────────────────────────────
|
|
121
368
|
✅ CHECKLIST DE VALIDAÇÃO
|
|
122
369
|
──────────────────────────────────────────────────────────────
|
|
123
370
|
|
|
124
371
|
### Semântica
|
|
125
|
-
- [ ] Elemento HTML nativo
|
|
126
|
-
- [ ] Role ARIA correto se
|
|
372
|
+
- [ ] Elemento HTML nativo utilizado quando possível
|
|
373
|
+
- [ ] Role ARIA correto se customizado
|
|
127
374
|
- [ ] Estrutura DOM lógica
|
|
128
375
|
|
|
129
376
|
### ARIA
|
|
130
|
-
- [ ] Atributos
|
|
131
|
-
- [ ]
|
|
377
|
+
- [ ] Atributos obrigatórios presentes
|
|
378
|
+
- [ ] Atributos condicionais corretos
|
|
379
|
+
- [ ] Sem sobrecarga de ARIA (nativo > ARIA)
|
|
132
380
|
|
|
133
381
|
### Teclado
|
|
134
|
-
- [ ]
|
|
382
|
+
- [ ] Focalizável (tabindex apropriado)
|
|
135
383
|
- [ ] Todas as ações via teclado
|
|
136
384
|
- [ ] Sem armadilha de teclado
|
|
137
385
|
- [ ] Foco visível conforme
|
|
138
386
|
|
|
387
|
+
### Anúncios
|
|
388
|
+
- [ ] Rótulo anunciado ao focar
|
|
389
|
+
- [ ] Estados anunciados na mudança
|
|
390
|
+
- [ ] Erros com aria-live assertive
|
|
391
|
+
|
|
139
392
|
### Contraste
|
|
140
393
|
- [ ] Texto ≥ 7:1 (AAA)
|
|
141
|
-
- [ ]
|
|
394
|
+
- [ ] IU ≥ 3:1
|
|
395
|
+
- [ ] Foco ≥ 3:1
|
|
396
|
+
|
|
397
|
+
### Toque
|
|
398
|
+
- [ ] Alvos ≥ 44×44px
|
|
399
|
+
- [ ] Espaçamento ≥ 8px
|
|
142
400
|
```
|