/* ==========================================================================
   PAPEL Y TINTA — el mundo visual del sitio público.

   REEMPLAZA A `noche.css`. No es un refinamiento: es otro idioma.

   POR QUÉ SE ABANDONA EL VACÍO NEGRO

   El mundo anterior era negro absoluto, vidrio esmerilado y hilos de luz
   verde. Está bien hecho y está mal elegido. Ese vocabulario —el vacío, el
   neón, el cristal— es el de cripto, el de trading, el de los tableros de
   inteligencia artificial. Dice ESPECULACIÓN.

   Este producto es una señora en Tegucigalpa decidiendo, un martes, si
   alcanza para el colegio. Lo que tiene que decir es lo contrario:
   precisión, calma, y que alguien llevó bien las cuentas. Eso no se dice con
   luz sobre el vacío. Se dice con TINTA SOBRE PAPEL.

   Y no es una desviación del ADN: es una restitución. `marca.css` ya declara
   esta paleta —papel #FBF9F9, tinta #131315, verde hondo #064E3B— y el mundo
   negro la sobreescribía entera. Acá se le devuelven sus tokens.

   LAS TRES DECISIONES DE LAS QUE CUELGA TODO

   1. EL FILETE, NO LA SOMBRA. La jerarquía la hacen líneas de un píxel y
      aire, como en un estado de cuenta impreso. Ni una carta flotando, ni un
      desenfoque. Una sombra dice «esto está encima»; un filete dice «esto es
      otra cosa», que es lo que hace falta.

   2. LA CIFRA ES LA IMAGEN. En un sitio de finanzas la ilustración es el
      número. Van en tabulares, grandes, y con el mismo trato que un titular.

   3. EL MOVIMIENTO SE MIDE EN MILÍMETROS. Las cosas se trazan y se corren,
      nunca aparecen ni rebotan. Un documento financiero que hace piruetas
      pierde exactamente lo que tiene que ganar.
   ========================================================================== */

/* ---------- la paleta se declara, no se hereda ----------

   ESTE BLOQUE ES UN ARREGLO, Y EL DEFECTO ERA GRAVE.

   `marca.css` voltea los diez tokens dentro de un
   `@media (prefers-color-scheme: dark)`. `noche.css` era inmune porque
   declaraba su propia paleta entera; `papel.css` los CONSUME, así que en una
   máquina con el sistema en oscuro el mundo de papel salía invertido: fondo
   #131315, tinta clara y el acento en menta. El diseño entero al revés.

   Y no lo vi porque medí con Playwright en `colorScheme: 'light'` y nunca
   probé el otro. Una comprobación que solo mira el caso que funciona no está
   comprobando nada.

   `color-scheme: light` NO alcanza: eso le dice al navegador cómo pintar sus
   controles, no anula una media query. Hay que volver a declarar los valores.
   Van en `.papel` —el <body>— y no en `:root`: el elemento más cercano gana
   para sí y para todos sus descendientes, sin pelear con la media query.

   Es la misma decisión que ya tenía el sitio, solo que del otro lado: un solo
   modo, y lo decide la dirección de arte, no el sistema del visitante. */
.papel {
  --fondo:        #FBF9F9;
  --superficie:   #FFFFFF;
  --elevado:      #F1EFEE;
  --tinta:        #131315;
  --tenue:        #5B5F5D;
  --borde:        #CFCBC8;
  --borde-fuerte: #87847F;
  --acento:       #064E3B;
  --acento-ct:    #FFFFFF;
  --suave:        #E6F2EC;
  --alerta:       #B3261E;
  --sombra: 0 1px 2px rgb(19 19 21 / 0.04), 0 8px 24px -12px rgb(19 19 21 / 0.10);

  /* El papel no es blanco puro: #FBF9F9 tiene un punto de calor. En pantalla
     el blanco absoluto se lee como «sin terminar», y en una página larga
     cansa la vista. */
  background: var(--fondo);
  color: var(--tinta);

  /* Que los controles nativos —barras de scroll, casillas, el calendario de
     un campo de fecha— acompañen. No pinta la página; pinta lo que dibuja el
     navegador por su cuenta. */
  color-scheme: light;

  --filete:     var(--borde);
  --filete-ink: color-mix(in srgb, var(--tinta) 22%, transparent);
  --curva:      cubic-bezier(0.16, 1, 0.3, 1);

  /* La rejilla del documento: el ancho de la mancha y el margen. Una sola
     medida para toda la página es lo que hace que se lea como un impreso y
     no como diez secciones negociando cada una su ancho. */
  --hoja:   min(100% - clamp(2.5rem, 8vw, 10rem), 78rem);
  --canal:  clamp(1.25rem, 5vw, 5rem);
}

/* ---------- la retícula ----------
   Todo lo que va a lo ancho de la página pasa por acá. */
.hoja {
  width: var(--hoja);
  margin-inline: auto;
}

/* ==========================================================================
   TIPOGRAFÍA — el peso es la voz

   Geist es variable de 100 a 900 y el sitio usaba tres pesos del medio. A
   escala de titular el peso correcto es MENOS, no más: sobre papel, un
   titular en 700 grita; en 400 afirma. El tamaño hace el énfasis.
   ========================================================================== */

.papel .rotulo {
  margin: 0 0 clamp(1.75rem, 4vh, 3rem);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--tenue);
}

.papel .display {
  margin: 0;
  font-size: clamp(2.6rem, min(8.6vw, 11.5svh), 8rem);
  font-weight: 400;
  font-variation-settings: "wght" 400;
  line-height: 0.92;
  letter-spacing: -0.045em;
  text-wrap: balance;
  color: var(--tinta);
}

/* La segunda mitad del titular baja de tono. «El saldo todavía no lo sabe»
   es la parte que acusa, y dicha más bajo pega más fuerte que gritada. */
.display em {
  font-style: normal;
  color: var(--tenue);
}

.papel .entrada {
  margin: clamp(1.75rem, 4vh, 2.75rem) 0 0;
  max-width: 54ch;
  font-size: clamp(1.0625rem, 1rem + 0.35vw, 1.25rem);
  line-height: 1.6;
  color: var(--tenue);
}

/* ==========================================================================
   LA PORTADA
   ========================================================================== */

.portada {
  position: relative;
  min-height: 100svh;
  display: grid;
  grid-template-rows: 1fr auto;
  padding-block: clamp(7rem, 16vh, 11rem) 0;
}

.portada__dicho { align-self: center; }

.portada__acciones {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin-top: clamp(2rem, 4.5vh, 3rem);
}

/* ==========================================================================
   EL DESFASE — el instrumento, y la única imagen que necesita la portada

   Dos reglas de días, impresas, que no calzan. El mes del calendario arranca
   el 1; el ciclo de la tarjeta ya venía corriendo desde el 7 de julio. Esa
   diferencia es el producto entero, y acá está medida y acotada como en un
   plano, no insinuada con luz.

   Los días son un `repeating-linear-gradient` y no 62 elementos: son marcas
   de imprenta, no contenido, y ninguna de ellas tiene nada que decirle a un
   lector de pantalla. La lectura va en el texto de al lado.
   ========================================================================== */

.desfase {
  align-self: end;
  padding-block: clamp(1.25rem, 3.5vh, 3rem) clamp(1rem, 3vh, 2.5rem);
  border-top: 1px solid var(--filete);
  display: grid;
  gap: clamp(0.6rem, 1.8vh, 1.4rem);
}

/* EL EJE MIDE 56 DÍAS. El ciclo ocupa del día 0 al 31; el mes, del 25 al 56.
   Cada regla es un TRAMO del mismo eje, no una regla empujada — por eso
   ninguna se sale de su celda y el desfase queda dibujado porque es cierto.

     31 / 56 = 55.357%   lo que mide un mes sobre el eje
     25 / 56 = 44.643%   el corrimiento, o sea el desfase */
.regla {
  display: grid;
  grid-template-columns: minmax(6.5rem, auto) 1fr minmax(5.5rem, auto);
  align-items: center;
  gap: clamp(0.6rem, 1.6vw, 1.25rem);
}

.regla__nombre,
.regla__rango {
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--tenue);
  white-space: nowrap;
}

.regla__rango {
  text-align: right;
  font-variant-numeric: tabular-nums;
  color: var(--tinta);
}

.regla__eje { position: relative; display: block; height: 2rem; }

/* La cinta de días. `--paso` es el ancho de UN día dentro de la cinta, y la
   cinta mide siempre 31 días: lo que cambia entre las dos es dónde empieza. */
.regla__cinta {
  --paso: calc(100% / 31);
  position: absolute;
  inset-block: 0;
  border-inline: 1px solid var(--tinta);
}

.regla__cinta--mes   { left: 44.643%; right: 0; }
.regla__cinta--ciclo { left: 0; right: 44.643%; border-color: var(--acento); }

/* Dos tramas superpuestas: la de todos los días, tenue, y la de cada cinco,
   a tinta plena y más alta. Es lo que permite CONTAR de un vistazo en vez de
   solo ver rayas. */
.regla__cinta::before,
.regla__cinta::after {
  content: "";
  position: absolute;
  inset-inline: 0;
}

.regla__cinta::before {
  inset-block: 0;
  background-image: repeating-linear-gradient(to right, var(--filete-ink) 0 1px, transparent 1px var(--paso));
}

.regla__cinta::after {
  inset-block: 45% 0;
  background-image: repeating-linear-gradient(to right, var(--tinta) 0 1px, transparent 1px calc(var(--paso) * 5));
}

.regla__cinta--ciclo::before { background-image: repeating-linear-gradient(to right, color-mix(in srgb, var(--acento) 35%, transparent) 0 1px, transparent 1px var(--paso)); }
.regla__cinta--ciclo::after  { background-image: repeating-linear-gradient(to right, var(--acento) 0 1px, transparent 1px calc(var(--paso) * 5)); }

.regla--ciclo .regla__nombre { color: var(--acento); }

/* La cota ocupa exactamente el corrimiento: del día 0 al 25 del eje. Dibujo
   técnico —dos topes y una línea— y no un bloque de color. */
.regla--cota .regla__eje { height: 2.5rem; }

.cota {
  position: absolute;
  left: 0;
  width: 44.643%;
  top: 0.25rem;
  font-size: 0.6875rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--alerta);
}

.cota__linea { position: absolute; inset-inline: 0; top: 0; border-top: 1px solid var(--alerta); }
.cota__linea::before,
.cota__linea::after {
  content: "";
  position: absolute;
  top: -0.3rem;
  width: 1px;
  height: 0.6rem;
  background: var(--alerta);
}
.cota__linea::before { left: 0; }
.cota__linea::after  { right: 0; }

.cota__texto {
  position: absolute;
  left: 0;
  top: 0.6rem;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}

/* En pantalla angosta los rótulos se van arriba y el eje se queda con todo el
   ancho. A 390 px, con el rótulo al lado, la cinta bajaba a 170 px: 5.5 px
   por día, y 31 marcas ahí no son una regla, son una mancha gris. */
@media (max-width: 46rem) {
  .regla {
    grid-template-columns: 1fr auto;
    gap: 0.35rem 1rem;
  }
  .regla__eje { grid-column: 1 / -1; height: 1.5rem; }
  .regla--cota .regla__nombre,
  .regla--cota .regla__rango { display: none; }
  .cota__texto { white-space: normal; line-height: 1.3; }
}

/* ==========================================================================
   CONTROLES — botones de impreso, no de aplicación
   ========================================================================== */

.papel .pulsar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0 1.5rem;
  border-radius: var(--radio-chico);
  font-size: 0.9375rem;
  font-weight: 550;
  letter-spacing: -0.01em;
  text-decoration: none;
  border: 1px solid transparent;
  transition: transform 160ms var(--curva), background-color 200ms var(--curva),
              border-color 200ms var(--curva);
}

.papel .pulsar--tinta {
  background: var(--acento);
  color: var(--acento-ct);
}

.papel .pulsar--borde {
  border-color: var(--borde-fuerte);
  color: var(--tinta);
}

@media (hover: hover) and (pointer: fine) {
  .papel .pulsar--tinta:hover { background: color-mix(in srgb, var(--acento) 88%, black); }
  .papel .pulsar--borde:hover { border-color: var(--tinta); background: var(--elevado); }
}

/* Hundirse al apretar: es lo que hace que un control se sienta físico. */
.papel .pulsar:active { transform: scale(0.975); }

/* ==========================================================================
   EL ENCABEZADO — una línea de imprenta
   ========================================================================== */

/* NUNCA se envuelve. El corte de arriba la recoge antes de que haga falta,
   pero esto es el cinturón: si alguien agrega una entrada y se olvida de
   mover el corte, la cabecera se aprieta —fea— en vez de partirse en dos
   renglones, que es un defecto que nadie reporta porque parece a propósito. */
.papel .cabecera { flex-wrap: nowrap; }

/* Y lo que pidió el dueño con estas palabras: «Entrar, crear cuenta, y el
   botón de opciones debe de quedar siempre». `flex: none` se lo garantiza —
   lo que se encoge es el menú, nunca las acciones. */
.papel .sesion,
.papel .tirador { flex: none; }

/* ---------- LA CÁPSULA FLOTA, Y ENVUELVE TODO ----------

   Antes era una barra a lo ancho con filete abajo, y la píldora envolvía
   solo los enlaces. La referencia que trajo el dueño —agroporthonduras.com,
   medida: radio 9999, `rgba(10,15,11,.8)`, `blur(40px)`, filete de
   `rgba(255,255,255,.1)`— hace otra cosa: UNA sola cápsula flotante que
   envuelve el logo, la navegación y las acciones, centrada y despegada del
   borde. Comprobado además que NO cambia con el scroll: queda igual a
   cualquier altura.

   Se toma la ESTRUCTURA, que es composición y es mejor. No el material: su
   vidrio oscuro translúcido es el vocabulario que esta hoja abandonó a
   propósito —el vacío, el neón, el cristal dicen especulación—. Acá el
   material es papel: superficie casi opaca con filete y la sombra única
   del ADN.

   PERO EL DESENFOQUE SE QUEDA, Y NO COMO ADORNO. La cápsula flota fija y el
   contenido pasa POR DEBAJO. Un velo apenas translúcido deja ver que hay
   algo detrás, que es información real sobre la profundidad de la página.
   Opaca sería una tapa y el scroll perdería su pista. */
