/* ==========================================================================
   VictoriaEDU — Sistema gráfico de marca
   --------------------------------------------------------------------------
   Capa que va DESPUÉS de victoria.css y no la reemplaza. victoria.css sigue
   siendo el design system (tokens, botones, tarjetas, rejillas); este archivo
   solo añade la piel: texturas, geometría de la V, rutas, separadores y las
   microinteracciones.

   La regla que gobierna todo esto: la decoración nunca compite con el dato.
   Las tramas viven por debajo del 8% de opacidad, ninguna anima sola, y todo
   lo que se dibuja aquí es aria-hidden y pointer-events:none. Si algo de este
   archivo se borra, el sitio sigue funcionando y siendo legible — así se
   comprueba que es piel y no estructura.

   Referencia visual: institución educativa contemporánea. Nada de neón,
   hologramas ni circuitos: la geometría sale del isotipo V y de un cuaderno
   cuadriculado, que es donde de verdad se estudia.

   Índice
     1  Tokens de marca
     2  Fragmentos V (patrón)
     3  Cuaderno Victoria (retícula académica)
     4  Separadores de sección
     5  Hero
     6  Tarjetas de beneficio e iconos
     7  Ruta del Método Victoria
     8  Resultados y estadísticas
     9  Testimonios
    10  Hueco de mascota
    11  Microinteracciones
    12  Movimiento reducido
   ========================================================================== */

/* ==========================================================================
   1 · Tokens de marca
   --------------------------------------------------------------------------
   Todo color, ángulo, grosor y duración que use este archivo sale de aquí.
   Ningún valor de marca se repite en línea más abajo: si hay que reafinar el
   sistema, se reafina en este bloque.
   ========================================================================== */
:root {
  /* --- Color -------------------------------------------------------------
     Guinda y azul ya existen en victoria.css; aquí solo se les da el nombre
     con el que habla la marca, para no tener que recordar que "burdeos" es
     el guinda y "noche" el guinda profundo. */
  --vic-guinda: var(--vic-burdeos);
  --vic-guinda-profundo: var(--vic-noche);
  --vic-guinda-rgb: 49, 14, 23;

  /* Blanco cálido: el papel. Un blanco puro sobre pantalla grande cansa;
     este tiene un punto de amarillo que lo acerca a una hoja impresa. */
  --vic-blanco-calido: #FAF8F5;

  /* Cian institucional, muy controlado: nodos de ruta, comillas y acentos
     puntuales. Es un cian apagado a propósito — un cian saturado sobre guinda
     se lee como interfaz de videojuego, que es justo lo que no somos. */
  --vic-cian: #58A9C0;
  --vic-cian-rgb: 88, 169, 192;

  /* --- Geometría ---------------------------------------------------------
     El ángulo del isotipo. Todo corte diagonal del sitio —separadores,
     fragmentos, tramas— usa este mismo valor, que es lo que hace que se lean
     como familia y no como adornos sueltos. */
  --vic-angulo: 18deg;
  --vic-corte: 26px;

  --vic-linea-fina: 1px;
  --vic-linea-media: 1.75px;   /* el mismo grosor que los iconos */

  /* --- Texturas ----------------------------------------------------------
     Opacidades separadas del color para poder subir o bajar toda la trama
     del sitio de un tirón sin tocar ninguna regla. */
  --vic-trama-clara: rgba(34, 58, 116, 1);
  --vic-trama-oscura: rgba(255, 255, 255, 1);

  /* Estas tres opacidades NO son intercambiables: lo que se ve no es la
     opacidad sino el contraste contra el fondo. Un 5% de blanco sobre guinda
     profundo casi no se nota; el mismo 5% sobre el azul institucional grita.
     Por eso la variante oscura va más baja que la clara, al revés de lo que
     sugeriría el número. Calibradas mirándolas, no calculándolas. */
  --vic-trama-op-sutil: .030;
  --vic-trama-op-media: .042;
  --vic-trama-op-oscura: .032;

  --vic-trama-tam-sutil: 200px;
  --vic-trama-tam-media: 168px;
  --vic-trama-tam-oscura: 208px;

  /* Cuaderno: milimétrico + línea mayor cada 5 cuadros */
  --vic-cuaderno-fino: 24px;
  --vic-cuaderno-mayor: 120px;
  --vic-cuaderno-op-fina: .055;
  --vic-cuaderno-op-mayor: .10;
  --vic-cuaderno-op-marcas: .085;

  /* --- Movimiento --------------------------------------------------------
     victoria.css ya trae --vic-transition-base (.18s) para estados de
     control. Estas son para lo decorativo, que debe ser más lento: lo que
     se mueve rápido pide atención, y la decoración no debe pedirla. */
  --vic-dur-media: .42s;
  --vic-dur-ruta: 1.6s;
  --vic-ease-marca: cubic-bezier(.22, .61, .36, 1);

  --vic-elevacion: 3px;   /* desplazamiento de tarjeta en hover */
}

/* ==========================================================================
   2 · Fragmentos V — patrón
   --------------------------------------------------------------------------
   Trapecios y barras diagonales sacados de la geometría del isotipo: dos
   brazos que bajan y se encuentran. El patrón NO reconstruye la V ni la
   repite; toma sus piezas y las dispersa, que es lo que permite usarlo como
   fondo sin que el logotipo acabe convertido en papel tapiz.

   Se pinta con `mask-image` + `background-color` en vez de meter el color
   dentro del SVG. Así el color sale de un token y una misma máscara sirve
   para fondo claro y oscuro — si fuera un SVG con el color encodeado harían
   falta tres archivos y los tres se desincronizarían al primer ajuste.

   Uso:
     <div class="v-pattern v-pattern-subtle" aria-hidden="true"></div>
   dentro de un contenedor con position:relative.
   ========================================================================== */
/* Contenedor para secciones que reciben una capa de textura. Hace dos cosas:
   crea el contexto de posicionamiento y sube el contenido por encima de la
   capa. Es el equivalente neutro de .vic-blueprint, que hace lo mismo pero
   además pinta su propia retícula oscura. */
.vic-lienzo { position: relative; overflow: hidden; }
.vic-lienzo > *:not(.v-pattern):not(.academic-grid) { position: relative; z-index: 1; }

.v-pattern {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-color: var(--v-pattern-color, var(--vic-trama-clara));
  opacity: var(--v-pattern-opacity, var(--vic-trama-op-sutil));

  -webkit-mask-image: var(--v-pattern-mask);
          mask-image: var(--v-pattern-mask);
  -webkit-mask-size: var(--v-pattern-size, var(--vic-trama-tam-media));
          mask-size: var(--v-pattern-size, var(--vic-trama-tam-media));
  -webkit-mask-repeat: repeat;
          mask-repeat: repeat;

  /* La trama se apaga hacia abajo. Sin este degradado el patrón llega al
     borde de la sección y delata el mosaico. */
  --v-pattern-mask:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 120'%3E%3Cg fill='%23fff'%3E%3Cpath d='M20 8 L33 8 L52 62 L39 62 Z'/%3E%3Cpath d='M104 22 L114 22 L98 66 L88 66 Z'/%3E%3Cpath d='M6 86 L21 86 L28 108 L13 108 Z'/%3E%3Cpath d='M70 92 L80 92 L88 116 L78 116 Z'/%3E%3Cpath d='M58 14 L66 14 L70 32 L62 32 Z'/%3E%3C/g%3E%3C/svg%3E");
}

