/* =====================================================================
   Revista Elementos Life — version vertical de pantalla.
   Solo se carga con media="screen": el PDF nunca ve este archivo.
   El markup es el mismo de la version apaisada; aqui se reflowea.
   ===================================================================== */

@font-face{font-family:'Cormorant';src:url('../fonts/Cormorant-VariableFont_wght.ttf') format('truetype');font-weight:300 700;font-style:normal;font-display:swap;}
@font-face{font-family:'Cormorant';src:url('../fonts/Cormorant-Italic-VariableFont_wght.ttf') format('truetype');font-weight:300 700;font-style:italic;font-display:swap;}
@font-face{font-family:'Tenor Sans';src:url('../fonts/TenorSans-Regular.ttf') format('truetype');font-weight:400;font-style:normal;font-display:swap;}

:root{
  --hueso:#ECEEE8;
  --tinta:#303030;
  --salvia:#B6B9AF;
  --selva:#6E7A73;
  --agua:#6EA7A3;
  --ancho-col:520px;
  --margen:24px;
}

*{margin:0;padding:0;box-sizing:border-box;}

/* El contenedor de encaje es el <html>, no el <body>: es el elemento que de
   verdad scrollea (`document.scrollingElement.tagName === 'HTML'`), asi que
   toda propiedad de scroll va declarada aqui — height, overflow-y,
   scroll-snap-type y overscroll-behavior-y — en vez de confiar en que algo
   se propague desde el body.
   Antes `height`/`overflow-y` vivian en el body y llegaban al viewport por
   la propagacion que manda CSS Overflow (16.3.1 del HTML spec): si el body
   es hijo unico del html y el overflow del html es `visible`, el navegador
   usa el overflow del body para el viewport. Funcionaba, pero dependia de
   una regla que no todas las propiedades de scroll comparten, y el plan de
   esta revista pedia las tres aqui. `scroll-snap-type` es de las pocas que
   NO se propagan —css-scroll-snap-1 lo dice con todas sus letras: "unlike
   overflow, scroll-snap-type values are not propagated from HTML body"—: en
   la Task 4 quedo declarado en el body y el encaje entero no hacia nada, en
   ningun navegador, sin que se notara.
   `overscroll-behavior-y` es el mismo bug otra vez: la spec dice que "applies
   to: scroll container elements", y el body de esta pagina no es uno —se
   comprobo forzando `document.body.scrollTop = 100` y quedandose en 0—
   aunque su overflow COMPUTADO siga leyendo "scroll" (el valor USADO, una
   vez propagado, es "visible"). Declarada en body no hacia nada; en html si
   corta la elasticidad al llegar al tope. */
html{
  scroll-behavior:smooth;
  height:100dvh;
  overflow-y:scroll;
  scroll-snap-type:y mandatory;
  overscroll-behavior-y:contain;
}

body{
  font-family:'Cormorant',Georgia,serif;
  color:var(--tinta);
  background:var(--hueso);
  -webkit-font-smoothing:antialiased;
}

/* Las <section class="page"> pierden su tamano de papel por completo: la
   unidad de pantalla ya no son ellas, son sus hijos .pantalla. */
.page{
  display:contents;
}

.pantalla{
  position:relative;
  min-height:100dvh;
  scroll-snap-align:start;
  scroll-snap-stop:always;
  display:flex;
  flex-direction:column;
  justify-content:center;
  padding:calc(var(--margen) + env(safe-area-inset-top)) var(--margen)
          calc(56px + env(safe-area-inset-bottom));
  margin:0 auto;
  /* Nada de lo de adentro se decidio pensando en 320-390px: sin el min()
     con 100% una tabla o una fila con varias columnas se sale de la
     columna en vez de encogerse. */
  max-width:min(var(--ancho-col), 100%);
  /* El gesto del recorrido normal es deslizar para avanzar, no pellizcar: sin
     esto el navegador trae pinch-zoom por defecto (touch-action es "auto" en
     toda la pagina, medido, no supuesto) y el pellizco amplia la revista
     entera en vez de abrir el visor. Se declara aqui y no en html/body a
     proposito: el dialog del visor (Task 10, revista.js) cuelga de body como
     hermano de las .pantalla, no como su hijo, y touch-action se resuelve por
     interseccion con TODOS los ancestros del punto de toque — si quedara en
     html o body, esa misma restriccion le llegaria tambien al visor y el
     pellizco de adentro dejaria de funcionar. Restringido aqui, el dialog
     nunca desciende de un elemento con pan-y y su propio touch-action
     (pinch-zoom pan-x pan-y, en .visor-lienzo) llega intacto. */
  touch-action:pan-y;
}

/* Las pantallas mas altas que el telefono —carta editorial y reportaje—
   encajan arriba y se leen scrolleando. Que se puedan leer por dentro no es
   una esperanza, es una garantia de la especificacion: cuando el area de
   encaje es MAS ALTA que el viewport, toda posicion en la que el area lo
   cubre es una posicion de encaje valida, siempre que entre la posicion
   valida anterior y la siguiente quepa mas de un viewport. Aqui se cumple con
   holgura —la carta mide 1407px y el hueco entre su inicio y el inicio de la
   apertura siguiente es de 1407px, contra 844 de viewport; el reportaje mide
   1747 sobre el mismo margen—, o sea que el lector recorre el texto entero
   sin que el encaje lo devuelva al principio. Lo comprueba tests/test_encaje.py.
   `scroll-snap-stop:normal` ademas evita que el impulso se corte a media
   lectura: pasar por encima de una pantalla alta no es saltarse contenido,
   porque la pantalla alta no se abandona hasta que se termina de recorrer. */
.pantalla.alta{
  justify-content:flex-start;
  scroll-snap-stop:normal;
}

/* Las de foto a sangre se salen del ancho de columna y ocupan todo. */
.pantalla.sangre{
  max-width:none;
  padding:0;
  justify-content:flex-end;
}

/* ---------- tipografia de pantalla ---------- */
.pantalla p{
  font-size:18px;
  line-height:1.6;
  font-weight:400;
  text-align:left;      /* nada de justify: en 340px abre rios blancos */
  hyphens:none;         /* Victoria, 8-ago: las palabras van completas */
}
.pantalla p + p{
  text-indent:0;        /* en pantalla la sangria se cambia por aire */
  margin-top:1.1em;
}

.pantalla h2{
  font-size:30px;font-weight:300;line-height:1.15;
  margin-bottom:20px;
}
.pantalla h3{
  font-size:22px;font-weight:400;line-height:1.25;
  margin-bottom:12px;
}
.pantalla .eyebrow{
  font-family:'Tenor Sans',sans-serif;font-size:11px;letter-spacing:.34em;
  text-transform:uppercase;color:var(--selva);
  margin-bottom:16px;
}
.pantalla .cierre{
  font-size:14px;line-height:1.55;color:var(--selva);
  margin-top:24px;padding-top:14px;
  border-top:1px solid var(--salvia);
}
.pantalla .capitular::first-letter{
  font-size:64px;line-height:.8;float:left;font-weight:300;
  margin:4px 8px 0 0;color:var(--selva);
}
.pantalla .rombo{
  display:inline-block;width:9px;height:9px;border:1px solid var(--selva);
  transform:rotate(45deg);margin-left:7px;vertical-align:middle;
}

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