.papel .cabecera {
  position: fixed;
  top: clamp(0.6rem, 1.6vh, 1rem);
  left: 50%;
  translate: -50% 0;
  z-index: 20;
  /* 70% DEL ANCHO, que es lo que pidió el dueño, con un tope arriba: en un
     monitor de 2560 el 70% serían 1792 px y los cuatro enlaces quedarían
     nadando con el logo a media cuadra. 78rem es el mismo ancho de la hoja
     que usa todo el resto de la página, así que la cápsula se alinea con el
     contenido en vez de flotar a otra medida.

     60% desde el 17 de agosto de 2026, a pedido del dueño. Bajar de 70 a 60
     obligó a subir el corte del menú: ver la nota de 72rem más abajo. */
  width: min(78rem, 60%);

  padding: 5px 5px 5px clamp(0.9rem, 2vw, 1.4rem);
  border-radius: 999px;
  background: color-mix(in srgb, var(--superficie) 86%, transparent);
  border: 1px solid var(--filete);
  box-shadow: var(--sombra);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

/* La cápsula tapa el arranque del contenido, así que la página se corre.
   Va con una propiedad y no con números sueltos: la usan `main`, la portada
   y el `scroll-margin` de los anclajes, y tres números escritos a mano se
   desincronizan al primer ajuste.

   5.5rem = 88px, y está MEDIDO, no elegido: la cápsula mide entre 56 y 66px
   de alto según el ancho, más su separación del borde de 10 a 16px. El peor
   caso da 80px; 88 deja 8 de aire. Un `clamp` con `vh` no servía —lo probé y
   fallaba a 768 de alto— porque la altura de la cápsula depende de su
   contenido, no de la ventana. */
.papel { --alto-capsula: 5.5rem; }
.papel main { padding-top: var(--alto-capsula); }
.papel :target { scroll-margin-top: calc(var(--alto-capsula) + 1rem); }

/* Y las secciones que ya traían su propio relleno de arranque lo bajan, o
   el hueco se cuenta dos veces. La portada tenía 7rem para despegar del
   borde de la ventana; ahora despega de la cápsula. */
.papel .portada:has(.portada__dicho) {
  min-height: calc(100svh - var(--alto-capsula));
  padding-block: clamp(1.5rem, 5vh, 3.5rem) 0;
}
.papel .portada:not(:has(.portada__dicho)) { padding-block: clamp(2rem, 7vh, 4.5rem) clamp(2rem, 6vh, 4rem); }
.papel .acceso { padding-block: clamp(1.5rem, 6vh, 3.5rem); }
.papel .legal { padding-block: clamp(2rem, 7vh, 4.5rem); }

.papel .cabecera .marca,
.papel .cabecera .marca span { color: var(--tinta); }
.papel .menu a:not(.boton) { color: var(--tenue); }
.papel .menu a[aria-current="page"]:not(.boton) { color: var(--tinta); }
.papel .sesion { border-left-color: var(--filete); }
.papel .marca { white-space: nowrap; }

@media (hover: hover) and (pointer: fine) {
  .papel .menu a:not(.boton):hover { color: var(--tinta); }
}

/* ==========================================================================
   LA VITRINA — un aparato a la vez, y su pantalla es una película

   La composición viene de `noche.css` y se conserva porque está bien: tres
   aparatos chicos en fila no se pueden leer, y la única cura de un problema
   de escala es escala. Lo que cambia es el material — la carcasa deja de ser
   vidrio esmerilado y pasa a ser un objeto sobre papel: filete de un píxel y
   una sombra corta, como una foto pegada en una hoja.
   ========================================================================== */

.vitrina { padding-block: clamp(4.5rem, 11vw, 10rem); }

.vitrina__intro {
  margin: 0 auto clamp(2.75rem, 6vw, 6rem);
  max-width: 44rem;
  text-align: center;
}

.vitrina__escena { display: grid; gap: clamp(4rem, 9vw, 7rem); }

.tarima {
  display: grid;
  gap: clamp(1.5rem, 3vw, 2.25rem);
  justify-items: center;
}

.tarima__voz { max-width: 46ch; text-align: center; }

.papel .tarima__voz h3 {
  font-size: clamp(1.3rem, 1.1rem + 1vw, 1.75rem);
  font-weight: 500;
  letter-spacing: -0.03em;
  margin: 0 0 0.6rem;
  color: var(--tinta);
}

.papel .tarima__voz p { margin: 0; color: var(--tenue); line-height: 1.6; }

.pasos { display: none; }

/* ---------- la carcasa ---------- */

.chasis {
  --alto: min(34rem, 62svh);
  margin: 0;
  position: relative;
  border-radius: var(--curva-chasis, 20px);
  border: 1px solid var(--borde);
  background: var(--superficie);
  padding: var(--bisel, 8px);
  box-shadow: var(--sombra);
  display: grid;
  gap: 0;
  /* Contra `100%` y no contra la ventana: el tope es el ancho DISPONIBLE, con
     el relleno de la franja ya descontado. Con `92vw` la página desbordaba. */
  width: min(100%, calc(var(--alto) * var(--w) / var(--h) + var(--bisel, 8px) * 2));
  margin-inline: auto;
}

/* El ancho queda definido arriba, así que a `aspect-ratio` le queda una sola
   medida por resolver y sí se aplica. Con las dos puestas se ignora. */
.chasis__pantalla {
  width: 100%;
  aspect-ratio: var(--w) / var(--h);
  overflow: hidden;
  border-radius: calc(var(--curva-chasis, 20px) - var(--bisel, 8px));
  background: var(--elevado);
}

.chasis__cinta { display: block; width: 100%; height: 100%; object-fit: fill; }

.chasis--telefono   { --w: 300; --h: 580; --curva-chasis: 30px; --bisel: 9px; }
.chasis--tableta    { --w: 420; --h: 545; --curva-chasis: 22px; --bisel: 10px; }
.chasis--escritorio { --w: 880; --h: 540; --curva-chasis: 14px; --bisel: 0px; }

.chasis__muesca {
  position: absolute;
  top: calc(var(--bisel) + 6px);
  left: 50%;
  translate: -50% 0;
  width: 34%;
  height: 5px;
  border-radius: 99px;
  background: var(--borde);
  z-index: 2;
}

.chasis__barra {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 9px 12px;
  background: var(--elevado);
  border-bottom: 1px solid var(--borde);
  border-radius: 13px 13px 0 0;
}
.chasis__barra i { width: 8px; height: 8px; border-radius: 99px; background: var(--borde); }
.chasis__barra span {
  margin-left: 8px;
  padding: 2px 12px;
  border-radius: 99px;
  background: var(--fondo);
  color: var(--tenue);
  font-size: 0.6875rem;
}
.chasis--escritorio .chasis__pantalla { border-radius: 0 0 13px 13px; }

/* ---------- la escena clavada ----------
   Solo donde hay alto para que el aparato de escritorio siga siendo legible.
   Debajo de eso vale más la lista apilada que un cine que no se lee. */
@media (min-width: 64rem) and (min-height: 46rem) and (prefers-reduced-motion: no-preference) {
  .vitrina--viva .vitrina__pista { position: relative; height: 320svh; }

  .vitrina--viva .vitrina__tramos {
    position: absolute; inset: 0;
    display: grid; grid-template-rows: repeat(3, 1fr);
    pointer-events: none; z-index: -1;
  }

  .vitrina--viva .vitrina__escena {
    position: sticky; top: 0; height: 100svh;
    display: grid; grid-template-rows: auto auto;
    align-content: center; justify-items: center;
    gap: clamp(1.25rem, 3vh, 2.25rem);
    padding-block: clamp(3.5rem, 7vh, 5rem) clamp(1.5rem, 3vh, 2.5rem);
  }

  .vitrina--viva .pasos { grid-area: 1 / 1; }
  .vitrina--viva .tarima { grid-area: 2 / 1; align-content: start; align-self: start; }
  .vitrina--viva .chasis { --alto: min(29rem, calc(100svh - 17rem)); }
  .vitrina--viva .tarima { gap: clamp(1rem, 2.4vh, 1.75rem); }

  /* Transición y no `@keyframes`: se puede interrumpir y reapuntar a mitad de
     camino, que es lo que pasa cuando alguien rueda el ratón de golpe. El
     desenfoque no es adorno — sin él se ven DOS aparatos superpuestos durante
     el cruce y se lee como un error de dibujo. */
  .vitrina--viva .tarima {
    opacity: 0;
    transform: translateY(1.25rem) scale(0.97);
    filter: blur(8px);
    pointer-events: none;
    transition: opacity 420ms var(--curva), transform 420ms var(--curva), filter 420ms var(--curva);
  }
  .vitrina--viva .tarima[data-vivo] {
    opacity: 1; transform: none; filter: blur(0); pointer-events: auto;
  }

  .vitrina--viva .pasos {
    display: flex; gap: 0.35rem; list-style: none; margin: 0;
    padding: 0.3rem;
    background: var(--elevado);
    border: 1px solid var(--borde);
    border-radius: 999px;
  }

  .paso {
    appearance: none; border: 0; background: transparent;
    color: var(--tenue); font: inherit; font-size: 0.8125rem; font-weight: 500;
    padding: 0.5rem 1.1rem; border-radius: 999px; cursor: pointer;
    transition: color 200ms var(--curva), background-color 200ms var(--curva);
  }
  .paso[aria-current="true"] { color: var(--acento-ct); background: var(--acento); }
  @media (hover: hover) and (pointer: fine) { .paso:hover { color: var(--tinta); } }
  .paso:active { transform: scale(0.97); }

  /* La escena se retira al soltar el clavado, en vez de irse de golpe. La
     línea de tiempo es la de la PISTA: un elemento pegado no se mueve
     respecto de la ventana, así que su propia `view()` se congela. */
  @supports (animation-timeline: view()) {
    .vitrina--viva .vitrina__pista { view-timeline: --vitrina block; }
    .vitrina--viva .vitrina__escena {
      animation: retirarse linear both;
      animation-timeline: --vitrina;
      animation-range: contain 90% contain 100%;
    }
    @keyframes retirarse {
      from { opacity: 1; transform: none; filter: blur(0); }
      to   { opacity: 0; transform: translateY(-3rem) scale(0.96); filter: blur(6px); }
    }
  }
}

/* ==========================================================================
   EL MOVIMIENTO — se traza y se corre, nunca aparece ni rebota
   ========================================================================== */

@media (prefers-reduced-motion: no-preference) {

  /* El titular se escribe: cada renglón sube desde detrás de su máscara.
     `transform` y nada más — es lo único que no toca composición ni pintura. */
  .verso { display: block; overflow: clip; padding-bottom: 0.1em; margin-bottom: -0.1em; }
  .verso__voz {
    display: block;
    animation: escribirse 900ms var(--curva) both;
  }
  @keyframes escribirse {
    from { transform: translateY(108%); }
    to   { transform: none; }
  }
  .verso:nth-child(1) .verso__voz { animation-delay:  40ms; }
  .verso:nth-child(2) .verso__voz { animation-delay:  90ms; }

  .llega { animation: llegar 800ms var(--curva) both; }
  @keyframes llegar {
    from { opacity: 0; transform: translateY(0.75rem); }
    to   { opacity: 1; transform: none; }
  }
  .llega--2 { animation-delay: 160ms; }
  .llega--3 { animation-delay: 240ms; }
  .llega--4 { animation-delay: 320ms; }

  /* LAS REGLAS SE IMPRIMEN. Se descubren de izquierda a derecha, que es la
     dirección en que pasa el tiempo. `clip-path` y no `width`: recortar no
     rehace la composición, y estas cintas llevan un degradado repetido que
     al cambiar de ancho se recalcularía entero en cada cuadro. */
  .regla__cinta {
    animation: imprimir 1100ms var(--curva) both;
    animation-delay: 420ms;
  }
  .regla--ciclo .regla__cinta { animation-delay: 560ms; }
  @keyframes imprimir {
    from { clip-path: inset(0 100% 0 0); }
    to   { clip-path: inset(0 0 0 0); }
  }

  .cota { animation: llegar 700ms var(--curva) 980ms both; }
}

/* Sin movimiento: todo visible, quieto y completo. */
@media (prefers-reduced-motion: reduce) {
  .papel *, .papel *::before, .papel *::after {
    animation: none !important;
    transition: none !important;
  }
}

/* El cierre repite las acciones de la portada, centradas. */
.portada__acciones--centro { justify-content: center; }

/* ==========================================================================
   EL TOPE DE LA MANCHA — la regla que ninguna sección puede saltarse

   Medido a 1920 sin esto: 168 caracteres por renglón. El ojo pierde el
   principio de la línea siguiente pasados los ~75, y el proyecto se fija 65.

   Va acá y no sección por sección a propósito: los topes repartidos por diez
   reglas distintas es exactamente como se llegó a 168 — cada sección nueva
   creía que la anterior lo había resuelto. Una sola regla, en el mundo, y las
   secciones solo la anulan cuando tienen una razón.
   ========================================================================== */

.papel :where(p, li, dd, .lectura, .bajada, .entrada) { max-width: 65ch; }

/* Los renglones de dos columnas no son líneas de lectura: su mancha son sus
   hijos. Ponerles el tope acota la columna del término y desarma la rejilla. */
.papel :where(.hecho, .fila-cfg) { max-width: none; }

/* Centrados, el tope se reparte a los dos lados en vez de dejar el bloque
   pegado a la izquierda dentro de su caja. */
.papel :where(.bajada--centro, .tarima__voz p, .vitrina__intro p) { margin-inline: auto; }

/* ==========================================================================
   EL TIRADOR — la navegación se recoge, las acciones se quedan

   En un teléfono los cuatro enlaces de navegación se comían una fila entera
   de la cabecera, y son lo MENOS urgente que hay ahí: quien llega no viene a
   leer «Preguntas», viene a entrar o a abrir una cuenta. Esas dos se quedan
   siempre a la vista y la navegación pasa detrás del tirador.
   ========================================================================== */

.tirador {
  display: none;          /* /menu.js lo enciende */
  align-items: center;
  gap: 0.55rem;
  appearance: none;
  background: transparent;
  border: 1px solid var(--borde);
  border-radius: var(--radio-chico);
  color: var(--tinta);
  font: inherit;
  font-size: 0.8125rem;
  font-weight: 550;
  min-height: 44px;
  padding: 0 0.85rem;
  cursor: pointer;
  transition: border-color 200ms var(--curva), background-color 200ms var(--curva);
}

/* 18 × 14 y no 16 × 12: con las rayas a 8 px de distancia el dibujo se leía
   como un signo «igual», no como un menú. A 11 px ya se lee como dos
   renglones, que es lo que tiene que sugerir. */
.tirador__caja {
  position: relative;
  width: 18px;
  height: 14px;
  flex: none;
}

/* Dos rayas que se cruzan. La equis no es un icono aparte: son las MISMAS dos
   rayas girando, y por eso el cambio se lee como un movimiento y no como un
   reemplazo de dibujo. */
.tirador__raya {
  position: absolute;
  left: 0;
  width: 100%;
  height: 1.5px;
  border-radius: 2px;
  background: currentColor;
  transition: transform 260ms var(--curva), opacity 160ms var(--curva);
}
.tirador__raya:nth-child(1) { top: 1px; }
.tirador__raya:nth-child(2) { bottom: 1px; }

.tirador[aria-expanded="true"] .tirador__raya:nth-child(1) { transform: translateY(5.25px) rotate(45deg); }
.tirador[aria-expanded="true"] .tirador__raya:nth-child(2) { transform: translateY(-5.25px) rotate(-45deg); }

.tirador:active { transform: scale(0.97); }

@media (hover: hover) and (pointer: fine) {
  .tirador:hover { border-color: var(--tinta); background: var(--elevado); }
}

/* ---------- de 46rem para abajo: el menú es un panel ---------- */

/* 57rem = 912px, Y EL NÚMERO ESTÁ MEDIDO. La cabecera deja de caber en una
   línea por debajo de 898px; el corte estaba en 46rem = 736px. O sea que
   había 162px de ancho —de 736 a 898— donde el menú seguía en línea, no
   cabía, y se envolvía: la cabecera pasaba de 69px de alto a 135, y las
   opciones se apilaban en un segundo renglón. Se ve al angostar la ventana
   de escritorio, que es como lo encontró el dueño.

   Los 14px de margen sobre 898 no son superstición: si mañana se agrega una
   entrada al menú, el corte aguanta antes de volver a partirse. */
@media (max-width: 72rem) {
  .papel .cabecera--con-tirador { flex-wrap: nowrap; gap: 0.6rem; }
  .papel .cabecera--con-tirador .tirador { display: inline-flex; }

  /* El <nav> se convierte en panel. Va `position: absolute` colgado de la
     cabecera y no dentro del flujo: metido en el flujo, abrirlo empujaría la
     página hacia abajo y el contenido daría un salto de 200 px. */
  .papel .cabecera--con-tirador .menu {
    position: absolute;
    top: 100%;
    inset-inline: 0;
    display: grid;
    gap: 0;
    width: auto;
    margin: 0;
    padding: 0.5rem clamp(1.25rem, 5vw, 5rem) 1rem;
    background: var(--fondo);
    border-bottom: 1px solid var(--borde);
    overflow: visible;

    /* Cerrado no es `display: none`: se recorta. Así la altura se puede
       animar y, sobre todo, `visibility: hidden` lo saca del orden de
       tabulación — con solo opacidad, el teclado sigue entrando a cuatro
       enlaces invisibles. */
    visibility: hidden;
    opacity: 0;
    transform: translateY(-0.5rem);
    transition: opacity 220ms var(--curva), transform 260ms var(--curva),
                visibility 0s linear 260ms;
  }

  .papel .cabecera--con-tirador .menu[data-abierto] {
    visibility: visible;
    opacity: 1;
    transform: none;
    transition-delay: 0s;
  }

  .papel .cabecera--con-tirador .menu a {
    padding-block: 0.85rem;
    min-height: 44px;
    display: flex;
    align-items: center;
    border-bottom: 1px solid var(--borde);
    font-size: 1rem;
  }
  .papel .cabecera--con-tirador .menu a:last-child { border-bottom: 0; }

  /* La cabecera necesita ser el marco del panel colgado. */
  /* NUNCA se envuelve. El corte de arriba la recoge antes de que haga falta,
   pero esto es el cinturón: si alguien agrega una entrada y se olvida de
   mover el corte, la cabecera se aprieta —fea— en vez de partirse en dos
   renglones, que es un defecto que nadie reporta porque parece a propósito. */
.papel .cabecera { flex-wrap: nowrap; }

/* Y lo que pidió el dueño con estas palabras: «Entrar, crear cuenta, y el
   botón de opciones debe de quedar siempre». `flex: none` se lo garantiza —
   lo que se encoge es el menú, nunca las acciones. */
.papel .sesion,
.papel .tirador { flex: none; }

.papel .cabecera { position: fixed; }

  /* Y el rótulo de sesión se aprieta para que las dos acciones y el tirador
     entren en una sola fila de 390 px. */
  .papel .cabecera--con-tirador .sesion {
    margin-left: auto;
    padding-left: 0;
    border-left: 0;
    display: flex;
    align-items: center;
    gap: 0.5rem;
  }
  .papel .cabecera--con-tirador .tirador__dicho { display: none; }
  .papel .cabecera--con-tirador .tirador { padding-inline: 0.7rem; }
}

/* De 46rem para arriba el tirador no existe y los cuatro enlaces van sueltos:
   es lo correcto cuando hay lugar, y evita esconder navegación por gusto. */
@media (min-width: 72.0625rem) {
  .papel .cabecera--con-tirador .tirador { display: none; }
}

/* ==========================================================================
   LA PANTALLA DE LA PORTADA — un aparato apoyado sobre la hoja

   La página es papel claro y la película es oscura. No se resuelve poniendo
   el video a sangre: se resuelve ENMARCÁNDOLO. Un aparato tiene una pantalla
   oscura y eso no contradice el papel, igual que un teléfono sobre un
   escritorio no contradice el escritorio. El contraste lo vuelve el foco.

   LO QUE SE VE ADENTRO SON DOS COSAS UNIDAS: seis segundos generados —un
   documento deshaciéndose en luz, sin una letra en el cuadro— y tres y medio
   de la interfaz REAL, grabada de la app. El empalme es invisible porque las
   columnas de luz y las barras de la gráfica son la misma forma.
   ========================================================================== */

.pantalla { margin: 0; display: grid; gap: 0.9rem; justify-items: center; }

.pantalla__marco {
  width: 100%;
  border: 1px solid var(--borde);
  border-radius: 14px;
  background: #17181A;
  box-shadow: 0 1px 2px rgb(19 19 21 / 0.06), 0 24px 60px -28px rgb(19 19 21 / 0.35);
  overflow: hidden;
}

.pantalla__barra {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 9px 12px;
  background: #1F2124;
  border-bottom: 1px solid #2A2D31;
}
.pantalla__barra i { width: 8px; height: 8px; border-radius: 99px; background: #3A3E43; }
.pantalla__barra span {
  margin-left: 8px;
  padding: 2px 12px;
  border-radius: 99px;
  background: #131416;
  color: #8B9097;
  font-size: 0.6875rem;
}

/* La proporción la fija el vidrio y no el video: así el marco reserva su
   lugar desde el primer pintado y la página no da un salto cuando la
   película entra. */
/* La proporción la fija el vidrio y no el video: así el marco reserva su
   lugar desde el primer pintado y la página no da un salto cuando la película
   entra.

   EL FONDO ES EL PRIMER CUADRO porque acá el video SÍ se va a reproducir, y
   arrancar mostrando el final para después rebobinar se ve como un error.
   Donde no se reproduce, más abajo, se cambia por el último. */
.pantalla__vidrio {
  position: relative;
  /* El ancho lo manda el marco, siempre. Sin esto, cuando el alto se estira a
     la ventana entera `aspect-ratio` invierte el cálculo y saca el ancho del
     alto: en una ventana de 1440 × 900 el vidrio salía en 1600 px dentro de
     un marco de 1438, y se recortaba de un solo lado. Con el ancho clavado,
     el recorte lo hace el video con `object-fit: cover`, que lo hace
     centrado. */
  width: 100%;
  aspect-ratio: 1920 / 1080;
  /* El fondo era carbón porque la película empezaba en carbón. Ahora empieza
     en papel, y las dos franjas que deja `object-fit: contain` tienen que ser
     del mismo mundo: dos barras negras alrededor de un tablero claro se leen
     como un video mal encuadrado, no como una sala de cine. */
  /* `contain` Y NO `cover`, Y SE VIO RECIÉN AL PASAR A CLARO. El video se
     encuadra con `contain`; el fondo iba con `cover`. Mientras los dos eran
     oscuros la diferencia se perdía en el negro, pero con dos tableros claros
     uno encima del otro a distinta escala aparecía un «Controle» fantasma
     corrido unos píxeles del bueno. Los dos encuadres tienen que ser el
     mismo, o no están mostrando la misma imagen. */
  background: var(--superficie) center / contain no-repeat url("/media/app-hero-inicio.jpg");
}

.pantalla__cinta {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  /* `contain` Y NO `cover`, Y SE VIO EN LA COMPARACIÓN DE LAS TRES ETAPAS.
     La película es 16:9 y casi ninguna ventana lo es: a 1440 × 900, llenar
     recortando se comía «Controle» por la izquierda y la fecha del ciclo por
     la derecha. Texto cortado a media palabra no se lee como encuadre, se lee
     como defecto.

     Con `contain` sobran dos franjas del color del marco arriba y abajo
     mientras la pantalla está llena, y eso sí se lee: es una sala de cine. Y
     no cuesta nada al final del encogimiento, donde el vidrio ya es 16:9
     exacto y las dos reglas dan el mismo resultado. */
  object-fit: contain;
  display: block;
  /* Aparece cuando ya se puede reproducir, no antes: mostrada mientras carga
     es un rectángulo negro tapando el póster. */
  opacity: 0;
  transition: opacity 500ms var(--curva);
}
.pantalla--lista .pantalla__cinta { opacity: 1; }
.pantalla--sin-cinta .pantalla__cinta { display: none; }


/* ---------- el acto de la pantalla: arranca lleno y se encoge ----------

   LA PELÍCULA OCUPA LA PANTALLA Y SE VA ENCOGIENDO CON EL SCROLL hasta quedar
   dentro del marco del aparato. Primero se ve la película sola, sin nada que
   compita; después la página se vuelve a armar en torno a ella —la barra, el
   filete, el rótulo— y lo que queda en el marco es el producto.

   POR QUÉ `width` Y NO `scale`, QUE SERÍA MÁS BARATO

   Encoger con `scale` no cuesta ni composición ni pintura, y era lo primero
   que había que intentar. No se puede: el factor final tendría que ser
   `--hoja / 100vw`, y CSS no sabe dividir dos longitudes para sacar un número
   sin unidad. Y agrandar con `scale` además estira el video por encima de sus
   1920 nativos, que es exactamente lo que se acababa de arreglar subiendo el
   montaje a 1080p.

   Animar `width` sí rehace la composición en cada cuadro, así que el daño se
   acota: `contain: layout paint` en el pin encierra el recálculo dentro del
   acto, y no hay un solo elemento más adentro que dependa del ancho. Se midió
   contando cuadros largos durante el scroll — no se supuso.

   Y el ancho va de `100%` a `var(--hoja)`, nunca de `100vw`: `100vw` incluye
   la barra de scroll, y eso mete desborde horizontal en toda pantalla que la
   tenga. El pin ya es del ancho de la ventana sin ella. */

.acto-pantalla {
  /* La PISTA. Su altura es el recorrido durante el cual la película se
     encoge: 220vh son 120vh de encogimiento más los 100vh que ocupa el pin. */
  height: 220vh;
  padding-block: 0;
  /* El canal lateral de `.franja` se anula, y se midió por qué: con él puesto
     la película arrancaba en 1758 px sobre una ventana de 1920 — le faltaban
     160 px para llenar la pantalla, que es justo lo que este acto promete. El
     canal vuelve más abajo, aplicado al ancho FINAL y no al de arranque. */
  padding-inline: 0;
  /* El nombre del reloj. Se lo pasa al hijo clavado, que por estar clavado no
     se mueve y no puede medir su propio avance. */
  view-timeline-name: --pista;
  view-timeline-axis: block;
}

.acto-pantalla__pin {
  position: sticky;
  top: 0;
  height: 100svh;
  display: grid;
  place-items: center;
  overflow: hidden;
  contain: layout paint;
}

/* La cabecera es `fixed` y mide 69 px medidos, así que no le quita altura a
   nada: la película a sangre le pasa por debajo, que es lo correcto —para eso
   es a sangre—. Pero el rótulo, que aparece recién cuando ya hay marco, salía
   a 42 px del borde y quedaba tapado. Se despeja solo la caja, no el pin: si
   el hueco se le pusiera al pin, la película dejaría de llenar la pantalla. */
.acto-pantalla__caja { padding-top: 4.5rem; }

/* Y el hueco de arriba se compensa abajo para que el conjunto siga viéndose
   centrado en la ventana en vez de empujado. */
.acto-pantalla__pin { align-content: center; }

.acto-pantalla__caja {
  width: 100%;
  display: grid;
  justify-items: center;
  gap: clamp(1rem, 2.5vh, 2rem);
}

.acto-pantalla__rotulo { margin: 0; }

.pantalla { width: 100%; display: grid; justify-items: center; }

@supports (animation-timeline: view()) {
  @media (min-width: 67.5rem) and (prefers-reduced-motion: no-preference) {
    /* `contain 0%` es el instante en que la pista llena la ventana, y
       `contain 100%` aquel en que termina de pasar. Para un elemento más alto
       que la ventana ese tramo es exactamente lo que dura el clavado. */
    .acto-pantalla .pantalla__marco {
      animation: encoger linear both;
      animation-timeline: --pista;
      animation-range: contain 0% contain 100%;
    }
    @keyframes encoger {
      from { width: 100%; border-radius: 0; }
      to   { width: var(--hoja); border-radius: 14px; }
    }

    /* EL ALTO TAMBIÉN, o no llena la pantalla. La proporción del video es
       16:9 y casi ninguna ventana lo es: a 1440 × 900, un ancho completo da
       801 px de alto y sobran 99 abajo. Así que al arrancar el vidrio mide
       la ventana entera y el video se recorta —`object-fit: cover`—, y al
       terminar vuelve a la altura que le toca por proporción.

       `aspect-ratio` sigue declarado en la regla base y no estorba: cuando
       hay `height` explícito, gana el `height`. Se queda porque es lo que
       reserva el lugar antes de que cargue nada. */
    .acto-pantalla .pantalla__vidrio {
      animation: encoger-alto linear both;
      animation-timeline: --pista;
      animation-range: contain 0% contain 100%;
    }
    /* `min-height` Y NO `height`, Y LA DIFERENCIA NO ES DE ESTILO.

       Con `height` puesto, `aspect-ratio` deja de derivar el alto del ancho y
       pasa a derivar el ANCHO DEL ALTO. Y como el valor final tenía que
       escribirse con `--hoja`, que lleva un `100%` adentro, ese porcentaje se
       resolvía contra el propio vidrio: circular. Medido, el vidrio terminaba
       en 588 px dentro de un marco de 1248.

       Con `min-height` el ancho lo sigue mandando el marco y el alto es el
       mayor entre «lo que pide la proporción» y «la ventana entera». Al
       arrancar gana la ventana; al llegar a cero, la proporción. Sin
       porcentajes y sin pelearse con `aspect-ratio`. */
    @keyframes encoger-alto {
      from { min-height: 100svh; }
      to   { min-height: 0; }
    }

    /* El aparato se arma DESPUÉS, no desde el principio: una barra de
       navegador falsa sobre una película a sangre no es un aparato, es un
       adorno encima de una imagen. Aparece cuando ya hay marco donde vivir. */
    .acto-pantalla .pantalla__barra,
    .acto-pantalla__rotulo {
      animation: armarse linear both;
      animation-timeline: --pista;
      animation-range: contain 55% contain 95%;
    }
    @keyframes armarse {
      from { opacity: 0; }
      to   { opacity: 1; }
    }
  }
}

/* ---------- las compuertas, y por qué son DOS listas y no una ----------

   Nacieron como una sola lista de cinco que apagaba el video. Se midió a 390
   y el resultado fue el mismo defecto que ya había costado caro en la
   vitrina: el marco queda en 308 px, y un tablero compuesto para 1280 metido
   ahí deja su texto más chico en 5 px. Ilegible.

   Apagar el video no arregla eso — el póster es igual de chiquito. Lo que hay
   que apagar es EL ACTO ENTERO, y por una razón de composición, no de peso:
   más abajo la vitrina ya enseña la app en un teléfono, filmada al tamaño
   correcto y legible. Un tablero de escritorio ilegible encima de eso es
   estrictamente peor que no ponerlo.

   Dónde está el corte, medido y CORREGIDO midiendo. El texto más chico del
   tablero son 14.5 px sobre 1280 de ancho; para que no baje de los 10 px que
   este proyecto ya tenía por umbral, el marco tiene que medir
   1280 × (10 / 14.5) = 883 px. El primer corte lo puse en 1024 a ojo y la
   medición lo desmintió: ahí el marco sale en 838 px y la letra en 9.5. El
   marco llega a 883 px con una ventana de ~1080, y ese es el número.

   Y por eso son dos listas. El TAMAÑO esconde el acto. El MOVIMIENTO
   REDUCIDO no: quien lo tiene prendido en una pantalla de 1440 sí puede leer
   el tablero perfectamente — lo que no quiere es que se mueva. A ese le queda
   el acto completo con el último cuadro fijo. Meter las dos cosas en una sola
   lista le escondía la pantalla por una preferencia que no tiene nada que ver
   con poder verla. */

/* 1. POR TAMAÑO — se esconde el acto entero. */
@media (max-width: 1080px),
       (orientation: portrait) and (pointer: coarse),
       (orientation: landscape) and (pointer: coarse) and (max-height: 560px) {
  .acto-pantalla { display: none; }
}

/* Sin `view()` —o con movimiento reducido— no hay encogimiento que valga: la
   pista de 220vh sería scroll vacío. El acto vuelve a medir lo que ocupa y la
   pantalla se queda en su tamaño de marco, quieta. */
@media (prefers-reduced-motion: reduce) {
  .acto-pantalla { height: auto; padding-block: clamp(4rem, 10vh, 8rem); }
  .acto-pantalla__pin { position: static; height: auto; }
  .acto-pantalla .pantalla__marco { width: var(--hoja); }
}
@supports not (animation-timeline: view()) {
  .acto-pantalla { height: auto; padding-block: clamp(4rem, 10vh, 8rem); }
  .acto-pantalla__pin { position: static; height: auto; }
  .acto-pantalla .pantalla__marco { width: var(--hoja); }
}

/* 2. POR MOVIMIENTO — se queda el acto, se va la película.
   El fondo pasa a ser el ÚLTIMO cuadro: el resumen del mes ya calculado, con
   sus lempiras y su ciclo. Una composición terminada, no la disculpa de un
   video que no llegó. */
@media (prefers-reduced-motion: reduce) {
  .pantalla__vidrio { background-image: url("/media/app-hero-poster.jpg"); }
  .pantalla__cinta { display: none; }
}

/* ==========================================================================
   LA MITAD DE ABAJO — reparación de una regresión que causé yo

   QUÉ PASÓ, SIN ADORNOS

   Al cambiar el sitio a papel desenlacé `noche.css` y escribí `papel.css` en
   su lugar. Pero `papel.css` solo vistió la portada, el instrumento del
   desfase, la vitrina y la pantalla: 79 clases. De la sección del ciclo para
   abajo quedaron 68 clases SIN UNA SOLA REGLA en ninguna hoja enlazada — el
   61% de esa parte de la página.

   No se vio porque un elemento sin estilo no da error: se dibuja con los
   valores por defecto del navegador y parece «texto plano», no «roto». El
   dueño lo encontró mirando el sitio publicado. Las barras negras gigantes
   del instrumento interactivo eran `<rect>` de SVG sin `fill`, que el
   navegador rellena de negro y estira a todo el ancho porque el `<svg>`
   tampoco tenía ancho acotado.

   Es la trampa que TRASPASO.md §6 describe: falló en silencio.

   POR QUÉ NO SE PORTA `noche.css` Y SE ESCRIBE DE NUEVO

   Porque `noche.css` es el idioma del vidrio esmerilado y el neón sobre
   negro, y ese vocabulario se abandonó a propósito. Copiarlo acá traería de
   vuelta justo lo que se decidió no ser. Las tres reglas de este mundo
   mandan igual que arriba:

     1. EL FILETE, NO LA SOMBRA. Jerarquía con líneas de un píxel y aire.
     2. LA CIFRA ES LA IMAGEN. En finanzas la ilustración es el número.
     3. EL MOVIMIENTO SE MIDE EN MILÍMETROS. Se traza y se corre; no aparece.
   ========================================================================== */

/* ---------- la superficie compartida ----------
   `.vidrio` se llamaba así porque en el mundo negro era cristal esmerilado.
   Acá no se renombra —el marcado es de otras nueve secciones y renombrar por
   gusto es cómo se rompen las cosas— pero sí cambia de materia: papel puesto
   sobre papel, separado por un filete y no por un desenfoque. */
.papel .vidrio {
  background: var(--superficie);
  border: 1px solid var(--filete);
  border-radius: 12px;
  padding: clamp(1.5rem, 4vw, 2.75rem);
}

/* El rótulo técnico: lo que en un plano va junto a una cota. Chico, espaciado
   y en tinta tenue — nombra el dibujo sin competir con él. */
.papel .tecnico {
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--tenue);
  font-variant-numeric: tabular-nums;
}

/* El titular de sección. Menos peso que tamaño: a esta escala 700 grita. */
.papel .titular {
  margin: 0 0 clamp(2rem, 5vh, 3.5rem);
  font-size: clamp(1.75rem, 1.2rem + 2.2vw, 3rem);
  font-weight: 400;
  line-height: 1.06;
  letter-spacing: -0.03em;
  text-wrap: balance;
  color: var(--tinta);
}
.papel .titular--centro { text-align: center; margin-inline: auto; max-width: 22ch; }

/* El filete que separa acto de acto. Es la única división de la página: ni
   fondos alternados ni cajas. Se estrecha a los lados para que se lea como
   marca de imprenta y no como borde de contenedor. */
.papel .regla-viva {
  width: var(--hoja);
  margin-inline: auto;
  height: 1px;
  background: var(--filete);
}

/* ==========================================================================
   ACTO · EL CICLO — el aparato clavado y sus cuatro hitos
   ========================================================================== */

.papel .aparato { display: grid; gap: clamp(1.25rem, 3vh, 2rem); }

.papel .aparato__cabeza {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
  padding-bottom: 0.875rem;
  border-bottom: 1px solid var(--filete);
}

/* ---------- la vía de medida ----------
   Un solo riel donde se leen tres tramos: lo cargado, lo que la quincena
   cubre, y lo que queda sin cubrir. Los tres suman el ancho completo, así
   que la proporción ES el dato y no una ilustración de él.

   14,840 de 19,101 = 77.7% cubierto. El resto, 22.3%, es lo que falta. */
.papel .medida { display: grid; gap: 0.625rem; }

.papel .medida__via {
  position: relative;
  height: 10px;
  border-radius: 99px;
  background: var(--elevado);
  overflow: hidden;
}

/* La carga es todo el ciclo: el fondo contra el que se leen los otros dos. */
.papel .medida__carga {
  position: absolute;
  inset: 0;
  background: var(--elevado);
}
/* Lo que la quincena sí cubre. Verde porque va a favor. */
.papel .medida__abono {
  position: absolute;
  inset: 0 auto 0 0;
  width: 77.7%;
  background: var(--acento);
  border-radius: 99px;
}
/* Lo que queda sin cubrir. Es el único rojo del acto, y por eso pesa. */
.papel .medida__falta {
  position: absolute;
  inset: 0 0 0 auto;
  width: 22.3%;
  background: var(--alerta);
  border-radius: 99px;
}
/* La costura: dónde se acaba el ingreso y empieza el problema. */
.papel .medida__costura {
  position: absolute;
  top: -3px; bottom: -3px;
  left: 77.7%;
  width: 1.5px;
  background: var(--tinta);
}

.papel .medida__pies {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
}

/* ---------- las cifras ----------
   Renglones de estado de cuenta: rótulo a la izquierda, cifra a la derecha,
   filete entre medio. El total se separa con un filete más marcado, como en
   un impreso — no con un fondo de color. */
.papel .aparato__cifras { margin: 0; display: grid; }

.papel .renglon {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
  padding-block: 0.625rem;
  border-bottom: 1px solid var(--filete);
}
.papel .renglon dt { color: var(--tenue); font-size: 0.9375rem; }
.papel .renglon dd { margin: 0; }

.papel .renglon--total {
  border-bottom: 0;
  border-top: 1px solid var(--borde-fuerte);
  margin-top: 0.25rem;
  padding-top: 0.875rem;
}
.papel .renglon--total dt { color: var(--tinta); font-weight: 500; }

/* Toda cifra de dinero en tabulares. Sin excepción: es del ADN. */
.papel .cifra {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  letter-spacing: -0.01em;
}
.papel .renglon .cifra { font-size: 1.125rem; }
.papel .renglon--total .cifra { font-size: 1.375rem; font-weight: 500; }
.papel .falta,
.papel .hito__falta { color: var(--alerta); }

.papel .aparato__pie {
  margin: 0;
  padding-top: 0.25rem;
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--tenue);
}

