/* ============================================================================
   The Scrolling Economy — CAPA DE UX.  Mateo Ortiz, 2026-09-24.
   Fila B del brief `01-brief-creativo-edicion-web-libro.md` (Sofia, 2026-09-24).

   Archivo aparte a proposito, igual que la capa de motion de Valentina:
   `book.css` y `book.js` son de Andres y estan abiertos ahora mismo (paso de
   suelo tipografico, tarea F).  Esta capa no toca ni una linea de aquellos y se
   retira quitando dos lineas del generador.

   QUE CUBRE.  Solo lo que el brief §5 pone a mi nombre:

     D1  LA LINEA DE APRENDIZAJE.  El sitio donde cae la frase que Lucia escribe
         (tarea C).  Aqui esta el hueco y su forma; el texto no es mio.
     D2  EL MARCO DE LA FIGURA.  Seam §8: Andres manda DENTRO del marco, yo mando
         el marco y todo lo de fuera — contenedor, pie, control de lectura, zoom
         y sitio en el flujo.
     D3  EL QUIZ.  Su forma y su comportamiento, enteros.

   QUE NO CUBRE, y no por descuido:
     · La tira del trinquete (D4) es de Valentina.  Esta capa no dibuja progreso
       ni posicion: seria el mismo dato dos veces en dos bordes de la pantalla.
     · El dibujo de la figura, sus capas y su suelo tipografico son de Andres.
     · El indice de secciones del capitulo NO se construye aqui.  Los titulos del
       censo son `sr-only` y un lector vidente nunca ve de que partes se compone
       el capitulo: es un defecto real y esta escrito en 05-ux-ui.md como hallazgo
       con nombre.  No entra de tapadillo en una ronda cuyo criterio es §5.

   CERO CLS.  Nada de esta hoja se inserta despues del primer layout: el hueco de
   D1 y el orden del marco los emite el generador, y lo unico que escribe el JS
   son atributos y textos dentro de cajas ya reservadas.
   ========================================================================= */

:root{
  --ux-gate:4px;        /* el filete de la compuerta del quiz */
  --ux-key:30px;        /* el cuadrado de la clave de opcion */
}

/* ==========================================================================
   D1 · LA LINEA DE APRENDIZAJE
   Texto: Lucia Herrera, `build/web-takeaways.json` (12 x 2 + un rotulo fijo).
   Colocacion: mia.

   VA DELANTE DEL CENSO, y cambie de sitio a proposito.  Mi primera version la
   puso detras, con este argumento: el censo contesta una pregunta sobre el LIBRO
   y esta linea una sobre EL LECTOR, asi que lo ultimo antes de la prosa tenia que
   ser la segunda.  Lucia pidio lo contrario y tiene la razon mas fuerte: bajando
   de la banda cobalto, el lector acaba de leer el TITULO, y lo que busca ahi es
   por que deberia leer esto.  La promesa contesta a eso; el censo contesta a otra
   cosa que solo importa si ya decidiste leer.  Promesa, luego su respaldo, luego
   el texto — que es el orden de una afirmacion y su nota al pie, no al reves.

   EL PROBLEMA QUE ELLA SENALO Y COMO SE RESUELVE.  Los dos rotulos son versalitas
   micro y quedan a cuarenta pixeles: "After this chapter" y "Before you read this
   chapter" se leen como una sola zona de chrome y el lector salta los dos.
   Se separan con tres cosas y ninguna es una regla mas:
     · el REGISTRO — entre los dos rotulos hay una frase en serif de 26 px; el
       censo entero es sans de 13 a 15.  El salto de familia hace el corte.
     · esta linea NO lleva filete propio.  El censo ya abre con el suyo a <1200,
       y dos reglas seguidas eran justo la zona de chrome que hay que evitar.
     · el rotulo va en cobalto y el del censo en --ink2: son un PAR declarado
       (antes / despues), no dos avisos compitiendo.

   NO ES UN ENCABEZADO (restriccion 5 de Lucia): `<aside>` con dos `<p>`, fuera de
   la jerarquia de h2 y fuera del indice de la pagina.
   NO LLEVA CAJA NI ACENTO (restriccion 3): el tomate significa "aqui el libro
   todavia no se ha comprobado" y esto no es eso.
   SOBREVIVE AL PASO DE FEED (restriccion 4): `.uxtake` no esta en la lista HIDE y
   asi se lo he pasado a Valentina por escrito.
   ====================================================================== */
.uxtake{max-width:var(--prose);margin:0 auto 2.6rem;width:100%;padding:0}
.uxtake .uxtakelab{margin:0 0 .5em;font-size:var(--micro);letter-spacing:.13em;
  text-transform:uppercase;font-weight:500;color:var(--part-ink)}
/* La medida es 30ch y no la columna entera: a 1440 la prosa mide 686 px y una
   frase de 117 caracteres entraria en una linea y media, que se lee como un
   renglon suelto.  A 30ch son dos lineas en los tres anchos. */
.uxtake .uxtakeline{margin:0;font-family:var(--serif);font-weight:400;
  font-size:26px;line-height:1.3;letter-spacing:-.006em;color:var(--ink);
  max-width:30ch;text-wrap:pretty}
@media (min-width:1200px){
  /* A ancho completo el censo flota en la columna exterior; la linea se queda en
     la columna de prosa, que es donde arranca la lectura. */
  .uxtake{margin-left:0;margin-right:0}
}
@media (max-width:1023.98px){.uxtake .uxtakeline{font-size:24px}}
/* 20 px a 390: con el maximo de Lucia (120 caracteres) son TRES lineas a la
   medida de prosa, que es el techo que acordamos.  A 24 px serian cuatro. */
