accessibility-hub 0.3.0 → 0.4.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/EXAMPLES.md CHANGED
@@ -341,7 +341,85 @@ Ejemplos concretos de inputs y outputs para cada herramienta MCP.
341
341
 
342
342
  ---
343
343
 
344
- ### Ejemplo 3: Análisis de sección específica
344
+ ### Ejemplo 3: Análisis con APCA (WCAG 3.0 Draft)
345
+
346
+ **Input:**
347
+ ```json
348
+ {
349
+ "url": "https://example.com",
350
+ "options": {
351
+ "contrastAlgorithm": "APCA"
352
+ }
353
+ }
354
+ ```
355
+
356
+ **Output:**
357
+ ```json
358
+ {
359
+ "success": true,
360
+ "target": "https://example.com",
361
+ "wcagLevel": "AA",
362
+ "issueCount": 2,
363
+ "issues": [
364
+ {
365
+ "id": "contrast-0",
366
+ "ruleId": "color-contrast",
367
+ "tool": "contrast-analyzer",
368
+ "severity": "serious",
369
+ "wcag": {
370
+ "criterion": "1.4.3",
371
+ "level": "AA",
372
+ "principle": "perceivable",
373
+ "title": "Contrast (APCA - WCAG 3.0 Draft)"
374
+ },
375
+ "location": {
376
+ "selector": "p.subtitle",
377
+ "snippet": "<p class=\"subtitle\">Low contrast text</p>"
378
+ },
379
+ "message": "APCA lightness 52.3Lc does not meet requirements (75Lc required for body text)",
380
+ "humanContext": "Users with low vision or color blindness may have difficulty reading this text. The current APCA lightness of 52.3Lc is below the threshold of 75Lc.",
381
+ "suggestedActions": [
382
+ "Increase APCA lightness to at least 75Lc",
383
+ "Consider using #4a4a4a as the text color"
384
+ ],
385
+ "contrastData": {
386
+ "foreground": "rgb(140, 140, 140)",
387
+ "background": "rgb(255, 255, 255)",
388
+ "currentRatio": 52.3,
389
+ "requiredRatio": 75,
390
+ "isLargeText": false,
391
+ "fontSize": 16,
392
+ "fontWeight": 400,
393
+ "suggestedFix": {
394
+ "foreground": "#4a4a4a",
395
+ "background": "#ffffff",
396
+ "newRatio": 75.2
397
+ }
398
+ },
399
+ "affectedUsers": ["low-vision", "color-blind"]
400
+ }
401
+ ],
402
+ "summary": {
403
+ "total": 20,
404
+ "passing": 18,
405
+ "failing": 2,
406
+ "byTextSize": {
407
+ "normalText": { "passing": 15, "failing": 2 },
408
+ "largeText": { "passing": 3, "failing": 0 }
409
+ }
410
+ },
411
+ "duration": 1234
412
+ }
413
+ ```
414
+
415
+ **Nota sobre APCA:**
416
+ - `currentRatio` y `requiredRatio` usan valores Lc (Lightness contrast) en lugar de ratios
417
+ - Umbrales: texto body (75Lc), texto grande (60Lc), no-texto (45Lc)
418
+ - APCA es más preciso perceptualmente pero aún experimental
419
+
420
+ ---
421
+
422
+ ### Ejemplo 4: Análisis de sección específica
345
423
 
346
424
  **Input:**
347
425
  ```json
@@ -356,7 +434,7 @@ Ejemplos concretos de inputs y outputs para cada herramienta MCP.
356
434
 
357
435
  ---
358
436
 
359
- ### Ejemplo 4: HTML con análisis de contraste
437
+ ### Ejemplo 5: HTML con análisis de contraste
360
438
 
361
439
  **Input:**
362
440
  ```json
@@ -627,6 +705,7 @@ Ejemplos concretos de inputs y outputs para cada herramienta MCP.
627
705
  | **Velocidad** | ~2-3s | ~2s | ~1-2s |
628
706
  | **Falsos positivos** | Pocos | Moderados | Muy pocos |
629
707
  | **Sugerencias de fix** | - | - | ✅ Colores |
708
+ | **APCA (WCAG 3.0)** | - | - | ✅ Experimental |
630
709
 
631
710
  ---
632
711
 
package/README.md CHANGED
@@ -97,7 +97,7 @@ Analiza una página web o contenido HTML usando Pa11y.
97
97
 
98
98
  ### `analyze-contrast`
99
99
 
100
- Analiza una página web o contenido HTML para detectar problemas de contraste de color según WCAG 2.1.
100
+ Analiza una página web o contenido HTML para detectar problemas de contraste de color según WCAG 2.1. Soporta el algoritmo estándar WCAG 2.1 y el nuevo APCA (WCAG 3.0 draft).
101
101
 
