{
 "url": "https://concellodemoana.org",
 "modo": "rendered",
 "score": 8,
 "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": 267,
 "resumen": {
  "alta": 5,
  "media": 4,
  "baja": 4
 },
 "hallazgos": [
  {
   "severidad": "alta",
   "criterio": "1.4.3",
   "hallazgo": "6 zonas de texto con contraste insuficiente: rgb(255,255,255) vs rgb(62,133,177) = 4.04:1 ×1; rgb(62,133,177) vs rgb(255,255,255) = 4.04:1 ×31; rgb(62,133,177) vs rgb(239,239,239) = 3.52:1 ×3; rgb(62,133,177) vs rgb(255,201,28) = 2.62: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(255,255,255) sobre rgb(62,133,177) → 4.04:1 (p. ej. div > div > button)",
    "rgb(62,133,177) sobre rgb(255,255,255) → 4.04:1 (p. ej. div > div > a)",
    "rgb(62,133,177) sobre rgb(239,239,239) → 3.52:1 (p. ej. div > p > a)",
    "rgb(62,133,177) sobre rgb(255,201,28) → 2.62:1 (p. ej. ol > li > a)",
    "rgb(255,255,255) sobre rgb(235,42,49) → 4.28:1 (p. ej. td > div#daynum-6-0 > a)",
    "rgb(62,133,177) sobre rgb(226,227,228) → 3.15:1 (p. ej. div > p > a)"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "30 <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#logo > a",
    "ul#navigation > li#menu-item-1083 > a",
    "div > div > a",
    "div > div > a",
    "div > div > a",
    "div > div > a"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "3.3.2 Etiquetas o instrucciones",
   "hallazgo": "1 campos de formulario sin <label> asociado ni nombre accesible.",
   "remediacion": "Asocia <label for=\"id\"> al campo (o envuélvelo), o usa aria-label. Aplica a input, select y textarea.",
   "ejemplos": [
    "div > div > input"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "1.1.1 Contenido no textual",
   "hallazgo": "1 <img> sin atributo alt (ni siquiera alt=\"\").",
   "remediacion": "Añade alt a cada <img>: texto descriptivo si aporta información, alt=\"\" si es decorativa. En <input type=\"image\"> y <area> es igual de obligatorio.",
   "ejemplos": [
    "https://concellodemoana.org/wp-content/uploads/2019/11/icono-concello-botonera-20.png"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "2 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": "40 controles con área de toque menor de 24×24 px (WCAG 2.2, 2.5.8): #pojo-a11y-skip-content (75×23), div > div > div (20×20), div > div > a (103×23), div > div > a (200×23).",
   "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": [
    "#pojo-a11y-skip-content (75×23px)",
    "div > div > div (20×20px)",
    "div > div > a (103×23px)",
    "div > div > a (200×23px)",
    "div > div#logo > a (219×19px)",
    "ul > li#menu-item-2076 > a (200×2px)"
   ]
  },
  {
   "severidad": "media",
   "criterio": "2.4.3 Orden del foco",
   "hallazgo": "1 elementos con tabindex positivo (modifica el orden natural).",
   "remediacion": "Usa tabindex=\"0\" o elimina el atributo: el orden de tabulación debe seguir al DOM.",
   "ejemplos": [
    "#pojo-a11y-skip-content"
   ]
  },
  {
   "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": "media",
   "criterio": "1.3.1 Información y relaciones",
   "hallazgo": "1 <table> sin celdas <th>.",
   "remediacion": "Marca encabezados de fila/columna con <th> (y scope) para que el lector asocie celdas."
  },
  {
   "severidad": "baja",
   "criterio": "1.4.3",
   "hallazgo": "69 zonas de texto con imagen de fondo o sombra: no calculables, revisar.",
   "remediacion": "El contraste sobre imagen de fondo no es calculable aquí: usa a11y_contrast_image con una captura de esa región."
  },
  {
   "severidad": "baja",
   "criterio": "1.3.1 Información y relaciones",
   "hallazgo": "Saltos de nivel en encabezados: h2→h4.",
   "remediacion": "No saltes niveles (h2→h4): rompe el esquema de navegación. Baja de uno en uno."
  },
  {
   "severidad": "baja",
   "criterio": "1.3.1 Información y relaciones",
   "hallazgo": "7 encabezados vacíos (<h*> sin texto).",
   "remediacion": "Elimina los encabezados vacíos o dales texto: aparecen como huecos en el índice del lector."
  },
  {
   "severidad": "baja",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "1 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."
}