@media (max-width:640px){
  .uxtake{margin-bottom:2.2rem}
  .uxtake .uxtakeline{font-size:20px;max-width:none}
}
/* En vistazo el capitulo es lo que un scroll deja.  Una promesa escrita no es lo
   que un scroll deja: se retira, como la prosa.  (No confundir con el paso de
   feed, donde SI sobrevive: alli la pregunta es que queda a velocidad, y esto es
   capa de vistazo.  Son dos estados distintos y contestan distinto.) */
body[data-glance] .uxtake{display:none}

/* ==========================================================================
   D2 · EL MARCO DE LA FIGURA

   TODO ESTE BLOQUE CUELGA DE `body[data-figframe="html"]`, y esa marca la pone el
   generador SOLO cuando `book.js` ha dejado de construir el marco en JS (ver el
   bloque UX-D2 de build_web_edition.py).  Hoy la marca no esta, asi que nada de
   aqui aplica; el dia que aterrice la fila F de Andres, aplica todo a la vez y sin
   que nadie encienda nada.  El arreglo son dos piezas en dos territorios y de esta
   forma no puede entrar media.

   POR QUE IMPORTA, con los numeros de los otros dos:
     · Diego — el fotograma mas largo de la edicion publicada es `book.js`
       inyectando una figura: 485 ms, 404 de layout forzado.  La puerta de "cero
       fotogramas por encima de 50 ms al scrollear" falla hoy, sin motion.
     · Andres — el control creado en JS cuesta 0,0576 de CLS el solo a 390 /
       Slow 4G / CPU 4x.  Emitido en el HTML: 0.
   Misma causa, y la causa es el marco, que es mio (§8).
   ====================================================================== */

/* LA RESERVA DE ALTO.  Una PROPORCION, y vale porque el tablero es FIJO.
   Tomas midio en R0 que de las 170 figuras cero escalan solas: 136 relinealizan
   y 34 son rigidas y desbordan.  Sobre una caja de ancho fluido la proporcion es
   falsa — en la 3.8 reservaria 484 px para una figura que mide 1.884 a 390, que
   es reservar de MENOS, que es exactamente el salto de maqueta que costo bajar
   de 0,1989 a 0,0003.  Con el tablero clavado en 900 y escalado con `transform`
   (R2, en `book.js`) las 170 miden `fnat * w / 900` y la proporcion es exacta.
   `--fnat` lo emite el generador en el propio `<figure>`, un numero por figura:
   ni filas por ancho ni por idioma, y no puede desincronizarse de la lista.
   Sin `--fnat` la `aspect-ratio` queda invalida y la caja deja de reservar: no
   rompe. */
body[data-figframe="html"] .fig > .figbox{box-sizing:content-box;
  aspect-ratio:900 / var(--fnat)}

/* EL TABLERO MIDE 900 AUNQUE LA CAJA MIDA 362.  `transform` escala el pintado
   pero no el ancho de maqueta, asi que sin esto las 34 rigidas siguen dando
   scroll horizontal a 390 — que es el defecto que R0 encontro.  No es un velo ni
   un recorte que esconda nada (D42): lo que queda fuera es el mismo dibujo, que
   el control abre entero a 900 con zoom. */
body[data-figframe="html"] .fig > .figbox{overflow:hidden;width:100%}
body[data-figframe="html"] .fig{min-width:0}
body[data-figframe="html"] .fig > .figbox > .figscale{width:900px;
  transform-origin:top left}
/* `width:100%` no es decorativo y costo encontrarlo.  Con el ancho en `auto` y una
   `aspect-ratio` puesta, el navegador resuelve la proporcion AL REVES: toma la
   altura que le da el contenido y calcula el ancho a partir de ella.  En la figura
   1.5 eso daba una caja de 415 px dentro de una columna de 362, el viewport se
   ensanchaba a 429 y a 390 aparecia scroll horizontal — el mismo defecto que R0
   describio en las 34 rigidas, reaparecido por otra puerta.  Fijado el ancho, la
   proporcion calcula la ALTURA, que es lo que se le pide.
   `min-width:0` en `.fig` es el cinturon: `.sec` es un contenedor flex en columna
   y un item flex tiene `min-width:auto`, asi que un tablero de 900 px dentro
   puede empujar al item por encima de su `max-width`. */

/* EL PIE, ENCIMA.  La regla de book.css lo separaba del dibujo por abajo. */
body[data-figframe="html"] .fig figcaption{margin:0 0 .9em}
body[data-figframe="html"] .fig .figsrc{margin:.85em 0 0}

/* EL CONTROL DE LECTURA, COMO CONTROL.
   A 390 el dibujo entra al 40 % y sus rotulos caen por debajo de 7 px: en un
   telefono este boton no es un extra, es la UNICA puerta a los textos de la
   figura.  Estaba a 13 px con una hairline debajo, que es el tratamiento de un
   enlace de cortesia.
     · cuerpo --claim (17 px a 390).  Un control no es evidencia: la escala de
       evidencia del libro (D84) no se toca, pero tampoco se le aplica a un boton.
     · caja de 48 px con borde de tinta: en tactil no hay hover, asi que el estado
       de reposo tiene que decir solo que esto se pulsa.
     · `.figcost` queda reservado y VACIO.  Su cifra sale de contar los rotulos por
       debajo del umbral dentro del dibujo y tiene que calcularse AL BUILD, no en
       tiempo de ejecucion: rellenar un boton despues del primer layout es
       exactamente el patron de CLS que este bloque viene a quitar.  Su rotulo lo
       escribe Lucia. */
