/* ===========================================================================
   TEMAS ESTACIONALES — Muebles Roca
   ---------------------------------------------------------------------------
   REGLA INNEGOCIABLE: toda regla de este archivo empieza con html[data-tema].
   Si una regla no lo hace, está mal escrita. Sin el atributo (11 meses al año)
   este archivo no pinta absolutamente nada y el sitio es idéntico al original.

   NO SE EDITA css/style.css POR UN TEMA. Los desplazamientos del navbar de
   más abajo ganan por especificidad — ver el comentario de esa sección.
   =========================================================================== */

/* --- Medidas comunes -------------------------------------------------------
   El alto vive acá y NO dentro de cada preset: si lo declarara cada preset,
   html[data-tema="patrio"] (0,2,1) le ganaría a la media query de móvil
   html[data-tema] (0,1,1) y el banner nunca encogería en el teléfono. */
html[data-tema] {
  --tema-banner-h: 44px;
}

/* --- Colores: RESPALDO solamente ------------------------------------------
   Los valores reales los pone js/temas.js como propiedades inline sobre <html>,
   leídos de la tabla `temas` que edita el panel local. Estos son el piso por si
   un tema viene sin paleta: sin ellos, un campo vacío en el panel dejaría el
   bloque transparente y el texto invisible. */
html[data-tema] {
  --tema-bg: #1B6CA8;
  --tema-fg: #FFFFFF;
  --tema-accent: #6CACE4;
}

/* --- El banner ------------------------------------------------------------
   Fijo, no absoluto: el navbar es position:fixed, así que si el banner se
   fuera con el scroll el navbar quedaría flotando con un hueco de 44px
   encima. Como se queda siempre a la vista, lleva la × para cerrarlo. */
html[data-tema] .tema-banner {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: var(--tema-banner-h);
  z-index: 1000;                  /* igual que .navbar; el menú móvil (1100) lo tapa */
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 0 48px;
  background: var(--tema-bg);
  color: var(--tema-fg);
  overflow: hidden;               /* red de seguridad: nada se desborda al hero */
}

/* El color va declarado acá y NO se hereda de .tema-banner: css/style.css:530
   tiene `p { color: var(--text-soft) }`, y una regla que matchea al elemento le
   gana SIEMPRE al valor heredado del padre, por débil que sea su especificidad.
   Sin esta línea el mensaje sale en ink-700 (#2F3742) sobre el azul. */
html[data-tema] .tema-banner-msg {
  margin: 0;
  color: var(--tema-fg);
  font-family: var(--font-main);
  font-size: 0.83rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-align: center;
  line-height: 1.2;
}

html[data-tema] .tema-banner-x {
  position: absolute;
  right: 10px;
  top: 50%;
  transform: translateY(-50%);
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  background: transparent;
  border: 0;
  border-radius: var(--radius-pill);
  color: var(--tema-fg);
  font-size: 1.15rem;
  line-height: 1;
  cursor: pointer;
  opacity: 0.75;
}

html[data-tema] .tema-banner-x:hover {
  opacity: 1;
  background: rgba(255, 255, 255, 0.14);
}

/* Recuadro con la bandera, junto al texto.
   La primera versión ponía la bandera como franja tricolor de lado a lado del
   banner: a 1440px cada tercio medía 480px y no se leía como bandera, se leía
   como una barra blanca suelta. La bandera se reconoce por su PROPORCIÓN, no
   por su color — a 21×14px funciona. Decorativa: aria-hidden en el marcado. */
html[data-tema] .tema-banner-flag {
  width: 21px;
  height: 14px;
  flex-shrink: 0;
  border-radius: 2px;
  background: linear-gradient(
    to right,
    var(--tema-accent) 0 33.333%,
    #FFFFFF 33.333% 66.666%,
    var(--tema-accent) 66.666% 100%
  );
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.28);
}

/* Hairline al pie: celeste sólido, sin tricolor. */
html[data-tema] .tema-banner-linea {
  display: none;
}

html[data-tema-variante="patrio"] .tema-banner-linea {
  display: block;
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 3px;
  background: var(--tema-accent);
}

/* --- Hacerle lugar al banner ----------------------------------------------
   El navbar es position:fixed con top:18px declarado en SIETE lugares:
   css/style.css:733 (.navbar-inner), :893 (.navbar-home), :931 (.nav-shadow),
   más inline en index.html:2334, index.html:2374, contacto.html:900 y
   nosotros.html:1326.

   Esta única regla los gana los siete SIN EDITAR NINGUNO: la especificidad
   html[data-tema-banner] .navbar-home es (0,2,1) contra (0,1,0) de las
   originales. La especificidad le gana al orden de carga, así que da igual
   que el <style> inline venga después. Sin banner, la regla no existe. */
html[data-tema-banner] .navbar-home,
html[data-tema-banner] .navbar-inner,
html[data-tema-banner] .nav-shadow {
  top: calc(18px + var(--tema-banner-h));
}

html[data-tema-banner] body {
  padding-top: var(--tema-banner-h);
}

/* ===========================================================================
   EL BLOQUE DE TEMPORADA
   ---------------------------------------------------------------------------
   La v1 falló por tibia: el celeste vivía confinado en una franja de 44px, y
   un color confinado no se siente. Acá el celeste es el SUELO de una sección
   entera. Eso es lo que cambia la sensación, no agregar más acentos sueltos.

   La lectura patria no la carga solo el color: la carga la SILLA. La R-004 se
   vende en celeste, así que Guatemala sale del catálogo en vez de ser
   decoración pegada encima.
   =========================================================================== */
html[data-tema] .tema-bloque {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--tema-bg);
  color: var(--tema-fg);
  padding: clamp(56px, 9vw, 120px) 0;
}

/* Acá hubo tres franjas verticales de la bandera a baja opacidad
   (.tema-bloque-franjas). Aun al 8-16% el borde entre bandas se veía como un
   corte vertical a los 2/3 de la pantalla — un error de render, no una
   bandera. Se quitaron del CSS y del JS. La bandera la dice la foto. */

/* --- La banda deja de ser un rectángulo de color plano ---------------------
   El set patrio de fondo, a lo ancho y DESENFOCADO. Sin desenfocar, a opacidad
   baja, se leía como una copia fantasma de la misma foto que está en la
   tarjeta de al lado: la misma imagen dos veces a dos tamaños. Desenfocado se
   deja de leer el sujeto y se lee la LUZ y las bandas de color — o sea, la
   bandera fuera de foco, que es el guiño patrio sin competirle a la escena.

   El desenfoque va horneado en el archivo, no en `filter: blur()`: un blur en
   CSS sobre una capa del ancho de la pantalla se recalcula en cada composición,
   y en este proyecto el compositor de Safari ya trabó el scroll dos veces. Así
   además pesa 9,7 KB, porque una imagen desenfocada comprime como ninguna.

   Va en z-index -2, DEBAJO de las franjas de la bandera (-1), que siguen dando
   la textura vertical encima. */
html[data-tema-variante="patrio"] .tema-bloque::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -2;
  background-image: url('../assets/images/temas/patrio/banda.webp');
  background-size: cover;
  background-position: center;
  /* 0,62 y no 0,34: a un tercio, bajo el velo, la foto no llegaba a existir y
     la banda seguía leyéndose como el rectángulo plano que se quiso arreglar.
     El fondo tiene que verse; el velo es el que decide DÓNDE. */
  opacity: 0.62;
}

/* El velo. El texto blanco vive en la mitad IZQUIERDA, así que ahí el fondo
   tiene que seguir siendo el azul sólido y la foto solo puede asomar del centro
   a la derecha, detrás de la tarjeta. Sin esto el título perdía el respaldo
   justo donde la placa tiene la banda blanca de la bandera.
   `::after` y no otro `div`: es el último hijo en orden de pintado, así que
   queda encima de la foto Y de las franjas, y debajo del contenido. */
