@import url("sitio.css");
@import url("acordeon.css");

/* ═══ LA WEB COMPLETA — I AM READY TO BLOOM ════════════════════════════════
   Las 10 secciones de INICIO en el orden que ella escribió (ESTRUCTURA_Y_COPY.md),
   con su copy sin tocar. Esta pasada arma la ESTRUCTURA; el wow y el movimiento
   entran después, sección por sección.

   ── LA CORRECCIÓN DE MARCA ───────────────────────────────────────────────
   Medido en su nicho real (papier · intelligentchange · ban.do · happyplanner):
     · display serif LIGERO y aireado (Canela Light 300, interlineado 1.5)
     · píldoras y radios grandes (34 / 50 / 100 px), NO hairlines de 0-2px
     · un solo acento saturado
     · etiquetas de categoría dentro de una píldora de color
   Lo que llevábamos era una web de Caliber —esquinas duras, grotesca 500— con
   sus colores. Aquí entra su idioma:
     · Gambetta 300 = el "Times New Roman" que ella pidió como ACENTO, subido de
       nivel. NO sustituye a los títulos: Lemon Milk (hoy Cabinet Grotesk) sigue
       siendo el título. La serif es la voz, no el letrero.
     · todo lo que se toca es píldora
     · las etiquetas de sección viven en una píldora de su paleta — que es
       literalmente cómo su moodboard dibuja el tono de marca                */

:root{
  --serif:'Gambetta',Georgia,serif;
  --radio:1.625rem;      /* tarjetas y placas */
  --radio-chico:1rem;
  --pildora:999px;
  --hueco:clamp(4.5rem,9vw,8.25rem);   /* el aire entre secciones */
}

/* ── piezas compartidas ──────────────────────────────────────────────────── */
.seccion{padding:var(--hueco) var(--margen)}
/* La columna en rem: a 16 px de raíz son los mismos 1280 de siempre, y en una
   laptop baja sola para devolverle el aire a los lados. */
.ancho{max-width:80rem;margin-inline:auto}

/* La etiqueta en píldora: el puente entre su moodboard y su categoría. */
.etiqueta{display:inline-block;padding:0.5rem 1.125rem;border-radius:var(--pildora);
  font:600 0.75rem/1 var(--cuerpo);letter-spacing:.14em;text-transform:uppercase;
  background:var(--tono,var(--lima));color:var(--carbon)}

/* El titular de sección. Serif ligera, aire de 1.18, NADA de tracking negativo:
   el peso ligero ABRE, no cierra. */
/* 🔴 LA ESCALA. Medido antes de tocarla: SEIS titulares clavados en 60px y el
   máximo del sitio era 76. Graza corre a 120. El sitio era educado; ellos toman
   partido, y es lo que más se nota de todo lo que separa un sitio wow de uno
   correcto — más que cualquier animación, y cuesta cero.
   Con peso 300 el tracking ABRE, no cierra: a este tamaño un negativo pega las
   palabras. Y la medida baja a 14ch — un renglón de 20ch a 96px no se lee. */
.titular{font-family:var(--serif);font-weight:300;
  font-size:clamp(2.375rem,6.6vw,6.125rem);line-height:1.08;letter-spacing:-.012em;
  max-width:14ch;margin-top:1.625rem}
/* Dentro de una franja de dos columnas el titular NO puede ir a 98: comparte el
   ancho con la foto. Ahí manda la columna, no la escala. */
.franja .titular{font-size:clamp(2.125rem,4.2vw,3.625rem);line-height:1.14;max-width:16ch}
.titular em{font-style:italic}
.bajada{margin-top:1.25rem;font-size:1.1875rem;line-height:1.62;
  color:rgba(44,44,44,.72);max-width:52ch}

.franja{background:var(--tono);border-radius:var(--radio);
  padding:clamp(2.5rem,5vw,4.75rem)}

/* ── SUS ELEMENTOS GRÁFICOS ──────────────────────────────────────────────── */
/* Las 16 piezas de `01_ASSETS/refs/sistema-grafico-iartb/`, redibujadas de su
   moodboard con sus hex. Las reglas son de su propia GUIA.md y no se rompen:
     1 · todo plano — cero sombra, cero degradado, cero contorno. Son recortes
         de papel, así vienen en el moodboard.
     2 · UNA pieza por sección, no tres. Son puntuación; amontonadas se vuelven
         confeti, y ella pidió evitar "que se vea muy AI o como muy típico".
     3 · el coral NUNCA va de adorno: es el color de acción y no compite consigo
         mismo. Por eso los adornos corren en menta / oliva / lila / lima.
     4 · nunca encima de una foto de producto — el color de producto vive dentro
         de la foto, el adorno vive fuera.
   Se INCRUSTAN, no se cargan como <img>: un SVG cargado como imagen es un
   documento aparte y no hereda `color` — salen todas negras. */
/* 🔴 UNA PEGATINA NO VA AL 34% DE OPACIDAD. Los elementos planos pedían
   transparencia para no gritar; un troquel a media tinta se lee a impresión
   descolorida. Con el sticker se invierte: opacidad casi entera y TAMAÑO chico.
   La discreción la da la escala, no la transparencia. */
.adorno-sec{position:absolute;z-index:0;pointer-events:none;opacity:.95;
  width:clamp(66px,6.4vw,104px);height:auto;
  right:var(--margen);top:calc(var(--hueco) * .55)}
.seccion{position:relative}
.seccion>.ancho{position:relative;z-index:1}
/* Las masas (blob-gota, blob-nube) piden más cuerpo que las líneas: a .34 sobre
   arena se leían a mancha gris descolorida en vez de a color. */
/* (§7 ya no lleva pegatina: la hoja de la biblioteca se apoya sobre la acuarela
   y una masa de color encima era la tercera capa de fondo en el mismo sitio.) */
.voces .adorno-sec{top:calc(var(--hueco) * .4)}
/* La luna del cierre se define entera en §10 (ahora es una capa, no un adorno).
   Esta regla se queda solo como reposo por si el bloque de la noche no carga. */
.adorno-cierre{display:block;width:62px;height:auto;margin:0 auto 1.625rem}

/* ── LA TEXTURA — no un patrón ───────────────────────────────────────────── */
/* 🔴 Se QUITARON los dos patrones de fondo (puntitos detrás de la tienda,
   botánica en la franja del Planner). Razón medida, no gusto: de las cinco
   tiendas de su categoría que sí cargaron, NINGUNA corre un patrón repetido de
   fondo. Papier —que literalmente vende papel estampado— tiene el fondo liso.
   Los estampados de su moodboard son para la PASTA de un journal, no para el
   muro detrás del texto: ahí solo compiten con la lectura y leen a plantilla.

   Lo que sí queda es TEXTURA, que es otra cosa: su moodboard trae cuatro
   papeles, y uno de ellos es papel con fibra. Un grano finísimo da la sensación
   de papel sin dibujar nada. Va en el <body>, se genera en el navegador y pesa
   cero. Los patrones siguen en assets/grafico/ para superficies chicas —el
   forro de una tarjeta, el fondo de una insignia—, que es donde funcionan.   */
body::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  opacity:.5;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='f'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23f)' opacity='.14'/%3E%3C/svg%3E")}
body>*{position:relative;z-index:1}

/* ── el encabezado ───────────────────────────────────────────────────────── */
.nav{position:sticky;top:0;z-index:80;background:rgba(246,244,235,.86);
  backdrop-filter:blur(14px);
  display:flex;align-items:center;justify-content:space-between;gap:1.5rem;
  padding:0.875rem var(--margen)}
/* Sin `transition` en el alto: lo mueve `--n` con el scroll. Una transición
   encima correría a su propio tiempo y despegaría la marca del dedo. */
.nav .firma-nav{color:var(--coral)}
.nav ul{display:flex;gap:1.625rem;list-style:none}
/* El renglón de menú no cambia de color y ya: le crece un trazo desde el
   centro. Es el mismo gesto que el botón secundario —el trazo que crece— y por
   eso la barra se siente parte del sitio y no una pieza aparte.
   Va por `background-size`, no por un pseudo con `width`: un pseudo animando
   ancho reflowa; el gradiente no toca layout. */
.nav a{position:relative;font:500 0.9062rem/1 var(--cuerpo);color:rgba(44,44,44,.72);
  padding:0.5rem 2px;transition:color .3s var(--curva)}
.nav nav a{background-image:linear-gradient(currentColor,currentColor);
  background-repeat:no-repeat;background-position:50% calc(100% - 1px);
  background-size:0 1px;
  transition:color .3s var(--curva),background-size .38s var(--curva)}
.nav a:hover,.nav a:focus-visible{color:var(--carbon)}
.nav nav a:hover,.nav nav a:focus-visible{background-size:100% 1px}
.nav a:focus-visible{outline:3px solid var(--carbon);outline-offset:3px;
  border-radius:0.25rem}
.nav .acciones{display:flex;align-items:center;gap:0.375rem}
.nav .carro{display:flex;align-items:center;gap:0.5rem;padding:0.6875rem 1.25rem;
  /* 🔴 v2 — ERA NEGRO Y ELLA LO SEÑALÓ POR NOMBRE: "el color negro del branding
     usarlo únicamente en typos, no en botones ni en detalles, entonces el botón
     de arriba que no sea negro por favor, puede ser el verde olivo".
     Y tenía toda la razón: era la píldora más repetida del sitio —está en las
     siete páginas, arriba a la derecha— o sea le habíamos dado al negro el
     botón más visible de su marca.

     Va a su olivo, pero HONDO. Su #A5AD58 tal cual no se puede: con blanco da
     2.41 y reprueba, y contra la barra de papel se separa apenas 2.19 —
     dejaría de leerse como botón. Bajado en luminosidad (51% -> 28%) conserva
     su matiz (65.6 -> 70.8, cinco grados) y pasa a 5.83 con blanco y 5.29 de
     separación contra la barra. Es su verde, con el volumen que necesita para
     ser un botón. */
  border-radius:var(--pildora);background:var(--oliva-hondo);color:var(--blanco);
  font:500 0.8438rem/1 var(--cuerpo);letter-spacing:.005em;margin-left:0.375rem;
  transition:background-color .34s var(--curva),transform .34s var(--curva),
             box-shadow .34s var(--curva)}
.nav .carro:hover,.nav .carro:focus-visible{
  background:color-mix(in oklch,var(--oliva-hondo) 86%,var(--carbon));
  transform:translateY(-1px);box-shadow:0 8px 18px -12px rgba(44,44,44,.8)}
.nav .carro:active{transform:translateY(0) scale(.975);transition-duration:.11s}
.nav .carro:focus-visible{outline:3px solid var(--carbon);outline-offset:3px}
.ico-btn:focus-visible{outline:3px solid var(--carbon);outline-offset:2px}
.ico-btn:active{transform:scale(.92);transition-duration:.11s}
.nav .menu-movil{display:none}

/* ── los íconos ──────────────────────────────────────────────────────────── */
.ico{width:20px;height:20px;display:block;color:inherit}
.ico-btn{display:grid;place-items:center;width:40px;height:40px;padding:0;
  border:0;background:none;border-radius:var(--pildora);cursor:pointer;
  color:rgba(44,44,44,.8);transition:.28s var(--curva)}
.ico-btn:hover{background:rgba(44,44,44,.07);color:var(--carbon)}

/* ── el menú de celular ──────────────────────────────────────────────────── */
.tapa{position:fixed;inset:0;z-index:90;background:rgba(44,44,44,.42);
  opacity:0;transition:opacity .32s var(--curva)}
.tapa.abierta{opacity:1}
.panel-movil{position:fixed;z-index:91;top:0;right:0;bottom:0;
  width:min(86vw,380px);background:var(--sup);
  padding:1.375rem 1.625rem 2.125rem;overflow-y:auto;
  display:flex;flex-direction:column;
  translate:100% 0;transition:translate .38s var(--curva)}
.panel-movil.abierto{translate:0 0}
.panel-movil .cerrar{align-self:flex-end}
.panel-movil ul{list-style:none;margin-top:1.125rem}
.panel-movil li{display:flex;align-items:center;justify-content:space-between;
  gap:1rem;padding:1.125rem 0;border-bottom:1px solid rgba(44,44,44,.12)}
.panel-movil li .ico{color:var(--tx-3)}
.panel-movil a{font-family:var(--serif);font-weight:300;font-size:1.5rem;line-height:1.2}
.lema-panel{margin-top:auto;padding-top:1.875rem;font-family:var(--serif);
  font-weight:300;font-size:1.1875rem;line-height:1.4;var(--tx-3)}
/* Con el panel abierto la página de atrás NO se desplaza. */
body.trabado{overflow:hidden}

/* ── §2.5 · ¿TE SUENA? — propuesta nuestra, no de ella ───────────────────── */
/* Va marcada en el HTML para que en la revisión se sepa qué es de ella y qué no. */
.suena{text-align:center}
.suena .cita{font-family:var(--serif);font-weight:300;font-style:italic;
  font-size:clamp(1.75rem,5vw,4.5rem);line-height:1.16;letter-spacing:-.01em;
  max-width:16ch;margin:1.875rem auto 0}
.suena .quien{margin-top:1.625rem;font:500 0.875rem/1 var(--cuerpo);
  letter-spacing:.1em;text-transform:uppercase;var(--tx-3)}

/* ── §3 · ELIGE TU CAMINO — traído al idioma nuevo ───────────────────────── */
/* El acordeón (D5) se queda: cinco visibles, uno abierto, el color barriendo
   desde la izquierda. Lo que cambia es el REGISTRO — era el único bloque que
   seguía hablando en grotesca apretada mientras el resto de la web ya habla en
   serif ligera. Un sitio con dos idiomas se lee a dos sitios. */
.elige .cabeza{padding-top:calc(var(--hueco) * .55)}   /* la marea ya dio el aire */
.elige .q{display:inline-block;padding:0.5rem 1.125rem;border-radius:var(--pildora);
  background:var(--menta);color:var(--carbon);
  font:600 0.75rem/1 var(--cuerpo);letter-spacing:.14em;text-transform:uppercase}
.elige .lead{font-family:var(--serif);font-weight:300;
  font-size:clamp(1.875rem,5.4vw,5rem);line-height:1.08;letter-spacing:-.012em;
  max-width:15ch}
.via .nombre{font-family:var(--serif);font-weight:300;letter-spacing:0}

/* ── §4 · EL PLANNER 2027 ────────────────────────────────────────────────── */
/* 🔴 ELEGIR UN COLOR REPINTA LA SECCIÓN ENTERA, no cambia una foto.
   Lo que había medía así: la tira de arriba en rgb(221,222,188) y esta franja en
   rgb(223,230,187) —2/8/1 de diferencia por canal, CONTRASTE 1.06— o sea 900 px
   de una sola masa verde pálido, con una placa crema dentro a 1.21. Tres tonos
   pálidos seguidos y ni un punto oscuro: eso es lo que aplana, no la falta de
   animación.
   La salida sale de su propia referencia: Mar Cosmetics mete el color por BLOQUE
   ENTERO de sección. Aquí se lleva a su conclusión — cada variante es un mundo
   tonal completo (fondo, tinta, acento, placa y botón), y tres de los cuatro son
   OSCUROS. Así esta sección deja de ser otra franja pálida y se vuelve el punto
   de peso del tramo, sin robarle el pico al valle en carbón (aquel es de sitio
   completo; este vive dentro de su tarjeta).                                  */
/* 🔴 EL MUNDO SE DECLARA EN LA SECCIÓN, no en la tarjeta. Estaba en `.franja` y
   funcionaba, pero el papel de atrás también tiene que cambiar de tono y un
   descendiente no puede pintar a su ancestro. Subirlo un nivel evita tener que
   resolverlo con `:has()`, que en este archivo ya nos ha costado una vuelta
   (el ancestro gana y el estado de reposo se queda puesto). */
/* El padding de `.seccion` se queda como está: un absoluto con `inset:0` se
   posiciona contra la CAJA DE RELLENO, así que el papel sale a todo lo ancho sin
   necesidad de quitárselo — y quitárselo le encogía el contenido 192 px. */
/* 🔴 LOS VALORES POR OMISIÓN VIVEN AQUÍ, no en la tarjeta. Los tenía declarados
   en `.franja` y eso ROMPÍA el sistema en silencio: una propiedad personalizada
   declarada en el propio elemento gana contra la heredada, así que la tarjeta se
   quedaba en el mundo lima en los cuatro casos mientras el papel de atrás sí
   cambiaba. Sin error de consola y con la sección "funcionando" a medias.
   Regla: la variable se declara UNA vez, donde vive el estado; los descendientes
   solo la consumen. */
.planner{position:relative;
  /* v3 — la tarjeta y la tinta ya NO dependen del mundo: son blancas y carbón
     siempre. Lo único que cambia por variante es el acento (ver más abajo). */
  --fondo:var(--blanco); --tinta:var(--carbon);
  --acento:var(--cobalto); --acento-tx:var(--blanco); --acento-tinta:var(--cobalto);
  /* El lecho de la foto en crema: es la única superficie de la tarjeta que no es
     blanca, y por eso el objeto se apoya en algo en vez de flotar en un vacío. */
  --placa:var(--papel);
  /* 🔴 EL BOTÓN ES SU NARANJA #B93D0A, el que dio por hex en el portal, no el
     coral. Medido: blanco sobre naranja da 5.62 y pasa; sobre el coral #FD7855
     da 2.63 y no. El coral se queda donde ella lo mandó — en el logotipo. */
  --btn:var(--naranja); --btn-tx:var(--blanco);
  --hoja:var(--papel);
  /* 🔴 El reposo es ASENTADO (--p:1), no "por asentar". Con `--p:0` por omisión,
     quien tenga movimiento reducido —donde vida.js no corre— se quedaba con la
     tarjeta 22 px arriba y sin sombra para siempre: el estado de a medias,
     congelado. La regla del sitio es que sin JS todo se ve COMPLETO y el estado
     intermedio solo existe mientras hay algo que lo va a resolver. */
  --p:1}
.planner > .ancho{position:relative;z-index:1}

/* ── EL PAPEL: una hoja RASGADA por los dos cantos ───────────────────────── */
/* Medido antes: la sección era `transparent` y la tarjeta oscura simplemente
   APARECÍA sobre 129 px de arena vacía arriba y 130 abajo. Y seis de las doce
   secciones del sitio entran con `.troquel` —el canto de papel— así que ésta era
   la que hablaba otro idioma justo donde más se nota el cambio de tono.
   La hoja va DENTRO de la sección, no como fondo de la sección: así `#tienda`
   conserva su propia costura y no hay que tocar a los vecinos. */
/* `isolation:isolate` NO es decorativo: sin él, el `multiply` de la fibra saldría
   del papel y se mezclaría con todo lo que hay debajo en la página. Con el
   contexto propio, la fibra solo multiplica contra el tono de ESTA hoja. */
.planner .papel{position:absolute;inset:0;z-index:0;overflow:hidden;
  isolation:isolate;
  /* ⚠️ v2 — esta variable se llamaba `--papel` y CHOCABA con el token global del
     suelo del sitio que entró con la v2. Dentro de .planner ganaba la local, así
     que la costura de abajo —que tiene que ser el color de ALREDEDOR— se habría
     pintado del mismo tono que la hoja que muerde, o sea invisible, y sin un
     solo error en consola. Se llama `--hoja` porque eso es: la hoja de ESTE
     mundo de color, no el papel del sitio.

     🔴 v2 — Y ADEMÁS SE APAGÓ. Tintaba la página con un 15-72% del color del
     mundo, o sea el fondo se ponía azul pálido, verde pálido o rosa pálido
     según el color elegido. Ella, textual: "no me gustan los fondos amarillos,
     verdes o azules pálidos". Era el caso exacto.

     El tinte existía para compensar algo que ya no pasa: con el lima viejo
     (#C7D68A, lavado) la tarjeta clara contra el papel medía 1.00 y
     desaparecía, así que había que teñir el papel de oliva para darle sobre
     qué apoyarse. Con el lima REAL del producto (#90B424) esa misma medición
     da 2.18: la saturación resolvió sola lo que el tinte estaba tapando.
     El color ahora lo pone la tarjeta, que es de donde debía salir. */
/* 🔴🔴 LA LUZ Y EL GRANO ENTRAN AQUÍ (16-ago) — la capa que le faltaba a §4.
   Nueve de las trece secciones del home llevan el material del sitio; ésta era una
   de las cuatro que no, y se veía: la hoja tenía color y fibra pero
   `background-image: none` y `--luz` SIN DEFINIR, o sea un campo plano donde no se
   puede señalar de dónde viene la luz.
   Es la contradicción que más pesaba en esta sección: al producto se le dio sombra
   de contacto, halo y una sombra que se mueve en contra al girar — y la MESA sobre
   la que se apoya seguía sin iluminar. Objeto con luz, superficie sin ella.

   Por qué aquí y no en la sección: `background-blend-mode` mezcla contra el color
   de fondo del PROPIO elemento, y `.planner` es `transparent`. La hoja sí tiene
   color, así que es donde el multiply tiene contra qué multiplicar. El comentario
   de más abajo ya lo anticipaba —"planner además ya tiene su propia hoja"—: era la
   pista de dónde iba, no una razón para dejarlo fuera.

   `background` (atajo) NO servía: resetea `background-image` en cada declaración,
   así que la luz y el grano se habrían borrado solos. Va desglosado. */
/* 🔴🔴 LA LUZ SE SALIÓ DE AQUÍ Y AHORA VIAJA (capa 1 del rediseño de fondo).
   Estaba clavada: `--luz` fija en `20% -8%`, o sea una FOTOGRAFÍA de luz. La mesa
   tenía un reflejo pintado, no iluminación. Ahora la fuente recorre la hoja
   mientras la sección pasa por la pantalla — ver `.planner .luz` más abajo.

   POR QUÉ SALIÓ DEL `background-image`: mover la luz aquí significaba animar la
   posición del gradiente, y eso REPINTA los ~1300×1200 px de la hoja en cada
   cuadro. Como capa propia se mueve con `transform`, que va en la GPU y no
   repinta nada. Aquí se queda solo el grano, que sí es fijo. */
  background-color:var(--hoja);
  background-image:url("grafico/grano.svg");
  background-size:200px 200px;
  background-position:center;
  background-repeat:repeat;
  background-blend-mode:multiply;
  transition:background-color .62s var(--curva)}

/* ── LA LUZ QUE VIAJA ────────────────────────────────────────────────────────
   La fuente está casi clavada al MUNDO, no a la sección: conforme la página sube,
   la luz baja sobre la hoja, como el sol de una ventana mientras caminas por el
   cuarto. Casi — va al ~55% de ese recorrido, no al 100%. A 1:1 el efecto se lee
   como "hay un foco pegado a mi pantalla"; a media velocidad se lee como
   profundidad, que es lo que se buscaba.

   Va con `--q` y no con `--p`: `--p` llega a 1 en el primer 62% de la pantalla y
   ahí se congela —es el número de la tarjeta asentándose— así que la luz habría
   barrido durante la entrada y se habría quedado quieta justo durante todo el
   rato que estás leyendo la ficha. `--q` es la travesía completa.

   🔴 EL FOCO SE APRETÓ, Y ESO LO DECIDIÓ LA MEDICIÓN. El primer intento conservó
   el radio de la luz fija —92% × 112% de la sección— y solo lo puso a viajar.
   Medido comparando el mismo encuadre en los dos extremos del recorrido:

       diferencia máxima   5 niveles     ← imperceptible
       diferencia media    1.43 niveles

   O sea nada, y repartido a lo largo de todo el scroll son fracciones de nivel por
   cuadro. La causa no es el recorrido: es que una luz que cubre TODA la superficie
   no es una fuente, es una exposición — al moverse, cada punto sigue estando bajo
   la misma parte del degradado. Se aprieta a ~55% × 62% de la sección y el
   recorrido vertical sube a ±25%. Ahora sí es un foco que pasa.

   La caja va SOBREDIMENSIONADA (140% × 170%) para que el borde del degradado nunca
   entre en cuadro: el recorrido máximo es ±14.7% de la caja contra un margen del
   35%. Los radios y el centro están expresados contra esa caja mayor — el punto de
   reposo sigue siendo el `20% -8%` de siempre, que aquí cae en `28.6% 15.9%`.
   Sin `--q` (sin JS o con movimiento reducido) vale .5: la luz en su sitio de
   siempre, la sección COMPLETA. Nunca un estado a medias congelado. */
.planner .luz{position:absolute;inset:-35% -20%;z-index:0;pointer-events:none;
  mix-blend-mode:multiply;
  background:radial-gradient(39.3% 36.5% at 28.6% 15.9%,
    rgba(255,255,255,0) 0%, rgba(255,255,255,0) 34%,
    rgba(150,126,74,calc(var(--luz-caida,.13) * .42)) 68%,
    rgba(150,126,74,var(--luz-caida,.13)) 100%);
  translate:calc((var(--q,.5) - .5) * 8.6%) calc((var(--q,.5) - .5) * 29.4%)}

/* 🔴 LA FIBRA VA EN GRIS, y esto se decidió midiendo cuatro versiones.
   La receta de §2.5 (multiply .24 en color, sobre arena) aquí no sirve: sobre un
   tono medio no se veía —stddev 2.33 → 2.42, o sea NADA, que es justo la trampa
   de hornear una textura al 10%. Pero al subirla en color pasó lo contrario y
   peor: a .78 el croma de la lámina se desploma de **29.4 a 7.2** —la foto es
   cálida y al multiplicar arrastra el tono— y el papel azul se vuelve un muro de
   concreto gris. `soft-light` fue peor todavía: lava la media +25 niveles y
   textura menos.
   La salida es `grayscale(1)`: una capa sin color solo toca la LUMINANCIA, así
   que la fibra se ve y el tinte del mundo sobrevive entero. Medido a .55 —
   croma 29.4 (intacto), media −0.1 (intacta), rango 9 → 43 niveles.
   Va volteada y a otra escala que la de §2.5 para que no se lea como la misma
   toma. */
.planner .fibra{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;pointer-events:none;z-index:1;
  opacity:.55;mix-blend-mode:multiply;
  filter:grayscale(1) contrast(1.15) brightness(1.12);
  transform:scaleY(-1) scale(1.18)}
/* 🔴 LOS DOS CANTOS SUBEN A z-index:2, y esto era un bug de antes.
   Los tres iban con `z-index:auto`, así que se apilaban por ORDEN DE ÁRBOL:
   `::before` → `.fibra` → `::after`. O sea la fibra multiplicaba sobre el canto de
   ARRIBA y no sobre el de abajo: la misma hoja, dos tratamientos distintos, y sin
   un solo error en consola. Con la luz entrando como segunda capa el desajuste se
   habría duplicado.
   Y va en 2 a propósito: el canto tiene que ser el color de ALREDEDOR —es el hueco
   que muerde la hoja— así que ni la fibra ni la luz deben teñirlo. */
.planner .papel::before,
.planner .papel::after{content:"";position:absolute;left:0;right:0;height:18px;
  background:var(--papel);pointer-events:none;z-index:2;
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}
.planner .papel::before{top:-1px}
/* El canto de abajo es el mismo dibujo VOLTEADO. Una sola pieza para los dos
   cantos: si fueran dos archivos distintos se notaría que no son la misma hoja. */
.planner .papel::after{bottom:-1px;transform:scaleY(-1)}

.planner .franja{
  background:var(--fondo);color:var(--tinta);
  display:grid;grid-template-columns:1fr 1fr;gap:clamp(2rem,4vw,4.5rem);
  align-items:center;
  /* Las variables no se animan solas: lo que transiciona son las PROPIEDADES que
     las consumen. Por eso van nombradas una por una. */
  transition:background-color .62s var(--curva), color .62s var(--curva);

  /* ── EL PESO ────────────────────────────────────────────────────────────
     La tarjeta no tenía sombra: era un rectángulo pintado, no una lámina
     apoyada. Y la sombra NO es fija — se asienta con el scroll. `--p` va de 0 a
     1 mientras la sección entra (lo escribe vida.js con el mismo mecanismo
     determinista del valle), así que la hoja baja los últimos 22 px y su sombra
     abre al mismo tiempo. Una sombra que responde al scroll se siente física;
     una fija se siente pegada.
     Se anima `translate`, no `top`: `top` recalcula la caja en cada cuadro. */
  --a:calc(1 - var(--p));
  translate:0 calc(var(--a) * -22px);
  box-shadow:0 calc(10px + var(--p) * 26px) calc(24px + var(--p) * 44px)
             rgba(44,44,44,calc(.05 + var(--p) * .13))}

/* 🔴 LA PLACA SE QUEDA CLARA EN LOS CUATRO MUNDOS, y es una decisión, no una
   herencia. El primer intento le dio a cada mundo una placa de su propio tono
   (un escalón más claro que la franja): medía 1.23-1.25, o sea el mismo
   rectángulo invisible de antes con otro color. Y peor — el PNG del producto
   trae una sombra BLANCA horneada de 6,016 píxeles a alfa 255, que sobre una
   placa oscura se ve como una mancha.
   Con la placa clara las dos cosas se arreglan de una: la sombra horneada se
   integra como sombra de verdad, y la placa deja de ser un sobrante para volverse
   lo que debía ser desde el principio —una ventana de luz dentro de la franja,
   con el objeto apoyado en ella. Es el mismo recurso que usa cualquier vitrina.  */
/* `--papel` es la hoja de atrás: la arena TINTADA del mundo. Va bajita a
   propósito —es la antesala, no el evento— pero tiene que separarse de la arena
   lo suficiente para que el canto rasgado exista.
   🔴 SE MEZCLA EN OKLCH, NO EN SRGB, y esto no es preferencia. Medido: la arena
   sola tiene croma 17; metiéndole 13% de cobalto **en srgb** el resultado baja a
   croma 5 — sale GRIS SUCIO, más apagado que el punto de partida, y en pantalla
   se lee a error de render, no a papel tintado. La misma mezcla en oklch da
   croma 27: un azul pálido de verdad. Interpolar colores oscuros y saturados
   dentro de claros y lavados atraviesa el centro desaturado del cubo sRGB;
   oklch va por el arco de croma y no se cae. */
/* 🔴🔴 v3 — LA TARJETA SE VA A BLANCO Y EL COLOR BAJA A DETALLE. Es literal lo
   que ella escribió del Planner en el portal: "la quiero super limpia, no azul,
   nuevamente ese color es solo para detalles, así como le pusiste a una palabra
   en un título". Lo que había era exactamente lo contrario — medido, 1066×802 px
   de cobalto sólido, el campo de color más grande de todo el inicio.

   Así que se invierte el sistema, no se apaga: la tarjeta es blanca y con tinta
   carbón en los cuatro mundos, y el color del planner elegido vive ahora en la
   etiqueta, en la palabra acentuada del titular, en el anillo de la muestra y en
   el canto del lecho de la foto. Sigue habiendo cuatro mundos; lo que cambió es
   la DOSIS.

   Dos medidas que obligan a que no sea un simple buscar-y-reemplazar:
   · Lima como TEXTO da 2.40 sobre blanco — reprobado. Por eso el mundo lima
     escribe con `--oliva-hondo` (5.83), que además es el verde olivo que ella
     pidió por nombre. La etiqueta sí puede ser lima porque ahí es FONDO, con
     carbón encima: 5.81.
   · El lecho de la foto queda en crema y mide 1.10 contra la tarjeta blanca: no
     alcanza para leerse como superficie. Lo resuelve el canto en el color del
     mundo, que es la misma idea de "color como detalle" aplicada a un borde. */
.planner[data-color=cobalto]  {--acento:var(--cobalto);  --acento-tx:var(--blanco); --acento-tinta:var(--cobalto)}
.planner[data-color=orquidea] {--acento:var(--orquidea); --acento-tx:var(--blanco); --acento-tinta:var(--orquidea)}
.planner[data-color=lima]     {--acento:var(--lima);      --acento-tx:var(--carbon); --acento-tinta:var(--oliva-hondo)}
/* 🟠 Terracota #A83C0C es vecina del naranja #B93D0A que ahora llevan todos los
   botones: juntos leen a error de impresión, no a decisión — están a 16/1/2 por
   canal. Antes se resolvía mandando el botón a carbón, y eso ya no se puede:
   ella pidió que el negro viva "únicamente en typos, no en botones". Así que en
   ESTE mundo el botón se va a su verde olivo (5.83 con blanco), que es de los
   tres colores que dijo querer usar más. Sigue siendo su paleta, y ella misma
   autorizó la variedad: "no tienes que hacer todos los botones exactamente del
   mismo color, puedes jugar". */
.planner[data-color=terracota]{--acento:var(--terracota); --acento-tx:var(--blanco); --acento-tinta:var(--terracota);
                               --btn:var(--oliva-hondo);  --btn-tx:var(--blanco)}

/* v2 — LA ETIQUETA ES SIEMPRE EL OPUESTO DE LA TARJETA. Con los colores reales
   del producto, el acento de antes dejó de funcionar: lima sobre orquídea daba
   2.40 de separación y amarillo sobre terracota 4.00, o sea la etiqueta se
   diluía en la tarjeta. Invertirla la resuelve de una y para los cuatro mundos:
   papel sobre las tres oscuras (5.24 / 5.75 / 10.85) y carbón sobre la lima
   clara (5.81). El texto queda en 12.67 en los cuatro, contra 5.81-13.05 antes. */
.planner .etiqueta{background:var(--acento);
  color:var(--acento-tx,var(--carbon));transition:background-color .62s var(--curva)}

/* 🔴 EL SALTO DE COLOR — lo que hacía que el cambio de variante se sintiera barato.
   Medido con `transitionDuration` en cada pieza: el libro giraba en 500 ms mientras
   CINCO cosas cambiaban de color en **0 ms** — el acento del titular, el nombre de
   la variante, el canto del lecho, y los rótulos de la ficha. Un movimiento cuidado
   rodeado de saltos instantáneos no se lee a "casi bien": se lee a roto, porque el
   ojo cree lo más rápido que ve.
   Ahora todo lo que cuelga de `--acento` viaja junto y con la misma curva. Se
   nombran las propiedades una por una: `all` metería en la transición el layout y
   cualquier cosa que se toque después.
   ⚠️ La etiqueta llevaba su `background-color .62s` desde antes y NO bastaba: otra
   regla más abajo le puso `transition:opacity,translate` para su entrada y la pisó
   entera. Por eso la suya se repite aquí. */
.planner .etiqueta,
.planner .titular .ac,
.planner .muestras .nombre-color,
.planner .specs dt,
.planner .nota-ficha,
.planner .bajada{
  transition:color .52s cubic-bezier(.16,.68,.43,.99),
             background-color .52s cubic-bezier(.16,.68,.43,.99)}
/* ⚠️ Aquí iba una transición para el canto del lecho y NO SE ESCRIBE: ese canto
   dejó de existir cuando el lecho pasó de caja con borde a halo + sombra de
   contacto. Medido antes de darlo por bueno: `.foto` computa `box-shadow: none`.
   Una transición sobre una propiedad que nadie declara es el mismo código muerto
   que las pegatinas de esta sección — el archivo describiendo algo que no está.
   Lo que sí existe es el halo, y va aquí abajo. */

/* 🔴 LA ETIQUETA LA PISABA EL REVEAL. `.js-rev [data-rev]` (0,2,0) declara
   `transition:opacity,translate` para la entrada de la sección, empata en
   especificidad con `.planner .etiqueta` y va MÁS ABAJO en el archivo, así que
   ganaba y borraba el `background-color` de la lista: el bloque de color saltaba de
   golpe mientras todo lo demás viajaba medio segundo. Cuarta colisión de este tipo
   hoy. Se sube a (0,3,0) y se REPONEN las dos propiedades del reveal — pisarlas
   habría arreglado el color rompiendo la entrada. */
.planner .etiqueta[data-rev]{
  transition:opacity .85s var(--curva), translate .85s var(--curva),
             background-color .52s cubic-bezier(.16,.68,.43,.99),
             color .52s cubic-bezier(.16,.68,.43,.99)}

/* 🔴 EL HALO NO PODÍA INTERPOLAR, y no era culpa de ningún selector:
   `background-image` NO es animable entre dos gradientes. Medido — a mitad de
   transición el halo ya estaba en el color de destino, o sea saltaba.
   La salida es registrar el color como PROPIEDAD: con `@property` y
   `syntax:'<color>'` el navegador sabe que eso es un color y lo interpola. Sin el
   registro una variable es texto, y el texto no se puede promediar. */
@property --tinte-halo{syntax:'<color>';inherits:true;initial-value:transparent}
.planner{--tinte-halo:color-mix(in oklch, var(--acento) 13%, var(--placa));
  transition:--tinte-halo .52s cubic-bezier(.16,.68,.43,.99)}
.planner .foto::before{
  background:
    radial-gradient(58% 46% at 44% 40%, var(--tinte-halo), transparent 72%),
    radial-gradient(30% 5.5% at 50% 92%, rgba(44,44,44,.30), transparent 70%)}
/* 🔴 Los porcentajes de tinta se fijaron MIDIENDO los cuatro mundos, no a ojo.
   Con los primeros valores (76 / 58 / 68) el rótulo de la ficha caía a 3.14 en
   lima y 3.28 en terracota, y el renglón de prosa a 3.99 y 3.95: reprobados los
   dos. La trampa es que en cobalto —donde uno mira mientras trabaja— el mismo
   porcentaje daba 4.67 y 5.85 y todo parecía bien. Cuatro fondos = cuatro
   mediciones, no una. */
.planner .bajada{color:color-mix(in srgb, var(--tinta) 84%, transparent)}
/* El nombre del producto es un RÓTULO, no un titular: identifica el objeto y cede
   el peso al registro emocional que va debajo. Versalitas con tracking abierto —
   el mismo recurso que ya usan los rótulos de la ficha, para que se lea como parte
   del mismo aparato y no como un tercer tamaño suelto. */
.planner .nombre-prod{margin:1.125rem 0 0.375rem;
  font:600 0.8125rem/1 var(--cuerpo);letter-spacing:.15em;text-transform:uppercase;
  color:color-mix(in srgb, var(--tinta) 62%, transparent)}
/* `--fondo-btn` es lo que toma la flecha cuando el pozo se invierte: tiene que
   seguir al fondo del botón, no quedarse en el coral de la regla base. */
.planner .btn.primario{--fondo-btn:var(--btn);
  background:var(--btn);color:var(--btn-tx)}
.planner .btn.secundario{color:var(--tinta)}

/* La placa medía 1.21 contra la franja vieja: un rectángulo crema que no era ni
   fondo ni objeto, solo un sobrante. Medida contra el tono nuevo daría 1.25 —el
   mismo problema con otro color— así que no se resuelve subiendo el tono: se
   resuelve dándole DIRECCIÓN. Un charco de luz arriba-izquierda convierte el
   rectángulo en una superficie iluminada, que es donde un objeto puede apoyarse.
   Es la variable 1 del oficio: si no puedes señalar de dónde viene la luz, no
   hay luz, hay exposición. */
/* v3 — el canto en el color del mundo. Sobre la tarjeta blanca el lecho crema
   mide 1.10 y solo, no se lee como superficie; el canto lo define sin volver a
   meter un campo de color. Va en `box-shadow` y no en `border` para no alterar
   la caja ni la relación 4/5. */
/* 🔴🔴 EL OBJETO ROMPE SU MARCO — y esto sustituye a las pegatinas, no las repite.
   El archivo traía 30 líneas para tres pegatinas que CRUZAN la tarjeta ("es la
   pieza que hace el truco", decía el comentario del HTML). Medido en el DOM:
   `.pegado` = 0 elementos. Nunca se montaron, y no se pueden montar: ella pidió
   por escrito "fuera todos los iconos dibujados". Ese CSS era residuo de antes de
   esa orden y se borra más abajo.
   Pero el diagnóstico que lo motivaba seguía siendo cierto: sin nada que pase por
   delante, esto es un rectángulo blanco con una foto dentro. La oclusión es lo
   único que el ojo lee como "esto está más cerca" — el paralaje solo lee como
   cosas moviéndose.
   La salida no era adornos cruzando: es que CRUCE EL PRODUCTO. El libro sale de
   su lecho por arriba y se monta sobre el canto de la tarjeta. Ocluye el
   protagonista, no un sticker — y de paso el objeto crece, que es lo que pedía la
   comparación con Intelligent Change (su producto ocupa el 83% del alto de la
   pantalla; el nuestro cabía entero dentro de una caja con 8% de aire). */
/* 🔴 EL LECHO SE VUELVE REPISA. Con el libro creciendo hasta salirse, el
   rectángulo crema de 4/5 quedaba casi todo tapado y lo que asomaba era un marco
   corrido detrás del objeto: se leía a error de maquetación, no a superficie.
   Un objeto no se apoya en un marco, se apoya en un SUELO. Así que la caja sigue
   marcando el sitio (4/5, para que la columna no cambie de alto) pero lo que se
   PINTA es solo la mitad de abajo. El libro entra en ella por su base, que es
   exactamente lo que hace un bodegón: producto de pie sobre una superficie, no
   producto dentro de un cuadro. */
.planner .foto{aspect-ratio:4/5;position:relative;padding:8% 8% 7%;
  /* `overflow` NO puede ser hidden: es justo lo que recortaría al libro. */
  overflow:visible}
/* 🔴 Y LA REPISA DEJA DE SER UNA CAJA. Con el rectángulo redondeado y su canto de
   color quedaban TRES marcos anidados —tarjeta blanca › lecho crema con borde ›
   libro— que es el anti-patrón de tarjetas dentro de tarjetas, y además el borde
   asomaba por detrás del objeto como un cuadro mal colgado.
   Lo que hace que un objeto se vea apoyado no es un marco: es un HALO de luz
   detrás y una SOMBRA DE CONTACTO debajo. Dos elipses, cero cajas. El color del
   mundo sigue presente —tiñe el halo— pero como atmósfera, que es la dosis que
   ella pidió: "ese color es solo para detalles". */
.planner .foto::before{content:"";position:absolute;inset:0;z-index:0;
  background:
    /* el halo: el aire teñido detrás del objeto, con la luz entrando por arriba-izq */
    radial-gradient(58% 46% at 44% 40%,
      color-mix(in oklch, var(--acento) 13%, var(--placa)), transparent 72%),
    /* la sombra de contacto: aplastada y baja, justo donde el libro toca */
    radial-gradient(30% 5.5% at 50% 92%, rgba(44,44,44,.30), transparent 70%);
  transition:background .62s var(--curva)}
/* El libro mide 116% del alto del lecho y se apoya en su base: el 16% que sobra
   sale por arriba. Se ancla ABAJO (`place-items:end`) a propósito — un objeto que
   sobresale por arriba pero se apoya abajo se lee como puesto sobre una repisa;
   centrado se leería como flotando, que es el defecto que ya tenía. */
/* ⚠️ `object-fit:contain` NO sirve para sacar al objeto de la caja: si el ancho es
   lo que limita —y aquí lo es, el libro es 0.70 de proporción dentro de un lecho
   4/5— agrandar el alto de la caja no agranda al objeto ni un píxel, solo añade
   vacío. Se dimensiona por ANCHO y el alto sale solo de la proporción del archivo,
   que es idéntica en las cuatro variantes justo porque comparten lienzo. */
/* 🔴 `max-width:none` es obligatorio, no cosmético: el reseteo del sitio pone
   `img{max-width:100%}` y con él el `width:112%` se recortaba de vuelta a 100%
   —medido: 369 px, exactamente el ancho de la caja— así que el objeto NO salía y
   no había ningún error que lo delatara. */
/* 🔴 Y va FUERA DEL FLUJO, no como hijo de rejilla. Con `display:grid` +
   `align-self:end` el objeto seguía empezando en el borde de arriba: cuando el
   contenido no cabe, la fila de la rejilla CRECE hasta él y ya no queda espacio
   libre que repartir, así que el desborde sale por ABAJO —justo al revés de lo que
   se busca— y `end` deja de tener efecto. Medido: 587 px de libro dentro de 476 de
   área, y el borde superior clavado en el padding. Anclado abajo en absoluto, el
   sobrante sale por arriba, que es donde tiene que salir.
   El centrado va con `margin-left:-56%` (la mitad de 112%) y no con `translate`
   porque `translate` lo necesita el movimiento del puntero. */
/* ⚠️ En absoluto el % se mide contra el PADDING-BOX del lecho, no contra su área
   de contenido: el mismo `112%` pasó de 369 px a 492 y el libro se salía 26 px por
   cada costado, dejando el lecho como una tira detrás. 97% lo mantiene dentro a lo
   ancho y le da 99 px de sobrante por arriba, de los cuales 36 quedan fuera de la
   tarjeta: suficiente para que ocluya, lejos de parecer un error de maquetación. */
.planner .foto img{width:97%;max-width:none;height:auto;
  position:absolute;left:50%;margin-left:-48.5%;bottom:7%;z-index:2;
  /* La sombra propia del objeto. La foto trae una sombra de contacto horneada muy
     tenue; ésta la continúa hacia abajo para que el libro pese sobre el lecho en
     vez de estar pegado encima. Va en `filter` y no en `box-shadow` porque tiene
     que seguir la SILUETA del recorte, no su caja rectangular. */
  /* La sombra se desplaza en CONTRA del giro (`--ry * -1.15`): con una luz fija,
     un objeto que gira a la derecha tira su sombra a la izquierda. Es el detalle
     que separa "una imagen con un efecto" de "un objeto con luz encima". */
  filter:drop-shadow(calc(var(--ry, 0) * -1.15px)
                     calc(6px + var(--p,1) * 10px) calc(12px + var(--p,1) * 16px)
                     rgba(44,44,44,.20));
  /* ── EL OBJETO RESPONDE AL PUNTERO ──────────────────────────────────────
     `--rx`/`--ry` las escribe planner.js desde la posición del cursor dentro del
     lecho. Reposo en 0: sin JS —o con movimiento reducido— el libro se queda
     recto y completo, nunca a medias.
     El giro es CORTO a propósito (±5°): un objeto real de 326 páginas no se
     bambolea. Lo que vende el peso no es la amplitud, es que la sombra se mueva
     en CONTRA, que es lo que hace una luz fija cuando el objeto gira.
     El origen va abajo (50% 88%) porque el libro está apoyado: si girara desde su
     centro se vería levitando, que es justo el defecto que acabamos de quitar. */
  transform:perspective(1100px)
            rotateX(calc(var(--rx, 0) * 1deg))
            rotateY(calc(var(--ry, 0) * 1deg));
  transform-origin:50% 88%;
  /* La curva es la de intelligentchange.com, medida en vivo: es el líder de su
     nicho exacto —mismo producto, mismo público— y su salida es larga y suave. */
  transition:opacity .3s var(--curva),
             transform .5s cubic-bezier(.16,.68,.43,.99),
             filter .5s cubic-bezier(.16,.68,.43,.99)}
/* Mientras el dedo/cursor está encima, el seguimiento tiene que ser INMEDIATO: con
   los 500 ms de la salida, el libro iba siempre medio segundo detrás del puntero y
   se sentía a elástico, no a objeto. Rápido al seguir, lento al volver. */
.planner .foto[data-toca] img{transition:opacity .3s var(--curva), transform .09s linear}
/* ⚠️ …pero el relevo de variante NO puede heredar esos 90 ms: si se cambia de color
   con el cursor encima del lecho —que es el caso normal, la muestra está al lado—
   el giro se atropellaba en un décimo de segundo y se veía a parpadeo. */
.planner .foto[data-toca] img.cambiando{
  transition:opacity .3s var(--curva), transform .5s cubic-bezier(.16,.68,.43,.99)}
/* El cambio de variante deja de ser un fundido: el libro GIRA. Es el mismo gesto de
   quien voltea un objeto en la mano para enseñar otro, y convierte el clic en la
   muestra —el gesto más muerto de la sección, según su propio comentario— en el
   momento con más vida del bloque. */
.planner .foto img.cambiando{opacity:0;
  transform:perspective(1100px) rotateY(-16deg) scale(.965)}
/* ── LA VISTA DE DENTRO ────────────────────────────────────────────────────
   La foto del interior es APAISADA (16:10) y el lecho es vertical: no se mete a la
   fuerza en la misma caja. Va como una LÁMINA centrada, más chica, con su propio
   canto y su sombra — el gesto de poner una foto encima de la mesa, no el de
   sustituir un cuadro por otro.
   Las dos fotos comparten el mismo hueco y se turnan por opacidad, así que la
   columna no cambia de alto al conmutar. */
/* 🔴 El botón que conmuta CAMBIA DE TEXTO, y "Ver la portada" es mucho más corto que
   "Ver todo lo que trae dentro": la fila de botones se recomponía y la sección
   brincaba 54 px al pulsar — medido, 954 → 900. Un control que mueve la página al
   usarse es peor que uno mudo. Se le fija el ancho del texto LARGO, así la caja no
   depende de en qué estado esté. */
/* ⚠️ Y el `min-width` hay que MEDIRLO, no estimarlo: puesto en 16.5rem computaba 220
   px cuando el texto largo mide 272, o sea quedaba por debajo del contenido y no
   sujetaba nada — el salto seguía igual. `min()` para que en móvil no desborde. */
#btn-dentro{min-width:min(20.75rem, 100%)}
/* En celular el ancho lo manda la columna (261 px), así que el texto largo cae a DOS
   renglones y el corto a uno: 52 px contra 39, y la sección volvía a brincar —13.
   Sujetar el ancho no basta cuando lo que cambia es el ALTO. Se reserva el alto de
   los dos renglones y el botón deja de depender de qué dice. */
@media (max-width:860px){ #btn-dentro{min-height:52px} }

/* 🔴 Va con `img.dentro-foto` y no con `.dentro-foto` a secas. Tercera vez hoy con
   la misma trampa: `.planner .foto img` pesa (0,2,1) y le ganaba a (0,2,0), así que
   la lámina heredaba el `width:97%`, el `margin-left:-48.5%` y el `bottom:7%` de la
   PORTADA — medido, 426 px de ancho y 207 px fuera del lecho por la izquierda.
   Y hay que ANULAR expresamente lo heredado: subir la especificidad no borra las
   otras declaraciones, solo gana en las que se repiten. */
.planner .foto img.dentro-foto{position:absolute;left:50%;top:50%;bottom:auto;
  margin-left:0;z-index:3;
  /* Con la portada apagada del todo, la lámina puede ocupar el hueco de verdad: a
     80% quedaba una estampita en medio de un lecho vacío. El anillo blanco de 6 px
     va POR FUERA de la caja, así que 93% es lo que cabe sin tocar el borde. */
  width:93%;max-width:none;height:auto;
  translate:-50% -50%;
  border-radius:calc(var(--radio) * .62);
  box-shadow:0 18px 40px rgba(44,44,44,.20), 0 0 0 6px var(--blanco);
  opacity:0;scale:.965;pointer-events:none;
  transition:opacity .42s var(--curva), scale .42s var(--curva)}
.planner .foto[data-vista=dentro] img.dentro-foto{opacity:1;scale:1}
/* 🔴 La portada se va a CERO, no a un 12% "de recuerdo": al 12% quedaba un fantasma
   azul pálido detrás de la lámina que se leía a fallo de render — y azul pálido es
   literalmente uno de los fondos que ella pidió no ver. Un elemento a medio apagar
   no es una transparencia elegante, es basura visual.
   No se oculta con `display:none` porque entonces perdería su sitio; se va en
   opacidad y sigue reservando la altura del lecho. */
.planner .foto[data-vista=dentro] #foto-planner{opacity:0}
/* Y con el libro fuera, su sombra de contacto tiene que irse con él: una sombra sin
   objeto que la proyecte es el detalle que delata una composición armada. Queda solo
   el halo, que es aire teñido y sí puede existir solo. */
.planner .foto[data-vista=dentro]::before{
  background:radial-gradient(58% 46% at 44% 40%,
    color-mix(in oklch, var(--acento) 13%, var(--placa)), transparent 72%)}
#foto-planner{transition:opacity .42s var(--curva)}
@media (prefers-reduced-motion:reduce){
  .planner .dentro-foto{transition:opacity .2s linear;scale:1}
}

/* El estado de entrada: al otro lado y SIN transición, para que el salto al punto
   de partida no se vea. Dura un cuadro. */
.planner .foto img.entra{opacity:0;transition:none;
  transform:perspective(1100px) rotateY(16deg) scale(.965)}
@media (prefers-reduced-motion:reduce){
  .planner .foto img,.planner .foto[data-toca] img{transform:none;transition:opacity .3s linear}
  .planner .foto img.cambiando{transform:none}
}

.planner .precio{margin-top:0.5rem;font-family:var(--serif);font-weight:300;
  font-size:2.125rem}
.muestras{display:flex;gap:0.75rem;margin-top:1.625rem;list-style:none}
.muestras{gap:1.0625rem}
.muestras button{width:42px;height:42px;border-radius:50%;border:0;
  cursor:pointer;outline-offset:6px;
  transition:transform .3s var(--curva), box-shadow .3s var(--curva)}
/* 🔴 EL ANILLO ES UNO SOLO Y VIAJA (16-ago). Antes cada disco tenía el suyo: el del
   que dejabas se apagaba y el del nuevo aparecía, o sea dos animaciones que se
   cruzan en el aire y ninguna dice de dónde a dónde fuiste. Un indicador que se
   DESPLAZA sí lo dice, y es lo que separa un selector de catálogo de uno cuidado.
   Va en un pseudo de la lista, no en un elemento nuevo: `<ul>` solo admite `<li>`
   como hijo, y meter un `<span>` ahí habría sido marcado inválido por un adorno.
   El respiro del fondo en medio se conserva —disco → 3 px de fondo → 2 px de
   tinta— porque sin él, en cobalto, el anillo se come el disco: los dos colores
   están a un paso y la variante elegida se leía como un círculo vacío. */
.muestras{position:relative}
/* 🔴 Va anclado al disco en LOS DOS EJES, no centrado en la lista. Con `top:50%` se
   veía bien en escritorio y en celular quedaba descolgado: ahí la lista ENVUELVE
   —el nombre de la variante baja de renglón— así que el 50% se medía contra el alto
   total y no contra la fila de discos. Un porcentaje contra una caja que cambia de
   forma no es una posición fija; el offset real del disco, sí. */
.muestras::after{content:"";position:absolute;left:0;top:0;
  width:42px;height:42px;border-radius:50%;pointer-events:none;
  translate:var(--aro-x, 0px) var(--aro-y, 0px);
  scale:1.06;
  box-shadow:0 0 0 3px var(--fondo), 0 0 0 5px var(--tinta);
  transition:translate .52s cubic-bezier(.16,.68,.43,.99),
             box-shadow .5s var(--curva)}
/* El disco elegido crece un pelo; el anillo ya no vive en él. */
.muestras button[aria-pressed=true]{transform:scale(1.06)}
/* Tacto al pulsar: se hunde. Un selector que no responde al dedo se siente muerto
   aunque después pase algo. */
.muestras button:active{transform:scale(.93);transition-duration:.09s}
/* Sin JS el pseudo se quedaría en el primer disco para siempre, que es correcto
   —es el que viene elegido— así que no hay estado a medias. */
@media (prefers-reduced-motion:reduce){
  .muestras::after{transition:none}
}
/* 🔴 La especificidad va con `.planner` delante A PROPÓSITO: más abajo en este
   mismo archivo hay una regla agrupada que incluye `.muestras .nombre-color` y
   la manda a `--tx-3` (carbón al 72%). Misma especificidad, va después, gana —
   y el nombre de la variante salía carbón sobre cobalto, medido en 1.4. Es la
   trampa de siempre: no hay error en consola, solo un texto que no se ve. */
.planner .muestras .nombre-color{align-self:center;margin-left:0.5rem;
  font:500 0.875rem/1 var(--cuerpo);
  color:color-mix(in srgb, var(--tinta) 78%, transparent);
  /* el cruce del nombre: lo dispara el JS cambiando opacity y translate */
  transition:opacity .19s var(--curva), translate .19s var(--curva),
             color .52s cubic-bezier(.16,.68,.43,.99)}
/* El precio DENTRO del botón — robado de Mar Cosmetics, que es la ref que ella eligió. */
.btn .costo{opacity:.72;font-weight:500}

/* ── la ficha técnica en SEGUNDO REGISTRO ────────────────────────────────── */
/* Eran cuatro viñetas de 15.5 px con puntito oliva: la parte más genérica del
   bloque y, medido, el punto oliva desaparecía en cuanto el fondo se oscurece.
   Los cuatro datos duros pasan a rejilla de especificación —rótulo chico en
   versalitas, dato en serif— y la prosa que sobra baja a un renglón. Es el mismo
   recurso de las maisons: lo vivo no es el tamaño, es el CAMBIO DE REGISTRO. */
.specs{margin-top:2rem;display:grid;grid-template-columns:repeat(4,auto);
  gap:1.625rem 2.125rem;justify-content:start;list-style:none;
  padding-top:1.625rem;
  border-top:1px solid color-mix(in srgb, var(--tinta) 22%, transparent)}
.specs dt{font:600 0.6562rem/1 var(--cuerpo);letter-spacing:.16em;text-transform:uppercase;
  color:color-mix(in srgb, var(--tinta) 78%, transparent)}
.specs dd{margin-top:0.5625rem;font-family:var(--serif);font-weight:300;
  font-size:1.5625rem;line-height:1;letter-spacing:-.01em}
.specs dd small{font-size:0.9375rem;letter-spacing:0}
.nota-ficha{margin-top:1.5rem;font-size:0.9688rem;line-height:1.62;
  max-width:46ch;color:color-mix(in srgb, var(--tinta) 82%, transparent)}

/* ── LAS PEGATINAS QUE CRUZABAN: BORRADAS (16-ago) ────────────────────────
   Aquí vivían 30 líneas para tres pegatinas —dos que la tarjeta se comía y una
   coral por delante— con un comentario que decía "es la pieza que hace el truco".
   Medido en el DOM: `document.querySelectorAll('.pegado').length` = **0**. Nunca
   existió el marcado. Treinta líneas describiendo un efecto que nadie vio nunca,
   y peor: describiéndolo en presente, así que el archivo afirmaba tener una
   profundidad que no tenía.
   No se reviven porque ella lo prohibió por escrito —"fuera todos los iconos
   dibujados"—: este CSS es anterior a esa orden. Lo que sí sobrevive es el
   diagnóstico, y su solución está arriba, en `.planner .foto img`: el que cruza
   ahora es el producto. */

/* ── la tienda en una fila: 5 SKUs ────────────────────────────────────────
   FORMA B, elegida el 13-ago tras comparar tres (queda archivada en
   `tienda-ab.html`). Lo que había medía así: el marco del producto en
   `rgb(250,247,240)` sobre una sección del MISMO `rgb(250,247,240)` —contraste
   1.00, o sea el producto no estaba sobre nada— y cinco botones coral de 231 px
   en fila, con su texto en 2.31. Eso último es el registro de Jukebox, que es
   justo el que dijimos que no.
   Ahora cada SKU es una HOJA TROQUELADA de su propio tono: el producto se apoya
   directo sobre el color y la tarjeta se corta como papel por arriba, con el
   mismo `troquel.svg` del resto del sitio. Los tonos van COMPLEMENTARIOS al
   producto, no parecidos — los dos journals azules (2027 e Infinite) caen sobre
   amarillo y lima para que dejen de leerse a duplicado.                       */
/* 🔴 v4 · EL MOSTRADOR — Y AQUÍ MURIERON LAS CINCO CAJAS IGUALES.
   Medido antes de tocar: las cinco fichas daban 236x453 px. Idénticas al
   píxel. O sea que un planner de $690 con cuatro colorways pesaba EXACTAMENTE
   lo mismo que una pluma de $95: eso no es una tienda, es una hoja de cálculo,
   y es el anti-patrón literal de "tres cajas iguales en fila" — aquí cinco.

   Dos cambios y la fila deja de ser rejilla:
     1 · las columnas dejan de ser `1fr` parejo. La Planner vale 1.5 de un
         journal y la pluma —que es accesorio, no producto ancla— vale .78.
         Como la vitrina va en `aspect-ratio`, el ancho arrastra el alto solo:
         no hace falta una sola regla extra para que la Planner sea más grande.
     2 · `align-items:end`. Las hojas dejan de estirarse a la altura del más
         alto y se APOYAN en una línea común, que es el canto del mostrador.
         Los tops quedan disparejos —eso es lo que se quiere— y los precios y
         botones siguen alineados, porque lo que se alinea ahora es el pie.

   La `perspective` vive aquí, en el contenedor, y no en cada ficha: en cada
   ficha cada una tendría su propio punto de fuga y las cinco mirarían a
   cámaras distintas. En el padre comparten una sola, que es lo que hace que se
   lean como objetos sobre UNA mesa. */
/* 🔴 Y LA LÍNEA DE APOYO ES LA DE LOS OBJETOS, NO LA DE LAS FICHAS. Primera
   versión: `align-items:end` a secas. Las fichas sí quedaban alineadas por su
   pie —medido, las cinco a 1068.7— pero lo que se alineaba con eso era el final
   del TEXTO, y como los nombres tienen uno o dos renglones ("Gratitude" contra
   "Mis Palabras Mueven Mi Mundo") los cinco libros acababan flotando a cinco
   alturas distintas. En un mostrador lo que se alinea es la BASE DE LOS
   OBJETOS; el borde de la etiqueta es lo de menos.
   La salida es `subgrid`: dos filas —vitrina y bloque de texto— compartidas por
   las cinco fichas. La fila de la vitrina toma la altura de la más alta (la
   Planner) y como el producto va anclado a `bottom` dentro de ella, los cinco
   se apoyan en la misma línea aunque midan distinto. */
.tienda .rejilla{display:grid;
  grid-template-columns:1.5fr 1fr 1fr 1fr .78fr;
  align-items:end;gap:1.25rem;margin-top:2.75rem;
  perspective:1400px}
/* 🔴 Y `subgrid` FUE UN ERROR, cazado en pantalla y no en el código. Sí alineaba
   las bases —cero de desnivel— pero estiraba las cinco HOJAS a la altura de la
   fila, y con eso se perdieron las dos cosas que hacían buena a esta fila:
     · el canto disparejo. Cuatro rectángulos idénticos con un hueco vacío
       arriba: exactamente las cinco cajas iguales de las que se venía huyendo,
       ahora con más aire.
     · la OCLUSIÓN. El producto sangra por arriba y el troquel le pasa por
       delante; con la hoja estirada el libro se queda a media tarjeta y el
       canto rasgado deja de ocluir nada. Se veía en las cuatro de la derecha.
   La causa nunca fue la ficha: era que el BLOQUE DE TEXTO mide distinto según
   el nombre ocupe uno o dos renglones. Se fija el texto y con `align-items:end`
   salen las cuatro cosas a la vez: hojas de altura propia, cantos disparejos,
   oclusión intacta y las cinco bases en la misma línea. */
.ficha-tx{display:flex;flex-direction:column;min-width:0}
/* Dos renglones como MÍNIMO, no como alto fijo: si algún día un nombre ocupa
   tres, la ficha crece y las bases se siguen alineando. Lo que no puede pasar
   es que uno ocupe uno y el de al lado dos. */
/* 🔴 EN `rem`, NO EN `em`. En `em` el mínimo se resuelve contra el tamaño de
   CADA elemento, y como la pluma lleva el nombre más chico (1.1875 contra
   1.3125), sus dos renglones medían 43 px y los de sus vecinas 48. Cinco
   mínimos distintos no igualan nada: el mínimo tiene que ser el MISMO número
   para las cinco, y eso es `rem`.
   Los valores salen de medir, no de calcular: 3rem cubre dos renglones del
   nombre y 2.85rem cubre los dos del dato más largo ("Journal de gratitud
   diario", que daba 44 px con su relleno). */
.sku h3{min-height:3rem}
.sku .dato{min-height:2.85rem}

/* 🔴 `min-width:0` NO es opcional. `1fr` es `minmax(auto,1fr)`: la columna no
   baja de su min-content, y el PNG del producto (520 px de ancho natural) lo
   fijaba en 832 — cinco columnas de 832 dentro de 1233, con 2,911 px de
   desborde horizontal. Medido antes y después: 832 → 231. */
.sku{min-width:0;position:relative;display:flex;flex-direction:column;
  /* 🔴 v2 — cada ficha traía SU PROPIO tinte pálido en un `style=` en línea
     (lima 52% sobre crema, menta 58%, lila 46%...). Quince en total, y ninguno
     tenía que ver con el color real del producto que enseñaba: el journal
     "Mis Palabras" salía en terracota y su producto es MAGENTA.
     Ahora la ficha hereda la superficie de su sección y el color lo pone LA
     FOTO. Eso es la tesis entera de la v2 en una regla: el color de esta web
     sale de sus productos, no de una paleta. */
  /* 🔴 v4 — LA HOJA NO EXISTÍA. Medido: ficha `#FFFFFF` sobre sección
     `rgb(246,244,235)` da contraste **1.10**, y `box-shadow:none` en reposo.
     O sea que la hoja troquelada —que conceptualmente es lo correcto, es el
     idioma de collage de su moodboard— en pantalla no se leía a hoja: no se
     leía a nada. Lo único que separaba el producto del fondo era su sombra.

     Verificado en vivo en aesop.com, que es el registro más cercano al suyo
     (crema `rgb(255,254,242)`): ahí la tarjeta NO EXISTE — fondo transparente,
     radio 0, sombra none, cero borde; el producto se apoya directo sobre el
     papel de la página. La caja es el tell amateur.
     Aquí no la borro: la COMPROMETO, porque el papel troquelado sí es suyo.
     Y lo que hace que un papel sobre papel se lea a papel no es el tono —dos
     cremas nunca van a dar contraste— es la SOMBRA PROYECTADA y la fibra.
     Mismo diagnóstico que §pila: no le falta color, le falta material. */
  background-color:#FCFAF4;
  background-image:url("grafico/grano.svg");
  background-size:200px 200px;
  background-blend-mode:multiply;
  border-radius:0 0 var(--radio) var(--radio);   /* arriba manda el troquel */
  padding:1.625rem 1rem 1.375rem;
  /* Dos sombras, no una: la de contacto —corta, casi pegada— dice que la hoja
     TOCA la mesa; la ambiental, larga y abierta, dice a qué altura está. Una
     sola sombra genérica no es ninguna de las dos, y es exactamente lo que
     tenía el producto aquí dentro. */
  box-shadow:0 1px 2px rgba(58,50,32,.07), 0 12px 26px -10px rgba(58,50,32,.16);
  /* El `transform` se arma con variables porque tres gestos distintos escriben
     sobre él —el levantar del hover, el giro del puntero y la caída de la
     entrada— y tres reglas peleándose por la misma propiedad es como se pierde
     uno de los tres en silencio. */
  /* 🔴 EL ORIGEN VA EN EL PIE, y de ahí sale todo lo demás. La ficha crece al
     pasar el cursor, y si creciera desde su centro se despegaría de la línea
     del mostrador —la misma línea que costó llegar a 0.3 px de desnivel—. Desde
     el pie, la hoja crece hacia arriba con la base clavada en el suelo, que es
     lo que hace un objeto cuando se acerca a ti. El giro del puntero también
     pivota ahí, como un objeto apoyado. */
  transform-origin:bottom center;
  transform:translateY(var(--lev,0px))
            rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg))
            scale(var(--crece,1));
  transform-style:preserve-3d;
  transition:transform .5s var(--curva), box-shadow .5s var(--curva)}
/* 🔴 v4.1 — YA NO HAY UNA SOLA FICHA GRANDE: la grande es la que estás mirando.
   La jerarquía fija se queda (la Planner es el ancla y sigue midiendo 1.5), pero
   encima de eso cualquiera de las cinco crece cuando el cursor llega. Deja de
   ser un mostrador con un producto destacado y pasa a ser uno donde levantas el
   que te interesa.
   `z-index:4` porque `scale` NO reserva espacio: la ficha crecida se mete sobre
   sus vecinas, y sin capa propia la de la derecha —que se pinta después— le
   pasaría por encima justo por el lado hacia el que creció. */
.sku:hover,.sku:focus-within{--lev:-6px;--crece:1.055;z-index:4;
  box-shadow:0 2px 3px rgba(58,50,32,.05), 0 30px 52px -14px rgba(58,50,32,.22)}
/* Y el producto crece un pelo MÁS que su hoja. Si los dos crecieran igual sería
   un zoom de captura de pantalla; creciendo distinto, el objeto se despega del
   papel y eso es lo que se lee a profundidad. */
/* El puntero mueve la hoja 2.2°, no 15. Quince es el número del snippet de
   tilt-card de ReactBits y es lenguaje tech: a esa amplitud una hoja de papel
   se lee a naipe girando. Lo que da el volumen no es el giro — es que el
   objeto y su sombra se muevan CANTIDADES DISTINTAS (ver `.sku-obj`). */
.sku:hover{transition:transform .18s linear, box-shadow .5s var(--curva)}

/* El texto vuelve a mandar sobre el suelo. La sombra del producto va
   posicionada y sin esto pintaría ENCIMA del nombre y del precio, porque un
   elemento posicionado con z-index:0 se pinta después del contenido en flujo. */
.sku h3,.sku .dato,.sku .agregar,.sku .colores-sku{position:relative;z-index:1}
/* El canto rasgado, pintado del color de la sección: la hoja parece arrancada
   del papel de atrás, no pegada encima. */
.sku::before{content:"";position:absolute;left:0;right:0;top:-1px;height:14px;
  z-index:2;pointer-events:none;background:var(--fondo,var(--crema));
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}

/* 🔴 v3.1 — LA INSIGNIA RECUPERA SU PLACA, y esto revierte a conciencia la
   decisión de la v2. Aquélla ("sobre un tono ya no necesita fondo propio") era
   correcta cuando la insignia caía sobre la ficha tintada y plana. Con el
   producto sangrando hacia arriba, la insignia ya no cae sobre un tono: cae
   sobre la TAPA del libro. Medido, carbón al 82% sobre el cobalto da 1.19 y
   sobre el esmeralda 1.86 — "Nuevo" y "Favorito" simplemente no se leían.
   Y no puede resolverse con un color de texto porque las cinco tapas van de
   azul marino a verde lima: no existe una tinta que funcione en las cinco. La
   placa sí, y va en su naranja para no meter un sexto color. */
.sku .marca-sku{position:absolute;top:20px;left:14px;z-index:3;
  font:600 0.625rem/1 var(--cuerpo);letter-spacing:.16em;text-transform:uppercase;
  padding:0.375rem 0.625rem;border-radius:var(--pildora);
  background:var(--naranja);color:var(--blanco)}   /* 5.62 */

/* ═══ v3 · EL PRODUCTO SALE DE LA CAJA ═════════════════════════════════════
   🔴 ÉSTE ERA EL MAYOR CULPABLE DE QUE LA WEB SE VIERA INSÍPIDA, y la causa
   era una sola: el producto —lo ÚNICO con color del sitio— ocupaba el 25.1%
   de su tarjeta. Medido: tarjeta 200x383, producto 139x139. Y ese 139 es
   CUADRADO porque la ficha cargaba la foto de catálogo (1080x1080, el planner
   chiquito al centro y aire alrededor), no el recorte. O sea: aire dentro de
   aire dentro de una caja blanca.

   Dos cambios y la fila cambia de carácter:
     1 · la ficha carga `rec-*.webp`, el recorte, donde el producto LLENA el
         cuadro. Eso solo ya casi lo duplica.
     2 · el aire interior baja de 12%/10% a casi nada y el objeto SANGRA hacia
         arriba, cruzando el canto rasgado.

   El sangrado no es capricho de composición: es lo que convierte una rejilla
   de tarjetas —el anti-patrón de "tres cajas iguales en fila"— en un collage,
   que es el mecanismo de su moodboard. Y el canto rasgado deja de ser un
   borde decorativo para volverse una OCLUSIÓN: el papel pasa por delante del
   libro, y eso es lo que da profundidad real sin una sola línea de 3D. */
.sku{overflow:visible}
.sku .vitrina{position:relative;aspect-ratio:4/5;overflow:visible}
/* 🔴 LA IMAGEN VA `absolute`, Y NO ES UN DETALLE DE COLOCACIÓN. Primer intento:
   en flujo, con `height:126%` y el padre en `overflow:visible`. Se disparó —
   medido, la ficha pasó de 383 a 693 px de alto y el producto salió de 139 a
   459x655, MÁS ANCHO QUE SU PROPIA TARJETA. La causa es un bucle: la altura en
   porcentaje se resuelve contra un padre cuya altura la decide su contenido,
   así que la imagen crecía, empujaba la fila, y con la fila más alta volvía a
   crecer. Fuera de flujo no puede empujar nada y el 118% significa lo que dice. */
/* 🔴 v3.1 — EL SANGRADO TIENE QUE CABER DEBAJO DEL CANTO, y por eso baja de 118
   a 111.5. La idea era buena y la ejecución estaba a medias: el canto rasgado
   mide 14 px y el libro sobresalía 29 por encima de la tarjeta. O sea que arriba
   del rasgado quedaban OTROS 15 px de libro sueltos sobre la crema, y la banda
   no ocluía el borde del libro: le cortaba una rebanada por en medio. En 2K,
   donde la ficha se queda en 240 px de ancho, eso se lee a foto mal recortada,
   que es exactamente lo que reportó paco.
   Para que una oclusión se lea a oclusión, lo tapado tiene que ser el BORDE del
   objeto, no una franja interior. Medido: con 111.5% el libro sobresale 12 px y
   el canto de 14 se lo come entero. Sigue sangrando y sigue ocupando muy por
   encima del 25.1% de la v1 — solo deja de asomar por arriba de su propia tapa. */
/* 🔴 EL DESPEGUE DEL PIE VA EN PÍXELES, NO EN PORCENTAJE, y esto solo aparece
   cuando la línea de apoyo ya es común. Con `bottom:3%` el despegue se resuelve
   contra la altura de CADA vitrina: 11.4 px en la de la Planner (380 de alto)
   contra 7.2 en las de los journals (240). Medido, los cinco objetos quedaban a
   874.2 y 878.4 — cuatro píxeles de desnivel en una fila que existe justamente
   para que se apoyen igual. En píxeles el suelo es uno solo. */
.sku .sku-obj{position:absolute;left:50%;bottom:8px;translate:-50% 0;
  /* 🔴 v4.1 — SE ACABÓ EL SANGRADO, Y LA RAZÓN ES FÍSICA, NO DE GUSTO.
     El canto rasgado se pinta del color del FONDO de la sección y pasaba por
     delante del libro. Eso funcionaba mientras la ficha era una hoja plana
     pegada al papel: se leía a collage, el papel de atrás cruzando por encima.
     Con la v4 la hoja se levantó —tiene su sombra de contacto y su ambiental—
     y entonces la banda pasó a ser el fondo de la sección pintado por DELANTE
     de un objeto que está por ENCIMA de ese fondo. Es imposible, y por eso el
     ojo la lee a lo que paco la leyó: una tira blanca cruzando el producto.
     Con el objeto dentro de su hoja, el troquel vuelve a ser lo que dice ser:
     el canto rasgado de la hoja, y solo cae sobre crema. */
  height:96%;width:auto;max-width:none;
  /* z-index bajo el canto (que va en 2): el libro se mete DETRÁS del rasgado.
     Delante se vería pegado encima; detrás, encajado. */
  z-index:1;
  /* 🔴 v4 — SE CAE EL `drop-shadow` GENÉRICO. Era `0 14px 20px` y era EL MISMO
     PARA LOS CINCO, así que ninguno de los cinco tenía la sombra de su propia
     forma ni de su propia altura, y por eso los cinco flotaban. La de verdad
     es `.sku-sombra`, renderizada. Lo que queda aquí es solo el contacto: un
     par de píxeles pegados a la base, que es lo que el mapa renderizado no
     puede dar porque está detrás. Dos sombras de la misma escala se leerían a
     dos soles; una de contacto y una proyectada se leen a UN sol. */
  filter:drop-shadow(0 2px 3px rgba(44,40,30,.22));
  transform:translate3d(0,var(--sube,0px),var(--z,0px))
            scale(var(--esc,1)) rotate(var(--gir,0deg));
  transition:transform .5s var(--curva);transform-origin:bottom center}
/* 🔴 Y EL EXTRA DEL OBJETO ES CHICO A PROPÓSITO — se calibró midiendo, porque
   el primer número volvía a sacar la tira blanca. En reposo el libro queda a
   13 px por debajo del canto rasgado. Al levantar la ficha, el objeto crece
   desde su base y sube: con 1.06 y -10 px se movía 24 px hacia arriba y se
   metía DEBAJO del troquel — o sea la misma tira que se acababa de quitar,
   reapareciendo solo en la ficha que estás mirando.
   Con 1.02 y -4 px el desplazamiento es de 8.6 contra 13.7 de margen. El
   crecimiento que se ve es el de la HOJA entera; esto solo despega el objeto
   de su papel, que es lo que hace que no parezca un zoom de captura. */
.sku:hover .sku-obj,.sku:focus-within .sku-obj{--sube:-4px;--esc:1.02;--gir:-1.4deg;--z:26px}

/* ── la sombra proyectada, la de verdad ───────────────────────────────────
   Sale del mismo Blender headless que escenificó los productos, y §pila ya la
   monta desde hace tres tandas: esta fila era el único sitio donde el objeto
   seguía con una sombra dibujada por CSS.
   Se estira en `height` en vez de dejarla en su proporción (546x176) porque la
   ficha manda su ancho y una sombra difusa aguanta el aplastado sin que se
   note — un objeto no, una mancha borrosa sí. */
/* En píxeles por lo mismo que el objeto: la sombra vive en el suelo, y el suelo
   está a una sola altura para las cinco. El grosor sí crece con el objeto: un
   libro más alto proyecta más lejos, y dejarlas todas del mismo grosor era
   volver a la sombra genérica por otra vía. */
.sku .sku-sombra{position:absolute;left:50%;bottom:-11px;z-index:0;
  /* 🔴 SE DESPLAZA A LA DERECHA, Y NO ES GUSTO: es a dónde cae la luz de esta
     sección. `.tienda` corre su radial en `16% -8%`, o sea arriba a la
     izquierda, así que la sombra proyecta abajo a la derecha. Centrada quedaba
     tapada entera por el propio libro —el libro cubre el 90% del ancho de su
     vitrina— y no se veía ni un píxel de lo que se acababa de montar.
     Y sale por debajo del pie de la vitrina (`-11px`) para que la franja que
     asoma sea la de ABAJO del objeto, que es la que dice "esto está apoyado".
     Encima del texto no llega: el nombre y el precio van en z-index 1. */
  width:120%;height:2.6rem;object-fit:fill;translate:calc(-50% + 8%) 0;
  pointer-events:none;opacity:.55;
  mix-blend-mode:multiply;
  transform:scaleX(var(--sx,1)) scaleY(var(--sy,1));
  transform-origin:center top;
  transition:transform .5s var(--curva), opacity .5s var(--curva)}
/* 🔴 AL LEVANTARSE, LA SOMBRA SE ALARGA Y SE ACLARA. Antes el libro subía y su
   sombra subía con él, pegada — que es exactamente lo que delata una foto
   pegada encima. Una sombra pertenece al SUELO: cuando el objeto se aleja, ella
   se queda, crece y pierde densidad. Y crece MENOS que lo que sube el objeto:
   ese desfase es el que se lee a volumen. */
.sku:hover .sku-sombra,.sku:focus-within .sku-sombra{--sx:1.1;--sy:1.28;opacity:.3}
.tienda .sku:first-child .sku-sombra{height:3.5rem}
/* En celular la ficha es mucho más angosta: el objeto baja otro poco para que
   no se coma el aire de los lados. */
@media (max-width:640px){ .sku .sku-obj{height:92%} }

/* La pluma, sin foto, deja de ser un hueco: su frase en serif sobre su tono
   cierra la fila. Cuando llegue la foto se cambia y no se toca nada más. */
/* La frase se centra en su vitrina. Arriba y con el resto del cuadro vacío se
   leía a hueco esperando una foto —que es literalmente lo que es— y el hueco no
   hay que subrayarlo. Centrada, el cuadro se lee a placa tipográfica. */
.sku .tipo{padding:14% 12%;text-align:center;
  display:flex;align-items:center;justify-content:center}
.sku .frase-sku{font-family:var(--serif);font-weight:300;font-style:italic;
  font-size:clamp(1.1875rem,1.7vw,1.625rem);line-height:1.18;color:var(--carbon)}

/* El escalón tipográfico que faltaba: el nombre iba en grotesca de 16 px contra
   un titular de 92 —5.75× sin ningún registro en medio—. Entra en serif, y el
   precio también, porque es un DATO y no una etiqueta de oferta. */
.sku h3{margin-top:1rem;font-family:var(--serif);font-weight:300;
  font-size:1.3125rem;line-height:1.15;letter-spacing:-.01em;color:var(--carbon)}
/* 🔴 `margin-top:auto` ancla la fila del precio AL PIE, y `flex-end` en vez de
   `baseline`: con la línea de apoyo, un descriptor de DOS renglones ("Journal de
   gratitud diario") alineaba su precio 17 px más arriba que los demás. Cinco
   precios a cinco alturas se leen a descuido. Medido: dispersión 17 → 0. */
.sku .dato{margin-top:auto;padding-top:0.4375rem;display:flex;align-items:flex-end;
  justify-content:space-between;gap:0.625rem;
  font:400 0.8438rem/1.4 var(--cuerpo);color:rgba(44,44,44,.82)}
.sku .precio-sku{font-family:var(--serif);font-weight:300;font-size:1.1875rem;
  color:var(--carbon);white-space:nowrap}

/* ── el botón: con TEXTO, pero compacto ──────────────────────────────────── */
/* Probé reducirlo a un disco con un `+` y paco lo bajó con razón: un icono sin
   etiqueta se monta encima del producto y no dice qué hace. Vuelve a decir
   "Agregar" — lo que cambia es que ya NO ocupa los 231 px de la tarjeta, así que
   cinco juntos dejan de ser un muro.
   🔴 v3 — su texto va en BLANCO. Iba en carbón porque el relleno era el coral
   #FD7855, donde el blanco mide 2.31 y reprueba. Con el naranja #B93D0A que ella
   pidió, el blanco da 5.62 y pasa — y es exactamente lo que escribió: "si usamos
   botón naranja que el texto arriba sea en blanco". */
.sku .agregar{margin-top:1rem;align-self:start;
  display:inline-flex;align-items:center;gap:0.5rem;
  padding:0.75rem 1.375rem;border-radius:var(--pildora);
  /* 🔴 v3 — LOS CINCO VUELVEN A SU NARANJA, y esto revierte a propósito la idea
     de la v2 de que "el botón es del color de lo que compras". Aquella tenía una
     lógica defendible —el color como etiqueta del objeto— pero producía una fila
     de cinco píldoras saturadas, dos de ellas en azul cobalto y verde esmeralda,
     que no están en la lista de lo que ella dijo querer usar y que además chocan
     con "ese color es solo para detalles".
     Ella pidió justo esto de la tienda: "quizás ahí jugar con otro color de
     botón, de nuevo más limpio". El color del producto no se pierde: sigue en la
     portada, que es donde de verdad informa. */
  background:var(--btn-sku,var(--naranja));color:var(--btn-sku-tx,var(--blanco));
  font:500 0.875rem/1 var(--cuerpo);text-decoration:none;
  transition:transform .3s var(--curva), box-shadow .3s var(--curva)}
.sku .agregar:hover{transform:translateY(-2px);
  box-shadow:0 8px 18px rgba(44,44,44,.16)}
/* 🔴 v4 — EL BOTÓN DEL ANCLA PESA MÁS QUE LOS OTROS CUATRO. Cinco píldoras
   naranjas idénticas en fila es ritmo plano: el ojo no tiene dónde entrar y
   ninguna de las cinco gana. La de la Planner —el producto ancla, el más caro
   y el único con variantes— se queda llena; las otras cuatro bajan a contorno.
   No cambian de color: el naranja sigue siendo el color de acción y no compite
   consigo mismo, que es la regla 3 de su propia GUIA.md. Cambian de PESO.
   🔴 Y la clase se llama `sku-ancla`, no `ancla`: `.ancla` YA EXISTE — es el
   ancla del hero de la apertura, con `position:absolute` y `opacity:0`. El
   botón la heredó entera y se quedó en 51 px de ancho e invisible, sin un solo
   error en consola. Quinta colisión de nombre que se caza en este archivo, y
   como las otras cuatro: se vio midiendo, no leyendo. */
.sku .agregar:not(.sku-ancla){background:transparent;color:var(--naranja);
  box-shadow:inset 0 0 0 1.5px var(--naranja)}
.sku .agregar:not(.sku-ancla):hover{background:var(--naranja);color:var(--blanco);
  box-shadow:0 8px 18px rgba(44,44,44,.16)}
/* El vertical se queda IGUAL que el de los otros cuatro: el ancla pesa más por
   estar rellena y ser más ancha, no por ser más alta. Con 0.875 arriba y abajo
   medía 42 px contra 37, y esos 5 px bajaban su producto 5 px respecto a la
   fila — el peso de un botón no puede mover la línea del mostrador. */
.sku .agregar.sku-ancla{padding:0.75rem 1.625rem}

/* ── las muestras de color de la Planner ──────────────────────────────────
   Chicas a propósito: §planner, dos secciones arriba, ya tiene el selector
   grande con su nombre de color y su mundo entero cambiando. Repetir aquí ese
   gesto sería contar el mismo chiste dos veces. Aquí el trabajo es otro y más
   corto: allá exploras, aquí eliges el que te llevas. */
/* En RENGLÓN, no en columna. Apiladas, las muestras y el nombre del color
   sumaban 8 px más que el dato de las otras cuatro, y esos 8 px bajaban el
   producto de la Planner 8 px por debajo de la línea del mostrador. En el
   mismo renglón el bloque mide lo que un renglón cualquiera y la fila queda a
   nivel. Caben: cuatro muestras y "Terracota" ocupan 153 de los 304 px. */
.dato-izq{display:flex;align-items:center;gap:0.5rem;min-width:0}
.colores-sku{display:flex;gap:0.4375rem;padding:0;margin:0;list-style:none}
.colores-sku button{width:1.125rem;height:1.125rem;padding:0;border:0;
  border-radius:var(--pildora);cursor:pointer;
  /* El aro va por FUERA con `box-shadow`, no con `border`: un borde le come
     píxeles al color y la muestra de 18 px se queda en 14 de color real. */
  box-shadow:0 0 0 1px rgba(44,44,44,.14);
  transition:box-shadow .32s var(--curva), transform .32s var(--curva)}
.colores-sku button:hover{transform:scale(1.14)}
/* El hueco del aro se pinta del color de la HOJA (#FCFAF4), no de `--sup`:
   dentro de esta sección `--sup` sigue valiendo blanco puro, y un aro blanco
   sobre la hoja crema deja una costura clara alrededor de la muestra. */
.colores-sku button[aria-pressed="true"]{
  box-shadow:0 0 0 1.5px #FCFAF4, 0 0 0 3.5px var(--tinte,var(--carbon))}
.colores-sku button:focus-visible{outline:2px solid var(--carbon);outline-offset:3px}

/* ── la pluma: accesorio, no producto ancla ───────────────────────────────
   Su columna es la más angosta (.78fr) y la frase venía en un `clamp` pensado
   para una ficha de 236: a 174 px se partía en cinco renglones. */
.sku.accesorio .frase-sku{font-size:clamp(1rem,1.15vw,1.1875rem)}
.sku.accesorio h3{font-size:1.1875rem}

/* ── EL MOSTRADOR: la superficie sobre la que se apoyan ───────────────────
   🔴 Por qué la fibra va en una capa propia y no como fondo de la sección:
   un fondo pegado a la sección NO SE MUEVE. Es el hallazgo de §pila, donde
   `background-attachment:fixed` dentro de una vista pegajosa daba cero
   movimiento relativo en seis pantallas. Aquí la capa es un elemento y se
   desplaza contra el scroll con `--p`.
   Y el recorrido es CORTO —7%— porque la sección mide 1003 px: el mismo
   desplazamiento que se ve en §pila, repartido en un sexto del scroll, se
   leería a sacudida. Un recorrido no se calibra por su total sino por su total
   dividido entre el scroll que tarda. */
.tienda-mesa{position:absolute;inset:0;z-index:0;pointer-events:none;
  overflow:hidden}
/* 🔴 LA FIBRA DEL MOSTRADOR NO ES LA FOTO DEL PAPEL, ES EL GRANO VECTORIAL.
   Primer intento: `papel.webp` con `object-fit:cover` al 26%. Se leía a MURO
   DE ESTUCO — el mismo error que ya se cometió en §pila con .50 y que aquí
   repetí con la mitad del número. Y bajarle la tinta no lo arreglaba, porque
   la causa era el AUMENTO: esa foto tiene que estirarse 1.18x para cubrir el
   campo, y a ese tamaño el poro deja de leerse a fibra y se lee a pared.
   Intenté encogerla con `transform:scale(.62)` y eso es directamente un error:
   con `object-fit:cover` encoger el elemento no afina el poro, deja hueco.
   El grano vectorial ya es fino por construcción y se repite a 200 px sin
   costura, que es el tamaño al que el poro queda POR DEBAJO del umbral en que
   se nota uno solo. Y de paso el fondo deja de cargar una foto de 2000 px que
   nadie va a mirar. Lo que se busca no es ver la textura: es que el campo de
   crema deje de ser plano. Si la ves, ya es demasiada. */
.tienda-fibra{position:absolute;left:0;width:100%;height:116%;
  top:calc(-8% + (var(--p,.5) - .5) * -7%);
  background-image:url("grafico/grano.svg");
  background-size:200px 200px;background-repeat:repeat;
  opacity:.5;mix-blend-mode:multiply}

/* ── la entrada: las hojas se ASIENTAN ────────────────────────────────────
   El revelado genérico del sitio (`[data-rev]`: sube 20 px y aparece) lo
   comparten reels, voces y eventos. Para la sección donde se compra, el mismo
   gesto más una cosa: las hojas llegan con un grado y pico de giro que se
   asienta, que es como se apoya el papel. El signo alterna por ficha para que
   no caigan las cinco en paralelo — eso se leería a persiana.
   Va en `rotate`, propiedad independiente, para no pelearse con el `transform`
   que ya usan el hover y el puntero. */
.js-rev .tienda .sku[data-rev]{rotate:var(--asienta,-1.1deg);
  transition:opacity .85s var(--curva), translate .85s var(--curva),
             rotate .85s var(--curva);
  transition-delay:calc(var(--i, 0) * 90ms)}
.js-rev .tienda .sku[data-rev].ver{rotate:0deg}
.tienda .sku:nth-child(even){--asienta:1.1deg}

/* El nombre del producto va dentro del botón para el lector de pantalla: cinco
   enlaces que solo dicen "Agregar" son indistinguibles fuera de contexto. */
.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}

/* ── §5 · LOS VIDEÍTOS ───────────────────────────────────────────────────── */
.reels .fila{display:grid;grid-template-columns:repeat(4,1fr);gap:1.375rem;margin-top:2.75rem}
.reel .marco{position:relative;aspect-ratio:9/16;border-radius:var(--radio);
  overflow:hidden;background:var(--sup)}
/* El rótulo del hueco se va abajo: centrado quedaba PARTIDO por el botón de
   play, que vive justo en medio. */
.reel .marco.falta{align-content:end;padding-bottom:1.5rem}
.reel .play{position:absolute;inset:0;margin:auto;width:62px;height:62px;
  border-radius:50%;background:rgba(250,247,240,.9);border:0;cursor:pointer;
  display:grid;place-items:center;transition:.3s var(--curva)}
.reel .play:hover{transform:scale(1.08)}
.reel .play .ico{width:24px;height:24px;margin-left:2px;color:var(--carbon)}
/* ── EL PIE DE CADA VIDEO ───────────────────────────────────────────────────
   Una línea que dice de qué es. Los cuatro títulos existían solo en el
   `aria-label`: medido, CERO de cuatro se veían — el lector de pantalla sabía
   más de esta sección que quien la mira. Un muro de cuatro miniaturas mudas
   obliga a abrir una para averiguar si te interesa, y eso es exactamente el
   clic que nadie da.                                                          */
.pie-reel{margin-top:0.8125rem;padding:0 2px;
  font:400 0.875rem/1.45 var(--cuerpo);color:rgba(44,44,44,.86)}
.pie-reel a{display:inline-flex;align-items:center;gap:0.3125rem;
  color:var(--carbon);font-weight:500;text-decoration:none;white-space:nowrap;
  border-bottom:1px solid rgba(44,44,44,.28);
  transition:border-color .3s var(--curva)}
.pie-reel a:hover{border-color:var(--carbon)}
.pie-reel a .ico{width:15px;height:15px;transition:transform .35s var(--curva)}
.pie-reel a:hover .ico{transform:translateX(3px)}

/* ── UNA SOLA TARJETA PARA TODA LA FILA ─────────────────────────────────────
   🔴 Antes había una por video, cada una vendiendo un producto distinto. Al
   revisar los videos cuadro por cuadro salió que TRES de los cuatro son la
   misma planner y el cuarto no enseña nada del catálogo: cuatro tarjetas
   distintas eran una promesa que el video no cumplía. Y de paso se quita el
   mismo botón repetido cuatro veces en la misma pantalla, que es la forma más
   rápida de que un botón deje de leerse como botón.                          */
.pie-fila{display:flex;flex-wrap:wrap;align-items:center;
  justify-content:space-between;gap:1.25rem;margin-top:2.125rem}
.compra-una{display:flex;align-items:center;gap:1rem;
  padding:0.875rem 1.125rem;border-radius:var(--radio-chico);background:var(--sup)}
.compra-una img{width:52px;height:64px;object-fit:contain}
.compra-una b{display:block;font:500 0.9688rem/1.3 var(--cuerpo)}
.compra-una span{display:block;margin-top:3px;font-size:0.8438rem;color:rgba(44,44,44,.7)}
/* 🔴 v3 — SE QUITA EL `color` FIJO. Existía para el relleno coral, donde el
   blanco medía 2.31 y el carbón 6.04. Al cambiar el relleno por omisión al
   naranja #B93D0A esta regla siguió puesta y dejó el botón en 2.48 — el mismo
   fallo que evitaba, al revés. Es el patrón de siempre en este archivo: cambiar
   un token DESPIERTA los `color` cableados que lo compensaban, sin un error en
   consola. Se cazó midiendo el ratio del botón renderizado, no leyendo el CSS.
   Ahora hereda del sistema: blanco sobre naranja, 5.62. */
.compra-una .btn{margin-left:0.5rem;padding:0.8125rem 1.5rem;font-size:0.875rem}

/* ── §6 · EL MANIFIESTO ──────────────────────────────────────────────────── */
.manifiesto{text-align:center}
/* El manifiesto es el pico tipográfico del sitio: es SU frase, la que define la
   marca. Si algo llega a 132, es esto. */
.manifiesto .grande{font-family:var(--serif);font-weight:300;
  font-size:clamp(2.625rem,9vw,8.25rem);line-height:1.02;letter-spacing:-.018em;
  max-width:11ch;margin:1.75rem auto 0}
.manifiesto .cuerpo{margin:2.125rem auto 0;max-width:60ch;
  font-size:1.1875rem;line-height:1.7;color:rgba(44,44,44,.76)}
.manifiesto .cuerpo p+p{margin-top:1.125rem}
.manifiesto .adornito{width:150px;margin:0 auto}
.manifiesto .adornito img{width:100%;height:auto}

/* ── §7 · BLOOM LIBRARY — la hoja sobre el agua ──────────────────────────── */
/* La sección tenía dos problemas y eran el mismo: una placa lila plana de 1180
   px con OTRA placa metida adentro. Tarjeta dentro de tarjeta es el antipatrón
   más fácil de señalar sin discutir de gusto, y de paso era la única superficie
   del sitio que no está hecha de papel — por eso se leía a panel de interfaz
   justo en la sección que regala lo que ella escribió.
   Ahora es UNA hoja: crema, troquelada arriba y abajo como todo lo demás,
   apoyada sobre la acuarela. La captura sigue dentro, separada por un filete. */
/* Dos columnas arriba (el titular y la captura) y el índice cruzando la hoja
   entera abajo. Metido dentro de la columna izquierda dejaba un cuarto de hoja
   vacío abajo a la derecha —el titular es más alto que el formulario— y encima
   apretaba siete renglones en media hoja. */
.biblio{position:relative;
  display:grid;grid-template-columns:1.06fr .94fr;
  column-gap:clamp(2.125rem,4.4vw,4.5rem);row-gap:clamp(2.125rem,4vw,3.5rem);
  align-items:stretch;
  padding:clamp(2.875rem,5vw,4.875rem) clamp(2.125rem,4vw,4rem);
  background:var(--sup)}
/* El troquel de las costuras entre secciones, aquí en las DOS orillas de la
   hoja. Es el mismo `troquel.svg` y el mismo grosor; lo único que cambia es que
   el de abajo va volteado, porque un papel rasgado no rasga igual por los dos
   lados si es la misma tira sin girar. */
.biblio::before,.biblio::after{content:"";position:absolute;left:0;right:0;
  height:16px;background:var(--sup);pointer-events:none;
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}
.biblio::before{top:-15px}
.biblio::after{bottom:-15px;transform:scaleY(-1)}

/* 🔴 El titular se había quedado SIN TOPE al salir de `.franja`: volvía a la
   escala de sección entera (98 px) dentro de una columna que comparte el ancho
   con el formulario, y se comía tres renglones. La regla que lo capaba vivía
   colgada de la clase que quité — es el clásico de renombrar un contenedor y
   perder en silencio lo que dependía de él. Mismo tope de siempre: dentro de
   dos columnas manda la COLUMNA, no la escala del sitio. */
.biblio .titular{font-size:clamp(2rem,3.9vw,3.375rem);line-height:1.14;max-width:15ch}
.biblio .bajada{font-size:1.0625rem;max-width:40ch}

/* El filete entre el índice y la captura. Una línea, no una caja: es lo que
   evita volver a la tarjeta anidada y sigue diciendo "aquí empieza otra cosa". */
/* Va centrada en su renglón: el titular es más alto y con el formulario pegado
   arriba la hoja quedaba coja. El filete, en cambio, sí cruza el renglón
   completo — una línea que se corta a media altura se lee a error, no a filete. */
/* 🔴 La caja SE ESTIRA a todo el renglón y el contenido se centra por dentro.
   Al revés —la caja centrada— el filete solo medía lo que mide el formulario y
   se quedaba colgando a media altura, que se lee a error de render y no a
   filete. El que tiene que llenar el renglón es el borde, no el texto. */
.biblio .captura{position:relative;
  display:flex;flex-direction:column;justify-content:center;
  padding-left:clamp(0,3.4vw,3.25rem)}
.biblio .captura::before{content:"";position:absolute;left:0;top:0;bottom:0;
  width:1px;background:rgba(44,44,44,.16)}
.captura h3{font-family:var(--serif);font-weight:300;font-size:1.75rem;line-height:1.24}
.captura p{margin-top:0.75rem;font-size:0.9688rem;line-height:1.55;color:rgba(44,44,44,.7)}

/* ── EL ÍNDICE ────────────────────────────────────────────────────────────── */
/* Eran siete píldoras sueltas. Una píldora dice "etiqueta"; siete seguidas
   dicen "nube de temas", que es justo lo contrario de lo que necesita algo que
   se regala. Ahora es la tabla de contenidos de un cuaderno: tres columnas de
   renglones a todo el ancho de la hoja, cada uno con su marca dibujada a mano.
   Los renglones NO son enlaces todavía —la biblioteca no existe como página— y
   por eso no fingen serlo: cero hover de liga, cero cursor de mano. El día que
   cada recurso tenga su URL, se vuelven <a> y el hover entra solo. */
.indice{grid-column:1/-1;list-style:none;
  padding-top:clamp(1.625rem,3vw,2.5rem);border-top:1px solid rgba(44,44,44,.16);
  display:grid;grid-template-columns:repeat(3,1fr);gap:0 clamp(1.5rem,3vw,3rem)}
.indice li{display:flex;align-items:center;gap:0.8125rem;
  padding:0.75rem 0;font:400 1rem/1.3 var(--cuerpo);color:rgba(44,44,44,.88)}
/* La raya entre renglones va como sombra y no como borde: el borde de la
   primera de cada columna habría que apagarlo uno por uno, y con la sombra
   basta apagar las que abren columna. */
.indice li+li{box-shadow:0 -1px 0 rgba(44,44,44,.09)}
.indice li:nth-child(2),.indice li:nth-child(3){box-shadow:none}
.sello{flex:none;width:26px;height:26px;color:var(--ac-oliva)}

/* ── LAS MARCAS SE DIBUJAN ────────────────────────────────────────────────── */
/* Mismo gesto que la onda del manifiesto, y a propósito: que el sitio entero
   use UN solo movimiento es lo que lo hace sentir de una pieza.

   🔴 PERO NO SE PUEDE MEDIR CADA TRAZO COMO ALLÁ. El contenido de un <use> vive
   en un árbol sombra: ni `querySelectorAll('path')` lo alcanza ni un selector
   `.sello path` casa con él. Lo único que cruza son las propiedades HEREDADAS —
   y `stroke-dasharray` / `stroke-dashoffset` lo son. Así que el guion va en el
   <svg> mismo y los trazos lo heredan mientras la transición corre.
   Efecto secundario del cambio: no hay que medir nada. Un largo fijo mayor que
   el trazo más largo (los anillos, 47) sirve para las siete marcas, y cada una
   termina de dibujarse a su propio ritmo — que se ve más a mano que si las
   siete cerraran en el mismo cuadro.

   El reposo —trazo completo— vive en la clase base. Sin JS se ven enteras en
   vez de invisibles; al revés es como se deja un icono muerto para siempre. */
.js .sello{stroke-dasharray:64;stroke-dashoffset:64;
  transition:stroke-dashoffset 1.05s var(--curva);
  transition-delay:calc(var(--i,0) * 75ms)}
.js .indice.dibuja .sello{stroke-dashoffset:0}
/* El escalonado va por RENGLÓN, no por el orden del DOM. La rejilla llena de
   izquierda a derecha, así que 1-2-3 caen lado a lado: con un índice corrido la
   ola bajaba en diagonal en vez de bajar recta. Tres tiempos, no siete. */
.indice li:nth-child(-n+3) .sello{--i:0}
.indice li:nth-child(n+4):nth-child(-n+6) .sello{--i:1}
.indice li:nth-child(7) .sello{--i:2}
.forma{display:flex;gap:0.625rem;margin-top:1.5rem}
.forma input{flex:1;min-width:0;padding:1rem 1.375rem;border-radius:var(--pildora);
  border:1px solid rgba(44,44,44,.18);background:#fff;
  font:400 0.9688rem/1 var(--cuerpo);color:var(--carbon)}
.forma input:focus{outline:2px solid var(--coral);outline-offset:2px;border-color:transparent}
/* ⚠️ Aquí también faltaba `color:` — `var(--tx-3)` suelto es una declaración sin
   propiedad: no aplica y no avisa. Mismo caso que `.voz .quien`. */
.nota{margin-top:0.75rem;font-size:0.8125rem;color:var(--tx-3)}

/* ── §8 · EXPERIENCIAS ───────────────────────────────────────────────────── */
/* 🔴 SE FUERON LAS CINCO PÍLDORAS 01–05. Eran cinco cajas idénticas con dos
   palabras cada una: el patrón más genérico que quedaba en la página, y encima
   enumeraban formatos ("Cursos online", "Masterclasses") en vez de enseñar
   ninguno. Una rejilla de tarjetas iguales es lo primero que delata una plantilla.
   Lo que las sustituye no es otra rejilla: es una foto de veinte mujeres suyas y
   el índice real de su canal. */

/* ── LA FOTO DEL EVENTO ───────────────────────────────────────────────────── */
/* La hoja de papel otra vez: troquelada arriba y abajo, como todo lo que se
   apoya en este sitio. Aquí el troquel hace un trabajo extra — recorta la
   fotografía con el mismo canto rasgado que el resto, así que la foto entra
   como una pieza más del collage y no como un banner pegado encima. */
/* ── EL CONTENEDOR QUE CRECE ─────────────────────────────────────────────────
   Hoy hay UNA foto. Mañana Marisa manda cuatro y la sección se recompone sola:
   el CSS cuenta los hijos con `:has()` y elige el arreglo. Nadie tiene que
   escribir una clase ni tocar esta hoja — se pegan `<figure class="evento">`
   dentro de `.eventos` y ya.
     1     → la banda ancha de siempre
     2-3   → la primera grande a la izquierda, las otras apiladas a la derecha
     4 o + → tira que se arrastra de lado, con imán en cada foto */
.eventos{margin:2.75rem 0 0;display:grid;gap:clamp(0.75rem,1.5vw,1.25rem)}

/* DOS — lado a lado, mismo alto. */
.eventos:has(.evento:nth-child(2)):not(:has(.evento:nth-child(3))){
  grid-template-columns:1fr 1fr}
.eventos:has(.evento:nth-child(2)):not(:has(.evento:nth-child(3))) .evento picture{
  height:clamp(230px,27vw,380px)}

/* TRES — la primera grande a la izquierda, las otras dos apiladas.
   🔴 Los renglones van DECLARADOS (`grid-template-rows`), no implícitos. Con
   `grid-auto-rows` la rejilla explícita tiene cero filas y `grid-row:1/-1` se
   resuelve a UNA sola: la foto grande no abarcaba nada y la composición salía
   en escalera. Y con los renglones declarados, la foto puede colgarse a `inset`
   y llenar su celda sea cual sea su proporción. */
.eventos:has(.evento:nth-child(3)):not(:has(.evento:nth-child(4))){
  grid-template-columns:1.35fr 1fr;
  grid-template-rows:repeat(2,clamp(130px,15.5vw,205px))}
.eventos:has(.evento:nth-child(3)):not(:has(.evento:nth-child(4))) .evento:first-child{
  grid-row:1/-1}
.eventos:has(.evento:nth-child(3)):not(:has(.evento:nth-child(4))) .evento picture{
  position:absolute;inset:0;height:auto}
.eventos:has(.evento:nth-child(3)):not(:has(.evento:nth-child(4))) .evento img{
  width:100%;height:114%}

/* CUATRO O MÁS */
.eventos:has(.evento:nth-child(4)){
  /* Ancho de tarjeta en `clamp`, NO en `minmax(240px,40%)`: dentro de un
     contenedor que desborda, el porcentaje no tiene contra qué medirse y las
     tarjetas se quedaban las cinco en el mínimo de 240 px. */
  grid-auto-flow:column;grid-auto-columns:clamp(240px,31vw,430px);
  overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;padding-bottom:0.5rem}
.eventos:has(.evento:nth-child(4)) .evento{scroll-snap-align:start}
.eventos:has(.evento:nth-child(4)) .evento picture{height:clamp(220px,26vw,340px)}

/* En las fotos chicas el rótulo se encoge: la misma placa que en una banda de
   700 px es un pie discreto, en una celda de 240 px se come media foto. */
.eventos:has(.evento:nth-child(3)) .evento:not(:first-child) .rotulo-evento,
.eventos:has(.evento:nth-child(4)) .rotulo-evento{padding:0.625rem 0.875rem}
.eventos:has(.evento:nth-child(3)) .evento:not(:first-child) .rotulo-evento span,
.eventos:has(.evento:nth-child(4)) .rotulo-evento span{font-size:0.8438rem;margin-top:0.25rem}

.evento{position:relative;margin:0}
/* ── EL MOMENTO DE §EXPERIENCIAS: LA FOTO SE MUEVE DENTRO DE SU MARCO ────────
   Medido, ésta era una de las tres únicas secciones del sitio con CERO
   transforms — y es la que tiene el activo más fuerte del proyecto: veinte
   mujeres reales en un evento real. Una foto así, completamente quieta dentro
   de un marco quieto, se lee a captura pegada; en cuanto la imagen se desplaza
   respecto a su recorte, el marco se vuelve una VENTANA y aparece profundidad.

   Se mueve la imagen DENTRO del troquel, no el troquel: el canto rasgado es la
   costura con las secciones vecinas y moverlo rompería la ilusión de papel.

   🔴 SE CRECE EL ALTO, NO SE ESCALA. Primer intento con `scale(1.08)`: funcionaba
   pero quedaba topado en ~27 px de recorrido, porque más translate descubría el
   borde del marco. Y subir la escala no era opción — un `scale` recorta por los
   CUATRO lados, y en los lados de esta foto hay personas; 1.2 "por seguridad"
   habría cortado a las de las puntas, que es justo lo que el recorte de celular
   vino a arreglar.
   La imagen se hace **más ALTA que su marco** (114%) con `object-fit:cover`: el
   ancho no se toca, así que no se pierde a nadie de los extremos, y el excedente
   sale por arriba y por abajo — donde hay cielo y pasto. Con 14% de sobra hay 7%
   por lado, y el recorrido de ±5% cabe con margen.

   El alto se muda de la `<img>` al `<picture>`, que ahora es el marco. Las tres
   reglas de 2 / 3 / 4+ fotos se mudan con él: hoy hay UNA sola foto y esas reglas
   están dormidas, pero dejarlas apuntando a la `img` habría hecho que el día que
   Marisa mande la segunda, el marco perdiera su alto y la sección se recompusiera
   sola sin que nadie tocara nada. */
.evento picture{display:block;overflow:hidden;height:clamp(230px,29vw,420px)}
.evento img{display:block;width:100%;height:114%;object-fit:cover;
  object-position:center 42%;   /* el 42% deja el cielo fuera y a ellas centradas */
  /* 🔴 EL `-7%` NO ES UN AJUSTE FINO: SIN ÉL SE VE EL MARCO VACÍO. La imagen mide
     114% y arranca pegada al borde de arriba, así que TODO el excedente cuelga
     por abajo; en cuanto el paralaje la empuja hacia abajo, destapa la franja
     superior. Medido: hasta 16 px de hueco en 3 de 5 puntos del recorrido.
     Centrando el excedente —7% arriba y 7% abajo— el ±5% de recorrido cabe en
     los dos sentidos con margen. Un excedente sin repartir no es un colchón:
     es un colchón de un solo lado. */
  transform:translateY(calc(-7% + var(--ev,0%)));
  will-change:transform}
.experiencias-color{--ev:calc((var(--p,.5) - .5) * -10%)}
@media (prefers-reduced-motion:reduce){
  .evento img{transform:none}
}
.evento::before,.evento::after{content:"";position:absolute;left:0;right:0;
  height:16px;z-index:2;pointer-events:none;background:var(--fondo);
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}
.evento::before{top:-1px}
.evento::after{bottom:-1px;transform:scaleY(-1)}

/* El rótulo, apoyado EN la foto. Va abajo a la izquierda porque ahí hay pasto:
   es la única zona sin caras.
   🔴 SE LLAMABA `.placa` Y ESO YA EXISTÍA — es el lienzo de la portada, con
   `inset:0`. Mis `left`/`bottom` pisaban dos lados y los otros dos seguían en 0,
   así que el rótulo se estiraba a lo alto de la foto y tapaba a seis mujeres.
   Segunda colisión de clase en el mismo día (la otra fue `.marca`): en una hoja
   compartida, buscar el nombre ANTES de escribirlo. */
.evento .rotulo-evento{position:absolute;left:clamp(14px,2vw,26px);bottom:clamp(14px,2vw,26px);
  z-index:3;max-width:min(90%,26.25rem);
  padding:0.875rem 1.25rem;border-radius:var(--radio-chico);
  background:rgba(250,247,240,.93);backdrop-filter:blur(3px)}
.evento .rotulo-evento b{display:block;font:600 0.75rem/1 var(--cuerpo);
  letter-spacing:.14em;text-transform:uppercase;color:var(--carbon)}
.evento .rotulo-evento span{display:block;margin-top:0.375rem;
  font:400 0.9375rem/1.4 var(--cuerpo);color:rgba(44,44,44,.78)}

/* ── EL ÍNDICE DE SU CANAL ────────────────────────────────────────────────── */
/* Sin carátulas a propósito (el porqué está en el HTML). Sin carátula, lo que
   queda es lo mismo que hace chief.com en su bloque de comunidad: el TÍTULO es
   la tarjeta. Serif grande a la izquierda, duración a la derecha, un filete
   entre renglones y nada más. */
.canal{margin-top:clamp(2.75rem,5vw,4.5rem)}
.canal-enc{display:grid;grid-template-columns:1.1fr .9fr;gap:clamp(1.25rem,3vw,3.375rem);
  align-items:end}
.canal-enc h3{font-family:var(--serif);font-weight:300;
  font-size:clamp(1.625rem,3.2vw,2.625rem);line-height:1.16;max-width:14ch}
.canal-enc p{font-size:1.0312rem;line-height:1.6;color:rgba(44,44,44,.74);max-width:40ch}

.videos{margin-top:1.625rem;list-style:none;
  display:grid;grid-template-columns:1fr 1fr;gap:0 clamp(1.75rem,4vw,4rem)}
/* 🔴 El `li` estira al `a`. Sin esto, un título de dos renglones a la izquierda
   hace su celda más alta pero el enlace de la derecha conserva su alto natural:
   los dos filetes quedan a 25 px de distancia y la lista se ve chueca. Se veía
   desde antes; con el filete de duración pintado encima, salta. */
.videos li{display:flex}
.videos a{flex:1;position:relative;display:flex;align-items:center;gap:0.875rem;
  padding:1.0625rem 0;text-decoration:none;color:var(--carbon);
  box-shadow:0 1px 0 rgba(44,44,44,.13)}
.videos .vt{flex:1;min-width:0;font-family:var(--serif);font-weight:300;
  font-size:clamp(1.0625rem,1.5vw,1.3125rem);line-height:1.28}

/* ── EL FILETE QUE MIDE ──────────────────────────────────────────────────────
   La línea que ya separaba los renglones ahora también dice cuánto dura el
   video: se pinta encima el tramo `--prop` (el largo real contra el más largo
   del set) en el color de su tipo. Cuesta CERO altura —vive sobre el hairline
   que ya estaba— y convierte una lista plana en una gráfica que se lee sin
   leer. Al señalar engorda a 2px: es la única manera de dar respuesta de hover
   sin mover el texto, que con seis renglones se vuelve un tembladeral. */
.videos .vbar{position:absolute;left:0;bottom:-1px;height:1px;width:var(--prop,0);
  background:var(--tipo,var(--ac-oliva));border-radius:1px;
  transition:height .28s var(--curva),opacity .28s var(--curva)}
.videos a:hover .vbar,.videos a:focus-visible .vbar{height:3px}

/* De qué es. El punto da el color y la palabra lo traduce — un punto de color
   sin leyenda es decoración; con la palabra al lado es un atajo. */
.videos .vm{flex:none;display:flex;align-items:center;gap:clamp(0.625rem,1.1vw,1.125rem)}
.videos .vk{display:flex;align-items:center;gap:0.4375rem;
  font:500 0.7188rem/1 var(--cuerpo);letter-spacing:.11em;text-transform:uppercase;
  color:rgba(44,44,44,.76)}
.videos .vk::before{content:"";width:7px;height:7px;border-radius:50%;
  background:var(--tipo,var(--ac-oliva))}
/* La duración en cifra tabular: sin eso, "9:35" y "30:14" no alinean su columna
   y la lista se ve movida aunque cada renglón esté bien.
   .62 medía 3.93 sobre el amarillo de la sección: reprueba. .76 lo sube a 5.1 y
   sigue pesando bastante menos que el título, que es lo que se quería. */
.videos .vd{flex:none;font:400 0.875rem/1 var(--cuerpo);color:rgba(44,44,44,.76);
  font-variant-numeric:tabular-nums}
.videos .vp{flex:none;width:26px;height:26px;color:var(--ac-oliva);
  transition:transform .34s var(--curva)}
/* El único movimiento del bloque, y es de estado: el disco crece un pelo al
   señalar. Ni subrayado ni desplazamiento — con 6 renglones, un hover que mueve
   el texto convierte la lista en un tembladeral. */
.videos a:hover .vp{transform:scale(1.14)}
.videos a:hover .vt{text-decoration:underline;text-underline-offset:4px;
  text-decoration-thickness:1px;text-decoration-color:rgba(44,44,44,.35)}
.videos a:focus-visible{outline:3px solid var(--carbon);outline-offset:3px;
  border-radius:0.375rem}

.canal-pie{display:flex;flex-wrap:wrap;gap:0.875rem 2.5rem;margin-top:1.625rem}
/* `.mas-ig` viene de §5 (el enlace a su Instagram): mismo gesto, mismo subrayado
   que crece. Reusarlo es lo que hace que los tres enlaces "salir del sitio" se
   lean como el mismo tipo de enlace y no como tres inventos.
   Lo único que hay que apagar es su `margin-left:auto` — allá empuja el enlace
   al extremo derecho de su fila, y aquí son DOS uno junto al otro.
   Y el alto: heredaban 43 px, uno por debajo del mínimo táctil de 44. Un píxel
   no se ve y sí cuenta, así que se pone y ya. */
.canal-pie .mas-ig{margin:0;min-height:44px}

/* ── EL VISOR ────────────────────────────────────────────────────────────────
   El video se abre encima de la página, no en otra pestaña: quien lo termina
   sigue aquí, con la tienda a un scroll. El fondo se oscurece de verdad (no un
   velo tímido) porque un video en 16:9 sobre papel crema se ve a error; con el
   fondo oscuro se lee a cine. */
.visor{position:fixed;inset:0;z-index:200;
  display:grid;place-items:center;padding:clamp(0.875rem,3vw,2.5rem)}
.visor[hidden]{display:none}
html.visor-abierto{overflow:hidden}
.visor-fondo{position:absolute;inset:0;background:rgba(24,21,16,.86);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.visor-caja{position:relative;width:min(1080px,100%)}
.visor-enc{display:flex;align-items:center;gap:1rem;margin-bottom:0.75rem}
.visor-tit{flex:1;min-width:0;margin:0;color:var(--crema);
  font-family:var(--serif);font-weight:300;
  font-size:clamp(1rem,1.9vw,1.5rem);line-height:1.25}
.visor-x{flex:none;width:44px;height:44px;display:grid;place-items:center;
  border:0;cursor:pointer;border-radius:50%;color:var(--crema);
  background:rgba(250,247,240,.16);transition:background .24s var(--curva)}
.visor-x:hover{background:rgba(250,247,240,.3)}
.visor-x:focus-visible{outline:3px solid var(--crema);outline-offset:3px}
.visor-marco{position:relative;aspect-ratio:16/9;background:#000;
  border-radius:var(--radio-chico);overflow:hidden}
.visor-marco iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

.espera{margin-top:clamp(2.75rem,5vw,4.5rem);border-radius:var(--radio);padding:clamp(1.75rem,3.4vw,3.25rem);
  background:var(--tono);display:grid;grid-template-columns:1fr auto;
  gap:1.75rem;align-items:center}
.espera h3{font-family:var(--serif);font-weight:300;font-size:clamp(1.5rem,2.8vw,2.25rem);
  line-height:1.24;max-width:22ch}
.espera p{margin-top:0.625rem;font-size:1rem;var(--tx-3);max-width:46ch}

/* ── §9 · VOCES ──────────────────────────────────────────────────────────── */
/* ── EL CONTEO ─────────────────────────────────────────────────────────────
   52 marcas de conteo, 51 llenas y una hueca: la repartición real de sus
   estrellas, dibujada. Las rayas las pone `voces.js` (52 nodos a mano en el
   HTML serían ilegibles) y se trazan escalonadas al entrar. */
.conteo{display:flex;flex-wrap:wrap;align-items:baseline;
  gap:0.625rem clamp(1.125rem,2.4vw,2.125rem)}
.conteo-cifra{display:flex;align-items:baseline;gap:0.5625rem;flex:none}
.conteo-cifra b{font-family:var(--serif);font-weight:300;
  font-size:clamp(2.75rem,5.4vw,4.75rem);line-height:.9;letter-spacing:-.01em}
.conteo-cifra span{font:500 0.8125rem/1 var(--cuerpo);letter-spacing:.1em;
  text-transform:uppercase;color:var(--tx-2)}
.rayas{flex:0 1 min(560px,52%);display:flex;align-items:flex-end;
  gap:clamp(3px,.42vw,0.375rem);min-width:0;height:34px}
.rayas i{flex:1;min-width:2px;max-width:0.375rem;height:100%;border-radius:2px;
  background:var(--ac-oliva);transform-origin:bottom;
  scale:1 0;transition:scale .5s var(--curva)}
/* La 52ª va hueca: es la de cuatro estrellas, y es la que hace creíble a las
   otras 51. Un muro de 52 llenas se lee a inventado. */
.rayas i:last-child{background:none;box-shadow:inset 0 0 0 1.5px var(--ac-oliva);
  margin-left:0.5625rem}   /* separada: si va pegada, 52 rayas se leen a código de barras */
.rayas.trazado i{scale:1 1}
.conteo-pie{flex:1 1 100%;margin:0.25rem 0 0;
  font:400 0.9375rem/1.5 var(--cuerpo);color:var(--tx-2);max-width:52ch}

/* ── LAS VOCES ─────────────────────────────────────────────────────────────
   Recortes de papel, no tarjetas: alto natural (una reseña larga ocupa lo que
   ocupa), canto troquelado y un giro de menos de un grado que las saca de la
   cuadrícula sin que se note el truco. `align-items:start` es lo que deja el
   borde de abajo desparejo — es collage, no rejilla. */
.voces .fila{display:grid;grid-template-columns:repeat(3,1fr);
  gap:clamp(1.125rem,2vw,1.75rem);margin-top:2.75rem;align-items:start}
/* ── EL PARALAJE POR COLUMNA ──────────────────────────────────────────────
   🔴 EL MURO ESTÁTICO ES EL ANTI-PATRÓN, y la salida no es animar cada tarjeta
   —seis gestos a la vez es ruido— sino que las TRES COLUMNAS suban a
   velocidades distintas. Así el bloque respira como un collage al que le
   mueves el papel, y ninguna cita se mueve respecto a su vecina de arriba: la
   lectura no se rompe.
   Los recorridos son cortos y ASIMÉTRICOS —26, 0 y 18 px— a propósito. Con la
   central quieta, hay una referencia fija contra la que se leen las otras dos;
   si las tres se movieran, el ojo lo compensa y el efecto desaparece. Y son
   píxeles, no porcentajes: un porcentaje se resuelve contra la altura de cada
   tarjeta, que aquí es distinta en las seis. */
/* 🔴 VA EN `transform`, NO EN `translate` — y esto se cazó midiendo, porque no
   da error. `translate` YA TIENE DUEÑO: es la propiedad con la que el sistema
   de revelado sube las tarjetas desde 20 px (`.js-rev [data-rev]`). Mi selector
   pesa más por especificidad, así que ganaba en silencio y las seis citas se
   quedaban SIN entrada — el archivo ya documentaba este mismo error dos veces
   ("dos dueños para un gesto es un gesto roto") y volví a cometerlo.
   En `transform` no choca con nadie: el giro vive en `rotate` y el levantar del
   hover entra por su propia variable, en la misma cadena. */
.voces .fila>*{transform:translateY(var(--par,0px)) translateY(var(--lev,0px))}
.voces .fila>*:nth-child(3n+1){--par:calc((var(--pv,.5) - .5) * -26px)}
.voces .fila>*:nth-child(3n+3){--par:calc((var(--pv,.5) - .5) * 18px)}
/* 🔴 El recorte va en ARENA, no en crema: la sección ES crema, así que un papel
   crema sobre fondo crema no existe —ni el canto troquelado se veía—. Arena es
   el otro papel del sitio y la diferencia es de un escalón de tono, que es lo
   que hace que se lea a recorte pegado encima y no a caja dibujada.
   El troquel sí va en crema: es el color de ALREDEDOR mordiendo el papel. */
/* 🔴 v4 — LAS CITAS ERAN FANTASMAS. Medido: `#FFFFFF` sobre la crema de la
   sección y `box-shadow:none`. Exactamente el mismo cuadro que tenía §tienda
   antes de la v4 —una caja blanca a 1.10 de contraste— y con el mismo remedio.
   Y aquí hay dos referencias en vivo que apuntan a lo mismo: en aesop.com la
   ficha de producto y en linear.app/customers la de testimonio tienen las dos
   fondo TRANSPARENTE, radio 0 y sombra none. La caja es el tell.
   La diferencia es que estas SÍ tienen que existir: son recortes de papel, con
   su canto troquelado arriba y abajo y su grado de giro. Así que no se borran,
   se COMPROMETEN: material propio y una sombra que las despegue del papel de
   atrás. Un recorte que no proyecta nada no está encima de nada. */
.voz{position:relative;
  background-color:#FCFAF4;
  background-image:url("grafico/grano.svg");
  background-size:200px 200px;background-blend-mode:multiply;
  box-shadow:0 1px 2px rgba(58,50,32,.06), 0 14px 30px -12px rgba(58,50,32,.15);
  padding:2rem 1.875rem 1.75rem;
  rotate:var(--giro,0deg);border-radius:3px}
.voz::before,.voz::after{content:"";position:absolute;left:0;right:0;height:12px;
  pointer-events:none;background:var(--sup);
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}
/* La banda troquelada se apoya DENTRO del papel (a -1 px, no a -11): tiene que
   morderlo. Puesta fuera, el canto rasgado cae en el fondo y el recorte se ve
   con el borde recto de una caja. */
.voz::before{top:-1px}
.voz::after{bottom:-1px;transform:scaleY(-1)}
/* Al pasar el cursor el recorte se endereza y se levanta: es el gesto mínimo
   —dejar de estar de lado— y basta para que el muro deje de ser un muro. */
.voz{transition:transform .5s var(--curva), box-shadow .5s var(--curva),
                rotate .5s var(--curva)}
.voz:hover,.voz:focus-within{rotate:0deg;--lev:-5px;
  box-shadow:0 2px 4px rgba(58,50,32,.05), 0 26px 46px -14px rgba(58,50,32,.20)}
.voz p{margin:0;font-family:var(--serif);font-weight:300;line-height:1.5}
/* El nombre pesa y el lugar no: la firma tiene dos registros, como en una carta.
   🔴 Aquí había `text-transform:uppercase; var(--tx-3)` —una declaración sin
   propiedad, o sea el color NUNCA se aplicó y nadie lo vio porque el heredado
   se le parecía. */
.voz .quien{margin-top:1.375rem;font:500 0.8438rem/1.3 var(--cuerpo);color:var(--tx-1)}
.voz .quien span{display:block;margin-top:0.3125rem;font-weight:400;font-size:0.7812rem;
  letter-spacing:.08em;text-transform:uppercase;color:var(--tx-2)}

.voces-pie{display:flex;flex-wrap:wrap;align-items:center;
  gap:1rem clamp(1.5rem,3vw,2.75rem);margin-top:clamp(2.375rem,4vw,3.5rem)}
.voces-pie .mas-ig{margin:0;min-height:44px}

/* ── §10 · EL CIERRE · LA PÁGINA ─────────────────────────────────────────── */
/* 🔴 v5 — SE VA LA NOCHE. Marisa dijo que no le gusta el oscuro, y este era el
   único bloque oscuro del sitio. Lo que NO se puede hacer es repintarlo de crema
   y ya: el bloque oscuro no era decoración, era el único cambio de registro
   tonal en once pantallas, y sin él el sitio se acaba en un desvanecido.
   El contraste cambia de sitio: en vez de bajar la LUMINANCIA, sube el
   MATERIAL. La hoja es más clara que el papel de la web, proyecta sombra, tiene
   fibra y renglones, y el color entra como luz alrededor.
   (Se conserva íntegro el motor: `--deriva` y `--luz` siguen siendo las mismas
   variables que movían el cielo, el polvo y la luna. Lo que cambia es lo que
   las capas SON, no cómo se mueven — por eso `noche.js` no se toca.) */
/* 🔴 LA SECCIÓN LLEVA RELLENO, Y ES LO QUE HACE VISIBLE EL COLOR. Primer
   intento: hoja y halo del mismo tamaño, el halo detrás. Resultado medido en
   pantalla: CERO color: una hoja opaca tapando exactamente su propio halo. Un
   resplandor detrás de un objeto de su mismo tamaño no existe.
   Con relleno, la hoja queda dentro de la sección con aire alrededor, y ese
   aire es por donde se ve la luz de color. Es la misma regla de siempre en este
   sitio —el color vive en el halo, no en el papel— pero para que el halo
   cuente, tiene que haber sitio donde caiga. */
.cierre.pagina{position:relative;overflow:visible;
  background:none;color:var(--carbon);
  margin:0 var(--margen) var(--hueco);
  padding:clamp(2.5rem,5vw,5.5rem) clamp(1rem,3.5vw,4rem)}

/* 1 · EL HALO. Su color, difuso, ALREDEDOR de la hoja — nunca dentro.
   El color cae a transparente en todo su borde y no hay una sola región donde
   se apoye plano, así que el papel de debajo conserva su crema. Es la misma
   regla que ya gobierna §pila y las fichas de §tienda: el color de producto
   vive en el halo, no en el papel.
   `--luz` (0 a 1) lo enciende al entrar; el reposo declarado es 1, así que sin
   JS el bloque se ve terminado y nunca apagado. */
/* 🔴 LOS TRES FOCOS SE REPARTEN EN TRIÁNGULO ALREDEDOR DEL CENTRO. Estaban en
   `12% 30%`, `90% 74%` y `72% 6%`: dos de los tres en la mitad de arriba y el
   lima casi en el borde superior, así que toda la masa de color se acumulaba
   encima de la hoja y por abajo no había nada. Una niebla cargada a un lado no
   envuelve, empuja.
   Ahora van a 50% 0, 4% 98 y 96% 98 — vértices de un triángulo con la hoja en
   el centro. Como la hoja es opaca y tapa el medio, lo que se ve es justo el
   anillo: color arriba al centro y en las dos esquinas de abajo, o sea alrededor
   y parejo. Los tres siguen cayendo a transparente antes del 70%, así que el
   papel de debajo conserva su crema. */
.pag-halo{position:absolute;inset:-7% -2%;z-index:0;pointer-events:none;
  background:
    radial-gradient(42% 52% at 50% 0%,
      color-mix(in oklch,var(--orquidea) 44%,transparent) 0%, transparent 70%),
    radial-gradient(40% 50% at 4% 98%,
      color-mix(in oklch,var(--lima) 38%,transparent) 0%, transparent 68%),
    radial-gradient(40% 50% at 96% 98%,
      color-mix(in oklch,var(--cobalto) 32%,transparent) 0%, transparent 68%);
  opacity:calc(.26 + var(--luz,1) * .58);
  transition:opacity 1.1s var(--curva);
  /* La capa del fondo es la que MENOS viaja. Escalonado por distancia, igual
     que lo tenían el cielo, el polvo y la luna. */
  translate:0 calc(var(--deriva,0) * 2.2%);will-change:translate,opacity}

/* 2 · LA HOJA. Más clara que el papel de la web (#FDFBF5 contra #F6F4EB) y con
   sombra propia: eso es lo que la despega en un sitio donde todo es crema. El
   canto troquelado arriba y abajo es el mismo `troquel.svg` del resto — se
   pinta del color del papel de la sección, así que la hoja se lee ARRANCADA de
   la página y no pegada encima. */
.pag-hoja{position:relative;z-index:1;overflow:hidden;isolation:isolate;
  border-radius:var(--radio);background:#FDFBF5;text-align:center;
  padding:clamp(4.375rem,8.5vw,8.25rem) var(--margen);
  box-shadow:0 2px 4px rgba(58,50,32,.06), 0 30px 60px -18px rgba(58,50,32,.20)}
.pag-hoja::before,.pag-hoja::after{content:"";position:absolute;left:0;right:0;
  height:16px;z-index:3;pointer-events:none;background:var(--papel);
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}
.pag-hoja::before{top:-1px}
.pag-hoja::after{bottom:-1px;transform:scaleY(-1)}

/* 3 · LA FIBRA. El grano vectorial, no la foto del papel: ya se aprendió en
   §tienda que la foto hay que estirarla para cubrir y a ese aumento el poro se
   lee a muro de estuco. Repetido a 200 px queda por debajo del umbral en que se
   nota uno solo. */
.pag-fibra{position:absolute;inset:-8% 0;z-index:0;pointer-events:none;
  background-image:url("grafico/grano.svg");
  background-size:200px 200px;background-repeat:repeat;
  opacity:.55;mix-blend-mode:multiply;
  translate:0 calc(var(--deriva,0) * 3.4%);will-change:translate}

/* 4 · LOS RENGLONES. Lo que convierte una tarjeta clara en una PÁGINA. Van muy
   tenues —el texto de encima tiene que seguir siendo lo primero que se lee— y
   se desvanecen hacia los bordes con una máscara: una retícula que llega hasta
   el canto se lee a papel pautado de cuaderno escolar, no a planner.
   El paso de 2.5rem no es arbitrario: es el interlineado de escritura a mano en
   una libreta A5, que es el formato de su Planner. */
.pag-renglones{position:absolute;inset:-8% 0;z-index:0;pointer-events:none;
  background-image:repeating-linear-gradient(to bottom,
    transparent 0, transparent calc(2.5rem - 1px),
    color-mix(in oklch,var(--cobalto) 13%,transparent) calc(2.5rem - 1px),
    color-mix(in oklch,var(--cobalto) 13%,transparent) 2.5rem);
  -webkit-mask:radial-gradient(72% 62% at 50% 50%,#000 30%,transparent 78%);
          mask:radial-gradient(72% 62% at 50% 50%,#000 30%,transparent 78%);
  /* La capa de delante es la que MÁS viaja, y en sentido contrario: es lo que
     la despega de la fibra y del halo. */
  translate:0 calc(var(--deriva,0) * -5.6%);will-change:translate}

.cierre-cuerpo{position:relative;z-index:2}
/* 🔴 `text-wrap:balance` — medido, el titular caía en TRES renglones y el
   último era la palabra "ti" sola. `balance` reparte los renglones por peso,
   que es lo que hace un tipógrafo a mano, y aguanta si cambia el texto. */
.cierre .grande{text-wrap:balance;
  font-family:var(--serif);font-weight:300;
  font-size:clamp(2.375rem,7.4vw,6.75rem);line-height:1.05;letter-spacing:-.015em;
  /* 12ch daba 678 px y ahí la frase no cabe en dos renglones. `balance` reparte
     el peso pero NO ensancha la caja, así que sin subir la medida no arreglaba
     nada — que fue el primer intento. 16ch es lo que necesita "Un recordatorio
     para" para caber entero en el primer renglón. */
  max-width:16ch;margin:0 auto;color:var(--carbon)}
.cierre p{margin:1.375rem auto 0;max-width:48ch;font-size:1.125rem;line-height:1.6;
  color:rgba(44,44,44,.72)}

/* ── LA CAPTURA: UN RENGLÓN, NO UN ESTUCHE ────────────────────────────────
   La versión de la noche envolvía campo y botón en un estuche translúcido, y
   estaba bien resuelto PARA UN FONDO OSCURO: sobre la noche, un campo sin caja
   no se veía. Sobre papel el problema es el contrario — una píldora rellena en
   medio de una hoja se lee a componente pegado de otra web.
   Aquí el campo se apoya en una LÍNEA, que es lo que hace un campo en una
   página de verdad, y el botón va al final del renglón. El gesto que se pide
   —escribir en la línea— es literalmente el del producto que se vende. */
.cierre .forma.renglon{width:min(32rem,100%);margin:2.5rem auto 0;
  gap:1rem;align-items:center;
  padding:0;background:none;border-radius:0;box-shadow:none}
/* 🔴 LA LÍNEA VA EN EL CAMPO, NO EN EL FORMULARIO. Puesta en el formulario
   cruzaba TAMBIÉN por debajo del botón, así que el renglón salía por un lado de
   la píldora y entraba por el otro: se leía a subrayado roto, no a línea de
   escritura. Un renglón está debajo de lo que se escribe; el botón no se
   escribe. */
.cierre .forma.renglon input{flex:1;min-width:0;background:none;border:0;
  padding:0.75rem 0.25rem;color:var(--carbon);
  font-family:var(--serif);font-weight:300;font-size:1.1875rem;
  box-shadow:inset 0 -1.5px 0 rgba(44,44,44,.28);
  transition:box-shadow .32s var(--curva)}
/* Al enfocar, el renglón engorda y se pinta de cobalto: la línea se subraya,
   que es lo que pasa cuando apoyas la pluma. */
.cierre .forma.renglon input:focus{box-shadow:inset 0 -2.5px 0 var(--cobalto)}
.cierre .forma.renglon input:focus{outline:none}   /* lo toma la línea */
.cierre .forma.renglon input::placeholder{color:rgba(44,44,44,.42);font-style:italic}
/* 🔴 44 px DE MÍNIMO, y no es un número de manual: medido, el botón salía a 34
   en tablet y en celular —el relleno que le puse baja con el breakpoint— y el
   campo a 40. El último control del sitio, el que pide el correo, no puede ser
   el que no se deja tocar con el pulgar. */
.cierre .forma.renglon .btn{flex:none;padding:0.8125rem 1.5rem;min-height:44px}
.cierre .forma.renglon input{min-height:44px}
.cierre .nota{color:rgba(44,44,44,.55)}

/* 🔴 v3 — el `color` fijo se va, por lo mismo que en §5: compensaba el relleno
   coral (blanco 2.31 / carbón 6.04) y con el naranja se volvió el problema —
   carbón sobre #B93D0A da 2.48. El botón que pide el correo es el último que
   puede permitirse no leerse. Hereda: blanco sobre naranja, 5.62. */

/* ── QUE LA LUNA ENCIENDA ─────────────────────────────────────────────────────
   El momento de la sección. Al entrar, el halo de la luna crece y sube de
   intensidad: no es que "aparezca una animación", es que la fuente de luz se
   prende y el bloque se ilumina desde donde está la luna.

   🔴 Descarté la primera idea —un velo de crema encima que se disipa, o sea que
   literalmente anocheciera— y no por gusto: el texto de esta sección TAMBIÉN es
   crema, así que a media transición el titular quedaba crema sobre crema, o sea
   invisible. Un efecto que tiene un instante ilegible no es un efecto, es un
   bug con buena intención. Encender la luz no puede fallar: el peor caso es que
   la luz ya esté puesta.

   `--luz` la mueve `noche.js` de 0 a 1. El reposo es 1 —encendida— para que sin
   JS el bloque se vea terminado, nunca apagado. */
/* 🔴 Se van con la noche: `.noche-cielo::after` (el halo de la luna que crecía
   al encender) y la regla de movimiento reducido que lo acompañaba. `--luz`
   NO desaparece — la consume ahora `.pag-halo`, que es el que se enciende al
   entrar. El motor sobrevive al concepto. */
@media (prefers-reduced-motion:reduce){
  .pag-halo,.pag-fibra,.pag-renglones{translate:none}
  .pag-halo{opacity:.62;transition:none}
}

/* ── el pie ──────────────────────────────────────────────────────────────── */
.pie{padding:0 var(--margen) 3.5rem}
.pie .cols{display:grid;grid-template-columns:1.4fr repeat(3,1fr);gap:2.5rem;
  padding-top:3.25rem;border-top:1px solid rgba(44,44,44,.14)}
.pie h4{font:600 0.75rem/1 var(--cuerpo);letter-spacing:.14em;text-transform:uppercase;
  var(--tx-3);margin-bottom:1rem}
.pie ul{list-style:none;display:grid;gap:0.625rem}
.pie a{font-size:0.9375rem;color:rgba(44,44,44,.76)}
.pie a:hover{color:var(--carbon)}
.pie .firma{margin-top:2.75rem;display:flex;justify-content:space-between;gap:1.25rem;
  font-size:0.8438rem;var(--tx-3)}
/* El pie lleva su LOCKUP completo —"i am" en script + READY TO BLOOM— no el
   isotipo suelto: es la única parte del sitio donde el logo se ve entero. */
.pie .lockup{width:min(220px,60%);height:auto}
.pie .lema{font-family:var(--serif);font-weight:300;font-size:1.375rem;line-height:1.4;
  max-width:24ch;margin-top:1.25rem;color:rgba(44,44,44,.8)}
.pie .bajadita{margin-top:0.625rem;font-size:0.9062rem;line-height:1.5;
  var(--tx-3);max-width:30ch}

/* ── el hueco honesto: donde falta material, se DICE ─────────────────────── */
/* No se disimula con un packshot de catálogo. Eso fue justo lo que hundió las
   tres primeras direcciones de §3. */
.falta{display:grid;place-content:center;gap:0.375rem;text-align:center;
  background:
    repeating-linear-gradient(-45deg,rgba(44,44,44,.05) 0 2px,transparent 2px 10px),
    var(--crema)}
/* 🔴 Cuarta y quinta aparición del mismo bug de esta hoja: una declaración con
   el valor pero SIN la propiedad delante. `var(--tx-3)` a secas no aplica y no
   avisa — el heredado se le parecía y por eso nadie lo vio. Van .voz .quien,
   .nota, .falta b y .falta span. */
.falta b{font:600 0.6875rem/1 var(--cuerpo);letter-spacing:.14em;text-transform:uppercase;
  color:var(--tx-3)}
.falta span{font:500 0.8438rem/1.4 var(--cuerpo);color:var(--tx-3);max-width:22ch}

/* ═══ CELULAR — criterio de aceptación, no QA final ════════════════════════ */
@media (max-width:1024px){
  /* Con tres columnas la Planner ya no puede valer 1.5: la fila se parte y el
     ancla acabaría en el mismo tamaño que un journal. Toma DOS columnas, que es
     re-componer la jerarquía en vez de encogerla. */
  .tienda .rejilla{grid-template-columns:repeat(3,1fr)}
  .tienda .sku:first-child{grid-column:span 2}
  /* 🔴 Y HAY QUE RECORTARLE LA VITRINA, o el ancla se dispara. Con dos columnas
     la ficha mide 556 de ancho y su vitrina en `4/5` da 655 de alto: la tarjeta
     entera se iba a **836 px**, casi una pantalla para un solo producto. La
     jerarquía tiene que crecer, no desbordarse. Se aplana la vitrina y el
     objeto pasa a medirse por ANCHO. El 51% sale de despejar, no de tantear:
     vitrina de 393, menos los 8 del apoyo y 1 de respiro, deja 384 de alto para
     un recorte de 916x1307 — o sea 269 de ancho sobre 524 de cuadro. Con 55%
     sobraba y el libro se metía debajo del troquel, que es la tira blanca. */
  .tienda .sku:first-child .vitrina{aspect-ratio:16/12}
  .tienda .sku:first-child .sku-obj{height:auto;width:51%}
  .tienda .sku:first-child .sku-sombra{width:66%;height:3.2rem}
  .reels .fila{grid-template-columns:repeat(2,1fr)}
  /* Seis reseñas en una sola columna son seis pantallas. A dos siguen cabiendo
     y la sección se recorre de un vistazo. */
  .voces .fila{grid-template-columns:repeat(2,1fr)}
  .conteo-cifra b{font-size:clamp(2.5rem,9vw,3.75rem)}
}
@media (max-width:860px){
  .nav ul,.nav .carro span,.nav .acciones .ico-btn:not(.menu-movil){display:none}
  .nav .menu-movil{display:grid}
  .planner .franja{grid-template-columns:1fr}
  .planner .foto{order:-1}

  /* La hoja de la biblioteca en una sola columna: el filete vertical deja de
     tener sentido —ya no hay nada a los lados que separar— y se acuesta para
     ser la línea de arriba de la captura, igual que la del índice. */
  .biblio{grid-template-columns:1fr;row-gap:1.875rem}
  .biblio .captura{padding-left:0;padding-top:1.875rem}
  .biblio .captura::before{left:0;right:0;top:0;bottom:auto;width:auto;height:1px;
    background:rgba(44,44,44,.16)}
  /* Tres columnas de índice en tableta dan 110 px por renglón, y ahí no cabe ni
     "Journaling prompts" con su marca al lado. Van a dos. */
  .indice{grid-template-columns:1fr 1fr;column-gap:1.375rem}
  .indice li{font-size:0.9375rem;gap:0.6875rem}
  .indice li:nth-child(3){box-shadow:0 -1px 0 rgba(44,44,44,.09)}
  /* Y el escalonado vuelve a ser de dos en dos, que es como quedan los renglones. */
  .indice li:nth-child(-n+2) .sello{--i:0}
  .indice li:nth-child(3) .sello,.indice li:nth-child(4) .sello{--i:1}
  .indice li:nth-child(5) .sello,.indice li:nth-child(6) .sello{--i:2}
  .indice li:nth-child(7) .sello{--i:3}
}

/* 🔴 Y EN CELULAR DE VERDAD, UNA SOLA COLUMNA. Medido en 390 px: a dos columnas
   quedan 145 px por etiqueta y CINCO de las siete parten en dos renglones
   ("Journaling / prompts", "Guías / descargables"). Un índice que no se recorre
   de un vistazo deja de ser un índice y vuelve a ser la nube de etiquetas que
   quitamos. La lista se hace más larga y se lee: es el intercambio correcto. */
@media (max-width:560px){
  .indice{grid-template-columns:1fr}
  .indice li:nth-child(2),.indice li:nth-child(3){
    box-shadow:0 -1px 0 rgba(44,44,44,.09)}
  .indice li:nth-child(n) .sello{--i:0}   /* siete tiempos serían 525 ms de cola */
  .indice li:nth-child(n+3) .sello{--i:1}
  .indice li:nth-child(n+6) .sello{--i:2}
  /* Cuatro columnas de ficha en 390 px dan 74 px por celda: el dato en serif de
     25 px no cabe y "100 g · FSC" parte. Van a dos y dos. */
  .specs{grid-template-columns:1fr 1fr;gap:1.375rem 1.25rem}
  .specs dd{font-size:1.375rem}
  /* Cuatro discos de 42 px con su anillo + el nombre de la variante no caben en
     un renglón de 342 px: "Orquídea" quedaba cortada contra el borde. El nombre
     baja a su propio renglón en vez de encogerse. */
  .muestras{flex-wrap:wrap;gap:0.875rem}
  .planner .muestras .nombre-color{flex-basis:100%;margin-left:2px;margin-top:2px}

  /* Las pegatinas se RE-COMPONEN, no se encogen:
     · la de enfrente estaba en `--margen - 30`, y con margen 24 eso la dejaba en
       x = -6: medio dibujo cortado contra el borde de la pantalla. Se pasa a la
       esquina derecha, donde sí hay sitio para que se monte entera.
     · `pl-c` vive al 44% de alto y por la derecha; en 390 px eso cae encima del
       párrafo. Se va: tres piezas cruzando ya cuentan la profundidad, y una
       cuarta sobre el texto no es puntuación, es estorbo. */
  .planner .peg-frente{left:auto;right:8px;top:calc(var(--hueco) - 26px);
    width:56px;rotate:14deg}
  .planner .pl-c{display:none}
  .planner .pl-a{left:5%;top:-18px;width:56px}
  .planner .pl-b{left:56%;bottom:-20px;width:72px}
  .espera{grid-template-columns:1fr}

  /* §8 en celular. El encabezado del canal y el índice bajan a una columna: dos
     columnas de renglón dejan ~150 px por título y una serif de 21 px ahí parte
     en cuatro. Y la placa de la foto pasa a ocupar el ancho — anclada a una
     esquina en 390 px, un recorte perfecto no salva una composición rota. */
  .canal-enc{grid-template-columns:1fr;gap:0.75rem;align-items:start}
  .videos{grid-template-columns:1fr}
  .videos .vt{font-size:1.0625rem}
  /* 🔴 El rótulo SALE de la foto. En escritorio se apoya sobre el pasto, que es
     la única zona sin caras; en 390 px la foto mide 230 px de alto y la placa,
     a ancho completo, tapaba a la fila sentada entera. Abajo, como pie de foto
     de toda la vida, no estorba a nadie y se lee mejor. */
  .evento .rotulo-evento{position:static;max-width:none;
    margin-top:0.875rem;padding:0;background:none;backdrop-filter:none}
  .canal-pie{gap:2px 1.875rem}
  .canal-pie .mas-ig{min-height:44px}
  /* El renglón del video pasa a dos pisos. En 390 px, "Comer sin culpa — con
     Diana de la Cruz" más "EN VIVO" más "1:05:56" en la misma línea deja el
     título en ~150 px y lo parte en cuatro. Arriba el título, abajo el tipo y la
     duración alineados bajo él — y el filete de duración sigue midiendo igual. */
  /* En 390 px dos columnas de reseña dejan 150 px de ancho: la cita se parte en
     ocho renglones. Una columna y el giro se apaga —a ancho completo, un grado
     de inclinación no se lee a collage, se lee a error. */
  .voces .fila{grid-template-columns:1fr}
  .voz{rotate:0deg}
  .rayas{height:26px;flex-basis:100%}
  /* 🔴 El blob lila caía JUSTO ENCIMA de las rayas y tapaba media docena. En
     escritorio vive a la derecha, donde no hay nada; en 390 px no existe ese
     "a la derecha". Se baja a la altura del titular, que es donde sí sobra
     hueco. Mismo caso que el adorno de los Reels: un adorno sobre un dato no
     es puntuación, es estorbo. */
  .voces .adorno-sec{top:calc(var(--hueco) * .4 + 116px);width:58px}

  .videos a{display:grid;grid-template-columns:auto 1fr;
    align-items:center;column-gap:0.875rem;row-gap:0.5625rem}
  .videos .vp{grid-row:1}
  .videos .vt{grid-column:2}
  .videos .vm{grid-column:2;justify-content:flex-start;gap:1rem}
  /* Y la tira de fotos, cuando haya varias: tarjetas más anchas, porque al 40%
     en una pantalla de 390 px cada foto mide 156 px y no se ve nadie. */
  .eventos:has(.evento:nth-child(2)):not(:has(.evento:nth-child(4))){
    grid-template-columns:1fr;grid-template-rows:none}
  .eventos:has(.evento:nth-child(2)):not(:has(.evento:nth-child(4))) .evento:first-child{
    grid-row:auto}
  .eventos:has(.evento:nth-child(2)):not(:has(.evento:nth-child(4))) .evento picture{
    position:static}
  .eventos:has(.evento:nth-child(2)):not(:has(.evento:nth-child(4))) .evento img{
    height:clamp(220px,50vw,290px)}
  .eventos:has(.evento:nth-child(4)){grid-auto-columns:minmax(0,78%);
    margin-inline:calc(var(--margen) * -1);padding-inline:var(--margen)}

  /* A dos columnas se lleva la fila entera: es el producto ancla y en celular
     una portada de 163 px no vende nada. El resto se reparte de dos en dos. */
  .tienda .rejilla{grid-template-columns:repeat(2,1fr)}
  .tienda .sku:first-child{grid-column:1 / -1}
  /* A fila completa la vitrina se vuelve un panorama de 4/5 y el libro sale
     enorme; se le recorta el alto para que siga siendo una portada. */
  .tienda .sku:first-child .vitrina{aspect-ratio:16/11}
  /* Mismo despeje que en tablet: 46% es lo que cabe sin tocar el troquel. */
  .tienda .sku:first-child .sku-obj{height:auto;width:46%}
  /* El botón medía 38 px de alto: por debajo del mínimo táctil de 44. En una
     tarjeta de 153 px el ancho no sobra, así que el alto lo da el relleno. */
  .sku .agregar{padding:0.9375rem 1.25rem;font-size:0.9062rem}
  .sku h3{font-size:1.125rem}
  .sku .precio-sku{font-size:1.0625rem}
  /* Los Reels NO se apilan en celular: corren en fila con arrastre y enganche,
     que es como los sirve su propia categoría. Apilados a 9:16 medían dos
     pantallas cada uno; a dos columnas la tarjeta de compra desbordaba 84 px. */
  .reels .fila{display:flex;gap:1rem;overflow-x:auto;scroll-snap-type:x mandatory;
    -webkit-overflow-scrolling:touch;
    margin-inline:calc(var(--margen) * -1);padding-inline:var(--margen);
    scrollbar-width:none}
  .reels .fila::-webkit-scrollbar{display:none}
  .reel{flex:0 0 74%;scroll-snap-align:start}
  .forma{flex-direction:column}
  .forma .btn{justify-content:center}
  /* En celular el renglón se apila. La línea se queda SOLO bajo el campo —el
     botón pasa a ser un botón entero, no el final de un renglón— porque un
     subrayado debajo de una píldora rellena no significa nada. */
  .cierre .forma.renglon{gap:1.125rem;padding:0;box-shadow:none}
  .cierre .forma.renglon:focus-within{box-shadow:none}
  .cierre .forma.renglon input{width:100%;padding:0.8125rem 0.25rem;
    box-shadow:inset 0 -1.5px 0 rgba(44,44,44,.26)}
  .cierre .forma.renglon input:focus{box-shadow:inset 0 -2.5px 0 var(--cobalto)}
  .pie .cols{grid-template-columns:1fr 1fr;gap:2rem}
  .pie .firma{flex-direction:column;gap:0.5rem}
  .cierre{margin-inline:1rem}
}

/* El botón de "ver la entrada" es de desarrollo: no puede quedar por encima del
   panel de menú. Se va debajo y desaparece cuando el panel está abierto. */
.repetir{z-index:70}
body.trabado .repetir{opacity:0;pointer-events:none}

/* Las pegatinas de §3 entran como <img> (traen sus colores horneados), así que
   la regla de `.adorno svg` de acordeon.css ya no las alcanza.
   🔴 Y NO se les toca la opacidad de reposo: `.via .adorno` nace en 0 y solo la
   vía ABIERTA la enciende. Ponerle opacity:1 a la clase base encendió las cinco
   a la vez y se apilaron encima de los títulos. */
.via .adorno img{width:100%;height:auto}
.via[data-abierta] .adorno{opacity:.92}

/* Al picar un renglón del menú, la etiqueta de la sección quedaba DEBAJO del
   encabezado pegajoso. El ancla tiene que dejarle su alto. */
section[id],footer[id]{scroll-margin-top:78px}

/* ═══ TANDA 1 · LA FORMA ═══════════════════════════════════════════════════
   Diagnóstico medido antes de tocar nada: DIEZ de once secciones corrían sobre
   el mismo fondo arena, y SEIS de once tenían la misma forma —píldora, titular,
   párrafo, contenido—. El sitio era una sola sección repetida once veces.
   Eso es la monotonía; ninguna animación la arregla, solo la haría más ruidosa.

   Y "el color entra por franja de sección completa" ya estaba escrito como
   decisión en MAPA_DEL_SITIO.md, sale de Mar Cosmetics —referencia de ELLA— y
   no se había aplicado.                                                      */

/* ── 1 · EL RITMO TONAL ──────────────────────────────────────────────────── */
/* La franja va a SANGRE, de borde a borde. Un bloque de color con márgenes es
   una tarjeta; a sangre es una habitación distinta. Y alterna con arena: color
   en todas sería un circo, y su tono dice "positivo", no "estridente". */
/* 🔴 v2 · EL RITMO DEJA DE SER COLOR Y PASA A SER LUZ ───────────────────────
   El diagnóstico de arriba sigue siendo cierto: once secciones sobre el mismo
   fondo es una sola sección repetida once veces, y ninguna animación arregla
   eso. Lo que estaba mal era el REMEDIO, no el diagnóstico.

   Ella, textual: "no me gustan los fondos amarillos, verdes o azules pálidos.
   Me encanta que esos colores EN VIBRANTES aparezcan como detalles, en
   palabras, pequeños acentos, botones o algún título, PERO NO COMO FONDOS."

   Y tiene razón por una razón que se puede medir: un pastel es un color al que
   ya le bajaron la saturación, y extenderlo a pantalla completa le baja también
   la presencia. Sale lavado por construcción. Peor: pastel a gran escala es el
   código visual del cuarto de bebé, que es justo lo que ella rechazó por
   nombre — "no aniñada ni infantil".

   Así que el ritmo se conserva y cambia de material. Alterna PAPEL y BLANCO,
   exactamente en las mismas secciones que antes alternaban. Es lo que hace
   kikki-k, su referencia de limpieza: blanco 83.5% contra gris 12.9% y el
   producto como lo único con color. El latido se vuelve sutil; el color se
   muda adentro de la sección (bloques, botones, cifras, sus portadas), que es
   donde ella lo pidió.

   ⚠️ Los nombres de clase NO se tocan a propósito: hay 22 usos repartidos en
   los HTML y renombrarlos era invitar a que uno se quedara atrás en silencio.
   La clase sigue marcando POSICIÓN en el ritmo; lo que cambió es su valor.   */
.seccion.tono{background:var(--fondo)}
.tono-crema{--fondo:var(--papel); --sup:var(--blanco)}
.tono-arena{--fondo:var(--papel); --sup:var(--blanco)}
.tono-menta,.tono-amarillo,.tono-lila,.tono-lima{--fondo:var(--blanco); --sup:var(--papel)}

/* 🔴 LA REGLA DE INVERSIÓN — se descubrió MIRANDO, no leyendo el código.
   Al unificar el suelo, las tarjetas se volvieron invisibles. Antes el suelo
   era arena y la tarjeta crema: un escalón de tono limpio. Con papel de suelo,
   una tarjeta crema queda a 1.03 de su fondo — o sea deja de existir, y sin un
   solo error en consola.

   La salida NO es inventarle un gris a la tarjeta: es que una superficie
   elevada sea siempre EL OTRO de los dos suelos. Sobre papel, la tarjeta es
   blanca; sobre blanco, la tarjeta es papel. Siempre exactamente un escalón,
   nunca dos tonos nuevos, y funciona en las dos direcciones sin pensarlo.

   `--sup` cae por herencia desde la sección, así que una tarjeta no tiene que
   saber dónde está: lo hereda. */

/* ── 2 · EL VALLE EN CARBÓN ──────────────────────────────────────────────── */
/* Su idea, la que llevaba dos semanas sin destino: el botón "Explora el
   universo" no llevaba a ningún lado. Ahora abre a esto y esto desemboca en
   Elige tu camino, así que deja de ser un callejón bonito.
   Es el contraste más barato que existe: una pantalla entera oscura entre
   secciones claras. Un pico, no un efecto — y cero fotos. */
/* El campo de profundidad. La sección DECÍA "bienvenida al universo" y era una
   pantalla plana con tres calcomanías en las esquinas: sin fondo, sin viaje,
   sin adentro. Ahora sus propias piezas viven repartidas en Z y al bajar la
   cámara AVANZA — las de enfrente barren rápido y grandes, las del fondo apenas
   derivan. Las tres reglas que hacen que un falso 3D se lea real van juntas:
   lejos = MÁS CHICO, MÁS LENTO y MÁS APAGADO (esta última es la perspectiva
   atmosférica, y es la que casi nadie aplica).
   Cero librería: es perspective + un número de scroll. Las quince referencias
   de premio del barrido tampoco cargan ninguna —activetheory y lusion, las dos
   más 3D, salen con libs:[]— así que 600 KB de WebGL aquí no se justifican.

   🔴 El overflow:hidden NO puede vivir en .valle: convierte a la sección en
   contenedor de scroll y el sticky de dentro se queda clavado sin recorrido.
   Recorta .camara, que es la que se pega. Y preserve-3d va en .campo, no en
   .camara: un elemento que recorta fuerza transform-style a flat, y sin el
   contexto 3D compartido las piezas dejan de ordenarse por profundidad — o sea
   dejan de pasar POR DELANTE del titular, que es lo que vende la profundidad. */
/* 🔴🔴 v3.1 — EL VALLE SE VA A CLARO. Era la última masa oscura grande del sitio:
   2375 px de carbón contra su instrucción de que el negro de su branding se use
   "únicamente en typos, no en botones ni en detalles", y contra las nueve veces
   que pidió fondos "neutros y limpios, como el fondo crema de mi branding".
   Se probó y se miró antes de decidir; lo que resultó:
   · La escena gana. Los cinco colores de sus productos sobre crema pegan más que
     sobre carbón, porque dejan de competir con un fondo que también es materia.
   · La flor de papel aguanta sola: papel sobre papel es su idioma, no un problema.
   · Lo único que se rompía era la marea, y no por color sino por FALTA DE SOMBRA
     (ver su regla). Crema sobre crema es invisible hasta que una proyecta sobre
     la otra.
   El costo, dicho sin adornos: el sitio se queda con UN solo momento oscuro, el
   cierre — que es justamente el que ella ya vio y aprobó. La profundidad de esta
   sección ya no la pone el tono, la pone la perspectiva. */
.valle{--p:.5;background:var(--papel);color:var(--carbon);
  height:250svh;position:relative;
  /* El reparto del recorrido, en un solo lugar. Los tres tiempos van
     CONSECUTIVOS: el texto se va, LUEGO abre la flor, LUEGO sube el papel.
     🔴 Son variables y no números sueltos porque en celular la sección es más
     corta y el mismo 12% son 66 px de scroll — la marea subiría de un brinco,
     igual que le pasó a la barra de arriba con su rampa fija. */
  --t-sale:.58;  --d-sale:.12;
  --t-flor:.70;  --d-flor:.18;
  --t-marea:.88; --d-marea:.12}
.valle .camara{position:sticky;top:0;height:100svh;overflow:hidden}
.valle .campo{position:absolute;inset:0;
  perspective:1000px;transform-style:preserve-3d;
  /* El punto de fuga NO va en el centro: ahí vive el titular y todo lo lejano
     converge justo encima de las palabras. Bajado al hueco entre el último
     renglón y el enlace, el polvo se junta donde no estorba. */
  perspective-origin:50% 64%}

/* 🔴 v2 — LA ESCENA TIENE QUE RECORTARSE SOLA. Las once pegatinas de antes
   medían 64-170 px; sus portadas reales miden 74-190 y son más anchas, así que
   las de los bordes asoman fuera del marco. Con movimiento normal no se nota
   —la cámara las traga— pero con movimiento reducido `--p` se queda en 0 y el
   documento desbordaba 66 px en horizontal. Medido: ocultando SOLO `.pieza` el
   ancho volvía de 1346 a 1280.
   `overflow-x:clip` y no `hidden` a propósito: `hidden` crea un contenedor de
   scroll y eso rompe el `position:sticky` de la escena que vive dentro. */
.valle{overflow-x:clip}
.valle .pieza{position:absolute;pointer-events:none;
  left:var(--x);top:var(--y);width:var(--w);margin:calc(var(--w) / -2);
  rotate:var(--r);
  /* z actual = donde arrancó + lo que avanzó la cámara. Un solo avance para
     todas: es lo que hace una cámara de verdad. */
  --zc:calc(var(--z) + var(--p) * 2250);
  /* --o1 la saca de la nada (arranca en CERO, no en un gris tenue: una pieza
     apagada plantada sobre el titular es suciedad, no atmósfera) y --o2 la
     apaga antes de rebasar la lente, cuando ya es una mancha de dos pantallas. */
  --o1:clamp(0, calc((var(--zc) + 2500) / 2500), 1);
  --o2:clamp(0, calc((620 - var(--zc)) / 320), 1);
  transform:translateZ(calc(var(--zc) * 1px));
  opacity:calc(var(--o1) * var(--o2))}
/* ═══ v3 · QUE DEJEN DE FLOTAR ═════════════════════════════════════════════
   🔴 AQUÍ NO VA UNA SOMBRA DE CONTACTO, Y VALE LA PENA DEJARLO ESCRITO. Una
   sombra de contacto es la mancha que un objeto proyecta sobre LA SUPERFICIE
   EN LA QUE SE APOYA; el valle es un vacío y aquí no hay mesa. Ponerla habría
   sido copiar la receta sin leer la escena, y se vería peor: una mancha
   flotando debajo de otra cosa flotando.
   (Tampoco se reintenta Blender: ya falló dos veces esta sesión con estas
   fotos, y la causa de fondo no era el script — su luz de estudio viene
   horneada en el píxel y un segundo foco da doble iluminación.)

   Lo que un objeto suelto en el aire SÍ necesita son dos cosas, y las dos son
   de fotografía, no de CSS:
     1 · UNA sola dirección de luz para todas. Una sombra propia desplazada
         siempre al mismo lado dice que hay una lámpara en la habitación. Diez
         sombras en diez direcciones dicen "recortes pegados".
     2 · PERSPECTIVA ATMOSFÉRICA: lo lejano pierde contraste y se acerca al
         color del aire. Eso es lo que separa "chico" de "lejos" — sin ello el
         cerebro lee un objeto pequeño, no un objeto distante. */
/* 🔴 v3.1 — LA PERSPECTIVA AÉREA SE INVIERTE AL CAMBIAR EL FONDO, y esto no es
   ajuste de gusto: es la definición. Lo lejano se acerca al COLOR DEL AIRE. Con
   el valle en carbón el aire era oscuro y había que bajar el brillo; con el
   valle en crema el aire es claro y bajarlo hace justo lo contrario —oscurece lo
   que debería desvanecerse— y las piezas del fondo se leen a manchas sucias, no
   a distancia. Ahora sube (+.16) y la pérdida de croma y contraste hace el resto.
   La sombra también cambia: sobre crema, negro al 42% es un golpe; carbón al 26%
   es una sombra de papel. */
.valle .pieza{
  /* --aire: 0 cerca, 1 en el fondo. Sale del mismo --o1 que ya gobierna la
     entrada, para que no haya dos verdades sobre dónde está cada pieza. */
  --aire:calc(1 - var(--o1));
  filter:
    drop-shadow(calc(var(--w) * .04) calc(var(--w) * .06) calc(var(--w) * .08) rgba(44,44,44,.26))
    brightness(calc(1 + var(--aire) * .16))
    saturate(calc(1 - var(--aire) * .46))
    contrast(calc(1 - var(--aire) * .28))}
/* El desenfoque solo en las del fondo: filtrar diez elementos por cuadro se
   siente, y de cerca no aporta nada. Se REPITE la cadena entera porque
   `filter` no se acumula: declararlo otra vez sustituye, no añade — y sin
   repetirla estas piezas perderían la sombra y el aire de golpe. */
.valle .pieza.hondo{
  filter:
    blur(calc(var(--aire) * 4px))
    drop-shadow(calc(var(--w) * .04) calc(var(--w) * .06) calc(var(--w) * .08) rgba(44,44,44,.26))
    brightness(calc(1 + var(--aire) * .16))
    saturate(calc(1 - var(--aire) * .46))
    contrast(calc(1 - var(--aire) * .28))}

.valle .centro{position:absolute;inset:0;display:grid;place-content:center;
  grid-template-columns:minmax(0,1fr);   /* si no, la columna se ajusta al texto */
  text-align:center;padding:0 var(--margen);
  /* El titular no entra desde abajo: entra DESDE EL FONDO, acercándose. Llega
     en el primer tercio y de ahí se queda quieto — es el ancla del viaje. */
  --e:clamp(0, calc(var(--p) * 3.4), 1);
  /* Y SE VA por donde vino. 🔴 No es capricho: coral sobre crema mide 2.16 de
     contraste —reprueba para texto grande, que pide 3.0— así que la flor no
     puede pasar por detrás de las palabras. Y una flor con el centro a la
     vista no cabe debajo de un titular de cuatro renglones en 900 px de alto.
     Entonces no compiten: son dos tiempos. El titular vuelve al fondo con el
     mismo gesto con que llegó, y en su lugar florece. */
  --sale:clamp(0, calc((var(--p) - var(--t-sale)) / var(--d-sale)), 1);
  transform:translateZ(calc((1 - var(--e)) * -320px + var(--sale) * -460px));
  opacity:calc(var(--e) * (1 - var(--sale)))}

/* ── EL SEGUNDO TIEMPO: la flor de papel ────────────────────────────────────
   Renderizada, no dibujada: seis pétalos con SU silueta (el SVG suyo importado)
   con grosor de cartulina, el blanco del troquel vuelto CANTO del papel, una
   clave a 45° y un canto frío que la despega del carbón. 36 cuadros, 406 KB,
   y no se descargan hasta que la sección se acerca.
   ⚠️ Es la ÚNICA excepción a su regla de "todo plano, cero sombra" en el sitio
   entero. Una pieza, una vez. Si se vuelve el idioma, le rompemos la marca.

   🔴 Los tiempos van CONSECUTIVOS, no encimados. Una versión tuvo el titular
   apagándose mientras la flor ya entraba, y ese cruce se veía sucio. El reparto
   del recorrido es: el texto se va del .58 al .70 · la flor abre del .70 al .88
   · la marea de papel sube del .88 al 1. Tres tiempos, uno a la vez. */
.valle .bloom{position:absolute;left:50%;top:52%;pointer-events:none;
  --b:clamp(0, calc((var(--p) - var(--t-flor)) / var(--d-flor)), 1);
  width:min(560px, 64vw);aspect-ratio:1;
  translate:-50% -50%;
  scale:calc(.34 + var(--b) * .66);
  opacity:clamp(0, calc((var(--p) - var(--t-flor)) / var(--d-flor) * 2.6), 1)}
.valle .bloom > *{width:100%;height:100%;display:block}

/* ── EL RELEVO: la marea de papel ───────────────────────────────────────────
   El corte más duro del sitio estaba aquí: el valle terminaba en carbón y §3
   arrancaba en arena a CERO píxeles de distancia (medido: el final del valle y
   el inicio de §3 son el mismo número). Y justo después del momento más alto,
   la flor abriendo — o sea el clímax cortaba a negro y aparecía una sección
   quieta. De ahí venía el "no se conecta".
   Ahora una lámina de arena SUBE con el borde troquelado por delante y se traga
   la flor, el campo y el fondo. Cuando llena la pantalla ya estás en el tono
   exacto de §3, así que el corte deja de existir: no hay corte, hay relevo.
   Es su idioma además — lo que tapa las cosas aquí es papel.

   🔴 El troquel se voltea. El de las demás secciones es sólido ARRIBA y rasgado
   abajo, porque el color de la sección de arriba baja hacia esta. Aquí la
   lámina sube, así que los dientes tienen que apuntar hacia ARRIBA: scaleY(-1).
   Sin voltearlo, el papel entra con un borde recto de guillotina. */
/* 🔴 v3.1 — LA MAREA NECESITA SOMBRA, no color. Con el valle en carbón esta
   lámina se leía sola: crema entrando sobre negro. Con el valle en crema es
   crema sobre crema y desaparece — medido, contraste 1.00. Lo que la vuelve a
   hacer visible no es teñirla (sería meter un campo de color de los que ella
   quitó) sino que PROYECTE: una lámina de papel que sube por delante de la
   escena tapa la luz de lo que va tragando. Es más suave que la versión oscura y
   es la correcta para este mundo. */
.valle .marea{position:absolute;left:0;right:0;bottom:0;height:102%;z-index:3;
  background:var(--papel);pointer-events:none;
  filter:drop-shadow(0 -8px 18px rgba(44,44,44,.16));
  --m:clamp(0, calc((var(--p) - var(--t-marea)) / var(--d-marea)), 1);
  /* Amortiguada, no lineal: 1-(1-m)² entra rápido y SE ASIENTA. Pegada al
     scroll en crudo, la lámina arrancaba y frenaba en seco — que es justo lo
     que se siente como "le falta smooth". */
  --ms:calc(1 - (1 - var(--m)) * (1 - var(--m)));
  translate:0 calc((1 - var(--ms)) * 100%)}
.valle .marea::before{content:"";position:absolute;left:0;right:0;top:-17px;
  height:18px;background:var(--papel);transform:scaleY(-1);
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}

.valle .grande{font-family:var(--serif);font-weight:300;
  font-size:clamp(2.375rem,7.6vw,7.25rem);line-height:1.04;letter-spacing:-.016em;
  max-width:13ch;margin-inline:auto}
.valle .grande em{font-style:italic}
/* Las dos rampas se voltean con el fondo: eran crema al 50% y al 80% sobre
   carbón; sobre crema serían invisibles. Y los porcentajes NO se copian tal
   cual: la mezcla no es simétrica. Calculado sobre el papel real, el rótulo al
   50% que servía en oscuro aquí da 2.90 y reprueba; a 70% da 5.06. El enlace al
   78% da 6.47. */
.valle .pie{margin-top:1.875rem;font:500 0.875rem/1 var(--cuerpo);letter-spacing:.16em;
  text-transform:uppercase;color:rgba(44,44,44,.7)}      /* 5.06 */
.valle .baja{margin-top:2.75rem;display:inline-flex;align-items:center;gap:0.75rem;
  font:500 0.9375rem/1 var(--cuerpo);color:rgba(44,44,44,.78)}  /* 6.47 */
.valle .baja .ico{width:18px;height:18px;rotate:90deg}
/* En móvil el viaje es más corto y el campo más ralo: diez piezas en 390 px de
   ancho es confeti, no profundidad. Se van las cinco del fondo —las que menos
   aportan cuando la pantalla no da para leer la escala— y baja la perspectiva
   para que las que quedan sí se sientan cerca. */
@media (max-width:768px){
.valle{height:185svh;
    /* Con 165svh la marea tenía 66 px de recorrido: un brinco, no una lámina.
       A 185svh el viaje da 717 px y cada tiempo alcanza los ~130. */
    --t-sale:.46;  --d-sale:.12;
    --t-flor:.58;  --d-flor:.20;
    --t-marea:.78; --d-marea:.22}
  .valle .campo{perspective:640px}
  /* Se van solo las TRES más hondas, no todas las del fondo: con las seis
     fuera el campo llegaba vacío al final del viaje. Y como aquí la rampa de
     abajo las tiene apagadas hasta que se acercan, las que quedan no saturan
     la pantalla — van apareciendo de a una. */
  .valle .pieza:nth-child(n+9){display:none}
  /* 🔴 En 390 px el titular ocupa casi todo el ancho: no existe margen adonde
     converger, así que TODA pieza que viene del fondo cruza palabras. En
     escritorio se resuelve con la posición; aquí solo lo resuelve la
     profundidad de verdad — lo que está detrás del texto se apaga y se
     desenfoca hasta que de veras llega al plano del titular, y para entonces
     la perspectiva ya lo echó a las orillas. Con la rampa larga la hoja
     aterrizaba encima de "al" al 80% de opacidad. */
  .valle .pieza{width:calc(var(--w) * .72);margin:calc(var(--w) * -.36);
    --o1:clamp(0, calc((var(--zc) + 700) / 700), 1);
    filter:blur(calc((1 - var(--o1)) * 3px))}
}

/* Sin movimiento: el campo se queda en su punto compuesto y ya. El reposo vive
   en el --p:.34 del CSS, así que sin JS la sección tampoco se ve rota. */
@media (prefers-reduced-motion:reduce){
  .valle{height:auto;min-height:88svh}
  .valle .camara{position:static;height:88svh}
  /* 🔴 ERA `filter:none`, y eso ahora se llevaría por delante la sombra propia
     y la perspectiva atmosférica — o sea el diseño, no la animación. Ya nos
     pasó idéntico con la banda de §caminos: quien pide menos movimiento
     perdía una capa de color entera. Movimiento reducido significa que no se
     MUEVA, no que se quede sin diseño.
     Lo único que sí sobra aquí es el DESENFOQUE, que solo tenía sentido
     acompañando el avance de la cámara. La sombra y el aire se quedan. */
  .valle .pieza.hondo{
    filter:
      drop-shadow(calc(var(--w) * .05) calc(var(--w) * .07) calc(var(--w) * .09) rgba(0,0,0,.42))
      brightness(calc(1 - var(--aire) * .34))
      saturate(calc(1 - var(--aire) * .30))
      contrast(calc(1 - var(--aire) * .16))}
  .valle .bloom{display:none}   /* es carga de puro movimiento */
  .valle .marea{display:none}
}

/* ── 3 · ROMPER EL MOLDE ─────────────────────────────────────────────────── */
/* Cuatro secciones dejan de empezar igual. No es variedad por variedad: cada
   forma dice algo distinto sobre lo que viene abajo. */

/* El encabezado PARTIDO: el titular ocupa su ancho y la bajada se va al otro
   lado, abajo, alineada a su línea base. Es el gesto de graza. */
.enc-partido{display:grid;grid-template-columns:1.25fr .75fr;gap:2.5rem;
  align-items:end;margin-bottom:1.25rem}
.enc-partido .titular{margin-top:0.875rem}
.enc-partido .bajada{margin-top:0;padding-bottom:.7em;font-size:1.0625rem}

/* El encabezado a la DERECHA: rompe el eje izquierdo que traía todo el sitio. */
.enc-derecha{text-align:right}
.enc-derecha .titular,.enc-derecha .bajada{margin-left:auto}

/* El encabezado con NÚMERO: la cifra es la imagen. De chief. */
.enc-numero .cifra{font-family:var(--serif);font-weight:300;
  font-size:clamp(4.5rem,15vw,13.75rem);line-height:.86;letter-spacing:-.03em;
  display:block}
.enc-numero .pie-cifra{margin-top:0.875rem;font:600 0.75rem/1 var(--cuerpo);
  letter-spacing:.16em;text-transform:uppercase;var(--tx-3)}

/* ¿Te suena? pierde la píldora: es la sección más íntima del sitio y un rótulo
   de categoría encima de una confidencia la vuelve un bloque de catálogo. */
.suena .etiqueta{display:none}

@media (max-width:860px){
  .enc-partido{grid-template-columns:1fr;gap:0.875rem;align-items:start}
  .enc-partido .bajada{padding-bottom:0}
  .enc-derecha{text-align:left}
  .enc-derecha .titular,.enc-derecha .bajada{margin-left:0}
  .valle{min-height:80svh}
  .valle .p3{display:none}
}

/* ═══ TANDA 2 · LOS RECURSOS ═══════════════════════════════════════════════ */

/* La marquesina vivía aquí y se fue con su HTML (13-ago). No se deja el CSS
   "por si acaso": reglas huérfanas que parecen vivas son la forma más barata de
   perder media hora después. Si vuelve, vuelve escrita para donde vaya a vivir. */

/* ── EL MANIFIESTO, sobre papel ──────────────────────────────────────────── */
/* Era el tramo más plano del sitio: 130px de serif sobre arena y nada más.
   La textura NO va como color propio — va en `multiply` SOBRE el token de la
   marca. Así el hex lo sigue mandando el CSS y no el modelo, que es lo que
   evita el ΔE de 11 que da escribir el color en el prompt.

   ⚠️ `.papel` ahora existe en DOS secciones: aquí (un <img> dentro de un
   <picture>) y en §4 (la hoja rasgada del planner, que es un <div>). Las dos
   reglas van prefijadas por su sección y no se cruzan, pero el nombre es
   genérico: si alguna vez se escribe un `.papel` sin prefijo, va a agarrar las
   dos. */
.manifiesto{position:relative;isolation:isolate;overflow:hidden}
.manifiesto .papel{position:absolute;inset:0;z-index:-1;
  width:100%;height:100%;object-fit:cover;
  mix-blend-mode:multiply;opacity:.55}

/* Las pegatinas que flotan: es el único activo de marca que tenemos que NO es
   producto. Se mueven POCO — el paralaje que se nota es el que estorba. */
.pegado{position:absolute;z-index:0;pointer-events:none;
  width:clamp(52px,6vw,96px);will-change:transform}
/* ── SU RETRATO, COMO RECORTE ─────────────────────────────────────────────── */
/* Va dentro de `.pegado` para heredar el paralaje, pero se le devuelve el ancho:
   `.pegado` lo capa en 96 px y esto es una fotografía, no un adorno.
   🔴 Y `z-index` explícito por encima de las pegatinas: sin él, el orden del
   marcado dejaba la mancha de menta encima de su cara. */
.retrato{position:absolute;left:clamp(16px,4.4vw,74px);bottom:11%;z-index:1;
  width:clamp(148px,15vw,232px);margin:0;rotate:-3.2deg}
/* 🔴 El canto rasgado va en el <picture>, NO en el <figure>. En el figure, el
   `bottom:-1px` se mide contra la caja ENTERA —foto más pie— así que la tira de
   abajo aparecía debajo de "FUNDADORA", como una raya suelta a media nada. El
   papel que se rasga es la foto; el pie está escrito al lado, sobre la mesa. */
.retrato picture{position:relative;display:block}
.retrato img{display:block;width:100%;height:auto;border-radius:3px}
.retrato picture::before,.retrato picture::after{content:"";position:absolute;
  left:0;right:0;height:11px;z-index:2;pointer-events:none;background:var(--papel);
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%}
.retrato picture::before{top:-1px}
.retrato picture::after{bottom:-1px;transform:scaleY(-1)}
/* El pie va escrito a un lado, como se anota una foto pegada en un cuaderno. */
/* ── EL PIE DEL RETRATO ES UNA FIRMA ─────────────────────────────────────────
   Aquí es donde la manuscrita gana su sitio, y es el ÚNICO del home. Su nombre
   bajo su retrato, en la sección donde habla en primera persona, es literalmente
   lo que una "script de firma" hace: firmar. Repartirla por el sitio la
   convertiría en decoración, que es justo lo que ella descartó.

   🔴 EL TRACKING NO ES DE GUSTO: COMPENSA UNA DIFERENCIA MEDIDA. Su firma real
   tiene una relación ancho/alto de 4.54 y Sacramento de 3.24 — la suya es un 40%
   más aireada. Sin abrir el tracking, la manuscrita se lee apretada al lado de
   la de su propio logo, que está a un scroll de distancia en la cabecera.
   Y el tamaño sube de 13 a ~30 px: una monoline fina a tamaño de pie de foto se
   cierra sobre sí misma, y además es donde menos se nota que Sacramento es un
   37% más gruesa que la suya. */
.retrato figcaption{margin-top:0.6875rem;text-align:left;
  font:500 0.8125rem/1.2 var(--cuerpo);color:var(--carbon)}
.retrato figcaption{font-family:var(--firma);font-weight:400;
  font-size:clamp(1.625rem,2.4vw,2rem);line-height:1.05;
  letter-spacing:.055em}
/* .6 daba 3.61 sobre la arena — y en versalitas de 12 px no hay excepción de
   "texto grande" que valga. .74 lo deja en 5.0. */
/* 🔴 EL ROL NO HEREDA LA FIRMA. `figcaption` ahora es manuscrita y este `<span>`
   lleva `text-transform:uppercase`: sin esto, "FUNDADORA" salía en versales de
   script — el peor uso posible de una caligráfica, y encima ilegible a 12 px.
   Es el contraste que hace que la firma se lea a firma: nombre a mano, cargo a
   máquina. */
.retrato figcaption span{display:block;margin-top:3px;font-family:var(--cuerpo);
  font-weight:400;font-size:0.75rem;
  letter-spacing:.1em;text-transform:uppercase;color:rgba(44,44,44,.74)}

/* ── LA FIRMA SE ESCRIBE ─────────────────────────────────────────────────────
   El gesto propio de §manifiesto. Un `clip-path` que se abre de izquierda a
   derecha: la tinta aparece por donde avanzaría la mano, no con un fundido —
   un fundido es la firma REVELÁNDOSE, y lo que queremos es TRAZÁNDOSE.

   Tres números que no son de gusto:
   · `inset` con los lados de abajo y de la derecha en NEGATIVO. A 0 el recorte
     corta las descendentes de la "a" y la cola larga con que Sacramento remata
     la palabra — justo el rasgo por el que se eligió esta fuente.
   · El peso del `<b>` se anula: `b` trae 700 de fábrica y en una monoline fina
     el sintético la engorda hasta que deja de parecer escrita a mano. El
     elemento se eligió por semántica, no por su peso.
   · La curva arranca rápida y frena al final (`cubic-bezier(.42,0,.28,1)`), que
     es como se acaba un trazo real: la mano suelta. Una curva simétrica lo
     convierte en una barra de progreso.

   🔴 EL REPOSO ES LA FIRMA COMPLETA. El recorte solo existe bajo `.js` —la marca
   que pone vida.js—, así que sin JS el nombre está ahí entero. Es la regla del
   sitio y aquí importa el doble: lo que se esconde es el nombre de la clienta. */
.rubrica{display:inline-block;font-weight:400}
.js .rubrica{-webkit-clip-path:inset(0 100% -22% 0);clip-path:inset(0 100% -22% 0);
  transition:clip-path 1.15s cubic-bezier(.42,0,.28,1) .22s,
             -webkit-clip-path 1.15s cubic-bezier(.42,0,.28,1) .22s}
.js .rubrica.escrita{-webkit-clip-path:inset(0 -8% -22% 0);clip-path:inset(0 -8% -22% 0)}
@media (prefers-reduced-motion:reduce){
  .js .rubrica{-webkit-clip-path:none;clip-path:none;transition:none}
}

.pg-1{top:14%;left:7%;rotate:-12deg}
.pg-2{top:26%;right:9%;rotate:9deg}
.pg-3{bottom:20%;left:12%;rotate:6deg;width:clamp(40px,4.6vw,72px)}
.pg-4{bottom:14%;right:14%;rotate:-8deg}

/* ── EL TRAZO QUE SE DIBUJA ──────────────────────────────────────────────── */
/* De graza: sus dibujos de línea planos son el mismo vocabulario que las ondas
   de ella. Un trazo que se dibuja al entrar es movimiento real con peso cero.
   `stroke-dasharray` = el largo del trazo; el reposo vive en la clase base, así
   que sin JS la onda se ve completa en vez de invisible. */
.trazo{display:block;width:min(280px,46vw);height:auto;margin:1.875rem auto 0;
  overflow:visible}
.trazo path{fill:none;stroke:var(--oliva);stroke-width:7;stroke-linecap:round}
.js .trazo path{stroke-dasharray:var(--largo);stroke-dashoffset:var(--largo);
  transition:stroke-dashoffset 1.5s var(--curva)}
.js .trazo.dibuja path{stroke-dashoffset:0}

/* ── BLOOM LIBRARY sobre acuarela ────────────────────────────────────────── */
/* 🔴 Primer intento: la acuarela DEBAJO del titular. Medido, el peor píxel daba
   2.31 y el mínimo para texto grande es 3.0 — el verde oscuro de una mancha.
   Bajarle tinta y meterle un velo tampoco bastó (2.41 en escritorio, peor en
   celular). El problema no era la dosis: era poner una imagen ocupada DEBAJO de
   un bloque de texto grande.
   La salida es moverla, no atenuarla: la acuarela es el fondo de la SECCIÓN y la
   franja flota encima, casi opaca. La textura se ve alrededor —que es donde
   aporta— y el texto nunca pelea con ella. */
.library{position:relative;isolation:isolate;overflow:hidden;
  background:var(--sup)}

/* ── LA COSTURA: EL AGUA SE FILTRA EN EL PAPEL ────────────────────────────── */
/* 🔴 Lo que paco señaló y tenía razón: el corte del manifiesto a la biblioteca
   era agresivo. Y no era el corte en sí — el sitio corta ocho veces y solo esta
   se sentía mal. Era que las OTRAS ocho cortan con troquel o con un tono
   declarado, y estas dos secciones son las únicas dos seguidas que no hacen ni
   una cosa ni la otra: papel cálido fotografiado contra acuarela fría
   fotografiada, a tope, en un renglón de píxeles. Dos fotos apiladas leen a
   error de montaje, no a decisión.

   La salida no es meterle otro troquel —sería el noveno igual— sino usar lo que
   el material hace de verdad: la acuarela no empieza, se EXTIENDE. Con la
   máscara, el agua sube desde el crema y tarda 240 px en llegar a su fuerza
   entera. Es literalmente lo que hace una aguada al tocar papel seco, y es su
   propio medio: no hay que explicarlo, se reconoce.

   Y se va igual por abajo, porque §8 entra con su troquel amarillo y el agua a
   tope contra el amarillo sería el mismo choque otra vez, invertido. */
/* 🔴 La máscara va en el <picture>, NO en la imagen. La imagen lleva el
   paralaje, o sea que se mueve; con la máscara encima de ella, el degradado se
   movería también y el punto donde el agua alcanza su fuerza subiría y bajaría
   con el scroll. La máscara tiene que estar clavada al MARCO —los bordes de la
   sección— y la imagen deslizarse por dentro. */
.library picture{position:absolute;inset:0;z-index:-1;display:block;
  overflow:hidden;
  -webkit-mask-image:linear-gradient(to bottom,
     transparent 0, rgba(0,0,0,.22) 90px, #000 240px,
     #000 calc(100% - 150px), rgba(0,0,0,.35) calc(100% - 40px), transparent 100%);
          mask-image:linear-gradient(to bottom,
     transparent 0, rgba(0,0,0,.22) 90px, #000 240px,
     #000 calc(100% - 150px), rgba(0,0,0,.35) calc(100% - 40px), transparent 100%)}

/* El agua además DERIVA: se mueve más despacio que la página (`--deriva`, que
   pone vida.js de -1 a 1). Es lo que impide que la costura se lea como una
   línea fija — un borde quieto mientras todo lo demás se mueve es justo lo que
   hace que un corte se note.
   La lámina va un 16% más alta que el marco para que el recorrido de ±4% nunca
   descubra la orilla. */
.library .acuarela{position:absolute;left:0;top:-8%;
  width:100%;height:116%;object-fit:cover;opacity:.9;
  translate:0 calc(var(--deriva,0) * 4%);will-change:translate}

@media (max-width:860px){
  .pg-2,.pg-4{display:none}
}
@media (prefers-reduced-motion:reduce){
  .js .trazo path{stroke-dashoffset:0;transition:none}
  .pegado{transform:none!important}
  /* Las marcas se ven enteras desde el primer cuadro, y el agua no deriva. */
  .js .sello{stroke-dashoffset:0;transition:none}
  .library .acuarela{translate:none}
}

/* ═══ TANDA 3 · EL MOVIMIENTO ══════════════════════════════════════════════
   Va al final y va poco, que es lo acordado. El dato que manda: 11 de 15 sitios
   de premio corren SIN librería de motion, y de las 10 referencias medidas seis
   dan revealAttrs = 0. El techo de calidad no sale de animar la entrada de las
   cosas — sale de la escala, del ritmo y de UNA sola curva.

   🔴 EL REPOSO VIVE EN LA CLASE BASE. Sin JS todo se ve completo; el estado
   escondido solo existe cuando `html.js-rev` está puesto, o sea cuando hay algo
   que lo va a revelar. Al revés se queda una página en blanco si el JS falla. */

.js-rev [data-rev]{opacity:0;translate:0 20px;
  transition:opacity .85s var(--curva), translate .85s var(--curva);
  transition-delay:calc(var(--i, 0) * 90ms)}
.js-rev [data-rev].ver{opacity:1;translate:0 0}

/* El titular del manifiesto: mismo gesto que la entrada del sitio —los renglones
   SUBEN desde detrás de su máscara— pero por PALABRA. Que el sitio entero use un
   solo gesto es lo que lo hace sentir de una pieza; inventar un segundo tipo de
   revelado aquí lo partiría en dos. */
.pal{display:inline-block;overflow:hidden;vertical-align:bottom;
  padding-bottom:.08em;margin-bottom:-.08em}
.pal>i{display:inline-block;font-style:inherit;translate:0 0}
.js-rev .pal>i{translate:0 108%;
  /* El escalonado es un PRESUPUESTO de 340 ms repartido entre las palabras que
     haya, no 55 ms por cabeza. Así un titular de 15 palabras y uno de 6 llegan
     en la misma ventana y el sitio se siente de una pieza. */
  transition:translate .78s var(--curva);
  transition-delay:calc(var(--i, 0) / var(--n, 1) * .34s)}
.js-rev [data-pals].ver .pal>i{translate:0 0}

/* Las tarjetas de producto: el hover ya existía como un empujón; se le suma la
   sombra que proyecta el objeto, que es la ÚNICA sombra que el sitio se permite
   —física, no decoración— y solo aparece al tocar. */
/* (el hover de la foto de producto vive ahora en `.sku .vitrina img`) */

/* La píldora de camino: el signo gira en vez de cambiar de dibujo. */
.via .signo{transition:rotate .5s var(--curva)}
.via[data-abierta] .signo{rotate:180deg}

@media (prefers-reduced-motion:reduce){
  .js-rev [data-rev]{opacity:1;translate:0 0;transition:none}
  .js-rev .pal>i{translate:0 0;transition:none}
  .sku:hover .sku-obj{transform:none}
  /* El giro del puntero y la caída de la entrada se apagan; la hoja y su sombra
     se quedan en reposo. Lo que NO se apaga es la sombra en sí: no es
     movimiento, es la única señal de que la hoja está apoyada en algo. */
  .sku{transform:none}
  .tienda-mesa{transform:none}
  .js-rev .tienda [data-rev]{rotate:0deg}
}

/* ═══ LENIS — el CSS que EXIGE, y que yo no había puesto ═══════════════════
   🔴 EL SCROLL SE ROMPIÓ EN ESCRITORIO Y ESTE ERA EL PORQUÉ.
   `sitio.css` trae `html{scroll-behavior:smooth}` desde el primer día. Con Lenis
   encima, DOS motores animan el mismo scroll y pelean: medido con la rueda, seis
   golpes de 300 px dejaban la página clavada en 7 px durante todo el gesto y
   recién metro y medio de segundo después saltaba a 1800.

   Mi verificación de la tanda 3 no lo cazó porque medí con `scrollTo()`
   programático —posiciones— y NUNCA probé la rueda, que es justo lo único que
   Lenis reescribe. Medir la posición final no es medir el scroll.

   Lenis se apaga solo si no hay JS, así que `scroll-behavior:smooth` se queda
   como reposo y solo se anula cuando Lenis está de verdad puesto.            */
html.lenis,html.lenis body{height:auto}
.lenis.lenis-smooth{scroll-behavior:auto!important}
.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}
.lenis.lenis-stopped{overflow:hidden}

/* ═══ EL TROQUEL ENTRE FRANJAS ═════════════════════════════════════════════
   El sitio cortaba en línea recta entre una franja de color y la siguiente.
   Ahora corta como PAPEL — el mismo lenguaje de las pegatinas troqueladas, así
   que cada cambio de sección se lee a un recorte pegado sobre otro.
   Sale de arc.net, que mete un borde festoneado entre sus franjas.

   La tira va pintada del color de ARRIBA y recortada con la máscara: así una
   sola pieza sirve para las siete costuras y el color lo manda el CSS.
   `--arriba` se declara en cada sección; sin declararlo no aparece nada, que es
   el reposo correcto. */
.troquel{position:relative}
.troquel::before{content:"";position:absolute;left:0;right:0;top:-1px;
  height:var(--troquel-h,24px);
  z-index:2;pointer-events:none;background:var(--arriba);
  -webkit-mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
          mask:url("grafico/troquel.svg") repeat-x center/auto 100%;
  /* 🔴 LA SOMBRA DE CONTACTO — es lo que convierte la costura en PAPEL.
     Un `drop-shadow` sobre un elemento enmascarado sigue la silueta de la
     máscara, no su caja: la sombra sale con la forma exacta del desgarre y cae
     sobre la sección de abajo. Con eso hay dos planos donde antes había una
     línea, y la hoja de arriba se lee ENCIMA de la de abajo.
     `box-shadow` NO sirve aquí: dibujaría el rectángulo, no el rasgado.
     Corta y baja a propósito (2px de desplazamiento, 4px de radio): una sombra
     larga separa las hojas y las hace flotar; ésta las APOYA. */
     Y van DOS, en este orden, porque son dos planos distintos:
     · la hebra clara a 1px — el CANTO, el grosor del papel atrapando la luz en
       su labio inferior. Nítida (radio 0), porque un borde físico no difumina.
     · la sombra suave a 3px — el APOYO sobre la hoja de abajo.
     Sin la primera el troquel es una silueta; con ella es un objeto.

     🔴 Y va todo en `filter`, NO en un `::after`: `.podcast::after` y
     `.sigue::after` YA EXISTEN (el patrón de puntitos y la onda). Un
     `.troquel::after` empata en especificidad, pierde por orden, y los otros dos
     se habrían quedado con MI máscara —recortando sus patrones a la tira de la
     costura—. Es exactamente la trampa que ya me costó los fondos. */
  filter:drop-shadow(0 1px 0 rgba(255,255,255,.55))
         drop-shadow(0 3px 5px rgba(44,44,44,.18))}

/* ═══ §2.5 · LA CITA, REVELADA CON EL SCROLL ═══════════════════════════════
   🔴 Medido: la cita traía 26 palabras en 8 renglones a 95 px. Eso no es un
   momento tipográfico, es un MURO — y paco lo vio antes que yo. Graza corre a
   120 px con cinco palabras.
   Dos cambios: (1) el titular se queda con el GOLPE —diez palabras— y el resto
   de su frase entra chico arriba, como la pregunta que es; (2) las palabras se
   encienden CONFORME BAJAS en vez de aparecer todas de golpe.
   El recorrido es una sección alta con la escena pegada: el mismo mecanismo
   determinista de la entrada (una variable `--p` del scroll, sin librería y sin
   pin de GSAP, que mete deriva). Sube y baja igual, que es lo que se pidió. */
.suena{height:210vh;padding:0;--p:0}
.suena .pega{position:sticky;top:0;height:100svh;
  display:grid;place-content:center;text-align:center;
  padding:0 var(--margen)}
.suena .pregunta{font-size:clamp(0.9375rem,1.5vw,1.1875rem);line-height:1.6;
  max-width:44ch;margin:0 auto;var(--tx-3)}
.suena .cita{font-family:var(--serif);font-weight:300;font-style:italic;
  font-size:clamp(2rem,6.4vw,5.75rem);line-height:1.1;letter-spacing:-.014em;
  max-width:14ch;margin:1.625rem auto 0}
/* Apagada no es invisible: a .16 el renglón sigue ocupando su sitio y se
   adivina, así que la línea no salta cuando enciende. */
.suena .w{opacity:.16;transition:opacity .45s var(--curva)}
.suena .w.on{opacity:1}
.suena .quien{margin-top:2.125rem}

@media (max-width:860px){
  .suena{height:190vh}
  .troquel::before{height:12px}
}
@media (prefers-reduced-motion:reduce){
  .suena{height:auto}
  .suena .pega{position:static;height:auto;padding:var(--hueco) var(--margen)}
  .suena .w{opacity:1}
}

/* ═══ AUDITORÍA DE TIPOGRAFÍA — LAS CUATRO CORRECCIONES ════════════════════
   Medido en el sitio en vivo, escritorio. El hallazgo fue al revés de lo
   esperado: CERO textos reprueban contraste — todos entre 8.83 y 13.05. O sea
   no falta contraste, SOBRA CONTRASTE UNIFORME: titular, cuerpo, rótulo y pie
   gritan igual de fuerte, así que nada destaca. Por eso el texto no llamaba la
   atención.                                                                  */

:root{
  /* 1 · LA RAMPA. Tres niveles, no "todo carbón". Los valores salen de medir:
     🔴 PRIMERA VERSIÓN MAL CALIBRADA: saqué los números sobre CREMA y el sitio
     corre mayormente sobre ARENA, que es más oscura. Medido sobre arena, el
     piso que pasa AA es **.72**, no .62 — con .62 reprobaban cinco textos.
     Y eso trae una consecuencia que manda sobre el diseño: sobre este fondo NO
     HAY ESPACIO para una rampa de tres niveles de opacidad. La distancia entre
     cuerpo y rótulo tiene que venir del TAMAÑO y de la CAJA (versalitas con
     tracking), no de más transparencia. Es la misma regla del sistema de
     Caliber: la jerarquía se abre por peso y forma, no bajando el tono. */
  --tx-1:#2C2C2C;
  --tx-2:rgba(44,44,44,.76);
  --tx-3:rgba(44,44,44,.72);
  --tx-1c:var(--crema);
  --tx-2c:rgba(250,247,240,.74);
  --tx-3c:rgba(250,247,240,.6);

  /* 2 · EL ACENTO DE COLOR. Ninguno de sus seis colores pasa como texto tal
     cual —el mejor es oliva a 2.25—. Oscurecidos al 50% CONSERVANDO el tono sí:
     oliva 6.53 y lila 8.82 sobre crema. El coral queda FUERA a propósito: es el
     color de acción y no compite consigo mismo. */
  /* v2 — los dos acentos de texto se alinean con el sistema de producto.
     `--ac-oliva` era #585D25 y ahora es el mismo verde hondo del carrito, así
     que el sitio tiene UN verde y no dos parecidos. `--ac-lila` era #273C9E,
     un azul inventado a un pelo de su cobalto real: se va al cobalto.
     Los dos siguen midiendo de sobra sobre papel: 5.29 y 10.85. */
  --ac-oliva:var(--oliva-hondo);
  --ac-lila:var(--cobalto);
  --ac-claro:var(--lima);      /* el acento sobre carbón */

  /* Los otros tres, por la MISMA receta —oscurecer conservando el tono— porque
     el índice del canal marca cada video con el color de su tipo y §8 corre
     sobre AMARILLO: el amarillo de ella sobre amarillo desaparece, y la menta se
     queda en un fantasma. `in oklch` y no `in srgb`: mezclar en srgb desatura y
     saca un color lodoso que ya no es el suyo. Aquí no son texto —son un punto
     de 7px y un filete de 1-3px—, así que el listón es 3:1 (no textual). Medido
     pintando el píxel de verdad sobre el amarillo de §8 (#F8EBC6), que es la
     única manera de medir un `color-mix` (el computed style devuelve la fórmula
     sin resolver, y leerla como si fuera rgb da números inventados):
       menta #6C7C77 3.70 · lila #273C9E 7.95 · coral #A96650 3.76
       oliva #585D25 5.88 · amarillo #8D7944 3.57 — pasan los cinco. */
  /* 🔴 RE-MEDIDOS PARA DOS FONDOS, NO PARA UNO. Se afinaron contra el amarillo
     de §8 y ahí pasaban; en la Bloom Library, sobre ARENA, el rótulo de tipo
     caía a 3.45 (coral) y 3.39 (menta) — reprobado. Un token de color se mide
     contra TODOS los fondos donde va a caer, no contra el primero.
     Medido pintando el píxel, coral / menta / amarillo:
       arena    4.85 · 4.63 · 4.79
       amarillo 5.28 · 5.04 · 5.21                                           */
  --ac-coral:color-mix(in oklch,var(--coral) 44%,var(--carbon));
  --ac-amarillo:color-mix(in oklch,var(--amarillo) 36%,var(--carbon));
  --ac-menta:color-mix(in oklch,var(--menta) 40%,var(--carbon));

  /* 3 · LA ESCALA. Eran VEINTIDÓS escalones, con cuatro casi idénticos
     (92·95·107·109) que el ojo lee a desorden, no a jerarquía. La mediana en
     lujo es cinco. Quedan seis. */
  /* La escala entera en rem: cuelga de la raíz fluida como todo lo demás. A
     16 px de raíz da exactamente los mismos números con los que se compuso. */
  --t1:clamp(6rem,15vw,13.5rem);      /* la cifra */
  --t2:clamp(2.625rem,9vw,8.125rem);  /* el pico: el manifiesto */
  --t3:clamp(2.25rem,6.4vw,6rem);     /* titulares, valle, cierre, la cita */
  --t4:clamp(1.5rem,2.6vw,2.125rem);  /* subtítulos */
  --t5:1.1875rem;                     /* cuerpo */
  --t6:0.8125rem;                     /* rótulos */
}

/* una palabra por sección, no una frase: el acento deja de serlo si se reparte */
/* ═══ v3 · EL ACENTO CAMBIA DE FUENTE, NO SOLO DE COLOR ════════════════════
   🔴 MEDIDO, Y ERA LA CRÍTICA CORRECTA DE PACO: de doce titulares, SOLO el
   hero cambiaba de familia. En los otros once el "acento" era la misma
   Gambetta, al mismo tamaño, pintada de otro color. Eso no es un registro
   distinto: es un subrayado, y por eso la web seguía leyéndose plana aunque
   tuviera color.

   El mecanismo de su moodboard —"dream BIG go HIRE"— alterna CUATRO cosas
   dentro de una misma frase: familia, peso, tamaño y color. Una sola de las
   cuatro no produce contraste; las cuatro juntas producen el suyo.

   El `0.78em` sale de lo mismo que el hero: la altura de mayúscula de Lemon
   Milk contra la altura de x de Gambetta. A igual font-size la palabra en
   caja alta se ve un 30% mayor y se come el renglón en vez de acentuarlo. */
.ac{color:var(--ac,var(--ac-oliva))}
/* 🔴 `.ac` NO BASTA COMO GANCHO — y esto costó texto visible en pantalla.
   §suena ya usaba `.ac` para OTRA cosa: sus palabras animadas son
   `span.w.ac.on`, con un `<i>` dentro y un subrayado dibujado en SVG. Esa caja
   es `display:block` con `overflow:hidden` y ancho propio; al cambiarle la
   fuente a caja alta el contenido creció 75 px (medido: scrollWidth 470 contra
   clientWidth 395) y se comió la última letra — "ELIGIEND".
   Lo mismo en §universo, donde `.w` se llevó "ELIGES".
   Se excluye `.w`: esas palabras ya tienen SU acento —la cursiva y el trazo
   dibujado— y ése es el gesto de esa sección. Quinta colisión de la sesión, y
   la única que además borraba contenido. */
.ac:not(.w){
  font-family:var(--display);font-weight:700;font-style:normal;
  font-size:0.78em;letter-spacing:.02em}

/* ═══ v2 · LA PLACA — el aparato de alegría que sustituye al clip-art ═══════
   Ella pidió dos cosas en la MISMA frase: fuera todos los iconos dibujados, y
   "sin perder el toque divertido de la marca". Las 70 pegatinas eran nuestro
   único recurso de diversión; borrarlas sin reemplazo dejaba el sitio elegante
   y mudo.

   El reemplazo sale de su propia referencia. michellepoler.com, medida en vivo:
   el titular lleva un BLOQUE DE RESALTE detrás de las palabras que cargan el
   sentido ("COURAGE", "AUTHENTICITY"). No es un subrayado ni un adorno pegado
   al lado: es la palabra metida en un color. Y ella ya nos dijo que ese
   registro le encanta — "me encanta cuando agregas algún acento de color y
   utilizas cursiva en ciertas palabras, eso sí quiero mantenerlo porque le da
   la personalidad".

   Tres decisiones de oficio:
   · LA PLACA GIRA, EL TEXTO NO. Girar la palabra rompe la caja de línea y
     desalinea el renglón. El giro vive en el pseudo-elemento de atrás, así que
     se lee a marcador puesto a mano —que es el "divertido"— sin mover una
     letra de su sitio.
   · Va por DETRÁS (z-index:-1) con el color a saturación completa, no una
     mezcla pálida. Pálido a gran escala es justo lo que ella rechazó.
   · El texto toma su color del sistema de botones, no uno nuevo: cada tinte ya
     tiene su pareja medida. */
/* 🔴 ESTA CLASE SE LLAMABA `.placa` Y CHOCABA CON LA PLACA DE LA FOTO DEL HERO
   (sitio.css:269), que lleva `overflow:hidden` para recortar la imagen. Esa
   regla le caía también al acento y le CORTABA LOS GLIFOS por abajo: la O y la
   Y salían con la panza plana.
   Existía desde la capa 4 y no se veía, porque Gambetta en caja baja cabía en
   la caja; Lemon Milk en caja alta es más alta y empezó a desbordar. Un choque
   de nombre puede estar dormido meses y despertar al cambiar una fuente.
   Séptima colisión de la sesión. `realce` no existía en ningún archivo. */
.ac.realce{position:relative;isolation:isolate;
  color:var(--placa-tx,var(--blanco));
  padding:0 .16em;white-space:nowrap}
.ac.realce::before{content:"";position:absolute;z-index:-1;
  /* 🔴 LOS TOPES VERTICALES SALEN DE LAS MÉTRICAS DE LA FUENTE, NO DEL OJO.
     Estos valores estaban calibrados para Gambetta en CAJA BAJA —con altura de
     x y descendentes— y al pasar el acento a Lemon Milk en CAJA ALTA dejaron
     de servir: las mayúsculas van de la línea base a la altura de mayúscula y
     no bajan de la base, así que sobraba aire arriba y faltaba abajo.
     Medido en pantalla con TextMetrics a 62.3 px: 13.3 px de aire encima
     contra 7.2 debajo — casi el doble. Se veía descentrada porque LO ESTABA.

     El cálculo, en em sobre el tamaño del propio acento:
       · la caja del elemento mide ascendente + descendente = 1.082 + 0.244
       · la línea base cae a 1.082em del borde superior
       · la tinta de las mayúsculas va de +0.808em (la O sobrepasa) a -0.02em
       → tinta arriba  = 1.082 - 0.808 = 0.273em desde el borde superior
       → tinta abajo   = 0.244 - 0.020 = 0.224em desde el borde inferior
     Restando el mismo margen de 0.11em a cada lado queda la placa centrada.
     ⚠️ Estos números son de Lemon Milk. Si el acento cambia de fuente, hay que
     volver a sacarlos del archivo — no moverlos a ojo.

     🔴🔴 CORREGIDO CONTRA PÍXELES: EL CÁLCULO DE ARRIBA ERA BUENO Y LA PREMISA NO.
     `TextMetrics` da las métricas de la FUENTE —dónde cae la tinta respecto a la
     línea base— pero NO dónde el navegador pone esa línea base dentro de la caja
     del inline, que lo decide el `line-height` y su medio interlineado. Las dos
     cosas iban desfasadas 13 px, así que los topes salieron centrados sobre una
     línea base imaginaria.
     Medido sobre la captura, contando píxeles de la placa y de los glifos:

         placa dibujada   500 → 576
         letras           521 → 580     ← se salían 4 px por abajo
         aire arriba      21 px  ·  aire abajo  −4 px

     Sobran 18 px de placa mal repartidos. La corrección los deja en 9 y 9: la
     placa baja 12 px conservando su alto, o sea +.163em en los dos topes.
     La lección es la de siempre en este archivo: un número propio no vale más que
     el código propio. Aquí ganó la captura. */
  left:-.06em;right:-.06em;top:.326em;bottom:-.049em;
  background:var(--placa-bg,var(--terracota));
  border-radius:.10em;
  /* 🔴 SE VA EL GIRO. Estaba en -0.9°, y giraba SOLO la placa: el texto se
     quedaba recto, así que los dos divergían. En una palabra corta el efecto
     lee a "pegado a mano" y funciona; en "VOLVER A TI", que mide ~900 px, un
     grado de inclinación desplaza los extremos unos 7 px y las letras se salen
     por abajo del lado derecho. Se vio ampliando la captura, no a tamaño real.
     Girar el conjunto tampoco: inclinaría el texto respecto al resto del
     renglón. Recta es lo que hace su propio moodboard con el bloque de "NARI".
     El carácter no lo pone la inclinación: lo pone el color. */
  rotate:0deg}
/* Los cinco rellenos, con su texto amarrado por medición — los mismos ratios
   del sistema de botones (sitio.css). Lima se invierte: es color-superficie. */
.realce-terracota{--placa-bg:var(--terracota); --placa-tx:var(--blanco)}  /* 6.33 */
.realce-cobalto  {--placa-bg:var(--cobalto);   --placa-tx:var(--blanco)}  /* 11.96 */
.realce-orquidea {--placa-bg:var(--orquidea);  --placa-tx:var(--blanco)}  /* 5.78 */
.realce-esmeralda{--placa-bg:var(--esmeralda); --placa-tx:var(--blanco)}  /* 4.76 */
.realce-lima     {--placa-bg:var(--lima);      --placa-tx:var(--carbon)}  /* 5.81 */
.realce-naranja  {--placa-bg:var(--naranja);   --placa-tx:var(--blanco)}  /* 5.62 */

/* ═══ v3 · DOS GESTOS MÁS, PORQUE UNO REPETIDO SEIS VECES DEJA DE SER UN GESTO ══
   🔴 LO QUE ESTABA MAL NO ERA LA FALTA DE COLOR — ESA FUE UNA MEDICIÓN MÍA MAL
   HECHA. Leí el `color` de los `<h2>` (carbón, los doce) y di por bueno que los
   titulares no llevaban color; el color vive en los `<span>` de dentro y estaba
   en 10 de 12. Contados de verdad, los acentos del sitio eran:

       placa (rectángulo sólido, texto blanco) ...... 6
       tinta sola ................................... 4
       sin acento ................................... 2

   Seis placas idénticas, y "volver a ti" metida en placa CUATRO veces. Ése es el
   defecto: no que falte color, sino que el color entra siempre por la misma
   puerta. Un gesto repetido seis veces se vuelve tan invisible como un titular
   repetido doce — y encima gasta el único recurso "divertido" que le queda al
   sitio después de que ella pidiera fuera los iconos dibujados.

   Los dos nuevos salen del mundo del producto, no de un catálogo de efectos: en
   un planner uno resalta con marcador y subraya a mano. Reutilizan el MISMO
   `::before` ya calibrado contra las métricas de Lemon Milk — no hay una segunda
   maquinaria que se desincronice con la primera.

   Y los dos DEVUELVEN EL TEXTO A SU TINTA: la placa lo invierte a blanco, y tres
   gestos que inviertan a blanco serían otra vez lo mismo. Aquí la palabra se
   queda en carbón y el color va detrás, que es como se ve un cuaderno de verdad.

   ── 1 · EL MARCADOR ──────────────────────────────────────────────────────────
   Cubre solo la parte baja de la palabra, como un fluorescente pasado de una
   sola pasada. El `top` sale del mismo sistema que la placa (.326em es donde
   empieza la tinta de las mayúsculas): bajándolo a .78em la banda tapa el tercio
   inferior y deja las mayúsculas asomando, que es lo que hace un marcador real.
   ⚠️ Va con alfa, no a saturación plena: a color pleno el carbón encima se
   apagaría justo en la mitad tapada. Y NO contradice su "no me gustan los fondos
   amarillos, verdes o azules pálidos" — eso habla de LIENZOS; esto es una banda
   de media palabra. El contraste del carbón se mide abajo, no se supone. */
.ac.realce-marca{color:var(--carbon)}
.ac.realce-marca::before{
  top:.78em;bottom:-.02em;left:-.08em;right:-.08em;
  background:color-mix(in oklch, var(--placa-bg,var(--terracota)) 52%, transparent);
  border-radius:.06em .14em .09em .11em;
  rotate:-.6deg}

/* ── 2 · EL SUBRAYADO A MANO ────────────────────────────────────────────────
   Una línea bajo la palabra, con los cuatro radios distintos para que no lea a
   `border-bottom`. Y SE DIBUJA al entrar en pantalla en vez de estar puesta:
   es el único acento del sitio que tiene tiempo, y por eso se reserva a dos
   titulares. `transform-origin:left` porque una línea trazada a mano empieza por
   donde empieza la palabra, no por el centro.
   El reposo es la línea COMPLETA (`scaleX(1)`): sin JS el acento se ve entero,
   igual que el resto del sistema de revelado del sitio. */
.ac.realce-linea{color:var(--carbon)}
.ac.realce-linea::before{
  top:auto;bottom:-.06em;left:-.02em;right:-.02em;height:.13em;
  background:var(--placa-bg,var(--terracota));
  border-radius:.09em .05em .07em .04em;
  rotate:-.5deg;
  transform-origin:left center;
  transition:scale .72s var(--curva) .12s}
.js-rev .ac.realce-linea::before{scale:0 1}
.js-rev [data-rev].ver .ac.realce-linea::before,
.js-rev .ver .ac.realce-linea::before{scale:1 1}
@media (prefers-reduced-motion:reduce){
  .js-rev .ac.realce-linea::before{scale:1 1;transition:none}
}
/* 🔴 v5 — §cierre SALE DE AQUÍ por lo mismo que salió el valle en la v3.1: ya
   no es oscuro. El `--ac-claro` es un lima pensado para leerse sobre la noche;
   sobre papel mide 2.18 y reprueba. Su acento pasa a la PLACA de cobalto, que
   es el sistema que ya usan los otros seis titulares del sitio y trae su par
   fondo/texto medido. */

/* ── la rampa, aplicada ──────────────────────────────────────────────────── */
.bajada,.manifiesto .cuerpo,.suena .pregunta,.captura p,.espera p,
.pie a,.pie .lema{color:var(--tx-2)}
.quien,.pie-cifra,.nota,.pie .bajadita,.pie .firma,.pie h4,
.muestras .nombre-color,.elige .cabeza .q,
.via .lleva{color:var(--tx-3)}
/* `.voz .quien` SALE de esta rampa: es la firma de una reseña real, con nombre y
   país, y a tx-3 se leía a pie de foto. La distancia con la cita la da el tamaño
   y la caja —no más transparencia—, que es la misma regla que salió de la
   auditoría de tipografía. El nombre va a tx-1 y el lugar a tx-2 (ver más
   arriba, en el bloque de `.voz`). */
/* 🔴 Y estas dos también: `--tx-2c`/`--tx-3c` son la rampa de texto CLARO,
   crema al 74% y al 55%, hecha para fondo oscuro. Sobre la hoja no se leería
   nada. Los colores del cierre viven ahora en su propio bloque, en carbón. */

/* ── la escala, aplicada ─────────────────────────────────────────────────── */
.enc-numero .cifra{font-size:var(--t1)}
.manifiesto .grande{font-size:var(--t2)}
.titular,.valle .grande,.cierre .grande,.suena .cita,.elige .lead{font-size:var(--t3)}
.franja .titular{font-size:clamp(1.875rem,3.6vw,3.375rem)}
.captura h3,.espera h3,.pie .lema,.planner .precio{font-size:var(--t4)}
/* 🔴 `.voz p` BAJA de --t4 a --t5. Estaba en el escalón de subtítulos (hasta 34
   px) porque las citas eran de cuatro palabras de relleno. Con las reseñas de
   verdad —de 30 a 40 palabras, en columna de un tercio— 34 px daba diez
   renglones por tarjeta: la cita se volvía un muro y se dejaba de leer. Sigue
   siendo un escalón de la escala, no un número suelto. */
.bajada,.manifiesto .cuerpo,.cierre p,.voz p{font-size:var(--t5)}
.etiqueta,.quien,.pie-cifra,.valle .pie{font-size:var(--t6)}
/* La medida del manifiesto corría a 77 caracteres; lo cómodo es 60-70. */
.manifiesto .cuerpo{max-width:64ch}

/* ── 4 · EL HERO, al idioma del sitio ────────────────────────────────────────
   Era la ÚNICA pantalla que seguía en Cabinet Grotesk 500/800 mientras todo el
   resto corre en Gambetta 300 — y es la primera que se ve.
   El golpe deja de ser un peso 800 (que en serif ligera no existe) y pasa a
   CURSIVA: es el segundo registro de la marca, no un ladrillo. */
.frase{font-family:var(--serif);font-weight:300;font-size:var(--t3);
  line-height:1.06;letter-spacing:-.012em}
/* ═══ v3 · EL GOLPE — su logo convertido en titular ════════════════════════
   Su lockup es "i am" en manuscrita CHICA sobre READY TO BLOOM en geométrica
   de caja alta GRANDE. Ese contraste de registros es lo que ella llama
   "femenino", y hasta hoy solo existía en el pie de página.

   Aquí la frase entera va en la serif ligera y UNA palabra rompe a caja alta.
   El `0.82em` no es capricho: la altura de mayúscula de Lemon Milk contra la
   altura de x de Gambetta se dispara si comparten font-size, y la palabra
   acentuada se comería el renglón en vez de acentuarlo. Medir, no suponer. */
.frase .golpe{font-family:var(--display);font-weight:700;font-style:normal;
  font-size:0.82em;letter-spacing:.02em;color:var(--terracota)}
.apertura .texto{width:min(52%,45rem)}
/* 🔴 El titular del hero corría en `--t3`, que solo mira el ANCHO. A 1440 daba
   92 px y el bloque entero —titular, bajada y botones— medía 653 de los 820 de
   una laptop: el 80% de la pantalla. Por eso no cabía nada más.
   Un titular a sangre tiene que estar acotado por los DOS ejes. El `min()`
   hace que mande el lado que esté apretado: en monitor manda el ancho y no
   cambia nada; en laptop manda la altura y el titular cede lo justo. */
.apertura .frase{font-size:clamp(2.25rem,min(6.4vw,10.6vh),6rem)}
/* 🔴 `.apertura .texto` (0,2,0) le gana a `.texto` (0,1,0) de sitio.css, así que
   mi regla de ancho PISÓ el `width:auto` del celular y el titular se quedó en
   203 px de ancho. El override móvil tiene que igualar la especificidad. */
@media (max-width:768px){
  .apertura .texto{width:auto}
}

/* 🔴 v3.1 — ESTA REGLA SE VA, y es la misma trampa de siempre en este archivo.
   Existía porque el valle era carbón y su rótulo se había colado en la rampa
   oscura: quedaba carbón sobre carbón, 1.0. Al pasar el valle a crema edité la
   declaración de 700 líneas más arriba y no cambió NADA — ésta vive aquí abajo,
   gana por orden, y dejó el rótulo en crema sobre crema: **1.03**. Exactamente
   el mismo fallo que evitaba, en el otro sentido.
   La rampa clara la aplica ahora solo el cierre, que es el único fondo oscuro
   que queda. Verificado midiendo el color renderizado, no el archivo. */

/* ═══ LA CALIDAD DEL TEXTO — "se ven muy delgaditas y de poca calidad" ═════
   paco tiene razón y son DOS causas, las dos mías.

   🔴 CAUSA 1 · `-webkit-font-smoothing:antialiased` en el body.
   En macOS ADELGAZA el trazo: apaga el suavizado subpíxel y deja las letras
   más finas y menos sólidas de lo que la fuente dibuja. Sobre fondo CLARO eso
   es puro empobrecimiento. Se quita del sitio y se deja SOLO sobre fondo
   oscuro, que es donde sí sirve — ahí el texto claro se engorda y sin esto se
   ve embarrado.

   🔴 CAUSA 2 · Gambetta a peso 300 en tamaños grandes.
   Es una serif de CONTRASTE ALTO: sus trazos finos son muy finos. A 92 px el
   fino mide ~2 px y la letra se lee frágil, no ligera. Gambetta trae 400 con su
   cursiva, así que los titulares suben a 400 y conservan la cursiva del golpe.
   El peso 300 se queda SOLO donde el tamaño le da cuerpo al trazo fino: el
   manifiesto (130) y la cifra (216). */
body{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}
.valle,.cierre,.panel-movil{-webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale}

.titular,.suena .cita,.elige .lead,.valle .grande,.cierre .grande,
.frase,.captura h3,.espera h3,.voz p,.pie .lema,.planner .precio,
.via .nombre,.panel-movil a{font-weight:400}
.manifiesto .grande,.enc-numero .cifra{font-weight:300}
/* Peso 400 ⇒ el tracking cierra un pelo: a 300 abría para compensar el trazo. */
.titular,.suena .cita,.elige .lead,.valle .grande,.cierre .grande,.frase{
  letter-spacing:-.018em}

/* ── arreglos de composición que salieron en las capturas ────────────────── */
/* §3: con `max-width:15ch` a 92 px el lead se caía en una columna de DIEZ
   renglones pegada al margen izquierdo. La medida se fijó cuando el titular
   era de 50 px. */
.elige .lead{max-width:24ch}
.elige .cabeza{max-width:none}

/* Los Reels llevan el encabezado a la DERECHA y el adorno también vivía a la
   derecha: la onda amarilla caía encima del titular. Cuando el encabezado se
   va a la derecha, el adorno se va a la izquierda. */
.reels .adorno-sec{right:auto;left:var(--margen)}

/* En el encabezado partido la bajada colgaba del fondo del titular y se leía
   suelta. Se sube a su segunda línea y gana peso. */
.enc-partido{align-items:end}
.enc-partido .bajada{padding-bottom:.35em;font-size:1.0938rem;max-width:34ch}

/* ═══ LA LLEGADA DE LA BARRA — scrub, no interruptor ═══════════════════════
   La barra es sticky: entraba ya armada y se clavaba en el borde. No tenía
   animación ninguna, y por eso se sentía mecánica.

   Ahora todo cuelga de --n (0 → 1), que `barra.js` saca de cuánto le falta al
   ancla para tocar arriba. Va PEGADO al scroll —si te devuelves, se devuelve—
   que es justo lo que se siente premium y lo que un `transition` no puede dar:
   una transición corre a su propio tiempo y se despega del dedo.

   El reposo es --n:1 (compacta y todo visible): sin JS la barra se ve bien.  */
.nav{--n:1;
  /* Llega ALTA y se asienta: 21 px de aire arriba y abajo mientras viaja,
     12 al quedar pegada. Es la única "condensación" que hace falta. */
  padding:calc(1.3125rem - 0.5625rem * var(--n)) var(--margen);
  /* 🔴 v2 — ESTA es la regla que pinta la barra, no la del bloque de arriba.
     Aquélla la edité primero y no cambió NADA: ésta vive 2000 líneas más abajo,
     gana por orden y la barra se quedó en ARENA en las SIETE páginas. Tercera
     vez en la sesión que edito la perdedora. Antes de dar por bueno un cambio
     de color, medir el píxel renderizado, no el archivo.
     Va al papel, con la misma rampa de opacidad ligada al scroll. */
  background:rgba(246,244,235,calc(.42 + .5 * var(--n)));
  /* El desenfoque nace en cero: mientras la barra viaja no hay nada debajo que
     desenfocar, y encenderlo de golpe al pegarse es el brinco que se veía. */
  backdrop-filter:blur(calc(var(--n) * 16px));
  -webkit-backdrop-filter:blur(calc(var(--n) * 16px))}

/* 🔴 La barra no tenía canto: mientras viaja da igual, pero PEGADA es una
   superficie encima de otra y sin borde el contenido se le mete debajo sin que
   nada diga dónde termina. Eso es lo que se leía a "barra flotando".
   El canto entra con `--n`, igual que el desenfoque: nace en cero mientras
   viaja y queda puesto justo al asentarse. Y son DOS trazos —una luz arriba y
   una sombra abajo—, que es lo que hace que se lea a canto de papel y no a
   raya dibujada. Va en `box-shadow` y no en `border`: un borde le sumaría un
   píxel al alto y movería el `scroll-margin` de las siete secciones. */
.nav{box-shadow:
  inset 0 1px 0 rgba(255,255,255,calc(.5 * var(--n))),
  0 1px 0 rgba(44,44,44,calc(.09 * var(--n))),
  0 14px 26px -22px rgba(44,44,44,calc(.55 * var(--n)))}
/* 🔴 La marca de la barra se dimensionaba por ANCHO y el `<svg>` de dentro no
   tenía regla ninguna: el enlace medía 38 y el dibujo salía en 34×48.9,
   flotando dentro de una caja de 64.9. O sea que el alto de la barra —lo único
   que de verdad importa en algo pegado arriba— no lo mandaba nadie.
   El isotipo es de PIE (1.44 más alto que ancho), así que se manda por ALTO:
   así la barra mide exactamente lo que uno decide.

   🔴 Y el ancho va ESCRITO, no en `auto`: con `width:auto` en el enlace y
   `max-width:100%` en el svg (regla global) las dos medidas se piden la una a
   la otra y colapsan — medido, el dibujo se quedaba en 24 px dentro de una
   caja de 40. La proporción del isotipo (.695) se declara y se acabó. */
/* 🔴 EL LOGO DE LA BARRA ES EL LOCKUP, NO LA "B". Ella lo pidió por escrito en el
   portal: "el logo principal quiero que sea la palabra completa I AM READY TO
   BLOOM" y la B "usarla en demás espacios y como favicon". Estaba al revés.

   Y por eso la barra CRECE: el lockup es un bloque de TRES renglones y su alto
   se reparte entre los tres. Medido sobre la máscara del PNG, las bandas de
   tinta ocupan 30.9% la manuscrita, 25.2% "READY TO" y 33.6% "BLOOM". O sea que
   a los 40 px que medía el isotipo, "READY TO" caía a 10 px de caja alta y a los
   34 de la barra asentada a 8.6 — ilegible. A 56/50 quedan 14.1 y 12.6, que es
   donde empieza a leerse. Se manda por ALTO igual que antes: es lo único que
   fija el alto de algo pegado arriba.
   Proporción medida en el archivo vectorizado: 1166/783 = 1.489. */
.nav{--firma-h:calc(3.5rem - 0.375rem * var(--n))}
/* 🔴 Y `padding:0` porque el isotipo ES un `<a>`: heredaba los `0.5rem 2px` de
   `.nav a` y, con `box-sizing:border-box`, esos 16 px se le comían al dibujo
   casi la mitad del alto. Medido: caja de 34, dibujo de 18. */
.nav .firma-nav{display:block;flex:none;padding:0;
  height:var(--firma-h);width:calc(var(--firma-h) * 1.489)}
.nav .firma-nav svg{width:100%;height:100%;max-width:none}

/* Los renglones entran ESCALONADOS con el propio scroll, no con un delay:
   cada uno tiene su tramo del recorrido (--i) y su progreso local (--l). Un
   `transition-delay` correría solo; esto va con el dedo.
   Si el navegador no entiende el clamp, --l no resuelve y cae en el valor
   inicial: opacidad 1 y sin desplazamiento. Se degrada a visible, nunca a
   invisible. */
.nav ul li,.nav .acciones > *{
  --i:0;
  /* Cada renglón ocupa un TRAMO del recorrido: arranca en --i × .075 y tarda
     .34 en llegar (de ahí el 2.94 = 1/.34). Así los siete entran en cascada
     mientras la barra sube, y el último queda puesto antes de que se pegue. */
  --l:clamp(0, calc((var(--n) - var(--i) * .075) * 2.94), 1);
  opacity:var(--l);
  translate:0 calc((1 - var(--l)) * 10px)}
.nav ul li:nth-child(1){--i:0}   .nav ul li:nth-child(2){--i:1}
.nav ul li:nth-child(3){--i:2}   .nav ul li:nth-child(4){--i:3}
.nav ul li:nth-child(5){--i:4}   .nav ul li:nth-child(6){--i:5}
.nav ul li:nth-child(7){--i:6}
.nav .acciones > :nth-child(1){--i:6.4} .nav .acciones > :nth-child(2){--i:6.7}
.nav .acciones > :nth-child(3){--i:7}   .nav .acciones > :nth-child(4){--i:7}

/* En celular no hay siete renglones que escalonar: la barra solo enseña el
   isotipo, el carrito y el menú. Con los tramos de escritorio esos dos llegaban
   al 63% del recorrido y la barra subía CASI VACÍA media pantalla. Aquí la
   cascada se comprime al primer tercio. */
@media (max-width:768px){
  .nav .acciones > :nth-child(3){--i:.6}
  .nav .acciones > :nth-child(4){--i:1.2}
}

@media (prefers-reduced-motion:reduce){
  .nav{--n:1}
  .nav ul li,.nav .acciones > *{opacity:1;translate:0}
}

/* ═══ §2 · LA CITA — LA SUPERFICIE Y EL TRAZO ══════════════════════════════
   paco: "que no sea full texto, más premium". Medido en las ocho referencias
   capturadas: atributos de paralaje 0 en las OCHO y reveals 0 en siete. Más
   animación no es la palanca — ya corremos con más movimiento que kinfolk,
   graza, chief, papier o intelligentchange. Lo que ellas tienen y esto no son
   IMÁGENES: intelligentchange 106, graza 74, kinfolk 67, papier 65, ban.do 34.
   Aquí había CERO en 210vh, o sea dos pantallas de texto sobre crema plana.
   Entonces lo que entra es SUPERFICIE, y un solo movimiento nuevo que sea el
   clímax de la sección.                                                     */

.suena .pega{place-content:center;isolation:isolate;
  /* La barra pegada mide 77 px: sin este colchón la lámina la toca. */
  padding:6rem var(--margen) 2.75rem;
  /* 🔴 Con `place-content:center` la columna se dimensiona al CONTENIDO, así que
     un `width:100%` adentro se vuelve circular y colapsa: la lámina se quedó en
     903 px en vez de 1080. La columna se declara explícita. */
  grid-template-columns:minmax(0,1fr)}

/* ── la lámina ───────────────────────────────────────────────────────────── */
.suena .lamina{position:relative;z-index:1;isolation:isolate;overflow:hidden;
  background:var(--sup);border-radius:var(--radio);
  width:min(1080px,100%);margin-inline:auto;
  /* 🔴 El aire vertical se mide contra la PANTALLA, no contra el ancho: con
     clamp(38,5.4vw,86) la lámina medía ~815 px dentro de un sticky de 900 y
     quedaba pegada a la barra arriba. Cuatro renglones de cita a 92 px ya son
     405 px; el resto del alto es lo único negociable. */
  padding:clamp(1.75rem,3.4vw,3.375rem) clamp(1.625rem,4.6vw,4.625rem) clamp(1.625rem,3.2vw,3rem);
  /* Llega ladeada y se ASIENTA con el propio scroll: una hoja que alguien acaba
     de poner sobre la mesa. Es el único movimiento de la lámina. */
  rotate:calc((1 - var(--p)) * -1.15deg);
  scale:calc(.984 + var(--p) * .016)}

/* La fibra del papel, volteada y ampliada para que no se lea como la MISMA
   toma que ya trae el manifiesto.

   🔴 EL FILTRO NO ES ESTÉTICA, ES CONTRASTE. La foto tiene fibras de
   luminancia 14 sobre una mediana de 218: sombras muy oscuras y muy puntuales.
   Multiplicadas al 42% sobre la arena, el peor píxel dejaba el texto carbón en
   3.96 —reprueba para la pregunta, que a 19 px pide 4.5— y el acento oliva en
   1.98, que reprueba incluso el piso de 3.0 de texto grande.
   🔴 Y `contrast(.20)` fue la sobrecorrección: aplasta todo hacia el gris medio
   y la lámina bajaba a 193 —un bloque sucio, más oscuro que la arena— aunque el
   contraste pasara. El ajuste se buscó contra TRES medidas a la vez, no una:
   que la lámina no se ensucie (queda en 229 contra los 231 de la arena), que la
   fibra se siga viendo (rango 32 niveles) y que el peor píxel aguante.
   Medido con estos valores: carbón 7.43 y oliva 3.72. El piso de texto grande
   es 3.0 y el de la pregunta, a 19 px, es 4.5. */
.suena .fibra{position:absolute;inset:0;z-index:0;width:100%;height:100%;
  object-fit:cover;opacity:.24;mix-blend-mode:multiply;
  filter:contrast(.60) brightness(1.35);
  transform:scaleX(-1) scale(1.35);pointer-events:none}
.suena .pregunta,.suena .cita,.suena .firma{position:relative;z-index:1}

/* ── las palabras: suben desde su máscara ────────────────────────────────── */
/* Antes solo encendían de .16 a 1: una sola dimensión. Ahora entran como entra
   la frase del hero —desde detrás de su propia máscara—, así que es el
   vocabulario del sitio y no un efecto prestado.
   🔴 La máscara necesita aire ABAJO y a la DERECHA: Gambetta cursiva a 92 px
   cuelga la 'g' y se sale por la derecha, y con overflow:hidden a ras se
   recortan las dos. El padding se compensa con margen negativo para que la
   caja no cambie de tamaño. */
.suena .w{display:inline-block;overflow:hidden;
  padding:0 .1em .12em 0;margin:0 -.1em -.12em 0}
/* 🔴 El escondido va detrás de `.js` —la clase que pone el MISMO script que
   luego enciende las palabras—, igual que el resto del sitio hace con
   `.js-rev`. Sin esa condición, si el JS no carga la cita se queda invisible
   para siempre: el reposo tiene que ser el estado completo. */
.suena .w i{display:inline-block;font-style:inherit}
.js .suena .w i{translate:0 108%;opacity:0}
.suena .w.on i{translate:0 0;opacity:1;
  transition:translate .62s var(--curva), opacity .5s var(--curva)}
.suena .w.ac{position:relative;color:var(--ac-oliva)}

/* ── el trazo bajo la palabra que carga el sentido ───────────────────────── */
/* El clímax de la sección. El largo se MIDE con getTotalLength (a ojo el trazo
   sale cortado o con un salto al final) y el dibujado va colgado de --p: se
   traza mientras bajas, no en un tiempo suyo. Tramo .74 → .90 del recorrido,
   o sea después de que la última palabra ya está puesta. */
.suena .subraya{position:absolute;left:-2%;right:-2%;bottom:-.06em;
  width:104%;height:auto;overflow:visible;pointer-events:none}
.suena .subraya path{fill:none;stroke:var(--ac-oliva);stroke-width:7;
  stroke-linecap:round}
.js .suena .subraya path{
  --t:clamp(0, calc((var(--p) - .72) * 5.55), 1);
  stroke-dasharray:var(--largo,300);
  stroke-dashoffset:calc(var(--largo,300) * (1 - var(--t)))}

/* ── la firma ────────────────────────────────────────────────────────────── */
/* Un renglón de versalitas es la parte genérica. Firma con su isotipo, que ya
   existe en vector y hasta ahora solo vivía en el encabezado. */
.suena .firma{margin-top:clamp(1.25rem,2.4vw,2.125rem);
  display:flex;align-items:center;justify-content:center;gap:0.75rem;
  font:500 0.8125rem/1 var(--cuerpo);letter-spacing:.14em;text-transform:uppercase;
  color:var(--tx-3)}
.suena .iso-firma{width:20px;height:29px;color:var(--coral);flex:none}

/* ── las pegatinas ───────────────────────────────────────────────────────── */
/* Puntuación, no protagonistas: chicas, en el aire de alrededor y NUNCA sobre
   la lámina. Se mueven con --p porque el paralaje por rect se congela dentro
   de un sticky. */
.suena .ad{position:absolute;z-index:0;pointer-events:none;
  width:clamp(52px,5.4vw,92px)}
.suena .a1{top:6%;left:4%;rotate:-13deg;
  translate:0 calc(var(--p) * -54px)}
.suena .a2{bottom:11%;right:5%;rotate:10deg;
  translate:0 calc(var(--p) * -34px)}
.suena .a3{top:16%;right:9%;rotate:7deg;width:clamp(34px,3.4vw,58px);
  translate:0 calc(var(--p) * -78px)}

@media (max-width:860px){
  .suena .lamina{border-radius:1.25rem;
    padding:1.875rem 1.375rem 1.75rem;width:100%}
  /* A 3% la onda caía DETRÁS de la barra pegada, que mide 77 px. Y las piezas
     que asomaban por el margen (-2% / -3%) empujaban el ancho del documento:
     en celular se quedan dentro. */
  .suena .a1{top:16%;left:2%}
  .suena .a2{bottom:6%;right:2%}
  .suena .a3{display:none}     /* a este ancho cae sobre la lámina */
}

@media (prefers-reduced-motion:reduce){
  .suena .lamina{rotate:0deg;scale:1}
  .suena .w i{translate:0;opacity:1}
  .suena .ad{translate:0}
  .js .suena .subraya path{stroke-dashoffset:0}
}

/* 🔴 `?”` se quedó HUÉRFANO en un cuarto renglón él solo. Las máscaras cierran
   un pelo cada palabra, así que "eligiendo" subió al tercer renglón y dejó el
   cierre abajo. Los dos van pegados: el signo pertenece a la palabra. */
/* 🔴 `.par` ESTÁ DEFINIDA DOS VECES Y SIGNIFICAN COSAS DISTINTAS.
   Aquí es el envoltorio que mantiene JUNTAS dos palabras de la cita (de "par",
   pareja). Más abajo, en la línea ~3395, `.par{display:grid;
   grid-template-columns:1fr 1fr}` es una maquetación de dos columnas de otra
   sección — y como va DESPUÉS en el archivo, ganaba también aquí.

   Consecuencia medida: la pareja se volvía una rejilla de dos mitades de 397 px,
   así que "eligiendo" (333 px de texto) se quedaba en una columna 64 px más
   ancha y el `?”` se iba a la otra mitad. Ése es el hueco enorme entre la
   palabra y el signo — no era un margen mal puesto ni el SVG del subrayado
   (verificado ocultándolo: el ancho no cambia).

   Se declara el display explícitamente en vez de renombrar: `.par` de §suena
   la usa el JS de esa sección para agrupar, y renombrar rompería el guion.
   Sexta colisión de nombre de la sesión, y la primera que ya venía de antes. */
.suena .par{display:inline;white-space:nowrap}

/* ═══ LOS VIDEOS — sus Reels de verdad ═════════════════════════════════════
   Bajados de @iamreadytobloom.mx con el navegador de investigación. NO arrancan
   solos y NO se cargan hasta que los tocas: `preload="none"` significa que la
   página no pide un solo byte de video hasta el clic. Un Reel pesa entre 0.5 y
   3.3 MB — precargarlos arruinaría la primera pantalla.

   ⚠️ Dos de los cuatro SOLO existen en 360×640 del lado de Instagram (su
   manifiesto no publica otra calidad). En una tarjeta de 303 px eso es 0.6× de
   lo que pide una pantalla retina: hacen falta los originales de ella.

   El clip que vivía en la cita SE QUITÓ. La sección es un momento tipográfico y
   el video se leía a pegote; además el que teníamos ni siquiera era el Reel de
   esa frase. El archivo queda en assets/video/marisa-habla.mp4 por si vuelve. */
.reel .marco .clip{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;background:var(--sup)}
.reel .marco .dur{position:absolute;right:12px;bottom:12px;
  padding:0.3125rem 0.625rem;border-radius:var(--pildora);
  background:rgba(44,44,44,.62);color:var(--crema);
  font:600 0.6875rem/1 var(--cuerpo);letter-spacing:.06em}
.reel .marco.sonando .play,.reel .marco.sonando .dur{opacity:0;pointer-events:none}
.reel .marco .play,.reel .marco .dur{transition:opacity .3s var(--curva)}
.reel .marco.sonando:hover .play{opacity:1;pointer-events:auto}

/* ── LA OJEADA: el muro se mueve solo, en silencio ─────────────────────────
   La sección se llama "En movimiento" y hasta aquí era el bloque más quieto de
   la página: cuatro pósters parados y cuatro discos blancos idénticos. Ahora
   cada marco corre un bucle mudo de 4 s en cuanto entra a cuadro, y la voz
   sigue detrás del clic. Es la mecánica de Tolstoy (`autoplay muted loop
   preload=none`), que es el estándar del video comprable.

   El elemento NO está en el HTML: lo crea `videos.js`. Así, sin JS —o con
   movimiento reducido, o con ahorro de datos— nunca se pide un solo byte y se
   queda el póster, que es exactamente lo que había antes.

   Peso: 716 KB los cuatro bucles, contra los 8.7 MB de los videos completos.
   Ese es el número que hace que esto se pueda encender de entrada.           */
.reel .marco .ojeada{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;pointer-events:none;   /* el clic lo sigue recibiendo .clip */
  opacity:0;transition:opacity .7s var(--curva)}
.reel .marco.ojeando .ojeada{opacity:1}
/* Al pedir la voz, la ojeada se va de inmediato: dos versiones del mismo plano
   fundiéndose una sobre otra se ve a error, no a transición. */
.reel .marco.sonando .ojeada{opacity:0;transition-duration:.18s}

/* ── QoL 1 · EL AVANCE ──────────────────────────────────────────────────────
   Una línea de 3 px abajo. Sin esto no hay forma de saber si faltan cinco
   segundos o cincuenta — y uno de los Reels dura 55 s, casi el triple que los
   otros tres. Va con `scaleX` (compositor) y no con `width`, que dispara
   reflow 24 veces por segundo. */
.reel .marco .avance{position:absolute;left:0;right:0;bottom:0;height:3px;
  background:rgba(44,44,44,.28);opacity:0;transition:opacity .3s var(--curva)}
.reel .marco.sonando .avance{opacity:1}
.reel .marco .avance i{display:block;height:100%;background:var(--sup);
  transform-origin:left;transform:scaleX(var(--av,0))}

/* ── QoL 2 · EL SILENCIO ────────────────────────────────────────────────────
   Son videos donde ella habla, así que arrancan con voz. Pero "suena y lo único
   que puedo hacer es cerrarlo" es de las cosas que hacen abandonar una página:
   tiene que poderse callar SIN perder el video. Aparece solo mientras suena. */
.reel .marco .mudo{position:absolute;top:12px;right:12px;z-index:2;
  width:38px;height:38px;border:0;border-radius:50%;cursor:pointer;
  display:grid;place-items:center;padding:0;
  background:rgba(44,44,44,.62);color:var(--crema);
  opacity:0;pointer-events:none;transition:opacity .3s var(--curva),transform .3s var(--curva)}
.reel .marco.sonando .mudo{opacity:1;pointer-events:auto}
.reel .marco .mudo:hover{transform:scale(1.08)}
.reel .marco .mudo .ico{width:19px;height:19px}
@media (max-width:760px){
  /* 44 px es el mínimo táctil; a 38 se falla el objetivo la mitad de las veces. */
  .reel .marco .mudo{width:44px;height:44px;top:10px;right:10px}
  /* 🔴 El "Agregar" medía 36 de alto: es el ÚNICO botón de venta de la sección
     y era el peor de tocar. Medido, no supuesto. */
  .compra-una .btn{min-height:44px}
}

/* ── QoL 3 · EL FOCO ────────────────────────────────────────────────────────
   El botón de play sale de un `<button>` real y se puede llegar con Tab, pero
   sin anillo visible eso no le sirve a nadie: se ve el mismo disco enfocado o
   no. `focus-visible` no molesta al ratón. */
.reel .marco .play:focus-visible,
.reel .marco .mudo:focus-visible{outline:3px solid var(--carbon);outline-offset:3px}

/* ── EL DEDO: la fila arrastrable dice DÓNDE VAS ───────────────────────────
   En celular la fila de Reels arrastra, y hasta ahora la única pista era que se
   asomaba un pedazo del siguiente. Cuatro rayas debajo dicen cuántos hay y en
   cuál estás — la información que en escritorio da el simple hecho de verlos
   todos. Solo existe en celular: en escritorio sería un adorno mintiendo.    */
/* ── LA SALIDA A SU INSTAGRAM ───────────────────────────────────────────────
   Alineada a la derecha para caer bajo el mismo eje que el titular partido de
   la sección, que también vive a la derecha. La arroba pesa MENOS que la
   invitación: lo que se ofrece es "hay más", el handle es el dato.           */
/* `flex` (de bloque), NO `inline-flex`: el `margin-left:auto` que lo empuja a
   la derecha solo funciona en un elemento de bloque. */
.mas-ig{display:flex;align-items:center;gap:0.75rem;
  margin:0 0 0 auto;width:fit-content;
  padding:0.75rem 0.25rem;text-decoration:none;color:var(--carbon);
  font:500 0.9375rem/1 var(--cuerpo)}
/* .62 daba 3.79 sobre la menta de la sección: reprueba. .78 lo sube a 5.4 y
   sigue pesando menos que la invitación, que es lo que se quería. */
.mas-ig .ig-arroba{font-weight:400;color:rgba(44,44,44,.78);
  transition:color .3s var(--curva)}
.mas-ig .ico{width:19px;height:19px;
  transition:transform .4s var(--curva)}
.mas-ig:hover .ico{transform:translateX(5px)}
.mas-ig:hover .ig-arroba{color:var(--carbon)}
/* El subrayado va SOLO en la invitación, no en la arroba ni en la flecha:
   subrayar el bloque entero arrastra el icono y se ve a error de maquetación. */
.mas-ig .ig-tx{background-image:linear-gradient(currentColor,currentColor);
  background-repeat:no-repeat;background-position:0 100%;
  background-size:0 1px;transition:background-size .45s var(--curva)}
.mas-ig:hover .ig-tx,.mas-ig:focus-visible .ig-tx{background-size:100% 1px}
.mas-ig:focus-visible{outline:3px solid var(--carbon);outline-offset:3px;border-radius:0.375rem}

.reels .puntos{display:none}
@media (max-width:760px){
  .reels .puntos{display:flex;gap:0.4375rem;justify-content:center;
    margin-top:1.375rem;padding:0 var(--margen)}
  .reels .puntos i{display:block;width:22px;height:3px;border-radius:2px;
    background:rgba(44,44,44,.22);
    transition:background-color .35s var(--curva), width .35s var(--curva)}
  .reels .puntos i.aqui{width:34px;background:var(--carbon)}
  /* En celular el pie se apila: la tarjeta a lo ancho y el enlace debajo. Los
     dos en un renglón de 390 px dejaban el "Agregar" en 60 px de ancho. */
  /* El enlace a la biblioteca medía 21 px de alto metido en el renglón. Como
     enlace dentro de una frase la norma lo exime del mínimo táctil, pero es la
     única puerta a la biblioteca desde este tile: baja a su propio renglón y
     toma los 44. */
  .pie-reel a{display:flex;width:fit-content;margin-top:0.3125rem;
    min-height:44px;align-items:center}
  .pie-fila{flex-direction:column;align-items:stretch;gap:0.875rem;margin-top:1.5rem}
  .compra-una{justify-content:space-between}
  .compra-una .btn{margin-left:0}
  /* En celular se centra: a la derecha, con la fila a sangre, quedaba pegado al
     borde. Y la arroba baja a su propio renglón — las dos juntas no caben en
     390 px sin encogerlas por debajo de lo legible. */
  /* Centrado solo el de §5, que va SOLO debajo de su tarjeta. El de §8 son dos
     enlaces seguidos y centrarlos los deja bailando uno sobre otro; ese se queda
     alineado a la izquierda, con su regla en el bloque de celular de §8. */
  .reels .mas-ig{margin:0.25rem auto 0;flex-wrap:wrap;justify-content:center;
    text-align:center;row-gap:2px;min-height:44px}
  /* La flecha sube al PRIMER renglón, pegada a la invitación. Dejándola en el
     orden del marcado se iba sola a un tercer renglón: tres renglones para un
     enlace de seis palabras se lee a lista, no a invitación. */
  .mas-ig .ico{order:2}
  .mas-ig .ig-arroba{order:3;flex-basis:100%}
}

@media (prefers-reduced-motion:reduce){
  /* El bucle ni se crea (lo corta el JS), pero si algo llegara a colarse aquí
     se apaga la transición: lo que no se puede es que aparezca de golpe. */
  .reel .marco .ojeada{transition:none}
  .reels .puntos i{transition:none}
}

/* ═══ LAS PÁGINAS INTERIORES ═══════════════════════════════════════════════
   Hasta hoy el sitio era UNA página con doce secciones y un menú de siete
   renglones que eran siete anclas al mismo lugar: el menú prometía siete
   destinos y entregaba uno. Medido antes de tocar: 19 enlaces en `href="#"`.
   Ahora cada renglón del menú es una página de verdad.

   En las interiores NO hay `.nav-ancla`, así que `barra.js` sale temprano y
   `--n` se queda en su reposo del CSS (1): la barra nace compacta, con su canto
   puesto, sin recorrido que hacer. Cero JS nuevo.                            */

/* La cabecera de una página interior hace el trabajo que en el inicio hace la
   escena: dice dónde estás antes de cualquier contenido. Es tipografía y tono,
   no una foto — así ninguna página depende de material que no tenemos. */
.enc-pagina{position:relative;isolation:isolate;overflow:hidden;
  background:var(--fondo,var(--crema));
  padding:calc(var(--hueco) * .8) var(--margen) calc(var(--hueco) * .62)}
/* La cabecera es la primera franja de color de la página: si es la única sin
   grano, se nota justo donde más se mira. */
.enc-pagina > .ancho{position:relative;z-index:1}
.enc-pagina .etiqueta{background:var(--sup);margin-bottom:1.375rem}
.enc-pagina .titular{max-width:16ch}
.enc-pagina .bajada{margin-top:1.25rem;max-width:52ch;font-size:1.125rem;line-height:1.6;
  color:var(--tx-2)}
@media (max-width:768px){
  .enc-pagina .titular{max-width:none}
}

/* El renglón del menú de la página donde estás. No basta con el color: se
   marca con el mismo trazo que usa el hover, pero puesto. */
.nav nav a[aria-current=page]{color:var(--carbon);background-size:100% 1px}

/* ── EL PLANO DE OBRA ───────────────────────────────────────────────────────
   🔴 ANDAMIO. No es la página: es la lista de lo que va a llevar, con el
   material que ya existe y el que falta. Lleva su propio aviso arriba y se
   borra entero (esta regla y sus `<section class="plano">`) antes de enseñarle
   nada a la clienta. Está aquí para que el sitio completo se pueda recorrer hoy
   y se vea qué falta, no para publicarse. */
.plano{background:repeating-linear-gradient(-45deg,
  rgba(44,44,44,.035) 0 2px,transparent 2px 11px),var(--arena)}
.plano .aviso{margin:0 0 1.625rem;padding:0.6875rem 1.125rem;border-radius:var(--radio-chico);
  background:var(--carbon);color:var(--crema);
  font:500 0.7812rem/1.4 var(--cuerpo);letter-spacing:.04em}
.plano .bloques{list-style:none;margin:0;padding:0;display:grid;gap:0.625rem}
.plano .bloque{display:flex;align-items:flex-start;gap:1rem;
  padding:1rem 1.25rem;border-radius:var(--radio-chico);background:var(--sup);
  box-shadow:inset 0 0 0 1px rgba(44,44,44,.08)}
.plano .num{flex:none;font:600 0.75rem/1.5 var(--cuerpo);letter-spacing:.1em;
  color:var(--tx-3)}
.plano .bloque b{display:block;font:500 1rem/1.3 var(--cuerpo);color:var(--carbon)}
.plano .bloque span{display:block;margin-top:0.3125rem;
  font:400 0.875rem/1.5 var(--cuerpo);color:var(--tx-2)}
/* El estado se lee por el filo izquierdo, no por un badge de colores: verde =
   el material existe, ámbar = a medias, coral = bloqueado por ella. */
.plano .bloque{border-left:4px solid var(--tx-3)}
/* 🔴 `b-` delante a propósito: `.falta` YA EXISTE en esta hoja (es el hueco de
   foto, con su display:grid y su fondo rayado). Un `.plano .falta` habría
   heredado los dos en silencio. Mismo error que el gancho `data-*` genérico:
   el nombre corto colisiona y no avisa. */
.plano .b-listo{border-left-color:var(--ac-oliva)}
.plano .b-medio{border-left-color:var(--ac-amarillo)}
.plano .b-falta{border-left-color:var(--ac-coral)}

/* ═══ BLOOM LIBRARY ════════════════════════════════════════════════════════
   El propósito de esta página no es vender: es JUNTAR LA LISTA antes de que
   arranque su temporada (vende sep–ene; esto se construyó en agosto). Y es
   donde su promesa —"somos un movimiento, no una marca"— se vuelve
   comprobable: catorce prácticas suyas, completas y gratis.
   La escalera es la de glucosegoddess, su propia referencia, medida en vivo:
   3 productos contra 16+ páginas de contenido gratis.                        */

/* ── la puerta ───────────────────────────────────────────────────────────── */
.puerta-caja{display:grid;grid-template-columns:1.05fr .95fr;
  gap:clamp(1.75rem,4vw,4rem);align-items:center}
.puerta-tx .titular{max-width:14ch}
.puerta-tx .bajada{margin-top:1.125rem;max-width:44ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}
.puerta-tx .forma{margin-top:1.875rem;max-width:30rem}
.puerta-obj{aspect-ratio:4/3;border-radius:var(--radio)}

/* ── el estante ──────────────────────────────────────────────────────────── */
.estanteria .bajada{margin-top:1rem;max-width:48ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}

/* Los ánimos son PÍLDORAS, como todo lo que se toca en esta marca. El activo no
   se distingue por un borde: se INVIERTE — es el mismo gesto del pozo de los
   botones, para que la página no invente vocabulario nuevo. */
.animos{display:flex;flex-wrap:wrap;gap:0.5625rem;margin:2.125rem 0 0}
.animo{font:500 0.875rem/1 var(--cuerpo);letter-spacing:.004em;cursor:pointer;
  padding:0.75rem 1.25rem;border:0;border-radius:var(--pildora);
  background:color-mix(in oklch,var(--carbon) 7%,transparent);color:var(--tx-1);
  transition:background-color .34s var(--curva),color .34s var(--curva),
             transform .34s var(--curva)}
.animo:hover{background:color-mix(in oklch,var(--carbon) 13%,transparent)}
.animo.activo{background:var(--carbon);color:var(--crema)}
.animo:active{transform:scale(.97);transition-duration:.11s}
.animo:focus-visible{outline:3px solid var(--carbon);outline-offset:3px}

.estante{list-style:none;margin:2.375rem 0 0;padding:0;display:grid;
  grid-template-columns:repeat(4,1fr);gap:clamp(1rem,1.8vw,1.625rem)}
.pieza{margin:0;transition:scale .5s var(--curva)}

/* Las que no aplican no desaparecen: se van al FONDO del estante. La biblioteca
   siempre se ve llena — lo que cambia es el orden, no el tamaño.

   🔴 Y lo que se apaga es LA PORTADA, NUNCA EL TEXTO. Primera versión: la
   tarjeta entera a `opacity:.42`. Medido pintando el píxel sobre arena, el
   rótulo de menta caía a 1.74 y la duración a 1.62 — y siguen siendo ENLACES,
   así que es texto interactivo ilegible. Probé subiendo la opacidad: ni a .8
   pasa (menta 3.19, duración 2.73). **Atenuar una tarjeta completa es
   incompatible con texto accesible**, punto: no hay valor que sirva.
   Entonces el gesto se muda a la imagen —que no lleva información— y el papel
   se hunde un pelo. El texto se queda íntegro en 4.6-10.8. */
.pieza .portada{transition:transform .5s var(--curva),box-shadow .5s var(--curva),
                opacity .5s var(--curva)}
.pieza.atras{scale:.972}
.pieza.atras .portada{opacity:.45}
.pieza.atras:hover,.pieza.atras:focus-within{scale:1}
.pieza.atras:hover .portada,.pieza.atras:focus-within .portada{opacity:1}
.pieza a{display:block;text-decoration:none;color:var(--carbon)}

/* ── LA PORTADA: PAPEL, NO RECTÁNGULO ─────────────────────────────────────
   Las miniaturas son SUYAS, con todo y el rosa viejo de algunas: es su
   contenido y decisión de paco. Lo que sí controlamos es cómo se apoyan.

   La profundidad NO sale de una sombra difusa alrededor —eso es el truco de
   tarjeta flotante que se ve en cualquier plantilla—: sale de que la portada
   sea una LÁMINA sobre el papel. Tres cosas la construyen y ninguna cuesta
   layout: un canto claro arriba (la luz), una sombra CORTA y baja (el apoyo) y
   un forro del tono de la marca que asoma un pelo por debajo, como cuando una
   foto está pegada sobre una cartulina de color.
   16:9 y no 4:3: el material es video, y recortar sus miniaturas a cuadro le
   corta la cara o el título quemado a la mitad. */
.pieza .portada{position:relative;display:block;overflow:hidden;
  aspect-ratio:16/9;border-radius:var(--radio-chico);
  /* v2 — la tarjeta iba tintada al 22% del color de su tipo de contenido: un
     rectángulo pálido detrás de cada miniatura. La miniatura ya trae su propio
     color y es lo que hay que mirar; el tinte solo asomaba como un marco
     lavado. El tipo se sigue distinguiendo por su rótulo, que va a saturación. */
  background:var(--sup);
  /* La sombra medida antes (`0 8px 14px -12px`) no llegaba a existir: el radio
     negativo se la comía. Ahora son las TRES de un objeto apoyado —canto claro
     arriba, línea de contacto pegada, y una sombra corta que cae hacia abajo
     porque la luz de la sección viene de arriba—. La dirección de esta sombra y
     la del troquel son la MISMA: una sola fuente para toda la página. */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.55),
    0 1px 1px rgba(44,44,44,.13),
    0 10px 18px -10px rgba(44,44,44,.30)}
.pieza .portada img{width:100%;height:100%;object-fit:cover;display:block;
  /* La foto se separa 3 px del canto para que se vea el forro de color: es lo
     que convierte una miniatura prestada en una pieza de ESTE sitio. */
  border-radius:calc(var(--radio-chico) - 3px);
  transform:scale(.978);
  /* 🔴 EL ROSA. Catorce miniaturas de su etapa anterior, y su rebranding entero
     se resume en "quitar el rosa": el bloque más grande de la página era una
     PARED de rosa sobre arena. Ése era el "se ve rara", no la textura.
     Se quedan todas —es su contenido, y eso ya se decidió—, pero en reposo
     entran al mundo nuevo: un punto de desaturación y un pelo de calidez las
     acerca a la arena sin apagarlas. Al pasar el cursor o al enfocar con el
     teclado vuelven a color pleno, así que **nada se esconde**: se ordena.
     Es lo mismo que hace una sala de exposición al enmarcar en passe-partout
     obras de épocas distintas — no las repinta, las reconcilia. */
  filter:saturate(.82) sepia(.06) contrast(1.02);
  transition:transform .5s var(--curva),filter .5s var(--curva)}
.pieza a:hover .portada img,
.pieza a:focus-visible .portada img{filter:none}

/* La lupa de reproducir vive DENTRO de la portada y solo despierta al pasar.
   Un botón de play permanente encima de 14 miniaturas satura; al pasar, dice
   "esto se abre aquí" justo cuando hace falta saberlo. */
.pieza .lupa{position:absolute;left:50%;top:50%;width:52px;height:52px;
  margin:-26px 0 0 -26px;border-radius:50%;display:grid;place-items:center;
  background:rgba(250,247,240,.92);color:var(--carbon);
  opacity:0;scale:.72;
  transition:opacity .38s var(--curva),scale .38s var(--curva);
  box-shadow:0 6px 18px -8px rgba(44,44,44,.6)}
.pieza .lupa svg{width:24px;height:24px}
.pieza a:hover .lupa,.pieza a:focus-visible .lupa{opacity:1;scale:1}
.pieza a:hover .portada img,.pieza a:focus-visible .portada img{transform:scale(1.03)}
.pieza a:hover .portada,.pieza a:focus-visible .portada{
  transform:translateY(-5px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.5),
    0 2px 0 rgba(44,44,44,.10),
    0 22px 32px -20px rgba(44,44,44,.62)}
.pieza a:focus-visible{outline:3px solid var(--carbon);outline-offset:4px;
  border-radius:var(--radio-chico)}

.pieza .pie{display:block;padding:0.875rem 2px 0;
  /* El filo del tipo va arriba del pie y no alrededor de la tarjeta: marca sin
     encerrar, que es como esta marca usa el color. */
  border-top:2px solid var(--tipo,var(--ac-oliva))}
.pieza .tipo{display:block;font:500 0.6875rem/1 var(--cuerpo);letter-spacing:.13em;
  text-transform:uppercase;color:var(--tipo,var(--ac-oliva))}
.pieza .tit{display:block;margin-top:0.5625rem;font-family:var(--serif);font-weight:300;
  font-size:1.1875rem;line-height:1.28;letter-spacing:-.008em}
.pieza .dur{display:block;margin-top:0.5rem;font:400 0.8125rem/1 var(--cuerpo);
  color:var(--tx-3)}
.estante-nota{margin-top:1.625rem;font:400 0.9062rem/1.5 var(--cuerpo);color:var(--tx-2)}

/* ── los rituales de temporada ───────────────────────────────────────────── */
.temporadas .bajada{margin-top:1rem;max-width:46ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}
.temps{list-style:none;margin:2.75rem 0 0;padding:0;display:grid;
  grid-template-columns:repeat(4,1fr);gap:clamp(0.875rem,1.6vw,1.5rem)}
.temp{margin:0;padding:1.875rem 1.625rem 1.625rem;border-radius:var(--radio);
  background:var(--sup);position:relative;overflow:hidden;isolation:isolate;
  box-shadow:inset 0 0 0 1px rgba(44,44,44,.06),
             0 1px 0 rgba(44,44,44,.05);
  transition:transform .55s var(--curva),box-shadow .55s var(--curva)}
/* La textura de papel, en multiply y MUY baja: es la diferencia entre "un
   rectángulo crema" y "una cartulina".
   🔴 Y con `grayscale(1)` obligatorio. Sin él, multiply sobre una FOTO de papel
   cálido no aporta grano: arrastra su matiz y tiñe la tarjeta entera de
   amarillo — se veía a pergamino viejo, no a papel de su marca. La textura
   aporta LUZ y no color; el color ya lo pone el fondo.
   Y a .30 tapaba: .12 es lo que se siente sin que se vea. */
.temp::after{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:url("img/papel.webp") center/cover;
  filter:grayscale(1);
  mix-blend-mode:multiply;opacity:.12}
.temp:hover{transform:translateY(-4px);
  box-shadow:inset 0 0 0 1px rgba(44,44,44,.06),
             0 18px 30px -22px rgba(44,44,44,.55)}
/* La marca es SVG incrustado, así que hereda el color por `currentColor` y
   conserva su detalle interior en crema. Y no usa el token de TEXTO: es un
   dibujo de 44 px, no un rótulo de 11, así que no le aplica el mínimo de 4.5 —
   oscurecerla tanto le quitaría el croma a una marca cuyo tono dice
   "positivo". */
.temp-marca{display:block;width:44px;height:44px;margin-bottom:1.25rem;
  color:var(--marca,var(--ac-oliva));
  transition:transform .55s var(--curva),color .4s var(--curva)}
/* La marca se INCLINA al pasar, no rebota ni gira: es papel, y el papel se
   ladea. Cuatro grados bastan para que se sienta viva sin llamar la atención. */
.temp:hover .temp-marca{transform:rotate(-4deg) scale(1.06)}

.temp h3{font-family:var(--serif);font-weight:300;font-size:1.5rem;line-height:1.2;
  letter-spacing:-.01em}
.temp p{margin-top:0.625rem;font:400 0.9375rem/1.5 var(--cuerpo);color:var(--tx-2)}
.temp-nota{display:block;margin-top:1.125rem;font:500 0.7188rem/1.4 var(--cuerpo);
  letter-spacing:.1em;text-transform:uppercase;color:var(--tx-3)}

/* ── el podcast ──────────────────────────────────────────────────────────── */
.podcast-caja{display:grid;grid-template-columns:1fr 1.15fr;
  gap:clamp(1.75rem,4vw,4.5rem);align-items:center}
.podcast .bajada{margin-top:1rem;max-width:38ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}
.podcast .mas-ig{margin-top:1.625rem}
.episodios{list-style:none;margin:0;padding:0}
.episodios li{display:flex;align-items:baseline;gap:1.125rem;padding:1rem 0;
  box-shadow:0 1px 0 rgba(44,44,44,.12)}
.episodios li:first-child{padding-top:0}
.ep-t{flex:1;font-family:var(--serif);font-weight:300;font-size:1.125rem;line-height:1.3}
.ep-d{flex:none;font:400 0.8125rem/1 var(--cuerpo);color:var(--tx-3)}

/* ── lo que sigue ────────────────────────────────────────────────────────── */
/* 🔴 CAPA 4 · EL CIERRE.
   Era el bloque más flojo y encima el más importante: es la SALIDA de la
   página —lo que convierte una biblioteca gratis en un taller pagado, que es la
   escalera de Glucose Goddess que ella misma puso de referencia—. Y estaba
   resuelto como un renglón: titular a la izquierda, botón flotando a la
   derecha, y 567 px de campo verde vacío en medio.

   Dos cambios y ninguno es adorno:
   · **Se centra.** Es el único bloque centrado de la página. Después de seis
     secciones alineadas a la izquierda, centrar es el gesto que dice "aquí se
     acabó, mira esto" — y no hay que escribirlo.
   · **La acción deja de ser una esquina.** El botón baja al eje, debajo del
     texto, que es donde termina la lectura. Un CTA estacionado a la derecha se
     lee como un pie de página; en el eje se lee como el destino. */
.sigue-caja{max-width:min(42.5rem,100%);margin-inline:auto;text-align:center}
/* 🔴 Al centrar en 34ch el titular corrió a 96px dentro de una caja de 348 px y
   se partió en CUATRO renglones: un muro, no un cierre. Un titular fluido tiene
   que acotarse cuando cambia su contenedor — el `vw` no sabe que la caja se
   angostó. Cinco palabras en dos renglones es el remate. */
.sigue .titular{max-width:none;font-size:clamp(2.125rem,4.6vw,4.25rem)}
.sigue .bajada{margin:0.875rem auto 0;max-width:38ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}
.sigue .btn.primario{margin-top:2.125rem}

/* La marca de agua. Sale por abajo a propósito —sangrar dice que la marca
   continúa más allá del cuadro— y se mueve MÁS LENTO que el texto: esa
   diferencia de velocidad es la profundidad, no una sombra.
   Va en `color` + `currentColor` del `<use>` porque el contenido de un `<use>`
   SOLO se hereda: no se puede seleccionar ni pintar desde fuera. */
.sigue{overflow:hidden}
/* Primera versión: a 118% de alto y centrada a la derecha, el asta de la B
   quedaba DEBAJO del texto y se leía como un borde recto que partía la sección
   en dos. Una marca de agua no puede competir con lo que hay que leer.
   Va a la esquina, mordida por las dos orillas: se reconoce sin pedir turno. */
.marca-agua{position:absolute;z-index:0;pointer-events:none;
  right:-5%;bottom:-34%;height:104%;width:auto;
  color:var(--oliva);opacity:.09;
  translate:0 calc(var(--deriva) * -30px)}
@media (max-width:860px){
  .marca-agua{right:-22%;bottom:-24%;height:68%;opacity:.07}
}

/* ── celular: se RE-COMPONE, no se encoge ────────────────────────────────── */
@media (max-width:1024px){
  .estante{grid-template-columns:repeat(3,1fr)}
  .temps{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:768px){
  .puerta-caja,.podcast-caja{grid-template-columns:1fr}
  /* El objeto de la puerta se va DEBAJO del formulario: arriba, empuja la
     captura de correo fuera de la primera pantalla, que es justo lo que esta
     página viene a hacer. */
  .puerta-obj{order:2;aspect-ratio:3/2}
  .estante{grid-template-columns:repeat(2,1fr);gap:0.875rem}
  .pieza .tit{font-size:1.0312rem}
  /* Los ánimos se arrastran de lado en vez de apilarse en cuatro renglones. */
  .animos{flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;
    scroll-snap-type:x proximity;margin-inline:calc(var(--margen) * -1);
    padding-inline:var(--margen);padding-bottom:0.25rem}
  .animo{flex:none;scroll-snap-align:start;min-height:44px}
  .temps{grid-template-columns:1fr}
  .sigue-caja{flex-direction:column;align-items:flex-start}
}

@media (prefers-reduced-motion:reduce){
  .pieza,.pieza .portada{transition:none}
  .pieza.atras{scale:1}
}

/* ── el archivo en inglés ────────────────────────────────────────────────── */
/* Reusa `.videos` de §8 tal cual: mismo renglón, mismo punto de tipo, misma
   duración a la derecha. Lo único que cambia es que aquí NO lleva la barra de
   duración proporcional — allá el dato compara seis piezas y dice algo; aquí
   son nueve de archivo y la barra sería adorno. */
.archivo .bajada{margin-top:1rem;max-width:44ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}
/* 🔴 CAPA 4 · EL MOLDE SE ROMPE AQUÍ.
   Las seis secciones eran la MISMA plantilla —etiqueta, titular arriba a la
   izquierda, párrafo, contenido a todo lo ancho—, seis veces. Esa es la
   monotonía de verdad: el ojo aprende el patrón en la segunda sección y a
   partir de ahí baja en automático. No la arregla ni la textura ni el
   movimiento, porque no es de superficie: es que el ritmo nunca cambia.

   Y ésta era además la sección más floja de la página: nueve videos suyos como
   lista pelada sobre un campo crema medio vacío.

   Ahora es un RIEL que se recorre de lado. Tres razones, y ninguna es estética:
   · **Dice la jerarquía con la FORMA.** Arriba, catorce piezas en rejilla que
     se abren de frente. Aquí, un cajón que se hojea. Sin escribir "esto es
     secundario", se ve que lo es — y las nueve siguen enteras, no escondidas.
   · **Rompe el eje.** Es el único bloque que se lee en horizontal en toda la
     página. Ese solo cambio de dirección vale más que cualquier animación.
   · **Y mata el vacío**: el campo crema se llena de material suyo.

   SANGRA POR LA DERECHA a propósito (margen negativo + padding): una pieza
   cortada por el borde es lo que dice "esto sigue" sin poner una flecha. Es la
   regla V4 de `ai-director` — sangrar algo para que la escena continúe. */
.archivo-lista{margin:2.375rem 0 0;padding:0.25rem var(--margen) 1.375rem 0;
  margin-right:calc(var(--margen) * -1);
  display:flex;gap:clamp(0.875rem,1.5vw,1.375rem);
  grid-template-columns:none;              /* gana a la rejilla de `.videos` */
  overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x proximity;scroll-padding-left:0;
  scrollbar-width:none;-ms-overflow-style:none;
  /* La barra nativa se oculta porque el riel ya avisa de dos maneras (la pieza
     cortada y el desvanecido del borde). Se OCULTA, no se desactiva: la rueda,
     el trackpad, el teclado y el arrastre táctil siguen funcionando igual. */
  overscroll-behavior-x:contain}
.archivo-lista::-webkit-scrollbar{display:none}
.archivo-lista li{flex:none;scroll-snap-align:start;display:block;
  width:clamp(210px,19vw,262px)}
/* De renglón a ficha: la miniatura arriba, el texto debajo. La estructura del
   HTML no cambia — solo el eje. */
.archivo-lista a{flex-direction:column;align-items:stretch;gap:0;padding:0;
  border:0;background:none}
.archivo-lista .vmini{width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;
  border-radius:var(--radio-chico);
  /* Mismas tres sombras que las portadas del estante y misma dirección de luz:
     una sola fuente para toda la página. */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.55),
    0 1px 1px rgba(44,44,44,.13),
    0 8px 14px -9px rgba(44,44,44,.28);
  /* El archivo es viejo y de otra etapa: entra un punto más apagado que el
     estante y también revive al pasar. */
  filter:saturate(.74) sepia(.08);
  transition:transform .42s var(--curva),filter .42s var(--curva)}
.archivo-lista a:hover .vmini,.archivo-lista a:focus-visible .vmini{
  transform:translateY(-4px);filter:none}
.archivo-lista .vt{font-family:var(--serif);font-weight:300;font-size:1.0938rem;
  line-height:1.3;margin-top:0.8125rem;padding-top:0.6875rem;
  border-top:2px solid var(--tipo,var(--ac-oliva))}
.archivo-lista .vm{margin-top:0.5625rem;justify-content:flex-start;gap:0.875rem}

/* El desvanecido del borde derecho: la máscara le dice al ojo que el riel
   continúa fuera de cuadro. Se apaga al llegar al final —lo pone el JS— porque
   un degradado permanente miente cuando ya no hay nada más. */
.archivo{--riel:1}
.archivo .ancho{position:relative}
.archivo-lista{-webkit-mask:linear-gradient(90deg,#000 0,#000 calc(100% - 74px * var(--riel)),transparent 100%);
                       mask:linear-gradient(90deg,#000 0,#000 calc(100% - 74px * var(--riel)),transparent 100%);
  transition:-webkit-mask .3s linear,mask .3s linear}

@media (max-width:860px){
  .archivo-lista li{width:clamp(180px,62vw,230px)}
}

/* ── LA ENTRADA DEL ESTANTE ──────────────────────────────────────────────── */
/* El reposo es VISIBLE: sin JS las catorce están puestas. `.porentrar` lo pone
   el script y solo existe mientras hay algo que lo va a resolver — la misma
   regla que el resto del sitio. */
.pieza.porentrar{opacity:0;translate:0 22px}
.pieza{transition:scale .5s var(--curva),opacity .7s var(--curva),
                  translate .7s var(--curva)}

/* ── EL PULSO DE LA PORTADA AL FILTRAR ───────────────────────────────────── */
/* Cuando el estante se re-apila, las que SÍ aplican dan un respiro corto. Es lo
   que hace que el filtro se sienta una respuesta y no un salto: sin esto, las
   piezas cambian de sitio y nadie sabe cuáles son las nuevas. */
@keyframes respira-pieza{
  0%{transform:none}
  38%{transform:translateY(-6px)}
  100%{transform:none}}
.pieza.elegida .portada{animation:respira-pieza .62s var(--curva)}

@media (prefers-reduced-motion:reduce){
  .pieza.porentrar{opacity:1;translate:0}
  .pieza.elegida .portada{animation:none}
}

/* ── LA PROFUNDIDAD DE LA REPISA ─────────────────────────────────────────── */
/* Tres velocidades sobre el mismo `--deriva`: el titular va más lento que las
   tarjetas y las tarjetas más lento que el fondo. Ese desfase ES la
   profundidad — es lo mismo que hace la noche del cierre, así que la página no
   inventa un vocabulario nuevo, habla el que el sitio ya tiene. */
.temporadas{--deriva:0;overflow:hidden}
.temporadas .etiqueta,.temporadas .titular,.temporadas .bajada{
  translate:0 calc(var(--deriva) * -14px);will-change:translate}
.temporadas .temps{translate:0 calc(var(--deriva) * 22px);will-change:translate}
/* Y cada tarjeta lleva su propio desfase por columna: sin esto las cuatro se
   mueven como una sola losa y el paralaje no se lee. */
.temps .temp:nth-child(1){translate:0 calc(var(--deriva) * 8px)}
.temps .temp:nth-child(2){translate:0 calc(var(--deriva) * 16px)}
.temps .temp:nth-child(3){translate:0 calc(var(--deriva) * 24px)}
.temps .temp:nth-child(4){translate:0 calc(var(--deriva) * 32px)}

@media (prefers-reduced-motion:reduce){
  .temporadas .etiqueta,.temporadas .titular,.temporadas .bajada,
  .temporadas .temps,.temps .temp{translate:0}
}

/* ── EL MOMENTO FIRMA: LA LUNA QUE PASA POR SUS FASES ────────────────────── */
/* Vive DETRÁS de todo (`z-index:0` contra el `.ancho` que va en 1) y a bajo
   contraste: es atmósfera, no un objeto que compita con las tarjetas. Medida
   contra el lila de la sección queda en 1.19 — deliberadamente por debajo del
   umbral de texto, porque no es texto: si se leyera fuerte, la sección
   tendría dos protagonistas. */
.temporadas{position:relative;isolation:isolate}
.temporadas .ancho{position:relative;z-index:1}
.luna-fase{position:absolute;z-index:0;pointer-events:none;
  right:calc(var(--margen) * -.25);top:14%;
  width:clamp(230px,27vw,430px);aspect-ratio:1;border-radius:50%;overflow:hidden;
  /* v2 — el disco era lila al 62%: una mancha de color de 430 px. Ahora es
     superficie y quien pone el color es la foto que lleva dentro. */
  background:var(--sup);
  /* Y ella también deriva, más lento que todo lo demás: es lo que está más
     lejos, así que es lo que menos se mueve. */
  translate:0 calc(var(--deriva) * -34px);will-change:translate}
/* El disco de sombra: mismo tamaño, color del fondo de la sección, y se
   desliza. En el centro del recorrido la tapa entera —luna nueva—; en los
   extremos la descubre. */
.luna-fase i{position:absolute;inset:0;border-radius:50%;
  background:var(--fondo);
  translate:calc(var(--deriva) * 104%) 0}

@media (max-width:768px){
  /* En vertical la luna se va arriba y se achica: al lado de una sola columna
     de tarjetas, un disco de 400 px compite en vez de acompañar.
     ⚠️ Aquí SÍ pasa por detrás del titular — medido con el texto oculto para
     muestrear el píxel real: el titular en carbón da 8.86 en su peor punto y el
     acento en oliva 4.43. A 36 px cuenta como texto grande (mínimo 3.0), así
     que pasa con holgura. Si algún día el titular baja de tamaño en móvil, esta
     medición hay que repetirla. */
  .luna-fase{width:clamp(150px,44vw,230px);right:calc(var(--margen) * -.5);top:3%}
}
@media (prefers-reduced-motion:reduce){
  .luna-fase{translate:0}
  .luna-fase i{translate:52% 0}   /* se queda en cuarto creciente, quieta */
}

/* ═══ EL RITMO DE LA BIBLIOTECA ════════════════════════════════════════════
   🔴 DIAGNÓSTICO MEDIDO, no de gusto. paco: "muy monótono y sin movimiento".
   Contadas las siete secciones de la página:
     · el movimiento vivía en UNA (867 px de 6522 = **13%**)
     · la textura vivía en cuatro tarjetitas
     · y `tono-crema` estaba TRES veces, mientras las dos secciones más grandes
       —la estantería (1747 px, el 27% de la página) y el podcast— no tenían
       tono ninguno y caían sobre el arena del cuerpo.
   O sea: cinco de siete secciones eran crema o arena. Eso es la monotonía, y no
   se arregla con más animación encima. Primero cambia la habitación.          */

/* Faltaba el tono base como CLASE: la sección más grande no puede ser "lo que
   herede", tiene que declararse.
   ⚠️ v2 — esta regla vive 1500 líneas DEBAJO del bloque de tonos, así que le
   ganaba por orden de aparición con la misma especificidad. Si aquí quedaba
   `var(--arena)`, el cambio de suelo de la v2 no se aplicaba en las dos
   secciones que la usan y no habría error en consola: simplemente arena. Es
   exactamente el fallo de "la regla que gana no es la que crees". */
.tono-arena{--fondo:var(--papel)}

/* ── LA TEXTURA, A NIVEL DE SECCIÓN ──────────────────────────────────────── */
/* Cada franja de color lleva su grano. Sin esto, un bloque de color plano de
   1700 px es una pared pintada; con esto es papel teñido — que es literalmente
   lo que dice su moodboard (cuatro papeles).
   🔴 `grayscale(1)` obligatorio, misma razón que en las tarjetas: multiply
   sobre una FOTO de papel cálido arrastra su matiz y tiñe la sección.
   Y va en `::before` a `z-index:0` con el contenido en 1 — nunca sobre un
   contenedor que scrollea. */
.seccion.tono{position:relative;isolation:isolate}
/* 🔴 `> *` NO: esa regla (0,2,0) le gana a `.luna-fase` (0,1,0) y le pisó su
   `position:absolute` y su `z-index:0` — la luna se salió del fondo y se puso
   ENCIMA del contenido. Un selector de hijo universal se come las capas
   decorativas que uno mismo puso. Se apunta al contenedor de contenido, que es
   el que de verdad tiene que ir arriba. */
.seccion.tono > .ancho{position:relative;z-index:1}
/* 🔴 LA TEXTURA VA EN EL FONDO DE LA SECCIÓN, NO EN UN PSEUDO.
   Primer intento: `.seccion.tono::before`. No pintó NADA y lo confirmé
   midiendo: desviación 0.00 y UN SOLO nivel de gris en toda la franja.
   La causa: **`.troquel::before` YA EXISTE** — es el borde rasgado entre
   secciones. Mi regla le ganaba por especificidad y le pisaba el fondo, pero
   HEREDABA SU MÁSCARA, así que la textura se recortaba a la tira de 18 px del
   troquel y desaparecía. Dos reglas escribiendo el mismo pseudo-elemento: el
   ganador se lleva sus propiedades y las del perdedor que no declara.

   Ahora va como `background-image` de la propia sección, mezclada con su color
   por `background-blend-mode`. Cero pseudos, cero conflicto, y el troquel
   recupera el suyo intacto.
   ⚠️ Con este método no hay `filter`, así que el lino y la sombra se
   desaturaron EN EL ARCHIVO — aportan luz, no color. La acuarela se queda en
   color porque ahí el pigmento ES el punto.

   Y la textura pasa de GENERADA a FOTOGRAFIADA: antes era el mismo papel
   repetido en las siete franjas, y eso no es material, es maquillaje. Son tres
   piezas reales hechas para esta marca (Nano Banana, método `ai-director`: sin
   hex en el prompt, el color va por MATERIAL nombrado). */
/* 🔴 SEGUNDA VUELTA — paco: "no se ven los fondos generados". Otra vez. Y otra
   vez tenía razón, por DOS causas medidas que no son la de la vez pasada:

   1 · TRES de las seis secciones no tenían textura ninguna (temporadas, archivo
       y sigue): la mitad de la página era pintura plana. Se me fue.
   2 · `lino.webp` mide **std 1.03 y 17 niveles de 255**. Lo aplané yo al
       atenuarlo y el webp remató la cuantización: es invisible POR
       CONSTRUCCIÓN. Intenté re-estirarle el rango y solo subió a 1.14 — la
       información ya no está.
   3 · Y la de fondo: `cover` sobre la estantería (1783 px de alto, archivo de
       1600×893) es un **escalado de 2.0×**. Un grano fino ampliado al doble
       deja de ser grano y se vuelve un velo sucio. Ninguna foto sobrevive eso.

   LA CORRECCIÓN DE MÉTODO — dos capas con oficios distintos:
   · **La FORMA va en foto** (la sombra de la rama, el pigmento de la acuarela):
     son manchas grandes, de baja frecuencia, y `cover` no las daña.
   · **El GRANO va en código** — una tesela SVG (`feTurbulence` con
     `stitchTiles="stitch"`, sin costura) repetida a su tamaño NATIVO. Peso
     cero, escala infinita, y sobre todo: **no se amplía nunca**, que era el
     problema. Es lo que manda `ai-director` para texturas y patrones, y yo lo
     había resuelto con una foto.
   Resultado: las SEIS secciones tienen material, y las dos que además tienen
   pieza fotográfica la conservan encima. */
/* 🔴 Y LA CAPA QUE DE VERDAD SE VE: LA LUZ.
   El grano medido da 12-14 niveles. Eso es correcto para papel — pero el grano
   se SIENTE, no se VE. Lo que hace que un campo de color deje de parecer una
   muestra de pintura y empiece a parecer una superficie ILUMINADA es una caída
   de luz grande y descentrada. Es la variable V1 de `ai-director` (una fuente,
   con dirección nombrada) aplicada a escala de sección en vez de a un objeto.

   Va en `soft-light` para que aclare y oscurezca SIN cambiar el matiz —en
   `normal` con blanco lavaría el color de marca, que es el error de los tres
   hex apagados—. Y la dirección ALTERNA sección a sección: si todas se iluminan
   por el mismo lado, la página vuelve a ser plana, solo que en degradado.

   Bonus que no es casualidad: el grano de la capa de abajo hace de **dither**
   del degradado. Las dos capas se necesitan. */
/* 🔴 v3.2 — EL MOTOR ESTABA ENCENDIDO SOLO EN LA BIBLIOTECA.
   Medido en el home, sección por sección: SIETE de trece daban
   `background-image: none` —apertura, valle, elige, planner, pila, manifiesto y
   library— o sea que más de la mitad de la portada era crema plano
   `rgb(246,244,235)` sin grano, sin luz y sin textura. Y §camino es la peor de
   todas porque además es la sección más alta del tramo: 1310 px de pintura.
   No faltaba inventar material: faltaba CONECTARLO.

   Y la segunda mitad del mismo defecto: las cinco que sí lo tenían usaban las
   CINCO el valor por omisión `18% -10%`. El zigzag de luz existía escrito ahí
   abajo y solo cubría las secciones de biblioteca.html. Es exactamente lo que
   advierte el comentario de arriba —«si todas se iluminan por el mismo lado, la
   página vuelve a ser plana, solo que en degradado»— y llevaba así desde que se
   escribió la regla.                                                          */
/* 🔴🔴 v3.2 — Y LA CAPA DE LUZ TAMPOCO SE VEÍA. En NINGUNA sección, no solo aquí.
   Medido con el contenido oculto, luminancia media por columna a lo ancho:
   §tienda —que llevaba el motor desde el principio— daba un rango de **1.95
   niveles** de un extremo al otro. Papel absolutamente plano. El comentario de
   arriba afirma que la luz es «la capa que de verdad se ve»; medida, no se veía.

   Tres causas, y las tres había que arreglarlas juntas:

   1 · GEOMETRÍA. `120% 90%` con el centro en `80% -6%` pone el borde opuesto a
       ~67% del radio, y la parada oscura solo empieza a morder en el 62-100%.
       O sea que el degradado terminaba FUERA del lienzo y solo se veía su parte
       clara. Subir la opacidad no servía de nada: de .12 a .52 el rango pasó de
       2.44 a 4.01. No era la alfa, era el radio.
   2 · EL PASE DE BLANCO ERA CONTRAPRODUCENTE. El papel ya está en 240 de 255:
       quedan 15 niveles de margen hacia arriba y ninguno de sobra. El blanco
       subía TODO el campo (240 → 243.6) y se comía el poco rango que había.
       En papel casi blanco no se modela con luz, se modela con SOMBRA.
   3 · `soft-light` ES EL TECHO. Es un modo suave por definición: con la
       geometría ya corregida seguía dando 2.21. Con `multiply` el mismo
       degradado da 44.8. El modo era el tope real.

   🔴 Y EL DETALLE QUE DECIDE EL COLOR DE LA SOMBRA: multiply contra un gris
   neutro DESATURA. Medido en R−B, la distancia que hace que el crema sea crema:
   el original la perdía (10.1 → 9.3) y el neutro #2C2C2C la destruía
   (10.3 → 6.8). Multiplicando contra un OCRE cálido `rgb(150,126,74)` la
   calidez SUBE al oscurecer (10.1 → 14.3), que es lo que hace de verdad una
   sombra sobre papel: se pone más honda y más cálida, no más gris.
   Es la misma trampa ya anotada para `color-mix` en srgb.

   Calibrado en 9.9 niveles de rango a `--luz-caida:.11`; queda en .13. Por
   debajo de ~6 vuelve a ser invisible; arriba de ~25 se lee a viñeta, que es un
   efecto de foto, no una sección iluminada.                                   */
.seccion.tono,.enc-pagina,.elige{
  background-image:
    var(--textura,none),
    radial-gradient(92% 112% at var(--luz,18% -10%),
      rgba(255,255,255,0) 0%, rgba(255,255,255,0) 34%,
      rgba(150,126,74,calc(var(--luz-caida,.13) * .42)) 68%,
      rgba(150,126,74,var(--luz-caida,.13)) 100%),
    var(--grano,url("grafico/grano.svg"));
  background-size:cover,cover,var(--grano-tam,200px 200px);
  background-position:center,center,center;
  background-repeat:no-repeat,no-repeat,repeat;
  background-blend-mode:var(--textura-mezcla,multiply),multiply,multiply}

/* La luz baja en zigzag por la página: izquierda, derecha, izquierda. */
/* EL HOME, en su orden real de lectura. La alternancia es el punto: leídas
   seguidas, izquierda-derecha-izquierda hace que el papel se sienta girado bajo
   una misma ventana. Con todas al mismo valor, el degradado se vuelve un patrón
   y deja de leerse como luz. */
.suena {--luz:22% -12%}
.elige {--luz:80% -6%}
.tienda{--luz:14% -8%}
.reels {--luz:82% -10%}
.exp   {--luz:16% 2%}
.voces {--luz:84% -6%}

.enc-pagina{--luz:22% -12%}
.puerta{--luz:78% -8%}
.estanteria{--luz:12% 4%}
.temporadas{--luz:84% -6%}
.podcast{--luz:16% -10%}
.archivo{--luz:80% 2%}
.sigue{--luz:24% -8%}

.puerta{--textura:url("img/fondo/sombra-vegetal.webp")}
/* El podcast cambia la foto muerta por un TEJIDO de verdad: dos turbulencias
   cruzadas —una estirada en X, otra en Y— que es literalmente cómo se teje el
   lino. Una trama regular es justo lo que nunca debió ser una foto. */
.podcast{--grano:url("grafico/lino-tejido.svg");--grano-tam:120px 120px}
/* La acuarela es SU pigmento: lima y lila granulando sobre algodón. Va en la
   estantería —la sección más grande— en `soft-light`, para que TIÑA en vez de
   ensuciar: en multiply el mismo archivo la deja gris. */
.estanteria{--textura:url("img/fondo/acuarela.webp");--textura-mezcla:soft-light}

/* ── EL MOVIMIENTO, EN TODAS ─────────────────────────────────────────────── */
/* Todo cuelga de `--deriva`, que ahora calcula `biblio.js` para cualquier
   sección con `data-deriva`. El encabezado va MÁS LENTO que el cuerpo: esa
   diferencia es la profundidad. Amplitudes chicas a propósito — esto acompaña
   el scroll, no lo secuestra. */
[data-deriva]{--deriva:0}
[data-deriva] .etiqueta{translate:0 calc(var(--deriva) * -10px)}
[data-deriva] > .ancho > .titular,
[data-deriva] .puerta-tx .titular{translate:0 calc(var(--deriva) * -16px)}

.puerta-obj{translate:0 calc(var(--deriva) * 26px);will-change:translate}
.estanteria .animos{translate:0 calc(var(--deriva) * -8px)}
.podcast .episodios{translate:0 calc(var(--deriva) * 20px);will-change:translate}
.archivo-lista{translate:0 calc(var(--deriva) * 14px);will-change:translate}

/* ── EL ACENTO GRÁFICO ───────────────────────────────────────────────────── */
/* Un patrón suyo asomando por una esquina, distinto por sección. No es relleno:
   es lo que hace que dos franjas del mismo tamaño no se sientan iguales. */
/* Y las dos que llevan adorno se recortan: el patrón asoma por fuera del
   borde a propósito, y sin `overflow` eso es desborde horizontal — medido, 25
   px de barra lateral en escritorio. */
.podcast,.sigue{overflow:hidden}
.podcast::after,.sigue::after{content:"";position:absolute;z-index:0;
  pointer-events:none;opacity:.5;
  background:var(--patron) no-repeat center/contain}
/* Y con máscara radial: un patrón que termina en un borde recto se lee a
   recorte pegado por más que le quites la placa. Se disuelve hacia afuera. */
.podcast::after{--patron:url("grafico/puntitos-sueltos.svg");
  right:-50px;top:-40px;width:clamp(200px,23vw,340px);aspect-ratio:1;
  -webkit-mask:radial-gradient(closest-side,#000 42%,transparent 92%);
          mask:radial-gradient(closest-side,#000 42%,transparent 92%);
  translate:0 calc(var(--deriva) * 30px)}
.sigue::after{--patron:url("grafico/onda-larga.svg");
  left:var(--margen);bottom:18px;width:clamp(200px,26vw,420px);height:60px;
  color:var(--ac-oliva);opacity:.28;
  translate:calc(var(--deriva) * 22px) 0}

@media (prefers-reduced-motion:reduce){
  [data-deriva] .etiqueta,[data-deriva] > .ancho > .titular,
  [data-deriva] .puerta-tx .titular,.puerta-obj,.estanteria .animos,
  .podcast .episodios,.archivo-lista,.podcast::after,.sigue::after{translate:0}
}

/* ═══════════════════════════════════════════════════════════════════════════
   SOBRE I AM READY TO BLOOM · "EL REGRESO"
   ───────────────────────────────────────────────────────────────────────────
   🔴 LA REGLA DE ESTA PÁGINA: CINCO BLOQUES, CINCO ESPINAS DISTINTAS.
   La biblioteca se sentía monótona porque sus seis secciones eran la misma
   plantilla —etiqueta, titular arriba a la izquierda, párrafo, contenido— seis
   veces. Aquí eso está prohibido y se verifica CONTANDO, no a ojo:
     1 saludo   → split (texto | ella)
     2 hilo     → recorrido vertical colgado de un trazo
     3 credo    → tipografía sola, sin una imagen
     4 caminos  → lista que invoca video
     5 puertas  → par horizontal
   Ninguna se compone como la anterior, y ninguna repite el cierre centrado de
   la biblioteca.

   🔴 Y LA RESTRICCIÓN QUE MANDA EL DISEÑO: todo lo que nos dio es CHICO y
   VERTICAL. El video mide 540 px de ancho, la foto 840. A retina 2× eso son
   270 y 420 px de tope real en pantalla. Inflarlos daría exactamente la foto
   borrosa que entregan sus tres referencias (medido: 0.27-0.56 de lo que pide
   la pantalla). Así que no se pelea con el material: se diseña desde él —
   piezas CHICAS, NÍTIDAS y preciosas apoyadas sobre papel, no fondos. Y resulta
   que la restricción y la marca dicen lo mismo: su producto es papelería.     */

/* ── LA LÁMINA: el objeto de esta página ─────────────────────────────────── */
/* Una sola pieza reutilizable: forro de color que asoma, canto claro arriba y
   sombra de contacto corta. Misma construcción y MISMA DIRECCIÓN DE LUZ que las
   portadas del estante y que el troquel — una sola fuente para todo el sitio. */
.lamina{margin:0;position:relative;
  /* Era lila al 30% sobre crema: un marco de color pálido alrededor de la foto,
     justo lo que ella rechazó. El marco pasa a la superficie del sistema, así
     que la ÚNICA cosa con color dentro del cuadro vuelve a ser la fotografía. */
  background:var(--sup);
  padding:0.625rem 0.625rem 0;border-radius:calc(var(--radio-chico) + 0.5rem);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.6),
    0 1px 1px rgba(44,44,44,.13),
    0 16px 26px -14px rgba(44,44,44,.34);
  rotate:-1.1deg}
.lamina > video,.lamina > img{display:block;width:100%;height:auto;
  border-radius:var(--radio-chico);background:var(--sup)}
.lamina-pie{padding:0.6875rem 0.25rem 0.75rem;font:500 0.6875rem/1 var(--cuerpo);
  letter-spacing:.13em;text-transform:uppercase;color:var(--tx-3)}

/* 1 · EL SALUDO — split. El video NO pasa de 270 px: es su ancho nativo entre
   dos, y por encima de eso se ve borroso. Es un tope, no una preferencia. */
.saludo-caja{display:grid;grid-template-columns:1fr auto;
  gap:clamp(2rem,5vw,5.375rem);align-items:center}
.saludo-tx .bajada{margin-top:1.25rem;max-width:42ch;font-size:1.0938rem;line-height:1.6;
  color:var(--tx-2)}
.lamina-video{width:min(270px,42vw)}
.lamina-video{rotate:1.4deg;translate:0 calc(var(--deriva) * -22px)}

/* 2 · EL HILO — la única espina vertical de la página. */
.cordel{position:relative;list-style:none;margin:3.5rem 0 0;padding:0 0 0 clamp(2.875rem,7vw,6.5rem)}
.cordel-hilo{position:absolute;left:clamp(4px,1.4vw,26px);top:6px;
  width:40px;height:calc(100% - 12px);color:var(--oliva);opacity:.62;
  overflow:visible}
/* El trazo se DIBUJA con el scroll. `--trazo` va de 0 a 1 y lo escribe el JS
   desde una sola medición; sin JS el hilo aparece completo, que es el reposo
   correcto: la página se lee igual sin una línea de script. */
.cordel-hilo path{stroke-dasharray:var(--largo,2000);
  stroke-dashoffset:calc(var(--largo,2000) * (1 - var(--trazo,1)))}
.nudo{position:relative;padding-bottom:clamp(3rem,6vw,5.75rem)}
.nudo:last-child{padding-bottom:0}
/* El nudo: un punto sobre el hilo. Anillo, no disco — un disco a este tamaño se
   lee como viñeta de lista y esto es una parada del recorrido. */
.nudo::before{content:"";position:absolute;
  left:calc(clamp(46px,7vw,104px) * -1 + clamp(4px,1.4vw,26px) + 20px - 7px);
  top:9px;width:14px;height:14px;border-radius:50%;
  background:var(--fondo);border:2px solid var(--oliva);
  box-shadow:0 0 0 5px var(--fondo)}
.nudo-donde{font:500 0.6875rem/1 var(--cuerpo);letter-spacing:.14em;
  text-transform:uppercase;color:var(--ac-oliva)}
.nudo-tit{margin:0.75rem 0 0;font-family:var(--serif);font-weight:300;
  font-size:clamp(1.5rem,2.9vw,2.375rem);line-height:1.2;letter-spacing:-.01em}
.nudo-tx{margin:0.75rem 0 0;max-width:46ch;font-size:1.0625rem;line-height:1.62;
  color:var(--tx-2)}
.lamina-foto{width:min(300px,52vw);margin-top:1.625rem;rotate:-1.6deg;
  translate:0 calc(var(--deriva) * -14px)}

/* 3 · EL CREDO — tipografía sola. Después de tres capítulos con material, un
   bloque sin una sola imagen es el descanso que hace que lo anterior respire. */
.credo-caja{max-width:min(56.25rem,100%)}
.credo-frase{margin:1.375rem 0 0;font-family:var(--serif);font-weight:300;
  font-size:clamp(1.875rem,4.4vw,3.875rem);line-height:1.16;letter-spacing:-.014em;
  max-width:18ch}
.credo-tx{margin:1.75rem 0 0;max-width:52ch;font-size:1.125rem;line-height:1.66;
  color:var(--tx-2)}

/* 4 · LOS CAMINOS — la lista que invoca video. */
.caminos-caja{display:grid;grid-template-columns:1fr clamp(200px,20vw,250px);
  gap:clamp(1.875rem,4vw,4.125rem);align-items:start;margin-top:2.75rem}
.vias{list-style:none;margin:0;padding:0}
.via > .cara{display:grid;grid-template-columns:auto 1fr auto;
  align-items:baseline;gap:0.375rem clamp(0.875rem,1.8vw,1.625rem);
  padding:1.375rem 0;text-decoration:none;color:var(--carbon);
  box-shadow:0 1px 0 rgba(44,44,44,.12);
  transition:padding-left .42s var(--curva)}
.via:first-child > .cara{padding-top:0}   /* 🔴 acotado a `> .cara`: ver el porqué al final del archivo */
.via a:hover,.via a:focus-visible{padding-left:0.875rem}
.via a:focus-visible{outline:3px solid var(--carbon);outline-offset:4px}
.via-n{font:500 0.75rem/1 var(--cuerpo);letter-spacing:.1em;color:var(--tx-3)}
.via-t{font-family:var(--serif);font-weight:300;
  font-size:clamp(1.3125rem,2.5vw,2rem);line-height:1.2;letter-spacing:-.008em}
.via-d{grid-column:2;font-size:0.9375rem;line-height:1.55;color:var(--tx-2);
  max-width:44ch}
.via-a{grid-row:1;grid-column:3;font:500 0.6875rem/1 var(--cuerpo);
  letter-spacing:.13em;text-transform:uppercase;color:var(--ac-oliva)}

/* (El escenario pegajoso de 250 px murio con la capa 1: su marcado ya no
   existe. Sus reglas se van con el.) */

/* 5 · LAS PUERTAS — par horizontal. */
.puertas-tit{max-width:14ch}
.par{display:grid;grid-template-columns:1fr 1fr;gap:clamp(1rem,2vw,1.75rem);
  margin-top:2.5rem}
.puerta-h{display:grid;gap:0.625rem;padding:clamp(1.5rem,3vw,2.375rem);
  text-decoration:none;color:var(--carbon);
  background:color-mix(in oklch,var(--crema) 72%,transparent);
  border-radius:var(--radio);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 1px 1px rgba(44,44,44,.12),
             0 12px 20px -14px rgba(44,44,44,.3);
  transition:transform .42s var(--curva),box-shadow .42s var(--curva)}
.puerta-h:hover,.puerta-h:focus-visible{transform:translateY(-4px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 2px 1px rgba(44,44,44,.12),
             0 24px 32px -20px rgba(44,44,44,.44)}
.puerta-h:focus-visible{outline:3px solid var(--carbon);outline-offset:4px}
.puerta-k{font-family:var(--serif);font-weight:300;font-size:clamp(1.5rem,2.7vw,2.125rem)}
.puerta-t{font-size:1rem;line-height:1.55;color:var(--tx-2);max-width:30ch}
.puerta-f{margin-top:0.375rem;color:var(--ac-oliva)}

/* ── celular: se RE-COMPONE ──────────────────────────────────────────────── */
@media (max-width:900px){
  .saludo-caja{grid-template-columns:1fr}
  .lamina-video{width:min(270px,68vw);margin-top:1.875rem}
  .caminos-caja{grid-template-columns:1fr}
  /* En celular no hay ratón: el escenario pegajoso no tiene gesto que lo
     dispare, así que se va y cada vía se lee entera. Esconderlo es correcto;
     dejarlo vacío sería una caja muerta. */
  .via a{grid-template-columns:auto 1fr}
  .via-a{grid-row:auto;grid-column:2}
  .par{grid-template-columns:1fr}
}
@media (prefers-reduced-motion:reduce){
  .lamina,.lamina-video,.lamina-foto{rotate:none;translate:0}
  .cordel-hilo path{stroke-dashoffset:0}
}

/* 🔴 El nudo con foto se abre a DOS columnas. Primera versión: texto y lámina
   apilados a la izquierda y la mitad derecha de la sección vacía — 700 px de
   arena sin nada. Un recorrido vertical no obliga a que TODO viva en una
   columna: el hilo da el eje, y colgar la pieza al otro lado usa el ancho y de
   paso rompe la simetría de la lista. */
@media (min-width:901px){
  .nudo:has(.lamina){display:grid;grid-template-columns:minmax(0,1fr) auto;
    gap:clamp(1.875rem,4vw,4.5rem);align-items:start}
  .nudo:has(.lamina) .nudo-donde,
  .nudo:has(.lamina) .nudo-tit,
  .nudo:has(.lamina) .nudo-tx{grid-column:1}
  .nudo:has(.lamina) .lamina{grid-column:2;grid-row:1 / span 3;margin-top:0;
    align-self:center}
  .lamina-foto{width:min(330px,30vw)}
}

/* ═══ SOBRE · LA CAPA DE MARCA ═════════════════════════════════════════════
   🔴 paco, con razón: "hay iconos, hay decoraciones, hay fondos y me entregas
   algo básico cero brandeado". El sitio tiene DIECISIETE piezas gráficas suyas
   —hoja, rama, flor, asterisco, luna, patrones— y esta página no usaba
   NINGUNA. Estructura correcta y marca ausente es media entrega.

   Las piezas entran por MÁSCARA, no por `<img>`: los archivos están dibujados
   con `currentColor` y un `<img>` los congela en su color; con `mask` el color
   lo manda el CSS y una misma pieza sirve en oliva, lila o coral. */

/* 1 · LA MARCA DEL NUDO — una botánica distinta por capítulo, colgada del hilo.
   No es adorno de relleno: es lo que convierte tres viñetas iguales en tres
   momentos con carácter propio, y es el vocabulario del resto del sitio. */
.nudo-marca{position:absolute;left:calc(clamp(46px,7vw,104px) * -1 + 4px);
  top:-16px;width:clamp(30px,3.2vw,40px);aspect-ratio:1;
  background:var(--oliva);opacity:.32;pointer-events:none;
  -webkit-mask:var(--marca) no-repeat center/contain;
          mask:var(--marca) no-repeat center/contain;
  rotate:-8deg;translate:0 calc(var(--deriva) * -12px)}
/* Con la botánica encima, el aro del nudo estorbaba: dos marcas peleando por el
   mismo punto del hilo. Se queda la pieza de marca y el aro se va. */
.nudo::before{display:none}

/* 2 · EL JARDÍN — llena la mitad derecha del hilo, que estaba muerta.
   Grande, tenue y mordido por la orilla: se reconoce sin pedir turno. */
.hilo{overflow:hidden}
/* 🔴 Iba con `patron-botanica.svg` de máscara y eso NO era un jardín: ese
   archivo trae un `<rect>` de 360x360 a sangre, y un rect a sangre como máscara
   es opaco entero — pintaba un RECTÁNGULO de oliva con canto recto vertical a
   963 px, medido. Los patrones son fondo que se repite, nunca máscara; lo dice
   su propia guía. La rama sí es silueta, y una rama grande mordida por la orilla
   es lo que se quería desde el principio. */
.hilo-jardin{
  /* v2 — misma razón: una rama dibujada al 13% sobre el papel. Ella pidió
     quitar los iconos dibujados sin excepción y no reemplazarlos por otros. */
  display:none;
  position:absolute;z-index:0;pointer-events:none;
  right:-8%;top:10%;width:min(520px,40vw);aspect-ratio:.82;
  background:var(--oliva);opacity:.13;
  -webkit-mask:url("grafico/rama.svg") no-repeat center/contain;
          mask:url("grafico/rama.svg") no-repeat center/contain;
  rotate:8deg;
  translate:0 calc(var(--deriva) * -46px)}

/* 3 · EL ASTERISCO DEL CREDO — su signo, a escala de puntuación tipográfica.
   Un bloque de pura tipografía necesita UNA cosa que no sea letra, o se lee
   como un párrafo largo en vez de como una declaración. */
.credo-ast{display:block;width:34px;height:34px;margin-bottom:1.25rem;
  background:var(--ac-oliva);opacity:.9;
  -webkit-mask:url("grafico/asterisco.svg") no-repeat center/contain;
          mask:url("grafico/asterisco.svg") no-repeat center/contain;
  rotate:calc(var(--deriva) * 18deg)}

/* 4 · LA MARCA DEL CAMINO — la misma familia de marcas que el estante de la
   biblioteca, así que las dos páginas hablan el mismo idioma. El número se
   queda debajo, chiquito: la marca da carácter y el número da orden. */
.via-m{grid-row:1 / span 2;display:grid;justify-items:center;gap:0.4375rem;
  align-self:center}
.via-m svg{width:clamp(24px,2.4vw,30px);height:clamp(24px,2.4vw,30px);
  color:var(--ac-oliva);
  transition:transform .42s var(--curva),color .42s var(--curva)}
.via a:hover .via-m svg,.via a:focus-visible .via-m svg{
  transform:scale(1.12) rotate(-6deg);color:var(--coral)}
.via-n{font:500 0.6875rem/1 var(--cuerpo);letter-spacing:.1em;color:var(--tx-3)}

/* 🔴 Y EL BUG DE LA REJILLA: en el capítulo con foto, los tres renglones de
   texto eran tres FILAS de la rejilla, y la lámina —mucho más alta— estiraba
   esas filas repartiendo el sobrante entre ellas. Por eso el titular quedaba
   despegado de su párrafo, con un hueco de aire en medio que no puso nadie.
   La corrección: el texto se agrupa en UNA fila que se alinea arriba, y la
   altura de la lámina deja de repartirse entre sus renglones. */
@media (min-width:901px){
  .nudo:has(.lamina){grid-template-rows:auto;align-items:start}
  .nudo:has(.lamina) .nudo-donde{grid-row:1}
  .nudo:has(.lamina) .nudo-tit{grid-row:2}
  .nudo:has(.lamina) .nudo-tx{grid-row:3}
  .nudo:has(.lamina){grid-template-rows:auto auto 1fr}
  .nudo:has(.lamina) .lamina{grid-row:1 / span 3;align-self:start}
}

/* 🔴 Y el hueco que quedaba entre el titular y su párrafo NO era estiramiento:
   era el `gap` de la rejilla, que aplica a filas Y a columnas por igual — 72 px
   pensados para separar el texto de la foto se estaban colando entre cada
   renglón. Un `gap` sirve a un eje a la vez cuando las dos direcciones piden
   ritmos distintos: la separación vertical ya la traen los márgenes del texto. */
@media (min-width:901px){
  .nudo:has(.lamina){row-gap:0}
}

/* 🔴 LAS PEGATINAS DE VERDAD. Yo había usado `grafico/*.svg` — las formas BASE,
   planas y de un solo color. Las piezas TERMINADAS viven en
   `grafico/pegatinas/`: quince troqueles ya coloreados y con su sombreado, que
   es lo que las hace ver físicas, y son las que la home usa. Misma forma,
   versión sin acabar. Por eso esta página se veía como el borrador de la home.
   Van como `<img>` porque ya traen su color: una máscara lo tiraría. */
.nudo-peg{position:absolute;left:calc(clamp(46px,7vw,104px) * -1 - 6px);
  top:-22px;width:clamp(44px,4.4vw,60px);height:auto;pointer-events:none;
  rotate:-9deg;
  /* La sombra de contacto sigue la silueta troquelada, no la caja: es lo que
     las despega del papel en vez de dejarlas impresas encima. */
  filter:drop-shadow(0 4px 5px rgba(44,44,44,.26));
  translate:0 calc(var(--deriva) * -16px);
  transition:rotate .5s var(--curva)}
.nudo:hover .nudo-peg{rotate:4deg}

/* ═══ SOBRE · CAPA 3 · PROFUNDIDAD Y OFICIO TIPOGRÁFICO ════════════════════
   🔴 paco: "los textos siempre los usas igual, no lo usas como un diseñador
   gráfico". Cierto: titular serif ligera + párrafo gris, en las cinco
   secciones. Eso es aplicar un estilo, no componer. Un diseñador cambia de
   REGISTRO según lo que el texto hace — afirmar, rematar, fechar, enumerar. */

/* 1 · EL CREDO EN DOS REGISTROS.
   Su frase tiene dos golpes distintos y estaba dicha con una sola voz.
   Ahora el primero AFIRMA en redonda y el segundo REMATA en cursiva, más
   grande y desplazado a la derecha: la frase hace lo que dice — empieza
   plantada y termina abriéndose. La cursiva es el "segundo registro" del lujo:
   lo vivo no es el tamaño, es el CARÁCTER. */
.credo-frase{display:grid;gap:0;max-width:22ch}
.cf-1{display:block;font-size:clamp(1.625rem,3.4vw,2.875rem);line-height:1.14;
  letter-spacing:-.012em}
.cf-2{display:block;margin-left:clamp(1.25rem,4vw,5.625rem);
  font-size:clamp(2rem,4.8vw,4.25rem);line-height:1.08;letter-spacing:-.018em}
.cf-2 em{font-style:italic;color:var(--ac-oliva)}

/* 2 · EL TITULAR DEL CAPÍTULO SE SALE DE LA COLUMNA.
   Estaba alineado con su párrafo, así que competía con él por el mismo eje y
   los dos se leían como un bloque. Sacarlo a la izquierda le da su propio eje
   óptico: se lee como TÍTULO antes de leerse como texto. Es alineación óptica,
   el ajuste que separa una página compuesta de una maquetada. */
@media (min-width:901px){
  .nudo-tit{margin-left:calc(clamp(0.875rem,1.6vw,1.625rem) * -1)}
}
/* Y la fecha estrena filete: un rótulo suelto es una etiqueta, un rótulo con
   filete es una PARADA del recorrido. */
.nudo-donde{display:flex;align-items:center;gap:0.75rem}
.nudo-donde::after{content:"";flex:1;max-width:4.375rem;height:1px;
  background:currentColor;opacity:.42}

/* 3 · LAS PEGATINAS SUELTAS — la capa que da profundidad.
   🔴 Cada una lleva SU velocidad. Si todas derivan igual se leen como una sola
   capa pegada al fondo, y una capa no da profundidad: la da la DIFERENCIA de
   velocidad entre capas. Los multiplicadores van de -70 a 44 px a propósito —
   unas suben y otras bajan, que es lo que hace que el plano se abra. */
.peg-suelta{position:absolute;z-index:0;pointer-events:none;height:auto;
  filter:drop-shadow(0 5px 7px rgba(44,44,44,.22));
  translate:0 calc(var(--deriva) * var(--vel,-30px))}
.saludo,.credo,.caminos{overflow:hidden}
.ps-a{--vel:-64px;left:52%;top:12%;width:clamp(26px,2.4vw,38px);rotate:12deg}
.ps-b{--vel:38px;left:-1.5%;bottom:9%;width:clamp(54px,6vw,92px);rotate:-14deg;opacity:.9}
.ps-c{--vel:-70px;right:7%;top:16%;width:clamp(46px,5vw,78px);rotate:9deg}
.ps-d{--vel:44px;left:-2%;top:26%;width:clamp(60px,7vw,110px);rotate:-8deg;opacity:.85}
.ps-e{--vel:-52px;right:4%;bottom:14%;width:clamp(40px,4.4vw,66px);rotate:16deg}

/* 4 · LA LÁMINA DEL SALUDO, EN 3D DE VERDAD.
   Era un rectángulo girado 1.4° — plano con una rotación encima, que es
   justamente lo que se lee como plantilla. El sitio YA sabe hacer profundidad:
   la cita del home corre con `perspective` + `translateZ` manejados por el
   scroll. Aquí se usa el mismo idioma en vez de inventar otro.
   La pieza entra inclinada y se ENDEREZA conforme sube: el gesto es "algo que
   se te acerca", no "algo que gira". */
.saludo-caja{perspective:1200px;perspective-origin:66% 44%}
.lamina-video{transform-style:preserve-3d;
  --e:clamp(0,calc(0.5 + var(--deriva) * 0.9),1);
  transform:rotateY(calc((1 - var(--e)) * -13deg))
            rotateX(calc((1 - var(--e)) * 6deg))
            translateZ(calc((1 - var(--e)) * -90px));
  rotate:none}
/* La sombra crece con la inclinación: sin eso el objeto gira pero no se
   despega, y el ojo lee el truco. */
.lamina-video{box-shadow:
  inset 0 1px 0 rgba(255,255,255,.6),
  0 1px 1px rgba(44,44,44,.13),
  0 calc(16px + (1 - var(--e)) * 22px) calc(26px + (1 - var(--e)) * 26px)
    -14px rgba(44,44,44,.38)}

@media (prefers-reduced-motion:reduce){
  .peg-suelta{translate:0}
  .lamina-video{transform:none}
}

/* ═══ SOBRE · CAPA 4 · LOS DOS EVENTOS QUE FALTABAN ════════════════════════ */

/* 1 · EL CREDO SE ENCIENDE CON LA LECTURA.
   Apagada no es invisible: a .18 el renglón sigue ocupando su sitio y se
   adivina, así que la línea NO SALTA cuando enciende — que es el error que
   convierte un revelado elegante en un parpadeo. */
.credo-frase .w{opacity:.18;transition:opacity .5s var(--curva)}
.credo-frase .w.on{opacity:1}
.credo-frase em.w{font-style:italic}

/* 2 · LOS CAMINOS: LA VÍA ELEGIDA APARTA A LAS DEMÁS.
   Antes solo se subrayaba, que es lo mismo que hace cualquier lista. Ahora el
   bloque REACCIONA COMPLETO: la vía mirada crece y se planta, y las otras
   ceden — retroceden un poco y bajan de peso. Es el gesto de un índice físico
   cuando abres un renglón, y es lo que convierte una lista en un selector.
   Va con `:has()`, sin una línea de JS. */
.vias:has(.via a:hover) .via:not(:hover) a,
.vias:has(.via a:focus-visible) .via:not(:focus-within) a{
  opacity:.46;transform:scale(.985);transform-origin:left center}
.via a{transition:padding-left .42s var(--curva),opacity .42s var(--curva),
                  transform .42s var(--curva)}
.via a:hover,.via a:focus-visible{padding-left:1.25rem}
.via a:hover .via-t,.via a:focus-visible .via-t{color:var(--ac-oliva)}
/* El filete de la vía activa se pinta de marca y engorda: el renglón que estás
   mirando deja de ser una línea de tabla y se vuelve un subrayado a mano. */
.via a{box-shadow:0 1px 0 rgba(44,44,44,.12)}
.via a:hover,.via a:focus-visible{box-shadow:0 2px 0 var(--ac-oliva)}


/* ═══ SOBRE · CAPA 5 · EL RECORRIDO, REDISEÑADO ════════════════════════════
   🔴 paco: "no me convence". Medido en la captura y tenía razón por tres vías
   distintas, ninguna de opinión:

   · El capítulo de Australia tenía 130 px de texto contra 430 px de foto. Eran
     300 px de arena muerta, y el ojo los lee como un error de armado.
   · Los tres capítulos compartían UNA sola espina —rótulo, título, párrafo
     gris— repetida tal cual. Tres momentos distintos de una vida contados con
     la misma voz es una plantilla, no una composición.
   · La sección usaba DOS colores de una paleta de ocho. Su marca es clara,
     cálida y COLORIDA; esto era arena sobre arena.

   La corrección no es más adorno: es dar a cada capítulo su propio registro y
   su propia temperatura, y llenar el hueco con material que significa algo. */

/* 1 · EL HILO EN DOS TRAZOS — la ruta y la tinta.
   La `dasharray` ya estaba ocupada dibujando el avance, así que el camino por
   andar no tenía cómo verse: el hilo aparecía de la nada. Ahora el punteado va
   siempre puesto y la tinta lo sigue. Se lee como un recorrido marcado a lápiz
   que se repasa con pluma, que es exactamente lo que hace una papelería. */
.cordel-hilo{opacity:1;color:var(--oliva)}
.cordel-hilo .ch-ruta{stroke-dasharray:1 9;stroke-dashoffset:0;opacity:.30}
.cordel-hilo .ch-tinta{stroke-dasharray:var(--largo,2000);
  stroke-dashoffset:calc(var(--largo,2000) * (1 - var(--trazo,1)));opacity:.72}

/* 2 · EL ARMADO DEL CAPÍTULO.
   🔴 El texto se agrupa en UN bloque y la pila en otro: antes cada renglón era
   una fila de la rejilla y la altura de la foto se repartía entre ellos. Y la
   pila va CENTRADA — así el sobrante de altura se parte arriba y abajo en vez
   de caer entero debajo del párrafo, que es de dónde salían los 300 px. */
.nudo{display:grid;grid-template-columns:minmax(0,1fr);position:relative;isolation:isolate}
.nudo-cuerpo{position:relative;z-index:2;min-width:0}
.nudo-pila{position:relative;z-index:2}
@media (min-width:901px){
  .nudo:has(.nudo-pila){grid-template-columns:minmax(0,1fr) auto;
    column-gap:clamp(1.875rem,4.4vw,4.875rem);row-gap:0;align-items:center}
}
@media (max-width:900px){
  .nudo-pila{margin-top:1.625rem}
}

/* 3 · EL ECO — el número del capítulo, a escala de marca de agua.
   No es un dato: es PESO. Un bloque de texto corto en una sección ancha se ve
   flotando; un número enorme detrás le da suelo y de paso ocupa el hueco con
   algo intencional en vez de con aire. Va en el tinte del capítulo y a .085,
   por debajo del umbral en que compite con la lectura. */
.nudo-eco{position:absolute;z-index:0;pointer-events:none;user-select:none;
  font-family:var(--serif);font-weight:300;line-height:.78;
  font-size:clamp(6rem,13vw,11.875rem);letter-spacing:-.03em;
  color:var(--tinte);opacity:.085;
  translate:0 calc(var(--deriva) * -26px)}
/* Con foto el hueco está ABAJO a la izquierda; sin foto, la mitad derecha
   entera está libre y ahí es donde el número hace de contrapeso. */
.nudo:has(.nudo-pila) .nudo-eco{left:-.06em;bottom:-.10em}
.nudo:not(:has(.nudo-pila)) .nudo-eco{right:4%;top:-.16em}
/* Un eco que es PALABRA ocupa mucho más ancho que uno de dos cifras y a igual
   tamaño se vuelve un titular fantasma que compite con el de verdad. Se baja. */
.nudo-eco:not(.eco-n){font-size:clamp(4rem,7.6vw,7rem);opacity:.075}
@media (max-width:900px){
  .nudo-eco{font-size:clamp(4.875rem,22vw,7.5rem)}
  .nudo:has(.nudo-pila) .nudo-eco{left:auto;right:2%;bottom:auto;top:-.14em}
}

/* 4 · LA MASA DE COLOR — lo que saca a la sección del monocromo.
   Una de sus tres masas validadas, enorme, en el tinte del capítulo y con su
   propia velocidad de deriva. A .11 no pinta: TIÑE. Es la diferencia entre un
   fondo de un color y un fondo con temperatura. */
.nudo-masa{
  /* 🔴 v2 — FUERA. Estas masas rompían DOS reglas suyas a la vez: son formas
     DIBUJADAS ("quitemos todos esos iconos dibujados") y son lavados de color
     al 11% ("no me gustan los fondos verdes o azules pálidos"). Que fueran
     grandes y tenues no las salvaba: seguían siendo el mismo recurso.
     Lo que ocupa su lugar en esta página es la CIFRA FANTASMA que ya vive aquí
     (.nudo-eco) y la placa del titular — color como marca, no como mancha. */
  display:none;
  position:absolute;z-index:0;pointer-events:none;
  background:var(--tinte);opacity:.11;
  -webkit-mask:var(--masa) no-repeat center/contain;
          mask:var(--masa) no-repeat center/contain}
.nm-a{--masa:url("grafico/blob-nube.svg");
  /* Medido: puesta a la derecha caía DETRÁS de la lámina (979-1390 contra
     993-1335) — o sea invisible y encima ensuciando el canto de la foto. Se va
     al hueco de abajo-izquierda, que es el que había que llenar. */
  left:18%;bottom:-14%;width:min(380px,32vw);aspect-ratio:1.2;
  translate:0 calc(var(--deriva) * 34px);rotate:-6deg}
.nm-b{--masa:url("grafico/blob-gota.svg");
  right:16%;top:-14%;width:min(330px,28vw);aspect-ratio:1;
  translate:0 calc(var(--deriva) * -52px);rotate:12deg}
.nm-c{--masa:url("grafico/blob-luna.svg");
  right:-8%;top:30%;width:min(420px,34vw);aspect-ratio:1;
  translate:0 calc(var(--deriva) * -30px);rotate:-14deg}
@media (max-width:700px){ .nudo-masa{display:none} }

/* 5 · EL RÓTULO SE TIÑE — pero el texto NO usa el tinte crudo.
   El coral y el lila a plena saturación sobre arena no llegan a contraste de
   lectura. El color saturado se va al filete y a las masas —donde es forma, no
   texto— y el rótulo usa el tinte ya bajado contra carbón. Misma temperatura,
   contraste intacto. */
.nudo-donde{color:color-mix(in oklch,var(--tinte,var(--oliva)) 55%,var(--carbon))}
.nudo-donde::after{background:var(--tinte,var(--oliva));opacity:1;max-width:6rem}

/* 6 · LOS DOS REGISTROS DEL PÁRRAFO.
   La frase que AFIRMA entra más grande y en carbón; la que remata va en cuerpo
   y en gris. Mismas palabras, dos voces — que es lo que faltaba. */
.nudo-tx-entrada{font-size:clamp(1.125rem,1.55vw,1.3125rem);line-height:1.5;
  color:var(--carbon);max-width:34ch}
.nudo-tx-entrada + .nudo-tx{margin-top:0.625rem}

/* 7 · LA CUENTA — la enumeración del capítulo 2.
   Cuatro cosas dentro de un párrafo corrido se leen como una sola. Sacadas a
   renglón, con su punto en el tinte, se leen como cuatro. Es el mismo texto:
   lo que cambió es que ahora se VE que son cuatro. */
.cuenta{list-style:none;margin:1rem 0 0;padding:0;display:grid;gap:0.5625rem;
  max-width:34ch}
.cuenta li{position:relative;padding-left:1.375rem;
  font-family:var(--serif);font-weight:300;
  font-size:clamp(1.1875rem,1.9vw,1.5625rem);line-height:1.28;letter-spacing:-.008em}
.cuenta li::before{content:"";position:absolute;left:0;top:.55em;
  width:8px;height:8px;border-radius:50%;background:var(--tinte)}
/* El último cierra en cursiva: la lista no termina, se abre. */
.cuenta li:last-child{font-style:italic;
  color:color-mix(in oklch,var(--tinte) 58%,var(--carbon))}

/* 8 · LAS FICHAS — las cinco cosas de hoy, cada una con su troquel.
   Iban dentro de un párrafo gris. Son el remate del recorrido y el único lugar
   de la página donde entra la paleta completa: cinco piezas, cinco colores.
   Los troqueles ya traen su color y su sombreado — por eso van como <img>. */
.fichas{list-style:none;margin:1.25rem 0 0;padding:0;
  display:flex;flex-wrap:wrap;gap:0.625rem 0.75rem;max-width:44ch}
.fichas li{display:inline-flex;align-items:center;gap:0.5625rem;
  padding:0.5rem 1rem 0.5rem 0.625rem;border-radius:62.4375rem;
  background:var(--sup);box-shadow:inset 0 0 0 1px rgba(44,44,44,.10),
    0 1px 1px rgba(44,44,44,.10),0 8px 14px -10px rgba(44,44,44,.30);
  font:500 0.875rem/1 var(--cuerpo);letter-spacing:.005em;color:var(--carbon);
  transition:transform .42s var(--curva),box-shadow .42s var(--curva)}
.fichas img{width:26px;height:26px;display:block;
  filter:drop-shadow(0 2px 2px rgba(44,44,44,.22));
  transition:rotate .5s var(--curva)}
/* Cada ficha entra con su propio ángulo: cinco píldoras perfectamente
   alineadas se leen a botonera de app. Un grado y medio de desorden las
   devuelve a recortes de papel puestos a mano. */
.fichas li:nth-child(odd){rotate:-1.2deg}
.fichas li:nth-child(even){rotate:1deg}
.fichas li:hover{transform:translateY(-3px);
  box-shadow:inset 0 0 0 1px rgba(44,44,44,.10),
    0 2px 2px rgba(44,44,44,.10),0 14px 20px -12px rgba(44,44,44,.38)}
.fichas li:hover img{rotate:-10deg}

/* 9 · LA ETIQUETA DE EQUIPAJE — lo que vuelve PILA a una foto suelta.
   Una lámina sola en 700 px de arena es un rectángulo flotando. Un segundo
   objeto que la TRASLAPA por la esquina es oclusión, que es la señal de
   profundidad más fiable que hay: si A tapa a B, A está adelante, y el ojo lo
   resuelve antes de leer nada. Va con su propia velocidad de deriva porque una
   pila que se mueve en bloque vuelve a ser una sola capa. */
.tarjeta-viaje{position:absolute;left:-16%;bottom:6%;z-index:3;margin:0;
  display:grid;gap:3px;justify-items:start;
  padding:0.8125rem 1.25rem 0.875rem 1.625rem;border-radius:0.5rem 0.875rem 0.875rem 0.5rem;
  background:var(--amarillo);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.5),
    0 1px 1px rgba(44,44,44,.16),0 14px 22px -12px rgba(44,44,44,.42);
  rotate:-7deg;translate:0 calc(var(--deriva) * 30px)}
.tv-ojal{position:absolute;left:9px;top:50%;translate:0 -50%;
  width:9px;height:9px;border-radius:50%;
  background:var(--papel);box-shadow:inset 0 1px 1px rgba(44,44,44,.35)}
.tv-r{font:500 0.5938rem/1 var(--cuerpo);letter-spacing:.16em;
  text-transform:uppercase;color:rgba(44,44,44,.62)}
.tv-t{font-family:var(--serif);font-weight:300;font-size:1.25rem;
  line-height:1.05;letter-spacing:-.01em;color:var(--carbon)}
@media (max-width:900px){
  .tarjeta-viaje{left:auto;right:-6%;bottom:12%}
}

/* Reposo: sin movimiento, la pila se desarma y todo se apila derecho. */
@media (prefers-reduced-motion:reduce){
  .nudo-eco,.nudo-masa,.tarjeta-viaje{translate:none}
  .tarjeta-viaje{rotate:none}
  .fichas li{rotate:none}
  .cordel-hilo .ch-tinta{stroke-dashoffset:0}
}

/* 10 · EL AJUSTE DE MEDIDA, medido en pantalla ────────────────────────────
   Con la rejilla ya correcta seguía habiendo un vacío entre el texto y la foto:
   la columna del texto medía ~720 px y el párrafo solo usaba 340 (34ch). Un
   `gap` no se arregla con `gap` — se arregla dándole a cada lado el ancho que
   le toca. La foto sube a 400 px (su nativo es 840, así que a 2x todavía va
   sobrada) y la medida del texto se abre a 40ch, que sigue dentro del rango
   cómodo de lectura. */
@media (min-width:901px){
  .lamina-foto{width:min(400px,30vw)}
  .nudo-tx-entrada{max-width:40ch}
  .nudo-tx{max-width:42ch}
}


/* ═══ CAMINOS · CAPA 1 · EL ÍNDICE CON FOCO ════════════════════════════════
   Muere la columna de 250 px. La lista va a ancho completo y el medio entra
   DENTRO de la fila abierta, que es donde está el ojo. Ver el porqué medido en
   el comentario del HTML. */
.caminos-caja{display:block;margin-top:clamp(2.125rem,4vw,3.25rem)}
.vias{list-style:none;margin:0;padding:0}

/* 🔴 `.via a` AGARRABA EL BOTÓN. La regla estaba pensada para el RENGLÓN del
   acordeón, pero el selector alcanza a cualquier enlace dentro de `.via` — y
   dentro va el llamado a la acción. Con `display:grid` y una columna `1fr`,
   el botón se estiraba a 751 px de ancho: una píldora de lado a lado que se
   lee a barra de carga, no a botón. Medido, no supuesto.
   Se acota a `> .cara`, que es el renglón de verdad. */
.via > .cara{display:grid;
  grid-template-columns:auto auto minmax(0,1fr) auto;
  align-items:center;
  column-gap:clamp(0.75rem,1.6vw,1.375rem);row-gap:0;
  padding:clamp(1rem,1.8vw,1.375rem) 0;
  text-decoration:none;color:var(--carbon);
  box-shadow:0 1px 0 rgba(44,44,44,.12);
  transition:padding .28s var(--curva)}
.via:first-child > .cara{padding-top:0}   /* 🔴 acotado a `> .cara`: ver el porqué al final del archivo */
.via a:focus-visible{outline:3px solid var(--carbon);outline-offset:4px}

.via-m{display:grid;place-items:center}
.via-m svg{width:clamp(24px,2.4vw,30px);height:clamp(24px,2.4vw,30px);
  color:var(--ac-oliva);
  transition:transform .42s var(--curva),color .42s var(--curva)}
.via-n{font:500 0.75rem/1 var(--cuerpo);letter-spacing:.1em;color:var(--tx-3)}
.via-t{font-family:var(--serif);font-weight:300;
  font-size:clamp(1.3125rem,2.5vw,2rem);line-height:1.2;letter-spacing:-.008em}
.via-a{font:500 0.6875rem/1 var(--cuerpo);letter-spacing:.13em;
  text-transform:uppercase;color:var(--ac-oliva);justify-self:end}

/* 🔴 EL DESPLIEGUE SIN NÚMERO MÁGICO.
   `grid-template-rows: 0fr -> 1fr` anima la altura sin que nadie tenga que
   saber cuánto mide el contenido. Con `max-height` habría que adivinar un tope,
   y el día que una descripción crezca a tres renglones se corta en silencio.
   Los hijos llevan `overflow:hidden` porque a 0fr la fila mide 0 pero su
   contenido no se recorta solo. */
.via-abre{grid-column:3 / -1;
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  grid-template-rows:1fr;                      /* reposo SIN JS: todo abierto */
  column-gap:clamp(1.25rem,3vw,2.75rem);align-items:start;
  transition:grid-template-rows .30s var(--curva)}
.via-abre > *{overflow:hidden;min-width:0}
.via-d{font-size:0.9375rem;line-height:1.55;color:var(--tx-2);max-width:44ch;
  padding-top:0.625rem}

.via-escena{width:clamp(150px,17vw,240px);aspect-ratio:.7;
  border-radius:calc(var(--radio-chico) + 0.375rem);position:relative;
  /* v2 — el marco de la escena iba tintado al 14% del color del camino: un
     rectángulo pálido de color detrás del póster. El color de este bloque ya lo
     dan el troquel de 7 px y el rótulo, que van a saturación completa. */
  background:var(--sup);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.5),0 1px 1px rgba(44,44,44,.12)}
.via-escena video{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;border-radius:inherit;
  opacity:0;transition:opacity .34s var(--curva)}
.via-escena video.ver{opacity:1}

/* El recogido SOLO existe cuando el script lo enciende y cuando hay ratón. En
   táctil y sin JS la lista se lee entera, que es el reposo correcto. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via .via-abre{grid-template-rows:0fr}
  .js-foco .via.abierta .via-abre{grid-template-rows:1fr}
  .js-foco .via.abierta a{padding-bottom:clamp(1.5rem,2.6vw,2.125rem)}
}

/* 🔴 Y LAS REGLAS VIEJAS QUE SEGUÍAN MANDANDO.
   `.via-d` traía `grid-column:2` y `.via-a` traía `grid-row:1;grid-column:3` de
   la maqueta anterior. Una regla nueva se queda SOLO con lo que declara: lo que
   no toca lo sigue poniendo la vieja. Resultado medido: el desplegable se armó
   en DOS filas (56.5px y 342.8px) con la descripción en la columna 2 y el video
   empujado a una fila propia. Por eso hay que reponerlas a mano, no confiar en
   que la regla de abajo las tape. */
.via-d{grid-column:auto;grid-row:auto}
.via-escena{grid-column:auto;grid-row:auto}
.via-a{grid-column:4;grid-row:1}
.via-m{grid-column:1;grid-row:1 / span 2;align-self:center}
.via-n{grid-column:2;grid-row:1}
.via-t{grid-column:3;grid-row:1}

/* 🔴 Y POR QUÉ HACE FALTA UN ENVOLTORIO MÁS.
   `grid-template-rows:0fr` sizea la pista a `minmax(auto, 0fr)`: el mínimo sigue
   siendo la aportación de min-content de los hijos. `overflow:hidden` anula ese
   mínimo automático SOLO cuando la altura del hijo es automática — y la escena
   tiene altura definida por `aspect-ratio` (240 x .7 = 343 px), así que la pista
   nunca bajaba de 343. Medido: las filas cerradas seguían midiendo 426.
   La solución canónica es un hijo ÚNICO de altura automática que recorta; las
   dos columnas viven dentro de él. */
.via-abre > .va-in{overflow:hidden;min-height:0;min-width:0;
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  column-gap:clamp(1.25rem,3vw,2.75rem);align-items:start}
.via-abre{grid-template-columns:none;column-gap:0}

/* 🔴 Y `0fr` NO COLAPSA. Probado en vivo, no supuesto: poniendo
   `grid-template-rows:0fr` EN LÍNEA sobre una fila cerrada, el desplegable se
   quedó en 343 px exactos; solo bajó a 0 forzando la altura del envoltorio. El
   mínimo `auto` de la pista no se anula porque la escena tiene altura definida
   por `aspect-ratio`, no automática — y `overflow:hidden` solo mata el mínimo
   automático cuando la altura ES automática.

   La salida no es adivinar un `max-height`: el alto abierto se CALCULA de la
   misma medida que dimensiona el video. Si mañana la escena cambia de ancho o
   de proporción, el desplegable la sigue solo. */
.via{--esc-w:clamp(150px,17vw,240px);--esc-p:.7}
.via-escena{width:var(--esc-w);aspect-ratio:var(--esc-p)}
.via-abre{display:block;transition:none}
.via-abre > .va-in{height:auto;transition:height .30s var(--curva)}
@media (min-width:901px) and (hover:hover){
  .js-foco .via .va-in{height:0}
  .js-foco .via.abierta .va-in{height:calc(var(--esc-w) / var(--esc-p))}
}

/* La marca y el número cuelgan de la fila entera (`grid-row:1/span 2`), así que
   con `align-self:center` se iban al medio de una fila de 438 px y quedaban
   flotando a 250 px de su propio título. Se anclan arriba, con el título. */
.via-m,.via-n{align-self:start}
.via-m{margin-top:-2px}


/* ═══ CAMINOS · CAPA 2 · LA BANDA QUE ENTRA POR DONDE ENTRASTE ═════════════
   Mecanismo tomado de Flowing Menu (ReactBits), abierto en vivo. Su gracia NO
   es el marquee: es que la banda entra desde el borde por el que cruzó el
   cursor. Si bajaste, sube; si subiste, baja; y al salir se va por donde te
   fuiste. Ese detalle es todo — sin él es una animación de plantilla, con él el
   bloque se siente físico, como una hoja que se desliza bajo la que lees.

   Lo que NO se copia: su fondo oscuro y su marquee a sangre. Aquí la banda es
   el campo de color del camino, y la cinta de texto es una tira de washi tape
   sobre el canto superior — que es el vocabulario de una papelería, no el de un
   portafolio de agencia. */
.via a{position:relative;isolation:isolate}
.via-m,.via-n,.via-t,.via-a,.via-abre{position:relative;z-index:1}

.via-banda{position:absolute;inset:0 -18px;z-index:0;pointer-events:none;
  overflow:hidden;border-radius:calc(var(--radio-chico) + 0.25rem)}
/* `--dir` lo escribe el JS: -1 entraste por arriba, 1 por abajo. El reposo es
   fuera de cuadro por ese mismo borde. */
.vb-campo{position:absolute;inset:0;
  background:linear-gradient(180deg,
    color-mix(in oklch,var(--tinte,var(--oliva)) 15%,transparent) 0%,
    color-mix(in oklch,var(--tinte,var(--oliva)) 6%,transparent) 62%,
    transparent 100%);
  transform:translateY(calc(var(--dir,-1) * 101%));
  transition:transform .44s var(--curva)}
.via.abierta .vb-campo{transform:translateY(0)}

/* (La cinta de texto corriendo sobre el canto: FUERA. paco, mirandola en
   pantalla: ahi arriba no lee a washi tape, lee a ruido — una tira de la misma
   palabra repetida catorce veces compite con el rotulo de la derecha, que dice
   exactamente lo mismo una sola vez y bien. El campo de color se queda; la
   tira no hacia falta para nada.) */

/* Con movimiento reducido no hay fila abierta —nada se recoge—, asi que la
   banda de CADA camino se queda puesta y quieta. Antes colgaba de `.abierta` y,
   al no existir, se apagaban las cinco: quien pide menos movimiento perdia la
   capa de color completa y volvia a ver crema sobre crema. */
@media (prefers-reduced-motion:reduce){
  .vb-campo{transform:none;opacity:1}
}

/* El degradado del campo GIRA con la dirección de entrada. Si la hoja entra
   desde arriba, su lado denso —el que hace de sombra propia— tiene que quedar
   arriba; si entra desde abajo, abajo. Con el degradado fijo, la mitad de las
   entradas se veían al revés y el gesto perdía la mitad de su sentido físico.
   `calc(90deg - var(--dir) * 90deg)`: -1 da 180deg, 1 da 0deg. */
.vb-campo{background:linear-gradient(calc(90deg - var(--dir,-1) * 90deg),
    color-mix(in oklch,var(--tinte,var(--oliva)) 15%,transparent) 0%,
    color-mix(in oklch,var(--tinte,var(--oliva)) 6%,transparent) 62%,
    transparent 100%)}


/* ═══ CAMINOS · CAPA 3 · LA FILA ABIERTA SE DESPEGA ════════════════════════
   El `:has()` que ya vivía aquí solo APAGABA a las demás. Apagar no es
   profundidad: la profundidad la da que una avance mientras las otras
   retroceden. Falta la mitad del gesto, y es la mitad que se siente.

   Liga A —perspectiva CSS, cero WebGL—: la fila abierta se acerca en Z, así que
   crece un pelo de verdad en vez de fingirlo con `scale`, y estrena sombra de
   contacto en la MISMA dirección de luz que el troquel y las láminas del sitio.
   Una sola fuente de luz para toda la página o el papel deja de ser papel. */
.vias{perspective:1500px;perspective-origin:40% 50%}
.via a{transform-style:preserve-3d;
  transition:transform .44s var(--curva),opacity .44s var(--curva),
             padding .28s var(--curva)}

/* 🔴 El modelo viejo de hover seguía vivo y peleaba: bajaba a .46 a todas las
   que no tenían el cursor —incluida la abierta cuando el cursor iba de salida—
   y pintaba un filete oliva bajo el enlace. Se neutraliza con los MISMOS
   selectores, o su especificidad le gana a cualquier regla nueva. */
.vias:has(.via a:hover) .via:not(:hover) a,
.vias:has(.via a:focus-visible) .via:not(:focus-within) a{
  opacity:1;transform:none}
.via a:hover,.via a:focus-visible{box-shadow:0 1px 0 rgba(44,44,44,.12)}

@media (min-width:901px) and (hover:hover){
  /* Retroceso: .74 y no .5. Medido — a .5 el rótulo de 11 px se cae por debajo
     del contraste mínimo, y una fila recogida sigue teniendo que ser legible:
     es la que estás a punto de elegir. */
  .js-foco .via a{opacity:.74;transform:translateZ(0)}
  .js-foco .via.abierta a{opacity:1;transform:translateZ(13px)}
  .js-foco .via.abierta .via-banda{
    box-shadow:inset 0 1px 0 rgba(255,255,255,.55),
      0 1px 1px rgba(44,44,44,.10),
      0 18px 30px -16px rgba(44,44,44,.28)}
}
.via-banda{transition:box-shadow .44s var(--curva)}

@media (prefers-reduced-motion:reduce){
  .js-foco .via.abierta a{transform:none}
}

/* 🔴 LA PERSPECTIVA NO LLEGABA. `perspective` en `.vias` solo alcanza a sus
   hijos DIRECTOS —los `li`—, y yo estaba transformando el `<a>`, que es nieto.
   Medido: la fila abierta salía con `matrix3d` y translateZ 13 pero seguía
   midiendo 1248 px, exactamente lo mismo que una cerrada. O sea: había 3D en el
   papel y cero en pantalla. El movimiento se sube al `li`. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via a{transform:none}
  .js-foco .via{transform:translateZ(0);
    transition:transform .44s var(--curva)}
  .js-foco .via.abierta{transform:translateZ(16px)}
}

/* 🔴 Y EL RÓTULO RECOGIDO NO PASABA. A opacidad .74 el `--ac-oliva` de 11 px
   quedaba en 3.60 contra el mínimo de 4.5 — y una fila recogida es justo la que
   estás a punto de elegir, tiene que leerse. En vez de subir la opacidad y
   perder el retroceso, el rótulo cerrado suelta el color: se va a carbón, que
   aguanta el desvanecido. De paso el color pasa a ser el PREMIO de estar
   abierta, que es lo que debería haber sido desde el principio. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via:not(.abierta) .via-a{color:var(--carbon)}
  .js-foco .via:not(.abierta) .via-m svg{color:var(--tx-3)}
  .js-foco .via.abierta .via-m svg{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 58%,var(--carbon))}
}

/* Y el `<a>` conservaba SU translateZ: `.via.abierta a` (0,3,1) le gana a
   `.via a` (0,2,1), así que la fila acababa con dos empujes en Z apilados.
   Se apaga con la misma especificidad. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via.abierta a{transform:none}
}


/* ═══ CAMINOS · CAPA 4 · EL COLOR DE CADA CAMINO ═══════════════════════════
   La banda ya trae el campo; falta que el color LLEGUE al contenido. Esto sale
   de marcosmeticsco —la referencia que eligió ella—, que resuelve todo su sitio
   con color por franja: un solo tono manda por bloque y cambia al pasar al
   siguiente. Aquí el bloque es la fila, así que el tono cambia al elegir.

   🔴 El tinte crudo NUNCA toca texto. Coral, lila y amarillo a plena saturación
   sobre crema no llegan a contraste de lectura. El texto usa el tinte ya bajado
   contra carbón; el color puro se queda en la banda, la placa y el troquel,
   donde es forma y no letra. Dos mezclas distintas porque el mínimo cambia con
   el tamaño: 4.5 para el rótulo de 11 px, 3 para el titular grande. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via.abierta .via-t{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 62%,var(--carbon))}
  .js-foco .via.abierta .via-a{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 50%,var(--carbon))}
  .js-foco .via.abierta .via-n{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 46%,var(--carbon))}
}

/* LA PLACA DEL VIDEO — la misma construcción de lámina que ya usa todo el
   sitio: forro de color que asoma, canto claro arriba y sombra de contacto
   corta. Va con `box-shadow` y no con `border` porque un borde real pelearía
   con el `aspect-ratio` (se lo come el modelo de caja) y la escena dejaría de
   medir lo que el cálculo del desplegable cree que mide. */
.via-escena{
  box-shadow:
    0 0 0 7px color-mix(in oklch,var(--tinte,var(--oliva)) 34%,var(--crema)),
    inset 0 1px 0 rgba(255,255,255,.5),
    0 1px 1px rgba(44,44,44,.13),
    0 16px 24px -14px rgba(44,44,44,.34)}

/* EL TROQUEL DEL CAMINO — una pieza por fila, no tres. Su guía es explícita:
   amontonadas se vuelven confeti, y ella pidió evitar "que se vea muy AI".
   Va pegado a la esquina del video y lo TAPA: la oclusión es lo que lo vuelve
   una pegatina puesta encima en vez de un dibujo impreso al lado. */
.via-peg{position:absolute;left:-22px;top:-18px;z-index:2;
  width:clamp(38px,3.6vw,52px);height:auto;pointer-events:none;
  rotate:-11deg;
  filter:drop-shadow(0 4px 5px rgba(44,44,44,.26));
  opacity:0;transform:scale(.82);
  transition:opacity .34s var(--curva),transform .44s var(--curva),
             rotate .44s var(--curva)}
.via.abierta .via-peg{opacity:1;transform:scale(1);rotate:-7deg}

@media (max-width:900px){
  .via-peg{opacity:1;transform:none;left:-14px;top:-12px}
}

/* 🔴 Y LOS PORCENTAJES NO ERAN LOS BUENOS. Rasterizando el color computado
   —`color-mix(in oklch,…)` devuelve oklch, y leerlo como si fuera RGB da
   números inventados— el rótulo de 11 px salió en 4.10 con lima y 4.14 con
   amarillo, contra el mínimo de 4.5; menta quedó clavada en 4.50, que es pasar
   de milagro. Los dos tonos más claros de su paleta son los que truenan, y son
   justo los que más va a querer usar. Se bajan las mezclas. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via.abierta .via-t{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 56%,var(--carbon))}
  .js-foco .via.abierta .via-a{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 38%,var(--carbon))}
  .js-foco .via.abierta .via-n{
    color:color-mix(in oklch,var(--tinte,var(--oliva)) 40%,var(--carbon))}
}


/* ═══ CAMINOS · CAPA 5 · TRES REGISTROS Y EL CAMPO VACÍO ═══════════════════
   Lo que quedaba mal después de la capa 4, medido: la fila abierta mide 438 px
   porque la marca la pone el video, pero la descripción llena 60. Eran ~800x300
   de campo de color con NADA. Y el bloque de decisión de la página no tenía una
   sola línea de acción — cinco frases que dicen qué quieres y ningún "y aquí es
   dónde se va". Las dos cosas se resuelven con la misma pieza.

   Los tres registros: el título AFIRMA (grande, en el tinte), la descripción
   EXPLICA (17.5 px y gris; iba a 15, y glucosegoddess —su propia referencia—
   corre a 20 para un público de mujeres de 30 a 60), y la línea de acción
   REMATA abajo del todo. Uno por función, no uno para todo. */
@media (min-width:901px) and (hover:hover){
  .js-foco .via .via-t{transition:font-size .30s var(--curva),color .34s var(--curva)}
  .js-foco .via.abierta .via-t{font-size:clamp(1.75rem,3.4vw,2.875rem)}
}
.via-d{font-size:1.0938rem;line-height:1.56;max-width:40ch;padding-top:0.75rem}

/* La columna de texto se estira a lo alto del video para que la línea de acción
   caiga AL FONDO —`margin-top:auto`— en vez de quedar pegada al párrafo. Así el
   campo de color queda cerrado por arriba y por abajo, que es lo que lo vuelve
   un bloque compuesto y no un rectángulo con texto en una esquina. */
.va-in{position:relative;align-items:stretch}
.va-tx{display:flex;flex-direction:column;min-width:0;height:100%}
.via-ir{margin-top:auto;display:inline-flex;align-items:center;gap:0.625rem;
  align-self:start;
  font:500 0.8125rem/1 var(--cuerpo);letter-spacing:.10em;text-transform:uppercase;
  color:color-mix(in oklch,var(--tinte,var(--oliva)) 38%,var(--carbon));
  padding-bottom:0.375rem;box-shadow:0 1px 0 currentColor;
  transition:gap .34s var(--curva)}
.via-ir .ico{width:17px;height:17px}
.via:hover .via-ir,.via:focus-within .via-ir{gap:1rem}

/* EL ECO — la cifra del camino a escala de marca de agua. Mismo recurso que ya
   corre en el hilo de esta página (09 / 01 / Hoy), así que la página gana
   coherencia interna en vez de estrenar un juguete nuevo por sección. Va al
   fondo del campo, detrás de todo y a .10: no es un dato, es PESO. */
.via-eco{position:absolute;z-index:0;left:-.04em;bottom:-.16em;
  pointer-events:none;user-select:none;
  font-family:var(--serif);font-weight:300;line-height:.78;
  font-size:clamp(6rem,11vw,10.375rem);letter-spacing:-.03em;
  color:var(--tinte,var(--oliva));opacity:.10}
.va-tx,.via-escena{position:relative;z-index:1}

@media (max-width:900px){
  .via-eco{display:none}
  .via-ir{margin-top:1.125rem}
}

/* El eco caía JUSTO detrás de la línea de acción (medido: eco en x 176-343,
   acción en 183-339) y bajarle el contraste a lo único que invita a hacer clic
   es exactamente al revés de lo que debe pasar. Se corre al hueco de verdad: la
   descripción topa a 40ch (~380 px) dentro de una columna de 883, así que entre
   el párrafo y el video hay una franja de ~500 px que estaba vacía. */
.via-eco{left:auto;right:30%}


/* ═══ CAMINOS · MÓVIL ══════════════════════════════════════════════════════
   🔴 Medido a 390 px y estaba roto de tres maneras, todas por dar por hecho que
   una rejilla de cuatro columnas se encoge:

   · La escena se llevaba 150 px de los 342 de la lista, así que la descripción
     quedaba en una canaleta de ~110 px y se partía en renglones de CUATRO
     palabras: 203 px de alto para una frase de doce.
   · El rótulo del camino se salía por la derecha —arrancaba en 300 con 66 de
     ancho contra 342 de contenedor— y se recortaba en silencio. El documento
     no desbordaba, así que ninguna prueba de overflow lo habría cazado.
   · Y la escena era un rectángulo de color VACÍO: el video solo se monta donde
     hay ratón, y nadie había puesto nada en su lugar.

   En táctil la fila no se recoge —eso ya estaba bien: sin cursor no hay foco
   que seguir— así que lo que toca es apilar de verdad. */
@media (max-width:900px){
  .via a{grid-template-columns:auto minmax(0,1fr);
    column-gap:0.875rem;row-gap:0.25rem;padding:1.375rem 0}
  .via-m{grid-column:1;grid-row:1 / span 3;align-self:start}
  .via-n{grid-column:1;grid-row:4;justify-self:center;margin-top:0.375rem}
  .via-t{grid-column:2;grid-row:1;font-size:clamp(1.375rem,6.4vw,1.75rem)}
  /* El rótulo baja bajo el título en vez de pelearle el renglón: en 342 px no
     caben una frase de tres palabras y una etiqueta a la derecha. */
  .via-a{grid-column:2;grid-row:2;justify-self:start;margin-top:2px}
  .via-abre{grid-column:2;grid-row:3}
  .va-in{grid-template-columns:minmax(0,1fr);row-gap:1rem}
  .va-tx{height:auto}
  .via-d{max-width:none;padding-top:0.625rem}
  /* La escena deja de robarle ancho al texto: va debajo, a una medida que
     respeta su techo de resolución (nativo 540 -> 220 va a 2.45x). */
  .via-escena{width:min(220px,64vw);margin-top:2px}
}

/* EL PÓSTER — el reposo de la escena en TODAS las pantallas.
   Sin él, quien no tiene ratón (o quien tiene el JS caído) veía un rectángulo
   de color y nada más. Con él, la escena siempre enseña el cuadro del video, y
   en escritorio el video se monta encima cuando abre. Es el mismo principio que
   el resto de la página: el reposo tiene que ser legible por sí solo. */
.via-post{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  border-radius:inherit;display:block}
.via-escena video{z-index:1}

/* Y otra vez la especificidad: `.via-abre > .va-in` (0,2,0) le ganaba a mi
   `.va-in` (0,1,0) del bloque móvil, así que el desplegable seguía en DOS
   columnas y el texto seguía en su canaleta. Mismo selector o no hay cambio. */
@media (max-width:900px){
  .via-abre > .va-in{grid-template-columns:minmax(0,1fr);row-gap:1rem}
}

/* ═══ LA PILA · CAPA 5 · el momento firma ══════════════════════════════════
   Todo cuelga de `--p` (0→1) que pone `vida.js` en la sección, y de `--i`, el
   índice de cada portada. Cero JS por tarjeta: si el paralaje se midiera con el
   rect de cada figura no funcionaría, porque viven dentro de un sticky y ahí su
   rect se queda clavado — la misma trampa que ya documenta el valle.

   La aritmética, en dos tramos por tarjeta:
   · `--q` es el progreso LOCAL: cuánto ha avanzado la pila desde que le tocaba
     entrar a ESTA. Va de 0 (aún no) hasta n (ya pasaron todas las de después).
   · `--e` (0→1) es su ENTRADA: sube desde abajo del marco.
   · `--s` (0→n) es lo que lleva APILADA: por cada una que llega encima, retrocede
     un poco en Y y encoge. Encoger + subir es lo que el ojo lee como "atrás",
     y se acompaña de una caída de luz (perspectiva atmosférica) porque lejos no
     es solo más chico: es también más apagado.                               */
/* 🔴 v3 — EL PASO BAJA DE 62vh A 38vh, Y ES LA MITAD DEL RECORTE.
   La otra mitad la hizo el marcado (ocho figuras → cuatro productos, ver el
   comentario del HTML). Las dos juntas: 8×62+100 = 596vh contra 4×38+100 = 252vh.
   De 5.96 pantallas a 2.5 — la sección pasa del 27% del sitio al 13%.
   El paso NO se dejó en 62: con cuatro piezas el recorrido se reparte entre TRES
   turnos en vez de siete, así que 62vh daba 3.5 pantallas para enseñar cuatro
   objetos. A 38 cada turno dura ~50vh de scroll: media pantalla por producto,
   que es tiempo de sobra para leer un nombre y un color. */
.pila{position:relative;height:calc(var(--n) * 38vh + 100vh);background:var(--papel);--p:0}
/* 🔴 LA PRIMERA VERSIÓN PUSO EL TEXTO ENCIMA DE LA PILA y se veía como un
   error: el titular caía justo sobre las portadas y las palabras se mezclaban
   con el dorado. No era cuestión de subir un z-index — dos cosas que quieren
   ser el protagonista no caben en el mismo cuadro. Se reparte: la voz a la
   izquierda, los objetos a la derecha. Es la división editorial de sus dos
   referencias y de paso deja al texto sobre papel limpio, que es donde se lee. */
.pila-vista{position:sticky;top:0;height:100svh;overflow:hidden;isolation:isolate;
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);
  align-items:center;gap:clamp(1.5rem,4vw,4rem);
  padding-inline:var(--margen)}
.pila-cab{position:relative;z-index:3;grid-column:1;max-width:34rem}
.pila-cab .titular{max-width:13ch}
.pila-lee{display:flex;align-items:baseline;gap:0.75rem;margin-top:0.875rem;
  font:500 0.9375rem/1 var(--cuerpo)}
.pila-lee b{font-weight:500}
.pila-lee span{font-size:0.8125rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--tinte-activo,var(--cobalto));transition:color .5s var(--curva)}

/* ── EL CONTADOR ─────────────────────────────────────────────────────────────
   🔴 NUMERAR AQUÍ SÍ ES HONESTO, y es la única razón por la que existe. El
   sistema del sitio prohíbe los `01 / 02 / 03` decorativos —son el tic más
   reconocible del diseño generado— y solo los admite cuando el contenido ES una
   secuencia y el orden le dice algo al lector. Aquí lo es: cuatro productos que
   pasan en un orden fijo mientras la vista está anclada, y sin contador no hay
   forma de saber por dónde vas ni cuánto falta. Convierte hueco en información.
   ⚠️ El total lo cuenta el DOM (`figs.length` en vida.js), no está escrito a
   mano: al pasar de ocho piezas a cuatro, el 01/08 se volvió 01/04 solo.

   Va MUY tenue y detrás de todo (`z-index:0`, bajo el texto y bajo la pila): es
   una marca de agua, no un titular. Si compitiera con el nombre del producto
   habría dos cosas peleando por ser lo primero que se lee, que es exactamente el
   error que esta sección ya arregló una vez separando la voz de los objetos.

   🔴 VA ABAJO, NO A MEDIA ALTURA, y esto lo enseñó la captura. Puesto en `top:58%`
   caía justo DETRÁS del titular y cruzaba el rótulo del producto: aunque esté al
   13% de opacidad, un número gigante por debajo de una línea de texto de 13 px la
   vuelve ilegible — el ruido de fondo no se mide en opacidad, se mide en si el
   texto de encima se sigue leyendo. Baja al hueco real, que es la mitad inferior
   de la columna de texto, vacía en todo el recorrido. */
.pila-cuenta{position:absolute;left:0;bottom:5%;z-index:0;margin:0;
  font-family:var(--display);font-weight:700;
  font-size:clamp(5rem,13vw,12rem);line-height:.82;letter-spacing:-.02em;
  color:color-mix(in oklch, var(--tinte-activo, var(--cobalto)) 13%, transparent);
  pointer-events:none;user-select:none;white-space:nowrap;
  transition:color .62s var(--curva)}
.pila-cuenta span{font-size:.3em;letter-spacing:.06em;vertical-align:.9em;
  margin-left:.12em}

.pila-mesa{position:relative;grid-column:2;z-index:1;height:100%;
  display:grid;place-items:center;perspective:1400px}
/* 🔴 EL OBJETO CRECE, Y LO PIDIÓ LA MEDICIÓN. Medido: a 1999 px de ancho la
   portada daba 268 px, o sea el **13.4% de la pantalla** — y el 54.5% del cuadro
   era papel desnudo. Seis pantallas de scroll para enseñar ocho objetos del
   tamaño de un naipe: la sección se llama «La colección» y el surtido era lo más
   pequeño del cuadro.
   `17vw` topado en 268 dejaba el tope actuando desde los 1576 px de ancho hacia
   arriba, así que en pantallas grandes —las de escritorio, donde vive esta
   sección— el objeto ya no crecía nunca.

   🔴 EL TOPE ES 330, NO 380, Y LO DECIDIÓ LA CAPTURA. A 380 la aritmética decía
   que cabía —549 px de alto contra 845 de vista— y en pantalla el objeto se metía
   DEBAJO DEL ENCABEZADO FIJO, que es opaco y le cortaba la tapa. El alto libre no
   es el de la vista: es el de la vista MENOS el nav, y eso no estaba en la cuenta.
   A 330 el objeto mide 477 de alto, pasa de 268 a 330 (+23% a 1999, +28% a 1512)
   y se queda entero dentro del cuadro. */
.pl{position:absolute;margin:0;width:clamp(190px,20vw,330px);
  /* el progreso local y sus dos tramos */
  /* 🔴 EL `+ 1` NO ES UN AJUSTE FINO: ES EL REPOSO. Sin él, con `--p:0` la
     tarjeta 0 daba `--q:0` y por tanto opacidad 0 — la sección entera nacía
     INVISIBLE y solo aparecía cuando el JS escribía el primer `--p`. Sin JS no
     había nada que ver. Medido: 0 tarjetas visibles en reposo.
     Con el `+1`, en reposo la primera está puesta y las otras tres esperan
     debajo del marco, que es exactamente lo que se ve sin scroll.
     Y el recorrido va por `--n - 1`, no por `--n`, para que la ÚLTIMA llegue
     a apoyarse del todo (s=0) al final en vez de quedarse a medio apilar. */
  --q:clamp(0, calc(var(--p) * (var(--n) - 1) - var(--i) + 1), var(--n));
  /* 🔴 DOS CORRECCIONES QUE SALIERON DE MIRAR EL RENDER, no del código:
     · La entrada era de UN ALTO DE TARJETA (116%) y ocupaba el hueco entero
       entre portada y portada, así que lo que se veía no era una baraja
       apilándose sino tarjetas RESBALANDO hacia abajo. Ahora el viaje es corto
       (58%) y se consume en el primer 42% del turno: la mayor parte del scroll
       se pasa en el estado apilado, que es lo que hay que ver.
     · La opacidad iba pegada a la entrada, o sea a media entrada la portada
       estaba al 50% sobre papel crema y se leía LAVADA — el cobalto salía azul
       pastel. Justo el defecto que esta v2 vino a quitar. Ahora la opacidad
       resuelve en el primer 18% y el resto del viaje la portada ya va sólida. */
  --e:clamp(0, calc(var(--q) / .42), 1);
  --o:clamp(0, calc(var(--q) / .18), 1);
  --s:max(0, calc(var(--q) - 1));
  /* 🔴🔴 LA PERSPECTIVA ESTABA DECLARADA Y NO SE USABA. `.pila-mesa` lleva
     `perspective:1400px` desde el principio, pero las ocho portadas se movían
     SOLO en 2D — medido, el transform de la de arriba era
     `matrix(0.998, -0.0004, 0.0004, 0.998, 0, -0.611)`: escala y medio grado de
     giro plano. Ni un `rotateX`, ni un `rotateY`, ni un `translateZ` en toda la
     sección. La perspectiva estaba puesta para un efecto que nunca se escribió,
     así que no producía absolutamente nada.
     Ahora las que se hunden se inclinan hacia atrás y se ALEJAN de verdad en Z:
     la baraja deja de ser recortes apilados en un plano y pasa a ser un objeto
     con fondo. Es lo mismo que ya hacían `scale` y `brightness` fingiendo
     distancia — solo que ahora la distancia es real y la calcula el navegador.

     El `scale` explícito baja de .04 a .028 porque `translateZ` ya encoge por
     perspectiva: a `--s:7` (la del fondo) son −126 px, o sea un factor de
     1400/1526 = 0.917. Sumar los dos a su valor anterior dejaría la última
     portada demasiado pequeña.
     `rotateX` va POSITIVO: inclina el canto superior hacia atrás, que es como se
     hunde una carta en un montón. Negativo la levantaría hacia el ojo, que es el
     gesto contrario al que la pila está contando. */
  transform:
    translateY(calc((1 - var(--e)) * 58%))
    translateY(calc(var(--s) * -13px))
    translateZ(calc(var(--s) * -18px))
    rotateX(calc(var(--s) * 1.6deg))
    rotate(calc(var(--s) * -.5deg))
    scale(calc(1 - var(--s) * .028));
  opacity:var(--o);
  filter:saturate(calc(1 - var(--s) * .07)) brightness(calc(1 - var(--s) * .028));
  z-index:calc(10 + var(--i));
  will-change:transform}
.pl img{width:100%;height:auto;
  /* La sombra de contacto es lo que impide que el recorte flote. Va corta y
     baja, no un halo: el objeto se apoya en el papel. */
  filter:drop-shadow(0 22px 26px rgba(44,44,44,.26))}
/* 🔴 EL PIE NO SE PINTA EN LA PILA — y no por un fallo de opacidad. El sistema
   de desvanecido funciona (medido: nunca hay más de dos vivos). El problema es
   que DICE LO MISMO que el rótulo de la izquierda, que va gobernado por JS y es
   el bueno: el mismo nombre y el mismo color, dos veces en pantalla. Y como los
   ocho pies están clavados en la MISMA coordenada absoluta, durante el cruce se
   solapan el que entra al 100% y el que sale al 25% — que es la mancha de texto
   que se ve bajo las portadas.
   Se queda en el DOM porque es lo que lee un lector de pantalla y es el reposo
   sin JS; solo se apaga en la vista apilada. En movimiento reducido vuelve
   (ver más abajo): ahí no hay rótulo de JS y el pie es la única etiqueta. */
.pl figcaption{position:absolute;left:50%;bottom:-2.75rem;translate:-50% 0;
  display:flex;flex-direction:column;align-items:center;gap:.25rem;white-space:nowrap;
  font:500 0.8125rem/1.2 var(--cuerpo);text-align:center;
  opacity:0;pointer-events:none;
  transition:opacity .3s linear}
.pl figcaption span{font-size:0.6875rem;letter-spacing:.16em;text-transform:uppercase;
  color:var(--tx-3)}

/* El desplazamiento lateral en abanico: si las ocho cayeran clavadas en el mismo
   eje, la pila se leería a baraja cerrada y no se vería que son OCHO. */
.pl:nth-child(odd) {margin-left:calc(var(--s) * -9px)}
.pl:nth-child(even){margin-left:calc(var(--s) *  9px)}

@media (max-width:900px){
  .pila{height:calc(var(--n) * 48vh + 100vh)}
  /* En móvil no hay dos columnas que repartir: el texto arriba y la pila
     debajo, con su propio alto. Encoger la rejilla de escritorio dejaría las
     portadas del tamaño de un timbre. */
  .pila-vista{grid-template-columns:minmax(0,1fr);align-content:center;
    gap:1.5rem;padding-block:2rem}
  .pila-cab{grid-column:1;max-width:none}
  .pila-cab .titular{max-width:none}
  .pila-mesa{grid-column:1;height:min(52svh,420px)}
  .pl{width:min(240px,58vw)}
  /* El contador se encoge y se recoloca: en una columna sola no hay hueco al
     lado del texto donde ponerlo grande sin que estorbe. */
  .pila-cuenta{font-size:clamp(3rem,17vw,6rem);top:auto;bottom:.25rem;left:auto;right:0}
}

/* 🔴 Con movimiento reducido la pila NO se apila: se vuelve una rejilla y se ven
   las ocho de una. Menos movimiento significa que no se mueva, no que se quede
   sin contenido — es exactamente el fallo que ya cometimos una vez dejando a
   quien pide menos movimiento sin la capa de color entera. */
@media (prefers-reduced-motion:reduce){
  .pila{height:auto}
  /* 🔴 LA LUZ VUELVE A SER FONDO DE LA SECCIÓN, ANCLADA AL VIEWPORT — que es lo
     que había antes y para un estado quieto es lo correcto.
     Aquí `.pila-vista` pasa a `position:static`, así que `.pila-luz` (absoluta)
     dejaría de medirse contra la pantalla y se estiraría sobre los 5000 px de la
     sección: el degradado se repartiría a lo largo de todo el bloque y la caída
     por pantalla volvería a ser de decimales. Es EXACTAMENTE el defecto que el
     comentario de arriba describe, reaparecido por la puerta de atrás.
     Menos movimiento significa que no se mueva, no que se quede sin luz.
     Lo mismo vale para `.pila-material`: su papel y su grano vuelven a ser fondo
     de la sección, que aquí es lo correcto porque la rejilla sí se desplaza. */
  /* El halo y el contador se van con ellos: los dos son absolutos contra la
     vista, y aquí la vista deja de ser pegajosa —el halo se estiraría sobre los
     5000 px—. Además el contador no tiene nada que contar cuando las ocho están
     a la vista de una en la rejilla: sería un número orientando en un recorrido
     que ya no existe. */
  .pila-luz,.pila-material,.pila-halo,.pila-cuenta{display:none}
  .pila{background-image:
      radial-gradient(42.3% 38.75% at 76.2% 15%,
        rgba(255,255,255,0) 0%, rgba(255,255,255,0) 34%,
        rgba(150,126,74,calc(var(--luz-caida,.13) * .42)) 68%,
        rgba(150,126,74,var(--luz-caida,.13)) 100%),
      url("grafico/grano.svg");
    background-size:100vw 100vh, 200px 200px;
    background-attachment:fixed, scroll;
    background-repeat:no-repeat, repeat;
    background-blend-mode:multiply,multiply}
  .pila-vista{position:static;height:auto;padding:var(--hueco) 0;display:block}
  .pila-mesa{position:static;display:grid;
    grid-template-columns:repeat(4,minmax(0,1fr));gap:2.5rem 1.5rem;
    margin-top:3.5rem;padding:0 var(--margen);place-items:start center}
  .pl{position:static;transform:none;opacity:1;filter:none;margin:0;width:100%}
  /* 🔴 `white-space:nowrap` tiene sentido cuando el pie flota bajo una tarjeta
     suelta y no hay nada que empujar. En la rejilla estática NO: "Mis Palabras
     Mueven Mi Mundo" en una columna de un cuarto de pantalla desborda el
     documento. Medido: desborde horizontal = true en escritorio Y en móvil con
     movimiento reducido. Aquí el pie envuelve. */
  .pl figcaption{position:static;translate:0;opacity:1;margin-top:.75rem;
    white-space:normal;max-width:100%}
  @media (max-width:900px){ .pila-mesa{grid-template-columns:repeat(2,minmax(0,1fr))} }
}

/* ═══ v2 · LAS ESTRELLITAS ═════════════════════════════════════════════════
   Ella: "me gusta ahí con estrellitas más que rayitas si se puede, y las
   estrellitas usar uno de los colores de mi branding femenino que resalte y
   haga contraste."

   El glifo cambia; el ARGUMENTO no. Siguen siendo 52 marcas con la 52ª hueca,
   porque un 4.98 se puede escribir y una repartición no se puede fingir. Un
   muro de 52 llenas se lee a inventado.

   La estrella va enmascarada, no como carácter: un ★ de tipografía cambia de
   dibujo según la fuente instalada y a 12 px de ancho eso se nota. Con máscara
   hereda el color de la marca y se dibuja igual en todas partes.

   El color es ORQUÍDEA: es el femenino de su paleta —es su propio journal— y
   sobre papel mide 5.24, o sea resalta de verdad. El oliva de las rayitas daba
   un verde que ella ya había marcado como "no contrasta". */
/* 🔴 LAS RAYITAS COMPARTÍAN EL ANCHO (`flex:1`), LAS ESTRELLAS NO PUEDEN: una
   estrella tiene proporción, así que su ancho es fijo y 52 no caben en una
   línea. Medido: la caja daba 554 px y el contenido pedía ~830, o sea desbordaba
   dentro de su propio contenedor y las últimas 22 quedaban fuera de vista.
   Envuelven en renglones — y así se leen a HOJA DE CONTEO, que es exactamente
   lo que son, en vez de a barra de progreso. */
/* 🔴 v4 · CINCO ESTRELLAS A TAMAÑO DE VERDAD.
   Lo que había: 52 estrellas de `clamp(11px,1.05vw,.9375rem)` que en pantalla
   medían **4x4 px**. Ése es el número que explica todo lo demás — a 4 px el
   glifo de estrella no se resuelve, se lee a punto, y 52 puntos se leen a
   confeti. El tamaño no era un descuido: era lo único que permitía que 52
   cupieran en su renglón. Al bajar a cinco, el tamaño se libera.
   Van en ORQUÍDEA porque ella lo pidió así, textual: "las estrellitas usar uno
   de los colores de mi branding femenino que resalte y haga contraste". */
.rayas.estrellas{align-items:center;height:auto;flex-wrap:nowrap;
  flex-basis:auto;flex-grow:0;gap:0.375rem}
.rayas.estrellas i{--e:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 1.6l3.1 6.9 7.4.8-5.5 5 1.5 7.3L12 17.9 5.5 21.6 7 14.3 1.5 9.3l7.4-.8z'/%3E%3C/svg%3E");
  flex:0 0 auto;width:clamp(1.5rem,2.2vw,1.875rem);aspect-ratio:1;height:auto;
  max-width:none;border-radius:0;box-shadow:none;
  /* 🔴 LA FRACCIÓN SE PINTA CON UN DEGRADADO DURO, NO CON MEDIA ESTRELLA.
     La máscara ya recorta la silueta, así que basta con rellenar el rectángulo
     hasta el porcentaje que toque: la orquídea llega hasta `--llena` y de ahí
     en adelante queda el trazo hueco. Una sola capa, cualquier fracción, y sin
     un segundo SVG de "media estrella" que habría que mantener a mano.
     El 4.98 se ve prácticamente llena — y así debe ser: la estrella dice "casi
     perfecto" de un vistazo y el número exacto vive en el renglón de abajo. */
  background:linear-gradient(90deg,
    var(--orquidea) 0 var(--llena,100%),
    color-mix(in oklch, var(--orquidea) 22%, transparent) var(--llena,100%) 100%);
  -webkit-mask:var(--e) no-repeat center/100%; mask:var(--e) no-repeat center/100%;
  /* Llegan girando y encogidas, que es como se posan las cosas pequeñas. */
  scale:.2;rotate:-38deg;opacity:0;transform-origin:center;
  transition:scale .42s var(--curva), rotate .42s var(--curva), opacity .28s linear}
.rayas.estrellas.trazado i{scale:1;rotate:0deg;opacity:1}
/* El conteo deja de envolver: cinco estrellas y el renglón del dato caben en
   una línea, y el pie ya no necesita ocupar el ancho entero. */
.voces .conteo{align-items:center;gap:0.75rem clamp(1rem,1.8vw,1.625rem)}
/* El `max-width:52ch` del conteo genérico venía de cuando el pie iba SOLO en su
   renglón, debajo de 52 estrellas que ocupaban media sección. Ahora comparte
   línea con cinco, y a 52ch partía "Ninguna baja de cuatro." a un segundo
   renglón corto y huérfano al lado de una sola fila de estrellas. */
.voces .conteo-pie{flex:1 1 22rem;margin:0;max-width:84ch}
/* "No estás sola." dejó de ser un `<h2>` de 94 px que competía con el titular
   y pasa a ser el SEGUNDO REGISTRO del párrafo: cambia de familia, no de
   tamaño. Sigue siendo lo primero que se lee y ya no pelea por el puesto. */
.bajada-voces .abre{font-family:var(--serif);font-weight:300;font-style:italic;
  font-size:1.18em;color:var(--carbon)}
.bajada-voces{max-width:58ch}
.conteo-tit{max-width:18ch;margin-bottom:1.25rem}
.conteo-pie b{font-weight:600;color:var(--carbon)}

@media (prefers-reduced-motion:reduce){
  .rayas.estrellas i{scale:1;rotate:0deg;opacity:1;transition:none}
}

/* ═══ CAPA 6 · LA SOMBRA DE CONTACTO ═══════════════════════════════════════
   🔴 POR QUÉ NO ES UN RENDER. Escenifiqué sus portadas en Blender —ciclorama,
   key a 42°, kicker, 5 s por toma— y el resultado hay que descartarlo, por una
   razón que no es de ajuste: SUS FOTOS YA VIENEN ILUMINADAS. Son tomas de
   catálogo con la luz de su estudio horneada en los píxeles; meterles una
   segunda luz 3D encima no da material, da doble iluminación. Y se puede medir:
   su cobalto mide #3060C0 en la foto y el render devolvía #5C81DE — más claro y
   desaturado. O sea el pipeline le estaba cambiando el color al producto, que
   es exactamente lo que esta v2 vino a corregir.
   Blender escenifica bien un modelo 3D o un recorte sin luz propia. No una foto
   frontal ya expuesta. El script queda guardado para cuando haya modelo.

   Lo que SÍ resuelve la queja real —que el objeto flota— es una operación 2D
   sobre el alfa: la sombra se genera de la SILUETA del propio producto, así que
   el canto redondeado y el lomo se leen en el suelo y no es una elipse
   genérica. Dos radios: una corta y dura pegada al apoyo, otra larga y difusa.
   Ese PAR es lo que el ojo lee como "toca" en vez de "flota". Y como no hay
   relightado, su hex sigue siendo su hex, píxel por píxel. 3 KB cada una. */
/* ⚠️ Aquí había un `.pl{position:absolute}` redundante —la regla principal ya lo
   declara— y como este bloque vive DESPUÉS del `@media prefers-reduced-motion`,
   le ganaba por orden con la misma especificidad: la rejilla de movimiento
   reducido se colapsaba de 1499 px a 590 y las ocho portadas se amontonaban una
   encima de otra. Segunda vez en esta sesión que muerde lo mismo. */
.pl-sombra{position:absolute;left:50%;bottom:-6%;width:150%;
  translate:-50% 0;z-index:-1;pointer-events:none;
  /* La sombra pertenece al SUELO, no al objeto: no encoge ni gira con la
     tarjeta cuando se apila. Si girara con ella, delataría que es un dibujo. */
  opacity:calc(var(--o, 1) * .9)}
/* Ya no hace falta la sombra genérica del filtro: la de verdad es la de arriba,
   y dos sombras sobre el mismo objeto se leen a dos soles. */
.pl img:not(.pl-sombra){filter:drop-shadow(0 6px 10px rgba(44,44,44,.10))}

/* ═══ v2 · DÓNDE VIVE EL REGISTRO DE MARCA ═════════════════════════════════
   Todo lo que ella lee como "la marca" pasa a la display; el texto que hay que
   LEER de corrido se queda en la grotesca. Ver el porqué en sitio.css.
   El tracking se abre un pelo: una geométrica de caja alta apretada se cierra
   sola a tamaño chico, y en versalitas eso es lo que la vuelve ilegible. */
.etiqueta, .btn, .nav .carro,
.pila-lee span, .pl figcaption span, .conteo-pie b,
.dato, .precio, .precio-sku, .sku .agregar, .muestras .nombre-color{
  font-family:var(--display)}
/* 🔴 LOS ENLACES DEL MENÚ NO. "Sobre I Am Ready To Bloom" en caja alta mide
   casi el doble y revienta la barra; ahí Lemon Milk no cabe. Se quedan en la
   grotesca — y además así el menú NO compite con los botones, que sí son
   marca. Su brand board pone la display en el "BOTÓN DE ACCIÓN", no en la
   navegación.

   🔴🔴 17-AGO — ESTE COMENTARIO DECÍA UNA COSA Y LA LÍNEA DE ABAJO HACÍA OTRA.
   Ponía `var(--marca)`, que NO era la grotesca: era **Clash Display**, la fuente
   de Caliber. O sea que la navegación —lo primero que se ve del sitio de la
   clienta— estaba tipografiada con la fuente de la agencia, y el comentario que
   tenía justo encima afirmaba lo contrario.
   Al desbloquearse Lemon Milk probé ponerla aquí y la MEDICIÓN le dio la razón
   al comentario: el nav pasó de 81 a 115 px de alto a 1000 px de ancho, 34 px de
   más, porque Lemon Milk trae métricas verticales más altas. La grotesca es
   `--cuerpo`, y ahí se queda.
   El token `--marca` de fuentes desaparece: solo lo usaba esta línea, y el mismo
   nombre significaba además una máscara en `.nudo-marca` — que resultó ser código
   muerto (0 elementos en las 14 páginas del sitio). Sexta colisión de nombre. */
.nav nav a{font-family:var(--cuerpo)}
.etiqueta, .pila-lee span, .pl figcaption span{letter-spacing:.13em}
/* Lemon Milk viene apretada de fábrica; en caja alta a tamaño chico las
   contraformas se cierran. Se abre más que con Clash. */
.btn, .sku .agregar, .nav .carro{letter-spacing:.06em}

/* ═══ v3 · §VOCES EN COLLAGE ═══════════════════════════════════════════════
   Antes: seis rectángulos idénticos en rejilla 3x2. Es el anti-patrón de "tres
   tarjetas iguales en fila", multiplicado por dos — y es lo contrario de su
   moodboard, que es un collage de papeles de tamaños distintos, girados y
   encimados.

   La rejilla se vuelve COLUMNAS. Con `columns` cada papel mide lo que mide su
   texto y las columnas se desfasan solas: el escalonado sale del contenido, no
   de posiciones inventadas a mano que se rompen al cambiar una reseña.

   ⚠️ `break-inside:avoid` es obligatorio o un testimonio se parte a la mitad
   entre dos columnas. */
.voces .fila{display:block;columns:3;column-gap:clamp(1.125rem,2vw,1.75rem);
  margin-top:2.75rem}
.voces .voz{break-inside:avoid;margin-bottom:clamp(1.125rem,2vw,1.75rem);
  display:inline-block;width:100%}

/* 🔴 v3.1 — EL COLOR SALE DEL FONDO DE LA TARJETA Y SE VA AL CANTO. Dos de los
   seis iban sobre bloque de color —orquídea al 16% y lima al 26%, los dos
   mezclados con papel para poder leerse— y eso los volvía justo lo que ella
   nombró dos veces: rosa pálido y verde pálido de fondo. Textual: "no me gustan
   los fondos amarillos, verdes o azules pálidos… que esos colores en vibrantes
   aparezcan como detalles, en palabras, pequeños acentos, botones o algún
   título, pero no como fondos".
   El color no se pierde, cambia de sitio: una banda del color REAL del producto
   —sin diluir— en el canto de arriba. Se sigue viendo que esas dos no son como
   las demás, que era el punto del collage, y el tono deja de ser un campo. */
.voz.v-orquidea{border-top:5px solid var(--orquidea)}
.voz.v-lima    {border-top:5px solid var(--lima)}

/* El tercer registro del collage: no todos los papeles pesan igual. La reseña
   corta se lee más grande —tiene sitio— y la larga se aprieta. Es lo que hace
   una página de revista y lo que una rejilla nunca hace. */
.voz.v-alta p{font-size:1.0625rem}
.voz.v-corta p{font-size:1.3125rem;line-height:1.34}

@media (max-width:900px){ .voces .fila{columns:2} }
@media (max-width:600px){ .voces .fila{columns:1} .voz{rotate:0deg} }

/* ═══ v3 · EL SELLO ════════════════════════════════════════════════════════
   Uno solo en todo el home. Va en §manifiesto, la sección donde ella habla en
   primera persona: un sello es una firma y una firma va donde está la persona.

   Gira DESPACIO —36 s por vuelta— porque un sello que corre se lee a insignia
   de "oferta"; a esta velocidad apenas se percibe y es justo lo que hace que la
   página se sienta viva sin pedir atención. */
.manifiesto{position:relative}
.rodela{position:absolute;z-index:4;pointer-events:none;
  right:clamp(1.5rem,6vw,7rem);top:clamp(2rem,10vh,7rem);
  width:clamp(96px,10vw,148px);aspect-ratio:1;
  /* Se apoya en el papel de la sección, no encima del texto. */
  opacity:.9}
.rodela svg{width:100%;height:100%;overflow:visible}
.rodela .aro{transform-origin:100px 100px;
  animation:gira-rodela 36s linear infinite}
.rodela text{font-family:var(--display);font-weight:500;
  /* El tracking abierto es LA señal de un sello. Apretado se lee a etiqueta. */
  font-size:13px;letter-spacing:.30em;
  fill:var(--oliva-hondo)}
.rodela .nucleo{fill:var(--terracota)}
.rodela .centro{font-size:26px;letter-spacing:0;fill:var(--papel);
  text-anchor:middle;dominant-baseline:central}
@keyframes gira-rodela{to{rotate:360deg}}

/* 🔴 El sello NO desaparece con movimiento reducido: es una pieza de diseño y
   ella pidió sellos. Lo que se detiene es el GIRO. Misma lección de §caminos y
   del valle — reducir movimiento no es quedarse sin marca. */
@media (prefers-reduced-motion:reduce){
  .rodela .aro{animation:none}
}
/* En celular el sello se encimaría con el titular: se baja al costado de la
   foto, que es donde hay papel libre. */
@media (max-width:760px){
  .rodela{right:auto;left:clamp(1rem,4vw,2rem);top:auto;bottom:2rem;
    width:82px;opacity:.85}
}

/* 🔴 §PLANNER: EL ACENTO REPROBABA. Medido, 2.05 — el `.ac` toma por omisión el
   oliva de la marca, que está pensado para papel; aquí el fondo es un color de
   producto saturado (cobalto, orquídea, lima o terracota) y el oliva encima
   desaparece. La sección ya declara `--tinta` como su color de texto legible
   sobre cada mundo, así que el acento se cuelga de esa decisión en vez de
   inventar una quinta.
   Ojo: es la única sección del sitio donde el titular NO vive sobre papel, y
   por eso fue la única que se salió de la tabla. */
/* La palabra acentuada toma la versión del acento apta para TEXTO, no la de
   fondo: son el mismo color en tres mundos y distintas en lima, donde el verde
   del producto da 2.40 sobre blanco y el olivo hondo 5.83. */
.planner .ac{color:var(--acento-tinta,var(--acento,var(--tinta)))}

/* ═══ v3.1 · §MANIFIESTO — ASIMÉTRICO, CON CONTRASTE, Y ELLA A TAMAÑO REAL ═══
   Va al FINAL del archivo a propósito. Este bloque pelea contra tres reglas de
   `.manifiesto` repartidas en las líneas 729, 1817 y 4685, y en este archivo ya
   me ha pasado tres veces editar la que pierde. Aquí gana por orden y se acabó.

   Lo que se lee de su referencia (michellepoler.com/about, vista en vivo, no de
   memoria) y lo que NO:
   · SÍ · composición asimétrica: el texto en un lado y ella en el otro. Lo que
     había estaba todo centrado, que es la decisión por omisión y por eso se lee
     a plantilla — su palabra fue "trabajado".
   · SÍ · la placa detrás de la palabra que carga el sentido. Ella tiene dos
     (COURAGE, AUTHENTICITY) y son el ancla de la página. Aquí es "Un
     movimiento", en el naranja que ELLA sacó con gotero de esa misma página
     —medido, esa web usa rgb(185,61,10)— con blanco encima: 5.62. Es literal lo
     que escribió: "si usamos botón naranja o líneas naranjas que el texto arriba
     sea en blanco, que los contrastes estén muy notorios".
   · NO · su fondo lila ni sus ondas: eso es la marca de ella, no la de Marisa.
     Copiar el color sería el "se ve muy típico" que pidió evitar.               */
.manifiesto .manif-rejilla{
  display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,.88fr);
  gap:clamp(2rem,5vw,5.5rem);align-items:center;text-align:left}
.manifiesto .manif-texto{min-width:0}
/* El adornito centrado era el remate de una composición simétrica que ya no
   existe: alineado a la izquierda arranca el renglón, que es lo que hace. */
.manifiesto .adornito{margin:0}
.manifiesto .cuerpo{margin-left:0;margin-right:0;max-width:46ch}
.manifiesto .manif-cta{margin-top:2rem}

/* 🔴 EL RETRATO SALE DEL `position:absolute`. Estaba anclado abajo a la
   izquierda con 232 px de ancho máximo: en 1512 medía 225×270, o sea una
   estampita en una esquina en la única sección donde ella habla en primera
   persona. Dentro de la rejilla ocupa su columna y crece con ella. */
.manifiesto .retrato{position:static;width:auto;bottom:auto;left:auto;
  rotate:-1.6deg;margin:0}
/* El giro baja de 3.2° a 1.6°: a 232 px una inclinación fuerte se lee a
   pegatina; a tamaño de columna se lee a foto mal montada. */

/* La onda pasa al naranja: es la "línea naranja" que pidió por escrito, y de
   paso deja de ser el único verde suelto de la sección. */
.manifiesto .trazo{margin-left:0;margin-right:0;width:min(220px,40vw)}
.manifiesto .trazo path{stroke:var(--naranja)}

@media (max-width:860px){
  .manifiesto .manif-rejilla{grid-template-columns:minmax(0,1fr)}
  /* En una columna la foto va PRIMERO: la cara antes que el discurso. Es lo que
     hace la referencia en celular y es lo correcto — al bajar, una persona
     mirándote detiene el pulgar; un párrafo no. */
  .manifiesto .retrato{order:-1;width:min(320px,72vw);rotate:-1.6deg}
  .manifiesto .cuerpo{max-width:none}
}

/* 🔴 EL TITULAR TIENE QUE ENCOGER PORQUE LA COLUMNA ENCOGIÓ, y esto lo cacé
   mirando la captura, no el CSS: "UN MOVIMIENTO" salía cortado en "UN MOVIMIEI"
   y la placa naranja se metía debajo de la foto. Medido: la columna da 556 px y
   el acento pedía 827 a font-size 108.
   La razón de fondo es que `--t2` (hasta 130 px) se calibró cuando este titular
   ocupaba el ANCHO ENTERO de la sección; al pasar a dos columnas ese número dejó
   de ser válido y nadie lo dijo. Cambiar un contenedor invalida las medidas de
   lo que vive dentro — es la misma lección de la placa del hero, en tipografía.
   El tope sale de la medida: acento = .78em del titular y pide ~9.8 px de ancho
   por cada px de su tamaño, así que 70 px de titular caben en 556 con aire. */
.manifiesto .grande{font-size:clamp(2.25rem,5.2vw,4.375rem)}

/* 🔴 Y el `margin:… auto` del titular también se va. Con la sección centrada
   servía; en la rejilla asimétrica sigue centrando el BLOQUE del titular dentro
   de su columna, así que el texto queda alineado a la izquierda pero flotando al
   medio — se veía sobre todo en celular, con la frase corrida 95 px hacia
   dentro. El `max-width:11ch` sí se queda: es lo que hace que la frase parta en
   los renglones donde tiene que partir. */
.manifiesto .grande{margin:1.75rem 0 0}

/* ══ §camino · el canto necesita su calle ═══════════════════════════════════
   🔴 HAY DOS SISTEMAS PELEANDO POR LAS MISMAS CLASES. `acordeon.css` define uno
   y este archivo define otro más abajo —«CAMINOS · CAPA 1 · EL ÍNDICE CON
   FOCO»— con su propio `.vias` y su propio `.via > .cara`. Como este archivo
   IMPORTA al otro en su línea 2, el de aquí siempre gana: el layout real de la
   sección sale del bloque de abajo, no del acordeón.

   El bloque de abajo además está escrito para un marcado que NO existe en
   index.html (`.via-m`, `.via-n`, `.via-t`, `.via-abre`, `.via-escena`): quedó
   de una migración a medias. Lo único suyo que sí alcanza al marcado vivo son
   `.vias` y `.via > .cara` — y ese `padding: … 0` es el que dejaba los números
   01–05 pegados al borde, ahora medio tapados por el canto.

   Aquí solo se le devuelve la calle. La consolidación de los dos sistemas es
   harina de otro costal y no se hace de pasada.                              */
.via > .cara{
  padding-left:calc(var(--margen) + var(--canto, 7px) + 0.75rem);
  padding-right:var(--margen)}
@media (max-width:860px){
  .via > .cara{
    padding-left:calc(1.375rem + var(--canto, 6px));
    padding-right:1.375rem}
}

/* El cajón cuelga del MISMO eje que el título. Medido antes: el título caía en
   132 y el párrafo en 80 — 52 px de desfase que se leía a texto suelto debajo
   del renglón, no a contenido de ese camino.
   El eje se calcula una sola vez a partir de sus tres sumandos reales (calle +
   número + medianil) y lo consumen las dos reglas. Cablear el 132 a mano habría
   durado hasta el primer cambio de `--margen` o de tamaño del número. */
.vias{--col-num:1.25rem; --medianil:clamp(0.75rem,1.6vw,1.375rem);
  --calle:calc(var(--margen) + var(--canto, 7px) + 0.75rem)}
.via > .cara{grid-template-columns:var(--col-num) auto minmax(0,1fr) auto}
.via .caja{padding-left:calc(var(--calle) + var(--col-num) + var(--medianil))}
@media (max-width:860px){
  .vias{--calle:calc(1.375rem + var(--canto, 6px))}
  .via .caja{padding-left:var(--calle)}
}

/* ══ §camino · CAPA 3 · LA PEGATINA ═════════════════════════════════════════
   Los cinco `.adorno` llevaban vacíos desde que se construyó el hueco. Entran
   INCRUSTADAS, no como `<img>`: un SVG cargado como imagen es un documento
   aparte y no hereda el `color` de la página — saldría negro. Está escrito en
   su propia GUIA.md y por eso existe la carpeta `pegatinas/` con copias
   precoloreadas; esas se descartan porque su color es el de la paleta PÁLIDA
   vieja (menta, lila, amarillo crema) y no empata con los cantos nuevos.

   La pieza toma el `--tono` DE SU PROPIO CANTO. Así el filete y la pegatina son
   el mismo sistema —color = identidad del camino— en vez de dos decisiones de
   color sueltas.

   El mapeo no es decorativo: media luna = recogimiento · asterisco = el norte ·
   onda = el ritmo que vuelve · rama = crecimiento · flor = florecer. Si la
   pieza no dice nada del camino que marca, es relleno.

   ⚠️ Terracota (02) contra el naranja del botón mide ΔE 7.74: se distinguen, y
   además una es silueta plana y el otro una píldora rellena con texto blanco.
   Su regla —«si hay un botón coral, el adorno va en otro color»— habla del coral
   compitiendo consigo mismo; aquí no es el caso. Si alguna vez el botón de un
   camino pasara a terracota, ESA pegatina cambia de color, no todas.

   Una sola por plana, plana, sin sombra, sin contorno, sin degradado: son
   recortes de papel, no ilustraciones. Y solo se ve la de la vía ABIERTA, así
   que en pantalla nunca hay más de una — que es su regla de «una pieza por
   sección, no tres».                                                          */
.via .adorno{color:var(--tono)}
.via .adorno svg{display:block;width:100%;height:auto}

/* 🔴 EL HUECO ERA FIJO Y LAS PIEZAS NO. `bottom:-26%` con `width:230px` estaba
   calibrado para UNA proporción, y las cinco son muy distintas: la onda es
   260×80 (71 px de alto a ese ancho) y el asterisco 120×120 (230 px). Con el
   mismo porcentaje la media luna se veía en un asomo de 38 px de sus 129 —una
   forma cortada asomando, no un recorte de papel— mientras que el asterisco se
   habría salido entero.
   La salida es normalizar el HUECO, no las piezas: caja de proporción fija y
   cada SVG se ajusta dentro con su `preserveAspectRatio` por omisión. Así las
   cinco pesan igual en la composición aunque dibujen cosas distintas.

   Y cambia de sitio: iba al borde inferior, pero el vacío REAL de la fila
   abierta está entre el final del texto (~570) y el hueco de la foto (~1130).
   Ahí la pieza tiene un trabajo —cose las dos mitades— en vez de asomar por un
   canto porque sí.                                                            */
.via .adorno{
  left:auto; right:clamp(3rem,30vw,30rem);
  bottom:auto; top:50%; translate:0 calc(-50% + 24px);
  width:clamp(120px,13vw,190px); aspect-ratio:4/3}
.via[data-abierta] .adorno{translate:0 -50%}
.via .adorno svg{width:100%;height:100%}

/* 🔴 SEGUNDA VUELTA, Y ES UN ERROR MÍO DE JUICIO, NO DE CÓDIGO. Con la pieza
   centrada en el vacío entre el texto y la foto quedaba una MANCHA AZUL
   FLOTANDO: 190 px de cobalto macizo, sin nada que la anclara y sin tocar nada.
   Un plano flotante se lee a cartel, no a recorte. Y a ese tamaño una silueta
   plena pesa como elemento principal cuando su oficio es puntuación.

   La pieza se muda DENTRO de `.vplaca` —en el HTML, no solo en el CSS— y se
   pega al canto de la lámina, medio dentro y medio fuera. Ahí gana las tres
   cosas que le faltaban: CONTACTO (se apoya en algo), OCLUSIÓN (el papel le
   tapa un trozo, y lo tapado es su BORDE, que es lo que hace que una oclusión
   lea como oclusión) y SENTIDO (es una pegatina puesta a mano sobre la lámina,
   que es literalmente como ella arma su tablero — ya está escrito así en el
   comentario de `.vplaca`).
   Al vivir dentro de la lámina la posición deja de depender de números
   calculados contra el ancho de la fila: se mueve con la foto pase lo que pase.

   ⚠️ Cae sobre el MARGEN DE PAPEL de la lámina, nunca sobre el área de imagen
   (`.vplaca::before`, que va con inset de 14 px y 52 abajo). Su regla «nunca
   encima de una foto» se respeta en la letra y en el espíritu: toca el papel,
   no la foto.                                                                 */
.via .vplaca{overflow:visible}
.via .adorno{
  position:absolute; z-index:2; pointer-events:none;
  right:auto; bottom:auto;
  left:-11%; top:-13%;
  width:38%; aspect-ratio:1; rotate:-9deg;
  transition:opacity .7s var(--curva) .18s, translate .8s var(--curva) .18s;
  translate:0 10px}
.via[data-abierta] .adorno{translate:0 0; opacity:1}
.via .adorno svg{width:100%;height:100%;overflow:visible}

/* 🔴 LA ONDA ROMPÍA LA FAMILIA, Y LA CAUSA ES SU PROPORCIÓN. Puestas las cinco
   juntas en una hoja de contacto se ve de golpe: cuatro tienen viewBox ~1:1
   (luna 200×200 · asterisco 120×120 · rama 160×170 · flor 200×200) y la onda es
   260×80, o sea 3.25:1. Dentro de un hueco cuadrado con `meet` se dibuja a 100%
   de ancho y 31% de alto, y el trazo de 7 baja a ~3 px: pesa un tercio que sus
   hermanas.
   No se cambia la pieza —la onda es lo único que dice «ritmo que vuelve», que es
   el camino de los rituales— se le da SU tamaño. Un elemento de línea nunca va a
   tener el área de uno de masa; lo que se iguala es la presencia, y eso se hace
   con extensión y grosor, no con área.
   ⚠️ `stroke-width` va por CSS a propósito: en el archivo es un ATRIBUTO, y el
   CSS le gana — así la corrección vive junto a la razón y no escondida en el SVG. */
.via:nth-child(3) .adorno{width:56%; aspect-ratio:3.25; top:-9%; left:-14%}
.via:nth-child(3) .adorno svg path{stroke-width:11}

/* En celular estaban APAGADAS (`display:none` en acordeon.css) y con razón: la
   pieza flotaba en un vacío que en 390 px no existe. Ahora vive pegada a la
   lámina, que sí existe en celular —`.vplaca` mide min(78%,230px)— así que la
   razón para esconderlas se cayó. Y el celular es la mitad del tráfico: apagar
   ahí lo que se diseñó para elevar es apagarlo para la mitad de sus clientas. */
/* ⚠️ Y CAMBIA DE ESQUINA. En escritorio la lámina va `justify-self:end` y la
   pegatina se pega a su canto IZQUIERDO, mirando hacia el texto. En celular la
   lámina es `justify-self:start`, así que ese mismo canto queda contra el borde
   de la pantalla: medido, la pieza salía a −6 px. No se desbordaba la página
   —`.via` recorta— pero se veía cortada.
   Se muda al canto derecho, que es el que en celular tiene aire. La regla
   general: la pegatina va al lado por donde la lámina TIENE sitio, y eso lo
   decide la alineación de la lámina, no una preferencia. */
@media (max-width:860px){
  .via .adorno{display:block; width:34%; left:auto; right:-9%; top:-11%}
  .via:nth-child(3) .adorno{width:50%; left:auto; right:-11%; top:-8%}
}

/* ══ EL MATERIAL LLEGA AL RESTO DEL HOME ════════════════════════════════════
   Medida la portada sección por sección, seguían SIN material: valle (2375 px),
   pila (5662), library (830), y además apertura, planner y manifiesto.
   Las tres últimas se quedan fuera A PROPÓSITO: su `background-color` es
   `transparent`, y `background-blend-mode` mezcla las capas contra el color de
   FONDO DEL PROPIO ELEMENTO — sin color no hay contra qué multiplicar y el
   grano saldría flotando sobre lo que haya debajo. Darles un color de fondo es
   una decisión de diseño de esas secciones, no un efecto secundario de esta
   tanda. (planner además ya tiene su propia hoja de papel por dentro.)

   El zigzag se recalcula ENTERO con las nuevas en su sitio: leídas en el orden
   real de la página tiene que alternar, y meter dos secciones nuevas en medio
   rompía la alternancia que acababa de arreglar. */
.suena  {--luz:22% -12%}
.valle  {--luz:80% -4%}
.elige  {--luz:18% -10%}
/* 🔴 §planner ROMPE EL ZIGZAG A PROPÓSITO, y esto lo decidió la medición, no la
   tabla. Por alternancia le tocaba la derecha (la anterior, `elige`, viene por la
   izquierda) y así se puso primero. Medido sobre la hoja —excluyendo la tarjeta
   blanca, que aplasta cualquier promedio—:

       sin luz             modelado 14.8 niveles   (solo lo que da la fibra)
       luz por la derecha  modelado 11.1           ← PEOR QUE NO PONER NADA
       luz por la izquierda modelado 24.0          ← +62%

   La causa: la `.fibra` de esta sección va volteada (`scaleY(-1)`) y ya aclara por
   la izquierda. Una luz por la derecha no añade modelado, RESTA el que había —
   oscurece justo el lado que la fibra estaba levantando y lo iguala todo.
   LA LUZ ACOMPAÑA AL MATERIAL, NO SE PELEA CON ÉL. El zigzag es una tabla; la
   dirección de la fibra es un hecho, y gana el hecho.

   🔴 Y ESA DECISIÓN SIGUE MANDANDO AHORA QUE LA LUZ SE MUEVE: el recorrido es casi
   todo VERTICAL, con apenas ±5% de deriva lateral. La fuente no cruza al lado
   derecho en ningún momento del scroll, porque ahí es donde medimos que resta
   modelado. Se movió la luz; no se movió el lado del que viene.
   `--luz` (la posición) ya no vive aquí: se fue al gradiente de `.planner .luz`,
   que es la capa que viaja. Aquí queda solo la intensidad. */
.planner{--luz-caida:.135}
.pila   {--luz:84% -6%}
.tienda {--luz:16% -8%}
.reels  {--luz:82% -10%}
.library{--luz:20% 2%}
.exp    {--luz:78% -6%}
.voces  {--luz:24% -8%}

.valle,.library{
  background-image:
    var(--textura,none),
    radial-gradient(92% 112% at var(--luz,18% -10%),
      rgba(255,255,255,0) 0%, rgba(255,255,255,0) 34%,
      rgba(150,126,74,calc(var(--luz-caida,.13) * .42)) 68%,
      rgba(150,126,74,var(--luz-caida,.13)) 100%),
    var(--grano,url("grafico/grano.svg"));
  background-size:cover,cover,var(--grano-tam,200px 200px);
  background-position:center,center,center;
  background-repeat:no-repeat,no-repeat,repeat;
  background-blend-mode:var(--textura-mezcla,multiply),multiply,multiply}

/* 🔴 §PILA NO PUEDE LLEVAR EL MISMO TRATO: mide 5662 px. Un degradado
   dimensionado al elemento reparte toda la caída de luz a lo largo de esos
   5662 px, así que por pantalla la variación es de decimales — invisible por
   construcción, que es exactamente el error del lino que ya costó una vuelta.
   Y es una pila PEGAJOSA: el ojo siempre ve una tarjeta, no la sección.
   La luz se ancla al VIEWPORT (`background-attachment:fixed`), que es lo que
   corresponde a una sección cuyo encuadre real es la pantalla y no el bloque:
   así cada tarjeta que sube pasa por la misma ventana de luz en vez de heredar
   un tramo distinto de un degradado kilométrico.
   El grano NO se ancla —va `scroll`— porque un grano fijo se despega del papel
   al hacer scroll y se lee a suciedad en la pantalla, no a fibra en la hoja.

   🔴🔴 LA LUZ SE FUE DE AQUÍ (capa 1 del rediseño de fondo). El razonamiento de
   arriba era CORRECTO y se conserva entero: el encuadre real de esta sección es
   la pantalla, no el bloque de 5036 px, y por eso la luz se dimensiona al
   viewport. Lo que estaba mal era la consecuencia, no la premisa.

   Medido: `background-attachment:fixed` clava la luz al viewport y `.pila-vista`
   es `sticky` con `top` = 0 en todo el recorrido. Dos cosas clavadas al mismo
   sitio no tienen movimiento relativo → **el fondo no se movía un solo píxel
   durante casi seis pantallas de scroll**, en la sección más larga del sitio.
   La luz pasa a `.pila-luz` y el papel con su grano a `.pila-material`, los dos
   dentro de la vista: siguen dimensionados a la pantalla —el acierto— pero ahora
   VIAJAN con `--p`.
   Aquí no queda ningún `background-image`: el material de la vista es opaco y lo
   taparía entero, así que dejarlo sería código que no pinta nada. `.pila` conserva
   solo su color de papel, que es el que se ve en los bordes mientras la vista
   pegajosa entra y sale. El grano y el gradiente vuelven aquí en movimiento
   reducido, donde la vista deja de ser pegajosa (ver más abajo). */

/* ── LA LUZ DE LA PILA ───────────────────────────────────────────────────────
   Seis pantallas de scroll dan para un recorrido largo: la luz entra alta por la
   derecha —donde están los objetos— y baja cruzando hacia el centro mientras las
   ocho portadas se apilan. No es el barrido corto de §4; aquí la escena amanece
   y atardece completa.

   VA SIN `mix-blend-mode`, y es a propósito: `.pila-vista` lleva
   `isolation:isolate`, así que un multiply de aquí dentro NO alcanzaría al papel
   de `.pila`, que es un ancestro fuera de este contexto de apilado. Se pinta el
   tono de sombra directo con alfa. Sobre un papel claro la diferencia contra
   multiply es despreciable, y así el efecto no depende del contexto.

   El foco va APRETADO (~55% × 62% de la pantalla) por lo que se midió en §4: una
   luz que cubre toda la superficie no es una fuente, es una exposición — al
   moverse cada punto se queda bajo la misma parte del degradado y no se ve nada.

   🔴 EL RECORRIDO SE DUPLICÓ, Y LO PIDIÓ LA ARITMÉTICA DEL SCROLL. El primer
   ajuste copió el de §4 y midió lo mismo: 15 niveles de extremo a extremo. Pero
   allá esos 15 niveles se consumen en pantalla y media y aquí **se reparten en
   seis**, o sea 2.5 niveles por pantalla — por debajo del umbral de lo que se
   nota. Un recorrido no se calibra por su total: se calibra por su total DIVIDIDO
   entre el scroll que tarda. Medido además: la franja baja cambiaba +0.09, la
   luz ni siquiera llegaba al tercio inferior.
   Ahora el foco cruza de `80% 2%` a `66% 62%` de la pantalla: un barrido vertical
   de seis décimas de pantalla.

   VA CASI RECTO HACIA ABAJO, sin cruzar a la izquierda, y eso es deliberado: los
   ocho objetos viven en la mitad derecha. Una luz que se fuera al lado contrario
   dejaría la pila entera en penumbra justo al final, que es cuando están las ocho
   juntas y es el momento que la sección existe para enseñar. La luz sigue al
   producto.
   La caja va a 140% × 180% para que su borde nunca entre en cuadro: el recorrido
   máximo es ±16.7% contra un margen del 40%. */
/* ── LA FIBRA DE LA PILA ─────────────────────────────────────────────────────
   🔴 ESTA SECCIÓN ERA EL PAPEL MÁS GRANDE DEL SITIO Y EL ÚNICO SIN MATERIAL.
   Medido: §4 tiene fibra sobre 1111 px de alto; ésta mide 5036 —seis pantallas—
   y solo llevaba el grano SVG. Y en el momento medido el 54.5% de la pantalla es
   papel desnudo. El propio sistema ya lo tenía escrito: «pálido × grande =
   lavado». La regla se estaba rompiendo justo con el campo más grande.
   No se toca `--papel` (#F6F4EB): está medido del fondo real del PDF de su
   moodboard, donde ocupa el 93% del margen. El problema nunca fue el tono — era
   que no había nada encima de él.

   🔴 EL MATERIAL TRAE SU PROPIO SUSTRATO, y esto no es preferencia de estructura:
   `.pila-vista` es `sticky`, y una caja pegajosa crea contexto de apilado ELLA
   SOLA —sin necesidad de `isolation`, que ahí es redundante—. O sea que un
   `mix-blend-mode:multiply` puesto suelto aquí dentro no puede alcanzar el papel
   de `.pila`, que queda fuera del grupo: la fibra se compondría contra un fondo
   transparente y se vería como una foto gris TAPANDO el crema, no como textura.
   Por eso el papel y el grano bajan a `.pila-material` y la fibra multiplica
   contra ellos, dentro del mismo grupo. Es la misma lógica de §4 —donde el
   multiply vive en `.papel` porque es quien tiene color— aplicada a una sección
   cuyo encuadre es la pantalla.

   VA CON PARALAJE, y no es un adorno: en una vista pegajosa una capa quieta se
   congela respecto a la pantalla, que es justo el defecto que acabamos de quitar
   de la luz. Se mueve MENOS que la luz (12% contra 33%) para que las dos viajen a
   velocidades distintas — dos planos a distinta velocidad es literalmente de
   dónde sale la profundidad. Y de paso el grano viaja con el material, que es lo
   que el comentario de arriba pedía: un grano fijo se despega del papel y se lee
   a suciedad en la pantalla.

   `grayscale(1)` por lo que se midió en §4: la foto es cálida y al multiplicar en
   color arrastra el tono —el croma de la lámina se desploma de 29.4 a 7.2 y el
   papel se vuelve un muro de concreto—. Sin color solo toca la LUMINANCIA. */
.pila-material{position:absolute;inset:-10% 0;z-index:0;pointer-events:none;
  overflow:hidden;
  background-color:var(--papel);
  background-image:url("grafico/grano.svg");
  background-size:200px 200px;
  background-repeat:repeat;
  background-blend-mode:multiply;
  translate:0 calc((var(--p) - .5) * 12%)}
/* 🔴 LA OPACIDAD BAJÓ DE .5 A .34 MIRANDO EL RENDER, NO EL NÚMERO. A .5 el rango
   tonal del papel saltaba de 16 a 94 niveles — más del DOBLE de los 43 con que se
   calibró §4— y en pantalla dejaba de leerse a papel para leerse a muro de estuco.
   En una marca de papelería esa confusión de material es un error, no un matiz.
   A .34 el rango queda en el orden del de §4 y la superficie vuelve a ser hoja.
   El `contrast` también baja: es lo que estaba estirando los extremos. */
.pila-fibra{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:.34;mix-blend-mode:multiply;
  filter:grayscale(1) contrast(1.04) brightness(1.1);
  transform:scale(1.32)}

/* ── EL MUNDO DE COLOR ENTRA AL FONDO ────────────────────────────────────────
   La tesis del sitio es que su color sale de sus productos. Hasta ahora eso solo
   se veía en dos palabras de 13 px y en la placa del titular; aquí puede verse en
   grande, porque son ocho mundos pasando por seis pantallas.

   🔴 VA EN EL HALO, NUNCA EN EL PAPEL, y eso es una restricción de ella, no una
   preferencia mía: «no me gustan los fondos amarillos, verdes o azules pálidos».
   Teñir la hoja de los ocho colores sería literalmente el caso que rechazó. Un
   resplandor corto alrededor de los objetos da presencia de color sin convertir
   el fondo en un lavado de color — es la diferencia entre luz de color y campo de
   color.

   🔴 Y EL COLOR VA REGISTRADO CON `@property`, porque `--tinte-activo` apunta a
   otra variable y una variable CSS sin registrar es TEXTO: el navegador no puede
   promediar texto, así que el halo saltaría de golpe en cada portada mientras
   todo lo demás cruza en 620 ms. Es la misma trampa que ya costó una vuelta con
   el halo de §4.
   La mezcla va en oklch: medido en este mismo sitio, mezclar sus colores en srgb
   dentro de un claro atraviesa el centro desaturado del cubo y sale gris sucio. */
@property --pila-tinte{syntax:'<color>';inherits:true;initial-value:transparent}
.pila{--pila-tinte:color-mix(in oklch, var(--tinte-activo, var(--cobalto)) 16%, transparent);
  transition:--pila-tinte .62s var(--curva)}
.pila-halo{position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(34% 40% at 70% 52%,
    var(--pila-tinte) 0%, transparent 68%)}

.pila-luz{position:absolute;inset:-40% -20%;z-index:0;pointer-events:none;
  background:radial-gradient(39.3% 34.4% at 66.4% 40%,
    rgba(255,255,255,0) 0%, rgba(255,255,255,0) 34%,
    rgba(150,126,74,calc(var(--luz-caida,.13) * .42)) 68%,
    rgba(150,126,74,var(--luz-caida,.13)) 100%);
  translate:calc((var(--p) - .5) * -10%) calc((var(--p) - .5) * 33.3%)}

/* ⚠️ `background-attachment:fixed` NO es de fiar en iOS Safari: unas versiones
   lo tratan como `scroll` y otras lo repintan en cada cuadro sobre un elemento
   de 5662 px, que en un teléfono es justo el tipo de repintado que tira los
   fotogramas. No puedo probar un iPhone real desde aquí, así que en celular no
   se deja a la suerte: se apaga la luz y se queda el grano.
   Es la decisión correcta y no una renuncia — en 390 px de ancho una caída de
   luz lateral casi no tiene recorrido para leerse, mientras que el repintado sí
   se sentiría. El grano, que es lo que da fibra, no depende del ancho. */
@media (max-width:860px){
  .pila{background-image:url("grafico/grano.svg");
    background-size:200px 200px;background-repeat:repeat;
    background-attachment:scroll;background-blend-mode:multiply}
}

/* 🔴 EL RÓTULO DEL COLORWAY EN §PILA FALLABA CON UNA TAPA DE CINCO. Medido:
   `.pila-lee span` toma `--tinte-activo`, que el JS pone al color de la tapa que
   manda; con la lima da `rgb(144,180,36)` sobre papel = **2.18**. Es el caso ya
   documentado de este proyecto —la lima no funciona como TEXTO (2.40 sobre
   blanco, 2.18 sobre papel)— y no lo introdujo esta tanda: venía de antes.

   No se cambia la lima ni se apaga el sistema: se separa EL COLOR de LA TINTA,
   que es exactamente lo que `.planner` ya hace con `--acento-tinta`. Cuatro
   tintas son su propio color; la lima presta la del oliva hondo, que es su
   pariente oscuro y pasa con 5.29. Así el rótulo sigue diciendo de qué tapa
   habla sin dejar de leerse.                                                  */
/* ⚠️ Y LA ESMERALDA TAMBIÉN, por poco: #0C8448 sobre papel mide 4.32 — falla
   AA por 0.18 en un rótulo de 10.8 px. No lo introdujo esta tanda; lo destapó
   la medición al recorrer las OCHO tapas en vez de mirar una. Su tinta es la
   misma esmeralda un punto más honda: mismo verde, 5.54.
   Las otras tres pasan siendo su propio color: cobalto 10.85 · orquídea 5.30 ·
   terracota 5.75. Solo se corrige lo que falla. */
.pila{--tinta-cobalto:var(--cobalto); --tinta-orquidea:var(--orquidea);
      --tinta-terracota:var(--terracota);
      --tinta-esmeralda:#0A713D;        /* 4.32 → 5.54 */
      --tinta-lima:var(--oliva-hondo)}  /* 2.18 → 5.29 */

/* ══ §camino · CAPA 4 · EL TRAZO ════════════════════════════════════════════
   Reusa `.trazo` ENTERO —`vida.js` ya mide su largo con `getTotalLength()` y le
   pone `.dibuja` al entrar en vista, una sola vez—. Escribir un segundo sistema
   de trazo aquí habría sido la falta que en este código ya salió cara: dos
   dueños para el mismo gesto.

   🔴 DÓNDE NO VA, Y POR QUÉ. Debajo de «JUSTO DONDE ESTÁS» sería el CUARTO
   recurso sobre la misma frase —familia, color, tamaño y subrayado—: el
   accesorio que hay que quitar antes de salir. Y suelto en el vacío de la
   derecha sería exactamente el error que acabó de costarme una vuelta con la
   pegatina: decoración flotando sin nada que la toque.

   Va donde tiene un TRABAJO: el titular parte en dos —tres renglones en serif y
   un remate en display— y entre el final de «acompañarte» y el arranque del
   remate hay un salto de registro que nada acompaña. El trazo hace ese
   recorrido: baja desde el final de la frase y muere señalando la palabra que
   la completa. Es lo que hace una mano en un cuaderno.

   El color es SU naranja, con sus palabras: «si usamos botón naranja o líneas
   naranjas...» — las líneas naranjas las pidió ella por escrito. */
.elige .cabeza{position:relative}
/* ⚠️ DOS SITIOS EQUIVOCADOS ANTES DE ESTE, los dos por posicionarlo en ABSOLUTO:
   arriba bajaba desde un vacío donde no hay nada y moría sobre «acompañarte»
   —señalaba hacia atrás— y al bajarlo a la línea del remate CRUZÓ POR ENCIMA de
   ese mismo renglón. Y mi prueba no lo cazó porque medí el solape contra el
   acento, no contra el titular entero: fallo del test, no del CSS.

   La salida no era una tercera posición: era dejar de posicionarlo. El trazo va
   EN EL FLUJO, detrás del acento y en su mismo renglón. Así no puede chocar con
   el texto —el texto le hace sitio— y se mueve solo si cambia el titular, el
   ancho o la fuente. Un gesto que hay que recolocar a mano en cada ancho no
   estaba en su sitio. */
.elige .trazo-camino{display:inline-block;vertical-align:middle;
  position:static;margin:0 0 .18em .42em;
  width:clamp(90px,14vw,210px);height:auto}
.elige .trazo-camino path{stroke:var(--naranja);stroke-width:5.5}
@media (max-width:860px){
  /* En celular el titular ocupa el ancho entero y no queda vacío a la derecha:
     el trazo no tendría dónde caer sin encimarse al texto. Se apaga. Un gesto
     que no cabe no se encoge — se quita. */
  .elige .trazo-camino{display:none}
}

/* 🔴 LA LÁMINA MANDA LA ALTURA DE LA FILA, Y SU FORMATO ESTABA MAL ELEGIDO.
   Medido en la fila abierta: 352 px de alto, el texto termina en 178 y la lámina
   en 323 — **174 px muertos, el 49% de la fila**, en forma de L bajo el texto.
   Eso no se lee a aire, se lee a sin terminar.

   La causa no es el hueco: es el FORMATO. Los cinco pies de foto que ella misma
   describe son escenas APAISADAS —«journal abierto», «planner abierto en la
   plana del año», «mesa de taller: journals, plumas, manos», «mesa compartida,
   dos tazas»— y la lámina estaba en 5/4, casi cuadrada. Un retrato para una
   escena horizontal obliga a recortar la escena Y estira la fila.
   Pasa a 16/10 y se ensancha: la foto cabrá como se va a tomar, y la fila baja.

   ⚠️ Esto cambia el hueco donde vive la pegatina, que se posiciona en % de la
   lámina — se vuelve a medir después del cambio, no se da por bueno. */
/* ⚠️ PRIMER INTENTO FALLIDO Y MEDIDO: pasar a 16/10 ENSANCHANDO (392 px) subió
   la lámina a 402×261 y la fila a 357 — la banda muerta se quedó en el 50%.
   El formato apaisado sigue siendo el correcto para SUS escenas, pero el ancho
   mandaba: con `aspect-ratio` sobre la caja entera, ensanchar es engordar.
   El alto se recorta bajando el ancho, no cambiando la proporción. */
.via .vplaca{width:min(70%,326px);aspect-ratio:16/10}
@media (max-width:860px){
  .via .vplaca{width:min(92%,300px)}
}

/* La lámina cambió de forma y la pegatina se posiciona en % de ELLA, así que su
   sitio se movió solo: medido, se había metido sobre el área de imagen. Se saca
   hacia fuera para que vuelva a morder solo la esquina y el margen de papel.
   (Lo dejé anotado al cambiar el formato y por eso se volvió a medir en vez de
   darlo por bueno — un % contra una caja que cambia no es una posición fija.) */
.via .adorno{left:-21%; top:-29%; width:31%}
@media (max-width:860px){
  .via .adorno{left:auto; right:-17%; top:-26%; width:30%}
  .via:nth-child(3) .adorno{left:auto; right:-15%; top:-22%; width:44%}
}

/* La onda necesita su propio ajuste, otra vez por su proporción: su caja es 3.25
   veces más ancha que alta, así que con el mismo % de salida entra mucho más
   adentro de la lámina — medido, 46% sobre el área de foto contra el 10-12% de
   sus cuatro hermanas. Se saca hasta igualar. */
.via:nth-child(3) .adorno{left:-30%; top:-30%; width:44%}

/* 🔴 LA PEGATINA NO PUEDE SALIR POR ARRIBA, Y NO ES CUESTIÓN DE AJUSTE.
   `.via .dentro` lleva `overflow:hidden` porque es el contenedor que anima la
   altura del cajón (de `0fr` a `1fr`): todo lo que asome por encima de la caja
   se recorta. Al sacarla hacia fuera para quitarla del área de foto, la luna
   quedó cortada en una media rebanada pegada al filete del título — peor que el
   problema que iba a resolver.

   Se muda al COSTADO IZQUIERDO de la lámina, a media altura: por ahí no hay
   recorte, sigue mordiendo el margen de papel, y de paso ocupa el hueco que
   queda entre el final del texto y la foto — que era el otro defecto de la
   fila. Un elemento que resuelve dos cosas está mejor puesto que uno que
   resuelve una. */
.via .adorno{left:-19%; top:auto; bottom:14%; width:30%}
.via:nth-child(3) .adorno{left:-24%; top:auto; bottom:8%; width:42%}
@media (max-width:860px){
  .via .adorno{left:auto; right:-15%; top:auto; bottom:18%; width:29%}
  .via:nth-child(3) .adorno{left:auto; right:-13%; top:auto; bottom:14%; width:42%}
}

/* ══ EL BOTÓN DE LA PRIMERA VÍA SALÍA APLASTADO ═════════════════════════════
   paco: «este botón no está centrado». Medido, y no era centrado: era el ALTO.
   El botón de la fila 1 computaba `padding-top:0` con `padding-bottom:13.32px`
   y medía **26 px** contra los **40** de las otras cuatro — el texto pegado
   arriba y un hueco abajo. Solo la primera fila; las demás, simétricas.

   La causa: `.via:first-child a{padding-top:0}`, declarada DOS VECES (3578 y
   4068). Está pensada para que el RENGLÓN de la primera vía no lleve aire
   arriba, pero el selector alcanza a CUALQUIER enlace dentro de esa vía — y
   dentro va el llamado a la acción.

   🔴 Y ES EXACTAMENTE EL MISMO FALLO QUE EL BLOQUE DE ARRIBA YA DOCUMENTA
   HABER ARREGLADO: su comentario cuenta cómo `.via a` agarraba el botón y lo
   estiraba a 751 px, y cómo se acotó a `> .cara`. Se acotó esa línea y se
   dejaron estas dos, que tienen la misma forma y el mismo defecto.
   La lección no es «acotar el selector» —eso ya se sabía— es que **al arreglar
   un selector demasiado ancho hay que buscar sus HERMANOS**, porque el que
   escribió uno escribió los otros.                                            */

/* ══════════════════════════════════════════════════════════════════════════
   §camino · CORRECCIÓN CONTRA SUS PROPIAS PALABRAS (auditoría)
   ══════════════════════════════════════════════════════════════════════════
   🔴 LA SECCIÓN CONTRADECÍA INSTRUCCIONES SUYAS, EXPLÍCITAS Y REPETIDAS. No era
   cuestión de gusto: estaban en sus comentarios del portal y no fui a releerlos
   antes de diseñar. Los tenía a un comando de distancia.

   SU COMENTARIO #3 ES SOBRE ESTA SECCIÓN EXACTA (avance «¿Qué necesitas hoy?»):
     «mis colores que más quiero usar son el naranja, el crema y el verde olivo
      con algún destellito rosa femenino como en el branding que te compartí,
      tratar de usar únicamente esos colores»
   Los cinco cantos eran cobalto, terracota, esmeralda, orquídea y lima. NINGUNO
   es naranja, crema ni olivo. Elegí cinco colores que no pidió, en la única
   sección donde dijo exactamente cuáles quería.
   Y el 01 era COBALTO pleno, cuando en el #4 escribió «no azul, ese color es
   solo para detalles».

   LA SALIDA NO ES CAMBIAR CINCO COLORES POR OTROS CINCO: es que cinco colores
   distintos era MI idea. Ella pidió «más limpio» cuatro veces. El canto se
   queda en SU olivo y solo la vía ABIERTA pasa a SU naranja — el color de la
   acción marcando dónde estás. Un sistema de dos tonos, no de cinco.
   El «destellito rosa femenino» es el coral, y va donde ella lo puso en su
   moodboard: como destello, no como banda — el filete del renglón «Journals +
   recursos». Es gráfico, no texto, así que no le aplica el mínimo de contraste.

   🔴 Y LAS PEGATINAS SE FUERON: pidió quitarlas TRES veces —«quitar emoticones
   de la flor» (#4), «quitar el sticker también» (#6), «quitas stickers de
   flores» (#12)— y yo había puesto cinco, una de ellas literalmente una flor.  */
.via:nth-child(1),.via:nth-child(2),.via:nth-child(3),
.via:nth-child(4),.via:nth-child(5){--tono:var(--oliva)}
.vias .via[data-abierta]{--tono:var(--naranja)}
.via .adorno{display:none}

/* El destello coral: el filete del renglón de producto. */
.via .lleva::before{background:var(--coral);height:2px;width:26px}

/* 🔴 SU ESTRUCTURA, QUE NO ESTABA. Ella la escribió en tres niveles y el sitio
   solo tenía dos: faltaba «ELIGE TU CAMINO», que es como ella nombró la
   sección, y «¿Qué necesitas hoy?» estaba de rótulo chico cuando en su texto
   es LA PREGUNTA. Ahora el orden es el suyo: etiqueta · pregunta · explicación.
   La pregunta toma el peso que tenía la explicación, porque una sección que
   empieza preguntándole algo a ella es más cálida que una que le explica. */
.elige .pregunta{font-family:var(--serif);font-weight:300;
  font-size:clamp(2.5rem,6.2vw,5rem);line-height:1.04;letter-spacing:-.018em;
  margin:0.875rem 0 0;max-width:16ch;color:var(--carbon)}
.elige .lead{font-size:clamp(1.0625rem,1.55vw,1.375rem);line-height:1.5;
  font-weight:400;font-family:var(--cuerpo);max-width:46ch;
  margin:1.125rem 0 0;color:rgba(44,44,44,.82);letter-spacing:0}
.elige .trazo-camino{width:clamp(70px,8vw,120px);margin:0 0 .1em .4em}

/* ⚠️ LA ETIQUETA SEGUÍA EN MENTA. La menta está en su branding, pero para ESTA
   sección escribió «tratar de usar únicamente esos colores» — naranja, crema y
   olivo. Pasa a crema con tinta de olivo hondo y un filete del olivo: los dos
   colores que pidió, y el resultado es más limpio que un bloque de color, que
   es lo que ha pedido en cuatro comentarios distintos.
   ⚠️ La tinta es `--oliva-hondo` y no `--oliva`: el olivo suave del moodboard
   mide 2.2 sobre crema y no se lee. El color de marca se conserva; lo que baja
   es la TINTA, igual que ya se hizo con la lima en §pila. */
.elige .q{background:var(--papel);color:var(--oliva-hondo);
  box-shadow:inset 0 0 0 1.5px color-mix(in oklch, var(--oliva) 55%, transparent)}

/* El trazo se caía al renglón siguiente y quedaba colgando solo: la explicación
   ahora es más angosta y el acento más el trazo ya no cabían juntos. Se acorta
   para que viaje pegado al acento, que es su trabajo. */
.elige .lead{max-width:52ch}
.elige .trazo-camino{width:clamp(48px,5.2vw,84px);margin:0 0 .08em .45em}

/* ⚠️ Mi regla de la etiqueta NO GANABA, y no era por orden: `.elige .cabeza .q`
   (0,3,0) de la rampa de opacidad le gana a `.elige .q` (0,2,0) aunque esté
   antes. La especificidad no se arregla moviendo la regla de sitio. Se iguala
   el selector para que decida el orden, que es lo que yo creía que pasaba. */
.elige .cabeza .q{color:var(--oliva-hondo)}

/* ═══ v3 · LA JERARQUÍA DE TITULAR — SIETE ERAN EL MISMO ═══════════════════════
   Medido en el sitio entero a 1440 px: de doce titulares, SIETE computaban 79 px
   exactos, todos en Gambetta con el mismo tracking. La escala del archivo tiene
   cinco escalones (79 · 66 · 58 · 45 y el hero), pero el reparto real los dejaba
   casi todos en el mismo. Un sitio donde todos los titulares miden lo mismo no
   tiene jerarquía: tiene una plantilla repetida, y el lector deja de registrar
   que cambió de sección porque nada le dice cuál pesa más.

   El tamaño vuelve a significar algo, y el criterio es el TRABAJO de la sección,
   no el gusto:
     · alto  → los momentos: la bienvenida, el universo con la flor, el cierre.
     · base  → las secciones que sostienen el relato (la colección, el manifiesto,
               la pregunta de §camino).
     · medio → las de servicio: el mostrador, los reels, las voces, las
               experiencias. Siguen siendo importantes; no son el clímax.

   🔴 POR QUÉ VAN AL FINAL DEL ARCHIVO Y CON DOBLE CLASE. Los titulares no usan
   una sola clase: hay `.titular`, `.grande` y `.frase`, y algunos ya llevan un
   tamaño propio desde un selector descendente como `.cierre .grande` (0,2,0).
   Un `.t-alto` suelto (0,1,0) perdería sin dar un error. Con doble clase se
   empata en especificidad y el desempate lo gana la posición — por eso el bloque
   cierra la hoja. */
/* 🔴 LA MEDIDA ERA 12ch Y DEJABA UNA PALABRA HUÉRFANA. A 12ch, "Un recordatorio
   para" se partía tras "recordatorio" y "para" se quedaba sola en su renglón,
   encima del acento. Y `text-wrap:balance` no lo salvaba: reparte el peso entre
   los renglones que hay, NO ensancha la caja — es la misma lección que ya costó
   un intento en §cierre v5. Además mi regla venía a pisar los 16ch que ese
   titular tenía calibrados, así que el "arreglo" de escala le estaba quitando
   una decisión que ya estaba medida. 14ch caben las tres palabras. */
.titular.t-alto, .grande.t-alto, .frase.t-alto{
  font-size:clamp(2.75rem,7.6vw,7.75rem);line-height:1.03;letter-spacing:-.018em;
  max-width:14ch}
.titular.t-medio, .grande.t-medio, .frase.t-medio{
  font-size:clamp(2.125rem,5vw,4.625rem);line-height:1.12;letter-spacing:-.008em;
  max-width:17ch}
/* La medida se ajusta con el tamaño y no al revés: a 100 px, 14ch son casi 1400
   px de renglón; a 58 px, 14ch dejan la caja a media columna y el titular se
   parte donde no debe. El tracking sigue la misma regla que ya tiene el archivo
   —con peso 300 el negativo se afloja al crecer— porque a este cuerpo un
   `-.012em` empieza a pegar las palabras. */
@media (max-width:640px){
  /* En celular la diferencia entre los tres pisos se comprime sola por el clamp,
     y forzarla más dejaría el `medio` por debajo del cuerpo de texto. */
  .titular.t-alto, .grande.t-alto, .frase.t-alto{max-width:13ch}
  .titular.t-medio, .grande.t-medio, .frase.t-medio{max-width:15ch}
}

/* ═══ v3 · FASE 2 · EL COLOR ENTRA DONDE FALTABA — EN HALO, NUNCA EN EL PAPEL ═══
   🔴 EL DIAGNÓSTICO NO ERA "FALTA RITMO TONAL EN LOS SUELOS". Ese fue un error de
   encuadre mío: comparé contra Papier y Aesop, que son MIS referencias. Las de
   ella son otras, y el sistema del sitio ya está alineado con las suyas —
   kikki-k (blanco 83.5% / gris 12.9%, el producto como lo único con color) y
   glucosegoddess (fondo único + un color saturado). Y arena como suelo ya se
   probó: ella dijo "demasiado pálido" NUEVE veces. Los suelos no se tocan.

   Lo que sí estaba sin cumplir es la OTRA mitad de esa misma decisión, escrita en
   el propio archivo: «el color se muda ADENTRO de la sección». Medido sobre la
   página completa a 1200 px, % de píxeles con croma > 34:

       planner 21.0 · apertura 14.8 · cierre 9.3 ·· promedio del sitio 4.5
       camino 0.7 · reels 0.5 · tienda 0.4 · experiencias 0.3   ← sin color

   Cuatro secciones por debajo del 1%. El color no está "adentro": no está.

   La forma la decide una restricción suya que este proyecto ya resolvió una vez:
   «no me gustan los fondos amarillos, verdes o azules pálidos». Un campo de color
   desvaído es exactamente eso, así que **el tinte va en HALO** — igual que en
   §pila y §cierre, donde ya está aprobado. En halo el color es LUZ, no fondo: se
   concentra donde nace y cae a transparente antes de tocar el papel, así que
   nunca produce el pálido que ella rechaza.

   Un color por sección y ninguno repetido seguido: el scroll pasa por una
   secuencia —oliva, terracota, cobalto, naranja— en vez de por cuatro pantallas
   del mismo crema. Y son SUS colores, los mismos que ya usan sus acentos en cada
   una de esas secciones: el halo no introduce color nuevo, amplifica el que la
   sección ya tenía en un span de 60 px. */
.halo-sec{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
/* 🔴 PRIMER INTENTO INVISIBLE, Y POR EL MISMO MOTIVO DE SIEMPRE EN ESTE ARCHIVO.
   Salió con radios de 38%/44% y mezclas al 30%/22%. Medido antes y después sobre
   la página completa, el % de píxeles con croma > 34 no se movió en tres de las
   cuatro secciones (camino .7→.7 · tienda .4→.4 · reels .5→.5); solo
   §experiencias, la más alta, pasó de 0.3 a 4.8. El croma MEDIO subía uno o dos
   puntos: o sea el halo estaba ahí y no llegaba a leerse como color.
   Es el tercer caso igual del proyecto —la fibra a .26, la luz que no viajaba— y
   la salida es la misma que entonces: **el efecto tiene que COMPETIR.**

   ⚠️ Pero NO se arregla extendiéndolo. Un halo grande y suave es literalmente un
   campo de color desvaído, o sea justo lo que ella rechazó. Se arregla al revés:
   **radio más CHICO y carga más ALTA.** Concentrado se lee a luz —tiene un origen
   que se puede señalar—; extendido se lee a fondo pálido. Los radios bajan de
   38/44 a 26/30 y la mezcla sube de 30/22 a 54/40. */
.halo-sec::before{content:"";position:absolute;inset:-18% -6%;
  background:
    radial-gradient(26% 30% at var(--h1,14%) 16%,
      color-mix(in oklch, var(--halo,var(--oliva)) 54%, transparent) 0%, transparent 70%),
    radial-gradient(23% 27% at var(--h2,88%) 82%,
      color-mix(in oklch, var(--halo,var(--oliva)) 40%, transparent) 0%, transparent 68%);
  /* La deriva es MENOR que la de cualquier capa de contenido: es lo más lejano
     del cuadro y lo lejano se mueve menos. Invertirlo destruye la profundidad —
     ya pasó una vez en §cierre. */
  translate:0 calc((var(--p,.5) - .5) * 3.2%);
  will-change:translate}
/* `in oklch` y no en srgb: mezclar en srgb desatura y saca un color lodoso que ya
   no es el suyo. Está medido en este mismo archivo para los tintes de texto. */
.camino-color      {--halo:var(--oliva)}
.tienda-color      {--halo:var(--terracota); --h1:82%; --h2:10%}
.reels-color       {--halo:var(--cobalto);   --h1:18%; --h2:86%}
.experiencias-color{--halo:var(--naranja);   --h1:88%; --h2:12%}
/* Los focos se alternan de lado en secciones consecutivas: si los cuatro nacen
   en la misma esquina, la secuencia de color se lee a plantilla teñida. */
@media (prefers-reduced-motion:reduce){ .halo-sec::before{translate:none} }

/* ═══ v3 · FASE 5 · OFICIO — EL OBJETIVO TÁCTIL ═══════════════════════════════
   Auditado en vivo a 390 px, con el criterio correcto: los 44×44 son exigencia de
   PUNTERO GRUESO, no de escritorio con ratón (ahí el listón AA es 24), y los
   enlaces dentro de un párrafo están exentos. Filtrando eso quedan los controles
   de verdad, y son quince grupos:

     enlaces del panel móvil ...... 18 ×  24 px de alto
     .btn.primario ................  8 ×  38
     muestras de color ............  7 ×  42
     .agregar .....................  4 ×  39
     .btn.secundario ..............  2 ×  39
     .carro / .ico-btn ............  3 ×  38-40
     .cara (abrir una vía) ........  1 ×  36
     .repetir .....................  1 ×  26
     .baja ("Elige por dónde…") ...  1 ×  12   ← el peor del sitio

   🔴 DOS PROBLEMAS DISTINTOS, DOS SOLUCIONES DISTINTAS — y confundirlas es lo que
   deja un sitio "accesible" y feo:

   · Los BOTONES son píldoras con relleno propio: crecer cinco píxeles no cambia
     su forma, así que ahí va `min-height` de verdad.
   · Los ENLACES DE TEXTO no. Estirar "Elige por dónde empezar" de 12 a 44 px
     metería 32 px de aire dentro de una composición ya medida, y en el panel
     móvil separaría los renglones hasta romper el ritmo del menú. Ahí el área
     táctil se AMPLÍA SIN TOCAR LA CAJA VISUAL: un pseudo-elemento absoluto que
     sobresale por arriba y por abajo. El dedo gana su objetivo, el diseño no se
     entera. */
@media (max-width:640px){
  .btn, .agregar, .carro, .ico-btn, .cara{
    min-height:44px;
    display:inline-flex;align-items:center;justify-content:center}
  /* `.cara` es el renglón entero de una vía: se alinea a la izquierda, no al
     centro, o el número y el nombre se despegarían de su margen. */
  .cara{display:flex;justify-content:flex-start;width:100%}

  /* El área táctil extendida. `position:relative` sobre el enlace y un `::after`
     que crece hacia fuera. No lleva fondo: es objetivo, no adorno. */
  .panel-movil a, .baja, .repetir{position:relative}
  .panel-movil a::after, .baja::after, .repetir::after{
    content:"";position:absolute;left:0;right:0;
    top:50%;height:44px;transform:translateY(-50%);
    /* NO cubre el pseudo-elemento de los iconos ni los tapa: va detrás. */
    z-index:-1}
}

@media (max-width:640px){
  /* Los botones de icono pasaban el alto y fallaban el ANCHO (40). El objetivo
     es cuadrado: no basta con uno de los dos lados. */
  .ico-btn{min-width:44px}

  /* Los enlaces del pie miden 15 px de alto: mismo caso que el panel móvil, así
     que misma solución — área extendida, caja visual intacta. */
  .pie a{position:relative}
  .pie a::after{content:"";position:absolute;left:0;right:0;top:50%;height:44px;
    transform:translateY(-50%);z-index:-1}

  /* 🔴 LOS DISCOS DE COLOR DE §TIENDA SON UN COMPROMISO, Y SE DICE:
     miden 15 px y NO llegan a 44, ni con truco. Las dos salidas obvias fallan:
     · Agrandarlos a 44 rompe la fila del mostrador — el bloque de dato está
       calibrado a un renglón y cuatro discos de 44 no caben con el precio.
     · Extender su área táctil a 44 los hace SOLAPARSE entre ellos, y tocar el
       color equivocado es peor que tener que apuntar: un objetivo chico se
       reintenta, uno solapado da un resultado falso sin avisar.
     Se sube el disco a 22 px —el máximo que aguanta la fila— y se extiende solo
     en VERTICAL, que es donde hay hueco libre. Queda por debajo del listón en el
     eje horizontal y es una limitación conocida, no un descuido: la alternativa
     medida era peor. Si la fila se rediseña algún día, esto se arregla ahí. */
  .colores-sku button{width:22px;height:22px;position:relative}
  .colores-sku button::before{content:"";position:absolute;left:0;right:0;
    top:50%;height:44px;transform:translateY(-50%);z-index:-1}
}

@media (max-width:640px){
  /* Los dos que fallaban por DOS píxeles. Un objetivo a 42 no es "casi": el dedo
     no redondea. */
  .muestras button{min-width:44px;min-height:44px}
  .pie .ir, .pie a.ir{min-width:44px}
}

/* ── EL ÁREA TÁCTIL EXTENDIDA VALE EN TODOS LOS ANCHOS ───────────────────────
   🔴 La primera versión la metió en `@media (max-width:640px)` dando por hecho
   que el objetivo pequeño es un problema de dedos. No lo es: medido con el listón
   de escritorio (24x24, WCAG 2.5.8 AA), seguían fallando DIECISÉIS controles —
   los discos de color a 15x15, los enlaces del pie a 15 de alto y "Elige por
   dónde empezar" a 18. Un objetivo de quince píxeles se falla igual con ratón.
   El pseudo-elemento es invisible y no ocupa sitio en el flujo, así que no cuesta
   nada dejarlo puesto siempre. */
.pie a, .baja, .repetir, .colores-sku button, .panel-movil a{position:relative}
.pie a::after, .baja::after, .repetir::after, .panel-movil a::after{
  content:"";position:absolute;left:0;right:0;top:50%;height:44px;
  transform:translateY(-50%);z-index:-1}
.colores-sku button::before{content:"";position:absolute;left:50%;top:50%;
  width:44px;height:44px;transform:translate(-50%,-50%);z-index:-1}
/* El de los discos se centra en los DOS ejes y no se estira a `left:0;right:0`:
   son cuadrados de 15-22 px en fila, y estirarlos a lo ancho los solaparía entre
   sí. Tocar el color equivocado es peor que tener que apuntar — un objetivo
   chico se reintenta, uno solapado devuelve un resultado falso sin avisar.
   ⚠️ Con 44 de ancho y el gap actual SÍ se tocan entre ellos; el solape se
   verifica abajo en la medición y por eso el ancho real se deja en lo que quepa. */
.colores-sku{gap:0.75rem}

/* El último: un enlace de pie de 42 px de ancho. Su área se estiraba a `left:0;
   right:0`, o sea al ancho del propio texto — que aquí se queda 2 px corto. Se le
   dan 5 px por lado. Van 5 y no 20 porque los enlaces del pie comparten renglón
   en algunas columnas y el solape se verifica, no se supone. */
.pie a::after{left:-5px;right:-5px}