body[data-figframe="html"] .fig .figread{display:inline-flex;align-items:center;
  gap:.6em;margin-top:1.1em;padding:.62em 1em;min-height:48px;
  font-size:var(--claim);line-height:1.2;color:var(--ink);background:none;
  border:1.5px solid var(--ink);cursor:pointer;text-align:left}
body[data-figframe="html"] .fig .figread:hover{background:var(--ink);color:var(--paper)}
body[data-figframe="html"] .fig .figread .arr{font-size:var(--evidence)}
body[data-figframe="html"] .fig .figread .figcost{color:var(--ink2);
  font-size:var(--evidence);font-variant-numeric:lining-nums tabular-nums}
body[data-figframe="html"] .fig .figread:hover .figcost{color:inherit}
body[data-figframe="html"] .fig .figread .figcost:empty{display:none}
/* En vistazo el control ya esta retirado por book.css; el hover invertido no puede
   quedarse vivo dentro de la banda cobalto. */
body[data-figframe="html"][data-glance] .fig .figread:hover{background:none;color:var(--ink)}

/* ==========================================================================
   D3 · EL QUIZ — EL UNICO SITIO DONDE LA PAGINA CAMBIA DE ESTADO POR EL LECTOR
   Criterio del brief: "un lector que pasa de largo a toda velocidad no puede
   confundirlo con una seccion".  Hoy si puede: el quiz abre con una hairline y
   un H2, que es exactamente como abre una seccion, y sus opciones son cajas de
   1 px de --rule a 13 px — mas pequenas y mas grises que la prosa que las rodea.
   El unico momento en que el lector ACTUA estaba compuesto mas flojo que el
   momento en que solo lee.

   TRES COSAS LO SEPARAN, y ninguna inventa un color ni una superficie:

   1. LA COMPUERTA.  Filete de 4 px arriba y abajo, no de 1.  Una seccion se abre
      con una hairline; esto se cierra por los dos lados.  Y encima del H2 va el
      eyebrow DEL CAPITULO, copiado literalmente de su cabecera: el quiz lleva la
      cara de una cabecera, no la de una seccion.  Cero copy nuevo.
   2. LA CLAVE.  Cada opcion lleva un cuadrado con su letra.  Es el unico objeto
      de las 30 paginas que se parece a un control de eleccion, y se reconoce a la
      velocidad a la que se pasa de largo.  En tactil no hay hover: el estado de
      reposo tiene que decirlo todo.
   3. LA CUENTA.  "0 de 4 respondidas" desde el principio, no un marcador que
      aparece al final.  Un contador que ya esta en cero es una invitacion; uno
      que aparece cuando terminas es un recibo.

   NO SE USA EL TOMATE COMO MARCA DE LA COMPUERTA.  En el carril y en el censo el
   acento significa "aqui el libro todavia no se ha comprobado" (mandatorio §7.3).
   Pintarlo en el quiz lo diria de todo el quiz.  Se queda donde ya estaba y donde
   significa otra cosa que el lector construye el mismo: la respuesta correcta.
   ====================================================================== */

/* --- la compuerta ------------------------------------------------------- */
.quiz{margin-top:7rem;padding-top:1.9rem;padding-bottom:2.6rem;
  border-top:var(--ux-gate) solid var(--ink);
  border-bottom:var(--ux-gate) solid var(--ink)}
.quiz .uxkick{margin:0 0 .75em;font-size:var(--micro);letter-spacing:.13em;
  text-transform:uppercase;font-weight:500;color:var(--part-ink)}
.quiz .stand{margin-top:.7em}

/* --- la cuenta, en la linea del titulo ---------------------------------- */
/* Flotada a la derecha y hermana del H2, NO envolviendolo: envolverlo rompia
   `.quiz > h2` de book.css y el titulo perdia el serif.  Flotando, el selector de
   Andres sigue casando y esta hoja no tiene que repetir ni uno de sus valores.
   Cifras tabulares y pintada desde el primer layout: pasar de 0 a 1 no mueve nada.
   El flotado mide una linea y el H2 mide mas, asi que nunca desborda hacia el pie;
   el `clear` esta por si un titulo futuro cupiera en menos. */
.quiz .uxcount{float:right;margin:0 0 0 1.2rem;font-size:var(--claim);
  color:var(--ink2);font-variant-numeric:lining-nums tabular-nums}
.quiz .uxcount b{color:var(--ink);font-weight:600}
.quiz .stand{clear:right}

/* --- la pregunta -------------------------------------------------------- */
.quiz .qs{gap:3.2rem}
.quiz .q{position:relative}
.quiz .ask{font-size:var(--claim);margin-bottom:1em}
/* El ordinal por pregunta se probo y se retiro: ver la nota en ux.js. */

/* --- la opcion: un control, no una cita --------------------------------- */
.quiz .opts{gap:.6rem}
.quiz .opt{display:grid;grid-template-columns:var(--ux-key) 1fr;align-items:start;
  gap:.9em;width:100%;padding:.85em .95em;min-height:60px;
  font-size:var(--claim);line-height:1.45;color:var(--ink);
  border:1.5px solid var(--ink);background:none;text-align:left}
.quiz .opt::before{content:attr(data-key);display:flex;align-items:center;
  justify-content:center;width:var(--ux-key);height:var(--ux-key);
  border:1.5px solid var(--ink);font-size:var(--evidence);font-weight:600;
  line-height:1;font-variant-numeric:lining-nums;color:var(--ink)}