/* ---------- los hitos ----------
   Fechados, no numerados: el orden ES el dato. La fecha va en su propia
   columna, alineada, para que las cuatro se lean como una cronología y no
   como cuatro párrafos con negrita. */
.papel .hito {
  display: grid;
  grid-template-columns: minmax(5.5rem, auto) 1fr;
  gap: 0.25rem clamp(1rem, 2.5vw, 2rem);
  padding-block: clamp(1.25rem, 3vh, 2rem);
  border-top: 1px solid var(--filete);
}
.papel .hito:first-child { border-top: 0; padding-top: 0; }

.papel .hito__fecha {
  grid-row: 1 / 3;
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--tenue);
  font-variant-numeric: tabular-nums;
  padding-top: 0.3rem;
}
.papel .hito h3 {
  margin: 0;
  font-size: 1.0625rem;
  font-weight: 500;
  letter-spacing: -0.01em;
  color: var(--tinta);
}
.papel .hito p {
  margin: 0.375rem 0 0;
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--tenue);
  max-width: 52ch;
}

@media (max-width: 40rem) {
  /* A 390 la columna de fecha se come el ancho del texto. Se apila. */
  .papel .hito { grid-template-columns: 1fr; }
  .papel .hito__fecha { grid-row: auto; padding-top: 0; }
}