102
102
  **Parámetros:**
103
103
 
@@ -105,6 +105,7 @@ Analiza una página web o contenido HTML para detectar problemas de contraste de
105
105
  |-----------|------|-----------|-------------|
106
106
  | `url` | string | url o html | URL de la página a analizar |
107
107
  | `html` | string | url o html | Contenido HTML raw a analizar |
108
+ | `options.contrastAlgorithm` | "WCAG21" \| "APCA" | No | Algoritmo de contraste: WCAG21 (estándar) o APCA (WCAG 3.0 draft - experimental). Default: WCAG21 |
108
109
  | `options.wcagLevel` | "AA" \| "AAA" | No | Nivel WCAG: AA (4.5:1 normal, 3:1 grande) o AAA (7:1 normal, 4.5:1 grande). Default: AA |
109
110
  | `options.suggestFixes` | boolean | No | Sugerir correcciones de color (default: true) |
110
111
  | `options.includePassingElements` | boolean | No | Incluir elementos que pasan en los resultados (default: false) |
@@ -113,7 +114,14 @@ Analiza una página web o contenido HTML para detectar problemas de contraste de
113
114
  | `options.browser.viewport` | object | No | Dimensiones del viewport |
114
115
  | `options.browser.ignoreHTTPSErrors` | boolean | No | Ignorar errores de certificado SSL (default: false) |
115
116
 
116
- **Ejemplo de respuesta:**
117
+ **Algoritmos de contraste:**
118
+
119
+ | Algoritmo | Descripción | Umbrales |
120
+ |-----------|-------------|----------|
121
+ | **WCAG21** | Estándar actual. Usa ratios de luminancia relativa. | AA: 4.5:1 (normal), 3:1 (grande). AAA: 7:1 (normal), 4.5:1 (grande) |
122
+ | **APCA** | Borrador WCAG 3.0. Usa perceptual lightness (Lc). Más preciso para texto. | Texto body: 75Lc, texto grande: 60Lc, elementos no-texto: 45Lc |
123
+
124
+ **Ejemplo de respuesta (WCAG21):**
117
125
 
118
126
  ```json
119
127
  {
@@ -167,10 +175,67 @@ Analiza una página web o contenido HTML para detectar problemas de contraste de
167
175
  }
168
176
  ```
169
177
 
178
+ **Ejemplo de respuesta (APCA):**
179
+
180
+ ```json
181
+ {
182
+ "success": true,
183
+ "target": "https://example.com",
184
+ "wcagLevel": "AA",
185
+ "issueCount": 1,
186
+ "issues": [
187
+ {
188
+ "id": "contrast-0",
189
+ "ruleId": "color-contrast",
190
+ "tool": "contrast-analyzer",
191
+ "severity": "serious",
192
+ "wcag": {
193
+ "criterion": "1.4.3",
194
+ "level": "AA",
195
+ "principle": "perceivable",
196
+ "title": "Contrast (APCA - WCAG 3.0 Draft)"
197
+ },
198
+ "location": {
199
+ "selector": "p.subtitle",
200
+ "snippet": "<p class=\"subtitle\">Texto de ejemplo</p>"
201
+ },
202
+ "message": "APCA lightness 45.2Lc does not meet requirements (75Lc required for body text)",
203
+ "contrastData": {
204
+ "foreground": "rgb(150, 150, 150)",
205
+ "background": "rgb(255, 255, 255)",
206
+ "currentRatio": 45.2,
207
+ "requiredRatio": 75,
208
+ "isLargeText": false,
209
+ "fontSize": 16,
210
+ "fontWeight": 400,
211
+ "suggestedFix": {
212
+ "foreground": "#5a5a5a",
213
+ "background": "#ffffff",
214
+ "newRatio": 75.1
215
+ }
216
+ },
217
+ "affectedUsers": ["low-vision", "color-blind"]
218
+ }
219
+ ],
220
+ "summary": {
221
+ "total": 15,
222
+ "passing": 14,
223
+ "failing": 1
224
+ },
225
+ "duration": 1234
226
+ }
227
+ ```
228
+
170
229
  **Criterios WCAG:**
171
230
  - 1.4.3 Contraste (Mínimo) - Nivel AA
172
231
  - 1.4.6 Contraste (Mejorado) - Nivel AAA
173
232
 