html[data-tema-variante="patrio"] .tema-bloque::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background: linear-gradient(
    to right,
    #1B6CA8 0%,
    rgba(27, 108, 168, 0.97) 34%,
    rgba(27, 108, 168, 0.72) 54%,
    rgba(27, 108, 168, 0.2) 78%,
    rgba(27, 108, 168, 0) 100%
  );
}

/* En una sola columna el texto ocupa TODO el ancho, así que un velo horizontal
   lo deja descubierto de la mitad para la derecha. Acá el velo se vuelve
   vertical: transparente arriba, donde está la foto, y sólido abajo, donde
   está el texto. La foto de fondo sigue asomando, pero solo detrás de la
   tarjeta, que es donde no estorba. */
@media (max-width: 860px) {
  html[data-tema-variante="patrio"] .tema-bloque::after {
    background: linear-gradient(
      to bottom,
      rgba(27, 108, 168, 0.45) 0%,
      rgba(27, 108, 168, 0.9) 42%,
      #1B6CA8 62%
    );
  }
}

/* --- Modo PANORAMA: la banda ES la foto -------------------------------------
   Cuando existe assets/images/temas/<variante>/panorama.webp (lo sondea
   js/temas.js), la banda deja de ser "texto + tarjeta con foto" y pasa a ser
   una fotografía a todo el ancho con el texto encima, como el hero.
   La escena panorámica se generó con la MITAD IZQUIERDA vacía a propósito
   (telón, volcán y piso, sin muebles): ahí va el texto, y el velo solo tiene
   que asegurar el contraste, no tapar producto.
   Sin el archivo nada de esto aplica y la banda se queda con la tarjeta. */
html[data-tema] .tema-bloque--panorama {
  display: grid;
  align-items: center;
  /* Crece con el ancho para que `cover` recorte poco: a 1440 la imagen 21:9
     mide 617 de alto contra 547 de caja (11% de recorte); a 1920, 823 contra
     730, el mismo 11%. Un alto fijo recortaría el doble en pantallas anchas. */
  min-height: clamp(500px, 38vw, 740px);
}

html[data-tema-variante="patrio"] .tema-bloque--panorama::before {
  background-image: url('../assets/images/temas/patrio/panorama.webp');
  /* `auto 100%` y NO `cover`: la foto se escala al ALTO de la banda y se
     ancla a la derecha. La banda es más ancha que la foto (2,63:1 contra
     2,36:1), así que a la izquierda quedan ~10% de banda sin foto — que es
     azul sólido bajo el velo sólido, o sea invisible. Lo que se gana es que
     los muebles corren un 5% a la derecha, lejos del texto, y que nada se
     recorta por arriba ni por abajo. La proporción de la banda es constante
     (min-height: 38vw) así que el 56% vale a cualquier ancho. */
  background-size: auto 100%;
  background-position: right center;
  opacity: 1;
}

html[data-tema] .tema-bloque--panorama .tema-bloque-inner {
  grid-template-columns: minmax(0, 1fr);
  /* `width: 100%` es obligatorio: la sección es grid y la caja interna trae
     `margin: 0 auto`. Los márgenes automáticos de un ítem de grid ANULAN el
     stretch, así que sin ancho explícito la caja se encogía a su contenido
     (656px) y el texto salía centrado en la pantalla, no a la izquierda. */
  width: 100%;
}

/* Entre dónde termina el texto y dónde arranca el primer mueble vive todo el
   compromiso de esta banda: el velo tiene que seguir cerrado en el primero y
   estar abierto en el segundo. En la escena elegida el escritorio arranca al
   51% de la foto; con la foto a `auto 100%` anclada a la derecha (ver abajo)
   eso cae al ~56% de la banda. El texto se acota a 560 y termina al 49%, y
   el título baja a 32px (pide ~535 para ir en UNA línea). Con 600 y 34px el
   final del título caía sobre velo abierto: el fallo de contraste que ya se
   midió una vez. */
html[data-tema] .tema-bloque--panorama .tema-bloque-texto {
  max-width: 560px;
}

html[data-tema-variante="patrio"] .tema-bloque--panorama .tema-bloque-titulo {
  font-size: min(2.3vw, 32px);
}

html[data-tema-variante="patrio"] .tema-bloque--panorama::after {
  background: linear-gradient(
    to right,
    #1B6CA8 0%,
    #1B6CA8 37%,
    rgba(27, 108, 168, 0.86) 46%,
    rgba(27, 108, 168, 0.42) 54%,
    rgba(27, 108, 168, 0.1) 61%,
    rgba(27, 108, 168, 0) 68%
  );
}

/* --- Que la banda no se vea como una lámina: zoom lento en BUCLE ------------
   La foto respira: escala 1 → 1,07 en 26s, ida y vuelta con ease-in-out, así
   que no tiene costura ni cambia de dirección de golpe. Es el mismo tratamiento
   que el hero del sitio (kenBurns) y que el hero del tema.

   Cuelga de `.en-pantalla`, una clase que js/temas.js prende SOLO mientras la
   banda intersecta y la pestaña está visible, y apaga al salir. Un bucle de
   transform que no se pausa, justo encima del <canvas> de #chair-build, es el
   patrón exacto que trabó el scroll de Safari dos veces en este proyecto.
   Sin JS, sin observador o con «reducir movimiento», la foto queda quieta —
   que es el default correcto: quieta se ve bien; animada es lo que se activa.

   `transform-origin: right center`: el borde derecho de la foto es el borde de
   la banda (anclada a la derecha), y al escalar tiene que quedarse pegado ahí
   — desde el centro se abriría una franja de azul en el borde derecho. Lo que
   sobra crece hacia la izquierda (bajo el velo) y arriba/abajo (recortado por
   el overflow de la sección; la foto tiene piso de sobra bajo las patas). */
@keyframes tema-panorama-respirar {
  from { transform: scale(1); }
  to   { transform: scale(1.07); }
}

html[data-tema] .tema-bloque--panorama::before {
  transform-origin: right center;
}

html[data-tema] .tema-bloque--panorama.en-pantalla::before {
  animation: tema-panorama-respirar 26s ease-in-out infinite alternate;
}

@media (prefers-reduced-motion: reduce) {
  html[data-tema] .tema-bloque--panorama.en-pantalla::before {
    animation: none;
  }
}

@media (max-width: 860px) {
  /* En una columna la panorámica no sirve: los muebles viven en su mitad
     derecha y a lo alto de un teléfono `cover` los recortaría. Acá va la
     escena frontal 4:3 (bloque.webp) a todo el ancho y arriba, y el texto
     debajo sobre el azul sólido. El velo funde el pie de la foto con el azul.
     75vw es exactamente el alto de una imagen 4:3 a 100vw de ancho. */
  html[data-tema] .tema-bloque--panorama {
    display: block;
    min-height: 0;
    padding-top: calc(75vw + 8px);
  }
  html[data-tema-variante="patrio"] .tema-bloque--panorama::before {
    background-image: url('../assets/images/temas/patrio/bloque.webp');
    background-size: 100% auto;
    background-position: top center;
    background-repeat: no-repeat;
    /* Acá la foto va pegada al borde SUPERIOR: el origen del zoom sube con ella,
       o al escalar se despegaría del techo de la banda. */
    transform-origin: top center;
  }
  html[data-tema-variante="patrio"] .tema-bloque--panorama::after {
    background: linear-gradient(
      to bottom,
      rgba(27, 108, 168, 0) 0,
      rgba(27, 108, 168, 0) calc(75vw - 72px),
      #1B6CA8 75vw
    );
  }
  html[data-tema] .tema-bloque--panorama .tema-bloque-texto {
    max-width: none;
  }
}