/* Tope de ancho solo donde el contenido trae un tamano propio que no viene del
   texto: imagenes, figuras y tablas. NO se hereda a todo `.pantalla *`.
   Un `*{max-width:100%}` frena el desborde, si, pero de paso apaga a
   `test_sin_desborde_horizontal_a_320`, que es el unico vigilante que tiene
   este reflow. Esta comprobado, no es una sospecha: se metio a proposito un
   `.sumario .sub{width:520px}` en un viewport de 320px y
     - con la regla acotada, como esta ahora, el test truena:
       "pantallas que desbordan a 320px: [[2, 544]]"
     - con `.pantalla *{max-width:100%}` encima, el MISMO desperfecto pasa en
       verde.
   O sea que la red de seguridad amplia no protegia: tapaba. Lo que desborde
   a partir de aqui se arregla en el layout que lo causa. */
.pantalla table{width:100%;border-collapse:collapse;}
.pantalla th,.pantalla td{overflow-wrap:break-word;}
.pantalla img,
.pantalla figure,
.pantalla svg{max-width:100%;}
/* Palabras sueltas mas anchas que la columna a 320px (URLs, "32,396.04 m²"). */
.pantalla{overflow-wrap:break-word;}

/* Los folios del papel no van en pantalla: los sustituye el contador de
   revista.js, que ademas dice en cual de las 48 vas. */
.folio{display:none;}

/* La firma vertical al filo de la pagina es un recurso de papel. */
.pie-vertical{
  writing-mode:horizontal-tb;
  font-family:'Tenor Sans',sans-serif;font-size:9px;letter-spacing:.28em;
  text-transform:uppercase;color:var(--selva);
  /* En vertical no habia interlinea porque cada credito era un renglon; a lo
     ancho del telefono el mas largo —"Conjunto entre la selva · render de
     proyecto"— parte en dos y los renglones se tocaban. */
  line-height:1.8;
}
/* Los ocho .pie-vertical traen su posicion Y su color en un atributo style
   —`right:7mm; top:16mm; color:rgba(255,255,255,.85)`—, medidos sobre la
   pagina de 280x210mm y sobre el punto exacto de la foto donde caian en papel.
   En el telefono la foto se recorta y se reencuadra, asi que esas coordenadas
   ya no apuntan a nada: el credito de las aperturas aterrizaba encima del
   titular, y el de la carta y el del reportaje quedaban en blanco sobre cielo
   claro o sobre arena. Un atributo style solo se desactiva con `!important`,
   de modo que aqui se neutralizan de golpe las cuatro coordenadas y el color,
   y el pie pasa a ser un elemento mas del flujo. Cada familia lo recoloca
   abajo: en las aperturas vuelve a blanco, porque ahi si hay degradado
   oscuro debajo; en las demas se queda en selva sobre el hueso, que es
   donde se lee siempre.
   OJO con el color: la primera version de este arreglo puso --salvia, que a
   9px sobre --hueso da 1.7:1 de contraste — ilegible, y por el extremo
   contrario del problema que motivo el arreglo. --selva sobre --hueso da
   3.8:1, que si se lee. Si se vuelve a tocar este color, medir el contraste
   antes de subirlo, no despues. */
.pantalla .pie-vertical{
  inset:auto !important;
  color:var(--selva) !important;
}
/* Fuera de las aperturas el credito es una linea de cierre alineada al filo
   derecho de la columna, no un rotulo encima de la imagen. */
.editorial .pie-vertical,
.reportaje .pie-vertical,
.espacio .pie-vertical{text-align:right;}

/* Marca de continuacion: la pantalla no abre, sigue.
   Tres paginas apaisadas se partieron en dos y la segunda mitad empieza en
   frio, sin titulo ni cintillo de seccion. El texto editorial no se puede
   repetir, asi que la senal es tipografica: una linea fina que entra desde
   fuera del margen y muere a media columna. Una regla que viene de la
   izquierda —de la pantalla anterior— y no un remate simetrico. */
.pantalla.continua::before{
  content:"";position:absolute;left:0;
  top:calc(30px + env(safe-area-inset-top));
  width:calc(var(--margen) + 38px);height:1px;background:var(--salvia);
}
/* Los 30px estan medidos para una pantalla centrada, donde arriba solo hay
   hueso. En una pantalla alta el contenido arranca pegado al borde superior
   —el padding es de 24px— y la marca le cae encima: en la del mapa de zona
   cruzaba la esquina del mapa, y en la de las etapas quedaba a 6px del filete
   de la primera etapa, o sea leyendose como una regla doble. Aqui sube a la
   banda de padding, que es el unico hueco que queda. */
.pantalla.alta.continua::before{top:calc(9px + env(safe-area-inset-top));}

/* =====================================================================
   FOTO A SANGRE · portada y las cuatro aperturas de seccion
   ===================================================================== */
.pantalla.sangre img.foto{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;z-index:0;max-width:none;
}
/* <picture> no genera caja: su unico hijo en flujo es el img, y el img es
   absoluto. Se deja explicito para que nadie lo convierta en un bloque. */
.pantalla.sangre picture{display:contents;}

/* ---------- portada ----------
   La portada vertical es una foto luminosa —cielo, mar, arena— y el degradado
   oscuro de las aperturas la ensuciaria: aqui no lleva. El texto va en tinta
   sobre las dos franjas que la propia foto deja limpias, medidas sobre el
   archivo: el cielo (0-30% del alto, sin una sola rama) y la banda de arena
   entre las camastras y las plantas del primer plano (59.5-67.5%). El
   horizonte cae al 48%, casi al centro exacto, y es justo lo que separa los
   dos bloques: identidad arriba del mar, promesa abajo.
   Las plantas verdes del primer plano ocupan el tercio inferior izquierdo:
   ahi no cae ni una letra. La foto no se toca (encuadres.json), se mueve el
   texto. Las medidas van en dvh y no en px porque en este lienzo la foto se
   recorta de ancho y no de alto —9:16 de origen contra 0.46 de pantalla—,
   asi que un porcentaje de alto de pantalla ES el mismo porcentaje de la
   foto. */
.portada .pantalla.sangre{
  padding:calc(2.4dvh + env(safe-area-inset-top)) var(--margen) 0;
  justify-content:flex-start;
  text-align:center;
}
.portada .pantalla.sangre::after{content:none;}
.portada .logo{width:min(132px,34%);margin:0 auto;position:relative;z-index:2;}
.portada .destino{
  position:relative;z-index:2;margin-top:-14px;
  font-family:'Tenor Sans',sans-serif;font-size:9.5px;letter-spacing:.4em;
  text-transform:uppercase;color:#39403A;
}
.portada .eslogan{
  position:relative;z-index:2;margin-top:24px;
  font-size:31px;font-weight:300;line-height:1.16;color:#2C322E;
}
.portada .eslogan em{font-style:italic;}
.portada .coverline{
  position:absolute;z-index:2;left:var(--margen);right:var(--margen);top:60dvh;
  /* Los cuatro nombres de seccion no caben en un renglon a 342px, y tanto el
     corte natural como `text-wrap:balance` partian "LOS ESPACIOS / COMUNES"
     por la mitad. Con 9px y .15em de tracking el primer renglon llega hasta
     el tercer separador y el corte cae donde debe, entre secciones. Si se
     toca cualquiera de los dos valores hay que volver a mirar el corte. */
  font-family:'Tenor Sans',sans-serif;font-size:9px;letter-spacing:.15em;
  text-transform:uppercase;color:#39403A;line-height:1.85;
  border-top:1px solid rgba(48,54,49,.32);padding-top:12px;
}