233
+ **APCA (Accessible Perceptual Contrast Algorithm):**
234
+ - Algoritmo perceptual más preciso, parte del borrador de WCAG 3.0
235
+ - Mide "lightness contrast" (Lc) en lugar de ratios
236
+ - Considera la dirección del contraste (texto claro sobre oscuro vs oscuro sobre claro)
237
+ - Experimental: aún no es un estándar oficial
238
+
174
239
  ### `analyze-mixed` ⭐
175
240
 
176
241
  **Tool de síntesis para análisis web** que ejecuta axe-core y Pa11y en paralelo y combina los resultados.
@@ -403,6 +468,7 @@ Una vez configurado, puedes usar prompts como:
403
468
  - "Compara los resultados de axe-core y Pa11y en mi landing page" (usa analyze-mixed)
404
469
  - "Verifica el contraste de colores de mi página web" (usa analyze-contrast)
405
470
  - "Analiza si los colores de texto cumplen con WCAG AAA" (usa analyze-contrast con wcagLevel: AAA)
471
+ - "Analiza el contraste usando el algoritmo APCA" (usa analyze-contrast con contrastAlgorithm: APCA)
406
472
 
407
473
  ### Desarrollo Local
408
474
 
@@ -457,5 +523,6 @@ Si estás desarrollando o contribuyendo al proyecto, puedes usar rutas locales e
457
523
  - `@axe-core/puppeteer` - Integración axe-core con Puppeteer
458
524
  - `axe-core` - Motor de análisis de accesibilidad
459
525
  - `pa11y` - Herramienta de testing de accesibilidad
526
+ - `colorjs.io` - Librería de colores con soporte para WCAG 2.1 y APCA
460
527
  - `zod` - Validación de schemas
461
528
  - `pino` - Logging estructurado
package/USAGE.md CHANGED
@@ -101,6 +101,23 @@ Verifica si los colores de texto de https://mi-sitio.com cumplen con WCAG AA
101
101
 
102
102
  ---
103
103
 
104
+ ### 6. Análisis con APCA (WCAG 3.0 Draft)
105
+
106
+ **Prompt:**
107
+ ```
108
+ Analiza el contraste de https://mi-sitio.com usando el algoritmo APCA
109
+ ```
110
+
111
+ **¿Qué herramienta se usará?**
112
+ → `analyze-contrast` con `contrastAlgorithm: "APCA"`
113
+
114
+ **Resultado esperado:**
115
+ - Lightness contrast (Lc) en lugar de ratios
116
+ - Umbrales: 75Lc (texto body), 60Lc (texto grande), 45Lc (no-texto)
117
+ - Sugerencias de colores optimizadas para percepción visual
118
+
119
+ ---
120
+
104
121
  ## Ejemplos por Herramienta
105
122
 
106
123
  ### `analyze-with-axe`
@@ -214,6 +231,26 @@ Muéstrame el contraste de todos los elementos, incluyendo los que pasan
214
231
  }
215
232
  ```
216
233
 
234
+ #### Ejemplo 5: Análisis con APCA
235
+ ```
236
+ Analiza el contraste usando el algoritmo APCA (más preciso para percepción visual)
237
+ ```
238
+
239
+ **Input equivalente:**
240
+ ```json
241
+ {
242
+ "url": "https://example.com",
243
+ "options": {
244
+ "contrastAlgorithm": "APCA"
245
+ }
246
+ }
247
+ ```
248
+
249
+ **Nota:** APCA usa valores de lightness (Lc) en lugar de ratios. Los umbrales son:
250
+ - Texto body: 75Lc
251
+ - Texto grande: 60Lc
252
+ - Elementos no-texto: 45Lc
253
+
217
254
  ---
218
255
 
219
256
  ### `analyze-mixed`
@@ -468,6 +505,26 @@ Analiza solo el contraste de una parte de la página:
468
505
  }
469
506
  ```
470
507
 
508
+ ### 6. Análisis con APCA (WCAG 3.0 Draft)
509
+
510
+ Para proyectos que quieren prepararse para WCAG 3.0:
511
+
512
+ ```json
513
+ {
514
+ "url": "https://example.com",
515
+ "options": {
516
+ "contrastAlgorithm": "APCA",
517
+ "suggestFixes": true
518
+ }
519
+ }
520
+ ```
521
+
522
+ **Diferencias APCA vs WCAG21:**
523
+ - **APCA** mide "lightness contrast" (Lc), más preciso perceptualmente
524
+ - **APCA** considera la polaridad (texto claro sobre oscuro vs oscuro sobre claro)
525
+ - **APCA** es experimental (borrador WCAG 3.0)
526
+ - **WCAG21** sigue siendo el estándar legal/normativo actual
527
+
471
528
  ---
472
529
 
473
530
  ## Preguntas Frecuentes