html[data-tema] .tema-bloque-inner {
  max-width: 1240px;
  margin: 0 auto;
  padding: 0 clamp(20px, 4vw, 48px);
  display: grid;
  /* Asimétrico a propósito: el texto manda, la foto acompaña. */
  grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
  gap: clamp(28px, 5vw, 72px);
  align-items: center;
}

html[data-tema] .tema-bloque-kicker {
  margin: 0 0 clamp(12px, 2vw, 20px);
  color: var(--tema-fg);
  font-family: var(--font-main);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  opacity: 0.85;
}

/* El momento tipográfico. Salto de escala real (la cifra es ~6x el cuerpo),
   no un 1.5x tímido: es lo que hace que la sección se sienta. */
html[data-tema] .tema-bloque-numero {
  margin: 0 0 clamp(10px, 1.6vw, 18px);
  display: flex;
  align-items: baseline;
  gap: clamp(10px, 1.6vw, 20px);
  flex-wrap: wrap;
}

html[data-tema-variante="patrio"] .tema-bloque-cifra {
  font-family: var(--font-main);
  font-size: clamp(4.5rem, 13vw, 11rem);
  font-weight: 800;
  line-height: 0.82;
  letter-spacing: -0.045em;
  color: var(--tema-fg);
  font-variant-numeric: tabular-nums;
}

/* Peso 300 contra el 800 de la cifra: el contraste de peso hace el trabajo. */
html[data-tema-variante="patrio"] .tema-bloque-anios {
  font-family: var(--font-main);
  font-size: clamp(0.95rem, 1.5vw, 1.2rem);
  font-weight: 300;
  letter-spacing: 0.02em;
  color: var(--tema-accent);
}

html[data-tema] .tema-bloque-titulo {
  margin: 0 0 clamp(12px, 1.8vw, 18px);
  max-width: 20ch;
  color: var(--tema-fg);
  font-family: var(--font-main);
  font-size: clamp(1.5rem, 3.1vw, 2.5rem);
  font-weight: 700;
  line-height: 1.14;
  letter-spacing: -0.02em;
}

/* Igual que el banner: el color va declarado, no heredado, porque
   css/style.css:530 tiene `p { color: var(--text-soft) }` y una regla que
   matchea al elemento le gana siempre a la herencia. */
html[data-tema] .tema-bloque-cuerpo {
  margin: 0;
  max-width: 46ch;
  color: var(--tema-fg);
  font-family: var(--font-main);
  font-size: clamp(0.95rem, 1.3vw, 1.06rem);
  font-weight: 400;
  line-height: 1.65;
  opacity: 0.92;
}

/* Hueco de la promo: hoy no se pinta porque el JS no lo crea si promo es null.
   Cuando exista la oferta, aparece acá sin tocar el CSS. */
html[data-tema] .tema-bloque-promo {
  margin-top: clamp(18px, 2.6vw, 26px);
  padding: 14px 18px;
  display: inline-flex;
  flex-direction: column;
  gap: 4px;
  background: rgba(255, 255, 255, 0.12);
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: var(--radius-sm);
}

html[data-tema] .tema-bloque-promo-etiqueta {
  color: var(--tema-fg);
  font-size: 1.05rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}

html[data-tema] .tema-bloque-promo-detalle {
  color: var(--tema-fg);
  font-size: 0.88rem;
  opacity: 0.88;
}

/* El CTA se queda ROJO. Es el color que vende en este sitio y el tema no le
   toca los botones de conversión; sobre el celeste además resalta más. */
html[data-tema] .tema-bloque-cta {
  margin-top: clamp(22px, 3vw, 32px);
  display: inline-flex;
  align-items: center;
  min-height: 50px;
  padding: 0 28px;
  background: var(--primary-red);
  color: #FFFFFF;
  border-radius: var(--radius-pill);
  font-family: var(--font-main);
  font-size: 0.98rem;
  font-weight: 700;
  text-decoration: none;
  transition: background-color 0.3s var(--ease-out), transform 0.3s var(--ease-out);
}

html[data-tema] .tema-bloque-cta:hover {
  background: var(--primary-red-hover);
  transform: translateY(-2px);
}

/* La foto va sobre panel BLANCO, no sobre el celeste: la silla ES celeste y
   sobre el fondo del mismo color se perdería. El panel blanco hace además de
   banda blanca de la bandera. Nada de multiply acá. */
html[data-tema] .tema-bloque-foto {
  position: relative;
  overflow: hidden;
  /* El MISMO crema que traen los packshots del catálogo (#F3EFE9). Con la
     tarjeta en blanco puro se veía el recuadro de la foto dentro de la
     tarjeta: dos blancos distintos, como una calcomanía mal pegada. */
  background: #F3EFE9;
  border-radius: var(--radius-lg);
  /* Los packshots del catálogo hoy son CUADRADOS de un solo producto
     (…-01-hero-sq.webp, 1024x1024), no la hoja turnaround 2x2 de antes.
     Con la proporción vieja (448/600) y el recorte por cuadrante se veía la
     esquina superior izquierda de la foto en vez del mueble. */
  aspect-ratio: 1 / 1;
  /* `width:100%` + `justify-self` y NO `margin-inline:auto`: con márgenes auto
     la caja pasa a shrink-to-fit, y como su único hijo va en position:absolute
     no queda contenido del que sacar ancho. Medía 0x0 y el panel desaparecía.
     Tampoco `max-height`: recortaría la altura sin recortar el ancho, la caja
     dejaría de tener la proporción del cuadrante y el `cover` volvería a
     comerse las patas. El tope va por ancho. */
  width: 100%;
  max-width: 420px;
  justify-self: center;
}

/* El archivo es un turnaround de 4 tomas. La primera versión usaba
   `transform: scale(2)` sobre una imagen con object-fit:contain y le cortaba
   las patas: el scale operaba sobre la CAJA del contain (con sus bandas
   blancas), no sobre el archivo.
   Acá la imagen mide 200%x200% del panel y el panel tiene la proporción del
   cuadrante, así que los cuatro cuadrantes caen exactos y el panel (overflow
   hidden) recorta al de arriba a la izquierda: la silla frontal, completa. */
html[data-tema] .tema-bloque-img {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  /* css/style.css:294 tiene `img, video { max-width: 100% }`: se neutraliza
     para que el ancho lo mande esta regla y no aquella. */
  max-width: none;
  /* `contain`, NO `cover`: estas fotos son 1:1 con el mueble centrado y
     márgenes generosos; con cover se le corta la cabeza al respaldo. */
  object-fit: contain;
  padding: 3%;
  box-sizing: border-box;
}