/* ---------- aperturas de seccion ----------
   Aqui si va degradado: son cuatro fotos oscuras de selva y de fachada, y el
   texto es blanco. Sube hasta el 66% porque en apertura-residencias.jpg hay
   unos sillones blancos a la altura del 73-85% del alto, justo debajo del
   bloque de texto; con el degradado corto se leia gris sobre blanco. */
.apertura .pantalla.sangre{justify-content:flex-end;}
.apertura .pantalla.sangre::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(to top,
    rgba(24,29,26,.80) 0%,
    rgba(24,29,26,.62) 24%,
    rgba(24,29,26,.30) 46%,
    rgba(24,29,26,0)   68%);
}
/* El aire de abajo lo pone ahora el credito, que va despues en el flujo. */
.apertura .bloque{
  position:relative;z-index:2;
  padding:0 var(--margen) 16px;
}
.apertura .romano{
  font-family:'Tenor Sans',sans-serif;font-size:10px;letter-spacing:.4em;
  text-transform:uppercase;color:rgba(255,255,255,.82);
}
.apertura h1{
  font-size:34px;font-weight:300;line-height:1.1;color:#fff;
  margin:14px 0 12px;
}
/* El salto forzado esta calculado para 280mm de ancho; en 342px parte la
   frase donde no toca. En pantalla que reparta el navegador.
   OJO: `display:none` sobre un <br> no deja un espacio en su lugar —pega las
   dos palabras: "queda"+"uno" salia "quedauno"—, y en Chromium tampoco se
   puede convertir un <br> en espacio desde CSS (`content` no aplica a un
   elemento vacio de reemplazo). Por eso los cuatro titulares llevan un
   espacio ANTES del <br> en el HTML: en papel es un blanco al final de
   renglon, que se descarta, y en pantalla es la separacion entre palabras.
   Si alguien agrega un titular de apertura con salto, tiene que poner el
   espacio tambien. */
.apertura h1 br{display:none;}
.apertura .bajada{
  font-size:18px;font-style:italic;font-weight:300;line-height:1.45;
  color:rgba(255,255,255,.92);
}
/* El credito cierra la pantalla: va debajo de la bajada, alineado con ella y
   dentro del tramo mas oscuro del degradado (.80), que es el unico sitio de
   una apertura donde el blanco se lee sin excepcion. `position:relative` es
   para entrar al z-index 2 y quedar por encima del degradado; el inset ya
   viene neutralizado arriba, asi que no se mueve de su sitio en el flujo. */
.apertura .pie-vertical{
  position:relative;z-index:2;
  color:rgba(255,255,255,.72) !important;
  padding:0 var(--margen) calc(52px + env(safe-area-inset-bottom));
}

/* =====================================================================
   SUMARIO · el indice navegable
   ===================================================================== */
.sumario .pantalla{justify-content:flex-start;}
/* En papel el sumario comparte pliego con una foto de palma a toda altura.
   En el telefono el indice es la pantalla mas funcional de la revista y cabe
   entero sin scroll solo si la foto se queda en una banda. */
.sumario .lado-img{
  width:calc(100% + var(--margen) * 2);
  margin:calc(-1 * (var(--margen) + env(safe-area-inset-top)))
         calc(var(--margen) * -1) 22px;
}
.sumario .lado-img img{width:100%;height:11dvh;object-fit:cover;}
.sumario h1{font-size:40px;font-weight:300;font-style:italic;line-height:1;margin-bottom:10px;}
.sumario .sub{font-size:18px;line-height:1.45;color:var(--selva);margin-bottom:18px;}
.sumario .lista{border-top:1px solid var(--salvia);}
.sumario .item{
  display:grid;grid-template-columns:26px 1fr;gap:3px 12px;align-items:baseline;
  padding:11px 0;border-bottom:1px solid var(--salvia);
}
.sumario .num{font-family:'Tenor Sans',sans-serif;font-size:12px;color:var(--agua);}
.sumario .tit{font-size:20px;font-weight:300;line-height:1.15;}
.sumario .des{grid-column:2;font-size:14px;line-height:1.45;color:var(--selva);}
/* El brief pedia --salvia aqui, pero a 9px sobre --hueso eso es 1.7:1 de
   contraste, ilegible (mismo defecto que el credito de foto, arreglado
   arriba). --selva da 3.8:1. El brief estaba mal en este punto. */
.sumario .marca{
  font-family:'Tenor Sans',sans-serif;font-size:9px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--selva);line-height:1.9;margin-top:18px;
}

/* =====================================================================
   TEXTO LARGO · carta editorial y reportaje
   Las dos pasan del alto del telefono y llevan `.pantalla.alta`: encajan
   arriba y se leen scrolleando. El encaje no se pelea con ellas porque una
   pantalla mas alta que el viewport tiene TODA su altura como posicion de
   encaje valida; lo unico que hay que quitarle es el `snap-stop:always`,
   que corta el impulso a media lectura.
   ===================================================================== */
.pantalla.alta .cuerpo{
  column-count:1;          /* en papel van a 2 y 3 columnas; aqui a una */
  font-size:18px;line-height:1.7;
}
.pantalla.alta .cuerpo p{text-align:left;}

/* ---------- carta editorial ---------- */
.editorial .lado-img{
  width:calc(100% + var(--margen) * 2);
  margin:calc(-1 * (var(--margen) + env(safe-area-inset-top)))
         calc(var(--margen) * -1) 9px;
}
.editorial .lado-img img{width:100%;height:30dvh;object-fit:cover;}
/* En el DOM el credito va justo detras de la foto, asi que en el flujo cae
   solo donde debe: pie de foto, debajo de su foto. */
.editorial .pie-vertical{margin-bottom:16px;}
.editorial h1{font-size:38px;font-weight:300;line-height:1.04;margin:8px 0 20px;}
/* El spec pide 18px de cuerpo para TODO parrafo de pantalla, y la firma es un
   <p>. En Tenor a 18px con versalitas ocupa dos renglones y pesa mas que el
   ultimo parrafo de la carta; en cursiva a 18px se lee por lo que es. */
.editorial .firma{
  font-size:18px;font-style:italic;font-weight:400;line-height:1.4;
  color:var(--selva);margin-top:26px;text-indent:0;letter-spacing:0;
}

/* ---------- reportaje ---------- */
.reportaje h2{font-size:31px;line-height:1.08;margin-bottom:22px;}
.reportaje .cols{display:block;}
/* La columna de datos deja de ser una barra lateral y pasa a ser lo que ya
   era en el fondo: la ficha con la que cierra el articulo. */
