/* ==================================================================== fuentes
   Merriweather para los titulos y Plus Jakarta Sans para el texto: las dos de
   Google Fonts, licencia OFL.

   Servidas desde /static y no desde el CDN de Google a proposito. La app promete
   que no sale nada a internet, y un <link> a fonts.gstatic.com lo desmentiria en
   la primera carga; ademas asi la tipografia es la misma con y sin conexion.

   Son las versiones VARIABLES -de ahi los rangos de peso en cada cara- porque aca se
   usan pesos intermedios (450, 480, 550). Con archivos de peso fijo esos valores
   redondearian al mas cercano y se perderia el ajuste fino.

   Ojo con los rangos: no son iguales. Merriweather va de 300 a 900 -y ademas trae
   un eje de ancho, de ahi el font-stretch- y Jakarta de 200 a 800; cada cara
   declara lo suyo. Declarar un rango mas ancho del que la
   fuente tiene no la hace mas fina ni mas negra: el navegador recorta al limite
   real y la declaracion queda mintiendo.

   Cada familia viene partida en latin y latin-ext con su unicode-range, tal como
   los sirve Google: el navegador baja el segundo solo si la pagina lo necesita. */
@font-face {
  font-family: 'Merriweather';
  font-style: normal;
  font-weight: 300 900;
  font-stretch: 87% 112%;
  font-display: swap;
  src: url('/static/fuentes/merriweather-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Merriweather';
  font-style: normal;
  font-weight: 300 900;
  font-stretch: 87% 112%;
  font-display: swap;
  src: url('/static/fuentes/merriweather-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url('/static/fuentes/jakarta-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url('/static/fuentes/jakarta-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ============================================================================
   Filmina — el sitio publico: portada, blog y legales.

   El sitio no tiene color. Blanco, negro y el serif: nada mas. Un acento de
   marca -verde, violeta, el que sea- compite con lo unico que tiene que
   mirarse, que es la app, y la app ya es una mancha negra enorme con una
   diapositiva blanca adentro.

   Tres reglas:
   1. Los titulos son serif y enormes; el resto es sans y chico. No hay tamanos
      intermedios, que es lo que le da ritmo a la pagina.
   2. Hay un solo fondo por vez y no cambia dentro de la pagina: papel blanco
      con el sistema en claro, papel negro con el sistema en oscuro. Las
      secciones se separan por un pelo de linea y por el aire que tienen arriba
      y abajo, no por bloques de color: una franja tintada parte la pagina en
      dos paginas. La app dibujada lleva el mismo tema que la pagina: de dia es
      la app clara sobre papel claro, de noche la oscura sobre papel negro, y
      lo unico que la separa del fondo es su propio filo.
   3. El unico color de todo el sitio esta adentro de la app: el azul del
      marco que senala sobre la diapositiva. Es del producto, no del sitio.

   Y una cuarta, que es de donde sale la forma: una filmina es TRANSPARENTE.
   Todo el cromo -la nav, los botones, las tarjetas- es la misma lamina de
   vidrio que el dock del visor: una pelicula casi invisible, un pelo de luz en
   el canto de arriba, un borde finisimo y una sombra difusa que la despega del
   papel. Nada tiene relleno propio; lo que se ve a traves es el fondo blanco.

   Esas variables NO se redefinen aca a proposito: --glass, --edge, --canto,
   --sombra y --blur son las mismas que usa el visor, asi que una tarjeta de la
   portada y el dock de la app estan hechos, literalmente, del mismo vidrio, y
   cambian de tema con el.
   ========================================================================= */

body.lp {
  /* ---- la paleta del sitio ---- */
  --papel: #fff;           /* blanco puro: el fondo, y lo unico que hay de fondo */
  --tinta: #111113;
  --tinta-2: rgba(17, 17, 19, .72);
  --tinta-3: rgba(17, 17, 19, .5);
  --linea: rgba(17, 17, 19, .12);
  --linea-fina: rgba(17, 17, 19, .07);
  /* Lo que flota sobre el papel -el dock de abajo, el archivo que se arrastra-
     no es blanco: es el papel a medias, para que se vea pasar lo de atras. */
  --vidrio-papel: rgba(255, 255, 255, .72);
  --vidrio-papel-op: rgba(255, 255, 255, .92);
  /* El papel, en crudo: lo usa la ultima hoja, que no lo pinta entero sino
     por partes, y para eso necesita poder bajarle la opacidad. */
  --tono-papel: 255, 255, 255;
  /* El vidrio de las tarjetas. Una lamina no es un tinte parejo: sobre el papel
     blanco la pelicula es SOMBRA, asi que hay mas abajo -donde apoya- y casi
     nada arriba, que es donde le pega la luz y donde ademas va el pelo del
     canto. Sin ese degrade la tarjeta es un rectangulo gris. */
  --lamina: linear-gradient(180deg, rgba(17, 17, 19, .012), rgba(17, 17, 19, .055));
  --lamina-hi: linear-gradient(180deg, rgba(17, 17, 19, .03), rgba(17, 17, 19, .085));

  --serif: "Merriweather", Georgia, "Times New Roman", serif;
  --ancho: 1220px;
  --gutter: clamp(20px, 4vw, 48px);
  /* El radio del filo de abajo, donde la hoja de la pagina se apoya sobre el
     pie. Es una medida sola porque la usan dos reglas: la punta de la ultima
     seccion y cuanto se mete el pie por debajo. */
  --filo: clamp(30px, 3.4vw, 52px);

  /* Los tokens de la app, reapuntados: asi el muneco y cualquier pieza que
     venga de style.css caen en la paleta del sitio sin tocar el visor. */
  --fondo: var(--papel);
  --text: var(--tinta);
  --text-2: var(--tinta-2);
  --muted: var(--tinta-3);
  --faint: rgba(17, 17, 19, .4);
  /* El verde del descuento: el unico color con significado de toda la pagina.
     Sobre papel blanco va oscuro, o no se lee. */
  --verde: #15803d;
  --verde-fondo: rgba(21, 128, 61, .1);
  /* El naranja del plazo. No es rojo: el rojo al lado del verde arma un
     semaforo, y ademas dice error. Esto no es un error, es una fecha. */
  --naranja: #b45309;
  --naranja-fondo: rgba(180, 83, 9, .1);

  display: block;
  overflow-x: hidden;
  overflow-y: auto;
  background: var(--papel);
  color: var(--tinta);
  font: 450 16px/1.55 "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
  letter-spacing: -.011em;
  /* El hueco que le deja al dock, para que no tape la ultima linea. */
  padding-bottom: 108px;
}

/* ---- la misma paleta, de noche ---- */
/* No es el claro invertido pixel por pixel: sobre negro el mismo gris al 12%
   desaparece, asi que las lineas suben de opacidad. El papel es negro absoluto,
   el mismo que el visor: en una pantalla OLED el fondo deja de ser una
   superficie y pasa a ser pantalla apagada, y lo unico encendido es lo que hay
   que leer. Quien decide es el <html data-tema>, que lo resuelve el script del
   <head> antes de la primera pasada de pintura, igual que en el visor. */
:root[data-tema="oscuro"] body.lp {
  --papel: #000;
  --tinta: #f5f5f7;
  --tinta-2: rgba(245, 245, 247, .72);
  --tinta-3: rgba(245, 245, 247, .5);
  --linea: rgba(245, 245, 247, .16);
  --linea-fina: rgba(245, 245, 247, .09);
  --vidrio-papel: rgba(28, 28, 32, .72);
  --vidrio-papel-op: rgba(28, 28, 32, .92);
  --tono-papel: 0, 0, 0;
  /* Dado vuelta: sobre negro la pelicula es LUZ, asi que el degrade va al reves
     -mas arriba, que es de donde viene- y se apaga hacia abajo. */
  --lamina: linear-gradient(180deg, rgba(245, 245, 247, .072), rgba(245, 245, 247, .016));
  --lamina-hi: linear-gradient(180deg, rgba(245, 245, 247, .11), rgba(245, 245, 247, .032));
  --faint: rgba(245, 245, 247, .4);
  /* Sobre papel negro el mismo verde desaparece: sube a la version brillante,
     que es la que usa el sistema para lo que esta bien. */
  --verde: #30d158;
  --verde-fondo: rgba(48, 209, 88, .14);
  --naranja: #ff9f0a;
  --naranja-fondo: rgba(255, 159, 10, .16);
}

html, body { height: auto; }
/* El scroll suave va en el <html> y no en el <body>. El que scrollea es el
   elemento raiz: el overflow del body se propaga al viewport y el body deja de
   ser la caja que scrollea, asi que la propiedad escrita ahi no la lee nadie y
   los enlaces de adentro de la pagina -los del nav, los del pie, el "volver
   arriba"- caian de golpe en vez de viajar. */
html { scroll-behavior: smooth; }
/* Y no rebota. El pie es blanco y esta fijo DETRAS de la pagina: lo unico que
   lo tapa son los bloques, que son opacos y estan un escalon arriba. El rebote
   elastico de macOS corre el contenido y deja lo fijo donde estaba, asi que
   scrollear de mas contra el tope abre justo lo que no tiene que abrirse y
   asoma el papel blanco por el hueco.

   Va en el <html> porque es el que scrollea, igual que el scroll suave de
   arriba, y en landing.css, que es del sitio: el visor tiene su propio scroll
   y ahi el rebote no molesta a nadie. */
html { overscroll-behavior-y: none; }
/* El :where() es lo importante de este renglon. Esto es un reset -los enlaces
   del sitio no se pintan ni se subrayan salvo que alguien lo pida- y un reset
   tiene que PERDER contra cualquier regla que pida algo. Escrito como
   'body.lp a' no perdia: una clase y dos elementos le ganaban a '.texto a', que
   es una clase y uno, asi que un enlace en medio de un parrafo salia del color
   del parrafo y sin raya, o sea invisible. Con :where() la especificidad del
   selector queda en cero y solo pesa la 'a' del final. */
:where(body.lp) a { color: inherit; text-decoration: none; }
.lp [id] { scroll-margin-top: 28px; }

/* ------------------------------------------------- el paso entre paginas --- */
/* De una pagina a la otra no hay corte: la que se va se apaga y la que llega
   entra desde un poco mas abajo, que es el mismo gesto con el que llega cada
   seccion adentro de una pagina. Cinco paginas que comparten el dock, el pie y
   el fondo no tienen por que parpadear cada vez que se pasa de una a otra.

   Lo hace el navegador y no el JS: saca una foto de la que se va, carga la que
   sigue y cruza las dos el solo. Nada de interceptar clics, que es como se
   hacia esto antes y es lo que termina rompiendo el boton de atras, el clic con
   cmd y la pagina entera si el script no cargo. Donde no esta soportado
   -Firefox, por ahora- la navegacion es la de siempre y no falta nada. */
@view-transition { navigation: auto; }

/* El dock queda afuera del cruce: es el mismo en todas las paginas y esta
   clavado abajo, asi que cruzarlo consigo mismo lo unico que logra es hacerlo
   titilar justo en el medio del paso. Con nombre propio sale del recorte de la
   raiz y se queda quieto mientras atras cambia la pagina. */
.lp-nav { view-transition-name: dock; }

/* La que llega entra por encima de la que se va: sube los ultimos doce pixeles
   y se va poniendo opaca hasta taparla. La de atras no se toca -se queda
   entera hasta el final- y por eso en ningun momento del paso se ve el fondo
   pelado entre las dos, que es el parpadeo que se venia a sacar.

   El mix-blend-mode va en normal a mano. El navegador le pone plus-lighter por
   defecto, que es lo correcto para dos imagenes que se cruzan sumando, pero en
   un sitio negro con el pie blanco eso hace que el pie de la pagina que se va
   pegue un fogonazo justo en el medio del cruce. */
::view-transition-old(root),
::view-transition-new(root) { mix-blend-mode: normal; }
::view-transition-old(root) { animation: none; }
::view-transition-new(root) { animation: pagina-entra .42s var(--ease) both; }
@keyframes pagina-entra { from { opacity: 0; transform: translateY(12px); } }

/* El dock no cruza nada: se muestra el nuevo y listo. Son el mismo dock en las
   dos paginas, asi que cualquier animacion entre uno y otro es un titileo sin
   nada que contar. */
::view-transition-old(dock) { animation: none; opacity: 0; }
::view-transition-new(dock) { animation: none; opacity: 1; }

/* Con reduced-motion el paso no desaparece, se queda quieto: la de arriba no
   sube, solo se pone opaca, y mas rapido. Saca el corte sin mover nada. */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-new(root) { animation: pagina-entra-quieta .18s linear both; }
  @keyframes pagina-entra-quieta { from { opacity: 0; } }
}

/* ------------------------------------------------------------------ titulos */
/* El serif es el de Apple (New York): viene con el sistema, no hay que bajar
   una fuente, y el sitio tiene que poder abrirse sin internet igual que la app. */

.lp h1, .lp h2, .lp h3, .lp h4 { margin: 0; font-weight: 400; }
.lp .display {
  font-family: var(--serif);
  font-weight: 500;
  letter-spacing: -.024em;
  line-height: 1.02;
}
.lp h1.display { font-size: clamp(38px, 5.2vw, 76px); }
.lp h2.display { font-size: clamp(32px, 4.4vw, 56px); line-height: 1.05; }
.lp h3 { font-size: 19px; font-weight: 550; letter-spacing: -.02em; }
.lp p { margin: 0; }
.lp b, .lp strong { font-weight: 600; }

/* Las dos medidas del velo de la tira de momentos. Van registradas -y no aca
   por gusto: @property no se puede escribir adentro de un @media, que es donde
   se usan- porque una variable sin registrar no se interpola, y sin eso el velo
   aparece y desaparece de un cuadro al otro en vez de apagarse. */
@property --velo-izq { syntax: "<length>"; inherits: false; initial-value: 0px; }
@property --velo-der { syntax: "<length>"; inherits: false; initial-value: 0px; }

/* ------------------------------------------------------------------- fibra */
/* El unico color del sitio sigue siendo el del producto: el del resaltador que
   la app pasa sobre la diapositiva, en sus tres colores -azul, ambar, violeta-.
   Aca hace lo mismo que alla: marcar la parte que importa de una frase larga.
   Por eso son cuatro en toda la pagina y no diez: un resaltador que subraya
   todo no subraya nada, y eso vale igual para una lamina que para una portada.

   El trazo es un SVG que se estira al ancho de la palabra -preserveAspectRatio
   none- y mantiene el grosor parejo gracias al vector-effect, asi que sirve
   para dos palabras o para una linea entera sin retocar nada. Va DEBAJO del
   texto, no encima: es un subrayado, no un marcador de resaltar.

   Las medidas de aca valen mientras la frase entre en un renglon, que es lo
   que pasa en una pantalla ancha: la caja de la frase ES el renglon y el trazo
   cuelga de su borde de abajo. Cuando no entra -un titulo largo en un
   telefono-, esa caja pasa a ser tan ancha como el renglon mas largo y el
   trazo terminaria cruzando el ancho entero por debajo del ultimo, que es el
   mas corto. Ahi landing.js pone un trazo por renglon y le escribe a cada uno
   su left, su top y su ancho, que son los tres que estan escritos aca. */
.fibra { position: relative; display: inline-block; }
.fibra-trazo {
  position: absolute;
  /* Despegado de la letra: pegado al pie de la caja se lee como un underline de
     hipervinculo, y lo que tiene que parecer es una raya hecha despues, a mano,
     sobre una linea que ya estaba escrita. */
  left: -.04em; bottom: -.17em;
  width: calc(100% + .08em); height: .22em;
  overflow: visible;
  fill: none;
  /* A media tinta y mas fino, que es como esta hecho todo lo demas del sitio:
     el vidrio de las tarjetas, el pelo de los bordes, la sombra difusa. A tinta
     entera el trazo era lo primero que se veia de la pagina y le ganaba al
     titulo que subraya, que es al reves de lo que tiene que pasar: primero se
     lee la frase y despues se nota que alguien la marco. */
  stroke: rgba(var(--tono-violeta), .5);
  stroke-width: 5.5;
  stroke-linecap: round;
  pointer-events: none;
}
/* Y el aire que hace falta cuando la frase se subraya en mas de un renglon.
   El interlineado de display es casi el cuerpo de la letra: pegados asi, el
   trazo del renglon de arriba cae sobre las mayusculas del de abajo y lo que
   se lee no es un subrayado sino una tachadura. La clase la pone landing.js
   cuando mide mas de un renglon -en una pantalla ancha la frase entra en uno y
   esto no existe-, y el aire se le da al titulo ENTERO y no a la frase sola:
   dos renglones mas separados que el resto del mismo titulo se leen como si se
   hubieran despegado. */
.lp .display:has(.fibra.repartida) { line-height: 1.26; }

.fibra.azul .fibra-trazo { stroke: rgba(var(--tono-azul), .5); }
.fibra.ambar .fibra-trazo { stroke: rgba(var(--tono-amarillo), .5); }

/* El trazo se dibuja solo cuando entra, de una pasada y en el sentido en que se
   escribe. El dibujado NO vive aca sino en landing.js, y por una razon: el
   patron del guion se mide en pixeles del dibujo ya estirado -es lo que hace
   non-scaling-stroke-, asi que el largo hay que medirlo, no escribirlo. Si el
   JS no corre, el trazo queda puesto desde el principio, que es lo que tiene
   que pasar. */

/* ---------------------------------------------------------------- objetos */
/* Dos objetos en toda la pagina, y los dos son del escritorio del que estudia:
   la carpeta donde vive el PDF y el post-it de la noche anterior. No son
   adornos sueltos: cada uno esta al lado del parrafo que lo nombra. */

/* La carpeta, arriba del titulo de "todo pasa en tu Mac". No es un icono: es
   un objeto de vidrio tintado. Lo que la separa de una silueta plana son seis
   cosas, y ninguna es un adorno:

   - el AZUL nunca es opaco. El frente va del 88 al 55 por ciento en diagonal,
     asi que la esquina de arriba a la izquierda -por donde entra la luz en
     toda la interfaz- es la mas solida y la de abajo a la derecha la mas
     transparente.
   - un CANTO de luz sobre el borde de arriba del frente: es el filo del
     material, lo unico que dice que el frente esta adelante y no pintado.
   - dos LUSTRES diagonales, uno ancho y uno fino, recortados contra el frente.
     Son el reflejo de una fuente que no se ve, y son lo que convierte una
     superficie plana en una con brillo.
   - un pelo de LUZ en el contorno, mas fuerte arriba que abajo.
   - DOS hojas y no una: una sola se lee como un rectangulo blanco; dos
     asomando desparejas se leen como papeles metidos ahi.
   - tres RENGLONES en la hoja de adelante, que es lo que la vuelve un
     documento en vez de una tarjeta.

   El azul es el del sistema, el mismo que el puntero del resaltador. */
#local .ancho { position: relative; }
.carpeta {
  position: absolute;
  top: -34px; right: calc(10% + 54px);
  width: clamp(86px, 9vw, 128px); height: auto;
  transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(-7deg) scale(var(--aesc, 1));
  filter: drop-shadow(0 14px 26px rgba(17, 17, 19, .18));
}

/* ---- el cuerpo ---- */
.carpeta .c-atras  { fill: url(#c-g-atras); }
.carpeta .c-frente { fill: url(#c-g-frente); }

.carpeta .s-atras-1  { stop-color: rgb(var(--tono-azul)); stop-opacity: .5; }
.carpeta .s-atras-2  { stop-color: rgb(var(--tono-azul)); stop-opacity: .3; }
.carpeta .s-frente-1 { stop-color: rgb(var(--tono-azul)); stop-opacity: .88; }
.carpeta .s-frente-2 { stop-color: rgb(var(--tono-azul)); stop-opacity: .7; }
.carpeta .s-frente-3 { stop-color: rgb(var(--tono-azul)); stop-opacity: .55; }

/* ---- los filos ---- */
.carpeta .c-canto-atras,
.carpeta .c-canto-frente,
.carpeta .c-labio {
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.carpeta .c-canto-atras  { stroke: #fff; stroke-opacity: .3; stroke-width: .9; }
.carpeta .c-canto-frente { stroke: #fff; stroke-opacity: .16; stroke-width: .9; }
/* El labio: la unica linea nitida que tiene la pieza, igual que el canto de
   una lamina de vidrio en el visor. */
.carpeta .c-labio { stroke: #fff; stroke-opacity: .5; stroke-width: 1.1; }

/* ---- el brillo ---- */
.carpeta .c-lustre   { fill: #fff; opacity: .1; }
.carpeta .c-lustre-2 { fill: #fff; opacity: .055; }

/* ---- lo que hay adentro ---- */
.carpeta .c-hoja   { fill: #fbfbfd; }
.carpeta .c-hoja-2 { fill: #fff; opacity: .45; }
.carpeta .c-renglon {
  fill: none;
  stroke: rgb(var(--tono-azul));
  stroke-opacity: .34;
  stroke-width: 1.3;
  stroke-linecap: round;
}

/* Sobre negro la sombra no existe: lo que despega la carpeta es el pelo de luz
   del contorno, asi que sube, y la sombra se queda solo para dar peso. */
:root[data-tema="oscuro"] .carpeta { filter: drop-shadow(0 14px 30px rgba(0, 0, 0, .6)); }

/* El candado, al lado de la esquina de abajo a la derecha de la carpeta.
   Misma receta que ella -degrade, canto, lustre, contorno- porque son dos
   objetos del mismo material y si uno tuviera brillo y el otro no, el de al
   lado se leeria como un icono pegado encima.

   Cambia el color y nada mas: el ambar del resaltador, que es el otro tono que
   ya existe en el producto. Y gira para el lado contrario que la carpeta, que
   es lo unico que evita que los dos se lean como una sola calcomania.

   El arco va DETRAS del cuerpo: asi las patas se meten adentro y no hay que
   dibujar donde terminan, que es donde estas piezas se suelen ver falsas. */
.candado {
  position: absolute;
  /* Apoyado contra la carpeta y no encima: si se le monta, la tapa y los dos
     se leen como una sola calcomania. La carpeta sube y se corre a la
     izquierda, el candado se queda abajo a la derecha, y quedan en diagonal,
     que es como se ven dos objetos sobre una mesa. */
  top: 26px; right: calc(10% - 26px);
  width: clamp(38px, 3.9vw, 56px); height: auto;
  transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(9deg) scale(var(--aesc, 1));
  filter: drop-shadow(0 10px 20px rgba(17, 17, 19, .2));
}

.candado .k-cuerpo { fill: url(#k-g-cuerpo); }
.candado .s-k-1 { stop-color: rgb(var(--tono-amarillo)); stop-opacity: .92; }
.candado .s-k-2 { stop-color: rgb(var(--tono-amarillo)); stop-opacity: .76; }
.candado .s-k-3 { stop-color: rgb(var(--tono-amarillo)); stop-opacity: .6; }

.candado .k-arco {
  fill: none;
  stroke: url(#k-g-arco);
  stroke-width: 5.4;
  stroke-linecap: round;
}
.candado .s-k-arco-1 { stop-color: #fff; stop-opacity: .5; }
.candado .s-k-arco-2 { stop-color: #fff; stop-opacity: .26; }
/* El brillo del arco: una linea fina por el lado de adentro, que es lo que
   convierte un tubo plano en uno con volumen sin dibujar una sombra. */
.candado .k-arco-luz {
  fill: none;
  stroke: #fff; stroke-opacity: .45;
  stroke-width: 1.2; stroke-linecap: round;
}

.candado .k-labio,
.candado .k-canto { fill: none; stroke-linecap: round; }
.candado .k-labio { stroke: #fff; stroke-opacity: .5; stroke-width: 1.1; }
.candado .k-canto { stroke: #fff; stroke-opacity: .2; stroke-width: .9; }

.candado .k-lustre   { fill: #fff; opacity: .12; }
.candado .k-lustre-2 { fill: #fff; opacity: .06; }

/* La cerradura es un hueco, no un dibujo: se oscurece el material en vez de
   pintarle una forma encima. */
.candado .k-ojo { fill: rgb(var(--marca-hondo)); fill-opacity: .42; }

:root[data-tema="oscuro"] .candado { filter: drop-shadow(0 10px 22px rgba(0, 0, 0, .55)); }
:root[data-tema="oscuro"] .candado .k-canto  { stroke-opacity: .3; }
:root[data-tema="oscuro"] .candado .k-lustre { opacity: .16; }
:root[data-tema="oscuro"] .candado .k-ojo    { fill: #000; fill-opacity: .42; }

:root[data-tema="oscuro"] .carpeta .c-canto-atras  { stroke-opacity: .42; }
:root[data-tema="oscuro"] .carpeta .c-canto-frente { stroke-opacity: .24; }
:root[data-tema="oscuro"] .carpeta .c-lustre       { opacity: .14; }


/* ---------------------------------------------------------------------- nav */
/* Abajo, chica y flotando: es el mismo dock del visor. Arriba, una barra que
   cruza la pantalla le pone un techo al titulo y es lo primero que se lee; aca
   se sale del camino, deja que la portada empiece en el borde de arriba y
   queda donde esta la mano. El contenido le pasa por debajo y se ve a traves,
   que es lo que hace una filmina. */

.lp-nav {
  position: fixed;
  left: 50%;
  bottom: clamp(14px, 2vw, 24px);
  transform: translateX(-50%);
  z-index: 60;
  display: flex;
  align-items: center;
  gap: 10px;
  width: max-content;
  max-width: calc(100% - 28px);
  padding: 10px 10px 10px 18px;
  border-radius: 999px;
  background: var(--vidrio-papel);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  border: 1px solid var(--edge);
  box-shadow: var(--sombra-lg), var(--canto);
  transition: opacity .35s var(--ease), transform .45s var(--ease);
}
/* Mientras el boton del hero se ve, el dock sobra: repetiria la unica accion
   que hay en pantalla. Se esconde bajando, no desapareciendo, para que cuando
   vuelva se lea de donde vino.

   El estado por defecto es VISIBLE y lo que hace el JS es esconderlo: si el
   script no carga queda una barra que funciona, y no una pagina sin nav. */
.lp-nav.escondida {
  opacity: 0;
  transform: translate(-50%, calc(100% + 24px));
  pointer-events: none;
}
/* Sola, sin la palabra al lado, la marca puede ir un poco mas grande: es lo
   unico que identifica al sitio en el dock. */
.lp-nav .logo { display: flex; align-items: center; padding-right: 4px; }
/* La marca es la F, no el muneco: el muneco es el profesor y vive en la
   portada y adentro de la app, que es donde te habla. */
.lp-nav .logo .marca-f { display: block; width: 28px; height: 24px; color: var(--tinta); }
.lp-nav .links { display: flex; gap: 2px; }
.lp-nav .links a {
  padding: 9px 13px; border-radius: 999px;
  font-size: 15px; color: var(--tinta-2);
  transition: background .2s ease, color .2s ease;
}
.lp-nav .links a:hover { color: var(--tinta); background: var(--glass-hi); }
.lp-nav .derecha { display: flex; gap: 6px; }


/* ------------------------------------------------------- barra de lectura */
/* Un pelo de tinta cruzando el borde de arriba que crece con la lectura. Es lo
   unico fijo que hay arriba en todo el sitio: el dock esta abajo y los titulos
   empiezan en el borde, asi que dos pixeles es todo lo que se puede poner ahi
   sin ponerle un techo a la pagina. Solo esta en las paginas que se leen de
   corrido; la portada se recorre y no la lleva.

   No se llena al final del documento sino al final del TEXTO: abajo del ultimo
   parrafo vienen la invitacion a descargar y el pie, que juntos miden casi dos
   pantallas, y contarlos dejaria la barra por la mitad justo cuando ya no
   queda nada que leer. Donde esta ese final lo mide el JS.

   Va arriba del dock pero abajo de lo que sigue al puntero: si la lente pasa
   por el borde de arriba, pasa por encima y no por debajo. */
.lectura {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 65;
  height: 2px;
  pointer-events: none;
  /* Igual que el dock: queda afuera del paso entre paginas. Es la misma barra
     en todas, y cruzarla consigo misma la haria titilar en el medio del
     cambio; ademas la pagina que entra sube unos pixeles, y la barra no tiene
     por que subir con ella.  */
  view-transition-name: lectura;
}
/* Se escala, no se ensancha: cambiar el ancho obliga a rehacer el layout en
   cada cuadro, y esto se dibuja mientras el dedo scrollea. Sin JavaScript la
   escala es cero y no se dibuja nada, que es mejor que una barra que miente.

   Sin transicion a proposito: la barra no se anima sola, la mueve el scroll.
   Con una transicion encima iria siempre un pelo atrasada respecto de donde
   esta uno leyendo, que es lo unico que tiene que decir bien. */
.lectura i {
  display: block;
  height: 100%;
  background: var(--tinta);
  transform: scaleX(var(--leido, 0));
  transform-origin: 0 50%;
}


/* ------------------------------------------------------------------ botones */

.lp .btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  height: 46px; padding: 0 24px;
  border: 1px solid transparent; border-radius: 999px;
  font-size: 15px; font-weight: 550; letter-spacing: -.012em;
  white-space: nowrap;
  /* Las dos cosas que le pasan al boton -levantarse al pasarle por encima y
     hundirse al apretarlo- van en variables y no en dos transform sueltos: si
     no, el de hover le gana por especificidad al de :active y el boton deja de
     hundirse justo cuando lo estas apretando, que es cuando tiene que hacerlo. */
  transform: translateY(var(--alza, 0px)) scale(var(--aprieta, 1));
  transition: background .2s ease, color .2s ease, border-color .2s ease,
              transform .25s cubic-bezier(.22,1.18,.36,1);
}
.lp .btn:active { --aprieta: .975; }

/* La accion principal es la unica pieza opaca de todo el sitio, y es negra:
   exactamente el mismo boton que el play del visor en tema claro, que sale de
   --solido / --sobre-solido. Entre todo lo demas, que es vidrio, lo unico
   solido es lo que hay que apretar. */
.lp .btn.primario {
  background: var(--solido);
  color: var(--sobre-solido);
  border-color: transparent;
  box-shadow: var(--sombra-solido);
}
.lp .btn.primario:hover { background: var(--solido-hi); --alza: -2px; }

/* El brillo que cruza el boton al pasarle por encima: la misma banda diagonal
   que llevan la carpeta, el candado, los formatos y el papelito, aca de paso en
   vez de quieta. Es del color del texto y no blanca, asi se ve igual sobre el
   boton claro del tema oscuro que sobre el negro del claro.

   Va de animacion y no de transicion a proposito: una transicion volveria sola
   al sacar el mouse y el brillo cruzaria de vuelta para el otro lado, que es
   algo que ninguna superficie hace. Asi cruza una vez, de ida, y ya. */
.lp .btn.primario { position: relative; overflow: hidden; }
.lp .btn.primario::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(104deg,
    transparent 0 38%, currentColor 46% 52%, transparent 60%);
  opacity: .16;
  transform: translateX(-110%);
  pointer-events: none;
}
@keyframes lustre-boton {
  from { transform: translateX(-110%); }
  to   { transform: translateX(110%); }
}
.lp .btn.primario:is(:hover, :focus-visible)::after {
  animation: lustre-boton .62s cubic-bezier(.32, .72, 0, 1);
}

/* El secundario es la misma lamina, mas fina: no tiene sombra, solo el borde
   y el canto. La diferencia entre los dos botones es cuanto estan levantados. */
.lp .btn.linea {
  background: var(--glass-hi);
  -webkit-backdrop-filter: var(--blur-sm);
  backdrop-filter: var(--blur-sm);
  border-color: var(--edge);
  box-shadow: var(--canto);
}
.lp .btn.linea:hover { background: var(--glass-hi-2); border-color: var(--edge-hi); }

.lp .btn.chico { height: 40px; padding: 0 18px; font-size: 14.5px; }
.lp .btn.grande { height: 54px; padding: 0 30px; font-size: 16.5px; }
.lp .btn .glifo { width: 18px; height: 18px; fill: currentColor; stroke: none; margin-top: -2px; }
.lp .btn.grande .glifo { width: 21px; height: 21px; margin-top: -3px; }
.lp .btn.chico .glifo { width: 16px; height: 16px; }
.lp .btn .flecha { font-size: 1.05em; line-height: 1; }

/* ================================================================= portada ==
   Dos columnas: la app a la izquierda, saliendose por el borde de la pantalla,
   y el texto a la derecha. La ventana cortada es lo que hace que se lea como
   una app y no como una ilustracion: entera y centrada parece un dibujo, y
   asomandose por el margen parece que sigue ahi cuando cerras la pagina.

   El texto va alineado a la izquierda y no centrado: tres renglones de titulo
   centrados obligan al ojo a buscar el arranque de cada uno. */

.lp-hero {
  /* Referencia para el encabezado, que va absoluto contra el borde de arriba. */
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1.04fr) minmax(0, .96fr);
  align-items: center;
  gap: clamp(32px, 5vw, 88px);
  /* La caja va de borde a borde y el contenido se centra con el padding, no con
     un max-width. Cuando el pie queda clavado al fondo, lo que lo tapa es cada
     hijo del body: con la portada midiendo 1460 y centrada, el pie blanco se
     asomaba por las dos franjas que quedaban a los costados. */
  --sobra: max(0px, (100% - 1460px) / 2);
  margin: 0;
  /* Sin padding propio a la izquierda: de ese lado el que manda es el margen
     negativo de la ventana. Lo que hay es el sobrante de centrar. */
  /* La portada ocupa el alto de la pantalla y se centra en el. En un monitor
     alto el aire sobrante se reparte arriba y abajo en vez de quedar todo
     abajo; en uno bajo, el alto lo pone el contenido.

     Va MIN-height y no height: con height, en una pantalla mas baja que la
     ventana el contenido se sale de su propia caja y se le monta a la seccion
     siguiente. Con min-height la seccion crece y lo unico que se pierde es el
     centrado, que es justo lo prescindible.

     svh y no vh: en el telefono, vh mide la pantalla SIN las barras del
     navegador, asi que la portada arranca con un pedazo tapado. */
  min-height: 100vh;
  min-height: 100svh;
  align-content: center;
  /* El padding es el aire minimo, el que se respeta cuando no sobra nada.
     Arriba es mayor que abajo, y esa diferencia es la banda del encabezado:
     cuando la pantalla es baja la ventana deja de entrar y se apoya contra
     este padding, asi que si fuera el mismo de abajo le pasaria por encima a
     la marca. */
  padding: clamp(80px, 8vh, 104px) calc(var(--gutter) + var(--sobra)) clamp(48px, 6vh, 96px) var(--sobra);
}
/* El encabezado de la portada. Va absoluto y no como una fila mas de la
   grilla porque la portada se centra en el alto de la pantalla: una fila arriba
   viajaria con ese centrado en vez de quedarse contra el borde.

   No es fijo: el que queda fijo es el dock, y dos barras a la vez sobre la
   misma pagina son una de mas. Esta se va con la portada y el dock entra
   justo cuando ella termina de irse. */
.hero-nav {
  position: absolute;
  top: clamp(18px, 3vh, 34px);
  /* Contra el contenido de la portada, no contra el borde de la pantalla: la
     caja ahora es de ancho completo y el centrado vive en el padding. */
  left: calc(var(--sobra) + var(--gutter));
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 6px;
}
.hero-nav .logo { display: flex; align-items: center; padding-right: 10px; }
/* La marca va mas apagada que los links y no a tinta plena: es una mancha
   maciza, y al mismo valor que el texto pesa el doble que una palabra. Apagada
   queda como lo que es, una firma en la esquina, y el que tiene que resaltar
   en esa banda es el titulo. */
.hero-nav .logo .marca-f {
  display: block; width: 30px; height: 26px;
  /* Apagada con opacidad y no con un gris escrito: asi el gris sale del color
     del tema y sigue siendo el papel el que lo decide. Por debajo de --faint,
     que es lo mas bajo que llega la paleta. */
  color: var(--tinta); opacity: .12;
  transition: opacity .2s ease;
}
/* Al pasarle por encima se enciende del todo: es un enlace al inicio, y una
   marca al 12% no parece que lleve a ningun lado. Va sobre el enlace y no
   sobre el dibujo, asi el area que responde es la misma que la que se clickea. */
.hero-nav .logo:hover .marca-f { opacity: 1; }
.hero-nav .links { display: flex; gap: 2px; }
.hero-nav .links a {
  padding: 9px 13px; border-radius: 999px;
  font-size: 15px; color: var(--tinta-2);
  transition: background .2s ease, color .2s ease;
}
.hero-nav .links a:hover { color: var(--tinta); background: var(--glass-hi); }

.texto-hero { max-width: 29rem; }

.lp-hero .bajada {
  margin-top: 26px;
  font-size: clamp(16px, 1.35vw, 18.5px);
  line-height: 1.5;
  color: var(--tinta-2);
  max-width: 32ch;
}
/* La onda de audio, arriba del boton. Es la voz de la maqueta dibujada de este
   lado: mientras el muneco piensa esta chata, y arranca a latir en el mismo
   momento en que el empieza a hablar.
   Vacia no mide nada -sin JS no hay barras y no queda un hueco-, por eso el
   alto lo dan las barras y no el contenedor. */
.onda {
  display: flex; align-items: center; gap: 3px;
  margin-top: 30px;
  height: 24px;
  width: var(--largo, 100%);
  /* Las barras que sobren se recortan. La cuenta la hace el JS midiendo la
     caja, asi que entre que la caja se achica y el JS vuelve a contar hay un
     cuadro con las barras de antes; y si el JS no llega a correr, no hay
     ninguna cuenta. En los dos casos lo que sobra tiene que quedar adentro:
     esto es el dibujo de una voz, no algo que se lea hasta el final. */
  overflow: hidden;
  color: var(--tinta-3);
}
.onda span {
  /* Sin flex-shrink las barras no conservan sus 2px: flex las aplasta para
     meterlas todas en el ancho, y la onda se convierte en nada. */
  width: 2px; height: 100%; flex-shrink: 0;
  border-radius: 1px;
  background: currentColor;
  /* En silencio: cortas y quietas. La altura sale de la amplitud propia de cada
     barra, achicada, asi que sigue habiendo relieve -se lee como una onda en
     reposo- sin que ninguna se levante.
     Se hace con el transform y no pausando la animacion: pausada, cada barra
     queda congelada donde la agarro su desfasaje, y las que caian en el pico se
     quedaban altas. Quieto de verdad es no tener animacion. */
  --quieta: calc(var(--a, .5) * .26 + .1);
  transform: scaleY(var(--quieta));
}
/* Recien al hablar hay animacion. Crece desde el centro, como un vumetro:
   scaleY y no height, asi late sin recalcular el layout en cada cuadro. */
.onda.hablando span { animation: onda-late 1s ease-in-out infinite; }
@keyframes onda-late {
  0%, 100% { transform: scaleY(var(--quieta)); }
  50%      { transform: scaleY(var(--a, .5)); }
}

.lp-hero .acciones { margin-top: 32px; display: flex; flex-wrap: wrap; gap: 12px; }
/* La ventana se sale por la izquierda, y ese margen negativo es lo unico que
   la agranda: como el alto sale del aspect-ratio, ensancharla desde el margen
   la hace mas alta sin tocar la proporcion ni mover la columna del texto, que
   sigue empezando donde empezaba. El corte lo hace el overflow-x del body,
   que ya estaba puesto, asi que no hace falta recortar nada a mano. */
.escenario { margin-left: -27vw; }


/* ============================================= la espera de Windows ======= */
/* Lo que se abre no se dibuja como el sitio: se dibuja como la app. El velo
   desenfocado, la lamina de vidrio con la pieza arriba y la cruz en la esquina
   son la misma receta -y los mismos tokens- que las pantallas de la clave y de
   contarnos algo del visor, escritas en style.css. Aca se repite y no se
   reusa por una sola razon: en esta pagina .lamina son las diapositivas de
   mentira de la tira y .pieza son los dibujos que siguen al puntero. Dos
   nombres ocupados.

   El envoltorio es un <dialog>, que trae de fabrica un ancho que se ajusta al
   contenido, un margen que lo centra, un borde y un maximo de alto. El velo
   quiere lo contrario: la pantalla entera, y centrar adentro. */
.lp .espera {
  position: fixed; inset: 0;
  width: auto; height: auto;
  max-width: none; max-height: none;
  margin: 0; padding: 24px;
  border: 0;
  display: flex;
  /* El que scrollea cuando la lamina no entra es el velo, no la lamina. Con la
     caja de adentro haciendo de contenedor de scroll, cualquier medio pixel de
     diferencia entre lo que mide y lo que le entra le dibuja una barra al
     costado -y al abrir, mientras la lamina crece, ese medio pixel aparece y se
     va-. El velo, que mide exactamente la ventana, no tiene como equivocarse:
     o la hoja entra y no hay barra, o no entra y la barra tiene que estar.
     El centrado lo hace el margin auto de la lamina y no un align-items, que es
     lo unico que centra sin recortar cuando lo de adentro es mas alto que lo de
     afuera. */
  overflow: hidden auto;
  /* Y lo de atras no se mueve. El velo tapa la ventana entera, asi que la
     rueda cae SIEMPRE sobre el: siendo caja de scroll y con el rebote
     contenido, lo que no tiene para scrollear no se lo pasa a la pagina, que
     es lo que la hacia viajar por detras del formulario. Se para ahi y no
     tapandole el overflow al body, que era lo que se hacia antes: eso le saca
     la barra a la pagina, y la barra apagandose y volviendo a encenderse al
     costado es justamente lo que se ve como un parpadeo raro al abrir y al
     cerrar. Asi la barra se queda donde estaba, quieta.
     Lo unico que sigue moviendo la pagina es arrastrar esa barra con el mouse,
     que ninguna forma de trabar el scroll evita sin apagarla. */
  overscroll-behavior: contain;
  background: var(--velo);
  -webkit-backdrop-filter: blur(22px) saturate(120%);
  backdrop-filter: blur(22px) saturate(120%);
  color: var(--tinta);
  animation: revelar .25s var(--ease) both;
}
/* El display:flex de arriba le gana al display:none que el navegador le pone al
   dialogo cerrado, asi que sin esto el velo taparia la pagina desde que carga.
   Lo mismo con las dos laminas de adentro, que se turnan con hidden. */
.lp .espera:not([open]) { display: none; }
.lp .espera-lamina[hidden] { display: none; }
/* El velo lo pinta el dialogo. El fondo que dibuja el navegador detras
   sobraria encima de ese. */
.lp .espera::backdrop { background: none; }

/* Al cerrarse no desaparece: se apaga. Abrir algo que tapa la pantalla entera
   y despues sacarlo de un tiron es un corte, y lo que habia atras aparece como
   si fuera otra pagina. Yendose, el velo se suelta y la lamina se hunde un
   poco, que es el mismo gesto de entrada al reves. Las dos animaciones son las
   de la app, que ya estan escritas en style.css; lo que las prende es la clase
   que pone landing.js, porque un <dialog> cerrado deja de dibujarse y no hay
   con que animarlo despues. */
.lp .espera.yendose { animation: apagarse .22s var(--ease) both; }
.lp .espera.yendose .espera-lamina { animation: hundirse .22s var(--ease) both; }

.lp .espera-lamina {
  position: relative;
  width: min(430px, 100%);
  /* Centrada por el margen, que es lo que la deja entera cuando no entra: con
     el centrado del flex, lo que se pasa de alto se recorta arriba y no hay
     scroll que lo alcance. */
  margin: auto;
  display: flex; flex-direction: column; align-items: center;
  text-align: center;
  gap: 12px;
  padding: 34px 30px 30px;
  border: 1px solid var(--edge); border-radius: 26px;
  background: var(--glass-hi);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--sombra-lg), var(--canto);
  animation: brotar .45s var(--ease) both;
}
.lp .espera-lamina h2 {
  margin: 0;
  font-family: var(--serif); font-size: 25px; font-weight: 500;
  letter-spacing: -.02em;
}
.lp .espera-lamina p {
  /* El aire de abajo va escrito y no queda librado al hueco parejo de la
     lamina: lo de arriba es lo que hay que leer y lo de abajo lo que hay que
     hacer, y con la misma separacion que hay entre el titulo y el texto los
     campos se leen como el cuarto renglon del parrafo. */
  margin: 0 0 10px; max-width: 34ch;
  color: var(--muted); font-size: 13.5px; line-height: 1.5;
  /* El ultimo renglon no queda con una palabra sola. No se reparten parejos:
     asi el bloque usa todo el ancho que tiene, como el de la pantalla de la
     clave, en vez de encogerse al ancho del renglon mas corto. */
  text-wrap: pretty;
}

/* El renglon de abajo del boton, que dice el aviso o el rechazo. Los dos
   valores estan en .lamina-nota de la app, pero ahi pierden contra el parrafo
   de la lamina, que es mas especifico: escritos de nuevo aca, ganan. */
.lp .espera .lamina-nota { color: var(--faint); font-size: 12.5px; }
.lp .espera .lamina-nota.mal { color: var(--peligro); }

/* La bandera, del mismo material que la llave y la tuerca de la app: el degrade
   que cae de arriba a la izquierda, los dos lustres cruzando por dentro del
   recorte y el pelo de luz en el canto. Del color de las piezas frias y no del
   azul de Microsoft: el sitio no pone color de marca ajena. */
.lp .espera-pieza {
  width: 76px; height: 76px; margin-bottom: 6px;
  color: var(--acero);
  filter: drop-shadow(0 12px 26px rgba(0, 0, 0, .5));
  animation: brotar .6s .1s var(--ease) both;
}
.lp .espera-pieza .k-s1 { stop-color: currentColor; stop-opacity: 1; }
.lp .espera-pieza .k-s2 { stop-color: currentColor; stop-opacity: .92; }
.lp .espera-pieza .k-s3 { stop-color: currentColor; stop-opacity: .78; }
.lp .espera-pieza .k-lustre   { fill: #fff; opacity: .22; }
.lp .espera-pieza .k-lustre-2 { fill: #fff; opacity: .1; }
.lp .espera-pieza .k-canto {
  fill: none;
  stroke: #fff; stroke-opacity: .32; stroke-width: 1.6;
  stroke-linejoin: round;
}

/* Los campos son los de la lamina de contarnos algo de la app, con una sola
   diferencia: el cuerpo va en 16 y no en 14, porque esto tambien se abre en un
   telefono y abajo de 16 Safari hace zoom solo al tocar el campo y deja la
   pagina corrida. */
.lp .espera :is(input, textarea) {
  width: 100%;
  padding: 11px 14px;
  border: 1px solid var(--edge); border-radius: 13px;
  background: var(--glass-hi);
  color: var(--text); font: inherit; font-size: 16px;
}
.lp .espera textarea { resize: none; line-height: 1.5; }
.lp .espera :is(input, textarea)::placeholder { color: var(--faint); }
.lp .espera :is(input, textarea):focus {
  outline: 2px solid var(--foco); outline-offset: 2px;
}
.lp .espera .primary {
  width: 100%; height: 46px; margin-top: 6px;
  font-size: 15px; font-weight: 550;
}

/* El desplegable es un campo mas: el mismo vidrio y el mismo borde que los dos
   que tiene arriba y abajo, con el chevron dibujado con dos degrades, que es
   como lo dibujan los de la app. Sin elegir todavia, el texto va en el gris de
   los huecos: lo que se lee ahi es la pregunta, no una respuesta. */
.lp .espera select {
  -webkit-appearance: none; appearance: none;
  width: 100%;
  height: 46px;
  padding: 0 38px 0 14px;
  border: 1px solid var(--edge); border-radius: 13px;
  background-color: var(--glass-hi);
  color: var(--text); font: inherit; font-size: 16px;
  /* Alineado a la izquierda como los dos campos que tiene al lado: son tres
     huecos de la misma columna, y uno centrado en el medio se lee como otra
     cosa. */
  text-align: left;
  cursor: pointer;
  background-image:
    linear-gradient(45deg, transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: calc(100% - 22px) calc(50% + 1px), calc(100% - 17px) calc(50% + 1px);
  background-size: 5px 5px;
  background-repeat: no-repeat;
}
.lp .espera select:invalid { color: var(--faint); }
.lp .espera select:focus { outline: 2px solid var(--foco); outline-offset: 2px; }
/* La lista desplegada la dibuja el sistema y no hereda el vidrio: sin fondo
   propio, en el tema oscuro sale texto claro sobre blanco. */
.lp .espera select option { background: var(--menu); color: var(--text); }

/* El tilde del final va donde estaba la pieza y mide lo mismo, asi la lamina no
   cambia de forma entre el formulario y el gracias. */
.lp .espera-tilde {
  display: grid; place-items: center;
  width: 62px; height: 62px; margin-bottom: 6px;
  border-radius: 50%;
  background: var(--verde-fondo); color: var(--verde);
}
.lp .espera-tilde svg {
  width: 30px; height: 30px;
  fill: none; stroke: currentColor; stroke-width: 2.6;
  stroke-linecap: round; stroke-linejoin: round;
}

/* ============================================== la app, dibujada en CSS ==== */
/* No es una captura: es el visor dibujado, con el marco recorriendo los bloques
   mientras el guion se enciende. Una captura envejece con cada cambio de la
   interfaz, pesa, y sobre todo es quieta -y lo unico que hay que entender de
   Filmina es que el marco se mueve mientras la voz habla.

   Las proporciones son las de verdad: la lamina se lleva dos tercios del ancho
   y llega casi al borde, el guion es una columna angosta a la derecha, y el
   encabezado -el muneco, el documento, lo que falta y la X- vive ARRIBA DE ESA
   COLUMNA, no cruzando la ventana. */

/* La ventana de macOS. Marco, esquinas y semaforos: sin eso la app parece una
   captura de una pagina web, que es justo lo que no es. */
.ventana-mac {
  border-radius: 22px;
  overflow: hidden;
  background: var(--fondo);
  /* La ventana lleva el mismo tema que la pagina: de dia es la app clara sobre
     papel claro, de noche la oscura sobre papel negro. Por eso la sombra va
     escrita y no sale de los tokens -que aca son los mismos de la pagina-: es
     lo unico que la despega cuando el fondo y la ventana son del mismo color. */
  box-shadow: 0 0 0 1px rgba(17,17,19,.12),
              0 2px 8px rgba(17,17,19,.08),
              0 40px 90px rgba(17,17,19,.24);
}
/* Sobre el papel negro una sombra negra no existe, y la ventana tambien es
   negra: lo unico que las separa es el pelo de luz del canto. Va 1px entero y
   no medio, por la misma razon que en el visor: a .5px el navegador lo reparte
   entre dos filas de pixeles y queda la mitad de brillo, justo en el caso en
   que mas hace falta. */
:root[data-tema="oscuro"] .ventana-mac {
  box-shadow: 0 0 0 1px rgba(245,245,247,.16),
              0 40px 90px rgba(0,0,0,.6);
}
/* La barra va del mismo negro que el resto y sin linea abajo: en el visor la
   ventana no tiene cromo propio, asi que lo unico que la delata como app de
   Mac son los tres semaforos flotando sobre el fondo. */
.titlebar-mac {
  display: flex; align-items: center; gap: 8px;
  height: 42px;
  padding: 0 18px;
  background: var(--fondo);
}
.titlebar-mac .luz { width: 12px; height: 12px; border-radius: 50%; }
.titlebar-mac .luz.roja { background: #ff5f57; }
.titlebar-mac .luz.amarilla { background: #febc2e; }
.titlebar-mac .luz.verde { background: #28c840; }

.app {
  position: relative;
  aspect-ratio: 16 / 9.6;
  padding: 1.6cqi 2.6cqi 2.2cqi;
  background: var(--fondo);
  color: var(--text);
  overflow: hidden;
  user-select: none;
  container-type: inline-size;
}
/* La fila va acotada a la altura de la ventana -minmax(0, 1fr) y no el auto de
   cada fila- porque si no la miden sus hijos: el guion es una cinta larguisima y
   estiraba la fila 200px mas abajo del borde. Con eso la lamina se iba al fondo,
   el reproductor quedaba afuera de la ventana y no se veia, y la app parecia
   tirada para abajo. El minmax va con el min-height: 0 de las dos columnas: sin
   eso el minimo de una caja de scroll sigue siendo su contenido entero. */
.app-cuerpo {
  display: grid;
  grid-template-columns: 2.05fr 1fr;
  grid-template-rows: minmax(0, 1fr);
  gap: 3cqi;
  height: 100%; min-height: 0;
}

/* ---- la diapositiva ---- */

.app-lamina { display: flex; align-items: center; min-width: 0; min-height: 0; }

/* La lamina de ejemplo. Es la unica pagina de PDF que el sitio muestra, asi que
   tiene que estar bien hecha: una diapositiva de catedra de verdad, con su
   banda arriba, el antetitulo de la unidad, la definicion recuadrada y los
   items numerados. Volcada como texto corrido parece un apunte fotocopiado, y
   lo que se promete explicar parece poco.

   Arriba no lleva color: la banda es papel y una raya. El unico color de toda
   la ventana es el azul del marco de la app, que es el que tiene que ganar;
   una cabecera teñida se la pasa por arriba y encima le pone una marca a una
   catedra inventada. Lo poco que queda teñido -el ocre del antetitulo, el azul
   de la definicion- va adentro y en tinta, no en fondos.

   Y una regla de composicion, que aca no es un detalle: en la portada la
   ventana se sale por la izquierda y de la lamina se ve la MITAD DERECHA. Por
   eso la unidad va a la derecha de la banda y el numero de pagina a la derecha
   del pie: lo que queda dentro del recorte tiene que leerse entero.

   Se llama .diapo y no .hoja, que es como se llamaba: .hoja ya existe en
   style.css -el velo que la app abre por encima de todo- y esta pagina carga
   las dos hojas de estilo. Con el nombre repetido, a la diapositiva le caian
   encima el relleno de 24px de ese velo, su desenfoque, su centrado y, lo que
   se veia a simple vista, el color apagado de .hoja p: la definicion recuadrada
   quedaba escrita en gris claro sobre papel blanco, o sea en blanco. En la
   pantalla ancha no se notaba -la ventana se sale por el borde y esa parte
   queda del lado cortado-, en el telefono, donde entra entera, era un recuadro
   vacio en el medio de la portada. */
.diapo {
  position: relative;
  display: flex; flex-direction: column;
  width: 100%;
  border-radius: .75em;
  background: #fff;
  color: #14161c;
  overflow: hidden;
  box-shadow: var(--sombra-papel);
  font-size: clamp(8px, 1.62cqi, 20px);
  line-height: 1.42;
  letter-spacing: -.004em;
}
/* La banda, sin fondo: el mismo papel que la hoja y una raya fina abajo. Lo que
   la separa del cuerpo es la raya y el peso de la letra, que es como esta hecha
   una cabecera impresa de verdad. La raya va del gris del papel y no de un
   color, asi que la unica linea tenida de la lamina sigue siendo la del
   antetitulo. */
.diapo .cinta {
  display: flex; align-items: center; gap: .85em;
  padding: .72em 1.2em;
  border-bottom: 1px solid rgba(18, 41, 63, .14);
  color: #14161c;
  font-size: .95em; font-weight: 700; letter-spacing: -.012em;
  line-height: 1.2;
}
/* El logo de la catedra: un telefono, porque la materia es de moviles. Es un
   detalle de la lamina de ejemplo, no de la interfaz. */
.diapo .cinta .marca-catedra {
  display: grid; place-items: center;
  width: 2.1em; height: 2.6em;
  border: .16em solid #14161c; border-radius: .3em;
  color: #14161c; font-size: .62em; font-weight: 800; letter-spacing: .02em;
  flex-shrink: 0;
}
/* La unidad en gris y no en negro: es el dato de archivo de la lamina, no el
   titulo, y en versalitas apretadas a tinta plena pesaba mas que el nombre de
   la materia que tiene al lado. */
.diapo .cinta .unidad {
  margin-left: auto;
  color: rgba(20, 22, 28, .55);
  font-size: .72em; font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
  white-space: nowrap;
}
.diapo .cuerpo-diapo { flex: 1; padding: 1.3em 1.6em .9em; }
/* El antetitulo: la raya ocre y la unidad, arriba del titulo. Es lo que ordena
   una diapositiva suelta dentro de una materia. */
.diapo .antetitulo {
  display: flex; align-items: center; gap: .65em;
  margin: 0 0 .45em;
  color: #9a6b06;
  font-size: .7em; font-weight: 800; letter-spacing: .18em; text-transform: uppercase;
}
.diapo .antetitulo::before {
  content: ""; width: 2.2em; height: .22em; border-radius: 1em; background: #ca8a04;
}
.diapo h4 {
  margin: 0 0 1.05em;
  color: #12293f;
  font-size: 2.45em; font-weight: 800; letter-spacing: -.032em; line-height: 1.02;
}
.diapo .bloque + .bloque { margin-top: .85em; }
/* La definicion, recuadrada: es la frase que hay que saber, y en una lamina
   bien hecha esa frase no es un parrafo mas. La barra azul del canto la senala
   sin tapar nada, que es lo mismo que hace el marco de la app. */
.diapo .b1 {
  padding: .9em 1.15em;
  border-left: .3em solid #1d4468;
  border-radius: .12em .5em .5em .12em;
  background: linear-gradient(90deg, rgba(18, 41, 63, .085), rgba(18, 41, 63, .02));
  font-size: 1.06em;
}
.diapo .b1 b { color: #12293f; font-weight: 750; }
/* El renglon que presenta la lista, con la linea que corre hasta el borde. */
.diapo .b2 {
  display: flex; align-items: center; gap: .8em;
  margin-top: 1.15em;
  color: #12293f; font-size: .95em; font-weight: 700;
}
.diapo .b2::after { content: ""; flex: 1; height: 1px; background: rgba(18, 41, 63, .16); }
/* Los cinco puntos, en fichas numeradas de a dos. En columna eran cinco
   renglones con un punto adelante -la lista de siempre- y ademas se cortaban
   todos por la mitad en el recorte de la portada; de a dos, las de la derecha
   se leen enteras. */
.diapo .b3 { margin-top: .85em; }
.diapo .b3 ul {
  counter-reset: it;
  display: grid; grid-template-columns: 1fr 1fr; gap: .5em;
  margin: 0; padding: 0; list-style: none;
}
.diapo .b3 li {
  counter-increment: it;
  display: flex; align-items: baseline; gap: .6em;
  margin: 0;
  padding: .5em .75em;
  border: 1px solid rgba(18, 41, 63, .13);
  border-radius: .42em;
  background: rgba(18, 41, 63, .022);
  font-size: .93em;
}
/* El quinto no deja media fila vacia: se lleva la fila entera. */
.diapo .b3 li:last-child { grid-column: 1 / -1; }
.diapo .b3 li::before {
  content: counter(it, decimal-leading-zero);
  flex: 0 0 auto;
  padding: .18em .45em;
  border-radius: .3em;
  background: rgba(18, 41, 63, .08);
  color: #1d4468;
  font-size: .76em; font-weight: 800; letter-spacing: .03em;
}
/* El pie: de que clase es la lamina y en que pagina va. El numero coincide con
   el del reproductor, que esta en la 10 de 89. */
.diapo .pie {
  display: flex; align-items: center; gap: .8em;
  margin-top: auto;
  padding: .75em 1.6em .8em;
  border-top: 1px solid rgba(18, 41, 63, .12);
  color: rgba(18, 41, 63, .5);
  font-size: .66em; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
}
.diapo .pie .n { margin-left: auto; color: #12293f; font-weight: 800; }

/* El marco. Lo posiciona landing.js midiendo el bloque, igual que la app mide
   el bbox que le da PyMuPDF: ninguna posicion esta escrita a mano, asi que
   cambiar el texto de la lamina no desincroniza nada. Y crece hacia afuera
   -no hay relleno- porque cualquier velo sobre el papel estorba justo donde
   hay que leer.

   Va del azul, que es el color con el que la app arranca: el indicador se
   elige en ajustes y el que viene puesto de fabrica es este. Lo que el sitio
   muestra tiene que ser lo que se abre al instalar.

   El azul va escrito y no por var(--tono-azul) porque la diapositiva es papel
   blanco en los dos temas: el token se da vuelta con el tema del sitio y de
   noche entregaria el azul claro, que esta pensado para fondo negro y sobre
   papel queda desteñido. Este es el mismo azul que la app usa sobre blanco. */
.marco {
  position: absolute;
  left: 1.1em; right: 1.1em;
  top: 0; height: 0;
  border-radius: .55em;
  box-shadow: 0 0 0 .1em rgba(38,104,235,.95),
              0 0 0 .38em rgba(38,104,235,.18),
              0 .7em 1.9em rgba(25,75,165,.22);
  opacity: 0;
  transition: top .62s cubic-bezier(.32,.72,0,1), height .62s cubic-bezier(.32,.72,0,1), opacity .4s ease;
  pointer-events: none;
}
.marco.visible { opacity: 1; }

/* ---- la columna del guion ---- */

.app-guion { display: flex; flex-direction: column; min-width: 0; min-height: 0; }

/* El encabezado: el muneco, el documento, lo que falta y la X, todo sobre la
   columna del guion y alineado a la derecha, igual que en el visor. */
.app-top {
  display: flex; align-items: center; gap: .9em;
  padding-bottom: 3.4cqi;
  font-size: clamp(8px, 1.15cqi, 15px);
}
.app-top .cara { font-size: 2em; display: block; }

/* El arranque. Antes de que haya guion no hay nada que leer: lo unico que pasa
   es que el muneco piensa, grande, en el medio de la columna. El viaje hasta su
   hueco de arriba lo mide landing.js -es un transform, igual que en el visor-,
   asi que aca vive solo lo que se apaga mientras piensa. El hueco del muneco no
   se toca: estuvo reservado desde el principio, y por eso el nombre del
   documento no da ningun salto cuando la cara aterriza. */
.app-top .cara { position: relative; z-index: 2; }
.app-guion .guion-mock,
.app-guion .app-dock,
.app-guion .app-atajos,
.app-top .restante { transition: opacity .45s .45s var(--ease); }
/* Se revelan con retardo, cuando la cara ya casi aterrizo; se apagan sin el,
   porque al empezar no hay nada a que esperar. */
.app-guion.pensando .guion-mock,
.app-guion.pensando .app-dock,
.app-guion.pensando .app-atajos,
.app-guion.pensando .app-top .restante { opacity: 0; transition-delay: 0s; }
.app-top .doc { font-weight: 600; letter-spacing: -.012em; }
.app-top .restante { color: var(--muted); margin-left: auto; }
.app-top .x {
  display: grid; place-items: center;
  width: 2.2em; height: 2.2em;
  border: 1px solid var(--edge); border-radius: 999px;
  color: var(--text-2);
  flex-shrink: 0;
}
.app-top .x svg { width: 1.1em; height: 1.1em; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; }

/* La ventana por la que se ve el guion. Los dos extremos se desvanecen -con
   la misma mascara que el visor- asi que el texto no arranca ni termina de
   golpe: se entiende que arriba y abajo sigue habiendo explicacion. */
.guion-mock {
  flex: 1;
  min-height: 0;
  overflow: hidden;
  font-size: clamp(9px, 1.5cqi, 19.5px);
  line-height: 1.55;
  letter-spacing: -.011em;
  -webkit-mask-image: linear-gradient(to bottom, transparent, #000 16%, #000 74%, transparent);
  mask-image: linear-gradient(to bottom, transparent, #000 16%, #000 74%, transparent);
}
/* La pista que se desliza. La posicion la calcula landing.js midiendo el
   parrafo, igual que el visor scrollea el guion para centrar el que suena. */
.guion-pista {
  position: relative;
  display: flex; flex-direction: column; gap: 1.5em;
  transition: transform .62s cubic-bezier(.32,.72,0,1);
}
/* El parrafo que suena esta entero; los otros, apagados. Es exactamente lo que
   hace el guion del visor, y por eso se entiende sin leerlo. */
.guion-pista p { opacity: .26; transition: opacity .5s ease; }
.guion-pista p.activo { opacity: 1; }

.app-dock {
  display: flex; align-items: center; gap: .55em;
  margin-top: auto;
  padding: .45em;
  border: 1px solid var(--edge);
  border-radius: 999px;
  background: var(--glass-hi);
  -webkit-backdrop-filter: blur(20px);
  backdrop-filter: blur(20px);
  font-size: clamp(8px, 1.1cqi, 14px);
}
.app-dock .bt {
  display: grid; place-items: center;
  width: 2.3em; height: 2.3em;
  border-radius: 999px;
  color: var(--text-2);
  flex-shrink: 0;
}
.app-dock .bt svg { width: 1.3em; height: 1.3em; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.app-dock .bt.play { width: 2.75em; height: 2.75em; background: var(--solido); color: var(--sobre-solido); }
.app-dock .bt.play svg { fill: currentColor; stroke: none; width: 1em; height: 1em; }
.app-dock .pos { color: var(--muted); font-variant-numeric: tabular-nums; padding: 0 .35em; }
.app-dock .progreso { flex: 1; height: 2.5px; border-radius: 99px; background: var(--pista); overflow: hidden; }
.app-dock .progreso i { display: block; height: 100%; border-radius: 99px; background: var(--solido); animation: avanza 15s linear infinite; }
@keyframes avanza { from { width: 6%; } to { width: 92%; } }

.app-atajos {
  display: flex; justify-content: center; gap: .3em 1.15em;
  padding-top: 1.5em;
  color: var(--faint);
  font-size: clamp(7px, .95cqi, 12.5px);
}
.app-atajos span { display: flex; align-items: center; gap: .45em; }
/* La tecla va en un recuadro, como en el visor: es lo que la distingue de la
   palabra que la explica. */
.app-atajos kbd {
  min-width: 1.5em;
  padding: .1em .45em;
  border-radius: .45em;
  background: var(--glass-hi-2);
  color: var(--muted);
  font: inherit;
  text-align: center;
}

/* ================================================================ secciones */

.franja { padding: clamp(70px, 9vw, 130px) 0; }
/* No hay franja tintada: el fondo es uno solo y lo que separa es el aire. */
.ancho { max-width: var(--ancho); margin: 0 auto; padding: 0 var(--gutter); }
.ancho.angosto { max-width: 760px; }

/* ====================================================== la tira de laminas ==
   Nueve diapositivas de mentira en fila, corriendose a lo ancho mientras la
   seccion cruza la pantalla. Separa dos secciones sin poner una linea.

   Ninguna lamina sigue el tema del sitio: son laminas de otra gente, hechas en
   otro programa, con la paleta y la tipografia que eligio esa catedra. Por eso
   sus colores estan escritos y no salen de los tokens, y por eso no se dan
   vuelta de noche: lo que se da vuelta es el papel de abajo, no lo que hay
   apoyado encima.

   Todo lo de adentro se mide en cqw, o sea en porcentaje del ancho de la
   lamina: asi la lamina escala entera -cuerpo, margenes y dibujos- igual que
   una diapositiva proyectada mas grande, y una sola medida vale para el
   telefono y para el monitor. */
/* La fila no es plana: esta apoyada sobre un cilindro que envuelve al que
   mira. La lamina del medio es la pared del fondo y las de las puntas son las
   que se le vienen encima, asi que las puntas se ven mas grandes y giradas,
   como una calesita vista desde adentro. La curva la arma el JS lamina por
   lamina, porque depende de donde esta cada una en la pantalla y eso cambia
   con cada pixel de scroll; lo unico que pone el CSS es el ojo.
   En el telefono no hay cilindro y este ojo no se usa: donde entra una sola
   lamina en pantalla la fila se corre plana, porque el paso entre lamina y
   lamina pasa el tope de giro y el barril se rompe. Esta escrito en landing.js,
   que es donde esta la cuenta. */
/* La perspectiva es corta a proposito: cuanto mas cerca el ojo, mas diferencia
   de tamano entre la lamina del fondo y la que se viene encima. Y el padding
   deja lugar para que la lamina agrandada del borde no la corte el recorte de
   la tira. */
.tira { overflow: hidden; padding: clamp(58px, 8.5vw, 116px) 0; perspective: 900px; }
.tira-pista {
  display: flex; width: max-content;
  gap: clamp(12px, 1.4vw, 22px);
  transform-style: preserve-3d;
  /* El JS escribe el transform. Sin JS queda en cero: pegada a la izquierda. */
  will-change: transform;
}
.lamina {
  container-type: inline-size;
  flex: 0 0 auto;
  width: clamp(272px, 34vw, 540px);
  backface-visibility: hidden;
  aspect-ratio: 16 / 9;
  position: relative;
  border-radius: 10px;
  overflow: hidden;
  line-height: 1.3;
  /* El aro hace de filo sobre el papel blanco, donde una lamina blanca se
     confundiria con el fondo; la sombra la despega en los dos temas. */
  box-shadow: 0 0 0 1px rgba(17, 17, 19, .1), 0 8px 26px rgba(0, 0, 0, .16);
}
/* El margen va en esta caja de adentro y no en la lamina: un contenedor no se
   puede consultar a si mismo, asi que un cqw escrito en la lamina se mide
   contra el viewport y no contra la lamina. Adentro, en cambio, el cqw es lo
   que se espera: un uno por ciento del ancho de la lamina. */
.lamina .dentro { height: 100%; padding: 8.6cqw; }
/* Lo primero no lleva margen arriba: el aire de arriba lo pone el relleno de la
   caja. La catedra es un <p> y se llevaba puesto el margen de todos los
   parrafos, asi que las nueve laminas empezaban 2.8cqw mas abajo de lo que
   dice el relleno y terminaban esos mismos 2.8cqw mas cerca del folio, que es
   el unico renglon que no se puede correr porque esta clavado a la esquina. */
.lamina .dentro > :first-child { margin-top: 0; }
.lamina .catedra { font-size: 2.9cqw; letter-spacing: .02em; opacity: .6; }
.lamina h4 { margin-top: 1.6cqw; font-size: 6.2cqw; font-weight: 600; letter-spacing: -.02em; line-height: 1.06; }
.lamina p { margin-top: 2.8cqw; font-size: 2.9cqw; line-height: 1.5; }
.lamina ul, .lamina ol { margin-top: 2.8cqw; padding-left: 4cqw; font-size: 2.9cqw; line-height: 1.62; }
.lamina li { list-style: disc; }
.lamina .aclara { opacity: .65; }
/* El cuerpo partido: el texto a la izquierda y el dibujo a la derecha, que es
   como sale una lamina cuando el que la hizo tenia una figura para pegar. */
.lamina .partido { display: flex; align-items: flex-start; gap: 4cqw; }
.lamina .partido > div:first-child { flex: 1; }
/* El numerito de la esquina: ninguna lamina de catedra no lo tiene. */
.lamina .folio { position: absolute; right: 7cqw; bottom: 5.5cqw; font-size: 2.8cqw; opacity: .38; }
.lamina .pie-lamina { position: absolute; left: 8.6cqw; bottom: 5.5cqw; margin: 0; font-size: 2.5cqw; opacity: .5; }
/* El renglon de abajo de todo, el que cierra la lamina. */
.lamina .remate { margin-top: 2.4cqw; font-size: 2.7cqw; opacity: .8; }

/* --- 1. algebra: el apunte blanco, con la figura al costado --- */
.l-algebra { background: #fbfbfa; color: #17181c; font-family: var(--serif); }
/* El unico titulo de las nueve que no entra en un renglon: «Autovalores y
   autovectores» entra, «Eigenvalues and eigenvectors» pide 237 de los 225 que
   hay. Y esta lamina es ademas la mas cargada -catedra, titulo, texto, formula
   y el partido con la matriz-, asi que el segundo renglon le empujaba la matriz
   encima del folio y los numeros terminaban uno sobre otro. Un cuerpo mas chico
   lo devuelve a un renglon con un 5% de sobra, que es lo que hace falta para que
   retocar el texto no lo vuelva a partir. Va aca y no en la medida general
   porque las otras ocho entran holgadas en los dos idiomas. */
.l-algebra h4 { font-size: 5.6cqw; }
.l-algebra .formula { margin-top: 2.4cqw; font-size: 4.4cqw; }
.l-algebra .matriz {
  display: grid; grid-template-columns: repeat(2, 4.4cqw); gap: .3cqw;
  margin-top: 1.4cqw; padding-left: 2.4cqw;
  font-family: ui-monospace, Menlo, monospace; font-size: 2.9cqw;
  border-left: .6cqw solid #17181c;
}

/* --- 2. historia: la catedra que usa fondo azul y bordo dorado --- */
.l-historia { background: #10243d; color: #f0e7d8; font-family: "Iowan Old Style", Palatino, var(--serif); }
.l-historia ul { margin-top: 2.4cqw; font-size: 2.8cqw; line-height: 1.62; }
/* La linea arranca 2.4cqw arriba del renglon de los anios, asi que el margen
   de arriba tiene que dejarle ese lugar o se le monta a la ultima vinieta. */
.l-historia .tiempo { position: relative; display: flex; justify-content: space-between; margin-top: 4.4cqw; font-size: 2.4cqw; }
.l-historia .tiempo i { position: absolute; left: 0; right: 0; top: -2.4cqw; height: .4cqw; background: #c8a24a; }
.l-historia .tiempo span::before {
  content: ""; position: absolute; top: -3.2cqw; left: 50%; transform: translateX(-50%);
  width: 2cqw; height: 2cqw; border-radius: 50%; background: #c8a24a;
}
.l-historia .tiempo span { position: relative; }

/* --- 3. quimica: la prolija, verde agua y palo seco --- */
.l-quimica { background: #b6dcc0; color: #1f3a2c; font-family: Futura, "Avenir Next", system-ui, sans-serif; }
.l-quimica .chips { display: flex; flex-wrap: wrap; gap: 1.4cqw; margin-top: 2.8cqw; }
.l-quimica .chips span { padding: 1.2cqw 2.4cqw; border-radius: 99px; background: #9fcaab; font-size: 2.9cqw; }
/* El anillo se sale por abajo a proposito y lo corta el borde de la lamina,
   como la figura que el que armo la diapositiva pego mas grande que la caja. */
.l-quimica .anillo {
  position: absolute; right: 6cqw; bottom: -5cqw;
  width: 20cqw; aspect-ratio: 1; background: rgba(31, 58, 44, .12);
  clip-path: polygon(50% 0, 93% 25%, 93% 75%, 50% 100%, 7% 75%, 7% 25%);
}

/* --- 4. economia: la que grita, amarilla y en negrita --- */
.l-economia { background: #ffd60a; color: #101014; font-family: "Helvetica Neue", Helvetica, system-ui, sans-serif; }
.l-economia h4 { font-weight: 700; }
.l-economia .numerote { margin-top: 1.4cqw; font-size: 12cqw; font-weight: 700; letter-spacing: -.05em; line-height: .95; }
.l-economia .aclara { margin-top: .6cqw; }
.l-economia ul { margin-top: 2.6cqw; flex: 1; }
/* Las barras van en la fila y no sueltas en la esquina: sueltas se le montan
   a la ultima vinieta de la lista, que termina justo ahi. */
.l-economia .barras { flex: 0 0 auto; align-self: flex-end; display: flex; align-items: flex-end; gap: 1.2cqw; height: 14cqw; }
.l-economia .barras i { width: 2.8cqw; background: #101014; }
.l-economia .barras i:nth-child(1) { height: 34%; }
.l-economia .barras i:nth-child(2) { height: 58%; }
.l-economia .barras i:nth-child(3) { height: 100%; }
.l-economia .barras i:nth-child(4) { height: 46%; }

/* --- 5. codigo: la captura de la terminal pegada en la lamina --- */
.l-codigo { background: #14151a; color: #e6e6ea; font-family: ui-monospace, Menlo, monospace; }
.l-codigo h4 { font-weight: 500; letter-spacing: -.01em; }
.l-codigo .codigo { margin-top: 2.4cqw; font-size: 2.7cqw; line-height: 1.55; }
/* El pre va renglon por renglon: en el bloque, los saltos de linea del HTML
   entre un <p> y el siguiente contarian como renglones en blanco. */
.l-codigo .codigo p { margin: 0; font-size: inherit; line-height: inherit; white-space: pre; }
.l-codigo .codigo b { color: #c792ea; font-weight: 400; }
.l-codigo .codigo .com { color: #6f7280; }

/* --- 6. derecho: todo texto, cuerpo chico y una frase resaltada --- */
.l-derecho { background: #fff; color: #1a1a1c; font-family: Baskerville, "Times New Roman", var(--serif); }
.l-derecho .parrafo { margin-top: 2.4cqw; font-size: 2.7cqw; line-height: 1.58; text-align: justify; }
.l-derecho .parrafo b { background: #fff2a8; font-weight: inherit; box-decoration-break: clone; }
.l-derecho .margen { margin-top: 1.6cqw; padding-left: 2.2cqw; border-left: .4cqw solid rgba(26, 26, 28, .2); font-size: 2.4cqw; opacity: .7; }

/* --- 7. psicologia: el diagrama de cajitas y flechas --- */
.l-psico { background: #e9e4f7; color: #2b2450; font-family: "Avenir Next", Avenir, system-ui, sans-serif; }
.l-psico .flujo { display: flex; align-items: center; gap: 1.2cqw; margin-top: 2.8cqw; font-size: 2.5cqw; }
.l-psico .flujo span { padding: 1.3cqw 1.8cqw; border-radius: 1.4cqw; background: #fff; box-shadow: 0 .4cqw 1.2cqw rgba(43, 36, 80, .12); }
.l-psico .flujo i { width: 3cqw; height: .4cqw; background: #8479c4; }
.l-psico ul { margin-top: 2.2cqw; }

/* --- 8. arquitectura: la planta dibujada con lineas y su referencia --- */
.l-plano { background: #ececeb; color: #2a2a2c; font-family: "Avenir Next", system-ui, sans-serif; font-weight: 300; }
.l-plano h4 { font-weight: 400; }
.l-plano .con-plano { display: flex; align-items: flex-start; gap: 3.4cqw; margin-top: 1.4cqw; }
.l-plano .plano {
  position: relative; flex: 1; height: 13.5cqw;
  border: .4cqw solid #2a2a2c;
  background:
    repeating-linear-gradient(to right, rgba(42,42,44,.16) 0 .3cqw, transparent .3cqw 6cqw),
    repeating-linear-gradient(to bottom, rgba(42,42,44,.16) 0 .3cqw, transparent .3cqw 6cqw);
}
.l-plano .plano i { position: absolute; background: #2a2a2c; }
.l-plano .plano i:nth-child(1) { left: 34%; top: 0; bottom: 38%; width: .4cqw; }
.l-plano .plano i:nth-child(2) { left: 34%; right: 0; bottom: 38%; height: .4cqw; }
.l-plano .leyenda { flex: 0 0 24%; margin-top: 0; padding-left: 3.4cqw; font-size: 2.5cqw; line-height: 1.5; }
.l-plano .leyenda li { list-style: decimal; }

/* --- 9. la foto del pizarron, que tambien es una lamina --- */
.l-pizarron { background: #24382f; color: #eef0e6; font-family: "Chalkboard SE", "Comic Sans MS", system-ui, sans-serif; }
.l-pizarron .tiza { margin-top: 3.4cqw; font-size: 4.4cqw; }
.l-pizarron .tiza.chica { margin-top: .8cqw; font-size: 3.2cqw; opacity: .8; }
.l-pizarron .eje { position: absolute; right: 7cqw; bottom: 7cqw; width: 22cqw; height: 9cqw; border-left: .5cqw solid rgba(238, 240, 230, .5); border-bottom: .5cqw dashed rgba(238, 240, 230, .5); }

/* Las laminas oscuras no tienen filo negro que las despegue del papel negro:
   el aro se les da vuelta. */
.l-historia, .l-codigo, .l-pizarron { box-shadow: 0 0 0 1px rgba(245, 245, 247, .12), 0 8px 26px rgba(0, 0, 0, .3); }

/* ------------------------------------------------------------- el claro --- */
/* El respiro despues de la tira: una frase en el medio, aire alrededor y nada
   mas. La pagina viene de nueve laminas seguidas, y lo que sigue es una
   seccion de producto: si esto tambien fuera una grilla, la frase se leeria
   como un titulo de seccion y no como lo que es, que es el motivo por el que
   alguien se baja la app.

   Todo lo que flota alrededor esta puesto LEJOS del texto: el ancho de la
   columna de lectura es fijo y las cosas viven en el margen que sobra, no
   encima. Por eso desaparecen en cuanto ese margen se termina; lo que no puede
   desaparecer es la frase. */
.claro {
  position: relative;
  /* Abajo hay mas aire que arriba, y no es un capricho de composicion: ahi vive
     la ficha del medio, que va suelta bastante mas abajo del ultimo renglon. Si
     el hueco fuera igual de los dos lados, la ficha quedaria pegada a la bajada
     o colgando dentro de la seccion de abajo. */
  padding: clamp(30px, 5vw, 76px) 0 clamp(120px, 14vw, 200px);
  text-align: center;
}
/* La columna de lectura: en ch y no en px, que es como se mide un renglon.
   Alrededor de 46 caracteres es la linea corta de una bajada centrada; mas
   larga obliga a barrer la vista de punta a punta y deja de leerse como una
   frase suelta. */
.claro .bajada {
  max-width: 46ch;
  margin: clamp(20px, 2.6vw, 32px) auto 0;
  color: var(--tinta-2);
  font-size: 17px; line-height: 1.6;
}

/* ---- lo que flota, flotando ---- */
/* Mientras la seccion cruza la pantalla, cada objeto se corre un poco: los de
   adelante pasan mas rapido que el papel donde esta escrita la frase, que es
   lo unico que hace falta para que dejen de ser un dibujo pegado al fondo y
   pasen a estar EN el aire, que es de lo que habla la seccion. Cuanto viaja
   cada uno lo reparte landing.js; aca esta de que manera.

   Va en translate y no en el transform: el transform de cada uno ya lleva su
   giro, su escala y el arrastre, y ademas tiene la transicion de .62s con la
   que vuelve al soltarlo. Escribiendo ahi, el corrimiento del scroll saldria
   con medio segundo de atraso y los objetos irian persiguiendo a la pagina.
   translate es una propiedad aparte, no la toca esa transicion, se aplica
   ANTES del transform -asi que el giro no lo desvia- y es en el eje de la
   pantalla, igual que el arrastre. */
.claro .rayo,
.claro .papelito,
.claro .ficha { translate: 0 var(--vuelo, 0px); }

/* ---- el rayo ---- */
/* El unico objeto macizo de la pagina, y es a proposito: la carpeta y el
   candado son de vidrio porque lo que dicen es que algo esta guardado y a la
   vista; este dice otra cosa -que la cosa va rapido- y para eso tiene que
   pesar. El volumen sale del canto, que es la misma silueta corrida abajo y a
   la derecha: asoma por dos lados y no por los cuatro, asi que la luz sigue
   entrando por arriba a la izquierda como en toda la interfaz.

   El trazo grueso con union redonda no es un contorno: es lo que le saca las
   puntas en punta a la silueta y la deja con el filo gordo del dibujo. */
.claro .rayo {
  position: absolute;
  top: 2%; left: 7%;
  width: clamp(58px, 6vw, 88px); height: auto;
  transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(-7deg) scale(var(--aesc, 1));
  filter: drop-shadow(0 16px 26px rgba(17, 17, 19, .3));
}
.claro .rayo .r-cara,
.claro .rayo .r-canto {
  stroke-width: 5;
  stroke-linejoin: round;
  stroke-linecap: round;
}
.claro .rayo .r-cara  { fill: url(#r-g-cara);  stroke: url(#r-g-cara); }
.claro .rayo .r-canto { fill: url(#r-g-canto); stroke: url(#r-g-canto); }

/* El amarillo va literal y no por variable, igual que el del post-it: es el
   color de un objeto, no el del resaltador. */
.claro .rayo .s-r-cara-1  { stop-color: #ffdd6b; }
.claro .rayo .s-r-cara-2  { stop-color: #fcc93f; }
.claro .rayo .s-r-cara-3  { stop-color: #f0b41f; }
.claro .rayo .s-r-canto-1 { stop-color: #d99b12; }
.claro .rayo .s-r-canto-2 { stop-color: #c0840a; }

/* El filo de arriba: la linea donde se corta el material, no un brillo. */
.claro .rayo .r-luz {
  fill: none;
  stroke: #fff; stroke-opacity: .5;
  stroke-width: 3; stroke-linecap: round;
}

/* ---- los dos post-it ---- */
/* Se llaman papelito y no nota porque .nota ya es la tarjeta del blog, y esa
   tiene su propio hover: con el nombre compartido, pasar el mouse por encima
   les apagaba el papel.

   No son papel: son filmina. El de "la 41 no la entendi" es un post-it opaco
   apoyado sobre una tarjeta clara, y el mismo amarillo macizo sobre papel
   negro es un cartel encendido en el medio de la pagina. Estos son la lamina
   traslucida que el nombre del producto promete: el color va en el TEXTO, que
   es lo unico que tiene que leerse, y el fondo es el mismo color bajado de
   opacidad -no de saturacion- hasta que lo negro de atras pasa por delante.

   Lo demas es lo de siempre: degrade en vez de tinte plano, el canto de luz
   arriba, el lustre en diagonal y el desenfoque de lo que hay detras, que aca
   si tiene sentido porque una filmina se pone ENCIMA de algo.

   Dos colores y no uno porque son dos anotaciones de dos momentos distintos, y
   nadie escribe las dos en el mismo papelito. Son dos de los tres del
   resaltador -ambar y violeta-; el azul se lo queda la carpeta, que es el otro
   objeto de la pagina y esta a media pantalla de distancia. */
.claro .papelito {
  position: absolute;
  z-index: 2;
  width: clamp(104px, 10.5vw, 134px);
  min-height: clamp(104px, 10.5vw, 134px);
  margin: 0;
  padding: 18px 16px;
  display: grid; align-content: center;
  overflow: hidden;
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: 14px;
  -webkit-backdrop-filter: saturate(150%) blur(12px);
  backdrop-filter: saturate(150%) blur(12px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .26),
              0 16px 30px rgba(0, 0, 0, .45);
  font-family: var(--serif); font-style: italic;
  font-size: clamp(14px, 1.3vw, 16.5px); line-height: 1.3; letter-spacing: -.01em;
}
/* El lustre: la misma banda diagonal de la carpeta, aca con un gradiente
   porque es un elemento y no un <svg>. Mas flojo que en el vidrio opaco: sobre
   una lamina traslucida, el reflejo tapa lo que la lamina deja pasar.

   Las bandas no pueden ser dos iguales, que es lo que se veia antes: dos
   franjas del mismo ancho y con el mismo corte no son un reflejo, son un
   rayado. Un vidrio devuelve la fuente una sola vez, asi que aca hay una sola
   banda y lo que la acompana no es otra banda:

   - la FUENTE. Ancha, la mas clara, y con los dos bordes desvanecidos: la luz
     no tiene filo, lo que tiene filo es el vidrio.
   - un ALIENTO que ocupa toda la esquina de abajo y casi no se ve. No es un
     reflejo: es el grosor del material iluminandose entero.

   No lleva el hilo de corte duro que tuvo un rato en el medio: por angosto y
   apagado que fuera, seguia siendo una raya, y una raya al lado del reflejo
   lo devuelve al rayado del que venia.

   El angulo va por variable porque los dos papelitos estan rotados distinto y
   la fuente de luz es una sola: si los dos llevaran 112deg propios, cada uno
   reflejaria su propia lampara. El angulo de cada uno compensa su rotacion
   para que las bandas caigan paralelas en la pantalla. */
.claro .papelito::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(var(--lustre, 112deg),
    transparent 0 5%,
    rgba(255, 255, 255, .03) 8%,
    rgba(255, 255, 255, .17) 14%,
    rgba(255, 255, 255, .19) 19%,
    rgba(255, 255, 255, .04) 26%,
    transparent 30% 63%,
    rgba(255, 255, 255, .028) 74%,
    rgba(255, 255, 255, .038) 100%);
  pointer-events: none;
}
.claro .papelito-1 {
  top: -1%; right: 4%;
  background: linear-gradient(162deg,
    rgba(255, 224, 92, .22), rgba(255, 216, 61, .12) 55%, rgba(246, 205, 40, .17));
  color: #ffdf7a;
  --lustre: 107.5deg;
  transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(4.5deg) scale(var(--aesc, 1));
}
/* Sube y se corre a la derecha, pero no con un left fijo: el parrafo esta
   centrado y al angostar la ventana se le viene encima al papelito. Anclado al
   centro, el borde derecho del papelito queda siempre a la misma distancia de
   la columna de texto, la ventana mida lo que mida. */
.claro .papelito-2 {
  bottom: 4%; right: calc(50% + 352px);
  background: linear-gradient(162deg,
    rgba(var(--tono-violeta), .26), rgba(var(--tono-violeta), .13) 55%, rgba(var(--tono-violeta), .19));
  color: rgb(var(--tono-violeta));
  --lustre: 117.5deg;
  transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(-5.5deg) scale(var(--aesc, 1));
}

/* ---- las tres fichas ---- */
/* Vidrio de verdad, del tamano de una etiqueta: no un rectangulo gris con
   opacidad, que es en lo que termina una pastilla a la que se le pone un
   fondo plano y nada mas. Lleva las cuatro cosas que hacen el material en el
   resto del sitio, y ninguna sobra:

   - el RELLENO es un degrade y no un tinte: sobre papel negro la pelicula es
     LUZ, asi que hay mas arriba, donde le pega, y menos abajo.
   - el CANTO de luz de adentro -el inset de arriba- es el filo del vidrio.
     Sin el, la pastilla es un recorte; con el, tiene espesor.
   - el LUSTRE en diagonal, la misma banda que llevan la carpeta y los
     post-it. Es el reflejo de una fuente que no se ve.
   - el DESENFOQUE de lo que pasa por detras, que es lo unico que un vidrio
     hace y una opacidad no.

   Las tres dicen algo que la pagina ya dijo en otro lado: ninguna trae un
   numero nuevo. */
.claro .ficha {
  position: absolute;
  z-index: 1;
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 16px 9px 13px;
  overflow: hidden;
  white-space: nowrap;
  border: 1px solid var(--linea);
  border-radius: 999px;
  background: linear-gradient(152deg, rgba(255, 255, 255, .78), rgba(255, 255, 255, .5));
  -webkit-backdrop-filter: saturate(180%) blur(18px);
  backdrop-filter: saturate(180%) blur(18px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .9),
              0 10px 24px rgba(17, 17, 19, .14);
  color: var(--tinta-2);
  font-size: clamp(12.5px, 1.15vw, 14px); letter-spacing: -.008em;
}
/* El lustre, dibujado con un gradiente porque la ficha es un elemento y no un
   <svg>. Va cortado por el radio del borde, que es lo que lo deja pasar de
   canto a canto sin salirse de la pastilla. */
.claro .ficha::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(108deg,
    rgba(255, 255, 255, .22) 0 14%, transparent 14.5% 30%,
    rgba(255, 255, 255, .12) 30.5% 36%, transparent 36.5%);
  pointer-events: none;
}
.claro .ficha .ico {
  width: 16px; height: 16px; flex-shrink: 0;
  stroke: currentColor; fill: none;
  stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round;
  opacity: .8;
}

/* Sobre papel negro el vidrio se da vuelta: la pelicula pasa a ser luz y el
   canto de arriba es lo unico que la separa del fondo. */
:root[data-tema="oscuro"] .claro .ficha {
  border-color: rgba(255, 255, 255, .15);
  background: linear-gradient(152deg,
    rgba(255, 255, 255, .15), rgba(255, 255, 255, .05) 48%, rgba(255, 255, 255, .09));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .3),
              inset 0 -1px 0 rgba(255, 255, 255, .05),
              0 12px 28px rgba(0, 0, 0, .5);
  color: rgba(245, 245, 247, .88);
}

/* El translate va ADELANTE del giro, como en todos los objetos que se
   levantan: el arrastre entra por --ax/--ay y tiene que ser en el eje de la
   pantalla, que es el del cursor, no en el de la pastilla torcida. */
.claro .ficha-1 { top: 44%;   left: 0;     transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(-3deg)  scale(var(--aesc, 1)); }
/* La del medio va abajo y centrada: es la que dice lo que hace el producto, no
   un dato al costado, y ahi cierra la frase en vez de acompanarla. El -50% de
   su propio ancho viaja dentro del mismo translate que el arrastre, o el
   centrado se pierde apenas alguien la levanta. */
.claro .ficha-2 { bottom: 2%;  left: 50%;   transform: translate(calc(-50% + var(--ax, 0px)), var(--ay, 0px)) rotate(2.5deg) scale(var(--aesc, 1)); }
/* Esta se cuelga de arriba y no de abajo: el hueco de abajo lo manda la ficha
   del medio, y anclada ahi se iba siguiendola en vez de quedarse al lado del
   ultimo renglon, que es de lo que habla. */
.claro .ficha-3 { top: 68%;   right: 8%;   transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(-2deg)  scale(var(--aesc, 1)); }

/* Cuando el margen que sobra a los costados se termina, se va todo lo que
   vive en ese margen: apretar los objetos contra la frase es peor que no
   tenerlos. El rayo se queda porque es el unico que puede ponerse arriba del
   titulo sin robarle la linea. */
@media (max-width: 1020px) {
  .claro .papelito, .claro .ficha { display: none; }
  /* Sin la ficha del medio no hay nada que sostener ese hueco: vuelve a ser el
     mismo aire que arriba. */
  .claro { padding-bottom: clamp(30px, 5vw, 76px); }
  .claro .rayo {
    position: static;
    display: block;
    /* Ya no flota al costado: es un icono arriba del titulo, y un icono que
       cabecea con el scroll es un icono que no se queda quieto. */
    translate: none;
    width: clamp(44px, 9vw, 62px);
    margin: 0 auto clamp(20px, 4vw, 30px);
  }
}

/* Encabezado de seccion partido en dos: el titulo a la izquierda y la
   explicacion a la derecha, separados por un pelo de linea. */
.dupla {
  display: grid; grid-template-columns: 1fr 1fr; gap: 40px;
  padding-top: 26px;
  border-top: 1px solid var(--linea);
}
.dupla h3 { font-family: var(--serif); font-size: clamp(22px, 2.4vw, 31px); font-weight: 500; letter-spacing: -.02em; line-height: 1.12; }
.dupla p { color: var(--tinta-2); font-size: 16.5px; line-height: 1.5; }

/* ---- el dibujo que acompana a cada afirmacion ---- */
/* Sobre cada dupla de "No es un lector en voz alta" aparece, al lado del
   puntero, el dibujo de lo que esa linea dice. Las cuatro afirmaciones son
   sobre cosas que se MUEVEN: el visto que cae, el marco que se desliza, la
   palabra que aparece, la boca que habla. Ninguna se entiende igual quieta.

   La flecha del sistema NO se apaga, al reves que en la marca del pie. Alla el
   cursor es el que dice que se puede apretar y por eso se lo puede cambiar;
   aca abajo hay texto que se lee y se selecciona, y quedarse sin puntero
   encima de un parrafo es perder la herramienta justo donde hace falta. El
   dibujo va al lado, como algo que la mano lleva.

   Los dibujos no son ilustraciones: son las mismas piezas de la app dibujadas
   chiquitas, con el mismo vidrio y la misma tinta. El unico color es el azul
   del marco, que es del producto.

   El marcado esta al final de la pagina, afuera de la seccion, junto con la
   flecha del pie y por la misma razon.

   Nada de esto existe sin puntero fino ni con reduced-motion: ahi no hay hover,
   o hay alguien que pidio que las cosas se queden quietas. El texto se lee
   igual en los dos casos. */

/* La caja de afuera es la que el JS mueve en cada cuadro: sin transicion, la
   suavidad la pone el bucle. La de adentro es la que aparece. */
.dupla-pieza {
  position: fixed;
  top: 0; left: 0;
  z-index: 70;
  pointer-events: none;
  will-change: transform;
}

/* La pieza nace en la punta del puntero y cae abajo a la derecha: es el unico
   lado libre, porque el puntero sigue ahi y la mano tapa el otro. El titulo y
   el parrafo de los que habla quedan a la vista mientras el dibujo se mueve por
   encima. */
.pieza {
  position: absolute;
  left: 26px; top: 22px;
  width: 248px;
  margin: 0;
  padding: 18px;
  border: 1px solid var(--edge);
  border-radius: 22px;
  background: var(--vidrio-papel);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--sombra-lg), var(--canto);
  color: var(--tinta);
  /* Se esconde con visibility y no con display porque una caja que acaba de
     aparecer no transiciona: el navegador no tiene un estado anterior desde el
     cual salir y la pieza aparecia de golpe, ya crecida. */
  visibility: hidden;
  opacity: 0;
  transform: scale(.7);
  transform-origin: -26px -22px;
  transition: opacity .2s var(--ease), transform .42s var(--ease), visibility 0s .42s;
}
.dupla-pieza.viva .pieza.viva {
  visibility: visible;
  opacity: 1;
  transform: scale(1);
  transition: opacity .22s var(--ease), transform .46s var(--resorte), visibility 0s;
}

/* ---- explica, no lee ---- */
/* Los bloques de la diapositiva y el visto cayendo en cada uno, uno atras del
   otro. Lo que hay que ver es que no queda ninguno sin marcar: eso es la
   comprobacion por codigo, y es lo que separa "casi siempre lo explica" de
   "esta explicado". */
.cob { display: grid; gap: 13px; }
.cob-fila { display: flex; align-items: center; gap: 14px; }
.cob-texto { height: 7px; border-radius: 4px; background: currentColor; opacity: .18; }
/* Renglones de largos distintos: cuatro barras iguales son una grilla, no un
   texto. */
.cob-fila:nth-child(1) .cob-texto { width: 80%; }
.cob-fila:nth-child(2) .cob-texto { width: 62%; }
.cob-fila:nth-child(3) .cob-texto { width: 88%; }
.cob-fila:nth-child(4) .cob-texto { width: 70%; }
.cob-tic {
  width: 18px; height: 18px;
  flex-shrink: 0; margin-left: auto;
}
.cob-tic path {
  fill: none;
  stroke: currentColor; stroke-width: 2.1;
  stroke-linecap: round; stroke-linejoin: round;
  /* El visto se DIBUJA, no aparece: el trazo entero mide 17 y arranca corrido
     esos 17, asi que lo que se ve es la punta avanzando. */
  stroke-dasharray: 17; stroke-dashoffset: 17;
}
.pieza.viva .cob-tic path { animation: cob-tic 3.4s var(--ease) infinite; }
.pieza.viva .cob-texto { animation: cob-texto 3.4s var(--ease) infinite; }
.cob-fila:nth-child(2) .cob-texto, .pieza .cob-fila:nth-child(2) .cob-tic path { animation-delay: .26s; }
.cob-fila:nth-child(3) .cob-texto, .pieza .cob-fila:nth-child(3) .cob-tic path { animation-delay: .52s; }
.cob-fila:nth-child(4) .cob-texto, .pieza .cob-fila:nth-child(4) .cob-tic path { animation-delay: .78s; }
@keyframes cob-tic {
  0%, 4% { stroke-dashoffset: 17; }
  16%, 86% { stroke-dashoffset: 0; }
  96%, 100% { stroke-dashoffset: 17; }
}
/* El bloque marcado se enciende un poco: pasa de ser texto que esta ahi a ser
   texto del que ya se hablo. */
@keyframes cob-texto {
  0%, 4% { opacity: .18; }
  16%, 86% { opacity: .56; }
  96%, 100% { opacity: .18; }
}

/* ---- enmarca, no tapa ---- */
/* El marco del visor rodeando un bloque y deslizandose al siguiente, con la
   misma receta de sombras que el de la app dibujada, a escala, y del mismo
   azul: es el mismo indicador, y dibujarlo de dos colores en la misma pagina
   lo convertiria en dos cosas. Aca si va por token -no escrito como en la
   lamina- porque este dibujo no esta sobre papel blanco sino sobre el vidrio
   de la pagina, que cambia con el tema. El texto de
   abajo NO se apaga cuando el marco se va: si se apagara, el dibujo estaria
   diciendo justo lo contrario del titulo. */
.mar {
  position: relative;
  display: grid; gap: 14px;
  padding: 16px 15px;
  border: 1px solid var(--linea-fina);
  border-radius: 13px;
  background: var(--glass-hi);
}
.mar-bloque { display: grid; gap: 7px; }
.mar-bloque span { height: 7px; border-radius: 4px; background: currentColor; opacity: .3; }
.mar-bloque span:last-child { width: 68%; }
/* Las tres paradas del marco salen de la grilla de arriba y no de la nada:
   bloque de dos renglones = 7 + 7 + 7 de aire = 21, bloque de uno = 7, y 14
   entre bloque y bloque, desde los 16 del padding. Con cinco de aire para cada
   lado, que es lo que lo vuelve un marco y no un subrayado. */
.mar-marco {
  position: absolute;
  left: 9px; right: 9px;
  top: 11px; height: 31px;
  border-radius: 8px;
  box-shadow: 0 0 0 2px rgba(var(--tono-azul), .95),
              0 0 0 6px rgba(var(--tono-azul), .16),
              0 9px 20px rgba(25,75,165,.24);
}
.pieza.viva .mar-marco { animation: mar-mover 5.4s var(--ease) infinite; }
@keyframes mar-mover {
  0%, 20%   { top: 11px; height: 31px; }
  30%, 50%  { top: 46px; height: 17px; }
  60%, 82%  { top: 67px; height: 31px; }
  92%, 100% { top: 11px; height: 31px; }
}

/* ---- la matematica, en palabras ---- */
/* Arriba lo que esta escrito en la lamina y abajo lo que se escucha, que
   aparece palabra por palabra al ritmo en que se dice. Las comillas estan desde
   el principio: la frase se esta llenando adentro de algo que ya se sabe que es
   una cita hablada. */
.pieza[data-pieza="mates"] { text-align: center; }
.mat-signo {
  display: block;
  font-family: var(--serif);
  font-size: 29px; font-weight: 500; letter-spacing: -.012em; line-height: 1;
}
.mat-baja {
  display: block;
  width: 17px; height: 20px;
  margin: 12px auto 11px;
  fill: none;
  stroke: currentColor; stroke-width: 1.5;
  stroke-linecap: round; stroke-linejoin: round;
  opacity: .3;
}
.mat-dicho {
  display: block;
  color: var(--tinta-2);
  font-size: 15.5px; letter-spacing: -.008em; line-height: 1.25;
}
.mat-dicho i { font-style: normal; opacity: 0; }
.pieza.viva .mat-dicho i {
  animation: mat-decir 3.6s var(--ease) infinite;
  display: inline-block;
}
.mat-dicho i:nth-of-type(2) { animation-delay: .13s; }
.mat-dicho i:nth-of-type(3) { animation-delay: .26s; }
.mat-dicho i:nth-of-type(4) { animation-delay: .39s; }
.mat-dicho i:nth-of-type(5) { animation-delay: .52s; }
@keyframes mat-decir {
  0%, 6% { opacity: 0; transform: translateY(3px); }
  18%, 86% { opacity: 1; transform: none; }
  96%, 100% { opacity: 0; transform: translateY(3px); }
}

/* ---- sin muletillas de locutor ---- */
/* Una boca hablando, y nada mas: la afirmacion es sobre lo que sale de la voz,
   no sobre la pantalla.

   Lo que se mueve es la abertura, que es el dibujo entero achatado y estirado
   en vertical. El labio va con non-scaling-stroke, asi que engorda cero cuando
   la boca se cierra: al aplastar la caja el trazo se aplastaria con ella y la
   boca cerrada terminaria siendo una linea mas fina que la abierta, que es al
   reves de como se ve una boca. */
.pieza[data-pieza="boca"] { padding: 24px 20px; }
.boca { display: block; width: 100%; height: auto; }
.boca-hueco {
  fill: currentColor; fill-opacity: .8;
  stroke: currentColor; stroke-opacity: .45;
  stroke-width: 2.4; stroke-linejoin: round;
  transform-box: fill-box; transform-origin: 50% 50%;
  transform: scaleY(.08);
}
/* El ritmo no es parejo: una boca que se abre y se cierra a intervalos iguales
   es una tijera. Las aberturas son de tamanos distintos y caen a destiempo,
   como las silabas. */
.pieza.viva .boca-hueco { animation: boca-hablar 1.9s var(--ease) infinite; }
@keyframes boca-hablar {
  0%   { transform: scaleY(.08); }
  9%   { transform: scaleY(.72); }
  17%  { transform: scaleY(.3); }
  27%  { transform: scaleY(.96); }
  37%  { transform: scaleY(.22); }
  47%  { transform: scaleY(.64); }
  57%  { transform: scaleY(.14); }
  68%  { transform: scaleY(.86); }
  79%  { transform: scaleY(.26); }
  89%  { transform: scaleY(.48); }
  100% { transform: scaleY(.08); }
}

/* ---- dos columnas: texto + producto ---- */

.duo { display: grid; grid-template-columns: 1fr 1.05fr; align-items: center; gap: clamp(40px, 6vw, 84px); }
.duo .lista { margin-top: 44px; }
/* Tres frases sueltas, separadas por una linea cada una: son afirmaciones
   distintas y la regla las corta mejor que el aire solo, que a esta altura de la
   pagina se lee como un renglon en blanco cualquiera.
   El aire va como padding y no como gap para que la linea quede centrada entre
   texto y texto en vez de pegada al de abajo; en las puntas se saca, asi la
   lista no gana alto por fuera. */
.lista { display: grid; }
.lista .item {
  display: flex; align-items: center; gap: 18px;
  padding: 22px 0;
  font-size: 16px; color: var(--tinta-2);
}
.lista .item + .item { border-top: 1px solid var(--linea); }
.lista .item:first-child { padding-top: 0; }
.lista .item:last-child { padding-bottom: 0; }
.lista .item b { color: var(--tinta); }
/* El trazo va grueso a proposito: el dibujo mide 32 unidades y se ve a 34px,
   asi que un trazo fino queda por debajo del peso de la negrita que tiene al
   lado y el icono se lee como una marca de agua en vez de como un simbolo.
   Las puntas redondeadas son lo que evita que el tachado termine en un corte
   seco justo donde cruza el dibujo. */
.lista .item .ico {
  width: 34px; height: 34px; flex-shrink: 0;
  stroke: var(--tinta); fill: none;
  stroke-width: 2.1; stroke-linecap: round; stroke-linejoin: round;
}

/* ---- la banda negra: la misma que el visor ---- */

.rotulo { color: var(--tinta-3); font-size: 15px; margin-bottom: 18px; }
/* El titulo de la banda y las tres columnas son dos cosas distintas, no un
   titulo con su bajada: el aire entre medio es lo que las separa como tales. */
.tripa { display: grid; grid-template-columns: repeat(3, 1fr); gap: 36px; margin-top: clamp(72px, 9vw, 124px); }
.tripa article .ico { width: 30px; height: 30px; display: block; margin-bottom: 18px;
  stroke: var(--tinta); fill: none; stroke-width: 2.1; stroke-linecap: round; stroke-linejoin: round; }
.tripa article h3 { font-size: 17px; margin-bottom: 10px; }
.tripa article p { color: var(--tinta-2); font-size: 15px; line-height: 1.58; }

/* ---- el acompanamiento, con el indice pegado ---- */

.acompana-grid { display: grid; grid-template-columns: 230px 1fr; gap: clamp(30px, 22vw, 330px); }
.pasos-lista { position: sticky; top: 40px; align-self: start; }
/* Con el .lp adelante: body.lp a lleva color: inherit y le ganaba por
   especificidad, asi que los tres momentos se pintaban iguales y el apagado de
   los que no estas mirando no llegaba a aplicarse nunca. */
.lp .pasos-lista a {
  display: block; padding: 14px 0;
  border-bottom: 1px solid var(--linea);
  color: var(--tinta-3); font-size: 16px;
  transition: color .3s ease, border-color .3s ease;
}
.lp .pasos-lista a.activo { color: var(--tinta); border-bottom-color: var(--tinta); font-weight: 550; }

.paneles { display: grid; gap: clamp(56px, 7vw, 104px); }
.paneles > .display { margin-bottom: clamp(8px, 3vw, 44px); text-wrap: balance; }
/* Equilibrado: un titulo de dos lineas donde la segunda es una palabra suelta
   se lee como un renglon que sobro. El navegador reparte las palabras entre las
   lineas que ya iba a usar -no agrega ninguna- y las deja parejas. */
.panel-paso h3 {
  font-family: var(--serif); font-size: clamp(24px, 2.6vw, 34px);
  font-weight: 500; letter-spacing: -.02em;
  text-wrap: balance;
}
/* El parrafo del panel es el de abajo del titulo y nada mas. Sin el hijo
   directo alcanzaba a todos los <p> de adentro del dibujo -17px, tinta-2 y 52ch
   sobre una etiqueta de 12- y encima les ganaba por especificidad a sus propias
   reglas, asi que el tamaño escrito no era el que se veia. */
/* Equilibrado, igual que el titulo de arriba: son dos renglones cortos y el
   segundo se quedaba con cuatro palabras. El navegador no agrega renglones, solo
   reparte las palabras entre los que ya iba a usar, asi que esto ordena lo que
   se ve sin alargar nada. Hace falta que el parrafo entre en pocos renglones
   -mas de cuatro y el navegador deja de equilibrar-, que es justo el caso. */
.panel-paso > p {
  margin-top: 14px; color: var(--tinta-2); font-size: 17px; line-height: 1.5;
  max-width: 52ch; text-wrap: balance;
}

/* Una tarjeta es una filmina apoyada sobre el papel: casi no tiene relleno
   propio, el canto de arriba le hace el filo y la sombra la levanta. */
.tarjeta {
  border-radius: 16px;
  background: var(--lamina);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  border: 1px solid var(--edge);
  box-shadow: var(--sombra), var(--canto);
  padding: 22px 24px;
}
.tarjeta .titulin { color: var(--tinta-3); font-size: 12.5px; margin-bottom: 14px; }
.niveles { display: flex; gap: 6px; padding: 4px; border-radius: 999px; background: var(--glass-hi-2); width: max-content; }
.niveles span { padding: 7px 16px; border-radius: 999px; font-size: 13.5px; color: var(--tinta-3); }
.niveles span.on { background: var(--solido); color: var(--sobre-solido); font-weight: 550; box-shadow: var(--canto-hi); }

.reciente-mock { display: flex; align-items: center; gap: 12px; padding: 12px 0; border-top: 1px solid var(--linea-fina); }
.reciente-mock:first-of-type { border-top: 0; }
.reciente-mock .nombre { flex: 1; font-size: 14.5px; }
.reciente-mock .dato { color: var(--tinta-3); font-size: 12.5px; }
.reciente-mock .punto { width: 8px; height: 8px; border-radius: 50%; background: var(--tinta); }

/* ---- las tres escenas ---- */
/* El dibujo va DEBAJO del titulo: el titulo dice de que momento se trata y el
   parrafo lo cuenta, y recien ahi el dibujo lo muestra pasando. Se lee primero
   y se mira despues, que es el orden en que entra cualquiera de las otras
   secciones del sitio.

   Las tres estan hechas del mismo vidrio que las tarjetas del resto del sitio
   y no traen color propio: lo unico teñido es el marco, que es de la app. Se mueven solo mientras se las mira -la clase .viva se la pone
   landing.js cuando la escena entra en pantalla- y lo que esta escrito como
   estado de reposo es la POSE FINAL de cada una: con reduced-motion, sin JS o
   antes de llegar, los tres dibujos se leen igual, quietos y terminados. */
.panel-paso .escena { margin-top: clamp(20px, 2.4vw, 30px); }
.escena {
  position: relative;
  padding: clamp(17px, 2.1vw, 25px);
  border: 1px solid var(--edge);
  border-radius: 20px;
  background: var(--lamina);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--sombra), var(--canto);
}
/* Una luz del tono de la escena que entra por la esquina de arriba. Es lo mismo que pasa en
   la app -el marco tiñe lo que tiene cerca- y a esta opacidad no se lee como
   un fondo de color: se lee como que adentro hay algo encendido. */
.escena::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: radial-gradient(118% 82% at 86% -12%, rgba(var(--tono), .12), transparent 62%);
  pointer-events: none;
}
.escena > * { position: relative; z-index: 1; }

/* Un tono por momento, y los tres son los del resaltador de la app -ambar,
   violeta y azul-, los mismos que la pagina ya usa en los subrayados de los
   titulos. No son tres colores elegidos por variar: son tres marcas distintas
   hechas en tres momentos distintos, que es lo que separa a los tres paneles.
   El de la noche se queda con el azul porque es el color del marco en la app
   dibujada de mas arriba, y los otros dos se reparten los que quedan.

   De aca para abajo nada tiene un color escrito: todo lee var(--tono), asi que
   cambiarle el color a una escena es cambiar una linea. */
.esc-mapa  { --tono: var(--tono-amarillo); }
.esc-marco { --tono: var(--tono-violeta); }
.esc-noche { --tono: var(--tono-azul); }

.esc-cima { display: flex; align-items: center; justify-content: space-between; gap: 14px; margin-bottom: 16px; }
.esc-doc { display: inline-flex; align-items: center; gap: 8px; min-width: 0; color: var(--tinta-2); font-size: 14px; }
.esc-doc span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.esc-ico {
  width: 15px; height: 15px; flex-shrink: 0;
  fill: none; stroke: currentColor; stroke-width: 1.8;
  stroke-linecap: round; stroke-linejoin: round;
  opacity: .72;
}
.niveles.chico span { padding: 5px 14px; font-size: 12.5px; }
.escena .titulin { color: var(--tinta-3); font-size: 12.5px; margin-bottom: 14px; }

/* ---- paso 1: el documento entero de un vistazo ---- */
/* Una raya por diapositiva, las 62. La aguja lo recorre como lo recorre la
   voz, deja atras lo escuchado y enciende las tres marcadas al pasarles por
   encima. Las posiciones de las tres estan en el marcado -son un dato del
   dibujo, no del estilo- y los tiempos en que se encienden salen de ahi: la
   aguja va LINEAL a proposito, asi que a que porcentaje del ciclo llega a cada
   una es una cuenta y no una prueba. */
.mapa {
  position: relative;
  height: 76px;
  border: 1px solid var(--linea-fina);
  border-radius: 12px;
  background: var(--glass-hi);
  overflow: hidden;
}
.mapa-tira, .mapa-visto {
  position: absolute;
  left: 14px; right: 14px; top: 21px; bottom: 21px;
  --paso: calc(100% / 62);
  background: repeating-linear-gradient(90deg,
    currentColor 0 calc(var(--paso) * .42), transparent calc(var(--paso) * .42) var(--paso));
}
/* Dos capas de la misma tira: la de abajo es el documento entero, apagado, y
   la de arriba es lo que ya se escucho. Lo escuchado se descubre recortando la
   de arriba y no pintando la de abajo, que es lo que mantiene las rayas en el
   mismo lugar mientras avanza. */
.mapa-tira { opacity: .17; }
.mapa-visto { opacity: .55; }
.escena.viva .mapa-visto { animation: mapa-visto 7s linear infinite; }
@keyframes mapa-visto {
  0%, 3%    { clip-path: inset(0 100% 0 0); opacity: 0; }
  7%        { opacity: .55; }
  72%, 88%  { clip-path: inset(0 0 0 0); opacity: .55; }
  95%, 100% { clip-path: inset(0 0 0 0); opacity: 0; }
}

.mapa-clavo {
  position: absolute;
  left: var(--en); top: 14px; bottom: 14px;
  width: 3px; margin-left: -1.5px;
  border-radius: 2px;
  background: rgb(var(--tono));
  box-shadow: 0 0 0 3px rgba(var(--tono), .15), 0 6px 16px rgba(var(--tono), .4);
  transform-origin: 50% 100%;
}
/* La cabeza del alfiler: sin ella la marca es una raya mas gorda que las otras
   y no se lee como algo que alguien puso. */
.mapa-clavo::after {
  content: "";
  position: absolute;
  left: 50%; top: -4px;
  width: 7px; height: 7px; margin-left: -3.5px;
  border-radius: 50%;
  background: rgb(var(--tono));
}
.escena.viva .clavo-a { animation: clavo-a 7s var(--resorte) infinite; }
.escena.viva .clavo-b { animation: clavo-b 7s var(--resorte) infinite; }
.escena.viva .clavo-c { animation: clavo-c 7s var(--resorte) infinite; }
@keyframes clavo-a {
  0%, 14.6% { opacity: 0; transform: scaleY(.2); }
  20%, 88%  { opacity: 1; transform: scaleY(1); }
  95%, 100% { opacity: 0; transform: scaleY(1); }
}
@keyframes clavo-b {
  0%, 34.8% { opacity: 0; transform: scaleY(.2); }
  40%, 88%  { opacity: 1; transform: scaleY(1); }
  95%, 100% { opacity: 0; transform: scaleY(1); }
}
@keyframes clavo-c {
  0%, 58.5% { opacity: 0; transform: scaleY(.2); }
  64%, 88%  { opacity: 1; transform: scaleY(1); }
  95%, 100% { opacity: 0; transform: scaleY(1); }
}

/* En reposo no hay aguja: el documento ya se escucho entero. */
.mapa-aguja {
  position: absolute;
  top: 10px; bottom: 10px; left: 98%;
  width: 2px; margin-left: -1px;
  border-radius: 2px;
  background: var(--tinta);
  opacity: 0;
}
.mapa-aguja::after {
  content: "";
  position: absolute;
  left: 50%; top: -4px;
  width: 7px; height: 7px; margin-left: -3.5px;
  border-radius: 50%;
  background: var(--tinta);
}
.escena.viva .mapa-aguja { animation: mapa-aguja 7s linear infinite; }
@keyframes mapa-aguja {
  0%, 4%    { left: 2%; opacity: 0; }
  8%        { left: 7.6%; opacity: 1; }
  72%, 88%  { left: 98%; opacity: 1; }
  95%, 100% { left: 98%; opacity: 0; }
}

.escena .mapa-pie { display: flex; justify-content: space-between; gap: 12px; margin-top: 12px; color: var(--tinta-3); font-size: 13px; }
.mapa-tres { color: rgb(var(--tono)); font-weight: 600; }

/* Las dos barras de tiempo. Avanzan a la MISMA velocidad -esa es toda la
   gracia- y la del resumen se detiene en un tercio del riel: el 19 contra 58
   queda dibujado y no solo escrito. La de completo se queda entera y apagada,
   que es la regla contra la que se mide la otra. */
.reloj { margin-top: 20px; display: grid; gap: 11px; }
.reloj-fila {
  display: grid; grid-template-columns: 74px 1fr 56px;
  align-items: center; gap: 14px;
  color: var(--tinta-3); font-size: 13.5px;
}
.reloj-riel { height: 9px; border-radius: 999px; background: var(--glass-hi-2); overflow: hidden; }
.reloj-riel i { display: block; width: 100%; height: 100%; border-radius: 999px; background: currentColor; opacity: .3; }
.reloj-num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.reloj-fila.on { color: var(--tinta); }
.reloj-fila.on .reloj-num { font-weight: 600; }
.reloj-fila.on .reloj-riel i {
  width: 32.8%;
  background: rgb(var(--tono));
  opacity: 1;
  box-shadow: 0 0 14px rgba(var(--tono), .45);
}
.escena.viva .reloj-fila.on .reloj-riel i { animation: reloj-llenar 7s linear infinite; }
@keyframes reloj-llenar {
  0%, 4%      { width: 0; opacity: 1; }
  26.3%, 88%  { width: 32.8%; opacity: 1; }
  95%, 100%   { width: 32.8%; opacity: 0; }
}

/* ---- paso 2: la diapositiva y lo que suena, al lado ---- */
/* Las dos entradas al mismo contenido, una al lado de la otra. El marco salta
   de bloque y la frase cambia en el mismo momento: si se desincronizan, el
   dibujo dice lo contrario del titulo. Por eso las alturas de la lamina estan
   escritas y no calculadas -titulo de 20, renglon de 7, aire de 16- y las tres
   paradas del marco salen de esa cuenta, igual que en la app salen del bbox
   que mide PyMuPDF. */
.esc-par { display: grid; grid-template-columns: 1.08fr 1fr; align-items: center; gap: 18px; }
/* Se llama .lam y no .lamina: .lamina ya es la diapositiva de mentira de la
   tira, con su fondo de catedra y su cuerpo en cqw, y las dos clases sobre el
   mismo nombre se pisaban -esta, que va mas abajo, le borraba el color a las
   nueve de arriba-. */
.lam {
  position: relative;
  padding: 16px 16px 18px;
  border: 1px solid var(--linea-fina);
  border-radius: 12px;
  background: var(--glass-hi);
}
.escena .lam-tit {
  height: 20px; line-height: 20px; margin-bottom: 18px;
  font-family: var(--serif); font-size: 15px; letter-spacing: -.015em;
}
.lam-bloque { display: grid; gap: 7px; }
.lam-bloque + .lam-bloque { margin-top: 16px; }
.lam-bloque span { display: block; height: 7px; border-radius: 4px; background: currentColor; opacity: .26; }
.lam-bloque:nth-of-type(1) span:last-child { width: 62%; }
.lam-bloque:nth-of-type(2) span { width: 78%; }
.lam-bloque:nth-of-type(3) span:nth-child(2) { width: 88%; }
.lam-bloque:nth-of-type(3) span:last-child { width: 46%; }
.lam-marco {
  position: absolute;
  left: 10px; right: 10px;
  top: 110px; height: 45px;
  border-radius: 8px;
  box-shadow: 0 0 0 2px rgba(var(--tono), .95),
              0 0 0 6px rgba(var(--tono), .16),
              0 9px 22px rgba(var(--tono), .28);
}
.escena.viva .lam-marco { animation: lam-mover 6.6s var(--ease) infinite; }
@keyframes lam-mover {
  0%, 27%  { top: 50px; height: 31px; }
  36%, 60% { top: 87px; height: 17px; }
  70%, 94% { top: 110px; height: 45px; }
  100%     { top: 50px; height: 31px; }
}

.suena { display: flex; flex-direction: column; justify-content: center; }
/* La onda: dieciseis barras con alturas distintas escritas a mano. Late desde
   el centro con scaleY, como la del reproductor de voces, y en reposo se queda
   con su relieve en vez de aplastarse: una linea chata donde tendria que haber
   una onda se lee como algo roto. */
.suena-onda { display: flex; align-items: center; justify-content: space-between; height: 36px; margin-bottom: 16px; color: var(--tinta-3); }
.suena-onda i {
  flex: 0 0 4px; height: 100%;
  border-radius: 2px;
  background: currentColor;
  transform: scaleY(var(--a, .5));
}
.suena-onda i:nth-child(1)  { --a: .26; }
.suena-onda i:nth-child(2)  { --a: .54; }
.suena-onda i:nth-child(3)  { --a: .88; }
.suena-onda i:nth-child(4)  { --a: .42; }
.suena-onda i:nth-child(5)  { --a: .7; }
.suena-onda i:nth-child(6)  { --a: 1; }
.suena-onda i:nth-child(7)  { --a: .36; }
.suena-onda i:nth-child(8)  { --a: .62; }
.suena-onda i:nth-child(9)  { --a: .94; }
.suena-onda i:nth-child(10) { --a: .3; }
.suena-onda i:nth-child(11) { --a: .76; }
.suena-onda i:nth-child(12) { --a: .5; }
.suena-onda i:nth-child(13) { --a: .84; }
.suena-onda i:nth-child(14) { --a: .34; }
.suena-onda i:nth-child(15) { --a: .6; }
.suena-onda i:nth-child(16) { --a: .24; }
.escena.viva .suena-onda i { animation: suena-late 1.15s ease-in-out infinite; }
.escena.viva .suena-onda i:nth-child(odd)  { animation-duration: .96s; }
.escena.viva .suena-onda i:nth-child(3n)   { animation-delay: -.42s; }
.escena.viva .suena-onda i:nth-child(4n+1) { animation-delay: -.7s; }
@keyframes suena-late {
  0%, 100% { transform: scaleY(calc(var(--a, .5) * .3 + .08)); }
  50%      { transform: scaleY(var(--a, .5)); }
}

/* Las tres frases van apiladas en el mismo lugar -una sola a la vez- y el
   hueco esta reservado desde el principio: si el alto lo pusiera la frase que
   esta, la escena entera cambiaria de tamaño tres veces por vuelta. */
.suena-dice { position: relative; min-height: 70px; }
.suena-dice span {
  position: absolute;
  left: 0; right: 0; top: 0;
  font-family: var(--serif); font-style: italic;
  font-size: 15.5px; line-height: 1.45; letter-spacing: -.012em;
}
.suena-dice span + span { opacity: 0; }
.escena.viva .suena-dice span { opacity: 0; animation: suena-dice 6.6s var(--ease) infinite; }
.escena.viva .suena-dice span:nth-child(2) { animation-delay: 2.2s; }
.escena.viva .suena-dice span:nth-child(3) { animation-delay: 4.4s; }
@keyframes suena-dice {
  0%        { opacity: 0; transform: translateY(7px); }
  4%, 30%   { opacity: 1; transform: none; }
  36%, 100% { opacity: 0; transform: none; }
}

/* Y al terminar, la pregunta. El filo la separa del dibujo de arriba porque es
   el otro tiempo de la escena: lo que pasa mientras la voz habla, y lo que pasa
   cuando se calla.

   Esta quieta y ya contestada. Las otras piezas de esta escena se mueven
   -el marco salta, la frase cambia- y una cuarta cosa moviendose al mismo
   tiempo no deja mirar ninguna; ademas lo que hay que entender aca no es como
   se contesta sino que al final de cada lamina hay una. Como se contesta esta
   mas abajo, en la seccion que tiene las cuatro maneras. */
.al-final {
  margin-top: 18px; padding-top: 16px;
  border-top: 1px solid var(--linea-fina);
}
.escena .al-final-eti { color: var(--tinta-3); font-size: 12.5px; }
.escena .al-final-txt {
  margin-top: 10px;
  font-family: var(--serif); font-size: 15px; letter-spacing: -.015em;
}
.al-final-op { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 13px; }
.al-final-op span {
  padding: 6px 13px;
  border: 1px solid var(--linea-fina); border-radius: 999px;
  background: var(--glass-hi-2);
  color: var(--tinta-3); font-size: 12.5px;
}
/* La que era, solida: es la unica pieza opaca de la escena, igual que en la
   app, donde la correcta es lo unico que se pone blanco despues de elegir. */
.al-final-op .buena {
  background: var(--solido); border-color: transparent;
  color: var(--sobre-solido); font-weight: 550;
  box-shadow: var(--canto-hi);
}

/* ---- paso 3: la noche anterior ---- */
/* El post-it asoma por la esquina, asi que esta escena no puede recortar lo
   que se le sale. */
.esc-noche { overflow: visible; }
.retoma {
  padding: 16px;
  border: 1px solid var(--linea-fina);
  border-radius: 12px;
  background: var(--glass-hi);
}
/* El nombre y el numero van los dos a la izquierda y no uno en cada punta: la
   esquina de la derecha es donde se pega el post-it, y un dato debajo de un
   papel es un dato que no esta. */
.retoma-cima { display: flex; align-items: baseline; gap: 9px; font-size: 14.5px; }
.retoma-doc { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.retoma-num { flex-shrink: 0; color: var(--tinta-3); font-size: 12.5px; font-variant-numeric: tabular-nums; }
.retoma-num::before { content: "·"; margin-right: 9px; }
.retoma-riel { display: block; height: 6px; margin-top: 13px; border-radius: 999px; background: var(--glass-hi-2); overflow: hidden; }
.retoma-riel i { display: block; width: 66%; height: 100%; border-radius: 999px; background: rgb(var(--tono)); box-shadow: 0 0 14px rgba(var(--tono), .4); }
.escena .retoma-chips { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-top: 15px; }
.chip {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 12px 5px 10px;
  border: 1px solid var(--linea-fina);
  border-radius: 999px;
  background: var(--glass-hi-2);
  color: var(--tinta-2); font-size: 12px;
}
.chip .esc-ico { width: 12px; height: 12px; fill: currentColor; stroke: none; opacity: .85; }
.niveles.dos { display: inline-flex; }

/* El nivel pasa de completo a ampliado y recien ahi se despliega lo que trae
   de mas, uno abajo del otro. Es la unica razon por la que alguien vuelve a
   una diapositiva que ya escucho, asi que es lo ultimo que se ve. */
.escena.viva .niveles.dos span:nth-child(1) { animation: nivel-sale 8s var(--ease) infinite; }
.escena.viva .niveles.dos span:nth-child(2) { animation: nivel-entra 8s var(--ease) infinite; }
@keyframes nivel-sale {
  0%, 20%   { background: var(--solido); color: var(--sobre-solido); font-weight: 550; box-shadow: var(--canto-hi); }
  26%, 100% { background: transparent; color: var(--tinta-3); font-weight: 450; box-shadow: none; }
}
@keyframes nivel-entra {
  0%, 20%   { background: transparent; color: var(--tinta-3); font-weight: 450; box-shadow: none; }
  26%, 100% { background: var(--solido); color: var(--sobre-solido); font-weight: 550; box-shadow: var(--canto-hi); }
}

.escena .mas-eti { margin-top: 18px; color: var(--tinta-3); font-size: 12.5px; }
.mas { margin-top: 11px; display: grid; gap: 9px; }
.mas-fila { display: flex; align-items: center; gap: 11px; font-size: 14.5px; }
/* La cruz: dos trazos y nada mas, del tono de la escena. Un mas y no un visto,
   porque esto no es algo que se completo: es algo que se agrego. */
.mas-cruz { position: relative; width: 15px; height: 15px; flex-shrink: 0; }
.mas-cruz::before, .mas-cruz::after {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  border-radius: 1px;
  background: rgb(var(--tono));
  transform: translate(-50%, -50%);
}
.mas-cruz::before { width: 13px; height: 2px; }
.mas-cruz::after { width: 2px; height: 13px; }
.escena.viva .mas-fila { animation: mas-entra 8s var(--ease) infinite; }
.escena.viva .mas-fila:nth-child(2) { animation-delay: .5s; }
.escena.viva .mas-fila:nth-child(3) { animation-delay: 1s; }
@keyframes mas-entra {
  0%, 26%   { opacity: 0; transform: translateY(9px); }
  34%, 92%  { opacity: 1; transform: none; }
  99%, 100% { opacity: 0; transform: translateY(9px); }
}

/* ---- planes ---- */

/* El encabezado de esta seccion va centrado, y es la unica de la pagina que lo
   hace: las otras se leen de corrido, de izquierda a derecha, y esta se COMPARA
   -tres tarjetas en fila-. El titulo centrado arriba del medio es lo que las
   junta en una sola cosa en vez de tres que arrancan a la izquierda. */
#precio .display { text-align: center; }

/* Los tres sellos: lo que NO va a pasar nunca, que es lo que se pregunta el que
   ya se quemo con una suscripcion. Van arriba del precio a proposito: primero
   se saca el miedo, despues se muestra el numero. */
.sellos {
  display: flex; flex-wrap: wrap; justify-content: center; gap: 8px;
  margin: clamp(34px, 4.5vw, 62px) 0 0; padding: 0;
  list-style: none;
}
.sellos li {
  padding: 7px 14px;
  border: 1px solid var(--edge); border-radius: 999px;
  background: var(--lamina);
  box-shadow: var(--canto);
  color: var(--tinta-2); font-size: 14px; letter-spacing: -.01em;
}

/* La oferta vive adentro de la tarjeta, pegada al precio que modifica: una tira
   aparte arriba obligaba a mirar dos veces -el numero en un lado y la condicion
   en el otro- y encima se leia como un cuarto plan. Va separada del precio por
   una linea finita, porque es otra cosa: el precio es lo que sale, esto es
   hasta cuando. */
.plan .oferta {
  display: grid; justify-items: start; gap: 9px;
  margin-top: 16px; padding-top: 16px;
  border-top: 1px solid var(--linea-fina);
}
.oferta-que { color: var(--tinta-3); font-size: 13.5px; line-height: 1.45; }
/* El precio de lista, tachado, con cuanto se descuenta al lado. Van juntos y en
   un renglon: separados, el tachado parece un error de maqueta en vez del dato
   del que cuelga el descuento. */
/* Los dos datos del descuento en un renglon: de cuanto era y cuanto se baja.
   El tercero -hasta cuando- ya no vive aca: se fue a la solapa de abajo. */
.rebaja { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; }
.rebaja s { color: var(--tinta-3); font-size: 16px; text-decoration-thickness: 1px; }
.rebaja .menos {
  padding: 3px 9px; border-radius: 999px;
  background: var(--verde-fondo); color: var(--verde);
  font-size: 13px; font-weight: 600; letter-spacing: -.01em;
  font-variant-numeric: tabular-nums;
}
/* ---- la solapa del plazo ---- */

/* El plazo sale por debajo de la tarjeta, como la pestaña de una carpeta que
   asoma del archivo. Es la unica mancha de color macizo de la pagina y esta en
   el unico lugar donde hace falta: el plan que se ofrece es el que tiene fecha,
   y la fecha es lo que decide si uno vuelve mañana o no. Adentro de la tarjeta
   era una pastilla mas en el renglon del descuento y se leia como un tercer
   dato de la misma frase.

   Verde y no naranja, que seria el color obvio para un plazo: el naranja avisa,
   y esto no avisa nada. Es el mismo descuento que ya dice la pastilla de
   arriba, contado en tiempo en vez de en por ciento. Con dos colores la tarjeta
   tenia una buena noticia adentro y una advertencia colgando, que son dos
   mensajes para un solo hecho.

   No se mete por DEBAJO de la tarjeta de verdad, y no por gusto: la tarjeta
   lleva backdrop-filter, que le arma un contexto de apilado propio, asi que un
   hijo con z-index negativo no se va atras de su fondo -le queda encima-. Se
   apoya contra el borde de abajo, con las esquinas de arriba en angulo y las de
   abajo redondeadas, y eso ya se lee como algo que sigue desde adentro. Encima
   no depende de que el fondo de la tarjeta sea opaco, que no lo es. */
.plan.elegido { position: relative; }
.plan .solapa {
  position: absolute;
  /* El 100% se mide contra la caja de relleno, asi que el borde de arriba de la
     solapa cae justo sobre el borde de abajo de la tarjeta y no queda costura. */
  left: 50%; top: 100%;
  transform: translateX(-50%);
  padding: 9px 16px 10px;
  border-radius: 0 0 12px 12px;
  /* El mismo verde de la pastilla del descuento, y no un segundo color: las dos
     cosas dicen lo mismo -esto esta rebajado, y hasta cuando- y con un color
     cada una se leian como dos avisos distintos. Aca va macizo y alla bajado,
     que es toda la diferencia entre un dato adentro de la tarjeta y una pieza
     que asoma por afuera. */
  background: var(--verde);
  /* El texto va del color del papel y no de un gris elegido a ojo: asi sale del
     tema, y el dia que el verde cambie de valor el texto se da vuelta solo en
     vez de quedar ilegible. */
  color: var(--fondo);
  font-size: 13px; font-weight: 600; letter-spacing: -.005em; line-height: 1;
  /* Los minutos bajan de a uno: sin cifras de ancho fijo, cada cambio corre el
     texto que tiene al lado y la solapa tiembla una vez por minuto. */
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  box-shadow: 0 10px 20px rgba(0, 0, 0, .3);
}

/* Las tres del mismo alto, no cada una la suya. Una tiene oferta y otra no, y
   una linea de la tercera dobla en dos: con cada tarjeta midiendo su contenido,
   los tres botones caian a tres alturas distintas y la fila se leia como tres
   piezas sueltas en vez de tres columnas de la misma tabla. Estirandolas, el
   hueco que sobra se lo come la lista -es la que lleva flex: 1- y los botones
   se apoyan los tres en el mismo piso, que es lo que se compara. */
.planes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 52px; }
.plan {
  display: flex; flex-direction: column;
  padding: 32px 28px;
  border: 1px solid var(--edge); border-radius: 20px;
  background: var(--lamina);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--canto);
}
/* El plan que se ofrece no cambia de color: se levanta. Misma receta que el
   boton principal -linea, sombra corta, sombra difusa- porque es la misma idea:
   sobre una sola superficie blanca, jerarquia es altura, no relleno. */
.plan.elegido {
  background: var(--lamina-hi);
  border-color: var(--edge-hi);
  box-shadow: var(--sombra-lg), var(--canto-hi);
}
.plan h3 { font-size: 17px; }
.plan .precio { margin-top: 16px; font-family: var(--serif); font-size: 48px; font-weight: 500; letter-spacing: -.03em; line-height: 1; }
.plan .plan-sub { margin-top: 8px; color: var(--tinta-3); font-size: 14px; }

.plan ul { flex: 1; margin: 26px 0 28px; padding: 0; list-style: none; display: grid; gap: 11px; }
.plan li { position: relative; padding-left: 21px; color: var(--tinta-2); font-size: 14.5px; line-height: 1.45; }

.plan li::before {
  content: ""; position: absolute; left: 2px; top: .48em;
  width: 7px; height: 4px;
  border-left: 1.6px solid currentColor; border-bottom: 1.6px solid currentColor;
  transform: rotate(-45deg); opacity: .75;
}
.plan .btn { width: 100%; }

.banda { text-align: center; }
.banda .ancho { display: grid; gap: 18px; justify-items: center; }
.banda p { font-size: 17.5px; line-height: 1.55; max-width: 58ch; }

/* ---- preguntas ---- */

/* El unico titulo centrado del sitio, y es a proposito: abajo tiene una lista
   de preguntas que ocupa el ancho entero, asi que alineado a la izquierda
   quedaba colgado de una esquina de un bloque simetrico. */
/* Va con .lp adelante a proposito: ".lp h2" del bloque de titulos pone
   margin:0 y, por llevar clase MAS elemento, le gana a una clase sola. */
.lp .titulo-preguntas { text-align: center; margin-bottom: clamp(48px, 6vw, 76px); }

.lp details { border-bottom: 1px solid var(--linea); }
.lp details:first-of-type { border-top: 1px solid var(--linea); }
.lp summary {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 22px 2px; cursor: pointer;
  font-size: 18px; letter-spacing: -.016em; list-style: none;
}
.lp summary::-webkit-details-marker { display: none; }
/* El signo es un mas que gira hasta ser un menos: una sola pieza. */
.lp summary::after {
  content: ""; flex-shrink: 0;
  width: 12px; height: 12px;
  background:
    linear-gradient(currentColor, currentColor) center/100% 1.5px no-repeat,
    linear-gradient(currentColor, currentColor) center/1.5px 100% no-repeat;
  color: var(--tinta-3);
  transition: transform .35s ease;
}
.lp details[open] summary::after { transform: rotate(135deg); }
.lp details p { padding: 0 44px 24px 2px; color: var(--tinta-2); font-size: 16px; line-height: 1.6; }

/* ------------------------------------------------------------------ voces */
/* La tarjeta cuelga de la seccion de arriba y no flota en el medio de la
   pagina: es el ejemplo de lo que esa seccion acaba de afirmar -que no lee, que
   explica-, asi que se lee como su remate. Por eso el aire entre las dos es
   menos de la mitad del que separa a dos secciones cualquiera. */
#detalle { padding-bottom: clamp(26px, 3.5vw, 52px); }
#voces { padding-top: 0; }

/* La unica pieza del sitio que hace ruido, y por eso es una sola tarjeta ancha
   y no tres: lo que hay que entender es que se elige, no que hay un catalogo.
   El texto de un lado, el reproductor del otro, y la frase abajo para poder
   seguir la voz leyendo. */
.tarjeta-voz {
  display: grid; grid-template-columns: 1fr 1fr; gap: clamp(32px, 5vw, 72px);
  align-items: center;
  padding: clamp(32px, 4vw, 56px);
  border: 1px solid var(--edge); border-radius: 24px;
  background: var(--lamina);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--canto);
}
/* Un pelo mas chico que los otros titulos de seccion: aca el titulo comparte
   renglon con el reproductor, y "Tres voces naturales." tiene que entrar en una
   linea o el bloque se parte en cuatro y deja de leerse de un vistazo. */
/* Con `h2` adelante, y no `.tarjeta-voz .display` a secas: `.lp h2.display`
   pesa un elemento mas y le ganaba, asi que el titulo seguia saliendo en los 56
   de una seccion entera y se partia en cuatro renglones. */
.tarjeta-voz h2.display { font-size: clamp(26px, 3.05vw, 40px); }
.voz-dice p { margin-top: 22px; color: var(--tinta-2); font-size: 16.5px; line-height: 1.6; max-width: 44ch; }
/* El segundo parrafo es la nota al pie del primero -que lo que suena es de
   verdad- y por eso va mas chico y mas apagado: se lee si uno duda. */
.voz-dice p + p { margin-top: 16px; color: var(--tinta-3); font-size: 15.5px; }

/* La columna va en el orden de la decision: con quien, que va a decir, y
   recien ahi el boton. El reproductor queda abajo de todo y la frase en el
   medio, que es lo que hay que mirar mientras suena: la palabra se enciende
   ahi, no en la onda. */
.voz-fila { display: flex; align-items: center; gap: 20px; margin-top: 30px; }
/* El unico boton redondo y opaco de la pagina despues del de descargar: aca la
   accion principal es escuchar. */
.voz-play {
  display: grid; place-items: center;
  width: 58px; height: 58px; flex-shrink: 0;
  padding: 0;
  border: 0; border-radius: 999px;
  background: var(--solido); color: var(--sobre-solido);
  box-shadow: var(--sombra-solido);
  cursor: pointer;
  transition: transform .25s cubic-bezier(.22,1.18,.36,1),
              background .2s ease, box-shadow .25s ease;
}
/* Dos cosas pasaban aca y las dos daban el mismo sintoma: el boton blanco se
   volvia un circulo gris oscuro al pasarle el mouse por encima.

   La primera es de peso. En style.css vive `button:hover:not(:disabled):not(
   .activo)`, que le pone vidrio a cualquier boton de la app; los `:not()` valen
   como clase, asi que pesa (0,3,1) y le ganaba a `.voz-play:hover`, que pesa
   (0,2,0). O sea que el hover de aca no se aplicaba nunca y lo que se veia era
   el de los botones de la app: fondo translucido sobre una tarjeta casi negra.
   Por eso el selector lleva la tarjeta adelante y el `:not(:disabled)` atras,
   para pasarlo.

   La segunda es que, aun ganando, no habia nada que mostrar: el boton ya es del
   blanco mas alto que hay y de #f5f5f7 a #fff no se ve nada. Asi que el hover
   no cambia de color: crece y se le enciende un halo, que es lo que hace
   cualquier boton de reproducir cuando lo vas a apretar.

   El halo va con --linea-fina, que es tinta sobre papel claro y luz sobre papel
   negro, asi que se ve en los dos temas. Una sombra negra aca no serviria: la
   tarjeta ya es casi negra y no existiria. */
.tarjeta-voz .voz-play:hover:not(:disabled),
.tarjeta-voz .voz-play:focus-visible {
  background: var(--solido);
  transform: scale(1.07);
  box-shadow: var(--sombra-solido), 0 0 0 9px var(--linea-fina);
  outline: none;
}
.voz-play:active { transform: scale(.94); }
.voz-play svg { width: 20px; height: 20px; fill: currentColor; stroke: none; }
/* El play se va y la pausa aparece en el mismo lugar: es un boton que cambia de
   cara, no dos botones. */
.voz-play .ico-pause, .voz-play.sonando .ico-play { display: none; }
.voz-play.sonando .ico-pause { display: block; }
/* El triangulo NO lleva correccion optica aca, y eso no es un olvido: ya viene
   corrida en el dibujo. Dentro de su cuadro de 24 el triangulo va de 8,5 a
   19,8, asi que su caja esta 2,15 a la derecha del centro -1,8px cuando se
   dibuja a 20px-, que es justo lo que un triangulo apuntando a la derecha
   necesita para no verse caido hacia atras.
   Con eso solo, el centro de MASA del triangulo -que es lo que el ojo lee, y en
   un triangulo esta a un tercio de la base y no a la mitad de la caja- queda a
   0,2px del centro del boton. Los 3px que habia aca encima lo llevaban a 3,2:
   un tercio del ancho del propio triangulo, y por eso se veia corrido.
   El boton de play de la maqueta usa el mismo dibujo sin margen; este era el
   unico que lo llevaba. */
.voz-play .ico-play { margin-left: 0; }

/* La misma onda de la portada, pero esta late de verdad: se enciende cuando
   suena y se apaga cuando para. */
/* Los dos min-width son lo que dejan que la onda se achique. Ni un item de
   flex ni uno de grid bajan de lo que mide su contenido salvo que se les diga,
   y el contenido de la onda son cincuenta barras de 2px que no se encogen: una
   vez dibujadas, la columna del reproductor quedaba clavada en el ancho que
   tenia cuando se dibujaron, y al achicar la ventana -o girar el telefono- la
   onda salia de la tarjeta y de la pantalla. Y no se arreglaba sola: el JS
   cuenta las barras midiendo la caja, y la caja ya no se podia achicar.
   En cero, la columna sigue al ancho que hay y la cuenta vuelve a dar. */
.voz-suena { min-width: 0; }
.voz-onda { flex: 1; min-width: 0; margin-top: 0; }

.voz-elegir { display: flex; flex-wrap: wrap; gap: 10px; }
.voz-elegir button {
  padding: 9px 18px;
  border: 1px solid var(--edge); border-radius: 999px;
  background: transparent;
  color: var(--tinta-2);
  font: inherit; font-size: 15px; letter-spacing: -.011em;
  cursor: pointer;
  transition: color .2s ease, border-color .2s ease, background .2s ease;
}
.voz-elegir button:hover { color: var(--tinta); border-color: var(--edge-hi); }
/* La elegida es la unica solida: se ve cual esta puesta sin leer nada. Va con
   la tarjeta adelante por lo mismo que el boton de play: el `button:hover` de
   style.css pesa mas y, al pasarle el mouse por encima, la pastilla puesta se
   apagaba igual que las otras dos y se perdia cual estaba elegida. */
.tarjeta-voz .voz-elegir button[aria-pressed="true"],
.tarjeta-voz .voz-elegir button[aria-pressed="true"]:hover {
  background: var(--solido); color: var(--sobre-solido);
  border-color: transparent; font-weight: 550;
}
/* Va con el nombre de la tarjeta adelante a proposito: `.lp p` -que pone el
   margen en cero- tiene la misma especificidad que `.voz-frase` sola y gana por
   venir despues, asi que el margen de aca no llegaba a aplicarse nunca y la
   frase quedaba pegada a las pastillas, sin un pixel en el medio. */
.tarjeta-voz .voz-frase {
  margin-top: 30px;
  color: var(--tinta-3);
  font-family: var(--serif); font-size: 17px; line-height: 1.62;
  max-width: 38ch;
}
/* La palabra que esta sonando se enciende en blanco. La frase entera arranca
   apagada -es una cita, no un parrafo- y lo unico que sube al blanco del texto
   es la palabra que la voz esta diciendo en ese momento.

   El paso va con una transicion corta y no seco: a velocidad de habla una
   palabra dura dos o tres decimas, y sin el fundido la linea titila. Y se
   apaga mas lento de lo que enciende, que es lo que deja una estela de por
   donde viene y ayuda a seguirla.

   El resaltado se dibuja SOLO con color: nada de fondo ni de peso. Un fondo
   corre la linea de base y un bold cambia el ancho de la palabra, y las dos
   cosas hacen saltar el renglon entero en cada palabra. */
.voz-frase .pal { transition: color .32s ease; }
.voz-frase .pal.dicha { color: var(--tinta); transition-duration: .09s; }
/* El motor, al pie de la columna izquierda y en letra chica: es el dato que se
   va a chequear, no el que se lee. El aire de arriba es mas que el de un
   parrafo al siguiente a proposito, para que se lea como una ficha aparte y no
   como el final del texto. */
.tarjeta-voz .voz-motor {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  margin-top: 30px;
  color: var(--tinta-3); font-size: 13.5px;
}
.voz-motor b { color: var(--tinta-2); font-weight: 600; letter-spacing: -.008em; }
.voz-motor span::before { content: "·"; margin-right: 10px; color: var(--linea); }
.voz-motor .ico-cerebro {
  width: 16px; height: 16px; flex-shrink: 0;
  fill: none; stroke: currentColor;
  stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round;
}

@media (max-width: 860px) {
  .tarjeta-voz { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------- las cuatro maneras -- */
/* Cuatro columnas sobre el papel pelado, separadas por un filo. No van en
   tarjeta y no es un olvido: las tarjetas del resto del sitio encierran cada
   una una pantalla de la app, y estas cuatro no son cuatro pantallas sino las
   cuatro formas de la misma pregunta. En fila y con una linea en el medio se
   leen como una enumeracion; en cuatro cajas de vidrio, como cuatro productos.

   El tono es el azul del marco, que es el color del producto y el que ya lleva
   la app dibujada de la portada. Uno solo para las cuatro: no son cuatro cosas
   distintas. El unico que se sale es el del hueco, y no por adorno: ahi el
   color ES el veredicto, verde o rojo, igual que en la app.

   Lo escrito aca sin .viva es la pose final de cada dibujo -la opcion ya
   elegida, la palabra ya caida, las tres ideas encendidas y el juicio a la
   vista-, asi que con reduced-motion las cuatro se leen quietas y terminadas. */
#preguntar .manera { --tono: var(--tono-azul); }
/* Centrado, como el del precio y por la misma razon: lo que sigue se compara
   entre si. Un titulo pegado a la izquierda arriba de cuatro columnas dice que
   se lee de corrido, y esto no se lee de corrido. */
#preguntar .display { text-align: center; text-wrap: balance; }

.maneras {
  display: grid; grid-template-columns: repeat(4, 1fr);
  margin-top: clamp(44px, 5.5vw, 76px);
}
.manera {
  display: flex; flex-direction: column;
  padding: 0 clamp(16px, 1.9vw, 30px);
  border-left: 1px solid var(--linea-fina);
}
/* La primera no lleva filo -no separa nada- y las dos de las puntas se pegan
   al borde de la columna de texto, para que las cuatro midan lo mismo por
   dentro y el bloque no quede metido hacia adentro. */
.manera:first-child { border-left: 0; padding-left: 0; }
.manera:last-child { padding-right: 0; }

/* Los cuatro dibujos comparten caja. Sin el alto minimo cada uno mide lo suyo
   -el hueco son dos renglones y la opcion multiple tres pastillas- y los cuatro
   titulos quedaban escalonados, que es lo unico que no puede pasar en una fila
   de cuatro.

   La medida es la del dibujo mas alto que hay -el hueco, en ingles y en la
   columna mas angosta- y ni un pixel mas: de ahi sale hasta donde llega el filo
   que separa una columna de la otra, y de sobrarle se veia una raya larga
   empezando sobre la nada. Y adentro van centrados, no apoyados al pie: al que
   le sobra lugar le queda la mitad arriba y la mitad abajo, en vez de todo
   arriba. */
.dib { display: grid; align-content: center; min-height: 152px; margin-bottom: 38px; }
.maneras h3 {
  font-family: var(--serif); font-size: clamp(18px, 1.5vw, 21px);
  font-weight: 500; letter-spacing: -.02em;
  text-wrap: balance;
}
.maneras p { margin-top: 10px; color: var(--tinta-3); font-size: 14.5px; line-height: 1.5; }

/* ---- opcion multiple: las cuatro pastillas, ya contestadas ---- */
.dib-op { gap: 7px; }
.op {
  display: flex; align-items: center; gap: 10px;
  padding: 11px 13px;
  border: 1px solid var(--linea-fina); border-radius: 12px;
  background: var(--glass-hi);
  color: var(--tinta);
}
/* El renglon de adentro es el texto de la opcion. Los cuatro anchos estan en
   el marcado y son parecidos entre si: si la correcta fuera la mas larga se
   elegiria sola, que es lo que dice el parrafo de abajo que no pasa. */
.op i { display: block; height: 6px; width: var(--w, 70%); border-radius: 4px; background: currentColor; opacity: .26; }
.op.buena { background: var(--solido); border-color: transparent; color: var(--sobre-solido); box-shadow: var(--canto-hi); }
.op.buena i { opacity: .3; }
.op-tilde {
  width: 12px; height: 12px; margin-left: auto; flex-shrink: 0;
  fill: none; stroke: currentColor; stroke-width: 3;
  stroke-linecap: round; stroke-linejoin: round;
}
/* Los cuatro dibujos se contestan UNA vez, cuando la seccion entra, y se
   quedan contestados. En bucle cada uno volvia a empezar cada seis segundos, y
   lo que se veia no era una respuesta sino cuatro cosas titilando: el corte
   entre el final de una vuelta y el principio de la siguiente no existe en
   ningun lado de la app, y aca se leia como un error.

   Por eso van con `both` y un retraso, y no con `infinite`: lo escrito en el
   CSS sigue siendo la pose final -contestada-, la animacion la tapa con la
   pose de antes mientras espera su turno, y al terminar la suelta ahi mismo.

   Los retrasos son el orden en que se leen las cuatro columnas, de izquierda a
   derecha, para que no se contesten las cuatro al mismo tiempo. */
.viva .dib-op .buena { animation: op-elegida .42s var(--ease) .75s both; }
@keyframes op-elegida {
  from { background: var(--glass-hi); border-color: var(--linea-fina); color: var(--tinta); box-shadow: none; }
}
.viva .op-tilde { animation: tilde-llega .4s var(--ease) .95s both; }
@keyframes tilde-llega {
  from { opacity: 0; transform: scale(.72); }
}

/* ---- el hueco: se escribe abajo y cae arriba ---- */
.dib-hueco { gap: 14px; }
.hueco-frase {
  font-family: var(--serif); font-size: clamp(15.5px, 1.25vw, 17px);
  line-height: 1.65; letter-spacing: -.012em;
}
/* El hueco es un subrayado del ancho de lo que va adentro, igual que en la
   app. La palabra esta escrita ahi desde el principio -la frase no cambia de
   largo cuando llega, que es lo que haria saltar el renglon entero- y lo unico
   que llega es su color.
   Y llega el COLOR y no la opacidad: la opacidad se lleva puesto el subrayado,
   que es justamente lo que tiene que estar antes que nada. Un hueco sin raya
   no es un hueco, es un espacio. */
/* Y el color de la palabra es el veredicto, como en la app: verde cuando lo
   que escribiste es esa, rojo cuando es otra. Aca esta bien, asi que es verde;
   es el unico lugar de la seccion que no lleva el tono de la app, porque este
   color no dice de que es sino si estuvo bien. */
.hueco-frase .cae {
  display: inline-block; min-width: 5.5ch;
  padding: 0 .14em;
  border-bottom: 2px solid var(--acierto-borde);
  color: var(--acierto); font-style: normal;
  text-align: center;
}
.viva .hueco-frase .cae { animation: hueco-cae .5s var(--ease) 1.5s both; }
@keyframes hueco-cae {
  from { color: transparent; border-bottom-color: var(--edge-hi); }
}

/* La casilla donde se escribe. Va debajo de la frase y no al lado, que es como
   esta en la app: primero se lee que falta y despues se contesta. */
.hueco-casilla {
  display: flex; align-items: center; gap: 2px;
  padding: 10px 13px;
  border: 1px solid var(--linea-fina); border-radius: 12px;
  background: var(--glass-hi);
  color: var(--tinta); font-size: 14px;
}
/* Se llama .hueco-cursor y no .cursor: .cursor ya es el puntero de la demo de
   arrastrar y soltar, que es absoluto y vive clavado al centro de su escena.
   Con ese nombre, la barrita salia de la casilla y se iba a flotar al lado del
   titulo de la seccion, que es donde caia el centro del ancestro posicionado
   que encontraba. */
.hueco-casilla .hueco-cursor { width: 1.5px; height: 16px; background: var(--tinta-2); }
/* Lo escrito aparece antes que lo que cae arriba: es lo que lo causa. Con
   reduced-motion las dos estan puestas y la frase se lee entera igual. */
.viva .hueco-casilla span { animation: hueco-escribe .35s var(--ease) .95s both; }
@keyframes hueco-escribe {
  from { opacity: 0; }
}
/* El cursor es lo unico que sigue latiendo, porque es un cursor. Con fundido y
   no seco: a este tamaño el corte de un cursor de verdad se lee como un
   titileo de algo que se rompio. */
.viva .hueco-casilla .hueco-cursor { animation: cursor-late 1.25s ease-in-out infinite; }
@keyframes cursor-late { 0%, 100% { opacity: 1; } 50% { opacity: .12; } }

/* ---- explicarlo en voz alta: lo que devuelve, no el microfono ---- */
.dib-hablar { justify-items: start; gap: 16px; }
/* La misma onda que la del paso 2, con el tono de la seccion y menos barras:
   la columna es mas angosta. Late con el mismo keyframe, que es el de alla. */
.hablar-onda { display: flex; align-items: center; justify-content: space-between; width: 100%; height: 40px; color: rgb(var(--tono)); }
.hablar-onda i { flex: 0 0 3px; height: 100%; border-radius: 2px; background: currentColor; opacity: .6; transform: scaleY(var(--a, .5)); }
.hablar-onda i:nth-child(1)  { --a: .3; }
.hablar-onda i:nth-child(2)  { --a: .62; }
.hablar-onda i:nth-child(3)  { --a: .92; }
.hablar-onda i:nth-child(4)  { --a: .44; }
.hablar-onda i:nth-child(5)  { --a: .74; }
.hablar-onda i:nth-child(6)  { --a: 1; }
.hablar-onda i:nth-child(7)  { --a: .38; }
.hablar-onda i:nth-child(8)  { --a: .66; }
.hablar-onda i:nth-child(9)  { --a: .9; }
.hablar-onda i:nth-child(10) { --a: .32; }
.hablar-onda i:nth-child(11) { --a: .78; }
.hablar-onda i:nth-child(12) { --a: .52; }
.hablar-onda i:nth-child(13) { --a: .86; }
.hablar-onda i:nth-child(14) { --a: .28; }
.viva .hablar-onda i { animation: suena-late 1.1s ease-in-out infinite; }
.viva .hablar-onda i:nth-child(odd)  { animation-duration: .94s; }
.viva .hablar-onda i:nth-child(3n)   { animation-delay: -.4s; }
.viva .hablar-onda i:nth-child(4n+1) { animation-delay: -.68s; }

.dib-hablar .hablar-cuenta { display: flex; align-items: center; flex-wrap: wrap; gap: 5px 10px; color: var(--tinta-3); font-size: 12.5px; }
/* Las cinco ideas que tenia la lamina y las tres que dijiste. El hueco de las
   dos apagadas es todo lo que esta manera tiene para decir. */
.ideas { display: inline-flex; gap: 5px; }
.ideas i { width: 9px; height: 9px; border-radius: 50%; border: 1px solid rgba(var(--tono), .45); }
.ideas i.on { background: rgb(var(--tono)); border-color: transparent; }
.viva .ideas i.on { animation: idea-dicha .4s var(--ease) 1.15s both; }
.viva .ideas i.on:nth-child(2) { animation-delay: 1.3s; }
.viva .ideas i.on:nth-child(3) { animation-delay: 1.45s; }
@keyframes idea-dicha {
  from { background: transparent; transform: scale(.8); }
}

/* ---- la abierta: la pregunta sola, y el veredicto ---- */
.dib-abierta { gap: 18px; justify-items: start; }
.abierta-txt {
  font-family: var(--serif); font-size: clamp(15.5px, 1.25vw, 17px);
  line-height: 1.5; letter-spacing: -.015em;
  /* Equilibrada: la pregunta es lo unico que hay en este dibujo, y una
     pregunta de dos renglones donde el segundo son dos palabras sueltas se lee
     como un renglon que sobro. El navegador reparte lo que ya iba a usar. */
  text-wrap: balance;
}
.abierta-juicio { display: flex; flex-wrap: wrap; gap: 8px; }
.abierta-juicio span {
  padding: 8px 14px;
  border: 1px solid var(--linea-fina); border-radius: 999px;
  background: var(--glass-hi-2);
  color: var(--tinta-2); font-size: 12.5px;
}
.abierta-juicio .solido {
  background: var(--solido); border-color: transparent;
  color: var(--sobre-solido); font-weight: 550;
  box-shadow: var(--canto-hi);
}
/* Los dos botones llegan despues, que es el orden real: primero se contesta en
   la cabeza y recien ahi hay algo que juzgar. */
.viva .abierta-juicio span { animation: juicio-llega .45s var(--ease) 1.65s both; }
.viva .abierta-juicio span:nth-child(2) { animation-delay: 1.78s; }
@keyframes juicio-llega {
  from { opacity: 0; transform: translateY(7px); }
}

/* De a dos, y despues de a una: cuatro columnas de menos de 200px dejan el
   dibujo mas angosto que su propio titulo. Apiladas el filo se acuesta, que es
   lo unico que sigue separando una manera de la siguiente. */
@media (max-width: 1040px) {
  .maneras { grid-template-columns: 1fr 1fr; row-gap: clamp(34px, 4.5vw, 52px); }
  .manera:nth-child(odd) { border-left: 0; padding-left: 0; }
  .manera:nth-child(even) { padding-right: 0; }
}
@media (max-width: 640px) {
  .maneras { grid-template-columns: 1fr; row-gap: 0; }
  .manera {
    padding: 30px 0;
    border-left: 0; border-top: 1px solid var(--linea-fina);
  }
  .manera:first-child { padding-top: 0; border-top: 0; }
  .manera:last-child { padding-bottom: 0; }
  .dib { min-height: 0; }
}

/* ---- cierre ---- */

.cierre { padding: clamp(70px, 9vw, 120px) var(--gutter) clamp(50px, 7vw, 90px); text-align: center; }
.cierre .ancho { display: grid; justify-items: center; gap: 18px; }
/* El subtitulo va mas angosto que la medida comoda de lectura: debajo de un
   titulo de tres renglones cortos, un parrafo que se estira mas ancho que el
   titulo desarma el bloque. Que sobre aire a los costados es lo que lo deja
   colgando del centro. */
.cierre p { color: var(--tinta-2); font-size: 17.5px; line-height: 1.5; max-width: 29ch; }
.cierre .acciones { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-top: 14px; }
/* El muneco del cierre. Viene entero de style.css: aca solo se le dice de que
   tamano -adentro esta todo en em- y que la mirada la maneja una variable.

   Los dos ojos se mueven juntos, como un par: moverlos por separado los
   desalinea y deja de leerse como una mirada. Y se corre el CONTENEDOR y no
   cada ojo, porque cada ojo ya tiene su propio transform, que es el que usan
   los animos para achatarlos o girarlos; pisarlo seria perder el parpadeo.

   Sin transicion a proposito: la posicion la escribe el JS dentro de un
   requestAnimationFrame, asi que ya viene suavizada por el cuadro. Una
   transicion encima le agregaria un retraso contra el puntero, que es
   justamente lo que hace que una mirada se sienta muerta. */
.cierre .cara { font-size: clamp(84px, 9.5vw, 132px); margin-bottom: 38px; }
.cierre .cara .ojos { transform: translate(var(--mira-x, 0em), var(--mira-y, 0em)); }

/* Menos en el telefono. Ahi no hay puntero que seguir, asi que el JS le sortea
   un lugar cada tanto y el ojo salta ahi: una transicion corta y seca, que es
   como se mueve un ojo de verdad -salta y se queda quieto, nunca se desliza-.
   La curva frena al final sin rebotar: un ojo que rebota se lee como un juguete.
   Y la transicion existe SOLO en este modo, que con el puntero la posicion se
   escribe cuadro a cuadro y cualquier retraso encima es lo que mata la mirada.
   Las cien milesimas estan tambien en landing.js, para no empezar a contar el
   descanso antes de que el ojo llegue: si aca se cambian, alla tambien. */
.cierre .cara.pasea .ojos { transition: transform .1s cubic-bezier(.25, .75, .35, 1); }

/* ------------------------------------------------ como se llama --------- */
/* El muneco tiene nombre y la pagina no lo dice en ningun lado. El que se
   queda mirandolo y le apoya el puntero en la cabeza se entera: sale un globo
   de arriba con el nombre y nada mas, que es todo lo que hace falta para
   presentar a alguien. Un renglon en la pagina explicando como se llama seria
   una linea mas para leer; esto se lo encuentra el que lo busca.

   Cuelga del borde de arriba de la caja, que es donde termina la cabeza -la
   esfera llena la caja entera- y va afuera de .inclina a proposito: adentro se
   ladearia con la cabeza cada vez que el se rie del boton de al lado, y el
   nombre quedaria torcido.

   Todo en px: adentro de .cara el font-size es el de la cabeza -132px aca- y
   cualquier medida en em saldria del tamano de un titulo. */
.cierre .cara .chapa {
  position: absolute;
  left: 50%; bottom: calc(100% + 14px);
  z-index: 2;
  width: max-content;
  padding: 7px 13px 8px;
  border-radius: 999px;
  border: 1px solid var(--edge);
  /* Opaco, igual que el globo del visor: el resplandor de la cabeza pasa justo
     por detras y a traves de un vidrio el nombre se ensucia. El color se arma
     apoyando el mismo vidrio sobre el papel, que es lo que hace el panel de
     idiomas, asi queda del tono que tendria si fuera translucido sin serlo. */
  background: linear-gradient(var(--vidrio-papel-op), var(--vidrio-papel-op)), var(--papel);
  box-shadow: var(--sombra), var(--canto);
  font-size: 14px; font-weight: 550; line-height: 1; letter-spacing: -.005em;
  color: var(--tinta);
  /* No toma el puntero: la mirada lo sigue cuadro a cuadro y un globo que se
     queda con el hover se apagaria solo apenas aparece. */
  pointer-events: none;
  opacity: 0;
  transform: translate(-50%, 5px);
  transition: opacity .16s ease, transform .3s var(--resorte);
}
/* La colita: el mismo cuadrado girado que el globo del visor, con el canto en
   los dos lados que quedan para afuera. Monta medio cuerpo sobre el globo, y
   como el globo es opaco, el borde que cruza por atras queda tapado. */
.cierre .cara .chapa::after {
  content: '';
  position: absolute;
  left: 50%; bottom: -4px;
  width: 8px; height: 8px;
  margin-left: -4px;
  background: linear-gradient(var(--vidrio-papel-op), var(--vidrio-papel-op)), var(--papel);
  border-right: 1px solid var(--edge);
  border-bottom: 1px solid var(--edge);
  border-radius: 0 0 2px 0;
  transform: rotate(45deg);
}
/* Se presenta cuando el puntero esta sobre LA CABEZA y no sobre la caja: la
   caja es un cuadrado y la cabeza es el circulo de adentro, asi que apuntando
   al cuerpo -que es redondo- el nombre no salta al pasar de largo por una
   esquina vacia. Va con :has() porque el globo es tio del cuerpo. */
@media (hover: hover) and (pointer: fine) {
  .cierre .cara:has(.cuerpo:hover) .chapa {
    opacity: 1;
    transform: translate(-50%, 0);
  }
}
/* Con reduced-motion aparece y ya: enciende en el lugar, sin subir. */
@media (prefers-reduced-motion: reduce) {
  .cierre .cara .chapa { transform: translate(-50%, 0); transition: opacity .16s ease; }
}

/* ---------------------------------------------- el profesor se rie ------- */
/* Apoyar el puntero en el boton de descargar es lo ultimo que pasa antes de
   decidir, y es el unico momento del sitio donde algo contesta el gesto antes
   del clic: el profesor arquea los ojos, ladea la cabeza y se sacude de risa.
   No es un adorno suelto; es el que te va a explicar diciendote que si.

   El enganche va con :has() y no con JS: el boton y la cara son hermanos
   adentro del mismo bloque, asi que el CSS puede mirar uno y pintar el otro. Y
   entra el foco de teclado tambien, porque el que llega tabulando esta tomando
   la misma decision que el que llega con el mouse. */
@media (hover: hover) and (pointer: fine) {
  .cierre .ancho:has(.acciones .btn.primario:is(:hover, :focus-visible)) .cara {
    --tilt: -7deg;   /* la cabeza se ladea, que es lo que hace uno al reirse */
    --voz: .32;      /* y el resplandor sube, como si se le escuchara */
  }
  /* La misma pose que el animo "contento" de la app: el ojo arqueado, el
     reflejo apagado. No se toca el data-animo porque ese lo maneja el JS de la
     app; esto es un estado del puntero y se queda en el CSS. */
  .cierre .ancho:has(.acciones .btn.primario:is(:hover, :focus-visible)) .cara .ojo {
    transform: translateY(-16%) scale(1.2, .42);
  }
  .cierre .ancho:has(.acciones .btn.primario:is(:hover, :focus-visible)) .cara .ojo i {
    border-radius: 100% 100% .05em .05em;
  }
  .cierre .ancho:has(.acciones .btn.primario:is(:hover, :focus-visible)) .cara .ojo i::after {
    opacity: 0;
  }
}

/* La sacudida va en el cuerpo y no en la cara entera: la cara tiene el origen
   del transform en la esquina -lo usa la app para volar de un lugar a otro- y
   un scale ahi saldria disparado en diagonal. Los ojos viajan con el cuerpo
   porque cuelgan de el, que es lo que hace que se lea como una sola cabeza
   sacudiendose y no como una pelota con dos cosas encima. */
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .cierre .ancho:has(.acciones .btn.primario:is(:hover, :focus-visible)) .cara .cuerpo {
    animation: risa .9s var(--ease) infinite;
  }
}
/* Los pasos de la risa viven en style.css, al lado de la cara: el que festeja
   el final del documento en la app se sacude con los mismos. */

.cierre .letra-chica { color: var(--tinta-3); font-size: 14px; }

/* ---------------------------------------------------------------------- pie */

/* El pie es lo unico del sitio que no es papel ni lienzo: es una ventana. La
   pagina entera es negra y plana, y abajo de todo se abre un paisaje pintado,
   como levantar la vista del cuaderno y encontrarse con que habia una ventana
   al lado de la mesa. Es el mismo remate de antes -algo que se descubre al
   final- pero al reves: en vez de cerrar en blanco, cierra en profundidad.

   Y por eso la paleta se da vuelta: la tinta pasa a ser blanca. Escrita aca
   nomas, porque el pie es el unico lugar del sitio que la usa. */
.lp-pie {
  --papel: #0d1014;
  --tinta: #fff;
  --tinta-2: rgba(255, 255, 255, .78);
  --tinta-3: rgba(255, 255, 255, .58);
  --linea: rgba(255, 255, 255, .2);
  --linea-fina: rgba(255, 255, 255, .1);
  color: var(--tinta);
}

/* El velo es lo que vuelve legible al paisaje, y no es parejo: arriba, donde
   esta el cielo -lo mas claro que tiene la foto- y ademas donde caen los
   titulos y los enlaces, tapa mas; abajo, donde el campo ya es oscuro de por
   si y lo unico que hay es la marca grande, se abre y deja ver la pintura.
   Con un tinte plano las dos mitades quedaban mal: legible arriba dejaba el
   pasto convertido en barro, y legible abajo el cielo se comia los enlaces.

   El --papel de arriba queda como el color de atras de todo: es el que se ve
   el instante en que la foto todavia no cargo, y el que evita que el filo
   redondeado de la pagina recorte contra un blanco que ya no existe. */
.lp-pie {
  background-color: var(--papel);
  background-image:
    linear-gradient(180deg, rgba(8, 10, 13, .82) 0%, rgba(8, 10, 13, .74) 46%, rgba(8, 10, 13, .58) 100%),
    url('/static/imagenes/pie-paisaje.jpg');
  background-repeat: no-repeat;
  background-position: center 38%;
  background-size: cover;
}
/* Apilado el pie mide el doble de alto y las columnas dejan de ser cuatro para
   ser una sola, asi que los enlaces -que en el monitor viven todos arriba, en
   la parte tapada- pasan a caer justo sobre el lago y el cielo, que es lo mas
   claro de la pintura. Ahi el velo deja de ser un degrade y pasa a ser parejo:
   el paisaje se sigue viendo, pero ninguna linea de texto depende de por donde
   la agarro el recorte. */
@media (max-width: 760px) {
  .lp-pie {
    background-image:
      linear-gradient(180deg, rgba(8, 10, 13, .84), rgba(8, 10, 13, .78)),
      url('/static/imagenes/pie-paisaje.jpg');
  }
}

/* Y no scrollea con la pagina: esta clavado abajo de todo y el contenido se le
   corre por encima, como una persiana que sube y lo va descubriendo. No hay
   animacion escrita: el que la hace es el dedo, y por eso va exactamente a la
   velocidad a la que uno scrollea.

   Tres piezas: el pie fijo al fondo y sin z-index propio, TODO lo demas opaco y
   un escalon arriba -si no, el pie se ve a traves de la pagina entera-, y abajo
   de todo el hueco que hay que dejar para que el pie se pueda descubrir, que es
   justo su alto y lo mide landing.js.

   La clase la pone el JS y solo cuando el pie entra en la pantalla: si es mas
   alto que la ventana no habria forma de llegar a verlo entero, asi que ahi se
   queda quieto como cualquier pie de pagina. */
/* El hueco de abajo es EXACTAMENTE lo que mide el pie, sin los 108 del dock.
   Con esos 108 de mas, al llegar al final la hoja terminaba un poco arriba del
   pie y las dos puntas redondeadas recortaban contra el fondo de la pagina,
   que es del mismo negro: el filo se veia recto justo abajo del todo. Sin
   ellos la hoja apoya sobre el papel blanco y las puntas se ven. El dock no
   necesita su hueco aca porque abajo de todo lo que hay es pie. */
/* El hueco de abajo es lo que mide el pie MENOS el radio del filo. Ese radio de
   menos es la otra mitad de lo mismo que resuelve el margin-top negativo del
   pie cuando no esta clavado: con el pie fijo el margen no hace nada -un
   elemento fijo se ubica por su bottom-, asi que el que se corre es el otro,
   la pagina, que termina apoyando su filo un radio ADENTRO del papel.

   Sin eso, abajo del todo el filo cae justo en el borde de arriba del pie y
   las dos puntas redondeadas recortan contra el negro del lienzo, que es el
   mismo negro de la seccion: la pagina termina en escuadra justo en el unico
   momento en que ese filo se mira. */
body.pie-fijo { padding-bottom: calc(var(--pie-alto, 0px) - var(--filo)); }
/* Sin el pie clavado, el hueco del dock deja de ser del cuerpo. Clavado, el
   hueco de abajo es el que descubre el pie y lo mide el JS; sin clavar -el pie
   apilado de un telefono no entra en la ventana y ahi se queda quieto- esos
   108 pixeles quedan al final de todo, DEBAJO del pie, y son una banda negra
   cruzando el paisaje justo en el ultimo centimetro de la pagina.
   El hueco lo sigue habiendo, porque el dock flota igual y taparia la marca
   grande: lo que cambia es de quien es. Puesto adentro del pie, el paisaje
   llega hasta el borde y el dock flota sobre el, que es lo que hace en todo el
   resto de la pagina. Y la pagina que no tiene dock no necesita ninguno. */
body.lp:not(.pie-fijo) { padding-bottom: 0; }
body.lp:not(.pie-fijo):not(.sin-dock) .lp-pie { padding-bottom: 108px; }

body.pie-fijo .lp-pie {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 0;
}
/* Los bloques son opacos y estan un escalon arriba del pie SIEMPRE, no solo
   cuando el pie se clava: es lo que deja que el pie se meta por debajo de la
   ultima seccion y que las puntas redondeadas del final muestren el blanco de
   atras en vez de recortar contra el mismo negro.

   La lista de excepciones es lo que NO es un bloque de la pagina: el pie, el
   dock, la barra de lectura, los dibujos y -la ultima- el formulario de la
   espera, que es un <dialog> y por eso cuelga del body como los bloques sin
   ser uno. Puesto en relativo se queda anclado al documento en vez de a la
   ventana, asi que abierto con la pagina scrolleada se dibuja fuera de
   pantalla; y el fondo de esta regla le tapa el suyo, que es el unico del
   sitio que no es traslucido. */
body.lp > *:not(.lp-pie):not(.lp-nav):not(.lectura):not(.iconos):not(.marca-lente):not(.dupla-pieza):not(.espera) {
  position: relative;
  z-index: 1;
  /* Por variable y no el color directo: la ultima hoja -la que se levanta y
     descubre el pie- pinta su fondo de otra manera, y escrito asi lo cambia
     ella sola sin tener que volver a escribir esta lista de excepciones para
     ganarle por especificidad. */
  background: var(--hoja, var(--papel));
}
/* El bloque que tiene un objeto agarrado sube un escalon mas. Como cada bloque
   es opaco y esta al mismo nivel, el de abajo -que viene despues en el
   marcado- le gana por orden de pintado, y un post-it arrastrado hacia abajo
   desaparecia detras de la seccion siguiente por mas z-index que tuviera
   adentro. Lo que sube no es el objeto: es la seccion donde vive. La clase la
   pone landing.js, junto con la del objeto. */
body.lp > .alzado:not(.lp-pie):not(.lp-nav):not(.lectura):not(.iconos):not(.marca-lente):not(.dupla-pieza):not(.espera) { z-index: 2; }

/* El filo de la pagina sobre el pie: la sombra es lo que dice que una cosa esta
   por encima de la otra y no que cambio el fondo, y las dos puntas redondeadas
   son las que la vuelven una hoja apoyada encima en vez de un corte.

   Va sin la condicion del pie fijo. Antes el radio solo existia con el pie
   clavado, asi que en cuanto el pie no entraba en la ventana -una pantalla
   baja, el pie apilado- la pagina terminaba en escuadra justo al llegar abajo
   del todo, que es el unico momento en que ese filo se mira.

   La hoja que apoya sobre el pie es, literalmente, la que viene justo ANTES
   del pie, y eso es lo que dice el selector. Con :last-of-type decia otra
   cosa: ultimo de SU etiqueta. En una pagina de texto -los terminos, una nota
   del blog, una comparativa- el <article> es el unico article y la seccion de
   cierre es la unica section, asi que las dos eran "la ultima" y el filo
   aparecia tambien en el medio de la pagina, cortando el texto. */
body.lp > *:has(+ .lp-pie) {
  border-bottom-left-radius: var(--filo);
  border-bottom-right-radius: var(--filo);
  box-shadow: 0 24px 50px rgba(0, 0, 0, .55);
}

/* ---- y se afina mientras se levanta ---- */
/* La ultima hoja no es papel: es una filmina, que es lo que el producto se
   llama. Mientras sube y va descubriendo el pie, el borde de abajo se afina y
   la pintura empieza a pasar por detras, apenas: no se ve la foto, se ve que
   ALGO hay atras. Es el gesto de levantar una lamina contra la luz, y es lo
   ultimo que hace la pagina antes de terminar.

   Tres cosas lo mantienen sutil y legible:

   - Va de abajo hacia arriba. Lo transparente es el filo, que es lo que se
     esta levantando; a media hoja ya esta opaca de nuevo, asi que ni el texto
     del cierre ni el muneco quedan nunca sobre la pintura.
   - Lo maneja --vela, que landing.js sube de 0 a 1 a medida que el pie se
     descubre. Con la hoja abajo del todo la lamina es opaca como cualquier
     otra seccion: el efecto no existe hasta que hay algo que mirar detras.
   - El filo se desenfoca. Sin eso, por la parte de arriba del pie pasan los
     enlaces de las columnas y se leian en fantasma a traves de la hoja, que se
     ve como un error de pintado. Desenfocado, lo que pasa son manchas -el
     cielo, los arboles, el lago- y eso es justo lo que tiene que pasar.

   Solo con el pie clavado: si no se clava, detras de la hoja no hay pintura
   sino el negro del lienzo, y afinarla ahi es transparentar la nada. */
body.pie-fijo > *:has(+ .lp-pie) {
  --hoja: linear-gradient(to top,
    rgba(var(--tono-papel), calc(1 - var(--vela, 0) * .18)) 0,
    rgba(var(--tono-papel), calc(1 - var(--vela, 0) * .06)) 120px,
    rgba(var(--tono-papel), 1) 280px);
}
/* El desenfoque va en una capa propia y no en la hoja entera: pedirle al
   navegador el fondo borroso de una seccion de mil pixeles de alto, en cada
   cuadro del scroll, para usarlo en los ultimos doscientos, es trabajo tirado.

   Con z-index negativo queda detras del contenido y encima del fondo de la
   hoja, que es lo unico que necesita: lo que desenfoca es lo que hay mas
   abajo, que es el pie. Y la mascara lo apaga hacia arriba, para que el borde
   de la capa no se marque como una linea cruzando la seccion.

   La capa existe solo mientras la hoja se esta levantando -la clase la pone
   landing.js junto con --vela-: un desenfoque de fondo puesto todo el tiempo
   le pide al navegador que lo recalcule en cada cuadro de toda la pagina,
   tambien las ocho secciones en las que no se ve. */
body.pie-fijo.levantando > *:has(+ .lp-pie)::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 280px;
  z-index: -1;
  border-bottom-left-radius: inherit;
  border-bottom-right-radius: inherit;
  opacity: var(--vela, 0);
  -webkit-backdrop-filter: blur(40px);
  backdrop-filter: blur(40px);
  -webkit-mask-image: linear-gradient(to top, #000 40%, transparent);
  mask-image: linear-gradient(to top, #000 40%, transparent);
  pointer-events: none;
}


/* El pie se mete por debajo de la ultima seccion, justo lo que mide el radio:
   sin eso las puntas redondeadas recortan contra el fondo de la pagina, que es
   del mismo negro que la seccion, y no se ve ningun filo. Con el pie clavado
   no hace nada, porque un elemento fijo se ubica por su bottom.

   Y el aire de arriba es casi el doble que antes. El pie es el unico papel
   blanco del sitio; si el primer titulo aparece apenas cruza el filo, se lee
   como la seccion que sigue y no como el final de la pagina. */
.lp-pie {
  margin-top: calc(var(--filo) * -1);
  padding: min(clamp(84px, 10vw, 140px), 14vh) 0 0;
  border-top: 1px solid var(--linea);
}
.lp-pie .cols {
  display: grid; grid-template-columns: 1.6fr 1fr 1fr 1fr 1fr; gap: 30px;
  max-width: var(--ancho); margin: 0 auto; padding: 0 var(--gutter);
}
.lp-pie h4 { font-family: var(--serif); font-size: 21px; font-weight: 500; margin-bottom: 18px; }
.lp-pie ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 11px; }
.lp-pie li a { color: var(--tinta-2); font-size: 15px; }
.lp-pie li a:hover { color: var(--tinta); }

/* Las dos redes, abajo de los legales. Son pastillas redondas del tamaño de un
   dedo: el pie es lo ultimo de la pagina y en el telefono es donde uno llega
   con el pulgar. El fondo del hover sale de --linea-fina y no de --glass-hi
   porque aca el papel es blanco, y el vidrio del resto del sitio -que es luz
   sobre negro- sobre blanco no se ve. */
.lp-pie .redes { display: flex; gap: 10px; margin-top: 22px; }
.lp-pie .redes a {
  display: grid; place-items: center;
  width: 38px; height: 38px;
  border: 1px solid var(--linea);
  border-radius: 999px;
  color: var(--tinta-2);
  transition: color .2s ease, background .2s ease, border-color .2s ease,
              transform .35s var(--resorte);
}
.lp-pie .redes a:hover {
  color: var(--tinta);
  background: var(--linea-fina);
  border-color: var(--tinta-3);
  transform: translateY(-2px);
}
/* La X es una marca y va rellena; el sobre es un icono nuestro y va de linea,
   con el mismo grosor que los demas. Por eso el sobre va un pelin mas grande:
   a igual caja, un dibujo de linea pesa menos que uno macizo. */
.lp-pie .red { display: block; }
.lp-pie .red-x { width: 15px; height: 15px; fill: currentColor; stroke: none; }
.lp-pie .red-sobre {
  width: 18px; height: 18px;
  fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}
/* La marca grande del final. Ocupa el ancho de la caja, con la F pegada a la
   palabra como en la portada: es la firma del sitio, y una firma se lee de un
   golpe o no se lee.

   El tamano sale de un vw y no de un px fijo, asi que crece con la pagina y
   siempre termina a la misma distancia del borde. El tope en px es para que en
   una pantalla muy ancha deje de crecer -a partir de cierto punto ya no se lee
   como palabra sino como textura- y el piso, para que en un telefono siga
   siendo un remate y no un titulo mas. */
.pie-marca {
  container-type: inline-size;
  max-width: var(--ancho); margin: min(clamp(30px, 5vw, 64px), 6vh) auto 0;
  padding: 0 var(--gutter);
  color: var(--tinta);
  overflow: hidden;
  user-select: none;
}
/* El tamano se mide contra la caja y no contra la ventana: con un vw la marca
   llenaba el ancho en una pantalla y le sobraban diez centimetros en la otra,
   porque la caja deja de crecer en 1220 y la ventana no. Con cqw la palabra
   termina SIEMPRE donde termina la columna, en el telefono y en el monitor.
   El 34.8 sale de medirla: la palabra sola ocupa 2.87 veces el cuerpo. */
/* El cuerpo sale de la variable y no del cqw a secas por una razon sola: si el
   pie no entra en la ventana deja de clavarse, y entonces la pagina termina
   scrolleando por encima de su propio filo redondeado. Cuando pasa eso,
   landing.js escribe --firma con lo justo para que el pie entre. Mientras haya
   lugar -que es casi siempre- la variable no existe y la palabra sigue
   terminando exactamente donde termina la columna. */
/* Y el eje optico va clavado. Merriweather trae uno, y el navegador lo mueve
   solo: por debajo de 144 le ensancha la letra para que se lea de chica. En el
   monitor la palabra pide 144 y mide los 2.87 cuerpos de siempre; en el
   telefono el cuerpo cae a 116 y la misma palabra pasaba a medir 3, o sea un
   4% mas de ancho del que hay, y el overflow del pie le cortaba la "a". Con el
   eje quieto la proporcion es una sola en las dos pantallas, que es justo lo
   que el 34.8 da por sentado. El peso va escrito al lado porque esta linea
   reemplaza los ejes por los de la fuente y si no se lleva puesto el 500. */
.pie-marca-linea {
  display: inline-block;
  font-family: var(--serif); font-weight: 500;
  font-variation-settings: "opsz" 144, "wght" 500;
  font-size: var(--firma, 34.8cqw);
  line-height: .82;
  letter-spacing: -.045em;
  white-space: nowrap;
}

/* ---- el cursor de la marca ---- */

/* La palabra grande no es un remate nada mas: es el camino de vuelta al
   inicio. Para que se lea como algo en lo que se puede hacer clic sin ponerle
   una caja ni un subrayado -que a este cuerpo serian una linea de dos
   centimetros cruzando el pie- lo que cambia es el CURSOR: sobre la marca la
   flecha del sistema se apaga y en su lugar aparece la misma flecha, pero
   hecha de vidrio ahumado y del tamano de un objeto.

   El vidrio va escrito aca y no con los tokens del visor: los de la app estan
   hechos para el fondo negro y esto vive en la unica isla blanca del sitio.
   Y es vidrio OSCURO sobre papel blanco, asi que el problema es al reves del
   de la app: lo que hay que resolver es el tramo en que la flecha pasa por
   encima de las letras negras de la marca, donde el ahumado se funde con el
   fondo. Lo resuelven el filo de luz del contorno y la segunda sombra, que es
   clara: ahi la pieza deja de ser una mancha y pasa a ser un contorno, que es
   exactamente lo que le pasa a un vidrio oscuro apoyado sobre algo oscuro. */

/* Sin puntero fino no hay hover, asi que no hay nada que reemplazar y la
   flecha del sistema se queda. Y con reduced-motion tampoco: una pieza que
   persigue al cursor es justo el movimiento que nadie pidio. El enlace
   funciona igual en los tres casos. */
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .pie-marca-linea { cursor: none; }
}
.pie-marca-linea:focus-visible { outline: 2px solid var(--tinta); outline-offset: 10px; border-radius: 6px; }

/* Son dos cajas y no una porque son dos movimientos que no se pueden pisar: la
   de afuera la escribe el JS en cada cuadro para seguir al puntero -sin
   transicion, la suavidad la pone el propio bucle- y la de adentro es la que
   crece y se enciende al entrar, con su transicion de siempre. */
.marca-lente {
  position: fixed;
  top: 0; left: 0;
  z-index: 70;
  /* Es un dibujo que sigue al puntero: el que recibe el clic es el enlace de
     abajo, asi que no se toca. */
  pointer-events: none;
  will-change: transform;
}

.lente-flecha {
  position: absolute;
  /* La punta del dibujo no cae en la esquina del viewBox: la union redonda le
     come un par de unidades en diagonal. Y es la PUNTA, no la esquina, la que
     tiene que quedar sobre el puntero -un cursor que apunta dos pixeles al
     costado de donde uno cree se nota-, asi que la caja se corre lo que la
     punta se metio. */
  left: -2.6px; top: -.5px;
  width: 58px; height: auto;
  /* Nace y crece desde la punta, por lo mismo: con el origen en el medio la
     pieza salia de abajo a la derecha del puntero y volvia, que se lee como
     algo que se cayo y se acomodo, no como algo que aparece donde esta la
     mano. */
  transform-origin: 2.6px .5px;
  /* Una sola sombra, y oscura. Antes habia ademas un pelo de luz pegado al
     filo: con el pie de papel blanco servia para el tramo en que la flecha
     cruzaba las letras negras de la marca, donde la sombra oscura no existe y
     la pieza se quedaba sin borde de un lado. Sobre la foto ese pelo dejo de
     ser un pelo: contra un fondo oscuro cualquier luz se ve, y lo que se leia
     alrededor del vidrio era un halo blanco difuso, como si la flecha
     estuviera encendida. El borde ya lo pone el filo del dibujo, que es medio
     punto de luz parejo y va adentro de la pieza, no alrededor. */
  filter: drop-shadow(0 14px 24px rgba(0, 0, 0, .5));
  opacity: 0;
  transform: scale(.55);
  transition: opacity .24s var(--ease), transform .42s var(--ease);
}
.marca-lente.viva .lente-flecha { opacity: 1; transform: scale(1); }
/* Mientras el boton esta apretado la pieza se hunde un poco: es la unica
   respuesta al clic que hay, porque la pagina se va enseguida. */
.marca-lente.apretada .lente-flecha { transform: scale(.9); }

/* El trazo grueso es el que redondea: la silueta se dibuja en punta, engorda
   pareja de los dos lados y las esquinas salen redondas sin dibujarlas. Si se
   cambia el grosor cambian el tamano Y el redondeo, que van juntos. */
.lente-flecha .cur-cara,
.lente-flecha .cur-canto,
.lente-flecha .cur-filo {
  stroke-linejoin: round;
  stroke-linecap: round;
}
.lente-flecha .cur-cara  { stroke-width: 11; fill: url(#cur-g-cara);  stroke: url(#cur-g-cara); }
.lente-flecha .cur-canto { stroke-width: 11; fill: url(#cur-g-canto); stroke: url(#cur-g-canto); }
/* El filo va DEBAJO de la cara y un pelo mas gordo: lo que se ve de el es el
   sobrante, medio punto de luz parejo alrededor de toda la pieza. Dibujado
   encima, sobre la misma silueta, caeria en el MEDIO del trazo y no en el
   borde, que es donde esta el filo de un material. */
.lente-flecha .cur-filo  { stroke-width: 12.4; fill: url(#cur-g-filo); stroke: url(#cur-g-filo); }

/* El ahumado nunca llega a opaco: por debajo tienen que verse el papel y las
   letras. Mas cerrado en la punta -la parte angosta, donde el material se
   amontona- y mas abierto en el cuerpo. */
.lente-flecha .cur-s-cara-1  { stop-color: #34343c; stop-opacity: .84; }
.lente-flecha .cur-s-cara-2  { stop-color: #121215; stop-opacity: .74; }
.lente-flecha .cur-s-cara-3  { stop-color: #24242b; stop-opacity: .88; }
/* El canto es el corte del material: mas macizo que la cara, porque es espesor
   y no superficie. */
.lente-flecha .cur-s-canto-1 { stop-color: #17171b; stop-opacity: .96; }
.lente-flecha .cur-s-canto-2 { stop-color: #08080a; stop-opacity: .86; }
/* Y el filo es luz, no color: entra por arriba a la izquierda como en todo el
   sitio y se apaga hacia abajo. */
.lente-flecha .cur-s-filo-1  { stop-color: #fff; stop-opacity: .95; }
.lente-flecha .cur-s-filo-2  { stop-color: #fff; stop-opacity: .56; }
.lente-flecha .cur-s-filo-3  { stop-color: #fff; stop-opacity: .3; }

/* La luz del canto izquierdo: la linea donde se corta el material, no un
   brillo. */
.lente-flecha .cur-luz {
  fill: none;
  stroke: #fff; stroke-opacity: .7;
  stroke-width: 2.4; stroke-linecap: round;
}

/* La flecha dice que se puede apretar; el rotulo dice a donde va. Llega un
   pelo despues que ella y desde abajo, asi que se lee como algo que la flecha
   trae y no como una segunda pieza que aparece al mismo tiempo. */
.lente-rotulo {
  position: absolute;
  left: 52px; top: 64px;
  padding: 5px 11px;
  border-radius: 999px;
  background: rgba(17, 17, 19, .84);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 8px 18px rgba(17, 17, 19, .3);
  color: #f5f5f7;
  font-size: 12.5px; font-weight: 550; letter-spacing: -.01em; line-height: 1;
  white-space: nowrap;
  transform-origin: 0 0;
  opacity: 0;
  transform: translateY(6px) scale(.92);
  transition: opacity .24s .05s var(--ease), transform .42s .05s var(--ease);
}
.marca-lente.viva .lente-rotulo { opacity: 1; transform: none; }
/* La F no va abajo con la palabra grande: ahi eran dos marcas seguidas y se
   leian como una sola pieza larga. Va arriba, chica, pegada al nombre de la
   columna, que es el unico lugar del pie donde la marca se presenta. */
/* En el pie la marca va sola, sin el nombre al lado ni enlaces debajo: el
   logo ya dice de quien es la pagina y repetirlo escrito no agrega nada.
   Alineada arriba con los titulos de las otras columnas, por eso el alto es el
   de una linea de h4 y no el del dibujo. */
/* El enlace envuelve al dibujo y nada mas: en bloque tomaria el ancho entero
   de la columna y se encenderia con el puntero a dos palmos de la F. */
.lp-pie .logo-pie { display: inline-block; }
.lp-pie .logo-pie:hover .marca-pie { opacity: 1; }
.lp-pie .marca-pie {
  display: block;
  /* El 1.16 de proporcion es el del viewBox del simbolo (116x100): si el alto
     no lo respeta, el dibujo se estira. */
  width: 56px; height: 48px;
  /* El mismo gris que la marca del nav, y por el mismo camino: opacidad sobre
     la tinta del tema en vez de un gris escrito a mano, asi lo decide el papel
     y no queda un color suelto que no sigue al modo claro/oscuro.

     Sobre la foto va bastante mas encendida que cuando el pie era blanco. No
     es un cambio de criterio: es el mismo gris. Una tinta negra al 12% sobre
     papel blanco se ve; una tinta blanca al 12% sobre un paisaje que ya tiene
     nubes y cielo adentro no llega a despegarse del fondo. */
  color: var(--tinta); opacity: .3;
  transition: opacity .2s ease;
}

/* Va debajo del logo, en la primera columna: alineado a la izquierda como el
   resto de las columnas. Antes vivia en la ultima linea del pie, empujado a la
   derecha, y de ahi le quedaba el margin-left auto. */
.lp-pie .copy {
  margin: 16px 0 0;
  color: var(--tinta-3); font-size: 14px;
  /* Las tres lineas van con el mismo aire entre si; sin esto la del medio se
     abre sola, porque la foto mide mas que la letra. */
  line-height: 2;
}

/* La firma de quien lo hizo, con la cara al lado del arroba. En un sitio sin
   una sola foto es lo unico que dice que atras hay una persona y no una
   empresa, y por eso va aca y no en una pagina de "sobre mi" que nadie abre.
   El enlace se lleva la foto adentro: la cara y el nombre son una sola cosa
   para el que hace clic, y para el lector de pantalla tambien (la foto va con
   alt vacio, el nombre ya esta escrito al lado). */
.lp-pie .autor {
  display: inline-flex; align-items: center; gap: 8px;
  color: var(--tinta-3);
  vertical-align: -6px;
  transition: color .2s ease;
}
.lp-pie .autor:hover { color: var(--tinta); }
/* Redonda y del alto de una linea de texto: es una firma al margen, no una
   foto de perfil. Mas grande empieza a competir con la marca de arriba, que es
   lo que tiene que mandar en esa columna. */
.lp-pie .foto-autor {
  width: 22px; height: 22px; border-radius: 50%;
  object-fit: cover;
}

/* ================================================================== blog === */

/* La caja va de borde a borde y lo que centra la columna es el padding, no un
   max-width. No es un capricho de escritura: estas cajas son hijas directas del
   <body>, o sea que SON la hoja que se corre por encima del pie, y el fondo
   opaco que las tapa mide lo que mide la caja. Centradas con max-width, el
   papel blanco del pie asomaba por los dos costados de la columna en cuanto la
   ventana era mas ancha que el texto. La medida de adentro queda igual: el
   padding se abre hasta el borde y despues suma el gutter de siempre. */
.cabecera-pagina { padding: clamp(50px, 7vw, 96px) calc(max(0px, (100% - var(--ancho)) / 2) + var(--gutter)) 0; }
.cabecera-pagina .entrada, .franja .entrada {
  max-width: 620px; margin-top: 22px;
  color: var(--tinta-2); font-size: 18px; line-height: 1.5;
}

/* El blog entra por el lema y por nada mas: es la unica pagina del sitio que
   arriba no tiene que explicar de que se trata, asi que la frase se planta sola
   en el medio, como la tapa de un cuaderno. Centrado es una decision de esta
   pagina y por eso va en una clase aparte: el resto de las cabeceras arrancan
   contra el margen izquierdo, que es donde empieza el texto que viene despues. */
.cabecera-pagina.centrada { text-align: center; }
/* Del tamano de cualquier otro h1 del sitio: los 176px de antes estaban medidos
   para una palabra sola, y una frase a ese cuerpo se lee como un cartel y no
   como un titulo. No hay font-size aca: el que manda es el de .display, que es
   el que tienen la portada, novedades y las notas.

   Lo que si es de esta pagina son los dos renglones. A este cuerpo la frase
   entra entera en una linea que cruza la pantalla de lado a lado, y una linea
   asi de larga se lee como un renglon de texto y no como una tapa; partida al
   medio y centrada vuelve a ser un titulo. El tope va en em y no en pixeles
   para que lo fije el cuerpo de la letra y no el ancho de la ventana: la frase
   mide poco menos de 12em en castellano y en ingles, asi que con 8 no le queda
   mas remedio que bajar, y el pedazo mas largo que puede tocarle a un renglon
   -"Study has never", 7em- todavia entra sin partirse otra vez. El balance
   reparte las palabras; el tope las obliga a bajar. Una sola de las dos cosas
   no alcanza. */
.lp .cabecera-pagina.centrada h1.display {
  max-width: 8em; margin-inline: auto; text-wrap: balance;
}

/* La cola de la g necesita que le hagan lugar. Con el interlineado apretado la
   caja del renglon mide menos que la letra: el trazo baja como un octavo de em
   por debajo del borde de abajo del titulo, y ahi ya empieza el bloque que
   sigue, que es opaco -todos los hijos del body lo son, para que no se vea el
   pie blanco a traves- y viene despues en el marcado. El fondo negro del
   bloque le pasaba por encima a la cola y la palabra terminaba en un filo
   recto. Sobre negro no se lee como algo tapado: se lee como una g rota.

   El relleno va en em y en el titulo, que es quien tiene el tamano que manda:
   asi el lugar crece con la palabra en cada ancho de ventana. Y solo cuando el
   titulo esta solo en la cabecera, que es el unico caso en que abajo de el
   empieza otro bloque; si hay bajada, la cola cae adentro de la misma caja y
   no la tapa nadie.

   Diecisiete centesimas y no las trece que pide esta g: la cabecera es la
   misma para las otras lenguas y para la otra pagina que entra solo con su
   nombre, y la cola mas larga del serif no es la de la g sino la de la y. Se
   mide por esa. */
.lp .cabecera-pagina h1.display:last-child { padding-bottom: .17em; }

/* El aire contra la cabecera va de padding y no de margen: entre dos hijos del
   <body> un margen es un hueco sin fondo, y por ese hueco se veia una linea
   blanca del pie cruzando la pagina de lado a lado.

   La columna es mas angosta que el resto del sitio: el titulo de una nota va en
   serif de treinta y pico y a mil doscientos de ancho el renglon se estira
   tanto que cuesta encontrar donde empieza el que sigue. */
.entradas {
  display: grid; grid-template-columns: 1fr;
  padding: clamp(42px, 5vw, 76px) calc(max(0px, (100% - 860px) / 2) + var(--gutter)) 0;
}

/* Una debajo de la otra y separadas por una raya. Una tarjeta por nota
   convierte cinco textos en cinco objetos que hay que mirar de a uno; lo que se
   compara en un blog son los titulos, y para eso tienen que estar en la misma
   columna, sin marco alrededor y sin nada que los levante del papel. */
.nota {
  position: relative;
  /* Dos columnas: a la izquierda la fecha y el titulo, a la derecha la bajada.
     Una abajo de la otra, la bajada empieza a leerse antes de haber terminado
     de pensar el titulo, y en una lista lo que se compara son los titulos. Al
     costado no estorba: el que se detuvo en un titulo la encuentra al lado, y
     el que no, sigue bajando por una columna de titulos sin nada intercalado.
     Debajo de los 760 vuelven a apilarse, que es el unico orden que entra. */
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  column-gap: clamp(28px, 4vw, 56px);
  align-items: start;
  padding: 30px 18px 32px;
  /* El relleno de los costados se compensa con margen negativo: asi el texto
     sigue empezando donde empieza el titulo de la pagina y lo unico que sobra
     a los lados es el aire que necesita el fondo del hover para no venir
     pegado a las palabras. Son 18 y no mas: el gutter mas chico es de 20, y
     pasarse saca barra horizontal en el telefono. */
  margin-inline: -18px;
  border-radius: 12px;
  transition: background-color .2s ease;
}
/* La raya que separa no puede ser un borde del bloque: un borde sigue el radio
   y se curvaba en las dos puntas, que es justo lo que no tiene que hacer una
   linea que separa dos filas. Va de pseudoelemento, recta y de punta a punta, y
   el radio queda solo para el fondo que se enciende al pasar. Absoluto, asi que
   no entra como item del flex de arriba. */
.nota::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  background: var(--linea-fina);
}
/* La primera no lleva raya: la cabecera ya termino arriba y una raya suelta ahi
   se lee como el borde de una caja que no existe. */
.nota:first-child::before { content: none; }
/* Toda la fila es el enlace, asi que toda la fila se enciende: el fondo sube un
   punto y deja de ser negro. Es lo unico que pasa -no se levanta, no le
   aparece un borde- porque lo que hay que decir es "esto se puede clickear", no
   "esto es una tarjeta". */
.nota:hover { background-color: var(--glass-hi); }

.nota .meta { grid-column: 1; display: flex; gap: 10px; color: var(--tinta-3); font-size: 13px; }
.nota h3 {
  grid-column: 1;
  margin: 13px 0 11px;
  font-family: var(--serif); font-weight: 500;
  font-size: clamp(25px, 2.7vw, 34px); letter-spacing: -.02em; line-height: 1.13;
}
/* En la fila del titulo y no en la de la fecha: arranca donde arranca el
   titulo. Los 13 son los mismos que el margen de arriba del h3, asi que las dos
   cajas empiezan a la misma altura y la primera linea de la bajada queda un
   pelo mas abajo que la mayuscula del titulo, que es donde tiene que quedar. */
.nota p { grid-column: 2; grid-row: 2; margin-top: 13px; max-width: 68ch; color: var(--tinta-2); font-size: 16px; line-height: 1.58; }

/* En el telefono no hay dos columnas que valgan: la bajada vuelve abajo del
   titulo, que es de donde salio. */
@media (max-width: 760px) {
  .nota { grid-template-columns: 1fr; }
  .nota p { grid-column: 1; grid-row: auto; margin-top: 0; }
}

/* -------------------------------------------------------- texto largo ----- */
/* Una nota del blog y los terminos son la misma pagina: una columna angosta.
   La medida la pone la tipografia, no los pixeles: ~68 caracteres es donde el
   ojo vuelve al renglon siguiente sin perderse. */

/* De borde a borde y centrada con el padding, por lo mismo que la cabecera del
   blog: es la hoja que tapa al pie. */
.texto { padding: clamp(44px, 6vw, 84px) calc(max(0px, (100% - 700px) / 2) + var(--gutter)) 100px; }
/* La fecha y el tiempo de lectura no van arriba del titulo sino al final de la
   entrada, justo antes del primer subtitulo. Arriba son lo primero que se lee
   de la nota, y lo primero que se lee de una nota tiene que ser de que se
   trata; ahi abajo cierran la apertura y quedan a mano en el momento en que
   uno decide si sigue o no.

   El aire de abajo lo pone el margen del <h2> que viene despues, que es mas
   grande y se traga a este. */
.texto .meta { display: flex; gap: 10px; margin: 2.6em 0 0; color: var(--tinta-3); font-size: 14px; }
.texto h1 { font-family: var(--serif); font-weight: 500; font-size: clamp(36px, 5vw, 56px); line-height: 1.04; letter-spacing: -.024em; }
.texto h2 { margin: 2.1em 0 .6em; font-family: var(--serif); font-weight: 500; font-size: 28px; letter-spacing: -.02em; }
.texto h3 { margin: 1.8em 0 .5em; font-size: 18px; }
.texto p, .texto li { color: var(--tinta-2); font-size: 17.5px; line-height: 1.68; }
.texto p { margin: 1.1em 0; }
.texto ul, .texto ol { padding-left: 22px; }
.texto li { margin: .55em 0; }
.texto a { color: var(--tinta); text-decoration: underline; text-underline-offset: 3px; }
.texto hr { margin: 3em 0; border: 0; border-top: 1px solid var(--linea); }
.texto .guia { margin: 1.6em 0; padding: 22px 26px; border: 1px solid var(--edge); border-left: 2px solid var(--tinta); border-radius: 0 16px 16px 0; background: var(--lamina); box-shadow: var(--canto); }
.texto .guia p { margin: 0; font-size: 16.5px; color: var(--tinta); }
.texto code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .9em; }

/* ============================================================== novedades === */
/* El changelog usa el mismo armazon que "antes, durante y despues" de la
   portada: .acompana-grid con el indice pegado a la izquierda y los paneles
   pasando a la derecha. Son las mismas clases a proposito, asi el indice se
   enciende solo con el observador que ya vive en landing.js y no hay dos
   maneras de hacer lo mismo dando vueltas por el sitio. Lo que sigue son las
   diferencias, que son pocas: el indice lleva dos renglones por entrada y los
   paneles son lista y no dibujo.

   El aire de arriba no es el de la franja de la portada -que separa dos
   secciones- sino el que pide un titulo de display: menos que aquel y bastante
   mas que un parrafo, porque arriba hay setenta y seis pixeles de serif y
   pegarle la lista lo deja sin respirar. */
.novedades { padding-top: clamp(40px, 5vw, 76px); }

/* Dos renglones por entrada: la fecha, que es por donde se busca en un
   changelog, y debajo en chico que clase de cambios trajo esa version. */
.novedades .pasos-lista a { padding: 15px 0; line-height: 1.3; }
.novedades .pasos-lista .cuando { display: block; font-variant-numeric: tabular-nums; }
/* El renglon de abajo no se enciende junto con el de arriba: encendido le
   compite a la fecha, que es lo que se vino a buscar. */
.novedades .pasos-lista .tipos {
  display: block; margin-top: 6px;
  color: var(--tinta-3); font-size: 13px; font-weight: 400;
}

/* La medida del texto la da el grid, no el panel: la columna de la derecha ya
   viene angosta por el hueco que deja .acompana-grid. */
.version h2 {
  font-family: var(--serif); font-weight: 500;
  font-size: clamp(23px, 2.4vw, 30px); line-height: 1.16; letter-spacing: -.02em;
}
/* La fecha adentro del panel es la del telefono: en pantalla ancha la dice el
   indice, y repetirla dos veces a diez centimetros es ruido. */
.version .fecha { display: none; color: var(--tinta-3); font-size: 14px; font-variant-numeric: tabular-nums; }
.version .resumen { margin-top: 16px; color: var(--tinta-2); font-size: 17px; line-height: 1.6; }
/* Un enlace en medio del resumen va subrayado, como los de adentro de un
   parrafo en el resto del sitio: sin el subrayado queda del mismo color que la
   frase que lo rodea -body.lp a hereda el color- y no se ve que se puede
   apretar. Es el mismo trato que reciben el del pie del panel de lo que falta y
   los de las notas. */
.version .resumen a { text-decoration: underline; text-underline-offset: 3px; }
.version .resumen a:hover { color: var(--tinta); }

/* El nombre del grupo pesa lo mismo que el renglon que tiene debajo: no es un
   titulo que compita con el de la version, es el rotulo de la lista. Y se dice
   una vez por grupo y no una por linea: entre ocho renglones con una pildora
   cada uno lo que se lee son las pildoras. */
.version h3 { margin-top: 30px; font-size: 16.5px; font-weight: 600; letter-spacing: -.012em; }
/* Bolitas de las de toda la vida, y en gris para que el punto no pese mas que
   la palabra que tiene al lado. */
.cambios, .pendientes {
  margin: 12px 0 0; padding-left: 19px;
  display: grid; gap: 7px;
  color: var(--tinta-2); font-size: 16px; line-height: 1.6;
}
.cambios li::marker, .pendientes li::marker { color: var(--tinta-3); }

/* ------------------------------------------------- la puerta al tablero --- */
/* Lo que falta ya no se cuenta en esta pagina: esta pagina es lo que paso. Lo
   que queda es la tarjeta que lleva al tablero, colgando del indice.

   La que se pega ahora es la columna entera y no la lista: la tarjeta tiene que
   acompanar igual, y una lista pegajosa con una tarjeta suelta debajo se
   despega en cuanto se empieza a bajar. Por eso hay un div de mas. */
.novedades .indice { position: sticky; top: 40px; align-self: start; }
.novedades .indice .pasos-lista { position: static; }

/* Del tamano de la columna y nada mas: no es una invitacion que compita con el
   changelog, es la puerta de al lado. El titulo en tinta y el resto apagado, y
   al pasar por encima se aclaran el borde y el fondo, que es todo lo que pasa:
   una tarjeta entera que se enciende no necesita ademas una flecha que la
   senale. El borde de arriba de la lista de versiones ya hace de linea
   divisoria, asi que la tarjeta no necesita una propia: le alcanza el aire. */
.carta-tablero {
  display: block; margin-top: 24px; padding: 16px 17px;
  border: 1px solid var(--edge); border-radius: 14px;
  background: var(--lamina);
  box-shadow: var(--canto);
  transition: border-color .25s var(--ease), background .25s var(--ease);
}
.carta-tablero .titulo { display: block; color: var(--tinta); font-size: 15px; font-weight: 550; }
.carta-tablero .detalle { display: block; margin-top: 7px; color: var(--tinta-3); font-size: 13px; line-height: 1.45; }
.carta-tablero:hover { border-color: var(--edge-hi); background: var(--lamina-hi); }

/* ============================================================== que sigue === */
/* Dos listas, una abajo de la otra: lo que falta, que es lo unico que se puede
   votar y por eso va primero, y lo que ya salio. Empezo siendo tres columnas
   al lado -con lo que se esta escribiendo en el medio- y no era como se mira:
   las tres se leian en paralelo cuando en realidad se recorre una y despues,
   si queda curiosidad, la otra. Y la del medio no se podia ni votar ni usar.

   ---- el titulo ----
   Va centrado, que en el sitio hacen dos paginas: esta y el blog. Pero NO con
   la clase .centrada de aquella, que ademas de centrar lo lleva a 176 pixeles:
   ahi el titulo es una palabra sola y es la tapa del cuaderno. Este son cuatro
   palabras en dos renglones, y a ese tamano el primero no entra en la pantalla.
   Asi que de .centrada se toma lo unico que hace falta, que es el eje.

   El corte de renglon lo trae el texto con un <br> y no lo decide el ancho: la
   frase se parte donde se la dice en voz alta, y donde cae eso es cosa de cada
   idioma. */
.cabecera-que-sigue { text-align: center; }
/* La bajada es la de cualquier pagina del sitio -misma clase, mismo tamano-
   con lo unico que el centrado le agrega: los margenes al medio. Sin eso la
   caja de 620 pixeles se queda contra el margen izquierdo y el texto sale
   centrado ADENTRO de ella, o sea a la izquierda del eje del titulo, que es
   peor que no centrar nada. */
.cabecera-que-sigue .entrada { margin-inline: auto; }
.cabecera-que-sigue .entrada a { text-decoration: underline; text-underline-offset: 3px; }
.cabecera-que-sigue .entrada a:hover { color: var(--tinta); }
/* Llega despues del titulo, como la bajada de la portada llega despues del
   suyo: el orden de entrada es el de la lectura. */
.lp .cabecera-que-sigue .entrada { --retraso: .18s; }

/* ---- el tablero ---- */
/* El aire contra la cabecera es el de cualquier franja del sitio, sin recortar:
   lo que hay arriba es otra seccion y no el titulo de esta. Y el titulo
   centrado lo pide ademas por su cuenta: no comparte margen izquierdo con lo
   que sigue, asi que lo unico que los ata es el aire que tengan en el medio.

   Las dos listas se separan bastante mas entre si que las tarjetas de adentro
   de cada una. Con el mismo hueco, el nombre de la segunda lista se lee como
   una tarjeta mas grande de la primera. */
.tablero { display: grid; gap: clamp(50px, 6vw, 84px); }

/* El nombre de la lista en serif, como los titulos de panel del resto del
   sitio. Va solo, sin un renglon debajo que explique la regla: donde hay pulgar
   se vota y donde hay version salio, asi que el tablero ya lo dice. */
.fila > h2 {
  font-family: var(--serif); font-weight: 500;
  font-size: clamp(22px, 2.2vw, 29px); letter-spacing: -.02em; line-height: 1.15;
}
/* Las tarjetas se reparten a lo ancho, de a tres por renglon. Una sola columna
   a lo largo de la pagina son ocho pantallas de telefono en un monitor; y en
   una columna de un tercio de ancho -que es donde vivian cuando esto eran tres
   listas al lado- cada frase se partia en cinco renglones.

   Las tres de un renglon miden lo mismo de alto, que es lo que hace el grid si
   no se le pide otra cosa: tres tarjetas de altos distintos al lado no se leen
   como un renglon sino como tres cosas sueltas que casualmente empiezan a la
   misma altura. */
.pedidos {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(10px, 1.2vw, 14px);
}
/* Y el aire va entre el nombre y su lista, no arriba de la lista: la de lo que
   falta no tiene nombre -lo dice el titulo de la pagina- y ahi arriba no hay
   nada de lo que separarse. */
.fila > h2 + .pedidos { margin-top: 22px; }

/* Cada pedido es una tarjeta del mismo vidrio que el resto del sitio, pero mas
   modesta: sin sombra que la levante, porque diez apiladas en una columna
   angosta se leen como diez cosas flotando. Le alcanza el canto. */
.pedido {
  padding: 16px 17px;
  border: 1px solid var(--edge); border-radius: 14px;
  background: var(--lamina);
  box-shadow: var(--canto);
}
/* Que es arriba y por que hace falta debajo, en dos elementos y no en una
   frase con un negrita adelante. Pegados en el mismo parrafo, el titulo
   terminaba a media linea y la explicacion arrancaba ahi mismo: para saber
   cuales son los ocho pedidos habia que leer los ocho enteros. Separados, la
   lista se recorre de un barrido. */
.pedido .que {
  display: block;
  color: var(--tinta); font-size: 15px; font-weight: 600; line-height: 1.5;
}
.pedido p { margin-top: 5px; color: var(--tinta-2); font-size: 15px; line-height: 1.55; }
/* Los dos renglones parejos y no uno largo con una palabra colgando debajo. El
   navegador reparte las palabras entre las lineas que ya iba a usar -no agrega
   ninguna-, que es lo mismo que se hace con los titulos de la portada. */
.pedido .que, .pedido p { text-wrap: balance; }


/* ---- el pulgar ---- */
/* Al costado del texto y no debajo: un boton al pie de cada tarjeta empuja
   todo lo que sigue por algo que ocupa menos que un renglon.

   A la derecha, que es donde termina de leerse la tarjeta: primero que es,
   despues por que hace falta y recien ahi el boton. A la izquierda era lo
   primero que se veia de cada una, o sea que se pedia decidir antes de haber
   leido. Y no hay ningun 'order' ni 'row-reverse' que lo corra: el boton esta
   escrito despues del texto en la plantilla, asi que el orden del teclado es
   el que se ve.

   Y al medio de lo alto, no pegado al primer renglon: contra el titulo, el
   pulgar se lee como parte de el y la tarjeta queda pesada de arriba. Se
   centra sobre el titulo y la descripcion juntos, asi que sigue quedando al
   medio el dia que un titulo entre en dos renglones.

   No se dibuja hasta que landing.js sepa cuantos votos tiene cada cosa: un
   boton que se puede apretar antes de saber el numero que lleva al lado es un
   boton que contesta con un numero inventado. Sin JavaScript no hay ningun
   pulgar, y la pagina se lee entera igual. */
.vota .pedido { display: flex; align-items: center; gap: clamp(16px, 1.8vw, 26px); }
/* Lo que el boton tiene al lado, que son dos cosas -el titulo y la
   descripcion- y no una: sin esta caja, el pulgar se cuela entre las dos. El
   min-width es lo que deja que el texto se parta en vez de estirar la tarjeta:
   un item de flex no baja de su ancho de contenido si no se le dice. */
.vota .dice { flex: 1; min-width: 0; }
.voto {
  display: none;
  flex: none; width: 46px; padding: 8px 0 7px;
  flex-direction: column; align-items: center; gap: 3px;
  border: 1px solid var(--edge); border-radius: 11px;
  background: var(--glass-hi);
  color: var(--tinta-3);
  cursor: pointer;
  transition: color .2s var(--ease), background .2s var(--ease),
              border-color .2s var(--ease);
}
.tablero.listo .voto { display: flex; }
/* El mismo dibujo para las dos formas: hueco cuando no votaste y relleno
   cuando si. Dos iconos -uno vacio y otro lleno- serian dos dibujos que hay
   que mantener parecidos a mano. */
.voto .glifo {
  width: 17px; height: 17px;
  fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round;
}
.voto .cuantos {
  font-size: 12.5px; font-weight: 550; line-height: 1;
  font-variant-numeric: tabular-nums;
}
.voto:hover { color: var(--tinta); border-color: var(--edge-hi); background: var(--glass-hi-2); }
.voto[aria-pressed="true"] { color: var(--tinta); border-color: var(--tinta); background: var(--glass-hi-2); }
.voto[aria-pressed="true"] .glifo { fill: currentColor; }
/* Mientras el voto esta viajando el boton no acepta otro clic. Apagarlo del
   todo seria mentir -el voto ya se esta contando-, asi que solo deja de
   responder. */
.voto.esperando { pointer-events: none; }
/* El salto de cuando entra el voto. Es corto y no se repite: confirma que el
   clic llego, que es todo lo que un numero que cambia de uno en uno no alcanza
   a decir. */
.voto.salta { animation: pulgar-salta .34s var(--resorte); }
@keyframes pulgar-salta {
  0% { transform: scale(1); }
  40% { transform: scale(1.12); }
  100% { transform: scale(1); }
}

/* ---- lo que ya salio ---- */
/* Estas tarjetas no son de vidrio: son el papel, negro puro, con el borde y
   nada mas. Lo que ya salio no hay que decidirlo, y con el mismo relleno que
   las de arriba las trece pesaban lo mismo en la pantalla: la lista larga con
   los ocho pulgares perdia contra la de abajo, que es la que no pide nada.
   Vacias por dentro, se leen como lo que son -el respaldo de que esto se
   cumple- y la mano va sola a las de arriba.

   Se le saca tambien el canto, que es el filo blanco de arriba: eso es lo que
   levanta una lamina del papel, y estas estan apoyadas. El borde se queda,
   porque sin el la tarjeta desaparece y las cinco se leen como una lista
   suelta de parrafos. */
.hecho .pedido { background: var(--papel); box-shadow: none; }

/* Con la version en que salio y el enlace al renglon de Novedades que lo
   cuenta. Sin eso, esta lista es una de promesas cumplidas sin manera de
   comprobarlas; con eso, cada una termina en el changelog.

   Va arriba del titulo y contra el margen izquierdo: es un rotulo, y un rotulo
   se lee antes de lo que rotula. Debajo de la descripcion le sumaba un tercer
   renglon a cada tarjeta para decir cuatro caracteres. */
.salio {
  display: inline-block; margin-bottom: 9px;
  padding: 4px 11px;
  border: 1px solid var(--edge); border-radius: 999px;
  color: var(--tinta-3); font-size: 12px;
  font-variant-numeric: tabular-nums;
  transition: color .2s var(--ease), border-color .2s var(--ease);
}
.salio:hover { color: var(--tinta); border-color: var(--edge-hi); }

/* =============================================================== descarga === */
/* La pagina del boton. Es la unica del sitio que no tiene nada que contar: el
   que llega ya decidio, asi que lo unico que se le debe es el archivo y la
   frase que evita el error de siempre -abrir la app desde el DMG montado, que
   en macOS deja la copia en un disco que despues se desmonta-.

   Todo va centrado y en una sola columna. El resto del sitio arranca contra el
   margen izquierdo porque ahi empieza el texto que viene despues; aca no viene
   nada despues, y una columna sola centrada no tiene de donde colgar salvo del
   medio de la pantalla. */
.descarga .ancho { display: grid; justify-items: center; text-align: center; }
/* El titulo no es el mas grande del sitio -ese es el de la portada- pero si
   entra solo: no hay bajada arriba ni dibujo al lado, asi que se puede plantar
   en dos renglones y quedarse ahi.

   El corte no va a mano como el de la portada: aca la frase cambia de largo con
   el idioma -"Descarga Filmina para Mac", "Download Filmina for Mac"- y un <br>
   escrito en la plantilla parte bien en uno y mal en el otro. Lo reparte el
   navegador, que es lo que hace balance: dos renglones parejos en vez de uno
   lleno y "Mac" solo abajo. */
.lp .descarga h1.display {
  font-size: clamp(40px, 6.4vw, 82px); line-height: 1.02;
  max-width: 15ch; text-wrap: balance;
}
/* La manzana va ADENTRO del titulo, del tamano de la letra y con su mismo
   color: no es un icono al lado de una palabra, es parte de "para Mac". Va con
   un pelo de aire a la izquierda y ninguno a la derecha, que es como se escribe
   la marca de Apple pegada al nombre del sistema. */
.descarga .glifo-manzana {
  width: .8em; height: .8em;
  margin: 0 .04em 0 .1em;
  fill: currentColor; stroke: none;
  vertical-align: -.02em;
}
.descarga .instruccion {
  margin-top: 26px; max-width: 46ch;
  color: var(--tinta-2); font-size: 18px; line-height: 1.55;
}
.descarga .instruccion b { color: var(--tinta); font-weight: 600; }

/* ---- la tarjeta del archivo ---- */
/* La misma lamina de vidrio que las tarjetas del resto del sitio, pero mas
   ancha de aire: adentro hay un icono, tres renglones y un boton, y lo que
   hace que se lea como un archivo y no como una ficha mas es el hueco que tiene
   alrededor. */
.caja-descarga {
  margin-top: 46px;
  display: grid; justify-items: center;
  width: min(100%, 380px);
  padding: 40px 32px 34px;
  border-radius: 26px;
  background: var(--lamina);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  border: 1px solid var(--edge);
  box-shadow: var(--sombra-lg), var(--canto);
}

/* El icono de la app, que es el de macOS: el cuadrado redondeado del sistema
   -22 por ciento del lado, que es lo que da el squircle a esta medida- con la
   marca adentro, centrada y del ancho justo, que la F de Filmina ya trae su
   propio aire en el dibujo.

   El fondo es negro absoluto, el mismo de la pagina y sin una pelicula que lo
   levante: un icono de macOS es una PIEZA opaca, y lo que dice que ademas es de
   vidrio no es el relleno sino lo que le pasa por encima. Dos cosas, las dos
   moviendose despacio: una luz que va y viene por debajo y un brillo que
   recorre el canto. Quieto, un cuadrado negro con un borde fino es una tarjeta;
   lo que lo vuelve vidrio es que la luz no se queda donde esta.

   NO lleva backdrop-filter aunque sea vidrio, por lo mismo que el panel del
   selector de idioma: la tarjeta que lo contiene ya tiene uno, y un
   backdrop-filter adentro de otro toma su fondo del de afuera y el navegador
   termina pintando un rectangulo negro. Con el fondo opaco, ademas, no habria
   nada que desenfocar. */
.icono-app {
  position: relative;
  display: grid; place-items: center;
  width: 108px; height: 108px;
  border-radius: 24px;
  background: var(--papel);
  color: var(--tinta);
  box-shadow: var(--sombra-lg);
  overflow: hidden;
}

/* La luz de abajo. Es una mancha blanda mas grande que el icono que se pasea
   por adentro: en ningun momento se la ve entera ni se le ve un borde, y lo
   unico que se percibe es que el negro no es parejo y que la parte clara se
   corre. Va debilisima a proposito -un catorce por ciento en el centro y nada
   en los bordes- porque el pedido es que el fondo SEA negro; esto no lo aclara,
   lo hace profundo.

   El recorrido vuelve exactamente a donde empezo, asi que el ciclo cierra sin
   salto y no hace falta alternate, que va y viene por el mismo camino y se le
   nota el ida y vuelta. */
.icono-app::before {
  content: "";
  position: absolute;
  inset: -45%;
  background: radial-gradient(closest-side,
    rgba(255, 255, 255, .14), rgba(255, 255, 255, .04) 52%, transparent 74%);
  animation: luz-icono 15s ease-in-out infinite;
  pointer-events: none;
}
@keyframes luz-icono {
  0%   { transform: translate(-13%, -11%) scale(1); }
  33%  { transform: translate(11%, -6%)  scale(1.14); }
  66%  { transform: translate(6%, 12%)   scale(1.06); }
  100% { transform: translate(-13%, -11%) scale(1); }
}

/* El canto. Es un aro de un pixel hecho de dos capas: abajo el borde de
   siempre, parejo, y encima un arco de luz que da la vuelta. El arco es corto
   -la sexta parte del perimetro- y con los extremos desvanecidos, para que se
   lea como el reflejo de una fuente de luz pasando por el filo y no como algo
   girando adentro del icono.

   El aro sale de enmascarar un relleno con su propio padding: la mascara pinta
   dos veces la caja, una hasta el borde y otra hasta el content-box, y se queda
   con la diferencia. Es la unica forma de tener un borde con degrade conico que
   siga el radio de las esquinas; con border-image no se puede.

   Lo que se anima es el angulo del conico y no una rotacion: el icono es un
   cuadrado, asi que girarlo con transform le giraria tambien las esquinas y el
   aro se saldria del filo cuatro veces por vuelta. Por eso --giro se registra
   con @property, que es lo que hace que un angulo se pueda interpolar. Donde no
   este soportado el angulo se queda en cero: el aro entonces no gira, pero el
   borde y su brillo en la esquina de arriba siguen ahi. */
@property --giro {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}
.icono-app::after {
  content: "";
  position: absolute; inset: 0;
  border-radius: inherit;
  padding: 1px;
  background:
    conic-gradient(from var(--giro),
      transparent 0 56%,
      rgba(255, 255, 255, .42) 70%,
      rgba(255, 255, 255, .92) 75%,
      rgba(255, 255, 255, .42) 80%,
      transparent 94%),
    linear-gradient(var(--edge-hi), var(--edge-hi));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  animation: giro-canto 11s linear infinite;
  pointer-events: none;
}
@keyframes giro-canto { to { --giro: 360deg; } }

/* Por encima de la luz: si la mancha le pasa por arriba, la F se ensucia justo
   cuando el brillo esta mas fuerte. */
.icono-app .marca-f { position: relative; width: 52px; height: 45px; }

/* Con reduced-motion el icono no se apaga, se queda quieto: la luz se detiene
   donde arranca y el arco del canto, en la esquina de arriba a la izquierda,
   que es de donde viene la luz en toda la interfaz. Sigue siendo vidrio, pero
   fotografiado. */
@media (prefers-reduced-motion: reduce) {
  .icono-app::before, .icono-app::after { animation: none; }
}

.caja-descarga .nombre-app {
  margin-top: 22px;
  font-family: var(--serif); font-weight: 500;
  font-size: 26px; letter-spacing: -.02em;
}
/* Los dos datos del archivo. El de arriba es el que puede impedir la descarga
   -si el Mac no llega, no hay nada que hacer- y por eso va primero y con la
   tinta del texto; el de abajo es de quien ya se decidio y quiere saber que
   esta bajando.
   El renglon de abajo no se llama .archivo aunque sea lo que es: ese nombre ya
   es el del PDF que se arrastra en la demo de la portada, y ese si esta suelto
   -position absolute y una celda del grid-, asi que le caia encima. */
.caja-descarga .pide { margin-top: 8px; color: var(--tinta-2); font-size: 15px; }
.caja-descarga .linea-archivo {
  margin-top: 5px;
  color: var(--tinta-3); font-size: 13.5px;
  font-variant-numeric: tabular-nums;
}
.caja-descarga .linea-archivo a { text-decoration: underline; text-underline-offset: 3px; }
.caja-descarga .linea-archivo a:hover { color: var(--tinta); }
/* La flecha que baja, en lugar de la manzana que llevan los botones de las
   otras paginas. Alla la manzana dice PARA QUE sistema es, que es lo que hace
   falta saber antes de entrar; aca eso ya lo dijo el titulo dos renglones
   arriba y la tarjeta otra vez, y lo que queda por decir es que apretar trae un
   archivo.

   Es dibujo de linea y no silueta rellena, asi que hay que darle vuelta el fill
   y el stroke que traen los glifos del boton, que estan escritos para la
   manzana. */
.lp .btn .glifo.bajar {
  fill: none; stroke: currentColor;
  stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
}
.caja-descarga .btn { margin-top: 26px; }

/* ---- cuando la pagina se abre en un telefono ---- */
/* Lo que la pagina entrega es un DMG, y un DMG en un telefono no es nada: ni se
   abre, ni se guarda en ningun lado util. Asi que ahi el boton no se muestra
   "deshabilitado" -un boton apagado sigue pareciendo la accion de la pagina, y
   uno se queda apretandolo- sino que se va, y en su lugar queda dicho lo unico
   que hay para hacer: volver a esta direccion desde una Mac.

   Quien decide no es el ancho de la pantalla sino el aparato, y por eso esto no
   es un @media: una Mac con la ventana angosta sigue pudiendo bajar el archivo,
   y una tableta ancha sigue sin poder. El data-aparato lo escribe el script del
   <head> antes de pintar. Si ese script no corre, nada de esto se activa y
   queda el boton, que es el estado por defecto del marcado. */
html[data-aparato="telefono"] .descarga .solo-mac { display: none; }

.desde-la-mac { display: none; }
html[data-aparato="telefono"] .desde-la-mac {
  display: block;
  margin-top: 24px; width: 100%;
  padding: 18px 16px 16px;
  border-radius: 18px;
  /* Punteado y no macizo: el borde entero es el de una tarjeta, y esto no es
     una tarjeta mas adentro de la tarjeta, es un hueco donde iba el boton. */
  border: 1px dashed var(--edge-hi);
  background: var(--glass-hi-2);
}
/* El renglon que reemplaza al boton lleva su mismo cuerpo y su mismo peso: es
   lo que uno viene a leer en ese lugar de la tarjeta. */
.desde-la-mac .titular {
  font-size: 16.5px; font-weight: 550; letter-spacing: -.012em;
  /* En el ancho de la tarjeta la frase entra en dos renglones, y sin esto el
     segundo es "Mac" solo. Repartida, corta despues de "pagina". */
  text-wrap: balance;
}
/* La manzana, aca, va separada de la frase y mas grande que la del titulo:
   adentro del titulo de arriba esta pegada a "Mac" y del cuerpo de la letra
   porque es parte de la palabra, y aca no es una letra mas sino la marca del
   sistema al que se manda a alguien, que es lo que hay que reconocer de un
   golpe antes de leer el renglon. Pasada del cuerpo de la letra, se baja un
   pelo para que siga apoyada en la misma linea. */
.desde-la-mac .glifo-manzana {
  width: 1.1em; height: 1.1em;
  margin: 0 .38em 0 0;
  vertical-align: -.13em;
}
/* La direccion, con la misma tinta y el mismo cuerpo que el renglon del archivo
   dos lineas mas arriba: los dos son datos del mismo orden y no hay razon para
   que uno pese mas que el otro. Se puede partir en cualquier lado, que en una
   pantalla angosta una direccion sin cortes se lleva puesto el ancho de la
   tarjeta. */
.desde-la-mac .direccion {
  margin-top: 11px;
  color: var(--tinta-3); font-size: 13.5px;
  overflow-wrap: anywhere;
}

/* Los dos parrafos del final van mas angostos que la medida comoda de lectura,
   y cada uno con la suya: debajo de una tarjeta de 380 son un bloque centrado y
   lo que los hace bloque es que el renglon se corte donde uno lo esperaria, no
   donde llegue.

   Las medidas estan elegidas para que el de arriba caiga en tres renglones y el
   de abajo en dos, EN LOS DOS IDIOMAS: en castellano el primero tiene diez
   caracteres mas y el segundo once menos, asi que la misma medida para los dos
   deja uno de los cuatro casos mal. 40 y 32 caen adentro de los cuatro.

   Van en ch y no en pixeles porque ch es el ancho de la letra: si algun dia el
   cuerpo cambia, la cuenta de caracteres por renglon -que es lo unico que
   decide donde corta- se mantiene. */
.descarga .primera-vez {
  margin-top: 40px; max-width: 40ch;
  color: var(--tinta-2); font-size: 16px; line-height: 1.6;
}
/* El de abajo son una pregunta y una respuesta, y el corte va entre las dos: el
   <br> esta escrito en el texto, uno por idioma, igual que el del titulo del
   cierre. No se puede dejar a la medida porque la pregunta mide distinto en
   cada lengua -en castellano entran ademas las dos palabras que abren la
   respuesta, y la direccion queda sola abajo-, y balance tampoco sirve: parte
   donde las mitades pesan igual, que en ingles cae en medio de la pregunta. */
.descarga .ayuda {
  margin-top: 18px; max-width: 32ch;
  color: var(--tinta-3); font-size: 14px; line-height: 1.6;
}
.descarga .ayuda a { text-decoration: underline; text-underline-offset: 3px; }
.descarga .ayuda a:hover { color: var(--tinta); }

@media (max-width: 620px) {
  /* En el telefono la tarjeta ocupa el ancho entero y se le saca aire de
     adentro: con el relleno de escritorio el boton queda a media pantalla de
     su propio titulo. */
  .caja-descarga { padding: 32px 22px 28px; }
  .icono-app { width: 92px; height: 92px; border-radius: 21px; }
  .icono-app .marca-f { width: 44px; height: 38px; }
  .descarga .instruccion { font-size: 17px; }
}

/* =================================================== arrastrar y soltar ==== */
/* La demo de la portada: entra un PDF, se suelta, y de ahi sale la tarjeta.
   Los cuatro pasos son cuatro poses -no hay un solo keyframe-: landing.js
   cambia el data-paso y el CSS interpola. Asi cada estado se puede mirar
   quieto, que es lo unico que hace que una animacion de cuatro tiempos se
   pueda ajustar sin adivinar.

   El alto lo fija el contenedor y no cambia entre pasos: si la zona y la
   tarjeta midieran distinto, la seccion entera daria un salto al soltar. */

.demo-soltar {
  position: relative;
  display: grid;
  min-height: 310px;
  align-items: center;
}
/* Los formatos van ARRIBA y la zona abajo, cada uno en su fila; la zona y el
   resultado comparten la de abajo porque uno reemplaza al otro.

   El orden de la grilla no es el del marcado a proposito: leido, primero va la
   zona -que es la accion- y despues la lista de lo que entra, que es la
   aclaracion. Mirado es al reves: las cuatro hojas de color son lo unico con
   color de toda la seccion y funcionan como la entrada, y de ahi la vista baja
   al recuadro donde hay que soltarlas. Que la fila de arriba diga "esto es lo
   que se puede traer" y la de abajo "traelo aca" es el sentido en que cae el
   gesto. */
.demo-soltar > .formatos { grid-area: 1 / 1; }
.demo-soltar > .zona,
.demo-soltar > .resultado { grid-area: 2 / 1; }

/* Los mismos iconos que muestra la app abajo de su zona de arrastre: la hoja
   con la esquina doblada, del color del programa, con la sigla adentro. Estan
   dibujados y no son el logo de cada marca; el color es lo que hace que se
   reconozcan de un vistazo, y es el unico lugar de la pagina que lo tiene. */
.formatos {
  display: flex; flex-wrap: wrap; justify-content: center; align-items: center;
  gap: 22px;
  /* Bastante aire, y a proposito: son dos cosas distintas -lo que se puede
     traer y el lugar donde se suelta-, no un encabezado con su recuadro. Con
     poco hueco las cuatro hojas se leen como el titulo de la zona y el gesto
     deja de tener a donde caer. */
  margin-bottom: clamp(44px, 4.6vw, 66px);
}
.formatos .formato {
  width: 52px; height: 65px; display: block;
  /* El giro tiene que ser sobre el centro del icono. En un <svg> el origen del
     transform no es el centro en todos los motores: sin esto puede girar sobre
     la esquina del viewBox y salirse de lugar. */
  transform-box: fill-box;
  transform-origin: 50% 50%;
  filter: drop-shadow(0 6px 14px rgba(17, 17, 19, .2));
}
/* Inclinadas y alternadas, como quedan cuatro hojas tiradas sobre la mesa. Los
   angulos no son el mismo espejado: a nueve y nueve la fila se lee como un
   zigzag dibujado, y lo que tiene que parecer es que quedaron asi. Las que van
   hacia la derecha bajan dos pixeles, que es lo que hace que no se lean como
   una sola linea. */
.formatos .formato { transform: translate(var(--ax, 0px), var(--ay, 0px)) rotate(var(--giro, 0deg)) translateY(var(--baja, 0px)) scale(var(--aesc, 1)); }
.formatos .formato:nth-child(1) { --giro: -9deg; }
.formatos .formato:nth-child(2) { --giro: 6deg; --baja: 2px; }
.formatos .formato:nth-child(3) { --giro: -5deg; }
.formatos .formato:nth-child(4) { --giro: 8deg; --baja: 2px; }

/* El mismo vidrio que la carpeta y el candado: el color nunca es opaco, entra
   por arriba a la izquierda y se va abriendo hacia abajo a la derecha. El color
   se declara UNA vez por formato, en color, y las tres paradas lo toman con
   currentColor: asi agregar un formato es una linea y no cuatro. */
.formatos .formato .f-s1 { stop-color: currentColor; stop-opacity: .95; }
.formatos .formato .f-s2 { stop-color: currentColor; stop-opacity: .78; }
.formatos .formato .f-s3 { stop-color: currentColor; stop-opacity: .6; }

.formatos .pdf  { color: #E5252A; }
.formatos .ppt,
.formatos .pptx { color: #CE5A24; }
.formatos .key  { color: #1E8FE1; }

/* El doblez es el reves de la hoja: mas claro, no mas oscuro. Una esquina
   doblada deja ver el dorso del papel, que recibe la luz de frente. */
.formatos .formato .f-doblez { fill: #fff; fill-opacity: .34; }
.formatos .formato .f-lustre   { fill: #fff; opacity: .16; }
.formatos .formato .f-lustre-2 { fill: #fff; opacity: .08; }
.formatos .formato .f-labio,
.formatos .formato .f-canto { fill: none; stroke-linecap: round; }
.formatos .formato .f-labio { stroke: #fff; stroke-opacity: .55; stroke-width: 1; }
.formatos .formato .f-canto { stroke: #fff; stroke-opacity: .22; stroke-width: .9; }

:root[data-tema="oscuro"] .formatos .formato { filter: drop-shadow(0 6px 16px rgba(0, 0, 0, .55)); }
:root[data-tema="oscuro"] .formatos .formato .f-canto  { stroke-opacity: .3; }
:root[data-tema="oscuro"] .formatos .formato .f-lustre { opacity: .2; }

/* La sigla va en blanco sobre la hoja y con la tipografia de la pagina: si se
   la deja al SVG, el navegador le pone su serif por defecto. */
.formatos .formato text { fill: #fff; font-family: var(--sans, inherit); letter-spacing: -.02em; }

/* ---- la zona vacia ---- */
/* Es la zona de la app, no una version para la web: misma linea finita y
   entera -no punteada-, mismo radio grande, mismo vidrio con el pelo de luz en
   el canto y la sombra difusa abajo. Lo que se ve en la portada tiene que ser
   lo que se ve al abrirla; si aca fuera un recuadro punteado, abrir Filmina
   seria encontrarse con otra cosa. */
.zona {
  display: grid;
  justify-items: center;
  align-content: center;
  gap: 4px;
  /* El alto lo pone la columna de al lado: la demo tiene que terminar donde
     termina la ultima linea del texto, o la seccion queda con un escalon. */
  min-height: 340px;
  padding: 44px 28px;
  border: 1px solid var(--edge);
  border-radius: 26px;
  background: var(--glass);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--sombra-lg), var(--canto);
  transition: border-color .25s var(--ease), background .25s var(--ease),
              box-shadow .3s var(--ease),
              opacity .45s ease, transform .45s cubic-bezier(.32,.72,0,1);
}
.zona .ico-subir {
  width: 26px; height: 26px;
  margin-bottom: 12px;
  fill: none; stroke: var(--faint); stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
  transition: stroke .25s var(--ease), transform .4s cubic-bezier(.22,1.18,.36,1);
}
.zona .grande { font-size: 16.5px; font-weight: 550; letter-spacing: -.015em; }
.zona .chica { color: var(--tinta-3); font-size: 13.5px; }

/* Con el archivo encima la zona se enciende: mas borde, un poco mas de vidrio,
   el halo alrededor y ese pelin de escala que es lo que se siente como "ya la
   agarro".

   El encendido NO usa --edge-max, que es el de la app: sobre el negro de la
   portada ese blanco al 55 por ciento es casi un neon y se lleva la mirada de
   la lamina, que es lo que hay que estar mirando. Aca la zona se enciende a la
   mitad de eso. Sigue siendo el salto mas grande de la pagina -del 9 al 26 por
   ciento hay tres veces mas borde- pero encendido, no prendido fuego.

   Los valores van en variables propias y no pisando los tokens compartidos:
   --edge-max y --halo los usa el visor de verdad, y cambiarlos aca cambiaria
   la app. Por eso tambien estan las dos caras del tema, igual que los tokens
   que reemplazan. */
.demo-soltar .zona {
  --zona-borde-on: rgba(255, 255, 255, .26);
  --zona-halo-on: rgba(255, 255, 255, .035);
  --zona-canto-on: inset 0 1px 0 rgba(255, 255, 255, .16);
}
:root[data-tema="claro"] .demo-soltar .zona {
  --zona-borde-on: rgba(0, 0, 0, .22);
  --zona-halo-on: rgba(0, 0, 0, .03);
  --zona-canto-on: inset 0 1px 0 rgba(255, 255, 255, .95);
}
.demo-soltar[data-paso="1"] .zona,
.demo-soltar[data-paso="2"] .zona {
  border-color: var(--zona-borde-on);
  background: var(--glass-hi);
  box-shadow: var(--sombra-lg), var(--zona-canto-on), 0 0 0 5px var(--zona-halo-on);
  transform: scale(1.015);
}
/* La flecha sube al gris fuerte y no al blanco del texto: encendida, pero sin
   competir con el nombre del archivo que esta aterrizando justo abajo. */
.demo-soltar[data-paso="1"] .zona .ico-subir,
.demo-soltar[data-paso="2"] .zona .ico-subir { stroke: var(--tinta-2); transform: translateY(-4px); }

/* Al soltar, la zona se va y deja a la tarjeta en su lugar. */
.demo-soltar[data-paso="3"] .zona { opacity: 0; transform: scale(.97); }

/* ---- la tarjeta que aparece ---- */
.resultado {
  opacity: 0;
  transform: translateY(10px) scale(.99);
  transition: opacity .5s ease, transform .55s cubic-bezier(.32,.72,0,1);
  pointer-events: none;
}
.demo-soltar[data-paso="3"] .resultado { opacity: 1; transform: none; }

/* ---- el archivo que se arrastra ---- */
/* Arranca fuera del cuadro, arriba a la derecha, y aterriza adentro de la zona
   pero por DEBAJO de su texto: si cae en el centro justo, tapa el "Arrastra tu
   PDF aqui", que es la instruccion que uno esta leyendo cuando el archivo
   llega. La inclinacion es lo que lo hace parecer agarrado y no puesto. */
.archivo {
  position: absolute;
  /* Clavado a la fila de la zona y no a la demo entera. Un hijo absoluto de una
     grilla que tiene grid-area definida se posiciona contra ESA celda, no
     contra el contenedor, asi que el 50/50 de aca es el centro del recuadro
     donde hay que soltar. Sin esto, al pasar los formatos arriba el centro se
     corria hacia ellos y el archivo aterrizaba sobre el titulo de la zona en
     vez de abajo. */
  grid-area: 2 / 1;
  left: 50%; top: 50%;
  display: flex; align-items: center; gap: 10px;
  padding: 11px 16px 11px 13px;
  border: 1px solid var(--edge);
  border-radius: 12px;
  background: var(--vidrio-papel-op);
  -webkit-backdrop-filter: var(--blur-sm);
  backdrop-filter: var(--blur-sm);
  box-shadow: var(--sombra-lg), var(--canto);
  font-size: 14px;
  white-space: nowrap;
  opacity: 0;
  transform: translate(calc(-50% + 190px), calc(-50% - 200px)) rotate(-7deg) scale(.96);
  transition: opacity .35s ease, transform .95s cubic-bezier(.32,.72,0,1);
}
.archivo .ico-doc {
  width: 17px; height: 17px;
  fill: none; stroke: var(--tinta-3); stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}
.demo-soltar[data-paso="1"] .archivo {
  opacity: 1;
  transform: translate(-50%, calc(-50% + 42px)) rotate(-2deg) scale(1);
}
/* Soltar: el archivo cae adentro de la zona y se apaga ahi mismo. */
.demo-soltar[data-paso="2"] .archivo {
  opacity: 0;
  transform: translate(-50%, -50%) rotate(0deg) scale(.88);
  transition: opacity .3s ease, transform .3s ease;
}

/* ---- el puntero ---- */
.cursor {
  position: absolute;
  grid-area: 2 / 1;   /* el mismo centro que el archivo, por lo mismo */
  left: 50%; top: 50%;
  width: 21px; height: 21px;
  color: var(--tinta);
  opacity: 0;
  transform: translate(calc(-50% + 258px), calc(-50% - 168px));
  transition: opacity .3s ease, transform .95s cubic-bezier(.32,.72,0,1);
  pointer-events: none;
}
.demo-soltar[data-paso="1"] .cursor {
  opacity: 1;
  transform: translate(calc(-50% + 68px), calc(-50% + 74px));
}
.demo-soltar[data-paso="2"] .cursor {
  opacity: 1;
  transform: translate(calc(-50% + 68px), calc(-50% + 74px)) scale(.9);
  transition: opacity .3s ease, transform .2s ease;
}

.reciente-mock .punto.tenue { background: var(--linea); }

@media (max-width: 1080px) {
  .demo-soltar, .zona { min-height: 280px; }
  /* De donde sale el archivo. En un telefono esos 110 pixeles fijos lo dejaban
     asomando 57 por fuera de la pantalla: el navegador movil no lo recorta,
     achica la pagina entera para que entre, y ahi aparece la banda negra al
     costado y todo queda un poco mas chico de lo que tendria que estar. Atado
     al ancho no puede pasar: en el monitor sale de donde salia y en el
     telefono sale de adentro de la pantalla. */
  .archivo { transform: translate(calc(-50% + min(110px, 12vw)), calc(-50% - 120px)) rotate(-7deg) scale(.96); }
  .cursor { transform: translate(calc(-50% + min(170px, 19vw)), calc(-50% - 90px)); }
}

/* ================================================== objetos que se agarran ==
   La carpeta, el candado, los cuatro formatos y el post-it se pueden arrastrar,
   y al soltarlos vuelven solos a su lugar. No hacen nada -no hay donde
   soltarlos-: son los objetos de la pagina, y un objeto que se puede levantar
   se siente objeto.

   El arrastre entra por --ax/--ay, que van ADELANTE del transform que cada uno
   ya tenia: el giro se queda donde estaba y el delta es en el eje de la
   pantalla, que es el del cursor. Si el translate fuera despues del rotate, la
   carpeta se iria en diagonal al mover el mouse derecho.

   La clase la pone landing.js y no el marcado: sin JS no se arrastra nada, y
   entonces tampoco tiene que aparecer la manito que dice que si. */
.lp .arrastrable {
  cursor: grab;
  -webkit-user-select: none;
  user-select: none;
  /* La vuelta pasa de largo un poco y acomoda: soltar algo y verlo frenar seco
     en su lugar se lee como un bug. */
  transition: transform .62s cubic-bezier(.22, 1.2, .36, 1);
}
/* Mientras esta agarrado no hay transicion: el objeto tiene que estar donde
   esta el cursor, no persiguiendolo con medio segundo de atraso. */
.lp .arrastrable.agarrado {
  cursor: grabbing;
  --aesc: 1.07;
  z-index: 6;
  transition: none;
}

/* ---------------------------------------------------------------- revelado */
/* Nada aparece de golpe: lo que llega a la pantalla se enciende. Son dos
   sistemas y un solo gesto.

   El REVELADO es lo que se mira al bajar. El bloque -o cada una de sus partes,
   si la seccion las lista en data-escalona- espera a estar en pantalla y
   recien ahi llega. Lo enciende landing.js.

   La ENTRADA es la portada, que ya esta en pantalla cuando la pagina carga: no
   espera a nadie, arranca sola y en orden de lectura.

   Los dos van con animation y no con transition, por dos razones. Una: el
   estado de partida lo pone la animacion misma, asi que nada tiene que estar
   escrito como estilo propio del elemento, y lo que ya tiene transform -el
   rayo torcido, las fichas, todo lo que se arrastra- no lo pierde ni pierde
   su transicion de arrastre. La otra: el retraso, el largo y la curva se
   escriben en un lugar y valen para toda la pagina.

   Un segundo largo, que es mas del doble que cualquier transicion de la
   interfaz: esto no es la respuesta a un clic, es algo que aparece, y algo
   que aparece rapido se lee como algo que salta.

   El relleno es backwards y no both: hace falta antes -durante el retraso, el
   elemento tiene que estar apagado- pero no despues. Con both la animacion se
   queda pegada al elemento para siempre sosteniendo su transform final, y eso
   es un transform de verdad: le arma un contexto de apilado, le rompe un
   position fixed adentro y le gana a cualquier transform que le pongan mas
   tarde. Terminada, lo que queda tiene que ser el elemento y nada mas. */

/* El bloque entero, cuando la seccion no desglosa partes. */
.lp [data-revela] { opacity: 0; }
.lp [data-revela].visible { opacity: 1; animation: llegar 1.1s var(--ease) var(--retraso, 0s) backwards; }

/* Menos si el bloque es hijo del <body>. Esos no son contenido: SON la hoja.
   Cada uno pinta el negro de la pagina y esta un escalon arriba del pie, que
   esta clavado atras, asi que apagarlo para que llegue apaga tambien su negro
   y por el hueco aparece el paisaje del pie, que es lo unico que hay debajo.
   Es el mismo agujero que dejaba un margen entre dos hijos del body, pero del
   alto del bloque entero: en las novedades y en el blog la cabecera arranca
   transparente y lo primero que se ve de la pagina es la foto del pie.

   Asi que la hoja se queda encendida y lo que llega es lo que tiene escrito
   adentro. El gesto es el mismo -misma curva, mismo largo, mismo retraso-,
   solo que corrido un escalon hacia adentro. */
body.lp > [data-revela] { opacity: 1; }
body.lp > [data-revela] > * { opacity: 0; }
body.lp > [data-revela].visible { animation: none; }
body.lp > [data-revela].visible > * { opacity: 1; animation: llegar 1.1s var(--ease) var(--retraso, 0s) backwards; }

/* Las partes de una seccion desglosada. Las que estan derechas suben un poco
   al llegar; las que ya vienen torcidas o corridas -el rayo, los papelitos,
   las fichas- solo se encienden, porque subirlas les pisaria su transform.
   Cual es cual lo decide landing.js mirando el transform que cada una tiene:
   escrito a mano en el marcado se desincroniza el dia que algo se tuerza. */
.lp [data-parte] { opacity: 0; }
.lp [data-parte].visible { opacity: 1; animation: revelar 1.05s var(--ease) var(--retraso, 0s) backwards; }
.lp [data-parte="sube"].visible { animation-name: llegar; }

/* La portada, al cargar. El orden es el de la lectura: la firma de la esquina,
   el titulo, y de ahi para abajo. La ventana es la unica que no sigue el paso
   del texto: tarda medio segundo mas, porque es la pieza grande de la pantalla
   y una pieza grande que llega al ritmo de un renglon se ve apurada. */
.lp [data-entra] { animation: llegar 1.05s var(--ease) var(--retraso, 0s) backwards; }
.lp-hero .hero-nav    { --retraso: .04s; }
.lp-hero h1.display   { --retraso: .12s; }
.lp-hero .bajada      { --retraso: .24s; }
.lp-hero .onda        { --retraso: .32s; }
.lp-hero .acciones    { --retraso: .4s; }
.lp-hero .ventana-mac { --retraso: .2s; animation-duration: 1.5s; }

/* Y las paginas que arrancan con su nombre -las novedades, el blog-, que es la
   portada de esas paginas: entran igual, solas y al cargar. El retraso es mas
   corto que el del titulo de la portada porque aca arriba no hay nada antes,
   ni firma ni dock propio; es apenas el respiro que hace que la palabra se lea
   llegando y no puesta. */
.lp .cabecera-pagina h1.display { --retraso: .06s; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .lp [data-revela], .lp [data-parte], .lp [data-entra],
  body.lp > [data-revela] > * {
    opacity: 1; transform: none; transition: none; animation: none;
  }
  /* El arrastre queda: lo maneja la mano. Lo que se va es el rebote de la
     vuelta, que es movimiento que nadie pidio. */
  .lp .arrastrable { transition: none; }
  /* El boton se sigue encendiendo y levantando; lo que se va es el brillo que
     cruza, que es lo unico que se mueve solo. */
  .lp .btn.primario::after { display: none; }
  .marco { transition: opacity .3s linear; }
  .archivo, .cursor { display: none; }
  .zona { display: none; }
  .resultado { opacity: 1; transform: none; transition: none; }
  .app-dock .progreso i { animation: none; width: 42%; }
}

/* ------------------------------------------------------------- responsive - */

@media (max-width: 1080px) {
  .lp-nav .links { display: none; }
  /* Apilado, el texto va primero: el titulo es lo que tiene que leerse antes
     de decidir si vale la pena mirar la app. */
  /* El padding de arriba crece para dejar pasar el encabezado, que apilado
     queda justo encima del titulo. */
  .lp-hero { grid-template-columns: 1fr; padding: clamp(80px, 13vw, 104px) var(--gutter) 60px; }
  .texto-hero { order: -1; max-width: none; }
  .escenario { margin-left: calc(var(--gutter) * -1); margin-right: calc(var(--gutter) * -1); }
  .duo { grid-template-columns: 1fr; }
  .acompana-grid { grid-template-columns: 1fr; }
  .novedades .pasos-lista { display: none; }
  .novedades .version .fecha { display: block; margin-top: 7px; }
  .novedades .version .resumen { margin-top: 18px; }
  /* Apilada, la columna de la izquierda deja de tener a que pegarse: es la
     primera fila y despues vienen las versiones. La lista de versiones se
     esconde -es una tira que se corre y con tres entradas no paga el espacio-
     pero la tarjeta del tablero se queda, que es el unico enlace a esa pagina
     que hay en el cuerpo del sitio. El aire que tenia contra la lista pasa a
     estar debajo, que es donde ahora tiene algo pegado. */
  .novedades .indice { position: static; }
  .carta-tablero { margin-top: 0; margin-bottom: clamp(30px, 5vw, 46px); }
  /* Las tarjetas pasan de tres por renglon a dos. Tres en media pantalla son
     tres columnas de una palabra por renglon, y una lista que no se puede leer
     no ordena nada. Las dos listas ya venian una abajo de la otra en cualquier
     ancho, asi que de eso no hay nada que cambiar. */
  .pedidos { grid-template-columns: repeat(2, 1fr); }
  /* Los tres momentos dejan de ser una columna al costado y pasan a ser una
     tira que se corre. Sin barra: mide 16 pixeles de alto, que es mas que el
     subrayado que dice cual momento estas leyendo, y cruzarle una barra gris
     por debajo lo convierte en el borde de una caja. Lo que esta a la derecha
     se sabe porque el ultimo momento entra cortado, y ademas landing.js corre
     la tira sola para dejar a la vista el que se esta leyendo. */
  .pasos-lista { position: static; display: flex; gap: 18px; overflow-x: auto; scrollbar-width: none; }
  .pasos-lista::-webkit-scrollbar { display: none; }
  .pasos-lista a { white-space: nowrap; }
  /* El momento que queda a medias contra el borde se apaga en vez de cortarse.
     Cortado en seco -«la noche ante|»- se lee como un error de layout; apagado
     se lee como lo que es, que de ese lado hay mas y que hay que correr la
     tira. El velo tapa la palabra y su subrayado a la vez, porque recorta la
     tira entera y no el texto.

     Se enciende de a un lado por vez y solo si de ese lado queda algo: llegando
     al final, el ultimo momento tiene que poder leerse entero. Cual es cual lo
     dice landing.js mirando donde esta parada la tira. */
  .pasos-lista {
    -webkit-mask-image: linear-gradient(to right,
      transparent 0, #000 var(--velo-izq), #000 calc(100% - var(--velo-der)), transparent 100%);
    mask-image: linear-gradient(to right,
      transparent 0, #000 var(--velo-izq), #000 calc(100% - var(--velo-der)), transparent 100%);
    transition: --velo-izq .25s ease, --velo-der .25s ease;
  }
  .pasos-lista.hay-izquierda { --velo-izq: 34px; }
  .pasos-lista.hay-derecha { --velo-der: 34px; }
  .planes { grid-template-columns: 1fr; }
  /* Apiladas, la solapa cae justo encima de la tarjeta siguiente: el hueco que
     ocupa se lo pone la tarjeta de la que cuelga, porque la solapa esta fuera
     del flujo y no puede pedirlo ella. */
  .plan.elegido { margin-bottom: 22px; }
  .lp-pie .cols { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 760px) {
  /* Y en el telefono las tarjetas del tablero van de a una: dos al lado, con
     el pulgar comiendose lo suyo, dejan la frase en una palabra por renglon. */
  .pedidos { grid-template-columns: 1fr; }
  /* Los cuatro links no entran al lado de la marca: en el telefono quedan la
     marca arriba y los links en el pie, que es donde se los busca. */
  .hero-nav .links { display: none; }
  /* Sin los links en el medio, la marca y el idioma quedaban pegados uno al
     lado del otro en la esquina izquierda, leyendose como una sola cosa. La
     banda pasa a ocupar el ancho entero y cada uno se va a su punta: la firma
     a la izquierda, el idioma a la derecha, que es donde se lo busca en un
     telefono y donde llega el pulgar. */
  .hero-nav { left: var(--gutter); right: var(--gutter); }
  .hero-nav .idiomas { margin-left: auto; }
  /* El titulo respira. El encabezado va absoluto y no empuja nada, asi que el
     aire entre la marca y la primera linea es este padding y nada mas: con el
     de antes -el mismo de una pantalla ancha, donde la banda esta mas arriba-
     el titulo arrancaba a veinte pixeles de la marca y los dos se leian como
     un bloque. */
  .lp-hero { padding-top: clamp(124px, 30vw, 152px); }
  /* Los titulos se reparten los renglones. A este ancho una frase de siete
     palabras entra en dos y media, y la media es una palabra sola colgando
     abajo -«Mac.», y debajo empieza la frase que sigue-, que en un cuerpo de
     titulo se lee como un error de corte y no como un renglon. Balanceado, los
     renglones quedan del mismo largo y ninguna palabra queda sola; la cantidad
     de renglones es la misma, asi que ninguna seccion cambia de alto. Donde no
     esta soportado, corta como cortaba. */
  .lp .display { text-wrap: balance; }
  .dupla { grid-template-columns: 1fr; gap: 14px; }
  .tripa { grid-template-columns: 1fr; gap: 26px; }
  /* El numero de version deja de ser una banda al costado y pasa a ser el
     encabezado de su propio bloque: apilado, una columna de 200px se come
     medio telefono para decir «1.4». */
  /* La carpeta vive en el aire que le sobra al titulo, y en el telefono no
     sobra nada: ahi se le montaba encima. */
  .carpeta, .candado { display: none; }
  .lp-pie .cols { grid-template-columns: 1fr; }
  /* En una sola columna los enlaces del pie dejan de apuntarse con una flecha y
     pasan a apuntarse con un pulgar. El renglon media 19 pixeles de alto y el
     ancho de sus tres palabras: se erraba. Ahora el area es el renglon entero
     -de punta a punta de la columna- y se lleva puesto el aire que tenia
     alrededor, que estaba ahi para separar y no para nada mas. El margen
     negativo devuelve lo que el relleno agrega, asi que el pie se ve
     exactamente igual; lo unico que cambia es donde hay que dar. */
  .lp-pie li a { display: block; padding: 7px 0; margin: -7px 0; }
  /* La app se estira a lo alto y el guion pasa abajo: al lado, a este ancho,
     la diapositiva quedaba ilegible y es justo lo que hay que ver. */
  .app { aspect-ratio: auto; padding: 16px; }
  .app-cuerpo { grid-template-columns: 1fr; gap: 18px; height: auto; }
  .app-guion { gap: 14px; }
  .app-top { padding-bottom: 14px; font-size: 12px; }
  /* Apilado, el guion se queda sin la lamina al lado que le diga cuanto mide:
     el flex: 1 no tiene contra que estirarse y la ventana crece hasta el
     ultimo parrafo. Ahi deja de ser una ventana -se ve el guion entero, con
     los cinco parrafos apagados- y ademas landing.js corre la pista para
     centrar el que suena, asi que abajo queda un palmo de nada. Con el alto
     escrito vuelve a ser lo que es: un recorte por el que pasa el texto.
     Crece con el ancho, que es lo que crece la lamina de arriba. */
  .guion-mock { flex: none; height: clamp(210px, 62vw, 300px); font-size: 14.5px; }
  .app-dock { font-size: 11.5px; margin-top: 14px; }
  .app-atajos { font-size: 10.5px; }
  .diapo { font-size: 9px; }
}

@media (max-width: 620px) {
  /* En un telefono la pastilla no entra con los dos botones: el que se va es
     el secundario, porque el que importa es el de descargar. */
  .lp-nav { padding: 6px 6px 6px 14px; gap: 8px; }
  .lp h1.display { font-size: clamp(34px, 9.4vw, 52px); }
  .app-atajos { display: none; }
  /* Las escenas de los tres momentos. En el telefono la diapositiva y lo que
     suena dejan de ir al lado y pasan una debajo de la otra: al lado, con 340
     de ancho, la diapositiva quedaba del tamaño de un sello y es justo lo que
     hay que ver. El encabezado tambien se parte, que es mejor que apretar el
     nombre del documento hasta los puntos suspensivos. */
  .esc-cima { flex-wrap: wrap; gap: 10px; }
  .esc-par { grid-template-columns: 1fr; gap: 16px; }
  .escena .suena-dice { min-height: 78px; }
  .mapa { height: 66px; }
  .reloj-fila { grid-template-columns: 66px 1fr 50px; gap: 10px; }
}

/* =========================================================== comparativas === */
/* Las paginas de «Filmina vs X». Son el mismo articulo que una nota del blog
   -misma columna, misma medida, mismo cuerpo- con tres piezas propias: la miga
   debajo de la apertura, la tabla del medio y el par de tarjetas del veredicto. Nada mas:
   lo que se viene a leer aca es texto corrido, y una pagina llena de cajas de
   colores se lee como un folleto, que es exactamente lo que no queremos que
   parezca una comparativa escrita por una de las dos partes. */

/* La miga. No es una navegacion de verdad -el sitio tiene dos niveles- sino la
   linea que dice donde estas parado cuando entras por buscador y no por la
   portada.
   Va DEBAJO de la tarjeta que cierra la apertura, no arriba del titulo. Arriba
   era lo primero que se leia de la pagina, y lo primero tiene que ser de que
   se trata: quien entra por buscador ya sabe que hizo clic en un resultado, lo
   que no sabe es si esta en la pagina que buscaba. Abajo la encuentra el que
   termino la apertura y quiere subir un nivel, que es el unico momento en que
   una miga sirve para algo. */
.texto .miga { display: flex; flex-wrap: wrap; gap: 8px; margin: 1.6em 0 0; color: var(--tinta-3); font-size: 14px; }
.lp .texto .miga a { color: var(--tinta-3); text-decoration: none; }
.lp .texto .miga a:hover { color: var(--tinta); }

/* La bajada: el resumen de la comparativa, en el cuerpo con el que empieza una
   nota. Va mas grande que el texto y mas chica que el titulo, que es lo que la
   hace leerse como una entrada y no como el primer parrafo. */
.texto .bajada-nota { margin: 22px 0 0; color: var(--tinta-2); font-size: 20px; line-height: 1.5; }

/* La tabla. Es una <table> de verdad y no tres columnas de divs: lo que se
   compara son filas, y quien lee con lector de pantalla necesita que cada celda
   sepa a que fila y a que columna pertenece.
   Sin fondos ni cebra: la unica linea es la de abajo de cada fila, igual que en
   el resto del texto largo. El scroll horizontal es para el telefono, donde una
   tabla de tres columnas no entra y encogerla la vuelve ilegible. */
.texto .cuadro { margin: 2.2em 0; overflow-x: auto; }
.texto .cuadro table { width: 100%; min-width: 540px; border-collapse: collapse; }
.texto .cuadro caption { caption-side: bottom; margin-top: 14px; text-align: left; color: var(--tinta-3); font-size: 14px; line-height: 1.5; }
.texto .cuadro th, .texto .cuadro td {
  padding: 15px 18px 15px 0; text-align: left; vertical-align: top;
  border-bottom: 1px solid var(--linea-fina);
  color: var(--tinta-2); font-size: 16px; line-height: 1.5;
}
.texto .cuadro thead th { border-bottom: 1px solid var(--linea); color: var(--tinta); font-size: 14px; font-weight: 550; }
.texto .cuadro tbody th { width: 30%; color: var(--tinta); font-weight: 550; }
/* La columna propia va en tinta plena. No es un subrayado de vendedor: en una
   tabla de tres columnas hay que poder volver a la nuestra sin releer el
   encabezado, y el unico recurso que no ensucia es el contraste. */
.texto .cuadro td.nuestra { color: var(--tinta); }

/* El veredicto: dos tarjetas, una por herramienta, con el icono arriba. Son las
   unicas cajas de toda la pagina, y estan justo donde alguien que bajo leyendo
   en diagonal necesita una respuesta corta. */
.texto .veredicto { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 2.2em 0; }
.texto .veredicto .ico {
  width: 26px; height: 26px; display: block; margin-bottom: 14px;
  stroke: var(--tinta); fill: none; stroke-width: 2.1; stroke-linecap: round; stroke-linejoin: round;
}
.texto .veredicto h3 { margin: 0 0 8px; font-size: 16.5px; }
.texto .veredicto p { margin: 0; color: var(--tinta-2); font-size: 15.5px; line-height: 1.55; }

/* La opinion firmada. Es la misma tarjeta que el resto del sitio y no una caja
   aparte con comillas gigantes: lo que la separa del texto no es el dibujo,
   es que arriba dice quien habla. La cara va del tamano de dos lineas, que es
   lo que hace falta para reconocer a alguien y no mas: esto es una opinion
   dentro de un articulo, no un testimonio de landing. */
.texto .opinion { margin: 2.2em 0; }
.texto .opinion p { margin: .9em 0 0; color: var(--tinta-2); font-size: 15.5px; line-height: 1.6; }
.texto .opinion .opinion-quien { display: flex; align-items: center; gap: 10px; margin: 0 0 16px; }
.texto .opinion-foto { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; }
.texto .opinion-nombre { color: var(--tinta); font-weight: 550; }
.texto .opinion-arroba { color: var(--tinta-3); text-decoration: none; }
.texto .opinion-arroba:hover { color: var(--tinta); }

/* Las otras comparativas, al pie del articulo. Son tarjetas apiladas y no una
   lista con vinetas: el que llego hasta aca ya termino de leer, y lo que sigue
   no es un parrafo mas del texto sino una puerta. Una vineta lo devuelve al
   cuerpo del articulo; una tarjeta se lee como algo aparte y se puede tocar
   entera, que es lo que en realidad se quiere hacer con ella.

   Mismo material que las tarjetas del blog -la lamina, el pelo del canto, el
   levante al pasar por encima-, porque son la misma cosa: una nota que todavia
   no leiste. Van una abajo de la otra y no en grilla: son tres, tienen una
   linea de texto cada una, y en dos columnas quedarian anchas y vacias. */
.texto .otras {
  margin: 1.8em 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 12px;
}
/* La tarjeta es el <li> y no el enlace: el texto viene partido en titulo y
   bajada desde el diccionario, y el enlace es solo el titulo. Lo que se
   estira despues para que se pueda tocar toda es el enlace, mas abajo. */
.texto .otras li {
  position: relative;
  display: grid;
  gap: 5px;
  margin: 0;
  padding: 20px 24px 22px;
  border: 1px solid var(--edge);
  border-radius: 18px;
  background: var(--lamina);
  -webkit-backdrop-filter: var(--blur);
  backdrop-filter: var(--blur);
  box-shadow: var(--canto);
  /* El fondo no entra en la transicion: un degrade no se interpola en todos
     lados y quedaba a medio animar. Lo mismo que en las tarjetas del blog. */
  transition: border-color .2s ease, box-shadow .3s ease,
              transform .3s cubic-bezier(.22,1.18,.36,1);
}
.texto .otras li:hover,
.texto .otras li:focus-within {
  background: var(--lamina-hi);
  border-color: var(--edge-hi);
  box-shadow: var(--sombra), var(--canto-hi);
  transform: translateY(-2px);
}
.texto .otras a {
  font-family: var(--serif); font-weight: 500;
  font-size: 20px; letter-spacing: -.015em; line-height: 1.2;
  /* El subrayado es para los enlaces que van DENTRO de un parrafo, donde hay
     que distinguirlos de la letra de al lado. Aca se toca la tarjeta entera,
     asi que subrayar el titulo seria decirlo dos veces. */
  color: var(--tinta);
  text-decoration: none;
}
/* El area del enlace es la tarjeta entera: el que quiere ir a la otra
   comparativa apunta a la tarjeta, no a las tres palabras del titulo. Va de
   pseudo-elemento y no de un <a> alrededor de todo porque el marcado viene
   armado del diccionario, y ademas asi el texto de la bajada se sigue
   pudiendo seleccionar. */
.texto .otras a::before { content: ''; position: absolute; inset: 0; }
.texto .otras span { color: var(--tinta-2); font-size: 15.5px; line-height: 1.5; }

@media (max-width: 620px) {
  .texto .bajada-nota { font-size: 18px; }
  .texto .veredicto { grid-template-columns: 1fr; }
}


/* ------------------------------------------------------------------ idiomas */
/* El selector. Es un <details>, asi que abre y cierra sin JavaScript: lo unico
   que agrega el script es cerrarlo cuando clickeas afuera.

   La pastilla es del alto del boton de al lado y no de su color: al lado de
   "Descargar" tiene que quedar claro cual de los dos es el que importa. Por eso
   el globo y dos letras, y no el nombre entero del idioma. */
/* Las preguntas frecuentes tambien son <details>, y su estilo -la linea abajo
   y el mas que gira- alcanza a cualquier details de la pagina. Aca no va
   ninguno de los dos: esto es una pastilla, no un renglon de una lista. */
/* El reset va con details.idiomas y con :first-of-type escrito: ".lp
   details:first-of-type" pone una linea arriba y le gana por especificidad a
   dos clases sueltas, asi que la pastilla aparecia con una raya encima. */
.lp details.idiomas,
.lp details.idiomas:first-of-type { border: 0; }
.lp .idiomas { position: relative; }
.lp .idiomas > summary::after { content: none; }
.lp .idiomas > summary {
  display: inline-flex; align-items: center; gap: 7px;
  height: 40px; padding: 0 13px;
  border-radius: 999px;
  font-size: 14px; font-weight: 550; letter-spacing: .01em;
  color: var(--tinta-2);
  cursor: pointer;
  list-style: none;
  transition: background .2s ease, color .2s ease;
}
.lp .idiomas > summary:hover,
.lp .idiomas[open] > summary { color: var(--tinta); background: var(--glass-hi); }
.lp .idiomas > summary .glifo {
  width: 17px; height: 17px;
  stroke-linecap: round; stroke-linejoin: round;
}

/* El panel. En el dock de abajo abre HACIA ARRIBA, que es de donde hay lugar;
   en el nav de la portada, que vive arriba de todo, abre hacia abajo. */
.lp .idiomas .menu {
  position: absolute;
  right: 0; bottom: calc(100% + 10px);
  z-index: 70;
  min-width: 232px;
  display: flex; flex-direction: column;
  padding: 6px;
  border-radius: 18px;
  /* Opaco, y SIN backdrop-filter, aunque todo el resto del cromo sea vidrio.
     El dock ya tiene backdrop-filter, y un backdrop-filter adentro de otro no
     se puede dibujar: el de adentro toma su fondo del "backdrop root", que es
     el de afuera, y el navegador termina pintando un rectangulo negro que
     rompe la pastilla del dock. Se ve igual en Chrome y en Safari.

     El color se arma apoyando el mismo vidrio sobre el papel de la pagina, asi
     que queda del tono que tendria si fuera translucido, pero sin serlo: un
     panel flotante que deja pasar el texto de atras no se lee, y este tiene dos
     renglones por fila. Y sigue andando en los dos temas sin escribir un color
     nuevo. */
  background: linear-gradient(var(--vidrio-papel-op), var(--vidrio-papel-op)), var(--papel);
  border: 1px solid var(--edge);
  box-shadow: var(--sombra-lg), var(--canto);
}
.lp .hero-nav .idiomas .menu { top: calc(100% + 10px); bottom: auto; left: 0; right: auto; }
/* En el telefono el selector se va al borde derecho de la banda, asi que el
   panel tiene que colgar de ahi: anclado a la izquierda se le sale de la
   pantalla por 120 pixeles y el navegador achica la pagina entera para que
   entre. Va aca y no en el bloque de arriba porque esta linea es la de al
   lado, y escrita alla la pisa igual. */
@media (max-width: 760px) {
  .lp .hero-nav .idiomas .menu { left: auto; right: 0; }
}

.lp .idiomas .menu a {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: 2px 10px;
  padding: 9px 12px;
  border-radius: 13px;
  color: var(--tinta);
  transition: background .18s ease;
}
.lp .idiomas .menu a:hover { background: var(--glass-hi); }
.lp .idiomas .menu .nombre { font-size: 15px; font-weight: 550; letter-spacing: -.01em; }
/* La region, mas apagada que el idioma: "Español" es lo que se elige y
   "Argentina" es de cual de los dos. */
.lp .idiomas .menu .nombre i { font-style: normal; color: var(--tinta-3); font-weight: 450; }
.lp .idiomas .menu .glosa {
  grid-column: 1; font-size: 13px; color: var(--tinta-3); letter-spacing: 0;
}
/* El tilde ocupa su lugar siempre, tambien cuando no se ve: si apareciera y
   desapareciera, el renglon se correria al pasar de un idioma a otro. */
.lp .idiomas .menu .tilde {
  grid-column: 2; grid-row: 1 / -1;
  width: 18px; height: 18px;
  stroke-linecap: round; stroke-linejoin: round;
  opacity: 0; color: var(--tinta);
}
.lp .idiomas .menu a[aria-current] .tilde { opacity: 1; }

@media (max-width: 620px) {
  /* En el telefono el dock ya viene justo de ancho: queda el globo solo. */
  .lp .lp-nav .idiomas > summary { padding: 0 11px; }
  .lp .lp-nav .idiomas > summary span { display: none; }
  .lp .idiomas .menu { min-width: 208px; }
  /* Y el panel deja de colgar del globo para colgar del dock. Con el globo de
     percha, el panel -que abre hacia la izquierda- salia por el borde de la
     pantalla: el globo esta en el medio de la pastilla y atras suyo no hay
     208 pixeles. Sacandole el position al details, el que hace de referencia
     pasa a ser el dock, que esta fijo y centrado, y el panel apoya su costado
     derecho contra el de la pastilla. En el monitor no cambia nada: ahi la
     pastilla es ancha y el globo llega con lugar de sobra. */
  .lp .lp-nav .idiomas { position: static; }
}

/* ================================================================ el pago ===
   La pagina donde se compra. Casi nada de lo que se ve aca es nuevo: la
   tarjeta es LA MISMA del bloque de precios -clase .plan, con su vidrio, su
   precio en serif y su lista de tildes- y no una tarjeta parecida. El que
   llego hasta aca apreto un boton adentro de una de esas tres, y si se
   dibujaran por separado, el dia que cambie una la otra se queda igual y el
   camino se rompe justo donde hay que confiar.

   Lo unico nuevo es el formulario, que en el resto del sitio no existe: el
   sitio se lee, esta es la unica pagina donde ademas se escribe.
   ========================================================================= */

.lp .pago .ancho { max-width: 520px; }

/* La marca, sola y arriba. Es la unica salida de la pagina que no es el boton:
   aca no estan ni el dock ni el pie, asi que sin esto lo unico que queda para
   volver es la flecha del navegador. */
.lp .logo-pago { display: block; width: fit-content; margin: 0 auto 52px; }
.lp .logo-pago .marca-f { display: block; width: 44px; height: 38px; color: var(--tinta); }

/* El titulo es el mas chico de los display del sitio y el unico centrado con
   algo abajo: lo que sigue es una tarjeta sola, no una pagina, y a cuerpo de
   portada un titulo de tres palabras sobre una caja de 520 se lee como un
   cartel. */
.lp .pago h1.display { font-size: clamp(28px, 4.6vw, 42px); text-align: center; }
.lp .pago .plan { margin-top: 38px; }
.lp .pago .plan h2 { font-size: 17px; }
/* El precio de lista va al lado y no arriba: en la portada el tachado vive en
   su propio renglon porque comparte lugar con el cartel del descuento y con la
   solapa del plazo, y aca no hay ni uno ni la otra. */
.lp .pago .precio s {
  margin-left: 10px;
  color: var(--tinta-3); font-family: inherit; font-size: .46em;
  text-decoration-thickness: 1px;
}

/* ---- el formulario ---- */
/* El campo es la pieza mas importante de la pagina, asi que es lo unico que se
   dibuja hacia adentro: todo el cromo del sitio es vidrio que sobresale del
   papel, y un vidrio mas, del mismo canto y la misma sombra que la tarjeta que
   lo contiene, no se leeria como un lugar donde se escribe. Va hundido: el
   borde entero, sin luz arriba, y el fondo un pelo mas oscuro que la tarjeta. */
.lp .pago-forma { display: grid; margin-top: 6px; }
.lp .pago-forma label {
  font-size: 13.5px; font-weight: 550; color: var(--tinta-2);
  letter-spacing: -.005em;
}
.lp .pago-forma input {
  margin-top: 12px;
  height: 50px; padding: 0 16px;
  border: 1px solid var(--edge-hi); border-radius: 13px;
  background: var(--vidrio-papel);
  color: var(--tinta); font: inherit; font-size: 16px;
  /* 16px clavados y no heredados de un tamano mas chico: abajo de eso, Safari
     en el telefono hace zoom solo al tocar el campo y deja la pagina corrida. */
  letter-spacing: -.005em;
  transition: border-color .2s var(--ease), background .2s var(--ease);
}
.lp .pago-forma input::placeholder { color: var(--faint); }
.lp .pago-forma input:focus {
  outline: none;
  border-color: var(--tinta-3);
  background: var(--vidrio-papel-op);
}
/* Las seis cifras se escriben espaciadas y en cifras de ancho fijo: es un
   numero que se compara contra un correo abierto al lado, no una palabra. */
.lp .pago-forma .pago-cifras {
  font-variant-numeric: tabular-nums;
  font-size: 22px; letter-spacing: .34em; text-align: center;
}
.lp .pago-ayuda,
.lp .pago-dicho {
  margin: 13px 0 0; color: var(--tinta-3); font-size: 13.5px; line-height: 1.5;
}
.lp .pago-dicho { margin: 0 0 26px; color: var(--tinta-2); font-size: 14.5px; }
.lp .pago-dicho b { color: var(--tinta); font-weight: 600; word-break: break-all; }
.lp .pago-forma .btn { width: 100%; margin-top: 26px; }

/* El rechazo. Es el unico rojo del sitio y aparece arriba del campo, pegado a
   lo que hay que corregir. Lleva fondo -el resto de la pagina no lleva
   ninguno- porque tiene que encontrarse sin buscarlo al volver de mandar el
   formulario. */
.lp .pago-mal {
  margin: 0 0 20px; padding: 12px 14px;
  border: 1px solid var(--peligro-borde); border-radius: 12px;
  background: var(--peligro-fondo);
  color: var(--peligro); font-size: 14px; line-height: 1.5;
}
.lp .pago-mal a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }

/* Las dos salidas del que se quedo esperando el codigo. El boton de pedir otro
   es un boton de verdad -tiene que mandar el correo que ya esta escrito- y se
   dibuja como el enlace que tiene al lado: son dos opciones del mismo peso y
   que una fuera un boton y la otra un enlace diria que una importa mas. */
.lp .pago-salidas {
  display: flex; gap: 20px; justify-content: center;
  margin: 22px 0 0;
}
.lp .pago-salidas button,
.lp .pago-salidas a {
  padding: 0; border: 0; background: none;
  color: var(--tinta-3); font: inherit; font-size: 13.5px; cursor: pointer;
  text-decoration: underline; text-underline-offset: 3px;
  text-decoration-color: var(--linea);
  transition: color .2s var(--ease);
}
.lp .pago-salidas button:hover,
.lp .pago-salidas a:hover { color: var(--tinta); }

/* Quien cobra. Afuera de la tarjeta y en gris: no es una promesa del producto,
   es el dato que hace falta para que la pagina de Stripe no sorprenda. */
.lp .pago-nota {
  margin: 32px auto 0; max-width: 42ch;
  text-align: center; color: var(--tinta-3); font-size: 13px; line-height: 1.5;
}

/* ---- la vuelta de Stripe ---- */
.lp .pago-hecho { text-align: center; display: grid; justify-items: center; }
.lp .pago-hecho h1.display { margin-top: 26px; }
.lp .pago-hecho .btn { margin-top: 30px; }
/* El tilde adentro del circulo verde, que es el unico color que el sitio usa
   para decir que algo salio bien. Va del tamano de un icono grande y no del de
   un sello: lo importante de la pantalla es lo que dice abajo, que es donde
   esta la clave. */
.lp .pago-tilde {
  display: grid; place-items: center;
  width: 62px; height: 62px; border-radius: 50%;
  background: var(--verde-fondo); color: var(--verde);
}
.lp .pago-tilde svg {
  width: 30px; height: 30px;
  fill: none; stroke: currentColor; stroke-width: 2.6;
  stroke-linecap: round; stroke-linejoin: round;
}
.lp .pago-dice {
  margin: 18px auto 0; max-width: 46ch;
  color: var(--tinta-2); font-size: 16.5px; line-height: 1.55;
}
.lp .pago-letra-chica {
  margin: 26px auto 0; max-width: 46ch;
  color: var(--tinta-3); font-size: 13px; line-height: 1.5;
}
.lp .pago-letra-chica a { text-decoration: underline; text-underline-offset: 3px; }

/* Los legales, al final y chicos. En una pagina de pago se los busca justo
   antes de poner la tarjeta, asi que estan; el resto del pie no, porque cada
   enlace de mas es una puerta para irse. */
.lp .pago-legal {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px 20px;
  justify-content: center;
  margin: 54px 0 0; padding-top: 28px;
  border-top: 1px solid var(--linea-fina);
  color: var(--faint); font-size: 12.5px;
}
.lp .pago-legal a { text-decoration: underline; text-underline-offset: 3px; }
.lp .pago-legal a:hover { color: var(--tinta-2); }

/* Las dos maneras de escribirle a Filmina, la misma receta que en el pie: el
   circulo de linea, la X maciza porque es una marca ajena y el sobre de trazo
   porque es un dibujo nuestro. Van en chico -30 y no 38- porque aca comparten
   renglon con dos enlaces de letra chica y no encabezan una columna.

   Reemplazan a la frase que decia lo mismo escrito. Al pie de una pagina de
   pago, "escribinos" es una linea mas que leer; dos marcas que se reconocen de
   un golpe dicen que hay alguien del otro lado sin ocupar un renglon. */
.lp .pago-legal .redes { display: flex; gap: 8px; }
.lp .pago-legal .redes a {
  display: grid; place-items: center;
  width: 30px; height: 30px;
  border: 1px solid var(--linea); border-radius: 999px;
  color: var(--tinta-3); text-decoration: none;
  transition: color .2s ease, background .2s ease, border-color .2s ease,
              transform .35s var(--resorte);
}
.lp .pago-legal .redes a:hover {
  color: var(--tinta); background: var(--linea-fina);
  border-color: var(--tinta-3); transform: translateY(-2px);
}
.lp .pago-legal .red { display: block; }
.lp .pago-legal .red-x { width: 12px; height: 12px; fill: currentColor; stroke: none; }
.lp .pago-legal .red-sobre {
  width: 15px; height: 15px;
  fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}

/* El candado del boton. Va del lado izquierdo del texto y macizo salvo el arco,
   que es lo que hace que se lea como un candado y no como una bolsa: el arco
   tiene que verse ABIERTO por abajo, apoyado sobre el cuerpo. No hereda el
   relleno del resto de los glifos, asi que se dibuja con sus propios atributos
   adentro del simbolo.

   Se llama pago-candado y no candado porque .candado ya es el dibujo grande de
   la portada, que esta clavado con position absolute: adentro del boton, esa
   clase mandaba el icono a la esquina derecha y torcido. */
.lp .pago-forma .btn .pago-candado { width: 17px; height: 17px; margin-top: -1px; }

@media (max-width: 620px) {
.lp .pago .plan { padding: 26px 20px; }
.lp .pago-legal { margin-top: 34px; }
}


/* ========================================================= documentacion ===
   Diez paginas de referencia con la barra al costado. Es lo mas parecido que
   tiene el sitio a una pagina de manual, y aun asi no trae nada nuevo: la
   prosa es la de .texto -la misma de los legales y del blog-, el cuadro es el
   de las comparativas y las tarjetas son el mismo vidrio que el dock. Lo unico
   propio es la grilla de dos columnas y la barra.

   No hay buscador. Diez paginas se recorren con el ojo, y un buscador que
   filtra diez titulos es una caja de texto que ocupa mas de lo que resuelve.
   ========================================================================= */

/* La grilla va centrada pero el BLOQUE es del ancho de la pagina, y no es un
   detalle: cada bloque del sitio es opaco y tapa al pie, que esta clavado
   detras. Con max-width y margin auto, el paisaje del pie se veia por los dos
   costados de la documentacion. Asi que lo que se centra es el contenido,
   con el relleno, y el fondo llega hasta los bordes. */
.docs {
  /* El aire de abajo, el que separa el ultimo renglon del pie. Es una variable
     porque lo usan dos: el cuerpo, como relleno, y la barra, como margen. La
     barra es pegajosa y puede bajar hasta el fondo de su casilla, que es el
     fondo del cuerpo CON ese relleno: sin el margen seguia bajando despues de
     que el texto se termino y quedaba mas abajo que el boton del final. Con el
     margen, las dos frenan en la misma linea. */
  --docs-fondo: clamp(70px, 8vw, 104px);
  display: grid;
  grid-template-columns: 232px minmax(0, 1fr);
  gap: clamp(30px, 4.5vw, 76px);
  padding-inline: max(var(--gutter), calc((100% - 1080px) / 2));
}

/* El cuerpo. .texto centra su columna de 700 en la pagina entera, y aca la
   columna ya la da la grilla: lo que se le saca es ese centrado, no el ritmo. */
.docs .docs-cuerpo {
  max-width: 44rem;
  padding: clamp(40px, 5.5vw, 78px) 0 var(--docs-fondo);
}
.docs .docs-cuerpo .miga { margin: 0 0 1.4em; }
.docs .docs-cuerpo h1 { font-size: clamp(32px, 4.2vw, 46px); }
/* La bajada dice de que es la pagina, en un cuerpo mas grande y en gris: es lo
   que se lee antes de decidir si esta es la pagina que se buscaba. */
.docs .docs-cuerpo .bajada-nota { margin: 20px 0 0; font-size: 19px; }
.docs .docs-cuerpo h2 { font-size: 25px; }
.docs .docs-cuerpo code {
  padding: 2px 5px; border-radius: 5px;
  background: var(--linea-fina); color: var(--tinta);
}

/* ---- la barra ---- */
/* Pegada arriba, con su propio scroll si no entra. El sitio no tiene barra
   arriba -el dock esta abajo-, asi que se puede quedar a un suspiro del borde
   sin pasar por debajo de nada. */
.docs-lado {
  position: sticky;
  top: clamp(26px, 4vw, 52px);
  align-self: start;
  max-height: calc(100dvh - clamp(52px, 8vw, 104px));
  margin-bottom: var(--docs-fondo);
  padding: clamp(40px, 5.5vw, 78px) 0 0;
  overflow-y: auto;
  scrollbar-width: none;
}
.docs-lado::-webkit-scrollbar { display: none; }
/* El rotulo de la barra solo hace falta cuando la barra dejo de estar al
   costado y quedo al final, donde nada dice que es. */
.docs-lado-titulo { display: none; }
.lp .docs-lado h2 {
  margin: 26px 0 8px;
  font-family: inherit;
  font-size: 11.5px; font-weight: 600;
  letter-spacing: .075em; text-transform: uppercase;
  color: var(--tinta-3);
}
.lp .docs-lado h2:first-of-type { margin-top: 0; }
.docs-lado ul {
  margin: 0; padding: 0; list-style: none;
  border-left: 1px solid var(--linea-fina);
}
.docs-lado li { margin: 0; }
.lp .docs-lado a {
  display: block;
  margin-left: -1px;
  padding: 6px 0 6px 14px;
  border-left: 1px solid transparent;
  color: var(--tinta-3);
  font-size: 14.5px; line-height: 1.4;
  text-decoration: none;
  transition: color .2s ease, border-color .2s ease;
}
.lp .docs-lado a:hover { color: var(--tinta-2); border-left-color: var(--tinta-3); }
/* Donde estas: la tinta entera y el pelo de linea encendido. No hay pastilla
   ni fondo, que es lo que hay en el resto del sitio para decir "esto es lo que
   estas mirando": una linea basta y no arma un bloque de color en el margen. */
.lp .docs-lado a.aqui {
  color: var(--tinta); font-weight: 550;
  border-left-color: var(--tinta);
}

/* La pastilla del dock, cuando la pagina que se esta viendo es la de la
   documentacion. Es la misma marca de "estas aca" que la barra de al lado. */
.lp-nav .links a.aqui { color: var(--tinta); background: var(--glass-hi); }

/* ---- las tarjetas de por donde empezar ---- */
.docs-fichas {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 12px;
  margin: 1.8em 0;
}
.lp .docs-ficha {
  display: block;
  padding: 18px 20px;
  border: 1px solid var(--edge); border-radius: 16px;
  background: var(--lamina); box-shadow: var(--canto);
  text-decoration: none;
  transition: background .2s ease, border-color .2s ease, transform .35s var(--resorte);
}
.lp .docs-ficha:hover {
  background: var(--lamina-hi); border-color: var(--edge-hi);
  transform: translateY(-2px);
}
.lp .docs-ficha b {
  display: block; margin-bottom: 4px;
  color: var(--tinta); font-size: 16.5px; font-weight: 550;
  letter-spacing: -.015em;
}
.lp .docs-ficha span {
  display: block;
  color: var(--tinta-3); font-size: 14.5px; line-height: 1.5;
}

/* ---- escuchar el articulo ---- */
/* Una barra entre dos pelos de linea, arriba del cuerpo de la nota. Va ahi y
   no flotando: el que la quiere la busca antes de empezar a leer, y el que no,
   pasa de largo sin que nada se le mueva por encima.

   Aparece solo si la nota tiene su m4a generado, asi que lo que se ve aca no es
   una promesa: el archivo esta. La duracion tambien viene escrita del servidor,
   medida al sintetizar, y por eso se lee sin bajar un solo byte de audio. */
.texto .escuchar {
  display: flex; align-items: center; gap: 12px;
  margin: 2.2em 0 0;
  padding: 14px 0;
  border-top: 1px solid var(--linea-fina);
  border-bottom: 1px solid var(--linea-fina);
}
.lp .escuchar-play {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px;
  border: 0; border-radius: 999px;
  background: var(--solido); color: var(--sobre-solido);
  cursor: pointer;
  transition: transform .25s cubic-bezier(.22,1.18,.36,1), box-shadow .25s ease;
}
/* El mismo choque que el boton de la portada, y la misma salida. En style.css
   vive `button:hover:not(:disabled):not(.activo)`, que le pone vidrio a
   cualquier boton; los :not() valen como clase, asi que pesa (0,3,1) y le
   ganaba a `.escuchar-play:hover`, que pesa (0,2,0). El circulo blanco se
   volvia gris oscuro justo al pasarle el mouse por encima, con el triangulo
   adentro sin contraste contra que dibujarse. Por eso el selector lleva el
   .texto adelante y el :not(:disabled) atras: con eso pesa (0,4,0) y pasa.

   Y aun ganando no hay color que cambiar: el boton ya es del blanco mas alto
   que hay. Asi que el hover crece y se le enciende un halo, que es lo que hace
   cualquier boton de reproducir cuando lo vas a apretar. El halo va con
   --linea-fina, que es tinta sobre papel claro y luz sobre papel negro, asi
   que existe en los dos temas. */
.texto .escuchar-play:hover:not(:disabled),
.texto .escuchar-play:focus-visible {
  background: var(--solido);
  transform: scale(1.07);
  box-shadow: 0 0 0 8px var(--linea-fina);
}
.escuchar-play .glifo { width: 17px; height: 17px; fill: currentColor; stroke: none; }
/* El triangulo esta un pelo corrido a la derecha: centrado por caja se ve
   corrido a la izquierda, porque el peso de la figura no esta en su centro. */
.escuchar-play .glifo-play { margin-left: 2px; }
.escuchar-play .glifo-pausa { display: none; }
.escuchar[data-estado="sonando"] .glifo-play { display: none; }
.escuchar[data-estado="sonando"] .glifo-pausa { display: inline; }
.escuchar-rotulo {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--tinta); font-size: 15px; font-weight: 500;
}
.escuchar-raya { flex: none; width: 1px; height: 16px; background: var(--edge); }
.escuchar-tiempo {
  flex: none;
  color: var(--tinta-3); font-size: 15px; font-weight: 500;
  font-variant-numeric: tabular-nums;
}
/* Compartir, contra el otro borde. El margin-left auto lo empuja y de paso
   deja que el rotulo del medio se coma el espacio que sobre. El padding
   negativo agranda el area que se puede tocar sin mover el dibujo: en un
   telefono, un icono de 17 pixeles es un blanco imposible. */
.lp .escuchar-compartir {
  margin-left: auto;
  display: inline-flex; align-items: center; gap: 8px;
  margin-right: -14px;
  padding: 14px;
  border: 0; background: none; cursor: pointer;
  color: var(--tinta-3); font-size: 15px; font-weight: 500;
  transition: color .2s ease;
}
.lp .escuchar-compartir:hover { color: var(--tinta); }
.escuchar-compartir .glifo { width: 17px; height: 17px; flex: none; }

/* ---- preguntale a la IA ---- */
/* Cuatro enlaces que abren el asistente con la pregunta ya escrita y la
   direccion de esta pagina adentro. No hay nada que cargar: es un enlace con
   la consulta en la query, asi que no depende de que ninguno de los cuatro
   siga teniendo API el ano que viene. */
.docs-ia {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 14px 20px;
  margin: 1.8em 0 2.2em;
  padding: 16px 20px;
  border: 1px solid var(--edge); border-radius: 18px;
  background: var(--lamina); box-shadow: var(--canto);
}
.docs-ia-dicho {
  color: var(--tinta); font-size: 16.5px; font-weight: 550;
  letter-spacing: -.015em;
}
/* Sin media query a proposito: cuando el renglon no entra, el wrap del
   contenedor baja los botones solos, y ahi el space-between deja de separar
   nada porque en esa linea hay un solo bloque. Queda apilado y a la
   izquierda, que es lo que hace falta en el telefono. */
.docs-ia-opciones {
  display: flex; flex-wrap: wrap; gap: 8px;
  min-width: 0;
}
.lp .docs-ia-opcion {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 14px;
  border: 1px solid var(--edge); border-radius: 999px;
  background: var(--lamina);
  color: var(--tinta-2); font-size: 14.5px; font-weight: 500;
  text-decoration: none; white-space: nowrap;
  transition: background .2s ease, border-color .2s ease, color .2s ease;
}
.lp .docs-ia-opcion:hover {
  background: var(--lamina-hi); border-color: var(--edge-hi); color: var(--tinta);
}
/* Sin fill ni stroke aca a proposito: cada simbolo trae el suyo. */
.docs-ia-opcion .glifo { width: 16px; height: 16px; flex: none; }

/* ---- anterior y siguiente ---- */
/* Las dos tarjetas del final. La de atras queda a la izquierda y la de
   adelante a la derecha aunque falte una: con una sola, la que hay se queda en
   su lado y el hueco dice de que lado se termino el camino. */
.docs-pasos {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin: 3.4em 0 0;
  padding-top: 2.2em;
  border-top: 1px solid var(--linea-fina);
}
.lp .docs-paso {
  padding: 14px 18px;
  border: 1px solid var(--edge); border-radius: 14px;
  background: var(--lamina);
  text-align: right; text-decoration: none;
  grid-column: 2;
  transition: background .2s ease, border-color .2s ease;
}
.lp .docs-paso.atras { grid-column: 1; text-align: left; }
.lp .docs-paso:hover { background: var(--lamina-hi); border-color: var(--edge-hi); }
.lp .docs-paso span {
  display: block; margin-bottom: 3px;
  color: var(--tinta-3); font-size: 12.5px;
}
.lp .docs-paso b {
  color: var(--tinta); font-size: 15.5px; font-weight: 550;
  letter-spacing: -.015em;
}

/* ---- sin costado ---- */
/* Debajo de esto no hay lugar para dos columnas, asi que la barra deja de ser
   una barra: pasa al final, despues del texto y antes del pie, como el indice
   de un libro. El que llego a esta pagina vino a leerla; el indice lo quiere
   despues, no antes. */
@media (max-width: 900px) {
  .docs { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .docs .docs-cuerpo { order: 1; max-width: none; padding-bottom: 8px; }
  /* El indice, despues del texto. Lo que se mueve es el orden en la grilla y
     no el marcado: en la pantalla ancha la barra tiene que venir ANTES en el
     documento, que es donde la espera quien navega con el teclado o con un
     lector de pantalla. */
  .docs-lado {
    order: 2;
    position: static; max-height: none;
    padding: 34px 0 0; margin-top: 34px;
    border-top: 1px solid var(--linea-fina);
  }
  /* El aire de abajo es el que separa el rotulo del primer grupo de enlaces.
     Sin el -y hasta ahora no habia ninguno, porque .lp p le ganaba a
     .docs-lado-titulo y le dejaba el margen en cero-, el "Documentacion" de
     24px y el GETTING STARTED de 11.5 que le sigue se leen como un titulo de
     dos renglones en vez de como un titulo y el indice que empieza debajo. Por
     eso va con .lp adelante, como las demas reglas de la barra. */
  .lp .docs-lado-titulo {
    display: block; margin: 0 0 30px;
    /* Y cruza las dos columnas en vez de quedarse en la primera: adentro de una
       de ellas, el rotulo empuja para abajo solo a su columna y la otra arranca
       mas arriba, con el primer grupo de enlaces a la altura del titulo. */
    column-span: all;
    font-family: var(--serif); font-size: 24px; font-weight: 500;
    letter-spacing: -.02em; color: var(--tinta);
  }
  .docs-lado nav { columns: 2; column-gap: 26px; }
  .lp .docs-lado h2:first-of-type { margin-top: 0; }
}
@media (max-width: 560px) {
  .escuchar-compartir span { display: none; }
  .docs-lado nav { columns: 1; }
  .docs-pasos { grid-template-columns: 1fr; }
  .lp .docs-paso, .lp .docs-paso.atras { grid-column: 1; }
}
