/* =====================================================================
   ESCUELA RENACER · Sistema visual del sitio público
   Hermano de assets/ekklesia.css. Deliberadamente NO es una copia.

   QUÉ SE HEREDA de Ekklesia, tal cual y sin discutir: la escala de azul
   medianoche, las superficies, la tinta, los radios, las sombras, la
   disciplina de tokens y la regla de que el color sólo aparece cuando
   comunica algo. Los dos sitios tienen que leerse como la misma casa.

   QUÉ ES PROPIO DE ACÁ, y por qué:

   · UNA SERIF. Ekklesia es una aplicación de escritorio: densa, funcional,
     toda en grotesca. Este sitio presenta una escuela y cita las
     Escrituras. Puesto entero en Schibsted Grotesk se lee como un panel
     de administración con la letra grande. La serif (Newsreader) entra
     SÓLO en dos lugares —los títulos de despliegue y los versículos— y
     ahí es donde el sitio tiene voz propia.

   · TIPO MÁS GRANDE. Ekklesia se lee a distancia de escritorio, con el
     ojo yendo a una celda concreta de una tabla; su cuerpo es 13.5px.
     Esto se lee a distancia de brazo, seguido, y muchas veces en el
     teléfono. Cuerpo 17px.

   · LA RUTA. El programa académico no es una lista de cursos: es una
     secuencia con prerrequisitos, y la iglesia ya la llama «ruta de
     crecimiento». Se dibuja como un camino con estaciones porque el
     orden ES información, no adorno. Es el elemento por el que este
     sitio se distingue de cualquier otro sitio de iglesia.

   Orden del archivo:
     1 · Tokens          6 · Prosa
     2 · Base            7 · Tarjetas de curso
     3 · Tipografía      8 · La ruta
     4 · Armazón         9 · Botones
     5 · Barra y héroe  10 · Pie · 11 · Responsivo · 12 · Movimiento
   ===================================================================== */

/* ---------------------------- 1 · TOKENS ---------------------------- */
:root{
  /* ── Color. Idéntico a ekklesia.css: una sola escala de azul medianoche
     derivada del azul institucional. Si allá cambia, acá cambia. ── */
  --renacer:#003399; --renacer-dark:#002266; --renacer-hover:#173a80;
  --renacer-sf:#e7ecfb; --renacer-bd:#aec3ee;
  --acc:#0e2a63; --acc-ink:#ffffff; --acc-sf:#eef1f8; --acc-bd:#c6cee0;
  --acc-nav:#7fa6ff;

  /* Superficies y tinta */
  --bg:#f5f6f8;   /* fondo de página */
  --sf:#ffffff;   /* tarjetas */
  --sf2:#fafafb;  /* bloques de apoyo */
  --sf3:#f2f3f6;  /* hover */
  --ln:#e4e7ec;   /* borde */
  --ln2:#edeff3;  /* separador tenue */
  --ink:#14161b;  /* titulares */
  --ink2:#3d424d; /* párrafo */
  /* ⚠️ ÚNICA divergencia de color respecto de ekklesia.css, y es a
     propósito. Allá --mut es #767c88, que sobre el fondo de la aplicación
     da 3,88:1 de contraste — por debajo del 4,5:1 que pide WCAG AA para
     texto normal. En Ekklesia se lo lleva un rótulo de 12px dentro de una
     herramienta interna, con usuarios entrenados y pantallas conocidas.
     Acá lo leen visitantes de cualquier edad, muchos en un teléfono a
     pleno sol, y los rótulos que lo usan llevan datos que importan: la
     fecha de un curso y la referencia de un versículo.
     #666c78 es el mismo gris, dos pasos más oscuro: 4,88:1 sobre --bg,
     5,27:1 sobre --sf, 5,06:1 sobre --sf2. Pasa en las tres superficies.
     (--fnt, el gris terciario de Ekklesia, no existe acá: daba 2,40:1 y
     no había ningún uso que lo justificara.) */
  --mut:#666c78;  /* secundario */

  /* ── LA ESCRITURA ──
     Única excepción a la regla del acento único, y con el mismo criterio
     con que Ekklesia se permite el verde de WhatsApp: marca una cosa que
     NO es de la misma naturaleza que el resto.
     Acá lo que marca es la Palabra. Todo el texto del sitio es la escuela
     hablando; los versículos son lo único que no. Que se distingan sin
     tener que leer la referencia es información, no adorno.

     Es el AZUL INSTITUCIONAL (--renacer, #003399) y no un tono nuevo: un
     primer intento en bronce quedó fuera de la paleta —el sitio entero es
     una escala de azules y un cálido se leía como de otra casa—.
     Este azul, además, hoy casi no se usa en ninguna otra parte, así que
     dedicarlo a la Escritura le da un trabajo propio en vez de repetir el
     acento.
     Se distingue de los enlaces (--acc, azul medianoche) por la TIPOGRAFÍA
     antes que por el tono: la Escritura va en serif y los enlaces en
     grotesca subrayada. Contraste: 10,04 sobre --bg · 10,86 sobre --sf.
     Sobre el medianoche del héroe hace falta la versión clara, y ya existe:
     --acc-nav, la marca sobre chrome oscuro. 7,85 de contraste.
     ⚠️ Estos tokens son SÓLO para Escritura. Si aparecen en otra cosa,
     dejan de significar. */
  --escritura:#003399; --escritura-sf:#e7ecfb; --escritura-bd:#aec3ee;
  /* ⚠️ Se aclaró de #7fa6ff a #b0caff, y la razón es medible: el sello del
     banner subió de opacidad —se pedía que se distinguiera— y su parte más
     clara queda justo detrás de la Escritura. Con el azul anterior el
     contraste ahí caía a 2,92:1, por debajo del 3:1 que WCAG pide para
     texto grande. Con éste sube a 4,22:1, que además cumple el 4,5:1 de
     texto normal con margen.
     Es decir: el sello se ve más porque el versículo se aclaró, no a costa
     de él. Si alguna vez se vuelve a subir la opacidad del sello, hay que
     volver a medir ESTE número. */
  --escritura-nav:#b0caff;

  /* Estados. Semánticos, nunca decorativos: si algo lleva estos colores,
     algo está pasando. Un curso abierto no es «verde porque sí». */
  --ok:#067a55; --ok-sf:#e9f7f1; --ok-bd:#b7e2d1;
  --warn:#b45309; --warn-sf:#fdf5e7; --warn-bd:#f0d9a8;
  --danger:#c11b45;

  /* Chrome oscuro: la barra superior y el campo del héroe. Mismos tokens
     que el menú lateral de Ekklesia, para que la barra de los dos sitios
     sea literalmente el mismo azul. */
  --nav:#071129; --nav-ink:rgba(255,255,255,.66); --nav-on:#ffffff;
  --nav-ln:rgba(255,255,255,.10); --nav-hov:rgba(255,255,255,.07);

  /* ── Tipografía ──
     --serif entra sólo en títulos de despliegue y versículos (§3).
     --sans es la de Ekklesia. --mono es la de Ekklesia, y acá sirve para
     lo mismo que allá: fechas y cifras, que se alinean por columna. */
  /* ⚠️ Fraunces y no Newsreader (cambiado sep 2026). Newsreader es una
     serif de lectura: correcta, tranquila, y a tamaño de titular se lee
     como el Times de siempre — que es justo lo que hacía ver la página
     «plana». Fraunces es variable y tiene eje ÓPTICO (`opsz`): a 72pt
     afila los remates y abre el contraste, y a 16pt se engorda sola para
     que la cursiva del versículo no se rompa. Un solo archivo cubre los
     dos usos.
     Los ejes SOFT y WONK quedan en 0 a propósito: son los que le dan a
     Fraunces su aire de panadería artesanal, y esto es una escuela
     bíblica. Se usa su estructura, no su chiste. */
  --serif:'Fraunces','Newsreader',Georgia,serif;
  --sans:'Schibsted Grotesk','Inter',system-ui,-apple-system,'Segoe UI',sans-serif;
  --mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;

  /* Escala tipográfica. `clamp` en vez de media queries: son cuatro
     tamaños que tienen que crecer con la ventana, y repetirlos en tres
     puntos de quiebre es tres lugares donde se desincronizan. */
  --t-display:clamp(2.35rem, 1.4rem + 4.1vw, 4.5rem);  /* h1 del héroe   */
  --t-h2:clamp(1.5rem, 1.2rem + 1.3vw, 2.05rem);       /* título sección */
  --t-h3:1.16rem;                                       /* subtítulo      */
  --t-body:1.0625rem;                                   /* 17px           */
  --t-sm:.9375rem;                                      /* apoyo          */
  --t-xs:.8125rem;                                      /* rótulo, fecha  */

  /* Radios y sombras: los de Ekklesia. «Una tarjeta es una superficie,
     no un globo». Nada de 20px de radio ni sombras de catálogo. */
  --r-sm:7px; --r:10px;
  --sh:0 1px 2px rgba(16,24,40,.06);
  --sh-acc:0 1px 2px rgba(14,42,99,.10), 0 6px 16px -6px rgba(14,42,99,.28);

  /* Medidas del armazón.
     --medida es el ancho del contenido; --lectura es el ancho de un
     PÁRRAFO, que es otra cosa: 68ch es el largo de línea donde el ojo
     todavía encuentra el renglón siguiente. Hoy el sitio pone párrafos
     de 1200px de ancho y justificados, que es lo peor de los dos mundos. */
  --medida:1180px; --lectura:68ch;
  /* La sangría del armazón, en un token: la usan `.ee-shell` y el sello
     del héroe, y tienen que ser el MISMO valor o el sello no queda
     alineado con el titular. */
  --sangria:clamp(1.15rem, 4vw, 2.5rem);
  /* Relleno vertical del héroe y tamaño del sello. Van en tokens porque la
     POSICIÓN del sello se calcula a partir de los dos: si alguno se toca
     a mano en su regla, el sello deja de quedar a la altura del titular. */
  --heroe-pad:clamp(3.5rem, 8vw, 6.5rem);
  --sello:clamp(220px, 27vw, 400px);

  /* Diámetro de los aros de icono. Lo comparten el riel de los cinco
     compromisos y cualquier esquema que cuelgue de una línea: si el
     diámetro cambia acá, el riel sigue pasando por el centro sin que haya
     que tocar dos números en dos lugares. */
  --ico:52px;
  /* Dónde empieza el contenido dentro de un contenedor a todo el ancho.
     Con la ventana más angosta que --medida es la sangría a secas; más
     ancha, hay que sumar el margen que el armazón deja a cada lado. */
  --borde-contenido:max(var(--sangria), calc(50% - (var(--medida) / 2) + var(--sangria)));
  --barra-h:74px;
  --gap:1.25rem;

  /* Movimiento */
  --ease:cubic-bezier(.22,1,.36,1);
  --t-fast:120ms; --t-med:220ms;

  /* Capas */
  --z-barra:40; --z-menu:45; --z-velo:44;
}

/* ----------------------------- 2 · BASE ----------------------------- */
*,*::before,*::after{ box-sizing:border-box; }

html{ scroll-behavior:smooth; }
/* `scroll-padding-top` y no un margen en cada ancla: la barra superior es
   fija, así que sin esto todo salto a `#seccion` deja el título tapado
   debajo de la barra. Se descuenta acá una vez, no en cada destino. */
html{ scroll-padding-top:calc(var(--barra-h) + 1.5rem); }

body{
  margin:0;
  background:var(--bg);
  color:var(--ink2);
  font-family:var(--sans);
  font-size:var(--t-body);
  line-height:1.65;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

img{ max-width:100%; height:auto; display:block; }

a{ color:var(--acc); text-decoration:none; }
a:hover{ text-decoration:underline; text-underline-offset:3px; }

/* Foco visible SIEMPRE. El sitio actual no tiene ninguno: quien navega con
   teclado no sabe dónde está parado. */
:focus-visible{ outline:2px solid var(--acc); outline-offset:2px; border-radius:3px; }
/* Sobre el chrome oscuro el azul del acento no se ve: ahí el foco es claro. */
.ee-barra :focus-visible, .ee-heroe :focus-visible, .ee-pie :focus-visible{
  outline-color:var(--acc-nav); }

/* Salto al contenido, para lector de pantalla y teclado. Visible sólo al
   enfocarlo: es el primer elemento tabulable de toda página. */
.ee-saltar{
  position:absolute; left:-9999px; top:0; z-index:100;
  background:var(--sf); color:var(--acc); padding:.7rem 1.1rem;
  border:1px solid var(--acc); border-radius:0 0 var(--r-sm) 0; font-weight:600; }
.ee-saltar:focus{ left:0; }

/* -------------------------- 3 · TIPOGRAFÍA -------------------------- */
/* La serif entra en DOS lugares y en ninguno más. Si aparece en un tercero,
   deja de ser la voz del sitio y pasa a ser decoración. */

h1,h2,h3,h4{ color:var(--ink); line-height:1.2; margin:0; font-weight:600; }

/* 1 · Títulos de despliegue: el h1 del héroe y los h2 de sección. */
.ee-display{
  font-family:var(--serif); font-weight:600; letter-spacing:-.028em;
  line-height:1.04; font-variation-settings:'opsz' 128, 'SOFT' 0, 'WONK' 0; }

/* `opsz` se declara a mano: sin esto el navegador usa el valor por defecto
   del eje y el titular sale con el mismo grosor de remate que un párrafo. */
h1{ font-family:var(--serif); font-weight:600; font-size:var(--t-display);
    letter-spacing:-.028em; line-height:1.04;
    font-variation-settings:'opsz' 128, 'SOFT' 0, 'WONK' 0; }
h2{ font-family:var(--serif); font-weight:600; font-size:var(--t-h2);
    letter-spacing:-.022em; line-height:1.12;
    font-variation-settings:'opsz' 72, 'SOFT' 0, 'WONK' 0; }
/* h3 vuelve a la grotesca: a esa altura ya es rotulación, no despliegue. */
h3{ font-family:var(--sans); font-weight:600; font-size:var(--t-h3);
    letter-spacing:-.005em; }

/* 2 · Los versículos. En cursiva de la serif, que es donde Newsreader
   tiene su mejor letra, y con la referencia arriba en grotesca chica: la
   referencia es un dato (Salmos 119:105), el versículo es la voz. */
.ee-cita{ margin:0; }
.ee-cita .ref{
  display:block; font-family:var(--sans); font-size:var(--t-xs);
  /* La cita va en NEGRITA y el pasaje no: el peso separa el dato —qué
     libro, qué capítulo, qué versículos— de la voz que se está citando. */
  font-weight:700; letter-spacing:.03em; color:var(--escritura); margin-bottom:.5rem; }
.ee-cita .txt{
  font-family:var(--serif); font-style:italic; font-weight:400;
  font-size:1.5rem; line-height:1.4; color:var(--escritura);
  /* Óptica baja: a este tamaño la cursiva necesita el trazo más grueso,
     no el afilado del titular. */
  font-variation-settings:'opsz' 24, 'SOFT' 0, 'WONK' 0; }

/* Rótulo de sección. Ekklesia abandonó la versalita negrita a propósito
   («un rótulo rotula, no compite con el dato») y acá se respeta: texto
   tranquilo en gris, con un filete corto delante que lo ancla sin gritar. */
.ee-rotulo{
  display:flex; align-items:center; gap:.6rem;
  font-size:var(--t-xs); font-weight:500; color:var(--mut);
  margin:0 0 .75rem; text-transform:none; letter-spacing:0; }
.ee-rotulo::before{
  content:""; width:22px; height:1px; background:var(--acc-bd); flex:none; }

/* Variante del héroe: acá el rótulo dice «Escuela Renacer», que es el
   nombre del ministerio y no una etiqueta de sección. Sube de tamaño y de
   peso, y el filete crece con él para que siga anclándolo. */
.ee-rotulo.grande{
  font-size:clamp(1rem, .9rem + .5vw, 1.25rem); font-weight:600;
  letter-spacing:-.01em; margin-bottom:1rem; }
.ee-rotulo.grande::before{ width:34px; }

.ee-mono{ font-family:var(--mono); font-variant-numeric:tabular-nums; }

/* --------------------------- 4 · ARMAZÓN --------------------------- */
.ee-shell{ width:100%; max-width:var(--medida); margin-inline:auto;
           padding-inline:var(--sangria); }

/* Sección. El ritmo vertical lo pone UNA clase, no el margen suelto de
   cada bloque: así dos secciones seguidas nunca suman dos espacios
   distintos. La variante `.tenue` cambia el fondo para separar sin dibujar
   una caja. */
.ee-seccion{ padding-block:clamp(3rem, 7vw, 5.5rem); }
.ee-seccion.tenue{ background:var(--sf2); border-block:1px solid var(--ln); }
.ee-seccion.papel{ background:var(--sf); border-block:1px solid var(--ln); }

/* Cabecera de sección: rótulo + título + bajada, con la bajada limitada a
   la medida de lectura aunque la sección sea ancha. */
.ee-sec-cab{ margin-bottom:clamp(1.75rem, 3.5vw, 2.75rem); }
.ee-sec-cab p{ max-width:var(--lectura); color:var(--ink2); margin:.85rem 0 0; }

/* Rejilla de dos columnas para «texto + apoyo». `auto-fit` con mínimo y no
   dos columnas fijas: bajo 640px se convierte sola en una sin media query. */
.ee-duo{ display:grid; gap:clamp(1.5rem, 4vw, 3rem);
         grid-template-columns:repeat(auto-fit, minmax(min(100%, 320px), 1fr)); }
/* Variante PAREJA: dos columnas del mismo ancho. Para cuando las dos
   llevan peso —un texto con sus pasos a un lado y una demostración al
   otro— y ninguna es «el apoyo» de la otra. */
/* Dos columnas iguales, cada una con su altura natural.
   ⚠️ Hubo dos intentos de FORZAR que midieran lo mismo y los dos salieron
   peor. Con `space-between` en la columna de texto quedaba un vacío enorme
   entre la bajada y la primera ficha: separar bloques para rellenar no
   distribuye nada, sólo muda el hueco. Y estirando las fichas de los
   pasos, éstas quedaban infladas y huecas por dentro.
   La lección: cuando dos columnas no calzan, el problema casi nunca está
   en la corta. Acá estaba en la larga —la tarjeta llevaba cinco bloques—
   y se arregló sacándole uno, no estirando a la otra. Con las dos ya
   parecidas, `start` alcanza y nada tiene que deformarse. */
.ee-duo.ee-duo-par{ grid-template-columns:1fr 1fr; align-items:start; }
@media (max-width: 900px){ .ee-duo.ee-duo-par{ grid-template-columns:1fr; } }

/* Variante desbalanceada: el texto manda, el apoyo acompaña. */
.ee-duo.texto-manda{ grid-template-columns:1.45fr 1fr; align-items:start; }
/* Variante «texto + índice lateral»: la columna de apoyo es angosta y de
   ancho casi fijo, porque es una lista de enlaces y no contenido.
   ⚠️ Es una CLASE y no un `style=` en el HTML, que es como estaba. Un
   estilo en línea gana por especificidad a cualquier media query, así que
   bajo 900px —donde `.ee-indice-lat` se oculta— la rejilla seguía
   reservando sus 15rem: el texto se leía en dos tercios de la pantalla del
   teléfono y el tercio restante quedaba en blanco. */
.ee-duo.con-indice{ grid-template-columns:1fr minmax(0, 15rem);
                    gap:clamp(2rem, 4vw, 3.5rem); align-items:start; }

/* ---------------------- 5 · BARRA Y HÉROE -------------------------- */
/* La barra es el mismo medianoche del menú de Ekklesia. Fija, UNA fila
   —hoy son dos y la segunda está vacía— y con estado activo, que hoy no
   existe: en cualquier página el menú se ve igual y no dice dónde estás. */
.ee-barra{
  /* `position:sticky` ya crea contexto de posicionamiento para la línea de
     avance de lectura (`::after`), que se ancla a su borde inferior. */
  position:sticky; top:0; z-index:var(--z-barra);
  background:var(--nav); border-bottom:1px solid var(--nav-ln);
  height:var(--barra-h); display:flex; align-items:center; }
.ee-barra .ee-shell{ display:flex; align-items:center; gap:1.5rem; width:100%; }

/* La barra lleva el LOGOTIPO DE LA IGLESIA («RENACER · IGLESIA»), no el
   emblema de la escuela. Son dos marcas distintas y cada una tiene su
   lugar: arriba manda la casa, y el sello de la escuela aparece como
   marca de agua del héroe y como firma del pie. Antes acá había un
   emblema de 34px que a esa medida no se leía como nada. */
.ee-marca{ display:flex; align-items:center; gap:.85rem; margin-right:auto;
           color:var(--nav-on); text-decoration:none; min-width:0; }
.ee-marca:hover{ text-decoration:none; }
.ee-marca .logo{ height:38px; width:auto; flex:none; }
/* (El filete y el bloque de texto que iban acá se quitaron: la barra
   lleva sólo el logotipo. El nombre de la escuela lo dice el héroe.) */
.ee-marca .txt{ min-width:0; }
.ee-marca b{ display:block; font-weight:600; font-size:.95rem; letter-spacing:-.01em;
             white-space:nowrap; }
/* ⚠️ `.txt span` y no `span` a secas: `.txt` es a su vez un <span>, así que
   el selector suelto alcanzaba al contenedor y en el teléfono (§11) se
   llevaba puesto el nombre de la escuela junto con la bajada. */
.ee-marca .txt span{ display:block; font-size:.72rem; color:var(--nav-ink);
                     font-weight:400; letter-spacing:.01em; white-space:nowrap; }

.ee-nav{ display:flex; align-items:center; gap:.15rem; }
.ee-nav a{
  color:var(--nav-ink); font-size:.9rem; font-weight:500;
  padding:.5rem .75rem; border-radius:var(--r-sm); white-space:nowrap;
  transition:color var(--t-fast) var(--ease), background var(--t-fast) var(--ease); }
.ee-nav a:hover{ color:var(--nav-on); background:var(--nav-hov); text-decoration:none; }
/* El activo se marca con tinta plena Y un filete de acento debajo. Sólo
   con el color el cambio es demasiado sutil sobre este azul. */
.ee-nav a[aria-current="page"]{
  color:var(--nav-on); background:var(--nav-hov);
  box-shadow:inset 0 -2px 0 var(--acc-nav); }
/* «Aula Virtual» destaca, pero por FORMA y no por color.
   Es a donde va quien ya está inscrito, y es lo que más se busca desde la
   barra, así que merece pesar más que un ítem de menú. Lo que no puede
   hacer es pesar con color: en esta barra el color ya significa «estás
   acá» —tinta plena y filete de acento bajo el activo— y un segundo color
   dejaría dos señales compitiendo por el mismo significado.
   Un contorno resuelve las dos cosas: se lee como botón a primera vista y
   no toca la paleta. Antes iba apartada por un filete vertical, que la
   separaba del grupo pero no la destacaba de nada. */
.ee-nav .aparte{
  margin-left:.85rem;
  display:inline-flex; align-items:center; gap:.4rem;
  color:var(--nav-on);
  border:1px solid var(--nav-ln); border-radius:99px;
  padding:.42rem .85rem .42rem .95rem;
  transition:border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease),
             box-shadow var(--t-fast) var(--ease); }
.ee-nav .aparte svg{ width:13px; height:13px; opacity:.7;
                     transition:transform var(--t-fast) var(--ease), opacity var(--t-fast) var(--ease); }
.ee-nav .aparte:hover{
  background:var(--nav-hov); border-color:var(--acc-nav);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--acc-nav) 16%, transparent); }
/* La flecha se va, que es lo que el enlace hace. */
.ee-nav .aparte:hover svg{ transform:translate(1.5px, -1.5px); opacity:1; }

/* Botón del menú en teléfono. Oculto en escritorio (§11). */
.ee-menu-btn{
  display:none; background:none; border:1px solid var(--nav-ln);
  color:var(--nav-on); width:40px; height:38px; border-radius:var(--r-sm);
  cursor:pointer; align-items:center; justify-content:center; }
.ee-menu-btn:hover{ background:var(--nav-hov); }
.ee-menu-btn i{ font-size:1rem; }

/* ── El héroe ──
   Campo medianoche a todo el ancho con el emblema saliéndose por el borde,
   igual que la pantalla de acceso de Ekklesia. Es la herencia visual más
   reconocible que hay entre los dos sitios.

   ⚠️ Lo que NO se hereda: la aurora animada. Allá funciona porque es un
   login donde no pasa nada más; acá abajo del héroe hay una página entera
   que leer, y tres manchas a la deriva compiten con eso. */