/* Baja densidad y opacidad mínima: secciones claras, donde cualquier trama
   se nota el doble porque el contraste del fondo es alto. */
.v-pattern-subtle {
  --v-pattern-color: var(--vic-trama-clara);
  --v-pattern-opacity: var(--vic-trama-op-sutil);
  --v-pattern-size: var(--vic-trama-tam-sutil);
}

/* Densidad media: tarjetas y encabezados, donde el área es chica y el patrón
   necesita repetirse más para leerse como textura y no como una mancha. */
.v-pattern-medium {
  --v-pattern-color: var(--vic-trama-clara);
  --v-pattern-opacity: var(--vic-trama-op-media);
  --v-pattern-size: var(--vic-trama-tam-media);
}

/* Fondos guinda: el patrón se dibuja en blanco cálido. */
.v-pattern-dark {
  --v-pattern-color: var(--vic-trama-oscura);
  --v-pattern-opacity: var(--vic-trama-op-oscura);
  --v-pattern-size: var(--vic-trama-tam-oscura);
}

/* Desvanecido opcional, para cuando el patrón vive en una sección alta y
   llegaría hasta el texto. */
.v-pattern--fade-b {
  -webkit-mask-composite: source-in;
          mask-composite: intersect;
  -webkit-mask-image: var(--v-pattern-mask), linear-gradient(to bottom, #000 10%, transparent 82%);
          mask-image: var(--v-pattern-mask), linear-gradient(to bottom, #000 10%, transparent 82%);
  -webkit-mask-size: var(--v-pattern-size), 100% 100%;
          mask-size: var(--v-pattern-size), 100% 100%;
  -webkit-mask-repeat: repeat, no-repeat;
          mask-repeat: repeat, no-repeat;
}

/* ==========================================================================
   3 · Cuaderno Victoria — retícula académica
   --------------------------------------------------------------------------
   Cuadrícula milimétrica con línea mayor cada cinco cuadros, más arcos
   geométricos aislados, marcas de medición y fragmentos de ejes cartesianos.

   Deliberadamente NO lleva fórmulas ni símbolos matemáticos: escribir
   ecuaciones de adorno en un sitio de admisión es pedir que alguien las lea
   y descubra que no dicen nada. La geometría sí puede ser abstracta; una
   fórmula, no.

   Las capas van de arriba abajo: marcas SVG, línea mayor, línea fina.
   ========================================================================== */
.academic-grid {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;

  background-image:
    /* arcos, marcas de medición y fragmentos de eje */
    var(--ag-marcas),
    /* retícula mayor */
    linear-gradient(var(--ag-color-mayor) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, var(--ag-color-mayor) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    /* retícula milimétrica */
    linear-gradient(var(--ag-color-fino) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, var(--ag-color-fino) var(--vic-linea-fina), transparent var(--vic-linea-fina));

  background-size:
    var(--ag-marcas-tam, 520px) var(--ag-marcas-tam, 520px),
    var(--vic-cuaderno-mayor) var(--vic-cuaderno-mayor),
    var(--vic-cuaderno-mayor) var(--vic-cuaderno-mayor),
    var(--vic-cuaderno-fino) var(--vic-cuaderno-fino),
    var(--vic-cuaderno-fino) var(--vic-cuaderno-fino);

  /* Se apaga hacia abajo para que no se lea como una tabla de datos */
  -webkit-mask-image: linear-gradient(to bottom, rgba(0,0,0,.95), transparent 80%);
          mask-image: linear-gradient(to bottom, rgba(0,0,0,.95), transparent 80%);
}

/* --- Versión clara: azul de marca sobre papel ---------------------------- */
.academic-grid--claro {
  --ag-color-fino: rgba(var(--vic-azul-rgb), var(--vic-cuaderno-op-fina));
  --ag-color-mayor: rgba(var(--vic-azul-rgb), var(--vic-cuaderno-op-mayor));
  --ag-marcas:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 520 520' fill='none' stroke='%232C4D9D' stroke-opacity='.16' stroke-width='1.25' stroke-linecap='round'%3E%3Cpath d='M64 108a52 52 0 0 1 52-52'/%3E%3Cpath d='M406 84a72 72 0 0 0-72 72'/%3E%3Cpath d='M212 404a44 44 0 0 0 44 44'/%3E%3Cpath d='M60 300h58M60 300v-58'/%3E%3Cpath d='M436 356v56M436 412h-56'/%3E%3Cpath d='M268 62v14M292 62v14M316 62v14M340 62v14'/%3E%3Cpath d='M150 470h14M150 446h14M150 422h14'/%3E%3Ccircle cx='60' cy='300' r='2.5' fill='%232C4D9D' fill-opacity='.2' stroke='none'/%3E%3Ccircle cx='436' cy='412' r='2.5' fill='%232C4D9D' fill-opacity='.2' stroke='none'/%3E%3C/svg%3E");
}

/* --- Versión oscura: blanco sobre guinda --------------------------------- */
.academic-grid--oscuro {
  --ag-color-fino: rgba(255, 255, 255, var(--vic-cuaderno-op-fina));
  --ag-color-mayor: rgba(255, 255, 255, var(--vic-cuaderno-op-mayor));
  --ag-marcas:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 520 520' fill='none' stroke='%23ffffff' stroke-opacity='.16' stroke-width='1.25' stroke-linecap='round'%3E%3Cpath d='M64 108a52 52 0 0 1 52-52'/%3E%3Cpath d='M406 84a72 72 0 0 0-72 72'/%3E%3Cpath d='M212 404a44 44 0 0 0 44 44'/%3E%3Cpath d='M60 300h58M60 300v-58'/%3E%3Cpath d='M436 356v56M436 412h-56'/%3E%3Cpath d='M268 62v14M292 62v14M316 62v14M340 62v14'/%3E%3Cpath d='M150 470h14M150 446h14M150 422h14'/%3E%3Ccircle cx='60' cy='300' r='2.5' fill='%23ffffff' fill-opacity='.22' stroke='none'/%3E%3Ccircle cx='436' cy='412' r='2.5' fill='%23ffffff' fill-opacity='.22' stroke='none'/%3E%3C/svg%3E");
}

/* --- Actualización de .vic-blueprint -------------------------------------
   .vic-blueprint ya existe en victoria.css y ya está puesta en el hero y en
   el método. En vez de pedir que se cambie el HTML, se le sube la textura
   aquí: misma clase, mismo papel, mejor dibujo. Si este archivo no carga,
   vuelve sola a la retícula simple de victoria.css.
-------------------------------------------------------------------------- */
.vic-blueprint::before {
  --ag-color-fino: rgba(255, 255, 255, var(--vic-cuaderno-op-fina));
  --ag-color-mayor: rgba(255, 255, 255, var(--vic-cuaderno-op-mayor));

  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 520 520' fill='none' stroke='%23ffffff' stroke-opacity='.15' stroke-width='1.25' stroke-linecap='round'%3E%3Cpath d='M64 108a52 52 0 0 1 52-52'/%3E%3Cpath d='M406 84a72 72 0 0 0-72 72'/%3E%3Cpath d='M212 404a44 44 0 0 0 44 44'/%3E%3Cpath d='M60 300h58M60 300v-58'/%3E%3Cpath d='M436 356v56M436 412h-56'/%3E%3Cpath d='M268 62v14M292 62v14M316 62v14M340 62v14'/%3E%3C/svg%3E"),
    linear-gradient(var(--ag-color-mayor) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, var(--ag-color-mayor) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(var(--ag-color-fino) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, var(--ag-color-fino) var(--vic-linea-fina), transparent var(--vic-linea-fina));

  background-size:
    520px 520px,
    var(--vic-cuaderno-mayor) var(--vic-cuaderno-mayor),
    var(--vic-cuaderno-mayor) var(--vic-cuaderno-mayor),
    var(--vic-cuaderno-fino) var(--vic-cuaderno-fino),
    var(--vic-cuaderno-fino) var(--vic-cuaderno-fino);
}

/* ==========================================================================
   4 · Separadores de sección
   --------------------------------------------------------------------------
   Un corte diagonal entre dos bandas de color, en el mismo ángulo del
   isotipo. Resuelve dos cosas a la vez: da carácter al cambio de sección y
   evita el borde recto de pared a pared, que es lo que hace que una página
   larga se lea como una pila de cajas.

   El elemento lleva el color de la sección de ABAJO como fondo, y el de
   ARRIBA en un ::before recortado en diagonal. Así el corte es exacto y no
   quedan filos de fondo entre secciones.

     <div class="section-divider section-divider--guinda-papel" aria-hidden="true"></div>
   ========================================================================== */
.section-divider {
  position: relative;
  height: clamp(38px, 4.6vw, 74px);
  overflow: hidden;
  background: var(--sd-hacia);
  /* Sin margen negativo: el separador es un bloque más del flujo, así nunca
     se come el padding de la sección que sigue. */
}
.section-divider::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sd-desde);
  clip-path: polygon(0 0, 100% 0, 100% 0, 0 100%);
}

/* Un filo fino en el corte, del color de acento. Es lo que convierte la
   diagonal en un gesto de marca y no en un simple triángulo. */
.section-divider::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to bottom right, transparent calc(50% - 1px), var(--sd-filo, transparent) 50%, transparent calc(50% + 1px));
  opacity: .5;
}

