/* SEMBRADO desde aurox/sitios/estatico/casa.css por herramientas/sembrar_casa.py.
   NO se edita aquí: la siguiente siembra se lleva el cambio. */
/* La casa de Aurox: lo que comparten los CUATRO sitios. ESCRITO A MANO.

   Aquí vive lo que hace que aurox.mx, descarga.aurox.mx, contadores.aurox.mx y el
   portal se vean del mismo grupo: los cuatro colores del manual por su nombre, las
   superficies, el patrón de logos del fondo y los gestos (el revelado, el escáner, el
   encaje y las cifras que ruedan).

   Está aparte de `sitio.css` desde el 2026-10-08, cuando esto se llevó al portal. El
   portal es OTRO repositorio y lo fácil habría sido copiar y pegar: a la segunda
   corrección las dos copias dirían cosas distintas y nadie sabría cuál manda. Así que
   la fuente es este archivo, y `aurox/sitios/herramientas/sembrar_casa.py` lo copia al
   portal junto con `vida.js` y los dos SVG del sello. Si se edita la copia del portal,
   la siguiente siembra se la lleva.

   Lo que NO está aquí y sí en `sitio.css`: la escala de tipografía y los espacios, las
   piezas propias de los sitios estáticos (nav, firma, tarjetas, pie) y la tipografía
   de la marca, que el portal declara por su cuenta porque sus rutas son otras. */

/* ── Los cuatro del manual (pag. 9), por su nombre ───────────────────────────
   Ger da cuatro colores con su CMYK, RGB y HEX; estos son esos cuatro, sin derivar
   nada. Los demas tokens nombran un PAPEL (--bg, --accent) y cambian con el tema;
   estos nombran el COLOR, que no cambia de noche a de dia.

   DEBERIAN venir de tokens.css: `marca/generar.py` ya los emite (se cambio el
   2026-10-07). Lo que no se puede es regenerar la marca en esta maquina —pide
   descarga-sat, que no esta aqui, y Pillow—, asi que mientras tanto se cubre el
   hueco desde aqui, como `datos/descarga-congelado.json` cubre el de los precios.
   Cuando se regenere alla, tokens.css los trae y este bloque SE BORRA. */
:root {
  --m-oscuro: #162230;   /* solidez, responsabilidad, confianza (manual, pag. 8) */
  --m-medio:  #016682;   /* confianza y equilibrio */
  --m-cielo:  #7aacd9;   /* claridad; «alguien que te acompana» */
  --m-gris:   #bebebe;   /* innovacion y tecnologia; equilibra la paleta */
  /* El degradado que Ger usa en las paginas del propio manual. Va en lo que NO
     lleva letra encima (aros, barras, lineas): sobre el cielo, el texto blanco da
     2.1:1 y el manual mismo lo incumple en su pagina 8. Donde hay texto se usa
     --degradado-fondo, que acaba en el azul oscuro y si deja leer. */
  /* El isotipo como MASCARA, para poder pintarlo del color que toque sin tener un
     SVG por color. Es el isotipo SOLO (copia de marca-oficial/): icono.svg no sirve
     porque trae el cuadrado redondeado del favicon detrás, y de mascara eso es un
     cuadrado, no la silueta. */
  --sello-isotipo: url("/estatico/sello-isotipo.svg");
  --sello-patron: url("/estatico/sello-patron-claro.svg");
  --degradado-marca: linear-gradient(135deg, var(--m-medio), var(--m-cielo));
  --degradado-fondo: linear-gradient(135deg, var(--m-medio) 0%, var(--m-oscuro) 78%);
}

/* ── Superficies (2026-10-07) ────────────────────────────────────────────────
   Toño: «me interesa mas contraste porque se ve todo muy plano». Medido antes de
   tocar: de noche el fondo es #162230 y la tarjeta de vidrio quedaba en #1d2835 —
   11 puntos de luz de diferencia, que a simple vista es NINGUNA. De dia, peor: el
   fondo #eff3f6 y la tarjeta un blanco al 42% encima, o sea casi el mismo gris.
   Por eso se veia plano: todo vivia sobre una sola superficie.

   Esto NO toca la marca. Igual que la escala tipografica, las superficies son
   estructura: dicen a que distancia esta cada cosa del papel, no de que color es
   la empresa. Los colores siguen saliendo de los cuatro de Ger.

   De noche la tarjeta se HUNDE (mas oscura que el fondo) en vez de flotar: ademas
   de separarse, sube el contraste del texto encima, que es lo contrario de lo que
   pasaba aclarandola. De dia la tarjeta es blanco puro contra un fondo gris azul:
   la misma idea al reves, y tambien sube el contraste. */