@media (max-width: 860px) {
  html[data-tema] .tema-bloque-inner {
    grid-template-columns: 1fr;
  }

  /* La foto va PRIMERO: entra el producto, después el discurso.
     Antes iba topada a 260px y pegada a la izquierda, y en una columna sola
     eso dejaba un socavón de azul vacío al lado (así se veía en el teléfono).
     Ahora ocupa el ancho de la columna y se achata a banda: el producto va
     centrado con `contain`, así que ni se deforma ni se le cortan las patas. */
  html[data-tema] .tema-bloque-foto {
    order: -1;
    max-width: none;
    width: 100%;
    justify-self: stretch;
    aspect-ratio: 4 / 3;
  }

  html[data-tema] .tema-bloque-titulo {
    max-width: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  html[data-tema] .tema-bloque-cta {
    transition: none;
  }
  html[data-tema] .tema-bloque-cta:hover {
    transform: none;
  }
}

/* --- Acentos: NINGUNO, a propósito ----------------------------------------
   Acá hubo `html[data-tema="patrio"] .eyebrow { color: var(--tema-bg) }` y se
   quitó. El sitio tiene TRECE overrides contextuales de .eyebrow (style.css
   :1263 :3744 :3897 :4136 :4215 :4732, más inline en index.html :311 :709
   :1244 :1531): unos son rojos sobre fondo claro y otros BLANCOS sobre fondo
   oscuro o sobre foto. La regla del tema, con especificidad (0,2,1), le ganaba
   también a los blancos y dejaba azul #1B6CA8 sobre oscuro — ilegible.

   Pintar un componente con tantos contextos exige auditar los trece y volver a
   verificarlos en cada cambio: es justo el acoplamiento que este sistema
   promete no crear. El banner y la bandera ya visten la página.

   Si algún día se quiere un acento, va sobre un componente de UN solo
   contexto, verificado en claro Y en oscuro antes de darlo por bueno. */

/* --- Móvil ----------------------------------------------------------------
   Misma especificidad que la declaración de arriba y más abajo en el archivo,
   así que gana. Ver el comentario de "Medidas comunes". */
@media (max-width: 720px) {
  html[data-tema] {
    --tema-banner-h: 38px;
  }

  /* Asimétrico a propósito: a la derecha hay que dejarle lugar a la ×, a la
     izquierda no. Simétrico desperdiciaba 34px que el mensaje necesitaba. */
  html[data-tema] .tema-banner {
    padding: 0 40px 0 12px;
    gap: 8px;
  }

  html[data-tema] .tema-banner-msg {
    font-size: 0.74rem;
  }

  html[data-tema] .tema-banner-flag {
    width: 18px;
    height: 12px;
  }
}

/* ===========================================================================
   ANIMACIONES DE TEMPORADA
   ---------------------------------------------------------------------------
   RIESGO DOCUMENTADO — leer antes de tocar nada de acá.
   El bloque se inyecta JUSTO ANTES de #chair-build, la sección cuyo <canvas>
   usa mix-blend-mode:multiply con scrub de ScrollTrigger. El vault registra
   que una animación CSS EN BUCLE cerca de ese canvas bloqueó el scroll en
   Safari móvil DOS VECES: obliga a recomponer el canvas en cada frame incluso
   en reposo y satura el compositor (feedback_safari_perf).

   Por eso toda animación en bucle de este archivo:
     · arranca PAUSADA (animation-play-state: paused),
     · solo corre mientras el bloque está en pantalla (lo prende js/temas.js
       con un IntersectionObserver, clase .corriendo),
     · anima ÚNICAMENTE transform y opacity, jamás layout ni filter,
     · desaparece por completo con prefers-reduced-motion.
   En reposo NADA debe estar recomponiendo. Si agregás un efecto nuevo acá,
   sostené esas cuatro reglas.
   =========================================================================== */

/* --- Nieve (Navidad) ------------------------------------------------------ */
html[data-tema-variante="navidad"] .tema-bloque-nieve {
  position: absolute;
  inset: 0;
  z-index: -1;                     /* detrás del texto, dentro del bloque */
  overflow: hidden;
  pointer-events: none;
}

html[data-tema-variante="navidad"] .tema-copo {
  position: absolute;
  top: -8%;
  left: var(--x);
  width: var(--s);
  height: var(--s);
  border-radius: 50%;
  background: #FFFFFF;
  opacity: 0;
  will-change: transform, opacity;
  animation-name: tema-caer;
  animation-duration: var(--d);
  animation-delay: var(--r);
  animation-timing-function: linear;   /* la nieve cae pareja, sin easing */
  animation-iteration-count: infinite;
  animation-play-state: paused;        /* lo prende el IntersectionObserver */
}

html[data-tema-variante="navidad"] .tema-bloque-nieve.corriendo .tema-copo {
  animation-play-state: running;
}

/* Solo transform y opacity: ambas se resuelven en el compositor y no tocan
   layout ni paint. El desvío lateral va en el mismo translate3d. */
@keyframes tema-caer {
  0%   { transform: translate3d(0, 0, 0); opacity: 0; }
  10%  { opacity: var(--o); }
  90%  { opacity: var(--o); }
  100% { transform: translate3d(var(--dx), 118vh, 0); opacity: 0; }
}

/* --- Celebración de los 205 (patrio) -------------------------------------- */
/* La cifra entra contando desde 0 (lo hace js/temas.js con rAF) y aterriza con
   un rebote corto. NO es un bucle: corre una sola vez al entrar en pantalla,
   así que no deja nada recomponiendo después. */
html[data-tema-variante="patrio"] .tema-bloque-cifra {
  display: inline-block;
  transform-origin: 0% 100%;
}

html[data-tema-variante="patrio"] .tema-bloque-cifra.aterriza {
  animation: tema-aterrizar 420ms cubic-bezier(0.22, 1, 0.36, 1) both;
}

@keyframes tema-aterrizar {
  0%   { transform: scale(1); }
  45%  { transform: scale(1.055); }
  100% { transform: scale(1); }
}

/* La etiqueta y el título entran detrás de la cifra, escalonados. La cifra
   lidera porque es lo importante; escalonar todo por igual se siente mecánico.

   OJO CON EL `.animable`: el opacity:0 NO cuelga del bloque a secas, cuelga de
   una clase que pone js/temas.js SOLO cuando ya sabe que va a poder animar.
   Al revés (esconder por CSS y confiar en que el JS revele) basta con que el
   IntersectionObserver no dispare —pasa en navegadores embebidos y en vistas
   previas— para que el título quede INVISIBLE en vez de simplemente quieto.
   El default siempre es "se ve"; animar es la excepción que se activa. */
html[data-tema-variante="patrio"] .tema-bloque.animable .tema-bloque-anios,
html[data-tema-variante="patrio"] .tema-bloque.animable .tema-bloque-titulo {
  opacity: 0;
  transform: translate3d(0, 10px, 0);
}

/* `.animable` gobierna LAS DOS cosas: esconder y animar. Quitarla devuelve
   todo a su estado natural visible de una sola vez.
   Sin el `.animable` de acá, el rescate se rompía solo: `rendirse()` agregaba
   `.visible`, esa clase disparaba la animación, y su `fill-mode: both` sostenía
   el fotograma inicial (opacidad 0) cuando la animación nunca llegaba a correr.
   El título quedaba invisible JUSTO en el camino pensado para salvarlo. */
html[data-tema-variante="patrio"] .tema-bloque.animable.visible .tema-bloque-anios,
html[data-tema-variante="patrio"] .tema-bloque.animable.visible .tema-bloque-titulo {
  animation: tema-entrar 520ms cubic-bezier(0.22, 1, 0.36, 1) both;
}

html[data-tema-variante="patrio"] .tema-bloque.animable.visible .tema-bloque-anios  { animation-delay: 420ms; }
html[data-tema-variante="patrio"] .tema-bloque.animable.visible .tema-bloque-titulo { animation-delay: 520ms; }

@keyframes tema-entrar {
  from { opacity: 0; transform: translate3d(0, 10px, 0); }
  to   { opacity: 1; transform: translate3d(0, 0, 0); }
}

/* --- Quien pidió menos movimiento, no ve ninguno -------------------------- */
@media (prefers-reduced-motion: reduce) {
  html[data-tema] .tema-bloque-nieve { display: none; }

  html[data-tema-variante="patrio"] .tema-bloque-cifra.aterriza,
  html[data-tema-variante="patrio"] .tema-bloque.visible .tema-bloque-anios,
  html[data-tema-variante="patrio"] .tema-bloque.visible .tema-bloque-titulo {
    animation: none;
  }

  html[data-tema-variante="patrio"] .tema-bloque.animable .tema-bloque-anios,
  html[data-tema-variante="patrio"] .tema-bloque.animable .tema-bloque-titulo {
    opacity: 1;
    transform: none;
  }
}

/* ===========================================================================
   VARIANTE NAVIDAD — composición propia, no la patria en verde
   ---------------------------------------------------------------------------
   Diciembre no tiene aniversario que contar, así que no hay cifra gigante: el
   peso lo lleva el título y el aire alrededor, para que la nieve se lea. La
   patria es asimétrica y empuja desde la izquierda; ésta respira al centro.
   =========================================================================== */
html[data-tema-variante="navidad"] .tema-bloque {
  padding: clamp(72px, 11vw, 150px) 0;
  text-align: center;
}

html[data-tema-variante="navidad"] .tema-bloque-inner {
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
  gap: clamp(30px, 4vw, 52px);
}

html[data-tema-variante="navidad"] .tema-bloque-titulo {
  max-width: 16ch;
  font-size: clamp(2rem, 5vw, 3.6rem);
  line-height: 1.06;
  letter-spacing: -0.03em;
}

html[data-tema-variante="navidad"] .tema-bloque-cuerpo {
  max-width: 42ch;
  margin-inline: auto;
  font-size: clamp(1rem, 1.5vw, 1.16rem);
}

/* Apaisada, no vertical: acostada bajo el texto centrado en vez de al costado. */
html[data-tema-variante="navidad"] .tema-bloque-foto {
  aspect-ratio: 16 / 9;
  max-width: 560px;
  order: 0;
}

html[data-tema-variante="navidad"] .tema-bloque-img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  position: static;
  padding: 18px;
}