/* Un separador anuncia el cambio a una sección concreta. Si esa sección no se
   pinta —la banda de testimonios y la de reels salen de config y pueden venir
   vacías— la diagonal se quedaría anunciando algo que no está, entre dos
   colores que no son los suyos. Se retira sola. */
.section-divider:has(+ .vic-hidden) { display: none; }

/* Variantes, nombradas por el par de bandas que unen */
.section-divider--guinda-papel { --sd-desde: var(--vic-noche);        --sd-hacia: var(--vic-blanco); --sd-filo: rgba(var(--vic-cian-rgb), .5); }
.section-divider--guinda-lienzo { --sd-desde: var(--vic-noche);       --sd-hacia: var(--vic-bg-canvas); --sd-filo: rgba(var(--vic-cian-rgb), .5); }
.section-divider--guinda-gris   { --sd-desde: var(--vic-noche);       --sd-hacia: var(--vic-gris-claro); --sd-filo: rgba(var(--vic-cian-rgb), .5); }
.section-divider--gris-guinda  { --sd-desde: var(--vic-gris-claro);   --sd-hacia: var(--vic-noche);  --sd-filo: rgba(var(--vic-azul-rgb), .55); }
.section-divider--papel-noche  { --sd-desde: var(--vic-blanco);       --sd-hacia: var(--vic-noche);  --sd-filo: rgba(var(--vic-azul-rgb), .5); }
.section-divider--azul-guinda  { --sd-desde: var(--vic-azul-profundo); --sd-hacia: var(--vic-noche); --sd-filo: rgba(var(--vic-cian-rgb), .45); }

/* ==========================================================================
   5 · Hero
   --------------------------------------------------------------------------
   La composición del hero no se toca: titular, botones y panel de
   diagnóstico se quedan donde estaban. Esto solo añade profundidad detrás.
   ========================================================================== */
.vic-hero-deco {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
}
.vic-hero-deco svg { width: 100%; height: 100%; display: block; }

/* Los fragmentos respiran muy despacio y con recorrido mínimo (6px en 22s).
   Es profundidad, no animación: si se nota, está mal calibrado. */
.vic-hero-deco__frag { animation: vicFlota 22s ease-in-out infinite; transform-origin: center; }
.vic-hero-deco__frag--b { animation-duration: 27s; animation-delay: -6s; }
.vic-hero-deco__frag--c { animation-duration: 31s; animation-delay: -13s; }

@keyframes vicFlota {
  0%, 100% { transform: translate3d(0, 0, 0); }
  50%      { transform: translate3d(0, -6px, 0); }
}

/* La ruta editorial que conecta el titular con el panel de diagnóstico.
   Se dibuja sola al cargar, una vez, y se queda. */
.vic-hero-deco__ruta {
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  animation: vicDibuja 2.2s var(--vic-ease-marca) .35s forwards;
}
@keyframes vicDibuja { to { stroke-dashoffset: 0; } }

/* Nodos: van fuera del SVG (que está estirado con preserveAspectRatio="none")
   para que sigan siendo círculos. El anillo se hace con box-shadow, así que
   el elemento no ocupa más caja de la que se ve. */
.vic-hero-deco__nodo {
  position: absolute;
  width: 5px; height: 5px;
  margin: -2.5px 0 0 -2.5px;   /* centrado exacto sobre la coordenada */
  border-radius: 50%;
  background: rgba(255, 255, 255, .85);
  box-shadow: 0 0 0 4px rgba(108, 138, 199, .32);
  opacity: 0;
  animation: vicAparece .5s ease-out forwards;
}
.vic-hero-deco__nodo--fin {
  width: 7px; height: 7px;
  margin: -3.5px 0 0 -3.5px;
  background: #fff;
  box-shadow: 0 0 0 5px rgba(var(--vic-cian-rgb), .34);
}
.vic-hero-deco__nodo--1 { animation-delay: 1.0s; }
.vic-hero-deco__nodo--2 { animation-delay: 1.5s; }
.vic-hero-deco__nodo--3 { animation-delay: 2.0s; }
@keyframes vicAparece { to { opacity: 1; } }

/* En móvil el hero se apila y la ruta dejaría de conectar nada: se retira y
   quedan solo los fragmentos, que sí siguen funcionando como fondo. */
@media (max-width: 900px) {
  .vic-hero-deco__ruta,
  .vic-hero-deco__nodo,
  .vic-hero-deco__etiqueta { display: none; }
}

/* ==========================================================================
   6 · Tarjetas de beneficio e iconos
   ========================================================================== */

/* Área visual consistente en las cuatro tarjetas: reserva el mismo alto pase
   lo que pase, para que los títulos arranquen a la misma altura aunque un
   icono cambie de tamaño o mañana entre una ilustración. */