/* ── El héroe, en tres capas ──
   El orden importa y por eso está escrito acá:

     fondo del elemento  →  el medianoche y el halo frío (un degradado,
                            no una imagen: son 150 KB de PNG que
                            `radial-gradient` dibuja sin descargar nada
                            y sin pixelarse en pantalla grande)
     ::before  (z -2)    →  el SELLO DE LA ESCUELA
     ::after   (z -1)    →  el velo que protege el texto
     contenido (z  0)    →  el titular

   ⚠️ Dos errores que costó ver, y por eso quedan anotados:

   1 · El sello se recortaba con FILO DURO contra el borde inferior del
       héroe: `overflow:hidden` lo cortaba en seco y se leía como un
       defecto, no como una marca de agua. Ahora lleva `mask-image`: el
       propio sello se disuelve en sus bordes, así que no hay ningún
       canto que cortar, esté donde esté.

   2 · El velo era un rectángulo del ancho del contenido
       (`.ee-shell::before`), y sus cantos se veían como una caja más
       oscura encima del sello. Ahora es una capa a TODO el ancho del
       héroe, con el degradado muriendo antes de llegar al borde: protege
       la columna de texto y en ninguna parte se nota dónde empieza. */
.ee-heroe{
  position:relative; overflow:hidden; isolation:isolate;
  color:#fff;
  padding-block:var(--heroe-pad);
  /* Capa 0 · el halo frío, sobre el medianoche.
     ⚠️ Arriba a la DERECHA (84%), no a la izquierda. Estaba en 16%, o sea
     en la misma esquina donde el velo de legibilidad es más denso: un
     resplandor y una sombra peleando por el mismo rincón, y el resultado
     era un gris sucio. A la derecha el halo cae sobre el sello y lo
     ilumina, que es lo único que hay para iluminar. Es además la posición
     que ya tenía la franja de `nosotros`, que es la que se tomó de
     modelo. */
  background:
    radial-gradient(circle at 84% -20%,
      color-mix(in srgb, var(--renacer) 48%, transparent) 0%,
      color-mix(in srgb, var(--renacer) 12%, transparent) 38%,
      transparent 62%),
    var(--nav); }

/* Capa 1 · el sello de la escuela. Es el artefacto propio del ministerio
   —el círculo «ESCUELAS RENACER» con el monograma y la cruz— usado como
   textura, y es el único adorno del héroe. */