.reportaje .lateral{
  margin-top:30px;border-top:1px solid var(--salvia);padding-top:18px;
}
.reportaje .dato{margin-bottom:16px;}
.reportaje .dato dt{
  font-family:'Tenor Sans',sans-serif;font-size:10px;letter-spacing:.26em;
  text-transform:uppercase;color:var(--agua);margin-bottom:5px;
}
.reportaje .dato dd{font-size:16px;line-height:1.5;}
.reportaje .banda{
  width:calc(100% + var(--margen) * 2);
  margin:9px calc(var(--margen) * -1) calc(-56px - env(safe-area-inset-bottom));
}
.reportaje .banda img{width:100%;height:26dvh;object-fit:cover;}
/* La banda es lo ultimo del DOM y sangra por el borde inferior; el credito va
   detras de ella. Con `order` la banda pasa al final y el credito queda justo
   encima, sobre el hueso: es su pie de foto y no un rotulo sobre el cielo
   claro de la propia banda, que es donde caia. */
.reportaje .banda{order:1;}
.reportaje .pie-vertical{margin-top:32px;}

/* =====================================================================
   ESPACIOS COMUNES · foto arriba, texto abajo
   ===================================================================== */
.espacio .pantalla{justify-content:flex-start;}
.espacio img.foto{
  width:calc(100% + var(--margen) * 2);max-width:none;
  height:34dvh;object-fit:cover;
  margin:calc(-1 * (var(--margen) + env(safe-area-inset-top)))
         calc(var(--margen) * -1) 26px;
}
/* El credito cierra la pantalla abajo a la derecha, sobre el hueso. Sobre la
   foto no cabe: las dos fotos de espacio —alberca y acceso a playa— tienen
   cielo claro justo en la banda donde caia el rotulo blanco. Va absoluto y no
   en el flujo porque en flujo empujaba las dos pantallas por encima del alto
   del telefono (875px y 847px contra 844) y les cortaba el pie; asi las dos
   siguen midiendo exactamente una pantalla. Los offsets llevan !important
   porque compiten con el atributo style de la pagina de papel. */
.espacio .pie-vertical{
  position:absolute;
  right:var(--margen) !important;
  bottom:calc(22px + env(safe-area-inset-bottom)) !important;
}
.espacio h2{font-size:26px;line-height:1.14;margin-bottom:18px;}
.espacio h2 .eyebrow{color:var(--selva);}
.espacio .cuerpo{column-count:1;font-size:18px;line-height:1.65;}

/* =====================================================================
   DUPLAS · dos espacios que en papel se reparten un pliego
   En papel el ojo se reparte entre las dos mitades y se pierde media pagina.
   Aqui cada mitad tiene su pantalla completa: misma foto, mismo aire, mismo
   tamano de titulo. Son dos piezas hermanas, no una partida por la mitad.
   ===================================================================== */
/* Las dos mitades van centradas, no alineadas por la foto. Se probo lo otro
   —fijar el tope de la segunda mitad al 23dvh para que su foto arrancara a la
   misma altura que la de su hermana— y sale peor: la primera mitad llena esa
   franja con el cintillo y el titular, y la segunda, que no los tiene, se
   quedaba con 388px de hueso vacio arriba. Centradas, el aire sobrante se
   reparte entre arriba y abajo (unos 270px de cada lado) y ninguna de las dos
   pantallas tiene un hueco muerto. Lo que las hace hermanas es que compartan
   escala —misma altura de foto, mismo cuerpo, mismo tamano de h3—, no que
   compartan horizonte. */
.dupla .pantalla{justify-content:center;}
/* La segunda mitad de El Nido es la unica sin foto: en papel comparte la ancha
   con su hermana, y aqui se queda con titulo, un parrafo y el pie de plano.
   Con la marca de continuacion clavada al filo superior quedaba una rayita
   suelta a 480px de lo unico que hay en la pantalla. Sin `position:absolute`
   el ::before deja de flotar y entra como primer item del flex, o sea que
   viaja con el bloque centrado y encabeza el texto, que es su trabajo: decir
   que esto viene de la pantalla anterior. Sigue entrando desde fuera del
   margen izquierdo. */
.dupla .pantalla.continua:not(:has(img))::before{
  position:static;
  align-self:flex-start;
  margin:0 0 20px calc(var(--margen) * -1);
}
.dupla h2{font-size:28px;line-height:1.12;margin-bottom:22px;}
.dupla img.ancha,
.dupla .mitad img{
  width:calc(100% + var(--margen) * 2);max-width:none;
  height:30dvh;object-fit:cover;
  margin:0 calc(var(--margen) * -1) 22px;
}
.dupla .mitad h3{font-size:23px;font-weight:300;line-height:1.18;margin-bottom:10px;}
.dupla .cierre{font-style:italic;}

/* =====================================================================
   PAGINAS DE DATOS · fichas, tablas de unidades, mapas y plantas
   Las 30 pantallas que lee quien esta evaluando gastar mas de cien mil
   dolares: metros cuadrados, tipologias y plantas arquitectonicas. En papel
   todas viven en retículas de tres, cuatro y cinco columnas medidas sobre
   280mm de ancho. En 342px ninguna de esas retículas existe, asi que aqui se
   rehacen enteras — pero con un solo puñado de patrones, no uno por pagina:
   la ficha etiqueta/valor, la tabla de unidades hecha ficha, el documento con
   zoom y la foto a sangre. Que se repitan es lo que hace que la revista se
   lea como una sola pieza y no como treinta soluciones distintas.

   NOTA de color, que ya costo una regresion: print.css pone las etiquetas de
   ficha en --agua, y sobre --hueso eso mide 2.3:1 de contraste (formula de
   luminancia relativa WCAG). A 6.4pt impresos en papel funciona; a 10.5px en
   una pantalla, no. Aqui TODA etiqueta va en --selva, que da 3.8:1 — el mismo
   arreglo que la Task 8 aplico al credito de foto. --agua se queda solo para
   el numeral grande de las etapas (30px, y la informacion esta repetida en el
   rotulo de al lado), igual que .sumario .num.
   ===================================================================== */

/* ---------- el patron de ficha: etiqueta arriba, dato abajo ----------
   Se probo primero a dos columnas (etiqueta fija a la izquierda, valor a la
   derecha), que es mas compacto. No aguanta este contenido: etiquetas como
   "Aeropuerto internacional" en Tenor con .24em de tracking parten en tres
   renglones dentro de una columna de 96px, y a 320px el valor se queda con
   176px. Apiladas, la etiqueta ocupa su renglon completo y ninguna de las
   ocho fichas de la revista se rompe. */
