@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
|
@@ -18,7 +18,7 @@ Ejemplo: `/uiux:a11y-component Modal` o `/uiux:a11y-component "Selector de Fecha
|
|
|
18
18
|
|
|
19
19
|
## Modo Plan
|
|
20
20
|
|
|
21
|
-
> **El modo plan es obligatorio.** Antes de ejecutar, Claude activa el modo plan para analizar el código
|
|
21
|
+
> **El modo plan es obligatorio.** Antes de ejecutar, Claude activa el modo plan para analizar el código afectado, proponer un plan de implementación y esperar tu validación antes de realizar cualquier cambio.
|
|
22
22
|
|
|
23
23
|
## MISIÓN
|
|
24
24
|
|
|
@@ -30,7 +30,7 @@ Consultar las ARIA Authoring Practices Guide (APG) para el patrón correspondien
|
|
|
30
30
|
|
|
31
31
|
```
|
|
32
32
|
══════════════════════════════════════════════════════════════
|
|
33
|
-
♿ ESPECIFICACIÓN ACCESIBILIDAD: {NOMBRE_COMPONENTE}
|
|
33
|
+
♿ ESPECIFICACIÓN DE ACCESIBILIDAD: {NOMBRE_COMPONENTE}
|
|
34
34
|
══════════════════════════════════════════════════════════════
|
|
35
35
|
|
|
36
36
|
Tipo: {Button | Input | Dialog | Listbox | Tabs | ...}
|
|
@@ -42,14 +42,24 @@ Fecha: {fecha}
|
|
|
42
42
|
──────────────────────────────────────────────────────────────
|
|
43
43
|
|
|
44
44
|
### Elemento nativo recomendado
|
|
45
|
+
|
|
45
46
|
```html
|
|
46
|
-
<!-- Siempre preferir elemento nativo -->
|
|
47
|
+
<!-- Siempre preferir el elemento nativo -->
|
|
47
48
|
<{elemento} ...>
|
|
48
49
|
{contenido}
|
|
49
50
|
</{elemento}>
|
|
50
51
|
```
|
|
51
52
|
|
|
53
|
+
### Si se requiere un componente personalizado
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<div role="{role}" ...>
|
|
57
|
+
{contenido}
|
|
58
|
+
</div>
|
|
59
|
+
```
|
|
60
|
+
|
|
52
61
|
### Estructura completa
|
|
62
|
+
|
|
53
63
|
```html
|
|
54
64
|
<!-- Ejemplo completo con ARIA -->
|
|
55
65
|
<div
|
|
@@ -57,7 +67,8 @@ Fecha: {fecha}
|
|
|
57
67
|
aria-{atributo}="{valor}"
|
|
58
68
|
tabindex="0"
|
|
59
69
|
>
|
|
60
|
-
<span id="{id}-label">{
|
|
70
|
+
<span id="{id}-label">{Etiqueta}</span>
|
|
71
|
+
<div id="{id}-description">{Descripción}</div>
|
|
61
72
|
{contenido}
|
|
62
73
|
</div>
|
|
63
74
|
```
|
|
@@ -67,76 +78,323 @@ Fecha: {fecha}
|
|
|
67
78
|
──────────────────────────────────────────────────────────────
|
|
68
79
|
|
|
69
80
|
### Atributos requeridos
|
|
81
|
+
|
|
70
82
|
| Atributo | Valor | Cuándo | Descripción |
|
|
71
83
|
|----------|-------|--------|-------------|
|
|
72
|
-
| role | {role} | Siempre (si
|
|
73
|
-
| aria-label | "{texto}" | Si no hay
|
|
84
|
+
| role | {role} | Siempre (si personalizado) | Define el tipo |
|
|
85
|
+
| aria-label | "{texto}" | Si no hay etiqueta visible | Etiqueta accesible |
|
|
86
|
+
| aria-labelledby | "{id}" | Si hay etiqueta visible | Referencia a la etiqueta |
|
|
74
87
|
|
|
75
88
|
### Atributos condicionales
|
|
89
|
+
|
|
76
90
|
| Atributo | Valor | Cuándo | Descripción |
|
|
77
91
|
|----------|-------|--------|-------------|
|
|
78
|
-
| aria-
|
|
79
|
-
| aria-
|
|
92
|
+
| aria-describedby | "{id}" | Si hay descripción | Referencia a la descripción |
|
|
93
|
+
| aria-expanded | "true"/"false" | Si es expandible | Estado abierto/cerrado |
|
|
94
|
+
| aria-controls | "{id}" | Si controla otro elemento | ID del elemento controlado |
|
|
95
|
+
| aria-owns | "{id}" | Si está separado en el DOM | Relación de parentesco |
|
|
96
|
+
| aria-haspopup | "dialog"/"menu"/"listbox" | Si tiene popup | Tipo de popup |
|
|
97
|
+
| aria-pressed | "true"/"false" | Si es toggle | Estado presionado |
|
|
98
|
+
| aria-selected | "true"/"false" | Si es seleccionable | Estado seleccionado |
|
|
99
|
+
| aria-checked | "true"/"false"/"mixed" | Si es checkbox | Estado marcado |
|
|
100
|
+
| aria-disabled | "true" | Si está deshabilitado | Estado deshabilitado |
|
|
101
|
+
| aria-invalid | "true" | Si hay error | Estado inválido |
|
|
102
|
+
| aria-required | "true" | Si es obligatorio | Campo requerido |
|
|
103
|
+
| aria-busy | "true" | Si está cargando | En progreso |
|
|
104
|
+
| aria-live | "polite"/"assertive" | Si es dinámico | Anunciar cambio |
|
|
105
|
+
| aria-atomic | "true" | Con aria-live | Anunciar todo |
|
|
106
|
+
|
|
107
|
+
### Estados por interacción
|
|
108
|
+
|
|
109
|
+
| Estado | Atributos ARIA |
|
|
110
|
+
|--------|----------------|
|
|
111
|
+
| Por defecto | {atributos base} |
|
|
112
|
+
| Hover | Sin cambio ARIA |
|
|
113
|
+
| Foco | Sin cambio ARIA |
|
|
114
|
+
| Expandido | aria-expanded="true" |
|
|
115
|
+
| Contraído | aria-expanded="false" |
|
|
116
|
+
| Seleccionado | aria-selected="true" |
|
|
117
|
+
| Deshabilitado | aria-disabled="true" |
|
|
118
|
+
| Cargando | aria-busy="true" |
|
|
119
|
+
| Error | aria-invalid="true", aria-errormessage="{id}" |
|
|
80
120
|
|
|
81
121
|
──────────────────────────────────────────────────────────────
|
|
82
122
|
⌨️ NAVEGACIÓN POR TECLADO
|
|
83
123
|
──────────────────────────────────────────────────────────────
|
|
84
124
|
|
|
125
|
+
### Teclas principales
|
|
126
|
+
|
|
85
127
|
| Tecla | Acción | Detalle |
|
|
86
128
|
|-------|--------|---------|
|
|
87
129
|
| Tab | Foco en el componente | Entra al componente |
|
|
130
|
+
| Shift+Tab | Foco anterior | Sale del componente |
|
|
88
131
|
| Enter | Activar | Acción principal |
|
|
89
132
|
| Space | Activar (toggle) | Para botones toggle |
|
|
90
133
|
| Escape | Cerrar/Cancelar | Si popup/modal |
|
|
91
|
-
|
|
|
134
|
+
| ↑ Flecha arriba | Elemento anterior | Navegación en lista |
|
|
135
|
+
| ↓ Flecha abajo | Elemento siguiente | Navegación en lista |
|
|
136
|
+
| ← Flecha izquierda | Elemento anterior (horizontal) | Pestañas, slider |
|
|
137
|
+
| → Flecha derecha | Elemento siguiente (horizontal) | Pestañas, slider |
|
|
138
|
+
| Home | Primer elemento | Navegación rápida |
|
|
139
|
+
| End | Último elemento | Navegación rápida |
|
|
140
|
+
|
|
141
|
+
### Gestión del foco
|
|
142
|
+
|
|
143
|
+
| Situación | Comportamiento |
|
|
144
|
+
|-----------|----------------|
|
|
145
|
+
| Al abrir | Foco en {primer elemento enfocable} |
|
|
146
|
+
| Al cerrar | Foco vuelve a {elemento disparador} |
|
|
147
|
+
| Navegación interna | Roving tabindex O aria-activedescendant |
|
|
148
|
+
| Trampa de foco | {Sí para modal / No para desplegable} |
|
|
149
|
+
|
|
150
|
+
### Roving tabindex (si aplica)
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<!-- Solo un elemento enfocable a la vez -->
|
|
154
|
+
<div role="tablist">
|
|
155
|
+
<button role="tab" tabindex="0" aria-selected="true">Pestaña 1</button>
|
|
156
|
+
<button role="tab" tabindex="-1" aria-selected="false">Pestaña 2</button>
|
|
157
|
+
<button role="tab" tabindex="-1" aria-selected="false">Pestaña 3</button>
|
|
158
|
+
</div>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
──────────────────────────────────────────────────────────────
|
|
162
|
+
🎯 FOCO VISIBLE
|
|
163
|
+
──────────────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
### Estilo requerido (WCAG 2.4.11 AAA)
|
|
166
|
+
|
|
167
|
+
```css
|
|
168
|
+
.{componente}:focus-visible {
|
|
169
|
+
/* Contorno visible */
|
|
170
|
+
outline: 2px solid var(--color-focus);
|
|
171
|
+
outline-offset: 2px;
|
|
172
|
+
|
|
173
|
+
/* Relación de contraste ≥ 3:1 */
|
|
174
|
+
/* Área de foco ≥ perímetro visible */
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Resetear para ratón */
|
|
178
|
+
.{componente}:focus:not(:focus-visible) {
|
|
179
|
+
outline: none;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Verificaciones
|
|
184
|
+
|
|
185
|
+
| Criterio | Valor | Estado |
|
|
186
|
+
|----------|-------|--------|
|
|
187
|
+
| Grosor del contorno | ≥ 2px | ✅ |
|
|
188
|
+
| Contraste del contorno | ≥ 3:1 | ✅ |
|
|
189
|
+
| Área visible | ≥ perímetro | ✅ |
|
|
190
|
+
| Visible sobre todos los fondos | Sí | ✅ |
|
|
92
191
|
|
|
93
192
|
──────────────────────────────────────────────────────────────
|
|
94
193
|
🔊 ANUNCIOS DEL LECTOR DE PANTALLA
|
|
95
194
|
──────────────────────────────────────────────────────────────
|
|
96
195
|
|
|
97
|
-
### Al
|
|
196
|
+
### Al recibir el foco
|
|
197
|
+
|
|
98
198
|
```
|
|
99
|
-
"{
|
|
199
|
+
"{Etiqueta}, {rol}, {estado}"
|
|
200
|
+
|
|
100
201
|
Ejemplos:
|
|
101
202
|
- "Enviar, botón"
|
|
102
203
|
- "Menú principal, menú, contraído"
|
|
204
|
+
- "Nombre, campo de texto, requerido"
|
|
205
|
+
- "Boletín, casilla de verificación, no marcada"
|
|
103
206
|
```
|
|
104
207
|
|
|
105
|
-
### Durante interacción
|
|
208
|
+
### Durante la interacción
|
|
209
|
+
|
|
106
210
|
| Acción | Anuncio |
|
|
107
211
|
|--------|---------|
|
|
108
212
|
| Expansión | "expandido" / "contraído" |
|
|
213
|
+
| Selección | "seleccionado" |
|
|
214
|
+
| Toggle | "activado" / "desactivado" |
|
|
215
|
+
| Cargando | "Cargando" |
|
|
216
|
+
| Éxito | "{mensaje de éxito}" |
|
|
109
217
|
| Error | "Error: {mensaje}" |
|
|
110
218
|
|
|
219
|
+
### Contenido dinámico (aria-live)
|
|
220
|
+
|
|
221
|
+
```html
|
|
222
|
+
<!-- Notificaciones no urgentes (polite) -->
|
|
223
|
+
<div aria-live="polite" aria-atomic="true">
|
|
224
|
+
{mensaje toast}
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<!-- Notificaciones urgentes (errores) -->
|
|
228
|
+
<div aria-live="assertive" aria-atomic="true">
|
|
229
|
+
{mensaje de error}
|
|
230
|
+
</div>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
──────────────────────────────────────────────────────────────
|
|
234
|
+
📏 CONTRASTE (WCAG AAA)
|
|
235
|
+
──────────────────────────────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
### Texto
|
|
238
|
+
|
|
239
|
+
| Tipo | Relación requerida | Verificación |
|
|
240
|
+
|------|--------------------|--------------|
|
|
241
|
+
| Texto normal (< 18px) | ≥ 7:1 | {color} / {fondo} = {relación} |
|
|
242
|
+
| Texto grande (≥ 18px o 14px negrita) | ≥ 4.5:1 | {color} / {fondo} = {relación} |
|
|
243
|
+
|
|
244
|
+
### Elementos UI
|
|
245
|
+
|
|
246
|
+
| Elemento | Relación requerida | Verificación |
|
|
247
|
+
|----------|--------------------|--------------|
|
|
248
|
+
| Bordes | ≥ 3:1 | {color} / {fondo} = {relación} |
|
|
249
|
+
| Iconos | ≥ 3:1 | {color} / {fondo} = {relación} |
|
|
250
|
+
| Contorno de foco | ≥ 3:1 | {color} / {fondo} = {relación} |
|
|
251
|
+
|
|
252
|
+
### Estados
|
|
253
|
+
|
|
254
|
+
| Estado | Verificación de contraste |
|
|
255
|
+
|--------|--------------------------|
|
|
256
|
+
| Por defecto | ✅ {relación} |
|
|
257
|
+
| Hover | ✅ {relación} |
|
|
258
|
+
| Foco | ✅ {relación} |
|
|
259
|
+
| Deshabilitado | ⚠️ No requerido pero recomendado |
|
|
260
|
+
|
|
111
261
|
──────────────────────────────────────────────────────────────
|
|
112
262
|
📐 OBJETIVOS TÁCTILES (WCAG 2.5.5 AAA)
|
|
113
263
|
──────────────────────────────────────────────────────────────
|
|
114
264
|
|
|
265
|
+
### Dimensiones mínimas
|
|
266
|
+
|
|
115
267
|
| Criterio | Valor | Estado |
|
|
116
268
|
|----------|-------|--------|
|
|
117
269
|
| Tamaño mínimo | 44 × 44 píxeles CSS | ✅/❌ |
|
|
118
270
|
| Espaciado entre objetivos | ≥ 8px | ✅/❌ |
|
|
119
271
|
|
|
272
|
+
### Implementación
|
|
273
|
+
|
|
274
|
+
```css
|
|
275
|
+
.{componente} {
|
|
276
|
+
min-width: 44px;
|
|
277
|
+
min-height: 44px;
|
|
278
|
+
/* O padding para alcanzar 44px */
|
|
279
|
+
padding: 10px 16px; /* si la altura del texto es ~24px */
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* Botones con icono */
|
|
283
|
+
.{componente}-icono {
|
|
284
|
+
width: 44px;
|
|
285
|
+
height: 44px;
|
|
286
|
+
display: flex;
|
|
287
|
+
align-items: center;
|
|
288
|
+
justify-content: center;
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
──────────────────────────────────────────────────────────────
|
|
293
|
+
🧪 PRUEBAS A REALIZAR
|
|
294
|
+
──────────────────────────────────────────────────────────────
|
|
295
|
+
|
|
296
|
+
### Automatizadas
|
|
297
|
+
|
|
298
|
+
- [ ] axe DevTools: 0 violaciones
|
|
299
|
+
- [ ] Lighthouse Accessibility: 100/100
|
|
300
|
+
- [ ] ESLint jsx-a11y: 0 errores
|
|
301
|
+
|
|
302
|
+
### Manuales
|
|
303
|
+
|
|
304
|
+
- [ ] Navegación completa por teclado
|
|
305
|
+
- [ ] Foco visible en cada paso
|
|
306
|
+
- [ ] Sin trampa de teclado
|
|
307
|
+
- [ ] Orden de foco lógico
|
|
308
|
+
|
|
309
|
+
### Lector de pantalla
|
|
310
|
+
|
|
311
|
+
- [ ] VoiceOver (macOS/iOS): anuncios correctos
|
|
312
|
+
- [ ] NVDA (Windows): navegación en listas/tablas
|
|
313
|
+
- [ ] TalkBack (Android): si es móvil
|
|
314
|
+
|
|
315
|
+
### Casos límite
|
|
316
|
+
|
|
317
|
+
- [ ] Zoom al 400%: sin pérdida de contenido
|
|
318
|
+
- [ ] Modo de alto contraste: visible
|
|
319
|
+
- [ ] Movimiento reducido: animaciones respetadas
|
|
320
|
+
|
|
321
|
+
──────────────────────────────────────────────────────────────
|
|
322
|
+
💻 EJEMPLO DE IMPLEMENTACIÓN
|
|
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
|
+
// ...otras 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
|
+
{/* Contenido */}
|
|
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 VALIDACIÓN
|
|
122
369
|
──────────────────────────────────────────────────────────────
|
|
123
370
|
|
|
124
371
|
### Semántica
|
|
125
372
|
- [ ] Elemento HTML nativo usado si es posible
|
|
126
|
-
- [ ] Rol ARIA correcto si es
|
|
373
|
+
- [ ] Rol ARIA correcto si es personalizado
|
|
127
374
|
- [ ] Estructura DOM lógica
|
|
128
375
|
|
|
129
376
|
### ARIA
|
|
130
377
|
- [ ] Atributos requeridos presentes
|
|
131
|
-
- [ ]
|
|
378
|
+
- [ ] Atributos condicionales correctos
|
|
379
|
+
- [ ] Sin sobrecarga de ARIA (nativo > ARIA)
|
|
132
380
|
|
|
133
381
|
### Teclado
|
|
134
|
-
- [ ]
|
|
135
|
-
- [ ] Todas las acciones
|
|
382
|
+
- [ ] Enfocable (tabindex apropiado)
|
|
383
|
+
- [ ] Todas las acciones disponibles por teclado
|
|
136
384
|
- [ ] Sin trampa de teclado
|
|
137
385
|
- [ ] Foco visible conforme
|
|
138
386
|
|
|
387
|
+
### Anuncios
|
|
388
|
+
- [ ] Etiqueta anunciada al recibir foco
|
|
389
|
+
- [ ] Estados anunciados al cambiar
|
|
390
|
+
- [ ] Errores con aria-live assertive
|
|
391
|
+
|
|
139
392
|
### Contraste
|
|
140
393
|
- [ ] Texto ≥ 7:1 (AAA)
|
|
141
394
|
- [ ] UI ≥ 3:1
|
|
395
|
+
- [ ] Foco ≥ 3:1
|
|
396
|
+
|
|
397
|
+
### Táctil
|
|
398
|
+
- [ ] Objetivos ≥ 44×44px
|
|
399
|
+
- [ ] Espaciado ≥ 8px
|
|
142
400
|
```
|
|
@@ -5,7 +5,7 @@ argument-hint: [arguments]
|
|
|
5
5
|
|
|
6
6
|
# Definición de Design Tokens
|
|
7
7
|
|
|
8
|
-
Eres un Lead UI Designer. Debes definir los design tokens para un
|
|
8
|
+
Eres un Lead UI Designer. Debes definir los design tokens para un sistema de diseño coherente y mantenible.
|
|
9
9
|
|
|
10
10
|
## Argumentos
|
|
11
11
|
$ARGUMENTS
|
|
@@ -19,15 +19,15 @@ Ejemplo: `/uiux:design-tokens all #3B82F6 both`
|
|
|
19
19
|
|
|
20
20
|
## Modo Plan
|
|
21
21
|
|
|
22
|
-
> **El modo plan es obligatorio.** Antes de ejecutar, Claude activa el modo plan para analizar el código
|
|
22
|
+
> **El modo plan es obligatorio.** Antes de ejecutar, Claude activa el modo plan para analizar el código afectado, proponer un plan de implementación y esperar tu validación antes de realizar cualquier cambio.
|
|
23
23
|
|
|
24
24
|
## MISIÓN
|
|
25
25
|
|
|
26
26
|
### Paso 1: Analizar el contexto
|
|
27
27
|
|
|
28
28
|
- Stack frontend (React, Vue, Tailwind, CSS vars...)
|
|
29
|
-
- ¿
|
|
30
|
-
- ¿
|
|
29
|
+
- ¿Existe un sistema de diseño previo?
|
|
30
|
+
- ¿Se han proporcionado directrices de marca?
|
|
31
31
|
|
|
32
32
|
### Paso 2: Definir los tokens
|
|
33
33
|
|
|
@@ -46,21 +46,54 @@ Formato: CSS Custom Properties
|
|
|
46
46
|
|
|
47
47
|
### Paleta Semántica
|
|
48
48
|
|
|
49
|
-
####
|
|
49
|
+
#### Primario (Acción principal)
|
|
50
50
|
| Token | Light | Dark | Uso |
|
|
51
51
|
|-------|-------|------|-----|
|
|
52
52
|
| --color-primary-50 | #eff6ff | #1e3a5f | Fondo sutil |
|
|
53
|
+
| --color-primary-100 | #dbeafe | #1e40af | Fondo |
|
|
54
|
+
| --color-primary-200 | #bfdbfe | #1d4ed8 | Borde |
|
|
55
|
+
| --color-primary-300 | #93c5fd | #2563eb | Borde hover |
|
|
56
|
+
| --color-primary-400 | #60a5fa | #3b82f6 | Icono |
|
|
53
57
|
| --color-primary-500 | #3b82f6 | #60a5fa | Texto |
|
|
54
58
|
| --color-primary-600 | #2563eb | #93c5fd | Texto hover |
|
|
59
|
+
| --color-primary-700 | #1d4ed8 | #bfdbfe | - |
|
|
60
|
+
| --color-primary-800 | #1e40af | #dbeafe | - |
|
|
61
|
+
| --color-primary-900 | #1e3a5f | #eff6ff | - |
|
|
55
62
|
|
|
56
|
-
####
|
|
57
|
-
|
|
63
|
+
#### Éxito
|
|
64
|
+
| Token | Light | Dark |
|
|
65
|
+
|-------|-------|------|
|
|
66
|
+
| --color-success-50 | #f0fdf4 | #14532d |
|
|
67
|
+
| --color-success-500 | #22c55e | #4ade80 |
|
|
68
|
+
| --color-success-700 | #15803d | #86efac |
|
|
58
69
|
|
|
59
|
-
####
|
|
70
|
+
#### Advertencia
|
|
71
|
+
| Token | Light | Dark |
|
|
72
|
+
|-------|-------|------|
|
|
73
|
+
| --color-warning-50 | #fffbeb | #78350f |
|
|
74
|
+
| --color-warning-500 | #f59e0b | #fbbf24 |
|
|
75
|
+
| --color-warning-700 | #b45309 | #fcd34d |
|
|
76
|
+
|
|
77
|
+
#### Error
|
|
78
|
+
| Token | Light | Dark |
|
|
79
|
+
|-------|-------|------|
|
|
80
|
+
| --color-error-50 | #fef2f2 | #7f1d1d |
|
|
81
|
+
| --color-error-500 | #ef4444 | #f87171 |
|
|
82
|
+
| --color-error-700 | #b91c1c | #fca5a5 |
|
|
83
|
+
|
|
84
|
+
#### Neutro (Texto, Fondos)
|
|
60
85
|
| Token | Light | Dark | Uso |
|
|
61
86
|
|-------|-------|------|-----|
|
|
62
87
|
| --color-neutral-0 | #ffffff | #0a0a0a | Fondo |
|
|
63
|
-
| --color-neutral-
|
|
88
|
+
| --color-neutral-50 | #fafafa | #171717 | Fondo sutil |
|
|
89
|
+
| --color-neutral-100 | #f5f5f5 | #262626 | Fondo atenuado |
|
|
90
|
+
| --color-neutral-200 | #e5e5e5 | #404040 | Borde |
|
|
91
|
+
| --color-neutral-300 | #d4d4d4 | #525252 | Borde hover |
|
|
92
|
+
| --color-neutral-400 | #a3a3a3 | #737373 | Placeholder |
|
|
93
|
+
| --color-neutral-500 | #737373 | #a3a3a3 | Texto atenuado |
|
|
94
|
+
| --color-neutral-600 | #525252 | #d4d4d4 | Texto secundario |
|
|
95
|
+
| --color-neutral-700 | #404040 | #e5e5e5 | Texto primario |
|
|
96
|
+
| --color-neutral-800 | #262626 | #f5f5f5 | Texto enfatizado |
|
|
64
97
|
| --color-neutral-900 | #171717 | #fafafa | Texto fuerte |
|
|
65
98
|
|
|
66
99
|
### Tokens Alias (Semánticos)
|
|
@@ -68,14 +101,25 @@ Formato: CSS Custom Properties
|
|
|
68
101
|
/* Fondos */
|
|
69
102
|
--color-bg-primary: var(--color-neutral-0);
|
|
70
103
|
--color-bg-secondary: var(--color-neutral-50);
|
|
104
|
+
--color-bg-tertiary: var(--color-neutral-100);
|
|
105
|
+
--color-bg-inverse: var(--color-neutral-900);
|
|
71
106
|
|
|
72
|
-
/*
|
|
107
|
+
/* Texto */
|
|
73
108
|
--color-text-primary: var(--color-neutral-900);
|
|
74
109
|
--color-text-secondary: var(--color-neutral-600);
|
|
110
|
+
--color-text-muted: var(--color-neutral-500);
|
|
111
|
+
--color-text-inverse: var(--color-neutral-0);
|
|
75
112
|
|
|
76
113
|
/* Bordes */
|
|
77
114
|
--color-border-default: var(--color-neutral-200);
|
|
115
|
+
--color-border-hover: var(--color-neutral-300);
|
|
78
116
|
--color-border-focus: var(--color-primary-500);
|
|
117
|
+
|
|
118
|
+
/* Estados */
|
|
119
|
+
--color-state-focus: var(--color-primary-500);
|
|
120
|
+
--color-state-error: var(--color-error-500);
|
|
121
|
+
--color-state-success: var(--color-success-500);
|
|
122
|
+
--color-state-warning: var(--color-warning-500);
|
|
79
123
|
```
|
|
80
124
|
|
|
81
125
|
──────────────────────────────────────────────────────────────
|
|
@@ -84,39 +128,159 @@ Formato: CSS Custom Properties
|
|
|
84
128
|
|
|
85
129
|
### Familias
|
|
86
130
|
```css
|
|
87
|
-
--font-family-sans: 'Inter', system-ui, sans-serif;
|
|
88
|
-
--font-family-mono: 'JetBrains Mono', monospace;
|
|
131
|
+
--font-family-sans: 'Inter', system-ui, -apple-system, sans-serif;
|
|
132
|
+
--font-family-mono: 'JetBrains Mono', 'Fira Code', monospace;
|
|
89
133
|
```
|
|
90
134
|
|
|
91
135
|
### Tamaños (base 16px)
|
|
92
|
-
| Token | Tamaño |
|
|
93
|
-
|
|
94
|
-
| --font-size-xs | 0.75rem | 1rem |
|
|
95
|
-
| --font-size-
|
|
96
|
-
| --font-size-
|
|
136
|
+
| Token | Tamaño | Altura de línea | Uso |
|
|
137
|
+
|-------|--------|-----------------|-----|
|
|
138
|
+
| --font-size-xs | 0.75rem (12px) | 1rem | Etiquetas, badges |
|
|
139
|
+
| --font-size-sm | 0.875rem (14px) | 1.25rem | Cuerpo pequeño |
|
|
140
|
+
| --font-size-base | 1rem (16px) | 1.5rem | Cuerpo |
|
|
141
|
+
| --font-size-lg | 1.125rem (18px) | 1.75rem | Texto destacado |
|
|
142
|
+
| --font-size-xl | 1.25rem (20px) | 1.75rem | H4 |
|
|
143
|
+
| --font-size-2xl | 1.5rem (24px) | 2rem | H3 |
|
|
144
|
+
| --font-size-3xl | 1.875rem (30px) | 2.25rem | H2 |
|
|
145
|
+
| --font-size-4xl | 2.25rem (36px) | 2.5rem | H1 |
|
|
146
|
+
| --font-size-5xl | 3rem (48px) | 1 | Display |
|
|
147
|
+
|
|
148
|
+
### Pesos
|
|
149
|
+
| Token | Valor | Uso |
|
|
150
|
+
|-------|-------|-----|
|
|
151
|
+
| --font-weight-normal | 400 | Cuerpo |
|
|
152
|
+
| --font-weight-medium | 500 | Etiquetas, nav |
|
|
153
|
+
| --font-weight-semibold | 600 | Subencabezados |
|
|
154
|
+
| --font-weight-bold | 700 | Encabezados |
|
|
155
|
+
|
|
156
|
+
### Alturas de línea
|
|
157
|
+
```css
|
|
158
|
+
--line-height-none: 1;
|
|
159
|
+
--line-height-tight: 1.25;
|
|
160
|
+
--line-height-snug: 1.375;
|
|
161
|
+
--line-height-normal: 1.5;
|
|
162
|
+
--line-height-relaxed: 1.625;
|
|
163
|
+
--line-height-loose: 2;
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Espaciado entre letras
|
|
167
|
+
```css
|
|
168
|
+
--letter-spacing-tighter: -0.05em;
|
|
169
|
+
--letter-spacing-tight: -0.025em;
|
|
170
|
+
--letter-spacing-normal: 0;
|
|
171
|
+
--letter-spacing-wide: 0.025em;
|
|
172
|
+
--letter-spacing-wider: 0.05em;
|
|
173
|
+
```
|
|
97
174
|
|
|
98
175
|
──────────────────────────────────────────────────────────────
|
|
99
|
-
📐
|
|
176
|
+
📐 ESPACIADO
|
|
100
177
|
──────────────────────────────────────────────────────────────
|
|
101
178
|
|
|
102
179
|
### Escala (base 4px)
|
|
103
180
|
| Token | Valor | Píxeles | Uso |
|
|
104
181
|
|-------|-------|---------|-----|
|
|
182
|
+
| --spacing-0 | 0 | 0px | - |
|
|
183
|
+
| --spacing-px | 1px | 1px | Bordes |
|
|
184
|
+
| --spacing-0.5 | 0.125rem | 2px | Ajustado |
|
|
105
185
|
| --spacing-1 | 0.25rem | 4px | XS |
|
|
186
|
+
| --spacing-1.5 | 0.375rem | 6px | - |
|
|
187
|
+
| --spacing-2 | 0.5rem | 8px | S |
|
|
188
|
+
| --spacing-2.5 | 0.625rem | 10px | - |
|
|
189
|
+
| --spacing-3 | 0.75rem | 12px | - |
|
|
106
190
|
| --spacing-4 | 1rem | 16px | M (base) |
|
|
191
|
+
| --spacing-5 | 1.25rem | 20px | - |
|
|
192
|
+
| --spacing-6 | 1.5rem | 24px | L |
|
|
107
193
|
| --spacing-8 | 2rem | 32px | XL |
|
|
194
|
+
| --spacing-10 | 2.5rem | 40px | - |
|
|
195
|
+
| --spacing-12 | 3rem | 48px | 2XL |
|
|
196
|
+
| --spacing-16 | 4rem | 64px | 3XL |
|
|
197
|
+
| --spacing-20 | 5rem | 80px | - |
|
|
198
|
+
| --spacing-24 | 6rem | 96px | 4XL |
|
|
199
|
+
|
|
200
|
+
──────────────────────────────────────────────────────────────
|
|
201
|
+
🌗 SOMBRAS
|
|
202
|
+
──────────────────────────────────────────────────────────────
|
|
203
|
+
|
|
204
|
+
| Token | Valor | Uso |
|
|
205
|
+
|-------|-------|-----|
|
|
206
|
+
| --shadow-xs | 0 1px 2px 0 rgb(0 0 0 / 0.05) | Sutil |
|
|
207
|
+
| --shadow-sm | 0 1px 3px 0 rgb(0 0 0 / 0.1) | Tarjetas |
|
|
208
|
+
| --shadow-md | 0 4px 6px -1px rgb(0 0 0 / 0.1) | Desplegables |
|
|
209
|
+
| --shadow-lg | 0 10px 15px -3px rgb(0 0 0 / 0.1) | Modales |
|
|
210
|
+
| --shadow-xl | 0 20px 25px -5px rgb(0 0 0 / 0.1) | Diálogos |
|
|
211
|
+
| --shadow-2xl | 0 25px 50px -12px rgb(0 0 0 / 0.25) | Superposiciones |
|
|
212
|
+
| --shadow-inner | inset 0 2px 4px 0 rgb(0 0 0 / 0.05) | Inputs |
|
|
213
|
+
| --shadow-none | none | Resetear |
|
|
108
214
|
|
|
109
215
|
──────────────────────────────────────────────────────────────
|
|
110
|
-
|
|
216
|
+
⭕ RADIOS (Border Radius)
|
|
111
217
|
──────────────────────────────────────────────────────────────
|
|
112
218
|
|
|
113
|
-
|
|
219
|
+
| Token | Valor | Uso |
|
|
220
|
+
|-------|-------|-----|
|
|
221
|
+
| --radius-none | 0 | Afilado |
|
|
222
|
+
| --radius-sm | 0.125rem (2px) | Sutil |
|
|
223
|
+
| --radius-md | 0.375rem (6px) | Botones, inputs |
|
|
224
|
+
| --radius-lg | 0.5rem (8px) | Tarjetas |
|
|
225
|
+
| --radius-xl | 0.75rem (12px) | Modales |
|
|
226
|
+
| --radius-2xl | 1rem (16px) | Tarjetas grandes |
|
|
227
|
+
| --radius-full | 9999px | Pills, avatares |
|
|
228
|
+
|
|
229
|
+
──────────────────────────────────────────────────────────────
|
|
230
|
+
⏱️ TRANSICIONES
|
|
231
|
+
──────────────────────────────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
### Duraciones
|
|
234
|
+
| Token | Valor | Uso |
|
|
235
|
+
|-------|-------|-----|
|
|
236
|
+
| --duration-75 | 75ms | Micro |
|
|
237
|
+
| --duration-100 | 100ms | Rápida |
|
|
238
|
+
| --duration-150 | 150ms | Por defecto |
|
|
239
|
+
| --duration-200 | 200ms | Normal |
|
|
240
|
+
| --duration-300 | 300ms | Lenta |
|
|
241
|
+
| --duration-500 | 500ms | Énfasis |
|
|
242
|
+
|
|
243
|
+
### Curvas de aceleración
|
|
244
|
+
```css
|
|
245
|
+
--ease-linear: linear;
|
|
246
|
+
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
247
|
+
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
248
|
+
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
249
|
+
--ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Transiciones compuestas
|
|
253
|
+
```css
|
|
254
|
+
--transition-none: none;
|
|
255
|
+
--transition-all: all 150ms ease-out;
|
|
256
|
+
--transition-colors: color, background-color, border-color 150ms ease-out;
|
|
257
|
+
--transition-opacity: opacity 150ms ease-out;
|
|
258
|
+
--transition-shadow: box-shadow 150ms ease-out;
|
|
259
|
+
--transition-transform: transform 150ms ease-out;
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
──────────────────────────────────────────────────────────────
|
|
263
|
+
📦 Z-INDEX
|
|
264
|
+
──────────────────────────────────────────────────────────────
|
|
114
265
|
|
|
266
|
+
| Token | Valor | Uso |
|
|
267
|
+
|-------|-------|-----|
|
|
268
|
+
| --z-0 | 0 | Base |
|
|
269
|
+
| --z-10 | 10 | Elevado |
|
|
270
|
+
| --z-20 | 20 | Desplegables |
|
|
271
|
+
| --z-30 | 30 | Sticky |
|
|
272
|
+
| --z-40 | 40 | Fijo |
|
|
273
|
+
| --z-50 | 50 | Fondo modal |
|
|
274
|
+
| --z-60 | 60 | Modal |
|
|
275
|
+
| --z-70 | 70 | Popover |
|
|
276
|
+
| --z-80 | 80 | Toast |
|
|
277
|
+
| --z-90 | 90 | Tooltip |
|
|
278
|
+
| --z-max | 9999 | Máximo |
|
|
115
279
|
```
|
|
116
280
|
|
|
117
281
|
### Paso 3: Exportar
|
|
118
282
|
|
|
119
|
-
Generar archivos:
|
|
283
|
+
Generar los archivos:
|
|
120
284
|
- `tokens.css` - CSS Custom Properties
|
|
121
285
|
- `tokens.json` - Formato Style Dictionary
|
|
122
|
-
- `tailwind.config.js` - Extensión Tailwind (si aplica)
|
|
286
|
+
- `tailwind.config.js` - Extensión de Tailwind (si aplica)
|