.ee-heroe::before{
  content:"";
  /* Centrado vertical y pegado a la izquierda.
     ⚠️ El centrado va con `inset-block:0` + `margin-block:auto`, NO con
     `top:50%; transform:translateY(-50%)`: el `transform` ya lo usa la
     animación de respiración, y el segundo pisaría al primero dejando el
     sello a media altura y saltando. */
  /* A la DERECHA y centrado vertical, igual que en la franja de
     `nosotros.php` (.ee-declara::before): los dos campos azules del sitio
     llevan el sello en el mismo lugar, así que se leen como el mismo
     gesto y no como dos decisiones distintas.
     El centrado va con `inset-block:0` + `margin-block:auto` y NO con
     `translateY`: el `transform` ya lo usa la animación de respiración, y
     el segundo pisaría al primero. */
  /* El sello va ENTERO y dentro del borde. Estuvo un rato sangrado a
     -19%, y ése fue un mal arreglo para un problema real: a plena
     opacidad, las letras del aro «ESCUELAS RENACER» se cruzaban con las
     del versículo y no se leía ni una cosa ni la otra. Recortar el
     emblema para no estorbar es resolverlo por el lado equivocado —queda
     un arco que ya no es el sello de nadie—. El choque se resuelve con
     OPACIDAD, que es para lo que existe una marca de agua: abajo está en
     .11, lo bastante tenue para que el versículo pase por encima sin
     pelear, y lo bastante presente para que el emblema se reconozca
     completo. */
  position:absolute; inset:0 1.5rem 0 auto; margin-block:auto;
  /* ⚠️ El tamaño se ata al ALTO DEL HÉROE, con piso y techo.
     Historia de tres intentos, para que no se repitan:
       · `width:680px` fijo → en pantalla ancha y baja el sello era más
         grande que el héroe y se recortaba con filo duro contra el borde.
       · `height:135%` sin tope → al meter la cinta de cifras DENTRO del
         héroe, el héroe se hizo mucho más alto y el sello creció con él
         hasta quedar desproporcionado.
     `clamp` resuelve las dos: nunca baja de 280px —por debajo de eso el
     sello no se reconoce en el héroe compacto de las páginas interiores—
     ni pasa de 520px, que es donde empieza a comerse la composición.
     `width` lo resuelve `aspect-ratio`. */
  /* El tamaño ya NO depende del alto del héroe: cuando la cinta de cifras
     entró al héroe, ese alto creció y el sello creció con él hasta quedar
     desproporcionado. Ahora se mide contra la VENTANA, que es lo que de
     verdad determina cuánto espacio hay. */
  height:var(--sello); aspect-ratio:1; width:auto;
  background:url("img/emblema-escuela-blanco.png") center/contain no-repeat;
  /* ⚠️ .14, no .34. Con .34 el sello era legible como logotipo, y ése era
     el problema: ahora el versículo vive en la columna DERECHA, encima de
     él, y las letras del aro «ESCUELAS RENACER» se cruzaban con las de la
     Escritura. Una marca de agua que compite con el texto que tiene
     encima dejó de ser marca de agua. .14 es el valor que la franja de
     `nosotros` ya usaba, y por la misma razón: allí también había texto
     sobre el sello. */
  /* ⚠️ El equilibrio de este número tiene historia, y conviene entenderlo
     antes de moverlo. A .34 el sello competía con el versículo que tiene
     encima y no se leía ninguno de los dos. A .11 dejó de competir, pero
     también dejó de verse: era una mancha, no un emblema.
     .26 es donde el sello se reconoce como sello. Lo que hace que a esta
     opacidad NO estorbe es el velo de abajo, que ahora se cierra sobre la
     columna derecha —donde vive la Escritura— en vez de abrirse. Es decir:
     el sello sube y el fondo detrás del texto se oscurece al mismo tiempo,
     así que el contraste del versículo no baja. Si se sube más, hay que
     subir el velo también, y ahí el medianoche empieza a verse sucio. */
  opacity:.72; z-index:-2; pointer-events:none;
  /* La disolución. `closest-side` mide contra el lado más cercano del
     propio cuadro, así que el desvanecido es un círculo concéntrico con
     el sello: se apaga justo donde termina el emblema. */
  /* El núcleo opaco llega al 62% —donde termina el anillo de letras del
     sello— y recién ahí empieza a desvanecerse. Con el 42% anterior el
     aro «ESCUELAS RENACER» quedaba a media transparencia y el emblema no
     se reconocía. El desvanecido sigue existiendo para que no haya
     ningún canto duro contra los bordes del héroe. */
  /* El desvanecido llega más lejos que antes (72% en vez de 62%): con el
     sello más presente, un corte temprano dejaba ver dónde termina el
     círculo de la máscara, y eso se nota más que el propio emblema. */
  -webkit-mask-image:radial-gradient(closest-side, #000 72%, rgba(0,0,0,.5) 88%, transparent 100%);
          mask-image:radial-gradient(closest-side, #000 72%, rgba(0,0,0,.5) 88%, transparent 100%);
  transform-origin:50% 50%;
  animation:eeRespira 22s ease-in-out infinite; }

/* Capa 1b · los puntos de luz (assets/particulas.js). El lienzo lo crea
   el script, así que si el script no corre este bloque simplemente no
   tiene a quién aplicarse. Va ENTRE el sello y el velo: los puntos pasan
   por delante de la marca de agua y por detrás del texto. */
.ee-particulas{
  position:absolute; inset:0; z-index:-1; pointer-events:none;
  /* Se desvanece hacia abajo para que ningún punto quede cortado contra
     el filete inferior del héroe. */
  -webkit-mask-image:linear-gradient(to bottom, #000 62%, transparent 100%);
          mask-image:linear-gradient(to bottom, #000 62%, transparent 100%); }

/* Capa 2 · el velo de legibilidad, a todo el ancho. */
.ee-heroe::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  /* ⚠️ El velo se aclaraba hacia la derecha —12% en el borde— porque ahí
     sólo vivía la marca de agua y convenía dejarla respirar. Ya no: la
     columna derecha es la del versículo. Un velo que se rinde justo donde
     empieza la Escritura es exactamente al revés de lo que se necesita.
     Ahora sostiene los dos costados y cede apenas en el centro, que es la
     única franja sin texto. */
  background:linear-gradient(90deg,
              color-mix(in srgb, var(--nav) 52%, transparent) 0%,
              color-mix(in srgb, var(--nav) 28%, transparent) 44%,
              color-mix(in srgb, var(--nav) 62%, transparent) 100%); }

@keyframes eeRespira{
  0%,100%{ transform:rotate(-4deg) scale(1); }
  50%{ transform:rotate(4deg) scale(1.025); } }

/* El contenido va sobre el velo, que ahora está en z-index 0. */
.ee-heroe > .ee-shell{ position:relative; z-index:1; width:100%; }

/* El titular cruza el ANCHO COMPLETO y las dos columnas cuelgan de él.
   Antes vivía dentro de la columna izquierda, y el banner se leía como una
   tarjeta ancha en vez de como una portada.
   ⚠️ Escala PROPIA, más baja que `--t-display`. A tamaño de despliegue el
   titular ocupaba dos renglones anchos y empujaba todo lo demás hacia
   abajo; el banner terminaba siendo un titular con apéndices. Bajándolo,
   el titular sigue mandando pero deja respirar a la bajada y al versículo,
   que son los que de verdad explican la página. */
.ee-heroe h1{
  color:#fff; max-width:22ch; margin:0 0 clamp(1.5rem, 3vw, 2.25rem);
  font-size:clamp(2.05rem, 1.35rem + 2.5vw, 3.3rem);
  letter-spacing:-.025em; line-height:1.08;
  font-variation-settings:'opsz' 96, 'SOFT' 0, 'WONK' 0; }
/* Titular en registro de declaración —lo pide `'frase' => true`—: serif
   cursiva y escala más corta. La escala del banner (hasta 4.5rem) partiría
   una frase larga en seis renglones. */
.ee-heroe h1.frase{
  font-family:var(--serif); font-style:italic; font-weight:400;
  font-size:clamp(1.5rem, 1.1rem + 1.9vw, 2.5rem); line-height:1.28;
  letter-spacing:-.015em; max-width:26ch;
  margin-bottom:clamp(2rem, 4vw, 3rem);
  font-variation-settings:'opsz' 60, 'SOFT' 0, 'WONK' 0; }
.ee-heroe .bajada{
  /* 46ch y no 52: con la columna a la mitad del banner, una medida más
     larga que ésta obliga al texto a llegar hasta el borde del canal y a
     rozar el versículo. */
  margin:0; max-width:46ch;
  font-size:1.0625rem; line-height:1.6; color:rgba(255,255,255,.78); }
.ee-heroe .ee-rotulo{ color:rgba(255,255,255,.6); }
.ee-heroe .ee-rotulo::before{ background:var(--acc-nav); }

/* El versículo dentro del héroe: es contra-texto, no subtítulo. Va a la
   derecha, separado por un filete, y en la cursiva de la serif. Sólo la
   portada lo lleva — en las páginas interiores el héroe es compacto. */
/* ⚠️ `start` y no `center`. Centradas, la bajada y el versículo flotaban
   una respecto de la otra según cuál fuera más larga, y ninguna de las dos
   arrancaba donde el ojo la esperaba. Alineadas por arriba, sus primeras
   líneas coinciden y se leen como dos voces en paralelo. */
/* ⚠️ Las dos columnas son IGUALES. Estuvieron en 1,35 contra 0,85 —el
   texto mandaba y la Escritura acompañaba—, y el resultado era un banner
   que se veía cargado a la izquierda: la bajada llegaba casi al centro y
   al versículo le quedaba un canal estrecho donde cada línea se partía en
   cuatro palabras.
   A la mitad y a la mitad, las dos voces del banner pesan lo mismo, que
   es lo que son: una explica y la otra da la razón. La bajada se acorta
   sola contra su medida y el versículo respira. */
.ee-heroe-duo{ display:grid; gap:clamp(2rem, 5vw, 4rem); align-items:start;
               grid-template-columns:1fr 1fr; }
/* Sin versículo no hay dos columnas: la bajada no debe estirarse a todo el
   ancho sólo porque quedó sola. */
.ee-heroe-duo.sola{ grid-template-columns:1fr; }
/* ⚠️ ACÁ NO VA UN FONDO DETRÁS DEL VERSÍCULO. Se probó —un velo suave
   bajo la columna de la Escritura— y se veía como lo que era: una caja
   flotando sobre el banner. El problema que venía a resolver es real: el
   sello está a .72 de opacidad, porque se pidió que se distinguiera, y su
   aro de letras cae justo detrás de este texto.
   La solución que no se ve es el halo de abajo: una sombra oscura y
   difusa alrededor de cada letra. Separa la Escritura del emblema
   carácter por carácter, en vez de tapar una región entera. Es lo que se
   usa para poner texto sobre una fotografía, y funciona por lo mismo:
   sigue el contorno del texto y no tiene bordes propios. */
.ee-heroe .ee-cita{
  border-left:1px solid rgba(255,255,255,.28);
  padding-left:clamp(1.25rem,3vw,2.25rem); }

/* Los botones, bajo la bajada y en su misma columna. */
.ee-heroe .bajada + .ee-acciones{ margin-top:1.75rem; }
/* El halo. Tres sombras superpuestas y no una: la primera pega al borde
   de la letra y le devuelve el filo, las otras dos abren la penumbra sin
   que se note dónde termina. Con una sola sombra ancha el texto se ve
   borroso; con tres, se ve nítido sobre cualquier fondo. */
.ee-heroe .ee-cita .ref,
.ee-heroe .ee-cita .txt{
  text-shadow:0 1px 2px color-mix(in srgb, var(--nav) 92%, transparent),
              0 0 12px color-mix(in srgb, var(--nav) 88%, transparent),
              0 0 26px color-mix(in srgb, var(--nav) 70%, transparent); }
.ee-heroe .ee-cita .ref{ color:var(--escritura-nav); font-weight:700; }
.ee-heroe .ee-cita .txt{ color:var(--escritura-nav); font-size:clamp(1.25rem, 2.1vw, 1.7rem); }
/* El titular y la bajada también cruzan el emblema en pantallas anchas. */
.ee-heroe h1, .ee-heroe .bajada{
  text-shadow:0 1px 14px color-mix(in srgb, var(--nav) 72%, transparent); }

/* Héroe compacto de páginas interiores. */
/* Bloque que la página inyecta dentro del héroe (hoy, la cinta de cifras).
   ⚠️ Antes esto era una `<section>` aparte con fondo propio, y ese fondo
   tapaba la mitad de abajo del sello: se veía un rectángulo más oscuro
   encima de la marca de agua. Adentro del héroe hay un solo fondo. */
.ee-heroe-extra{ margin-top:clamp(2rem, 4vw, 3rem); }

/* Héroe sin marca de agua. El halo y el velo se quedan: lo único que se
   va es el sello. */
.ee-heroe.sin-sello::before{ display:none; }

/* ⚠️ ALTURA MÍNIMA COMÚN. Sin esto cada banner medía lo que midiera su
   contenido, y como el versículo de cada página tiene otro largo —Isaías
   6:8 son tres líneas, Santiago 1:5 son cinco— los siete banners tenían
   siete alturas distintas: 472, 510, 559, 619. Al navegar entre páginas el
   contenido saltaba hacia arriba y hacia abajo en cada clic, y el sitio se
   sentía desalineado sin que se viera por qué.
   Con un piso común, todos los banners interiores miden lo mismo y el
   contenido queda quieto de una página a otra. El bloque se centra
   verticalmente para que el aire sobrante se reparta arriba y abajo en vez
   de acumularse abajo. */
.ee-heroe.compacto{
  padding-block:clamp(2.5rem, 5.5vw, 3.75rem);
  min-height:clamp(17rem, 34vw, 31rem);
  display:flex; flex-direction:column; justify-content:center; }
/* La portada también, un escalón más alta: lleva botones. */
.ee-heroe:not(.compacto){
  min-height:clamp(20rem, 39vw, 35rem);
  display:flex; flex-direction:column; justify-content:center; }
.ee-heroe.compacto h1{ font-size:clamp(1.9rem, 1.25rem + 2.4vw, 2.85rem); max-width:20ch; }

/* Migas. Sólo en páginas interiores, y sólo un nivel: el sitio es plano. */
/* Las migas se quitaron del banner: en un sitio de un solo nivel decían
   siempre «Inicio · <esta página>», que es lo que ya dice el menú activo.
   Sus reglas se van con ellas. */

/* ----------------------------- 6 · PROSA ---------------------------- */
/* Todo párrafo del sitio pasa por acá.
   ⚠️ Dos herencias que se cortan de raíz:
     · css/estilo.css declaraba `p{display:inline}`, que le quitaba el
       flujo de bloque a TODOS los párrafos del sitio; de ahí los <br><br>
       sueltos por todas partes.
     · el HTML usa align="justify" en columnas angostas, que abre ríos de
       espacio entre palabras. Acá se alinea a la izquierda, siempre. */
.ee-prosa{ max-width:var(--lectura); }
.ee-prosa p{ display:block; text-align:left; margin:0 0 1.15em; color:var(--ink2); }
.ee-prosa p:last-child{ margin-bottom:0; }
.ee-prosa h3{ margin:2rem 0 .6rem; }
.ee-prosa ul,.ee-prosa ol{ margin:0 0 1.15em; padding-left:1.3em; }
.ee-prosa li{ margin-bottom:.5em; }
.ee-prosa li::marker{ color:var(--mut); }
/* La negrita destaca UNA cosa por párrafo. El texto actual llega a ocho
   fragmentos en negrita en un mismo párrafo, y con eso no destaca ninguno.
   Acá se le da tinta plena para que cuando aparezca, se note. */
.ee-prosa strong{ font-weight:600; color:var(--ink); }
.ee-prosa a{ text-decoration:underline; text-underline-offset:3px;
             text-decoration-color:var(--acc-bd); }
.ee-prosa a:hover{ text-decoration-color:var(--acc); }

/* Bloque de apoyo: una nota al margen del texto principal. Superficie, no
   caja de color. */
.ee-nota{ background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
          padding:1.25rem 1.35rem; box-shadow:var(--sh); }
.ee-nota h3{ margin:0 0 .5rem; }
.ee-nota p{ margin:0; font-size:var(--t-sm); color:var(--ink2); }

/* --------------------- 7 · TARJETAS DE CURSO ----------------------- */
.ee-cursos{ display:grid; gap:var(--gap);
            grid-template-columns:repeat(auto-fill, minmax(min(100%, 340px), 1fr)); }

/* La tarjeta es un enlace entero, no un texto con un enlace adentro: el
   objetivo táctil es la tarjeta completa. */
.ee-curso{
  position:relative; display:flex; flex-direction:column; gap:.9rem;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  padding:1.25rem 1.35rem 1.35rem; box-shadow:var(--sh);
  color:inherit; text-decoration:none; overflow:hidden;
  transition:border-color var(--t-fast) var(--ease), box-shadow var(--t-med) var(--ease),
             transform var(--t-med) var(--ease); }
/* Banda de la fase en el canto izquierdo, con los mismos cuatro tonos de
   la malla: la tarjeta dice a qué parte de la ruta pertenece sin gastar
   una línea de texto en decirlo. */
.ee-curso[data-etapa]::before{
  content:""; position:absolute; inset:0 auto 0 0; width:4px;
  background:var(--et-ink); }
.ee-curso[data-etapa="1"]{ --et-sf:#e8eefb; --et-ink:#1b3a6b; --et-bd:#bdcdea; }
.ee-curso[data-etapa="2"]{ --et-sf:#e4eefc; --et-ink:#12508f; --et-bd:#b3d1f0; }
.ee-curso[data-etapa="3"]{ --et-sf:#e6f0f6; --et-ink:#1d5573; --et-bd:#b6d2e2; }
.ee-curso[data-etapa="4"]{ --et-sf:#e2f2fe; --et-ink:#0a6ba8; --et-bd:#a8d8f5; }
.ee-curso:hover{ text-decoration:none; border-color:var(--acc-bd);
                 box-shadow:var(--sh-acc); transform:translateY(-3px); }

/* ── El bloque de fecha ──
   Día grande, mes en versalita, año chico. Es el ancla visual que a la
   tarjeta le faltaba, y no es un adorno: estos cursos SON eventos con
   fecha, y la primera pregunta de quien mira la lista es cuándo. Antes la
   fecha era una línea de texto gris encima del título. */
.ee-curso .cab{ display:flex; align-items:flex-start; gap:.9rem; }
.ee-curso .cuando{
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  flex:none; width:56px; padding:.4rem 0 .45rem; border-radius:var(--r-sm);
  background:var(--et-sf, var(--sf2)); border:1px solid var(--et-bd, var(--ln));
  line-height:1; }
.ee-curso .cuando b{
  font-family:var(--mono); font-size:1.5rem; font-weight:500;
  color:var(--et-ink, var(--acc)); font-variant-numeric:tabular-nums;
  letter-spacing:-.03em; }
.ee-curso .cuando em{
  font-style:normal; font-size:var(--t-xs); font-weight:600;
  text-transform:uppercase; letter-spacing:.06em;
  color:var(--et-ink, var(--acc)); margin-top:.2rem; }
.ee-curso .cuando i{
  font-style:normal; font-family:var(--mono); font-size:10px;
  color:var(--mut); margin-top:.15rem; }

.ee-curso .titulo{ min-width:0; display:flex; flex-direction:column; gap:.25rem; }
.ee-curso h3{ margin:0; color:var(--ink); font-size:1.05rem; line-height:1.3; }
.ee-curso .fase{ font-family:var(--mono); font-size:var(--t-xs); color:var(--mut); }

/* Dónde y cómo se dicta. Dos marcas discretas bajo el resumen: son
   datos de referencia, no titulares, y por eso van en el gris de apoyo y
   no compiten con el nombre del curso. */
.ee-donde{
  display:flex; flex-wrap:wrap; gap:.35rem .9rem;
  margin-top:.15rem; font-size:var(--t-xs); color:var(--mut); }
.ee-donde span{ display:inline-flex; align-items:center; gap:.35rem; min-width:0; }
.ee-donde svg{ width:14px; height:14px; flex:none; opacity:.85; }

.ee-curso .resumen{
  margin:0; font-size:var(--t-sm); color:var(--ink2);
  /* Tres líneas y corta. Las descripciones de la base van de una línea a
     quince, y sin tope una tarjeta larga estira toda su fila. */
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical;
  overflow:hidden; }

.ee-curso .pie{ margin-top:auto; padding-top:.3rem;
                display:flex; align-items:center; justify-content:space-between; gap:.75rem; }
.ee-curso .ver{
  display:inline-flex; align-items:center; gap:.35rem;
  font-size:var(--t-sm); font-weight:600; color:var(--acc); }
.ee-curso .ver svg{ width:14px; height:14px;
                    transition:transform var(--t-fast) var(--ease); }
.ee-curso:hover .ver svg{ transform:translateX(3px); }

/* Entran escalonadas cuando el bloque se revela. */
/* `html.js`: sin script, `:not(.visible)` calza siempre y esto
   escondería las tarjetas para siempre. */
html.js .ee-revelar:not(.visible) .ee-curso{ opacity:0; transform:translateY(10px); }
.ee-revelar .ee-curso{ transition:opacity 460ms var(--ease), transform 460ms var(--ease),
                                  border-color var(--t-fast) var(--ease),
                                  box-shadow var(--t-med) var(--ease);
                       transition-delay:calc(var(--i, 0) * 80ms); }

/* Estado del curso. Color SÓLO acá, y sólo porque el estado es lo único de
   la tarjeta que cambia lo que el visitante puede hacer hoy. */
.ee-estado{
  display:inline-flex; align-items:center; gap:.4rem;
  font-size:var(--t-xs); font-weight:600; padding:.2rem .55rem;
  border-radius:99px; border:1px solid var(--ln); background:var(--sf2); color:var(--mut); }
.ee-estado::before{ content:""; width:6px; height:6px; border-radius:99px;
                    background:currentColor; flex-shrink:0; }
.ee-estado.abierto{ color:var(--ok); background:var(--ok-sf); border-color:var(--ok-bd); }
.ee-estado.pronto{ color:var(--warn); background:var(--warn-sf); border-color:var(--warn-bd); }
/* «Iniciado» y «Cerrado» son neutros a propósito: no hay nada que hacer,
   así que no piden la atención del ojo. */

/* ---------------------------- 8 · LA RUTA --------------------------- */
/* El programa como camino. El orden ES el dato: Consolidación va antes que
   Discipulado porque hay prerrequisito, no porque quedara primero en la
   lista. Por eso hay espina y estaciones, y no tres tarjetas sueltas.

   La espina se dibuja con un pseudo-elemento sobre la lista completa, no
   con un borde por etapa: así el último tramo puede cortarse antes del
   final y la línea no queda colgando bajo la última estación. */
.ee-ruta{ list-style:none; margin:0; padding:0; position:relative; }
.ee-ruta::before{
  content:""; position:absolute; left:7px; top:.8rem; bottom:1.6rem;
  width:1px; background:var(--acc-bd); }

.ee-etapa{ position:relative; padding-left:2.6rem; padding-bottom:2.5rem; }
.ee-etapa:last-child{ padding-bottom:0; }
/* La estación. Llena para las etapas que existen hoy; el modificador
   `futura` la deja hueca, que es cómo se dice «esto todavía no» sin
   escribir la palabra. */
.ee-etapa::before{
  content:""; position:absolute; left:0; top:.55rem;
  width:15px; height:15px; border-radius:99px;
  background:var(--acc); border:3px solid var(--bg);
  box-shadow:0 0 0 1px var(--acc-bd); }
.ee-etapa.futura::before{ background:var(--bg); box-shadow:0 0 0 1px var(--acc-bd); }
/* Sobre la sección de papel el anillo del punto tiene que morder el blanco,
   no el gris del fondo de página. */
.ee-seccion.papel .ee-etapa::before{ border-color:var(--sf); }
.ee-seccion.papel .ee-etapa.futura::before{ background:var(--sf); }

.ee-etapa h3{ margin:0 0 .35rem; font-size:1.05rem; }
.ee-etapa .paso{
  font-family:var(--mono); font-size:var(--t-xs); color:var(--mut);
  display:block; margin-bottom:.15rem; }
.ee-etapa p{ margin:0 0 1rem; max-width:var(--lectura); font-size:var(--t-sm); }
.ee-etapa .cursos{ display:flex; flex-wrap:wrap; gap:.5rem; }
/* Ficha de curso dentro de una etapa: es una referencia, no una tarjeta.
   Si acá hubiera tarjetas grandes, la ruta se perdería debajo de ellas. */
.ee-ficha{
  display:inline-flex; align-items:center; gap:.45rem;
  font-size:var(--t-sm); font-weight:500; color:var(--ink2);
  background:var(--sf); border:1px solid var(--ln); border-radius:99px;
  padding:.3rem .8rem; text-decoration:none;
  transition:border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.ee-ficha:hover{ border-color:var(--acc); color:var(--acc); text-decoration:none; }

/* --------------------- 8b · REDES Y REFERENCIAS --------------------- */
/* Los tres canales de la iglesia. Círculos neutros con el ícono en tinta:
   los colores de marca de Instagram, Facebook y YouTube juntos meten tres
   familias cromáticas ajenas en una página que tiene un solo acento. Se
   reconocen igual por la forma del ícono. */
.ee-redes{ display:flex; flex-wrap:wrap; gap:.6rem; margin-top:1.25rem; }
.ee-red{
  display:inline-flex; align-items:center; gap:.55rem;
  background:var(--sf); border:1px solid var(--ln); border-radius:99px;
  padding:.45rem .95rem .45rem .6rem; color:var(--ink2);
  font-size:var(--t-sm); font-weight:500; text-decoration:none;
  transition:border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.ee-red:hover{ border-color:var(--acc); color:var(--acc); text-decoration:none; }
.ee-red svg{ width:17px; height:17px; flex:none; }

/* Índice de la Declaración de Fe. Trece artículos son demasiados para
   recorrer de arriba abajo buscando uno: el índice es navegación real, no
   un adorno. Va en dos o tres columnas según quepa. */
.ee-indice{
  list-style:none; margin:0; padding:0;
  display:grid; gap:.15rem 1.5rem;
  grid-template-columns:repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
.ee-indice a{
  display:grid; grid-template-columns:1.6rem 1fr 3.6rem; gap:.5rem; align-items:center;
  padding:.45rem .6rem; border-radius:var(--r-sm);
  font-size:var(--t-sm); color:var(--ink2); text-decoration:none;
  border-left:2px solid transparent; }
.ee-indice a:hover{ background:var(--sf3); color:var(--acc);
                    border-left-color:var(--acc-bd); text-decoration:none; }
.ee-indice .n{ font-family:var(--mono); font-size:var(--t-xs); color:var(--mut); }
.ee-indice .tit{ min-width:0; }
/* El peso del artículo: cuántos pasajes lo sostienen. Barra + cifra, no
   sólo la cifra: el ojo compara largos mucho más rápido que números, y la
   pregunta acá es cuál pesa más. */
.ee-indice .peso{ display:flex; align-items:center; gap:.4rem; justify-content:flex-end; }
.ee-indice .peso i{
  display:block; width:2rem; height:4px; border-radius:99px;
  background:var(--escritura-bd); position:relative; overflow:hidden; }
.ee-indice .peso i::after{
  content:""; position:absolute; inset:0 auto 0 0; width:var(--p);
  background:var(--escritura); border-radius:99px; }
.ee-indice .peso b{
  font-family:var(--mono); font-size:var(--t-xs); font-weight:500; color:var(--mut);
  font-variant-numeric:tabular-nums; min-width:1.1rem; text-align:right; }

/* Artículo doctrinal. Sin caja: es texto para leer seguido, y trece cajas
   apiladas convierten una confesión de fe en un tablero de fichas. Lo que
   separa es el aire y un filete. */
/* Trece artículos son dos metros de párrafos con la misma forma. El
   filete de 1px entre uno y otro los separa, pero no les da RITMO: al
   quinto, el ojo ya no distingue dónde empieza cada cual y la página se
   lee como un bloque continuo.
   El numeral al margen resuelve eso sin agregar nada: es grande, quieto y
   en la serif, y funciona como los folios de un libro. Cada artículo
   arranca con una marca visible desde lejos. */
.ee-articulo{
  display:grid; grid-template-columns:3.25rem 1fr; gap:clamp(.75rem, 2vw, 1.5rem);
  padding-block:clamp(1.75rem, 3vw, 2.5rem); border-top:1px solid var(--ln); }
.ee-articulo:first-of-type{ border-top:0; padding-top:0; }
/* El numeral. En la serif y a tamaño de titular, pero en gris muy claro:
   tiene que marcar el comienzo, no competir con el título. */
.ee-articulo .n{
  font-family:var(--serif); font-size:clamp(1.75rem, 3vw, 2.35rem); line-height:.9;
  font-variant-numeric:lining-nums tabular-nums;
  color:var(--acc-bd); letter-spacing:-.03em;
  font-variation-settings:'opsz' 40, 'SOFT' 0, 'WONK' 0;
  transition:color var(--t-med) var(--ease); }
/* Al leer un artículo —lo marca el índice lateral con `:target`, y el
   puntero al pasar— su numeral se enciende. Es la única señal de «estás
   acá» que se ve sin mirar la columna del índice. */
.ee-articulo:hover .n,
.ee-articulo:target .n{ color:var(--acc); }
.ee-articulo .cab{
  display:flex; align-items:baseline; gap:.75rem; flex-wrap:wrap;
  margin-bottom:.6rem; }
.ee-articulo h3{ margin:0; font-size:1.12rem; }
/* El numeral entra un instante antes que el texto: el artículo se anuncia
   y después se lee. */
html.js .ee-revelar.ee-articulo .n{ transform:translateY(6px); opacity:0;
  transition:transform 520ms var(--ease), opacity 520ms var(--ease), color var(--t-med) var(--ease); }
html.js .ee-revelar.visible.ee-articulo .n{ transform:none; opacity:1; }

@media (max-width: 620px){
  /* Sin ancho para una columna de margen: el numeral pasa a ser una línea
     sobre el título, que es donde cabe. */
  .ee-articulo{ grid-template-columns:1fr; gap:.35rem; }
  .ee-articulo .n{ font-size:1.4rem; }
}
/* Cuántos pasajes sostienen este artículo. En la familia de la Escritura,
   porque es lo que cuenta. */
.ee-articulo .refs{
  font-family:var(--mono); font-size:var(--t-xs); color:var(--escritura);
  background:var(--escritura-sf); border:1px solid var(--escritura-bd);
  border-radius:99px; padding:.05rem .5rem; }

/* Índice que acompaña la lectura de los trece artículos. */
.ee-indice-lat{ position:sticky; top:calc(var(--barra-h) + 1.5rem); align-self:start; }
.ee-indice-lat .rot{
  font-size:var(--t-xs); color:var(--mut); margin:0 0 .6rem .6rem;
  letter-spacing:.04em; }
.ee-indice-lat ol{ list-style:none; margin:0; padding:0;
                   border-left:1px solid var(--ln); }
.ee-indice-lat a{
  display:flex; gap:.5rem; padding:.32rem .7rem;
  font-size:var(--t-xs); line-height:1.35; color:var(--mut); text-decoration:none;
  border-left:2px solid transparent; margin-left:-1px;
  transition:color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.ee-indice-lat a:hover{ color:var(--acc); text-decoration:none; }
/* El artículo que se está leyendo. Lo marca assets/referencias.js. */
.ee-indice-lat a.act{ color:var(--acc); border-left-color:var(--acc); font-weight:600; }
.ee-indice-lat .n{ font-family:var(--mono); color:var(--fnt, var(--mut)); flex:none; }
@media (max-width:900px){
  /* Sin ancho para una columna lateral, y el índice de arriba queda a un
     scroll de distancia. */
  .ee-indice-lat{ display:none; }
}

/* Referencia bíblica enlazada. Discreta a propósito: en un párrafo con
   ocho citas, ocho enlaces azules subrayados hacen ilegible el texto. Se
   marcan con un punteado tenue y sólo se encienden al pasar por encima. */
/* Las referencias dentro del texto doctrinal: misma familia que los
   versículos, para que la Escritura se reconozca en todo el sitio por el
   mismo color. Discretas a propósito —punteado, no subrayado sólido—:
   en un párrafo con ocho citas, ocho enlaces marcados a fondo hacen
   ilegible el texto. */
.ee-ref{
  color:var(--escritura); text-decoration:underline dotted var(--escritura-bd);
  text-underline-offset:3px; }
.ee-ref:hover{ text-decoration:underline solid var(--escritura); }

/* Acción destacada con icono y dos líneas de texto: ver la malla,
   imprimirla. Sirve para <a> y para <button>, y por eso resetea lo que el
   navegador le pone de fábrica a los botones —fondo, borde, fuente y
   alineación del texto— que si no se hereda distinto en cada uno. */
.ee-doc{
  display:inline-flex; align-items:center; gap:.75rem;
  font:inherit; text-align:left; cursor:pointer;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  padding:.9rem 1.15rem; text-decoration:none; color:var(--ink2);
  box-shadow:var(--sh); max-width:100%;
  transition:border-color var(--t-fast) var(--ease); }
.ee-doc:hover{ border-color:var(--acc); text-decoration:none; }
.ee-doc svg{ width:22px; height:22px; color:var(--acc); flex:none; }
.ee-doc b{ display:block; color:var(--ink); font-size:var(--t-sm); font-weight:600; }
.ee-doc span{ font-size:var(--t-xs); color:var(--mut); }

/* Ficha de curso: la tabla de datos (fechas, modalidad, cupos). Filas con
   filete, no una tabla con bordes: son seis datos, no una planilla. */
.ee-datos{ list-style:none; margin:0; padding:0;
           background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
           box-shadow:var(--sh); overflow:hidden; }
.ee-datos li{ display:flex; gap:1rem; justify-content:space-between;
              padding:.7rem 1.1rem; font-size:var(--t-sm); }
.ee-datos li:not(:last-child){ border-bottom:1px solid var(--ln2); }
.ee-datos .rot{ color:var(--mut); flex:none; }
.ee-datos .val{ color:var(--ink); font-weight:500; text-align:right; }
.ee-datos .val.fecha{ font-family:var(--mono); font-variant-numeric:tabular-nums; }
/* Aclaración bajo un valor de la ficha. Hoy la usa la modalidad: el valor
   dice «Presencial y por Zoom» y la nota, qué significa el día de la
   clase. Va en bloque para que caiga debajo y no alargue la fila. */
.ee-datos .val .nota{
  display:block; font-style:normal; font-weight:400;
  font-size:var(--t-xs); color:var(--mut); margin-top:.15rem; }

/* Avance del curso. Sólo aparece cuando el curso está EN MARCHA —ni
   antes de empezar ni una vez terminado—, porque es lo único en que esa
   cifra cambia algo para quien la lee. */
.ee-avance{ display:flex; align-items:center; gap:1rem; flex-wrap:wrap;
            margin-bottom:1.75rem; }
.ee-avance .barra{
  flex:1 1 220px; height:6px; border-radius:99px; background:var(--ln);
  overflow:hidden; }
.ee-avance .barra i{
  display:block; height:100%; width:var(--p); border-radius:99px;
  background:var(--acc); transform-origin:left center; transform:scaleX(0);
  transition:transform 900ms var(--ease); }
.ee-revelar.visible .ee-avance .barra i{ transform:scaleX(1); }
.ee-avance p{ margin:0; font-size:var(--t-sm); color:var(--ink2); }
.ee-avance b{ font-family:var(--mono); color:var(--ink); font-weight:500; }

/* Clases de un curso. La fecha en la mono a la izquierda para que todas
   se alineen por columna, y una marca que dice en qué estado está cada
   una: dictada, siguiente, o pendiente. */
.ee-clases{ list-style:none; margin:0; padding:0; }
.ee-clases li{
  display:grid; gap:.2rem 1rem; padding:.9rem 0;
  grid-template-columns:1.5rem 10rem 1fr; align-items:baseline;
  border-top:1px solid var(--ln); }
.ee-clases li:first-child{ border-top:0; }
/* `html.js`: sin script, `:not(.visible)` calza siempre y esto
   escondería las tarjetas para siempre. */
html.js .ee-revelar:not(.visible) .ee-clases li{ opacity:0; transform:translateX(-8px); }
.ee-revelar .ee-clases li{
  transition:opacity 380ms var(--ease), transform 380ms var(--ease),
             background var(--t-fast) var(--ease);
  transition-delay:calc(var(--i, 0) * 55ms); }

/* La marca de estado. Un círculo hueco por defecto; con visto si ya se
   dictó; lleno y con halo si es la siguiente. */
.ee-clases .marca{
  display:flex; align-items:center; justify-content:center;
  width:18px; height:18px; border-radius:99px; margin-top:.15rem;
  border:1.5px solid var(--ln); color:#fff; align-self:start; }
.ee-clases .marca svg{ width:10px; height:10px; }
.ee-clases .dictada .marca{ background:var(--ok); border-color:var(--ok); }
.ee-clases .siguiente .marca{
  background:var(--acc); border-color:var(--acc);
  box-shadow:0 0 0 4px var(--acc-sf); }

.ee-clases .cuando{ font-family:var(--mono); font-size:var(--t-xs);
                    color:var(--mut); font-variant-numeric:tabular-nums; }
.ee-clases .cuando em{ display:block; font-style:normal; opacity:.8; margin-top:.15rem; }
.ee-clases .que{ color:var(--ink); font-weight:500;
                 display:flex; align-items:baseline; gap:.6rem; flex-wrap:wrap; }
.ee-clases .prox{
  font-family:var(--sans); font-size:var(--t-xs); font-weight:600;
  color:var(--acc); background:var(--acc-sf); border:1px solid var(--acc-bd);
  border-radius:99px; padding:.05rem .5rem; }
.ee-clases .detalle{ grid-column:3; font-size:var(--t-sm); color:var(--ink2); margin:.2rem 0 0; }

/* La clase ya dictada se atenúa: no hay nada que hacer con ella, y
   dejarla al mismo peso que las que vienen obliga a leerlas todas para
   encontrar la próxima. */
.ee-clases .dictada .cuando,
.ee-clases .dictada .que,
.ee-clases .dictada .detalle{ opacity:.55; }
.ee-clases .siguiente{ background:var(--acc-sf);
                       box-shadow:inset 3px 0 0 var(--acc); }
.ee-clases .siguiente .que{ font-weight:600; }

@media (max-width:640px){
  .ee-clases li{ grid-template-columns:1.5rem 1fr; }
  .ee-clases .cuando{ grid-column:2; }
  .ee-clases .que, .ee-clases .detalle{ grid-column:2; }
}

/* ------------------- 8c · CIFRAS DEL MINISTERIO --------------------- */
/* Cinta de cifras, heredada de `.ek-kpis` de Ekklesia: UNA superficie
   dividida por filetes, no cuatro tarjetas sueltas que al reflujo dejan
   una huérfana en su propia fila.

   Las cifras salen de la base, en vivo. No están escritas en el HTML: si
   mañana hay 3.000 personas formadas, el sitio lo dice solo. Y la cifra
   va en la mono con `tabular-nums` para que los cuatro números queden
   alineados por su unidad, no por su ancho de glifo. */
.ee-cifras{
  /* ⚠️ `grid-auto-flow:column` y NO `repeat(var(--n), 1fr)`.
     `var()` no se puede usar como CONTADOR dentro de `repeat()`: el número
     de repeticiones tiene que ser un entero en tiempo de parseo, y la
     sustitución de las variables ocurre después. El navegador descartaba
     la declaración entera y `grid-template-columns` computaba `none`, así
     que las cuatro cifras quedaban apiladas una debajo de otra ocupando
     todo el ancho — que es exactamente como se veía.
     Con flujo por columnas no hace falta saber cuántas son: entran todas
     en una fila y se reparten el ancho por igual, vengan tres o cinco. */
  display:grid; grid-auto-flow:column; grid-auto-columns:1fr;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); overflow:hidden; }
.ee-cifra{ padding:1.35rem 1.4rem; min-width:0; position:relative; }
.ee-cifra:not(:last-child){ border-right:1px solid var(--ln); }

/* El icono de la cifra, en el tono de su pista. Da color a la cinta y, de
   paso, hace reconocible cada dato sin leer el rótulo. */
.ee-cifra .ico{
  display:grid; place-items:center;
  width:38px; height:38px; border-radius:50%; margin-bottom:.85rem;
  background:var(--et-sf); border:1px solid var(--et-bd); color:var(--et-ink); }
.ee-cifra .ico svg{ width:19px; height:19px; }

/* ⚠️ El número va en el TONO de la cifra, no en `--ink`. En tinta —casi
   negro— la cinta se leía como cuatro números apagados en fila, que es
   justo lo contrario de lo que una cinta de cifras tiene que hacer.
   Los cuatro tonos son los de las fases de la malla: misma escala, mismo
   origen, y ninguno baja de 4,5:1 sobre el blanco de la tarjeta. */
.ee-cifra .fg{
  font-family:var(--mono); font-size:clamp(1.6rem, 1.1rem + 1.8vw, 2.4rem);
  font-weight:500; letter-spacing:-.03em; color:var(--et-ink); line-height:1.1;
  font-variant-numeric:tabular-nums; display:block; }
/* Una línea del mismo tono bajo el número: ata la cifra a su color sin
   teñir el fondo, que dejaría cuatro bloques de colores compitiendo. */
.ee-cifra .fg::after{
  content:""; display:block; width:2.2rem; height:2px; margin-top:.6rem;
  background:var(--et-ink); opacity:.32; border-radius:2px;
  transition:width 620ms var(--ease) 240ms; }
html.js .ee-revelar:not(.visible) .ee-cifra .fg::after{ width:0; }
.ee-cifra .lb{ font-size:var(--t-sm); color:var(--ink); display:block; margin-top:.5rem;
               font-weight:600; letter-spacing:-.005em; }
.ee-cifra .nt{ font-size:var(--t-xs); color:var(--mut); display:block; margin-top:.2rem; }

/* Sobre el chrome oscuro (el héroe) la cinta se invierte: mismo componente,
   sin una segunda clase que mantener. */
.ee-heroe .ee-cifras{
  /* Translúcida a propósito: el sello tiene que verse por detrás. Un
     fondo opaco acá vuelve a cortar la marca de agua en dos. */
  background:rgba(255,255,255,.055); border-color:rgba(255,255,255,.15);
  box-shadow:none;
  -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); }
.ee-heroe .ee-cifra:not(:last-child){ border-right-color:rgba(255,255,255,.14); }
.ee-heroe .ee-cifra .fg{ color:#fff; }
/* Sobre medianoche los tonos de pista no alcanzan: el icono se dibuja en
   el azul claro del chrome oscuro, que es el mismo que usan los rótulos. */
.ee-heroe .ee-cifra .ico{
  background:rgba(255,255,255,.08); border-color:rgba(255,255,255,.18);
  color:var(--acc-nav); }
.ee-heroe .ee-cifra .fg::after{ background:var(--acc-nav); opacity:.6; }
.ee-heroe .ee-cifra .lb{ color:rgba(255,255,255,.82); }
.ee-heroe .ee-cifra .nt{ color:rgba(255,255,255,.55); }

@media (max-width:760px){
  /* En dos columnas hay que volver al flujo por filas. */
  .ee-cifras{ grid-auto-flow:row; grid-template-columns:repeat(2, 1fr); }
  /* ⚠️ Escrito para CUALQUIER cantidad, par o impar. La versión anterior
     daba por hecho que eran cuatro —filete inferior a las dos primeras,
     sin filete derecho a la 2ª y la 4ª— y al agregar la quinta cifra
     quedaban una raya suelta bajo la fila del medio y una tarjeta huérfana
     ocupando media fila.
     Ahora: filete inferior a todas, se lo quita la última fila, y si la
     última queda sola ocupa el ancho completo. */
  .ee-cifra{ border-bottom:1px solid var(--ln); }
  .ee-cifra:nth-child(2n){ border-right:0; }
  .ee-cifra:last-child:nth-child(odd){ grid-column:1 / -1; border-right:0; }
  .ee-cifra:last-child,
  .ee-cifra:nth-last-child(2):nth-child(odd){ border-bottom:0; }
  .ee-heroe .ee-cifra{ border-bottom-color:rgba(255,255,255,.14); }
}

/* ------------------------ 8c2 · FILTRO ------------------------------ */
/* Pastillas de filtro. Son ENLACES y no botones: cada sede tiene su URL,
   así el enlace de «convocatorias de Temuco» se puede pegar en el grupo
   de WhatsApp de esa sede y llega filtrado. */
.ee-filtro{ display:flex; flex-wrap:wrap; align-items:center; gap:.5rem; }
.ee-filtro .rot{
  display:inline-flex; align-items:center; gap:.4rem;
  font-size:var(--t-xs); color:var(--mut); margin-right:.25rem; }
.ee-filtro .rot svg{ width:15px; height:15px; }
.ee-filtro .op{
  display:inline-flex; align-items:center; gap:.45rem;
  font-size:var(--t-sm); font-weight:500; color:var(--ink2);
  background:var(--sf); border:1px solid var(--ln); border-radius:99px;
  padding:.35rem .8rem; text-decoration:none;
  transition:border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease),
             background var(--t-fast) var(--ease); }
.ee-filtro .op:hover{ border-color:var(--acc); color:var(--acc); text-decoration:none; }
.ee-filtro .op.act{ background:var(--acc); border-color:var(--acc); color:var(--acc-ink); }
/* El conteo va en la mono para que no baile al cambiar de una a dos cifras. */
.ee-filtro .n{
  font-family:var(--mono); font-size:11px; font-variant-numeric:tabular-nums;
  background:var(--sf3); color:var(--mut); border-radius:99px; padding:.05rem .35rem; }
.ee-filtro .op.act .n{ background:rgba(255,255,255,.2); color:#fff; }

/* ---------------------- 8d · GRÁFICO DE BARRAS ---------------------- */
/* SVG dibujado en el servidor con los datos reales. Sin biblioteca: son
   tres barras, y traer 90 KB de JavaScript para eso es absurdo. */
.ee-gráfico, .ee-grafico{ display:block; width:100%; height:auto; }
.ee-grafico .barra{ fill:var(--acc); transition:fill var(--t-fast) var(--ease); }
/* La variación respecto del año anterior, escrita dentro de la barra. En
   blanco sobre el azul, en la mono y con peso: es un dato, y los datos de
   este sitio van en la mono. */
.ee-grafico .delta{
  fill:#fff; font-family:var(--mono); font-size:12px; font-weight:500;
  letter-spacing:.02em; opacity:.92; }
.ee-grafico .barra.act{ fill:var(--renacer); }
/* El año que todavía no termina, rayado. La trama dice «incompleto» sin
   necesidad de una leyenda, y la palabra «en curso» debajo lo confirma
   para quien no lea tramas. */
.ee-grafico .barra.parcial{ fill:url(#eeRayado); stroke:var(--renacer); stroke-width:1; }
.ee-grafico .curso{
  fill:var(--mut); font-family:var(--mono); font-size:9.5px;
  letter-spacing:.04em; text-transform:uppercase; }
.ee-grafico .eje{ stroke:var(--ln); stroke-width:1; }
.ee-grafico .rot{ fill:var(--mut); font-family:var(--sans); font-size:12px; }
.ee-grafico .val{ fill:var(--ink); font-family:var(--mono); font-size:13px; font-weight:500; }
/* Las barras crecen desde abajo cuando el bloque entra en pantalla. */
html.js .ee-grafico .barra{ transform-box:fill-box; transform-origin:50% 100%;
                    transform:scaleY(0); transition:transform 900ms var(--ease); }
/* Misma razón que en `.ee-revelar.visible`: si el reposo lleva `html.js`,
   la regla que lo levanta también, o las barras nunca crecen. */
html.js .ee-revelar.visible .ee-grafico .barra{ transform:scaleY(1); }
.ee-grafico .barra:nth-child(2){ transition-delay:90ms; }
.ee-grafico .barra:nth-child(3){ transition-delay:180ms; }

/* ------------------------ 8e · LA MALLA ----------------------------- */
/* El programa académico como CUADRÍCULA HORIZONTAL: las fases son filas,
   los semestres columnas, y el año corre de izquierda a derecha.

   Es la forma real del contenido —cuatro procesos en paralelo a lo largo
   de un año— y la que usa la malla oficial. Una versión anterior apilaba
   dos tarjetas verticales, una por semestre: se leía, pero para responder
   «¿qué se dicta en Formación durante el año?» había que comparar dos
   columnas lejanas. Acá esa respuesta es una fila.

   ⚠️ Esta es la ÚNICA parte del sitio donde el color no marca estado: acá
   el color ES la fase, y es la clave de lectura de todo el esquema.

   El marco desplaza en horizontal y la columna de rótulos queda fija.
   Apilar una malla curricular destruye justamente lo que la hace legible
   —el paralelo entre fases—, y una tabla de horario que se desplaza es un
   patrón que la gente ya conoce. */
.ee-malla-marco{
  overflow-x:auto; overflow-y:hidden;
  margin-inline:calc(-1 * var(--sangria)); padding:2px var(--sangria);
  -webkit-overflow-scrolling:touch; }

.ee-malla{
  --rot:190px;
  display:grid; grid-template-columns:var(--rot) 1fr 1fr;
  min-width:880px;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh);
  /* ⚠️ NADA de `overflow:hidden` acá. Convertía a `.ee-malla` en el
     contenedor de desplazamiento del `position:sticky` de la columna de
     rótulos, y como esa caja no se mueve, el sticky no hacía nada: al
     desplazar el año se perdía de vista de qué fase era cada fila, que es
     justo lo que la columna fija existe para impedir.
     Las esquinas se recortan con `clip-path`, que no crea contenedor de
     desplazamiento. */
  clip-path:inset(0 round var(--r)); }

/* Cada fila hereda la plantilla de columnas de la cuadrícula madre, para
   que todo alinee sin repetir medidas. */
.ee-malla .fila{ display:grid; grid-column:1 / -1;
                 grid-template-columns:subgrid; }
/* `subgrid` no está en todos los navegadores todavía: el respaldo repite
   la plantilla, que da el mismo resultado. */
@supports not (grid-template-columns: subgrid){
  .ee-malla .fila{ grid-template-columns:var(--rot) 1fr 1fr; }
}
.ee-malla .fila:not(:last-child){ border-bottom:1px solid var(--ln2); }

/* La columna de rótulos queda FIJA al desplazar: sin esto, al mirar el
   segundo semestre se pierde de vista de qué fase es cada fila. */
.ee-malla .rot{
  position:sticky; left:0; z-index:2;
  background:var(--sf2); border-right:1px solid var(--ln);
  padding:1rem 1.1rem; display:flex; flex-direction:column; gap:.12rem;
  justify-content:center; }
.ee-malla .cel{ padding:1rem 1.1rem; min-width:0;
                display:flex; flex-direction:column; gap:.45rem; justify-content:center; }
.ee-malla .cel + .cel{ border-left:1px solid var(--ln2); }

/* Celda que cruza las dos columnas de semestre. La usan la banda de
   entrada, la Fase I y el cierre: los tres siguen el calendario de los
   TRES ENCUENTROS del año, no el de los semestres, así que repartirlos en
   dos columnas obligaría a inventar en cuál cae el Encuentro de julio —que
   cae justo en el límite—. Cruzando, la banda dice lo que es: un ritmo
   propio por encima del año lectivo. */
.ee-malla .cel.ancha{ grid-column:2 / -1; }

/* Los tres Encuentros del año, en fila. Números y meses, nada más: lo que
   hay que ver de un vistazo es que son TRES y cuándo caen. */
.ee-ciclos{
  list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(3, minmax(0, 1fr));
  gap:clamp(.6rem, 1.6vw, 1.1rem); }
.ee-ciclos li{
  display:flex; align-items:center; gap:.7rem;
  background:var(--acc-sf); border:1px solid var(--acc-bd);
  border-radius:calc(var(--r) - 4px); padding:.6rem .8rem; }
.ee-ciclos .n{
  flex:none; width:2rem; height:2rem; border-radius:50%;
  display:grid; place-items:center;
  background:var(--acc); color:#fff;
  font-family:var(--mono); font-size:.72rem; font-weight:500; }
.ee-ciclos .txt{ display:flex; flex-direction:column; line-height:1.25; min-width:0; }
.ee-ciclos b{ font-size:var(--t-sm); font-weight:600; color:var(--ink); }
.ee-ciclos em{ font-style:normal; font-size:var(--t-xs); color:var(--mut); }

/* Nota al pie de una fila ancha: explica el ritmo sin robarle sitio a las
   tarjetas de curso. */
.ee-nota-fila{
  margin:.85rem 0 0; font-size:var(--t-xs); line-height:1.5; color:var(--mut); }

/* La Fase I es la única fila de fase que cruza el ancho, porque su curso
   se dicta tres veces al año y no dos. Se marca con el mismo tono de su
   pista, igual que las demás. */
.ee-malla .fila.anual .cel.ancha{ background:transparent; }

/* ── Banda de cronograma ──
   Sobre el medianoche y no sobre gris: es la cabecera del esquema y tiene
   que leerse como tal, no como una fila más. El esquema abre y cierra con
   la misma banda (ver `.graduacion`), y eso lo enmarca. */
.ee-malla .cronograma{ background:var(--nav); color:#fff; }
.ee-malla .cronograma .rot{
  background:var(--nav); border-right-color:rgba(255,255,255,.12); }
.ee-malla .cronograma .cel + .cel{ border-left-color:rgba(255,255,255,.12); }
.ee-malla .cronograma .tipo{
  font-size:var(--t-xs); letter-spacing:.08em; text-transform:uppercase;
  color:var(--acc-nav); }
.ee-malla .cronograma b{ font-size:1.05rem; color:#fff; font-weight:600; letter-spacing:-.01em; }
.ee-malla .cronograma .meses{
  display:flex; align-items:center; gap:.4rem; margin-top:.2rem;
  font-family:var(--mono); font-size:var(--t-xs); letter-spacing:.04em;
  color:rgba(255,255,255,.66); }
.ee-malla .cronograma .meses svg{ width:13px; height:13px; flex:none; }

/* ── Rótulo de fase ── */
/* El número de fase en grande: es lo que ORDENA el esquema, y en cuerpo
   pequeño se perdía entre el nombre y el día. Va en el tono de su fase y
   con poco peso, para pesar por tamaño y no por negrita. */
.ee-malla .ee-pista .rot{ flex-direction:row; align-items:center; gap:.85rem;
                          box-shadow:inset 4px 0 0 var(--et-ink); }
.ee-malla .cifra{
  font-family:var(--mono); font-size:2.1rem; font-weight:400; line-height:1;
  color:var(--et-ink); opacity:.32; flex:none; font-variant-numeric:tabular-nums; }
.ee-malla .rot .txt{ display:flex; flex-direction:column; gap:.1rem; min-width:0; }
.ee-malla .fase{ font-family:var(--mono); font-size:var(--t-xs); font-weight:500;
                 letter-spacing:.06em; text-transform:uppercase; color:var(--et-ink); }
.ee-malla .rot b{ font-size:1.02rem; color:var(--ink); font-weight:600; letter-spacing:-.01em; }
/* ⚠️ Va DESPUÉS de la regla de arriba, que tiene la misma especificidad y
   la pisaba: «Anual 2026» salía en tinta oscura sobre el medianoche de la
   banda, con 1,1:1 de contraste — invisible. */
.ee-malla .cronograma .rot b{ color:#fff; }
.ee-malla .dia{ display:flex; align-items:center; gap:.3rem;
                font-family:var(--mono); font-size:var(--t-xs); color:var(--mut); }
.ee-malla .dia svg{ width:12px; height:12px; flex:none; }
.ee-malla .conv{
  margin-top:.45rem; align-self:flex-start;
  font-size:var(--t-xs); font-weight:600;
  color:var(--ok); background:var(--ok-sf); border:1px solid var(--ok-bd);
  padding:.1rem .5rem; border-radius:99px; text-decoration:none; white-space:nowrap; }
.ee-malla .conv:hover{ background:var(--ok); color:#fff; text-decoration:none; }

/* Los cuatro tonos, tomados de la malla oficial. */
.ee-pista[data-etapa="1"]{ --et-sf:#e8eefb; --et-ink:#1b3a6b; --et-bd:#bdcdea; }
.ee-pista[data-etapa="2"]{ --et-sf:#e4eefc; --et-ink:#12508f; --et-bd:#b3d1f0; }
.ee-pista[data-etapa="3"]{ --et-sf:#e6f0f6; --et-ink:#1d5573; --et-bd:#b6d2e2; }
.ee-pista[data-etapa="4"]{ --et-sf:#e2f2fe; --et-ink:#0a6ba8; --et-bd:#a8d8f5; }

/* ── Un curso dentro de la cuadrícula ── */
.ee-mcurso{
  display:flex; flex-direction:column; gap:.4rem;
  padding:.75rem .85rem; border-radius:var(--r-sm);
  border:1px solid var(--et-bd); background:var(--et-sf);
  font-size:var(--t-sm); color:var(--et-ink);
  /* Entran escalonados al revelarse el bloque. El estado de reposo sólo
     se aplica DENTRO de un `.ee-revelar`: si el bloque no lleva esa clase
     —o el script no corre— los cursos están visibles desde el principio. */
  transition:box-shadow var(--t-fast) var(--ease), transform var(--t-fast) var(--ease); }
/* `html.js`: sin script, `:not(.visible)` calza siempre y esto
   escondería las tarjetas para siempre. */
html.js .ee-revelar:not(.visible) .ee-mcurso{ opacity:0; transform:translateY(6px); }
.ee-revelar .ee-mcurso{
  transition:opacity 420ms var(--ease), transform 420ms var(--ease),
             box-shadow var(--t-fast) var(--ease);
  transition-delay:calc(var(--i, 0) * 80ms); }
.ee-mcurso:hover{ transform:translateY(-2px);
  box-shadow:0 4px 14px -4px color-mix(in srgb, var(--et-ink) 45%, transparent); }
/* La cabecera de la tarjeta: el nombre manda y el carácter se alinea a la
   derecha, arriba, para que no empuje el título a una segunda línea. */
.ee-mcurso .cab{ display:flex; align-items:flex-start; gap:.6rem; justify-content:space-between; }
.ee-mcurso .nom{ flex:1 1 auto; min-width:0; font-weight:600; line-height:1.3; }
.ee-mcurso .tag{
/* Etiqueta de frecuencia, no de carácter: dice CUÁNTAS VECES se dicta, no
   si es obligatorio. Por eso no usa la paleta de `EE_CARACTER`. */
.ee-mcurso .tag.veces{ color:var(--acc); background:var(--acc-sf); border-color:var(--acc-bd); }
  font-size:11px; font-weight:600; padding:.05rem .45rem; border-radius:99px;
  border:1px solid var(--ln); color:var(--mut); background:var(--sf); flex:none; }
.ee-mcurso .tag.obl{ color:var(--warn); background:var(--warn-sf); border-color:var(--warn-bd); }
.ee-mcurso .tag.abi{ color:var(--ok); background:var(--ok-sf); border-color:var(--ok-bd); }
.ee-mcurso .tag.rec{ color:var(--ink2); }

/* Los módulos van DENTRO de su curso: Plantados, Visión Renacer y Llamados
   a Servir son las tres partes del Curso Post-Encuentro, no tres cursos
   hermanos. Listarlos al mismo nivel hacía ver la Consolidación como el
   triple de larga de lo que es. */
.ee-modulos{
  list-style:none; margin:0; padding:0 0 0 .85rem;
  border-left:1px solid var(--et-bd); }
.ee-modulos li{ display:flex; align-items:baseline; gap:.45rem;
                font-size:var(--t-xs); color:var(--et-ink); opacity:.85; padding:.16rem 0; }
.ee-modulos .n{ font-family:var(--mono); font-size:10.5px; font-weight:500;
                background:var(--sf); border-radius:3px; padding:.05rem .32rem; flex:none;
                font-variant-numeric:tabular-nums; }

/* ── La entrada ── */
.ee-malla .hito{ background:var(--sf2); }
.ee-malla .tipo{ font-size:var(--t-xs); letter-spacing:.08em;
                 text-transform:uppercase; color:var(--mut); }
.ee-hito{ display:flex; align-items:center; gap:.7rem; }
.ee-hito .ico{
  display:flex; align-items:center; justify-content:center; flex:none;
  width:30px; height:30px; border-radius:99px;
  background:var(--acc-sf); border:1px solid var(--acc-bd); color:var(--acc); }
.ee-hito .ico svg{ width:15px; height:15px; }
.ee-hito .txt{ font-size:var(--t-sm); font-weight:600; color:var(--acc); }
.ee-hito em{ display:block; font-style:normal; font-weight:500;
             font-size:var(--t-xs); color:var(--mut); }

/* ── El cierre del ciclo ──
   Sobre el mismo medianoche de la cabecera: el esquema abre y cierra con
   la misma banda, y eso lo enmarca como una unidad. */
.ee-malla .graduacion{ background:var(--nav); color:#fff; }
.ee-malla .graduacion .rot{
  background:var(--nav); border-right-color:rgba(255,255,255,.12);
  flex-direction:row; align-items:center; gap:.6rem; }
.ee-malla .graduacion .cel + .cel{ border-left-color:rgba(255,255,255,.12); }
.ee-malla .graduacion .tipo{ color:var(--acc-nav); }
.ee-malla .graduacion .rot .ico{
  display:flex; align-items:center; justify-content:center; flex:none;
  width:28px; height:28px; border-radius:99px;
  background:rgba(255,255,255,.09); color:var(--acc-nav); }
.ee-malla .graduacion .rot .ico svg{ width:15px; height:15px; }
.ee-malla .graduacion .cel{ flex-direction:row; align-items:center; gap:.75rem; }
.ee-malla .graduacion .num{
  display:flex; align-items:center; justify-content:center; flex:none;
  width:26px; height:26px; border-radius:99px;
  background:var(--acc-nav); color:var(--nav);
  font-family:var(--mono); font-size:var(--t-xs); font-weight:600; }
.ee-malla .graduacion .txt b{ display:block; font-size:var(--t-sm); color:#fff; font-weight:600; }
.ee-malla .graduacion em{ font-style:normal; font-size:var(--t-xs);
                          color:rgba(255,255,255,.6); }

/* ── Aislar una fase ── */
.ee-malla[data-aislar] .fila{
  opacity:.28; filter:grayscale(.9);
  transition:opacity var(--t-med) var(--ease), filter var(--t-med) var(--ease); }
.ee-malla[data-aislar] .cronograma,
.ee-malla[data-aislar] .graduacion,
.ee-malla[data-aislar="1"] .ee-pista[data-etapa="1"],
.ee-malla[data-aislar="2"] .ee-pista[data-etapa="2"],
.ee-malla[data-aislar="3"] .ee-pista[data-etapa="3"],
.ee-malla[data-aislar="4"] .ee-pista[data-etapa="4"]{ opacity:1; filter:none; }

/* Leyenda de las cuatro fases: rotula y además filtra. */
.ee-leyenda{ display:flex; flex-wrap:wrap; gap:.5rem .9rem; margin-top:1.25rem;
             font-size:var(--t-xs); color:var(--mut); align-items:center; }
.ee-leyenda span,
.ee-leyenda button{ display:inline-flex; align-items:center; gap:.4rem; }
.ee-leyenda button{
  font-family:var(--sans); font-size:inherit; color:var(--mut);
  background:none; border:1px solid transparent; border-radius:99px;
  padding:.25rem .6rem; cursor:pointer;
  transition:background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease),
             color var(--t-fast) var(--ease); }
.ee-leyenda button:hover{ background:var(--et-sf); color:var(--et-ink); border-color:var(--et-bd); }
.ee-leyenda button[aria-pressed="true"]{
  background:var(--et-sf); color:var(--et-ink); border-color:var(--et-ink); font-weight:600; }
.ee-leyenda i{ width:10px; height:10px; border-radius:3px; display:inline-block;
               background:var(--et-ink); flex:none; }
.ee-leyenda .ayuda{ color:var(--mut); margin-left:auto; }
@media (max-width:620px){ .ee-leyenda .ayuda{ margin-left:0; width:100%; } }

@media (max-width:560px){
  .ee-malla{ --rot:150px; min-width:780px; }
  .ee-malla .rot, .ee-malla .cel{ padding:.8rem .85rem; }
}


/* ---------------- 8f · REVELADO AL ENTRAR EN PANTALLA --------------- */
/* Un desplazamiento de 14px y opacidad. Nada más: el contenido tiene que
   aparecer, no actuar. Y si el JavaScript no corre —o el visitante pidió
   menos movimiento— todo queda visible, porque el estado de reposo se
   aplica sólo cuando la clase la pone el script. */
/* ⚠️ `html.js` y no `.ee-revelar` a secas. Sin ese prefijo, el estado de
   reposo `opacity:0` se aplica SIEMPRE, y basta con que sitio.js no cargue
   para que la página quede en blanco con todo el contenido presente pero
   invisible. La clase `js` la pone un script en línea del <head>, así que
   el CSS sólo esconde cuando sabe que hay quien vuelva a mostrar. */
html.js .ee-revelar{ opacity:0; transform:translateY(14px);
             transition:opacity 620ms var(--ease), transform 620ms var(--ease); }
/* ⚠️ `html.js` acá TAMBIÉN, y no por simetría: por especificidad. Al
   prefijar sólo la regla de reposo de arriba, ésa pasó a pesar (0,2,1) —
   dos clases y un elemento— contra los (0,2,0) de `.ee-revelar.visible`.
   El reposo le ganaba a la clase que debía encenderlo, así que el
   observador marcaba todo como visible y la página seguía en blanco: el
   mismo desastre que el prefijo venía a evitar, sólo que garantizado en
   vez de eventual. Las dos reglas tienen que subir juntas. */
html.js .ee-revelar.visible{ opacity:1; transform:none; }
/* Escalonado dentro de un grupo, para que una fila de tarjetas no entre
   toda de golpe. */
.ee-revelar[data-orden="1"]{ transition-delay:80ms; }
.ee-revelar[data-orden="2"]{ transition-delay:160ms; }
.ee-revelar[data-orden="3"]{ transition-delay:240ms; }

/* ⚠️ `html.js` TAMBIÉN acá, y por tercera vez la misma razón. Todo lo que
   participe del revelado tiene que llevar el prefijo, porque la regla de
   reposo lo lleva y pesa (0,2,1): cualquier regla que intente encender sin
   él pesa menos y pierde.
   Sin esto, quien tenga activado «reducir movimiento» —una preferencia del
   sistema, muy común en teléfonos y en accesibilidad— veía el sitio EN
   BLANCO: el CSS escondía el contenido y la única regla que iba a
   devolvérselo perdía por especificidad.
   Regla de la casa: si un selector nombra `.ee-revelar` o `.ee-grafico
   .barra` para cambiar `opacity` o `transform`, empieza con `html.js`. */
@media (prefers-reduced-motion: reduce){
  html.js .ee-revelar{ opacity:1; transform:none; transition:none; }
  html.js .ee-grafico .barra{ transform:scaleY(1); transition:none; }
}

/* ------------------- 8g · GUÍA «¿POR DÓNDE EMPIEZO?» ---------------- */
/* Una pregunta a la vez, sobre una sola hoja. La alternativa —las tres
   preguntas apiladas— convierte una conversación de treinta segundos en
   un formulario, y un formulario se abandona. */
.ee-guia{ max-width:760px; margin-inline:auto; }
/* Cuánto falta de la guía. Va sobre la tarjeta y no dentro, para que no
   se mueva al cambiar de pregunta. */
.ee-guia .avance{
  height:4px; border-radius:99px; background:var(--ln);
  overflow:hidden; margin-bottom:1.1rem; }
.ee-guia .avance i{
  display:block; height:100%; width:var(--p); border-radius:99px;
  background:var(--acc); transition:width 420ms var(--ease); }
/* En la salida el avance está completo, y deja de ser una barra de
   progreso para ser la confirmación de que se terminó. */
.ee-guia[data-fin] .avance i{ background:var(--ok); }

.ee-guia .paso{
  display:none;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:clamp(1.5rem, 4vw, 2.5rem); }
.ee-guia .paso.act{ display:block; animation:eeEntra 380ms var(--ease); }
/* Sin JavaScript no hay clase `.act`, así que se muestra la primera
   pregunta y las salidas quedan visibles en el flujo: la página informa
   igual, aunque no avance sola. */
.ee-guia:not([data-listo]) .paso[data-paso="1"]{ display:block; }

@keyframes eeEntra{ from{ opacity:0; transform:translateY(10px); } to{ opacity:1; transform:none; } }

.ee-guia .num{
  font-family:var(--mono); font-size:var(--t-xs); color:var(--mut);
  display:block; margin-bottom:.6rem; }
.ee-guia h2{ margin:0 0 .6rem; }
.ee-guia .paso > p{ margin:0; color:var(--ink2); max-width:56ch; }

.ee-guia .ops{ display:flex; flex-direction:column; gap:.6rem; margin-top:1.75rem; }
/* Opciones a lo alto y de ancho completo: son frases, no etiquetas, y en
   fila se cortan en dos líneas de distinto alto. */
.ee-guia .op{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  width:100%; text-align:left; font-family:var(--sans); font-size:var(--t-body);
  font-weight:500; color:var(--ink); cursor:pointer;
  background:var(--sf2); border:1px solid var(--ln); border-radius:var(--r-sm);
  padding:.9rem 1.1rem;
  transition:border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease),
             transform var(--t-fast) var(--ease); }
.ee-guia .op::after{
  content:"→"; color:var(--acc); opacity:0; transform:translateX(-4px);
  transition:opacity var(--t-fast) var(--ease), transform var(--t-fast) var(--ease); }
.ee-guia .op:hover{ border-color:var(--acc); background:var(--acc-sf); transform:translateX(2px); }
.ee-guia .op:hover::after{ opacity:1; transform:none; }

.ee-guia .volver{
  margin-top:1.25rem; background:none; border:0; padding:0; cursor:pointer;
  font-family:var(--sans); font-size:var(--t-sm); color:var(--mut); }
.ee-guia .volver::before{ content:"← "; }
.ee-guia .volver:hover{ color:var(--acc); text-decoration:underline; }

/* La salida se distingue por un filete de acento arriba: es una respuesta,
   no una pregunta más. */
.ee-guia .salida{ border-top:3px solid var(--acc); }

/* Columna que acompaña a un bloque largo (la ruta, en la portada).
   `sticky` para que siga presente mientras se recorren las cuatro fases:
   si se queda arriba, para cuando alguien termina de leer la Fase IV la
   pregunta «¿y yo en cuál estoy?» ya quedó dos pantallas atrás. */
.ee-acompana{ position:sticky; top:calc(var(--barra-h) + 1.5rem); align-self:start; }
@media (max-width:900px){ .ee-acompana{ position:static; } }
.ee-acompana .ee-rotulo{ margin-bottom:.5rem; }

/* ------------------ 8i0 · EL PASAJE, EN UN DIÁLOGO ------------------- */
/* `<dialog>` del navegador y no un div con overlay: trae de fábrica la
   trampa de foco, el cierre con Escape, el fondo inerte y el rol correcto
   para lector de pantalla. Reimplementar eso a mano sale peor. */
/* Tarjetas de contenido, sin enlace.
   ⚠️ Existe porque `.ee-campus` dejó de servir para esto: cuando sus
   tarjetas pasaron a ser seleccionables, su CSS se mudó de `li` a `a`, y
   una lista sin enlaces heredó la rejilla pero ninguna caja. El síntoma
   fue texto suelto donde debía haber tarjetas, sin nada roto en el HTML.
   Dos usos distintos no deben compartir una clase sólo porque hoy se
   parecen: el día que uno cambie, el otro se rompe en silencio. */
.ee-tarjetas{
  list-style:none; margin:clamp(2rem,4vw,2.75rem) 0 0; padding:0;
  display:grid; gap:clamp(.9rem, 2vw, 1.25rem);
  grid-template-columns:repeat(auto-fit, minmax(min(100%, 210px), 1fr)); }
.ee-tarjetas li{
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:1.15rem 1.25rem 1.25rem; }
.ee-tarjetas .marca{
  display:grid; place-items:center; width:36px; height:36px; border-radius:50%;
  background:var(--acc-sf); color:var(--acc); margin-bottom:.85rem; }
.ee-tarjetas .marca svg{ width:18px; height:18px; }
.ee-tarjetas h3{ margin:0 0 .3rem; font-size:1rem; letter-spacing:-.012em; }
.ee-tarjetas p{ margin:0; font-size:var(--t-sm); line-height:1.55; color:var(--ink2); }
html.js .ee-revelar.ee-tarjetas li{
  opacity:0; transform:translateY(10px);
  transition:opacity 480ms var(--ease), transform 480ms var(--ease);
  transition-delay:calc(var(--i) * 80ms); }
html.js .ee-revelar.visible.ee-tarjetas li{ opacity:1; transform:none; }

/* Los tres errores, en fila y a todo el ancho. Son tres versiones del
   MISMO número: lo que cambia entre ellas —un punto, un guion, un dígito—
   se ve de un vistazo sólo si están en paralelo. Apilados hay que
   recordar el anterior para comparar. */
.ee-errores{
  margin-top:clamp(1.75rem, 3.5vw, 2.5rem);
  padding-top:clamp(1.5rem, 3vw, 2rem); border-top:1px solid var(--ln); }
.ee-errores .rot{
  display:flex; align-items:center; gap:.45rem; margin:0 0 1rem;
  font-size:var(--t-xs); color:var(--mut); letter-spacing:.04em; }
.ee-errores .rot b{
  font-family:var(--mono); font-size:.72rem; font-weight:600;
  letter-spacing:.08em; color:#fff; background:var(--danger);
  border-radius:4px; padding:.1rem .4rem; }
.ee-errores ul{
  list-style:none; margin:0; padding:0;
  display:grid; gap:clamp(.7rem, 2vw, 1.25rem);
  grid-template-columns:repeat(3, minmax(0, 1fr)); }
.ee-errores li{
  display:flex; flex-direction:column; gap:.2rem;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r-sm);
  padding:.85rem 1rem; }
.ee-errores code{
  font-family:var(--mono); font-size:var(--t-sm); color:var(--mut);
  text-decoration:line-through; text-decoration-color:var(--danger);
  background:none; padding:0; white-space:nowrap; }
.ee-errores em{ font-style:normal; font-size:var(--t-xs); color:var(--mut); }
@media (max-width: 700px){ .ee-errores ul{ grid-template-columns:1fr; } }

/* ---------------- 8r · EL FORMATO DEL RUN Y EL VIDEO ----------------- */
/* ⚠️ Este bloque tiene MÁS peso visual que ninguna otra explicación del
   sitio, y es a propósito. Según la escuela, no entender cómo escribir el
   RUN es lo que más impide entrar al Aula Virtual — más que no saber la
   dirección o no tener cuenta. Un ejemplo trabajado resuelve en un
   vistazo lo que un párrafo de instrucciones no resuelve en tres
   lecturas: nadie lee instrucciones de formato, todos comparan su caso
   con un ejemplo. */
.ee-run{
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:clamp(1.35rem, 3vw, 1.9rem);
  align-self:start; }
.ee-run .rot{
  margin:0 0 .5rem; font-size:var(--t-xs); color:var(--mut); letter-spacing:.04em; }
/* La tarjeta lleva cinco bloques y es la que fija la altura de la fila:
   sus separaciones van ajustadas, para no obligar a la columna de al lado
   a estirarse más de la cuenta. */
.ee-run .mal-rot{
  margin-top:1.25rem; padding-top:.9rem; border-top:1px solid var(--ln);
  display:flex; align-items:center; gap:.45rem; }
/* El «NO» es la única palabra que separa la lista buena de la mala. En
   minúscula corrida se pasaba por alto justo donde importa. */
.ee-run .mal-rot b{
  font-family:var(--mono); font-size:.72rem; font-weight:600;
  letter-spacing:.08em; color:#fff; background:var(--danger);
  border-radius:4px; padding:.1rem .4rem; }
/* ── LA IMITACIÓN DE LA PANTALLA DE ACCESO ──
   Los dos campos se llenan con el MISMO RUN, uno después del otro. Eso es
   exactamente lo que la gente no entiende: que la contraseña no es otra
   cosa, es el mismo número. Verlo escribirse dos veces lo dice sin que
   haya que leerlo.
   Los rótulos y el botón son los de la pantalla verdadera —«Correo o
   RUN», «Contraseña», «Ingresar»— para que se reconozca al llegar allá.
   El estilo, en cambio, es el de este sitio: es una ilustración dentro de
   esta página, no una captura. */
.ee-login{
  background:var(--nav); border-radius:var(--r);
  padding:clamp(1.1rem, 3vw, 1.5rem);
  display:flex; flex-direction:column; gap:.85rem; }
.ee-login .titulo{
  margin:0 0 .15rem; font-family:var(--serif); font-weight:600;
  font-size:1.02rem; color:#fff; letter-spacing:-.012em;
  font-variation-settings:'opsz' 40; }
.ee-login .campo{ display:flex; flex-direction:column; gap:.3rem; }
.ee-login .et{ font-size:var(--t-xs); color:rgba(255,255,255,.66); }
.ee-login .caja{
  background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.2);
  border-radius:var(--r-sm); padding:.6rem .75rem; min-height:2.55rem;
  display:flex; align-items:center; }
.ee-login .caja code{
  font-family:var(--mono); font-size:1rem; color:#fff;
  background:none; padding:0; }
.ee-login .boton{
  align-self:flex-start; margin-top:.25rem;
  background:var(--acc-nav); color:var(--nav);
  border-radius:var(--r-sm); padding:.5rem 1.1rem;
  font-size:var(--t-sm); font-weight:600; }
.ee-run .aviso{
  margin:.65rem 0 .9rem; font-size:var(--t-xs); line-height:1.5; color:var(--mut); }

.ee-run .lead{ margin:0 0 .8rem; font-size:var(--t-sm); color:var(--ink2); }
.ee-run .lead b{ font-family:var(--mono); color:var(--ink); font-weight:500;
                  white-space:nowrap; }

/* Lo que hay que escribir. En verde de estado —no decorativo— y en la
   mono, porque es un dato que se copia carácter por carácter. */
.ee-run .bien{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  background:var(--ok-sf); border:1px solid var(--ok-bd);
  border-radius:var(--r-sm); padding:.9rem 1.1rem; }
.ee-run .bien code{
  font-family:var(--mono); font-size:clamp(1.15rem, 1rem + .8vw, 1.5rem);
  font-weight:500; letter-spacing:.06em; color:var(--ok); background:none; padding:0; }

/* ── EL TECLEO ──
   El RUN se escribe solo. No es adorno: el formato es lo que más cuesta de
   toda la página, y verlo teclear muestra el orden y el largo mejor que
   verlo quieto — dónde entra el guion, que no aparecen puntos por el
   camino, que el último dígito también se escribe.

   ⚠️ El texto está COMPLETO en el HTML y la animación sólo lo tapa con
   `width`. Si no corre, se lee entero: es la misma regla del revelado —
   nada de lo que se necesita leer puede depender de que una animación
   arranque. Por eso el ancho final es el estado por defecto y la
   animación se aplica sólo bajo `html.js`.

   `ch` como unidad: en una fuente monoespaciada, 1ch es exactamente un
   carácter, así que `steps(10)` avanza un carácter por paso y el corte
   nunca cae a mitad de un número. Con cualquier otra unidad habría que
   ajustar el número a ojo cada vez que cambie el tamaño de letra.

   ⚠️ Y por eso este elemento va SIN `letter-spacing`. `.bien code` lleva
   `.06em`, que se agrega DESPUÉS de cada carácter: diez caracteres no
   miden 10ch sino 10ch más ese sobrante, y la caja quedaba corta. El «9»
   final —el dígito verificador, justo el que la página insiste en no
   olvidar— no llegaba a verse nunca, ni siquiera al terminar de escribir.

   Se intentó compensarlo con `calc(10ch + .6em)` y seguía faltando un par
   de píxeles: el ancho real de `1ch` y el avance del carácter no son
   exactamente lo mismo en esta fuente. Perseguir esa diferencia es pelear
   con la aritmética; quitar el espaciado la elimina, y `10ch` vuelve a
   ser diez caracteres exactos por definición. Se compensa con un pelo más
   de cuerpo, que además se lee mejor. */
.ee-run .tecleo{ display:inline-flex; }
.ee-run .tecleo span{
  display:inline-block; overflow:hidden; white-space:nowrap;
  letter-spacing:0;
  width:10ch;                       /* estado final: el RUN completo */
  border-right:2px solid transparent; }

/* ⚠️ Los dos campos se escriben POR TURNOS, no a la vez: primero el de
   arriba y después el de abajo, con la misma pausa que haría una persona.
   Simultáneos se leerían como un solo campo ancho, y lo que hay que
   entender es justamente que son DOS y llevan lo mismo.
   El turno se consigue con un retardo, no con animaciones distintas: el
   ciclo dura lo mismo para los dos y el segundo entra a la mitad. */
html.js .ee-run .tecleo span{
  border-right-color:var(--acc-nav);
  animation:eeTecleo1 8s steps(10, end) infinite,
            eeCursor 760ms steps(1, end) infinite; }
html.js .ee-run .t2 span{ animation-name:eeTecleo2, eeCursor; }

/* ⚠️ DOS JUEGOS DE FOTOGRAMAS, no un retardo. Con `animation-delay` los
   dos campos quedan desfasados PARA SIEMPRE: cuando el primero vuelve a
   empezar, el segundo todavía está lleno, y por un momento parece que la
   contraseña se escribió antes que el usuario — justo al revés de lo que
   la animación viene a enseñar.
   Con un ciclo compartido y dos recorridos distintos, los dos se vacían
   en el mismo instante y se escriben por turnos dentro de ese ciclo. */
@keyframes eeTecleo1{
  0%, 4%    { width:0; }        /* el usuario se escribe primero */
  26%, 100% { width:10ch; }
}
@keyframes eeTecleo2{
  0%, 34%   { width:0; }        /* y la contraseña, después */
  56%, 100% { width:10ch; }
}
@keyframes eeCursor{ 50%{ border-right-color:transparent; } }

@media (prefers-reduced-motion: reduce){
  /* Sin movimiento: los dos RUN completos y sin cursor parpadeando. */
  html.js .ee-run .tecleo span{ animation:none; width:10ch;
                                border-right-color:transparent; }
}
.ee-run .bien .marca{
  display:grid; place-items:center; flex:none;
  width:28px; height:28px; border-radius:50%; background:var(--ok); color:#fff; }
.ee-run .bien .marca svg{ width:15px; height:15px; }

.ee-run .reglas{
  list-style:none; margin:.85rem 0 0; padding:0;
  display:flex; flex-wrap:wrap; gap:.4rem .5rem; }
.ee-run .reglas li{
  font-size:var(--t-xs); color:var(--ok); background:var(--ok-sf);
  border:1px solid var(--ok-bd); border-radius:99px; padding:.15rem .6rem; }

/* Los tres errores. Van con el RUN tachado: se reconoce el propio error
   sin leer la explicación, que es justamente el punto. */
.ee-run .mal{ list-style:none; margin:0; padding:0;
              display:flex; flex-direction:column; gap:.42rem; }
.ee-run .mal li{
  display:flex; align-items:baseline; gap:.7rem; flex-wrap:wrap;
  font-size:var(--t-xs); }
.ee-run .mal code{
  font-family:var(--mono); font-size:var(--t-sm); color:var(--mut);
  white-space:nowrap;
  text-decoration:line-through; text-decoration-color:var(--danger);
  background:none; padding:0; }
.ee-run .mal em{ font-style:normal; color:var(--mut); }
.ee-run .nota{
  margin:.95rem 0 0; padding-top:.8rem; border-top:1px solid var(--ln);
  font-size:var(--t-xs); line-height:1.5; color:var(--mut); }
/* ⚠️ `nowrap`. El navegador trata el guion de «12345678-K» como un punto
   de corte legítimo y partía el RUN en dos renglones —«12345678-» arriba
   y «K.» abajo—, que es exactamente el error que esta página pide no
   cometer. Un RUN no se parte nunca, ni en una nota al pie. */
.ee-run .nota code{ font-family:var(--mono); color:var(--ink); background:none;
                    white-space:nowrap; }

/* ── PASOS EN VERTICAL ──
   Los mismos tres pasos, uno bajo otro y leyéndose de izquierda a derecha
   dentro de cada fila.
   ⚠️ En tres columnas quedaban estrechos: cada título se partía en dos
   renglones, cada descripción en tres, y al lado —en la otra mitad de la
   sección— había una tarjeta alta y llena. Dos columnas de altura muy
   distinta se ven desbalanceadas por más que cada una esté bien resuelta.
   En vertical los pasos ocupan el alto que la tarjeta de al lado ya tenía,
   el texto deja de partirse, y de paso se leen como lo que son: una
   secuencia, no tres opciones. */
.ee-pasos.ee-pasos-2{
  grid-template-columns:1fr; gap:.75rem;
  margin-top:clamp(1.5rem, 3vw, 2rem); }
.ee-pasos.ee-pasos-2 li{
  display:grid; grid-template-columns:auto auto 1fr;
  align-items:center; align-content:center; gap:.35rem 1rem;
  padding:1.1rem 1.25rem; }
/* El número deja la esquina y pasa al principio de la fila: en una lista
   vertical, el orden se lee al comienzo del renglón, no arriba a la
   derecha. */
.ee-pasos.ee-pasos-2 .n{
  position:static; grid-row:1 / 3; align-self:center;
  font-size:1.75rem; line-height:1; }
.ee-pasos.ee-pasos-2 .marca{ grid-row:1 / 3; margin-bottom:0; }
.ee-pasos.ee-pasos-2 h3{ grid-column:3; align-self:end; margin:0; padding-right:0; }
.ee-pasos.ee-pasos-2 p{ grid-column:3; align-self:start; }

@media (max-width: 520px){
  /* Sin ancho para tres columnas dentro de la fila: el icono se va y
     quedan el número y el texto, que es lo que no se puede perder. */
  .ee-pasos.ee-pasos-2 li{ grid-template-columns:auto 1fr; }
  .ee-pasos.ee-pasos-2 .marca{ display:none; }
  .ee-pasos.ee-pasos-2 h3, .ee-pasos.ee-pasos-2 p{ grid-column:2; }
}

/* Reproductor de video. Se conserva aunque hoy no lo use ninguna página:
   el video del Aula Virtual se retiró por estar desactualizado y va a
   volver. Son seis líneas, y borrarlas sólo obligaría a escribirlas de
   nuevo. */
.ee-video{
  margin-top:clamp(1.75rem, 3.5vw, 2.5rem);
  border:1px solid var(--ln); border-radius:var(--r); box-shadow:var(--sh);
  overflow:hidden; background:#000; }
.ee-video video{ display:block; width:100%; height:auto; aspect-ratio:16/9; }

/* ------------------- 8q · EL VISOR DE BROCHURES ---------------------- */
/* El folleto de un curso, dentro del sitio. Hereda del diálogo de
   pasajes las decisiones que ya costaron encontrar: sin `position:relative`
   —el navegador ya lo pone `fixed` y pisarlo hacía saltar la vista al
   inicio— y con el botón de cerrar en `absolute`, no flotado.
   Es más ancho que el de pasajes porque acá se lee una página A4, no dos
   versículos. */
/* ⚠️ `display:flex` SÓLO CON `[open]`, y esto no es una sutileza.
   Un `<dialog>` cerrado lo esconde el navegador con `display:none` en su
   hoja de estilos. Una regla propia que declare `display:flex` sin
   condición la pisa SIEMPRE —cerrado incluido— y el diálogo queda
   dibujado en medio de la página: al pulsar cerrar desaparecía el PDF
   pero el recuadro seguía ahí, vacío, y sólo se iba recargando.
   Todo lo demás puede ir en la regla sin `[open]`; el `display` no.
   Es de la misma familia que el `position:relative` que hubo que sacar
   del diálogo de pasajes: pisarle al `<dialog>` lo que el navegador le da
   por ser modal siempre termina mal. */
.ee-visor{
  width:min(880px, calc(100vw - 2.5rem));
  height:min(88vh, 1000px);
  padding:clamp(1.1rem, 3vw, 1.6rem);
  border:1px solid var(--ln); border-radius:var(--r);
  background:var(--sf); color:var(--ink2);
  box-shadow:var(--sh-lg, 0 24px 60px -18px rgba(16,24,40,.4));
  overflow:hidden; }
.ee-visor[open]{ display:flex; flex-direction:column; gap:.9rem; }
.ee-visor::backdrop{ background:rgba(7,17,41,.62); backdrop-filter:blur(2px); }
.ee-visor .cerrar-form{ margin:0; }
/* `absolute` y no `float`: flotado, el elemento que venía después pintaba
   encima de su mitad inferior y sólo el borde de arriba respondía al
   clic. Es el mismo error que ya se corrigió en el diálogo de pasajes. */
.ee-visor .cerrar{
  position:absolute; top:.85rem; right:.85rem; z-index:2;
  display:grid; place-items:center; width:34px; height:34px;
  border:1px solid var(--ln); border-radius:50%;
  background:var(--sf); color:var(--mut); cursor:pointer;
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.ee-visor .cerrar:hover{ background:var(--sf3); color:var(--ink); }
.ee-visor .cerrar svg{ width:15px; height:15px; }
.ee-visor .rot{
  margin:0; padding-right:2.75rem;
  font-family:var(--serif); font-weight:600; font-size:1.15rem;
  letter-spacing:-.015em; color:var(--ink);
  font-variation-settings:'opsz' 48, 'SOFT' 0, 'WONK' 0; }
/* El marco crece con el diálogo: el PDF ocupa todo el alto disponible,
   que es lo que hace que valga la pena verlo acá y no en otra pestaña. */
.ee-visor .marco{
  flex:1; min-height:0; border-radius:var(--r-sm); overflow:hidden;
  border:1px solid var(--ln); background:var(--sf3); }
.ee-visor .marco iframe{ width:100%; height:100%; border:0; display:block; }
.ee-visor .pie{
  display:flex; align-items:baseline; justify-content:space-between; gap:1rem;
  margin:0; font-size:var(--t-xs); color:var(--mut); }

/* El botón que lo abre. Discreto dentro de la tarjeta de curso de la
   malla: ahí compite con el nombre del curso, que es lo que manda. */
.ee-brochure{
  display:inline-flex; align-items:center; gap:.4rem;
  margin-top:.15rem; font-size:var(--t-xs); font-weight:600;
  color:var(--et-ink, var(--acc)); text-decoration:none;
  border-bottom:1px solid transparent;
  transition:border-color var(--t-fast) var(--ease); }
.ee-brochure:hover{ border-bottom-color:currentColor; text-decoration:none; }
.ee-brochure svg{ width:14px; height:14px; flex:none; }
/* Cuando se le pasan clases de botón —la ficha de curso— manda el botón y
   se descartan los adornos de arriba. */
.ee-brochure.ee-btn{ margin-top:0; border-bottom:0; font-size:var(--t-sm); }
.ee-brochure.ee-btn:hover{ border-bottom:0; }

@media (max-width: 820px){
  /* El visor no se usa en el teléfono —Safari de iOS no dibuja PDF dentro
     de un iframe— así que estas reglas no llegan a aplicarse. Se dejan por
     si el diálogo se abre en una tableta angosta. */
  .ee-visor{ width:calc(100vw - 1.5rem); height:calc(100vh - 3rem); }
}

.ee-pasaje{
  width:min(560px, calc(100vw - 2.5rem)); max-height:min(78vh, 720px);
  padding:clamp(1.5rem, 4vw, 2.25rem);
  border:1px solid var(--ln); border-radius:var(--r);
  background:var(--sf); color:var(--ink2); box-shadow:var(--sh-lg, 0 24px 60px -18px rgba(16,24,40,.4));
  overflow:auto; }
/* ⚠️ NADA de `position:relative` acá. El navegador le da al diálogo modal
   `position:fixed` para sacarlo del flujo y centrarlo en la ventana;
   pisarlo con `relative` lo devolvía al flujo, arriba de todo, y producía
   dos síntomas que parecían no tener relación: al abrirlo desde media
   página la vista SALTABA AL INICIO, y el botón de cerrar quedaba fuera
   del recuadro visible.
   No hace falta: un elemento `fixed` ya es bloque contenedor de sus hijos
   absolutos, así que el sello de abajo se ancla igual.

   EL SELLO DE LA ESCUELA, en grande y por detrás del texto. Es el mismo
   gesto del héroe —el emblema como textura— en el único lugar del sitio
   que se abre encima de todo lo demás. Antes acá iba el logotipo
   horizontal a 132px y al 9%: no se veía. */
/* El emblema redondo de la IGLESIA —el círculo con la R y la cruz, sin el
   aro de letras de la escuela—. Es el mismo `logo-renacer.png` que usa
   Ekklesia, así que los dos sistemas firman con la misma marca.
   ⚠️ Queda ENTERO DENTRO del recuadro. Un primer intento lo sacaba por el
   borde (`right:-14%`) contando con que `overflow:auto` lo recortara, y no
   lo hace: se salía sobre el velo y se veía como un error. */
.ee-pasaje::before{
  content:""; position:absolute; z-index:0; pointer-events:none;
  right:1.5%; bottom:2.5%; width:min(250px, 56%); aspect-ratio:1;
  background:url("img/emblema-renacer.png") center/contain no-repeat;
  opacity:.07; }
.ee-pasaje > *{ position:relative; z-index:1; }
.ee-pasaje::backdrop{
  background:rgba(7,17,41,.62);
  -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); }
/* Entrada corta: el diálogo aparece, no actúa. */
.ee-pasaje[open]{ animation:eePasajeEntra 220ms var(--ease); }
.ee-pasaje[open]::backdrop{ animation:eeVeloEntra 220ms var(--ease); }
@keyframes eePasajeEntra{ from{ opacity:0; transform:translateY(10px) scale(.985); }
                          to{ opacity:1; transform:none; } }
@keyframes eeVeloEntra{ from{ opacity:0; } to{ opacity:1; } }

/* ⚠️ NO va flotado. Con `float:right`, el <p> de la referencia —que viene
   DESPUÉS en el marcado— conserva su caja a todo el ancho por debajo del
   flotado: sólo sus líneas de texto se acortan. Y como `.ee-pasaje > *`
   les da a todos los hijos `z-index:1`, ese párrafo posterior pintaba
   ENCIMA del botón y se comía los clics de su mitad inferior. El síntoma
   era exacto: la X sólo respondía por el borde de arriba.
   Posicionado absoluto sale del flujo de verdad y nadie se le monta. */
.ee-pasaje .cerrar-form{ position:absolute; top:.85rem; right:.85rem; z-index:3; margin:0; }
/* Y la referencia deja libre esa esquina, para no pasar por debajo. */
.ee-pasaje .ref{ padding-right:2.75rem; }
.ee-pasaje .cerrar{
  display:flex; align-items:center; justify-content:center;
  width:32px; height:32px; border-radius:var(--r-sm);
  background:none; border:1px solid transparent; color:var(--mut); cursor:pointer;
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.ee-pasaje .cerrar:hover{ background:var(--sf3); color:var(--ink); }
.ee-pasaje .cerrar svg{ width:16px; height:16px; }

/* La referencia arriba, en la familia de la Escritura. */
.ee-pasaje .ref{
  margin:0 0 1.1rem; font-family:var(--sans); font-size:var(--t-sm);
  font-weight:700; letter-spacing:.03em; color:var(--escritura); }

/* El texto, en la serif: es la Palabra, y en el sitio la Palabra se lee
   en serif. Sin cursiva —acá es un pasaje para leer, no una cita corta
   dentro de otra frase— y con el número de versículo volado. */
.ee-pasaje .cuerpo p{
  font-family:var(--serif); font-size:1.14rem; line-height:1.62;
  color:var(--ink); margin:0 0 .75rem;
  font-variation-settings:'opsz' 20, 'SOFT' 0, 'WONK' 0; }
.ee-pasaje .cuerpo p:last-child{ margin-bottom:0; }
.ee-pasaje .cuerpo .v{
  font-family:var(--mono); font-size:.66em; font-weight:500;
  color:var(--escritura); vertical-align:.35em; margin-right:.4em;
  font-variant-numeric:tabular-nums; }
.ee-pasaje .cargando,
.ee-pasaje .error{ font-family:var(--sans); font-size:var(--t-sm); color:var(--mut); }
.ee-pasaje .error{ color:var(--danger); }

.ee-pasaje .pie{
  display:flex; flex-wrap:wrap; gap:.4rem 1rem; justify-content:space-between;
  align-items:baseline; margin:1.6rem 0 0; padding-top:1rem;
  border-top:1px solid var(--ln); font-size:var(--t-xs); }
.ee-pasaje .version{ color:var(--mut); }
/* Nota al pie del pasaje. Hoy la usa un solo caso: la Reina-Valera 1909
   numera 2 Corintios 13:14 como 13, y sin decirlo el lector pincha un «14»
   y ve un «13» sin explicación. */
.ee-pasaje .nota{
  margin:1.1rem 0 0; padding-top:.85rem; border-top:1px solid var(--ln);
  font-size:var(--t-xs); line-height:1.5; color:var(--mut); }

@media (prefers-reduced-motion: reduce){
  .ee-pasaje[open], .ee-pasaje[open]::backdrop{ animation:none; }
}

/* Etiqueta sólo para lectores de pantalla. El buscador tiene su marcador
   de posición como pista visual, pero un `placeholder` NO es una etiqueta:
   desaparece al escribir y muchos lectores no lo anuncian. */
.vo{
  position:absolute; width:1px; height:1px; margin:-1px; padding:0;
  overflow:hidden; clip-path:inset(50%); white-space:nowrap; border:0; }

/* ------------------- 8p · LA GUÍA Y SU CONTEXTO --------------------- */
/* La guía a la izquierda, el mapa de la ruta a la derecha. Sola y
   centrada, la guía dejaba medio ancho en blanco y —peor— hacía responder
   a ciegas: no se veía contra qué se está uno ubicando. */
.ee-guia-duo{
  display:grid; gap:clamp(1.5rem, 3.5vw, 2.75rem);
  grid-template-columns:minmax(0, 1.4fr) minmax(0, .85fr);
  align-items:start; }
/* Dentro del dúo la guía ya no se centra: la columna la ubica. */
.ee-guia-duo .ee-guia{ max-width:none; margin-inline:0; }

.ee-guia-ruta{
  position:sticky; top:calc(var(--barra-h) + 1.5rem);
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:clamp(1.25rem, 2.5vw, 1.7rem); }
.ee-guia-ruta .rot{
  margin:0 0 1rem; font-size:var(--t-xs); color:var(--mut);
  letter-spacing:.04em; }
.ee-guia-ruta ol{ list-style:none; margin:0 0 1.15rem; padding:0;
                  display:flex; flex-direction:column; gap:.55rem; }
.ee-guia-ruta li{
  display:flex; align-items:center; gap:.7rem;
  padding:.55rem .7rem; border-radius:var(--r-sm);
  background:var(--et-sf); border:1px solid var(--et-bd); }
.ee-guia-ruta .n{
  display:grid; place-items:center; flex:none;
  width:26px; height:26px; border-radius:50%;
  background:var(--et-ink); color:#fff;
  font-family:var(--mono); font-size:.72rem; }
.ee-guia-ruta .t{ display:flex; flex-direction:column; min-width:0; line-height:1.3; }
.ee-guia-ruta b{ font-size:var(--t-sm); font-weight:600; color:var(--ink); }
.ee-guia-ruta em{ font-style:normal; font-size:var(--t-xs); color:var(--et-ink); }
.ee-guia-ruta .pie{
  margin:0 0 1.1rem; font-size:var(--t-xs); line-height:1.5; color:var(--mut); }

@media (max-width: 900px){
  /* En angosto la guía manda: el mapa de la ruta pasa abajo y deja de ser
     fijo, que en un teléfono se comería media pantalla. */
  .ee-guia-duo{ grid-template-columns:1fr; }
  .ee-guia-ruta{ position:static; }
}

/* Un `h3` que debe verse como titular de sección. Se usa cuando dentro de
   una sección hay un segundo bloque con su propio encabezado: el nivel de
   encabezado tiene que bajar —o el documento queda con dos h2 hermanos
   sin jerarquía entre ellos— pero el peso visual es el mismo. */
.como-h2{
  font-family:var(--serif); font-weight:600; font-size:var(--t-h2);
  letter-spacing:-.022em; line-height:1.12; margin:0;
  font-variation-settings:'opsz' 72, 'SOFT' 0, 'WONK' 0; }

/* --------------------- 8o · EL MAPA Y LOS DATOS ---------------------- */
/* Mapa a la izquierda, datos a la derecha, misma altura. Antes esta
   sección era dos columnas de texto —dirección y redes— y no tenía ni una
   imagen: la única página que dice dónde queda la iglesia no mostraba
   dónde queda. */
/* Los cinco paneles están en el HTML y el script muestra uno. Sin
   JavaScript se ven los cinco, uno tras otro, cada uno con su mapa y su
   ficha — que es más largo pero está completo, y es lo que corresponde
   cuando la alternativa sería no ver ninguno. */
.ee-campus-galeria{ margin-top:clamp(1.75rem, 3.5vw, 2.5rem); }
/* ⚠️ `minmax(0, …)` y `align-items:start`, y las dos por la MISMA razón.
   El mapa tiene `aspect-ratio:16/10`. Con `align-items:stretch` y una
   ficha más alta al lado —la de Santiago, que es la única con tres
   horarios— el mapa se estiraba para igualar esa altura; y al estirarse,
   el `aspect-ratio` le hacía pedir el ancho que le corresponde a esa
   altura nueva. Una pista `1.15fr` sin mínimo explícito se lo concede:
   crece para acomodar ese ancho pedido, se lo roba a la ficha y se come
   el `gap`. Resultado medido a 1440px: el mapa terminaba en 675px y la
   ficha en 423px, pegados, cuando debían ser 611 y 452 con 36px de aire
   en medio.

   `minmax(0, …)` le pone un piso de cero a las dos pistas, así el
   contenido ya no puede estirarlas. `start` corta el problema de raíz: el
   mapa conserva su proporción y no se estira a la altura de la ficha.
   Que el mapa quede más bajo que la ficha no es un defecto — un mapa no
   tiene por qué medir lo mismo que una lista de horarios. */
.ee-campus-galeria .panel{
  display:grid; gap:clamp(1.25rem, 3vw, 2.25rem);
  grid-template-columns:minmax(0, 1.15fr) minmax(0, .85fr);
  align-items:start; }
.ee-campus-galeria .panel + .panel{ margin-top:clamp(1.25rem, 3vw, 2rem); }
/* Con script, sólo el activo. El `:not(.act)` va bajo `html.js` para que
   sin script no esconda nada. */
html.js .ee-campus-galeria .panel:not(.act){ display:none; }
html.js .ee-campus-galeria .panel + .panel{ margin-top:0; }
/* El cambio de campus no es una aparición: es un cambio de vista, y se
   nota mejor con un desplazamiento corto que con un fundido lento. */
html.js .ee-campus-galeria .panel.act{ animation:eeEntraPanel 380ms var(--ease) both; }
@keyframes eeEntraPanel{ from{ opacity:0; transform:translateY(8px); } }

/* `.ee-mapa-duo` vivía acá y se fue: era el par mapa+ficha de cuando la
   sección mostraba un solo campus. La galería la reemplazó y ninguna
   página la usa. Una regla huérfana no rompe nada, pero el próximo que
   lea este archivo va a tratar de entender para qué sirve. */
.ee-mapa{
  position:relative; overflow:hidden;
  border:1px solid var(--ln); border-radius:var(--r); box-shadow:var(--sh);
  background:var(--sf3);
  /* Proporción fija: sin esto el iframe colapsa a 150px de alto, que es el
     valor por defecto y no sirve para leer un mapa. */
  aspect-ratio:16 / 10; min-height:280px; }
.ee-mapa iframe{ position:absolute; inset:0; width:100%; height:100%; border:0;
                 /* El mapa de OSM viene en tonos cálidos y el sitio es
                    frío: un giro leve de matiz lo acerca a la paleta sin
                    volverlo ilegible. */
                 filter:saturate(.82) hue-rotate(-8deg); }

.ee-mapa-datos{ display:flex; flex-direction:column;
                background:var(--sf); border:1px solid var(--ln);
                border-radius:var(--r); box-shadow:var(--sh);
                padding:clamp(1.35rem, 3vw, 1.9rem); }
/* ⚠️ `.ee-ubicacion` y no `.ee-datos`, que era el nombre obvio y estaba
   TOMADO: la ficha de curso ya tiene un `.ee-datos` —la tabla de fechas,
   modalidad y cupos— con `justify-content:space-between`, filetes entre
   filas y el valor alineado a la derecha.
   Al reusar el nombre, las dos reglas convivían con la misma
   especificidad: las mías ganaban en lo que declaraban y las suyas seguían
   aplicando en todo lo demás. El resultado era una lista con bordes que yo
   no había puesto y el texto pegado a la derecha, sin nada en mi CSS que
   lo explicara. Un nombre de clase es un espacio de nombres global: antes
   de inventar uno, conviene buscarlo. */
.ee-ubicacion{ list-style:none; margin:0 0 auto; padding:0;
           display:flex; flex-direction:column; gap:1.15rem; }
.ee-ubicacion li{ display:flex; gap:.85rem; align-items:flex-start; }
.ee-ubicacion .ico{
  display:grid; place-items:center; flex:none;
  width:36px; height:36px; border-radius:50%;
  background:var(--acc-sf); color:var(--acc); }
.ee-ubicacion .ico svg{ width:18px; height:18px; }
.ee-ubicacion .t{ display:flex; flex-direction:column; align-items:flex-start;
              gap:.15rem; min-width:0; }
.ee-ubicacion b{ font-size:var(--t-sm); font-weight:600; color:var(--ink); line-height:1.35; }
.ee-ubicacion em{ font-style:normal; font-size:var(--t-xs); color:var(--mut); line-height:1.45; }
.ee-mapa-datos .ee-acciones{ margin-top:1.6rem; }
/* El nombre del campus encabeza su ficha: al cambiar de tarjeta, es lo
   que confirma que la ficha cambió. */
.ee-mapa-datos .titulo{
  margin:0 0 1.15rem; padding-bottom:.9rem; border-bottom:1px solid var(--ln);
  font-family:var(--serif); font-weight:600; font-size:1.22rem;
  letter-spacing:-.018em; color:var(--ink);
  font-variation-settings:'opsz' 48, 'SOFT' 0, 'WONK' 0; }

/* El Campus Virtual no tiene lugar que mostrar. Un mapa vacío sería un
   error; esto dice por qué no hay mapa. */
.ee-mapa .sin-mapa{
  position:absolute; inset:0; display:flex; flex-direction:column;
  align-items:center; justify-content:center; text-align:center;
  gap:.5rem; padding:clamp(1.5rem, 4vw, 2.5rem);
  background:var(--acc-sf); }
.ee-mapa .sin-mapa .marca{
  display:grid; place-items:center; width:52px; height:52px; border-radius:50%;
  background:var(--acc); color:#fff; margin-bottom:.35rem; }
.ee-mapa .sin-mapa .marca svg{ width:25px; height:25px; }
.ee-mapa .sin-mapa b{ font-size:var(--t-sm); color:var(--ink); }
.ee-mapa .sin-mapa p{ margin:0; max-width:32ch; font-size:var(--t-xs);
                      line-height:1.55; color:var(--ink2); }

@media (max-width: 820px){
  /* ⚠️ `minmax(0, 1fr)` ACÁ TAMBIÉN. El comentario de arriba ya explica
     por qué esta columna necesita el piso de cero: la versión de dos
     columnas lo tiene, y esta —una sola columna, en teléfono— se había
     quedado con un `1fr` a secas. El mapa (`.ee-mapa`, el `<iframe>` de
     OpenStreetMap) tiene su propio ancho mínimo, y sin la protección era
     él quien empujaba la fila —y con ella la página entera— más ancha
     que la pantalla: confirmado, 16px de desplazamiento horizontal en
     Campus Santiago a 375px de ancho. */
  .ee-campus-galeria .panel{ grid-template-columns:minmax(0, 1fr); }
  /* ⚠️ `width:100%` ES LA PARTE QUE FALTABA, Y ES OTRO BUG, NO EL MISMO.
     Con `min-height:280px` puesto y una sola columna de 338px, la
     proporción 4:3 —ancho:alto— hace lo suyo pero al revés de lo que se
     necesita: para llegar a 280px de alto Y mantener 4:3, el navegador no
     achica el alto, AGRANDA el ancho —280 × 4/3 = 373px—, más ancho que
     la columna. El mapa terminaba más ancho que su propia celda, aunque
     la celda ya estuviera bien medida. `width:100%` deja el ancho
     definido de antemano; con eso puesto, `aspect-ratio` calcula el ALTO
     a partir del ancho —no al revés— y `min-height` sólo puede estirar
     ese alto, nunca el ancho. */
  .ee-mapa{ aspect-ratio:4 / 3; width:100%; }
}

/* ------------- 8o-bis · EL ESQUEMA DEL HÍBRIDO Y LOS PASOS ---------- */
/* Dos entradas que desembocan en una sola clase. Es la definición de
   «híbrido» dibujada, y ocupa la columna que antes quedaba vacía al lado
   del texto. Dibujarlo ahorra el párrafo que habría hecho falta para
   explicar la palabra. */
.ee-hibrido{
  display:flex; flex-direction:column; gap:.75rem;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:clamp(1.35rem, 3vw, 1.9rem);
  /* ⚠️ `center` y no `start`. El dúo alinea sus dos columnas por arriba,
     que es lo correcto cuando las dos son texto: sus primeras líneas
     coinciden y se leen en paralelo. Pero esta columna es UNA TARJETA, no
     un texto, y una tarjeta más corta que la columna de al lado, pegada
     al borde de arriba, se lee como si se hubiera quedado subida.
     Centrada, el aire sobrante se reparte y el bloque queda equilibrado.
     La regla general del dúo sigue en `start`: esto es la excepción de
     una tarjeta suelta frente a una columna de texto. */
  align-self:center; }
.ee-hibrido .via, .ee-hibrido .clase{
  display:flex; align-items:center; gap:.8rem;
  border-radius:var(--r-sm); padding:.8rem .9rem; }
.ee-hibrido .via{ background:var(--sf2); border:1px solid var(--ln); }
/* La clase es el destino, no una vía más: va en el tono pleno. */
.ee-hibrido .clase{ background:var(--acc); color:#fff; }
.ee-hibrido .ico{
  display:grid; place-items:center; flex:none;
  width:34px; height:34px; border-radius:50%;
  background:var(--acc-sf); color:var(--acc); }
.ee-hibrido .clase .ico{ background:rgba(255,255,255,.16); color:#fff; }
.ee-hibrido .ico svg{ width:17px; height:17px; }
.ee-hibrido .t{ display:flex; flex-direction:column; gap:.1rem; min-width:0; }
.ee-hibrido b{ font-size:var(--t-sm); font-weight:600; line-height:1.3; }
.ee-hibrido .via b{ color:var(--ink); }
.ee-hibrido em{ font-style:normal; font-size:var(--t-xs); color:var(--mut); }
.ee-hibrido .clase em{ color:rgba(255,255,255,.72); }

/* La unión: las dos vías desembocan abajo. Un trazo y no un icono, porque
   lo que dice es una relación y no una cosa.
   ⚠️ Antes esto dibujaba una llave —dos ramas curvándose hacia el centro—
   y se leía como una caja suelta entre las tarjetas, no como una
   confluencia. Una línea con punta hacia abajo dice lo mismo sin que haya
   que descifrarla. */
.ee-hibrido .union{
  height:30px; position:relative; margin:-.1rem 0; }
.ee-hibrido .union::before{
  content:""; position:absolute; left:50%; top:2px; width:2px; height:18px;
  transform:translateX(-50%); border-radius:2px;
  background:linear-gradient(var(--acc-bd), var(--acc)); }
/* La punta, en el mismo tono en que termina la línea. */
.ee-hibrido .union::after{
  content:""; position:absolute; left:50%; top:18px;
  width:9px; height:9px; transform:translateX(-50%) rotate(45deg);
  border-right:2px solid var(--acc); border-bottom:2px solid var(--acc);
  border-radius:0 0 2px 0; }

/* ── Los pasos para inscribirse ──
   Un proceso de tres pasos se muestra, no se cuenta en prosa. Numerados y
   en fila responden dos preguntas que un párrafo deja abiertas: cuántos
   son, y en cuál voy. */
.ee-pasos{
  list-style:none; margin:clamp(2rem, 4vw, 2.75rem) 0 0; padding:0;
  display:grid; gap:clamp(.9rem, 2vw, 1.35rem);
  grid-template-columns:repeat(3, minmax(0, 1fr)); }
.ee-pasos li{
  position:relative; display:flex; flex-direction:column;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:1.35rem 1.4rem 1.4rem;
  transition:transform var(--t-med) var(--ease), border-color var(--t-fast) var(--ease); }
.ee-pasos li:hover{ transform:translateY(-3px); border-color:var(--acc-bd); }
/* El número, en la esquina y en grande: es el orden, y el orden es lo
   primero que hay que ver. */
.ee-pasos .n{
  position:absolute; top:1rem; right:1.25rem;
  font-family:var(--serif); font-size:2.1rem; line-height:1;
  color:var(--acc-bd); font-variant-numeric:lining-nums;
  font-variation-settings:'opsz' 40; }
.ee-pasos .marca{
  display:grid; place-items:center; width:40px; height:40px; border-radius:50%;
  background:var(--acc-sf); color:var(--acc); margin-bottom:.9rem; }
.ee-pasos .marca svg{ width:20px; height:20px; }
.ee-pasos h3{ margin:0 0 .35rem; font-size:1.02rem; letter-spacing:-.012em; padding-right:2rem; }
.ee-pasos p{ margin:0; font-size:var(--t-sm); line-height:1.55; color:var(--ink2); }
.ee-pasos .ir{
  display:inline-flex; align-items:center; gap:.35rem; margin-top:.9rem;
  font-size:var(--t-xs); font-weight:600; color:var(--acc); text-decoration:none; }
.ee-pasos .ir svg{ width:14px; height:14px; transition:transform var(--t-fast) var(--ease); }
.ee-pasos .ir:hover{ text-decoration:none; }
.ee-pasos .ir:hover svg{ transform:translateX(3px); }
/* Entran uno tras otro, en el orden en que se recorren. */
html.js .ee-revelar.ee-pasos li{
  opacity:0; transform:translateY(10px);
  transition:opacity 480ms var(--ease), transform 480ms var(--ease);
  transition-delay:calc(var(--i) * 90ms); }
html.js .ee-revelar.visible.ee-pasos li{ opacity:1; transform:none; }

@media (max-width: 820px){
  .ee-pasos{ grid-template-columns:1fr; }
}

/* -------------------- 8n · LAS CUATRO FASES, EN PARALELO -------------- */
/* Cuatro columnas y no una lista vertical. Como lista dejaban media
   sección en blanco y, peor, sugerían turnos que se esperan: la ruta se
   lee de arriba abajo como si hubiera que terminar una para empezar la
   siguiente. Las cuatro fases corren A LA VEZ durante el año —cada una su
   día de la semana—, y en paralelo eso se ve sin explicarlo.
   El tono de cada columna es el de su fase en la malla: el color enlaza
   los dos esquemas de la página. */
.ee-fases{
  list-style:none; margin:clamp(2rem, 4vw, 2.75rem) 0 0; padding:0;
  display:grid; gap:clamp(.9rem, 2vw, 1.35rem);
  grid-template-columns:repeat(4, minmax(0, 1fr)); align-items:stretch; }
.ee-fases > li{
  display:flex; flex-direction:column;
  background:var(--et-sf); border:1px solid var(--et-bd);
  border-radius:var(--r); padding:1.25rem 1.3rem 1.35rem;
  /* La barra superior en el tono pleno: es lo que hace que las cuatro se
     lean como una serie y no como cuatro tarjetas sueltas. */
  border-top:3px solid var(--et-ink);
  transition:transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease); }
.ee-fases > li:hover{ transform:translateY(-3px); box-shadow:var(--sh-md, var(--sh)); }

.ee-fases .cab{ display:flex; align-items:center; gap:.6rem; margin-bottom:.7rem; }
.ee-fases .cifra{
  display:grid; place-items:center; flex:none;
  width:30px; height:30px; border-radius:50%;
  background:var(--et-ink); color:#fff;
  font-family:var(--mono); font-size:.82rem; font-weight:500; }
.ee-fases .rot{
  font-family:var(--mono); font-size:var(--t-xs); letter-spacing:.08em;
  text-transform:uppercase; color:var(--et-ink); }
.ee-fases h3{ margin:0 0 .3rem; font-size:1.08rem; letter-spacing:-.015em; color:var(--ink); }
.ee-fases .dia{
  display:inline-flex; align-items:center; gap:.35rem;
  font-size:var(--t-xs); color:var(--et-ink); margin-bottom:.7rem; }
.ee-fases .dia svg{ width:14px; height:14px; }
.ee-fases > li > p{
  margin:0 0 1rem; font-size:var(--t-sm); line-height:1.55; color:var(--ink2); }

/* Los cursos de la fase. Lista con viñeta propia, no chips: son los
   contenidos de esa etapa y se leen en orden, no se eligen. */
.ee-fases .cursos{
  list-style:none; margin:auto 0 0; padding:.9rem 0 0;
  border-top:1px solid var(--et-bd);
  display:flex; flex-direction:column; gap:.4rem; }
.ee-fases .cursos li{
  position:relative; padding-left:.95rem;
  font-size:var(--t-xs); line-height:1.45; color:var(--ink2); }
.ee-fases .cursos li::before{
  content:""; position:absolute; left:0; top:.48em;
  width:5px; height:5px; border-radius:50%; background:var(--et-ink); opacity:.55; }

.ee-fases .conv{
  display:inline-flex; align-items:center; gap:.35rem;
  margin-top:.9rem; font-size:var(--t-xs); font-weight:600;
  color:var(--et-ink); text-decoration:none; }
.ee-fases .conv svg{ width:14px; height:14px;
                     transition:transform var(--t-fast) var(--ease); }
.ee-fases .conv:hover{ text-decoration:none; }
.ee-fases .conv:hover svg{ transform:translateX(3px); }

/* ⚠️ `minmax(0, …)` EN LAS DOS, IGUAL QUE LA BASE. Sin él, el ancho
   automático mínimo de cada columna es el de su contenido —y estas
   tarjetas llevan el nombre del curso completo, «Fase III · Formación» y
   una lista de cursos, texto que no siempre cabe en una fracción libre.
   Con el nombre de un curso más largo del que hay hoy, o con la fuente de
   respaldo del sistema en vez de Schibsted Grotesk —más ancha—, la
   tarjeta deja de caber en su columna, la columna deja de caber en la
   fila, y la página entera se puede desplazar de lado. No pasaba con el
   contenido actual: eso no lo hace seguro, lo hace un accidente que
   todavía no ocurrió. Mismo bug, mismo remedio, que `.ee-faq-marco` (§8m)
   y `.ee-campus-galeria .panel` (§8o). */
@media (max-width: 1000px){
  .ee-fases{ grid-template-columns:repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px){
  .ee-fases{ grid-template-columns:minmax(0, 1fr); }
}

/* ----------------- 8m · PREGUNTAS FRECUENTES ------------------------- */
/* Dos columnas: la navegación fija y las respuestas.
   Antes era una sola columna de 800px con doce acordeones cerrados, y dos
   tercios del ancho vacíos. La columna angosta va a la IZQUIERDA —al
   revés que el índice de la Declaración de Fe, que va a la derecha— y la
   diferencia es deliberada: allá se llega a leer un texto y el índice
   acompaña; acá se llega CON UNA PREGUNTA, y la herramienta para
   encontrarla tiene que estar donde el ojo empieza. */
.ee-faq-marco{
  display:grid; gap:clamp(1.75rem, 4vw, 3.25rem);
  grid-template-columns:minmax(0, 17rem) minmax(0, 1fr); align-items:start; }
.ee-faq-nav{ position:sticky; top:calc(var(--barra-h) + 1.5rem); }

/* ── El buscador ── */
/* ⚠️ Se ESCONDE sin JavaScript. Un campo de búsqueda que no busca es peor
   que no tener campo: promete algo y no lo cumple. La regla esconde
   cuando falta el script, nunca al revés — si se escribiera al revés, un
   fallo del script dejaría el buscador invisible y además roto. */
html:not(.js) .ee-buscar,
html:not(.js) .cuenta[data-faq-cuenta]{ display:none; }
.ee-buscar{
  position:relative; display:flex; align-items:center;
  background:var(--sf); border:1px solid var(--ln); border-radius:99px;
  box-shadow:var(--sh); padding:0 .5rem 0 .9rem;
  transition:border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease); }
.ee-buscar:focus-within{ border-color:var(--acc); box-shadow:0 0 0 4px var(--acc-sf); }
.ee-buscar .lupa{ display:grid; place-items:center; color:var(--mut); flex:none; }
.ee-buscar .lupa svg{ width:17px; height:17px; }
.ee-buscar input{
  flex:1; min-width:0; border:0; background:none; outline:none;
  font:inherit; font-size:var(--t-sm); color:var(--ink);
  padding:.72rem .6rem; }
.ee-buscar input::placeholder{ color:var(--mut); }
/* La cruz nativa del `type=search` la pone cada navegador a su manera y
   ninguna combina: se apaga y se usa el botón de al lado. */
.ee-buscar input::-webkit-search-cancel-button{ -webkit-appearance:none; appearance:none; }
.ee-buscar .limpiar{
  flex:none; display:grid; place-items:center; width:26px; height:26px;
  border:0; border-radius:50%; background:var(--sf3); color:var(--mut);
  cursor:pointer; transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.ee-buscar .limpiar:hover{ background:var(--acc-sf); color:var(--acc); }
.ee-buscar .limpiar svg{ width:13px; height:13px; }

.cuenta[data-faq-cuenta]{
  margin:.7rem 0 1.25rem .95rem; font-size:var(--t-xs); color:var(--mut);
  font-family:var(--mono); }

/* ── Las fichas de momento ── */
/* Cada una filtra: al elegirla, los otros momentos se ocultan. Por eso se
   dibujan como pestañas —fondo propio, estado activo pleno— y no como una
   lista de enlaces: una lista invita a saltar, una pestaña invita a
   cambiar de vista, y lo segundo es lo que hacen. */
.ee-faq-fichas{ display:flex; flex-direction:column; gap:.25rem; }
.ee-faq-fichas .ficha{
  display:flex; align-items:center; gap:.7rem;
  padding:.6rem .8rem; border-radius:var(--r-sm);
  border:1px solid transparent;
  color:var(--ink2); text-decoration:none; font-size:var(--t-sm);
  cursor:pointer;
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease),
             border-color var(--t-fast) var(--ease); }
.ee-faq-fichas .ficha:hover{ background:var(--sf3); color:var(--ink); text-decoration:none; }
.ee-faq-fichas .ficha.act{
  background:var(--acc); border-color:var(--acc); color:#fff; font-weight:600; }
.ee-faq-fichas .ico{
  display:grid; place-items:center; flex:none;
  width:30px; height:30px; border-radius:50%;
  background:var(--sf3); color:var(--acc);
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.ee-faq-fichas .ficha.act .ico{ background:rgba(255,255,255,.16); color:#fff; }
.ee-faq-fichas .ico svg{ width:16px; height:16px; }
.ee-faq-fichas .t{ display:flex; align-items:center; gap:.5rem; flex:1; min-width:0; }
/* El número de preguntas. Dice de antemano cuánto hay detrás de la ficha,
   que es la pregunta previa a pincharla. */
.ee-faq-fichas .t em{
  font-style:normal; font-family:var(--mono); font-size:.68rem;
  color:var(--mut); background:var(--sf3); border-radius:99px;
  padding:.05rem .42rem; margin-left:auto; flex:none; }
.ee-faq-fichas .ficha.act .t em{ background:rgba(255,255,255,.2); color:#fff; }
/* ── Lo que estás leyendo ──
   Con «Todas» puesta, los cuatro momentos están abajo uno tras otro y el
   recorrido se hace con la rueda, no con el ratón. Sin esta marca la
   columna se queda diciendo «Todas» durante cuatro pantallas: correcto,
   pero inútil justo cuando ya no se ve dónde empezó la sección.

   ⚠️ ES OTRO ESTADO, NO EL MISMO MÁS SUAVE. `.act` es lo que ELEGISTE y
   filtra; `.leyendo` es lo que estás MIRANDO y no filtra nada. Si se
   dibujaran igual, la marca prometería un filtro que no ocurrió. Por eso
   `.act` es relleno pleno y `.leyendo` es sólo un borde y un tinte: el
   peso visual dice cuál de los dos manda. Y por eso `:not(.act)` — una
   ficha elegida nunca se rebaja a ficha mirada. */
.ee-faq-fichas .ficha.leyendo:not(.act){
  background:var(--acc-sf); color:var(--acc); }
.ee-faq-fichas .ficha.leyendo:not(.act) .ico{ background:#fff; color:var(--acc); }
.ee-faq-fichas .ficha.leyendo:not(.act) .t em{ color:var(--acc); background:#fff; }

/* «Todas» no lleva icono, así que su texto se alinea con el de las demás
   dejando el hueco del aro. */
.ee-faq-fichas .ficha.todas{ padding-left:calc(.8rem + 30px + .7rem); }
/* Separa «Todas» del grupo: es de otra naturaleza, muestra el conjunto. */
.ee-faq-fichas .ficha.todas{ margin-bottom:.5rem; }

.ee-faq-ayuda{
  margin-top:1.5rem; padding-top:1.35rem; border-top:1px solid var(--ln); }
.ee-faq-ayuda p{ margin:0 0 .9rem; font-size:var(--t-xs); line-height:1.55; color:var(--mut); }
.ee-faq-ayuda b{ display:block; color:var(--ink); font-size:var(--t-sm); margin-bottom:.2rem; }

/* ── Los momentos ── */
.ee-faq-momento + .ee-faq-momento{ margin-top:clamp(2.5rem, 5vw, 3.75rem); }
/* Ancla bajo la barra fija: sin esto, saltar a un momento lo deja
   escondido detrás del menú. */
.ee-faq-momento{ scroll-margin-top:calc(var(--barra-h) + 1.25rem); }
.ee-faq-momento .cab{
  display:flex; align-items:flex-start; gap:.95rem;
  padding-bottom:1rem; margin-bottom:.35rem; border-bottom:1px solid var(--ln); }
.ee-faq-momento .marca{
  display:grid; place-items:center; flex:none;
  width:42px; height:42px; border-radius:50%;
  background:var(--acc); color:#fff; }
.ee-faq-momento .marca svg{ width:21px; height:21px; }
.ee-faq-momento h2{ margin:0; font-size:clamp(1.25rem, 1rem + .9vw, 1.6rem); }
.ee-faq-momento .cab p{ margin:.2rem 0 0; font-size:var(--t-sm); color:var(--mut); }

/* Sin resultados. */
.ee-faq-vacio{
  background:var(--sf); border:1px dashed var(--ln); border-radius:var(--r);
  padding:clamp(1.5rem, 3vw, 2.25rem); text-align:left; }
.ee-faq-vacio p{ margin:0; color:var(--ink2); }
.ee-faq-vacio b{ display:block; color:var(--ink); margin-bottom:.25rem; }

/* Lo que el filtro deja fuera. `display:none` y no `visibility`: tiene que
   dejar de ocupar sitio, o la lista filtrada queda llena de huecos. */
[data-faq-item][hidden], .ee-faq-momento[hidden]{ display:none !important; }

/* Resaltado de la palabra buscada. */
.ee-faq mark{
  background:var(--acc-sf); color:var(--acc);
  border-radius:3px; padding:0 .12em; font-weight:600; }

@media (max-width: 900px){
  /* La navegación pasa arriba y deja de ser fija: en un teléfono, una
     columna pegajosa se come media pantalla. El buscador se queda, que es
     lo que de verdad sirve acá. */
  /* ⚠️ `minmax(0, 1fr)` Y NO `1fr` A SECAS. La versión de escritorio, unas
     líneas arriba, ya usa `minmax(0, 17rem) minmax(0, 1fr)` por esta misma
     razón, y acá al pasar a una sola columna se perdió esa protección al
     escribirla de nuevo.
     Sin el `minmax(0, …)`, el tamaño AUTOMÁTICO MÍNIMO de la columna no es
     cero: es el ancho mínimo de su contenido. Y el contenido de esta
     columna incluye `.ee-faq-fichas`, la tira de pestañas con scroll
     horizontal propio (`overflow-x:auto`, más abajo) — pensada para
     desplazarse ADENTRO de su caja, nunca para estirarla. Sin el
     `minmax(0, …)` la columna entera crecía hasta caber las cinco fichas
     SIN scroll, se llevaba con ella el ancho de toda la página, y el
     resultado era exactamente lo que se veía: la página completa se podía
     desplazar de lado, no sólo la tira de pestañas.
     Mismo bug, mismo remedio, que el mapa de Campus Santiago (§8o). */
  .ee-faq-marco{ grid-template-columns:minmax(0, 1fr); gap:1.75rem; }
  .ee-faq-nav{ position:static; }
  /* En angosto las fichas se ponen en fila y se desplazan: cuatro
     pestañas apiladas se comen la pantalla antes de la primera pregunta. */
  .ee-faq-fichas{
    flex-direction:row; gap:.45rem; overflow-x:auto;
    padding-bottom:.35rem; scrollbar-width:thin;
    /* Que se note que hay más a la derecha. */
    -webkit-mask-image:linear-gradient(90deg, #000 88%, transparent 100%);
            mask-image:linear-gradient(90deg, #000 88%, transparent 100%); }
  .ee-faq-fichas .ficha{ border-color:var(--ln); background:var(--sf); flex:none; }
  .ee-faq-fichas .ficha.act{ background:var(--acc); border-color:var(--acc); }
  .ee-faq-fichas .ficha.todas{ padding-left:.8rem; margin-bottom:0; }
  .ee-faq-fichas .t em{ margin-left:.35rem; }
  /* En fila el icono sobra: el nombre alcanza y el aro roba ancho. */
  .ee-faq-fichas .ico{ display:none; }
  .ee-faq-ayuda{ display:none; }   /* la misma ayuda está al pie de la página */
}

/* -------------------- 8l · LOS CAMPUS Y LA MODALIDAD ----------------- */
/* La escuela es de toda la iglesia, no del campus de Santiago. Cuatro
   sedes con dirección y un Campus Virtual que no es un lugar sino la
   manera de estar en las cuatro a la vez. */
.ee-campus{
  list-style:none; margin:clamp(2rem,4vw,2.75rem) 0 0; padding:0;
  display:grid; gap:clamp(.9rem, 2vw, 1.25rem);
  grid-template-columns:repeat(auto-fit, minmax(min(100%, 200px), 1fr)); }
/* La tarjeta ES el enlace: el objetivo táctil es la tarjeta entera, no
   su título. Sin script lleva al mapa de ese campus; con script, lo
   selecciona en la galería de arriba. */
.ee-campus li{ display:flex; }
.ee-campus a{
  display:block; width:100%; text-decoration:none; color:inherit; cursor:pointer;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:1.15rem 1.25rem 1.25rem;
  transition:border-color var(--t-fast) var(--ease), transform var(--t-med) var(--ease),
             box-shadow var(--t-fast) var(--ease); }
.ee-campus a:hover{ border-color:var(--acc-bd); transform:translateY(-2px);
                    text-decoration:none; }
/* El campus que se está mirando. Filete grueso arriba y no un fondo
   distinto: el fondo lo usa el Campus Virtual para decir otra cosa. */
.ee-campus a.act{
  border-color:var(--acc); box-shadow:0 0 0 1px var(--acc), var(--sh);
  transform:translateY(-2px); }
.ee-campus a.act .marca{ background:var(--acc); color:#fff; }
.ee-campus a .marca{
  display:grid; place-items:center; width:36px; height:36px; border-radius:50%;
  background:var(--acc-sf); color:var(--acc); margin-bottom:.85rem; }
.ee-campus a .marca svg{ width:18px; height:18px; }
.ee-campus a h3{ margin:0 0 .25rem; font-size:1.02rem; letter-spacing:-.012em; }
.ee-campus a p{ margin:0; font-size:var(--t-sm); line-height:1.5; color:var(--ink2); }

/* El Campus Virtual se distingue: no es una ciudad más de la lista. El
   borde punteado dice «éste no tiene dirección» sin escribirlo. */
.ee-campus a.virtual{
  background:var(--acc-sf); border-style:dashed; border-color:var(--acc-bd); }
.ee-campus a.virtual .marca{ background:var(--acc); color:#fff; }

/* Cada tarjeta entra detrás de la anterior. */
html.js .ee-revelar.ee-campus a{
  opacity:0; transform:translateY(10px);
  transition:opacity 480ms var(--ease), transform 480ms var(--ease);
  transition-delay:calc(var(--i) * 80ms); }
html.js .ee-revelar.visible.ee-campus a{ opacity:1; transform:none; }

/* Las tres modalidades. Fila de definiciones, no tarjetas: son las
   respuestas a una sola pregunta —«¿tengo que ir?»— y conviene leerlas
   juntas y de corrido. */
.ee-modalidades{
  display:grid; gap:clamp(.9rem, 2vw, 1.5rem);
  /* 185px y no 220: dentro de la columna del texto —unos 640px— con 220
     sólo entraban dos y la tercera caía sola a una segunda fila. Son tres
     opciones de lo mismo y se comparan de un vistazo o no se comparan. */
  grid-template-columns:repeat(auto-fit, minmax(min(100%, 185px), 1fr));
  margin-top:clamp(1.75rem, 3.5vw, 2.5rem);
  padding-top:clamp(1.5rem, 3vw, 2rem); border-top:1px solid var(--ln); }
/* `align-content:start` para que las dos filas queden pegadas arriba. Sin
   eso, la tarjeta se estira a la altura de la más alta —la del medio, cuyo
   título ocupa dos renglones— y el sobrante se reparte entre el título y
   su descripción: quedaban separados por un hueco que en las otras dos no
   existía. */
.ee-modalidades .m{ display:grid; grid-template-columns:auto 1fr;
                    grid-template-rows:auto auto; gap:.15rem .75rem;
                    align-items:center; align-content:start; }
.ee-modalidades .ico{
  grid-row:1 / 3; align-self:start;
  display:grid; place-items:center; width:34px; height:34px; border-radius:50%;
  background:var(--sf3); color:var(--acc); }
.ee-modalidades .ico svg{ width:17px; height:17px; }
.ee-modalidades b{ font-size:var(--t-sm); font-weight:600; color:var(--ink); }
.ee-modalidades span:not(.ico){ font-size:var(--t-xs); color:var(--mut); line-height:1.45; }
.ee-modalidades .pie{
  grid-column:1 / -1; margin:.35rem 0 0;
  font-size:var(--t-xs); color:var(--mut); }

/* ------------------- 8k · LOS CINCO COMPROMISOS ---------------------- */
/* Cinco columnas colgando de un riel horizontal. Reemplaza a una lista
   numerada que decía lo mismo pero no mostraba nada: en una lista, que el
   4 dependa del 3 es una nota al pie; en un riel, es la forma.

   Por qué riel y no la línea vertical de `.ee-ruta`: son dos secuencias
   distintas y tienen que verse distintas. La ruta es un CAMINO que una
   persona recorre en el tiempo —por eso desciende, como una biografía—;
   esto es lo que la escuela SE COMPROMETE a hacer, y va de lado, como una
   cadena de montaje. Si las dos se dibujaran igual, la portada parecería
   decir dos veces lo mismo. */
.ee-compromisos{
  list-style:none; margin:clamp(2rem,4vw,2.75rem) 0 0; padding:0;
  display:grid; gap:clamp(1.1rem, 2.2vw, 1.75rem);
  grid-template-columns:repeat(5, 1fr); }
.ee-compromisos li{ position:relative; padding-top:calc(var(--ico) + 1.15rem); }

/* El riel. Va DETRÁS de los iconos, a la altura de su centro, y se aclara
   de izquierda a derecha: el degradado es la única forma de decir «esto
   tiene un sentido de avance» sin dibujar una flecha, que sería redundante
   con los números. */
.ee-compromisos::before{
  content:""; position:absolute; z-index:0;
  left:0; right:0; top:calc(var(--ico) / 2);
  height:1px;
  background:linear-gradient(90deg,
              var(--ln) 0%, var(--acc-bd) 45%, var(--acc) 100%);
  /* Se dibuja de izquierda a derecha al entrar en pantalla. `scaleX` y no
     `width`, porque `width` obliga al navegador a rehacer el diseño en
     cada cuadro y `transform` no toca el diseño en absoluto. */
  transform-origin:0 50%;
  transition:transform 900ms var(--ease); }
html.js .ee-revelar.ee-compromisos::before{ transform:scaleX(0); }
html.js .ee-revelar.visible.ee-compromisos::before{ transform:scaleX(1); }

/* La marca: el icono en un aro, sobre el fondo de la sección para que el
   riel pase por detrás y no lo cruce. */
.ee-compromisos .marca{
  position:absolute; top:0; left:0; z-index:1;
  width:var(--ico); height:var(--ico); border-radius:50%;
  display:grid; place-items:center;
  background:var(--bg); border:1px solid var(--acc-bd);
  color:var(--acc);
  transition:transform 420ms var(--ease), border-color var(--t-fast) var(--ease),
             box-shadow var(--t-fast) var(--ease); }
.ee-seccion.tenue .ee-compromisos .marca{ background:var(--sf2); }
.ee-seccion.papel .ee-compromisos .marca{ background:var(--sf); }
.ee-compromisos .marca svg{ width:22px; height:22px; }

/* Cada aro entra un poco después que el anterior, siguiendo al riel que
   se está dibujando. El escalonado usa `--i`, que la página escribe en
   cada <li>: así el retardo lo decide el orden real y no una lista de
   `:nth-child` que hay que ampliar cada vez que se agrega un ítem. */
html.js .ee-revelar.ee-compromisos li .marca{
  transform:scale(.55); opacity:0;
  transition-delay:calc(var(--i) * 110ms + 180ms); }
html.js .ee-revelar.visible.ee-compromisos li .marca{
  transform:none; opacity:1; }

.ee-compromisos .n{
  display:block; font-family:var(--mono); font-size:var(--t-xs);
  color:var(--mut); letter-spacing:.04em; margin-bottom:.3rem; }
.ee-compromisos h3{
  margin:0 0 .4rem; font-size:1rem; line-height:1.28; letter-spacing:-.012em; }
.ee-compromisos p{
  margin:0; font-size:var(--t-sm); line-height:1.55; color:var(--ink2); }

/* El versículo cierra la sección a todo el ancho, no al costado: con las
   cinco columnas ya ocupando la fila, ponerlo en una sexta lo dejaría
   ilegible. Acá funciona como pie de la idea completa. */
.ee-cita-pie{
  margin-top:clamp(2.25rem, 4vw, 3rem);
  border-left:2px solid var(--acc-bd); padding-left:clamp(1.1rem, 2.5vw, 1.6rem);
  max-width:60ch; }

@media (max-width: 1000px){
  /* Tres arriba y dos abajo antes que cinco columnas de 130px, donde el
     título se parte en cuatro renglones. El riel se va: con las columnas
     en dos filas ya no une nada, y una línea que cruza media fila se lee
     como un error de dibujo. */
  .ee-compromisos{ grid-template-columns:repeat(3, 1fr); }
  .ee-compromisos::before{ display:none; }
}
@media (max-width: 620px){
  .ee-compromisos{ grid-template-columns:1fr; gap:1.5rem; }
  /* En una sola columna el icono deja de ser un hito de un riel y pasa a
     ser la viñeta de la fila: al costado, no encima. */
  .ee-compromisos li{ padding-top:0; padding-left:calc(var(--ico) + 1rem); min-height:var(--ico); }
  .ee-compromisos .marca{ top:.1rem; }
}

/* ------------------- 8j · LOS HITOS DE LA HISTORIA -------------------- */
/* Acá vivía `.ee-declara`: la franja de apertura de `nosotros.php`, un
   SEGUNDO banner escrito a mano que hacía casi lo mismo que `.ee-heroe`
   con otras proporciones, otro halo y otra opacidad de sello. Se fue
   entero a `ee_cabecera`, que ahora arma esa composición para las siete
   páginas. Lo que quedó de ella son las dos ideas que el banner adoptó:
   el titular como frase en serif (`h1.frase`) y las columnas alineadas
   por arriba. */

/* Los hitos de la historia. Cada uno lleva un rótulo que dice QUÉ es ese
   momento —el origen, la transformación—, no una fecha: la iglesia no
   publica los años, y ponerlos inventados sería peor que no ponerlos. */
.ee-hitos{ list-style:none; margin:0; padding:0; position:relative; }
.ee-hitos::before{
  content:""; position:absolute; left:5px; top:.7rem; bottom:1.2rem;
  width:1px; background:var(--acc-bd); }
.ee-hitos li{ position:relative; padding-left:2rem; padding-bottom:2.25rem; }
.ee-hitos li:last-child{ padding-bottom:0; }
.ee-hitos li::before{
  content:""; position:absolute; left:0; top:.55rem;
  width:11px; height:11px; border-radius:99px;
  background:var(--acc); box-shadow:0 0 0 3px var(--sf2); }
.ee-hitos .rot{
  display:block; font-family:var(--mono); font-size:var(--t-xs);
  letter-spacing:.06em; text-transform:uppercase; color:var(--mut); margin-bottom:.3rem; }
.ee-hitos h3{ margin:0 0 .5rem; font-size:1.12rem; }
.ee-hitos p{ margin:0 0 .8rem; max-width:var(--lectura); color:var(--ink2); }
.ee-hitos p:last-child{ margin-bottom:0; }

/* Variante DÍPTICO: los dos momentos lado a lado en vez de apilados.
   Un antes y un después se comparan —el ojo va y vuelve entre los dos—, y
   apilados esa comparación se pierde: el segundo queda simplemente
   «después», como un párrafo más.
   La línea que los une pasa a ser horizontal y lleva una punta de flecha,
   porque de lado el sentido del tiempo ya no es obvio: hacia abajo es
   siempre «más tarde», hacia el costado no. */
.ee-hitos.diptico{
  display:grid; gap:clamp(1.5rem, 4vw, 3.25rem);
  grid-template-columns:.85fr 1.15fr; align-items:start;
  margin-top:clamp(1.75rem, 3.5vw, 2.5rem); }
/* La línea vertical del modo apilado no sirve acá. */
.ee-hitos.diptico::before{ display:none; }
.ee-hitos.diptico li{ padding:0; position:relative; }
/* Ni el punto: en el díptico el hito lo marca el icono. */
.ee-hitos.diptico li::before{ display:none; }

/* El puente entre los dos: una línea con punta, en el aire que los separa.
   Se dibuja sola al entrar en pantalla, de izquierda a derecha, que es el
   sentido en que hay que leer el par. */
.ee-hitos.diptico li:first-child::after{
  content:""; position:absolute; z-index:0;
  top:calc(var(--ico) / 2 + 1.7rem);
  left:100%; width:clamp(1.5rem, 4vw, 3.25rem); height:1px;
  background:var(--acc-bd);
  transform-origin:0 50%; transition:transform 700ms var(--ease) 320ms; }
html.js .ee-revelar.diptico li:first-child::after{ transform:scaleX(0); }
html.js .ee-revelar.visible.diptico li:first-child::after{ transform:scaleX(1); }

.ee-hitos.diptico .marca{
  display:grid; place-items:center;
  width:var(--ico); height:var(--ico); border-radius:50%;
  background:var(--sf); border:1px solid var(--acc-bd); color:var(--acc);
  margin:.15rem 0 1rem;
  transition:transform 480ms var(--ease); }
.ee-hitos.diptico .marca svg{ width:23px; height:23px; }
/* El segundo entra después del primero: el par se lee en orden aunque los
   dos estén a la misma altura. */
html.js .ee-revelar.diptico .marca{ transform:scale(.6); opacity:0;
  transition:transform 480ms var(--ease), opacity 480ms var(--ease); }
html.js .ee-revelar.visible.diptico li:first-child .marca{ transform:none; opacity:1; }
html.js .ee-revelar.visible.diptico li:last-child .marca{
  transform:none; opacity:1; transition-delay:420ms; }

/* El nombre nuevo pesa más que el viejo, y el dibujo lo dice: el hito de
   la transformación va sobre superficie y con filete, el del origen al
   aire. No es jerarquía de diseño, es la historia — la casa es la de
   ahora. */
.ee-hitos.diptico li:last-child{
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:clamp(1.35rem, 3vw, 2rem); }
.ee-hitos.diptico li:last-child .marca{ background:var(--acc); border-color:var(--acc); color:#fff; }

@media (max-width: 860px){
  .ee-hitos.diptico{ grid-template-columns:1fr; }
  /* Apilados, el puente horizontal no une nada. */
  .ee-hitos.diptico li:first-child::after{ display:none; }
}

/* --------------------- 8i · EL CICLO DE LA MISIÓN -------------------- */
/* Alcanzar → Discipular → Asignar, y de vuelta. No es una lista numerada
   de adorno: el orden es real (no se discipula a quien no se alcanzó) y el
   retorno es la idea entera —quien es asignado a servir es quien alcanza a
   los siguientes—. La flecha que vuelve es la única razón por la que esto
   es un esquema y no un párrafo. */
.ee-ciclo{ position:relative; }
.ee-ciclo .pasos{
  list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(3, 1fr); gap:clamp(.75rem, 2vw, 1.25rem); }

.ee-ciclo .paso{
  position:relative; width:100%; text-align:left; cursor:pointer;
  display:flex; flex-direction:column; gap:.2rem;
  background:var(--sf); border:1px solid var(--ln); border-radius:var(--r);
  box-shadow:var(--sh); padding:1.15rem 1.25rem 1.25rem;
  font-family:var(--sans);
  transition:border-color var(--t-fast) var(--ease), box-shadow var(--t-med) var(--ease),
             transform var(--t-med) var(--ease); }
.ee-ciclo .paso:hover,
.ee-ciclo .paso.act{ border-color:var(--acc); box-shadow:var(--sh-acc); transform:translateY(-3px); }

/* La flecha entre pasos. Va en el pseudo-elemento de la tarjeta y no como
   un elemento propio: así desaparece sola cuando la rejilla se apila. */
.ee-ciclo li:not(:last-child) .paso::after{
  content:""; position:absolute; right:calc(-1 * clamp(.75rem, 2vw, 1.25rem) / 2 - 5px);
  top:50%; width:10px; height:10px; margin-top:-5px;
  border-top:2px solid var(--acc-bd); border-right:2px solid var(--acc-bd);
  transform:rotate(45deg); background:var(--bg); }
.ee-seccion.tenue .ee-ciclo li:not(:last-child) .paso::after{ background:var(--sf2); }

/* El icono del paso. Es lo primero que se ve de cada tarjeta —antes que
   el número y que el verbo— porque un dibujo se reconoce sin leerse, y el
   esquema tiene que funcionar de reojo. Al activar el paso se llena, para
   que el estado se note también acá y no sólo en el borde. */
.ee-ciclo .marca{
  display:grid; place-items:center;
  width:40px; height:40px; border-radius:50%; margin-bottom:.9rem;
  background:var(--acc-sf); color:var(--acc);
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease),
             transform 420ms var(--ease); }
.ee-ciclo .marca svg{ width:20px; height:20px; }
.ee-ciclo .paso:hover .marca,
.ee-ciclo .paso.act .marca{ background:var(--acc); color:#fff; transform:scale(1.06); }

.ee-ciclo .n{
  font-family:var(--mono); font-size:var(--t-xs); color:var(--mut);
  font-variant-numeric:tabular-nums; }
.ee-ciclo .verbo{
  font-family:var(--serif); font-weight:600; font-size:clamp(1.25rem, 1rem + 1vw, 1.7rem);
  letter-spacing:-.02em; color:var(--ink); line-height:1.1;
  font-variation-settings:'opsz' 48, 'SOFT' 0, 'WONK' 0; }
.ee-ciclo .que{ font-size:var(--t-xs); color:var(--mut); }

/* El retorno: la flecha que cierra el ciclo. */
.ee-ciclo .retorno{ position:relative; margin-top:.35rem; }
.ee-ciclo .retorno svg{ display:block; width:100%; height:44px; overflow:visible; }
.ee-ciclo .retorno path{
  fill:none; stroke:var(--acc-bd); stroke-width:1.5;
  stroke-linecap:round; stroke-linejoin:round;
  /* Se dibuja sola cuando el bloque entra en pantalla: el trazo aparece
     recorriendo el camino, que es justo lo que el esquema quiere decir. */
  stroke-dasharray:1300; stroke-dashoffset:1300;
  transition:stroke-dashoffset 1500ms var(--ease); }
.ee-ciclo .retorno path.punta{ stroke-dasharray:30; stroke-dashoffset:30;
                               transition:stroke-dashoffset 320ms var(--ease) 1200ms; }
.ee-revelar.visible .ee-ciclo .retorno path,
.ee-ciclo.visible .retorno path{ stroke-dashoffset:0; }
.ee-ciclo .retorno .rot{
  position:absolute; left:50%; top:calc(100% - 26px); transform:translateX(-50%);
  background:var(--sf2); padding:0 .7rem;
  font-size:var(--t-xs); color:var(--mut); white-space:nowrap; }

.ee-ciclo .detalle{
  margin:2rem 0 0; max-width:62ch; color:var(--ink2); font-size:var(--t-sm);
  min-height:3.2em; }

@media (max-width:720px){
  .ee-ciclo .pasos{ grid-template-columns:1fr; }
  /* Apilado, la flecha entre pasos pasa de horizontal a vertical. */
  .ee-ciclo li:not(:last-child) .paso::after{
    right:auto; left:1.7rem; top:auto; bottom:calc(-1 * clamp(.75rem, 2vw, 1.25rem) / 2 - 5px);
    margin-top:0; transform:rotate(135deg); }
  /* Y el arco de retorno no cabe: se dice con palabras, que es lo que la
     flecha significaba. */
  .ee-ciclo .retorno svg{ display:none; }
  .ee-ciclo .retorno .rot{
    position:static; transform:none; display:block; background:none; padding:0;
    margin-top:1.1rem; text-align:center; white-space:normal; }
  .ee-ciclo .retorno .rot::before{ content:"↺  "; color:var(--acc); }
}

/* ------------- 8h1 · CIMIENTOS DE LA DECLARACIÓN DE FE -------------- */
/* Cuántas veces se apoya la confesión en cada libro. Barras y no una
   torta: la pregunta es «cuál pesa más», y una torta con ocho porciones
   obliga a comparar ángulos. Cada fila es un BOTÓN porque resalta ese
   libro en los trece artículos de más abajo. */
.ee-libros{ list-style:none; margin:0; padding:0; }
.ee-libros li{ margin-bottom:.2rem; }
.ee-libros .fila{
  display:grid; grid-template-columns:9.5rem 1fr 2.2rem; gap:.9rem; align-items:center;
  width:100%; padding:.42rem .6rem; border:1px solid transparent; border-radius:var(--r-sm);
  background:none; cursor:pointer; font-family:var(--sans); text-align:left;
  transition:background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.ee-libros .fila:hover,
.ee-libros .fila[aria-pressed="true"]{ background:var(--sf); border-color:var(--escritura-bd); }
.ee-libros .nom{ font-size:var(--t-sm); font-weight:500; color:var(--ink); }
.ee-libros .barra{ height:9px; background:var(--sf3); border-radius:99px; overflow:hidden; }
.ee-libros .barra i{
  display:block; height:100%; width:var(--p); border-radius:99px; background:var(--escritura);
  transform-origin:left center; transform:scaleX(0);
  transition:transform 780ms var(--ease), background var(--t-fast) var(--ease); }
.ee-revelar.visible .ee-libros .barra i{ transform:scaleX(1); }
.ee-libros li:nth-child(2) .barra i{ transition-delay:60ms; }
.ee-libros li:nth-child(3) .barra i{ transition-delay:120ms; }
.ee-libros li:nth-child(4) .barra i{ transition-delay:180ms; }
.ee-libros li:nth-child(n+5) .barra i{ transition-delay:240ms; }
.ee-libros .fila:hover .barra i,
.ee-libros .fila[aria-pressed="true"] .barra i{ background:var(--renacer-dark); }
.ee-libros .n{
  font-family:var(--mono); font-size:var(--t-xs); color:var(--mut);
  font-variant-numeric:tabular-nums; text-align:right; }

.ee-pista-uso{ font-size:var(--t-xs); color:var(--mut); margin:.9rem 0 0 .6rem; }

/* Reparto entre los dos Testamentos. Una sola barra partida: son dos
   valores, y dos barras separadas obligan a comparar largos sueltos. */
.ee-reparto{ display:flex; height:12px; border-radius:99px; overflow:hidden; margin-top:.25rem; }
.ee-reparto .nt{ width:var(--p); background:var(--escritura); }
.ee-reparto .at{ flex:1; background:var(--escritura-bd); }
.ee-reparto-leyenda{ list-style:none; margin:.85rem 0 0; padding:0;
                     display:flex; flex-wrap:wrap; gap:.35rem 1.25rem; }
.ee-reparto-leyenda li{ display:flex; align-items:center; gap:.45rem;
                        font-size:var(--t-xs); color:var(--ink2); }
.ee-reparto-leyenda i{ width:9px; height:9px; border-radius:2px; flex:none; }
.ee-reparto-leyenda i.nt{ background:var(--escritura); }
.ee-reparto-leyenda i.at{ background:var(--escritura-bd); }
.ee-reparto-leyenda b{ font-family:var(--mono); color:var(--ink); font-weight:500; }

/* La referencia resaltada desde el gráfico. Fondo y no sólo color de
   texto: en un párrafo con ocho citas hay que poder encontrarla de un
   vistazo, no leerlas todas. */
.ee-ref.marcada{
  background:var(--escritura-sf); box-shadow:0 0 0 3px var(--escritura-sf);
  border-radius:3px; color:var(--escritura); font-weight:600;
  text-decoration:underline solid var(--escritura); }

@media (max-width:560px){
  .ee-libros .fila{ grid-template-columns:7.5rem 1fr 2rem; gap:.6rem; }
}

/* -------------------- 8h · PREGUNTAS FRECUENTES --------------------- */
/* `<details>`/`<summary>` del navegador, sin JavaScript: plegable,
   accesible y navegable por teclado de fábrica, el buscador lee el
   contenido aunque esté cerrado, y el Ctrl+F del navegador lo encuentra.
   Un acordeón propio sería más código para quedar peor en las cuatro. */
.ee-faq-grupo{ margin-bottom:2.5rem; }
.ee-faq-grupo:last-child{ margin-bottom:0; }

.ee-faq{ border-bottom:1px solid var(--ln); }
.ee-faq summary{
  display:flex; align-items:flex-start; gap:.9rem; justify-content:space-between;
  padding:1.05rem 0; cursor:pointer; list-style:none;
  font-weight:600; color:var(--ink); font-size:1.02rem; }
/* El triángulo de fábrica se saca en los dos motores. */
.ee-faq summary::-webkit-details-marker{ display:none; }
.ee-faq summary::marker{ content:""; }
.ee-faq summary::after{
  content:""; flex:none; width:11px; height:11px; margin-top:.42rem;
  border-right:2px solid var(--mut); border-bottom:2px solid var(--mut);
  transform:rotate(45deg); transform-origin:60% 60%;
  transition:transform var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.ee-faq[open] summary::after{ transform:rotate(-135deg); border-color:var(--acc); }
.ee-faq summary:hover{ color:var(--acc); }
.ee-faq summary:hover::after{ border-color:var(--acc); }
.ee-faq .cuerpo{ padding:0 0 1.25rem; max-width:64ch; }
.ee-faq .cuerpo p{ font-size:var(--t-sm); }
.ee-faq .cuerpo code{
  font-family:var(--mono); font-size:.9em; background:var(--sf3);
  padding:.1rem .35rem; border-radius:4px; }

/* ---------------------------- 9 · BOTONES --------------------------- */
/* Misma jerarquía que Ekklesia: UN botón lleno por pantalla. El resto se
   distingue por tinte y borde. Veinte botones azules compiten entre sí y
   no destaca ninguno. */
.ee-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:.5rem;
  font-family:var(--sans); font-size:var(--t-sm); font-weight:600;
  padding:.65rem 1.15rem; border-radius:var(--r-sm);
  border:1px solid transparent; cursor:pointer; text-decoration:none;
  transition:background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease),
             color var(--t-fast) var(--ease); }
.ee-btn:hover{ text-decoration:none; }
.ee-btn.lleno{ background:var(--acc); color:var(--acc-ink); box-shadow:var(--sh-acc); }
.ee-btn.lleno:hover{ background:var(--renacer-hover); }
.ee-btn.borde{ background:var(--sf); border-color:var(--acc-bd); color:var(--acc); }
.ee-btn.borde:hover{ background:var(--acc-sf); border-color:var(--acc); }
/* Sobre el chrome oscuro (héroe, pie) el botón de borde se invierte. */
.ee-heroe .ee-btn.borde, .ee-pie .ee-btn.borde{
  background:transparent; border-color:rgba(255,255,255,.28); color:#fff; }
.ee-heroe .ee-btn.borde:hover, .ee-pie .ee-btn.borde:hover{
  background:rgba(255,255,255,.09); border-color:rgba(255,255,255,.5); }
.ee-btn.lleno[target="_blank"] i.fa-arrow-up-right-from-square{ font-size:.75em; }

.ee-acciones{ display:flex; flex-wrap:wrap; gap:.7rem; margin-top:1.75rem; }

/* ── El botón que llama ──
   Para UNO solo en todo el sitio: «Entrar al Aula Virtual». Toda esa
   página existe porque la gente no encontraba la puerta, así que la
   puerta tiene que verse desde el otro lado de la pieza.

   ⚠️ NO PARPADEA, Y ES A PROPÓSITO. Un parpadeo apaga y enciende el
   fondo, y mientras está apagado el texto blanco queda sobre nada: se
   pierde el contraste justo en el elemento que más se necesita leer.
   Además compite con la lectura —el ojo no puede ignorar algo que
   aparece y desaparece— y la página de al lado son tres pasos que hay
   que leer con calma. Esto es un aro que sale del botón y se apaga, como
   una onda: se ve el movimiento por el rabillo del ojo, el botón nunca
   cambia y el texto se lee igual de bien en todo momento.

   La pausa larga entre ondas es la mitad del efecto. Un latido continuo
   se vuelve ruido de fondo en diez segundos y deja de señalar nada; uno
   cada cuatro segundos sigue llamando la atención al minuto. */
.ee-btn.ee-latido{ position:relative; }
.ee-btn.ee-latido::after{
  content:""; position:absolute; inset:0; border-radius:inherit;
  border:2px solid var(--acc); opacity:0; pointer-events:none; }
html.js .ee-btn.ee-latido::after{
  animation:eeLatido 4s var(--ease) infinite; }
/* Al pasar por encima el aro se detiene: ya te encontró, y seguir
   llamando a quien ya está mirando es sólo ruido. */
.ee-btn.ee-latido:hover::after,
.ee-btn.ee-latido:focus-visible::after{ animation:none; opacity:0; }

/* ⚠️ El último fotograma es invisible. El bloque de movimiento reducido
   acorta la duración a .01ms y deja la animación clavada en su estado
   final: si ese estado fuera el aro encendido, quien pidió menos
   movimiento se quedaría con un borde raro puesto para siempre. */
@keyframes eeLatido{
  0%   { transform:scale(1);    opacity:.6; }
  45%  { transform:scale(1.18); opacity:0; }
  100% { transform:scale(1.18); opacity:0; }
}

/* ------------------------------ 10 · PIE ---------------------------- */
.ee-pie{ background:var(--nav); color:rgba(255,255,255,.68);
         padding-block:clamp(2.5rem, 5vw, 3.5rem); font-size:var(--t-sm); }
.ee-pie a{ color:rgba(255,255,255,.82); }
.ee-pie a:hover{ color:#fff; }
.ee-pie-duo{ display:grid; gap:2rem;
             grid-template-columns:repeat(auto-fit, minmax(min(100%,240px), 1fr)); }
.ee-pie h4{ color:#fff; font-size:var(--t-xs); font-weight:600;
            margin:0 0 .75rem; letter-spacing:.02em; }
.ee-pie ul{ list-style:none; margin:0; padding:0; }
.ee-pie li{ margin-bottom:.4rem; }
.ee-pie .marca img{ width:96px; margin-bottom:1rem; }
.ee-pie .legal{
  margin-top:2.25rem; padding-top:1.25rem; border-top:1px solid var(--nav-ln);
  display:flex; flex-wrap:wrap; gap:.5rem 1.5rem; justify-content:space-between;
  font-size:var(--t-xs); color:rgba(255,255,255,.5); }

/* -------------------------- 11 · RESPONSIVO ------------------------- */
/* El sitio actual no tiene NINGUNA media query y ningún meta viewport: en
   el teléfono el navegador asume 980px y encoge todo hasta dejar el texto
   en unos 6px. Esto es lo que faltaba. */

@media (max-width: 900px){
  .ee-duo.texto-manda{ grid-template-columns:1fr; }
  /* El índice lateral se oculta a los 900px: su columna también. */
  .ee-duo.con-indice{ grid-template-columns:1fr; }
  .ee-heroe-duo{ grid-template-columns:1fr; }
  /* Girado el héroe, el filete de la cita tiene que pasar a ser superior:
     de costado no separa nada cuando la cita quedó DEBAJO del título. */
  .ee-heroe .ee-cita{
    border-left:0; border-top:1px solid rgba(255,255,255,.16);
    padding-left:0; padding-top:1.5rem; }
  .ee-heroe .ee-cita + .ee-acciones{ padding-left:0; }
}

@media (max-width: 780px){
  .ee-menu-btn{ display:inline-flex; }
  /* En 375px el logotipo baja un punto para dejarle aire al botón. */
  .ee-marca .logo{ height:32px; }

  /* El menú pasa a panel desplegable. Se abre con el atributo `data-abierto`
     en el <body> — sin clases sueltas repartidas por el JS. */
  .ee-nav{
    position:fixed; inset:var(--barra-h) 0 auto 0; z-index:var(--z-menu);
    flex-direction:column; align-items:stretch; gap:0;
    background:var(--nav); border-bottom:1px solid var(--nav-ln);
    padding:.5rem clamp(1.15rem, 4vw, 2.5rem) 1.15rem;
    transform:translateY(-8px); opacity:0; visibility:hidden;
    transition:opacity var(--t-med) var(--ease), transform var(--t-med) var(--ease),
               visibility var(--t-med); }
  body[data-menu="abierto"] .ee-nav{ transform:none; opacity:1; visibility:visible; }
  .ee-nav a{ padding:.85rem .5rem; border-radius:0;
             border-bottom:1px solid var(--nav-ln); font-size:1rem; }
  .ee-nav a:last-child{ border-bottom:0; }
  .ee-nav a[aria-current="page"]{ box-shadow:inset 3px 0 0 var(--acc-nav); }
  /* En el menú desplegable de teléfono los ítems ya van uno bajo otro y a
     todo el ancho: un botón de contorno pegado a la izquierda se vería
     como un elemento suelto. Se estira y se centra, que es como se
     comporta el resto de esa lista. */
  .ee-nav .aparte{ margin-left:0; margin-top:.5rem; justify-content:center;
                   border-radius:var(--r-sm); }

  /* ⚠️ EL VELO NO PUEDE SER UN `::after` DEL `<body>`.
     La barra (`.ee-barra`) es `position:sticky` CON `z-index`, así que
     crea su propio contexto de apilamiento. El panel del menú vive
     DENTRO de la barra, y su `z-index:45` sólo cuenta ahí adentro: hacia
     afuera, la barra ENTERA —panel incluido— compite como un solo bloque
     de valor 40 contra cualquier cosa que sea hija directa de `<body>`.
     Un `::after` del body con z-index 44 queda por ENCIMA de la barra
     completa, panel incluido: el menú se ve, pero cada clic lo atrapa el
     velo. Los enlaces no fallan por su cuenta, están sepultados.

     La prueba de que el problema es de apilamiento y no del panel: sube
     el `z-index` de la barra por encima del velo y el síntoma
     desaparece —ambos vuelven a compararse en el contexto raíz, donde la
     barra gana—. Eso es justamente lo que hace la regla de abajo: no
     toca al panel, sube a la BARRA por encima de su propio velo. */
  .ee-barra{ z-index:var(--z-menu); }

  /* Velo bajo el panel: sin esto el menú abierto flota sobre el texto y se
     lee encima de las palabras. Hijo de la BARRA y no del `<body>`, para
     quedar en el mismo contexto de apilamiento que el panel: ahí adentro
     el panel (45) sí le gana al velo (44), que es la comparación que
     importa.

     ⚠️ `::before`, NO `::after`. `.ee-barra::after` YA es la línea de
     avance de lectura de más abajo (§11, animation-timeline: scroll()),
     que declara `position:absolute`. Con los dos en `::after`, la del
     avance de lectura queda DESPUÉS en el archivo y con la misma
     especificidad, así que gana el empate para esa propiedad: el velo
     terminaba con `position:absolute` en vez del `fixed` que necesita
     —comprobado, `getComputedStyle` lo devolvía así—, y un velo
     `absolute` dentro de una barra `sticky` no cubre la pantalla, cubre
     lo que le deje la caja de la barra. Ya hay dos casos de esta misma
     familia de bug documentados en este archivo (`.ee-datos`,
     `.ee-campus`): un selector con dos trabajos pierde una de sus
     propiedades a manos del otro trabajo, y nunca avisa cuál. */
  .ee-barra::before{
    content:""; position:fixed; inset:var(--barra-h) 0 0 0; z-index:var(--z-velo);
    background:rgba(7,17,41,.5);
    opacity:0; visibility:hidden; pointer-events:none;
    transition:opacity var(--t-med) var(--ease), visibility var(--t-med); }
  body[data-menu="abierto"] .ee-barra::before{
    opacity:1; visibility:visible; pointer-events:auto; }
  body[data-menu="abierto"]{ overflow:hidden; }
}

@media (max-width: 520px){
  :root{ --t-body:1rem; --barra-h:60px; --sello:clamp(220px, 62vw, 320px); }
  /* En el teléfono el titular ocupa TODO el ancho, así que el sello ya no
     tiene una columna libre donde vivir: se baja de contraste y se corre
     casi entero fuera del canto izquierdo. */
  .ee-heroe::before{ inset:0 -28% 0 auto; margin-block:auto; opacity:.2; }
  .ee-etapa{ padding-left:2.1rem; }
  .ee-acciones .ee-btn{ flex:1 1 100%; }
}

/* ---------------- 12 · MOVIMIENTO LIGADO AL DESPLAZAMIENTO ----------- */
/* Todo este bloque usa `animation-timeline`, que ata una animación al
   desplazamiento en vez de al reloj. Dos razones para preferirlo sobre un
   listener de `scroll` en JavaScript:

     · corre en el hilo del compositor, no en el principal. Un listener de
       scroll que escribe estilos obliga al navegador a recalcular en cada
       cuadro y es la causa clásica de que una página «se sienta pesada» al
       desplazarla en un teléfono;
     · si el navegador no lo soporta, no pasa NADA. No hay estado a medio
       aplicar ni contenido escondido esperando un script — exactamente lo
       contrario del revelado, que necesitó una red de seguridad.

   Va todo dentro de `@supports` para que sea explícito que es un extra.
   El bloque de movimiento reducido, más abajo, lo apaga entero. */
@supports (animation-timeline: scroll()){

  /* ── Avance de lectura ──
     Una línea de un pixel bajo la barra, que se llena a medida que la
     página avanza. En la Declaración de Fe —trece artículos, seis mil
     palabras— saber cuánto queda cambia la decisión de seguir leyendo.
     En las páginas cortas se llena enseguida y no molesta a nadie. */
  .ee-barra::after{
    content:""; position:absolute; left:0; bottom:-1px; height:2px;
    width:100%; transform-origin:0 50%; transform:scaleX(0);
    background:linear-gradient(90deg, var(--acc-nav), #fff);
    animation:eeAvanceLectura linear both;
    animation-timeline:scroll(root block); }

  /* ── El sello del banner, a otra velocidad ──
     La marca de agua sube más lento que el texto que tiene delante. Es el
     truco de profundidad más viejo que hay y sigue siendo el más barato:
     dos planos moviéndose distinto se leen como espacio, no como capas
     pegadas. Doce por ciento del alto, no más: el objetivo es que se note
     sin que se piense en él. */
  .ee-heroe::before{
    animation:eeRespira 22s ease-in-out infinite, eeDeriva linear both;
    animation-timeline:auto, view(block); }

  /* ── Los puntos de luz se apagan al salir ──
     Sin esto, las partículas siguen brillando a pantalla completa cuando
     el banner ya se fue: se ven a través del borde y parecen un defecto. */
  .ee-particulas{
    animation:eeDesvanece linear both;
    animation-timeline:view(block);
    animation-range:exit 0% exit 70%; }
}

@keyframes eeAvanceLectura{ to{ transform:scaleX(1); } }
@keyframes eeDeriva{ from{ translate:0 -6%; } to{ translate:0 6%; } }
@keyframes eeDesvanece{ to{ opacity:0; } }

/* -------------------- 12 · MOVIMIENTO REDUCIDO ---------------------- */
/* Quien pidió menos movimiento en su sistema operativo lo pidió en serio.
   El emblema deja de respirar y los saltos de ancla dejan de deslizarse. */
@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior:auto; }
  *,*::before,*::after{
    animation-duration:.01ms !important; animation-iteration-count:1 !important;
    transition-duration:.01ms !important; }
  /* ⚠️ Acortar la duración NO detiene una animación ligada al
     desplazamiento: su reloj es el scroll, no el tiempo, así que
     `animation-duration` no la toca. Hay que soltarle la línea de tiempo.
     La de avance de lectura se queda —no es movimiento decorativo sino un
     indicador— pero clavada en su estado final. */
  .ee-heroe::before, .ee-particulas{ animation-timeline:auto; }
  .ee-barra::after{ animation:none; transform:scaleX(0); }
}

/* ------------------------ 13 · IMPRESIÓN ---------------------------- */
/* Alguien va a imprimir el programa académico para llevarlo a una reunión. */
@media print{
  .ee-barra, .ee-menu-btn, .ee-acciones, .ee-pie{ display:none; }
  .ee-heroe{ background:none; color:var(--ink); padding-block:1rem; }
  .ee-heroe h1, .ee-heroe .ee-cita .txt{ color:var(--ink); }
  .ee-heroe::before{ display:none; }
  body{ background:#fff; font-size:11pt; }
  .ee-seccion{ padding-block:1.25rem; }
}