/* D88 — EL HOVER NO SE RELLENA DE TINTA.  Rellenaba la opcion entera con --ink, que
   es el color del TEXTO: usarlo como campo produce un bloque casi negro, y el unico
   sitio del libro donde el lector actua se volvia oscuro al tocarlo.  Ink es para
   escribir.
   Lo que entra en su lugar es el COBALTO, y aqui es donde tiene que entrar: el quiz
   era el unico sitio del objeto sin el color de la marca.  Entra como MARCA y no
   como campo — rellena el cuadrado de la clave, que mide 30 px, y engrosa el borde.
   La distincion de D84 se respeta: el cobalto a sangre significa "aqui no hay nada
   que leer" (portada, apertura, vistazo); el cobalto en una pieza de 30 px significa
   "esto es del libro", que es lo que ya hacen el numero de figura y el de seccion.
   Crema sobre cobalto: 7,90:1. */
.quiz .opt:hover:not(:disabled),
.quiz .opt:focus-visible:not(:disabled){border-color:var(--cobalt);color:var(--ink)}
.quiz .opt:hover:not(:disabled)::before,
.quiz .opt:focus-visible:not(:disabled)::before{background:var(--cobalt);
  border-color:var(--cobalt);color:var(--on-cobalt)}
.quiz .opt:disabled{cursor:default}

/* Los estados.  El color NUNCA lleva el dato solo: la clave cambia de relleno, el
   veredicto lo dice con palabras y la opcion correcta lleva ademas el filete
   interior.  Sin cambios de grosor de borde en ningun estado — un borde que
   engorda al pulsar mueve el texto de al lado. */
/* D89 — el color lo lleva el CAMPO de 30 px, que es donde el ambar y el rosa
   funcionan (1,53:1 y 1,66:1 sobre crema como tinta; 10,01 y 9,23 con la tinta
   encima).  El filete y el rotulo van en la TINTA de la familia. */
/* D89 — el color lo lleva el CAMPO de 30 px, que es donde el ambar y el rosa
   funcionan (como tinta dan 1,53:1 y 1,66:1 sobre crema; con la tinta encima,
   10,01 y 9,23).  El filete y el rotulo van en la TINTA de la familia.
   El RELLENO se lo queda E1, que es la regla de Mateo y es la buena: relleno solo
   si la elegiste tu.  Aqui iba un `background` y pisaba su forma — en oscuro
   dejaba la letra de la clave en crema sobre ambar, 1,53:1.  Visto en pantalla. */
.quiz .opt.is-right{border-color:var(--ux-right-ink);color:var(--ink)}
.quiz .opt.is-right::before{border-color:var(--ux-right-ink);color:var(--ux-right-ink)}
/* LA QUE ELEGISTE TU.  Probado a 390 y corregido: con solo el borde en --ink2 la
   opcion fallada se parecia demasiado a las dos que nadie toco, y el lector no
   podia reconstruir "elegi A, la respuesta es D" — que es la mitad de lo que un
   quiz devuelve.  Lleva el MISMO filete interior que la correcta, en gris: el
   filete significa "esta tiene que ver contigo o con la respuesta", y el color
   dice cual de las dos.  La letra tachada lo repite sin depender del color. */
/* EL RELLENO SIGNIFICA ACIERTO Y NADA MAS.  Primera version: la fallada tambien
   iba rellena, en gris.  Mirada en pantalla, dos problemas — la letra encima del
   relleno no se leia, y una caja rellena y solida parece enfatica, o sea lo
   contrario de lo que pasa.  Ahora hay UNA idea y se aplica entera: relleno = lo
   conseguiste; contorno = no.  La tachadura de la letra sigue diciendo cual fue el
   error, y sobre contorno si se ve. */
.quiz .opt.is-wrong{border-color:var(--ux-wrong-ink);color:var(--ink);text-decoration:none}
.quiz .opt.is-wrong::before{background:none;border-color:var(--ux-wrong-ink);
  border-width:2.5px;color:var(--ux-wrong-ink);
  text-decoration:line-through;text-decoration-thickness:2.5px;
  text-decoration-color:var(--ux-wrong-ink)}
.quiz .opt.is-dim{border-color:var(--rule);color:var(--ink2)}
.quiz .opt.is-dim::before{border-color:var(--rule);color:var(--ink2)}

/* --- el veredicto: lo que devuelve el gesto ------------------------------ */
/* Estaba a 13 px en --ink2: el premio por actuar era el texto mas pequeno y mas
   gris de la pagina.  Sube al cuerpo de la prosa, que es lo que es. */
.quiz .verdict{margin-top:1.3rem}
/* El veredicto tenia DOS bloques: el mio original y el parche D88 de Andres
   encima, los dos vivos.  Se consolidan en UNO, al final de este archivo (LOS TRES
   ESTADOS), y con sus colores.  Dejar los dos era volver a apilar modos — que es lo
   que estamos deshaciendo — y ademas el `height` del viejo ganaba sobre el nuevo y
   el cuadrado hueco salia como una raya de 2 px.  Medido en pantalla, no leido. */
.quiz .why{font-size:var(--claim);line-height:1.55;color:var(--ink);
  max-width:var(--prose)}
.quiz .anchor{border-left-width:4px;padding-left:1.15rem;margin-top:1.1em}

/* --- el cierre ---------------------------------------------------------- */
.quiz .score{margin-top:3.2rem;padding-top:1.5rem;border-top:1px solid var(--ink);
  font-size:var(--claim)}
.quiz .score b{font-size:40px}
.quiz .again{font-size:var(--claim);min-height:44px}
/* El quiz no puede ser un callejon: quien lo termina tiene un sitio al que ir, y
   el sitio ya existe en el pie de pagina.  El enlace se CLONA del pager, asi que
   no hay una cadena nueva que traducir. */
