/* Estilo de la portada. Salió de index.html el 16-09-2026, cuando Industria
   del turismo pasó a ser su propia página: dos ficheros no pueden llevar la
   misma hoja copiada. Lo comparten index.html y turismo.html. */
  /* Página de marca: un solo look, claro, el de la app. No cambia con el tema
     del visitante, por eso todos los colores van explícitos. */
  :root{
    --verde:#64A06E;   /* COLORS.green de la app. El logo también usa este. */
    --verde-hondo:#3F6B4A;
    --crema:#FFFFFF;        /* fondo blanco en toda la página */
    --crema-honda:#F2F1EC;
    --tinta:#111310;
    /* Era #6E736B y daba 4,85 sobre blanco (medido el 18-09-2026): pasa el
       4,5 de la norma, pero raspando, y en una pantalla mala o con sol se
       cae. Este da 5,53 y no ennegrece la página: el matiz verdoso sigue. */
    --gris:#656A63;         /* neutro tirando al verde, no gris puro */
    /* El gris de los textos secundarios. Era #9A9E96 y daba 2,39:1 dentro de
       los campos y 2,73:1 sobre blanco, los dos por debajo del 4,5 que exige
       la norma (medido el 16-09-2026). Este da 4,78 sobre el fondo del campo. */
    --gris-flojo:#666B63;
    --blanco:#FFFFFF;
    --banda:104px;   /* lo que la banda fija tapa por abajo */
    /* Curva de entrada fuerte (Emil Kowalski, 16-09-2026). La `ease` del
       navegador arranca floja justo en el instante que más se mira. */
    --entra:cubic-bezier(.23,1,.32,1);
    /* Lenta, rápida, lenta. Para lo reversible: una flecha que gira al abrir y
       desgira al cerrar tiene que recorrer el mismo camino en los dos
       sentidos, y una curva de salida lo hace asimétrico. */
    --simetrica:cubic-bezier(.65,0,.35,1);
  }
  *{box-sizing:border-box}
  body{
    margin:0;
    background:var(--crema);
    color:var(--tinta);
    /* Sin fuentes de fuera: SF en el iPhone, Roboto en Android, que es la de
       la app. Además la página tiene que abrir rápido con datos. */
    font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
    -webkit-font-smoothing:antialiased;
    /* La reserva para la banda la lleva el PIE, no el cuerpo (16-09-2026):
       desde que el pie es negro, dejarla aquí pintaba una franja blanca justo
       debajo de él. */
  }
  .envoltorio{max-width:560px;margin:0 auto;padding:0 24px}

  /* Al pulsar, todo lo pulsable se hunde un poco (16-09-2026). Es la señal de
     que la página te ha oído; sin ella, en el móvil parece que no responde.
     160 ms porque la respuesta al dedo tiene que ser inmediata: esto NO es una
     animación de entrada y no le aplica el estándar de 380 ms de la casa. */
  .boton,.entrar,.registrarse,.enviar,.hamburguesa{
    transition:transform 160ms var(--entra);
  }
  .boton:active,.entrar:active,.registrarse:active,
  .enviar:active,.hamburguesa:active{transform:scale(.97)}
  @media (prefers-reduced-motion:reduce){
    .boton,.entrar,.registrarse,.enviar,.hamburguesa{transition:none}
  }

  /* ── Cabecera ──────────────────────────────────────────────── */
  /* Pegada arriba en TODAS las anchuras (Ignacio, 18-09-2026). En el móvil no
     lo estaba a propósito, porque con la banda fija abajo la pantalla se
     estrecha por los dos lados; lo que lo compensa es que ahora la barra lleva
     dentro el título del apartado, así que deja de ser adorno y dice dónde
     estás. Sticky y no fixed: así conserva su hueco y no hay salto. */
  header{
    position:sticky;top:0;z-index:25;
    display:flex;align-items:center;justify-content:flex-end;gap:14px;
    padding:12px 16px;max-width:none;margin:0;min-height:0;
    background:rgba(255,255,255,.72);
    -webkit-backdrop-filter:saturate(180%) blur(20px);
    backdrop-filter:saturate(180%) blur(20px);
    border-bottom:1px solid transparent;
    transition:border-bottom-color .22s var(--entra);
  }
  header[data-encogida="si"]{border-bottom-color:rgba(17,19,16,.08)}

  /* El título del apartado. Entra cuando el titular grande de la página ha
     salido por arriba: repetirlo mientras se ve el h1 sería decir lo mismo dos
     veces en el mismo pantallazo. `margin-right:auto` lo manda a la izquierda
     y deja los botones a la derecha. */
  .titulo-barra{
    margin-right:auto;min-width:0;
    font-size:15.5px;font-weight:600;letter-spacing:-.015em;color:var(--tinta);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    opacity:0;transform:translateY(6px);
    transition:opacity .22s var(--entra),transform .22s var(--entra);
  }
  header[data-titulo="si"] .titulo-barra{opacity:1;transform:none}
  /* Sin título (la portada), los botones siguen a la derecha igual. */
  header:not(:has(.titulo-barra)){justify-content:flex-end}

  @supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
    header{background:var(--blanco)}
  }
  @media (prefers-reduced-transparency:reduce){
    header{background:var(--blanco);backdrop-filter:none;-webkit-backdrop-filter:none}
  }
  @media (prefers-reduced-motion:reduce){
    header,.titulo-barra{transition:none}
  }
  /* Entrar y registrarse, en el escritorio. Registrarse va sin caja: dos
     botones seguidos se restan fuerza el uno al otro, y el que tiene que
     ganar es el negro. */
  .registrarse{
    display:none;
    color:var(--tinta);text-decoration:none;
    font-size:14.5px;font-weight:600;letter-spacing:-.01em;
  }
  .entrar{
    display:none;
    background:var(--tinta);color:#fff;text-decoration:none;
    font-size:14.5px;font-weight:600;letter-spacing:-.01em;
    padding:11px 18px;border-radius:8px;white-space:nowrap;
  }
  /* Dentro de la barra: ya no necesita fijarse ni llevar fondo propio. Antes
     iba suelta y las fotos del desfile le pasaban por debajo, así que sobre
     las oscuras las tres rayas negras desaparecían. La barra lo resuelve. */
  .hamburguesa{
    position:static;border:0;padding:10px;cursor:pointer;display:grid;gap:6px;
    background:none;
  }
  .hamburguesa span{display:block;width:27px;height:3.5px;background:var(--tinta);border-radius:99px}
  /* El menú ocupa la pantalla entera y va en oscuro, al modo de apple.com:
     pocas entradas, tipografía grande y nada más que mirar. */
  .menu{
    position:fixed;inset:0;z-index:30;background:var(--tinta);color:#F2F1EC;
    display:flex;flex-direction:column;align-items:center;justify-content:center;
    padding:0 24px;opacity:0;visibility:hidden;
    transition:opacity .26s var(--entra),visibility .26s;
  }
  .menu[data-abierto="si"]{opacity:1;visibility:visible}
  .menu .cerrar{
    position:absolute;top:calc(14px + env(safe-area-inset-top));right:16px;
    background:none;border:0;padding:10px;cursor:pointer;color:inherit;
  }
  .menu .cerrar .ms{font-size:32px;color:inherit}
  .menu ul{list-style:none;margin:0;padding:0;display:grid;gap:26px;text-align:center}
  .menu a{
    font-size:33px;font-weight:600;letter-spacing:-.025em;line-height:1.1;
    color:#F2F1EC;text-decoration:none;display:block;
  }
  /* Soluciones se abre en el sitio, sin cambiar de pantalla: son dos entradas
     y no merecen un nivel entero. El truco de las filas de 0fr a 1fr es lo que
     permite animar una altura que no se sabe de antemano. */
  .menu .titulo-rama{
    font:inherit;font-size:33px;font-weight:600;letter-spacing:-.025em;line-height:1.1;
    background:none;border:0;padding:0;color:#F2F1EC;cursor:pointer;
    display:inline-flex;align-items:center;gap:6px;
  }
  .menu .titulo-rama .ms{font-size:26px;transition:transform .26s var(--simetrica)}
  .menu .rama[data-abierta="si"] .titulo-rama .ms{transform:rotate(180deg)}
  .menu .hijas{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease}
  .menu .rama[data-abierta="si"] .hijas{grid-template-rows:1fr}
  .menu .hijas > div{overflow:hidden}
  /* Creadores de contenido todavía no lleva a ningún sitio, así que no es un
     enlace: un enlace que no lleva a nada es peor que un texto. Industria del
     turismo sí, y por eso va como <a> (15-09-2026). El tamaño lo comparten:
     sin esta regla el enlace heredaría los 33px de `.menu a`. */
  .menu .hijas span,.menu .hijas a{
    display:block;font-size:20px;font-weight:500;letter-spacing:-.01em;
    color:rgba(242,241,236,.66);padding:9px 0;text-decoration:none;
  }
  .menu .hijas a{color:#F2F1EC}
  .menu .hijas > div > :first-child{padding-top:16px}
  .menu .pronto{
    margin:6px 0 0;font-size:14px;font-weight:500;color:rgba(242,241,236,.4);
  }

  /* Los cuatro idiomas, a la vista y no escondidos detrás de una entrada más.
     Van en su nombre propio, que a un alemán "Alemán" no le dice nada y
     "Deutsch" sí, y el activo marcado. */
  .menu .idiomas{
    margin-top:44px;padding-top:26px;border-top:1px solid rgba(242,241,236,.16);
    display:flex;flex-wrap:wrap;justify-content:center;gap:10px 26px;
  }
  /* Texto y no enlaces: todavía no llevan a ningún sitio. Es la misma regla
     que ya se aplicaba a "Creadores de contenido" tres bloques más arriba, y
     que aquí se estaba incumpliendo (16-09-2026). El día que haya mecanismo de
     idiomas, vuelven a ser <a>. */
  .menu .idiomas span{
    font-size:16px;font-weight:500;letter-spacing:0;color:rgba(242,241,236,.6);
  }
  .menu .idiomas span.puesto{color:#F2F1EC;font-weight:600}
  /* ── Pantallas a pantalla completa (contacto y las que vengan) ───
     Mismo fondo oscuro que el menú: son el reverso de la página, no otra web. */
  .panel{
    position:fixed;inset:0;z-index:40;background:var(--blanco);color:var(--tinta);
    overflow-y:auto;opacity:0;visibility:hidden;
    /* No entra solo con un fundido: sube un poco al aparecer y baja al
       cerrarse, por el mismo camino (16-09-2026). Una superficie que se
       materializa se entiende como algo que llega; un fundido plano parece
       que siempre estuvo ahí y se encendió. Doce píxeles bastan: más sería
       un cajón, y esto es una pantalla completa. */
    transform:translateY(12px);
    transition:opacity .26s var(--entra),transform .26s var(--entra),visibility .26s;
    padding:calc(76px + env(safe-area-inset-top)) 24px 60px;
  }
  .panel[data-abierto="si"]{opacity:1;visibility:visible;transform:translateY(0)}
  .panel .cerrar{
    position:absolute;top:calc(14px + env(safe-area-inset-top));right:16px;
    background:none;border:0;padding:10px;cursor:pointer;color:inherit;
  }
  .panel .cerrar .ms{font-size:32px;color:inherit}
  .panel .hoja{max-width:460px;margin:0 auto}
  .panel h2{font-size:clamp(34px,9.2vw,44px);margin:0 0 30px;text-align:center}
  .pie-panel{
    margin:0 0 30px;text-align:center;font-size:16px;line-height:1.4;
    color:rgba(242,241,236,.6);
  }
  .panel form{display:grid;gap:16px}

  /* LA ETIQUETA QUE SUBE (16-09-2026).
     Antes el nombre del campo era solo el placeholder, y el placeholder se
     borra en cuanto escribes: quien rellenaba cuatro casillas y volvía atrás a
     revisar ya no sabía cuál era cuál, y quien escribe despacio pierde la
     referencia a mitad. Era lo peor puntuado de la revisión junto al botón
     "atrás".
     Ahora la etiqueta ES el placeholder mientras el campo está vacío, y al
     escribir sube y se queda arriba, pequeña. No se pierde el nombre y la
     casilla se ve igual de limpia en reposo.
     El alto NO cambia: el relleno de arriba crece lo que baja el de abajo.
     Va con medidas en variables porque hay dos tamaños de formulario, el de
     pantalla completa y el de la tarjeta de acceso y registro. */
  .campo{
    --cuerpo:18px; --renglon:21px; --encoge:.68; --sube:7px;
    --lado:16px; --arriba:24px; --abajo:8px;
    position:relative;display:grid;
  }
  .campo > span{
    position:absolute;left:var(--lado);top:var(--arriba);
    font-size:var(--cuerpo);line-height:var(--renglon);color:var(--gris-flojo);
    pointer-events:none;transform-origin:left top;
    transition:transform .16s var(--entra);
  }
  .campo[data-lleno="si"] > span,
  .campo:focus-within > span{
    transform:translateY(calc(var(--sube) - var(--arriba))) scale(var(--encoge));
  }
  /* El mismo salto sin JavaScript, para los navegadores que entienden `:has`.
     En regla aparte a propósito: si `:has` no se entiende, se cae esta sola y
     la de arriba sigue funcionando. */
  .campo:has(input:not(:placeholder-shown)) > span,
  .campo:has(textarea:not(:placeholder-shown)) > span,
  .campo:has(select:valid) > span{
    transform:translateY(calc(var(--sube) - var(--arriba))) scale(var(--encoge));
  }
  .campo select,.campo input,.campo textarea{
    font:inherit;font-size:var(--cuerpo);line-height:var(--renglon);
    color:var(--tinta);background:#F1F0EB;
    border:0;border-radius:8px;
    padding:var(--arriba) var(--lado) var(--abajo);
    width:100%;appearance:none;
  }
  .campo ::placeholder{color:transparent}
  .campo select:focus,.campo input:focus,.campo textarea:focus{
    background:#E9E7E0;outline:none;
  }
  /* La flecha del desplegable, dibujada: la del sistema sale clara sobre claro
     en algunos móviles y no se ve. */
  .campo select{
    background-image:linear-gradient(45deg,transparent 50%,var(--tinta) 50%),
                     linear-gradient(135deg,var(--tinta) 50%,transparent 50%);
    background-position:calc(100% - 22px) 28px,calc(100% - 16px) 28px;
    background-size:6px 6px,6px 6px;background-repeat:no-repeat;
  }
  .campo select option{color:var(--tinta)}
  .campo textarea{resize:vertical;min-height:110px}
  .campo :focus-visible{outline:2px solid var(--verde);outline-offset:2px}

  /* Foco de teclado en TODO lo pulsable, no solo dentro de los formularios
     (16-09-2026). Antes solo había esta regla de arriba, así que quien navega
     con el tabulador recorría la página a ciegas: el menú, la hamburguesa, los
     enlaces del pie y los botones de tienda no marcaban dónde estaba.
     `:focus-visible` y no `:focus`: con el ratón no se pinta nada. */
  a:focus-visible,button:focus-visible,summary:focus-visible{
    outline:2px solid var(--verde-hondo);outline-offset:3px;border-radius:4px;
  }
  /* Sobre el menú oscuro el verde hondo no se ve: ahí va en claro. */
  .menu a:focus-visible,.menu button:focus-visible,
  footer a:focus-visible,.tiendas-pie a:focus-visible{outline-color:#F2F1EC}
  .aviso{
    margin:0;text-align:center;font-size:15px;line-height:1.4;min-height:1.4em;
    color:var(--verde-hondo);
  }
  .aviso[data-mal="si"]{color:#B5443A}
  .enviar{
    /* VERDE DE MARCA, el mismo `COLORS.green` que el botón de la app. Estuvo
       un rato en el verde hondo para ganar contraste y eso rompía la marca
       (Ignacio, 16-09-2026).
       La forma correcta de cuadrarlo: blanco sobre #64A06E da 3,09:1, que no
       llega al 4,5 del texto normal pero SÍ pasa el 3,0 del texto grande. Y
       texto grande es 18,66px en negrita, así que el botón sube de 18/600 a
       19/700 y cumple sin tocar el color. */
    margin-top:6px;font:inherit;font-size:19px;font-weight:700;
    background:var(--verde);color:#fff;border:0;border-radius:8px;
    padding:16px;cursor:pointer;
  }
  /* ── Cómo funciona: los tres pasos ──────────────────────────
     Un <ol> de verdad: es un procedimiento con orden, y quien lo oiga con un
     lector de pantalla tiene que oír "1 de 3". El número grande no se pinta
     con texto, sale del contador de la lista. */
  .pasos{
    list-style:none;margin:26px 0 40px;padding:0;
    display:grid;gap:34px;
  }
  .pasos li{margin:0}
  /* El hueco del pantallazo, mientras no esté. Proporción de teléfono para que
     al llegar la imagen no se mueva nada de sitio. */
  /* La proporción es la REAL de las capturas (560x1214), no 9/16: un iPhone
     de hoy es mucho más alargado y con 9/16 se recortaban por arriba y por
     abajo (18-09-2026). */
  .pasos .pantalla{
    /* `height:auto` es imprescindible: el atributo `height` del <img> se
       aplica como altura fija y deja el `aspect-ratio` sin efecto, así que la
       captura salía a sus 1214 px de alto (18-09-2026). */
    display:block;width:100%;height:auto;max-width:190px;aspect-ratio:560/1214;
    margin:0 auto 16px;
    border-radius:20px;background:var(--crema-honda);
    /* El filete gris hace de marco: sin él, las capturas de fondo claro se
       funden con el blanco de la página y parecen recortadas. */
    border:1px solid #E4E2D9;
  }
  .pasos h3{
    margin:0 0 6px;font-size:19px;font-weight:600;letter-spacing:-.02em;
    text-align:center;
  }
  .pasos p{
    margin:0;font-size:16px;line-height:1.5;color:var(--gris);
    text-align:center;max-width:34ch;margin-inline:auto;
  }
  /* Ya es una página: la entradilla de los pasos y la lista de preguntas
     necesitan el mismo aire que el resto de bloques. */
  .entrada-pasos{margin-bottom:8px}
  .lista-dudas{max-width:620px;margin:22px auto 0;text-align:left}
  @media (min-width:720px){
    /* Los tres en fila: un procedimiento se lee mejor de izquierda a derecha
       cuando hay sitio. */
    .pasos{grid-template-columns:repeat(4,1fr);gap:22px}
    .pasos .pantalla{max-width:100%}
  }

  /* Las preguntas de Ayuda: <details> del navegador, sin JavaScript. Se abren
     solas aunque el guion falle, y el buscador del móvil las encuentra. */
  .duda{border-bottom:1px solid #E8E7E1}
  .duda summary{
    list-style:none;cursor:pointer;padding:19px 0;
    font-size:17.5px;font-weight:600;letter-spacing:-.015em;line-height:1.3;
    display:flex;align-items:flex-start;justify-content:space-between;gap:14px;
  }
  .duda summary::-webkit-details-marker{display:none}
  .duda summary .ms{font-size:24px;flex:none;transition:transform .22s var(--simetrica);color:var(--gris)}
  .duda[open] summary .ms{transform:rotate(180deg)}
  .duda p{
    margin:0 0 20px;font-size:16px;line-height:1.5;color:var(--gris);
    max-width:56ch;
  }

  /* ── Industria del turismo ──────────────────────────────────────────────
     Una sección más de la página: los titulares y las bajadas son los de
     siempre, aquí solo van las cifras, que no existen en ningún otro sitio. */
  /* El titular de /turismo. Usa el mismo eje que el `h1` de la portada, con
     algo menos de cuerpo: aquí el titular NO es el argumento, solo dice de qué
     va la página; el argumento es el primer bloque. */
  .titulo-turismo{
    font-size:clamp(40px,10vw,54px);line-height:1.04;letter-spacing:-.028em;
    font-weight:700;margin:0;padding-top:78px;text-align:center;
  }
  .cifra{margin-top:36px}
  .cifra:first-of-type{margin-top:30px}
  /* `tabular-nums` evita que el número baile de ancho mientras cuenta. */
  .cifra .numero{
    display:block;font-size:clamp(56px,15vw,68px);line-height:1;
    letter-spacing:-.04em;font-weight:700;color:var(--verde);
    font-variant-numeric:tabular-nums;
  }
  .cifra .bajada{margin-top:6px}
  /* La fuente en pequeño, pero a la vista: quien lee esto es del ramo y sin
     fuente esto es un folleto. */
  .cifra .fuente{
    margin:8px auto 0;font-size:13px;line-height:1.35;color:var(--gris);max-width:44ch;
  }
  .correo{color:var(--verde-hondo)}

  /* El formulario de /creadores. Vive en la página, no dentro de un panel, así
     que necesita su propio ancho y su aire: los campos heredan `.campo`, que ya
     está resuelto. (16-09-2026) */
  .pedir{
    display:grid;gap:14px;max-width:420px;margin:30px auto 0;text-align:left;
  }
  .pedir .aviso{margin-top:4px}

  /* El cierre de descarga. No se pinta en el móvil: allí manda la banda fija. */
  .cierre{display:none}
  .tiendas{display:flex;gap:14px;justify-content:center;margin-top:30px;flex-wrap:wrap}
  .tiendas .boton{font-size:16px;padding:14px 22px}
  .tiendas .boton svg{width:21px;height:21px;fill:#fff;flex:none;display:block}

  /* El QR solo tiene sentido en el escritorio: en un móvil ya estás en el
     aparato donde se instala. Lleva a /d, que mira qué teléfono lo escanea y
     manda al App Store o a Google Play. */
  .qr{display:none}
  .panel .otros{
    margin:22px 0 0;display:flex;flex-direction:column;align-items:center;gap:14px;
  }
  .panel .otros a{
    font-size:15.5px;font-weight:600;color:var(--verde-hondo);text-decoration:none;
  }
  /* El acceso no es una pantalla completa como Ayuda o Contacto: es una
     ventana encima, con la página detrás desenfocada. Así se entiende que no
     te has ido a ningún sitio, solo has abierto una puerta. */
  #acceso{
    padding:24px;display:grid;place-items:center;overflow:auto;
    background:rgba(17,19,16,.34);
    -webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);
  }
  #acceso .hoja{
    position:relative;width:100%;max-width:410px;
    background:var(--blanco);border-radius:18px;
    padding:36px 32px 30px;
  }
  #acceso .cerrar{position:absolute;top:10px;right:10px;color:var(--gris)}
  #acceso .cerrar .ms{font-size:26px}
  #acceso h2{font-size:25px;letter-spacing:-.02em;text-align:left;margin:0 0 22px}
  /* El aviso no ocupa sitio mientras está vacío, que era el hueco blanco
     entre Entrar y "o entra con". */
  #acceso .aviso{min-height:0}
  #acceso .campo{--cuerpo:16px;--renglon:19px;--lado:14px;--arriba:21px;--abajo:5px;--encoge:.72;--sube:6px}
  #acceso form{gap:13px}
  /* Sin bajar el cuerpo: por debajo de 18,66px en negrita el botón deja de
     contar como texto grande y el verde de marca ya no cumpliría. */
  #acceso .enviar{padding:15px}
  /* Entrar con Apple o con Google. Son los mismos flujos que ya usa la app en
     este dominio, con sus mismos identificadores y direcciones de vuelta, así
     que no hay nada nuevo que registrar en Apple ni en Google. */
  #acceso .separador{
    display:flex;align-items:center;gap:12px;margin:16px 0 14px;
    font-size:13px;color:var(--gris);
  }
  #acceso .separador::before,#acceso .separador::after{
    content:"";flex:1;height:1px;background:#E4E2D9;
  }
  #acceso .sociales{display:grid;gap:10px}
  #acceso .social{
    font:inherit;font-size:16px;font-weight:600;color:var(--tinta);
    background:none;border:1.5px solid #DCDAD0;border-radius:8px;
    padding:13px;cursor:pointer;
    display:flex;align-items:center;justify-content:center;gap:10px;
  }
  #acceso .social svg{width:19px;height:19px;flex:none}
  #acceso .social .manzana,#acceso .social svg:first-child{fill:var(--tinta)}
  #acceso .social[disabled]{opacity:.5;cursor:default}
  /* El registro reusa la misma ventana que el acceso y va por pasos: correo,
     código y datos. Es el mismo recorrido de tres llamadas que hace la app. */
  #registro,
  #recuperar{
    padding:24px;display:grid;place-items:center;overflow:auto;
    background:rgba(17,19,16,.34);
    -webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);
  }
  #registro .hoja,
  #recuperar .hoja{
    position:relative;width:100%;max-width:410px;
    background:var(--blanco);border-radius:18px;padding:36px 32px 30px;
  }
  #registro .cerrar,
  #recuperar .cerrar{position:absolute;top:10px;right:10px;color:var(--gris)}
  #registro .cerrar .ms,
  #recuperar .cerrar .ms{font-size:26px}
  #registro h2,
  #recuperar h2{font-size:25px;letter-spacing:-.02em;text-align:left;margin:0 0 18px}
  #registro form,
  #recuperar form{display:grid;gap:13px}
  #registro .explica,
  #recuperar .explica{margin:0 0 2px;font-size:15px;line-height:1.4;color:var(--gris)}
  #registro .campo,
  #recuperar .campo{--cuerpo:16px;--renglon:19px;--lado:14px;--arriba:21px;--abajo:5px;--encoge:.72;--sube:6px}
  #registro .aviso,
  #recuperar .aviso{min-height:0}
  /* Sin bajar el cuerpo: por debajo de 18,66px en negrita el botón deja de
     contar como texto grande y el verde de marca ya no cumpliría. */
  #registro .enviar,
  #recuperar .enviar{padding:15px}
  #registro .otra-vez,
  #recuperar .otra-vez{
    font:inherit;font-size:14.5px;font-weight:600;color:var(--verde-hondo);
    background:none;border:0;padding:4px;cursor:pointer;justify-self:center;
  }
  #registro .otra-vez[disabled],
  #recuperar .otra-vez[disabled]{color:var(--gris);cursor:default}
  #registro [name=codigo],
  #recuperar [name=codigo]{
    text-align:center;letter-spacing:.42em;font-size:22px;font-weight:600;
  }
  /* El aviso de cuenta pendiente de borrar. Se pinta desde el guion cuando el
     login lo devuelve, así que no está en el HTML de ninguna página. Usa la
     misma ventana que el acceso: fondo oscuro y hoja blanca. */
  .panel.rescate{
    padding:24px;display:grid;place-items:center;overflow:auto;
    background:rgba(17,19,16,.34);
    -webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);
    opacity:1;visibility:visible;
  }
  .panel.rescate .hoja{
    position:relative;width:100%;max-width:410px;
    background:var(--blanco);border-radius:18px;padding:36px 32px 30px;
  }
  .panel.rescate h2{font-size:25px;letter-spacing:-.02em;text-align:left;margin:0 0 14px}
  .panel.rescate .explica{margin:0 0 20px;font-size:15px;line-height:1.5;color:var(--gris)}
  .panel.rescate .enviar{width:100%;margin-top:0}
  .panel.rescate .otros{margin-top:16px}

  body.bloqueado{overflow:hidden}

  /* ── Portada ───────────────────────────────────────────────── */
  .portada{padding:16px 0 8px;text-align:center}
  .logo{width:104px;height:auto;display:block;margin:40px auto 37px}
  h1{
    font-size:clamp(38px,10.5vw,54px);
    /* 1,03 amontonaba las palabras en los titulares de tres líneas: a 1440 el
       h1 son 70 px con 72 de interlineado, o sea nada (18-09-2026). 1,08
       separa lo justo sin que el titular pierda fuerza. */
    line-height:1.08;letter-spacing:-.028em;font-weight:700;
    margin:0 0 4px;text-wrap:balance;
  }
  .entradilla{font-size:18px;line-height:1.5;color:var(--gris);margin:0 auto;max-width:30ch}

  /* El botón de la demo, bajo el titular. En contorno, no relleno: la acción
     principal de la portada sigue siendo descargarse la app, y dos botones
     macizos seguidos se restan fuerza el uno al otro. */
  .ver-demo{margin:22px 0 0;display:grid;justify-items:center}
  .boton-linea{
    display:inline-flex;align-items:center;justify-content:center;
    font-size:16.5px;font-weight:600;letter-spacing:-.01em;
    color:var(--tinta);text-decoration:none;
    border:1.5px solid var(--tinta);border-radius:8px;
    padding:14px 24px;
    transition:transform 160ms var(--entra),background-color .2s ease,color .2s ease;
  }
  .boton-linea:active{transform:scale(.97)}
  @media (hover:hover) and (pointer:fine){
    .boton-linea:hover{background:var(--tinta);color:#fff}
  }
  @media (prefers-reduced-motion:reduce){ .boton-linea{transition:none} }

  /* ── Bloques ───────────────────────────────────────────────── */
  section.bloque{padding:80px 0 0;text-align:center}
  /* La marca de Instagram, del fichero que ya tenía la web antigua.
     Va encima del titular en vez del antetítulo que quitamos: dice lo
     mismo sin una palabra. */
  .ig{width:44px;height:44px;display:block;margin:0 auto 18px}
  h2{
    font-size:clamp(34px,9.2vw,47px);line-height:1.04;letter-spacing:-.026em;
    font-weight:700;margin:0 0 16px;text-wrap:balance;
  }
  /* La bajada es la letra pequeña debajo del titular: cuanto más grande sea el
     titular, más callada tiene que estar ella. */
  /* Interlineado 1,55 y no 1,32: esto es texto corrido de varias líneas, no
     un rótulo, y apretado se lee peor (18-09-2026). */
  .bajada{font-size:16.5px;line-height:1.55;color:var(--gris);margin:0 auto;max-width:44ch}

  /* ── La animación de la versión vieja, sin GSAP ─────────────
     Nueve fotos en rejilla que se encogen, se vuelven redondas y vuelan a su
     sitio sobre el mapa. Tres se apagan por el camino: en el mapa no caben
     todas. Son los mismos destinos que usaba la página antigua.
     LA VUELTA NO PISA EL MAPA (18-09-2026). El fallo era que las fotos
     deshacían el camino entre el 92% y el 100%, que es justo el tramo en que
     el mapa se estaba apagando: al 94% el mapa seguía al 93% de opacidad con
     tres fotos de rejilla a tamaño completo encima, y al 98% con las ocho.
     Medido, no supuesto.
     El arreglo NO es quitar la vuelta (se probó y no vale: tiene que volver),
     es SEPARAR LOS DOS TRAMOS:
       88% → 93%   el mapa se apaga con todo quieto en su sitio.
       93% → 100%  ya sin mapa debajo, las fotos vuelven a la rejilla.
     Por eso los recorridos aguantan hasta el 93% y el mapa, el avatar y la
     capa se apagan al 88%. Son 0,6 s de despedida y 0,84 s de vuelta.
     Va con keyframes de CSS y no con una librería porque esta página tiene que
     abrir rápido con datos, que era una de las pegas del encargo. */
  /* Las animaciones sin fin se paran mientras no se ven (16-09-2026). Eran
     siete corriendo siempre: la escena del héroe seguía dando vueltas con el
     visitante leyendo el pie, y el desfile de categorías desde el primer
     fotograma aunque esté a cuatro pantallas de distancia. El navegador las
     pinta en cada refresco, las vea alguien o no. */
  [data-quieta],[data-quieta] *{animation-play-state:paused}

  .escena{position:relative;width:100%;aspect-ratio:1/1;margin-top:26px}
  .escena .vuelo{position:absolute;inset:0}
  .escena .mapa{
    position:absolute;inset:0;width:100%;height:100%;object-fit:contain;
    border-radius:22px;
    opacity:0;animation:aparece-mapa 12s cubic-bezier(.65,0,.35,1) infinite;
  }
  @keyframes aparece-mapa{
    0%,42%{opacity:0} 50%,88%{opacity:1} 93%,100%{opacity:0}
  }
  .escena .foto{
    position:absolute;aspect-ratio:1/1;object-fit:cover;border-radius:14%;
    display:block;
    animation-duration:12s;animation-timing-function:cubic-bezier(.65,0,.35,1);
    animation-iteration-count:infinite;
  }
  /* La publicación se convierte en el avatar de quien la publicó, que es
     exactamente lo que se ve en el mapa de la app. */
  .escena .capa{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit}
  .escena .avatar{
    opacity:0;animation:aparece-avatar 12s cubic-bezier(.65,0,.35,1) infinite;
  }
  /* Y la foto se apaga debajo. Si se queda, asoma un filo por detrás del
     avatar, que trae su propio borde claro recortado. */
  .escena .foto.muda .capa:not(.avatar){
    animation:apaga-foto 12s cubic-bezier(.65,0,.35,1) infinite;
  }
  /* El despegue estaba al 42% de un ciclo de 12 s, o sea CINCO SEGUNDOS de
     rejilla quieta antes de que pasara nada (16-09-2026). Quien baja rápido no
     llegaba a ver lo único que explica el producto. El retardo NEGATIVO arranca
     el ciclo ya empezado, así que el despegue cae a 1,5 s.
     No se toca ni un fotograma: del 0% al 42% la rejilla es idéntica, así que
     al cargar se ve exactamente lo mismo que antes.
     VA DESPUÉS a propósito: `animation:` en forma abreviada reinicia el retardo
     a cero, así que puesto antes el avatar se quedaba 3,5 s desincronizado. */
  .escena .mapa,.escena .foto,.escena .avatar,
  .escena .foto.muda .capa:not(.avatar){animation-delay:-3.5s}

  @keyframes aparece-avatar{
    0%,44%{opacity:0} 50%,88%{opacity:1} 93%,100%{opacity:0}
  }
  @keyframes apaga-foto{
    0%,44%{opacity:1} 50%,88%{opacity:0} 93%,100%{opacity:1}
  }
  /* CON MOVIMIENTO REDUCIDO, UN FOTOGRAMA ENTERO, no medio de cada uno.
     Antes se apagaba cada animación por su lado y se le daba a mano el valor
     final a unas y no a otras: el mapa y los avatares salían en su estado de
     llegada, y las fotos en el de partida. Resultado, nueve fotos a tamaño de
     rejilla encima del mapa, que no es ningún fotograma de la animación. Se
     veía raro porque lo era (Ignacio, 16-09-2026).
     Ahora se para el ciclo entero en el mismo instante, el 67%, que es donde
     se ve lo que la escena cuenta: las publicaciones ya colocadas en el mapa
     y convertidas en quien las publicó. Al parar el ciclo y no las animaciones
     una a una, todo queda en el mismo sitio del relato, aquí y en la versión
     apaisada de escritorio, que tiene sus propios recorridos. */
  @media (prefers-reduced-motion:reduce){
    .escena .mapa,.escena .foto,.escena .avatar,
    .escena .foto.muda .capa:not(.avatar){
      animation-delay:-8s;animation-play-state:paused;
    }
  }

  .foto-1{left:4%;top:4%;width:28%;animation-name:vuelo-1}
  @keyframes vuelo-1{
    0%,42%   {left:4%;top:4%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:5.25%;top:2.25%;width:19.0%;border-radius:50%;opacity:1}
    100%     {left:4%;top:4%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-2{left:36%;top:4%;width:28%;animation-name:vuelo-2}
  @keyframes vuelo-2{
    0%,42%   {left:36%;top:4%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:36%;top:4%;width:19%;border-radius:14%;opacity:0}
    100%     {left:36%;top:4%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-3{left:68%;top:4%;width:28%;animation-name:vuelo-3}
  @keyframes vuelo-3{
    0%,42%   {left:68%;top:4%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:14.25%;top:26.25%;width:19.0%;border-radius:50%;opacity:1}
    100%     {left:68%;top:4%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-4{left:4%;top:36%;width:28%;animation-name:vuelo-4}
  @keyframes vuelo-4{
    0%,42%   {left:4%;top:36%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:4%;top:36%;width:19%;border-radius:14%;opacity:0}
    100%     {left:4%;top:36%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-5{left:36%;top:36%;width:28%;animation-name:vuelo-5}
  @keyframes vuelo-5{
    0%,42%   {left:36%;top:36%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:65.25%;top:3.25%;width:19.0%;border-radius:50%;opacity:1}
    100%     {left:36%;top:36%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-6{left:68%;top:36%;width:28%;animation-name:vuelo-6}
  @keyframes vuelo-6{
    0%,42%   {left:68%;top:36%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:68%;top:36%;width:19%;border-radius:14%;opacity:0}
    100%     {left:68%;top:36%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-7{left:4%;top:68%;width:28%;animation-name:vuelo-7}
  @keyframes vuelo-7{
    0%,42%   {left:4%;top:68%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:62.25%;top:68.25%;width:19.0%;border-radius:50%;opacity:1}
    100%     {left:4%;top:68%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-8{left:36%;top:68%;width:28%;animation-name:vuelo-8}
  @keyframes vuelo-8{
    0%,42%   {left:36%;top:68%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:4.25%;top:52.25%;width:19.0%;border-radius:50%;opacity:1}
    100%     {left:36%;top:68%;width:28%;border-radius:14%;opacity:1}
  }
  .foto-9{left:68%;top:68%;width:28%;animation-name:vuelo-9}
  @keyframes vuelo-9{
    0%,42%   {left:68%;top:68%;width:28%;border-radius:14%;opacity:1}
    50%,93%  {left:75.25%;top:32.25%;width:19.0%;border-radius:50%;opacity:1}
    100%     {left:68%;top:68%;width:28%;border-radius:14%;opacity:1}
  }
  /* ── Imágenes simuladas ────────────────────────────────────── */
  figure{margin:26px 0 0}
  .lienzo{
    position:relative;border-radius:22px;overflow:hidden;
    background:var(--crema-honda);
    aspect-ratio:4/5;
  }
  .lienzo.ancho{aspect-ratio:4/3}
  .lienzo svg,.lienzo .retrato{display:block;width:100%;height:100%;object-fit:cover}
  .lienzo svg text{font-family:inherit}
  /* Cuatro fotos en bucle de 20 s, cinco cada una.
     Van apiladas y la de abajo, la primera, no se anima nunca: es lo que se ve
     al cargar y lo que reaparece al cerrarse el ciclo.
     Las otras tres ENTRAN fundiendo por encima y SALEN de golpe, pero solo
     cuando la siguiente ya las tapa del todo. Si salieran fundiendo se verían
     las dos a la vez y asomaría la de abajo por detrás. */
  .rotativa{position:relative}
  .rotativa .retrato{position:absolute;inset:0}
  .rotativa .pasa{opacity:0;animation:20s linear infinite}
  .rotativa .pasa:nth-of-type(2){animation-name:foto-2}
  .rotativa .pasa:nth-of-type(3){animation-name:foto-3}
  .rotativa .pasa:nth-of-type(4){animation-name:foto-4}
  @keyframes foto-2{0%,23%{opacity:0}25%,50%{opacity:1}50.01%,100%{opacity:0}}
  @keyframes foto-3{0%,48%{opacity:0}50%,75%{opacity:1}75.01%,100%{opacity:0}}
  @keyframes foto-4{0%,73%{opacity:0}75%,97%{opacity:1}100%{opacity:0}}


  @media (prefers-reduced-motion:reduce){
    .rotativa .pasa{animation:none}
  }
  /* El enlace que se comparte, encima de la foto. */
  .lienzo.rotativa{--p:0}
  /* La pastilla del enlace entra con el scroll, no está puesta de antemano:
     así se entiende que compartir es algo que HACES, no un adorno de la foto. */
  .lienzo .enlace{
    opacity:var(--p);
    transform:translateY(calc(-20px * (1 - var(--p))));
    position:absolute;left:16px;right:16px;top:16px;z-index:2;background:rgba(255,255,255,.94);
    border-radius:12px;padding:12px 16px;font-size:14px;color:#6E7269;text-align:left;
    display:flex;align-items:center;justify-content:space-between;gap:12px;
  }
  .lienzo .enlace .ms{font-size:21px;flex:none;color:var(--tinta)}
  /* La publicación tal cual se ve en la app: la foto a sangre, los datos sobre
     ella y el botón de reservar junto a los me gusta. Replica la pantalla real,
     no es una tarjeta inventada. */
  .lienzo.publicacion{position:relative;text-align:left;color:#fff}
  .lienzo.publicacion .retrato{position:absolute;inset:0}
  .lienzo.publicacion .velo{
    position:absolute;left:0;right:0;top:0;height:46%;
    background:linear-gradient(to bottom,rgba(0,0,0,.62),rgba(0,0,0,.28) 62%,transparent);
  }
  .lienzo.publicacion .ms{color:#fff}
  .acciones{position:absolute;right:16px;top:14px;display:flex;gap:18px}
  .acciones .ms{font-size:23px}
  .ficha{position:absolute;left:16px;right:16px;top:52px;display:flex;gap:13px}
  .ficha .cara{width:62px;height:62px;border-radius:50%;flex:none;object-fit:cover;border:2.5px solid #fff}
  .ficha .datos{min-width:0;flex:1}
  .ficha p{margin:0}
  .cuando{font-size:12.5px;letter-spacing:.07em;color:rgba(255,255,255,.82)}
  .sitio{font-size:26px;font-weight:700;letter-spacing:-.02em;line-height:1.1;margin-top:1px}
  .entrada{
    font-size:14.5px;color:rgba(255,255,255,.78);margin-top:3px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .cuentas{display:flex;align-items:center;gap:16px;margin-top:11px;font-size:15px;font-weight:600}
  .cuentas span{display:flex;align-items:center;gap:6px}
  .cuentas .ms{font-size:19px}
  .cuentas .reservar{
    border:1.4px solid rgba(255,255,255,.9);border-radius:8px;padding:7px 15px;
    font-size:14.5px;font-weight:600;margin-left:2px;
  }
  .pie-iconos{position:absolute;right:18px;bottom:16px;display:flex;gap:16px}
  .pie-iconos .ms{font-size:28px}
  /* Material Symbols Rounded: la familia de iconos de todo el proyecto. La app
     la carga igual en su versión web. Sin fuente cargada no se ve el nombre
     suelto, el &display=block deja el hueco vacío hasta que llega. */
  .ms{
    font-family:"Material Symbols Rounded";font-weight:400;font-style:normal;
    line-height:1;letter-spacing:normal;text-transform:none;white-space:nowrap;
    direction:ltr;-webkit-font-feature-settings:"liga";font-variation-settings:"FILL" 0;
    font-size:22px;display:inline-block;user-select:none;
  }
  .ms.relleno{font-variation-settings:"FILL" 1}
  /* La publicación se apaga y el botón de reservar viaja al centro SEGÚN
     BAJAS, no de golpe. Todo cuelga de --p, que va de 0 a 1 y lo escribe el
     scroll: si vuelves a subir, el botón deshace el camino y vuelve a su sitio.
     El recorrido empieza tarde a propósito, con la publicación ya bien dentro
     de la pantalla. */
  .lienzo.publicacion{--p:0}
  .lienzo.publicacion .oscurece{
    position:absolute;inset:0;pointer-events:none;
    background:rgba(0,0,0,calc(.66 * var(--p)));
  }
  /* El botón crece y viaja al centro, pero se queda en contorno: filete blanco
     y texto blanco, sin relleno. */
  .cuentas .reservar{
    transform:translate(calc(var(--dx,0px) * var(--p)), calc(var(--dy,0px) * var(--p)));
    border-color:rgba(255,255,255,calc(.6 + .4 * var(--p)));
    border-width:calc(1.4px + .4px * var(--p));
    padding:calc(7px + 6px * var(--p)) calc(15px + 13px * var(--p));
    font-size:calc(14.5px + 2.5px * var(--p));
  }
  /* Los contadores se apagan: en ese momento solo queremos que se mire el botón. */
  .cuentas span:not(.reservar){opacity:calc(1 - var(--p) * 1.6)}
  @media (prefers-reduced-motion:reduce){
    .lienzo.publicacion{--p:1}
  }

  /* ── Vídeo ─────────────────────────────────────────────────── */
  /* El vídeo bueno es vertical, el de la ficha del App Store, así que va dentro
     de un teléfono. El marco es CSS y no una imagen: pesa cero, se ve nítido en
     cualquier pantalla y se puede reteñir. */
  .telefono{
    max-width:306px;margin:26px auto 0;padding:11px;position:relative;
    background:var(--tinta);border-radius:47px;
  }
  .telefono .muesca{
    position:absolute;top:11px;left:50%;transform:translateX(-50%);
    width:37%;height:25px;background:var(--tinta);border-radius:0 0 15px 15px;
    display:flex;align-items:center;justify-content:center;
  }
  /* La cámara, apenas un tono por encima del negro del marco: si se ve
     demasiado deja de ser un detalle y pasa a ser un adorno. */
  .telefono .muesca::after{
    content:"";width:9px;height:9px;border-radius:50%;
    background:#2A2E29;margin-top:-4px;margin-left:52%;
  }
  .video{
    border-radius:36px;background:var(--tinta);
    aspect-ratio:9/16;display:grid;place-items:center;position:relative;overflow:hidden;
  }
  /* El cartel es un fotograma del propio vídeo. El .mp4 pesa 7,8 MB y NO se
     carga hasta que se pulsa: en un móvil con datos sería la mitad de la
     página por algo que casi nadie va a ver. */
  .video .pelicula,.video .cartel{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:var(--tinta)}
  .video.sonando .cartel{display:none}
  .video .play{position:relative}
  /* El mando es nuestro y cubre todo el vídeo: un toque arranca, otro pausa.
     Nada de barra del navegador, ni pantalla completa, ni descargar. */
  .video .mando{
    position:absolute;inset:0;border:0;padding:0;background:none;cursor:pointer;
    display:grid;place-items:center;
  }
  .video .play{
    width:76px;height:76px;border-radius:50%;background:rgba(40,44,40,.55);
    display:grid;place-items:center;transition:opacity .25s var(--entra);
  }
  .video.reproduciendo .play{opacity:0}
  /* Mientras baja el fichero, una rueda: son un par de megas y en 4G se nota. */
  .video.cargando::after{
    content:"";position:absolute;width:40px;height:40px;border-radius:50%;
    border:3px solid rgba(255,255,255,.28);border-top-color:#fff;
    animation:gira .8s linear infinite;
  }
  @keyframes gira{to{transform:rotate(360deg)}}
  .video .play::after{
    content:"";border-left:21px solid #fff;
    border-top:13px solid transparent;border-bottom:13px solid transparent;margin-left:5px;
  }


  /* ── Todo en uno ────────────────────────────────────────────
     Tres sitios de distinta clase sobre el mismo plano, con quién recomienda
     cada uno. TARJETAS CON RADIO, no círculos: aquí el círculo es el avatar
     (así lo usa la escena del héroe) y esto son sitios, no personas.
     La variedad la dan `--x`, `--y` y `--escala`. El globo va siempre en el
     mismo sitio respecto a su tarjeta: con tres anclas distintas no parecía
     desordenado a propósito, parecía descolocado (Ignacio, 18-09-2026). */
  .todo .vista{
    position:relative;margin-top:34px;border-radius:22px;overflow:hidden;
    background:var(--crema-honda);
    --p:0;   /* lo escribe portada.js según se baja; de 0 a 1 */
  }
  .todo .plano{display:block;width:100%;height:100%;object-fit:cover;aspect-ratio:4/3}

  .todo .sitio{
    position:absolute;left:var(--x);top:var(--y);
    width:calc(26% * var(--escala));
    /* Cada una arranca en su momento. Solo se animan `transform` y `opacity`,
       que son las dos que no obligan al navegador a recalcular la página. */
    --pi:clamp(0,calc((var(--p) - var(--inicio)) * 2.6),1);
    opacity:var(--pi);
    transform:
      translate(-50%,-50%)
      translateY(calc(12px * (1 - var(--pi))))
      scale(calc(.94 + .06 * var(--pi)));
  }
  .todo .sitio img{
    display:block;width:100%;aspect-ratio:4/3;object-fit:cover;
    /* El radio de las categorías: la página ya tiene su escala de esquinas. */
    border-radius:16px;
    border:3px solid #fff;
    /* La sombra crece con la tarjeta: lo que está más cerca proyecta más.
       Eso es la perspectiva, no colocarlas torcidas. */
    box-shadow:0 calc(9px * var(--escala)) calc(26px * var(--escala)) rgba(17,19,16,.17);
  }

  /* El globo entra DESPUÉS que su tarjeta: primero llega el sitio y luego
     habla quien lo recomienda. Y crece desde su propia colita, no desde el
     centro, que es de donde sale. */
  .todo .globo{
    position:absolute;left:0;bottom:calc(100% + 11px);
    margin:0;white-space:nowrap;
    background:var(--blanco);color:var(--tinta);
    font-size:13.5px;font-weight:600;letter-spacing:-.01em;
    padding:8px 13px;border-radius:12px;
    box-shadow:0 6px 18px rgba(17,19,16,.14);
    --pg:clamp(0,calc((var(--p) - var(--inicio) - .10) * 3.4),1);
    opacity:var(--pg);
    transform-origin:14px 100%;
    transform:scale(calc(.92 + .08 * var(--pg)));
  }
  .todo .globo::after{
    content:"";position:absolute;left:11px;bottom:-4px;
    width:10px;height:10px;background:inherit;transform:rotate(45deg);
    border-radius:2px;
  }

  /* En estrecho el plano mide la mitad: las tarjetas crecen en proporción, el
     globo encoge y se le deja partir en dos líneas. */
  @media (min-width:900px){
    /* Apaisado, como la escena del héroe. En 4/3 el plano se comía media
       pantalla de alto y las tarjetas se perdían dentro (18-09-2026). */
    .todo .plano{aspect-ratio:16/9}
  }

  /* En vertical el plano NO puede ir apaisado: a 327 px de ancho las tres
     tarjetas no caben en fila y se montaban unas sobre otras. Cuadrado y en
     diagonal, que es como se reparte el sitio en una pantalla alta.
     Y el globo va DEBAJO de la tarjeta, no encima: arriba, el de la primera
     se salía del plano por el borde de arriba (18-09-2026). */
  @media (max-width:899px){
    .todo .plano{aspect-ratio:1/1}
    .todo .sitio{
      width:calc(31% * var(--escala));
      left:var(--xm,var(--x));top:var(--ym,var(--y));
    }
    .todo .globo{
      bottom:auto;top:calc(100% + 8px);
      transform-origin:14px 0;
      font-size:11.5px;padding:6px 10px;line-height:1.25;
      white-space:normal;max-width:112px;
    }
    /* La colita, ahora apuntando hacia arriba. */
    .todo .globo::after{bottom:auto;top:-4px}
  }

  @media (prefers-reduced-motion:reduce){
    /* Menos movimiento no es menos contenido: la escena se ve montada. */
    .todo .sitio{opacity:1;transform:translate(-50%,-50%)}
    .todo .globo{opacity:1;transform:none}
  }

  /* ── Categorías ─────────────────────────────────────────────
     Un desfile sin fin de publicaciones, de borde a borde de la pantalla. El
     truco: la lista va escrita DOS veces y la animación desplaza justo la
     mitad, así que al terminar vuelve al mismo sitio y no se ve la costura. */
  .categorias{
    --paso:188px;
    margin:44px calc(50% - 50vw) 0;width:100vw;overflow:hidden;padding-bottom:28px;
  }
  /* Va a saltos, no de corrido: tres segundos quieta y salta a la siguiente.
     Cada salto son 240 px, el ancho de una publicación más su hueco. Al llegar
     a la novena la animación vuelve a cero, y como la lista está escrita dos
     veces lo que se ve en ese instante es idéntico: el salto no se percibe. */
  .desfile{
    display:flex;gap:12px;width:max-content;
    /* Este relleno es lo que deja la publicación activa en el centro de la
       pantalla, con media a cada lado. */
    padding-left:calc(50vw - var(--paso) / 2 + 6px);
    animation:desfile 27s cubic-bezier(.5,0,.2,1) infinite;
  }
  @keyframes desfile{
    0.000%,8.815%{transform:translateX(calc(var(--paso) * -1))}
    11.111%,19.926%{transform:translateX(calc(var(--paso) * -2))}
    22.222%,31.037%{transform:translateX(calc(var(--paso) * -3))}
    33.333%,42.148%{transform:translateX(calc(var(--paso) * -4))}
    44.444%,53.259%{transform:translateX(calc(var(--paso) * -5))}
    55.556%,64.370%{transform:translateX(calc(var(--paso) * -6))}
    66.667%,75.481%{transform:translateX(calc(var(--paso) * -7))}
    77.778%,86.593%{transform:translateX(calc(var(--paso) * -8))}
    88.889%,97.704%{transform:translateX(calc(var(--paso) * -9))}
    100%{transform:translateX(calc(var(--paso) * -10))}
  }
  @media (hover:hover) and (pointer:fine){
    .categorias:hover .desfile{animation-play-state:paused}
  }
  .categoria{position:relative;width:calc(var(--paso) - 12px);flex:none}
  .categoria img{
    display:block;width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:16px;
  }
  .categoria .punto{
    position:absolute;bottom:-17px;left:50%;transform:translateX(-50%);
    width:44px;height:44px;border-radius:50%;display:grid;place-items:center;
  }
  .categoria .punto .ms{font-size:27px;color:#fff}
  @media (prefers-reduced-motion:reduce){
    /* El fundido se queda, que ayuda a entender el cambio; el desplazamiento no. */
    .panel{transform:none;transition:opacity .2s linear,visibility .2s}
    .desfile{animation:none}
    /* Al parar la animación, el carril de 3.660 px se queda recortado dentro
       de un `overflow:hidden` y solo asoman DOS tarjetas de diecinueve, sin
       manera de llegar al resto (16-09-2026). Quien pide menos movimiento no
       tiene por qué perder contenido: se deja mover a mano. La barra se
       esconde porque el carril ya se entiende por el recorte de los lados. */
    .categorias{overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
    .categorias::-webkit-scrollbar{display:none}
  }

  /* El botón que abre el buzón, centrado como el resto del bloque. */
  .llamada{margin:26px 0 0;display:flex;justify-content:center}
  /* El correo se queda debajo, en pequeño: hay quien prefiere escribir desde
     su propio buzón, y a un destino conviene dárselo. Pero el camino que
     convierte es el botón, así que el correo no le compite. */
  .otra-via{margin:16px 0 0;font-size:14.5px;color:var(--gris);text-align:center}
  .llamada .boton{font-size:16.5px;padding:18px 30px;border-radius:8px}

  /* ── La charla de /creadores ────────────────────────────────
     Los dos globos de un mensaje directo: él pregunta a la izquierda, tú
     contestas a la derecha. Es la conversación que se repite cada semana, y
     dicha así se entiende sin leer el párrafo de debajo. */
  .charla{
    display:grid;gap:12px;margin:26px auto 0;max-width:440px;
  }
  .charla .dice{
    margin:0;padding:13px 17px;font-size:16px;line-height:1.4;
    border-radius:18px;max-width:82%;width:fit-content;
    text-align:left;
  }
  /* La suya: gris y pegada a la izquierda, con la esquina de abajo cuadrada,
     que es como se pinta un mensaje recibido en cualquier aplicación. */
  .charla .suya{
    background:var(--crema-honda);color:var(--tinta);
    border-bottom-left-radius:5px;justify-self:start;
  }
  /* La tuya: oscura y a la derecha. */
  .charla .mia{
    background:var(--tinta);color:#fff;font-weight:500;
    border-bottom-right-radius:5px;justify-self:end;
  }
  .mensajes .bajada{margin-top:26px}
  @media (min-width:900px){
    .charla{max-width:520px;margin-top:34px}
    .charla .dice{font-size:17.5px}
  }

  /* ── El gráfico de cuánto dura una publicación (/creadores) ──
     Va en SVG y no en imagen: es texto, se lee con lector de pantalla, pesa
     nada y se ve nítido en cualquier pantalla. Sin cifras en los ejes a
     propósito: compara formas, no mide. */
  .grafico{margin:30px 0 0}
  .grafico svg{display:block;width:100%;height:auto}
  .grafico .rotulo{
    font-family:inherit;font-size:19px;font-weight:600;letter-spacing:-.01em;
  }
  .grafico .eje{font-family:inherit;font-size:14px;font-weight:500}
  .grafico figcaption{
    margin-top:14px;font-size:13.5px;line-height:1.4;color:var(--gris);
    text-align:center;
  }
  /* En el móvil el SVG se pinta a la mitad de tamaño, así que un rótulo de 19
     unidades salía a 7 px en pantalla: ilegible (medido el 18-09-2026). Las
     unidades del viewBox no son píxeles, hay que compensar a mano. */
  @media (max-width:899px){
    .grafico .rotulo{font-size:30px}
    .grafico .eje{font-size:23px}
  }
  @media (min-width:900px){
    .duracion .grafico{margin-top:44px;max-width:760px;margin-left:auto;margin-right:auto}
  }

  /* ── Ejemplos: tres cuentas de verdad ──────────────────────
     Una fila de tres, nada más. En el móvil se apilan, que es lo que hace el
     resto de la página. Aquí el avatar SÍ va en círculo: son personas. */
  .ejemplos .fila{
    display:grid;gap:18px;margin-top:34px;
    grid-template-columns:1fr;
  }
  .cuenta{
    display:grid;gap:0;text-decoration:none;color:inherit;text-align:left;
  }
  .cuenta .foto{
    display:block;width:100%;aspect-ratio:4/3;object-fit:cover;
    border-radius:16px;background:var(--crema-honda);
  }
  .cuenta .quien{display:flex;align-items:center;gap:10px;margin-top:14px}
  .cuenta .cara{
    width:40px;height:40px;border-radius:50%;object-fit:cover;flex:none;
    background:var(--crema-honda);
  }
  .cuenta .nombres{display:grid;min-width:0}
  .cuenta .nombres strong{
    font-size:16px;font-weight:600;letter-spacing:-.015em;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .cuenta .alias{
    font-size:13.5px;color:var(--gris);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .cuenta-que{
    display:block;margin-top:10px;
    font-size:15.5px;line-height:1.45;color:var(--gris);
  }
  .cuantas{
    display:block;margin-top:6px;
    font-size:13px;font-weight:600;color:var(--verde-hondo);
  }
  @media (hover:hover) and (pointer:fine){
    .cuenta .foto{transition:transform .22s var(--entra)}
    .cuenta:hover .foto{transform:scale(1.015)}
  }
  @media (prefers-reduced-motion:reduce){
    .cuenta .foto{transition:none}
    .cuenta:hover .foto{transform:none}
  }
  @media (min-width:900px){
    .ejemplos .fila{grid-template-columns:repeat(3,1fr);gap:28px}
  }

  /* ── Las puertas por público ────────────────────────────────
     Abajo del todo, justo antes del pie: a quien ha llegado hasta aquí se le
     ofrece dónde seguir. Es un <nav>, no una sección de contenido, y por eso
     va callado: sin titular, con filete arriba y letra normal. Si gritara,
     competiría con el botón de descarga que tiene justo encima. */
  .puertas{
    display:grid;gap:0;margin:56px 0 0;
    border-top:1px solid #DEDCD2;
  }
  .puertas a{
    display:grid;gap:4px;padding:22px 2px;
    text-decoration:none;color:inherit;text-align:left;
    border-bottom:1px solid #EDEBE3;
  }
  .puertas a:last-child{border-bottom:0}
  .puerta-que{
    font-size:17.5px;font-weight:600;letter-spacing:-.02em;
    display:flex;align-items:center;gap:7px;
  }
  /* La flecha se dibuja sola y se mueve al pasar por encima: dice "esto lleva
     a otro sitio" sin gastar una palabra. */
  .puerta-que::after{
    content:"";width:7px;height:7px;flex:none;
    border-right:2px solid var(--verde-hondo);
    border-top:2px solid var(--verde-hondo);
    transform:rotate(45deg);
    transition:transform .2s var(--entra);
  }
  .puerta-mas{font-size:15.5px;line-height:1.45;color:var(--gris);max-width:46ch}
  @media (hover:hover) and (pointer:fine){
    .puertas a:hover .puerta-que::after{transform:rotate(45deg) translate(2px,-2px)}
  }
  @media (prefers-reduced-motion:reduce){
    .puerta-que::after{transition:none}
  }
  @media (min-width:900px){
    /* Las tres en fila, cada una con su columna y sin filetes entre medias. */
    .puertas{grid-template-columns:repeat(3,1fr);gap:40px;margin-top:76px}
    .puertas a{border-bottom:0;padding:26px 0 8px}
    .puertas.una{grid-template-columns:1fr;max-width:520px}
  }

  /* ── Pie ───────────────────────────────────────────────────── */
  /* ── El pie ──────────────────────────────────────────────────
     Negro a sangre y texto claro (16-09-2026). Cierra la página en oscuro,
     como el menú, así que las dos superficies plenas de la web hablan el mismo
     idioma. Va a todo lo ancho porque cuelga del `body`: los `</div>` de más
     de la sección de categorías cierran el `.envoltorio` antes de tiempo. Era
     un fallo y aquí resulta que viene bien; si algún día se arregla, esto
     necesitará su propio ancho completo. */
  footer{
    /* Sin reserva para la banda: se retira al 75% del scroll y el pie no
       asoma hasta mucho después (medido: se va en 2.951 y el pie aparece en
       3.659), así que nunca se solapan. Dejarla ponía 144 px de negro vacío
       debajo del pie. (16-09-2026) */
    margin-top:64px;padding:46px 24px 40px;
    background:var(--tinta);color:#F2F1EC;text-align:center;
  }
  footer a{
    color:rgba(242,241,236,.74);text-decoration:none;font-size:14px;
    line-height:1.4;display:inline-block;padding:12px 9px;
  }
  .disponible{
    font-size:13.5px;color:rgba(242,241,236,.5);margin:18px 0 0;line-height:1.6;
  }
  /* Los dos botones en una línea, con filete y sin relleno: aquí abajo son una
     puerta abierta, no la llamada principal. Esa sigue siendo la banda. */
  .tiendas-pie{
    display:flex;justify-content:center;flex-wrap:wrap;gap:10px;margin-top:12px;
  }
  .tiendas-pie a{
    display:inline-flex;align-items:center;gap:8px;
    border:1px solid rgba(242,241,236,.34);border-radius:8px;
    padding:12px 18px;color:#F2F1EC;font-size:14.5px;font-weight:500;
    line-height:1;transition:border-color 160ms var(--entra),background-color 160ms var(--entra);
  }
  .tiendas-pie a svg{width:16px;height:16px;fill:currentColor;flex:none;display:block}
  .tiendas-pie a:active{transform:scale(.97)}
  @media (hover:hover) and (pointer:fine){
    .tiendas-pie a:hover{border-color:rgba(242,241,236,.6);background:rgba(242,241,236,.06)}
  }
  /* La nota legal cierra el pie y ya nombra la sociedad y el CIF, así que la
     línea suelta de `mywolly Global SL` sobraba (16-09-2026).
     Al 50% da 4,85:1 sobre el negro del pie y se lee; estaba al 38%, o sea
     3,28:1, por debajo del mínimo. Que sea letra pequeña no la exime. */
  /* Los idiomas también en el pie, por lo mismo que en el menú: texto, no
     enlaces, hasta que lleven a algún sitio. */
  .idiomas-pie{
    display:flex;flex-wrap:wrap;justify-content:center;gap:8px 20px;
    margin:22px 0 0;font-size:13.5px;color:rgba(242,241,236,.5);
  }
  .idiomas-pie .puesto{color:rgba(242,241,236,.85);font-weight:600}

  .legal{
    font-size:12.5px;line-height:1.55;color:rgba(242,241,236,.5);
    margin:26px auto 0;max-width:46ch;text-wrap:pretty;
  }
  .legal a{
    color:rgba(242,241,236,.82);text-decoration:underline;
    text-underline-offset:2px;display:inline;padding:0;font-size:inherit;
  }

  /* ── Banda fija de descarga ────────────────────────────────── */
  .banda{
    position:fixed;left:0;right:0;bottom:0;
    /* Material translúcido, no una franja opaca (16-09-2026). Lo que flota
       sobre el contenido debe dejarlo pasar por debajo: se entiende que hay
       más página y la banda deja de partir la pantalla en dos. El filo claro
       de arriba es la luz dando en el material, no un separador. */
    background:rgba(255,255,255,.72);
    -webkit-backdrop-filter:blur(20px) saturate(180%);
    backdrop-filter:blur(20px) saturate(180%);
    border-top:1px solid rgba(255,255,255,.5);
    box-shadow:0 -1px 0 rgba(17,19,16,.06);
    /* El mismo aire arriba y abajo del botón. Abajo se descuenta el borde
       seguro del iPhone, que ya aporta su parte: sumarlo entero hacía la banda
       el doble de alta.
       Sube a 24 al adelgazar el botón (Ignacio, 16-09-2026): el botón pasó de
       65 a 53px y la banda se quedaba apretada. Con 24 arriba y abajo vuelve a
       pasar de los 98 de antes y el botón respira, que era el punto. */
    padding:24px 20px;
    padding-bottom:max(24px, calc(env(safe-area-inset-bottom) - 8px));
    display:flex;align-items:center;justify-content:center;gap:14px;z-index:10;
    transition:transform .45s cubic-bezier(.4,0,.2,1);
  }
  /* `arriba` mientras no has bajado el 10%, `lejos` pasado el 75%, `retirada`
     mientras el vídeo está a pantalla completa. Las tres la esconden igual:
     fuera por abajo, que es de donde vino. */
  .banda.retirada,.banda.lejos,.banda.arriba{transform:translateY(115%)}
  /* Sin desenfoque, el blanco al 72% deja leer lo de debajo: sólido. */
  @supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
    .banda{background:var(--blanco);border-top:1px solid #E2E0D6;box-shadow:none}
  }
  /* Y quien pide menos transparencia la recibe sólida, no solo menos borrosa. */
  @media (prefers-reduced-transparency:reduce){
    .banda{
      background:var(--blanco);backdrop-filter:none;-webkit-backdrop-filter:none;
      border-top:1px solid #E2E0D6;box-shadow:none;
    }
  }
  /* Solo el botón. Llevaba al lado el titular de la página repetido palabra
     por palabra, y la banda es el único sitio que acompaña todo el scroll:
     gastarlo en repetir lo que ya se leyó no valía de nada (16-09-2026). */
  .boton{
    background:var(--tinta);color:#fff;text-decoration:none;font-weight:600;
    /* Radio 8, el mismo que entrar, enviar, los sociales, reservar y los del
       pie: en esta casa todos los botones comparten forma (Ignacio, 16-09-2026).
       Estuvo en 15, que sobre 63px de alto lo hacía casi una pastilla. */
    /* Relleno bajado de 21/32 a 15/26 (Ignacio, 16-09-2026): el botón queda
       más fino sin tocar la letra ni su sitio, y con 53px de alto sigue muy
       por encima de los 44 que pide un dedo. */
    font-size:16.5px;letter-spacing:-.01em;padding:15px 26px;border-radius:8px;
    display:inline-flex;align-items:center;justify-content:center;gap:11px;
  }
  .boton svg{width:23px;height:23px;fill:#fff;flex:none;display:block}
  .boton .androide{width:25px}
  /* El interletrado NO puede ser fijo si el tamaño es fluido: -.035em va bien
     en un titular de 50px y deja las letras pegadas en uno de 36. La página ya
     tenía la rampa buena en todo lo demás (+.07em a 12,5px, -.04em a 68px);
     los titulares eran la excepción. Aquí el clamp ya está saturado, o sea que
     el titular es grande de verdad y sí toca apretar. (16-09-2026) */
  @media(min-width:520px){
    h1,h2,.titulo-turismo{letter-spacing:-.035em}
  }

  @media(min-width:620px){
    /* Sin `space-between`: era para repartir texto y botón, y con el botón
       solo lo empujaba contra el borde izquierdo (16-09-2026). */
    .banda{max-width:100%;padding-left:40px;padding-right:40px}
    .boton{padding:15px 30px}
  }

  /* ── Escritorio ─────────────────────────────────────────────
     Hasta aquí la página es una columna estrecha, que es lo correcto en un
     móvil. En una pantalla grande esa misma columna deja dos tercios de vacío
     a los lados, así que a partir de 900 px los destacados se abren en dos
     columnas, texto a un lado e imagen al otro, alternando. */
  @media (min-width:900px){
    .envoltorio{max-width:1080px;padding:0 40px}
    .logo{width:124px;margin:56px auto 44px}
    h1{font-size:clamp(54px,5.4vw,70px)}
    .escena{max-width:560px;margin:38px auto 0}
    section.bloque{padding:118px 0 0}

    /* Los tres destacados, a dos columnas. Se usa :has para no tocar el vídeo
       ni las categorías, que no llevan figure y siguen centrados. */
    /* Flex y no rejilla: con rejilla cada línea del texto se llevaba una fila
       propia y se separaban a lo alto de la foto, que es mucho más larga. Por
       eso el texto va en su propia caja. */
    /* `:not(.duracion)`: el gráfico de /creadores NO va a dos columnas. Ahí
       la figura no acompaña al texto, ES el argumento, y en media columna no
       se leen ni los rótulos (18-09-2026). */
    section.bloque:has(figure):not(.duracion){
      display:flex;align-items:center;gap:64px;text-align:left;
    }
    /* El texto se lleva algo más que la mitad (18-09-2026). A partes iguales
       la columna daba 468 px, o sea 52 caracteres por línea, y con 46ch de
       tope el texto se quedaba sin sitio para usarlos. Con 1,15 contra 0,85
       la columna sube a ~503 y la foto se queda en ~433, que sigue siendo
       grande. */
    section.bloque:has(figure):not(.duracion) > .texto{flex:1.15 1 0;min-width:0}
    section.bloque:has(figure):not(.duracion) > figure{flex:.85 1 0;min-width:0;margin:0}
    /* Alternando. La paridad depende de CUÁNTAS secciones hay delante, así que
       cada vez que se mete un bloque nuevo arriba hay que darle la vuelta:
       pasó al añadir "Todo en uno" (18-09-2026), que invirtió los tres
       destacados. Antes era `odd`, con solo el vídeo delante. */
    section.bloque:has(figure):not(.duracion):nth-of-type(even){flex-direction:row-reverse}

    section.bloque:has(figure):not(.duracion) .ig{margin:0 0 20px}
    section.bloque:has(figure) h2{font-size:clamp(40px,3.6vw,50px)}
    /* 34ch daban 385 px, o sea 43 caracteres por línea: demasiado estrecho
       para leer (lo cómodo son 60-75) y raquítico al lado de una foto de 520
       (18-09-2026). 46ch dejan la columna de texto y la imagen a la par. */
    section.bloque:has(figure):not(.duracion) .bajada{margin:0;max-width:46ch;font-size:18px}

    /* El vídeo y las categorías se quedan centrados, solo crecen. */
    .telefono{max-width:340px}
    .categorias{--paso:272px}
    h2{font-size:clamp(40px,3.6vw,50px)}
    .bajada{font-size:18px}

    /* Las pantallas completas: el menú más grande, el resto más ancho. */
    .menu a,.menu .titulo-rama{font-size:44px}
    .menu .hijas span,.menu .hijas a{font-size:23px}
    .panel .hoja{max-width:620px}
    .cifra .numero{font-size:clamp(68px,5.4vw,80px)}

    /* Fuera la banda fija: en el escritorio no se descarga nada, se escanea. */
    .banda{display:none}
    /* Y en su lugar, el cierre: sin esto el escritorio no tiene dónde bajarse la app. */
    .cierre{display:block;padding-bottom:40px}
    .titulo-turismo{font-size:clamp(54px,5vw,66px);padding-top:104px}
    body{padding-bottom:0}

    /* En el escritorio, más aire y la barra se encoge al bajar. */
    header{padding:18px 36px}
    header[data-encogida="si"]{padding:10px 36px}
    .titulo-barra{font-size:17px}
    .hamburguesa{padding:10px 0 10px 10px}
    .entrar{display:inline-block}
    @supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
      header{background:var(--blanco)}
    }
    @media (prefers-reduced-transparency:reduce){
      header{
        background:var(--blanco);backdrop-filter:none;-webkit-backdrop-filter:none;
      }
    }
    @media (prefers-reduced-motion:reduce){
      header{transition:none}
    }
    .registrarse{display:inline-block;
    }

    /* El QR se queda clavado abajo a la derecha, siempre a mano mientras se
       baja por la página. Es el equivalente de escritorio a la banda fija. */
    /* El QR se voltea al pasar por encima y enseña por detrás para qué sirve.
       Sin rótulo delante: el código ya se reconoce solo. Y no se pulsa: esto
       es para escanear con el teléfono, y desde un ordenador un enlace aquí no
       lleva a ninguna parte útil. */
    .qr{
      display:block;position:fixed;right:30px;bottom:30px;z-index:15;
      width:120px;height:120px;perspective:800px;
    }
    .qr .gira{
      display:block;position:relative;width:100%;height:100%;
      transform-style:preserve-3d;transition:transform .55s cubic-bezier(.4,0,.2,1);
    }
    @media (hover:hover) and (pointer:fine){
      .qr:hover .gira{transform:rotateY(180deg)}
    }
    .qr .frente,.qr .dorso{
      position:absolute;inset:0;border-radius:14px;
      -webkit-backface-visibility:hidden;backface-visibility:hidden;
      display:grid;place-items:center;
    }
    .qr .frente{background:var(--blanco);border:1px solid #E2E0D6}
    .qr .frente img{width:96px;height:96px;display:block}
    .qr .dorso{
      transform:rotateY(180deg);background:var(--tinta);color:#fff;
      padding:14px;font-size:13.5px;font-weight:600;line-height:1.35;text-align:center;
    }
    @media (prefers-reduced-motion:reduce){ .qr .gira{transition:none} }

    /* El vídeo, con el titular al lado en vez de encima: en una pantalla
       ancha un teléfono solo en mitad del blanco se queda perdido. */
    section.bloque:has(.telefono){
      display:flex;align-items:center;justify-content:center;gap:76px;text-align:left;
    }
    /* El texto ocupa lo que necesita, no la mitad de la página: así el par
       texto y teléfono queda centrado en vez de pegado a los bordes. */
    section.bloque:has(.telefono) > .texto{flex:0 1 auto}
    section.bloque:has(.telefono) .renglon{display:block}
    section.bloque:has(.telefono) > .telefono{flex:0 0 340px;width:340px;margin:0}
    /* Antes tenía escala propia, clamp(50,4.6vw,64): a 1440 salía a 64 px
       mientras los otros cinco bloques iban a 50, y encima metido en una caja
       de 360 px se partía en dos líneas por falta de sitio, no por decisión
       (18-09-2026). Ahora hereda la escala de la página y todos los bloques
       hablan con la misma voz. */
    section.bloque:has(.telefono) h2{margin:0}
    /* La escena, apaisada SOLO aquí: en el móvil sigue siendo cuadrada con su
       rejilla de tres por tres. En una pantalla ancha se abre a dos filas de
       cuatro y el mapa se ensancha con ella. La novena publicación sobra.
       Con tope de ancho: a 1000 px las fotos se quedaban diminutas al lado de
       un titular de 70. */
    .escena{aspect-ratio:16/9;max-width:900px;margin:52px auto 0}
    .escena .mapa{object-fit:cover}
    .escena .foto-9{display:none}
    .foto-1{animation-name:vueloD-1}
    @keyframes vueloD-1{
      0%,42%   {left:8%;top:10%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:7%;top:10%;width:11%;border-radius:50%;opacity:1}
      100%     {left:8%;top:10%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-2{animation-name:vueloD-2}
    @keyframes vueloD-2{
      0%,42%   {left:30.33%;top:10%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:30.33%;top:10%;width:17%;border-radius:14%;opacity:0}
      100%     {left:30.33%;top:10%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-3{animation-name:vueloD-3}
    @keyframes vueloD-3{
      0%,42%   {left:52.67%;top:10%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:26%;top:52%;width:11%;border-radius:50%;opacity:1}
      100%     {left:52.67%;top:10%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-4{animation-name:vueloD-4}
    @keyframes vueloD-4{
      0%,42%   {left:75%;top:10%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:75%;top:10%;width:17%;border-radius:14%;opacity:0}
      100%     {left:75%;top:10%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-5{animation-name:vueloD-5}
    @keyframes vueloD-5{
      0%,42%   {left:8%;top:45%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:56%;top:8%;width:11%;border-radius:50%;opacity:1}
      100%     {left:8%;top:45%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-6{animation-name:vueloD-6}
    @keyframes vueloD-6{
      0%,42%   {left:30.33%;top:45%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:30.33%;top:45%;width:17%;border-radius:14%;opacity:0}
      100%     {left:30.33%;top:45%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-7{animation-name:vueloD-7}
    @keyframes vueloD-7{
      0%,42%   {left:52.67%;top:45%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:77%;top:52%;width:11%;border-radius:50%;opacity:1}
      100%     {left:52.67%;top:45%;width:17%;border-radius:14%;opacity:1}
    }
    .foto-8{animation-name:vueloD-8}
    @keyframes vueloD-8{
      0%,42%   {left:75%;top:45%;width:17%;border-radius:14%;opacity:1}
      50%,93%  {left:38%;top:70%;width:11%;border-radius:50%;opacity:1}
      100%     {left:75%;top:45%;width:17%;border-radius:14%;opacity:1}
    }

  }