.ubicacion .pie,
.lote .fichab,
.lote .cerca,
.fichapag .ficha,
.servicios .rejilla,
.lamina .pie,
.cierre-pag .contacto{
  border-top:1px solid var(--salvia);
  margin-top:24px;
}
.ubicacion .pie .b,
.lote .fichab .fila,
.lote .cerca .b,
.fichapag .ficha .fila,
.servicios .rejilla .celda,
.lamina .pie .b,
.cierre-pag .contacto .b{
  padding:13px 0;
  border-bottom:1px solid var(--salvia);
}
.ubicacion .pie dt,
.lote .fichab .k,
.lote .cerca dt,
.fichapag .ficha .k,
.servicios .rejilla dt,
.lamina .pie dt,
.villa .datos dt,
.cierre-pag .contacto dt{
  font-family:'Tenor Sans',sans-serif;font-size:10.5px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--selva);
  margin-bottom:6px;
}
.ubicacion .pie dd,
.lote .fichab .v,
.lote .cerca dd,
.fichapag .ficha .v,
.servicios .rejilla dd,
.lamina .pie dd,
.villa .datos dd,
.cierre-pag .contacto dd{
  font-size:17px;line-height:1.45;
}
/* La lamina del nivel 1 del edificio C reparte nueve departamentos en cinco
   bloques y tres de ellos son continuacion del anterior: su <dt> viene vacio
   a proposito. Sin esto quedaria un renglon en blanco con su margen. */
.pantalla dt:empty{display:none;}

/* ---------- pies de foto de las paginas de datos ----------
   Mismo rotulo micro que el resto de la revista. Va en --selva y no en
   --salvia por lo que dice la nota de color de arriba. */
.lote figcaption,
.fichapag figcaption,
.servicios figcaption,
.lamina figcaption,
.cierre-pag figcaption{
  font-family:'Tenor Sans',sans-serif;font-size:10px;letter-spacing:.22em;
  text-transform:uppercase;color:var(--selva);
  margin-top:9px;line-height:1.7;
}

/* ---------- fotos de las paginas de datos ----------
   La fotografia sangra y el documento no. Es la regla que separa las dos
   familias de imagen de esta revista: una foto de fachada o de caseta gana
   ocupando el ancho entero del telefono; un mapa o una planta pierde, porque
   deja de leerse como lamina y sus rotulos interiores se van al filo. */
.fichapag .arriba figure img,
.servicios .arriba figure img,
.cierre-pag .arriba figure img{
  width:calc(100% + var(--margen) * 2);max-width:none;
  height:27dvh;object-fit:cover;
  margin:24px calc(var(--margen) * -1) 0;
}

/* ---------- mapas, masterplan y plantas: los 15 documentos con zoom ----------
   Van DENTRO de la columna, no a sangre, y por dos razones medidas:
   1) la nota "Centro de Cozumel, 5 km" del mapa de zona esta dibujada a 43px
      del filo izquierdo del JPG y a 32 del inferior, sobre un lienzo de
      1200x1600. A sangre eso son 14px del borde del telefono y se lee como un
      descuido de produccion; dentro de la columna es un rotulo interior de la
      lamina, con sus 24px de hueso alrededor, y esta bien donde esta.
   2) la atribucion de CARTO es obligatoria por licencia y tiene que leerse
      como pie de SU mapa. Un mapa a sangre y un pie dentro del margen no se
      leen como una sola unidad.
   El filete de salvia acota la lamina: los tres mapas de CARTO y las plantas
   tienen fondo claro, casi del tono del hueso, y sin filete se derraman. */
.pantalla picture{display:block;}
.pantalla img.zoom{
  width:100%;max-width:100%;display:block;
  border:1px solid var(--salvia);
  cursor:zoom-in;
}
/* El pie de zoom es interfaz, no editorial: en papel no existe (print.css).
   Alineado a la derecha a proposito — un rotulo a la izquierda debajo de una
   imagen se lee como pie de foto, y esto no describe la imagen, ofrece una
   accion. El cuadradito es el marco que se abre; sin sombra ni relleno. */
.pie-zoom{
  display:flex;align-items:center;justify-content:flex-end;gap:8px;
  font-family:'Tenor Sans',sans-serif;font-size:10px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--selva);
  margin-top:10px;
}
.pie-zoom::after{
  content:"";width:11px;height:11px;flex:none;
  border:1px solid var(--selva);
}
/* Cinco de los quince documentos con zoom caen por debajo de 170px de alto a
   ancho de columna (masterplan y las cuatro plantas de A y C que NO
   comparten pie, medido en el DOM): ahi ni las cotas ni los numeros de la
   leyenda se leen, y "Toca para ampliar" por si solo deja pensar que lo que
   se ve YA es el documento, nomas chico. El texto de esas cinco cambia a
   "Miniatura · toca para ampliar" en el HTML —mismo mecanismo, mismo
   elemento, nada nuevo en el CSS— para nombrar lo que son antes de invitar
   al toque: no es el plano reducido, es una miniatura. No se resuelve
   agrandando la imagen —rompería la escala que comparten las treinta
   pantallas de datos— ni con un mecanismo aparte: es la misma pieza de
   interfaz, diciendo la verdad. El problema de fondo lo resuelve el visor a
   pantalla completa de la Task 10; esto es lo que le toca a esta tarea
   mientras tanto: que la pantalla no prometa una lectura que no puede dar. */

/* =====================================================================
   UBICACION · los tres acercamientos, una pantalla cada uno
   ===================================================================== */
/* Los tres mapas verticales son 1200x1600, o sea que a ancho de columna miden
   lo mismo los tres: se leen como una serie de tres laminas del mismo juego,
   que es justo lo que son. La segunda —Cozumel— llega con el mapa y una sola
   palabra de texto, y ese vacio no se disimula metiendole relleno: se explica.
   Por eso lleva la marca de continuacion, igual que la tercera: no abren,
   siguen a la primera, que es la que trae el cintillo y el titular. */
.ubicacion figcaption{
  font-family:'Tenor Sans',sans-serif;font-size:12px;letter-spacing:.3em;
  text-transform:uppercase;color:var(--tinta);
  margin-top:15px;
}
/* El pie del mapa de zona trae dos registros dentro de un mismo texto que no
   se puede tocar: el rotulo del lugar y la atribucion de licencia. Los tres
   <span> del HTML permiten darles peso distinto en pantalla sin cambiar una
   palabra; en papel los tres son inline y el renglon sale identico, incluido
   el separador — que aqui se apaga porque los dos registros ya no comparten
   renglon. */
.ubicacion figcaption .sep{display:none;}
.ubicacion figcaption .atribucion{
  display:block;margin-top:8px;
  font-size:10.5px;letter-spacing:.08em;text-transform:none;
  color:var(--selva);
}
/* Mexico y Cozumel (pantallas 3 y 4) traian el mismo defecto que el pie de
   zona antes de esta correccion: son tiles de basemaps.cartocdn.com y la
   licencia obliga "© OpenStreetMap · © CARTO" con CADA mapa, no una vez por
   pagina. En papel las tres laminas viven en la misma pagina y el pie de la
   tercera —la de zona, arriba— cubre a las tres con un solo credito; partido
   en pantallas separadas eso deja a Mexico y Cozumel sin ninguna atribucion.
   Este parrafo es nuevo, no una reestructuracion del figcaption existente
   (esa figcaption, "Mexico"/"Cozumel", no se toca): por eso es interfaz y no
   editorial, y por eso print.css lo apaga junto con .pie-zoom — en papel el
   credito de la pantalla 5 sigue siendo el unico que se imprime, exactamente
   como antes de este arreglo. */
