/* ==========================================================================
   Maquimaderas de Colombia — Home
   Sistema visual: Brandkit/Identidad_Corporativa.md
   Light theme FIJO. Nunca depende de prefers-color-scheme.
   ========================================================================== */

:root{
  color-scheme: light only;

  /* Paleta oficial (Identidad_Corporativa.md §3) */
  --white:          #FFFFFF;
  --graphite:       #0B0D12;
  --blue:           #1E31A4;
  --blue-electric:  #3D5CFF;
  /* El gris de texto secundario subió de #64748B a #4A5769. Sobre la superficie
     clara (#F6F8FC) el anterior daba 4.48:1 de contraste, justo por debajo del
     4.5:1 que pide la WCAG AA para texto normal: se quedaba corto por dos
     centésimas. El nuevo da 6.91:1 sobre esa superficie y 7.35:1 sobre blanco.
     Era la otra mitad del problema que Juan señaló en las líneas de datos: una
     parte la ponía la fuente y la otra el color. */
  --slate:          #4A5769;
  --yellow:         #FFC629;

  /* Derivados de apoyo */
  --paper:          #F6F8FC;
  --line:           rgba(30,49,164,.12);
  --line-strong:    rgba(30,49,164,.22);
  --glass:          rgba(255,255,255,.08);
  --glass-line:     rgba(255,255,255,.18);

  /* Gradientes oficiales (§4) */
  --grad-primary:   linear-gradient(135deg, #1E31A4 0%, #3D5CFF 100%);
  --grad-contrast:  linear-gradient(135deg, #0B0D12 0%, #1E31A4 100%);
  --grad-atmos:     linear-gradient(135deg, #3D5CFF 0%, #1E31A4 55%, #0B0D12 100%);

  /* Tipografía (§5) */
  --f-display: "Fugaz One", "Arial Black", "Haettenschweiler", Impact, sans-serif;
  --f-body:    "Public Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  /* SE RETIRÓ LA MONOESPACIADA (Fragment Mono).
     Juan: «tengo serios problemas con este tipo de texto, no se ve, no se lee,
     se disimula; no quiero usar esa fuente».
     Tenía razón por tres motivos que se suman: Fragment Mono viene en UN SOLO
     peso (400), a 13px sobre gris pizarra, y una monoespaciada reparte el mismo
     ancho a la i que a la M, así que el gris que deja es más claro que el de
     una grotesca del mismo tamaño. Tres cosas restando contraste a la vez.
     La referencia es Apple, y Apple NO usa monoespaciada en marketing: usa UNA
     familia y hace la jerarquía con tamaño, peso y color. Aquí ya había dos
     familias; la tercera solo estaba debilitando sus líneas.
     `--f-mono` se queda como alias del cuerpo para no reescribir 24 reglas, y
     cada una sube a 14px y peso 500, que es lo que faltaba. */
  --f-mono:    var(--f-body);

  --r-sm: 10px;
  --r-md: 16px;
  --r-lg: 24px;
  --r-xl: 32px;
  /* Radios concéntricos. Cuando una caja redondeada vive dentro de otra, la de
     dentro NO puede llevar el mismo radio: las dos curvas dejan de ser
     paralelas y la interna se ve demasiado redonda. La regla es
     interno = externo - separación. Con los 24px de la tarjeta y 20-24px de
     margen interior, el valor que queda armonioso es este. */
  /* UNIDAD DE SEPARACIÓN DEL SITIO. Un solo valor para el hueco entre piezas
     de una retícula, para el margen lateral de esas retículas y para el grosor
     de la línea blanca del alero. Si se cambia aquí, se mueven las tres cosas a
     la vez y no se pueden desincronizar. */
  --gap-unit: 10px;
  --r-in-lg: 12px;   /* dentro de una caja de 24px */
  --r-in-md:  8px;   /* dentro de una caja de 16px */

  --shadow-soft: 0 12px 32px -12px rgba(11,13,18,.16);
  --shadow-lift: 0 28px 60px -24px rgba(30,49,164,.38);

  /* 68px era la altura de la cápsula flotante de antes. La barra minimal se
     acerca a la de Apple, que ronda los 44. 52 deja aire para el logotipo, que
     es más alto que una manzana. */
  --nav-h: 52px;
  /* Cuánto se aparta un ancla del borde superior para no quedar debajo de la
     cápsula del navbar. La cápsula mide 52px y arranca a 8px del borde, así que
     esto deja 16px de aire. Lo usan el CSS y el scroll suave de main.js, para
     que no haya dos números que mantener sincronizados a mano. */
  --scroll-offset: 76px;
  --gutter: 20px;
  --maxw: 1240px;
}

/* Sin esto, entrar directo a maquimaderasdecolombia.com/#paquetes deja el
   titular de la sección tapado por el navbar. El scroll suave de main.js sí lo
   compensaba, pero solo al hacer clic dentro de la página: un enlace compartido
   por WhatsApp o un anuncio que apunte a un ancla caían mal. */
:target,
section[id],
[id^="galeria"]{ scroll-margin-top:var(--scroll-offset); }

/* ---------- Reset ---------- */
*,*::before,*::after{ box-sizing:border-box; }
/* OJO: nada de `scroll-behavior:smooth` aquí. Rompe la medición de ScrollTrigger
   (los pins arrancan desfasados). El scroll suave de los anclas lo hace main.js. */
html{ -webkit-text-size-adjust:100%; }
body{
  margin:0;
  /* El fondo del documento es la misma superficie clara que las secciones: si
     fuera blanco puro, asomaría en el rebote del scroll y volvería a verse el
     salto de tono. */
  background:var(--paper);
  color:var(--graphite);
  font-family:var(--f-body);
  font-weight:400;
  font-size:17px;
  /* 1.6 para un cuerpo de 16px deja las líneas algo apretadas cuando el texto
     va sobre color. 1.68 es el punto donde el párrafo se lee sin esfuerzo sin
     que las líneas se desparramen. */
  line-height:1.68;
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
}
img,svg{ display:block; max-width:100%; }
a{ color:inherit; text-decoration:none; }
button{ font:inherit; color:inherit; background:none; border:0; cursor:pointer; }
h1,h2,h3,h4{ margin:0; font-family:var(--f-display); font-weight:400; text-transform:uppercase; line-height:.98; letter-spacing:-.01em; }
p{ margin:0; }
ul{ margin:0; padding:0; list-style:none; }

/* Fugaz One es de un solo peso: nunca forzar bold/thin (Identidad §5) */

/* ---------- Layout ---------- */
.wrap{ width:100%; max-width:var(--maxw); margin-inline:auto; padding-inline:var(--gutter); }
.section{ position:relative; padding-block:clamp(72px,11vw,132px); }
/* `.section--dark` ya no la usa ningún marcado: cada sección oscura declara su
   propio degradado (paquetes, garantía, cierre). Se deja la clase porque sus
   reglas derivadas (`.lead`, `.eyebrow`, `.btn--ghost` sobre oscuro) siguen
   siendo el sitio donde se listan las superficies oscuras del sitio. */
.section--dark{ background:var(--grad-contrast); color:var(--white); }

/* ---------- Tipografía utilitaria ---------- */
.h1{ font-family:var(--f-display); font-size:clamp(34px,6.6vw,68px); line-height:.96; letter-spacing:-.02em; text-transform:uppercase; }
.h2{ font-family:var(--f-display); font-size:clamp(28px,4.8vw,52px); line-height:1; letter-spacing:-.015em; text-transform:uppercase; }
.h3{ font-family:var(--f-display); font-size:clamp(20px,2.6vw,28px); line-height:1.05; text-transform:uppercase; }
/* Medida de lectura más corta y línea más alta. 56 caracteres por línea es el
   tope de lo cómodo; 62 ya obliga a "buscar" el principio de la siguiente. Se
   baja a 52 y se sube el interlineado, que es la palanca que más se nota. */
.lead{ font-size:clamp(16px,2vw,19px); line-height:1.62; color:var(--slate); max-width:52ch; }
.section--dark .lead,
.aftersale .lead{ color:rgba(255,255,255,.72); }
.mono{ font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.02em; }
/* ==========================================================================
   ETIQUETAS  ·  un solo recetario para todo el sitio  (26/09/2026)

   Juan sobre las etiquetas en monoespaciada: «no se lee muy bien, aunque el
   estilo está bueno; un poco más grande y un poco más pesada».

   El problema tiene nombre: Fragment Mono viene en UN SOLO peso. No existe su
   negrita, y falsearla con el navegador engorda los trazos de forma desigual,
   que en una monoespaciada se nota más que en cualquier otra letra.

   La solución no fue traer una fuente nueva: el sitio YA tenía este recetario
   en `.eyebrow` (Public Sans 700), solo que las fichas de línea, los paneles de
   Top ventas y la galería usaban monoespaciada por su cuenta. Ahora todas las
   etiquetas comparten el mismo estilo.

   La monoespaciada NO desaparece: se queda donde su razón de ser es que las
   cifras se alineen en columna (la franja de datos, los pies de las máquinas,
   las fichas técnicas). Ahí sí aporta; como etiqueta, solo restaba peso.
   ========================================================================== */
.eyebrow{
  font-family:var(--f-body); font-weight:700; font-size:14px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--blue);
  display:block; line-height:1.4;
}
/* NADA de raya decorativa antes del label. Regla de marca: el adorno tipo
   "— LABEL" está prohibido en cualquier diseño. El label se sostiene solo con
   mayúsculas, peso y letter-spacing. */
/* Sobre cualquier fondo oscuro o azul el label va en amarillo, no en azul:
   azul sobre azul no se lee. */
/* `.close` salió de esta lista: dejó de ser una sección oscura el día que la
   secuencia de color la pasó a claro. Su antetítulo va en azul, más abajo. */
.section--dark .eyebrow,
.aftersale .eyebrow{ color:var(--yellow); }

/* ---------- Botones ---------- */
/* Altura fija en vez de padding vertical: todos los botones se alinean solos
   aunque cambie el cuerpo de texto. */
/* Canto suave de 12px en lugar de pildora: el boton pasa a ser un rectangulo y
   rima con las tarjetas, las fotos y los bloques de color, que tambien lo son.
   Decision de Juan sobre el banco de formas. */
.btn{
  position:relative; isolation:isolate; overflow:hidden;
  display:inline-flex; align-items:center; justify-content:center; gap:9px;
  height:54px; padding:0 26px; border-radius:12px;
  font-weight:700; font-size:15px; letter-spacing:-.012em; white-space:nowrap;
  transition:transform .22s cubic-bezier(.2,.8,.3,1), box-shadow .28s ease,
             background-color .22s ease, color .22s ease, border-color .22s ease;
  will-change:transform;
}
/* Barrido de luz: una franja inclinada cruza la superficie al pasar el cursor,
   como la luz corriendo sobre una lamina de acero. Va en z-index negativo
   dentro del propio boton (isolation:isolate), asi queda sobre el fondo y
   debajo del texto sin tener que subir el texto a una capa propia.
   El bloque global de prefers-reduced-motion ya lo neutraliza. */
.btn::before{
  content:""; position:absolute; inset:0 auto 0 0; width:46%; z-index:-1;
  background:linear-gradient(100deg, transparent, rgba(255,255,255,.85), transparent);
  transform:translateX(-170%) skewX(-18deg);
  transition:transform .72s cubic-bezier(.22,.7,.25,1);
  pointer-events:none;
}
.btn:hover::before,
.btn:focus-visible::before{ transform:translateX(330%) skewX(-18deg); }
/* La flecha acompaña el gesto en hover */
.btn > svg:last-child{ transition:transform .28s cubic-bezier(.2,.8,.3,1); }
.btn:hover > svg:last-child{ transform:translateX(3px); }
.btn:active{ transform:translateY(1px) scale(.99); }
/* Amarillo Taller: siempre SÓLIDO, nunca en gradiente (Identidad §4/§6.3) */
/* Amarillo sólido, sin degradado (regla de marca). La profundidad la da una
   luz interior arriba más una sombra proyectada del propio color. */
/* SIN halo de color. La sombra era amarilla sobre un botón amarillo, así que
   sobre el azul del hero se leía como un resplandor de neón alrededor, no como
   una sombra. Ahora la sombra es neutra y oscura, que es lo que hace un objeto
   apoyado sobre una superficie: separa sin brillar. */
.btn--primary{
  background:var(--yellow); color:var(--graphite);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.45), 0 6px 16px -10px rgba(11,13,18,.55);
}
.btn--primary:hover{
  background:#FFD24D; transform:translateY(-2px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6), 0 12px 24px -12px rgba(11,13,18,.6);
}
/* Fantasma en vidrio en vez de contorno plano: se apoya sobre foto o sobre
   color sin ensuciarse, y hace juego con la cápsula del navbar. */
.btn--ghost{
  border:1px solid rgba(30,49,164,.26); color:var(--blue);
  background:rgba(255,255,255,.55);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.75);
  backdrop-filter:blur(12px) saturate(1.4); -webkit-backdrop-filter:blur(12px) saturate(1.4);
}
/* EN EL HERO, BLANCO MACIZO. Sobre el azul profundo, un blanco al 55% con
   desenfoque detrás se vuelve azul lavanda y el botón desaparece: parece
   desactivado, no secundario. Juan: «blanco este botón, que se note».
   Un segundo botón no tiene que ser tenue, tiene que ser CLARAMENTE el segundo,
   y eso ya lo dice el color (el primario es amarillo) sin necesidad de
   apagarlo. Aquí el blanco macizo se sostiene solo y no necesita ni borde ni
   desenfoque. */
.hero .btn--ghost{
  background:var(--white); color:var(--blue);
  border-color:var(--white);
  backdrop-filter:none; -webkit-backdrop-filter:none;
  box-shadow:0 10px 26px -14px rgba(5,8,26,.7);
}
.hero .btn--ghost:hover{
  background:var(--white); color:var(--blue); border-color:var(--white);
  transform:translateY(-2px);
  box-shadow:0 16px 32px -14px rgba(5,8,26,.8);
}
/* Sobre superficie clara un destello blanco no se ve: el barrido del fantasma
   se tine de azul de marca. */
.btn--ghost::before{
  background:linear-gradient(100deg, transparent, rgba(30,49,164,.20), transparent);
}
.btn--ghost:hover{
  background:var(--blue); color:var(--white); border-color:var(--blue);
  transform:translateY(-2px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 12px 24px -14px rgba(11,13,18,.55);
}
/* Botón fantasma sobre superficie oscura o azul: va en blanco.
   Hay que listar las superficies explícitamente porque varias pintan su
   gradiente con clase propia (.lcard--urus, .lcard--titan) y no con
   .section--dark, así que se quedaban en azul sobre azul.
   `.close` salió de la lista: es una sección clara y su fantasma va en azul,
   corregido más abajo. */
.section--dark .btn--ghost,
.aftersale .btn--ghost,
.lcard--urus .btn--ghost,
.lcard--titan .btn--ghost{
  border-color:rgba(255,255,255,.3); color:var(--white);
  background:rgba(255,255,255,.12);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.25);
}

.section--dark .btn--ghost::before,
.aftersale .btn--ghost::before,
.lcard--urus .btn--ghost::before,
.lcard--titan .btn--ghost::before,
.hero.is-act-2 .btn--ghost::before,
.hero.is-act-3 .btn--ghost::before{
  background:linear-gradient(100deg, transparent, rgba(255,255,255,.6), transparent);
}

.section--dark .btn--ghost:hover,
.aftersale .btn--ghost:hover,
.lcard--urus .btn--ghost:hover,
.lcard--titan .btn--ghost:hover{ background:var(--white); color:var(--blue); border-color:var(--white); }
.btn--sm{ height:44px; padding:0 19px; font-size:14px; border-radius:10px; }
.btn svg{ flex:none; }

/* ==========================================================================
   ETIQUETAS — dos tratamientos, y cual se usa lo decide la superficie:

     .pill   "etiqueta recta": lleva caja. Va SOBRE FOTO o sobre una tarjeta de
             color, donde el texto necesita su propio fondo para leerse.
     .label  "sin caja": solo punto y texto. Va sobre color plano y junto al
             titular, donde una caja mas solo compite con el.

   Asi la alternancia no es decorativa: en el hero conviven las dos, la sin caja
   a la izquierda con el copy y la recta a la derecha sobre la foto de la
   maquina. Decision de Juan sobre el banco de etiquetas.
   ========================================================================== */

/* ---------- .pill · etiqueta recta (sobre foto o tarjeta de color) ---------- */
.pill{
  display:inline-flex; align-items:center; gap:8px;
  padding:7px 13px; border-radius:var(--r-in-md);
  font-size:13px; font-weight:700; letter-spacing:.05em; text-transform:uppercase;
  white-space:nowrap;
}
/* Solo una etiqueta en toda la página va rellena de amarillo: la del producto
   más vendido. Si todas gritan, ninguna se oye. */
.pill--yellow{ background:var(--yellow); color:var(--graphite); }
.pill--glass{ background:var(--glass); color:var(--white); border:1px solid var(--glass-line); backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px); }

/* ---------- .label · sin caja (sobre color plano, junto al titular) ---------
   Los colores salen de los tokens del acto (--hero-fg / --hero-muted), asi que
   la etiqueta cambia sola al pasar de blanco a azul y a amarillo. */
.label{
  display:inline-flex; align-items:center; gap:9px;
  font-size:13.5px; white-space:nowrap; max-width:100%;
}
.label__k{
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--hero-muted);
}
.label__v{
  font-weight:700; letter-spacing:-.005em; color:var(--hero-fg);
  min-width:0; overflow:hidden; text-overflow:ellipsis;
}
.label__dot{
  width:8px; height:8px; border-radius:50%; flex:none;
  background:var(--yellow); box-shadow:0 0 0 3px rgba(255,198,41,.22);
}
/* Sobre el amarillo del acto 3 el punto amarillo desaparece: pasa a grafito. */
.hero.is-act-3 .label__dot{ background:var(--graphite); box-shadow:0 0 0 3px rgba(11,13,18,.12); }
.label__ring{
  width:8px; height:8px; border-radius:50%; background:var(--blue-electric); flex:none;
  box-shadow:0 0 0 0 rgba(61,92,255,.55);
  animation:ring 2.4s ease-out infinite;
}
@keyframes ring{ 70%{ box-shadow:0 0 0 9px rgba(61,92,255,0); } 100%{ box-shadow:0 0 0 0 rgba(61,92,255,0); } }
.hero.is-act-2 .label__ring{ background:var(--white); box-shadow:0 0 0 0 rgba(255,255,255,.55); animation-name:ringLight; }
@keyframes ringLight{ 70%{ box-shadow:0 0 0 9px rgba(255,255,255,0); } 100%{ box-shadow:0 0 0 0 rgba(255,255,255,0); } }
.hero.is-act-3 .label__ring{ background:var(--blue); box-shadow:0 0 0 0 rgba(30,49,164,.5); animation-name:ringDark; }
@keyframes ringDark{ 70%{ box-shadow:0 0 0 9px rgba(30,49,164,0); } 100%{ box-shadow:0 0 0 0 rgba(30,49,164,0); } }
/* El dato rotativo es el valor de la etiqueta, asi que pesa como .label__v */
.label--live .transit__item{ font-weight:700; color:var(--hero-fg); letter-spacing:-.005em; }

/* ---------- Glass card: SOLO sobre fondos azul/grafito ---------- */
.glass{
  background:var(--glass);
  border:1px solid var(--glass-line);
  border-radius:var(--r-lg);
  backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.15), 0 24px 48px -28px rgba(0,0,0,.6);
}
/* Card sobre blanco: sin glass, borde fino + sombra suave */
.card{
  background:var(--white);
  border:1px solid var(--line);
  border-radius:var(--r-lg);
  box-shadow:var(--shadow-soft);
}

/* ---------- Orbs atmosféricos ---------- */
.orb{
  position:absolute; border-radius:50%; pointer-events:none; z-index:0;
  background:var(--grad-atmos);
  filter:blur(70px); opacity:.20;
  will-change:transform;
}
.orb--hero{ width:min(62vw,640px); aspect-ratio:1; opacity:.28; }

/* ==========================================================================
   CORTE DE MARCA (.seam-cut)
   No es un chevron genérico: es el perfil del alero azul del logo de
   Maquimaderas, extraído por pixel del PNG oficial. Hombros planos hasta el
   10,55% y desde el 89,45%, ápice al 49,88%.
   Se rellena con el color de la SECCIÓN SIGUIENTE, así el corte "muerde" hacia
   arriba igual que el tejado del logo.
   Uso: solo en transiciones estratégicas, no en cada sección.
   ========================================================================== */
.has-seam{ position:relative; }
.seam-cut{
  position:absolute; left:0; right:0; bottom:-1px;
  height:clamp(34px,4.4vw,66px);
  z-index:3; pointer-events:none;
}
.seam-cut svg{ width:100%; height:100%; display:block; }

/* ==========================================================================
   NAVBAR
   ========================================================================== */
/* ANTES: cápsula flotante de 58px con vidrio, hairline, sombra y un botón
   amarillo a la derecha. George (26/09/2026) la vio pesada y pidió algo más
   minimal, tipo Apple.

   AHORA: barra a ancho completo, baja, sin caja. Dos estados:
     · Arriba del todo, sobre el hero: SIN fondo. Solo los enlaces flotando en
       blanco sobre el azul. Es el momento en que se juzga la página y es donde
       menos tiene que haber.
     · Al bajar: fondo esmerilado claro y texto grafito, para que se lea sobre
       el contenido blanco.
   El CTA de WhatsApp dejó de ser botón amarillo y pasó a ser un enlace más. El
   botón flotante de la esquina sigue ahí, que es el que convierte de verdad. */
.nav{
  position:fixed; inset:0 0 auto 0; z-index:60;
  display:flex; align-items:center; justify-content:center;
  pointer-events:none;
  height:var(--nav-h);
}
.nav__inner{
  pointer-events:auto;
  /* Posicionado y por encima del cristal. `.nav::before` está posicionado y el
     contenido no lo estaba, así que el cristal se pintaba ENCIMA de los enlaces
     y del logo y la barra parecía vacía al bajar. */
  position:relative; z-index:1;
  width:min(100% - var(--gutter) * 2, var(--maxw));
  height:100%; padding:0;
  display:flex; align-items:center; gap:clamp(18px,3vw,38px);
  /* Sin caja: ni fondo, ni borde, ni sombra, ni radio. */
  background:none; border:0; box-shadow:none; border-radius:0;
}
/* Barra BLANCA SIEMPRE y sin cambiar de estado al bajar (George, 26/09/2026).
   Se probó transparente sobre el hero y cambiando a claro al hacer scroll: se
   veía más ligero, pero la barra "vivía" y él la quiere quieta. Una barra que
   no cambia es la de Apple, y es la que no distrae.
   Queda fija arriba: acompaña el scroll pero no se transforma. */
.nav::before{
  content:""; position:absolute; inset:0; pointer-events:none;
  /* BLANCO OPACO, sin transparencia ni desenfoque. El vidrio esmerilado dejaba
     pasar el color de lo que hubiera detrás, así que la barra cambiaba de tono
     al pasar sobre el azul, sobre el amarillo o sobre el blanco. Una barra que
     se tiñe no se lee como barra, se lee como un velo. Opaca es siempre la
     misma y el logo siempre se ve igual.
     De paso se va el `backdrop-filter`, que es de lo más caro que hay de pintar
     en cada fotograma de scroll. */
  background:#FFFFFF;
  border-bottom:1px solid rgba(11,13,18,.09);
}
/* `.is-stuck` sigue poniéndose desde main.js, pero ya no cambia nada de la
   barra. Se deja el gancho por si algún día hace falta. */

/* --- Un solo juego de colores, para los dos tramos --- */
/* El isotipo es ancho y bajo (876x296), así que su altura engaña: a 19px se veía
   diminuto aunque midiera 56px de ancho. A 26px ocupa unos 77px y tiene el peso
   de una marca, sin tocar el borde de una barra de 52px. */

.nav__links a,
.nav__cta{
  font-size:13.5px; font-weight:400; letter-spacing:-.005em;
  color:rgba(11,13,18,.78);
  padding:6px 0; border-radius:0;
  background:none; border:0; box-shadow:none;
  transition:color .2s ease;
}
.nav__links a:hover,
.nav__cta:hover{ color:var(--blue); background:none; }
/* La marca escrita, no el isotipo. A 26px el isotipo era una mancha que no se
   leía; el nombre en la tipografía de display ocupa lo mismo y se entiende de
   un golpe. En mayúsculas, como manda la regla de marca para esta tipografía. */
.nav__marca{
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(17px,1.5vw,20px); line-height:1;
  letter-spacing:-.015em; color:var(--graphite);
  white-space:nowrap;
}

/* Los enlaces se ven en TODOS los anchos. Antes se ocultaban por debajo de
   1000px porque quedaba el botón de WhatsApp; sin él, la barra se habría
   quedado solo con el logo y el sitio sin navegación en celular, que es de
   donde llega casi todo el tráfico.
   En pantallas estrechas la fila se desplaza en horizontal: sin menú
   hamburguesa, sin JS y sin romper la altura de la barra. Si algún día se
   quiere el menú desplegable de verdad, este es el sitio. */
.nav__links{
  display:flex; margin-left:auto; gap:clamp(16px,2.4vw,34px); align-items:center;
  min-width:0; overflow-x:auto; overflow-y:hidden;
  scrollbar-width:none; -ms-overflow-style:none;
  -webkit-overflow-scrolling:touch;
  /* El fundido va SOLO en el borde derecho, que es donde se corta la fila. Con
     fundido también a la izquierda, el primer enlace salía medio borrado
     pegado al isotipo aunque no hubiera nada que desplazar. */
  mask-image:linear-gradient(90deg, #000 0, #000 calc(100% - 22px), transparent 100%);
}
.nav__links::-webkit-scrollbar{ display:none; }
.nav__links a{ white-space:nowrap; }
/* El CTA es un enlace más, al final de la fila. Un icono pequeño lo identifica
   sin necesidad de caja de color. */
.nav__cta{ margin-left:auto; display:inline-flex; align-items:center; gap:7px; }
.nav__cta .ic{ width:15px; height:15px; }
@media (min-width:1000px){
  /* Con sitio de sobra no hace falta ni desplazamiento ni fundido. */
  .nav__links{ overflow:visible; mask-image:none; }
}

/* ==========================================================================
   2. BENEFICIOS (dark)
   ========================================================================== */
/* Sin tope en `ch`: esa unidad está calibrada para párrafos y estrangulaba el
   titular de 52px, que se partía en tres líneas cortas con media pantalla
   vacía al lado. El ancho de lectura lo controla .lead por su cuenta. */
.benefits__head{ display:grid; gap:16px; max-width:min(100%,980px); margin-bottom:clamp(36px,5vw,56px); }
.benefits__grid{ display:grid; gap:16px; grid-template-columns:1fr; }
@media (min-width:860px){ .benefits__grid{ grid-template-columns:repeat(3,1fr); } }
.bcard{ padding:28px 24px 26px; display:grid; gap:14px; align-content:start; will-change:transform,opacity; }
.bcard h3{ font-size:clamp(19px,2.2vw,23px); }
.bcard p{ font-size:15px; color:rgba(255,255,255,.72); }
.bcard__stat{
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.04em;
  color:var(--yellow); border-top:1px solid rgba(255,255,255,.14); padding-top:12px; margin-top:2px;
}

/* ==========================================================================
   3. LÍNEAS DE PRODUCTO (pinned + scroll horizontal)
   ========================================================================== */
.lines{ position:relative; overflow:hidden; background:var(--paper); }
.lines__ghost{
  position:absolute; top:50%; left:50%;
  transform:translate(-50%,-50%); /* GSAP anima xPercent/yPercent sobre esto */
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(120px,26vw,340px); line-height:.8; letter-spacing:-.03em;
  color:transparent; -webkit-text-stroke:1px rgba(30,49,164,.12);
  white-space:nowrap; pointer-events:none; user-select:none; z-index:0;
  will-change:transform;
}
.lines__head{ position:relative; z-index:2; display:grid; gap:14px; max-width:min(100%,900px); }
/* ---------- Fichas de línea ----------
   Estructura de ficha técnica, no de tarjeta de blog: índice, nombre, función,
   descripción y una fila de datos con la etiqueta encima del valor. La
   jerarquía la dan el contraste y las reglas finas, no subir cuerpos de letra.
   --------------------------------------------------------------------------- */
.cats{
  position:relative; z-index:2;
  margin-top:clamp(28px,4vw,44px);
  display:grid; gap:clamp(14px,2vw,22px); grid-template-columns:1fr;
}
@media (min-width:820px){ .cats{ grid-template-columns:1fr 1fr; } }
.cat{
  min-width:0;
  display:grid; grid-template-rows:auto 1fr; overflow:hidden;
  border-radius:var(--r-lg); border:1px solid var(--line);
  background:var(--white);
  transition:transform .4s cubic-bezier(.2,.8,.3,1), box-shadow .4s ease, border-color .4s ease;
}
.cat:hover{ transform:translateY(-5px); box-shadow:var(--shadow-lift); border-color:var(--line-strong); }
.cat__shot{ position:relative; margin:0; aspect-ratio:16/10; overflow:hidden; background:var(--paper); }
.cat__shot img{
  width:100%; height:100%; object-fit:cover; display:block;
  /* El acercamiento en hover es lo que hace que la tarjeta se sienta un objeto
     y no un enlace con foto. */
  transition:transform .7s cubic-bezier(.2,.8,.3,1);
}
.cat:hover .cat__shot img{ transform:scale(1.05); }

.cat__body{
  display:grid; gap:clamp(16px,2vw,22px); align-content:start;
  padding:clamp(22px,2.8vw,32px);
}
/* Cabecera: el índice pequeño en mono al lado del nombre grande. El contraste
   entre los dos es la mitad del carácter de la ficha. */
.cat__head{ display:grid; grid-template-columns:auto 1fr; gap:14px; align-items:start; }
.cat__idx{
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.1em;
  color:var(--slate); padding-top:.5em;
}
.cat__name{
  font-family:var(--f-display); text-transform:uppercase; margin:0;
  font-size:clamp(30px,3.8vw,46px); line-height:.9; letter-spacing:-.025em;
}
.cat--urus .cat__name{ color:var(--graphite); }
.cat--titan .cat__name{ color:var(--blue); }
.cat__fn{
  margin:6px 0 0; font-family:var(--f-body); font-weight:700; font-size:13px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--slate);
}
.cat__what{
  margin:0; font-size:15.5px; line-height:1.68; color:var(--slate);
  max-width:44ch;
  padding-top:clamp(14px,1.8vw,18px); border-top:1px solid var(--line);
}
/* Fila de datos: etiqueta encima, valor debajo. Leerlo cuesta menos que una
   línea corrida con puntos medios, y se ve como una ficha de producto. */
.cat__data{
  margin:0; display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(12px,1.6vw,18px) clamp(16px,2.4vw,28px);
  padding-top:clamp(14px,1.8vw,18px); border-top:1px solid var(--line);
}
@media (min-width:620px){ .cat__data{ grid-template-columns:repeat(3,minmax(0,1fr)); } }
.cat__data > div{ display:grid; gap:4px; min-width:0; }
.cat__data dt{
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.05em;
  line-height:1.2; text-transform:uppercase; color:var(--slate);
}
.cat__data dd{
  margin:0; font-family:var(--f-display); font-size:clamp(15px,1.7vw,19px);
  line-height:1.15; letter-spacing:-.005em; color:var(--graphite);
  text-transform:uppercase;
}
.cat__go{
  display:inline-flex; align-items:center; gap:8px;
  font-weight:700; font-size:15px; color:var(--blue);
  padding-top:clamp(4px,1vw,8px);
}
.cat__go svg{ transition:transform .35s cubic-bezier(.2,.8,.3,1); }
.cat:hover .cat__go svg{ transform:translateX(5px); }

/* ---------- Rejilla de modelos ---------- */
.models__head{
  position:relative; z-index:2;
  margin-top:clamp(40px,5.5vw,68px); padding-bottom:14px;
  border-bottom:1px solid var(--line);
  display:flex; flex-wrap:wrap; gap:12px 20px; align-items:baseline; justify-content:space-between;
}
.models__all{
  padding-block:10px;
  display:inline-flex; align-items:center; gap:7px;
  font-weight:700; font-size:14.5px; color:var(--blue); white-space:nowrap;
}
.models__all svg{ transition:transform .28s cubic-bezier(.2,.8,.3,1); }
.models__all:hover svg{ transform:translateX(3px); }

