{
 "url": "https://boiro.gal",
 "modo": "rendered",
 "score": 34,
 "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": 149,
 "resumen": {
  "alta": 3,
  "media": 4,
  "baja": 3
 },
 "hallazgos": [
  {
   "severidad": "alta",
   "criterio": "1.4.3",
   "hallazgo": "12 zonas de texto con contraste insuficiente: rgb(255,255,255) vs rgb(9,184,193) = 2.43:1 ×15; rgb(221,221,221) vs rgb(9,184,193) = 1.79:1 ×1; rgb(255,255,255) vs rgb(170,233,245) = 1.34:1 (grande) ×1; rgb(255,255,255) vs rgb(93,214,210) = 1.75: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(9,184,193) → 2.43:1 (p. ej. div > a > span)",
    "rgb(221,221,221) sobre rgb(9,184,193) → 1.79:1 (p. ej. div > ul > span)",
    "rgb(255,255,255) sobre rgb(170,233,245) → 1.34:1 (p. ej. div > div > div)",
    "rgb(255,255,255) sobre rgb(93,214,210) → 1.75:1 (p. ej. li > a > span)",
    "rgb(93,214,210) sobre rgb(255,255,255) → 1.75:1 (p. ej. article > div > h3)",
    "rgb(24,152,145) sobre rgb(255,255,255) → 3.54:1 (p. ej. div > p > i)"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "12 <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": [
    "ul > li > a",
    "div > form > button",
    "div#banners > div > a",
    "div#banners > div > a",
    "div#banners > div > a",
    "div#banners > div > a"
   ]
  },
  {
   "severidad": "alta",
   "criterio": "3.3.2 Etiquetas o instrucciones",
   "hallazgo": "6 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": [
    "#mod-search-searchword95",
    "#name",
    "div > div > input",
    "div > div > input",
    "div > div > textarea",
    "div > div > input"
   ]
  },
  {
   "severidad": "media",
   "criterio": "2.5.8 Tamaño del objetivo (mínimo)",
   "hallazgo": "13 controles con área de toque menor de 24×24 px (WCAG 2.2, 2.5.8): div > div > a (118×14), div > div > a (116×14), div > div > a (569×16), div > div > a (518×16).",
   "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 > div > a (118×14px)",
    "div > div > a (116×14px)",
    "div > div > a (569×16px)",
    "div > div > a (518×16px)",
    "div > div > a (541×16px)",
    "div > div > a (93×17px)"
   ]
  },
  {
   "severidad": "media",
   "criterio": "2.4.7 Foco visible",
   "hallazgo": "6 controles enfocables sin indicador de foco aparente (outline y box-shadow ausentes): div#myCarousel > div > a, div#myCarousel > div > a, ul > li > a, ul > li > a. Revisar.",
   "remediacion": "Asegura un indicador de foco visible: nunca outline:none sin sustituto; usa :focus-visible con outline ≥2px o borde/sombra contrastada (2.4.7).",
   "ejemplos": [
    "div#myCarousel > div > a",
    "div#myCarousel > div > a",
    "ul > li > a",
    "ul > li > a",
    "ul > li > a",
    "ul > li > a"
   ]
  },
  {
   "severidad": "media",
   "criterio": "4.1.2 Nombre, función, valor",
   "hallazgo": "3 <iframe> sin title accesible.",
   "remediacion": "Añade title descriptivo al iframe (lo anuncian los lectores al llegar a él).",
   "ejemplos": [
    "https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d11738.644521630275!2d-8.8827394!3d42.6473434!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x0%3A0xf6ee7982191bf51!2sConcello+de+Boiro!5e0!3m2!1ses!2ses!4v1493281195091",
    "https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d11738.644521630275!2d-8.8827394!3d42.6473434!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x0%3A0xf6ee7982191bf51!2sConcello+de+Boiro!5e0!3m2!1ses!2ses!4v1493281195091",
    ""
   ]
  },
  {
   "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": "1.4.3",
   "hallazgo": "9 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": "3.2.5 Cambio a petición",
   "hallazgo": "10 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": "6 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."
}