:root:not([data-tema]), [data-tema="oscuro"] {
  --sello-patron: url("/estatico/sello-patron-oscuro.svg");
  --sup:        color-mix(in srgb, var(--m-oscuro) 66%, transparent);
  --sup-2:      color-mix(in srgb, var(--m-oscuro) 82%, transparent);
  --sup-linea:  color-mix(in srgb, var(--m-cielo) 15%, transparent);
  --sup-linea2: color-mix(in srgb, var(--m-cielo) 28%, transparent);
  --sup-tecnica: color-mix(in srgb, var(--m-gris) 16%, transparent);
  --sup-rotulo: var(--m-gris);
}
[data-tema="claro"] {
  --sup:        #ffffff;
  --sup-2:      color-mix(in srgb, #ffffff 86%, var(--m-cielo));
  --sup-linea:  color-mix(in srgb, var(--m-medio) 16%, transparent);
  --sup-linea2: color-mix(in srgb, var(--m-medio) 30%, transparent);
  --sup-tecnica: color-mix(in srgb, var(--m-oscuro) 10%, transparent);
  --sup-rotulo: var(--faint);
}

/* ── La vida (2026-10-07) ─────────────────────────────────────────────────────
   Toño, encargado de diseño, lo lleva a inversionistas: «quiero que la página se
   sienta viva, mete efectos, colores y contraste que eleven la dopamina».

   Lo que se mueve vive aquí y lo enciende estatico/vida.js poniendo `html.vida`.
   Por qué así y no al revés: lo que se revela se esconde SÓLO detrás de esa clase,
   así que sin JS, con el archivo caído o con movimiento reducido la página se ve
   completa y quieta — y medir.mjs, que mide con movimiento reducido, mide texto que
   de verdad se ve. Un «opacity: 0» de salida en el CSS daría una página en blanco
   el día que este archivo no cargue, y un verde de contraste sobre texto invisible.

   Ningún color nuevo: todo sale del acento y del fondo de tokens.css (la paleta
   oficial de Ger). El contraste del TEXTO no se toca — la luz va detrás de él. */

/* Los orbes del fondo respiran. Son los dos que ya estaban, quietos; moverlos muy
   despacio y desfasados es lo que hace que la página se sienta encendida sin que
   nada parpadee. 19 y 23 s para que no vuelvan a coincidir. */
@keyframes aurox-respirar {
  from { transform: translate3d(0, 0, 0) scale(1); opacity: .8; }
  to   { transform: translate3d(2.5vw, -2vh, 0) scale(1.22); opacity: 1; }
}
html.vida .luces > i { will-change: transform, opacity; }
html.vida .luces > i:nth-child(1) { animation: aurox-respirar 19s ease-in-out infinite alternate; }
html.vida .luces > i:nth-child(2) { animation: aurox-respirar 23s 1.5s ease-in-out infinite alternate-reverse; }

/* ── Luces de fondo: sin algo que difuminar detras, el vidrio no se ve ──
   Los orbes se nombran como HIJOS DIRECTOS (.luces > i). Con `.luces i` a secas, los
   logos del patron —que tambien son <i>, pero nietos— heredaban el blur de 120 px y
   no se veia ninguno. */
.luces { position: fixed; inset: 0; pointer-events: none; z-index: 0; overflow: hidden; }
.luces > i { position: absolute; display: block; border-radius: 50%; filter: blur(120px); }
.luces > i:nth-child(1) { width: 620px; height: 620px; background: var(--orb1); top: -200px; left: -160px; }
.luces > i:nth-child(2) { width: 520px; height: 520px; background: var(--orb2); bottom: -180px; right: -140px; }
main, header, footer { position: relative; z-index: 1; }

/* ── Los dos personajes (2026-10-09, en la casa) ─────────────────────────────
   Estaban sólo en la landing de Descarga; ahora los usa también la puerta del
   portal, así que viven aquí. Son el isotipo de Ger a escala 0.40: medio disco de
   40 con muesca de 14.3 y cabeza de 12.9 a 14.7 del centro, el segundo invertido.
   SIN BRAZOS: el apretón ya está en que los dos cuerpos se entrelazan, y en el
   cuadro en que se juntan lo que se ve ES el logo. */
.los-dos { display: block; width: 100%; height: auto; overflow: visible; }
.los-dos .cuerpo { fill: var(--m-cielo); }
.los-dos .chispa { fill: none; stroke-width: 3; opacity: 0;
  stroke: color-mix(in srgb, var(--head) 80%, var(--m-cielo));
  transform-origin: 260px 107px; }
@keyframes dos-junta-izq {
  0%, 44%   { transform: translateX(0); }
  55%       { transform: translateX(58.4px); }
  58%       { transform: translateX(61.4px); }
  62%       { transform: translateX(57.2px); }
  65%       { transform: translateX(60.4px); }
  69%, 88%  { transform: translateX(58.4px); }
  100%      { transform: translateX(0); }
}
@keyframes dos-junta-der {
  0%, 44%   { transform: translateX(0); }
  55%       { transform: translateX(-58.4px); }
  58%       { transform: translateX(-61.4px); }
  62%       { transform: translateX(-57.2px); }
  65%       { transform: translateX(-60.4px); }
  69%, 88%  { transform: translateX(-58.4px); }
  100%      { transform: translateX(0); }
}
@keyframes dos-contacto {
  0%, 53%   { transform: scale(.25); opacity: 0; }
  56%       { opacity: .9; }
  72%, 100% { transform: scale(3.1); opacity: 0; }
}
@keyframes dos-bote-arriba {
  0%, 54%, 100% { transform: translateY(0); }
  58%           { transform: translateY(-4.5px); }
  63%           { transform: translateY(1.5px); }
  68%           { transform: translateY(0); }
}
@keyframes dos-bote-abajo {
  0%, 54%, 100% { transform: translateY(0); }
  58%           { transform: translateY(4.5px); }
  63%           { transform: translateY(-1.5px); }
  68%           { transform: translateY(0); }
}
html.vida .los-dos .uno      { animation: dos-junta-izq 7s cubic-bezier(.3,.8,.3,1) infinite; }
html.vida .los-dos .otro     { animation: dos-junta-der 7s cubic-bezier(.3,.8,.3,1) infinite; }
html.vida .los-dos .chispa   { animation: dos-contacto 7s cubic-bezier(.2,.7,.3,1) infinite; }
html.vida .los-dos .cab-uno  { animation: dos-bote-arriba 7s cubic-bezier(.3,.8,.3,1) infinite; }
html.vida .los-dos .cab-otro { animation: dos-bote-abajo 7s cubic-bezier(.3,.8,.3,1) infinite; }
/* En la puerta del portal van más chicos y con aire: ahí el protagonista es el
   formulario, no ellos. */
.los-dos-puerta { max-width: 260px; margin: 0 auto var(--s-4, 24px); opacity: .9; }

/* ── La burbuja del título (2026-10-09) ──────────────────────────────────────
   Toño, de la sección del despacho: «cada que abro una pestaña el título sólo lo
   divide una línea delgada, no me gusta; me agrada la idea de la transparencia,
   hazlo como una burbuja transparente con degradado».

   Era un `border-bottom: 1px` — la convención de siempre para separar la cabecera
   del contenido, y lo más parecido a no haber decidido nada. Ahora el título va en
   una pieza de vidrio con el degradado de la casa: el azul medio entrando por la
   esquina de arriba a la izquierda y disolviéndose en nada hacia la derecha.

   El degradado va como `background-image` SOBRE el color sólido de la superficie,
   no en lugar de él: `medir.mjs` compone el contraste leyendo `backgroundColor`, y
   sin el color de debajo mediría el texto contra el fondo de la página y daría un
   verde que no corresponde. Y por eso el degradado es tenue (18% como mucho): lo
   que tiene que leerse es el título, no el cristal. */
.burbuja {
  position: relative;
  border-radius: var(--r-tarjeta, 22px);
  border: 1px solid var(--sup-linea);
  background-color: var(--sup);
  background-image: linear-gradient(135deg,
    color-mix(in srgb, var(--m-medio) 18%, transparent) 0%,
    color-mix(in srgb, var(--m-cielo) 9%, transparent) 46%,
    transparent 78%);
  backdrop-filter: blur(14px) saturate(1.15);
  -webkit-backdrop-filter: blur(14px) saturate(1.15);
  padding: clamp(18px, 2.4vw, 28px) clamp(20px, 2.6vw, 32px);
  box-shadow: var(--glass);
}
/* Un hilo del degradado de la marca arriba, que es lo que la ata a la casa: el
   mismo recurso que lleva la banda de «Tus datos» en Descarga. */
.burbuja::before {
  content: ""; position: absolute; inset: 0 0 auto; height: 2px;
  border-radius: var(--r-tarjeta, 22px) var(--r-tarjeta, 22px) 0 0;
  background: var(--degradado-marca); opacity: .75;
}

/* ── El paso de una página a otra (2026-10-09) ───────────────────────────────
   Hasta ahora, ir de una página a otra era un parpadeo en blanco: el navegador tira
   la anterior y pinta la siguiente. En un sitio con cuatro dominios y páginas que se
   visitan en cadena —el hub lleva a Descarga, Descarga a su ayuda, Contadores al
   portal— ese parpadeo es lo que más delata que son páginas sueltas y no un producto.

   Con esto, el navegador funde una con otra. Son dos líneas y no cuestan nada: donde
   no esté soportado, se pasa como siempre y no se rompe nada. */
@view-transition { navigation: auto; }
::view-transition-old(root), ::view-transition-new(root) { animation-duration: .28s; }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root), ::view-transition-new(root) { animation: none; }
}