.benefit-media {
  position: relative;
  display: flex;
  align-items: center;
  min-height: 52px;
  margin-bottom: 2px;
}

/* Ilustración editorial de la tarjeta. Sustituye al icono; el hueco estaba
   preparado justo para esto.

   FONDO BLANCO, Y NO ES DECORATIVO. Las ilustraciones son PNG/WebP con canal
   alfa cuyo arte se dibujó contra blanco: al recortarle el fondo, los píxeles
   del borde conservan halo blanco. Sobre cualquier color ese halo se ve como
   dientes de sierra alrededor de cada forma. Sobre blanco compone exactamente
   como se dibujó y el borde vuelve a ser limpio.

   Por eso tampoco lleva caja de color ni borde: .vic-card ya es blanco puro,
   así que la ilustración se apoya en él sin costura. El `background` explícito
   está para que siga siendo blanco aunque algún día la tarjeta cambie de tono
   — si eso pasa, hay que pedir las ilustraciones ya compuestas contra el
   nuevo color, no pintarles una caja detrás. */
.benefit-illustration {
  width: 100%;
  max-width: 168px;
  aspect-ratio: 1 / 1;      /* las ilustraciones son cuadradas, 1200x1200 */
  background: var(--vic-blanco);
  margin-left: -8px;        /* el arte trae aire propio; esto lo realinea
                               ópticamente con el texto de abajo */
}
.benefit-illustration > img {
  width: 100%; height: 100%;
  object-fit: contain;      /* contain y no cover: no se recorta ilustración */
  display: block;
}

/* Con ilustración, el área visual la define ella y no el mínimo del icono. */
.benefit-media:has(.benefit-illustration) { min-height: 0; margin-bottom: 6px; }

/* Corte diagonal en la esquina del recuadro del icono: la misma pieza del
   isotipo, aplicada al elemento más pequeño del sistema. */
.vic-valor .vic-icono {
  position: relative;
  clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%);
  transition: background var(--vic-dur-media) var(--vic-ease-marca),
              color var(--vic-dur-media) var(--vic-ease-marca);
}
.vic-card--hoverable:hover .vic-icono {
  background: var(--vic-azul);
  color: #fff;
}
.vic-card--hoverable:hover .vic-icono--acento {
  background: var(--vic-guinda);
  color: #fff;
}

/* --- Programas que todavía no abren --------------------------------------
   El problema a resolver: que se vea de un golpe que estos dos no se pueden
   comprar todavía.

   La solución que NO funciona es la que traía victoria.css —apagar la imagen
   con saturate(.45) opacity(.7)—. Con las ilustraciones editoriales eso no
   dice "próximamente", dice "imagen rota": el ojo lee un defecto de carga,
   no una decisión.

   Lo que sí funciona es tratar la TARJETA como secundaria y dejar el dibujo
   casi intacto. Tres señales que se suman, ninguna destructiva:
     1. el papel deja de ser blanco y pasa a gris de lienzo,
     2. una trama diagonal muy fina sobre la portada —el ángulo del isotipo,
        el mismo lenguaje del resto del sitio— que se lee como "en obra",
     3. la imagen baja un punto de saturación, no cuatro.

   Y encima de eso siguen la insignia "Próximamente", la ausencia de precio y
   un botón de lista de espera en vez de compra. Con cinco señales, ninguna
   necesita gritar.
------------------------------------------------------------------------- */
.vic-producto--proximo {
  background: var(--vic-bg-canvas);
  border-color: var(--vic-border-subtle);
}
.vic-producto--proximo .vic-producto__img img {
  filter: saturate(.62) opacity(.88);
}

/* Trama diagonal sobre la portada. Va en el contenedor y no en la imagen para
   que no se escale con ella. */
.vic-producto--proximo .vic-producto__img { position: relative; }
.vic-producto--proximo .vic-producto__img::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  /* Paso ancho y opacidad mínima. A 11px se leía como barrotes encima del
     dibujo; el objetivo es que se note al comparar las tres tarjetas, no al
     mirar una sola. */
  background: repeating-linear-gradient(
    calc(90deg - var(--vic-angulo)),
    rgba(var(--vic-guinda-rgb), .05) 0 1px,
    transparent 1px 24px
  );
}

/* El pie de la tarjeta también se apaga: sin precio que anclar la mirada, el
   borde superior a todo color pesaba de más. */
.vic-producto--proximo .vic-producto__pie { border-top-color: var(--vic-border-subtle); }

/* --- Cuenta regresiva vencida ---------------------------------------------
   Cuando la ventana de lanzamiento ya se abrió, los cuatro cuadros en ceros
   se leen como un contador roto. Se ocultan y queda solo el texto de
   data-vence, que ya dice lo que hay que decir.
------------------------------------------------------------------------- */
[data-cuenta-regresiva].is-vencida .vic-cd { display: none; }

/* --- Precio ---------------------------------------------------------------
   Sale por clases, no por estilos en línea, porque la misma tarjeta se pinta
   sobre papel blanco y sobre cristal oscuro.
------------------------------------------------------------------------- */
.vic-precio__num {
  font-family: var(--vic-font-display);
  font-size: 26px;
  font-weight: 700;
  color: var(--vic-azul-profundo);
  line-height: 1.1;
}
.vic-precio__nota { font-size: 13px; color: var(--vic-text-muted); margin-top: 2px; }

/* Precio de lista tachado + sello del 2x1. Va ARRIBA del precio real y más
   chico: el número que se paga tiene que seguir siendo el que más pesa. */
.vic-precio__lista {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 2px;
  font-size: 14px;
  color: var(--vic-text-muted);
}
.vic-precio__ahorro {
  font-family: var(--vic-font-body);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .04em;
  padding: 3px 8px;
  border-radius: var(--vic-radius-pill);
  background: var(--vic-success-soft);
  color: var(--vic-success-text);
}
/* Sobre el cristal oscuro del carrusel, el verde institucional pierde
   contraste; el cian del sistema es el equivalente legible. */
.vic-producto--horizontal .vic-precio__lista { color: rgba(255, 255, 255, .62); }
.vic-producto--horizontal .vic-precio__ahorro {
  background: rgba(var(--vic-cian-rgb), .22);
  color: #fff;
}
.vic-precio--proximo .vic-precio__num { font-size: 20px; color: var(--vic-text-muted); }

.vic-producto__meta { font-size: 14px; color: var(--vic-text-muted); }

/* ==========================================================================
   Carrusel de programas (tienda)
   --------------------------------------------------------------------------
   Tarjeta horizontal —ilustración a un lado, contenido al otro— sobre una
   banda oscura, en cristal.

   Por qué la banda es oscura: el glassmorphism no es un color, es un
   desenfoque de lo que hay DETRÁS. Sobre el blanco plano que tenía la sección
   no se vería absolutamente nada: cristal sobre blanco es blanco. Para que el
   efecto exista hace falta algo que desenfocar, así que la banda lleva las
   mismas manchas de color que la de testimonios, que ya resolvía este mismo
   problema en el sitio.
   ========================================================================== */