/* ==========================================================================
   ACTO · EL CICLO PROPIO — el único momento en que el visitante toca algo

   ACÁ ESTABA EL PEOR DAÑO. El dibujo es un `<svg>` cuyos `<rect>` no tenían
   `fill` en ninguna hoja enlazada, así que el navegador los pintaba NEGRO —
   su valor por defecto— y encima el `<svg>` sin ancho declarado se estiraba
   a todo lo disponible. De ahí los dos bloques negros gigantes, uno saliéndose
   de la pantalla, que no se parecían a nada.
   ========================================================================== */

.papel .propio { display: grid; gap: clamp(2rem, 5vh, 3.5rem); }
.papel .propio__intro { width: var(--hoja); margin-inline: auto; }
.papel .propio__intro .lectura + .lectura { margin-top: 1rem; }

.papel .propio__panel {
  width: var(--hoja);
  margin-inline: auto;
  display: grid;
  gap: clamp(1.25rem, 3vh, 2rem);
}

/* ---------- la leyenda ----------
   Rotula el dibujo desde afuera. Va afuera y no dentro del SVG porque el
   texto de adentro escala con el `viewBox`: a 390 de ancho quedaría en 8 px. */
.papel .propio__leyenda {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem clamp(1rem, 3vw, 2rem);
}
.papel .leyenda {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.8125rem;
  color: var(--tenue);
}
.papel .leyenda b { color: var(--tinta); font-weight: 500; font-variant-numeric: tabular-nums; }
/* La muestra de color, del mismo alto que el carril que nombra. */
.papel .leyenda i {
  width: 18px; height: 6px; border-radius: 99px; flex: none;
}
.papel .leyenda--mes i   { background: var(--borde-fuerte); }
.papel .leyenda--ciclo i { background: var(--acento); }

/* ---------- el dibujo ----------
   Un plano, no una ilustración: dos carriles, una guía, una costura y una
   cota. Cada `fill` se declara acá porque en SVG el valor por defecto es
   negro sólido, y eso fue exactamente el defecto. */
.papel .reglas {
  display: block;
  width: 100%;
  /* ACOTADO, Y SE MIDIÓ POR QUÉ. Suelto llegaba a 1158 px a 1920, o sea 1.87
     veces su tamaño nativo: los carriles de 6 px salían en 11 y la guía de 1
     en casi 2. Un plano engordado deja de leerse como plano. A 760 la escala
     máxima es 1.23×, que el ojo no registra como agrandado. */
  max-width: 47.5rem;
  height: auto;
  /* Alineado a la izquierda como TODO lo demás del panel —leyenda, lectura,
     control y pie—. Centrado, el dibujo flotaba solo en el medio mientras el
     resto se pegaba al margen, y esa mezcla se lee como descuido. */
  overflow: visible;
}

/* El mes del calendario: neutro. El calendario no es el culpable. */
.papel .reglas__mes   { fill: var(--borde-fuerte); }
/* El ciclo de la tarjeta: el acento, porque es lo que el producto respeta. */
.papel .reglas__ciclo { fill: var(--acento); }
/* La guía del día 1, contra la que se mide todo lo demás. */
.papel .reglas__guia  { fill: var(--borde); }
/* La costura y su nudo: donde los dos calendarios dejan de coincidir. */
.papel .reglas__costura { fill: var(--alerta); }
.papel .reglas__nudo    { fill: var(--alerta); }
/* La cota: dibujo técnico, un pelo de línea, nunca un bloque de color. */
.papel .reglas__cota,
.papel .reglas__tope    { fill: var(--tinta); }