/* ── Detalles que nadie nombra pero todos ven ────────────────────────────────
   Seleccionar texto y el foco del teclado son dos cosas que pasan en todas las
   páginas, cientos de veces al día, y que casi siempre se quedan con el azul que
   trae el navegador de fábrica. Puestos en el color de la casa, el sitio se siente
   terminado sin que nadie sepa decir por qué. */
::selection { background: color-mix(in srgb, var(--m-cielo) 42%, transparent); color: var(--head); }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 6px; }

/* ── El patrón de logos (2026-10-07; independizado el 2026-10-09) ────────────
   Isotipos sueltos por el fondo que flotan solos y se apartan del puntero.

   Vive en SU PROPIO contenedor y sus piezas son `<b class="logo">`, no `<i>` dentro
   de `.luces`. Esto no es capricho: el portal YA TENÍA una clase `.luces` con sus
   propios orbes y una regla `.luces i:nth-child(1) { width: 620px; height: 620px;
   background: var(--orb1) }`. Nuestros logos, al ser `<i>` dentro de `.luces`,
   recibían esa regla —que gana por especificidad— y acababan midiendo 636 px sin
   imagen. El patrón no se veía en ninguna página del portal y costó encontrarlo
   porque todo lo demás estaba bien: el archivo cargado, la variable resuelta y los
   veinte elementos en su sitio.

   La lección va en el nombre: lo que viaja a otro proyecto no puede llamarse como
   algo genérico. `.patron` y `.logo` dentro de él son nuestros; `.luces` era de los
   dos y por eso chocó. */
