{
 "url": "https://pontevedra.gal/",
 "modo": "rendered",
 "score": 48,
 "score_nota": "Puntuación ponderada: alta −12, media −6, baja −2 desde 100. Mide solo lo automatizable (≈1/3 de WCAG): sirve para seguir tendencias entre versiones, no como conformidad.",
 "elementos_interactivos": 981,
 "resumen": {
  "alta": 3,
  "media": 2,
  "baja": 2
 },
 "hallazgos": [
  {
   "severidad": "alta",
   "criterio": "1.4.3",
   "hallazgo": "7 zonas de texto con contraste insuficiente: rgb(77,178,236) vs rgb(255,255,255) = 2.36:1 ×1; rgb(105,114,125) vs rgb(50,87,160) = 1.43:1 ×4; rgb(173,173,173) vs rgb(255,255,255) = 2.24:1 ×3; rgb(105,114,125) vs rgb(129,52,175) = 1.41:1 ×1. (fg/fondo computados, con composición de transparencias).",
   "remediacion": "Sube el contraste a ≥4.5:1 (≥3:1 en texto grande). El fondo efectivo ya incluye superposiciones y transparencias; si hay imagen de fondo, verifica esa zona a mano.",
   "ejemplos": [
    "rgb(77,178,236) sobre rgb(255,255,255) → 2.36:1 (p. ej. a)",
    "rgb(105,114,125) sobre rgb(50,87,160) → 1.43:1 (p. ej. span > a > span)",
    "rgb(173,173,173) sobre rgb(255,255,255) → 2.24:1 (p. ej. div > div > span)",
    "rgb(105,114,125) sobre rgb(129,52,175) → 1.41:1 (p. ej. span > a > span)",
    "rgb(105,114,125) sobre rgb(59,89,152) → 1.4:1 (p. ej. span > a > span)",
    "rgb(105,114,125) sobre rgb(51,51,51) → 2.59:1 (p. ej. span > a > span)"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "23 <control> sin nombre accesible (sin texto, aria-label ni title).",
   "remediacion": "El nombre accesible llega del texto interno, aria-label, title o de una imagen interna con alt. Un control vacío es invisible para lectores de pantalla.",
   "ejemplos": [
    "div > div > a",
    "ul > li > a",
    "ul > li > a",
    "div > div > a",
    "div > div > a",
    "div > div > a"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "82 elementos interactivos (<control>) con aria-hidden=\"true\": ocultos al lector pero siguen recibiendo foco.",
   "remediacion": "Quita aria-hidden del elemento enfocable, o añade tabindex=\"-1\" si debe quedar fuera de la interacción."
  },
  {
   "severidad": "media",
   "criterio": "2.5.8 Tamaño del objetivo (mínimo)",
   "hallazgo": "6 controles con área de toque menor de 24×24 px (WCAG 2.2, 2.5.8): div#cmplz-cookiebanner-1-optin > div > div (20×20), a (1×1), ul > li > a (24×15), ul > li > a (24×15).",
   "remediacion": "Da a los controles al menos 24×24 px CSS (mejor 44×44) con padding o min-width/min-height. Excepciones: enlaces inline equivalentes y espaciado suficiente alrededor.",
   "ejemplos": [
    "div#cmplz-cookiebanner-1-optin > div > div (20×20px)",
    "a (1×1px)",
    "ul > li > a (24×15px)",
    "ul > li > a (24×15px)",
    "div > div > a (102×18px)",
    "div > div > a (70×18px)"
   ]
  },
  {
   "severidad": "media",
   "criterio": "1.3.1 Información y relaciones",
   "hallazgo": "No hay ningún <h1> en la página.",
   "remediacion": "Añade un único h1 que nombre la página."
  },
  {
   "severidad": "baja",
   "criterio": "3.2.5 Cambio a petición",
   "hallazgo": "261 enlaces con target=\"_blank\" sin avisar de que abren ventana nueva.",
   "remediacion": "Añade aviso en texto (o title/aria-label): «(abre en ventana nueva)», o deja que la persona usuaria decida."
  },
  {
   "severidad": "baja",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "5 ids duplicados; pueden romper asociaciones label-for y aria-labelledby.",
   "remediacion": "Haz únicos los ids: los <label for> y aria-labelledby apuntan solo al primero."
  }
 ],
 "limites": "Auditoría renderizada: heurística honesta, no sustituye lector de pantalla ni revisión manual. Contraste calculado sobre fondos computados; los casos con imagen de fondo se reportan como «revisar». 2.5.8 admite excepciones (inline equivalente, espaciado) que aquí se aproximan."
}