@media (max-width: 860px) {
  html[data-tema-variante="navidad"] .tema-bloque-foto {
    order: 0;                       /* acá la foto NO se adelanta al texto */
    max-width: 100%;
  }
}

/* ===========================================================================
   EL HERO VESTIDO
   ---------------------------------------------------------------------------
   Dirección elegida: la "B" de las dos temporadas. La foto del hero y el
   titular rojo NO se tocan: el tema entra por la banda de bandera, la insignia,
   la cifra de fondo y (en diciembre) la nieve y el aviso de fecha límite.
   Se eligió sobre la variante que teñía todo el hero porque esa apagaba el
   rojo de la marca justo en la pantalla que convierte.

   Todo se INYECTA sobre el marcado que ya existe: index.html no se edita.
   =========================================================================== */
html[data-tema] .hero-card.tema-hero {
  position: relative;
  isolation: isolate;
}

/* --- Banda de bandera en el canto (solo patrio) --------------------------- */
html[data-tema] .tema-hero-banda { display: none; }

html[data-tema-variante="patrio"] .tema-hero-banda {
  display: block;
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 14px;
  /* z-index 3: la foto y el degradado son capas absolutas encima del fondo de
     la tarjeta, así que con z-index 2 la banda quedaba lavada debajo del
     degradado blanco. */
  z-index: 3;
  background: linear-gradient(
    to bottom,
    var(--tema-accent) 0 33.333%,
    #FFFFFF 33.333% 66.666%,
    var(--tema-accent) 66.666% 100%
  );
}

/* --- Marco de temporada (navidad) -----------------------------------------
   Es el MISMO elemento que la banda patria, en otra forma: acá es un aro
   completo. Se hace con un elemento y no con `box-shadow: inset` porque la
   foto del hero es absoluta a tamaño completo y tapaba el inset; además,
   declarar box-shadow en la tarjeta le borraba su sombra proyectada.
   `border-radius: inherit` toma los 40px de la tarjeta sin repetir el número. */
html[data-tema-variante="navidad"] .tema-hero-banda {
  display: block;
  position: absolute;
  inset: 0;
  width: auto;
  z-index: 3;
  border: 5px solid var(--tema-bg);
  border-radius: inherit;
  background: none;
  pointer-events: none;
}

/* --- La cifra de fondo ----------------------------------------------------
   Detrás del contenido (z-index bajo) y sin peso semántico: aria-hidden en el
   marcado, porque el dato ya lo dice la insignia. */
html[data-tema] .tema-hero-marca { display: none; }

html[data-tema-variante="patrio"] .tema-hero-marca {
  display: block;
  position: absolute;
  right: 7%;
  bottom: -2%;
  /* Mismo z que .hero-overlay y más abajo en el DOM: pinta ENCIMA del
     degradado. Con z-index 1 quedaba debajo y el lavado blanco se la comía. */
  z-index: 2;
  font-family: var(--font-main);
  font-size: clamp(9rem, 21vw, 19rem);
  font-weight: 800;
  line-height: 0.8;
  letter-spacing: -0.06em;
  color: color-mix(in srgb, var(--tema-bg) 24%, transparent);
  font-variant-numeric: tabular-nums;
  pointer-events: none;
  opacity: 0;
  transform-origin: 100% 100%;
}

html[data-tema-variante="patrio"] .tema-hero-marca.visible { opacity: 1; }

html[data-tema-variante="patrio"] .tema-hero-marca.aterriza {
  animation: tema-aterrizar 420ms cubic-bezier(0.22, 1, 0.36, 1) both;
}

/* NO tocar el posicionamiento de .hero-content ni de .hero-overlay.
   Acá hubo `position: relative; z-index: 3` sobre los dos. Era inútil para
   .hero-content (index.html:281 ya se lo da) y DESTRUCTIVO para .hero-overlay,
   que era `position: absolute`: al pasarlo a relative entró al flujo, ocupó los
   558px de la tarjeta y empujó todo el contenido del hero —título, botones,
   todo— fuera del `overflow: hidden`. El hero quedaba en blanco.

   La lección: agregar elementos propios es seguro; pisar el POSICIONAMIENTO de
   los que ya existen no lo es. Las capas nuevas se ordenan con su propio
   z-index contra el del sitio (overlay 2, contenido 3), sin reposicionar nada. */

/* --- Insignia sobre el título --------------------------------------------- */
html[data-tema] .tema-hero-insignia {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  align-self: flex-start;
  margin-bottom: 20px;
  padding: 9px 16px;
  border-radius: var(--radius-pill);
  background: var(--tema-bg);
  color: var(--tema-fg);
  font-family: var(--font-main);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

html[data-tema] .tema-hero-bandera {
  width: 17px;
  height: 11px;
  flex-shrink: 0;
  border-radius: 2px;
  background: linear-gradient(
    to right,
    var(--tema-accent) 0 33.333%,
    #FFFFFF 33.333% 66.666%,
    var(--tema-accent) 66.666% 100%
  );
}

/* --- Aviso de temporada (la fecha límite de diciembre) -------------------- */
html[data-tema] .tema-hero-aviso {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  align-self: flex-start;
  margin-bottom: 24px;
  padding: 14px 20px;
  background: #FFFFFF;
  border: 1px solid color-mix(in srgb, var(--tema-bg) 28%, transparent);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-md);
}

html[data-tema] .tema-hero-aviso svg {
  width: 26px;
  height: 26px;
  flex-shrink: 0;
  color: var(--tema-bg);
}