.ubicacion .atribucion-interfaz{
  margin-top:8px;
  font-family:'Tenor Sans',sans-serif;font-size:10.5px;letter-spacing:.08em;
  color:var(--selva);
}

/* =====================================================================
   EL LOTE D2 · satelital + ficha, y la segunda pantalla con las distancias
   ===================================================================== */
.lote h2{font-size:29px;line-height:1.1;}
.lote .caja figure{margin-top:6px;}
.lote .nota{margin-bottom:4px;}

/* =====================================================================
   FICHA DE ARQUITECTURA · texto y foto arriba, ficha en la segunda pantalla
   ===================================================================== */
.fichapag h2{font-size:29px;line-height:1.1;}

/* =====================================================================
   MASTERPLAN · el plano numerado y su leyenda de diecinueve espacios
   ===================================================================== */
.mapa h2{font-size:28px;line-height:1.1;}
.mapa .lienzo{margin-top:4px;}
.mapa .leyenda{
  border-top:1px solid var(--salvia);
  margin-top:26px;padding-top:20px;
}
/* Sin `:last-child{margin-bottom:0}`, que parecia limpieza y era un defecto:
   en papel la leyenda son cuatro columnas y cada una cierra con un grupo que
   ES su ultimo hijo. Apilada en una sola columna, ese cero borraba el aire
   justo en los tres saltos de columna —"Al aire libre", "El Nido" y
   "Deporte" quedaban pegados al ultimo renglon del grupo anterior— y la
   leyenda perdia su division cada cuatro grupos. */
.mapa .grupo{margin-bottom:22px;}
.mapa .grupo h3{
  font-family:'Tenor Sans',sans-serif;font-size:10.5px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--selva);font-weight:400;
  margin-bottom:9px;
}
.mapa .grupo ul{list-style:none;}
/* El numero y su texto son dos items del grid: asi los diecinueve numeros
   quedan en una sola columna y la lista se recorre por el numero, que es como
   se lee contra el plano. El texto suelto que sigue al <b> entra como item
   anonimo del grid — es lo que manda la spec de grid para el texto directo. */
.mapa .grupo li{
  display:grid;grid-template-columns:27px minmax(0,1fr);
  align-items:baseline;
  padding:4px 0;font-size:18px;line-height:1.4;
}
.mapa .grupo li b{
  font-family:'Tenor Sans',sans-serif;font-size:12px;font-weight:400;
  color:var(--selva);
}
.mapa .grupo .adicional{font-style:italic;color:var(--selva);line-height:1.45;}

/* =====================================================================
   LAS CUATRO ETAPAS
   ===================================================================== */
.etapas h2{font-size:29px;line-height:1.1;}
/* La primera pantalla es titular + vista aerea del conjunto. Centrada dejaba
   la banda flotando a media altura con hueso muerto arriba y abajo, que es la
   forma mas rapida de que una pantalla parezca inacabada. Titular arriba y la
   foto tomando TODO lo que sobra hasta el filo inferior: `flex:1` la deja
   crecer y el margen inferior negativo le come el padding de la pantalla, de
   modo que la foto cierra exactamente en el borde sin numeros magicos. */
.etapas .pantalla:has(.banda){justify-content:flex-start;}
.etapas .banda{
  flex:1;min-height:0;position:relative;
  width:calc(100% + var(--margen) * 2);
  margin:24px calc(var(--margen) * -1) calc(-56px - env(safe-area-inset-bottom));
}
/* La foto va absoluta y no con `height:100%`: la altura de la banda la decide
   el `flex:1`, y contra una altura resuelta por el flex Chromium no resuelve
   el porcentaje del hijo — se medio: la banda quedaba en sus 683px correctos
   y la foto dentro se caia a sus 218px intrinsecos, dejando medio hueso
   vacio debajo. Con inset:0 la foto toma la caja entera sin porcentajes. */
.etapas .banda img{
  position:absolute;inset:0;
  width:100%;height:100%;max-width:none;object-fit:cover;
}
.etapas .et{
  display:grid;grid-template-columns:44px minmax(0,1fr);
  column-gap:14px;
  border-top:1px solid var(--salvia);
  padding:18px 0 22px;
}
.etapas .et:last-child{padding-bottom:0;}
/* El unico --agua sobre hueso de estas treinta pantallas. Se queda porque a
   30px no es texto secundario sino un numeral de display, y porque lo que
   dice esta repetido literalmente en el rotulo de al lado ("Primera etapa"):
   si alguien no lo distingue, no se pierde ni un dato. Mismo criterio que
   .sumario .num, que ya venia de la Task 8. */
.etapas .et .n{
  grid-column:1;grid-row:1 / span 2;
  font-size:30px;font-weight:300;line-height:.9;color:var(--agua);
}
.etapas .et h3{
  grid-column:2;grid-row:1;
  font-family:'Tenor Sans',sans-serif;font-size:10.5px;letter-spacing:.26em;
  text-transform:uppercase;color:var(--selva);font-weight:400;
  margin-bottom:10px;line-height:1.4;
}
.etapas .et p{grid-column:2;grid-row:2;}

/* =====================================================================
   SERVICIOS · lo que no se ve
   La segunda pantalla era, hasta esta tarea, la mas fea de la revista: la
   .rejilla de dt/dd salia como una lista plana, sin jerarquia, dt y dd al
   mismo cuerpo y al mismo peso. Ahora es una ficha como las otras siete.
   ===================================================================== */
.servicios h2{font-size:29px;line-height:1.1;}
.servicios .rejilla{margin-top:0;}

/* =====================================================================
   EDIFICIOS · foto a sangre, y la tabla de unidades hecha ficha
   ===================================================================== */
/* La primera pantalla de cada edificio (y de cada villa) es solo la banda de
   foto que en papel corona la pagina. Con la clase `sangre` de la Task 8 la
   foto ocupa la pantalla entera, igual que las cuatro aperturas de seccion.
   No lleva degradado: no hay texto encima que proteger. */
.edificio .pantalla.sangre .banda,
.villa .pantalla.sangre .banda{position:absolute;inset:0;}
.edificio .pantalla.sangre .banda img,
.villa .pantalla.sangre .banda img{
  width:100%;height:100%;max-width:none;object-fit:cover;
}

.edificio h2{font-size:34px;font-weight:300;line-height:1.02;margin:6px 0 18px;}
.edificio .lead{line-height:1.6;}
.edificio .nota{font-style:italic;color:var(--selva);margin-top:18px;}

/* ---------- la tabla de unidades ----------
   En papel es una retícula de tres columnas con encabezados: Unidad,
   Distribucion, Superficie. A 342px eso se comprime hasta ser ilegible (se
   midio: la columna de distribucion cae a 210px y parte cada celda en dos
   renglones que se encabalgan con la unidad de al lado). Aqui cada renglon se
   vuelve una ficha con sus propias etiquetas implicitas.

   Lo que NO se puede perder en el reflow es el apareamiento: cada tipologia
   con SUS metros. Por eso la unidad y su superficie se colocan a mano en la
   MISMA fila del grid —columna 1 y columna 2 del mismo renglon— en vez de
   dejar que el auto-placement las reparta, que las mandaria a renglones
   distintos por el orden del DOM (uni, distribucion, m2). La distribucion,
   que es la parte larga, baja al renglon de abajo a ancho completo.
   Lo vigila tests/test_tablas_unidades.py, que compara pareja por pareja
   contra el HTML fuente: si el reflow desalinea un dato, la revista miente
   sobre el producto y eso es peor que verse apretada. */