.patron {
  position: fixed; inset: 0; z-index: 0; overflow: hidden; pointer-events: none;
}
.patron > span {
  position: absolute; width: clamp(46px, 5vw, 78px); aspect-ratio: 1.8 / 1;
  will-change: transform;
}
.patron .logo {
  display: block; width: 100%; height: 100%; opacity: var(--brillo, .05);
  background: var(--sello-patron) center / contain no-repeat;
  transition: opacity .5s ease; will-change: transform;
}
@keyframes aurox-flota {
  from { transform: translate3d(0, 0, 0) rotate(-2.5deg); }
  to   { transform: translate3d(0, -26px, 0) rotate(2.5deg); }
}
html.vida .patron > span { animation: aurox-flota var(--ritmo, 17s) ease-in-out infinite alternate; }

/* ── Revelado (2026-10-07, segunda vuelta) ────────────────────────────────────
   Lo que había era «sube 18 px y aparece», que es LA animación de cualquier página
   hecha con IA, igual que el reflector que seguía al puntero (Toño: «ese efecto lo
   he visto en un montón de páginas que se están creando con IA»). Los dos fuera.

   Lo que entra sale de lo que hace el programa, que es traerse datos del SAT y
   llenar con ellos una tabla. Son dos gestos, y ninguno mueve nada de sitio:

   1. EL TEXTO SE ESCRIBE: una máscara descubre el renglón de izquierda a derecha,
      como se llena un campo. El elemento no se desplaza, así que no hay ese brinco
      de media página cuando entran seis cosas a la vez.
   2. LA TARJETA SE ESCANEA: se descubre de arriba abajo con una línea de luz en el
      frente, que es como se ve llenarse una descarga. La línea lleva el degradado
      del manual y va sincronizada con el recorte: misma curva y misma duración.

   El escalón (--paso) lo pone vida.js por posición dentro del grupo, así cada
   rejilla entra en cascada desde su propia primera ficha. */
