
    /* Teléfono de pruebas: se enciende mostrando el logo de Nilo cada vez que entra en pantalla */
    #s-land .ph-boot{position:absolute;inset:0;z-index:20;background:#000;display:flex;align-items:center;justify-content:center;opacity:1;}
    #s-land .ph-boot img{width:76px;height:76px;border-radius:18px;opacity:0;}
    #s-land .ph-boot.on{animation:auraBootFade 2.2s ease-out both;}
    #s-land .ph-boot.on img{animation:auraBootLogo 2.2s ease-out both;}
    @keyframes auraBootFade{0%,68%{opacity:1;}100%{opacity:0;visibility:hidden;pointer-events:none;}}
    @keyframes auraBootLogo{
      0%{opacity:0;transform:scale(.7);filter:brightness(.2);}
      24%{opacity:1;transform:scale(1);filter:brightness(1) drop-shadow(0 0 14px rgba(47,134,255,.6));}
      58%{opacity:1;transform:scale(1);filter:brightness(1) drop-shadow(0 0 20px rgba(0,200,160,.55));}
      100%{opacity:0;transform:scale(1.05);filter:brightness(1);}
    }
    /* Scroll reveal — con dirección y bien marcado */
    #s-land{overflow-x:clip;}   /* evita scroll horizontal por el desplazamiento lateral */
    /* Curva "expo-out": arranca rápido y frena suave = sensación premium */
    .aura-rv{opacity:0;transition:opacity .8s cubic-bezier(.16,1,.3,1),transform .8s cubic-bezier(.16,1,.3,1);backface-visibility:hidden;}
    .aura-rv.rv-anim{will-change:opacity,transform;}   /* capa GPU solo mientras anima */
    .aura-rv.up{transform:translate3d(0,44px,0) scale(.96);}
    .aura-rv.left{transform:translate3d(-80px,0,0);}
    .aura-rv.right{transform:translate3d(80px,0,0);}
    .aura-rv.flash{transform:scale(.9);opacity:0;}
    .aura-rv.in{opacity:1;transform:none;}
    /* Barra de oferta: destello fuerte al entrar */
    .aura-rv.flash.in{animation:auraFlash .6s ease-out;}
    @keyframes auraFlash{0%{opacity:0;filter:brightness(3.2);}18%{opacity:1;filter:brightness(2.6);}45%{filter:brightness(1.4);}100%{opacity:1;filter:brightness(1);}}
    /* En móvil los carruseles son scroll horizontal: las tarjetas entran SIEMPRE
       desde la DERECHA (translate positivo). Entrar desde la izquierda empujaba el
       scroll y lo dejaba corrido; desde la derecha se desliza limpio, tipo "se
       reparten las cartas". translate3d = compositor GPU, no traba el swipe.
       CLAVE: el snap (scroll-snap-type:x mandatory) está APAGADO mientras las
       tarjetas tienen su translate — si no, el snap se engancha al translateX y
       tira el scrollLeft de lado (el "friqueo" al entrar). Se prende (.snap-on)
       recién cuando asientan, para que el swipe posterior siga con snap. */
    @media(max-width:760px){
      .fgrid,.cmp,.pgrid,.tgrid{scroll-snap-type:none;}
      .fgrid.snap-on,.cmp.snap-on,.pgrid.snap-on,.tgrid.snap-on{scroll-snap-type:x mandatory;}
      .fgrid > .aura-rv,.cmp > .aura-rv,.pgrid > .aura-rv,.tgrid > .aura-rv{transform:translate3d(70px,0,0) scale(.98)!important;}
      .fgrid > .aura-rv.in,.cmp > .aura-rv.in,.pgrid > .aura-rv.in,.tgrid > .aura-rv.in{transform:none!important;}
    }
    @media (prefers-reduced-motion:reduce){
      #s-land .ph-boot{display:none!important;}
      .aura-rv{opacity:1!important;transform:none!important;transition:none!important;animation:none!important;}
    }
    /* Con reduce-motion el JS no llega a prender el snap: garantizarlo por CSS. */
    @media (prefers-reduced-motion:reduce) and (max-width:760px){
      .fgrid,.cmp,.pgrid,.tgrid{scroll-snap-type:x mandatory!important;}
    }
  