.quiz .uxnext{display:inline-block;margin-left:auto;font-size:var(--claim);
  color:var(--ink);text-decoration:none;
  border-bottom:1.5px solid var(--ink);padding-bottom:.18em;min-height:44px}
.quiz .uxnext:hover{color:var(--ink)}

@media (max-width:640px){
  .quiz{margin-top:5rem}
  .quiz .score b{font-size:32px}
  .quiz .uxnext{margin-left:0;margin-top:.4em}
}

/* Esta capa no anima nada: no hay bloque de reduced motion porque no hay nada que
   apagar.  La unica transicion que toca el quiz es la de `.opt` y vive en
   book.css, ya guardada por Andres. */

@media print{.quiz .uxnext,.fig .figread{display:none}}

/* ==========================================================================
   R6 · EL ESTADO DE VISTAZO, REHECHO
   Carlos, 2026-09-24: «en vez de estar parchando esta pagina hasta el ridiculo,
   mejor rehacerla con el nuevo plan».  Este modo es el caso mas claro y por eso
   empieza aqui.  No es un ajuste: es el modo compuesto entero.

   LOS TRES DEFECTOS, medidos en el capitulo 3 EN a 390 con emulacion:

   1. HUECOS.  Las diez figuras ocupan 3.054 px y sus titulos suman 264.  Son
      ~2.790 px de aire dentro de marcos de figura — mas de la MITAD de las 5.405
      del modo.  Tres de ellas (3.1, 3.3, 3.9) no dibujan absolutamente nada y aun
      asi reservan 175, 152 y 178 px.
   2. LARGO.  6,4 pantallas.  "Lo que deja un scroll" no puede durar seis
      pantallas y media: el modo contradice su propio enunciado, que son 113
      palabras.
   3. SIN JERARQUIA.  Lo que sobrevive son lineas sueltas, todas al mismo nivel,
      sin que nada diga cual es un titulo de seccion y cual el rotulo de una
      figura que colgaba de el.

   LA DECISION, y es una sola: EN VISTAZO UNA FIGURA ES SU TITULO.
   Ni caja, ni alto reservado, ni rotulos re-fluidos.  El propio libro lo dice —
   lo que un scroll se lleva son los titulos y los rotulos de figura, y son las
   113 palabras que el censo cuenta.  Un marco que reserva 200 px para entregar
   una linea de 24 no esta enseñando lo que un scroll deja: esta enseñando el
   hueco donde habia algo, que es una frase distinta y nadie la escribio.
   Los tres marcos que no dibujan nada dejan de ser una excepcion a documentar:
   con esta regla no existen.

   LO QUE NO TOCO, y quiero que se lea: EL COBALTO SE QUEDA.  Es D84 y el brief lo
   pone en mandatorios (§7.1) y en fuera de alcance (§10).  Ademas, releida la
   medicion, el azul no era el defecto: el defecto era que durara 6,4 pantallas.
   Una cubierta de capitulo de dos pantallas es una cubierta; de seis y media es
   un fondo. Arreglado el largo, el color hace lo que Andres dijo que hacia.
   ====================================================================== */

/* 1 · LA FIGURA ES SU TITULO.  `.gone` queda fuera: las tres ausencias disenadas
   conservan su sitio a proposito (R5) y eso sigue siendo verdad aqui. */
body[data-glance] .prose .fig:not(.gone) > *:not(figcaption){display:none}
body[data-glance] .prose .fig:not(.gone){margin:0;padding:0;min-height:0;
  width:auto;max-width:var(--prose);clear:none;aspect-ratio:auto}
body[data-glance] .prose .fig:not(.gone) > .figbox{aspect-ratio:auto;min-height:0;
  padding:0;border:0}

/* 2 · JERARQUIA.  El titulo de figura se sangra bajo el H2 del que colgaba y lleva
   un filete: deja de ser una linea suelta y pasa a ser lo que es, una entrada
   subordinada.  Es la unica estructura que anado y no usa ni un dato nuevo. */
/* El filete de ARRIBA se retira y el de la IZQUIERDA es el que queda.  El de
   arriba venia heredado y salia en unas figuras y en otras no, asi que agrupaba
   por accidente: dos titulos seguidos se leian como un bloque y el siguiente como
   otro, sin que eso significara nada.  El aire lo pone cada pie por su cuenta y
   NO una regla de hermano adyacente: entre dos `.fig` hay parrafos ocultos, asi
   que `.fig + .fig` no casa nunca y el hueco salia irregular. */
body[data-glance] .prose .fig:not(.gone) figcaption{margin:.55rem 0 0;
  padding:.05em 0 .05em 1.15rem;border-top:0;
  border-left:2px solid var(--rule);max-width:var(--prose)}

/* 3 · RITMO.  Con los huecos fuera, el aire de lectura sobra: una seccion no
   necesita 2,4rem de respiro cuando lo que trae son dos lineas.  El H2 manda y el
   resto se acerca a el. */
body[data-glance] .prose > .sec{margin:1.9rem 0 0;padding-top:0}
body[data-glance] .prose > .sec > h2{margin:0 0 .6rem}
body[data-glance] main{padding-bottom:3rem}
body[data-glance] .chapterhead{padding-bottom:1rem}

/* La linea de aprendizaje sigue fuera del vistazo: es una promesa escrita, no es
   lo que un scroll deja.  (Regla declarada arriba, en D1; se repite aqui por si
   alguien lee solo este bloque.) */

