/* =====================================================================
   accesibilidad.css — el módulo global de accesibilidad

   Dos cosas viven aquí:

   1. El widget: un botón flotante abajo a la IZQUIERDA y su panel. La
      izquierda no es capricho — el botón de WhatsApp ocupa la esquina
      inferior derecha, y dos discos flotantes en la misma esquina se
      tapan el uno al otro en un móvil de 360 px. Acuerdo entre los dos
      módulos: derecha para WhatsApp, izquierda para accesibilidad.

   2. Los modos: alto contraste, corrección de color, escalado de texto,
      tipografía de fácil lectura y pausa del movimiento. Todos se
      encienden con un atributo en <html> que pone accesibilidad.js. Nada
      de clases sueltas: un atributo por eje, así se leen de un vistazo en
      el inspector y se combinan sin pisarse.

          data-a11y-contraste="alto"
          data-a11y-color="monocromo|protanopia|deuteranopia|tritanopia"
          data-a11y-lectura="facil"
          data-a11y-movimiento="pausado"

      Los dos ejes que NO viven aquí son el tamaño del texto —es
      font-size sobre :root, y lo pone el JS con element.style— y el
      filtro de color en sí. Sobre esto último, una advertencia que costó
      encontrar: `filter: url(#id)` escrito en una hoja EXTERNA no resuelve
      igual en todos los navegadores, porque el fragmento se puede
      interpretar contra la URL de la hoja en vez de contra la del
      documento. Por eso el valor del filtro lo pone accesibilidad.js en
      raiz.style.filter, que siempre resuelve contra el documento. Aquí
      solo queda el estado.

   Todo respeta la CSP cerrada del sitio: ni un style=, ni un <style>, ni
   un on*. El JS cambia estilos por element.style, que el CSP no toca.
   ===================================================================== */

/* =====================================================================
   OpenDyslexic — la tipografía de fácil lectura

   Es la que pidió el cliente y la que se pudo conseguir: OpenDyslexic
   1.5 (Abbie Gonzalez), licencia SIL Open Font License 1.1, descargada de
   github.com/antijingoist/opendyslexic. La copia de la licencia va al
   lado de los archivos, en /fonts/opendyslexic-OFL.txt, porque la OFL
   exige distribuirla con la fuente.

   No se enlaza a ningún CDN: los .otf originales se recortaron al mismo
   rango latin que ya usan Cinzel e Inter en fuentes.css y se convirtieron
   a woff2. Dos caras —regular y negrita— por 37 KB en total, servidas
   desde el propio origen con la caché inmutable de un año que _headers da
   a los .woff2.

   font-display: swap, igual que las otras dos. Quien enciende esta opción
   está esperando el cambio; verla llegar tarde es peor que verla llegar
   con la letra del sistema durante 100 ms.
   ===================================================================== */
@font-face {
  font-family: 'OpenDyslexic';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/fonts/opendyslexic-latin-regular.woff2') format('woff2');
}

@font-face {
  font-family: 'OpenDyslexic';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/fonts/opendyslexic-latin-bold.woff2') format('woff2');
}

/* =====================================================================
   Variables del módulo
   ===================================================================== */
:root {
  /* Por encima de todo lo que hay en el sitio, incluido el visor de
     imágenes a pantalla completa (100002) y su botón de cierre (100008).
     Un control de accesibilidad que queda enterrado bajo una capa no
     sirve: tiene que poder alcanzarse esté abierto lo que esté abierto. */
  --a11y-capa: 100050;

  --a11y-disco: 3rem;              /* 48 px: por encima del mínimo táctil */
  --a11y-margen: clamp(0.75rem, 3vw, 1.25rem);
  --a11y-panel-ancho: min(21.5rem, calc(100vw - 1.5rem));
}

/* =====================================================================
   El contenedor flotante
   ===================================================================== */