.vic-catalogo {
  position: relative;
  overflow: hidden;
  background: var(--vic-noche);
}
.vic-catalogo > * { position: relative; z-index: 1; }
.vic-catalogo::before {
  content: "";
  position: absolute;
  inset: -10%;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(52% 50% at 12% 16%, rgba(var(--vic-azul-rgb), .58), transparent 68%),
    radial-gradient(44% 46% at 86% 10%, rgba(108, 138, 199, .26), transparent 70%),
    radial-gradient(54% 56% at 78% 94%, rgba(var(--vic-guinda-rgb), .72), transparent 68%);
}

/* Encabezado de la sección sobre fondo oscuro */
.vic-catalogo h2, .vic-catalogo h3 { color: #fff; }
.vic-catalogo .vic-eyebrow { color: rgba(255, 255, 255, .55); }
.vic-catalogo > .vic-container > p { color: rgba(255, 255, 255, .75); }

/* --- La tarjeta en cristal ------------------------------------------------ */
.vic-producto--horizontal {
  display: grid;
  grid-template-columns: minmax(0, 42%) minmax(0, 58%);
  align-items: stretch;
  border-radius: var(--vic-radius-xl);
  border: 1px solid rgba(255, 255, 255, .16);
  background: rgba(255, 255, 255, .07);
  -webkit-backdrop-filter: blur(16px);
          backdrop-filter: blur(16px);
  box-shadow: 0 24px 60px rgba(0, 0, 0, .35);
  color: rgba(255, 255, 255, .78);
  overflow: hidden;
}

/* La ilustración ocupa su columna completa, no una franja 16:9 */
.vic-producto--horizontal .vic-producto__img {
  aspect-ratio: auto;
  height: 100%;
  min-height: 260px;
  background: rgba(0, 0, 0, .18);
}
.vic-producto--horizontal .vic-producto__body { padding: 34px; }

/* Texto sobre cristal: el sistema pinta títulos y precios en azul profundo,
   que sobre este fondo desaparecería. */
.vic-producto--horizontal h3,
.vic-producto--horizontal .vic-precio__num { color: #fff; }
.vic-producto--horizontal .vic-producto__meta,
.vic-producto--horizontal .vic-precio__nota,
.vic-producto--horizontal .vic-lista-check li { color: rgba(255, 255, 255, .74); }
.vic-producto--horizontal .vic-precio--proximo .vic-precio__num { color: rgba(255, 255, 255, .72); }
/* La palomita verde institucional pierde contraste sobre oscuro; el cian del
   sistema es el equivalente legible aquí. */
.vic-producto--horizontal .vic-lista-check li::before { color: var(--vic-cian); }
.vic-producto--horizontal .vic-producto__pie {
  border-top-color: rgba(255, 255, 255, .16);
  /* Centrado y no al fondo: con los controles apilados, `flex-end` hundía el
     precio hasta la altura del último botón y el pie se leía torcido. */
  align-items: center;
}
.vic-producto--horizontal .vic-producto__link { color: #fff; }

/* En horizontal sobra ancho, así que los dos botones caben en una fila y el
   enlace de texto pasa debajo. Apilados hacían la tarjeta mucho más alta, y
   cuanto más alta la tarjeta, más se recorta la ilustración de al lado. */
.vic-producto--horizontal .vic-producto__acciones {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  flex: 1 1 320px;
}
.vic-producto--horizontal .vic-producto__acciones .vic-btn {
  flex: 1 1 auto;
  width: auto;
}
.vic-producto--horizontal .vic-producto__link { flex: 1 0 100%; }

/* Un "próximamente" en cristal no necesita el papel gris: aquí la señal es
   quitarle saturación a la ilustración y el resto ya lo dicen la insignia y
   la ausencia de precio. */
.vic-producto--horizontal.vic-producto--proximo {
  background: rgba(255, 255, 255, .045);
  border-color: rgba(255, 255, 255, .12);
}

.vic-catalogo .vic-rail { grid-auto-columns: 100%; }
.vic-catalogo .vic-rail > * { scroll-snap-stop: always; }

@media (max-width: 860px) {
  /* Apilada: la ilustración arriba, en franja, y el contenido debajo. */
  .vic-producto--horizontal { grid-template-columns: 1fr; }
  .vic-producto--horizontal .vic-producto__img {
    aspect-ratio: 16 / 9;
    height: auto;
    min-height: 0;
  }
  .vic-producto--horizontal .vic-producto__body { padding: 26px; }
}

/* --- Pie de la tarjeta de tienda -----------------------------------------
   Los controles iban alineados a la derecha (`justify-items:end`) y cada uno
   se quedaba con su ancho natural, así que los tres colgaban de una línea
   invisible a la derecha y quedaban dentados por la izquierda. En una tarjeta
   angosta, además, el bloque bajaba debajo del precio y el dentado se veía
   todavía más.

   Solución: el bloque de acciones toma el espacio que queda y los tres
   controles se estiran al mismo ancho. Un solo borde a cada lado.
------------------------------------------------------------------------- */
.vic-producto__acciones {
  flex: 1 1 210px;
  gap: 10px;
  justify-items: stretch;   /* mismo ancho para los tres */
}
.vic-producto__acciones .vic-btn { width: 100%; }

/* El enlace de texto no es un botón, pero comparte la columna: se centra para
   que su eje coincida con el de los botones de arriba. */
.vic-producto__link {
  font-size: 14px;
  font-weight: 600;
  text-align: center;
  padding-top: 2px;
}

/* ==========================================================================
   7 · Ruta del Método Victoria
   --------------------------------------------------------------------------
   Los cinco pasos ya se leen como secuencia por el número de cada tarjeta;
   la ruta lo hace visible de un vistazo. Es puramente decorativa: el orden
   real vive en el HTML, que sigue siendo una lista de tarjetas numeradas.

   El dibujo progresivo se engancha a [data-reveal].is-visible, la clase que
   ya pone el IntersectionObserver de ui.js. Cero JavaScript nuevo.
   ========================================================================== */
.vic-metodo {
  position: relative;
}

/* La línea vive detrás de las tarjetas, a la altura del número (24px de
   padding + 20px de medio círculo = 44px desde arriba). */
/* La línea arranca en el centro del número 1 y termina en el del número 5, en
   vez de correr de borde a borde: antes se pasaba ~124px del último nodo.

   El cálculo sale de la propia rejilla. Con cinco columnas iguales y hueco g,
   cada tarjeta mide w = (100% - 4g)/5, y el último número está a (w - 44px)
   del borde derecho — el mismo 44px del primero (24 de padding + 20 de medio
   círculo). Así se mantiene pegado a los nodos a cualquier ancho, sin JS. */
.vic-metodo {
  --vic-paso-gap: 16px;   /* el mismo gap de .vic-metodo-grid */
  --vic-nodo-off: 44px;   /* 24px de padding + 20px de medio círculo */
}
.vic-ruta {
  position: absolute;
  top: 42px;
  left: var(--vic-nodo-off);
  /* El ancho va explícito y NO con `right`: un <svg> es elemento reemplazado,
     así que con left+right+width:auto no se estira — se queda con el tamaño
     de su viewBox y se pasaba de largo del último nodo.

     La distancia entre el centro del primer número y el del último son cuatro
     tarjetas más cuatro huecos. Con w = (100% - 4g)/5, eso sale 0.8·(100% + g),
     que es lo que dice el cálculo de abajo. */
  width: calc(80% + var(--vic-paso-gap) * 0.8);
  height: 4px;
  z-index: 0;
  pointer-events: none;
  overflow: visible;
}
.vic-ruta__linea {
  fill: none;
  stroke: url(#vicRutaGrad);
  stroke-width: var(--vic-linea-media);
  stroke-linecap: round;
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  opacity: .75;
  transition: stroke-dashoffset var(--vic-dur-ruta) var(--vic-ease-marca);
}
[data-reveal].is-visible .vic-ruta__linea,
.is-visible .vic-ruta__linea { stroke-dashoffset: 0; }

/* Nodo sobre cada número. Se pinta con box-shadow en vez de un elemento
   extra: es un anillo que no ocupa caja y no puede desalinearse. */
.vic-paso { position: relative; z-index: 1; }
.vic-paso__num {
  position: relative;
  box-shadow: 0 0 0 4px rgba(var(--vic-guinda-rgb), .55), 0 0 0 5px rgba(var(--vic-cian-rgb), .35);
  transition: box-shadow var(--vic-dur-media) var(--vic-ease-marca);
}
.vic-paso:hover .vic-paso__num {
  box-shadow: 0 0 0 4px rgba(var(--vic-guinda-rgb), .55), 0 0 0 6px rgba(var(--vic-cian-rgb), .7);
}

/* (Aquí vivía un remate diagonal al final del recorrido. Se retiró: la línea
   ahora termina exactamente en el quinto número y ese nodo cierra la
   secuencia. La cuña quedaba contra el borde de la última tarjeta, sin nada
   que la anclara.) */

/* --- Recorrido vertical (móvil y tableta) --------------------------------
   Cuando la rejilla se vuelve una columna, el SVG horizontal no sirve: no se
   puede volver vertical solo cambiando su caja, porque el trazo seguiría
   siendo la misma recta horizontal aplastada.

   El tramo vertical se dibuja como ::after de cada tarjeta salvo la última.
   Colgarlo de la tarjeta —y no del contenedor— es lo que lo mantiene
   alineado: 24px de padding + 20px de medio círculo son coordenadas DE LA
   TARJETA, así que da igual cuánto padding tenga el contenedor en cada
   tamaño de pantalla. El dibujo progresivo es el mismo gesto, con scaleY.
------------------------------------------------------------------------- */
/* La ruta horizontal solo tiene sentido con las cinco tarjetas en fila. Entre
   1024 y 860px la rejilla pasa a dos columnas y tres filas, y ahí una línea
   recta no conecta nada: cruzaría por encima. Mejor ninguna que una que
   miente. */
@media (max-width: 1024px) {
  .vic-ruta { display: none; }
}

@media (max-width: 859px) {
  .vic-metodo-grid { position: relative; }

  .vic-paso:not(:last-child)::after {
    content: "";
    position: absolute;
    left: 44px;
    top: 44px;
    /* Baja hasta el número de la tarjeta siguiente: el alto propio que le
       falta más el hueco de la rejilla. */
    height: calc(100% - 44px + 16px + 44px);
    width: var(--vic-linea-media);
    margin-left: calc(var(--vic-linea-media) / -2);
    background: linear-gradient(to bottom, rgba(138, 166, 216, .8), rgba(44, 77, 157, .8));
    opacity: .7;
    z-index: -1;
    transform: scaleY(0);
    transform-origin: top;
    transition: transform var(--vic-dur-ruta) var(--vic-ease-marca);
  }
  .is-visible .vic-paso:not(:last-child)::after { transform: scaleY(1); }
}

/* ==========================================================================
   8 · Resultados y estadísticas
   ========================================================================== */
.vic-stat {
  position: relative;
  overflow: hidden;
  transition: border-color var(--vic-dur-media) var(--vic-ease-marca),
              transform var(--vic-dur-media) var(--vic-ease-marca);
}

/* Acento diagonal en la esquina superior: marca la tarjeta como dato de
   marca sin gastar un borde entero. */
.vic-stat::before {
  content: "";
  position: absolute;
  top: 0; right: 0;
  width: 46px; height: 46px;
  background: linear-gradient(to bottom left, rgba(var(--vic-azul-rgb), .12) 0 50%, transparent 50%);
  pointer-events: none;
}
.vic-stat:hover { border-color: rgba(var(--vic-azul-rgb), .45); }

/* Cifras tabulares: sin esto los números bailan de ancho al animarse y las
   cuatro tarjetas dejan de alinearse entre sí. */
.vic-stat__num,
.vic-cd__num,
.vic-mono { font-variant-numeric: tabular-nums; }

/* Jerarquía: el número manda, la etiqueta acompaña. */
.vic-stat__label {
  color: var(--vic-text-muted);
  line-height: 1.45;
}

/* Aparición escalonada. El retraso se aplica a la tarjeta, no al número:
   animar el valor hacia una cifra distinta de la real sería inventar datos. */
.vic-grid--4 > .vic-stat { transition-delay: calc(var(--vic-stat-i, 0) * 90ms); }
.vic-grid--4 > .vic-stat:nth-child(1) { --vic-stat-i: 0; }
.vic-grid--4 > .vic-stat:nth-child(2) { --vic-stat-i: 1; }
.vic-grid--4 > .vic-stat:nth-child(3) { --vic-stat-i: 2; }
.vic-grid--4 > .vic-stat:nth-child(4) { --vic-stat-i: 3; }

/* ==========================================================================
   9 · Testimonios
   ========================================================================== */

/* Comilla de marca: construida con fragmentos diagonales en lugar de un
   glifo tipográfico. La comilla del sistema es redonda y no pertenece a
   este alfabeto visual; estas dos cuñas sí. */
.vic-testimonio { position: relative; }
.vic-testimonio__cita::before {
  content: "";
  display: block;
  width: 30px; height: 20px;
  margin-bottom: 14px;
  background-color: rgba(var(--vic-cian-rgb), .75);
  -webkit-mask-image: var(--vic-comilla);
          mask-image: var(--vic-comilla);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  --vic-comilla: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 20'%3E%3Cpath d='M2 20 L10 0 L15 0 L9 20 Z' fill='%23fff'/%3E%3Cpath d='M16 20 L24 0 L29 0 L23 20 Z' fill='%23fff'/%3E%3C/svg%3E");
}

/* Marco del testimonio activo del carrusel. La clase la pone VicUI.rail()
   con el mismo índice que ya usa para los puntos. */
.vic-testimonio {
  transition: border-color var(--vic-dur-media) var(--vic-ease-marca),
              background var(--vic-dur-media) var(--vic-ease-marca),
              box-shadow var(--vic-dur-media) var(--vic-ease-marca);
}
.vic-testimonio.is-actual {
  border-color: rgba(var(--vic-cian-rgb), .5);
  box-shadow: inset 3px 0 0 rgba(var(--vic-cian-rgb), .8);
}

/* Indicador del carrusel: los puntos de 6px se perdían sobre el fondo noche.
   El activo pasa a barra, que además dice en qué dirección se avanza. */
.vic-social .vic-rail__dot {
  width: 8px; height: 8px;
  background: rgba(255, 255, 255, .32);
  transition: width var(--vic-dur-media) var(--vic-ease-marca),
              background var(--vic-dur-media) var(--vic-ease-marca),
              opacity var(--vic-dur-media) var(--vic-ease-marca);
}
.vic-social .vic-rail__dot.is-on {
  width: 26px;
  border-radius: var(--vic-radius-pill);
  background: var(--vic-cian);
  transform: none;   /* anula el scale(1.35) de victoria.css: aquí crece a lo ancho */
}

/* ==========================================================================
   10 · Hueco de mascota (Vico)
   --------------------------------------------------------------------------
   El contenedor NO pinta nada por sí mismo: sin imagen no hay caja, ni
   marco, ni silueta gris. Un placeholder genérico en producción se lee como
   sitio a medio terminar, que es peor que no tener mascota.
   ========================================================================== */
.mascot-slot { display: none; }
.mascot-slot:has(img) {
  display: block;
  position: relative;
  width: fit-content;
  margin-top: 30px;
}

/* Medallón claro detrás de Vico.
   NO es decoración: el cuerpo de Vico es azul marino y la banda de esta
   sección es azul profundo, así que sobre el fondo desnudo la silueta se
   funde y se pierde la cola entera. Sobre claro se lee completo.

   Es un círculo y no un recuadro a propósito: un rectángulo blanco dentro de
   una banda de color se lee como un parche o como una imagen que no cargó;
   un medallón se lee como decisión. Y va algo más chico que la ilustración
   para que Vico lo desborde — apoyado en él, no pegado encima. */
.mascot-slot:has(img)::before {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 6%;
  width: 86%;
  aspect-ratio: 1;
  transform: translateX(-50%);
  border-radius: 50%;
  background: radial-gradient(circle at 50% 45%,
    var(--vic-blanco-calido) 62%,
    rgba(250, 248, 245, .72) 82%,
    rgba(250, 248, 245, 0) 100%);
}

.mascot-slot img {
  position: relative;   /* por encima del medallón */
  display: block;
  width: 100%;
  max-width: 260px;
  height: auto;
}

@media (max-width: 900px) {
  /* En móvil la columna se apila sobre el formulario: se centra y se reduce
     para no empujar el CTA fuera de la primera pantalla. */
  .mascot-slot:has(img) { margin: 22px auto 0; }
  .mascot-slot img { max-width: 180px; }
}

/* ==========================================================================
   11 · Microinteracciones
   --------------------------------------------------------------------------
   Regla única: nada se mueve si nadie lo está tocando, salvo los fragmentos
   del hero, que respiran 6px en 22 segundos. Todo lo demás responde a hover,
   foco o entrada en viewport, y vuelve a su sitio.
   ========================================================================== */
.vic-card--hoverable {
  transition: box-shadow var(--vic-dur-media) var(--vic-ease-marca),
              transform var(--vic-dur-media) var(--vic-ease-marca),
              border-color var(--vic-dur-media) var(--vic-ease-marca);
}
.vic-card--hoverable:hover {
  transform: translateY(calc(var(--vic-elevacion) * -1));
  border-color: rgba(var(--vic-azul-rgb), .4);
}

.vic-paso {
  transition: background var(--vic-dur-media) var(--vic-ease-marca),
              border-color var(--vic-dur-media) var(--vic-ease-marca),
              transform var(--vic-dur-media) var(--vic-ease-marca);
}
.vic-paso:hover {
  background: rgba(255, 255, 255, .07);
  border-color: rgba(var(--vic-cian-rgb), .38);
  transform: translateY(-2px);
}

/* Foco de teclado sobre fondo oscuro: la sombra azul de victoria.css se
   pierde contra el guinda. Aquí se refuerza con el cian, que sí resalta. */
.vic-section--impacto :focus-visible,
.vic-social :focus-visible,
.vic-footer :focus-visible {
  box-shadow: 0 0 0 3px rgba(var(--vic-cian-rgb), .85);
}

/* ==========================================================================
   13 · Página 404
   --------------------------------------------------------------------------
   Reutiliza el header, los botones y los tokens del sistema; solo añade la
   composición y la escena. Sin imágenes de fondo: cuadrícula, ejes y
   fragmentos son CSS y SVG en línea.
   ========================================================================== */
/* El body manda el alto y la sección toma lo que sobra. Restarle al 100svh una
   altura fija de header era adivinar: bastaban 3px de diferencia para que
   apareciera una barra de scroll en una página que debe caber en una pantalla. */
.v404-body {
  background: var(--vic-noche);
  min-height: 100svh;
  display: flex;
  flex-direction: column;
}

.v404 {
  position: relative;
  /* svh y no vh: en móvil, vh cuenta el alto SIN las barras del navegador, así
     que la sección se pasa de largo y aparece un scroll que no debería. */
  flex: 1;
  display: flex;
  align-items: center;
  overflow: hidden;
  background:
    radial-gradient(900px 620px at 82% 108%, rgba(var(--vic-azul-rgb), .30), transparent 66%),
    radial-gradient(700px 500px at 8% 0%, rgba(var(--vic-azul-rgb), .16), transparent 62%),
    var(--vic-noche);
}

/* --- Fondo: cuaderno + ejes + fragmentos --------------------------------- */
.v404__fondo {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image:
    linear-gradient(rgba(255,255,255,.10) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, rgba(255,255,255,.10) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(rgba(255,255,255,.045) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, rgba(255,255,255,.045) var(--vic-linea-fina), transparent var(--vic-linea-fina));
  background-size:
    var(--vic-cuaderno-mayor) var(--vic-cuaderno-mayor),
    var(--vic-cuaderno-mayor) var(--vic-cuaderno-mayor),
    var(--vic-cuaderno-fino) var(--vic-cuaderno-fino),
    var(--vic-cuaderno-fino) var(--vic-cuaderno-fino);
}
.v404__ejes {
  position: absolute;
  left: 0; bottom: 0;
  width: min(52%, 700px);
  height: min(86%, 900px);
}
.v404__frags { position: absolute; inset: 0; width: 100%; height: 100%; }

/* --- Rejilla ------------------------------------------------------------- */
.v404__grid {
  position: relative;
  z-index: 1;
  /* width:100% es obligatorio: .v404 es flex, así que el contenedor sería un
     flex item y se encogería a su contenido en vez de tomar sus 1200px. */
  width: 100%;
  display: grid;
  grid-template-columns: 54% 46%;
  align-items: center;
  gap: 32px;
  padding-top: 40px;
  padding-bottom: 40px;
}

/* --- Columna de texto ---------------------------------------------------- */
.v404__eyebrow {
  font-family: var(--vic-font-body);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .34em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .58);
  margin: 0 0 18px;
}

/* El 404 domina la composición. Los cortes diagonales se hacen con `mask` y
   no pintando franjas encima: la máscara vuelve transparentes esas franjas y
   deja ver el fondo REAL, así que el corte encaja aunque el fondo tenga
   degradado o cuadrícula debajo. Pintarlas exigiría adivinar el color. */
.v404__num {
  font-family: var(--vic-font-display);
  font-weight: 800;
  font-size: clamp(104px, 15vw, 216px);
  line-height: .84;
  letter-spacing: -.02em;
  color: var(--vic-blanco-calido);
  margin: 0 0 18px;
  /* El periodo va en `em` y no en px: así el corte escala con la cifra y el
     NÚMERO de cortes es el mismo en cualquier pantalla. Con medidas fijas, el
     404 de móvil —que es la mitad de alto— salía cruzado por el doble de
     cortes y dejaba de leerse. */
  -webkit-mask-image: repeating-linear-gradient(
    calc(90deg - var(--vic-angulo)),
    #000 0 .78em, transparent .78em .82em);
          mask-image: repeating-linear-gradient(
    calc(90deg - var(--vic-angulo)),
    #000 0 .78em, transparent .78em .82em);
}

.v404__titulo {
  font-size: clamp(28px, 3.4vw, 46px);
  line-height: 1.08;
  color: #fff;
  margin: 0 0 16px;
  max-width: 17ch;
}
.v404__desc {
  font-size: clamp(16px, 1.3vw, 18px);
  line-height: 1.6;
  color: rgba(255, 255, 255, .74);
  margin: 0 0 28px;
  max-width: 44ch;
}
.v404__botones { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 24px; }

.v404__ayuda {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-size: 15px;
  font-weight: 600;
  color: var(--vic-primary-light);
}
.v404__ayuda:hover { color: #fff; }

/* --- Escena -------------------------------------------------------------- */
.v404__escena {
  position: relative;
  min-height: min(74svh, 620px);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* El panel entra desde el borde derecho de la ventana, no de la columna: por
   eso el ancho va en vw y se sale del contenedor. Es un pentágono con el corte
   diagonal a la izquierda, en el ángulo del isotipo. */
.v404__panel {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 4%;
  width: 60vw;
  background-color: var(--vic-blanco-calido);
  background-image:
    linear-gradient(rgba(34,58,116,.05) var(--vic-linea-fina), transparent var(--vic-linea-fina)),
    linear-gradient(90deg, rgba(34,58,116,.05) var(--vic-linea-fina), transparent var(--vic-linea-fina));
  background-size: var(--vic-cuaderno-fino) var(--vic-cuaderno-fino);
  clip-path: polygon(26% 0, 100% 0, 100% 100%, 24% 100%, 0 52%);
}

.v404__vico {
  position: relative;
  z-index: 2;
  /* Vico manda en esta mitad: su alto define la escena. El límite en svh es
     lo que impide que en pantallas bajas empuje la página y aparezca scroll. */
  width: 70%;
  max-width: min(430px, 54svh);
  margin-right: 14%;
}
/* Sin imagen no hay caja: mismo criterio que el resto del sitio. */
.v404__vico:not(:has(img)) { display: none; }
.v404__vico img {
  display: block;
  width: 100%;
  height: auto;
  object-fit: contain;
}

.v404__deco {
  position: absolute;
  inset: 0;
  z-index: 3;
  width: 100%;
  height: 100%;
  pointer-events: none;
}

/* --- Animaciones: entrada suave y dibujo de la ruta ---------------------- */
.v404__texto > * { animation: v404Entra .6s var(--vic-ease-marca) backwards; }
.v404__texto > *:nth-child(2) { animation-delay: .06s; }
.v404__texto > *:nth-child(3) { animation-delay: .12s; }
.v404__texto > *:nth-child(4) { animation-delay: .18s; }
.v404__texto > *:nth-child(5) { animation-delay: .24s; }
.v404__texto > *:nth-child(6) { animation-delay: .30s; }
@keyframes v404Entra { from { opacity: 0; transform: translateY(10px); } }

.v404__ruta path,
.v404__estela {
  stroke-dasharray: 260;
  stroke-dashoffset: 260;
  animation: v404Dibuja 1.5s var(--vic-ease-marca) .35s forwards;
}
.v404__estela { animation-delay: .9s; }
@keyframes v404Dibuja { to { stroke-dashoffset: 0; } }

.v404__nodos circle,
.v404__quiebre path { opacity: 0; animation: v404Aparece .45s ease-out .95s forwards; }
.v404__interrogacion { opacity: 0; animation: v404Aparece .5s ease-out 1.25s forwards; }
@keyframes v404Aparece { to { opacity: 1; } }

/* 3px en 5s: el avión respira, no vuela. */
.v404__avion { animation: v404Flota 5s ease-in-out 1.6s infinite; transform-origin: center; }
@keyframes v404Flota {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-3px); }
}

/* --- Tableta ------------------------------------------------------------- */
@media (max-width: 1024px) {
  .v404__grid { grid-template-columns: 52% 48%; gap: 20px; }
  .v404__vico { width: 54%; margin-right: 16%; }
  /* La regla y la hoja saturan cuando la escena se estrecha. */
  .v404__hoja, .v404__regla { display: none; }
}

/* --- Móvil --------------------------------------------------------------- */
@media (max-width: 760px) {
  .v404 { min-height: 0; padding: 32px 0 48px; display: block; }
  .v404__grid {
    grid-template-columns: 1fr;
    gap: 36px;
    padding-top: 8px;
  }
  .v404__botones .vic-btn { width: 100%; }
  .v404__desc { max-width: none; }

  /* El panel deja de ser un pentágono que entra por el borde: en una columna
     estrecha, ese corte diagonal recortaría a Vico. Rectángulo redondeado. */
  /* Altura propia: sin ella el panel es una franja delgada mientras no exista
     la imagen de Vico, y la decoración queda diminuta. Con Vico dentro, él
     manda y esta medida deja de aplicar. */
  .v404__escena { min-height: 300px; padding: 26px 0; }
  .v404__panel {
    left: -16px;
    right: -16px;
    width: auto;
    border-radius: var(--vic-radius-xl);
    clip-path: none;
  }
  .v404__vico { width: 62%; max-width: 260px; margin-right: 18%; }
  .v404__ejes { display: none; }
}

/* El botón flotante de WhatsApp sobra aquí: el enlace de ayuda ya está en el
   contenido, y esta página está pensada para caber en una pantalla. */
.v404-body .vic-fab-wa { display: none; }

/* ==========================================================================
   14 · Movimiento reducido
   --------------------------------------------------------------------------
   victoria.css ya congela animaciones y transiciones globalmente. Aquí se
   rematan los casos que dependen de un estado FINAL: si solo se anula la
   transición, la ruta se quedaría sin dibujar.
   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
  .vic-hero-deco__frag { animation: none; }
  .vic-hero-deco__ruta { animation: none; stroke-dashoffset: 0; }
  .vic-hero-deco__nodo { animation: none; opacity: 1; }
  .vic-ruta__linea { transition: none; stroke-dashoffset: 0; }
  .vic-paso:not(:last-child)::after { transition: none; transform: scaleY(1); }
  .vic-card--hoverable:hover,
  .vic-paso:hover { transform: none; }

  .v404__texto > * { animation: none; }
  .v404__ruta path,
  .v404__estela { animation: none; stroke-dashoffset: 0; }
  .v404__nodos circle,
  .v404__quiebre path,
  .v404__interrogacion { animation: none; opacity: 1; }
  .v404__avion { animation: none; }
}