/* El titulo de figura que repite literalmente el H2 de su seccion se retira del
   vistazo (lo marca ux.js).  En la lectura se queda: alli hay ocho parrafos entre
   los dos y el pie cumple su funcion; aqui se tocan y se lee como un error. */
body[data-glance] .prose .fig[data-uxdup] figcaption{display:none}

/* ==========================================================================
   R2 ⇄ R3 · LOS DOS MODOS DE CABER.  La línea que Andrés me pidió, y su reserva.

   Andrés autorizó figura a figura `data-reflow: linear | positional` (fila A) y
   `book.js` lo aplica: **51 linear** se relinealizan y conservan el tipo a tamaño
   completo; **34 positional** escalan el tablero entero porque su significado ES
   la disposición y apilarla la deshace.

   POR QUÉ NO CONSTRUYO EL PANEO QUE IBA A CONSTRUIR.  Con la escala sola, las diez
   figuras del capítulo 3 daban 5,6–6,8 px de texto efectivo a 390 (mínimos de 4):
   el dibujo se veía y las palabras no.  Mi respuesta iba a ser un suelo de escala
   con paneo horizontal dentro de la caja.  La suya es mejor y la retiro: paneando,
   el lector ve la mitad de cada figura y tiene que arrastrar 85 veces; relinealizando,
   la figura entra entera y legible y no hay gesto que aprender.  El paneo habría
   sido yo resolviendo desde el marco un problema que se resuelve mejor dentro del
   dibujo — que es su lado.  Para las 34 positional la escala se queda, porque ahí
   apilar destruiría el dato.
   ====================================================================== */

/* MODO LINEAL.  La proporción no vale: relinealizar cambia el alto, así que una
   `aspect-ratio` recortaría el dibujo.  Ésta es la línea que `book.js` pone hoy en
   línea como apaño y que le dije que era mía. */
body[data-figframe="html"] .fig[data-mode="body-linear"] > .figbox{
  aspect-ratio:auto;height:auto}

/* Y SU RESERVA, que sin esto no existe.  No se puede saber el alto de una figura
   relinealizada sin medirla a cada ancho — que es la tabla de 241 filas que hemos
   quitado.  Pero sí se sabe un SUELO gratis: el alto que tendría escalada, que
   siempre es menor que el relinealizado.  Un `::before` flotado de padding
   porcentual lo reserva contra el ancho de la caja, y el dibujo, al aterrizar más
   alto, empuja sólo la diferencia en vez de todo el alto.  Cero datos nuevos.
   `--fnat / 9 * 1%` es `fnat / 900 * 100%`. */
body[data-figframe="html"] .fig[data-mode="body-linear"] > .figbox::before{
  content:"";display:block;float:left;width:0;
  padding-top:calc(var(--fnat, 0) / 9 * 1%)}
body[data-figframe="html"] .fig[data-mode="body-linear"] > .figbox::after{
  content:"";display:block;clear:both}

/* MODO ESCALADO.  La proporción es exacta porque el tablero está clavado en 900.
   `--fnat` sale del salvage de R0 y está medido SIN el suelo tipográfico, que sube
   las alturas entre 1,5 % y 18 %.  NO se vuelve a medir hoy: el pase de Andrés
   lleva 10 de 85 figuras y medir a mitad de pase da una tabla que nace vieja — me
   lo advirtió por escrito y tiene razón.  Se rehace con
   `web-assets/medir_fnat_pagina.py` cuando R3 termine los doce capítulos. */

/* El filete doble bajo el dibujo.  `.figbox` cierra con su `border-bottom` y
   `.figsrc` abría con un `border-top`: dos hairlines a tres píxeles una de otra,
   que no separan nada porque no hay nada entre ellas.  Se queda la de la caja,
   que es el borde del dibujo, y la atribución se apoya en ella. */
body[data-figframe="html"] .fig .figsrc{border-top:0;padding-top:0;margin-top:.7em}

/* ==========================================================================
   LOS TRES ESTADOS DEL QUIZ.  Reescritos: acertar y fallar se veian igual.

   EL DEFECTO, y es mio.  Imprimi el veredicto —que antes no salia nunca— y me
   detuve justo antes de comprobar si, ya impreso, se entiende.  Verifique en el
   DOM que los elementos existian; no abri el quiz a fallar una pregunta y mirar
   las dos pantallas juntas.  Lo que quedaba separando acierto de fallo era un
   cuadradito de 10 px y una palabra a 12 px en versalitas: a un vistazo, la misma
   pantalla.

   SON TRES ESTADOS, NO DOS, y hasta ahora solo habia dos:
     E1  la que ELEGISTE          — hoy nueva (`data-uxpick`, la escribe ux.js)
     E2  la CORRECTA              — la marca book.js con `.is-right`
     E3  el VEREDICTO             — `.uxverd`
   Cuando aciertas, E1 y E2 caen en la misma caja y tienen que leerse como UN
   acierto, no como dos marcas amontonadas.

   LA DIFERENCIA NO CROMATICA, que es la que no depende de nadie mas:
     filete solido      = esto lo hiciste tu
     filete discontinuo = esto era, pero no lo tocaste
     letra tachada      = y estaba mal
   Se lee entero sin distinguir un solo tono.

   EL COLOR ES DE ANDRES (costura §8) y se lo he pedido por escrito ANTES de
   escribir esto, en `feedback/2026-09-24-mateo-a-andres-estados-del-quiz.md`.
   Aqui solo estan los cuatro huecos.  Los valores de reserva son los de hoy, asi
   que la pantalla no se rompe mientras el decide — pero la condicion de Carlos
   («acierto y fallo tienen que distinguirse por el color tambien») NO la cumple
   la reserva: la cumple cuando el rellene los tokens.
   ====================================================================== */