html.vida .revelar {
  -webkit-mask-image: linear-gradient(100deg, #000 38%, rgba(0, 0, 0, .4) 52%, transparent 64%);
          mask-image: linear-gradient(100deg, #000 38%, rgba(0, 0, 0, .4) 52%, transparent 64%);
  -webkit-mask-size: 320% 100%;  mask-size: 320% 100%;
  -webkit-mask-position: 100% 0; mask-position: 100% 0;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  opacity: .999;                       /* fuerza su propia capa: el barrido no repinta la pagina */
}
html.vida .revelar.vivo {
  -webkit-mask-position: 0 0; mask-position: 0 0;
  transition: -webkit-mask-position .85s cubic-bezier(.22, .72, .28, 1) calc(var(--paso, 0) * 85ms),
                      mask-position .85s cubic-bezier(.22, .72, .28, 1) calc(var(--paso, 0) * 85ms);
}

/* La tarjeta se escanea: una línea baja por ella y, a su paso, cada renglón se
   escribe de izquierda a derecha. Es la tabla de facturas llenándose.

   NO se hace recortando la tarjeta. Se intentó con `clip-path: inset(0 0 100% 0)` y
   el resultado fue que las once tarjetas no aparecían nunca: el IntersectionObserver
   calcula el área de intersección DESPUÉS de aplicar los recortes del propio
   elemento, así que una tarjeta recortada a cero nunca «asoma» y jamás recibe su
   clase. Medido en la página: `escaner: 11, escanerVivos: 0`. Esconder con recorte y
   revelar al asomar son dos cosas que no pueden convivir en el mismo elemento.

   Así que la tarjeta no se toca: lo que se descubre son sus renglones (`--fila`, que
   pone vida.js, también dentro de las listas), y la línea del frente va de
   `background-image` del propio elemento. De paso no hay que pelear con las sombras:
   un recorte se come el aro del plan destacado, una máscara también, y esto no. */
html.vida .escaner > *, html.vida .escaner > ul > li {
  -webkit-mask-image: linear-gradient(100deg, #000 38%, rgba(0, 0, 0, .4) 52%, transparent 64%);
          mask-image: linear-gradient(100deg, #000 38%, rgba(0, 0, 0, .4) 52%, transparent 64%);
  -webkit-mask-size: 320% 100%;  mask-size: 320% 100%;
  -webkit-mask-position: 100% 0; mask-position: 100% 0;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
}
html.vida .escaner.vivo > *, html.vida .escaner.vivo > ul > li {
  -webkit-mask-position: 0 0; mask-position: 0 0;
  transition: -webkit-mask-position .6s cubic-bezier(.22, .72, .28, 1)
                calc(var(--paso, 0) * 85ms + var(--fila, 0) * 70ms),
                      mask-position .6s cubic-bezier(.22, .72, .28, 1)
                calc(var(--paso, 0) * 85ms + var(--fila, 0) * 70ms);
}
/* La linea del frente va como `background-image` del propio elemento y no como un
   pseudo-elemento, para dejar ::before y ::after libres: los necesita el encaje. */
@keyframes aurox-escanear {
  0%   { background-position: 0 0;    background-size: 100% 2px; }
  92%  {                              background-size: 100% 2px; }
  100% { background-position: 0 100%; background-size: 100% 0; }
}
html.vida .escaner.vivo {
  background-image: var(--degradado-marca); background-repeat: no-repeat;
  animation: aurox-escanear var(--escaneo, .8s) cubic-bezier(.3, .55, .35, 1)
             calc(var(--paso, 0) * 85ms) both;
}

/* ── El encaje ───────────────────────────────────────────────────────────────
   Lo que había aquí era el reflector: una luz redonda que seguía al puntero. Se ve
   en todas partes y no dice nada de Aurox.

   Esto sí: el isotipo de Ger son DOS PARTES QUE SE DAN LA MANO, y el hub entero se
   llama «Dos partes que se dan la mano». Al pasar el puntero por una tarjeta, dos
   trazos salen de las esquinas de abajo y se encuentran en el centro — el mismo
   gesto del logo, hecho con el degradado del manual. Al salir se retiran por donde
   vinieron. Nadie más puede tener este efecto porque sale de esta marca.

   La línea de abajo y no un borde completo: el borde entero alrededor es otra vez
   el lugar común, y además pelea con el aro que ya llevan el plan destacado y la
   tarjeta de pago. */
.encaje { position: relative; }
.encaje::after, .encaje::before {
  content: ""; position: absolute; bottom: -1px; height: 2px; width: 50%;
  border-radius: 2px; transform: scaleX(0); pointer-events: none;
  transition: transform .45s cubic-bezier(.22, .72, .28, 1);
}
.encaje::before { left: 0;  transform-origin: left;
  background: linear-gradient(90deg, var(--m-medio), var(--m-cielo)); }
.encaje::after  { right: 0; transform-origin: right;
  background: linear-gradient(270deg, var(--m-medio), var(--m-cielo)); }
@media (hover: hover) and (pointer: fine) {
  .encaje:hover::before, .encaje:hover::after { transform: scaleX(1); }
  .encaje:hover { border-color: color-mix(in srgb, var(--m-cielo) 42%, var(--sup-linea)); }
}


/* El botón principal: un halo del propio acento, y un brillo que lo cruza al pasar
   el puntero. El halo también lo deja visible sobre el fondo oscuro de la marca. */
.boton-1 { position: relative; overflow: hidden;
  box-shadow: 0 8px 24px color-mix(in srgb, var(--accent) 26%, transparent); }
.boton-1::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; transform: translateX(-130%);
  background: linear-gradient(100deg, transparent 24%,
              color-mix(in srgb, var(--accentFg) 30%, transparent) 48%, transparent 72%);
}
@keyframes aurox-barrido { to { transform: translateX(130%); } }
html.vida .boton-1:hover::after { animation: aurox-barrido .85s cubic-bezier(.3, .7, .4, 1); }

/* La pastilla «en vivo» late. Es un punto de 7 px: late, no parpadea. */
@keyframes aurox-latir {
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, currentColor 55%, transparent); }
  70%      { box-shadow: 0 0 0 7px transparent; }
}
.chip-vivo::before {
  content: ""; width: 7px; height: 7px; border-radius: 99px; background: currentColor; flex: none;
}
html.vida .chip-vivo::before { animation: aurox-latir 2.4s ease-out infinite; }

/* El rodillo de las cifras. Sus tiras se llamaban `.cinta` y eso rompio la seccion
   de precios de Descarga: alli `.cinta` es la PILDORA de lanzamiento —inline-flex,
   con relleno, redondeada, con su punto y su destello en bucle—, asi que cada digito
   del precio recibia relleno de 7x16, fondo de pastilla, un punto delante y un
   destello animado propio. Trece digitos con trece destellos: «se ve todo encimado y
   trabado», y con razon. Es el mismo error que `.luces i` con el patron, dos dias
   despues: lo que viaja entre proyectos no puede llamarse como algo generico. Ahora
   son `.rodillo-tira`, que no se llama como nada de nadie (2026-10-09).

   Cada digito es una tira de 0..9 dos veces mas el
   digito que toca, dentro de una ventana de un renglon. Rueda dos vueltas y para.
   `em` y no pixeles: las cifras van en `clamp()` y cada una mide distinto. */
.rodillo { display: inline-block; overflow: hidden; height: 1em; line-height: 1;
  vertical-align: baseline; }
.rodillo .rodillo-tira { display: block; will-change: transform; }
.rodillo i { display: block; height: 1em; line-height: 1; font-style: normal;
  font-variant-numeric: tabular-nums; }