html[data-tema] .tema-hero-aviso-txt {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

/* Igual que en el banner: el color va declarado, no heredado. */
html[data-tema] .tema-hero-aviso-txt strong {
  color: var(--ink-900);
  font-size: 1rem;
  font-weight: 700;
}

html[data-tema] .tema-hero-aviso-txt span {
  color: var(--ink-700);
  font-size: 0.82rem;
}

/* --- Nieve dentro de la tarjeta del hero ---------------------------------- */
html[data-tema-variante="navidad"] .hero-card.tema-hero .tema-bloque-nieve {
  z-index: 2;                     /* sobre la foto, debajo del contenido */
}

/* Sobre la mitad clara de la foto un copo blanco se pierde: un aro finísimo lo
   sostiene sin ensuciar. */
html[data-tema-variante="navidad"] .hero-card.tema-hero .tema-copo {
  box-shadow: 0 0 0 1px rgba(15, 20, 26, 0.07);
}

/* --- Confeti --------------------------------------------------------------
   UNA sola pasada; js/temas.js borra la capa del DOM a los 3.6s. Nada queda
   animando después: es la regla que protege el scroll de Safari en este sitio. */
html[data-tema] .tema-confeti {
  position: absolute;
  inset: 0;
  z-index: 4;
  overflow: hidden;
  pointer-events: none;
}

html[data-tema] .tema-papelito {
  position: absolute;
  top: -8%;
  left: var(--x);
  width: var(--w);
  height: var(--h);
  border-radius: 1px;
  opacity: 0;
  will-change: transform, opacity;
  animation: tema-caer-papel var(--d) cubic-bezier(0.3, 0.6, 0.5, 1) var(--r) both;
}

@keyframes tema-caer-papel {
  0%   { transform: translate3d(0, 0, 0) rotate(0deg); opacity: 0; }
  12%  { opacity: 1; }
  80%  { opacity: 1; }
  100% { transform: translate3d(var(--dx), 105%, 0) rotate(var(--giro)); opacity: 0; }
}

@media (max-width: 900px) {
  html[data-tema-variante="patrio"] .tema-hero-banda { width: 8px; }
  html[data-tema] .tema-hero-insignia { font-size: 0.66rem; padding: 8px 13px; margin-bottom: 14px; }
  html[data-tema] .tema-hero-aviso { padding: 12px 15px; gap: 11px; margin-bottom: 18px; }
  html[data-tema] .tema-hero-aviso svg { width: 21px; height: 21px; }
  html[data-tema] .tema-hero-aviso-txt strong { font-size: 0.9rem; }
  html[data-tema] .tema-hero-aviso-txt span { font-size: 0.76rem; }
  html[data-tema-variante="patrio"] .tema-hero-marca { right: 2%; bottom: -3%; }
}

@media (prefers-reduced-motion: reduce) {
  html[data-tema] .tema-confeti { display: none; }
  html[data-tema-variante="patrio"] .tema-hero-marca { opacity: 1; animation: none; }
}

/* --- Rotación de producto dentro de la visita ------------------------------
   La capa se monta ENCIMA de la .hero-bg original y solo cruza opacidad. No
   se anima blur, escala ni filtros: en Safari móvil el compositing por
   fotograma en el hero ya trabó el scroll antes en este proyecto.
   El JS la pausa fuera de pantalla y con la pestaña oculta. */
/* La capa lleva la foto que ENTRA y solo cruza OPACIDAD. El `transform` se
   deja libre a propósito: lo usa la deriva lenta de más abajo, y si la
   transición también lo tocara las dos se pelearían por la misma propiedad. */
/* El cruce es CORTO y con curva de salida, no ease-in-out. Un fundido largo y
   simétrico se lee como pereza: la foto nueva tarda en comprometerse. Con
   ease-out gana opacidad de entrada y el cambio se siente resuelto. */
html[data-tema] .hero-card .tema-hero-capa {
  opacity: 0;
  transition: opacity 550ms cubic-bezier(0.22, 1, 0.36, 1);
  z-index: 1;
  will-change: opacity;
}

html[data-tema] .hero-card .tema-hero-capa.encima {
  opacity: 1;
}

/* --- Que la foto NUNCA se vea quieta ---------------------------------------
   Acá había una deriva de 4,5% en 34s ida y vuelta: 0,13% por segundo, por
   debajo del umbral de percepción, y con `ease-in-out alternate` la velocidad
   en los extremos del ciclo es CERO. O sea que se movía en el papel y se veía
   como una lámina, que es justo lo que se reportó.

   Ahora el zoom-out va ATADO A CADA FOTO: la que entra llega un 6% más cerca y
   se aleja durante todo su turno. 6% en 7,2s = 0,8%/s, seis veces más que
   antes, y en LINEAL a propósito: una curva de salida gastaría el movimiento
   en los primeros segundos y volvería a verse quieta justo al final del turno,
   que es el defecto que se está corrigiendo. El movimiento ambiental quiere
   velocidad constante; las curvas de salida son para las transiciones.

   Dura MÁS que el turno (7,2s contra 6s) para que el cambio la agarre todavía
   en movimiento. Y como la que entra está en 1,06 mientras la que sale ya va
   por ~1,00, durante el cruce hay una diferencia de escala entre las dos: eso
   da profundidad, la nueva entra por delante. No es un defecto de sincronía. */
@keyframes temaDeriva {
  from { transform: scale(1.06); }
  to   { transform: scale(1); }
}

/* Sin rotación (una sola foto, o `rotacion_en_visita:false`) no hay cambio que
   ate el zoom, así que un tiro único dejaría la foto congelada para siempre —
   el mismo defecto por otra puerta. Ahí va un vaivén SIN COSTURA: `alternate`
   nunca salta, y con ease-in-out frena en los extremos en vez de rebotar de
   dirección. Es el caso de reposo; el de rotación lo pisa la regla siguiente.

   Arranca en 1,06, EL MISMO fotograma inicial que `temaDeriva`, y no en 1: la
   rotación empieza 2s después de cargar y ahí la base cambia de una animación a
   la otra, lo que la reinicia en su primer fotograma. Con orígenes distintos
   ese relevo era un salto de 1,5% (≈19px de zoom aparente a 1280) que se veía
   como un pop. Compartiendo el origen, la diferencia a los 2s es 0,13%. */
@keyframes temaVaiven {
  from { transform: scale(1.06); }
  to   { transform: scale(1.015); }
}

html[data-tema] .tema-hero-fondo-propio .hero-bg,
html[data-tema] .tema-hero-fondo-propio .tema-hero-capa {
  animation: temaVaiven 30s ease-in-out infinite alternate;
}

/* `.tema-hero-rota` la pone js/temas.js SOLO cuando la rotación arrancó de
   verdad. Igual que con `.animable` en el bloque: el estado por defecto es el
   que se sostiene solo, y el modo que depende del JS es el que se activa. */
html[data-tema] .tema-hero-fondo-propio.tema-hero-rota .hero-bg,
html[data-tema] .tema-hero-fondo-propio.tema-hero-rota .tema-hero-capa {
  animation: temaDeriva 7200ms linear both;
}

@media (prefers-reduced-motion: reduce) {
  html[data-tema] .hero-card .tema-hero-capa { transition: none; }
  html[data-tema] .tema-hero-fondo-propio .hero-bg,
  html[data-tema] .tema-hero-fondo-propio .tema-hero-capa,
  html[data-tema] .tema-hero-fondo-propio.tema-hero-rota .hero-bg,
  html[data-tema] .tema-hero-fondo-propio.tema-hero-rota .tema-hero-capa { animation: none; }
}

/* --- Hero con set patrio propio: SOLO DE 601px PARA ARRIBA -----------------
   Acá abajo hay foto, así que la tarjeta se viste de azul y el texto pasa a
   blanco (el velo blanco original lavaba el celeste hasta dejarlo gris).
   TODO esto va dentro de la media query: en teléfono el sitio esconde la foto
   y el hero es texto sobre la página, así que el blanco quedaba invisible.
   Ahí el hero se queda EXACTAMENTE como el original y solo cambia de color,
   que es lo que hace el token celeste unas reglas más arriba.
   Solo se cambian COLORES: ni una regla toca posicionamiento — poner
   position/margin sobre .hero-overlay o .hero-content ya vació el hero antes. */
@media (min-width: 601px) {
  html[data-tema] .hero-card.tema-hero-fondo-propio .hero-overlay {
    background: linear-gradient(to right,
      rgba(14, 74, 120, 0.92) 0%,
      rgba(14, 74, 120, 0.58) 40%,
      rgba(14, 74, 120, 0) 68%);
  }

  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero,
  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero em {
    color: #FFFFFF;
  }

  /* `p { color: var(--text-soft) }` de style.css le gana al color heredado:
     el párrafo necesita su color declarado o sale gris oscuro sobre el azul. */
  html[data-tema] .tema-hero-fondo-propio .hero-content p,
  html[data-tema] .tema-hero-fondo-propio .hero-content .hero-subtitle {
    color: rgba(255, 255, 255, 0.88);
  }

  html[data-tema] .tema-hero-fondo-propio .hero-trust-bar,
  html[data-tema] .tema-hero-fondo-propio .hero-trust-item,
  html[data-tema] .tema-hero-fondo-propio .hero-trust {
    color: rgba(255, 255, 255, 0.82);
  }

  /* Los iconitos llevan `stroke` rojo propio, no heredado: con el color del
     texto en blanco quedaban tres marcas rojas sobre el azul, que es
     justamente el par que no tiene contraste. */
  html[data-tema] .tema-hero-fondo-propio .hero-trust-item svg,
  html[data-tema] .tema-hero-fondo-propio .hero-trust svg {
    stroke: currentColor;
  }

  html[data-tema] .tema-hero-fondo-propio .hero-buttons .btn-secondary {
    background: rgba(255, 255, 255, 0.14);
    color: #FFFFFF;
    border-color: rgba(255, 255, 255, 0.42);
    box-shadow: none;
  }

  /* La insignia se invierte: chip blanco sólido con texto azul. Sobre el
     celeste un chip translúcido no se despega del fondo. */
  html[data-tema] .tema-hero-fondo-propio .tema-hero-insignia {
    background: #FFFFFF;
    color: #0E4A78;
    border-color: transparent;
  }
}



/* --- Móvil: el hero es el ORIGINAL, solo cambia de color --------------------
   Se probó pintarle una tarjeta azul y no convenció: en teléfono el hero se
   queda con su composición de siempre —texto sobre el fondo de la página,
   título oscuro— y lo único que cambia es el acento, que el token de arriba
   ya volvió celeste. La insignia se aclara para vivir sobre fondo claro. */
@media (max-width: 600px) {
  html[data-tema] .tema-hero-fondo-propio .tema-hero-insignia {
    background: rgba(27, 108, 168, 0.11);
    color: #145A8C;
    border-color: transparent;
  }
}

/* En móvil el sitio esconde la foto del hero y la tarjeta va pintada de azul:
   la capa de rotación no tiene nada que hacer ahí. Ahora que es hermana de
   <picture> ya no hereda ese display:none, así que se apaga a mano. */
@media (max-width: 600px) {
  html[data-tema] .hero-card .tema-hero-capa { display: none; }
}

/* --- Título del hero de temporada: cada frase en UNA línea ------------------
   El título patrio es bastante más largo que el de siempre («Mobiliario de
   oficina»), y a 56px la primera frase pide 745px contra los 640px que deja
   libre el producto: se partía en tres renglones desparejos.
   Dos cambios, medidos:
     · el tamaño se ata al ancho (3.3vw) con tope: a ese ritmo la frase larga
       mide ~612px y entra con holgura en los 640 disponibles;
     · la segunda línea DEJA de ser 1.1em. Siendo más grande y más gruesa era
       ella la que no entraba, no la primera.
   Debajo de 600px no aplica: ahí no hay foto, la tarjeta es de ancho completo
   y forzar una línea dejaría el título en 24px. Ahí envuelve, y está bien. */
@media (min-width: 601px) {
  /* La caja del texto estaba topada en 660px y con 60px de padding a cada
     lado dejaba 540px reales: ahí no entra ninguna de las dos frases. Se
     ensancha a 740 (el producto arranca al 61% del ancho, así que el texto
     no lo invade) y quedan 620px útiles. */
  html[data-tema] .tema-hero-fondo-propio .hero-content {
    max-width: 740px;
  }

  /* Medido con el tipo real: la frase larga ocupa 13,3x el cuerpo. A 44px son
     582px contra los 620 disponibles. El tope va atado al ancho para que en
     pantallas menores baje sola en vez de partirse. */
  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero {
    /* Tope en PÍXELES, no en rem: la raíz de este sitio mide 17px, así que
       2.75rem daban 46,75px y a ese cuerpo la frase larga pide 622px contra
       los 620 disponibles — se partía en dos justo en pantallas anchas.
       Y PISO de 30px: con `min()` a secas el cuerpo seguía al viewport hasta
       quedar en 18px a 601px — más chico que el propio párrafo. El ancho útil
       NO escala con la pantalla (la caja topa en 740px), así que atarlo solo
       al vw achicaba de más. */
    font-size: clamp(30px, 3.4vw, 44px);
  }

  /* El acento deja de ser 1.1em: siendo mayor y más grueso era ÉL el que no
     entraba, no la primera línea. */
  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero em {
    font-size: 1em;
    font-weight: 800;
  }
}

/* --- Título del bloque de temporada: también en UNA línea -------------------
   Medido con el tipo real: «Todo el catálogo, listo para entrega.» pide 709px
   a 42,5px contra los 602px de su columna, y se partía en dos renglones
   desparejos. A 36px mide 596 y entra. El tope va atado al ancho para que en
   pantallas menores baje solo en vez de quebrarse. */
html[data-tema-variante="patrio"] .tema-bloque-titulo {
  /* El max-width heredado está en em, así que encogía junto con la letra:
     bajar el cuerpo no ganaba ni un pixel de sitio. Se suelta y lo limita la
     columna de texto (638px), donde el título entra a 36px pidiendo 601. */
  max-width: none;
  font-size: min(2.6vw, 36px);
}

@media (max-width: 900px) {
  html[data-tema-variante="patrio"] .tema-bloque-titulo {
    font-size: clamp(24px, 5.2vw, 36px);
  }
}

/* En teléfono no hay foto y el título tiene todo el ancho, así que envolver
   está bien — pero envolvía mal.
   `balance` NO sirve acá: al buscar líneas parejas dejaba «Guatemala» sola
   (155px) contra «cumple 205 años.» (251px). `pretty` llena la primera línea
   y solo evita la huérfana, que es como se lee un titular. */
@media (max-width: 600px) {
  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero,
  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero em {
    text-wrap: pretty;
  }
}



/* ===========================================================================
   «LO MÁS VENDIDO» SE VUELVE BANDERA
   ---------------------------------------------------------------------------
   Esa sección es un bloque de seda ROJO OSCURO con texto blanco encima
   (.silk-bg-container + 3 .silk-layer + grano). Para septiembre se pinta de
   celeste y se le marcan las tres bandas: celeste · blanca · celeste.

   LA BANDA BLANCA NO PUEDE SER BLANCA DE VERDAD: el texto de la sección es
   blanco y desaparecería. Va al 11%, que sube el medio a ~#2F7BB0 y deja el
   cuerpo en 4,6:1 — sigue pasando AA. Lo que hace que se LEA como bandera no
   es la opacidad de la banda sino las dos costuras finas de los bordes, que sí
   van a alto contraste porque no tapan texto.
   =========================================================================== */
html[data-tema-variante="patrio"] .best-sellers .silk-bg-container {
  /* La seda roja se reemplaza por el SET del tema (el telón con la bandera y
     los volcanes, sin muebles), oscurecido: los productos quedan como en una
     vitrina delante de la bandera. Antes fue azul plano con banderines
     triangulares colgando arriba, y se leía simple — de fiesta, no de tienda.
     La foto va en el contenedor; el oscurecido, en las capas de encima, así
     el grano del sitio sigue funcionando igual. */
  background: #0C3A5E url('../assets/images/temas/patrio/set.webp') center 45% / cover no-repeat;
}

/* La capa 1 deja de ser un resplandor en `screen` y pasa a ser el velo que
   oscurece la foto. `normal` y no `screen`, que aclararía. Más denso arriba,
   donde va el título, y abajo, donde cierra la sección; más abierto al
   centro, donde las tarjetas traen su propio fondo. `inset: 0` porque la
   capa base sobresale un 20% y los topes del degradado caerían fuera. */
html[data-tema-variante="patrio"] .best-sellers .silk-layer-1 {
  inset: 0;
  mix-blend-mode: normal;
  background: linear-gradient(
    180deg,
    rgba(7, 32, 56, 0.8) 0%,
    rgba(7, 32, 56, 0.5) 36%,
    rgba(7, 32, 56, 0.5) 68%,
    rgba(7, 32, 56, 0.88) 100%
  );
}

html[data-tema-variante="patrio"] .best-sellers .silk-layer-2 {
  display: none;
}

/* Viñeta: cierra los bordes para que la foto no compita con las tarjetas de
   las puntas. `multiply`, como la original. */
html[data-tema-variante="patrio"] .best-sellers .silk-layer-3 {
  inset: 0;
  background: radial-gradient(ellipse at 50% 50%, rgba(0, 0, 0, 0) 42%, rgba(3, 18, 34, 0.7) 100%);
}

@media (max-width: 600px) {
  html[data-tema-variante="patrio"] .best-sellers .silk-bg-container {
    background-image: url('../assets/images/temas/patrio/set-m.webp');
  }
}

/* --- La bandera, donde SÍ puede ser nítida ---------------------------------
   El antetítulo de «Lo más vendido» ya trae un punto blanco de 5px en su
   ::before, dentro de un inline-flex con gap. Se le cambia la forma: pasa a
   ser la bandera, celeste · blanco · celeste, con sus colores REALES.
   Acá sí puede ir a contraste pleno porque es una pieza suelta de 15px que no
   se cruza con ninguna línea de texto — al revés de las bandas de fondo, que
   terminaban rayando el título. */
html[data-tema-variante="patrio"] .best-sellers .eyebrow::before {
  width: 15px;
  height: 11px;
  border-radius: 2px;
  background: linear-gradient(
    to right,
    #6CACE4 0 33.333%,
    #FFFFFF 33.333% 66.666%,
    #6CACE4 66.666% 100%
  );
}


/* Acá colgaban banderines triangulares del borde superior (un SVG repetido
   en x). Con el set fotográfico de fondo sobraban, y solos se veían de fiesta
   infantil. La bandera ya está en la foto y en la marca del antetítulo. */


/* --- Tramo 601-1100px: la tarjeta es angosta y el texto pisa el producto ----
   El velo en degradado se desvanece al 68% del ancho, pero la caja de texto
   llega al 83-94% en este tramo y el producto arranca al 61%: el texto queda
   leyéndose ENCIMA del mueble, sobre foto sin velo.
   Solución: hasta 1100px el velo cubre la tarjeta entera y el texto usa todo
   el ancho. De 1101 para arriba ya hay sitio para el texto a la izquierda y
   el mueble a la derecha, y vuelve el degradado. Nada toca posiciones. */
@media (min-width: 601px) and (max-width: 1100px) {
  html[data-tema] .hero-card.tema-hero-fondo-propio .hero-overlay {
    background: linear-gradient(to bottom,
      rgba(14, 74, 120, 0.90) 0%,
      rgba(14, 74, 120, 0.80) 100%);
  }

  html[data-tema] .tema-hero-fondo-propio .hero-content {
    max-width: 100%;
  }

  html[data-tema] .tema-hero-fondo-propio .hero-content .text-hero {
    font-size: clamp(24px, 4.2vw, 40px);
  }
}

/* --- El bloque con ESCENA en vez de packshot --------------------------------
   Cuando la foto es una escena del set (varios muebles montados), deja de ser
   un producto recortado sobre crema y pasa a ser una fotografía: fondo azul
   propio, `cover` en vez de `contain` y sin el margen interno que el packshot
   sí necesita. La proporción sigue a la de la imagen (4:3). */
html[data-tema] .tema-bloque-foto.tema-bloque-foto--escena {
  background: #14568C;
  aspect-ratio: 4 / 3;
}

html[data-tema] .tema-bloque-foto--escena .tema-bloque-img {
  object-fit: cover;
  padding: 0;
}

/* La escena entra con la cámara retrocediendo: arranca un 12% más cerca y se
   asienta. UNA sola pasada, sin bucle — al terminar queda en scale(1), que es
   la identidad, así que no deja capa de composición viva cerca del <canvas> de
   #chair-build (el mismo cuidado que la nieve y la cifra).

   Cuelga de `.animable.visible`, las dos clases que pone js/temas.js:
   `.animable` solo aparece cuando el JS ya sabe que puede animar, y `.visible`
   cuando el bloque entró en pantalla. Si el observador nunca dispara, o el
   visitante pidió menos movimiento, `rendirse()` quita `.animable` y esta regla
   deja de matchear: la foto se queda quieta en su tamaño normal. El default es
   "se ve bien"; el movimiento es lo que se activa, nunca al revés.

   No hay estado previo (nada de `scale(1.12)` esperando en `.animable` a secas):
   la imagen llega por onload DESPUÉS de que se monta el bloque, y si llegara ya
   con `.visible` puesta, la animación arranca sola al insertarse. */
html[data-tema] .tema-bloque.animable.visible .tema-bloque-foto--escena .tema-bloque-img {
  animation: tema-escena-alejarse 1400ms cubic-bezier(0.22, 1, 0.36, 1) both;
}

/* Termina en 1,03 y NO en 1: es el punto donde engancha el vaivén de abajo.
   Acabando en 1 la escena quedaba congelada para siempre después de la
   entrada — el mismo defecto de "se ve como una lámina", por otra puerta.
   Con `cover` un 3% de más no deja hueco, solo recorta un pelo. */
@keyframes tema-escena-alejarse {
  from { transform: scale(1.12); }
  to   { transform: scale(1.03); }
}

/* `.respira` la pone js/temas.js al terminar la entrada, no un delay: encadenar
   con `animation-delay` obliga a adivinar cuándo empezó la primera, y acá
   empieza cuando el bloque entra en pantalla, que no se sabe de antemano.
   Arranca en 1,03, el fotograma final de la entrada, así que el empalme no se
   ve. `alternate` para que no tenga costura y ease-in-out para que frene en
   los extremos en vez de invertir la dirección de golpe. */
@keyframes tema-escena-respirar {
  from { transform: scale(1.03); }
  to   { transform: scale(1); }
}

html[data-tema] .tema-bloque-foto--escena.respira .tema-bloque-img {
  animation: tema-escena-respirar 22s ease-in-out infinite alternate;
}

@media (prefers-reduced-motion: reduce) {
  html[data-tema] .tema-bloque.animable.visible .tema-bloque-foto--escena .tema-bloque-img,
  html[data-tema] .tema-bloque-foto--escena.respira .tema-bloque-img {
    animation: none;
  }
}