:root{
  /* D89 · LOS HUECOS, RELLENOS CON LOS TRES COLORES DE MARCA.  Andres Vega.
     Carlos: "acierto y fallo tienen que distinguirse por el color tambien".  Los dos
     a la vez, entonces: color primero, forma encima.

     --ok    verde #19693F   5,86:1 sobre crema   ·  noche #63C48D  8,52:1
     --nope  ocre  #8F5E00   4,88:1 sobre crema   ·  noche #E0A733  8,46:1
     Los dos pasan de sobra el 3:1 de indicador, y ademas el 4,5:1 de texto.

     Por que ESTE par y no el obvio.  Simulando deuteranopia y protanopia sobre los
     dos valores, la distancia entre ellos se mantiene en 183 y 214 sobre 255.
     Verde/magenta —el par que uno escribe sin pensar— cae a 44 y 47: para un ojo de
     cada doce son el mismo color.  Verde/cobalto aguanta (192 / 201) pero gasta el
     cobalto, que en D84 significa "el libro se nombra"; un acierto no es el libro.
     El verde ENTRA en el sistema porque el sistema no tenia forma de decir "esto
     esta bien".  El ocre no entra: es el #8F5E00 que D84-B ya nombra para la parte 2.

     El ladrillo #C63A1C sale del sistema entero (Carlos).  Sus tres trabajos:
     el foco pasa a tinta con halo, "sin verificar" al ocre con trazo doble, y el
     acento de las figuras al tomate del libro.  Escrito en book.css, bloque D88. */
  /* D90 — el acierto pasa del ambar al VERDE derivado (book.css, bloque D90).
     El ambar vuelve a ser solo el color de la parte II: se lee como aviso, no como
     acierto, y ademas como campo obligaba a dos valores.  El verde sirve de campo
     Y de tinta con el mismo hex, porque es oscuro: crema encima 4,53:1, y el mismo
     valor sobre crema 4,53:1.  Separado del granate del fallo 146 y 95 bajo
     deuteranopia y protanopia; del cobalto, 111 y 119. */
  --ux-right:var(--ok);          /* verde: campo Y tinta */
  --ux-on-right:var(--ok-on);    /* crema sobre verde: 4,53:1 */
  --ux-right-ink:var(--ok);
  --ux-wrong:var(--p3);          /* ROSA, campo */
  --ux-on-wrong:var(--p3-on);    /* tinta sobre rosa: 9,23:1 */
  --ux-wrong-ink:var(--p3-ink);  /* filete y rotulo: 6,26:1 sobre crema */
}

/* E1 · LA QUE ELEGISTE.  Filete solido, siempre, hayas acertado o no. */
.quiz .opt[data-uxpick]{box-shadow:inset 5px 0 0 var(--ux-wrong-ink)}
.quiz .opt[data-uxpick].is-right{box-shadow:inset 5px 0 0 var(--ux-right-ink)}
.quiz .opt[data-uxpick].is-right::before{background:var(--ux-right);
  border-color:var(--ux-right);color:var(--ux-on-right)}

/* E2 · LA CORRECTA QUE NO ELEGISTE.  Filete DISCONTINUO y cuadrado en contorno
   grueso: estaba ahi, pero no la tocaste.  `box-shadow` no sabe de discontinuo,
   asi que el filete lo dibuja un `::after` — dentro del borde, sin ocupar sitio y
   sin mover una linea de texto. */
.quiz .opt.is-right:not([data-uxpick]){position:relative}
.quiz .opt.is-right:not([data-uxpick])::after{content:"";position:absolute;
  left:0;top:0;bottom:0;width:0;border-left:5px dashed var(--ux-right-ink)}
.quiz .opt.is-right:not([data-uxpick])::before{border-width:2.5px;
  border-color:var(--ux-right-ink);color:var(--ux-right-ink)}

/* E3 · EL VEREDICTO.  Era el texto mas pequeno del bloque siendo lo unico que
   contesta a la pregunta que el lector acaba de hacerse.  Pasa al serif del
   bloque, 26/22 px, con su marca a 15 px: cuadrado relleno si acertaste, cuadrado
   tachado si no.  La palabra ya la traia el generador en `data-right`/`data-wrong`. */
.quiz .uxverd{margin:0 0 .55em;font-family:var(--serif);font-weight:400;
  font-size:26px;line-height:1.2;letter-spacing:-.006em;text-transform:none;
  display:flex;align-items:center;gap:.5em}
.quiz .uxverd::before{content:"";width:15px;height:15px;flex:none;
  border:2px solid currentColor;background:none}
/* La PALABRA tambien lleva el color, no solo la marca: es la eleccion de
   Andres y es la mas fuerte de las dos. Verde 5,86:1 y ocre 4,88:1 sobre
   crema, los dos por encima de 4,5. */
/* D89 — el ROTULO va en la tinta de la familia y el CUADRADO en su campo: el ambar
   y el rosa dan 1,53:1 y 1,66:1 sobre crema, asi que como texto no valen y como
   campo son los mejores que tiene el libro.  Macizo = acierto, hueco = fallo. */
.quiz .uxverd[data-ok="1"]{color:var(--ux-right-ink)}
.quiz .uxverd[data-ok="1"]::before{background:var(--ux-right);
  border:1.5px solid var(--ux-right-ink);box-sizing:border-box}