/* Los carriles se deslizan cuando se mueve el control. `x` en SVG SÍ es
   propiedad CSS y por eso se puede transicionar; por eso la costura se
   dibuja con `<rect>` y no con `<line>`, cuyo `x1` es solo atributo y
   saltaría de golpe.

   CADA UNO TRANSICIONA SOLO LO QUE DE VERDAD LE CAMBIA, y no es purismo:
   `/ciclo.js` mueve `x` en cuatro elementos, `cx` en uno y `width` en uno
   solo. Declarar las tres en los seis hacía que el navegador vigilara
   dieciocho propiedades para animar seis, y dejaba escrito en la hoja algo
   falso sobre qué se mueve.

   Lo de `width` en la cota lo marcó el detector de diseño, con razón para el
   caso general: animar anchos rehace composición. Acá se queda porque es
   geometría de SVG sobre un rectángulo de 1 píxel de alto —no caja de
   HTML— y porque el ancho de la cota ES el dato: mide los días que el ciclo
   lleva corriendo. Sustituirlo por `scaleX` obligaría a que el factor lo
   calculara el JS, moviendo a otro archivo una cuenta que acá se lee. */
.papel .reglas__ciclo,
.papel .reglas__costura,
.papel .reglas__tope {
  transition: x 260ms var(--curva);
}
.papel .reglas__nudo { transition: cx 260ms var(--curva); }
.papel .reglas__cota { transition: x 260ms var(--curva), width 260ms var(--curva); }

.papel .propio__lectura {
  margin: 0;
  font-size: clamp(1rem, 0.95rem + 0.3vw, 1.125rem);
  line-height: 1.6;
  color: var(--tenue);
  max-width: 52ch;
}
.papel .propio__lectura b {
  color: var(--tinta);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}

/* ---------- el control ----------
   El deslizador se dibuja a mano porque el nativo trae el azul del sistema,
   y este mundo no tiene azul. La pista es un filete; el tirador, un punto de
   tinta. 44 px de objetivo táctil, que es del ADN. */
.papel .dial {
  display: grid;
  gap: 0.625rem;
  padding-top: clamp(0.5rem, 2vh, 1rem);
  border-top: 1px solid var(--filete);
}
.papel .dial__rotulo {
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--tenue);
}
.papel .dial__fila {
  display: flex;
  align-items: center;
  gap: clamp(0.75rem, 2vw, 1.25rem);
}

.papel .dial__deslizador {
  flex: 1 1 auto;
  min-width: 0;
  max-width: 26rem;
  appearance: none;
  background: transparent;
  height: 44px;              /* el objetivo táctil, no el grosor de la pista */
  margin: 0;
  cursor: pointer;
}
.papel .dial__deslizador::-webkit-slider-runnable-track {
  height: 2px;
  border-radius: 99px;
  background: var(--borde);
}
.papel .dial__deslizador::-moz-range-track {
  height: 2px;
  border-radius: 99px;
  background: var(--borde);
}
.papel .dial__deslizador::-webkit-slider-thumb {
  appearance: none;
  width: 20px; height: 20px;
  margin-top: -9px;          /* (2 − 20) ÷ 2, para centrarlo en la pista */
  border-radius: 99px;
  background: var(--acento);
  border: 2px solid var(--superficie);
  /* La sombra única del ADN, y acá sí gana su lugar: el tirador es lo único
     de la página que el dedo levanta de la hoja. */
  box-shadow: var(--sombra);
  transition: transform 140ms var(--curva);
}
.papel .dial__deslizador::-moz-range-thumb {
  width: 20px; height: 20px;
  border: 2px solid var(--superficie);
  border-radius: 99px;
  background: var(--acento);
  box-shadow: var(--sombra);
  transition: transform 140ms var(--curva);
}
/* Que se sienta que el control escuchó. 140 ms: por debajo de los 160 que
   pide una pulsación, porque un deslizador se toca muchas veces seguidas. */
.papel .dial__deslizador:active::-webkit-slider-thumb { transform: scale(1.15); }
.papel .dial__deslizador:active::-moz-range-thumb     { transform: scale(1.15); }
.papel .dial__deslizador:focus-visible {
  outline: 2px solid var(--acento);
  outline-offset: 4px;
  border-radius: 4px;
}

/* El día elegido, en grande y tabular: es la respuesta al control, y una
   cifra que cambia de ancho al deslizar se lee como un error. */
.papel .dial__dia {
  font-size: 1.5rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--tinta);
  min-width: 2.25ch;
  text-align: right;
}

.papel .propio__pie {
  margin: 0;
  padding-top: clamp(0.75rem, 2vh, 1.25rem);
  border-top: 1px solid var(--filete);
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--tenue);
  max-width: 60ch;
}

/* ==========================================================================
   ACTO · EL PULSO — una sola cifra, del tamaño que le toca

   Es la regla 2 del mundo llevada al extremo: en un sitio de finanzas la
   ilustración ES el número. Acá no hay dibujo que la acompañe porque no hace
   falta ninguno.
   ========================================================================== */

.papel .acto-pulso {
  width: var(--hoja);
  margin-inline: auto;
  display: grid;
  gap: clamp(2.5rem, 6vh, 4.5rem);
}

.papel .mayor { display: grid; gap: 0.75rem; justify-items: start; }

/* La cifra. Tabular y con el signo de moneda en menor, como en un impreso
   financiero: la L acompaña, no compite. */
.papel .mayor__valor {
  margin: 0;
  font-size: clamp(3.5rem, 2rem + 8vw, 8rem);
  font-weight: 400;
  line-height: 0.9;
  letter-spacing: -0.05em;
  font-variant-numeric: tabular-nums;
  color: var(--tinta);
}
/* La L acompaña, no compite: más chica y en tinta tenue. Pero al ras de la
   línea de base, no flotando — con `vertical-align: 0.5em` quedaba a la
   altura del ápice y se leía como un exponente, no como una moneda. */
.papel .mayor__valor i {
  font-style: normal;
  font-size: 0.34em;
  font-weight: 500;
  letter-spacing: 0;
  color: var(--tenue);
  vertical-align: baseline;
  margin-right: 0.18em;
}

/* El rótulo va DEBAJO de la cifra, nunca encima: encima de un número o de un
   titular está prohibido en este proyecto, y al pie de un instrumento es
   donde trabaja. */
.papel .mayor__rotulo {
  margin: 0;
  max-width: 34ch;
  font-size: clamp(1rem, 0.95rem + 0.35vw, 1.1875rem);
  line-height: 1.45;
  color: var(--tinta);
}
.papel .mayor__pie {
  margin: 0;
  max-width: 52ch;
  font-size: 0.875rem;
  line-height: 1.6;
  color: var(--tenue);
}

/* ---------- el contraste ----------
   La MISMA cifra dos veces con veredicto opuesto. Todo el argumento del acto
   sin una línea de explicación previa — y por eso las dos caras tienen que
   verse una al lado de la otra, no una debajo de la otra: la comparación se
   hace con el ojo, no con la memoria. */
.papel .contraste {
  display: grid;
  grid-template-columns: 1fr 1fr;
  border-top: 1px solid var(--filete);
  border-bottom: 1px solid var(--filete);
}
.papel .contraste__cara {
  display: grid;
  gap: 0.5rem;
  justify-items: start;
  padding: clamp(1.5rem, 4vh, 2.5rem) clamp(1rem, 3vw, 2.5rem);
}
/* Los bordes de afuera van sin sangría, o el 26% no alinea con la cifra
   mayor de arriba y la sección pierde su margen izquierdo. Un impreso alinea
   la primera columna al margen; solo lo de adentro lleva aire. */
.papel .contraste__cara:first-child { padding-left: 0; }
.papel .contraste__cara:last-child  { padding-right: 0; }
/* El filete entre las dos caras es lo que las vuelve una comparación. */
.papel .contraste__cara + .contraste__cara {
  border-left: 1px solid var(--filete);
}

.papel .contraste__pct {
  font-size: clamp(2rem, 1.4rem + 2.6vw, 3.25rem);
  font-weight: 400;
  line-height: 1;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--tinta);
}
.papel .contraste__dia {
  font-size: 0.9375rem;
  line-height: 1.45;
  color: var(--tenue);
  max-width: 22ch;
}

/* El veredicto en píldora. Es el único lugar de la página donde el color
   dice algo por sí solo, y por eso lleva también la palabra: nadie tiene que
   saber que verde es bueno. */
.papel .contraste__juicio {
  margin-top: 0.25rem;
  padding: 0.3rem 0.75rem;
  border-radius: 99px;
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.papel .contraste__juicio--bien {
  background: var(--suave);
  color: var(--acento);
}
.papel .contraste__juicio--mal {
  background: color-mix(in srgb, var(--alerta) 10%, transparent);
  color: var(--alerta);
}

.papel .contraste__pie {
  margin: 0;
  max-width: 60ch;
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--tenue);
}

@media (max-width: 34rem) {
  /* A 390 dos columnas dejan cada cifra en 140 px y el rótulo en cuatro
     renglones. Se apilan, y el filete pasa de vertical a horizontal para que
     sigan leyéndose como una comparación y no como dos bloques sueltos. */
  .papel .contraste { grid-template-columns: 1fr; }
  .papel .contraste__cara + .contraste__cara {
    border-left: 0;
    border-top: 1px solid var(--filete);
  }
}

/* ==========================================================================
   ACTO · LO QUE CAMBIA — las cuatro cartas
   ========================================================================== */

.papel .acto-rejilla,
.papel .acto-hechos { width: var(--hoja); margin-inline: auto; }

/* ==========================================================================
   ACTO · LO QUE YA ESTÁ RESUELTO — hechos, no cartas

   Un hecho no necesita caja. Filetes y aire: la misma decisión que toma un
   estado de cuenta impreso cuando lista movimientos.
   ========================================================================== */

.papel .hechos__intro { margin-bottom: clamp(2rem, 5vh, 3rem); }
.papel .hechos__intro .titular { margin-bottom: 1rem; }
.papel .hechos__intro .bajada { max-width: 58ch; }

.papel .hechos { margin: 0; padding: 0; list-style: none; }

.papel .hecho {
  display: grid;
  grid-template-columns: minmax(11rem, 15rem) 1fr;
  gap: 0.25rem clamp(1.25rem, 3vw, 2.5rem);
  padding-block: clamp(1.125rem, 2.5vh, 1.75rem);
  border-top: 1px solid var(--filete);
}
.papel .hecho:last-child { border-bottom: 1px solid var(--filete); }

.papel .hecho b {
  font-size: 1.0625rem;
  font-weight: 500;
  letter-spacing: -0.01em;
  color: var(--tinta);
}
.papel .hecho span {
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--tenue);
  max-width: 56ch;
}

@media (max-width: 44rem) {
  .papel .hecho { grid-template-columns: 1fr; }
}

/* ==========================================================================
   ACTO · LA RESOLUCIÓN — los dos carriles vuelven, y esta vez coinciden

   Es el remate: la tesis de la portada resuelta en imagen antes de pedir el
   correo. Y no es un efecto — el producto deja elegir qué día arranca tu mes,
   que es exactamente hacer coincidir el mes con el ciclo.
   ========================================================================== */

.papel .resolucion { padding-block: clamp(4rem, 12vh, 8rem); }

.papel .resolucion__marco {
  width: var(--hoja);
  margin-inline: auto;
  display: grid;
  justify-items: center;
  gap: clamp(2rem, 5vh, 3.25rem);
}

/* Los dos carriles, ALINEADOS. Es la única diferencia con el instrumento de
   la portada, donde no calzan — y esa diferencia es todo el argumento. */
.papel .carriles {
  position: relative;
  width: min(100%, 34rem);
  height: 44px;
}
.papel .carriles__riel {
  position: absolute;
  left: 0; right: 0;
  height: 6px;
  border-radius: 99px;
}
.papel .carriles__riel--mes   { top: 10px; background: var(--borde-fuerte); }
.papel .carriles__riel--ciclo { top: 28px; background: var(--acento); }

/* La costura pierde el rojo y se vuelve tinta: ya no marca un desfase,
   marca que los dos empiezan en el mismo punto. */
.papel .carriles__costura {
  position: absolute;
  top: 4px; bottom: 4px;
  left: 0;
  width: 1.5px;
  background: var(--tinta);
}

.papel .resolucion .bajada--centro { max-width: 52ch; }