.a11y {
  position: fixed;
  inset-block-end: var(--a11y-margen);
  inset-inline-start: var(--a11y-margen);
  z-index: var(--a11y-capa);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--m-esp-2xs, 0.5rem);
  font-family: var(--m-cuerpo, system-ui, sans-serif);
}

/* Los filtros de color viven en un <svg> que no ocupa nada y no se lee.
   Sin estas cuatro líneas, la regla `svg { max-width:100%; height:auto }`
   de sistema.css le daría alto automático y dejaría un hueco al final del
   documento. */
.a11y-filtros {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
  pointer-events: none;
}

/* =====================================================================
   El botón

   Un disco con el símbolo internacional de accesibilidad. Toma el color
   de la marca activa, así que en la portada industrial es azul de arco y
   en la medieval es oro de fragua, sin una sola regla por marca.
   ===================================================================== */
.a11y__disparador {
  display: grid;
  place-items: center;
  width: var(--a11y-disco);
  height: var(--a11y-disco);
  padding: 0;
  border: var(--m-hilo, 1px) solid color-mix(in srgb, var(--m-acento, #00bfff) 55%, transparent);
  border-radius: 50%;
  background:
    radial-gradient(120% 120% at 50% 0%,
      color-mix(in srgb, var(--m-negro-3, #17171b) 88%, var(--m-acento, #00bfff)) 0%,
      var(--m-negro-1, #0a0a0c) 100%);
  color: var(--m-acento-claro, #7fe3ff);
  box-shadow: var(--m-sombra-media, 0 12px 40px rgb(0 0 0 / 0.55));
  cursor: pointer;
  transition:
    color var(--m-rapido, 150ms) var(--m-entrada, ease),
    border-color var(--m-rapido, 150ms) var(--m-entrada, ease),
    box-shadow var(--m-medio, 320ms) var(--m-salida, ease),
    transform var(--m-medio, 320ms) var(--m-salida, ease);
}

/* El icono va con las pinturas en CSS y no en atributos de presentación,
   para que no haya dos sitios donde mirar cuando cambie el color. */
.a11y__disparador svg {
  width: 1.5rem;
  height: 1.5rem;
  pointer-events: none;
}

.a11y__icono-relleno {
  fill: currentColor;
}

.a11y__icono-trazo {
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.a11y__disparador:hover,
.a11y__disparador:focus-visible {
  border-color: var(--m-acento, #00bfff);
  box-shadow:
    var(--m-sombra-media, 0 12px 40px rgb(0 0 0 / 0.55)),
    0 0 26px color-mix(in srgb, var(--m-acento, #00bfff) 40%, transparent);
  transform: translateY(-2px);
}

.a11y__disparador[aria-expanded='true'] {
  border-color: var(--m-acento, #00bfff);
  color: var(--m-negro-0, #050506);
  background: linear-gradient(180deg, var(--m-acento, #00bfff) 0%, var(--m-acento-hondo, #0a5f8f) 100%);
}

/* =====================================================================
   El velo

   Transparente a propósito. Un panel con foco atrapado necesita que un
   clic fuera lo cierre, y para eso hace falta una superficie que reciba
   ese clic; pero oscurecer la página sería contraproducente justo aquí,
   porque quien está ajustando el contraste o el tamaño de letra necesita
   ver el efecto sobre la página real mientras lo ajusta.
   ===================================================================== */
.a11y__velo {
  position: fixed;
  inset: 0;
  z-index: -1;
  background: transparent;
  border: 0;
  padding: 0;
  cursor: default;
}

/* =====================================================================
   El panel
   ===================================================================== */
.a11y__panel {
  order: -1;                       /* se abre hacia arriba, sobre el botón */
  width: var(--a11y-panel-ancho);
  max-height: calc(100vh - 6.5rem);
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: var(--m-esp-xs, 0.75rem);
  position: relative;
  background:
    linear-gradient(160deg,
      color-mix(in srgb, var(--m-negro-3, #17171b) 92%, var(--m-acento, #00bfff)) 0%,
      var(--m-negro-2, #101013) 45%,
      var(--m-negro-1, #0a0a0c) 100%);
  border: var(--m-hilo, 1px) solid color-mix(in srgb, var(--m-acento, #00bfff) 26%, transparent);
  border-radius: var(--m-radio-md, 10px);
  box-shadow: var(--m-sombra-alta, 0 28px 80px rgb(0 0 0 / 0.65));
  color: var(--m-texto, #eef2f7);
}

.a11y__panel[hidden] {
  display: none;
}

/* El canto superior iluminado de .m-superficie, repetido aquí porque el
   panel no puede llevar esa clase: lo construye el JS y no debe depender
   de que la página cargue sistema.css con una versión concreta. */
.a11y__panel::before {
  content: '';
  position: absolute;
  inset-inline: 14%;
  inset-block-start: -1px;
  height: 1px;
  background: linear-gradient(90deg, transparent,
    color-mix(in srgb, var(--m-acento-claro, #7fe3ff) 55%, transparent), transparent);
  pointer-events: none;
}

.a11y__cabecera {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--m-esp-2xs, 0.5rem);
  margin-block-end: var(--m-esp-xs, 0.75rem);
}

.a11y__titulo {
  margin: 0;
  font-family: var(--m-cuerpo, system-ui, sans-serif);
  font-size: var(--m-txt-md, 1.13rem);
  font-weight: 600;
  line-height: 1.2;
  color: var(--m-texto, #eef2f7);
}

.a11y__cerrar {
  display: grid;
  place-items: center;
  width: 2.25rem;
  height: 2.25rem;
  flex: 0 0 auto;
  padding: 0;
  border: var(--m-hilo, 1px) solid transparent;
  border-radius: var(--m-radio-sm, 4px);
  background: transparent;
  color: var(--m-humo, #a3a9b4);
  font-size: 1.25rem;
  line-height: 1;
  cursor: pointer;
}

.a11y__cerrar:hover,
.a11y__cerrar:focus-visible {
  border-color: color-mix(in srgb, var(--m-acento, #00bfff) 45%, transparent);
  color: var(--m-acento-claro, #7fe3ff);
}

/* ── Grupos ──────────────────────────────────────────────────────── */
.a11y__grupo {
  border: 0;
  margin: 0;
  padding: 0;
  padding-block-start: var(--m-esp-2xs, 0.5rem);
  margin-block-start: var(--m-esp-2xs, 0.5rem);
  border-block-start: var(--m-hilo, 1px) solid color-mix(in srgb, var(--m-acento, #00bfff) 14%, transparent);
}

.a11y__grupo:first-of-type {
  border-block-start: 0;
  padding-block-start: 0;
  margin-block-start: 0;
}

.a11y__leyenda {
  display: block;
  padding: 0;
  margin-block-end: var(--m-esp-2xs, 0.5rem);
  font-size: var(--m-txt-xs, 0.75rem);
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--m-acento, #00bfff);
}

.a11y__nota {
  margin: var(--m-esp-2xs, 0.5rem) 0 0;
  font-size: var(--m-txt-xs, 0.75rem);
  line-height: 1.5;
  color: var(--m-humo-tenue, #767c87);
}

.a11y__opciones {
  display: flex;
  flex-wrap: wrap;
  gap: var(--m-esp-3xs, 0.25rem);
}

.a11y__interruptor + .a11y__opciones,
.a11y__escala + .a11y__interruptor {
  margin-block-start: var(--m-esp-2xs, 0.5rem);
}

/* ── Controles ───────────────────────────────────────────────────── */

/* Base común de todo lo pulsable del panel. */
.a11y__opcion,
.a11y__interruptor,
.a11y__paso,
.a11y__restablecer {
  font-family: inherit;
  font-size: var(--m-txt-sm, 0.88rem);
  line-height: 1.3;
  color: var(--m-humo, #a3a9b4);
  background: color-mix(in srgb, var(--m-negro-0, #050506) 60%, transparent);
  border: var(--m-hilo, 1px) solid color-mix(in srgb, var(--m-acento, #00bfff) 22%, transparent);
  border-radius: var(--m-radio-sm, 4px);
  cursor: pointer;
  transition:
    color var(--m-rapido, 150ms) var(--m-entrada, ease),
    border-color var(--m-rapido, 150ms) var(--m-entrada, ease),
    background-color var(--m-rapido, 150ms) var(--m-entrada, ease);
}

.a11y__opcion:hover,
.a11y__interruptor:hover,
.a11y__paso:not(:disabled):hover,
.a11y__restablecer:hover {
  color: var(--m-texto, #eef2f7);
  border-color: color-mix(in srgb, var(--m-acento, #00bfff) 55%, transparent);
}

/* Opción de un grupo excluyente (el color). Es un botón con aria-pressed,
   el mismo patrón que el conmutador de marca de la cabecera: se llega por
   tabulador, se pulsa con Intro o espacio, y dice su estado. */
.a11y__opcion {
  min-height: 2.25rem;
  padding: var(--m-esp-3xs, 0.25rem) var(--m-esp-xs, 0.75rem);
}

.a11y__opcion[aria-pressed='true'] {
  background: linear-gradient(180deg, var(--m-acento, #00bfff) 0%, var(--m-acento-hondo, #0a5f8f) 100%);
  border-color: var(--m-acento, #00bfff);
  color: var(--m-negro-0, #050506);
  font-weight: 600;
}

/* Interruptor: fila entera, etiqueta a la izquierda y la pastilla a la
   derecha. role="switch" + aria-checked; el estado se ve y se anuncia. */
.a11y__interruptor {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--m-esp-xs, 0.75rem);
  width: 100%;
  min-height: 2.75rem;
  padding: var(--m-esp-3xs, 0.25rem) var(--m-esp-xs, 0.75rem);
  text-align: start;
}

.a11y__interruptor + .a11y__interruptor {
  margin-block-start: var(--m-esp-3xs, 0.25rem);
}

.a11y__interruptor[aria-checked='true'] {
  color: var(--m-texto, #eef2f7);
  border-color: color-mix(in srgb, var(--m-acento, #00bfff) 60%, transparent);
}

.a11y__pastilla {
  flex: 0 0 auto;
  width: 2.25rem;
  height: 1.25rem;
  border-radius: 999px;
  background: var(--m-negro-4, #22222a);
  border: var(--m-hilo, 1px) solid color-mix(in srgb, var(--m-acento, #00bfff) 25%, transparent);
  position: relative;
  transition: background-color var(--m-rapido, 150ms) var(--m-entrada, ease);
}

.a11y__pastilla::after {
  content: '';
  position: absolute;
  inset-block-start: 50%;
  inset-inline-start: 2px;
  width: 0.875rem;
  height: 0.875rem;
  border-radius: 50%;
  background: var(--m-humo, #a3a9b4);
  transform: translate(0, -50%);
  transition:
    transform var(--m-medio, 320ms) var(--m-salida, ease),
    background-color var(--m-rapido, 150ms) var(--m-entrada, ease);
}

.a11y__interruptor[aria-checked='true'] .a11y__pastilla {
  background: color-mix(in srgb, var(--m-acento, #00bfff) 45%, var(--m-negro-4, #22222a));
}

.a11y__interruptor[aria-checked='true'] .a11y__pastilla::after {
  transform: translate(1rem, -50%);
  background: var(--m-acento-claro, #7fe3ff);
}

/* Escalado del texto: − / lectura / +. */
.a11y__escala {
  display: flex;
  align-items: center;
  gap: var(--m-esp-2xs, 0.5rem);
}

.a11y__paso {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 2.75rem;
  height: 2.75rem;
  font-size: var(--m-txt-md, 1.13rem);
  font-weight: 700;
  padding: 0;
}

.a11y__paso:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}

.a11y__medida {
  flex: 1 1 auto;
  text-align: center;
  font-size: var(--m-txt-sm, 0.88rem);
  font-variant-numeric: tabular-nums;
  color: var(--m-texto, #eef2f7);
}

.a11y__restablecer {
  width: 100%;
  min-height: 2.75rem;
  margin-block-start: var(--m-esp-xs, 0.75rem);
  padding: var(--m-esp-3xs, 0.25rem) var(--m-esp-xs, 0.75rem);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 600;
}

/* Lo que solo se anuncia. No display:none: un lector de pantalla no lee
   lo que está fuera del árbol de accesibilidad. */
.a11y__anuncio {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Foco visible aunque la página no cargue sistema.css. */
.a11y :focus-visible {
  outline: 2px solid var(--m-acento-claro, #7fe3ff);
  outline-offset: 2px;
}

/* En pantallas bajas el panel no cabe encima del botón: se le deja todo
   el alto disponible y que haga scroll dentro. */
@media (max-height: 34rem) {
  .a11y__panel {
    max-height: calc(100vh - 5rem);
  }
}

/* =====================================================================
   MODO: alto contraste

   Dos capas, porque el sitio tiene dos generaciones de CSS.

   La primera reescribe los tokens de sistema.css, y con eso basta para
   todo lo que lleva clases m-. La segunda es deliberadamente bruta y
   existe para el CSS antiguo, que trae los grises escritos a mano —48
   apariciones de #0099ff, 42 de #d4af37— y no consulta ninguna variable:
   ahí no hay más remedio que forzar el texto a blanco puro.

   La lista de la segunda capa son SOLO elementos de bloque. Los inline
   —span, strong, em, small— se quedaron fuera a propósito, y esto se
   midió antes de decidirlo: en el CSS antiguo hay 19 reglas que le dan
   fondo propio a un span y solo 12 que le dan color. Es decir, la etiqueta
   span de este sitio es más a menudo una pastilla de color que un trozo
   de texto corrido, y pintarle el texto de blanco dejaría letras blancas
   sobre oro o sobre cian. Un span dentro de un párrafo hereda el blanco
   del párrafo de todas formas, así que no se pierde casi nada.

   Se excluye también lo que va dentro de un botón, porque un botón sólido
   tiene texto oscuro sobre el acento; pintarlo de blanco lo volvería
   ilegible, que es justo lo contrario de lo que se pide aquí.
   Y una tercera cosa, que costó encontrar: la lista de selectores lleva
   `[data-a11y-contraste='alto'] [data-marca]` además de la raíz. Los
   tokens de cada marca no se declaran solo en <html>: sistema.css los
   declara con `[data-marca='cnc']`, y ese selector cae también sobre el
   <div data-marca="cnc"> que envuelve media portada. Dentro de esa
   sección, la marca volvía a declarar sus colores y pisaba los del modo,
   porque los dos selectores pesan lo mismo y el de la marca está más
   cerca. Resultado: el alto contraste se quedaba en la cabecera y en el
   pie y no entraba en ninguna banda. Con la segunda mitad de la lista el
   modo pesa (0,2,0) y gana dentro de la sección.
   ===================================================================== */
[data-a11y-contraste='alto'],
[data-a11y-contraste='alto'] [data-marca] {
  --m-negro-0: #000000;
  --m-negro-1: #000000;
  --m-negro-2: #000000;
  --m-negro-3: #0b0b0d;
  --m-negro-4: #ffffff;

  --m-tinta: #ffffff;
  --m-papel: #ffffff;
  --m-humo: #ffffff;
  --m-humo-tenue: #e6e6e6;
  --m-texto: #ffffff;

  /* Los acentos suben de luminancia para que el texto oscuro que va
     encima —los botones sólidos— siga teniendo su contraste.

     Basta con pisar las primitivas: los tokens semánticos --m-acento-*
     apuntan a ellas con var() en las dos marcas y en :root. Hubo un
     momento en que la marca industrial las declaraba con literales y
     esta redefinición no le llegaba —el botón de sesión salía celeste
     sobre celeste—; eso se corrigió en sistema.css devolviendo la cadena
     de var(), que es donde tenía que arreglarse. */
  --m-arco: #7fdcff;
  --m-arco-claro: #ffffff;
  --m-arco-hondo: #0a3d5c;
  --m-oro: #ffd75e;
  --m-oro-claro: #ffffff;
  --m-oro-hondo: #6b4f00;
  --m-brasa: #ff7a45;

  /* El ritmo de bandas de la marca industrial —seis azules distintos, uno
     por panel— es lo contrario de lo que pide este modo: son seis fondos
     que no son negro. Aquí se aplanan los seis. La diferencia entre
     paneles la sigue marcando el filete del corte, que en alto contraste
     va en blanco. */
  --m-banda-1: #000000;
  --m-banda-2: #000000;
  --m-banda-3: #000000;
  --m-banda-4: #000000;
  --m-banda-5: #000000;
  --m-banda-6: #000000;
  --m-banda-pie: #000000;

  /* La barra de navegación es blanca en la marca industrial por decisión
     de marca. En alto contraste manda el modo: negra, con la letra en
     blanco y el azul claro del resto del modo. */
  --m-barra-fondo: #000000;
  --m-barra-tinta: #ffffff;
  --m-barra-azul: #7fdcff;
  --m-barra-azul-claro: #ffffff;
}

/* Fondo plano: fuera los focos de color y el grano. Un degradado radial
   por debajo del texto le quita entre medio punto y un punto de ratio de
   contraste, y en este modo eso importa más que la atmósfera. */
[data-a11y-contraste='alto'] .m-atmosfera::before {
  background: #000000 !important;
}

[data-a11y-contraste='alto'] .m-atmosfera::after {
  display: none !important;
}

[data-a11y-contraste='alto'] :is(
  p, li, dd, dt, td, th, caption, figcaption, blockquote,
  label, address, legend, h1, h2, h3, h4, h5, h6
) {
  color: #ffffff !important;
}

/* Devuelve la herencia dentro de lo pulsable: el botón manda sobre su
   propio texto. Gana por especificidad, no por orden. */
[data-a11y-contraste='alto'] :is(button, .m-boton, [role='button'], [role='switch'], summary)
  :is(p, li, label, h1, h2, h3, h4, h5, h6) {
  color: inherit !important;
}

/* Un enlace no puede distinguirse solo por el color: en este modo, y con
   un filtro de daltonismo puesto, el color es lo primero que se pierde. */
[data-a11y-contraste='alto'] a:not(.m-boton):not([role='button']) {
  color: var(--m-acento-claro) !important;
  text-decoration: underline !important;
  text-underline-offset: 0.15em;
}

/* Las pastillas de la barra —«Iniciar Sesión», «Panel» y «Llave en mano»—
   llevan relleno propio, así que la regla de arriba les mete el color de
   enlace encima: el rótulo salía en blanco sobre el celeste del modo, 1,6:1,
   justo para quien lo había encendido para poder leer. Aquí se pintan como
   todo lo demás en alto contraste: negro, letra blanca y borde blanco.

   «Iniciar Sesión» es un <button> desde que abre el diálogo de cuenta en vez
   de navegar, así que el selector va por clase y no por etiqueta. */
[data-a11y-contraste='alto'] .cabecera__sesion,
[data-a11y-contraste='alto'] .cabecera__panel,
[data-a11y-contraste='alto'] a.cabecera__llave {
  background: #000000 !important;
  border-color: #ffffff !important;
  color: #ffffff !important;
}

[data-a11y-contraste='alto'] :is(input, textarea, select) {
  background-color: #000000 !important;
  color: #ffffff !important;
  border-color: #ffffff !important;
}

[data-a11y-contraste='alto'] ::placeholder {
  color: #cfcfcf !important;
  opacity: 1;
}

[data-a11y-contraste='alto'] :focus-visible {
  outline: 3px solid #ffffff !important;
  outline-offset: 3px;
}

/* =====================================================================
   MODO: tipografía de fácil lectura

   Se cambian las variables —para lo que sí las lee— y además se fuerza
   por etiqueta, porque el CSS antiguo declara font-family directamente y
   no consultaría la variable nunca.

   Va acompañado de más aire entre líneas y entre palabras: OpenDyslexic
   ya trae letras anchas, y sin ese aire las líneas se pegan.
   ===================================================================== */
[data-a11y-lectura='facil'] {
  --m-cuerpo: 'OpenDyslexic', Verdana, Tahoma, sans-serif;
  --m-titular: 'OpenDyslexic', Verdana, Tahoma, sans-serif;
  --m-titular-ajuste: 0;
}

[data-a11y-lectura='facil'] body,
[data-a11y-lectura='facil'] body * {
  font-family: 'OpenDyslexic', Verdana, Tahoma, sans-serif !important;
  letter-spacing: normal !important;
}

[data-a11y-lectura='facil'] body {
  line-height: 1.7;
  word-spacing: 0.08em;
}

/* Las mayúsculas de las cintas y los botones se leen peor en cualquier
   tipografía, y en una de letras asimétricas todavía peor. */
[data-a11y-lectura='facil'] :is(.m-cinta, .m-boton, .a11y__leyenda, .a11y__restablecer) {
  text-transform: none !important;
}

/* =====================================================================
   MODO: movimiento en pausa

   Es una copia literal del bloque prefers-reduced-motion de sistema.css.
   Literal a propósito: el encargo dice que pausar tenga exactamente el
   mismo efecto que la preferencia del sistema, y la forma de garantizarlo
   es que sean las mismas declaraciones y no una aproximación.

   No es «quitar animaciones»: es entregar el estado final. Quien pausa ve
   la página compuesta, no una página a medio revelar.
   ===================================================================== */
[data-a11y-movimiento='pausado'] *,
[data-a11y-movimiento='pausado'] *::before,
[data-a11y-movimiento='pausado'] *::after {
  animation-duration: 0.01ms !important;
  animation-iteration-count: 1 !important;
  transition-duration: 0.01ms !important;
  scroll-behavior: auto !important;
}

[data-a11y-movimiento='pausado'] .m-revelable {
  opacity: 1 !important;
  transform: none !important;
}

/* El vídeo no lo cubre ninguna regla CSS: lo pausa el JS. Aquí solo se
   quita el desplazamiento suave del documento. */
[data-a11y-movimiento='pausado'] {
  scroll-behavior: auto !important;
}

/* =====================================================================
   El widget también obedece a la preferencia del sistema
   ===================================================================== */
@media (prefers-reduced-motion: reduce) {
  .a11y__disparador,
  .a11y__pastilla,
  .a11y__pastilla::after {
    transition-duration: 0.01ms !important;
  }

  .a11y__disparador:hover,
  .a11y__disparador:focus-visible {
    transform: none;
  }
}

/* =====================================================================
   EL SITIO QUE SE LE RESERVA AL DISCO EN EL PIE

   El disparador es fijo, así que al final de la página se posa encima de
   la última línea del pie. Medido con la página abajo del todo, a 390 px:
   en las cuatro páginas legales tapaba el renglón del copyright y en el
   arsenal tapaba el enlace «Referencias históricas», que es la única vía
   a las referencias desde esa página. Cruzarse con el contenido mientras
   se pasa es propio de un botón flotante; quedarse encima de un enlace
   cuando la página se detiene, no.

   El pie de las ocho páginas que no son la portada es `.pie`, y las
   cuatro hojas que lo pintan —legales, galeria, arsenal, referencias—
   declaran su relleno con el atajo `padding`, que pisa cualquier lado
   suelto que se declare antes. Esta hoja carga antes que ellas, así que
   la regla necesita ganar por peso: la clase repetida da (0,2,0) contra
   sus (0,1,0). Se reserva el alto del disco más sus dos márgenes, que es
   la misma cuenta que hace llave-en-mano.css para el botón de WhatsApp.

   Los dos pies de la portada no aparecen aquí porque ya llevan esa misma
   reserva por el botón de WhatsApp, que mide igual y guarda el mismo
   margen en la esquina de enfrente.

   Va dentro de @media screen porque en papel no hay disco: el bloque de
   impresión de cada hoja se queda mandando sobre su pie, sin tener que
   volver a nombrarlo aquí. */
@media screen {
  .pie.pie {
    padding-block-end: calc(var(--m-esp-lg, 2rem) + var(--a11y-disco) + 2 * var(--a11y-margen));
  }
}


/* =====================================================================
   DOS AYUDAS PARA EL TRADUCTOR

   No pintan nada del widget: son las dos piezas de CSS que necesita
   i18n.js para poder marcar el HTML sin romperlo. Viven aquí porque esta
   hoja es la única que cargan las nueve páginas además de sistema.css, y
   porque se retiran con el módulo si algún día se retira.
   ===================================================================== */

/* 1. El trozo llano de un titular partido.

   `data-i18n` escribe con textContent, así que solo vale en elementos sin
   hijos-elemento. Los titulares del sitio son «TEXTO <span>ACENTO</span>»,
   y para poder traducir la primera mitad hay que envolverla. El problema
   es que portada.css y llave-en-mano.css pintan el verso de acento con
   selectores del tipo `.pg-title span`, que pesan (0,1,1): un envoltorio
   nuevo heredaría el degradado o el azul de arco y el titular saldría
   entero en color.

   La clase repetida pesa (0,2,0) y gana a esos (0,1,1) sin tener que
   nombrar una por una las nueve hojas que lo hacen. Devuelve el trozo al
   color del titular y no toca nada más.

   Si algún día los acentos se marcan con una clase propia en vez de con
   `span` a secas, esta regla sobra. */
.i18n-neutro.i18n-neutro {
  background: none;
  color: inherit;
  -webkit-text-fill-color: currentColor;
}

/* 2. Lo que solo se enseña con la interfaz en inglés.

   El cuerpo de los cuatro documentos legales NO se traduce: es el texto
   que obliga, redactado sobre la Ley 19.628 y la Ley 21.719, y dos
   versiones que podrían no decir lo mismo son peor que una sola. Lo que
   sí hace falta es que quien llega en inglés sepa por qué la página está
   en español y a dónde escribir; ese aviso cuelga de esta clase.

   El gancho es el atributo lang de <html>, que i18n.js escribe al aplicar
   el diccionario al documento entero. Sin JS no hay atributo en inglés y
   el aviso no aparece, que es lo correcto: sin JS la página está en
   español de todas formas. */
.i18n-solo-en {
  display: none;
}

:root[lang='en'] .i18n-solo-en {
  display: block;
  margin-block: var(--m-esp-xs, 0.75rem) 0;
  padding: var(--m-esp-2xs, 0.5rem) var(--m-esp-xs, 0.75rem);
  border-inline-start: 2px solid var(--m-acento, #00bfff);
  background: color-mix(in srgb, var(--m-acento, #00bfff) 7%, transparent);
  color: var(--m-humo, #a3a9b4);
  font-family: var(--m-cuerpo, system-ui, sans-serif);
  font-size: var(--m-txt-sm, 0.9rem);
  line-height: 1.55;
  text-align: start;
}

/* =====================================================================
   Impresión: el widget no es contenido
   ===================================================================== */
@media print {
  .a11y,
  .a11y-filtros {
    display: none !important;
  }
}