.quiz .uxverd[data-ok="0"]{color:var(--ux-wrong-ink)}
/* El fallo NO se marca atenuando el texto: equivocarse no es un estado de menor
   importancia, es el que mas explicacion necesita.  Se marca con la misma tachadura
   que lleva la letra de la opcion fallada, para que sean el mismo signo. */
/* Relleno frente a hueco: la diferencia no cromatica mas robusta que hay a 15 px.
   La primera version dibujaba una tachadura con un degradado y a ese tamano salia
   una mancha; se ve en la captura 09 y por eso se cambia. */
.quiz .uxverd[data-ok="0"]::before{border:2.5px solid var(--ux-wrong-ink);
  background:none;box-sizing:border-box}

@media (max-width:640px){.quiz .uxverd{font-size:22px}}

/* ==========================================================================
   R6 v2 · EL RESUMEN CON SUSTANCIA, Y AL FINAL
   Se retira la regla de la v1 que dejaba la figura reducida a su titulo: era
   compacta y no decia nada.  Ahora en vistazo la figura entrega SU CAPA DE
   VISTAZO —los numeros, no el rotulo— que es lo que un scroll deja de verdad.
   Si crece, crece: 2,4 pantallas de etiquetas valen menos que cuatro de hallazgos.
   ====================================================================== */
body[data-glance] .prose .fig:not(.gone) > *:not(figcaption){display:revert}
body[data-glance] .prose .fig:not(.gone) > .figread,
body[data-glance] .prose .fig:not(.gone) > .figsrc{display:none}
body[data-glance] .prose .fig:not(.gone) > .figbox{display:block;overflow:visible;
  height:auto;aspect-ratio:auto;border:0;padding:0}
body[data-glance] .prose .fig:not(.gone) > .figbox > .figscale{width:100%;transform:none}
/* Las 21 sin capa propia no dejan un hueco: no tienen nada que dejar y se retiran
   del resumen enteras, con su pie.  Un marco vacio no es un hallazgo. */
body[data-glance] .prose .fig[data-uxnoglance]{display:none}

/* LA LINEA DE APRENDIZAJE VUELVE AL VISTAZO.  La habia escondido con el argumento
   de que una promesa escrita no es lo que un scroll deja.  Con el criterio de
   Carlos —sustancia, no rotulos— es exactamente al reves: es la frase mas
   sustanciosa del capitulo y la unica que dice que vas a poder hacer. */
body[data-glance] .uxtake{display:block}
/* Y la cuenta del censo, que es la que mide el propio resumen. */
body[data-glance] .census .censusline{display:block}

/* EL CIERRE DEL CAPITULO.  El control del vistazo, donde la demostracion ya se ha
   ganado.  Un filete de tinta lo separa de la prosa sin competir con la compuerta
   del quiz, que viene detras y lleva 4 px. */
.uxleft{max-width:var(--prose);margin:4.5rem auto 0;width:100%;
  padding-top:1.4rem;border-top:1px solid var(--rule)}
@media (min-width:1200px){.uxleft{margin-left:0;margin-right:0}}
body[data-glance] .uxleft{border-top-color:var(--rule)}

/* EL INTERRUPTOR DE LA PASADA, DENTRO DEL PANEL DEL MAPA.  Al pie del panel, con un
   filete que lo separa del indice de secciones: es una preferencia de lectura y no
   una entrada del capitulo.  Objetivo de 44 px porque es un control real. */
.uxpref{margin:1.2rem 0 0;padding-top:.9rem;border-top:1px solid var(--rule)}
.uxpref .feedbtn.uxprefbtn{display:inline-block;margin:0;padding:.3em 0;min-height:44px;
  font:inherit;font-size:var(--evidence);letter-spacing:0;text-transform:none;
  color:var(--ink2);background:none;border:0;border-bottom:1px solid var(--rule);
  cursor:pointer;text-align:left}
.uxpref .feedbtn.uxprefbtn:hover{color:var(--ink);border-bottom-color:var(--ink)}
.uxpref .feedbtn.uxprefbtn[aria-pressed="true"]{color:var(--ink);
  border-bottom-color:var(--ink)}

/* La marca del censo tambien anunciaba.  Retirado el texto, la raya de la seccion
   «en revision» seguia pintada en el acento y con su propio trazo: a un vistazo
   señalaba «esta no esta comprobada», que es justo lo que Carlos retira.  Pasa a la
   notacion de «sin fuente», que es lo que ahora dice su rotulo.  El dato sigue en
   `secciones-fuentes.json`; lo que sale es el anuncio. */
.census .ticks li[data-none="revisar"] a{border-top-color:var(--ink2)}
.rail .none[data-none="revisar"]{border-top-color:var(--ink2);border-top-style:dotted}

/* ==========================================================================
   LA LINEA DE LOS DESCARTES (sustituye a la pagina «Comprobado, y no impreso»).
   Sin regla propia salia como un parrafo por defecto pegado a un standfirst que si
   esta compuesto — un hecho del libro sobre si mismo con menos peso que el pie de
   una figura.  Va en el registro de la EVIDENCIA, que es lo que es: medida de
   evidencia, color ink2, y un filete de tinta que la separa del standfirst sin
   convertirla en un aviso.
   ====================================================================== */
.uxdiscard{max-width:var(--evid-measure);margin:1.4em 0 2.4rem;padding-top:1em;
  border-top:1px solid var(--ink);font-size:var(--evidence);line-height:1.5;
  color:var(--ink2)}
/* El margen inferior no es simetria: sin el, la linea quedaba pegada al rotulo de
   la clave de profundidad que viene debajo y se leian como un solo bloque.  Son dos
   hechos distintos — lo que se descarto y como se verifico lo que quedo. */