/* ==========================================================================
   EL MOVIMIENTO DE LA MITAD DE ABAJO

   CADA ANIMACIÓN DE ACÁ CONTESTA «¿POR QUÉ SE MUEVE?», y las que no
   contestaban no se escribieron. Es una página de venta que se recorre una
   vez: el movimiento explica: no adorna ni celebra.

   Todo va con `animation-timeline: view()`, o sea atado al scroll y FUERA
   del hilo principal. Un revelado hecho con un `scroll` que escribe
   `transform` en cada cuadro es la forma más común de que una página larga
   se sienta pesada.

   Solo `opacity` y `transform`. Ninguna otra propiedad se anima: las demás
   rehacen composición o pintura en cada cuadro.

   LA CURVA ES `--curva`, cubic-bezier(0.16, 1, 0.3, 1) — un ease-out fuerte,
   que es lo correcto para algo que ENTRA. Nunca ease-in: empieza lento justo
   en el instante en que el ojo está mirando, y hace que todo se sienta
   pesado aunque dure lo mismo.
   ========================================================================== */

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {

    /* ---------- la vía de medida SE LLENA ----------
       La animación que más trabaja de la página, y la única que es un dato y
       no una entrada: la carga corre y el abono la persigue sin alcanzarla.
       Ver el tramo rojo quedarse afuera explica el doble conteo mejor que el
       párrafo que va abajo.

       `transform: scaleX` y no `width`: escalar no rehace composición. El
       origen a la izquierda porque el tiempo corre hacia allá. */
    .papel .medida__abono,
    .papel .medida__falta {
      transform-origin: left center;
      animation: llenarse-via linear both;
      animation-timeline: view();
      animation-range: entry 20% cover 45%;
    }
    .papel .medida__falta { transform-origin: right center; }
    @keyframes llenarse-via {
      from { transform: scaleX(0.001); }
      to   { transform: scaleX(1); }
    }

    /* La costura llega DESPUÉS de que la vía terminó de llenarse. Es el
       remate: acá se acabó el ingreso. Antes no significaría nada. */
    .papel .medida__costura {
      animation: aparecer-costura linear both;
      animation-timeline: view();
      animation-range: entry 42% cover 55%;
    }
    @keyframes aparecer-costura {
      from { opacity: 0; transform: scaleY(0.4); }
      to   { opacity: 1; transform: scaleY(1); }
    }

    /* ---------- las tres cifras, escalonadas ----------
       Para eso existen `renglon--1/2/3` en el marcado, que no tenían regla
       ninguna. 60 ms entre una y otra: lo bastante para que se lea como
       cascada y no tanto como para que se sienta lenta. */
    .papel .renglon {
      animation: trazar linear both;
      animation-timeline: view();
    }
    .papel .renglon--1 { animation-range: entry 30% cover 42%; }
    .papel .renglon--2 { animation-range: entry 36% cover 48%; }
    .papel .renglon--3 { animation-range: entry 42% cover 54%; }

    /* 2.5rem sería un salto; 0.75rem es un corrimiento. La regla 3 de este
       mundo: el movimiento se mide en milímetros. Y nunca desde `scale(0)` ni
       desde `opacity` con desplazamiento grande — nada en el mundo real
       aparece de la nada. */
    @keyframes trazar {
      from { opacity: 0; transform: translateY(0.75rem); }
      to   { opacity: 1; transform: none; }
    }

    /* ---------- DÓNDE SE TRAZÓ LA LÍNEA ENTRE LOS DOS SISTEMAS ----------

       Acá vivían también `.hito`, `.hecho`, `.contraste__cara` y
       `.mayor__valor`. Se fueron a `/revelar.js`, y la línea que decide
       quién se queda es esta:

         LO QUE SE REVELA se unificó en un solo sistema. Son piezas
         intercambiables —un hito, un hecho, una carta— que entran igual
         porque son la misma clase de cosa. Ahí lo que importa es que las
         doce se lean como una misma mano, y que funcionen en todos lados:
         `animation-timeline` todavía no está en Firefox estable, así que
         una parte de las visitas no veía ninguna de estas entradas.

         LO QUE ES INSTRUMENTO se queda acá, atado al scroll a propósito.
         La vía que se llena, la costura que remata, los carriles que se
         alinean: en esos el scroll ES la aguja del instrumento. Su avance
         tiene que corresponder al del lector cuadro por cuadro, y una
         transición disparada por umbral rompería justamente eso.

       Dicho corto: si el scroll es solo el disparador, va en JavaScript;
       si el scroll es el dato, se queda en la hoja.

       Y había un defecto medido detrás de esto: diez piezas llevaban las
       DOS animaciones a la vez —`trazar` desde acá y el revelado desde el
       atributo—, cada una peleando por la misma `opacity`. */

    /* ---------- la resolución: los carriles se ALINEAN ----------
       El remate de la película, y la única animación de la página que dura
       más de 300 ms a propósito: no es interfaz, es la tesis resolviéndose.
       El carril del ciclo llega corrido y se acomoda; la costura lo sigue.

       Que termine exactamente alineado es el argumento entero. */
    .papel .carriles__riel--ciclo {
      animation: alinearse linear both;
      animation-timeline: view();
      animation-range: entry 15% cover 50%;
    }
    @keyframes alinearse {
      from { transform: translateX(22%); opacity: 0.45; }
      to   { transform: none; opacity: 1; }
    }
    .papel .carriles__costura {
      animation: asentarse linear both;
      animation-timeline: view();
      animation-range: entry 25% cover 55%;
    }
    @keyframes asentarse {
      from { transform: translateX(22%); background: var(--alerta); }
      to   { transform: none; background: var(--tinta); }
    }
  }
}

/* Sin `view()` —o con movimiento reducido, que ya lo apaga todo más
   arriba— nada de esto existe y la sección se ve completa y quieta. Ninguna
   de estas reglas es la que hace visible a un elemento: todas parten de un
   estado que ya es el final. */

/* ==========================================================================
   ENTRAR Y CREAR CUENTA — las dos pantallas de sesión

   Son las primeras del sitio que NO son un argumento de venta: acá el
   visitante viene a hacer una cosa concreta. Así que mandan la claridad y la
   costumbre, no la expresión — y la identidad vive en el detalle preciso,
   no en la composición.

   Qué cambia respecto de la base de `sitio.css`, y por qué cada cosa:

   1. LA VOZ DEL TITULAR. Salía en 24 px y peso de cuerpo, o sea igual que
      cualquier encabezado. Acá hereda el trato de la portada —tamaño para
      el énfasis, peso 400, interletrado cerrado— en una escala que no grita
      arriba de un formulario de cuatro campos.

   2. LOS RÓTULOS EN VOZ TÉCNICA. Eran negrita 600, que en este mundo es
      gritar. Pasan a chicos, espaciados y en versalita, como el rótulo de
      una cota en los instrumentos del resto del sitio. Es el detalle donde
      vive la marca en una pantalla que no puede decorarse.

   3. EL OBJETIVO TÁCTIL. 44 px medidos, que es del ADN y acá importa más que
      en ningún lado: se escribe una contraseña con el pulgar.
   ========================================================================== */

.papel .acceso {
  min-height: 78svh;
  align-content: center;
  padding-block: clamp(3rem, 10vh, 6rem);
}

/* Una hoja sobre el papel. Filete y radio, sin sombra: en este mundo la
   jerarquía la hacen las líneas, y una carta flotando diría «esto está
   encima» cuando lo que hay que decir es «esto es otra cosa». */
.papel .acceso__caja {
  background: var(--superficie);
  border: 1px solid var(--filete);
  border-radius: 12px;
  padding: clamp(1.75rem, 5vw, 2.75rem);
  box-shadow: none;
}

.papel .acceso h1 {
  margin: 0 0 0.5rem;
  font-size: clamp(1.75rem, 1.5rem + 1vw, 2.25rem);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.03em;
  color: var(--tinta);
}

.papel .acceso__intro {
  margin: 0 0 clamp(1.5rem, 4vh, 2.25rem);
  padding-bottom: clamp(1.25rem, 3vh, 1.75rem);
  border-bottom: 1px solid var(--filete);
  font-size: 0.9375rem;
  line-height: 1.55;
  color: var(--tenue);
}

/* ---------- los campos ---------- */

.papel .acceso .campo { margin-bottom: 1.125rem; }

.papel .acceso .campo span {
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--tenue);
  margin-bottom: 0.5rem;
}

/* EL CAMPO SÍ SE QUEDA EN 8px, y está escrito en `IDENTIDAD.md`: un campo
   es una caja donde se escribe, no una acción que se toca, y en píldora el
   texto arranca demasiado adentro del borde. */
.papel .acceso .campo input {
  min-height: 44px;              /* el objetivo táctil del ADN, medido */
  padding: 0.75rem 0.875rem;
  font-size: 1rem;               /* 16 px: por debajo, iOS hace zoom al enfocar */
  color: var(--tinta);
  background: var(--fondo);
  border: 1px solid var(--borde);
  border-radius: 8px;            /* el radio de controles, no el de superficies */
  transition: border-color 160ms var(--curva), background-color 160ms var(--curva);
}
.papel .acceso .campo input::placeholder { color: var(--borde-fuerte); }

/* El foco se ve, y se ve en verde. Un campo enfocado que no se distingue es
   un problema de accesibilidad antes que de estética. */
.papel .acceso .campo input:focus {
  outline: none;
  border-color: var(--acento);
  background: var(--superficie);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--acento) 14%, transparent);
}
.papel .acceso .campo input:focus-visible { outline: none; }

/* Un campo con ayuda necesita más aire abajo que uno sin ella, o el texto
   de ayuda queda más cerca del rótulo siguiente que del campo que explica —
   y se lee como si perteneciera al de abajo. */
.papel .acceso .campo__ayuda {
  margin-top: 0.4rem;
  font-size: 0.75rem;
  line-height: 1.45;
  color: var(--tenue);
}
.papel .acceso .campo:has(.campo__ayuda) { margin-bottom: 1.5rem; }

/* ---------- el botón ---------- */

/* El botón hereda del token, no fija su radio. Lo fijaba en 8px y le ganaba
   por especificidad, así que quedó cuadrado cuando todo lo demás pasó a
   píldora — un botón distinto en la única pantalla donde la gente entrega
   su contraseña. */
.papel .acceso .boton {
  margin-top: 0.5rem;
}

/* ---------- los pies ----------
   Separados del formulario por un filete: dejan de ser parte de la tarea y
   pasan a ser salidas. Alineados a la izquierda como todo lo demás — el
   centrado que traía la base los dejaba flotando sin relación con nada. */
.papel .acceso__pie {
  margin: 0;
  font-size: 0.875rem;
  color: var(--tenue);
  text-align: left;
}
/* EL FILETE VA POR HERMANO ADYACENTE, Y ESTO ERA UN DEFECTO.
   Antes decía `.acceso__pie:first-of-type`, y `:first-of-type` mira el TIPO
   de elemento, no la clase: el primer <p> del formulario es
   `.acceso__intro`, así que ningún `.acceso__pie` calificaba nunca y el
   filete no se dibujaba. No dio error — simplemente no estaba.

   `.boton + .acceso__pie` dice lo que de verdad se quiere: el pie que sigue
   al botón, o sea donde termina la tarea y empiezan las salidas. */
.papel .acceso .boton + .acceso__pie {
  margin-top: clamp(1.25rem, 3vh, 1.75rem);
  padding-top: clamp(1rem, 2.5vh, 1.5rem);
  border-top: 1px solid var(--filete);
}
.papel .acceso__pie + .acceso__pie { margin-top: 0.5rem; }

.papel .acceso__pie a {
  color: var(--acento);
  text-decoration: underline;
  text-underline-offset: 0.2em;
  text-decoration-thickness: 1px;
}

/* El aviso de error. Rojo del ADN, sin fondo saturado: en una hoja, un
   bloque de color se lee como alarma de sistema y no como corrección. */
.papel .acceso .aviso--error {
  background: color-mix(in srgb, var(--alerta) 7%, transparent);
  border: 1px solid color-mix(in srgb, var(--alerta) 30%, transparent);
  border-radius: 8px;
  padding: 0.75rem 0.875rem;
  margin-bottom: 1.25rem;
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--alerta);
}

/* ==========================================================================
   LAS PÁGINAS INTERIORES — Precios, Preguntas, Contacto, Términos,
   Privacidad y el 404

   Ninguna estaba rota: sus 22, 17, 17, 13, 13 y 15 clases tienen todas regla
   en `sitio.css`. Lo que les faltaba era el ESCUDO y la VOZ.

   El escudo: sin `class="papel"` heredaban el vuelco de `marca.css` bajo
   `prefers-color-scheme: dark`, así que en una máquina con el sistema en
   oscuro salían negras mientras la portada seguía siendo papel. El sitio
   partido en dos a mitad de visita.

   La voz: sus titulares salían en 56 px con el peso del mundo base, o sea
   sin relación con los 103 px en peso 400 de la portada.

   Y UNA TRAMPA QUE SE MIDIÓ AL PONER EL ESCUDO. `.portada` significa dos
   cosas distintas en este sitio: en la home es el ACTO de apertura —una
   ventana entera, con el instrumento del desfase abajo— y en las interiores
   es un simple encabezado de página. Al enlazar la hoja, las seis heredaron
   `min-height: 100svh` y su encabezado pasó a medir 900 px: media pantalla
   vacía antes de cualquier contenido.
   ========================================================================== */

/* La cura, sin tocar el marcado de nadie: el tratamiento alto se acota a la
   portada que TIENE el bloque del héroe. `.portada__dicho` solo existe en la
   home, así que la condición es un hecho estructural y no una convención que
   alguien pueda romper sin enterarse. */
.papel .portada:not(:has(.portada__dicho)) {
  min-height: 0;
  display: block;
  padding-block: clamp(4.5rem, 14vh, 9rem) clamp(2rem, 6vh, 4rem);
}

/* ---------- el encabezado de una página interior ---------- */

.papel .portada:not(:has(.portada__dicho)) h1 {
  margin: 0;
  font-size: clamp(2.25rem, 1.6rem + 2.6vw, 3.75rem);
  font-weight: 400;
  line-height: 1.02;
  letter-spacing: -0.04em;
  text-wrap: balance;
  color: var(--tinta);
}

.papel .portada:not(:has(.portada__dicho)) .entrada {
  margin-top: clamp(1.25rem, 3vh, 1.75rem);
  max-width: 54ch;
}

/* La franja de superficie era un fondo de color alternado. En papel eso no
   existe: lo que separa un acto de otro es un filete, no un cambio de tono.
   El tono se conserva apenas —el papel elevado— para que se lea como una
   hoja distinta y no como una sección pintada. */
.papel .franja--superficie {
  background: var(--superficie);
  border-block: 1px solid var(--filete);
}

/* ---------- las listas ----------
   Sin viñeta redonda: una raya corta, como la marca de un impreso. */
.papel .lista {
  margin: clamp(1.25rem, 3vh, 1.75rem) 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 0.75rem;
}
.papel .lista li {
  position: relative;
  padding-left: 1.5rem;
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--tenue);
}
.papel .lista li::before {
  content: "";
  position: absolute;
  left: 0; top: 0.7em;
  width: 0.75rem; height: 1px;
  background: var(--borde-fuerte);
}
.papel .lista strong { color: var(--tinta); font-weight: 500; }

/* ==========================================================================
   PRECIOS — dos planes, y el precio es la imagen
   ========================================================================== */

.papel .planes {
  width: var(--hoja);
  margin-inline: auto;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
  gap: clamp(1.25rem, 3vw, 2rem);
}

.papel .plan {
  background: var(--fondo);
  border: 1px solid var(--filete);
  border-radius: 12px;
  padding: clamp(1.5rem, 4vw, 2.25rem);
  display: grid;
  align-content: start;
}
/* El plan vigente se marca con el filete, no con un fondo ni una sombra: en
   un impreso, lo que está en vigor se recuadra. */
.papel .plan--destacado { border-color: var(--acento); }

.papel .plan h2 {
  margin: 0.25rem 0 0;
  font-size: 1.375rem;
  font-weight: 500;
  letter-spacing: -0.02em;
  color: var(--tinta);
}

/* La cifra es la imagen, también acá — aunque hoy diga «Sin costo». */
.papel .plan__precio {
  margin: clamp(0.75rem, 2vh, 1.25rem) 0 0;
  font-size: clamp(1.875rem, 1.4rem + 1.8vw, 2.75rem);
  font-weight: 400;
  line-height: 1;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--tinta);
}
.papel .plan--destacado .plan__precio { color: var(--acento); }

.papel .plan__nota {
  margin: 0.5rem 0 0;
  padding-bottom: clamp(1rem, 2.5vh, 1.5rem);
  border-bottom: 1px solid var(--filete);
  font-size: 0.875rem;
  color: var(--tenue);
}

.papel .plan .acciones { margin-top: clamp(1.5rem, 4vh, 2.25rem); }

/* ==========================================================================
   PREGUNTAS — un pliego que se abre

   Van con `<details>`, así que abren y cierran sin una línea de JavaScript.
   El triángulo del navegador se quita: en su lugar, un signo que gira.
   ========================================================================== */