.edificio .tipos{display:block;width:100%;margin-top:22px;}
.edificio .tipos tbody{display:block;}
.edificio .tipos caption{
  display:block;text-align:left;
  font-family:'Tenor Sans',sans-serif;font-size:10.5px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--selva);line-height:1.6;
  padding-bottom:13px;border-bottom:1px solid var(--salvia);
}
/* El renglon de encabezados es la retícula del papel. Aqui cada ficha se
   explica sola, asi que sobra. Se apaga el <tr> entero y no los <th> uno por
   uno para que no quede una fila vacia con su borde. */
.edificio .tipos tr:has(th){display:none;}
/* `align-items:baseline` y no el `stretch` por defecto: la unidad va en Tenor
   a 12.5px y su superficie en Cormorant a 20px, asi que alineadas por el
   borde de arriba de la celda las dos lineas de texto quedan a alturas
   distintas y la pareja deja de leerse como pareja. Por la base coinciden. */
.edificio .tipos tr{
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  column-gap:16px;align-items:baseline;
  padding:14px 0;border-bottom:1px solid var(--salvia);
}
.edificio .tipos td{display:block;padding:0;}
.edificio .tipos td.uni{
  grid-column:1;grid-row:1;
  font-family:'Tenor Sans',sans-serif;font-size:12.5px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--selva);line-height:1.5;
}
.edificio .tipos td.m2{
  grid-column:2;grid-row:1;text-align:right;
  font-size:20px;line-height:1.1;white-space:nowrap;
}
.edificio .tipos td:not(.uni):not(.m2){
  grid-column:1 / -1;grid-row:2;
  font-size:17px;line-height:1.4;margin-top:5px;
}
/* Los renglones de nivel no son datos, son el rotulo del grupo: salen del
   grid y se leen como cintillo. El aire de arriba es lo que separa un nivel
   del anterior; el filete de separacion ya lo pone el ultimo renglon de
   datos, asi que aqui no va otro o quedaria doble. */
.edificio .tipos tr.nivel{display:block;border-bottom:none;padding:20px 0 2px;}
.edificio .tipos tr.nivel td{
  font-family:'Tenor Sans',sans-serif;font-size:10.5px;letter-spacing:.26em;
  text-transform:uppercase;color:var(--selva);line-height:1.6;
}

/* =====================================================================
   LAMINAS · las plantas arquitectonicas
   ===================================================================== */
.lamina .cab{border-bottom:1px solid var(--salvia);padding-bottom:15px;}
.lamina h2{font-size:28px;line-height:1.06;margin-bottom:0;}
.lamina .sub{font-style:italic;color:var(--selva);line-height:1.4;margin-top:11px;}
.lamina .dibujo{margin-top:22px;}
.lamina .tres figure{margin-top:22px;}
.lamina .tres figcaption{text-align:left;}
/* El interior del edificio B cierra la lamina sangrando por el borde inferior,
   igual que la banda del reportaje. */
.lamina .bandapie{
  width:calc(100% + var(--margen) * 2);
  margin:28px calc(var(--margen) * -1) calc(-56px - env(safe-area-inset-bottom));
}
.lamina .bandapie img{width:100%;max-width:none;height:24dvh;object-fit:cover;}

/* =====================================================================
   VILLAS · plano y ficha
   En el DOM el plano viene ANTES del titulo, porque en papel van lado a lado
   y la columna del plano es la izquierda. Leido de arriba abajo eso abre la
   pantalla con un dibujo sin decir de que villa es. Con `display:contents` en
   los dos envoltorios, los hijos de .datos pasan a ser items del mismo flex
   que el plano y `order` los reordena sin tocar el HTML: primero quien es
   (cintillo, nombre, bajada), luego el plano, y al final la ficha de metros.
   ===================================================================== */
.villa .cont,
.villa .datos{display:contents;}
.villa .eyebrow,
.villa h2,
.villa .sub{order:0;}
.villa .dibujo,
.villa .pie-zoom{order:1;}
.villa .datos dt,
.villa .datos dd{order:2;}
.villa h2{font-size:34px;font-weight:300;line-height:1.02;margin:6px 0 10px;}
.villa .sub{font-style:italic;color:var(--selva);line-height:1.4;}
.villa .dibujo{margin-top:18px;}
/* La ficha de la villa no tiene envoltorio por pareja: los <dt> y <dd>
   cuelgan sueltos de .datos, asi que el filete de separacion lo lleva el
   <dt> y el aire de abajo el <dd>.
   Los 12px de aire son los que hacen que las TRES villas quepan en una
   pantalla exacta. Con 14 la villa tipo B —que tiene la bajada mas larga de
   las tres— se pasaba 8px y se quedaba con un scroll de nada, cuando sus dos
   hermanas encajaban. Si alguien sube este numero, vuelve a medir la 45. */
.villa .datos dt{
  border-top:1px solid var(--salvia);
  padding-top:12px;margin-top:0;
}
.villa .datos dd{padding-bottom:12px;}

/* =====================================================================
   CIERRE · como se llega y como se compra
   ===================================================================== */
.cierre-pag h2{font-size:30px;line-height:1.08;}
/* Interfaz, no editorial: en papel no existe (print.css). Blanco sobre selva
   da 4.5:1; el hueso sobre selva se quedaba en 3.8:1, que para un boton —el
   unico elemento accionable de la revista— es poco. Sin sombra, sin esquinas
   redondeadas y sin transicion: es un renglon de Tenor sobre un rectangulo
   de color, como el resto de la pieza. */
.cierre-pag .whatsapp{
  display:block;text-align:center;text-decoration:none;
  font-family:'Tenor Sans',sans-serif;font-size:12.5px;letter-spacing:.22em;
  text-transform:uppercase;color:#fff;background:var(--selva);
  padding:18px 20px;margin-top:28px;
}

/* En escritorio la columna se centra y respira; las fotos a sangre usan
   mas ancho pero no la pantalla entera, que se veria burdo. */
@media (min-width:900px){
  :root{--ancho-col:560px;--margen:40px;}
  .pantalla.sangre{max-width:900px;}
}

/* =====================================================================
   COMPORTAMIENTO · folio, indice navegable y visor de planos (Task 10)
   Los tres elementos los inyecta revista.js; aqui solo su aspecto. Si el JS
   no carga, ninguno de los tres existe en el DOM y no hay nada que ocultar.
   ===================================================================== */
.folio-pantalla{
  position:fixed;left:50%;transform:translateX(-50%);
  bottom:calc(14px + env(safe-area-inset-bottom));z-index:50;
  font-family:'Tenor Sans',sans-serif;font-size:10px;letter-spacing:.26em;
  color:var(--selva);background:rgba(236,238,232,.86);
  padding:6px 14px;border-radius:100px;
  backdrop-filter:blur(8px);pointer-events:none;
}