.models{
  position:relative; z-index:2;
  margin-top:clamp(18px,2.4vw,26px);
  display:grid; gap:clamp(12px,1.6vw,18px);
  /* minmax(0,1fr) y no 1fr: `1fr` es minmax(auto,1fr), así que el precio, que
     no parte de línea, imponía su ancho mínimo y sacaba la rejilla 13px fuera
     de la pantalla en iPhone. */
  grid-template-columns:repeat(2,minmax(0,1fr));
}
@media (min-width:900px){ .models{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
.model{
  /* Los items de una rejilla también traen min-width:auto: sin esto la tarjeta
     se niega a encoger por debajo de su contenido y se sale de su celda, aunque
     la columna esté bien calculada. */
  min-width:0;
  /* Y la columna interna también: si no, el hijo más ancho (la etiqueta, que no
     parte de línea) se sale de la tarjeta aunque la tarjeta mida lo correcto. */
  display:grid; grid-template-rows:auto 1fr; grid-template-columns:minmax(0,1fr);
  overflow:hidden;
  border-radius:var(--r-md); border:1px solid var(--line); background:var(--white);
  transition:transform .26s cubic-bezier(.2,.8,.3,1), box-shadow .3s ease, border-color .3s ease;
}
.model:hover{ transform:translateY(-3px); box-shadow:var(--shadow-soft); border-color:var(--line-strong); }
/* El destacado se marca con el amarillo de marca en el borde, no con un tamaño
   distinto: si la tarjeta creciera rompería la rejilla. */
.model--hot{ border-color:var(--yellow); box-shadow:0 0 0 1px var(--yellow); }
.model__shot{
  position:relative; margin:0; aspect-ratio:4/3; overflow:hidden;
  background:var(--paper); display:grid; place-items:center;
}
.model__shot img{ width:100%; height:100%; object-fit:cover; display:block; }
/* Los recortes llevan fondo transparente: se muestran completos y con aire, no
   recortados a la caja como una foto. */
/* Tratamiento de recorte: fondo claro y la máquina completa con aire, no
   recortada a la caja como una foto de ambiente. Se separó de `--hot` (que es
   solo el borde amarillo de "top ventas") cuando llegaron las fotos reales de
   George: ser recorte y ser top ventas son dos cosas distintas. */
.model--hot .model__shot,
.model--cut .model__shot{ background:linear-gradient(160deg,#EEF2FF,#FFFFFF); }
.model--hot .model__shot img,
.model--cut .model__shot img{ object-fit:contain; padding:12px; }
/* Lo mismo en la ficha de línea. */
.cat__shot--cut{ background:linear-gradient(160deg,#EEF2FF,#FFFFFF); }
.cat__shot--cut img{ object-fit:contain; padding:clamp(14px,2vw,26px); }
.model__body{ display:grid; gap:7px; align-content:start; padding:clamp(13px,1.5vw,17px); }
/* En celular la etiqueta era el elemento más ancho de la tarjeta y la empujaba
   fuera. Se le permite partir y reducir el espaciado. */
.model__tag{ justify-self:start; max-width:100%; white-space:normal; }
@media (max-width:520px){ .model__tag{ letter-spacing:.04em; padding:5px 9px; } }
.model__name{
  font-family:var(--f-display); text-transform:uppercase; margin:2px 0 0;
  font-size:clamp(18px,2vw,23px); line-height:1; letter-spacing:-.015em; color:var(--graphite);
}
.model__spec{ margin:0; font-size:14px; line-height:1.62; color:var(--slate); }
.model__price{
  margin:6px 0 4px; font-family:var(--f-display); font-size:clamp(17px,1.9vw,21px);
  letter-spacing:-.01em; color:var(--blue);
 text-transform:uppercase; }
.model .btn{ justify-self:start; }

/* ==========================================================================
   4. AUTORIDAD  (números grandes, ref. 4)
   ========================================================================== */
.authority{ background:var(--paper); }
/* Los números de trayectoria ya no son tarjetas blancas con sombra dentro de un
   contenedor centrado: son cuatro paneles de la retícula a sangre. Todo su
   estilo vive ahora en el bloque RETÍCULA DE PANELES, al final de la hoja
   (`.dato`). Aquí no queda nada. */

/* ==========================================================================
   5. PAQUETES (scroll horizontal + rotación 3D que se corrige)
   ========================================================================== */
/* El carrusel horizontal de tarjetas de vidrio se retiró: los tres paquetes son
   ahora tres paneles visibles a la vez. `.pack`, `.slots` y `.slot` se
   redefinen enteros en el bloque RETÍCULA DE PANELES. El fondo de la sección lo
   pone la SECUENCIA DE COLOR, más abajo. */

/* ==========================================================================
   6. GARANTÍAS Y SERVICIO
   ========================================================================== */
.scard__ic{ width:42px; height:42px; border-radius:12px; display:grid; place-items:center; background:rgba(30,49,164,.08); border:1px solid var(--line); color:var(--blue); }

/* La ubicación pasó a dos paneles de la retícula (`.mapa__info`, `.mapa__frame`).
   El marco redondeado con sombra ya no existe. */

/* Las dos bodegas. Numeradas porque son dos direcciones distintas que hay que
   distinguir de un vistazo, no por adorno. */
.sedes{ list-style:none; margin:0; padding:0; display:grid; gap:8px; }
.sedes li{
  display:flex; align-items:baseline; gap:10px;
  font-size:16px; font-weight:600; color:var(--graphite);
}
.sedes__n{
  font-family:var(--f-mono); font-size:14px; font-weight:500;
  color:var(--blue); letter-spacing:.04em; flex:none;
}
/* ==========================================================================
   DESPUÉS DE LA VENTA — secuencia numerada
   Lo que pasa, en el orden en que pasa. Cada paso con su dato duro a la
   derecha. El peso lo da la estructura, no un icono decorativo: por eso el
   número manda y el icono es secundario.
   ========================================================================== */
/* La secuencia dejó de ser una lista de cinco filas con la cabecera pegajosa al
   lado: son cinco paneles en fila, uno por paso. `.steps` y `.step*` se
   redefinen en el bloque RETÍCULA DE PANELES. */

/* ==========================================================================
   7. CIERRE
   ========================================================================== */
.close{ position:relative; }
.close__actions{ display:flex; flex-wrap:wrap; gap:12px; justify-content:center; }
.close__micro{ font-family:var(--f-mono); font-weight:500; font-size:14px; color:var(--slate); }

/* Footer */
/* ---------- Pie claro ----------
   El cierre azul es el último golpe de color de la página; el pie se aparta para
   no competir con él. Antes era un bloque grafito con el alero encima y diez
   enlaces en una fila: pesaba más que la sección que debía rematar. */
.foot{
  background:var(--paper); color:var(--slate);
  /* Sin borde recto arriba: la costura con el cierre amarillo la hace el alero
     de `.cut-top`, y un filete recto por encima lo delataría. */
  padding-block:clamp(40px,5vw,64px) clamp(20px,2.4vw,28px);
}
.foot__inner{ display:grid; gap:clamp(30px,4vw,56px); grid-template-columns:1fr; }
@media (min-width:900px){ .foot__inner{ grid-template-columns:minmax(0,.9fr) minmax(0,1.3fr); } }

.foot__brand{ display:grid; gap:14px; align-content:start; justify-items:start; }
/* Sobre fondo claro el logo va tal cual, sin placa: la placa blanca solo hacía
   falta cuando el pie era oscuro. */
.foot__logo{ height:38px; width:auto; display:block; }
.foot__claim{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(15px,1.8vw,19px); letter-spacing:.01em; line-height:1.15;
  color:var(--graphite);
}
.foot__addr{ margin:0; font-size:14px; line-height:1.65; color:var(--slate); }

/* Enlaces agrupados por para qué sirven. Diez en una fila no se leen; en cuatro
   columnas con título se escanean de un vistazo. */
.foot__cols{ display:grid; gap:clamp(22px,3vw,34px); grid-template-columns:repeat(2,minmax(0,1fr)); }
@media (min-width:640px){ .foot__cols{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
.foot__col{ display:grid; gap:2px; align-content:start; min-width:0; }
.foot__t{
  margin:0 0 8px; font-family:var(--f-body); font-weight:700; font-size:13px;
  letter-spacing:.12em; text-transform:uppercase; color:var(--graphite);
}
.foot__col a{
  font-size:15px; color:var(--slate); padding-block:8px;
  transition:color .2s ease;
}
.foot__col a:hover{ color:var(--blue); }

.foot__base{
  margin-top:clamp(30px,4vw,48px); padding-top:clamp(16px,2vw,22px);
  border-top:1px solid var(--line);
  display:grid; gap:4px;
}
.foot__base p{ margin:0; font-size:13px; color:var(--slate); opacity:.85; }

/* ---------- CTA flotante de WhatsApp ---------- */
/* Botón flotante: solo ícono. El ícono es el único protagonista, así que va
   grande y el botón es un círculo limpio. */
.wa-float{
  position:fixed; z-index:70; right:20px; bottom:20px;
  width:66px; height:66px; padding:0; border-radius:50%;
  display:grid; place-items:center;
  background:var(--yellow); color:var(--graphite);
  box-shadow:0 18px 38px -12px rgba(11,13,18,.5);
  /* Visible siempre. Antes arrancaba escondido abajo y lo sacaba el JS al
     pasar medio hero; desde que no hay CTA en la barra, este es el único canal
     permanente y no puede depender de que el JS cargue. */
  transform:none; opacity:1;
  transition:transform .35s cubic-bezier(.2,.8,.3,1), opacity .3s ease, background-color .2s ease;
  will-change:transform;
}
.wa-float svg{ width:34px; height:34px; position:relative; z-index:2; }

/* ==========================================================================
   EL BOTÓN LLAMA  ·  halo fijo y dos ondas  (29/09/2026)

   Es el único canal de contacto permanente de la página y estaba ahí quieto,
   esperando a que alguien se fijara. Ahora late.

   DOS CAPAS CON PAPELES DISTINTOS:
     HALO   un resplandor amarillo fijo alrededor. No se anima: separa el botón
            del fondo (que a veces es azul, a veces casi negro) y lo sostiene
            cuando las ondas están apagadas. Va en `box-shadow`, junto a la
            sombra proyectada que ya tenía.
     ONDAS  dos aros que salen del botón y se desvanecen, uno a mitad del ciclo
            del otro. Dos y no tres: con tres el botón parece un radar y el ojo
            deja de leer el icono.

   SOLO SE ANIMAN `transform` Y `opacity`. Es la única razón por la que esto
   puede latir eternamente sin costar batería: las dos se resuelven en la GPU
   sin volver a pintar nada. Animar el `box-shadow`, que es lo que suele salir
   al buscar «botón con pulso», obliga al navegador a repintar en cada
   fotograma un elemento que está SIEMPRE en pantalla.

   Los aros son pseudoelementos y no marcado nuevo a propósito: así el botón
   flotante del marketplace hereda el efecto sin tener que regenerar las trece
   páginas.

   `prefers-reduced-motion` ya está cubierto por la regla global que corta
   cualquier animación, unas líneas más abajo.
   ========================================================================== */
.wa-float{
  box-shadow:
    0 18px 38px -12px rgba(11,13,18,.5),
    0 0 0 8px rgba(255,198,41,.16),
    0 0 26px 2px rgba(255,198,41,.28);
}
.wa-float::before,
.wa-float::after{
  content:""; position:absolute; inset:0; z-index:1;
  border-radius:50%;
  border:2px solid var(--yellow);
  pointer-events:none;
  transform-origin:50% 50%;
  animation:waOnda 3s cubic-bezier(.2,.62,.3,1) infinite;
}
/* El desfase es la mitad del ciclo exacta: un aro sale siempre cuando el otro
   va por la mitad, así el ritmo es constante y no a rachas. */
.wa-float::after{ animation-delay:1.5s; }

@keyframes waOnda{
  0%   { transform:scale(1);    opacity:.6; }
  /* Se apaga al 62% y no al final: un aro que llega al borde del recorrido
     todavía visible se ve como un aro que se corta, no como uno que se va. */
  62%  { opacity:0; }
  100% { transform:scale(1.95); opacity:0; }
}
/* Al pasar el ratón las ondas se paran. Si alguien ya está apuntando al botón,
   el efecto ya cumplió su trabajo y lo único que hace es estorbar la lectura
   del icono. */
.wa-float:hover::before,
.wa-float:hover::after{ animation-play-state:paused; opacity:0; }
.wa-float.is-in{ transform:translateY(0); opacity:1; }
.wa-float:hover{ background:#FFD24D; transform:translateY(0) scale(1.06); }
@media (max-width:520px){ .wa-float{ right:14px; bottom:14px; width:60px; height:60px; } .wa-float svg{ width:31px; height:31px; } }

/* ---------- Estados iniciales de animación (JS los limpia) ---------- */
/* ESTADOS DE PARTIDA DEL SISTEMA DE MOVIMIENTO.
   Solo `opacity` y `translateY`, nunca `scale`. El `scale(.965)` que llevaba
   `[data-fit]` se quitó: una pieza que además de subir crece se nota como
   efecto, y un efecto que se nota le está robando atención a la máquina.
   Recorridos cortos, 20px el texto y 32px la pieza. Un recorrido largo
   (60-80px) es el tic más reconocible de plantilla: se ve barato porque la
   pieza «viaja» en vez de asentarse.
   Van bajo `.anim-ready`, que solo se pone si el módulo de animación arrancó:
   si el JS falla, la página se lee entera. */
.anim-ready [data-rise]{ opacity:0; transform:translateY(20px); }
.anim-ready [data-fit]{ opacity:0; transform:translateY(32px); }
.anim-ready [data-hero-in]{ opacity:0; transform:translateY(20px); }

/* ==========================================================================
   ACCESIBILIDAD — prefers-reduced-motion
   Misma jerarquía y contenido, cero movimiento.
   ========================================================================== */
@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior:auto; }
  *,*::before,*::after{
    animation-duration:.001ms !important; animation-iteration-count:1 !important;
    transition-duration:.001ms !important; scroll-behavior:auto !important;
  }
  /* Red de seguridad: si algo marcó .anim-ready, se neutraliza por completo. */
  .anim-ready [data-rise], .anim-ready [data-fit], .anim-ready [data-hero-in]{
    opacity:1 !important; transform:none !important;
  }
  .anim-ready .kt__i{ transform:none !important; }
  .wa-float{ transform:none; opacity:1; }
  .transit__track{ height:auto; }
  .transit__item + .transit__item{ display:none; }
}

/* Focus visible consistente */
:focus-visible{ outline:3px solid var(--blue-electric); outline-offset:3px; border-radius:6px; }

/* ==========================================================================
   RIELES HORIZONTALES
   Corte en 980px a propósito: es el mismo punto donde el hero pasa a dos
   columnas. Si los breakpoints no coinciden queda una franja (900–979px) con
   el hero en una sola columna pero en modo desktop, demasiado alto para
   pinnearlo y sin la banda de continuación.
   Desktop (>=980px): sección pinneada, el track se mueve atado al scroll (GSAP).
   Móvil (<980px): swipe nativo con scroll-snap. Es mejor UX en celular que
   secuestrar el scroll vertical, y es la degradación pedida en la regla 7.
   ========================================================================== */
.lines__viewport{
  overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
  overscroll-behavior-x:contain;
}
.lines__viewport::-webkit-scrollbar{ display:none; }
.lcard{ scroll-snap-align:center; }

@media (min-width:980px){
  .anim-ready .lines__viewport{ overflow:hidden; scroll-snap-type:none; }

  /* Cards más anchas en desktop: si no, las 3 caben en pantalla y el riel
     horizontal recorrería 100px, que se lee como un glitch y no como efecto. */
  .lcard{ flex:0 0 clamp(400px,36vw,520px); }
  /* Aquí vivía la compresión de #lineas para que la sección pinneada cupiera
     entera en el viewport. El pin se retiró hace tiempo y las clases que
     tocaba (.lcard, .lines__viewport, .rail-hint) ya no existen en esa
     sección; lo único que seguía haciendo era dejarle 46px de padding abajo,
     que descuadraba la separación de la banda. Fuera. */
}

/* En celular los rieles se deslizan con el dedo: hay que decirlo.
   La barra de progreso solo aplica al modo scroll-linked de desktop. */
.rail-hint{ display:flex; }
.rail-hint__arrow{ margin-left:7px; display:inline-block; animation:nudge 1.8s ease-in-out infinite; }
@keyframes nudge{ 0%,100%{ transform:translateX(0); } 50%{ transform:translateX(5px); } }
@media (max-width:979px){ .rail-hint .rail-bar{ display:none; } }
@media (min-width:980px){
  .rail-hint__arrow{ display:none; }
  .rail-hint{ display:none; }
  .anim-ready .rail-hint{ display:flex; }
}

/* Trayectoria ya no es «copy + imagen lado a lado» dentro de un contenedor
   centrado: es una retícula de cuatro columnas a sangre. Ver `.pgrid--tray`. */

/* Parallax interno de la placa: el arte se mueve dentro del marco */
.shot__art{ will-change:transform; }

/* ==========================================================================
   .shot — PLACA DE IMAGEN
   Marco con la proporción que ocupa la foto. Hoy lleva material provisional
   bajado del Facebook del cliente; cuando llegue el definitivo solo se cambia
   el `src` y se borran .shot__marks y .shot__tag.
   OJO: este bloque va ANTES de "BLOQUE FULL-BLEED", porque .shot--full
   sobreescribe estas reglas base y con la misma especificidad gana la última.
   ========================================================================== */
.shot{
  position:relative; margin:0; overflow:hidden;
  /* Radio interior: esta figura casi siempre vive dentro de una tarjeta de
     24px, y llevar el mismo radio que ella era justo lo que se veía mal. */
  border-radius:var(--r-in-lg);
  aspect-ratio:4 / 3;
  display:grid; place-items:center;
  /* Degradado LINEAL, sin foco radial. Criterio de Juan (26/09/2026): todos los
     degradados del sitio van en dirección, no en foco. Un radial mete un punto
     de luz con su propio centro y, al haber varios en la misma pantalla, cada
     superficie parece iluminada desde un sitio distinto. */
  background:linear-gradient(155deg, #EDF1FF 0%, #E4EBFF 52%, #DCE4FF 100%);
  border:1px solid var(--line);
  isolation:isolate;
}
.shot:has(img.shot__art)::before{ display:none; }
.shot::before{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background-image:
    linear-gradient(to right, rgba(30,49,164,.055) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(30,49,164,.055) 1px, transparent 1px);
  background-size:34px 34px;
}
.shot__art{ position:relative; z-index:1; width:100%; height:100%; }
img.shot__art{ object-fit:cover; }


.shot__marks{ position:absolute; inset:14px; z-index:2; pointer-events:none; }
.shot__marks i{ position:absolute; width:16px; height:16px; border:1.5px solid rgba(255,255,255,.55); }
.shot__marks i:nth-child(1){ top:0; left:0; border-right:0; border-bottom:0; border-radius:4px 0 0 0; }
.shot__marks i:nth-child(2){ top:0; right:0; border-left:0; border-bottom:0; border-radius:0 4px 0 0; }
.shot__marks i:nth-child(3){ bottom:0; left:0; border-right:0; border-top:0; border-radius:0 0 0 4px; }
.shot__marks i:nth-child(4){ bottom:0; right:0; border-left:0; border-top:0; border-radius:0 0 4px 0; }

.shot__tag{
  position:absolute; z-index:3; left:12px; bottom:12px;
  display:inline-flex; align-items:center; gap:7px;
  padding:5px 10px; border-radius:999px;
  background:rgba(11,13,18,.62); border:1px solid rgba(255,255,255,.18);
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.06em;
  color:#fff; white-space:nowrap;
}
.shot__tag::before{ content:""; width:5px; height:5px; border-radius:50%; background:var(--yellow); flex:none; }

.shot--wide{ aspect-ratio:16 / 9; }
.shot--tall{ aspect-ratio:4 / 5; }

.shot--dark{ border-color:rgba(255,255,255,.18); box-shadow:inset 0 1px 0 rgba(255,255,255,.18); }

/* ==========================================================================
   GALERÍA — banda de imágenes entre secciones
   ========================================================================== */
.gallery{ position:relative; overflow:hidden; background:var(--paper); padding-block:clamp(56px,7vw,92px); }
.gallery__head{ display:flex; flex-wrap:wrap; gap:14px 24px; align-items:flex-end; justify-content:space-between; margin-bottom:clamp(24px,3vw,34px); }
.gallery__head h2{ max-width:16ch; }
/* Mosaico, no riel. Cuatro verticales y dos horizontales que ocupan dos
   columnas: la mezcla de proporciones es lo que evita que se lea como una
   plantilla de cuadrícula uniforme. */
.gallery__grid{
  margin-top:clamp(26px,3.4vw,40px);
  display:grid; gap:clamp(10px,1.4vw,16px);
  grid-template-columns:repeat(2,minmax(0,1fr));
}
@media (min-width:860px){ .gallery__grid{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
.gallery__item{
  min-width:0;
  position:relative; margin:0; overflow:hidden;
  border-radius:var(--r-md); background:var(--paper);
  aspect-ratio:3/4;
}
@media (min-width:860px){
  .gallery__item--wide{ grid-column:span 2; aspect-ratio:16/10; }
}
.gallery__item img{ width:100%; height:100%; object-fit:cover; display:block; }
/* El pie va dentro de la foto, sobre un velo: fuera de ella obligaba a dejar
   un carril de texto bajo cada placa y desalineaba las alturas. */
.gallery__item figcaption{
  position:absolute; left:0; right:0; bottom:0;
  display:flex; align-items:baseline; gap:9px;
  padding:26px 14px 12px;
  background:linear-gradient(to top, rgba(11,13,18,.80), rgba(11,13,18,0));
  color:#fff; font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.06em;
  text-transform:uppercase;
}
.gallery__n{ color:var(--yellow); flex:none; }
/* En la galería la etiqueta va arriba a la derecha, no abajo a la izquierda.
   OJO: hay que ANULAR `left` y `bottom` de la regla base. Si se dejan puestos,
   el elemento tiene los CUATRO lados fijados y deja de encogerse a su
   contenido: se estira hasta ocupar la placa entera. Con `border-radius:999px`
   y `backdrop-filter:blur(8px)` encima, eso pintaba un óvalo desenfocado gigante
   sobre cada foto de la galería. Se veía como un fallo de render y era esto. */
.gallery__item .shot__tag{ top:10px; right:10px; left:auto; bottom:auto; }

/* ==========================================================================
   BLOQUE FULL-BLEED — revelado cinematográfico
   La placa arranca recortada como una ventana y se abre a sangre con el
   scroll. Solo se anima `clip-path` y `transform`: nada de layout.
   ========================================================================== */
.reveal{ position:relative; height:100svh; min-height:520px; background:var(--paper); overflow:hidden; }
.reveal__frame{
  position:absolute; inset:0; overflow:hidden;
  will-change:clip-path;
}
/* Recorte inicial SOLO en modo animado. Sin JS o con reduced-motion la imagen
   se ve a sangre completa desde el principio, que es el estado final. */
.anim-ready .reveal__frame{ clip-path:inset(11% 9% round 28px); }
.shot--full{
  position:absolute; inset:0; aspect-ratio:auto;
  border-radius:0; border:0;
}
.shot--full::before{ background-size:52px 52px; }
.shot--full .shot__tag{ left:auto; right:18px; bottom:18px; }

.reveal__overlay{
  position:absolute; inset:0; z-index:4;
  display:grid; place-items:center; padding:var(--gutter);
  /* Velo lineal en vez de foco central. Al ir en dirección, el texto de arriba
     queda sobre la parte más opaca y la foto respira por abajo. */
  background:linear-gradient(180deg, rgba(255,255,255,.95) 0%, rgba(255,255,255,.82) 46%, rgba(255,255,255,.28) 78%, rgba(255,255,255,0) 100%);
}
/* Ancho en px, no en ch: Fugaz One es de caja muy ancha y `ch` lo estrangulaba
   a siete líneas. El salto de línea lo decide el <br> del markup. */
.reveal__inner{ display:grid; gap:18px; justify-items:center; text-align:center; width:min(100%,1020px); }
.reveal__inner h2{ font-size:clamp(26px,4.2vw,50px); max-width:none; }
.reveal__meta{ color:var(--blue); font-size:13px; letter-spacing:.1em; }

@media (max-width:979px){
  .anim-ready .reveal__frame{ clip-path:inset(7% 5% round 20px); }
  .reveal__inner{ width:min(100%,560px); gap:15px; }
  .reveal__inner h2{ font-size:clamp(22px,5.8vw,34px); }
}

/* ==========================================================================
   .bleed-rail — RIEL A SANGRE
   El riel vive FUERA del .wrap y ocupa todo el ancho de la pantalla: las
   tarjetas entran y salen por los bordes en vez de cortarse contra el margen
   del contenedor. El padding lateral es el que alinea la primera tarjeta con
   la columna de texto de la cabecera.
   ========================================================================== */
.bleed-rail{
  margin-inline:0;
  padding-inline:max(var(--gutter), calc((100% - var(--maxw)) / 2 + var(--gutter)));
}
.bleed-rail > *{ padding-right:0; }

/* ==========================================================================
   1. HERO — TRES ACTOS  (Home blanco → Titan azul → Urus amarillo)
   Todo se mueve con transform y opacity. El color de fondo NO se interpola:
   son tres capas apiladas que se cruzan, así los gradientes siguen funcionando.
   ========================================================================== */
.hero{
  position:relative; overflow:hidden;
  /* El acto 1 ya no es claro: sus tokens de texto son los de fondo oscuro. */
  /* Sin padding vertical: el panel de imagen llega arriba y abajo del hero.
     El texto se separa del navbar por su cuenta (.hero__copywrap). */
  padding:0;
  display:grid; align-items:stretch;
  /* Tokens que cambian por acto. Los define .is-act-N de abajo.
     Por defecto son los de fondo oscuro, porque el acto 1 ya abre en oscuro. */
  --hero-fg:var(--white);
  --hero-muted:rgba(255,255,255,.72);
  --hero-line:rgba(255,255,255,.20);
}
.hero.is-live{ min-height:100svh; }

/* Las capas de color del hero no se funden: SUBEN, y su borde superior es el
   alero del logo. El mismo perfil que ya corta las secciones, ahora en
   movimiento. Un fundido de opacidad lo hace cualquiera; esta transición solo
   la puede tener esta marca.

   La capa mide más que el hero y asoma por arriba, así que cuando termina de
   subir el vértice ya salió de pantalla y el color cubre del todo. Se anima
   `yPercent`, que se compone en GPU: el `clip-path` es fijo y no se recalcula
   en cada frame, que es lo que habría costado caro en celular. */
.hero__bg{
  position:absolute; left:0; right:0; top:-16%; height:116%;
  z-index:0; pointer-events:none;
  clip-path:polygon(
    0 var(--alero), 10.55% var(--alero), 49.88% 0,
    89.45% var(--alero), 100% var(--alero),
    100% 100%, 0 100%);
  --alero:9%;
  will-change:transform;
}
/* La capa blanca es el fondo de partida: ni sube ni se recorta. */
.hero__bg--1{ top:0; height:100%; clip-path:none; will-change:auto; }
/* FASE 1. Pasó por tres estados: blanco (sin impacto), azul casi negro
   (`--grad-contrast`, demasiado apagado para abrir) y este. George pidió abrir
   directamente con el azul claro de marca, el mismo del acto de Titán.
   Consecuencia buscada: la página entra ya comprometida con el color, y el
   único salto cromático grande queda reservado para el amarillo de Urus.
   Consecuencia a tener en cuenta: el paso del acto 1 al 2 ya no cambia de
   color, solo de contenido. Si alguna vez se quiere recuperar ese salto, basta
   con darle a `.hero__bg--1` una variante propia en vez de compartir fondo. */
/* Azul con profundidad: una base marino y dos focos de luz superpuestos, en
   vez de un degradado lineal plano de dos paradas. Da relieve y aguanta mucho
   mejor una foto encima. */
.hero__bg--1,
.hero__bg--2{
  /* Un solo degradado lineal en la dirección de toda la página (155deg). Antes
     eran dos focos radiales superpuestos sobre un lineal: daba relieve, pero
     también tres centros de luz distintos en la misma superficie. El relieve
     ahora lo dan las paradas del propio lineal. */
  background:linear-gradient(155deg, #16226E 0%, #1E31A4 38%, #2C45D6 72%, #1B2A8C 100%);
}
.hero__bg--1{ opacity:1; top:0; height:100%; clip-path:none; will-change:auto; }
.hero__bg--3{
  background:linear-gradient(155deg, #FFD24D 0%, #FFC629 46%, #F5B912 100%);
}
/* Para suavizar el amarillo (ver nota de marca en index.html) basta con:
   .hero__bg--3{ background:#FFF4D6; } */

.hero .orb{ z-index:1; }

/* ---------- Ghost typography: marca a contorno, sangrando por la izquierda ---
   Detalle de fondo, no elemento de lectura. Relleno transparente y trazo del
   color de primer plano del acto muy rebajado, para que se integre en el
   degradado en vez de mancharlo. Vive entre el fondo (z 0) y el escenario
   (z 2), y el riel de maquinas lo tapa cuando se cruzan. */
.hero__ghost{
  position:absolute; z-index:1; pointer-events:none; user-select:none;
  left:0;
  font-family:var(--f-display); text-transform:uppercase; white-space:nowrap;
  /* Mucho más grande que antes y sangrando por los dos lados a propósito.
     Ya no hay que preocuparse de que la palabra quepa entera: al moverse con
     el scroll, el corte se lee como recorrido y no como error de maquetación.
     El JS le da la posición horizontal, así que aquí no hay transform. */
  /* El tamano lo calcula el JS: cada palabra se ajusta al ancho REAL de la
     pantalla, de borde a borde. El clamp es solo el valor de arranque para el
     primer pintado y para cuando no hay JS. */
  font-size:var(--ghost-fs, clamp(48px,8.5vw,132px));
  letter-spacing:var(--ghost-ls, -.045em);
  line-height:.76;
  color:transparent; -webkit-text-stroke:1.5px var(--ghost-stroke, transparent);
  opacity:0; transition:opacity .55s ease;
  will-change:transform;
}
/* Dos líneas, arriba y abajo, cruzándose en direcciones opuestas. Una sola se
   leía como un adorno suelto; dos enmarcan la escena y el cruce delata que el
   movimiento está pensado. La de arriba va más rebajada para no competir con
   el titular. */
.hero__ghost--bottom{ bottom:clamp(10px,2.4vh,40px); }
/* Baja al hueco entre el titular y el carrusel. Arriba se cruzaba con el
   titular centrado y las dos cosas perdían: ahora hace de fondo de las
   máquinas, que es donde un fantasma tipográfico funciona. */
.hero__ghost--top{ top:46%; }
.hero__ghost--top{ opacity:0; }
.hero.is-act-2 .hero__ghost--top,
.hero.is-act-3 .hero__ghost--top{ opacity:.55; }

/* Solo en los actos de color. En blanco no hay contraste que aguante un trazo
   tan fino sin verse sucio. */
/* Mismo fondo que el acto 2, así que mismo trazo: sobre el azul claro el .13
   de antes se perdía. */
.hero.is-act-1 .hero__ghost{ --ghost-stroke:rgba(255,255,255,.16); opacity:1; }
.hero.is-act-2 .hero__ghost{ --ghost-stroke:rgba(255,255,255,.16); opacity:1; }
.hero.is-act-3 .hero__ghost{ --ghost-stroke:rgba(17,17,17,.11); opacity:1; }
/* Sin JS los tres actos quedan apilados: el fantasma no tiene acto al que
   pertenecer, asi que no se pinta. */
.hero:not(.is-live) .hero__ghost{ display:none; }
@media (prefers-reduced-motion:reduce){ .hero__ghost{ transition:none; } }
.hero__stage{ position:relative; z-index:2; width:100%; display:grid; gap:clamp(18px,3vw,34px); align-content:center; }
/* Desktop: el texto ocupa la izquierda y el riel vive en la mitad derecha, que
   antes quedaba vacía. Las máquinas pueden así verse mucho más grandes. */
@media (min-width:980px){
  .hero__stage{ grid-template-columns:1fr; align-content:center; }
  .hero__copywrap{ padding-top:var(--nav-h); max-width:min(52%, 660px); }
}

/* ---------- Bloques de texto por acto (apilados y cruzados) ---------- */
.hero__copywrap{ position:relative; }
/* Sin JS, o si el módulo del hero no arranca, .hero nunca recibe .is-live y los
   tres actos quedan apilados y legibles. Nunca una pantalla en blanco. */
.hero:not(.is-live) .hero__stage{ gap:40px; }
.hero:not(.is-live) .act{ margin-bottom:28px; }
.act{
  display:grid; gap:15px; justify-items:start;
  /* Ancho generoso a propósito: con una columna estrecha el titular se parte en
     cuatro líneas y el bloque de texto no cabe junto al riel. */
  /* Acompaña a `.hero__copywrap`: si esta se queda en 880 el ensanche de allá
     no sirve de nada, porque el tope pequeño es el que manda. */
  max-width:min(100%,940px);
  color:var(--hero-fg);
}
.hero.is-live .act{ position:absolute; inset:0 auto auto 0; width:100%; opacity:0; visibility:hidden; will-change:transform,opacity; }
/* El acto visible lo pone el CSS, no el JS. Antes lo escribía en línea el
   módulo del hero de tres actos, que ya no existe: la clase `is-live` va en el
   marcado y aquí se le devuelve la opacidad. */
.hero.is-live .act.is-on{ visibility:visible; opacity:1; }
/* Alto reservado para el texto. El acto va en posición absoluta, así que este
   valor es el que evita que el bloque se monte sobre el riel de máquinas. */
.hero.is-live .hero__copywrap{ min-height:clamp(290px,31vw,340px); }
.hero .h1{ font-size:clamp(28px,4vw,50px); }

.act .lead{ color:var(--hero-muted); max-width:52ch; }

/* Lema de marca. Se apoya en la tipografía de titulares pero muy pequeño, para
   que lea como firma y no compita con el h1 que tiene encima. El color sale de
   los tokens del acto, así que sobrevive al cambio a azul y a amarillo. */
.claim{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(13px,1.5vw,16px); letter-spacing:.02em; line-height:1.15;
  color:var(--hero-fg);
}
/* El subrayado es el amarillo de marca, no una raya decorativa: nace del ancho
   del texto y muere con él. */
.claim::after{
  content:""; display:block; width:100%; height:3px; margin-top:6px;
  background:var(--yellow); border-radius:2px;
}
.hero.is-act-3 .claim::after{ background:var(--graphite); }

.act h1, .act .act__title{ color:var(--hero-fg); }
.hero__badges{ display:flex; flex-wrap:wrap; gap:10px; align-items:center; justify-self:stretch; }

/* Carril del dato rotativo de preventa / en tránsito. La caja desapareció al
   pasar a etiqueta sin caja, pero el carril sigue igual: los ítems se vuelven
   absolutos por JS, así que TIENE que ser position:relative con alto propio o
   el texto se escapa. El ancho se lo pone el JS midiendo el ítem más largo. */
.transit__track{ position:relative; height:1.35em; overflow:hidden; flex:none; }
.transit__item{ display:block; white-space:nowrap; }
.act__cta{ display:flex; flex-wrap:wrap; gap:12px; padding-top:2px; }
.act__meta{ font-family:var(--f-mono); font-weight:500; font-size:14px; color:var(--hero-muted); }
.act__kicker{
  font-family:var(--f-body); font-weight:700; font-size:13px;
  letter-spacing:.16em; text-transform:uppercase; color:var(--hero-muted);
}
.act__title{
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(48px,8vw,112px); line-height:.86; letter-spacing:-.03em;
}
/* Sobre el fondo oscuro del acto 1 el degradado azul del acento no se leía.
   El amarillo de marca sí, y además adelanta el color del último acto. */
/* `:not(.kt__i)` NO ES UN ADORNO, ES LA CORRECCIÓN DE UN FALLO (30/09/2026).
   Esta regla es (0,2,1). Mientras la del barrido fue `.hero h1 .kt__i.accent`
   (0,3,1), le ganaba sin problema. Al generalizarla a `.kt__i.accent` bajó a
   (0,2,0) y esta pasó a ganarle: su `background:none` borraba el degradado y su
   `-webkit-text-fill-color:currentColor` devolvía la letra a amarillo macizo.
   Resultado: el hero se quedó SIN barrido y Trayectoria sí lo tenía. Juan:
   «¿por qué le quitaste el efecto al hero?».
   Esta regla sigue haciendo falta para un acento que NO sea cinético, así que
   en vez de subirle especificidad a la otra se le quita a esta el caso que no
   le toca. Y la lección, anotada: al generalizar un selector hay que mirar qué
   le ganaba antes por especificidad, porque lo que antes perdía ahora gana. */
.hero h1 .accent:not(.kt__i){ color:var(--yellow); background:none; -webkit-text-fill-color:currentColor; }

/* ==========================================================================
   TIPOGRAFÍA CINÉTICA DEL TITULAR  ·  motion graphics, 29/09/2026

   El titular entra por CORTINA: cada línea sube desde debajo de su propio
   renglón, tapada por una ventana, en vez de aparecer con un fundido. Es la
   diferencia entre «el texto se hizo visible» y «alguien lo puso ahí».

   EL DETALLE QUE HACE QUE FUNCIONE, y que rompe a quien no lo sabe: la tinta de
   Fugaz One NO cabe en su caja. Medido con `measureText`, las tildes suben
   0.231em por encima del borde superior. Una ventana con `overflow:hidden`
   ajustada a la caja le corta la tilde a MÁS y a CARPINTERÍA, y queda un
   titular decapitado. La ventana se agranda por arriba con `padding-top` y se
   devuelve el hueco con un `margin-top` negativo del mismo valor: recorta donde
   hay que recortar y el renglón no se mueve ni un píxel.

   ESTADO DE REPOSO = ESTADO FINAL. El CSS deja el titular entero y quieto; solo
   cuando el JS enciende `.anim-ready` se esconde para poder entrar. Así, sin JS
   o con movimiento reducido, se lee el titular y no un hueco.
   ========================================================================== */
.kt{ display:grid; justify-items:inherit; }
.kt__l{
  display:block; overflow:hidden;
  padding-top:.24em; margin-top:-.24em;
}
.kt__i{ display:block; will-change:transform; }
.anim-ready .kt__i{ transform:translateY(105%); }

/* EL BARRIDO DE COLOR.
   La segunda línea no aparece amarilla: se INUNDA de amarillo de izquierda a
   derecha, justo después de terminar de subir. Se hace con un degradado de
   corte duro recortado contra el texto (`background-clip:text`) y movido con
   `--barrido`, de 0 a 1. Ni una capa encima ni un elemento de más: es la propia
   letra la que cambia de color.
   El degradado va de amarillo a blanco y no al revés porque el reposo (barrido
   = 1) tiene que ser el titular ya amarillo. */
/* EL BARRIDO ES REUTILIZABLE, no exclusivo del hero.
   Esta regla estaba anclada a `.hero h1` y ahora la usan dos titulares: el del
   hero y el de Trayectoria. Lo único que cambia entre los dos es el color del
   que parte la letra antes de inundarse, así que eso sale a una variable
   (`--wipe-base`) y el resto es idéntico. Si mañana hace falta en un tercer
   sitio, basta con poner `.kt` y `.accent` en el marcado. */
.kt__i.accent{
  /* LA CAJA DEL FONDO TIENE QUE CUBRIR LA TINTA, o se pierde la tilde.
     `background-clip:text` solo pinta donde hay fondo, y el fondo llega hasta
     el borde de la caja: la tilde de CARPINTERÍA sobresale 0.231em por encima,
     se queda sin fondo y desaparece. Medido en pantalla: el titular salía
     «CARPINTERIA».
     Este `padding` agranda la caja del fondo y el `margin` negativo devuelve el
     hueco, así que la línea no se mueve. Es la misma compensación de tinta que
     ya llevan la ventana de la cortina y la banda de máquinas trabajando: en
     este sitio, cualquier cosa que recorte Fugaz One necesita este par. */
  padding-top:.24em; margin-top:-.24em;
  background-image:linear-gradient(90deg,
    var(--yellow) 0, var(--yellow) 50%,
    var(--wipe-base, #fff) 50%, var(--wipe-base, #fff) 100%);
  background-size:200% 100%;
  background-position:calc(100% - var(--barrido, 1) * 100%) 0;
  background-repeat:no-repeat;
  -webkit-background-clip:text; background-clip:text;
  -webkit-text-fill-color:transparent; color:transparent;
}
/* Red de seguridad: si el navegador no sabe recortar el fondo contra el texto,
   `background-clip:text` no aplica y la letra se quedaría transparente sobre un
   rectángulo de degradado. Esta consulta solo deja el efecto donde funciona. */
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  .kt__i.accent{
    background:none; color:var(--yellow); -webkit-text-fill-color:currentColor;
  }
}
/* El hero parte de su propio color de primer plano, que cambia por acto. */
.hero h1 .kt__i.accent{ --wipe-base:var(--hero-fg); }
.hero.is-act-3 h1 .accent:not(.kt__i){ color:var(--graphite); }

/* ---------- Riel de máquinas: una protagonista enorme + dos miniaturas ------
   Tratamiento editorial: la máquina protagonista es un panel de imagen que
   sangra hasta el borde derecho de la pantalla y se difumina por la izquierda
   contra el color de fondo del acto, sin marco ni tarjeta. Las otras dos
   quedan como miniaturas apiladas abajo a la derecha. Los papeles rotan en
   círculo con el scroll.
   Los tres estados se mueven con `transform` y transición CSS, nunca con
   width/height: no hay recálculo de layout. */
.reels{ position:relative; width:100%; min-height:clamp(380px,50vw,650px); }
.reel{ position:relative; width:100%; height:100%; }
.hero.is-live .reel{ position:absolute; inset:0; opacity:0; visibility:hidden; }
.hero.is-live .reel.is-on{ visibility:visible; }
.hero.is-live .reels{ height:clamp(380px,50vw,650px); }

.mach{
  position:absolute; inset:0;
  transform-origin:100% 100%;
  /* Más lento que antes (.6s) para acompañar el nuevo ritmo del hero: la
     máquina que crece y las que se van tienen tiempo de leerse. */
  transition:transform .95s cubic-bezier(.22,.75,.24,1), opacity .7s ease;
  will-change:transform,opacity;
}
.mach__art{
  position:relative; width:100%; height:100%; overflow:hidden;
  border-radius:0;
  transition:border-radius .6s cubic-bezier(.2,.8,.25,1), box-shadow .5s ease;
}
.mach__art img{ width:100%; height:100%; object-fit:cover; display:block; }

/* El filo izquierdo se funde con TRANSPARENCIA, no con un velo de color.
   Antes era un degradado hacia un azul plano, y como el fondo real es un
   degradado de varias capas el color no coincidía y se veía el parche.
   Enmascarando la propia imagen, el fondo verdadero se ve a través, sea cual
   sea: blanco, azul o amarillo. Cero coincidencia de color que mantener. */
.mach.is-hero .mach__art > img{
  /* Dos máscaras cruzadas: la foto se disuelve por la izquierda Y por abajo.
     Con solo el fundido horizontal el borde inferior quedaba recto y la imagen
     se leía "cortada" contra el fondo. */
  -webkit-mask-image:
    linear-gradient(90deg, transparent 0%, rgba(0,0,0,.12) 14%, rgba(0,0,0,.55) 34%, rgba(0,0,0,.9) 54%, #000 70%),
    linear-gradient(0deg,  transparent 0%, rgba(0,0,0,.55) 12%, #000 28%);
  -webkit-mask-composite:source-in;
          mask-image:
    linear-gradient(90deg, transparent 0%, rgba(0,0,0,.12) 14%, rgba(0,0,0,.55) 34%, rgba(0,0,0,.9) 54%, #000 70%),
    linear-gradient(0deg,  transparent 0%, rgba(0,0,0,.55) 12%, #000 28%);
          mask-composite:intersect;
}

/* --- Protagonista --- */
.mach.is-hero{ transform:none; opacity:1; z-index:2; }
.mach.is-hero .mach__art{ border-radius:0; }

/* --- Miniaturas ---
   Ocultas: el hero enseña UNA máquina y el scroll se gasta en girarla. Las dos
   pequeñas competían con ella y partían la escena en tres focos de atención.
   Se mantienen en el marcado por si se quiere recuperar el riel de tres. --- */
.mach.is-t1, .mach.is-t2{ display:none; }
.reels.is-trio .mach.is-t1,
.reels.is-trio .mach.is-t2{ display:block; z-index:4; opacity:.92; }
.mach.is-t1{ transform:translate(-26px,-172px) scale(.185); }
.mach.is-t2{ transform:translate(-26px,-26px) scale(.185); }
.mach.is-t1 .mach__art, .mach.is-t2 .mach__art{
  border-radius:76px;
  box-shadow:0 60px 90px -30px rgba(11,13,18,.55);
}
.mach.is-t1 .mach__tag, .mach.is-t2 .mach__tag{ opacity:0; }

/* Ficha de la protagonista, sobre la zona difuminada */
/* La ficha de la máquina va CENTRADA en vertical, no abajo: queda en paralelo
   con el bloque de texto de la izquierda. Se centra con flex y no con
   `transform`, porque el transform lo usa el estado de miniatura. */
.mach__meta{
  /* Desplazada hacia dentro del panel para que respire respecto al bloque de
     texto de la izquierda. El margen se queda dentro de la zona difuminada,
     así que el texto sigue leyéndose sobre el fondo y no sobre la foto. */
  position:absolute; left:clamp(36px,9vw,190px); top:0; bottom:0; z-index:3;
  width:min(calc(100% - clamp(36px,9vw,190px)),520px);
  display:flex; flex-direction:column; justify-content:center; align-items:flex-start;
  gap:10px; text-align:left;
  pointer-events:none; transition:opacity .4s ease, transform .4s ease;
}
.hero.is-live .mach.is-t1 .mach__meta,
.hero.is-live .mach.is-t2 .mach__meta{ opacity:0; transform:translateY(10px); }
.mach__name{
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(38px,5.8vw,86px); line-height:.88; letter-spacing:-.025em;
  color:var(--hero-fg);
}
/* Esta etiqueta va ENCIMA de la foto de la máquina, no sobre el fondo del acto.
   Antes heredaba --hero-muted y --hero-line, que son los colores del texto sobre
   el fondo, y sobre una foto clara quedaba gris sobre gris. Ahora se pinta sola:
   velo oscuro y texto blanco, que se lee sobre cualquier imagen. */
/* Etiqueta de categoría sobre foto. Antes era un bloque gris macizo con las dos
   palabras al mismo peso separadas por un punto: se leía como un chip genérico.
   Ahora las dos partes tienen jerarquía distinta y las separa una regla fina,
   que es lo que la hace parecer una placa de datos y no una pegatina.
   El relleno se mantiene porque va sobre foto y necesita fondo para leerse,
   pero mucho más discreto. */
.pill--state{
  display:inline-flex; align-items:stretch; gap:0; padding:0;
  background:rgba(11,13,18,.52); color:#fff;
  border:1px solid rgba(255,255,255,.16);
  border-radius:var(--r-in-md);
  font-size:13px; letter-spacing:.06em; overflow:hidden;
  backdrop-filter:blur(8px) saturate(1.2); -webkit-backdrop-filter:blur(8px) saturate(1.2);
}
.pill--state .pill__a,
.pill--state .pill__b{ display:inline-flex; align-items:center; padding:6px 11px; }
/* La categoría manda; la gama acompaña. */
.pill--state .pill__a{ font-weight:700; }
.pill--state .pill__b{
  font-family:var(--f-mono); font-weight:500; letter-spacing:.04em;
  color:rgba(255,255,255,.72);
  border-left:1px solid rgba(255,255,255,.18);
}
.mach__tag{
  position:absolute; right:12px; top:12px; z-index:3;
  padding:4px 9px; border-radius:6px;
  background:rgba(11,13,18,.55); color:#fff;
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.08em;
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
  transition:opacity .4s ease;
}

/* ---------- Colores por acto ---------- */
/* Acto 2 · fondo azul: texto blanco y los esquemas en línea blanca, si no el
   dibujo azul desaparece contra el fondo azul. */
.hero.is-act-2{ --hero-fg:#FFFFFF; --hero-muted:rgba(255,255,255,.75); --hero-line:rgba(255,255,255,.34); }
.hero.is-act-2 .act__title{ color:#fff; }

/* Acto 3 · fondo amarillo: todo en grafito. El CTA amarillo no puede ir sobre
   amarillo, por eso el acto 3 usa .btn--dark. */
.hero.is-act-3{ --hero-fg:var(--graphite); --hero-muted:rgba(11,13,18,.62); --hero-line:rgba(11,13,18,.22); }
.hero.is-act-3 .btn--ghost{
  border-color:rgba(11,13,18,.22); color:var(--graphite);
  background:rgba(255,255,255,.4);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6);
}
.hero.is-act-3 .btn--ghost:hover{ background:var(--graphite); color:var(--yellow); border-color:var(--graphite); }
.hero.is-act-3 .orb{ opacity:.12; }

.btn--dark{
  background:var(--graphite); color:var(--white);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14), 0 10px 24px -12px rgba(11,13,18,.8);
}
.btn--dark:hover{
  background:#1a1f2b; transform:translateY(-2px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 18px 34px -14px rgba(11,13,18,.9);
}

/* Botón fantasma sobre el azul del acto 2 */
.hero.is-act-2 .btn--ghost{
  border-color:rgba(255,255,255,.32); color:#fff;
  background:rgba(255,255,255,.14);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.28);
}
.hero.is-act-2 .btn--ghost:hover{ background:#fff; color:var(--blue); border-color:#fff; }

/* Transición suave de color al cambiar de acto */
.hero, .act, .act .lead, .mach__name, .pill--state, .btn--ghost{
  transition:color .32s ease, border-color .32s ease, background-color .32s ease;
}

/* ---------- Celular ---------- */
@media (max-width:979px){
  .hero.is-live{ padding-top:calc(var(--nav-h) + 10px); padding-bottom:16px; }
  .hero__stage{ gap:16px; }
  .act{ gap:12px; }
  /* El acto 1 es el más cargado de texto. En celular se recorta para que quepa
     junto al riel: el CTA secundario sale (el catálogo sigue en el menú y en la
     sección de líneas) y el párrafo baja de tamaño. */
  .hero.is-live .hero__copywrap{ min-height:348px; }
  .hero .h1{ font-size:clamp(26px,7vw,38px); }
  .act[data-act="1"] .lead{ font-size:15px; }
  .act[data-act="1"] .act__cta .btn--ghost{ display:none; }
  .act__title{ font-size:clamp(46px,15vw,84px); }
  .reels, .hero.is-live .reels{ height:clamp(260px,64vw,340px); min-height:0; }
  .mach.is-t1{ transform:translate(-14px,-104px) scale(.26); }
  .mach.is-t2{ transform:translate(-14px,-14px) scale(.26); }
  .mach.is-t1 .mach__art, .mach.is-t2 .mach__art{ border-radius:54px; }
  .mach__name{ font-size:clamp(30px,8.4vw,44px); }
  .mach__meta{ left:18px; width:min(calc(100% - 18px),300px); }
  .mach{ flex:0 0 clamp(112px,34vw,150px); }
  .mach__name{ font-size:24px; }
}

/* Mientras el hero está en el acto amarillo, los CTA amarillos flotantes se
   pierden contra el fondo. main.js marca <body class="on-yellow"> en ese tramo. */
body.on-yellow .wa-float{ background:var(--graphite); color:var(--white); box-shadow:0 14px 30px -12px rgba(11,13,18,.5); }
body.on-yellow .wa-float:hover{ background:#1a1f2b; }
/* El fondo de la barra lo pinta `.nav::before` y solo cuando está pegada.
   `.nav` en sí nunca lleva color. */
.nav{ background:none; }

/* ==========================================================================
   REGLA DE SEGURIDAD PARA IMÁGENES
   Cada hueco tiene su proporción fija y la imagen SIEMPRE lo llena por
   recorte, nunca por deformación ni dejando aire. Vale para cualquier foto
   que se meta después, tenga el tamaño que tenga.
   ========================================================================== */
.shot > img, .mach__art > img{
  width:100%; height:100%; object-fit:cover; object-position:center 42%;
  display:block;
}
/* El navegador reserva el espacio antes de que cargue la foto: sin saltos. */
.shot > img, .mach__art > img{ background:rgba(30,49,164,.06); }

/* La cápsula se adapta al acto del hero que tenga detrás.
   Se repite el selector con `.is-stuck` a propósito: esa regla tiene más
   especificidad y le ganaba, con lo que sobre el azul quedaba cápsula blanca
   con enlaces blancos, ilegible.
   Sobre azul y amarillo la cápsula se mantiene CLARA y los enlaces en grafito:
   así el logo original se lee sin tener que invertirlo ni recolorearlo. */
body.on-blue .nav .nav__inner,
body.on-blue .nav.is-stuck .nav__inner{
  background:rgba(255,255,255,.88);
  border-color:rgba(255,255,255,.95);
  box-shadow:0 1px 0 rgba(255,255,255,.8) inset, 0 16px 40px -14px rgba(5,10,48,.55);
}
body.on-yellow .nav .nav__inner,
body.on-yellow .nav.is-stuck .nav__inner{
  background:rgba(255,255,255,.9);
  border-color:rgba(255,255,255,.95);
  box-shadow:0 1px 0 rgba(255,255,255,.8) inset, 0 16px 40px -14px rgba(90,60,0,.35);
}
/* Los enlaces quedan siempre en grafito: máximo contraste sobre la cápsula. */
body.on-blue .nav__links a,
body.on-yellow .nav__links a{ color:var(--graphite); }
body.on-blue .nav__links a:hover,
body.on-yellow .nav__links a:hover{ background:rgba(30,49,164,.09); color:var(--blue); }

/* ==========================================================================
   .cut-top — CORTE DE MARCA EN LA ENTRADA DE UNA SECCIÓN
   El perfil del alero del logo, pero sin superponer ninguna figura: se recorta
   la propia sección y se sube sobre la anterior. Así el fondo de la sección
   (degradado incluido) rellena el alero por sí solo, y por los hombros asoma lo
   que haya arriba. Ventaja sobre el .seam-cut de SVG: no hay que mantener
   sincronizado ningún color, y funciona igual si mañana cambia el fondo.
   Las cotas son las del logo: hombros al 10,55% y 89,45%, ápice al 49,88%.
   ========================================================================== */
.cut-top{
  --seam-h:clamp(30px,4vw,62px);
  /* Grosor de la línea blanca de separación: la unidad del sitio, la misma que
     separa las piezas de las retículas. */
  --seam-w:var(--gap-unit);
  position:relative;
  margin-top:calc(var(--seam-h) * -1);
  padding-top:calc(clamp(72px,11vw,132px) + var(--seam-h));
  clip-path:polygon(
    0 var(--seam-h),
    10.55% var(--seam-h),
    49.88% 0,
    89.45% var(--seam-h),
    100% var(--seam-h),
    100% calc(100% + 2px),
    0 calc(100% + 2px)
  );
}

/* LÍNEA BLANCA DE SEPARACIÓN, con la forma del logo.
   En la web de Apple cada ficha de producto se separa de la siguiente con una
   línea blanca fina. Aquí la línea existe igual, pero sigue el alero.

   Cómo se dibuja, que tiene truco: no se puede "trazar" un clip-path. Lo que
   hay son DOS recortes que se restan.
     1. La sección ya está recortada por debajo del alero (regla de arriba):
        todo lo que queda POR ENCIMA del alero no se pinta.
     2. Este pseudoelemento es una banda blanca recortada por encima del MISMO
        alero desplazado hacia abajo `--seam-w` píxeles.
   Lo único que sobrevive a los dos recortes es la franja entre los dos aleros:
   una línea blanca del grosor exacto que siga la forma, sin SVG y sin tener que
   mantener sincronizado ningún color con la sección de arriba. */
.cut-top::before{
  content:""; position:absolute; top:0; left:0; right:0; z-index:1;
  height:calc(var(--seam-h) + var(--seam-w) + 1px);
  background:#fff; pointer-events:none;
  clip-path:polygon(
    0 0,
    100% 0,
    100% calc(var(--seam-h) + var(--seam-w)),
    89.45% calc(var(--seam-h) + var(--seam-w)),
    49.88% var(--seam-w),
    10.55% calc(var(--seam-h) + var(--seam-w)),
    0 calc(var(--seam-h) + var(--seam-w))
  );
}

/* La imagen del hero ocupa TODO el alto disponible en desktop.
   Va al final del archivo a propósito: tiene que ganarle a la altura fija que
   se define en el bloque del hero (misma especificidad, gana la última). */

/* ==========================================================================
   PANEL DE IMAGEN DEL HERO — anclado al borde de la pantalla
   Va al final del archivo y con selector `.hero .reels` a propósito: la regla
   base de .reels aparece más abajo en el bloque del hero y, con la misma
   especificidad, le ganaba. Anclarlo al <section> (y no a la rejilla) es lo
   que garantiza que toque exacto el borde derecho y el alto completo en
   cualquier ancho de viewport; con márgenes en porcentaje nunca cuadraba,
   porque un margen % se resuelve contra el área de la rejilla, no contra el
   contenedor.
   ========================================================================== */
@media (min-width:980px){
  /* Se repite el selector con `.is-live` para igualar la especificidad de la
     altura fija que se define arriba; si no, el panel se quedaba en 650px. */
  .hero .reels,
  .hero.is-live .reels{
    position:absolute; top:0; right:0; bottom:0;
    left:51%;
    width:auto; height:auto; min-height:0; margin:0; z-index:1;
  }
}

/* Cabecera de la galería: dos acciones */
.gallery__cta{ display:flex; flex-wrap:wrap; gap:10px; }

/* ==========================================================================
   GALERÍA ENLAZABLE A INSTAGRAM
   Cada plano puede envolverse en <a class="gallery__link"> apuntando a su reel
   o publicación. Enlace directo, sin el script de embed de Meta: pesa cero,
   no se rompe cuando Meta cambia el embed y no penaliza el móvil.
   ========================================================================== */
.gallery__link{ display:block; position:relative; border-radius:var(--r-lg); overflow:hidden; }
.gallery__link::after{
  content:""; position:absolute; inset:0; z-index:4; pointer-events:none;
  background:linear-gradient(to top, rgba(11,13,18,.38), transparent 45%);
  opacity:0; transition:opacity .3s ease;
}
.gallery__link:hover::after{ opacity:1; }
.gallery__link .shot{ transition:transform .5s cubic-bezier(.2,.8,.25,1); }
.gallery__link:hover .shot{ transform:scale(1.03); }
/* Sin usar todavía a propósito: se activa al envolver un plano en
   .gallery__link para enlazarlo a su reel. Ver LEEME.md. */
.gallery__play{
  position:absolute; z-index:5; right:12px; top:12px;
  width:38px; height:38px; border-radius:50%;
  display:grid; place-items:center;
  background:rgba(255,255,255,.92); color:var(--blue);
  box-shadow:0 8px 20px -8px rgba(11,13,18,.5);
}

/* ==========================================================================
   MODO RECORTE (máquinas sin fondo)
   Cuando lleguen los PNG con transparencia, basta con añadir la clase
   `is-cutout` a .reels: la máquina pasa a flotar sobre el color del acto, con
   sombra proyectada y sin el velo de fundido, que deja de tener sentido.
   ========================================================================== */
.reels.is-cutout .mach__art{ background:transparent; box-shadow:none; border-radius:0; overflow:visible; }
.reels.is-cutout .mach__art > img{
  object-fit:contain; object-position:center;
  background:transparent;
  filter:drop-shadow(0 38px 44px rgba(11,13,18,.32));
}
.reels.is-cutout .mach__tag{ display:none; }
.reels.is-cutout .mach.is-t1 .mach__art,
.reels.is-cutout .mach.is-t2 .mach__art{ border-radius:0; box-shadow:none; }

/* ==========================================================================
   ESCAPARATE DE PRODUCTO — primer impacto del hero
   La máquina deja de ser una foto dentro de un marco y pasa a ser un objeto
   apoyado en un suelo. Lo que la hace parecer fotografiada y no pegada es la
   sombra: un recorte flotando en el vacío se ve barato.
   ========================================================================== */

/* Titular corto del acto 1: más grande que el h1 normal porque ahora carga solo
   con el peso que antes repartían el lema y el párrafo. */
/* El titular pasa a ser el elemento más grande de la pantalla. Antes el
   fantasma del fondo medía 283px y este 76: el adorno pesaba cuatro veces más
   que el mensaje. */
/* `.hero .h1` es (0,2,0) y le ganaba a `.h1--stage` (0,1,0): el titular se
   quedaba en los 50px de la regla vieja por mucho que aquí pidiera 118. */
.hero .h1--stage{
  /* 7vw y no 8: a 8 la primera línea no cabía en la columna y «QUE» quedaba
     huérfano en un renglón propio. Sigue siendo el elemento más grande de la
     pantalla, que es lo que se buscaba. */
  /* 6vw, medido y no estimado: la columna útil son 624px y «MÁQUINAS QUE»
     necesita 722 a 103px de cuerpo. A 6vw entra en dos líneas sin dejar
     «QUE» huérfano en un renglón propio. */
  /* El `min()` con `vh` es lo que faltaba: el cuerpo tiene que mirar las DOS
     dimensiones, no solo el ancho. Medido en 1512x800: a 6vw el titular pedía
     90,7px, o sea 185px de dos líneas, y el bloque de texto se llevaba el 56%
     de la pantalla. A 9,5vh se queda en 76px y devuelve 38px al carrusel sin
     dejar de ser, de lejos, lo más grande de la pantalla. */
  font-size:min(clamp(42px,6vw,92px), 9.5vh); line-height:1.02; letter-spacing:-.03em;
  /* Sin límite de medida: el corte de línea lo decide el <br> del marcado. Con
     9ch la primera línea no cabía y se partía en cuatro renglones. */
  max-width:none; text-wrap:balance;
}

/* Franja de datos. Lo que el párrafo decía en prosa, en cifras: un comprador
   que compara máquinas lee esto antes que cualquier frase. */
.specstrip{
  margin:clamp(20px,2.6vw,30px) 0 0; padding-top:clamp(16px,2vw,22px);
  border-top:1px solid var(--hero-line);
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(12px,1.8vw,20px) clamp(18px,3vw,38px);
}
@media (min-width:560px){ .specstrip{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
/* Etiqueta y valor tienen que leerse como UNA cosa, no como dos.
   Lo que los separaba no era el hueco (ya era de 3px) sino el interletrado: con
   .12em la etiqueta salía más ancha que su propio valor y las dos líneas no
   compartían eje. Bajando a .05em cada etiqueta mide más o menos lo que mide su
   valor, y el par se lee de arriba abajo de un golpe. */
.specstrip > div{ display:grid; gap:4px; min-width:0; }
.specstrip dt{
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.05em;
  line-height:1.2; text-transform:uppercase; color:var(--hero-muted);
}
.specstrip dd{
  margin:0; font-family:var(--f-display); font-size:clamp(16px,1.9vw,21px);
  line-height:1.1; letter-spacing:-.005em; color:var(--hero-fg);
  text-transform:uppercase;
}

/* ---------- La máquina sobre el escenario ---------- */
.mach--cut.is-hero .mach__art{
  background:transparent; box-shadow:none; border-radius:0; overflow:visible;
}
/* La foto del recorte es muy apaisada (2:1) y el panel del hero es alto y
   estrecho: encajándola dentro, la máquina quedaba en un 27% del alto de
   pantalla, o sea pequeña. Se saca del encaje y se dimensiona a mano, más ancha
   que el panel y sangrando por la derecha. Una máquina que no cabe se lee como
   grande; una que cabe entera con aire alrededor se lee como una miniatura. */
.mach--cut.is-hero .mach__art{ display:block; }
/* La máscara doble de las fotos enmarcadas no sirve aquí: su fundido inferior
   disolvía la base de la máquina y peleaba con la sombra de apoyo. */
.mach--cut.is-hero .mach__art > img{
  -webkit-mask-composite:source-over; mask-composite:add;
  position:absolute; right:-18%; bottom:8%;
  /* 158% de ancho estaba calibrado para el recorte anterior, muy apaisado
     (ratio 2.09). La foto de estudio de George es casi cuadrada (1.10): al
     mismo ancho tapaba el titular entero. Ahora se manda por ALTURA, que es lo
     que controla de verdad cuánto invade la columna de texto. */
  width:auto; height:60%; max-width:none;
  object-fit:contain;
  /* La sombra sigue la silueta, no la caja. Es lo que ancla la máquina. */
  filter:drop-shadow(0 30px 36px rgba(11,13,18,.30));
  /* SIN máscara de fundido. La tenía cuando el recorte era tan ancho que se
     metía debajo del titular: había que disolver ese borde. La foto de estudio
     ya no llega hasta ahí, así que la máscara solo servía para comerse la mesa
     de entrada de la máquina, que es parte del producto. */
}
@media (max-width:979px){
  /* Apilado no hay columna de texto al lado, así que no hace falta disolver
     nada: la máquina se ve entera. */
  .mach--cut.is-hero .mach__art > img{ -webkit-mask-image:none; mask-image:none; }
}
@media (max-width:979px){
  /* Apilado: el panel es ancho y bajo, así que la máquina ya no necesita
     sangrar tanto para verse grande. */
  /* Apilado: la caja del riel es baja (380px), así que la foto se manda por
     altura. Con ancho al 112% la máquina se salía por ARRIBA de su caja y
     tapaba la franja de datos (garantía y envíos). */
  .mach--cut.is-hero .mach__art > img{ right:-2%; bottom:3%; width:auto; height:92%; }
}
/* Pie de la máquina del hero: qué modelo es. Discreto, alineado a la derecha
   bajo el recorte, en mono como el resto de datos duros del sitio. */
.mach__id{
  position:absolute; right:clamp(16px,4vw,48px); bottom:clamp(10px,2vh,26px);
  z-index:3; margin:0; text-align:right;
  font-family:var(--f-mono); font-weight:500; font-size:14px; line-height:1.5;
  color:var(--hero-fg); letter-spacing:.02em;
}
.mach__id span{ display:block; color:var(--hero-muted); font-size:13px; }
.mach:not(.is-hero) .mach__id{ display:none; }
@media (max-width:979px){ .mach__id{ right:16px; bottom:6px; } }

/* El suelo: una elipse difuminada bajo la máquina. Sin ella el recorte flota en
   el vacío; con ella parece apoyado en algo. */
.mach--cut.is-hero .mach__art::after{
  content:""; position:absolute; z-index:-1;
  left:6%; right:-6%; bottom:4%; height:7%;
  border-radius:50%;
  background:radial-gradient(ellipse at center, rgba(11,13,18,.32), rgba(11,13,18,0) 70%);
  pointer-events:none;
}
.hero.is-act-2 .mach--cut .mach__art::after,
.hero.is-act-3 .mach--cut.is-hero .mach__art::after{ background:radial-gradient(ellipse at center, rgba(11,13,18,.26), rgba(11,13,18,0) 70%); }
/* AVISO OCULTO A PETICIÓN DE JUAN (25/09/2026). Quedaba cortado por el alero
   del fondo y ensuciaba el hero. El dato sigue siendo cierto: de los nueve
   recortes del riel SOLO el de la Titán 2 corresponde a su modelo; los otros
   ocho son sustitutos visuales mientras llegan las fotos de George.
   ESTO NO SE PUEDE PUBLICAR ASÍ. Antes de sacar el sitio a producción hay que
   reemplazar las imágenes o volver a mostrar el aviso: basta con borrar la
   línea `display:none` de abajo. Anotado también en LEEME.md. */
.mach--cut .mach__tag{
  display:none;
  position:absolute; left:50%; right:auto; top:auto; bottom:4px;
  transform:translateX(-50%);
  background:rgba(11,13,18,.62); color:#fff;
  padding:5px 11px; border-radius:6px;
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.02em;
  white-space:nowrap; z-index:3;
}
/* En las miniaturas no cabe y sobra: ahí ya se entiende que es material de paso. */
.mach--cut.is-t1 .mach__tag,
.mach--cut.is-t2 .mach__tag{ display:none; }

/* ==========================================================================
   PÁGINAS LEGALES
   Documentos para leer, no para escanear: una sola columna estrecha, medida
   de línea corta y jerarquía por tamaño, no por color. Comparten tokens y
   fuentes con el home, así que no hay un segundo sistema que mantener.
   ========================================================================== */
.legal{ padding-top:calc(var(--nav-h) + clamp(28px,5vw,56px)); padding-bottom:clamp(56px,8vw,96px); }
.legal__wrap{ max-width:760px; margin-inline:auto; }
.legal__head{ display:grid; gap:14px; padding-bottom:clamp(26px,4vw,40px); border-bottom:1px solid var(--line); }
.legal__kicker{
  font-family:var(--f-mono); font-weight:500; font-size:14px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--slate);
}
.legal h1{ font-size:clamp(30px,5.4vw,50px); }
.legal__meta{
  margin:0; font-family:var(--f-mono); font-weight:500; font-size:14px; color:var(--slate);
  display:flex; flex-wrap:wrap; gap:6px 18px;
}
.legal__body{ display:grid; gap:clamp(26px,3.4vw,38px); padding-top:clamp(26px,4vw,40px); }
.legal section{ display:grid; gap:12px; }
.legal h2{
  font-size:clamp(19px,2.4vw,25px); line-height:1.1;
  padding-top:clamp(8px,1.4vw,14px);
}
.legal h3{ font-size:16px; text-transform:none; font-family:var(--f-body); font-weight:700; letter-spacing:0; }
.legal p, .legal li{ font-size:16px; line-height:1.68; color:#2A3140; }
.legal p{ margin:0; max-width:68ch; }
.legal ul, .legal ol{ margin:0; padding-left:21px; display:grid; gap:9px; max-width:68ch; }
.legal a{ color:var(--blue); text-decoration:underline; text-underline-offset:2px; }
.legal strong{ color:var(--graphite); }
.legal__toc{
  display:grid; gap:9px; padding:clamp(18px,2.6vw,24px);
  background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md);
}
.legal__toc ol{ padding-left:19px; gap:6px; }
.legal__toc li{ font-size:15px; }
/* Dato que el cliente todavía no ha entregado. Se marca fuerte a propósito:
   publicar una política legal con un hueco dentro es peor que no publicarla. */
.pend{
  display:inline-block; padding:1px 8px; border-radius:5px;
  background:#FFE7A3; color:#6B4E00; border:1px solid #E0B94B;
  font-family:var(--f-mono); font-size:14px; font-weight:500; letter-spacing:.02em;
}
.legal__warn{
  display:grid; gap:10px; padding:clamp(18px,2.6vw,24px);
  background:#FFF8E6; border:1px solid #E7CE8C;
  border-radius:var(--r-md);
}
.legal__warn p{ font-size:14.5px; color:#5E4A12; }
.legal__warn strong{ color:#3D2F00; }


/* Miniaturas del acto con escaparate. La máquina grande ocupa la franja baja
   del panel, así que las dos pequeñas se suben al borde superior: antes caían
   justo encima del recorte y lo partían por la mitad. */
@media (min-width:980px){
  .reel .mach--cut ~ .mach.is-t1,
  .reel .mach--cut ~ .mach.is-t2{ top:clamp(14px,3vh,34px); bottom:auto; }
  .reel .mach--cut ~ .mach.is-t1{ right:clamp(12px,1.6vw,22px); }
  .reel .mach--cut ~ .mach.is-t2{ right:calc(clamp(12px,1.6vw,22px) + 142px); }
}

/* ==========================================================================
   HERO: COPIA ARRIBA, CARRUSEL ABAJO  (26/09/2026)
   Estructura pedida por George: el mensaje centrado en el tercio superior, y
   los dos tercios de abajo para las máquinas. Va al final del archivo a
   propósito, para ganarle a las reglas del bloque del hero sin tener que
   editarlas una por una.
   ========================================================================== */
.hero{
  /* Dos filas: un tercio para el mensaje, dos tercios para las máquinas.
     `minmax(0,…)` en las dos para que el contenido no pueda estirar la fila
     por encima de su reparto, que es la trampa clásica de CSS Grid. */
  /* 32/68 dejaba el bloque de texto pegado al techo y un vacío grande bajo el
     carrusel. 40/60 le da aire arriba al mensaje y le quita banda muerta a las
     máquinas, que ya tienen su propio alto. */
  /* `minmax(auto, 40fr)` y NO `minmax(0, 40fr)` en la fila del mensaje.
     Medido en una ventana de 1512x800: la fila del texto sale a 320px y el
     bloque de texto mide 485. Con el mínimo en 0 la fila no crece, el texto se
     sale por abajo y aterriza ENCIMA de las máquinas: eso es lo que se veía
     amontonado en pantallas de escritorio cortas, y no tenía nada que ver con
     el 3D. Con el mínimo en `auto`, el reparto 40/60 se mantiene mientras
     quepa, y en cuanto no cabe la fila del mensaje se queda con lo suyo y las
     máquinas ceden. El texto no se puede encoger; las fotos sí. */
  grid-template-rows:minmax(auto,40fr) minmax(0,60fr);
  /* HUECO GARANTIZADO ENTRE EL MENSAJE Y LAS MÁQUINAS.
     Sin él, la separación era lo que SOBRARA después de repartir, y eso
     depende de tres cosas que cambian con la ventana (cuánto mide el titular,
     cuánto se lleva el alero, cuánto crece la foto). Medido antes de ponerlo:
     30px de aire en una pantalla de 1220 y 12px en una de 900. Doce píxeles
     entre un bloque de texto y una fila de máquinas se lee como un choque.
     Con un `row-gap` la separación es un número que se decide, no un residuo, y
     el presupuesto en `cqh` de la banda lo descuenta solo porque su fila mide
     menos. */
  row-gap:clamp(20px,3vh,44px);
  /* ALTURA DEFINIDA, no `min-height`. Con `min-height` la altura del hero es
     indefinida para la rejilla, y entonces las filas `fr` no reparten: se
     dimensionan por la fila que más contenido tiene y estiran el contenedor.
     Medido: el hero acababa en 1336px dentro de una ventana de 1235 y el
     carrusel se salía por abajo. Con `height` el reparto 34/66 es exacto. */
  height:100svh; min-height:620px;
}
.hero__stage{
  align-content:center; justify-items:center; text-align:center;
  /* Aire real bajo la barra. Con el mínimo justo, el antetítulo quedaba casi
     tocando el nav y la pantalla arrancaba apretada. */
  /* SOLO LA SEPARACIÓN DE LA BARRA, el resto del aire lo reparte el centrado.
     Este relleno estaba en `nav-h + hasta 84px`, y en una pantalla alta eso se
     comía casi todo el espacio libre de la fila ANTES de que el
     `align-content:center` pudiera repartirlo: el bloque de texto quedaba
     pegado al borde de arriba y todo el hueco sobrante caía debajo, entre el
     texto y las máquinas. Medido en 1700x1220: 25px de aire arriba contra 210
     abajo.
     Ahora el relleno solo garantiza que el antetítulo no toque la barra, y de
     centrar el bloque en su fila se encarga la rejilla, que es su trabajo. */
  padding-top:calc(var(--nav-h) + clamp(28px,3.4vh,60px));
}
/* La columna de texto ya no vive a la izquierda: manda centrada y con medida
   corta, que es lo que hace que un titular centrado no se lea flojo. */
@media (min-width:980px){
  /* 940 y no 820. Medido a 1512px de ancho: el titular va a 90,7px de cuerpo y
     «EN TU CARPINTERÍA.» necesita unos 850px. En una columna de 820 no cabe y
     se parte en TRES renglones, que a 92px de interlínea son 93px de más
     comidos al carrusel. Por eso las máquinas salían apretadas contra el alero
     en pantallas de escritorio cortas. Sigue siendo medida corta: 940 de 1512
     es el 62% del ancho. */
  .hero__copywrap{ max-width:min(100%, 940px); margin-inline:auto; padding-top:0; }
}
.hero.is-live .hero__copywrap{ min-height:0; }
.hero .act{ justify-items:center; text-align:center; margin-inline:auto; }
.hero .act .hero__badges,
.hero .act .act__cta{ justify-content:center; }
.hero .act .specstrip{ justify-content:center; }
/* Sin el pin, los bloques ya no se cruzan: el acto único puede fluir. */
.hero.is-live .act{ position:relative; inset:auto; opacity:1; visibility:visible; }

/* ---------- Carrusel ---------- */
/* Centrado en su banda y con las máquinas grandes. Con el carrusel pegado
   abajo y las fotos pequeñas quedaba una franja azul vacía enorme entre la
   franja de datos y las máquinas, que es lo que se veía como "muy separado". */
.hcar{
  /* `stretch` y no `center`. Con `center` la banda se encoge a su contenido y
     su altura queda INDEFINIDA; en cuanto se le puso `container-type:size`, la
     contención de tamaño le borró esa referencia y colapsó a 0. Un contenedor
     de consulta por tamaño necesita que la altura se la dé la rejilla, no su
     contenido. El centrado se hace ahora por dentro, con flex. */
  position:relative; z-index:2; align-self:stretch;
  /* CENTRADAS EN SU FRANJA, no apoyadas abajo.
     Estuvieron apoyadas abajo mientras el arco BAJABA a la máquina del centro:
     esa caída necesitaba su respiro entero por debajo. Desde que el arco sube
     los lados en vez de bajar el centro, esa reserva ya no existe, y anclar
     abajo solo servía para que todo el hueco libre de la franja se acumulara
     ARRIBA, justo entre el texto y las máquinas. El alero de la sección
     siguiente ya está reservado con el `padding-bottom` de esta misma regla,
     que queda fuera del centrado. */
  display:flex; align-items:center;
  width:100%; overflow:hidden;
  /* EL PUNTO DE FUGA VIVE AQUÍ, no en cada máquina.
     Antes cada pieza llevaba su propio `perspective()` dentro de su transform,
     y eso hace que cada una tenga su punto de fuga centrado en sí misma: todas
     se inclinan igual, nadie se aleja, y lo que se ve es una fila de cartas
     torcidas, no una escena. Con la perspectiva en el contenedor todas las
     máquinas comparten un solo ojo, el del centro de la pantalla, así que
     girarse hacia dentro las manda de verdad hacia el fondo.
     El origen va un poco por encima de la mitad: la cámara mira ligeramente
     desde arriba, que es como se mira una máquina de pie en un taller. */
  perspective:1150px;
  perspective-origin:50% 44%;
  /* Contenedor de consulta por TAMAÑO. Es lo que le permite a las máquinas
     medirse contra el sitio que les queda de verdad y no contra `vh`, que no
     sabe cuánto se llevó el texto. La regla que lo usa está al final del
     archivo, con la de tamaño percibido. */
  container-type:size;
  /* Los bordes se disuelven en vez de cortarse en seco: es la diferencia entre
     una marquesina y una fila recortada por una caja. */
  -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 9%, #000 91%, transparent 100%);
          mask-image:linear-gradient(90deg, transparent 0, #000 9%, #000 91%, transparent 100%);
  /* LA SECCIÓN DE ABAJO SE SUBE ENCIMA. `.cut-top` lleva
     `margin-top: -var(--seam-h)`, así que los últimos 60px del hero (a 1512px
     de ancho) ya están tapados por el alero de la sección siguiente. Medido: el
     hero acababa en 800, la sección de abajo empezaba en 740 y el pie de la
     máquina del centro caía en 787: cuarenta y siete píxeles debajo del alero.
     Este respiro es ese solape, con la misma fórmula. Y como la banda es
     contenedor de consulta, se descuenta solo del presupuesto en `cqh`: una
     sola cifra que tocar si el alero cambia de alto.
     Va AQUÍ y no arriba del bloque: había un `padding-bottom:0` en esta misma
     regla que se lo comía. */
  /* El alero + 14px. El solape solo garantiza que el pie no quede TAPADO; los
     14px son para que tampoco quede BESANDO la línea blanca, que es donde el
     ojo lee «se salió». */
  padding-bottom:calc(clamp(30px,4vw,62px) + 14px);
}
.hcar__track{
  width:100%;
  display:flex; align-items:flex-end; gap:clamp(24px,4vw,64px);
  /* Sin respiro abajo. El arco pasó a subir los lados en vez de bajar el
     centro, así que ya no hace falta reservar nada por debajo. */
  padding-bottom:0;
  will-change:transform;
  /* Sin esto la pista aplana a sus hijas contra su propio plano y la
     perspectiva del contenedor no llega: es el otro 50% del efecto. */
  transform-style:preserve-3d;
}
.hcar__it{
  margin:0; flex:0 0 auto;
  display:grid; justify-items:center; gap:12px;
  /* La escala, la caída y el giro los pone el JS según lo cerca que esté del
     centro. Aquí solo va el estado de reposo, que es el que se ve sin JS.
     El origen va en la base: así al encogerse la máquina se queda apoyada en la
     misma línea en vez de flotar hacia el centro de su caja. */
  transform-origin:50% 100%;
  backface-visibility:hidden;
}
.hcar__it img{
  display:block; width:auto; max-width:none;
  /* La altura la decide `data-forma` (regla de tamaño percibido, al final del
     archivo). Aquí la enchapadora Titán 2 es 2:1 y las demás casi cuadradas:
     con una altura igual para todas, la Titán 2 parecía el doble de máquina. */
  height:auto;
  object-fit:contain;
  filter:drop-shadow(0 22px 28px rgba(11,13,18,.32));
}
/* El pie reacciona al foco. `--k` lo publica el JS: 1 cuando la máquina está en
   el centro, 0 cuando está en el borde. Así la protagonista se ANUNCIA (nombre
   grande y nítido) y las demás se quedan en un susurro. Es lo que separa un
   carrusel de una tira de imágenes: en todo momento hay una máquina que la
   página te está presentando. */
.hcar__it figcaption{
  font-family:var(--f-mono); font-weight:500; font-size:14px; line-height:1.5;
  color:var(--hero-muted); letter-spacing:.02em; text-align:center;
  opacity:calc(.3 + .7 * var(--k, 1));
  transform:translateY(calc((1 - var(--k, 1)) * 6px));
}
.hcar__it figcaption b{
  display:block; font-weight:400; color:var(--hero-fg);
  /* De 13px en el borde a 18px en el centro. Nunca baja de 13. */
  font-size:calc(13px + 5px * var(--k, 1));
  letter-spacing:calc(.02em + .02em * (1 - var(--k, 1)));
  line-height:1.35;
}

/* RETIRADA LA ELIPSE DE APOYO (28/09/2026).
   Había aquí una elipse difuminada bajo cada máquina, pensada para posarla en
   el suelo cuando la fila era plana. Con el carrusel en 3D dejó de funcionar, y
   por un motivo de fondo: una sombra de suelo vive en el PLANO DEL SUELO, y
   esta vivía en el plano de la máquina. Al girar la pieza sobre su eje Y y
   alejarse en Z, la elipse giraba y se alejaba con ella, así que dejaba de
   leerse como contacto y pasaba a ser una mancha oscura flotando detrás. Y como
   su opacidad iba atada a `--k`, esa mancha latía en cada fotograma: eso era el
   halo que parpadeaba.
   No se sustituye por nada. El `drop-shadow` de la propia foto ya posa la
   máquina, y ese sí viaja bien con el giro, porque es un filtro sobre el mapa
   de bits de la imagen y no una figura aparte con su propia idea de dónde está
   el suelo. Comprobado en pantalla con la elipse quitada: la máquina sigue
   apoyada y el halo desaparece.
   Se deja `position:relative` porque no cuesta nada y cualquier adorno futuro
   de la pieza lo va a necesitar. */
.hcar__it{ position:relative; }

@media (max-width:979px){
  /* Apilado: el texto manda y se lleva lo que necesite; el carrusel ocupa lo
     que sobre. Aquí sí conviene `min-height`, porque en un teléfono corto el
     bloque de texto tiene que poder pasarse de una pantalla antes que
     apretarse. */
  .hero{ grid-template-rows:auto minmax(0,1fr); height:auto; min-height:100svh; }
  /* Fuera en vertical. Se probó arriba, a media altura y abajo: en un teléfono
     el hero va tan justo que el fantasma siempre acaba cruzándose con algo (el
     botón o la franja de datos) y solo añade ruido. En escritorio sí tiene
     sitio propio, entre el titular y las máquinas. */
  .hero__ghost{ display:none; }
  /* El tamaño de las máquinas en móvil se declara junto a la regla de tamaño
     percibido, al final del archivo: aquí quedaba pisado por ella. */
  .hcar{ padding-bottom:clamp(10px,2vh,22px); }
}
@media (prefers-reduced-motion:reduce){
  .hcar__track{ transform:none !important; }
}

/* Estrellas de la franja del hero. Se pintan con el carácter ★ y no con
   imágenes: pesa cero, escala con el texto y se puede copiar. El aria-label del
   <dd> dice "5 de 5 estrellas", así que el lector de pantalla no lee cinco
   símbolos sueltos. */
.specstrip .stars{
  color:var(--yellow); font-family:var(--f-body);
  font-size:clamp(17px,2vw,22px); line-height:1.05; letter-spacing:.06em;
}

/* ==========================================================================
   AGRUPACIÓN VERTICAL: que el título "pertenezca" a su texto  (26/09/2026)
   Juan: «no me gusta que los títulos no conecten con el texto».
   El problema no era el tamaño sino el ritmo: antetítulo, titular y párrafo
   estaban separados por el mismo hueco, así que se leían como tres cosas
   sueltas en vez de como un bloque. La regla es vieja y sigue siendo cierta:
   lo que va junto se separa menos que lo que va aparte.
     antetítulo → titular   MUY pegado (es su etiqueta)
     titular    → párrafo   hueco normal
   ========================================================================== */
.eyebrow + .h1,
.eyebrow + .h2,
.eyebrow + .h3,
.eyebrow + h2,
.eyebrow + h3{ margin-top:clamp(-9px,-.7vw,-5px); }

/* Y el párrafo que sigue a un titular no necesita tanto aire por arriba como
   el que separa dos bloques distintos. */
.h1 + .lead,
.h2 + .lead,
.h3 + .lead,
h2 + .lead{ margin-top:clamp(-6px,-.5vw,-2px); }

/* ==========================================================================
   REGLA DE MARCA: la tipografía de display (Fugaz One) SIEMPRE en mayúsculas.
   No es una preferencia estética: es cómo está dibujada. Sus minúsculas tienen
   una altura de x muy grande y una inclinación que, mezcladas con mayúsculas,
   hacen que el renglón se vea torcido.
   Esta regla es la red de seguridad: cualquier elemento que use --f-display y
   se olvide de declararlo, queda cubierto.
   ========================================================================== */
.h1, .h2, .h3, .h4,
.act__title, .cat__name, .model__name, .model__price,
.specstrip dd, .cat__data dd, .stat__num, .step__n,
.foot__t, .mach__name{ text-transform:uppercase; }

/* Etiqueta única del hero: dice qué es Maquimaderas, no qué modelo está de
   oferta. Sin punto, sin caja y sin negrita: es el pie de foto del titular, no
   un aviso. El interletrado es el mismo criterio que en la franja de datos, lo
   justo para que se lea como etiqueta sin estirarse. */
.label--brand{
  font-family:var(--f-body); font-weight:700; font-size:14px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--hero-muted);
  white-space:normal; text-align:center; line-height:1.5;
}
/* CORTE DELIBERADO (02/10/2026). En un teléfono la frase no cabe en una línea
   y el navegador la partía donde podía: «Directa» quedaba sola en el segundo
   renglón. Cada mitad es un bloque que no se parte; si no caben juntas, se
   apilan en el punto medio y el separador desaparece. */
.label__par{ white-space:nowrap; }
@media (max-width:560px){
  .label--brand{ display:flex; flex-direction:column; align-items:center; gap:2px; }
  .label__sep{ display:none; }
}

/* ==========================================================================
   FICHAS DE LÍNEA  ·  editorial a dos columnas  (26/09/2026)

   PRIMERA VERSIÓN: todo centrado y apilado, como las fichas de Apple. El
   problema es que estas máquinas son MUY apaisadas: apiladas, la ficha pedía
   pantalla y media de alto para enseñar una foto que ocupa una franja estrecha.

   ESTA VERSIÓN: información a un lado, máquina al otro. Un apaisado ancho
   encaja en una columna sin desperdiciar altura, y de paso el bloque deja de
   verse como una plantilla de tienda y pasa a leerse como una doble página de
   revista: texto alineado a la izquierda, nombre enorme, y la máquina sangrando
   fuera de la caja.

   El texto va SIEMPRE primero en el marcado. La inversión de Urus la hace
   `order`, para que el orden de lectura no dependa del diseño.
   ========================================================================== */
.tile{ position:relative; overflow:hidden; }
/* CENTRADO VERTICAL. `.cut-top` mete `padding-top: 132px + alero` porque está
   pensado para secciones normales, donde ese hueco es el aire de arriba de la
   sección. En estas fichas eso rompía el centrado: 186px arriba contra 0 abajo,
   así que el contenido colgaba hacia el fondo y quedaba un vacío enorme bajo el
   corte. Medido: sección de 648px con el bloque de texto empezando en el 52% de
   su alto.
   Aquí el único hueco que hace falta arriba es el del alero, para que el
   contenido no se meta dentro del pico. El aire simétrico lo pone `.tile__in`.
   La especificidad de `.tile.cut-top` (0,2,0) le gana a `.cut-top` (0,1,0). */
.tile.cut-top{
  padding-top:var(--seam-h);
  padding-bottom:0;
}
.tile__in{
  display:grid; gap:clamp(28px,4vw,64px);
  align-items:center;
  padding-block:clamp(40px,4.5vw,68px);
  /* Al crecer las máquinas, la ficha de Titán (que además lleva pie de foto)
     pasó a medir ~620px de contenido. Se sube el mínimo para que la de Urus la
     alcance y las dos sigan midiendo lo mismo, que es lo que se pidió antes. */
  min-height:min(56svh, 600px);
  align-content:center;
}
@media (min-width:900px){
  .tile__in{
    grid-template-columns:minmax(0,38fr) minmax(0,62fr);
    padding-block:clamp(44px,4vw,66px);
  }
  /* Urus al revés: máquina a la izquierda, texto a la derecha.
     OJO: no basta con invertir el `order`. Las columnas se declaran 38fr y 62fr
     EN ESE ORDEN, así que al mover la máquina a la primera posición caía en la
     columna estrecha, se desbordaba 190px y se metía encima del párrafo. Hay
     que invertir también el reparto: la máquina siempre en la columna ancha. */
  .tile--urus .tile__in{ grid-template-columns:minmax(0,62fr) minmax(0,38fr); }
  .tile--urus .tile__body{ order:2; }
  .tile--urus .tile__art{ order:1; }
}

.tile__body{ display:grid; justify-items:start; gap:clamp(14px,1.6vw,20px); max-width:46ch; }
/* SIN raya decorativa delante. Es regla de marca de Juan y estaba anotada: el
   patrón «— ETIQUETA» está prohibido en cualquier diseño del proyecto. Delata
   plantilla generada y es lo primero que se reconoce como tal.
   El antetítulo se distingue por lo que ya lo distingue: la monoespaciada, la
   caja alta, el tamaño y el color. No necesita un adorno que lo anuncie. */
.tile__kicker{
  margin:0; font-family:var(--f-body); font-weight:800; font-size:clamp(20px,2vw,29px);
  letter-spacing:.04em; text-transform:uppercase; line-height:1.15;
}
.tile__t{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(52px,8.5vw,132px); line-height:.88; letter-spacing:-.035em;
}
.tile__kicker + .tile__t{ margin-top:clamp(2px,.6vw,8px); }
/* «Serie» va como renglón corto sobre el nombre de la línea: se lee «Serie
   Titán» sin competirle al nombre, que sigue siendo lo grande. */
.tile__serie{ display:block; font-size:.3em; letter-spacing:.01em; line-height:1; margin-bottom:.14em; }
.tile__claim{
  margin:0; font-size:clamp(17px,1.5vw,21px); line-height:1.5;
  max-width:34ch;
}
.tile__cta{ display:flex; flex-wrap:wrap; gap:12px; padding-top:clamp(6px,1vw,12px); }

/* --- La máquina --- */
.tile__art{
  margin:0; position:relative; width:100%;
  display:grid; justify-items:center; gap:14px;
}
/* La ALTURA es lo que manda, no el ancho. La Titán 7 es casi cuadrada
   (1254x1193) y la escuadradora de Urus es 2:1: dándoles el mismo ancho de
   columna, la de Titán salía el doble de alta y su ficha se estiraba con ella.
   Con un tope de altura común, las dos fichas miden lo mismo y la máquina ancha
   aprovecha el ancho que la otra no necesita. */
.tile__art img{
  display:block; width:auto;
  /* `max-width` sin tope a propósito: con el 100% de la columna, la
     escuadradora (2:1) se quedaba corta de ancho y no llegaba a la superficie
     que le tocaba (medido: 107.000 px² contra los 151.000 de la Titán). Aquí el
     tope es la ALTURA, que es la que reparte la superficie; el ancho se deja
     libre y la sección lo recorta con su `overflow:hidden`. */
  max-width:none;
  height:auto;   /* el tope lo pone `data-forma` */
  object-fit:contain;
}
.tile__art figcaption{
  font-family:var(--f-mono); font-weight:500; font-size:14px; line-height:1.5; letter-spacing:.02em;
}
.tile__art figcaption span{ display:block; opacity:.62; }

@media (min-width:900px){
  /* La máquina se sale de la caja por su lado. Un producto que no cabe entero
     se lee como grande; uno con aire alrededor se lee como una miniatura. */
  .tile--titan .tile__art{ margin-right:clamp(-120px,-6vw,-40px); justify-items:end; }
  .tile--urus  .tile__art{ margin-left:clamp(-120px,-6vw,-40px); justify-items:start; }
  .tile__art figcaption{ justify-self:start; }
  .tile--titan .tile__art figcaption{ justify-self:end; text-align:right; }
}

/* --- Titán: azul oscuro --- */
.tile--titan{
  background:linear-gradient(155deg, #1B2557 0%, #0E1330 52%, #0B0D18 100%);
  color:var(--white);
}
.tile--titan .tile__kicker{ color:var(--white); }
.tile--titan .tile__claim{ color:rgba(255,255,255,.78); }
.tile--titan .tile__art figcaption{ color:rgba(255,255,255,.78); }
.tile--titan .tile__art img{ filter:drop-shadow(0 30px 44px rgba(0,0,0,.6)); }

/* --- Urus: amarillo de marca --- */
.tile--urus{
  background:linear-gradient(155deg, #FFD24D 0%, #FFC629 48%, #F5B912 100%);
  color:var(--graphite);
}
.tile--urus .tile__kicker{ color:var(--graphite); }
.tile--urus .tile__claim{ color:rgba(11,13,18,.72); }
.tile--urus .tile__art figcaption{ color:rgba(11,13,18,.7); }
.tile--urus .tile__art img{ filter:drop-shadow(0 26px 38px rgba(11,13,18,.3)); }
/* Sobre amarillo, el botón secundario transparente se pierde: pasa a borde
   grafito. Es la misma corrección que ya existía para el acto amarillo. */
.tile--urus .btn--ghost{
  color:var(--graphite); border:1px solid rgba(11,13,18,.28); background:transparent;
}
.tile--urus .btn--ghost:hover{ background:var(--graphite); color:var(--yellow); border-color:var(--graphite); }

@media (max-width:899px){
  /* Apilado: la máquina primero no, porque entonces el visitante ve una foto
     sin saber de qué es. Texto y luego máquina, en las dos. */
  .tile__in{ min-height:0; }
  .tile__art img{ width:100%; }
}

/* ==========================================================================
   BENEFICIOS  ·  sección clara, tres columnas, cero relleno  (26/09/2026)
   Aquí no se habla de máquinas sino de lo que el taller gana. La tentación es
   añadir "un dato más" a cada columna: es justo lo que la rompe. Si hace falta
   una especificación, el sitio es la ficha del modelo.
   ========================================================================== */
.bens{ background:var(--paper); color:var(--graphite); }
/* ==========================================================================
   BENEFICIOS  ·  compacta y gráfica  (29/09/2026)

   Juan: «esta sección debe ser mucho más compacta y más gráfica, para no
   demorarnos tanto en llegar a las máquinas».

   Lo que se quitó y por qué:
     EL TITULAR LARGO   decía la suma exacta de los tres titulillos de abajo.
                        Duplicación pura, y costaba 180px de scroll.
     LAS CIFRAS DE AGUA 01 02 03 a 168px. Daban textura y no información: un
                        número no explica qué gana el carpintero. Y obligaban a
                        reservarles 38px de aire sobre cada titular.
   Lo que entró en su sitio: un esquema en movimiento por beneficio, que sí
   dice algo. Misma línea azul que los planos técnicos de la marca.
   ========================================================================== */
.bens.cut-top{ padding-top:calc(clamp(44px,4.6vw,66px) + var(--seam-h)); }
.bens{ padding-bottom:clamp(44px,4.6vw,70px); }

.bens__h{
  margin:0 0 clamp(26px,3vw,40px);
  font-family:var(--f-body); font-weight:700;
  font-size:14px; letter-spacing:.13em; text-transform:uppercase;
  color:var(--blue); text-align:center;
}

.bens__grid{
  display:grid; gap:clamp(30px,3.4vw,52px);
  grid-template-columns:1fr;
}
@media (min-width:860px){
  .bens__grid{ grid-template-columns:repeat(3,minmax(0,1fr)); align-items:start; }
}

.ben{
  position:relative; display:grid; gap:9px;
  align-content:start; min-width:0;
  padding-top:16px;
}
/* La regla se DIBUJA con el scroll (el JS le anima `scaleX`). */
.ben__rule{
  position:absolute; top:0; left:0; right:0; height:2px;
  background:var(--blue); opacity:.9;
  transform:scaleX(0); transform-origin:left center;
}
/* Sin JS la regla tiene que estar dibujada igual: un efecto que esconde
   contenido cuando falla no es un efecto, es un fallo. */
body:not(.anim-ready) .ben__rule{ transform:scaleX(1); }

.ben__t{
  margin:4px 0 0;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(21px,2vw,27px); line-height:1.02; letter-spacing:-.02em;
  color:var(--graphite);
}
.ben__p{
  margin:0; font-size:clamp(15.5px,1.2vw,17px); line-height:1.55;
  color:var(--slate); max-width:34ch;
}

/* EN TELÉFONO, EL DIBUJO AL LADO Y NO ENCIMA.
   Apilados, los tres bloques suman tres pantallas antes de las máquinas, que es
   justo lo que había que evitar. En dos columnas cada beneficio ocupa el alto
   de su texto y nada más. */
@media (max-width:859px){
  .ben{
    grid-template-columns:56px minmax(0,1fr);
    column-gap:16px; row-gap:4px; padding-top:14px;
  }
  .ben__g{ grid-row:1 / span 2; align-self:start; width:56px; height:56px; }
  .ben__t{ margin:0; }
}

/* ==========================================================================
   LOS TRES ESQUEMAS EN MOVIMIENTO  ·  v2, con coreografía  (30/09/2026)

   Juan: «estos diagramas animados me gustan, esfuérzate en hacerlos mejor,
   casi que con motion graphics avanzados».

   QUÉ CAMBIA RESPECTO DE LA v1. La primera versión era una propiedad en bucle
   por dibujo: barras que crecían, un aro que cruzaba. Eso es un icono que se
   mueve, no un motion graphic. Lo que separa una cosa de la otra es la
   COREOGRAFÍA: varios elementos con papeles distintos, entrando en un orden
   que cuenta algo, con una fase de reposo al final para que se lea el
   resultado y no solo el movimiento.

   Los tres siguen las mismas reglas:

     1. CADA UNO ES UNA ESCENA, NO UN SÍMBOLO. Una banda con tableros que se
        apilan, una hoja que corta y un canto que se pega, un despiece con su
        retal. Un carpintero reconoce su taller; un icono abstracto no dice
        nada que el titular no diga ya.
     2. EL AMARILLO ES LA HERRAMIENTA ACTIVA, nunca decoración. La hoja que
        corta va en amarillo y la pieza que se recupera se pone amarilla al
        crecer. Todo lo demás es azul de plano técnico.
     3. HAY UNA PAUSA AL FINAL. El último tercio del ciclo no se mueve: enseña
        el resultado. Sin esa pausa el ojo ve agitación y no entiende qué pasó.
     4. EL REINICIO SE DISIMULA. En los dos que terminan en un estado distinto
        del inicial, el último 6% deshace la escena con un desvanecido en vez
        de saltar de golpe al fotograma cero.

   TODO EN CSS, sin una línea de JS. Son bucles cortos y deterministas: montarles
   una línea de tiempo de GSAP sería pagar un peaje por nada, y así siguen vivos
   aunque se caiga el CDN.

   `prefers-reduced-motion` los deja quietos por la regla global. Y quietos
   siguen diciendo lo suyo, que es la prueba que tiene que pasar cualquier
   dibujo de este sitio: si solo funciona animado, no vale.
   ========================================================================== */
.ben__g{
  width:92px; height:92px; display:block;
  stroke:var(--blue); stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round;
  overflow:visible;
}
/* `fill-box` es obligatorio: sin él, el origen de las transformaciones de un
   elemento SVG es la esquina del LIENZO y no la de la propia figura, así que
   las piezas crecerían desde fuera del dibujo. */
.ben__g *{ transform-box:fill-box; }
.ben__g .g-suelo{ opacity:.28; }

/* ---------- 01 · LA LÍNEA DE PRODUCCIÓN ----------
   Ciclo de 4.8s. Un tablero entra cada 22% del ciclo, tarda otro 26% en
   recorrer la banda, y al llegar se suma a la pila. El último llega al 74%, o
   sea que hay un cuarto de ciclo largo enseñando las tres piezas hechas: esa
   pausa ES el mensaje. */
.ben__g--prod .g-rodillo{ opacity:.45; }
.ben__g--prod .g-viaje rect{ fill:rgba(30,49,164,.07); }
.ben__g--prod .g-pila rect{ fill:rgba(30,49,164,.07); transform-origin:50% 100%; }

/* La banda corre de verdad: el guion se desplaza sin parar. Es el único
   elemento con ciclo propio (0.9s) y a propósito, porque una banda que se
   parara cada vez que reinicia la escena delataría el truco. */
.ben__g--prod .g-banda{
  stroke-dasharray:7 7; opacity:.5;
  animation:prodBanda .9s linear infinite;
}
@keyframes prodBanda{ to{ stroke-dashoffset:-14; } }

.ben__g--prod .g-viaje rect{ animation:prodViaje 4.8s cubic-bezier(.4,0,.5,1) infinite; }
.ben__g--prod .g-viaje rect:nth-of-type(2){ animation-delay:1.06s; }
.ben__g--prod .g-viaje rect:nth-of-type(3){ animation-delay:2.11s; }
@keyframes prodViaje{
  0%        { transform:translateX(0);    opacity:0; }
  4%        { opacity:1; }
  26%       { transform:translateX(54px); opacity:1; }
  30%, 100% { transform:translateX(54px); opacity:0; }
}

/* Tres reglas y no una con retardos: cada pieza tiene que quedarse QUIETA desde
   que llega hasta el final del ciclo, y eso es una duración distinta para cada
   una. Con retardos sobre una sola regla, la pila parpadearía. */
.ben__g--prod .g-pila rect:nth-of-type(1){ animation:prodPila1 4.8s cubic-bezier(.22,.7,.3,1) infinite; }
.ben__g--prod .g-pila rect:nth-of-type(2){ animation:prodPila2 4.8s cubic-bezier(.22,.7,.3,1) infinite; }
.ben__g--prod .g-pila rect:nth-of-type(3){ animation:prodPila3 4.8s cubic-bezier(.22,.7,.3,1) infinite; }
@keyframes prodPila1{
  0%, 25%   { opacity:0; transform:translateY(7px) scaleY(.25); }
  31%, 100% { opacity:1; transform:none; }
}
@keyframes prodPila2{
  0%, 47%   { opacity:0; transform:translateY(7px) scaleY(.25); }
  53%, 100% { opacity:1; transform:none; }
}
@keyframes prodPila3{
  0%, 69%   { opacity:0; transform:translateY(7px) scaleY(.25); }
  75%, 100% { opacity:1; transform:none; }
}

/* ---------- 02 · CORTA Y ENCHAPA ----------
   Ciclo de 5.6s en dos tiempos. Primero la hoja cruza y detrás de ella la
   astilla se va y el filo se dibuja; después llega el canto por la derecha y se
   pega. El orden importa: si el filo se dibujara antes de que pase la hoja, el
   dibujo diría que el canto se arregla solo. */
.ben__g--filo .g-tablero{ fill:rgba(30,49,164,.06); }
.ben__g--filo .g-hoja{ stroke:var(--yellow); stroke-width:2.5; }
.ben__g--filo .g-hoja circle{ fill:var(--yellow); }
.ben__g--filo .g-canto{ fill:rgba(255,198,41,.35); stroke:var(--yellow); }

.ben__g--filo .g-hoja{ animation:filoHoja 5.6s cubic-bezier(.45,0,.55,1) infinite; }
.ben__g--filo .g-astilla{ animation:filoAstilla 5.6s linear infinite; }
.ben__g--filo .g-filo{
  stroke-dasharray:62; stroke-dashoffset:62;
  animation:filoFilo 5.6s linear infinite;
}
.ben__g--filo .g-canto{ animation:filoCanto 5.6s cubic-bezier(.22,.7,.3,1) infinite; }

@keyframes filoHoja{
  0%, 5%    { transform:translateX(10px); opacity:0; }
  9%        { transform:translateX(12px); opacity:1; }
  42%       { transform:translateX(76px); opacity:1; }
  48%, 100% { transform:translateX(76px); opacity:0; }
}
@keyframes filoAstilla{
  0%, 6%    { opacity:.55; }
  42%, 93%  { opacity:0; }
  /* El reinicio, disimulado: la astilla vuelve desvaneciéndose en el último 7%
     en vez de reaparecer de golpe en el fotograma cero. */
  100%      { opacity:.55; }
}
@keyframes filoFilo{
  0%, 6%    { stroke-dashoffset:62; }
  42%, 93%  { stroke-dashoffset:0; }
  100%      { stroke-dashoffset:62; }
}
@keyframes filoCanto{
  0%, 52%   { transform:translateX(24px); opacity:0; }
  58%       { opacity:1; }
  72%, 93%  { transform:translateX(0);    opacity:1; }
  100%      { transform:translateX(0);    opacity:0; }
}

/* ---------- 03 · EL DESPIECE ----------
   Ciclo de 5.2s. Sobre el tablero entero aparecen las piezas aprovechadas, y
   luego el retal se encoge hacia su borde derecho mientras la pieza de al lado
   crece hacia la derecha para ocupar lo recuperado. Los dos movimientos son
   simultáneos y opuestos a propósito: es lo que hace que se lea como
   TRANSFERENCIA de material y no como dos cosas que cambian de tamaño.
   El retal se ancla por la derecha y la pieza por la izquierda, así que nunca
   llegan a solaparse: comprobado con las cotas del propio dibujo. */
.ben__g--merma .g-hoja{ stroke-dasharray:4 5; opacity:.42; }
.ben__g--merma .g-piezas rect{ fill:rgba(30,49,164,.07); }
.ben__g--merma .g-gana{ fill:rgba(30,49,164,.07); transform-origin:0% 50%; }
.ben__g--merma .g-merma{ stroke-dasharray:4 4; transform-origin:100% 50%; }

.ben__g--merma .g-piezas rect{ animation:mermaPieza 5.2s cubic-bezier(.22,.7,.3,1) infinite; }
.ben__g--merma .g-piezas rect:nth-of-type(2){ animation-delay:.16s; }
.ben__g--merma .g-gana{  animation:mermaGana  5.2s cubic-bezier(.22,.7,.3,1) infinite; }
.ben__g--merma .g-merma{ animation:mermaRetal 5.2s cubic-bezier(.22,.7,.3,1) infinite; }

@keyframes mermaPieza{
  0%, 6%    { opacity:0; }
  16%, 94%  { opacity:1; }
  100%      { opacity:0; }
}
@keyframes mermaGana{
  0%, 20%   { opacity:0; transform:scaleX(1); }
  28%, 50%  { opacity:1; transform:scaleX(1); stroke:var(--blue); }
  /* Se pone amarilla justo mientras crece: el amarillo marca la herramienta o
     la ganancia activa, nunca decora. Al terminar vuelve a azul, porque ya es
     material aprovechado como el resto. */
  68%       { opacity:1; transform:scaleX(1.45); stroke:var(--yellow); }
  80%, 94%  { opacity:1; transform:scaleX(1.45); stroke:var(--blue); }
  100%      { opacity:0; transform:scaleX(1.45); }
}
@keyframes mermaRetal{
  0%, 20%   { opacity:0;   transform:scaleX(1); }
  28%, 50%  { opacity:.75; transform:scaleX(1); }
  68%, 94%  { opacity:.22; transform:scaleX(.1); }
  100%      { opacity:0;   transform:scaleX(.1); }
}

/* ==========================================================================
   FRANJA DE DATOS DEL HERO  (26/09/2026, tercera versión)

   v1: cuatro casillas con etiqueta encima del valor. Se leía como una tabla de
       especificaciones, y lo que hay ahí son argumentos de confianza.
   v2: los cuatro en una línea con puntos. No cabía: partía en dos y el punto
       separador se quedaba huérfano al principio del segundo renglón.
   v3, esta: las estrellas SOLAS y arriba, como ancla, y debajo una sola línea
       con los tres hechos. Dos renglones deliberados en vez de uno partido.
   ========================================================================== */
.factline{
  margin:clamp(22px,2.8vw,34px) auto 0;
  display:grid; justify-items:center;
  max-width:min(100%,900px);
}
/* TRES PLACAS, NO UNA LÍNEA DE PIE DE PÁGINA.
   Esto era texto gris con puntos separadores, y lo que hay ahí son los tres
   datos que un comprador que compara máquinas lee antes que cualquier frase.
   Borde fino, fondo translúcido sobre el azul e icono amarillo: cada dato pasa
   a ser una pieza con peso propio sin convertirse en una rejilla de casillas
   con etiqueta encima, que ya se probó y se leía como una tabla técnica.

   El fondo es `rgba` sobre el azul del hero y no un color fijo a propósito: el
   degradado del hero cambia de tono de arriba abajo, y una placa opaca se
   vería pegada encima. */
.facts{
  list-style:none; margin:0; padding:0;
  display:flex; flex-wrap:wrap; justify-content:center;
  gap:clamp(8px,1vw,12px);
}
.fact{
  display:inline-flex; align-items:center; gap:9px;
  padding:9px clamp(13px,1.2vw,17px);
  border-radius:999px;
  border:1px solid rgba(255,255,255,.22);
  background:rgba(255,255,255,.07);
  /* El desenfoque de fondo es lo que separa la placa del degradado sin subirle
     la opacidad: con más fondo opaco, tres placas seguidas tapan el hero. */
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  font-size:clamp(13.5px,1.1vw,15px); line-height:1.35;
  color:var(--hero-muted); white-space:nowrap;
}
.fact b{ font-weight:600; color:var(--hero-fg); }
.fact svg{
  width:17px; height:17px; flex:0 0 auto;
  fill:none; stroke:var(--yellow); stroke-width:1.6;
  stroke-linecap:round; stroke-linejoin:round;
}

/* En pantalla estrecha se apilan y dejan de ser `nowrap`: tres placas en fila
   en un teléfono salen a 10px de cuerpo o se desbordan. Apiladas siguen
   leyéndose como placas, que es lo que importa. */
@media (max-width:560px){
  .facts{ flex-direction:column; align-items:stretch; width:100%; gap:7px; }
  /* Más apretadas que en escritorio, y con motivo medido: apiladas suman 131px
     dentro de un hero que en un teléfono ya va al límite, y esos píxeles salen
     del alto de las máquinas. Con este recorte bajan a ~105 sin que dejen de
     leerse como placas. */
  .fact{
    justify-content:flex-start; white-space:normal;
    padding:7px 13px; gap:8px; font-size:13.5px;
  }
  .fact svg{ width:16px; height:16px; }
}

/* ==========================================================================
   TOP VENTAS  ·  cuatro paneles, lenguaje de retícula de Apple  (26/09/2026)

   La diferencia con una tarjeta de catálogo corriente no es el radio ni la
   sombra: es que el producto vive DENTRO del panel, no en una foto pegada
   arriba. El texto y la máquina comparten el mismo aire.

   La segunda diferencia son los fondos: alternan claro, tintado y oscuro.
   Cuatro paneles idénticos se leen como un formulario por muy bien resueltos
   que estén.
   ========================================================================== */
.tops__head{
  display:flex; flex-wrap:wrap; align-items:flex-end; justify-content:space-between;
  gap:16px clamp(20px,3vw,40px); margin-bottom:clamp(24px,3vw,38px);
}
.tops__head > div{ display:grid; gap:12px; }
/* El margen lateral es EXACTAMENTE el mismo que el hueco entre paneles. Ni cero
   (los paneles cortados contra el borde) ni el margen de lectura del resto de
   la página (vuelven a ser tarjetas sobre un fondo). Mismo valor en los dos
   sitios: es lo que hace que la retícula se lea como una sola superficie
   despiezada. La variable existe para que no se puedan desincronizar. */
.tops__grid{
  --tile-gap:var(--gap-unit);
  display:grid; gap:var(--tile-gap);
  grid-template-columns:1fr;
  padding-inline:var(--tile-gap);
}
@media (min-width:860px){ .tops__grid{ grid-template-columns:repeat(2,minmax(0,1fr)); } }

.tt{
  position:relative; overflow:hidden; min-width:0;
  /* A escuadra. Con la rejilla tocando los bordes de la pantalla, un radio en
     las esquinas delata que son tarjetas sueltas. */
  border-radius:0;
  display:grid; align-content:space-between; gap:clamp(18px,2vw,26px);
  padding:clamp(24px,2.4vw,42px);
  min-height:clamp(420px,34vw,560px);
  isolation:isolate;
}
.tt__body{ display:grid; gap:10px; align-content:start; justify-items:start; }
.tt__k{
  font-family:var(--f-body); font-weight:700; font-size:14px;
  letter-spacing:.13em; text-transform:uppercase; line-height:1.4;
}
.tt__n{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(30px,3.4vw,44px); line-height:.98; letter-spacing:-.02em;
}
.tt__c{ margin:0; font-size:clamp(15.5px,1.3vw,17.5px); line-height:1.5; max-width:32ch; }
.tt__p{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(16px,1.5vw,19px); letter-spacing:-.005em;
}
.tt__cta{ display:flex; flex-wrap:wrap; gap:9px; padding-top:6px; }

/* La máquina, apoyada abajo y sangrando por los lados: llena el panel en vez de
   quedarse en una caja dentro de otra caja. */
.tt__art{ margin:0; display:grid; place-items:end center; min-width:0; }
/* La máquina manda. Al quitar el precio, el bloque de texto se quedó en cuatro
   líneas y el panel pedía que la imagen ocupara ese sitio: es lo que hace que
   la ficha se lea como producto y no como anuncio. Sangra por los lados a
   propósito, igual que en las fichas de línea. */
/* IGUALDAD POR ÁREA, NO POR ALTURA. Este era el fallo.
   Con un mismo tope de altura para todas, la escuadradora (2:1) ocupaba el
   doble de superficie que la enchapadora (casi 1:1): medido, 282.000 px²
   contra 148.000 a la misma altura de 376px. Las dos medían lo mismo de alto y
   una parecía el doble de grande, porque el ojo pesa superficie, no altura.

   La corrección es dar más altura a las máquinas cuadradas que a las apaisadas,
   en proporción inversa a su forma, para que las cuatro ocupen la misma
   superficie. Al añadir una foto nueva, mirar su proporción y ponerle la clase
   que le toque; si aparece una proporción intermedia, hace falta una tercera. */
.tt__art img{
  display:block; width:auto; max-width:132%;
  height:auto; object-fit:contain;
}

/* La columna de la máquina se come todo lo que sobra del panel. Sin esto, el
   `align-content:space-between` del panel le daba solo su alto natural y la
   imagen no tenía contra qué crecer. */
.tt__art{ align-self:stretch; align-items:end; }
/* Margen para el zoom de entrada (1,16 → 0,98, desde el centro): con la foto
   grande, crecía ~20 px hacia arriba y se montaba sobre los botones. Medido en
   iPad vertical con la Urus 1, que tiene el texto más corto (11/10/2026). */
.tt__art{ padding-top:clamp(22px,3.2vw,36px); }

/* --- Variantes de fondo --- */
/* Degradados muy suaves, casi blancos. Los de antes tenían tanto color que el
   panel competía con la máquina; aquí el fondo solo tiene que dar aire y
   separar un panel del de al lado. */
/* DIRECCIÓN ÚNICA para los cuatro paneles: 155deg, de arriba-izquierda a
   abajo-derecha. Antes los oscuros llevaban además un foco radial con su propio
   centro, así que cada panel parecía iluminado desde un sitio distinto y la
   retícula perdía unidad. Un solo ángulo en los cuatro hace que la luz venga
   del mismo lado en toda la sección, que es lo que la vuelve una superficie.
   Si se cambia el ángulo, se cambia en los tres a la vez.

   Los dos claros NO son el mismo claro: uno tira a gris neutro y otro a azul de
   marca. Con el mismo tono la fila de arriba se ve como un solo panel partido
   por una junta. */
/* Uno es GRIS FRÍO y el otro AZUL, sin ambigüedad. Antes se parecían demasiado
   y la fila de arriba se leía como un solo panel con una junta. Los dos con la
   componente azul por encima de la roja: en esta paleta no entra ni un blanco
   que tire a crema. */
.tt--light{ background:linear-gradient(155deg,#EAECF1 0%,#F6F7FA 78%); color:var(--graphite); }
.tt--tint{  background:linear-gradient(155deg,#D8E3FF 0%,#EDF2FF 78%); color:var(--graphite); }
.tt--light .tt__k, .tt--tint .tt__k{ color:var(--blue); }
.tt--light .tt__c, .tt--tint .tt__c{ color:var(--slate); }
.tt--light .tt__p, .tt--tint .tt__p{ color:var(--graphite); }
.tt--light .tt__art img,
.tt--tint .tt__art img{ filter:drop-shadow(0 18px 26px rgba(11,13,18,.18)); }

/* Fila de abajo en negro, como en la retícula de referencia: las dos claras
   arriba y las dos oscuras abajo. El reparto por FILAS, y no alternando en
   damero, es lo que hace que se lea como una composición y no como cuatro
   piezas sueltas de colores distintos.
   Negro de verdad, con un foco de azul de marca muy bajo para que el panel no
   sea una mancha plana y la máquina tenga sobre qué recortarse. */
.tt--dark{
  /* Mismo ángulo que los claros. El azul de marca vive en la primera parada del
     degradado en vez de en un foco radial: así la dirección es la misma y el
     color que a Juan le gustaba se mantiene. */
  background:linear-gradient(155deg,#1D2758 0%,#101526 52%,#08090F 100%);
  color:var(--white);
}
.tt--dark .tt__k{ color:rgba(255,255,255,.6); }
.tt--dark .tt__c{ color:rgba(255,255,255,.78); }
.tt--dark .tt__p{ color:var(--yellow); }
.tt--dark .tt__art img{ filter:drop-shadow(0 22px 30px rgba(0,0,0,.6)); }

/* Sello de la máquina más vendida. Cuelga del borde superior del panel y
   termina en el alero del logo: la misma figura que corta las secciones, aquí
   en pequeño y boca abajo. Es la única pieza de la retícula que no es ni texto
   ni máquina, así que el ojo va directo a ella sin que haga falta gritar.
   Los hombros van en las cotas exactas del logo (10.55% y 89.45%) y la punta en
   el 49.88%. Lo que NO es fiel es la profundidad: a escala real el pico sería
   de 5 px y se leería como un borde torcido, así que la punta baja más de la
   cuenta para que la figura se reconozca a este tamaño.
   La sombra va en `drop-shadow` y no en `box-shadow`: con `clip-path`, la caja
   ya no existe y `box-shadow` dibujaría un rectángulo por detrás del recorte. */
.tt__sello{
  position:absolute; top:0; right:clamp(28px,3vw,52px); z-index:3;
  padding:12px 17px 22px;
  background:var(--yellow); color:var(--graphite);
  font-family:var(--f-body); font-weight:700; font-size:12px;
  letter-spacing:.14em; text-transform:uppercase; line-height:1;
  clip-path:polygon(0 0,100% 0,100% 60%,89.45% 60%,49.88% 100%,10.55% 60%,0 60%);
  filter:drop-shadow(0 6px 14px rgba(11,13,18,.28));
}
/* El sello ocupa la esquina donde acaba el kicker. En pantallas estrechas el
   panel es mucho más angosto y los dos se tocarían. */
@media (max-width:640px){
  .tt__sello{ font-size:11px; padding:10px 13px 18px; }
  .tt--sellada .tt__k{ padding-right:132px; }
}

/* Ficha de fotografía a sangre: la imagen es el fondo y el texto va encima, con
   un velo para que se lea pase lo que pase en la foto. Es el otro formato del
   mismo lenguaje, no una excepción. */
.tt--photo{ color:var(--white); background:var(--graphite); }
.tt__bg{
  position:absolute; inset:0; z-index:-2;
  width:100%; height:100%; object-fit:cover; display:block;
}
.tt--photo::before{
  content:""; position:absolute; inset:0; z-index:-1; pointer-events:none;
  background:linear-gradient(180deg, rgba(11,13,18,.28) 0%, rgba(11,13,18,.82) 62%, rgba(11,13,18,.92) 100%);
}
/* La ficha de foto no tiene columna de máquina, así que su único hijo se iba
   arriba con el `space-between` del panel. Aquí el texto va abajo, apoyado
   sobre la parte más oscura del velo. */
.tt--photo{ align-content:end; }
.tt--photo .tt__body{ align-self:end; }
.tt--photo .tt__k{ color:rgba(255,255,255,.72); }
.tt--photo .tt__c{ color:rgba(255,255,255,.84); }
.tt--photo .tt__p{ color:var(--yellow); }
/* Sobre foto, el botón secundario de vidrio claro no se lee: pasa a contorno
   blanco. */
.tt--photo .btn--ghost,
.tt--dark .btn--ghost{
  background:transparent; color:#fff; border:1px solid rgba(255,255,255,.42);
  backdrop-filter:none; -webkit-backdrop-filter:none;
}
.tt--photo .btn--ghost:hover,
.tt--dark .btn--ghost:hover{ background:#fff; color:var(--graphite); border-color:#fff; }

/* Indicador del carrusel del hero. Puntos pequeños y el activo alargado en
   píldora, como el paginador de la portada de Apple. No es un control: no se
   puede pulsar y no lo anuncia el lector de pantalla (`aria-hidden`). Su
   trabajo es decir cuántas máquinas hay y por dónde va, nada más. */
/* SELECTOR (01/10/2026): flechas a los lados del paginador, y los puntos
   pasan a ser botones. Mismo dibujo de antes; lo nuevo es que se pueden
   pulsar. El área táctil del punto es mayor que el punto (pseudoelemento). */
.hcar__ctrl[hidden]{ display:none; }
/* `.hcar` es una fila flex: como hermano de la pista, el selector se iba a la
   derecha, fuera de pantalla (y por eso los puntos de antes nunca se vieron).
   Va anclado abajo al centro, justo encima del alero, y la banda reserva su
   alto en el `padding-bottom`. */
.hcar{ padding-bottom:calc(clamp(30px,4vw,62px) + 14px); }   /* sin flechas ni puntos desde el 11/10/2026: su alto vuelve a las máquinas */
.hcar__ctrl{
  position:absolute; left:50%; transform:translateX(-50%); z-index:3;
  bottom:calc(clamp(30px,4vw,62px) + 10px);
  display:flex; justify-content:center; align-items:center; gap:18px;
}
.hcar__dots{
  display:flex; justify-content:center; align-items:center; gap:9px;
}
.hcar__dots button{
  position:relative; display:block; width:7px; height:7px; padding:0; border:0;
  border-radius:99px; cursor:pointer;
  background:var(--hero-fg); opacity:.28;
  transition:width .45s cubic-bezier(.2,.8,.3,1), opacity .35s ease;
}
.hcar__dots button::after{ content:""; position:absolute; inset:-10px -5px; }
.hcar__dots button:hover{ opacity:.6; }
.hcar__dots button.is-on{ width:26px; opacity:.95; }
.hcar__dots button:focus-visible{ outline:2px solid var(--yellow); outline-offset:4px; }
.hcar__arw{
  width:40px; height:40px; border-radius:99px; display:grid; place-items:center;
  border:1px solid var(--hero-line); background:rgba(255,255,255,.08); color:var(--hero-fg);
  cursor:pointer;
  transition:background .2s ease, color .2s ease, border-color .2s ease, transform .15s ease;
}
.hcar__arw:hover{ background:var(--white); color:var(--blue); border-color:var(--white); }
.hcar__arw:active{ transform:scale(.94); }
.hcar__arw:focus-visible{ outline:2px solid var(--yellow); outline-offset:3px; }


/* ==========================================================================
   TAMAÑO PERCIBIDO  ·  regla general del sitio  (26/09/2026)

   Juan: «tú no diseñas en base al tamaño de la imagen, se hace en base al
   tamaño percibido».

   EL PROBLEMA. Dándole el mismo tope de ALTURA a todas las máquinas, una
   escuadradora (proporción 2:1) ocupa el doble de superficie que una
   enchapadora (casi 1:1). Medido a 376px de alto: 282.000 px² contra 148.000.
   Las dos miden lo mismo y una parece el doble de grande, porque el ojo pesa
   superficie, no altura.

   LA REGLA. La altura se reparte en proporción inversa a la forma, de modo que
   todas ocupen una superficie parecida. Para igualar área hace falta que la
   altura vaya como 1/√proporción: entre una 2:1 y una 1:1 eso es un factor de
   1.41, que es exactamente el que hay entre los dos coeficientes de abajo.

   CÓMO SE USA. Cada contenedor declara su `--h-base` (cuánto espacio hay ahí) y
   cada <img> de máquina lleva `data-forma`, que se deduce de sus atributos
   `width` y `height` del propio marcado. Al añadir una foto nueva no hay que
   tocar el CSS: basta con poner el atributo que le corresponda por proporción.
   Corte: 1.5. Por encima es «ancha», por debajo «cuadrada».
   ========================================================================== */
img[data-forma="ancha"]{    max-height:calc(var(--h-base) * .82); }
img[data-forma="cuadrada"]{ max-height:calc(var(--h-base) * 1.16); }

/* Cada contexto dice cuánto sitio hay, y la regla de arriba lo reparte. */
/* El primer valor es el deseo; el segundo es lo que cabe.
   Presupuesto vertical de la banda, medido: 12px de hueco + 45px del pie + 24px
   de margen para que la máquina del borde, que SUBE con el arco, no se corte
   contra el techo de la banda = 81px que NO son foto. Y la foto puede llegar a `--h-base * 1.16` por la regla de tamaño
   percibido, así que el tope real es (alto de la banda - 81) / 1.16.
   Sin esto, en una ventana corta la foto pedía su altura por `vh` y el pie se
   iba por debajo del alero que cierra el hero. */
/* EL TÉRMINO EN `vh` DEJA DE SER EL QUE MANDA.
   Estaba en `clamp(200px, 31vh, 370px)` y en una pantalla alta era ÉL quien
   topaba la foto, no el sitio disponible: medido en 1700x1220, la franja daba
   para 494px de foto y el tope la dejaba en 370. El resultado eran casi 300px
   de azul vacío entre el texto y las máquinas, y ese hueco no se arregla
   moviendo el aire de sitio, se arregla dejando que la máquina ocupe el sitio
   que hay. En un hero de producto, grande es lo correcto.
   Subido a 40vh/560, el que gobierna vuelve a ser el término en `cqh`, que es
   el que sabe cuánto espacio queda de verdad. El `vh` se queda solo como tope
   de cordura para una ventana desproporcionadamente alta y estrecha. */
.hcar__it{  --h-base:min(clamp(200px,44vh,600px), calc(92cqh - 60px)); }
/* 11/10/2026: con el sitio de las flechas y los puntos libre, la foto ocupa
   más de su franja (de 86cqh-70 a 92cqh-60). Medido en un MacBook de 14"
   (1512x945): la máquina del centro pasa de 221 a ~280 px de alto. */
/* EN TELÉFONO MANDA EL ANCHO, NO EL ALTO.
   Este valor vivía arriba, dentro de la media query del hero, y estaba MUERTO:
   la línea de aquí abajo es posterior en el archivo y con la misma
   especificidad, así que ganaba siempre. Resultado medido a 375px: la
   enchapadora salía 431px de ancha, o sea 56px más ancha que la pantalla.
   El tope por `vw` es el que manda de verdad: una máquina 2:1 a 40vw de alto
   ocupa 80vw de ancho, que es justo lo que cabe con aire a los lados. */
@media (max-width:979px){
  .hcar__it{ --h-base:min(clamp(165px,28vh,255px), 40vw); }
}
/* Máquinas grandes. Pueden desbordar su columna (la sección las recorta con su
   `overflow:hidden`), lo que no pueden es salirse de la sección. */
.tile__art{ --h-base:clamp(210px,30vh,380px); }
/* De clamp(235,26vw,375) a clamp(205,21vw,310). La altura del panel no la
   marcaba el `min-height` sino la foto: medido, los cuatro paneles salían a
   747px con un `min-height` de 605. Bajar la foto es lo único que los baja. */
.tt__art{   --h-base:clamp(205px,21vw,310px); }

/* ==========================================================================
   EL TALLER POR DENTRO  ·  retícula de video  (26/09/2026, versión buena)

   LO QUE ESTABA MAL. Cada pieza era una estampa de red social: velo oscuro
   cubriendo media imagen, título encima del fotograma, una píldora gris de
   «Sin sonido» y un círculo de Instagram repetido seis veces. Nada de eso
   existe en el resto de la página.

   EL CRITERIO. En todo el sitio los pies van FUERA de la imagen, en
   monoespaciada pequeña y callada: el carrusel del hero, las fichas de línea,
   los paneles de Top ventas. Aquí se hace igual. El fotograma se deja limpio,
   sin velo y sin nada escrito encima, y debajo va el pie sobre el blanco de la
   sección.

   Resultado: seis fotogramas nítidos y una tira de texto tranquila, en vez de
   seis carteles.
   ========================================================================== */
.vgal{ background:var(--paper); }
.vgal__grid{
  --tile-gap:var(--gap-unit);
  display:grid; gap:var(--tile-gap);
  padding-inline:var(--tile-gap);
  margin-top:var(--gap-unit);
  grid-template-columns:repeat(2,minmax(0,1fr));
}
/* Cuatro columnas: el rótulo más sus tres vídeos caben en una sola fila. */
@media (min-width:1000px){ .vgal__grid{ grid-template-columns:repeat(4,minmax(0,1fr)); } }

.vtile{ position:relative; margin:0; min-width:0; }

/* La pieza entera es un botón: se llega con el tabulador y el lector de
   pantalla la anuncia. Se le quita todo el aspecto de botón. */
.vtile__abrir{
  display:block; width:100%; padding:0; border:0; background:none;
  text-align:left; cursor:pointer; color:inherit; font:inherit;
  -webkit-tap-highlight-color:transparent;
}
.vtile__abrir:focus-visible{ outline:2px solid var(--blue); outline-offset:3px; }

/* --- El fotograma --- */
.vtile__marco{
  position:relative; display:block; overflow:hidden;
  /* 4:5 y no 9:16. Seis verticales de reel puro hacían una sección de tres
     pantallas de alto; el 4:5 recorta arriba y abajo, que en un reel es donde
     viven los rótulos, y deja el centro, que es donde está la máquina. */
  aspect-ratio:4/5;
  background:var(--graphite);
}
.vtile__v{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; display:block;
  /* El recorte tira hacia ARRIBA, no al centro. Estos reels llevan subtítulos
     quemados en la franja baja: centrando el recorte, cada portada salía con
     media frase encima. Subiéndolo, el 4:5 se queda con la máquina y deja fuera
     buena parte del rótulo. */
  object-position:50% 30%;
  transition:transform .8s cubic-bezier(.2,.8,.3,1);
}
.vtile__abrir:hover .vtile__v{ transform:scale(1.04); }

/* ---- PORTADA DE LAS PIEZAS EN PAUSA ----
   Un fotograma congelado, por bien elegido que esté, se lee como un vídeo que
   no cargó. Las que están en pausa llevan tratamiento de portada; la que se
   está reproduciendo no lleva ninguno, y esa diferencia es justo la que dice
   cuál está viva.

   El tratamiento son tres cosas y ninguna tapa la imagen:
     · un velo de abajo, corto, solo para asentar el triángulo;
     · un ligero rebaje de brillo, para que la que se mueve destaque;
     · el triángulo de reproducir.
   Al pasar el cursor, el velo se va y el fotograma vuelve a su brillo: la
   portada se «abre» antes de que la pulses. */
/* ---- PORTADA DE LAS PIEZAS EN PAUSA ----
   El problema de fondo: los reels llevan los subtítulos QUEMADOS en la imagen.
   No son una capa que se pueda quitar, así que cualquier fotograma trae media
   frase encima, y con seis portadas eso son seis textos compitiendo con los
   seis títulos de la página.

   Se probó teñir la imagen de azul de marca. Resolvía el texto pero se veía
   mal: convertía seis fotos en seis manchas del mismo color.

   Esto es lo que quedó: un degradado BLANCO que sube desde abajo. Hace tres
   cosas de una vez:
     · tapa justo la franja donde viven los subtítulos;
     · funde la imagen con el blanco de la sección, así que la pieza no termina
       en un corte seco sino que se disuelve en la página;
     · deja la mitad de arriba intacta, que es donde está la máquina.
   Y al señalarla se retira, para ver el fotograma completo. */
.vtile__marco::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  /* Las paradas están puestas contra la franja donde caen los subtítulos, que
     en estos reels es el 15-25% inferior: ahí el blanco tiene que ir casi
     opaco. Por encima del 45% se retira del todo para no tocar la máquina. */
  background:linear-gradient(0deg,
    rgba(255,255,255,1)   0%,
    rgba(255,255,255,.99) 18%,
    rgba(255,255,255,.90) 28%,
    rgba(255,255,255,.42) 40%,
    rgba(255,255,255,0)   66%);
  transition:opacity .45s ease;
}
/* La que se reproduce va limpia: esa diferencia es la que dice cuál está viva,
   sin ningún rótulo que lo explique. */
/* La que se reproduce conserva parte del degradado: sin él, su título quedaría
   en grafito sobre el vídeo y no se leería. Se rebaja lo justo para que el
   vídeo respire y el nombre siga legible. */
.vtile.is-viva .vtile__marco::after{ opacity:.82; }
.vtile__abrir:hover .vtile__marco::after{ opacity:.25; }

/* ---- Control de reproducir ----
   Dos intentos antes de este: círculo amarillo macizo (un botón de marca
   encima de una foto: pesa, tapa y compite con el CTA de verdad) y círculo de
   vidrio (más discreto, pero redondo, y en este sitio no hay nada redondo).

   La geometría del sitio es el RECTÁNGULO DE CANTO SUAVE de 12px, que es la
   forma que Juan eligió para todos los botones cuando se decidió el sistema. El
   control de vídeo usa esa misma forma: así no es un elemento prestado de un
   reproductor, es un botón de esta página.

   Vidrio oscuro y no amarillo: el amarillo del sitio es el color de las
   acciones comerciales (escribir, cotizar), y gastarlo en un control de
   reproducción le quita fuerza donde sí importa. */
.vtile__play{
  position:absolute; top:50%; left:50%; z-index:2;
  transform:translate(-50%,-50%);
  width:clamp(54px,4.4vw,64px); height:clamp(38px,3.1vw,46px);
  border-radius:var(--r-in-lg);
  display:grid; place-items:center;
  background:rgba(11,13,18,.46);
  border:1px solid rgba(255,255,255,.26);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14);
  backdrop-filter:blur(14px) saturate(1.6);
  -webkit-backdrop-filter:blur(14px) saturate(1.6);
  pointer-events:none;
  transition:transform .35s cubic-bezier(.2,.8,.3,1), background-color .3s ease, border-color .3s ease;
}
/* El desplazamiento óptico de 2px es necesario: un triángulo centrado por
   geometría se ve corrido a la izquierda, porque su masa está a la izquierda
   del punto medio. */
.vtile__play::before{
  content:""; display:block; margin-left:2px;
  border-style:solid; border-width:7px 0 7px 11.5px;
  border-color:transparent transparent transparent #fff;
}
.vtile__abrir:hover .vtile__play{
  transform:translate(-50%,-50%) scale(1.07);
  background:rgba(11,13,18,.66);
  border-color:rgba(255,255,255,.42);
}
/* La que se reproduce sola no necesita invitar a darle play. */
.vtile.is-viva .vtile__play{ display:none; }

/* ---- El rótulo de cada línea, como PIEZA de la retícula ----
   Intentos previos: título de sección más subtítulo por grupo (jerarquía de
   más), y rótulo apilado sobre fondo blanco encima de la retícula (dos líneas
   de texto flotando en blanco: sin composición y sin peso).

   Esta versión mete el rótulo DENTRO de la retícula, con la misma caja y el
   mismo tamaño que un vídeo, en el color de su línea. Tres vídeos más el
   rótulo hacen una fila exacta de cuatro, así que cada línea ocupa una fila y
   se lee como una unidad. Es lo mismo que hacen las retículas de producto: la
   pieza de texto vale igual que la pieza de imagen.
   ========================================================================== */
/* El primer bloque no lleva el hueco de arriba: la sección ya no tiene padding
   superior, así que ese margen se sumaba a la separación de la banda. */
#galeria .vgal__bloque:first-of-type .vgal__grid{ margin-top:0; }
.vgal__bloque + .vgal__bloque{ margin-top:var(--gap-unit); }

.vgal__panel{
  position:relative; min-width:0;
  aspect-ratio:4/5;
  display:grid; align-content:end; gap:4px;
  padding:clamp(22px,2.4vw,34px);
  overflow:hidden;
}
.vgal__linea{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  /* Ocupa la caja. El nombre de la línea es lo más grande de la sección, y en
     una pieza de este tamaño puede serlo sin pelearse con nada. */
  font-size:clamp(44px,5.6vw,84px); line-height:.86; letter-spacing:-.035em;
  /* El hueco para la tilde va en `em`, no en píxeles ni en `vw`: así crece y
     encoge CON la letra. Con un hueco fijo, a 84px sobraba y a 44px (tableta)
     la tilde de TITÁN se metía dentro del antetítulo. */
  padding-top:.26em;
}

/* Titán: azul oscuro, el mismo registro que su ficha de línea. */
.vgal__panel--titan{
  background:linear-gradient(155deg, #1B2557 0%, #0E1330 52%, #0B0D18 100%);
}
.vgal__panel--titan .vgal__linea{ color:#fff; }
.vgal__panel--titan .eyebrow{ color:var(--yellow); }

/* Urus: amarillo de marca, como su ficha. */
.vgal__panel--urus{
  background:linear-gradient(155deg, #FFD24D 0%, #FFC629 46%, #F5B912 100%);
}
.vgal__panel--urus .vgal__linea{ color:var(--graphite); }
.vgal__panel--urus .eyebrow{ color:var(--blue); }

/* La sección ya no lleva botones al final: sacaban al visitante de la página
   en el momento de más interés del scroll. */

/* --- El nombre, DENTRO de la portada ---
   Va en la esquina inferior izquierda, sobre el degradado blanco. El degradado
   ya estaba ahí para tapar los subtítulos quemados del reel: aprovecharlo para
   asentar el título es gratis, y deja la pieza como una sola cosa en vez de una
   imagen con una etiqueta debajo.

   Texto grafito, no blanco: el fondo de esa zona es blanco casi opaco. */
.vtile__pie{
  position:absolute; left:0; right:0; bottom:0; z-index:3;
  display:grid; gap:3px;
  padding:clamp(14px,1.6vw,20px);
  pointer-events:none;
}
.vtile__t{
  font-family:var(--f-display); text-transform:uppercase; color:var(--graphite);
  font-size:clamp(16px,1.5vw,20px); line-height:1.06; letter-spacing:-.015em;
  transition:color .25s ease;
}
.vtile__abrir:hover .vtile__t{ color:var(--blue); }

/* Enlace al post original: control en la esquina de la portada, con el icono
   de Instagram. Se probó como texto «Instagram ↗» bajo el pie y no cumplía su
   función: a esa escala y en gris, nadie entiende que lleva a otro sitio. Un
   icono reconocible sobre la imagen se lee sin leer.

   Misma forma y mismo vidrio que el control de reproducir, para que los dos se
   entiendan como controles de la misma pieza y no como adornos sueltos.

   Va FUERA del <button> en el marcado, no dentro: un enlace dentro de un botón
   es HTML inválido y los navegadores lo resuelven cada uno a su manera. Aquí se
   posiciona sobre el marco, que es lo que hace que se vea dentro. */
.vtile__ig{
  position:absolute; top:12px; right:12px; z-index:4;
  display:grid; place-items:center;
  width:38px; height:34px; border-radius:var(--r-in-lg);
  color:#fff;
  background:rgba(11,13,18,.46);
  border:1px solid rgba(255,255,255,.26);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14);
  backdrop-filter:blur(14px) saturate(1.6);
  -webkit-backdrop-filter:blur(14px) saturate(1.6);
  transition:background-color .25s ease, border-color .25s ease, transform .25s cubic-bezier(.2,.8,.3,1);
}
.vtile__ig:hover{
  background:rgba(11,13,18,.7); border-color:rgba(255,255,255,.44);
  transform:scale(1.07);
}
.vtile__ig:focus-visible{ outline:2px solid var(--yellow); outline-offset:2px; }

/* ---------- Reproductor grande ---------- */
/* Se abre al pulsar una pieza: el mismo video, desde el mismo segundo, con
   sonido y con controles. Es la «vuelta» al autoplay en silencio: la retícula
   engancha, y quien se interesa recibe el mensaje completo. */
.vplay{
  position:fixed; inset:0; z-index:200;
  display:grid; place-items:center; padding:clamp(16px,3vw,40px);
  background:rgba(5,7,14,.94);
  opacity:0; visibility:hidden; transition:opacity .28s ease, visibility .28s;
}
.vplay.is-on{ opacity:1; visibility:visible; }
.vplay video{
  max-width:min(100%, 480px); max-height:100%;
  width:auto; height:auto; display:block;
  background:#000;
  box-shadow:0 40px 90px -30px rgba(0,0,0,.9);
}
.vplay__x{
  position:absolute; top:clamp(12px,2vw,24px); right:clamp(12px,2vw,24px);
  width:44px; height:44px; border-radius:50%;
  display:grid; place-items:center; cursor:pointer;
  background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.28);
  color:#fff; font-size:20px; line-height:1;
}
.vplay__x:hover{ background:rgba(255,255,255,.22); }

/* Solo la PRIMERA pieza se reproduce sola (ver bloque E-ter de main.js). Las
   otras cinco son fotogramas quietos y llevan botón de reproducir.
   No se rebajan ni se desaturan: como no compiten en movimiento con nada, no
   hay nada que apagar, y rebajarlas las haría parecer no disponibles. */



/* ==========================================================================
   RITMO DE COLOR DE LA MITAD DE ABAJO  (26/09/2026)

   Arriba la página alterna azul, azul oscuro, amarillo y blanco, y ese cambio
   es lo que rompe la monotonía. Abajo había color pero fallaban tres cosas:

   1. PAQUETES y GARANTÍA usaban el MISMO degradado oscuro, una detrás de otra.
      Dos secciones idénticas seguidas se leen como una sola muy larga.
   2. Las transiciones eran rectas. El alero del logo, que es el gesto que
      identifica al sitio, se quedaba solo en la mitad de arriba.
   3. Los degradados iban a 135deg, cuando la dirección del sitio es 155deg.

   Secuencia final de la página, de arriba abajo:
     azul · azul oscuro · amarillo · blanco · blanco · gris claro ·
     AZUL (paquetes) · CASI NEGRO (garantía) · BLANCO (ubicación) ·
     AZUL (cierre) · blanco (pie)
   ========================================================================== */

/* LA SECUENCIA, COMPLETA. Arriba la página va azul, azul oscuro, AMARILLO y
   blanco. Abajo faltaba el amarillo, que es justo el que cierra el ciclo.

   Reparto de abajo (actualizado el 28/09/2026, al irse paquetes al
   marketplace):
     GARANTÍA   casi negro
     CIERRE     claro, con el amarillo DENTRO del cuadro que pide la acción
     PIE        claro

   El amarillo cae en el cierre a propósito: es la última pantalla y la única
   que pide una acción, y el amarillo es el color de acción de la marca. Termina
   donde el ojo tiene que quedarse. */
/* `.packs` se fue con la sección. Su degradado es el mismo del hero y el de
   `.ppanel--azul`, así que no se pierde de la paleta. */
.aftersale{
  background:linear-gradient(155deg, #1B2557 0%, #0E1330 52%, #0B0D18 100%);
  color:var(--white);
}

/* ---- UBICACIÓN: ya no es una sección amarilla ----
   Era una franja amarilla propia entre garantía y el cierre. Juan la quitó y
   se llevó sus dos paneles debajo de los dos cuadros grandes, así que el final
   de la página es UN bloque de cuatro paneles: escribir, catálogo, bodega y
   mapa.

   El amarillo no se pierde de la secuencia: se concentra en el cuadro que pide
   la conversación, que es donde de verdad tiene que llamar. La secuencia de
   abajo queda azul, casi negro, claro (con el amarillo dentro), claro.

   El panel de la bodega ya NO lleva botón. Primero se le puso en grafito para
   que no compitiera con el cuadro amarillo; al final se quitó entero, porque el
   cuadro de encima ya abre WhatsApp y dos botones del mismo canal a diez
   píxeles uno del otro se estorban. La dirección y el horario bastan. */
/* Aire entre el bloque de contacto y los dos paneles de la bodega. No es el
   hueco de 10px de la retícula: eso valía cuando los cuatro eran paneles y
   tenían que leerse como un bloque. Aquí arriba hay texto centrado, que
   necesita separarse de la caja que tiene debajo. */
.cierre__in + .pgrid--mapa{ margin-top:clamp(48px,6vw,88px); }

/* UNA SOLA SUPERFICIE CLARA EN TODA LA PÁGINA: `--paper` (#F6F8FC).
   Juan: «no me gusta que cambie de tono de blanco; mantén el mismo blanco de la
   sección de arriba, ese me gusta, el de abajo no».
   Había dos claros conviviendo, #FFFFFF y #F6F8FC, y en la junta entre dos
   secciones el salto se lee como un error de maquetación, no como un cambio de
   sección. El blanco puro se queda SOLO para piezas que tienen que despegarse
   de un color (la tarjeta de ubicación sobre amarillo), nunca como fondo de
   sección. */
.close{
  background:var(--paper);
  color:var(--graphite);
}
/* EL BOTÓN FANTASMA SOBRE CLARO.
   Esta corrección existía y se perdió al convertir el cierre en dos cuadros de
   color: como esos cuadros traían su propio fondo, el botón fantasma dejó de
   hacer falta y la regla se borró. Al volver a los botones normales, el
   fantasma se quedó con el estilo de superficie oscura (texto blanco sobre
   fondo blanco al 12%) y era literalmente invisible sobre la sección clara. */
.close .btn--ghost{
  border:1px solid rgba(30,49,164,.26); color:var(--blue);
  background:rgba(255,255,255,.55);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.75);
  backdrop-filter:none; -webkit-backdrop-filter:none;
}
.close .btn--ghost:hover{ background:var(--blue); color:var(--white); border-color:var(--blue); }
.close .btn--ghost::before{ background:linear-gradient(100deg, transparent, rgba(30,49,164,.20), transparent); }

.close .eyebrow{ color:var(--blue); }
.close h2{ color:var(--graphite); }
.close .lead{ color:var(--slate); }
.close .close__micro{ color:var(--slate); }
/* Los orbes de fondo del cierre eran blancos y azul eléctrico sobre azul.
   Sobre blanco no se ven o ensucian: se apagan. */
.close .orb{ display:none; }
/* El cierre ya no lleva botones sueltos: sus dos cuadros SON los botones, y
   traen su propio color. Las correcciones de `.btn--ghost` sobre blanco se
   quitaron con ellos. */

/* La línea blanca del alero no se ve sobre una sección clara: ahí la costura la
   marca un filete gris finísimo. Vale para beneficios (viene del amarillo de
   Urus) y trayectoria (viene de la galería, clara).

   El CIERRE no entra en esta lista: encima tiene la sección casi negra de
   garantía, y sobre negro el filete gris desaparece. Ahí la costura es la línea
   BLANCA de siempre, la misma que separa Titán de Urus. La costura se elige por
   el color de ARRIBA, no por el de la sección que la lleva. */
/* `.authority` salió de esta lista el 30/09/2026 junto con su `cut-top`: la
   galería que tiene encima es del mismo papel, así que no había costura que
   marcar. */
.bens.cut-top::before{ background:rgba(11,13,18,.10); }

/* `.cut-top` mete su propio `padding-top` grande, que en las secciones de
   abajo se suma al que ya tenían y deja un hueco enorme. Se normaliza: el
   alero, y el aire normal de sección. */
.aftersale.cut-top,
.close.cut-top{
  padding-top:calc(clamp(72px,11vw,132px) + var(--seam-h));
}


/* EL PIE YA NO LLEVA ALERO. Lo tenía de cuando el cierre era amarillo y el pie
   blanco: ahí la costura separaba dos colores. Ahora los dos son la misma
   superficie clara, así que el alero era una línea gris flotando en medio de
   la nada, sin nada que separar. Juan: «este sí sobra».

   Regla que deja: el alero es una COSTURA, no un adorno. Solo va donde cambia
   el color. Si algún día el pie vuelve a tener fondo propio, se le devuelve
   `cut-top` en el marcado y estas dos reglas. */

/* ==========================================================================
   BANDA DE RESPIRO  ·  marquesina a contorno  (26/09/2026)

   Entre Top ventas (cuatro paneles) y la galería (ocho piezas) había doce
   cuadros seguidos sin nada que los separara. La banda no añade contenido,
   añade PAUSA.

   Primera versión: la frase una sola vez, muy grande, desplazándose con el
   scroll. Se leía a trozos y nunca entera.
   Esta: la frase MÁS PEQUEÑA y repetida en bucle sin fin. Se lee completa de
   un vistazo, y la repetición es lo que convierte el texto en textura: deja de
   ser un titular que compite con los dos de abajo y pasa a ser un ritmo.

   Va a contorno porque tiene que ocupar mucho y pesar poco.
   ========================================================================== */
/* EL AIRE BLANCO LO PONEN LOS VECINOS, no la banda.
   Mientras la banda fue de papel, su propio `padding-block` ERA el hueco
   blanco, así que se les quitaba el suyo a las dos secciones de al lado para
   que no se sumaran tres aires distintos (llegaron a quedar 95px arriba y
   150px abajo, que es lo que se veía descuadrado).
   Al volverse oscura eso dejó de valer: su padding ahora es NEGRO, y el filete
   quedó pegado a la rejilla de arriba y a la galería de abajo sin un milímetro
   de respiro. Juan: «al menos deja espacio blanco separando los elementos».
   Así que el hueco vuelve a los vecinos, y con el MISMO número en los dos lados
   para que el filete quede centrado en su aire y no colgando de uno. El
   `padding-block` de la propia banda ya no es separación: es el margen de la
   tinta dentro del filete. */
#lineas{ padding-bottom:clamp(48px,5.5vw,86px); }
#galeria{ padding-top:clamp(48px,5.5vw,86px); }
.banda{
  position:relative; overflow:hidden;
  /* OSCURA, y aquí está el rediseño.
     Antes era papel sobre papel: la banda separaba dos rejillas claras siendo
     ella misma clara, así que no separaba nada. Lo único que la distinguía era
     un texto a contorno tan tenue que el ojo lo leía como página en blanco, y
     eso, sumado al vacío que dejaba el pin, es lo que Juan detestaba.
     Ahora es un CORTE. La página venía de blanco (beneficios), azul (Titán),
     amarillo (Urus) y blanco otra vez (Top ventas): un filete casi negro a
     sangre completa le devuelve el pulso antes de entrar a la galería. No usa
     ni el azul ni el amarillo a propósito, porque esos dos ya tienen dueño
     (Titán y Urus) y aquí no se está hablando de ninguna línea.
     El negro no es nuevo en la paleta: es el mismo de la sección de garantía.

     30/09/2026: Juan lo pidió en degradado azul oscuro en vez de plano. Va en
     155deg como todo lo demás de la página (fichas de línea, paneles de Top
     ventas): una sola dirección en todo el sitio es lo que hace que los fondos
     se lean como una superficie y no como parches sueltos. No es el degradado
     de la ficha Titán aunque se le parezca: este es más azul y menos violeta a
     propósito, para que se lea como el fondo profundo de la página y no como la
     línea Titán. */
  background:linear-gradient(155deg, #101A4A 0%, #0B1230 52%, #080A16 100%);
  /* Baja de clamp(54,7vw,104) a clamp(30,3.4vw,52). Es una PAUSA entre dos
     rejillas: tiene que sentirse como el silencio entre dos frases, no como
     una sección propia. Con el pin fuera (ver main.js) y este aire recortado,
     la banda pasa de ocupar 813px de página a ocupar poco más de 180. */
  padding-block:clamp(30px,3.4vw,52px);
}
.banda__pista{
  display:flex; align-items:center; gap:clamp(24px,3vw,56px);
  width:max-content;
  will-change:transform;
}
/* LOS EXTREMOS SE DISUELVEN, con un velo y no con una máscara.
   La frase tiene que apagarse contra los bordes para leerse como continua y no
   como recortada. Mientras la banda fue clara, eso lo hacía un `mask-image`
   sobre la banda entera. Ya no sirve: con fondo negro la máscara desvanece
   también el propio filete y lo deja con las puntas deshilachadas.
   Y moverla a la pista es peor todavía, aunque parezca lo obvio: la pista es lo
   único que se mueve, así que la máscara viajaría CON el texto en vez de
   quedarse quieta en los bordes de la pantalla.
   Sobre un fondo de color sólido no hace falta máscara ninguna: dos degradados
   del mismo negro, quietos encima, hacen el mismo apagado y son exactos. */
.banda::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  /* EL VELO ES EL MISMO FONDO, RECORTADO POR LOS BORDES.
     Mientras la banda fue de un color plano, bastaban dos degradados de ese
     color. Con un degradado de fondo eso deja de servir: el velo tendría que
     saber qué tono le toca en cada punto, y en 155deg el tono cambia además con
     la altura.
     La solución es no adivinarlo: `background:inherit` le da al velo
     EXACTAMENTE el mismo degradado y en la misma caja, así que encaja píxel a
     píxel por construcción, y la máscara solo decide dónde es opaco. Sigue
     valiendo si mañana se cambia el degradado, porque no hay ningún color
     repetido que mantener sincronizado. */
  background:inherit;
  -webkit-mask-image:linear-gradient(90deg, #000 0, transparent 9%, transparent 91%, #000 100%);
          mask-image:linear-gradient(90deg, #000 0, transparent 9%, transparent 91%, #000 100%);
}
/* La tinta de esta frase NO coincide con su caja, y por mucho: medido con
   `measureText` sobre Fugaz One, las tildes de MÁQUINAS y ACCIÓN suben 0.231em
   POR ENCIMA del borde superior de la caja, y el trazo baja 0.046em por debajo
   del inferior. Con `padding` simétrico en la banda, el hueco que se VE queda
   20px más corto arriba que abajo aunque los dos números sean iguales.
   Estos dos márgenes devuelven a la caja el tamaño de la tinta, así que a
   partir de aquí el padding simétrico se ve simétrico. En `em`, para que siga
   cuadrando cuando la letra escale con el `clamp`. */
/* MACIZA, no a contorno. Es la misma corrección que ya se hizo en los números
   de beneficios, y por el motivo escrito allí: Fugaz One es gruesa e inclinada,
   y vaciarla deja un dibujo endeble que parece un efecto de procesador de
   textos. Se probó además maciza en un tinte muy pálido sobre papel, y salió
   peor: sobre fondo claro caía justo en el vicio que Juan señaló con la
   Fragment Mono, «no se ve, no se lee, se disimula». Sobre el negro, en cambio,
   un blanco al 82% se lee de un vistazo sin gritar.
   Más pequeña que antes (68 en vez de 86): sobre fondo oscuro pesa más con el
   mismo tamaño, y esto tiene que ser un ritmo, no un titular que compita con
   los dos que tiene encima y debajo.
   Se fue con el pin la opacidad atada a `--entrada`: ya no hay entrada. */
.banda__t{
  margin-top:.231em; margin-bottom:.046em;
  display:block; white-space:nowrap;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(28px,4.4vw,62px); line-height:1; letter-spacing:-.03em;
  color:rgba(255,255,255,.82);
  -webkit-text-stroke:0;
}
/* Separador entre repeticiones: un rombo, que es la forma del alero del logo
   reducida a su mínimo. Ni un punto genérico ni una raya (prohibida). */
.banda__t + .banda__t::before{
  content:""; display:inline-block; vertical-align:middle;
  width:clamp(9px,1vw,14px); aspect-ratio:1;
  margin-right:clamp(24px,3vw,56px);
  /* El rombo pasa de azul a amarillo: el azul al 32% sobre negro desaparece.
     Aquí el amarillo no señala línea, solo marca el compás entre repeticiones,
     que es el único acento de color que lleva la banda. */
  background:var(--yellow); opacity:.85;
  transform:rotate(45deg) translateY(-.12em);
}
@media (prefers-reduced-motion:reduce){
  .banda__pista{ transform:none !important; }
}

/* SIN TRAMA en los paneles de línea.
   Se probaron cuatro: el alero repetido en escalera (huella de llanta), el
   alero grande y espaciado, la retícula técnica (los cuadros son del branding
   de Escaland) y la chapa perforada. Ninguna aportaba: el panel ya tiene lo
   que necesita, que es un color pleno y un nombre grande.

   Queda escrito para no volver a intentarlo: la profundidad de estos paneles la
   da el contraste con los vídeos de al lado, no una textura encima. */
.vgal__panel--titan{ color:#fff; }
.vgal__panel--urus{ color:var(--graphite); }

/* ==========================================================================
   RETÍCULA DE PANELES  ·  la mitad de abajo en el lenguaje de la de arriba
   (26/09/2026)

   Juan: «de aquí para arriba es notorio que hay un estilo muy bien definido,
   muy estético, pero de ahí para abajo es muy diferente».

   Tenía razón y el diagnóstico es concreto. De la portada a la galería, la
   página es una RETÍCULA A SANGRE: paneles a escuadra, margen lateral y hueco
   del mismo grosor (`--gap-unit`), degradados lineales a 155°, tipografía
   display en mayúsculas y nada que flote. De la galería para abajo seguía
   siendo la página anterior: contenedor centrado de 1200 px, tarjetas con
   sombra y borde redondeado, vidrio, orbes de fondo y entradas en 3D.

   Este bloque trae las piezas de arriba abajo. Es UN solo juego de clases
   (`.pgrid` + `.ppanel`) para que cualquier sección nueva herede el estilo sin
   volver a escribirlo:

     .pgrid      la retícula a sangre. Margen lateral = hueco = --gap-unit.
     .pgrid__head  el bloque de título que va ENCIMA de una retícula, alineado
                 con su primer panel (misma sangría que el margen).
     .ppanel     el panel: a escuadra, sin sombra, sin borde, recorta lo suyo.
     --dark --light --tint --papel   las cuatro superficies, todas 155°.

   Lo que se va, y por qué:
     · el contenedor centrado en estas secciones: partía la página en dos
       anchos distintos y era lo primero que delataba el cambio de estilo;
     · las sombras y los radios: arriba no hay ni uno;
     · el vidrio de los paquetes y los orbes de fondo;
     · las entradas en 3D (paquetes girando sobre su eje, cierre poniéndose de
       pie): arriba el movimiento es paralaje y subida, nunca rotación.
   ========================================================================== */

/* Una sección a sangre no lleva `padding-inline`: el margen lo pone la propia
   retícula, para que sea exactamente el mismo que el de Top ventas. */
.section--full{ padding-inline:0; }

.pgrid{
  display:grid; gap:var(--gap-unit);
  padding-inline:var(--gap-unit);
  grid-template-columns:1fr;
}
@media (min-width:860px){
  .pgrid--2{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .pgrid--3{ grid-template-columns:repeat(3,minmax(0,1fr)); }
}
/* Cinco columnas solo cuando de verdad caben. Por debajo de 1100 px cada panel
   se queda en 190 px y «CAPACITACIÓN» en display no entra: el titular se salía
   del panel. Entre medias la secuencia se lee en columna, que para cinco pasos
   numerados sigue siendo la forma natural. */
@media (min-width:1100px){
  .pgrid--5{ grid-template-columns:repeat(5,minmax(0,1fr)); }
}
/* Paso intermedio para las de cinco: en tableta, cinco columnas dejan paneles
   de 140 px donde no cabe ni el titular. */
@media (min-width:640px) and (max-width:859px){
  .pgrid--3{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}

/* SANGRÍA DEL TEXTO.
   Los paneles van a sangre con 10px, pero el TEXTO no: alineado con el borde
   del primer panel queda pegado al filo de la pantalla y se lee apretado.
   Juan: «me gustan márgenes laterales que separen el borde del texto, no me
   gusta que queden tan pegados».

   El valor no es inventado: es exactamente el borde izquierdo del `.wrap`
   (contenedor de 1240px centrado más 20px de aire), que es donde arrancan los
   titulares de beneficios y del pie. Así, aunque una sección vaya a sangre y la
   otra no, todos los antetítulos de la página caen en la misma vertical.
   El `max()` lo degrada a los 20px de siempre en pantallas estrechas. */
.pgrid__head,
.pgrid__pie,
.posventa{
  --sangria:max(var(--gutter), calc((100% - var(--maxw)) / 2 + var(--gutter)));
}
.pgrid__head{
  padding-inline:var(--sangria);
  margin-bottom:clamp(20px,2.6vw,34px);
  display:grid; gap:14px;
  /* CENTRADAS. La retícula de paneles va a sangre y es simétrica: una cabecera
     pegada a la izquierda le deja todo el peso a un lado y la sección se ve
     descuadrada. Centrada, el titular manda sobre las columnas que tiene
     debajo en vez de sobre la primera. */
  justify-items:center; text-align:center;
}
/* Lo que cuelga de la cabecera se centra con ella: el párrafo necesita su
   `margin-inline:auto` porque tiene medida máxima propia. */
.pgrid__head .lead{ margin-inline:auto; }
.pgrid__h{
  margin:0;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(30px,4.6vw,58px); letter-spacing:-.02em;
  /* Hueco para la tilde, en dos sitios porque son dos problemas distintos:
       padding-top  la tilde de la PRIMERA línea, que se sale de la caja;
       line-height  la tilde de las líneas SIGUIENTES, que se la come la línea
                    de arriba. Con .94 se cortaba la Ñ de «EL TAMAÑO».
     Los dos en `em`/sin unidad, para que escalen con la letra: con un valor
     fijo sobra en el titular grande y falta en el pequeño. */
  line-height:1.02; padding-top:.16em;
}
.pgrid__pie{ padding-inline:var(--sangria); margin-top:clamp(20px,2.6vw,32px); }

.ppanel{
  position:relative; overflow:hidden; min-width:0;
  border-radius:0; border:0; box-shadow:none;
  display:grid; align-content:start; gap:clamp(12px,1.4vw,18px);
  padding:clamp(24px,2.6vw,44px);
  isolation:isolate;
}
/* Mismas cuatro superficies y el MISMO ángulo (155°) que los paneles de Top
   ventas. Si algún día se cambia el ángulo, se cambia en los dos sitios. */
/* El azul oscuro es de la LÍNEA TITÁN. Una sección que no habla de Titán no lo
   usa: para superficie azul de marca está `--azul`, que es literalmente el
   mismo degradado del hero y de paquetes. Regla de Juan (26/09/2026): «el azul
   oscuro se queda para la línea Titán». */
.ppanel--dark{  background:linear-gradient(155deg,#1D2758 0%,#101526 52%,#08090F 100%); color:var(--white); }
.ppanel--azul{  background:linear-gradient(155deg,#16226E 0%,#1E31A4 38%,#2C45D6 72%,#1B2A8C 100%); color:var(--white); }
.ppanel--azul .ppanel__k{ color:var(--yellow); }
.ppanel--azul .ppanel__c{ color:rgba(255,255,255,.78); }
.ppanel--light{ background:linear-gradient(155deg,#EAECF1 0%,#F6F7FA 78%); color:var(--graphite); }
.ppanel--tint{  background:linear-gradient(155deg,#D8E3FF 0%,#EDF2FF 78%); color:var(--graphite); }
.ppanel--papel{ background:var(--white); color:var(--graphite); }

.ppanel__k{
  font-family:var(--f-body); font-weight:700; font-size:14px;
  letter-spacing:.14em; text-transform:uppercase; line-height:1.4;
  color:var(--blue);
}
.ppanel--dark .ppanel__k{ color:var(--yellow); }
.ppanel__t{
  margin:0;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(30px,3.4vw,52px); line-height:1.02; letter-spacing:-.02em;
  padding-top:.16em;
}
.ppanel__c{ margin:0; font-size:15.5px; line-height:1.65; color:var(--slate); max-width:46ch; }
.ppanel--dark .ppanel__c{ color:rgba(255,255,255,.74); }
.ppanel__pie{
  margin:0; font-family:var(--f-mono); font-weight:500; font-size:14px;
  color:rgba(255,255,255,.52); letter-spacing:.04em;
}

/* Marca de foto provisional. Antes era una píldora con punto amarillo y
   `backdrop-filter` que se comía la esquina de la imagen. Ahora es una etiqueta
   plana, pequeña y a escuadra: tiene que ser legible para nosotros y casi
   invisible para el visitante, porque desaparece en cuanto lleguen las fotos. */
.ppanel__nota{
  position:absolute; left:0; bottom:0; z-index:3;
  padding:5px 9px; background:rgba(11,13,18,.62); color:rgba(255,255,255,.82);
  font-family:var(--f-body); font-weight:700; font-size:10px;
  letter-spacing:.1em; text-transform:uppercase; line-height:1;
  pointer-events:none;
}

/* ---------- Trayectoria ---------- */
.authority{ background:var(--paper); }
/* LOS CUATRO PAÍSES, con bandera y nombre.
   Bajaron de titular a prueba de alcance, que es lo que son. Van como una fila
   de placas pequeñas y no como una frase dentro del párrafo: en una frase, un
   nombre de país es una palabra más; con su bandera al lado se cuenta de un
   vistazo, que es justo lo que tiene que hacer un dato de alcance. */
.paises{
  list-style:none; margin:clamp(14px,1.6vw,20px) 0 0; padding:0;
  display:flex; flex-wrap:wrap; gap:8px 10px;
}
.pais{
  display:inline-flex; align-items:center; gap:8px;
  padding:6px 12px 6px 7px; border-radius:999px;
  border:1px solid rgba(255,255,255,.2);
  background:rgba(255,255,255,.07);
  font-size:13.5px; line-height:1.3; color:rgba(255,255,255,.9);
  white-space:nowrap;
}
.pais svg{
  width:22px; height:15px; display:block; flex:0 0 auto;
  border-radius:2px;
  /* Un filete finísimo por dentro: sin él, el blanco de la bandera de Perú se
     funde con nada y la placa se ve mordida por ese lado. */
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.35);
}

.pgrid--tray{ grid-template-columns:1fr; }
@media (min-width:860px){
  .pgrid--tray{ grid-template-columns:repeat(12,minmax(0,1fr)); }
  .tray__intro{ grid-column:span 6; }
  .tray__foto{  grid-column:span 6; }
}
/* En celular y tableta vertical solo se ve el recuadro azul (Juan, 28/10/2026):
   la foto de apoyo no aporta apilada debajo y alarga la página. */
@media (max-width:859px){ .tray__foto{ display:none; } }
.tray__intro{
  gap:clamp(14px,1.6vw,22px);
  min-height:clamp(320px,30vw,460px);
  /* Rejilla con una última fila elástica: el `margin-top:auto` de las cifras
     solo las empuja al fondo si hay una fila con espacio sobrante. */
  align-content:start; grid-template-rows:auto auto 1fr auto;
}
/* La foto es un panel más: sin marco, sin esquinas y a ras de la retícula. */
.tray__foto{ padding:0; margin:0; min-height:clamp(220px,24vw,380px); background:var(--graphite); }
/* ANCLADA, NO EN FLUJO (02/10/2026). Con `height:100%` dentro de la rejilla
   del panel, la foto no tenía una altura de referencia y se quedaba con la
   suya: en un panel más alto que 16:9 asomaba una franja grafito abajo. Ahora
   cubre el panel entero y la sobremedida del paralaje se reparte arriba y
   abajo (inset de -11%). */
.tray__foto{ position:relative; }
.tray__foto img{
  position:absolute; left:0; right:0; top:-11%; z-index:0;
  display:block; width:100%; height:122%;
  /* Sobremedida: el paralaje la mueve un 5% arriba y abajo, así que sin este
     margen de sobra asomaría el fondo del panel por el borde. */
  /* 122% y no 114%: al subir el recorrido del paralaje a ±6% y el zoom a 1.18,
     con la sobremedida antigua asomaba el fondo del panel por los bordes. */
  object-fit:cover; will-change:transform;
}

/* LAS CIFRAS.  Son la prueba de autoridad y presencia de la sección, así que
   viven DENTRO del panel de trayectoria, apoyadas en su borde inferior, y no en
   una franja aparte.
   Intentos previos, los dos rechazados por Juan:
     1. cuatro tarjetas iguales («12 modelos» y «3 países» no aportaban, y con
        cuatro cifras del mismo peso no destaca ninguna);
     2. las dos supervivientes en una franja propia a todo el ancho, enormes.
        Sobraba la mitad del ancho: una cifra no necesita una sección, necesita
        estar pegada al texto que la sostiene.
   Aquí van al tamaño de un subtítulo, en amarillo, que es lo único amarillo de
   la sección: el ojo cae ahí sin que haga falta agrandar nada. */
.cifras{
  margin-top:auto; padding-top:clamp(18px,1.8vw,26px);
  border-top:1px solid rgba(255,255,255,.16);
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(16px,2vw,30px);
}
/* CIFRA EDITORIAL (02/10/2026). Antes: número de 60px y debajo un rótulo de
   11,5px en mayúsculas espaciadas. Juan: «son números importantes», que se
   vea más editorial. Ahora el número manda (hasta 104px) y el texto va a su
   DERECHA, a tamaño de lectura y apoyado en la línea base del número, como en
   una revista: se lee «7 · años equipando carpinterías» de un golpe. */
.cifra{
  display:grid; grid-template-columns:auto minmax(0,1fr);
  align-items:end; gap:clamp(12px,1.2vw,18px);
}
.cifra__n{
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(60px,6.2vw,104px); line-height:.82; letter-spacing:-.03em;
  color:var(--yellow); padding-top:.08em;
  white-space:nowrap;
}
.cifra__n .suf{ opacity:.75; font-size:.62em; vertical-align:.38em; margin-right:.02em; }
/* El contador sube de 0 a 700: sin ancho reservado, el texto de al lado se
   corría con cada dígito nuevo. Se reserva el ancho del número final. */
.cifra__n [data-count="700"]{ display:inline-block; min-width:1.8em; }   /* medido: «700» en Fugaz One = 1,79em */
.cifra__l{
  font-family:var(--f-body); font-weight:500; font-size:clamp(15px,1.15vw,18px);
  letter-spacing:0; text-transform:none; line-height:1.25;
  color:rgba(255,255,255,.82);
  padding-bottom:.18em;
}
/* En teléfono, una cifra por fila: lado a lado, «+700» de 60px más su texto
   no caben en media columna de 375px. */
@media (max-width:560px){
  .cifras{ grid-template-columns:1fr; gap:14px; }
  /* Apiladas, los textos se alinean en una sola columna: el «7» reserva el
     mismo ancho que «+700». */
  .cifra{ grid-template-columns:2.35em minmax(0,1fr); font-size:60px; }
  .cifra__l{ font-size:15px; }
}


/* ---------- Paquetes: SE FUE AL MARKETPLACE ----------
   La sección de paquetes salió del Home el 28/09/2026 (su marcado está en
   `_para-marketplace/paquetes.html`) y con ella todo su CSS, que vive ahora en
   `_para-marketplace/paquetes.css`. Aquí no queda nada de `.pack*`, `.slot*`
   ni `.pgrid--packs`.
   OJO al moverlo a producción: ese CSS depende de tokens y de clases que viven
   en esta hoja (`.ppanel--*`, `.btn*`, `--gap-unit`, la tipografía). La página
   del marketplace tiene que cargar styles.css ANTES que paquetes.css. */

/* ---------- Después de la venta ----------
   UN panel y ninguna altura mínima: el bloque mide lo que mide su contenido.
   Cuatro datos de tres palabras no dan para media pantalla, y estirarlos con
   `min-height` solo produce vacío con marco, que es lo que Juan señaló.

   Nada de esto es material nuevo: el panel azul es el degradado del hero, las
   filas con filete son las de las máquinas de un paquete y el dato en amarillo
   es el de las cifras de trayectoria. */
.aftersale--corta{ padding-block:clamp(40px,5vw,72px); }
.aftersale--corta.cut-top{ padding-top:calc(clamp(40px,5vw,72px) + var(--seam-h)); }

.posventa{
  /* Sin panel: el contenido se apoya en el fondo de la sección y se alinea con
     los titulares del resto de la página, no con el borde de la retícula. */
  padding-inline:var(--sangria);
  display:grid; gap:clamp(24px,3vw,48px);
  align-content:center;
  grid-template-columns:1fr;
}
@media (min-width:900px){
  .posventa{ grid-template-columns:minmax(0,4fr) minmax(0,6fr); align-items:center; }
}
.posventa__intro{ display:grid; gap:clamp(14px,1.6vw,20px); justify-items:start; align-content:center; }
.posventa__t{
  margin:0;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(26px,2.8vw,42px); line-height:1.02; letter-spacing:-.02em;
  padding-top:.14em;
}
.posventa__p{ margin:0; font-size:15px; line-height:1.6; color:rgba(255,255,255,.78); max-width:34ch; }
.posventa__btn{ margin-top:4px; }

/* La ficha, en dos columnas: cuatro filas en vertical alargaban el panel sin
   necesidad. En 2×2 ocupa el ancho que le sobra al titular. */
.ficha{
  margin:0; display:grid; gap:0 clamp(20px,2.4vw,40px);
  grid-template-columns:1fr;
}
@media (min-width:560px){ .ficha{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
.ficha__it{
  display:grid; gap:5px; align-content:start;
  padding:clamp(12px,1.3vw,18px) 0;
  border-top:1px solid rgba(255,255,255,.18);
}
.ficha__k{
  margin:0;
  font-family:var(--f-body); font-weight:700; font-size:11.5px;
  letter-spacing:.13em; text-transform:uppercase; line-height:1.4;
  color:rgba(255,255,255,.58);
}
.ficha__v{
  margin:0;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(19px,1.7vw,26px); line-height:1.06; letter-spacing:-.015em;
  color:var(--yellow); padding-top:.1em;
}

/* ---------- Ubicación ---------- */
.pgrid--mapa{ grid-template-columns:1fr; }
/* Mitad y mitad, no 5/7: debajo de los dos cuadros grandes, que sí son
   mitades exactas, un reparto distinto parte la junta vertical del bloque en
   dos sitios y los cuatro paneles dejan de leerse como uno solo. */
@media (min-width:860px){ .pgrid--mapa{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
.mapa__info{ align-content:start; gap:14px; justify-items:start; }
.mapa__t{
  margin:0 0 4px;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(30px,3.2vw,50px); line-height:1.02; letter-spacing:-.02em;
  padding-top:.16em;
}
.mapa__dato{ margin:0; color:var(--slate); }
.mapa__frame{ padding:0; min-height:clamp(300px,34vw,520px); background:#0F1220; }
.mapa__frame iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; }
.sedes{ list-style:none; margin:0; padding:0; display:grid; gap:8px; width:100%; }

/* ---------- Cierre ----------
   Aquí vivieron los dos cuadros gigantes de color, uno amarillo y uno azul, que
   ocupaban media pantalla cada uno. Juan: «esta sección no me gusta cómo está
   diseñada; que sea de fondo blanco y con los dos botones de tamaño normal de
   botón».

   Tenía razón en algo que se me había escapado: un cierre no es una sección que
   haya que diseñar, es una sección que hay que resolver. Dos cuadros de colores
   del tamaño de una pantalla llaman más la atención sobre SÍ MISMOS que sobre
   la acción que piden, y llegan justo después de la ficha de posventa, que ya
   es un bloque de color. Tres superficies grandes seguidas y ninguna manda.

   Ahora es lo de siempre, y por eso funciona: antetítulo, titular, dos botones
   del tamaño de un botón y el horario. El amarillo se queda SOLO en el botón
   principal, que es donde tiene que llamar. */
/* Padding de borde y no la sangría de los titulares: este bloque ya va
   centrado y con medida máxima propia, así que sumarle los 108px de sangría
   solo le robaba 216px al titular y lo partía en tres líneas con una palabra
   huérfana. La sangría alinea cosas que empiezan a la izquierda; esto no. */
.cierre__in{
  padding-inline:var(--gutter);
  display:grid; gap:clamp(14px,1.6vw,20px); justify-items:center; text-align:center;
  max-width:1120px; margin-inline:auto;
}
.cierre__t{
  margin:0; font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(44px,8vw,112px); line-height:1.02; letter-spacing:-.02em;
  padding-top:.16em;
}
.cierre__acciones{ display:flex; flex-wrap:wrap; gap:12px; justify-content:center; margin-top:6px; }
.cierre__micro{
  display:inline-flex; align-items:center; gap:12px; flex-wrap:wrap; justify-content:center;
  margin:6px 0 0; padding:10px 18px;
  font-family:var(--f-body); font-weight:500; font-size:15px; line-height:1.3;
  letter-spacing:0; text-transform:none; color:var(--graphite);
  background:var(--white); border:1px solid var(--line); border-radius:99px;
  box-shadow:0 8px 24px -14px rgba(30,49,164,.35);
}
.cierre__micro b{ font-weight:700; }
.cierre__micro svg{ fill:none; stroke:var(--blue); stroke-width:1.8; stroke-linecap:round; flex:none; }
.cierre__sep{ width:1px; height:16px; background:var(--line-strong); }

/* ---------- Revelado a sangre ---------- */
/* La etiqueta de mockup se pasa al recetario nuevo y se va abajo a la IZQUIERDA:
   abajo a la derecha chocaba con el botón flotante de WhatsApp, y arriba se
   metía debajo de la barra de navegación. */
.shot--full .shot__tag{
  left:0; right:auto; top:auto; bottom:0;
  border-radius:0; background:rgba(11,13,18,.62); border:0;
  backdrop-filter:none; -webkit-backdrop-filter:none;
  font-family:var(--f-body); font-weight:700; font-size:10px;
  letter-spacing:.1em; padding:5px 9px; color:rgba(255,255,255,.82);
}
.shot--full .shot__tag::before{ display:none; }
/* A escuadra, igual que el `round 0px` que ahora anima el JS. */
.anim-ready .reveal__frame{ clip-path:inset(10% 8% round 0px); }
@media (max-width:979px){ .anim-ready .reveal__frame{ clip-path:inset(7% 5% round 0px); } }
.reveal__inner h2{ font-size:clamp(28px,4.6vw,58px); line-height:1.02; letter-spacing:-.02em; padding-top:.16em; }

/* En celular una sección a sangre con cinco paneles seguidos se hace larguísima
   si cada uno conserva su alto mínimo de escritorio. */
@media (max-width:639px){
  .step, .dato, .tray__intro{ min-height:0; }
}


/* ==========================================================================
   AJUSTES v2  ·  absorbidos el 28/09/2026

   Venían de `assets/v2-ajustes.css`, un archivo temporal que la sesión de copy
   creó para no chocar conmigo mientras los dos escribíamos. Ya cerró sus
   cambios, así que vuelven a la hoja única.

   Van AL FINAL a propósito: ahí es exactamente donde estaban en la cascada
   (v2-ajustes.css se cargaba después de esta hoja), así que absorberlos no
   cambia qué regla gana ningún empate.

   La sección 1 de aquel archivo era la Oferta del mes; se fue al marketplace
   antes de la absorción y por eso no aparece.
   ========================================================================== */

/* ---------- 2. MENÚ DE CELULAR ----------
   Hasta 899 px (11/10/2026): en iPad vertical (768-834) la fila de enlaces no
   cabía y «Catálogo» quedaba cortado; ahí también va el menú desplegable. */
.nav__toggle{ display:none; }
@media (max-width:899px){
  .nav__toggle{
    display:inline-grid; place-content:center; gap:6px;
    margin-left:auto; width:44px; height:44px; margin-right:-10px;
    padding:0; border:0; background:none; cursor:pointer; color:var(--graphite);
  }
  .nav__toggle span{
    display:block; width:22px; height:2px; background:currentColor;
    transition:transform .25s ease;
  }
  .nav.is-open .nav__toggle span:first-child{ transform:translateY(4px) rotate(45deg); }
  .nav.is-open .nav__toggle span:last-child{ transform:translateY(-4px) rotate(-45deg); }

  .nav__links{
    display:none;
    position:fixed; top:var(--nav-h); left:0; right:0;
    flex-direction:column; align-items:stretch; gap:0;
    margin:0; padding:6px 0 12px;
    background:#fff; border-bottom:1px solid rgba(11,13,18,.09);
    box-shadow:0 18px 30px -18px rgba(11,13,18,.25);
    overflow:visible; mask-image:none; -webkit-mask-image:none;
  }
  .nav.is-open .nav__links{ display:flex; }
  .nav__links a{
    padding:14px var(--gutter); font-size:17px; color:var(--graphite);
    border-top:1px solid rgba(11,13,18,.06);
  }
  .nav__links a:first-child{ border-top:0; }
}

/* ---------- 3. VISTAS DE LOS VIDEOS ----------
   01/10/2026: era un rótulo azul de 12px bajo el título y pasaba de largo
   (Juan: «pasa muy desapercibido»). Es la prueba social de la sección, así
   que sube a placa propia arriba a la izquierda del video, en el mismo vidrio
   oscuro que el botón de Instagram de la esquina contraria: los dos controles
   de la portada se leen como un par. La cifra en negrita, el ojo en amarillo. */
.vtile__vistas{
  position:absolute; top:12px; left:12px; z-index:4;
  display:inline-flex; align-items:center; gap:7px;
  height:34px; padding:0 13px 0 11px; border-radius:99px;
  font-family:var(--f-body); font-weight:500; font-size:13px; letter-spacing:0;
  text-transform:none; color:rgba(255,255,255,.86);
  background:rgba(11,13,18,.52);
  border:1px solid rgba(255,255,255,.26);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14);
  backdrop-filter:blur(14px) saturate(1.6);
  -webkit-backdrop-filter:blur(14px) saturate(1.6);
  pointer-events:none;
}
.vtile__vistas b{ font-weight:800; font-size:15px; color:var(--white); letter-spacing:-.01em; }
.vtile__vistas svg{ fill:none; stroke:var(--yellow); stroke-width:1.8; stroke-linejoin:round; flex:none; }

/* ---------- 4. TABLET: dos tarjetas por fila desde 640px ---------- */
@media (min-width:640px){
  .tops__grid{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}

/* ---------- 5. EL BOTÓN FLOTANTE NO TAPA EL PIE ---------- */
@media (max-width:520px){ .foot{ padding-bottom:96px; } }

/* ---------- 6. MAPA: gris claro mientras carga, no un hueco negro ---------- */
.mapa__frame{ background:#EAECF1; }


/* ==========================================================================
   01/10/2026 · EL TABLERO DEL CIERRE  (escena «Blocky Grid» de GetLayers)
   ========================================================================== */
/* --------------------------------------------------------------------------
   2. EL TABLERO DEL CIERRE  (escena «Blocky Grid»)
   El lienzo vive DETRÁS del bloque de contacto. Arranca invisible y sube
   cuando la escena ya pintó su primer cuadro: así nunca se ve un rectángulo
   negro mientras carga three.js.
   -------------------------------------------------------------------------- */
.close{ isolation:isolate; }
.tablero{
  position:absolute; left:0; right:0; top:0; z-index:0;
  height:var(--tablero-h, 620px);
  pointer-events:none;
  opacity:0; transition:opacity 1.2s ease;
}
.tablero.is-on{ opacity:1; }
.tablero canvas{
  display:block; width:100%; height:100%;
  /* La niebla de la escena ya funde las filas del fondo con el papel. Lo que
     no funde es el borde de abajo del lienzo, que corta las piezas de primer
     plano en seco: esta máscara lo disuelve. */
  -webkit-mask-image:linear-gradient(180deg, transparent 0, #000 16%, #000 74%, transparent 100%);
          mask-image:linear-gradient(180deg, transparent 0, #000 16%, #000 74%, transparent 100%);
}
.close .cierre__in, .close .pgrid--mapa{ position:relative; z-index:1; }

/* El tablero del hero se retiró el 02/10/2026; queda solo en el cierre. */
.hero .hero__stage, .hero .hcar{ position:relative; z-index:2; }
/* EL HERO AÍSLA SU APILAMIENTO. Sin esto, los `z-index` de sus capas (el
   tablero, el carrusel) competían con la página entera y el lienzo se pintaba
   ENCIMA de la punta del alero de la sección siguiente, tiñéndola de azul.
   Con `isolation` el hero es una sola capa y la sección de abajo, que viene
   después en el marcado, vuelve a quedar por encima. */
.hero{ isolation:isolate; }

/* Placas de datos en versión CLARA (revelado a sangre). Misma forma que las
   del hero; cambia la piel: vidrio blanco sobre el velo claro de la foto,
   texto grafito y el icono en azul de marca, porque el amarillo sobre blanco
   no tiene contraste. (02/10/2026) */
.facts--claro{ margin:4px 0 6px; }
.facts--claro .fact{
  color:var(--slate);
  background:rgba(255,255,255,.72);
  border-color:rgba(30,49,164,.18);
  box-shadow:0 10px 26px -16px rgba(30,49,164,.45);
  -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
}
.facts--claro .fact b{ color:var(--graphite); font-weight:700; }
.facts--claro .fact svg{ stroke:var(--blue); }

/* ==========================================================================
   DÓNDE ESTAMOS · rediseño (02/10/2026)
   Tres niveles claros: titular con el beneficio, dos tarjetas de bodega con
   la dirección como dato principal y el horario como franja de pie. Las
   tarjetas son enlaces a Google Maps: lo útil de una dirección es llegar.
   ========================================================================== */
.mapa__info{ grid-template-rows:auto auto auto auto 1fr; gap:clamp(14px,1.4vw,18px); }
.mapa__info .mapa__t{ font-size:clamp(30px,3vw,46px); }
.mapa__lead{ margin:0; max-width:46ch; font-size:clamp(15px,1.15vw,17px); line-height:1.55; color:var(--slate); }

.mapa__info .sedes{
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px;
  width:100%; margin-top:6px;
}
@media (max-width:520px){ .mapa__info .sedes{ grid-template-columns:1fr; } }
.sede{
  display:grid; gap:4px; align-content:start;
  padding:18px 18px 16px; border-radius:var(--r-md,16px);
  background:var(--white); border:1px solid var(--line);
  box-shadow:0 12px 28px -20px rgba(30,49,164,.45);
  color:var(--graphite); text-decoration:none;
  transition:border-color .25s ease, box-shadow .25s ease, transform .25s cubic-bezier(.2,.8,.3,1);
}
.sede:hover{ border-color:var(--line-strong); box-shadow:0 18px 36px -20px rgba(30,49,164,.55); transform:translateY(-2px); }
.sede:focus-visible{ outline:2px solid var(--blue); outline-offset:3px; }
.sede__n{
  font-size:12px; font-weight:700; letter-spacing:.12em; text-transform:uppercase;
  color:var(--blue); margin-bottom:4px;
}
.sede__dir{ font-size:clamp(18px,1.5vw,22px); font-weight:800; letter-spacing:-.015em; line-height:1.15; }
.sede__barrio{ font-size:14px; color:var(--slate); }
.sede__ir{
  display:inline-flex; align-items:center; gap:6px; margin-top:12px;
  font-size:14px; font-weight:700; color:var(--blue);
}
.sede__ir svg{ transition:transform .25s cubic-bezier(.2,.8,.3,1); }
.sede:hover .sede__ir svg{ transform:translateX(3px); }

.horario{
  align-self:end; width:100%;
  display:flex; align-items:center; gap:14px;
  margin-top:clamp(8px,1.2vw,16px); padding-top:clamp(16px,1.6vw,20px);
  border-top:1px solid var(--line);
}
.horario__ico{
  width:44px; height:44px; flex:none; border-radius:12px; display:grid; place-items:center;
  background:rgba(61,92,255,.10);
}
.horario__ico svg{ fill:none; stroke:var(--blue); stroke-width:1.8; stroke-linecap:round; }
.horario__txt{ display:grid; gap:2px; }
.horario__l{ font-size:12px; font-weight:700; letter-spacing:.12em; text-transform:uppercase; color:var(--slate); }
.horario__v{ display:flex; flex-wrap:wrap; gap:4px 18px; font-size:16px; color:var(--graphite); }
.horario__v b{ font-weight:700; }

/* ==========================================================================
   HERO EN TELÉFONO · reparto vertical (02/10/2026)
   Juan: «mejora cómo se reparte la altura de los elementos en móvil».
   Antes la fila del carrusel era `1fr`: se estiraba hasta llenar la pantalla
   y las máquinas quedaban centradas DENTRO de ella, así que en un teléfono
   alto sobraban ~250px de azul vacío entre las placas y las máquinas. Ahora
   las dos filas miden lo que su contenido, el bloque entero se centra en la
   pantalla (el sobrante se reparte arriba y abajo) y entre placas y carrusel
   hay un respiro fijo. Las máquinas crecen: la base pasa de 40vw a 54vw,
   con tope por alto para teléfonos bajos.
   ========================================================================== */
@media (max-width:979px){
  .hero{ grid-template-rows:auto auto; align-content:center; }
  .hcar{
    container-type:normal; align-self:auto;
    margin-top:clamp(4px,1.2vh,14px);   /* la foto de la Titán 3 Max ya trae aire transparente arriba */
  }
  .hcar__it{ --h-base:min(54vw, 23vh, 230px); }
}

/* LAS TRES PLACAS EN TELÉFONO (02/10/2026). Apiladas a todo lo ancho eran
   tres renglones flojos que se perdían sobre el tablero y gastaban ~130px de
   alto. Ahora son una fila de tres fichas: icono, etiqueta pequeña y el DATO
   grande en negrita, que es lo que el comprador busca. Fondo más sólido y
   más desenfoque para que se lean sobre los destellos. */
@media (max-width:560px){
  .hero .factline{ width:100%; }
  .hero .facts{
    display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
    flex-direction:unset; align-items:stretch; gap:clamp(6px,2vw,10px); width:100%;
  }
  /* UNIFORMES A CUALQUIER ANCHO (02/10/2026).
     Fallo corregido: la rejilla de cada ficha tenía UNA columna del ancho de
     su contenido y no de la ficha, así que en las dos últimas todo quedaba
     pegado a la izquierda. Ahora la columna es el 100%.
     Tres filas iguales en las tres fichas: icono, etiqueta con alto reservado
     para dos renglones (centrada en él) y el dato abajo. Así los tres datos
     comparten línea base aunque una etiqueta ocupe uno y otra dos renglones.
     Los tamaños escalan con el ancho de pantalla, con topes. */
  .hero .fact{
    display:grid; grid-template-columns:100%;
    grid-template-rows:auto minmax(2.7em, auto) 1fr;
    justify-items:center; align-items:center; text-align:center;
    gap:clamp(5px,1.6vw,8px);
    padding:clamp(12px,3.4vw,16px) clamp(6px,2vw,10px) clamp(12px,3.4vw,15px);
    border-radius:16px; white-space:normal;
    font-size:clamp(11px,3vw,13px); line-height:1.3;
    background:rgba(12,22,96,.42);
    border:1px solid rgba(255,255,255,.2);
    -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
  }
  .hero .fact svg{ width:clamp(18px,5vw,22px); height:clamp(18px,5vw,22px); }
  .hero .fact__l{ width:100%; color:rgba(255,255,255,.74); text-wrap:balance; }
  .hero .fact b{
    width:100%; align-self:end;
    font-size:clamp(13px,3.9vw,17px); font-weight:800; line-height:1.15;
    color:var(--white); letter-spacing:-.01em; text-wrap:balance;
  }
}

/* TITULAR DEL HERO EN TELÉFONO: SIEMPRE DOS RENGLONES, A TODO LO ANCHO
   (02/10/2026). El tamaño fijo hacía que «en tu carpintería.» se partiera y
   el titular saliera en tres renglones. Medido en Fugaz One con el
   interletrado del titular, ese renglón ocupa 9,45 veces el tamaño de letra;
   con 9,7 de divisor queda un margen de seguridad. Cada renglón no se parte. */
@media (max-width:700px){
  #hero .h1--stage{ font-size:calc((100vw - 2 * var(--gutter, 20px)) / 9.7); }
  #hero .h1--stage .kt__l{ white-space:nowrap; }
}

/* HERO EN TELÉFONO, MÁS BAJO QUE LA PANTALLA (02/10/2026). George fue claro:
   los recuadros deben ser menos altos que la pantalla completa. Se quita el
   `min-height:100svh` en móvil: el hero mide lo que su contenido y nada más,
   y deja asomar la sección siguiente, que es la invitación a seguir bajando. */
@media (max-width:979px){
  .hero, .hero.is-live{ min-height:0; height:auto; align-content:start; }
  /* Medido a 390x844: con 80px de relleno bajo la barra y el carrusel a
     54vw el hero medía 925px. Con esto queda por debajo de la pantalla y
     asoma el alero de la sección de Titán. */
  .hero .hero__stage{ padding-top:clamp(20px,4vh,32px); }
  .hcar__it{ --h-base:min(42vw, 17vh, 175px); }
  .hcar{ margin-top:0; padding-bottom:calc(clamp(30px,4vw,62px) + 8px); }
}

/* FRASES ENTERAS EN LAS FICHAS DE LÍNEA (02/10/2026). Juan: «no cortes los
   textos». Con `max-width:34ch` el navegador partía donde podía y dejaba
   «fábrica.» o «directo al armado.» colgando. Ahora cada frase es un
   renglón que no se parte, y el tamaño se ajusta al ancho real del bloque:
   la frase más larga («Canto bien pegado, en piezas rectas y curvas.») mide
   20,9em, así que con 21,4 de divisor siempre cabe. En escritorio manda el
   tamaño de siempre; en un teléfono baja lo justo. */
/* El bloque de texto tiene que tener columna de ancho fijo (el del bloque):
   con `justify-items:start` cada hijo medía lo que su contenido y el párrafo,
   con contención de ancho, se quedaba en 0. Y un tope algo mayor que 46ch para
   que en escritorio la frase larga quepa a su tamaño de siempre. */
.tile__body{ grid-template-columns:minmax(0,1fr); width:100%; max-width:max(46ch, 470px); }
.tile__claim{ max-width:none; width:100%; container-type:inline-size; }
.tile__claim .frase{
  display:block; white-space:nowrap;
  font-size:min(clamp(17px,1.5vw,21px), calc(100cqi / 21.4));
}

/* QUÉ CAMBIA EN TU CARPINTERÍA, EN TELÉFONO (02/10/2026). Fallo: la regla
   general de los dibujos (92px) va después en el archivo y pisaba los 56px
   de móvil, así que el dibujo se desbordaba de su columna y quedaba suelto,
   a media altura. Ahora va en un recuadro de 64px alineado arriba con el
   titulillo, y los tres bloques reparten el aire de forma pareja. */
@media (max-width:859px){
  .bens__grid{ gap:0; }
  .ben{
    grid-template-columns:64px minmax(0,1fr);
    column-gap:16px; row-gap:6px; align-items:start;
    padding:20px 0 22px;
  }
  .ben__g{
    grid-row:1 / span 2; align-self:start;
    width:64px; height:64px; padding:9px; box-sizing:border-box;
    border-radius:16px; background:rgba(61,92,255,.07);
  }
  .ben__t{ margin:2px 0 0; font-size:clamp(20px,5.4vw,24px); }
  .ben__p{ max-width:none; font-size:15.5px; }
}
@media (max-width:859px){
  /* El aire entre «Qué cambia» y «Las más pedidas» sumaba ~170px en móvil:
     el relleno inferior de una sección más el superior de la otra. */
  .bens{ padding-bottom:12px; }
  .section.lines{ padding-top:40px; }
}

/* TEXTOS DE LARGO PAREJO EN LAS FICHAS (02/10/2026). Juan: «deben parecerse
   más el largo de cada tipo de texto». En el teléfono cada ficha dice una
   palabra de etiqueta y un dato de ~10 caracteres (Experiencia / Desde 2019,
   Garantía / 1 a 2 años, Envíos / Todo el país). En escritorio, donde la
   placa es una línea, sigue la frase completa. Solo uno de los dos textos
   existe a la vez (`display:none`), así que el lector de pantalla no repite. */
.fact__m{ display:none; }
@media (max-width:560px){
  .fact__d{ display:none; }
  .fact__m{ display:inline; }
  .hero .fact{ grid-template-rows:auto auto auto; }
  .hero .fact b{ align-self:start; white-space:nowrap; }
}

/* RÓTULOS DE LÍNEA EN LA GALERÍA (02/10/2026). Juan: «me gusta el estilo
   pero está mal diseñado». Eran un bloque de color vacío con el texto
   apretado abajo y el antetítulo partido en dos renglones. Ahora:
   - la máquina de la línea ocupa la mitad de arriba, grande y sangrando por
     la derecha, con la regla de tamaño percibido (`data-forma` + `--h-base`);
   - antetítulo de una palabra (Enchapado / Corte), en un renglón;
   - el nombre sigue siendo lo más grande, abajo. */
.vgal__panel{ --h-base:clamp(120px,15vw,230px); isolation:isolate; }
.vgal__maq{
  position:absolute; z-index:-1; top:9%; right:-12%;
  width:auto; max-width:112%; height:auto;
  filter:drop-shadow(0 18px 24px rgba(6,10,30,.35));
  pointer-events:none;
}
.vgal__panel--urus .vgal__maq{ filter:drop-shadow(0 18px 22px rgba(90,60,0,.28)); top:14%; }
.vgal__panel .eyebrow{ white-space:nowrap; }
@media (max-width:999px){
  .vgal__panel{ --h-base:clamp(100px,30vw,200px); }
}

/* INSIGNIA «LA MÁS VENDIDA» COMO FRANJA (02/10/2026). Juan eligió la opción 4
   entre cinco: una franja amarilla a todo el ancho del borde superior de la
   ficha, en vez del banderín con punta. Se lee antes que nada y no tapa ni
   compite con el antetítulo. El panel baja su contenido el alto de la franja. */
.tt__sello{
  top:0; left:0; right:0;
  padding:9px clamp(24px,2.4vw,42px);
  clip-path:none; filter:none;
  font-size:12px; letter-spacing:.14em; text-align:left;
}
.tt--sellada{ padding-top:max(clamp(24px,2.4vw,42px), 46px); }   /* lo justo para no pisar la franja: así el título casi no se descuadra respecto a la ficha vecina */
@media (max-width:640px){
  .tt__sello{ font-size:11px; padding:8px 18px; }
  .tt--sellada .tt__k{ padding-right:0; }
}

/* Texto solo para lectores de pantalla. */
.sr-only{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
}

/* VISTAS AL ESTILO REELS (02/10/2026). Juan: la placa de vidrio no le
   gustaba; quiere la asociación directa con Instagram. Como en un Reel: icono
   de reproducir y la cifra en blanco, directo sobre el video, sin caja. Una
   sombra suave lo hace legible sobre cualquier fotograma. La palabra
   «vistas» queda para el lector de pantalla. */
.vtile__vistas{
  top:12px; left:12px; height:auto; padding:0; gap:5px;
  background:none; border:0; box-shadow:none;
  -webkit-backdrop-filter:none; backdrop-filter:none;
  color:var(--white);
  text-shadow:0 1px 3px rgba(0,0,0,.55), 0 0 10px rgba(0,0,0,.25);
}
.vtile__vistas b{ font-size:15px; font-weight:700; letter-spacing:-.005em; }
.vtile__vistas svg{
  fill:var(--white); stroke:none;
  filter:drop-shadow(0 1px 2px rgba(0,0,0,.55));
}

/* «AMIGO CARPINTERO,» EN EL REVELADO (02/10/2026). Renglón propio, grande y
   con el mismo barrido de color del titular del hero: degradado de corte duro
   recortado contra la letra y movido con `--barrido` (0 → 1, lo anima el JS
   del revelado con el scroll). Reposo = barrido completo, así sin JS se lee
   ya en azul. Lleva el mismo par padding/margin negativo que todo lo que
   recorta Fugaz One, o la tilde se queda sin fondo. */
.reveal__t{ display:grid; justify-items:center; gap:.18em; }
.reveal__amigo{
  display:block;
  font-size:min(88px, calc(100cqi / 9.8)); line-height:.9; letter-spacing:-.03em;
  white-space:nowrap;
  padding-top:.24em; margin-top:-.24em;
  background-image:linear-gradient(90deg,
    var(--blue) 0, var(--blue) 50%, var(--graphite) 50%, var(--graphite) 100%);
  background-size:200% 100%;
  background-position:calc(100% - var(--barrido, 1) * 100%) 0;
  background-repeat:no-repeat;
  -webkit-background-clip:text; background-clip:text;
  -webkit-text-fill-color:transparent; color:transparent;
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  .reveal__amigo{ background:none; color:var(--blue); -webkit-text-fill-color:currentColor; }
}
.reveal__sub{
  display:block;
  font-size:clamp(20px,2.5vw,34px); line-height:1.1; letter-spacing:-.01em;
  color:var(--graphite);
}
/* En teléfono «AMIGO CARPINTERO,» llena el ancho en un solo renglón: medido,
   ocupa 9,4 veces el tamaño de letra; con 9,8 de divisor siempre cabe. */
/* UN SOLO RENGLÓN SIEMPRE, sin exagerar (02/10/2026). Antes iba a 8,4vw con
   tope de 120px y, entre 700 y 1100px de ancho, no cabía y se partía en dos.
   Ahora se mide contra el ancho real del bloque (`cqi`): «AMIGO CARPINTERO,»
   ocupa 9,4em, así que con 9,8 de divisor siempre cabe, y no pasa de 88px. */
.reveal__inner{ container-type:inline-size; }
@media (max-width:700px){
  .reveal__sub{ font-size:clamp(17px,4.6vw,22px); }
}

/* Contacto debajo de las bodegas (02/10/2026): el aire pasa a ir antes del
   bloque de texto y el tablero se coloca detrás de él donde quede. */
.cierre__in + .pgrid--mapa{ margin-top:0; }
.pgrid--mapa + .cierre__in{ margin-top:clamp(56px,7vw,104px); }
.tablero{ top:var(--tablero-top, 0); }

/* TRAYECTORIA EN TELÉFONO (02/10/2026). Juan: «hay que mejorar esta
   distribución».
   - Los cuatro países salían en 3 + 1, con Ecuador solo en otra fila. Ahora
     son una rejilla de 2 × 2, fichas del mismo ancho.
   - Entre cada cifra y su texto sobraba hueco: la columna del número estaba
     reservada a 2,35em de 60px. Se ajusta al ancho real de «+700» con la
     cifra algo menor, y los dos textos siguen alineados en la misma columna. */
@media (max-width:560px){
  .paises{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px; }
  .pais{ justify-content:flex-start; }
  .cifra{ grid-template-columns:2.25em minmax(0,1fr); font-size:52px; column-gap:10px; }
  .cifra__n{ font-size:52px; }
  /* Titular: «Importadores directos.» en un solo renglón, a todo lo ancho.
     Medido: esa frase ocupa 12,66em y el ancho útil del panel es el de la
     pantalla menos 68px (márgenes de la retícula y relleno del panel). La
     segunda frase cae en dos renglones: tres en total, antes eran cinco.
     Se mide contra el ancho REAL del panel (`cqi`), no contra la pantalla:
     con `100vw - 68px` solo cuadraba a 390px y a 530px la frase se partía. */
  .tray__intro{ container-type:inline-size; }
  .tray__intro .ppanel__t{ font-size:min(calc(100cqi / 12.9), 44px); }
}

/* Sin antetítulo, el panel de Trayectoria tiene un hijo menos: titular,
   texto, países y cifras. La fila elástica pasa a ser la de las cifras, que
   con su `margin-top:auto` siguen apoyadas en el borde inferior. */
.tray__intro{ grid-template-rows:auto auto auto 1fr; }

/* ==========================================================================
   EL TELÓN DE BIENVENIDA (02/10/2026)
   Coreografía, en segundos desde el primer cuadro:
     0,05  «Bienvenido a» sube y aparece
     0,15  MAQUIMADERAS entra letra por letra (30 ms entre letras)
     1,00  el telón SUBE (0,85 s); el contenido del telón sube más rápido
           que el amarillo, para que el nombre se vaya antes que el color
     1,85  fuera
   El borde de abajo es el techo del logo invertido (hombros al 10,55% y
   89,45%, ápice al 49,88%, las cotas de `.cut-top`): la página asoma por
   debajo con la forma de la marca.
   Todo es CSS: si GSAP no carga, el telón funciona igual. El JS solo lo
   retira del DOM al acabar y permite saltarlo con un clic.
   ========================================================================== */
.telon{ display:none; }
html.con-telon .telon{
  position:fixed; inset:0; z-index:9999;
  display:grid; place-items:center;
  background:linear-gradient(155deg, #FFD24D 0%, #FFC629 46%, #F5B912 100%);
  color:var(--graphite);
  --techo:clamp(40px,9vh,110px);
  clip-path:polygon(0 0, 100% 0, 100% 100%, 89.45% 100%, 49.88% calc(100% - var(--techo)), 10.55% 100%, 0 100%);
  animation:telonSube .85s cubic-bezier(.76,0,.24,1) 1s forwards;
  cursor:pointer;
}
/* Mientras el telón está puesto, la página de abajo no se desplaza. */
html.con-telon:not(.telon-fuera) body{ overflow:hidden; }

.telon__in{
  display:grid; justify-items:center; gap:clamp(6px,1vh,12px);
  animation:telonContenido .7s cubic-bezier(.76,0,.24,1) 1s forwards;
}
.telon__k{
  font-family:var(--f-body); font-weight:700;
  font-size:clamp(13px,1.3vw,17px); letter-spacing:.24em; text-transform:uppercase;
  color:rgba(11,13,18,.72);
  opacity:0; transform:translateY(10px);
  animation:telonK .5s cubic-bezier(.2,.8,.2,1) .05s forwards;
}
/* Cada letra sube desde debajo de su renglón, recortada por una ventana. La
   ventana se agranda por arriba (padding/margin negativo) por la misma razón
   de siempre con Fugaz One: su tinta no cabe en la caja. */
.telon__marca{
  display:flex; overflow:hidden;
  padding-top:.2em; margin-top:-.2em; padding-bottom:.08em;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(40px,9.6vw,150px); line-height:.9; letter-spacing:-.02em;
}
.telon__marca span{
  display:inline-block; transform:translateY(110%);
  animation:telonLetra .5s cubic-bezier(.2,.8,.2,1) forwards;
  animation-delay:calc(.15s + var(--i) * .03s);
}

@keyframes telonK{ to{ opacity:1; transform:none; } }
@keyframes telonLetra{ to{ transform:none; } }
@keyframes telonSube{ to{ transform:translateY(calc(-100% - var(--techo))); } }
@keyframes telonContenido{ to{ transform:translateY(-38vh); opacity:0; } }

/* Saltar con un clic: el telón sale ya, sin esperar a las letras. */
html.con-telon .telon.is-saltado{ animation:telonSube .6s cubic-bezier(.76,0,.24,1) forwards; }
html.con-telon .telon.is-saltado .telon__in{ animation:telonContenido .45s cubic-bezier(.76,0,.24,1) forwards; }

/* ==========================================================================
   MENÚ DE CELULAR A PANTALLA COMPLETA (03/10/2026)
   Juan: «quiero algo que ocupe la pantalla completa, muy premium e
   intuitivo». Antes era una lista blanca colgando bajo la barra.
   - Fondo: el azul del hero, a pantalla completa. La barra se vuelve
     transparente y el nombre y la X pasan a blanco: es una sola superficie.
   - Enlaces grandes en Fugaz, con su número en amarillo, que entran
     escalonados (60 ms) desde un poco más abajo.
   - Pie: WhatsApp a todo el ancho y ubicación/horario.
   Se abre y cierra con una transición (no con `display`), así entra y sale.
   ========================================================================== */
.nav__extra{ display:none; }
@media (max-width:899px){
  .nav__links{
    display:flex; position:fixed; inset:0; z-index:-1;
    flex-direction:column; align-items:stretch; gap:0;
    margin:0; padding:calc(var(--nav-h) + clamp(18px,4vh,36px)) var(--gutter) max(24px, env(safe-area-inset-bottom));
    background:linear-gradient(155deg, #16226E 0%, #1E31A4 42%, #2C45D6 100%);
    border:0; box-shadow:none; overflow-y:auto;
    counter-reset:menu;
    visibility:hidden; opacity:0; transform:translateY(-16px);
    transition:opacity .35s ease, transform .45s cubic-bezier(.2,.8,.2,1), visibility 0s linear .45s;
  }
  .nav.is-open .nav__links{
    visibility:visible; opacity:1; transform:none;
    transition:opacity .3s ease, transform .45s cubic-bezier(.2,.8,.2,1), visibility 0s;
  }
  .nav__links > a{
    counter-increment:menu;
    display:flex; align-items:baseline; gap:14px;
    padding:clamp(12px,2.2vh,18px) 0; border-top:0;
    border-bottom:1px solid rgba(255,255,255,.12);
    font-family:var(--f-display); text-transform:uppercase;
    font-size:clamp(30px,9vw,44px); line-height:1; letter-spacing:-.02em;
    color:var(--white);
    opacity:0; transform:translateY(14px);
    transition:opacity .3s ease, transform .45s cubic-bezier(.2,.8,.2,1), color .2s ease;
  }
  .nav__links > a::before{
    content:counter(menu, decimal-leading-zero);
    font-family:var(--f-body); font-size:13px; font-weight:700; letter-spacing:.08em;
    color:var(--yellow); transform:translateY(-.9em);
  }
  .nav__links > a:hover, .nav__links > a:focus-visible{ color:var(--yellow); }
  .nav.is-open .nav__links > a{ opacity:1; transform:none; }
  .nav.is-open .nav__links > a:nth-of-type(1){ transition-delay:.06s; }
  .nav.is-open .nav__links > a:nth-of-type(2){ transition-delay:.12s; }
  .nav.is-open .nav__links > a:nth-of-type(3){ transition-delay:.18s; }
  .nav.is-open .nav__links > a:nth-of-type(4){ transition-delay:.24s; }
  .nav.is-open .nav__links > a:nth-of-type(5){ transition-delay:.30s; }

  .nav__extra{
    display:grid; gap:14px; margin-top:auto; padding-top:clamp(24px,4vh,40px);
    opacity:0; transform:translateY(14px);
    transition:opacity .3s ease .05s, transform .45s cubic-bezier(.2,.8,.2,1) .05s;
  }
  .nav.is-open .nav__extra{ opacity:1; transform:none; transition-delay:.36s; }
  .nav__extra .nav__wa{ width:100%; height:56px; font-size:16px; }
  .nav__meta{ margin:0; text-align:center; font-size:13.5px; line-height:1.6; color:rgba(255,255,255,.72); }

  /* La barra se funde con el menú abierto. */
  .nav.is-open::before{ background:transparent; border-bottom-color:transparent; }
  .nav.is-open .nav__marca, .nav.is-open .nav__toggle{ color:var(--white); }
  .nav__marca, .nav__toggle{ transition:color .25s ease; }
  html.menu-abierto, html.menu-abierto body{ overflow:hidden; }
}
/* El botón vive dentro de `.nav__links` y heredaba el estilo de enlace de la
   barra (13,5px, sin fondo, gris). Se le devuelve su piel de botón primario. */
.nav__links .nav__wa{
  background:var(--yellow); color:var(--graphite);
  padding:0 26px; border-radius:12px;
  font-size:16px; font-weight:700; letter-spacing:-.012em;
}
.nav__links .nav__wa:hover{ color:var(--graphite); background:#FFD24D; }
@media (max-width:899px){
  /* Números de ancho fijo: «01» es más estrecho que «02» y el texto de cada
     enlace empezaba en una columna distinta. */
  .nav__links > a::before{ min-width:22px; font-variant-numeric:tabular-nums; }
  /* Con el menú abierto sobra el botón flotante: el pie del menú ya trae el
     de WhatsApp, y el flotante lo tapaba. */
  html.menu-abierto #waFloat{ opacity:0; visibility:hidden; pointer-events:none; }
}

/* ==========================================================================
   TELÓN v2 · más impacto (03/10/2026)
   Juan: «más impactante, mejor diseño, primera impresión premium».
     0,00  el techo del logo se DIBUJA en grafito (0,7 s)
     0,20  «Bienvenido a» entra cerrando su interletrado (de .6em a .24em)
     0,35  MAQUIMADERAS, casi a todo el ancho: cada letra sube y pasa de
           desenfocada a nítida, 40 ms entre letras
     1,30  sale: el nombre sube y se apaga, el telón sube con el borde de
           techo (0,9 s)
     2,20  fuera
   ========================================================================== */
html.con-telon .telon{ animation:telonSube .9s cubic-bezier(.76,0,.24,1) 1.7s forwards; }
.telon__in{ gap:clamp(14px,2.2vh,26px); animation:telonContenido .75s cubic-bezier(.76,0,.24,1) 1.7s forwards; }

.telon__k{
  font-size:clamp(13px,1.4vw,19px); color:rgba(11,13,18,.78);
  letter-spacing:.6em; margin-right:-.6em;
  animation:telonK2 .9s cubic-bezier(.2,.8,.2,1) .2s forwards;
}
/* El nombre ocupa casi todo el ancho: «MAQUIMADERAS» mide ~7,3em en Fugaz,
   así que 90vw / 7,5 lo deja a ras de los márgenes en cualquier pantalla. */
/* Sin recorte: con `overflow:hidden` el halo del desenfoque se cortaba en el
   borde del renglón, que es justo lo que hace que el efecto se vea caro. Las
   letras suben poco (45%) y aparecen por opacidad. */
.telon__marca{ font-size:min(calc(90vw / 7.5), 220px); letter-spacing:-.025em; overflow:visible; }
.telon__marca span{
  filter:blur(10px); opacity:0;
  animation:telonLetra2 .65s cubic-bezier(.2,.8,.2,1) forwards;
  animation-delay:calc(.35s + var(--i) * .04s);
}
@keyframes telonK2{ from{ opacity:0; transform:translateY(8px); } to{ opacity:1; transform:none; letter-spacing:.24em; margin-right:-.24em; } }
@keyframes telonLetra2{
  0%  { transform:translateY(45%); filter:blur(10px); opacity:0; }
  35% { opacity:1; }
  100%{ transform:none; filter:blur(0); opacity:1; }
}
@keyframes telonContenido{ to{ transform:translateY(-30vh) scale(.96); opacity:0; } }

/* LAS TRES FICHAS DEL HERO, MÍNIMAS EN TELÉFONO (05/10/2026). Juan: «en
   móvil debería ser más compacto o minimal; no quiero que se vean tantos
   elementos en el home». Fuera las cajas (fondo, borde, relleno): queda una
   sola franja con tres columnas separadas por un filete vertical. Mismo
   contenido, la mitad de alto y ningún recuadro que compita con el titular.
   En escritorio siguen las placas. */
@media (max-width:560px){
  .hero .facts{ gap:0; }
  .hero .fact{
    background:none; border:0; border-radius:0;
    -webkit-backdrop-filter:none; backdrop-filter:none;
    padding:2px 6px; gap:3px;
    grid-template-rows:auto auto auto;
  }
  .hero .fact + .fact{ border-left:1px solid rgba(255,255,255,.18); }
  .hero .fact svg{ width:16px; height:16px; margin-bottom:2px; }
  .hero .fact__l{ font-size:11px; color:rgba(255,255,255,.62); }
  .hero .fact b{ font-size:clamp(12.5px,3.5vw,14px); }
}

/* LA FRANJA MÍNIMA TAMBIÉN EN ESCRITORIO (05/10/2026). Juan prefirió la
   versión de celular: tres columnas con icono, etiqueta corta y dato, sin
   cajas, separadas por un filete vertical. Se aplica a todos los anchos y en
   escritorio solo sube un punto el tamaño. Los textos cortos (Experiencia /
   Desde 2019, Garantía / 1 a 2 años, Envíos / Todo el país) pasan a ser los
   únicos. */
.hero .fact__d{ display:none; }
.hero .fact__m{ display:inline; }
.hero .factline{ width:100%; }
.hero .facts{
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:0; width:min(100%,560px); margin-inline:auto;
}
.hero .fact{
  display:grid; grid-template-columns:100%; grid-template-rows:auto auto auto;
  justify-items:center; align-items:start; text-align:center;
  gap:3px; padding:2px clamp(6px,1.4vw,14px);
  background:none; border:0; border-radius:0;
  -webkit-backdrop-filter:none; backdrop-filter:none;
  white-space:nowrap; line-height:1.3;
}
.hero .fact + .fact{ border-left:1px solid rgba(255,255,255,.18); }
.hero .fact svg{ width:clamp(16px,1.3vw,18px); height:clamp(16px,1.3vw,18px); margin-bottom:2px; }
.hero .fact__l{ font-size:clamp(11px,.95vw,13px); color:rgba(255,255,255,.62); }
.hero .fact b{ font-size:clamp(12.5px,1.2vw,17px); font-weight:800; color:var(--white); letter-spacing:-.01em; }
/* Titular del cierre en teléfono: sin el salto forzado de escritorio (partía
   mal y salían cuatro renglones) y con renglones balanceados. */
@media (max-width:560px){
  .cierre__t br{ display:none; }
  .cierre__t{ text-wrap:balance; font-size:clamp(44px,14vw,60px); }
}
/* Horario en teléfono: si no cabe en un renglón, los dos tramos se apilan y
   el separador se va, en vez de quedar colgado al final del primero. */
@media (max-width:560px){
  .cierre__micro{ flex-direction:column; gap:2px; border-radius:18px; padding:10px 20px; }
  .cierre__micro svg{ margin-bottom:2px; }
  .cierre__sep{ display:none; }
}

/* HORARIO SIN CAJA (05/10/2026). Juan: «no es necesario tanto contenedor».
   Fuera fondo, borde, sombra y relleno: queda una línea de texto con su
   icono. En teléfono vuelve a ir en un renglón (14px cabe a 360px). */
.cierre__micro{
  background:none; border:0; box-shadow:none; border-radius:0;
  padding:0; gap:10px;
}
@media (max-width:560px){
  .cierre__micro{ flex-direction:row; gap:8px; padding:0; font-size:14px; }
  .cierre__micro svg{ margin-bottom:0; width:16px; height:16px; }
  .cierre__sep{ display:block; height:13px; }
}

/* ==========================================================================
   PIE REDISEÑADO (05/10/2026)
   ========================================================================== */
.foot{
  background:linear-gradient(155deg, #1B2557 0%, #0E1330 55%, #0B0D18 100%);
  color:rgba(255,255,255,.72);
  padding-block:clamp(48px,6vw,80px) clamp(20px,2.4vw,28px);
  overflow:hidden;
}
.foot__top{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:24px; padding-bottom:clamp(28px,4vw,44px);
  border-bottom:1px solid rgba(255,255,255,.12);
}
.foot__brand{ gap:12px; }
/* El logo pasa a blanco: el horizontal sobre azul oscuro, como silueta. */
.foot__logo{ height:clamp(34px,3vw,42px); filter:brightness(0) invert(1); }
.foot__claim{ color:var(--white); font-size:clamp(16px,1.7vw,20px); }
.foot__cta{ flex:none; }

.foot__inner{ display:block; padding-top:clamp(28px,4vw,44px); }
.foot__cols{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:clamp(26px,3vw,40px) clamp(16px,3vw,40px); }
@media (min-width:760px){ .foot__cols{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
.foot__t, .foot__t a{ color:var(--yellow); }
.foot__t{ font-size:12px; letter-spacing:.14em; margin-bottom:10px; }
.foot__t a{ text-decoration:none; }
.foot__col a{ color:rgba(255,255,255,.82); padding-block:6px; font-size:15px; }
.foot__col a:hover{ color:var(--white); }
.foot__col--contacto p{ margin:0 0 12px; font-size:14.5px; line-height:1.6; color:rgba(255,255,255,.72); }

/* El remate: el nombre a todo el ancho, enorme y tenue. «MAQUIMADERAS» mide
   ~7,3em en Fugaz; con 100vw / 7,4 queda de borde a borde. */
.foot__marca{
  margin:clamp(28px,4vw,52px) 0 0; text-align:center; white-space:nowrap;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:calc(100vw / 7.4); line-height:.82; letter-spacing:-.03em;
  color:rgba(255,255,255,.06);
  user-select:none; pointer-events:none;
}

.foot__base{ margin-top:clamp(10px,1.4vw,18px); border-top-color:rgba(255,255,255,.12); }
.foot__base p{ color:rgba(255,255,255,.55); opacity:1; }
@media (max-width:560px){
  .foot__top{ flex-direction:column; align-items:flex-start; }
  .foot__cta{ width:100%; }
}
/* La marca escrita en blanco (el logo en PNG no tiene versión clara legible:
   la del Brandkit es una silueta). Mismo criterio que la barra. */
.foot__wordmark{
  margin:0; display:grid; gap:4px;
  font-family:var(--f-display); text-transform:uppercase;
  font-size:clamp(24px,2.4vw,32px); line-height:1; letter-spacing:-.015em; color:var(--white);
}
.foot__wordmark span{
  font-family:var(--f-body); font-weight:700; font-size:11px; letter-spacing:.28em; color:rgba(255,255,255,.6);
}
.foot__col .foot__t a{ color:var(--yellow); padding:0; font-size:inherit; }
.foot__marca{ font-size:calc(100vw / 7.7); }

/* PIE EN GRIS CLARO (05/10/2026). Juan: el azul oscuro no, gris claro sí.
   Un gris un punto más oscuro que el papel del sitio (#F6F8FC) para que el
   pie se separe del cierre sin línea. Texto grafito, títulos en azul de
   marca, nombre gigante tenue en grafito. */
.foot{ background:#E9EDF4; color:var(--slate); }
.foot__top, .foot__base{ border-color:rgba(11,13,18,.1); }
.foot__wordmark{ color:var(--graphite); }
.foot__wordmark span{ color:var(--slate); }
.foot__claim{ color:var(--graphite); }
.foot__t, .foot__col .foot__t a{ color:var(--blue); }
.foot__col a{ color:var(--graphite); }
.foot__col a:hover{ color:var(--blue); }
.foot__col--contacto p{ color:var(--slate); }
.foot__marca{ color:rgba(11,13,18,.05); }
.foot__base p{ color:var(--slate); }

/* DATOS DEL REVELADO, MISMA FRANJA MÍNIMA QUE EL HERO (05/10/2026). Eran
   tres píldoras con textos de largo muy distinto que en celular se apilaban
   a todo lo ancho. Ahora: tres columnas, icono, etiqueta corta y dato, sin
   cajas, con filete entre columnas. En clave clara: icono azul, dato
   grafito. */
.facts--claro{
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:0; width:min(100%,520px); margin:4px auto 8px;
  flex-direction:unset;
}
.facts--claro .fact{
  display:grid; grid-template-columns:100%; grid-template-rows:auto auto auto;
  justify-items:center; text-align:center; gap:3px;
  padding:2px clamp(6px,1.4vw,14px);
  background:none; border:0; border-radius:0; box-shadow:none;
  -webkit-backdrop-filter:none; backdrop-filter:none;
  white-space:nowrap; line-height:1.3;
}
.facts--claro .fact + .fact{ border-left:1px solid rgba(11,13,18,.16); }
.facts--claro .fact svg{ width:clamp(16px,1.3vw,18px); height:clamp(16px,1.3vw,18px); stroke:var(--blue); margin-bottom:2px; }
.facts--claro .fact__l{ font-size:clamp(11px,.95vw,13px); color:var(--slate); }
.facts--claro .fact b{ font-size:clamp(12.5px,1.2vw,17px); font-weight:800; color:var(--graphite); letter-spacing:-.01em; }
.reveal__sub{ text-wrap:balance; }
/* LEGIBILIDAD SIN CONTENEDOR (05/10/2026). Juan: nada de cajas ni franjas.
   El contraste sale del texto: etiqueta casi grafito, dato grafito y un halo
   blanco suave (text-shadow) que lo despega de la foto sin dibujar nada. */
.facts--claro .fact + .fact{ border-left-color:rgba(11,13,18,.28); }
.facts--claro .fact__l{ color:#2B3442; font-weight:600; }
.facts--claro .fact b{ color:var(--graphite); }
.facts--claro .fact__l, .facts--claro .fact b{
  text-shadow:0 0 2px rgba(255,255,255,.95), 0 0 10px rgba(255,255,255,.9), 0 0 18px rgba(255,255,255,.7);
}
.facts--claro .fact svg{ filter:drop-shadow(0 0 4px rgba(255,255,255,.95)); }
/* Más color y peso (05/10/2026): etiqueta en azul de marca y negrita, dato
   grafito un punto más grande; filetes más marcados. */
.facts--claro .fact__l{ color:var(--blue); font-weight:700; font-size:clamp(11.5px,1vw,13.5px); }
.facts--claro .fact b{ font-weight:800; font-size:clamp(13.5px,1.25vw,18px); }
.facts--claro .fact + .fact{ border-left:1.5px solid rgba(11,13,18,.32); }

/* PIE MÍNIMO (05/10/2026): una fila (nombre + cuatro enlaces) y la base. */
.foot{ padding-block:clamp(28px,4vw,44px) clamp(18px,2vw,24px); }
.foot__row{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:16px 28px; padding-bottom:clamp(18px,2.4vw,26px);
  border-bottom:1px solid rgba(11,13,18,.1);
}
.foot__wordmark{ font-size:clamp(20px,1.8vw,24px); }
.foot__wordmark span{ font-size:10px; letter-spacing:.26em; }
.foot__links{ display:flex; flex-wrap:wrap; gap:6px 24px; }
.foot__links a{ font-size:15px; font-weight:600; color:var(--graphite); text-decoration:none; padding-block:4px; }
.foot__links a:hover{ color:var(--blue); }
.foot__base{
  margin-top:0; padding-top:clamp(14px,1.8vw,18px); border-top:0;
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:6px 24px;
}
.foot__base p{ font-size:12.5px; color:var(--slate); }
.foot__legal{ display:flex; gap:16px; }
.foot__legal a{ color:var(--slate); text-decoration:none; }
.foot__legal a:hover{ color:var(--blue); }
@media (max-width:560px){
  .foot__row{ flex-direction:column; align-items:flex-start; }
  .foot__links{ gap:6px 20px; }
}

/* PIE CLÁSICO (05/10/2026). La fila suelta con logo + iconos no se leía como
   pie de página. Estructura de pie de verdad: marca con logo original,
   descripción corta y redes; tres columnas con título (Catálogo, Contacto,
   base legal. Bodegas fuera: ya están en el mapa justo arriba. Fondo gris claro, sin cajas. */
.foot{ padding:clamp(48px,6vw,72px) 0 0; }
.foot__grid{
  display:grid; grid-template-columns:2fr 1fr 1fr; gap:clamp(28px,4vw,56px);
  padding-bottom:clamp(36px,4.5vw,52px); border-bottom:1px solid rgba(11,13,18,.12);
}
.foot__logo-link{ display:inline-block; line-height:0; }
.foot__logo{ height:52px; width:auto; filter:none; display:block; }
.foot__desc{ margin:18px 0 0; max-width:32ch; font-size:14.5px; line-height:1.6; color:var(--slate); }
.foot__redes{ display:flex; gap:8px; margin-top:20px; }
.foot__redes a{
  width:38px; height:38px; border-radius:99px; display:grid; place-items:center;
  color:var(--graphite); border:1px solid rgba(11,13,18,.16); background:rgba(255,255,255,.55);
  transition:background .2s ease, color .2s ease, border-color .2s ease;
}
.foot__redes a:hover{ background:var(--blue); color:#fff; border-color:var(--blue); }
.foot__t{
  margin:6px 0 16px; font-size:12px; font-weight:800; letter-spacing:.12em;
  text-transform:uppercase; color:var(--blue);
}
.foot__col ul{ list-style:none; margin:0; padding:0; display:grid; gap:10px; }
.foot__col li{ font-size:14.5px; line-height:1.4; color:var(--slate); }
.foot__col a{ color:var(--graphite); font-weight:600; text-decoration:none; }
.foot__col a:hover{ color:var(--blue); }
.foot__base{
  display:flex; justify-content:space-between; align-items:center; gap:12px 24px; flex-wrap:wrap;
  padding-block:20px 24px; border:0;
}
.foot__base p{ margin:0; font-size:13px; color:var(--slate); }
.foot__legal{ display:flex; gap:20px; }
.foot__legal a{ color:var(--slate); text-decoration:none; }
.foot__legal a:hover{ color:var(--blue); }
@media (max-width:899px){
  .foot__grid{ grid-template-columns:1fr 1fr; }
  .foot__brand{ grid-column:1 / -1; }
}
@media (max-width:560px){
  .foot__grid{ gap:28px 20px; }
  .foot__base{ flex-direction:column; align-items:flex-start; padding-bottom:96px; }
}

/* Titular del cierre: con 1.02 las tildes de la Á y la Í chocaban con el
   renglón de arriba. Más aire entre renglones. */
.cierre__t{ line-height:1.14; }

/* ==========================================================================
   AJUSTES DE SISTEMA (05/10/2026), tras la revisión de estilo
   1. Bodegas: paneles a escuadra, sin sombra ni elevación, como el resto.
   2. Nada de texto por debajo de 13px.
   3. El orbe del hero en la dirección única del sitio, 155deg.
   ========================================================================== */
.sede{ border-radius:0; box-shadow:none; }
.sede:hover{ box-shadow:none; transform:none; border-color:var(--blue); }
.sede__n,
.horario__l,
.foot__t,
.tt__sello,
.ppanel__nota{ font-size:13px; letter-spacing:.08em; }
@media (max-width:640px){ .tt__sello{ font-size:13px; } }
/* Sus reglas propias llevan dos o tres clases: se repite la clase para
   igualar y ganar por orden. */
.facts .fact .fact__l.fact__l,
.facts .fact .fact__m.fact__m,
.facts .fact b.fact__m,
.facts.facts .fact b,
.foot .foot__base.foot__base p,
.foot .foot__legal.foot__legal a,
.shot .shot__tag.shot__tag.shot__tag{ font-size:13px; }
.orb{ background:linear-gradient(155deg, #3D5CFF 0%, #1E31A4 55%, #0B0D12 100%); }


/* ==========================================================================
   EL LOGO EN EL TELÓN (05/10/2026)
   Juan: «quiero darle más fuerza al logo». El logo entero reemplaza al nombre
   en letras (dice lo mismo, con la marca). Coreografía:
     0,20  «Bienvenido a»
     0,35  el logo sube, de desenfocado y algo pequeño a nítido
     0,95  un barrido de luz lo cruza, como en los botones del sitio
     1,70  el telón sube (antes 1,30: el logo necesita ese medio segundo)
   Tamaño: en escritorio ~44% del ancho con tope de 640px; en celular casi
   todo el ancho, porque ahí es lo único que hay en pantalla.
   ========================================================================== */
.telon__logo{
  position:relative; display:block;
  width:min(44vw, 640px);
  opacity:0; transform:translateY(18px) scale(.94); filter:blur(12px);
  animation:telonLogo .75s cubic-bezier(.2,.8,.2,1) .35s forwards;
}
@media (max-width:700px){ .telon__logo{ width:min(84vw, 420px); } }
.telon__logo img{ display:block; width:100%; height:auto;
  filter:drop-shadow(0 18px 30px rgba(120,80,0,.28)); }
/* Barrido de luz: franja inclinada que cruza el logo una vez. Recortada por
   la forma del propio logo con una máscara, así no pinta el amarillo. */
.telon__logo::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(105deg, transparent 35%, rgba(255,255,255,.75) 50%, transparent 65%);
  background-size:250% 100%; background-position:120% 0;
  -webkit-mask:url(assets/logo-maquimaderas.png) center / 100% 100% no-repeat;
          mask:url(assets/logo-maquimaderas.png) center / 100% 100% no-repeat;
  animation:telonBrillo .8s cubic-bezier(.4,0,.2,1) .95s forwards;
}
@keyframes telonLogo{ to{ opacity:1; transform:none; filter:blur(0); } }
@keyframes telonBrillo{ to{ background-position:-30% 0; } }

/* ---------- Revelado «Amigo carpintero» sobre madera (29/10/2026) ----------
   Juan: «ese gradient azul se ve feo, y el glow de los textos no deja leer».
   Sin azul encima de la madera: velo café oscuro (el tono de la propia
   madera), más denso en la franja del texto y más claro arriba y abajo, así
   la madera respira y el texto se lee. Sin halos: blanco limpio, amarillo
   de marca en «Amigo carpintero» y una sombra oscura apenas perceptible. */
#reveal .shot__art{ filter:saturate(1.08) contrast(1.04); }
#reveal .reveal__overlay{
  background:linear-gradient(180deg, rgba(14,10,7,.38) 0%, rgba(14,10,7,.72) 38%, rgba(14,10,7,.72) 62%, rgba(14,10,7,.38) 100%);
}
#reveal .reveal__amigo{
  background-image:linear-gradient(90deg, var(--yellow) 0, var(--yellow) 50%, var(--white) 50%, var(--white) 100%);
  filter:drop-shadow(0 2px 14px rgba(0,0,0,.35));
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  #reveal .reveal__amigo{ background:none; color:var(--yellow); -webkit-text-fill-color:currentColor; }
}
#reveal .reveal__sub{ color:var(--white); text-shadow:0 2px 12px rgba(0,0,0,.35); }
#reveal .facts--claro{ width:min(100%,600px); margin:10px auto 14px; }
#reveal .facts--claro .fact{ gap:4px; padding:2px clamp(10px,2vw,26px); }
#reveal .facts--claro .fact + .fact{ border-left-color:rgba(255,255,255,.22); }
#reveal .facts--claro .fact__l,
#reveal .facts--claro .fact b{ text-shadow:none; }
#reveal .facts--claro .fact svg{ filter:none; stroke:var(--yellow); width:20px; height:20px; }
#reveal .facts--claro .fact__l{
  color:rgba(255,255,255,.66); font-weight:700; font-size:12px; letter-spacing:.12em; text-transform:uppercase;
}
#reveal .facts--claro .fact b{ color:var(--white); font-size:clamp(15px,1.5vw,20px); font-weight:800; }
/* El revelado ya no se abre como ventana: ocupa la pantalla con el mismo
   hueco lateral de la retícula (10px), igual que trayectoria arriba. */
#reveal .reveal__frame,
.anim-ready #reveal .reveal__frame{ inset:0 var(--gap-unit); clip-path:none; -webkit-clip-path:none; }

/* Isotipo junto al nombre en la barra (29/10/2026). Va siempre sobre el
   blanco de la barra; con el menú de celular abierto (fondo oscuro) se oculta,
   porque el isotipo solo vive sobre blanco. */
.nav__logo{ display:inline-flex; align-items:center; gap:10px; }
.nav__iso{ width:clamp(28px,2.4vw,34px); height:auto; flex:none; display:block; }
.nav.is-open .nav__iso{ visibility:hidden; }

/* ==========================================================================
   CIERRE v3: retícula de piezas (29/10/2026)
   Escribir y visitar en una sola pieza de diseño, con el hueco de 10px y los
   colores de marca a 155°, como «Lo que tienes que saber» de las fichas.
   ========================================================================== */
.cg-sec{ padding:clamp(48px,6vw,96px) 0 var(--gap-unit); background:var(--paper); }
.cg{
  display:grid; gap:var(--gap-unit); padding:0 var(--gap-unit);
  grid-template-columns:1fr; scroll-margin-top:var(--nav-h);
}
.cg__p{
  position:relative; overflow:hidden; display:grid; align-content:end; gap:10px; min-width:0;
  padding:clamp(26px,3vw,48px); text-decoration:none; color:inherit;
}
.cg__k{ font-weight:800; font-size:13px; letter-spacing:.14em; text-transform:uppercase; }
.cg__t{
  margin:0; font-family:var(--f-display); text-transform:uppercase; color:var(--white);
  font-size:clamp(64px,8.6vw,150px); line-height:.86; letter-spacing:-.04em; padding-top:.14em;
}
.cg__s{ margin:0; font-size:clamp(16px,1.3vw,19px); line-height:1.5; max-width:34ch; color:rgba(255,255,255,.8); }
.cg__btn{ justify-self:start; margin-top:12px; min-height:clamp(58px,5vw,72px); padding-inline:clamp(26px,2.6vw,40px);
  font-size:clamp(16px,1.3vw,19px); border-radius:16px; gap:12px; }
.cg__btn svg{ width:22px; height:22px; }

.cg__p--wa{ background:linear-gradient(155deg,#1B2557 0%,#0E1330 52%,#0B0D18 100%); color:var(--white); min-height:clamp(380px,40vw,560px); }
.cg__p--wa .cg__k{ color:var(--yellow); }

.cg__p--mapa{ padding:0; min-height:360px; background:#E9ECF2; }
.cg__p--mapa iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; filter:saturate(.85); }
.cg__chip{
  position:absolute; z-index:2; left:16px; top:16px; padding:8px 14px;
  background:var(--white); color:var(--blue); font-weight:800; font-size:12px; letter-spacing:.14em; text-transform:uppercase;
  box-shadow:0 8px 20px -10px rgba(14,19,48,.45);
}

.cg__dir{ font-family:var(--f-display); text-transform:uppercase; font-size:clamp(26px,2.4vw,40px); line-height:.95; letter-spacing:-.02em; padding-top:.12em; }
.cg__barrio{ font-size:15px; opacity:.8; }
.cg__ir{ display:inline-flex; align-items:center; gap:6px; margin-top:8px; font-weight:800; font-size:15px; }
.cg__ir svg{ transition:transform .25s; }
a.cg__p:hover .cg__ir svg{ transform:translateX(4px); }
.cg__p--b1{ background:linear-gradient(155deg,#FFD24D 0%,#FFC629 48%,#F5B912 100%); color:var(--graphite); min-height:240px; }
.cg__p--b1 .cg__k{ color:var(--blue); }
.cg__p--b2{ background:var(--graphite); color:var(--white); min-height:240px; }
.cg__p--b2 .cg__k, .cg__p--b2 .cg__ir{ color:var(--yellow); }

.cg__p--hora{ background:var(--white); border:1px solid var(--line); color:var(--graphite); align-content:center; }
.cg__p--hora .cg__k{ color:var(--blue); }
.cg__h{ margin:0; display:grid; gap:2px; padding:12px 0; border-top:1px solid var(--line); }
.cg__h b{ font-size:14px; font-weight:800; letter-spacing:.04em; color:var(--slate); text-transform:uppercase; }
.cg__h span{ font-family:var(--f-display); text-transform:uppercase; font-size:clamp(24px,2.2vw,36px); line-height:1; letter-spacing:-.015em; padding-top:.1em; }

@media (min-width:900px){
  .cg{ grid-template-columns:repeat(4,minmax(0,1fr)); }
  .cg__p--wa{ grid-column:1 / span 2; grid-row:1 / span 2; }
  .cg__p--mapa{ grid-column:3 / span 2; grid-row:1 / span 2; }
  .cg__p--b1{ grid-column:1; grid-row:3; }
  .cg__p--b2{ grid-column:2; grid-row:3; }
  .cg__p--hora{ grid-column:3 / span 2; grid-row:3; }
}
@media (min-width:600px) and (max-width:899px){
  .cg{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .cg__p--wa, .cg__p--mapa, .cg__p--hora{ grid-column:1 / -1; }
}
@media (max-width:599px){
  .cg__p--wa{ min-height:0; }
  .cg__p--b1, .cg__p--b2{ min-height:0; }
  .cg__p--mapa{ order:5; min-height:300px; }
}
/* El titular mide lo que su pieza: «ESCRÍBENOS.» ocupa ~7,3 veces su tamaño. */
.cg__p--wa{ container-type:inline-size; }
.cg .cg__t{ color:var(--white); font-size:min(150px, calc(100cqi / 7.3)); }
.cg__dir{ font-size:clamp(22px,1.9vw,32px); }

/* «Amigo carpintero»: menos alto y con las máquinas sobre la madera
   (29/10/2026). */
#reveal{ height:82svh; min-height:560px; }
#reveal .reveal__overlay{ align-items:start; padding-top:clamp(56px,9vh,110px); }
.reveal__maq{
  position:absolute; z-index:5; bottom:-2%; height:auto; pointer-events:none;
  filter:drop-shadow(0 30px 34px rgba(0,0,0,.55));
}
.reveal__maq--titan{ left:3%; width:min(34%,520px); }
.reveal__maq--urus{ right:1%; width:min(42%,640px); }
@media (max-width:899px){
  #reveal{ height:auto; min-height:0; }
  #reveal .reveal__overlay{ position:relative; padding-bottom:clamp(150px,42vw,230px); }
  .reveal__maq--titan{ width:46%; left:2%; }
  .reveal__maq--urus{ width:54%; right:-2%; }
}
/* Celular: alto fijo (con alto automático el anclado del scroll se
   descuadraba y tapaba la sección de abajo). */
@media (max-width:899px){
  #reveal{ height:88svh; min-height:600px; }
  #reveal .reveal__overlay{ position:absolute; padding-bottom:0; }
}
.cg__abrir{ position:absolute; z-index:2; left:16px; bottom:16px; box-shadow:0 10px 24px -10px rgba(14,19,48,.5); }
/* Sin máquinas (Juan: «se ven horribles»); solo el alto necesario para el
   texto, centrado. */
.reveal__maq{ display:none; }
#reveal{ height:clamp(460px,62svh,620px); min-height:0; }
#reveal .reveal__overlay{ align-items:center; padding-top:var(--gutter); }
@media (max-width:899px){ #reveal{ height:clamp(480px,72svh,600px); } }