.papel .pregunta {
  border-bottom: 1px solid var(--filete);
}
.papel .pregunta:first-of-type { border-top: 1px solid var(--filete); }

.papel .pregunta summary {
  display: flex;
  align-items: baseline;
  gap: 1rem;
  padding-block: clamp(1rem, 2.5vh, 1.5rem);
  min-height: 44px;                 /* objetivo táctil */
  cursor: pointer;
  list-style: none;
  font-size: clamp(1rem, 0.95rem + 0.3vw, 1.125rem);
  font-weight: 500;
  letter-spacing: -0.01em;
  color: var(--tinta);
  transition: color 160ms var(--curva);
}
.papel .pregunta summary::-webkit-details-marker { display: none; }
.papel .pregunta summary:hover { color: var(--acento); }
.papel .pregunta summary:focus-visible {
  outline: 2px solid var(--acento);
  outline-offset: 2px;
  border-radius: 4px;
}

/* El signo. Gira 45° al abrir: una cruz se vuelve una equis, que es el mismo
   gesto de cerrar. 200 ms, dentro del presupuesto de un control. */
.papel .pregunta summary::after {
  content: "";
  flex: none;
  margin-left: auto;
  align-self: center;
  width: 12px; height: 12px;
  background:
    linear-gradient(var(--borde-fuerte) 0 0) center / 100% 1px no-repeat,
    linear-gradient(var(--borde-fuerte) 0 0) center / 1px 100% no-repeat;
  transition: rotate 200ms var(--curva);
}
.papel .pregunta[open] summary::after { rotate: 45deg; }

.papel .pregunta p {
  margin: 0 0 clamp(1rem, 2.5vh, 1.5rem);
  max-width: 62ch;
  font-size: 0.9375rem;
  line-height: 1.65;
  color: var(--tenue);
}

/* ==========================================================================
   TÉRMINOS Y PRIVACIDAD — documentos largos, y se leen como tales

   Acá manda la comprensión: medida de lectura acotada, jerarquía por
   tamaño y filete, y aire entre apartados. Nada más.
   ========================================================================== */

.papel .legal { padding-block: clamp(4.5rem, 12vh, 8rem); }

.papel .legal .lectura { max-width: 68ch; }

.papel .legal h1 {
  margin: 0;
  font-size: clamp(2rem, 1.5rem + 2vw, 3rem);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.035em;
  color: var(--tinta);
}

.papel .fecha {
  margin: 1rem 0 clamp(2.5rem, 6vh, 4rem);
  padding-bottom: clamp(1.25rem, 3vh, 2rem);
  border-bottom: 1px solid var(--filete);
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--tenue);
}

.papel .legal h2 {
  margin: clamp(2.5rem, 6vh, 3.5rem) 0 0.875rem;
  font-size: 1.25rem;
  font-weight: 500;
  letter-spacing: -0.015em;
  color: var(--tinta);
}
.papel .legal h3 {
  margin: clamp(1.75rem, 4vh, 2.25rem) 0 0.625rem;
  font-size: 1.0625rem;
  font-weight: 500;
  color: var(--tinta);
}
.papel .legal p,
.papel .legal li {
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--tenue);
}
.papel .legal a {
  color: var(--acento);
  text-decoration: underline;
  text-underline-offset: 0.2em;
  text-decoration-thickness: 1px;
}

/* Las listas de estos documentos son `<ul>` pelados, sin `class="lista"`, así
   que salían con la viñeta redonda del navegador mientras el resto del sitio
   marca con una raya corta. Dos marcas distintas para la misma cosa en la
   misma visita es de las inconsistencias que nadie nombra y todos sienten. */
.papel .legal ul {
  margin: 1rem 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 0.625rem;
}
.papel .legal ul li {
  position: relative;
  padding-left: 1.5rem;
}
.papel .legal ul li::before {
  content: "";
  position: absolute;
  left: 0; top: 0.75em;
  width: 0.75rem; height: 1px;
  background: var(--borde-fuerte);
}
.papel .legal strong { color: var(--tinta); font-weight: 500; }

/* ==========================================================================
   LA CÁPSULA — la navegación como una píldora flotante

   Pedida con una referencia de otro proyecto: la navegación entera es una
   cápsula y la sección activa es otra píldora rellena adentro.

   DE LA REFERENCIA SE TOMA LA FORMA, NO EL COLOR. Ahí la píldora activa es
   oro sobre un mundo de vidrio oscuro; acá va en `--acento`, el verde hondo
   de esta marca. Es la regla que ya tenía escrita el proyecto, y es lo que
   evita que el sitio termine pareciéndose a otro.

   POR QUÉ FUNCIONA ACÁ Y NO EN LA APP. Una cápsula se lee como control
   mientras tenga pocas entradas: el sitio tiene cuatro. La app tiene NUEVE
   destinos, y meterlos en una píldora sería el mismo error que tenía la
   barra del teléfono. Ahí la navegación es el riel.
   ========================================================================== */

@media (min-width: 72.0625rem) {
  /* EL MENÚ NO LLEVA CÁPSULA PROPIA, y esto se corrigió mirándolo. Tenía
     fondo, filete y sombra, igual que la cabecera — o sea una cápsula
     dentro de otra, con dos contornos concéntricos a 5px uno del otro. Se
     lee como un error de render, no como jerarquía.

     La referencia hace lo correcto: los enlaces van sueltos dentro de la
     única cápsula, y lo único que se rellena es la sección donde uno está. */
  .papel .cabecera .menu {
    display: inline-flex;
    align-items: center;
    gap: 2px;
  }

  .papel .cabecera .menu a:not(.boton) {
    padding: 0.55rem 1.15rem;
    border-radius: 999px;
    font-size: 0.9375rem;
    font-weight: 500;
    letter-spacing: -0.01em;
    color: var(--tenue);
    white-space: nowrap;
    /* Propiedades exactas y no `all`: `all` vigila decenas de propiedades
       para animar dos, y arrastra cualquiera que se agregue después. */
    transition: color 160ms var(--curva), background-color 160ms var(--curva);
  }

  /* La sección donde uno está. Es el único relleno de acento de la cabecera,
     así que no compite con «Crear cuenta»: ese es una acción, esto es una
     posición. */
  .papel .cabecera .menu a[aria-current="page"]:not(.boton) {
    background: var(--acento);
    color: var(--acento-ct);
  }
}

@media (hover: hover) and (pointer: fine) and (min-width: 72.0625rem) {
  .papel .cabecera .menu a:not(.boton):hover { color: var(--tinta); }
  .papel .cabecera .menu a[aria-current="page"]:not(.boton):hover { color: var(--acento-ct); }
}

/* ==========================================================================
   UN SOLO CONTROL, UNA SOLA MEDIDA

   Se midió lo que había y era un desorden: entre botones que hacen lo mismo
   había CUATRO alturas (26, 36, 42, 44), TRES radios (0, 8, 999), TRES
   tamaños de letra (12, 15, 16) y CUATRO pesos (400, 500, 550, 600). El
   «Crear cuenta» de la cápsula salía en 12px y el de la portada en 15, con
   8px de diferencia de alto. Nadie lo nombra y todos lo sienten.

   Ahora hay tres propiedades y todo cuelga de ellas. Si mañana el control
   tiene que crecer, se cambia acá y crecen todos juntos — que es lo que
   evita que vuelvan a separarse.

   EL RADIO SE QUEDA EN 8px, NO PASA A PÍLDORA. El ADN dice «12px
   superficies, 8px controles, píldora en chips», y una acción no es un
   chip. La píldora se reserva para lo que INDICA ESTADO —la cápsula misma y
   la sección donde uno está—, que es una distinción que se lee sin
   explicarla: lo redondo del todo dice dónde estás, lo cuadrado dice qué
   podés hacer.
   ========================================================================== */

/* EL RADIO PASA A PÍLDORA, Y ES UN CAMBIO DEL ADN, NO UN AJUSTE.

   `IDENTIDAD.md` decía «12px superficies, 8px controles, píldora en chips».
   Yo defendí los 8px con ese argumento y el dueño pidió píldora dos veces,
   señalando la referencia: en agroporthonduras.com el botón de sesión es
   una cápsula blanca dentro de la cápsula del header, y esa es la forma que
   busca.

   Tiene sentido propio, además de ser lo pedido: desde que la cabecera ES
   una cápsula, un botón de esquinas rectas adentro se lee como una pieza de
   otro juego. La forma del contenedor manda sobre la del contenido.

   Y se aplica a TODOS los controles, no solo a los de la cabecera — que era
   justamente el pedido anterior: que fueran uniformes. Dos radios distintos
   para el mismo botón según dónde esté es el desorden que se acaba de
   arreglar. */
.papel {
  --control-alto:  2.375rem;    /* 38px — la cápsula se aprieta un poco más */
  --control-radio: 999px;
  --control-letra: 0.875rem;    /* 14px */
  --control-peso:  550;
  --control-aire:  1.25rem;
}

/* En pantalla táctil sube a los 44px del ADN. No es un ajuste estético: es
   lo que separa tocar de errar con el pulgar. */
@media (pointer: coarse) {
  .papel { --control-alto: 2.75rem; }
}

.papel .boton,
.papel .pulsar {
  min-height: var(--control-alto);
  padding-block: 0;
  padding-inline: var(--control-aire);
  border-radius: var(--control-radio);
  font-size: var(--control-letra);
  font-weight: var(--control-peso);
  letter-spacing: -0.005em;
}

/* El «Crear cuenta» de la cápsula era el más chico de todos —12px de letra,
   600 de peso— porque heredaba una regla pensada para una cabecera que ya
   no existe. Ahora es el mismo botón que el de la portada. */
.papel .cabecera .sesion .boton {
  min-height: var(--control-alto);
  padding-inline: var(--control-aire);
  font-size: var(--control-letra);
  font-weight: var(--control-peso);
}

/* «Entrar» es un enlace, no un botón, y por eso no lleva caja. Pero sí
   comparte la altura, o queda flotando a distinta línea que su vecino. */
.papel .cabecera .sesion a:not(.boton) {
  display: inline-flex;
  align-items: center;
  min-height: var(--control-alto);
  font-size: var(--control-letra);
  font-weight: var(--control-peso);
}

/* ---------- la cápsula se aprieta ----------
   Con los controles en 40px, el relleno de 5px daba 54 de alto. Cuatro
   bastan, y la cápsula baja a 48 sin que nada quede apretado contra el
   filete. */
@media (min-width: 72.0625rem) {
  .papel .cabecera { padding: 4px 4px 4px clamp(0.85rem, 1.8vw, 1.2rem); }

  /* La píldora de la sección activa acompaña la altura del resto. Sigue
     siendo píldora: indica dónde estás, no es una acción. */
  .papel .cabecera .menu a:not(.boton) {
    min-height: var(--control-alto);
    display: inline-flex;
    align-items: center;
    padding-block: 0;
    padding-inline: 0.95rem;
    font-size: var(--control-letra);
    font-weight: var(--control-peso);
  }
}

/* ==========================================================================
   EN UN TELÉFONO EL LÍMITE ES EL BORDE, NO UN PORCENTAJE

   Recogida, la cápsula lleva logo, «Entrar», «Crear cuenta» y el botón:
   367 px de contenido, medidos. Con la cápsula al 60%, esa medida se alcanza
   recién a los ~640 px de ventana — a 600 faltaban 26 px y a 560 faltaban 50,
   y aunque nada se cortaba, las piezas quedaban pegadas.

   Por debajo de 40rem, entonces, toma lo que hay menos el canal. El corte
   subió de 34 a 40rem cuando la cápsula bajó de 70% a 60%: cada vez que la
   cápsula se angosta, el ancho donde deja de alcanzar sube con ella.

   VA AL FINAL DE LA HOJA A PROPÓSITO. Con la misma especificidad manda el
   ORDEN: un `@media` acota cuándo aplica una regla, no le sube la prioridad.
   Y hay otro `@media (max-width: 34rem)` más arriba, el del contraste del
   pulso, que no tiene nada que ver — dos bloques con la misma condición y
   distinto propósito conviven sin problema, pero el de la cápsula tiene que
   ir después de donde se declara su ancho.
   ========================================================================== */

@media (max-width: 40rem) {
  .papel .cabecera { width: calc(100% - clamp(1rem, 5vw, 2rem)); }
}

/* ---------- el nombre se queda, y la regla que lo escondía se va ----------

   Hubo un `@media (max-width: 26rem)` que ocultaba «Controle Wallet» y
   dejaba solo el trazo. Tenía sentido cuando lo escribí: la cápsula todavía
   llevaba «Entrar» y «Crear cuenta» en teléfono y faltaban 69 px a 320.

   Desde que el teléfono muestra únicamente logo y botón, el cálculo cambió:
   el nombre pide 197 px y a 320 sobran 88. La regla quedó resolviendo un
   problema que ya no existe, y de paso se llevaba lo único que identifica el
   sitio en la pantalla más chica. Se borra.

   Es la clase de resto que sobrevive callado a un rediseño: no da error, no
   rompe nada, y sigue escondiendo algo que ya cabía. */

/* ==========================================================================
   LA CÁPSULA EN TRES ESTADOS

   Pedido con la referencia de agroporthonduras.com, mirando cómo se comporta
   al angostar:

     ESCRITORIO (≥64rem)  logo · enlaces · filete · Entrar · Crear cuenta
     TABLETA (34–64rem)   logo · tirador · Entrar · Crear cuenta
                          — los enlaces bajan al desplegable
     TELÉFONO (≤34rem)    logo · tirador
                          — TODO lo demás baja al desplegable, sesión incluida

   La sesión vive dentro del <nav> justamente por el estado de teléfono: al
   volverse panel, baja con él sin duplicar marcado. Duplicarla sería peor
   que el problema — dos «Crear cuenta» en el documento son dos para un
   lector de pantalla, aunque uno esté escondido.

   Y en tableta se la vuelve a subir a la cápsula. Eso exige sacarla del
   panel, que es `position: absolute`, así que se ancla desde su borde
   superior con la altura de la cápsula. `--capsula-h` existe para no
   escribir ese número dos veces.
   ========================================================================== */

.papel .cabecera { --capsula-h: 3.5rem; }

/* ---------- tableta: la sesión se queda en la cápsula ----------
   No hace falta ninguna regla: `menu.js` deja el nodo donde ya estaba. Lo
   único que se ajusta es el orden visual, para que el tirador quede entre el
   logo y las acciones como en la referencia. */
@media (max-width: 72rem) {
  .papel .cabecera--con-tirador { justify-content: flex-start; gap: 0.6rem; }
  .papel .cabecera--con-tirador .marca { margin-right: auto; }
}