.visor{
  width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;
  border:0;padding:0;background:var(--hueso);
}
.visor::backdrop{background:rgba(28,32,29,.9);}
.visor-lienzo{
  width:100%;height:100dvh;overflow:auto;
  touch-action:pinch-zoom pan-x pan-y;   /* el pellizco lo pone el navegador */
  display:flex;   /* el centrado lo hace el margin:auto de la imagen, no
                      justify-content/align-items -- ver nota abajo */
}
/* La lamina abre AJUSTADA a la pantalla, no a tamano natural. Se probo lo
   contrario (min-width:100% + flex-shrink:0, la lamina completa a resolucion
   nativa desde el primer toque) y fallaba de verdad, no en teoria: el visor
   arranca en scrollLeft/scrollTop 0, la esquina superior izquierda de la
   imagen -- y en masterplan-renumerado.jpg esa esquina es puro arbolado, sin
   un solo marcador ni trazo. Comprobado mirando el screenshot: el usuario
   cae dentro de una imagen enorme sin saber donde esta ni hacia donde
   recorrer. Con max-width/max-height:100% se ve la lamina completa de
   entrada (aqui SI importa cruzar la leyenda numerada con el plano), y el
   pellizco nativo del navegador (confirmado con gesto sintetico via CDP,
   no solo el touch-action declarado) lleva a resolucion completa para leer
   una cota. margin:auto centra en ambos ejes sin el bug de scroll unico
   lado que tenia justify-content/align-items: al no haber desborde en
   reposo, no aplica. */
.visor-lienzo img{max-width:100%;max-height:100%;width:auto;height:auto;margin:auto;}
.visor-cerrar{
  position:fixed;z-index:2;
  top:calc(14px + env(safe-area-inset-top));right:14px;
  font-family:'Tenor Sans',sans-serif;font-size:11px;letter-spacing:.22em;
  text-transform:uppercase;color:var(--hueso);background:var(--selva);
  border:0;padding:11px 18px;cursor:pointer;
}

/* Quien pidio menos movimiento en su sistema no recibe el desplazamiento
   suave: le marea. El encaje se conserva, que es estructura, no adorno. */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto;}
}

/* =====================================================================
   LEGIBILIDAD EN TELEFONO (18-ago-2026)
   Medido en un lienzo de 390 px: 78 bloques de texto quedaban entre 9 y
   11 px -- rotulos, pies de foto, etiquetas de ficha y encabezados de
   tabla. Ese cuerpo esta calculado para el pliego impreso, donde la pagina
   mide 280 mm; en la mano, a esa escala, no se leen. El cuerpo corrido ya
   estaba bien (17-18 px) y no se toca: sube solo el texto de servicio, con
   el interletrado recortado para que siga cabiendo en una linea.

   Va con !important a proposito: cada rotulo tiene ademas una regla propia
   por seccion (.reportaje .eyebrow, .sumario .des, .espacio h3...) que le
   gana por especificidad a cualquier selector simple, por mas abajo que
   este en el archivo. Sin esto la capa movil no aplica -- comprobado en el
   sitio publicado, seguian midiendo 9, 10 y 11 px. Es una capa de override
   acotada a una sola media query, no una excepcion suelta.
   ===================================================================== */
@media (max-width:700px){
  .eyebrow, .romano, .k, .lugar, .atribucion, .atribucion-interfaz{
    font-size:13px !important;letter-spacing:.14em !important;
  }
  figcaption, .pie-vertical, .pie-zoom, caption{
    font-size:13px !important;letter-spacing:.1em !important;line-height:1.5 !important;
  }
  dt{font-size:13.5px !important;letter-spacing:.14em !important;}
  dd{font-size:17px !important;line-height:1.5 !important;}
  h3{font-size:16px !important;}
  .destino{font-size:13px !important;letter-spacing:.18em !important;}
  .coverline{font-size:12.5px !important;letter-spacing:.1em !important;line-height:1.8 !important;}
  .sumario .num{font-size:14px !important;}
  .sumario .des{font-size:16px !important;line-height:1.5 !important;}
  table, td, th{font-size:15px !important;}
  a.whatsapp{font-size:17px !important;letter-spacing:.08em !important;}
}

/* El contador centrado se cruza con el cuerpo del texto: las pantallas con
   mucho contenido son mas altas que el telefono, asi que al desplazarse
   siempre pasa una linea por detras. Pegado a la orilla derecha estorba a
   una palabra, no a un renglon completo, y con fondo solido se lee. */
@media (max-width:700px){
  .folio-pantalla{
    left:auto;right:10px;transform:none;
    font-size:11px;letter-spacing:.2em;
    background:var(--hueso);opacity:.94;
  }
}

/* El boton flotante para volver al formato revista se monta sobre la primera
   linea de las pantallas de texto -- se veia la capitular por debajo de la
   pastilla. Se le hace sitio arriba en todas las pantallas: el paginador
   reparte el contenido despues de que este padding ya cuenta, asi que no
   provoca desbordes. */
@media (max-width:700px){
  .pantalla{padding-top:calc(52px + env(safe-area-inset-top)) !important;}
}

/* Modo reels: el scroll nativo se apaga y el gesto lo lleva reels.js. Sin
   esto el dedo y el script pelean por el mismo scroll -- el snap nativo
   intenta aterrizar donde el JS ya decidio otra cosa. */
html.reels body{
  /* touch-action:none, NO overflow:hidden: hay que apagar el arrastre nativo
     del dedo pero conservar el scroll del documento, que es justo lo que el
     script mueve (y de lo que dependen la carga diferida de imagenes y el
     contador). Con overflow:hidden el documento deja de tener recorrido y
     scrollTo no llega a ningun lado. */
  touch-action:none;overscroll-behavior:none;
}
html.reels{
  scroll-snap-type:none;
  /* El documento trae scroll-behavior:smooth para el indice navegable, y eso
     convierte el salto de pantalla en un recorrido: durante la animacion se
     ven las dos paginas a la vez, justo lo que aqui no debe pasar. */
  scroll-behavior:auto;
}
/* Ninguna foto es arrastrable en modo reels: el arrastre nativo de imagen
   cancela el gesto de pasar pantalla. */
html.reels img, html.reels picture{-webkit-user-drag:none;user-select:none;}
html.reels .pantalla{scroll-snap-align:none;scroll-snap-stop:normal;}

/* El cambio de pantalla en telefono es un corte, no un recorrido: un
   desvanecido corto evita que se sienta un salto en seco sin llegar a
   mostrar dos paginas a la vez. */
html.reels .pantalla.entrando{animation:entra-pantalla .18s ease-out}
@keyframes entra-pantalla{from{opacity:.35}to{opacity:1}}
@media (prefers-reduced-motion:reduce){
  html.reels .pantalla.entrando{animation:none}
}

/* El indice de la portada: en papel son solo palabras, en pantalla llevan a
   su seccion. Se mantienen sin subrayado para que la portada no cambie. */
.coverline a{color:inherit;text-decoration:none;border-bottom:1px solid transparent}
.coverline a:hover,.coverline a:focus-visible{border-bottom-color:currentColor}