/* ---------- teléfono: solo el logotipo y el botón ---------- */
@media (max-width: 40rem) {
  /* La sesión se queda en el panel — no hay regla que la saque, y esa
     ausencia es la que produce el estado pedido. Lo único que hace falta es
     que dentro del panel se lea como las demás entradas. */
  .papel .cabecera--con-tirador .menu .sesion {
    display: grid;
    /* A lo ancho de la columna. Sin esto se dimensiona a su contenido —127 px
       en una columna de 364— y queda alineada a la derecha, con «Entrar»
       flotando a media hoja mientras los enlaces arrancan del margen. */
    width: 100%;
    justify-self: stretch;
    justify-items: stretch;
    gap: 0;
    padding-top: 0.5rem;
    margin-top: 0.25rem;
    border-top: 1px solid var(--borde);
    border-left: 0;
  }
  /* El vestido de estas dos vive al final de la hoja, donde se decidió que
     fueran píldoras en un renglón. Acá quedaban las reglas del diseño
     anterior —«Entrar» como renglón de lista, «Crear cuenta» a todo el
     ancho— y le ganaban por especificidad a las nuevas: una salía de 55 px
     de alto y la otra de 44, en la misma fila. */
}

/* ==========================================================================
   EL BOTÓN DE MENÚ ES UN CONTROL MÁS

   Tenía forma propia —`--radio-chico`, 44 px de alto, 13 px de letra— y al
   lado de «Entrar» y «Crear cuenta» dentro de la misma cápsula se leía como
   una pieza de otro juego: un cuadrado redondeado entre dos píldoras.

   Ahora cuelga de los mismos tres tokens que el resto. Cuadrado porque solo
   lleva un icono —una píldora vacía se vería como un botón al que le falta
   el texto— pero el radio, el alto y el peso son los del sistema.
   ========================================================================== */

.papel .tirador {
  min-height: var(--control-alto);
  width: var(--control-alto);      /* cuadrado: solo hay un icono adentro */
  padding: 0;
  justify-content: center;
  border-radius: var(--control-radio);
  border-color: var(--filete);
  font-size: var(--control-letra);
  font-weight: var(--control-peso);
}

/* La palabra «Menú» sale del botón: dentro de un cuadrado no cabe, y el
   icono con `aria-label` ya lo nombra para quien no lo ve. */
.papel .tirador .tirador__dicho {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ==========================================================================
   LA CÁPSULA NO SE PARTE, Y NO POR HABER ELEGIDO BIEN EL CORTE

   Se persiguió tres veces: 57 → 64 → 72rem, cada vez midiendo dónde dejaba
   de caber. Y volvió a fallar, porque el corte estaba calibrado en Chromium
   y el dueño usa Safari: WebKit dibuja el MISMO texto unos 50 px más ancho,
   así que entre 1153 y 1250 la cápsula se partía en dos renglones — con
   «Contacto» cayendo solo a una segunda línea.

   Un número calibrado contra un motor no es una medida, es una coincidencia.

   Estas dos reglas lo resuelven sin número:

     `flex-wrap: nowrap` en el MENÚ. El cinturón que ya existía estaba en la
     cabecera, pero quien envolvía era el <nav> de adentro.

     `min-width: fit-content` en la cápsula. Antes que apretar su contenido,
     crece: el 60% deja de ser un ancho fijo y pasa a ser un objetivo que se
     respeta mientras alcance. Se corrige solo en cualquier motor y con
     cualquier tipografía, y si mañana se agrega una entrada al menú, la
     cápsula la absorbe en vez de partirse.

   Va solo de 72rem para arriba: por debajo el menú ya es un panel y la
   cápsula tiene su propia regla de ancho.
   ========================================================================== */

@media (min-width: 72.0625rem) {
  .papel .cabecera { min-width: fit-content; }
  .papel .cabecera .menu { flex-wrap: nowrap; }
}

/* ==========================================================================
   LAS ACCIONES DE LA PORTADA NO SE PEGAN AL INSTRUMENTO

   Medido a 390: los botones terminaban en y=582 y el instrumento del
   desfase arrancaba en y=577. CINCO PÍXELES DE SOLAPE — el filete superior
   del instrumento cruzaba justo por la base de «Crear cuenta».

   La causa es la rejilla de la portada: `grid-template-rows: 1fr auto` con
   el instrumento pegado abajo. En una ventana de teléfono el bloque de
   texto ya no cabe en su fila, se desborda, y lo que sigue no se corre —
   porque `auto` reserva solo lo que el instrumento mide, no lo que el
   vecino invade.

   Se resuelve dándole al bloque de texto un colchón propio abajo, que en la
   ventana alta no se nota y en la corta es lo que evita el choque.
   ========================================================================== */

.papel .portada__dicho { padding-bottom: clamp(1.5rem, 4vh, 2.5rem); }

/* Y el instrumento respira arriba, que además es lo que lo separa como
   pieza distinta y no como continuación de los botones. */
.papel .desfase { margin-top: clamp(1rem, 3vh, 2rem); }

/* ==========================================================================
   EL DESPLEGABLE ES UNA TARJETA, Y LOS DOS ACCESOS VAN EN UN RENGLÓN

   Dos defectos que se veían juntos y tenían causas distintas.

   EL RECUADRO. El panel nació cuando la cabecera era una barra pegada al
   borde: colgaba `inset-inline: 0` con un filete abajo y sin radio, y eso
   estaba bien porque continuaba una barra que también llegaba a los bordes.
   La cabecera es hoy una cápsula flotante, y el panel se quedó con la forma
   de la barra que ya no existe: una franja cuadrada colgando de una píldora.
   Ahora es lo que debe ser — una tarjeta con el mismo radio, el mismo filete
   y la misma sombra que la cápsula, separada por medio espacio para que se
   lean como dos piezas y no como una a la que le falta un pedazo.

   LOS DOS ACCESOS. «Entrar» caía como un renglón más de la lista y «Crear
   cuenta» como un botón a todo el ancho debajo: dos tratamientos distintos
   para dos acciones que son la misma cosa —entrar al servicio— y que en la
   cápsula ya viven una al lado de la otra. Adentro del panel van igual: dos
   píldoras en un renglón, con los mismos tokens de control que el resto.
   La jerarquía la sigue dando el relleno, no el ancho.
   ========================================================================== */

@media (max-width: 72rem) {
  .papel .cabecera--con-tirador .menu {
    margin-top: 0.5rem;
    padding: 0.35rem 0.75rem 0.5rem;
    background: var(--superficie);
    border: 1px solid var(--filete);
    border-radius: var(--radio);
    box-shadow: var(--sombra);
  }

  /* El último separador sobraba: el borde de la tarjeta ya cierra la lista,
     y dos líneas paralelas a 8 px una de otra se leen como un error. */
  .papel .cabecera--con-tirador .menu > a:last-of-type { border-bottom: 0; }
}

@media (max-width: 40rem) {
  .papel .cabecera--con-tirador .menu .sesion {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.5rem;
    padding-top: 0.65rem;
    margin-top: 0.15rem;
    border-top: 1px solid var(--filete);
  }

  /* Los dos, píldoras del sistema. `> a` y no `a` a secas: el selector de
     lista de arriba alcanza a cualquier enlace del panel, incluidos estos,
     y les ponía 44 px de alto y un filete abajo que acá no van. */
  .papel .cabecera--con-tirador .menu .sesion > a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: var(--control-alto);
    padding: 0 var(--control-aire);
    border-radius: var(--control-radio);
    font-size: var(--control-letra);
    font-weight: var(--control-peso);
    letter-spacing: var(--ls-cuerpo);
    white-space: nowrap;
    border-bottom: 0;
    margin: 0;
    width: auto;
  }

  /* «Entrar» es la acción secundaria: el mismo cuerpo, marcado con filete.
     Es la pareja de «Crear cuenta», no un renglón de la lista. */
  .papel .cabecera--con-tirador .menu .sesion > a:not(.boton) {
    border: 1px solid var(--borde-fuerte);
    color: var(--tinta);
  }
}

/* ==========================================================================
   REVELAR — lo que entra cuando el ojo llega

   La contraparte de `/revelar.js`. Todo cuelga de `.revela` en el <html>,
   que pone ese archivo antes de que se pinte el primer cuadro: sin él —sin
   JavaScript, o con el movimiento apagado— ninguna de estas reglas aplica y
   la página se ve completa y quieta. No existe el estado en que algo queda
   invisible esperando un script que no llegó.

   EL MOVIMIENTO SON 12 px Y NO 40. `IDENTIDAD.md` lo dice en una línea —el
   movimiento se mide en milímetros— y son los mismos `0.75rem` con que ya
   entra la portada. Cuarenta píxeles se leen como una diapositiva; doce se
   leen como papel que se asienta.
   ========================================================================== */

@media (prefers-reduced-motion: no-preference) {
  .revela [data-revelar] {
    opacity: 0;
    transform: translateY(0.75rem);
    transition:
      opacity   var(--revelar-dura, 620ms) var(--curva) var(--revelar-espera, 0ms),
      transform var(--revelar-dura, 620ms) var(--curva) var(--revelar-espera, 0ms),
      filter    var(--revelar-dura, 620ms) var(--curva) var(--revelar-espera, 0ms);
    will-change: opacity, transform;
  }

  /* Las variantes. Ninguna pasa de 0.75rem: lo que cambia es la dirección,
     no la distancia. Un solo valor de recorrido en todo el sistema es lo que
     hace que doce piezas distintas se lean como una misma mano. */
  .revela [data-revelar="bajar"]     { transform: translateY(-0.75rem); }
  .revela [data-revelar="izquierda"] { transform: translateX(-0.75rem); }
  .revela [data-revelar="derecha"]   { transform: translateX(0.75rem); }

  /* `escala` arranca en 0.985 y no en 0.9: un objeto que nace del tamaño de
     un punto no se parece a nada del mundo real. Es el mismo 0.985 con que
     `filmar.js` hace entrar las piezas de las películas. */
  .revela [data-revelar="escala"]    { transform: scale(0.985); }

  /* `velo` para lo que tiene que leerse como que se enfoca —una cifra, una
     pantalla—. El desenfoque es caro: se usa en pocas piezas a propósito. */
  .revela [data-revelar="velo"] {
    transform: translateY(0.5rem);
    filter: blur(5px);
  }

  .revela [data-revelar].revelado {
    opacity: 1;
    transform: none;
    filter: none;
  }
}

/* ==========================================================================
   EL ACENTO ESTABA EN 0.9 % CUANDO EL ADN PIDE 10 %

   Se midió con `herramientas/medir-proporcion.js` en las cinco pantallas de
   la portada, a 1440. El resultado, antes de esto:

     portada          96.4 fondo ·  0.0 superficie ·  0.9 acento
     acto del ciclo   35.0       · 61.8            ·  0.6
     la vitrina       86.2       · 10.4            ·  0.8
     el pulso         96.3       ·  0.1            ·  0.9
     la resolución    95.8       ·  0.3            ·  1.3

   El dominante oscila con lo que haya en pantalla —un acto con panel tiene
   superficie, uno de solo texto no— y eso es normal. Lo que NO oscila es el
   acento: se queda en torno al 1 % en las cinco. Diez veces menos de lo que
   pide el ADN, y es la razón por la que la página se siente plana aunque
   cada pieza esté bien resuelta. No le falta textura: le falta color con
   significado.

   NO SE ARREGLA REPARTIENDO VERDE. `--acento` significa una cosa —lo que va
   a favor— y pintarlo donde no significa nada lo gastaría. Se arregla dándole
   un campo al único lugar donde el significado es literal: el acto que pide
   la cuenta.

   Y el campo es `--suave` y no `--acento`. `--suave` está definido en
   `marca.css` como «fondo teñido de acento», que es exactamente este oficio.
   Un cierre en verde profundo a pantalla completa sería otro mundo, no éste:
   el papel es claro, y una página que termina en un rectángulo oscuro se lee
   como que cambió de sitio.
   ========================================================================== */

.papel .resolucion {
  background: var(--suave);
  /* El filete arriba y no una sombra: es el mismo recurso con que este mundo
     separa una superficie de otra en todos lados. */
  border-top: 1px solid var(--filete);
}

/* Acá había un `color-mix` para aclarar el riel del mes sobre el fondo
   teñido, y el propio medidor lo delató: «FUERA-DEL-ADN(166,174,170)». Un
   color que no sale de ningún token no se defiende diciendo que se veía
   bien — la regla del ADN es que un color nuevo se discute y se agrega a
   `marca.css`, no se inventa en la hoja donde uno está trabajando. El riel
   se queda con `--borde-fuerte`, que sobre `--suave` ya contrasta.

   Y la cifra mayor pasa a acento: es lo único de la página que cambia de
   color por esto, y se lo gana. Es «cuánto podés gastar hoy sin romper el
   mes», o sea la definición literal de lo que va a favor. En tinta era un
   número; en acento es un veredicto. */
.papel .mayor__valor { color: var(--acento); }
.papel .mayor__valor i { color: var(--tenue); }

/* ==========================================================================
   LAS CARTAS TAMBIÉN CONTESTAN

   Los botones, los enlaces del menú, los pasos y las preguntas ya tenían
   estado de contacto. Las cartas no: pasabas el puntero por encima de un
   bloque de texto con filete y no ocurría nada, así que no se leía como una
   pieza — se leía como un párrafo con borde.

   Y CONTESTAN CON UN MILÍMETRO. Un píxel de subida y el filete que se
   oscurece. Nada de sombra creciendo, nada de escala: `IDENTIDAD.md` dice
   que el filete es la identidad y que el movimiento se mide en milímetros.
   Una carta que salta tres píxeles y se hincha con una sombra es el lenguaje
   de otro producto.

   Y solo donde hay puntero fino. En una pantalla táctil `:hover` se queda
   PEGADO después de tocar: la carta se levanta y no vuelve a bajar hasta que
   toques otra cosa, que se lee como un defecto y no como una respuesta.
   ========================================================================== */

@media (hover: hover) and (pointer: fine) {
  .papel .tarjeta,
  .papel .plan {
    transition: border-color 200ms var(--curva), translate 200ms var(--curva);
  }
  .papel .tarjeta:hover,
  .papel .plan:hover {
    border-color: var(--borde-fuerte);
    translate: 0 -1px;
  }

  /* Los enlaces del pie se subrayan al pasar. Es el único sitio del documento
     donde un enlace de navegación no vive dentro de un control con forma, y
     sin respuesta parecía texto muerto. */
  .papel .pie nav a { transition: color 160ms var(--curva); }
  .papel .pie nav a:hover { color: var(--tinta); }
}

/* Al soltar, la carta vuelve a su sitio: el `translate` se cancela. Va FUERA
   del bloque de puntero fino porque `:active` sí existe al tocar, y ahí es
   justamente donde más se agradece — es el único acuse de recibo que da una
   pantalla sin puntero. */
.papel .tarjeta:active,
.papel .plan:active { translate: 0 0; }
