/* ═══════════════════════════════════════════════════════════════════════
   RELIC — EL TEMA. Una web, dos caras, y el visitante manda.

   Hasta hoy la paleta colgaba de `data-casa`, que lo decidía el SERVIDOR
   según la URL: «papel» (claro) en la tienda, «sala» (oscuro) en el cine. Eso
   resolvía el problema del producto —una prenda se compra a la luz— pero
   dejaba la web partida en dos mitades que no se parecen, y al visitante sin
   voz. Lo que se pide es lo que hacen las webs que se copian: TRES ESTADOS.

     · el del sistema  ← por defecto, sin tocar nada (@media prefers-color-scheme)
     · claro           ← elegido a mano, manda sobre el sistema
     · oscuro          ← elegido a mano, manda sobre el sistema

   Y se recuerda (localStorage), y se pinta ANTES del primer fotograma con un
   guion síncrono en el <head>: si se hiciera con `defer`, la página pinta en
   claro y salta a oscuro medio segundo después. Ese salto es exactamente lo
   que separa una web buena de una cutre.

   ── POR QUÉ ESTE FICHERO Y NO estilo.css ──────────────────────────────
   Por lo mismo que existe venta.css y está escrito en su cabecera: estilo.css
   lo está reescribiendo otro proceso —hoy mismo ha crecido 39 líneas mientras
   se medía esto—, y dos manos en un fichero de 2.500 líneas pierden reglas en
   silencio. Aquí manda el orden: esta hoja se carga LA ÚLTIMA, así que a
   igualdad de especificidad gana.

   ── EL CONMUTADOR, Y POR QUÉ LLEVA :not() ─────────────────────────────
   `:root:not([data-tema="oscuro"])` pesa (0,2,0) igual que el viejo
   `:root[data-casa="papel"]` de estilo.css. Un `:root` pelado pesa (0,1,0) y
   PERDERÍA contra él en la tienda: la tienda se quedaría con la paleta vieja
   y el resto de la casa con la nueva. Con el :not() empatan en peso y gana
   ésta por ir después — y sigue ganando aunque el otro proceso vuelva a
   escribir su bloque.

   Los valores viven una sola vez, en crudo (--claro-* y --oscuro-*). Lo que
   se repite abajo es sólo el cableado, que no lleva ni un color: no hay
   ninguna cifra que se pueda quedar desparejada entre las dos caras.
   ═══════════════════════════════════════════════════════════════════════ */

:root{

  /* ── LA CARA CLARA ──────────────────────────────────────────────────
     «Haz toda la web con este color, o incluso pon el fondo blanco mejor.»
     El fondo es BLANCO. La rampa se abre desde ahí con los mismos saltos de
     L* (claridad perceptual del CIE) que la cara oscura, no con saltos de
     ratio: el ratio se aplasta arriba igual que se aplasta abajo.

       token          hex       L*     contra la página
       --sala       #FFFFFF   100,0     1,00 : 1   el papel, blanco
       --banda      #FAF8F2    97,6     1,06 : 1   la franja alterna
       --sala-2     #F5F2E9    95,5     1,12 : 1   tarjeta, pie, panel
       --sala-3     #EBE7DB    91,7     1,24 : 1   hueco: campos y pozos
       --borde      #D8D2C4    84,3     1,51 : 1   filete
       --borde-vivo #949080    59,7     3,20 : 1   filete de mando (WCAG 1.4.11)

     Texto sobre la página / sobre la tarjeta:
       --luz    #14120E   18,71 : 1  ·  16,71 : 1
       --luz-2  #4A453B    9,52 : 1  ·   8,51 : 1
       --luz-3  #6B6456    5,86 : 1  ·   5,24 : 1   (cumple cuerpo, no sólo grande)
       --haz    #8A5410    6,26 : 1  ·   5,59 : 1   el ámbar COMO TEXTO
     El #E8A33D de la sala daría 1,88:1 sobre blanco: como texto no vale, y
     por eso el ámbar está partido en dos desde ayer (--haz texto, --campo
     campo). --campo NO cambia de cara: un cartel amarillo es un cartel
     amarillo con la luz encendida y con la luz apagada.                    */
  --claro-sala:#FFFFFF;
  --claro-banda:#FAF8F2;
  --claro-sala-2:#F5F2E9;
  --claro-sala-3:#EBE7DB;
  --claro-borde:#D8D2C4;
  --claro-borde-vivo:#949080;
  --claro-luz:#14120E;
  --claro-luz-2:#4A453B;
  --claro-luz-3:#6B6456;
  --claro-haz:#8A5410;
  --claro-haz-fuerte:#6B3F0A;
  --claro-verde:#1F6B45;          /*  6,47 : 1 */
  --claro-rojo:#A32E1C;           /*  7,08 : 1 */
  --claro-ambar:#8A5410;
  /* El botón sólido es EL INVERSO de la página: tinta con papel encima. */
  --claro-papel:#14120E; --claro-tinta:#FFFFFF;      /* 18,71 : 1 */
  --claro-ambar-hondo:#F7E6C4;    /* lavado pálido; con --luz encima, 15,21:1 */
  --claro-hueso:#E9E3D4;
  /* Sombra cálida y corta. En negro la sombra es negra; sobre papel una
     sombra negra ensucia, así que se tiñe con el marrón de la casa. */
  --claro-caja:0 1px 2px rgba(40,34,20,.06), 0 16px 40px -28px rgba(40,34,20,.34);
  --claro-sombra-1:0 1px 1px rgba(40,34,20,.05);
  --claro-sombra-2:0 2px 4px rgba(40,34,20,.06), 0 12px 26px -16px rgba(40,34,20,.24);
  --claro-sombra-3:0 3px 6px rgba(40,34,20,.07), 0 24px 48px -26px rgba(40,34,20,.34);
  /* Los rgba() que había escritos a pelo, aquí como token y con su pareja en
     la otra cara. Eran veintitantos y TODOS estaban en blanco: sobre papel un
     filete blanco no existe. */
  --claro-filete:rgba(20,18,14,.14);       /* filetes y separadores finos */
  --claro-filete-suave:rgba(20,18,14,.05); /* fondos de fila alterna, hover */
  --claro-filete-fuerte:rgba(20,18,14,.22);
  --claro-eco:rgba(20,18,14,.055);         /* el título fantasma de las secciones */
  --claro-anillo:rgba(138,84,16,.20);      /* el aro de foco: ámbar de texto */
  --claro-vineta:rgba(20,18,14,.07);       /* la viñeta del héroe */
  --claro-telon:#FFFFFF;                   /* el telón de apertura */
  --claro-velo-fin:rgba(12,12,14,.94);     /* el cierre del degradado a sangre */
  --claro-barrido:rgba(255,255,255,.30);   /* el brillo que barre el botón oscuro */
  --claro-foco:transparent;                /* la luz que sigue al cursor: sólo en la sala */
  --claro-grano:.03;                       /* el grano de película */
  --claro-grano-mezcla:multiply;
  --claro-esquema:light;

  /* ── LA CARA OSCURA ─────────────────────────────────────────────────
     Intacta: es la rampa que se midió ayer en L* y no se toca ni un dígito.
       --sala #0C0C0E L* 3,4 · --sala-2 L* 12,0 · --sala-3 L* 21,2
       --borde L* 31,8 (2,23:1) · --borde-vivo L* 44,3 (3,55:1)
       texto 17,48 / 9,38 / 6,01 · ámbar de texto 9,06                     */
  --oscuro-sala:#0C0C0E;
  --oscuro-banda:#151418;
  --oscuro-sala-2:#201F23;
  --oscuro-sala-3:#343237;
  --oscuro-borde:#4C4A4F;
  --oscuro-borde-vivo:#6A686D;
  --oscuro-luz:#F5F2EB;
  --oscuro-luz-2:#B9B3A8;
  --oscuro-luz-3:#948E83;
  --oscuro-haz:#E8A33D;
  --oscuro-haz-fuerte:#F5BC63;
  --oscuro-verde:#6FD3A0;
  --oscuro-rojo:#F08A72;
  --oscuro-ambar:#E8A33D;
  --oscuro-papel:#F2EEE6; --oscuro-tinta:#0C0C0E;    /* 16,89 : 1 */
  --oscuro-ambar-hondo:#5A3A0C;   /* con --luz encima, 9,18:1 */
  --oscuro-hueso:#E9E3D6;
  --oscuro-caja:0 2px 8px rgba(0,0,0,.5), 0 24px 60px -32px rgba(0,0,0,.9);
  --oscuro-sombra-1:0 1px 2px rgba(0,0,0,.4);
  --oscuro-sombra-2:0 4px 10px -2px rgba(0,0,0,.5), 0 12px 28px -12px rgba(0,0,0,.7);
  --oscuro-sombra-3:0 8px 20px -6px rgba(0,0,0,.6), 0 32px 68px -28px rgba(0,0,0,.95);
  --oscuro-filete:rgba(245,242,235,.16);
  --oscuro-filete-suave:rgba(245,242,235,.045);
  --oscuro-filete-fuerte:rgba(245,242,235,.30);
  --oscuro-eco:rgba(242,238,230,.055);
  --oscuro-anillo:rgba(232,163,61,.16);
  --oscuro-vineta:rgba(0,0,0,.62);
  --oscuro-telon:#000000;
  --oscuro-velo-fin:var(--sala);
  --oscuro-barrido:rgba(12,12,14,.22);
  --oscuro-foco:rgba(245,242,235,.055);
  --oscuro-grano:.085;
  --oscuro-grano-mezcla:soft-light;
  --oscuro-esquema:dark;

  /* ── LO QUE NO TIENE DOS CARAS ──────────────────────────────────────
     No es olvido: es la parte fina del encargo. Estos valores NO pueden
     colgar del tema porque no describen la página, describen el PRODUCTO o
     una foto, y ni el producto ni la foto cambian de color porque el
     visitante le dé a un botón.

     EL SUELO DE LA FOTO ES UNO SOLO, Y ES ÉSTE.
     ─────────────────────────────────────────────────────────────────────
     Antes había dos y la caja saltaba de uno a otro según la claridad de la
     prenda. Numéricamente era impecable —el peor contraste de la web pasó a
     8,47:1— y visualmente era un tablero de ajedrez: cajas crema y cajas
     negras alternando en cuadros contiguos, porque el color del suelo lo
     decidía qué prenda tocaba enseñar primero en cada tarjeta. El dueño lo
     vio en /tienda y tenía razón: una tienda no puede tener el fondo
     saltando entre una tarjeta y la de al lado.

     Ahora hay UN color, el mismo en las dos caras y en las nueve rejillas.
     El paspartú crema de un museo, que es el que ya llevaba la casa como
     --claro-hueso.

       caja #E9E3D4  (L* 90,3)
         negro     12,43 : 1      arena     1,38 : 1
         marino    12,86 : 1      blanco    1,16 : 1
         antracita  9,58 : 1      lámina    1,07 : 1
     Medido el 19-08-2026 sobre el tono MEDIANO real de los píxeles opacos de
     los mockups del catálogo (no sobre el nombre del color, y no sobre el
     token): negro #181818, marino #202030, antracita #303030, arena #d0c0a8,
     blanco #d0d0d0, lámina #e8e8e0.

     POR QUÉ ESTE COLOR Y NO UN GRIS DE COMPROMISO. El encargo pone un solo
     suelo numérico: ≥3:1 con la prenda NEGRA. Cualquier claro lo cumple de
     sobra y éste lo cumple cuatro veces. Un gris medio (#6F6F6F) daría 3,17
     con el negro y 2,84 con la arena —pasaría el negro y suspendería en la
     antracita (2,44)— y encima ensucia la foto de producto. Y no existe
     NINGÚN color plano que separe por contraste a la vez la antracita
     (L* 24) y la arena (L* 79): entre ellas hay 7,6:1 y harían falta 9. Así
     que el color no puede ser el que recorta la prenda clara.

     LO QUE LA RECORTA es el recurso de abajo, --recorte-prenda: una sombra
     que sigue la SILUETA (los mockups son PNG con alfa recortado, medido:
     1.680.856 píxeles transparentes de 4.000.000 en la camiseta). Un filete
     finísimo pegado al canto para que la blanca, la arena y el papel de la
     lámina no se fundan con el crema, y una sombra ancha por debajo que las
     levanta del suelo. Sobre la prenda oscura no se nota, porque ahí ya
     sobran 12:1.

     Y el marco de la caja deja de ser gris al 20 %: como el suelo ya no
     cambia, el canto se puede templar para ESTE crema en vez de tener que
     valer sobre crema y sobre grafito a la vez. Sombra cálida, la de la casa.
                                                                            */
  --suelo:#E9E3D4;
  /* LOS TRES NOMBRES VIEJOS, ATADOS AL MISMO COLOR. Es el cinturón: aunque
     mañana una plantilla, galeria.css o una regla olvidada de estilo.css
     vuelvan a pedir «el suelo oscuro», lo que pinta el navegador sigue
     siendo un único crema y el ajedrez no puede volver por la puerta de
     atrás. Se quedan como alias a propósito, no por pereza. */
  --suelo-claro:var(--suelo);
  --suelo-oscuro:var(--suelo);
  --suelo-neutro:var(--suelo);
  --marco-prenda:rgba(52,42,24,.15);
  --marco-prenda-vivo:rgba(52,42,24,.30);
  /* EL RECURSO DE SEPARACIÓN. Dos sombras sobre la silueta: el filete que
     recorta y la sombra que levanta. La segunda versión, para miniaturas de
     70 px, con la caja recortada a `overflow:hidden` y 4 px de aire. */
  --recorte-prenda:drop-shadow(0 0 1px rgba(52,42,24,.85))
                   drop-shadow(0 6px 12px rgba(52,42,24,.30));
  --recorte-prenda-mini:drop-shadow(0 0 .5px rgba(52,42,24,.85))
                        drop-shadow(0 1px 3px rgba(52,42,24,.30));

  /* EL ÁMBAR COMO CAMPO. Un cartel amarillo con tinta encima: 8,69:1. Es el
     único acento pleno y es el mismo con la luz encendida y apagada. */
  --campo:#E8A33D; --campo-tinta:#141209;
  --campo-apunte:rgba(20,18,9,.72);   /* el rótulo pequeño dentro del campo: 5,9:1 */
  --campo-hueco:#FFFFFF;              /* el campo de correo dentro del boletín ámbar */
  /* El guiño del proyector (se teclea RELIC y se enciende en azul). Vivía
     escrito a pelo en `:root.proyector`. */
  --proyector:#7FD4FF; --proyector-vivo:#B8E9FF;

  /* TEXTO SOBRE FOTOGRAFÍA. Los rótulos de las losas de colección, del
     bloque a sangre y del sello de fuente van ENCIMA de una imagen con velo
     oscuro pintado sobre ella. Si esos rótulos siguieran a --luz, en tema
     claro se volverían casi negros sobre un velo casi negro y desaparecerían.
     Se quedan claros SIEMPRE, y el velo también: 15,8:1 y 8,7:1 sobre el
     velo al 86 %. */
  --sobre-foto:#F7F5F0;
  --verde-foto:#6FD3A0;           /* el rótulo de procedencia sobre foto: 10,70:1 */
  --sobre-foto-2:#D9D5CC;
  --sobre-foto-3:#B4AFA4;
  --velo:12,12,14;

  /* EL CRISTAL DEL MODAL. Oscuro en las dos caras: un velo claro detrás de
     un diálogo no separa nada. */
  --velo-modal:rgba(8,8,10,.72);

  /* LA LOSA DE PAPEL. El bloque «.papel» es un cartón crema que se cuelga
     dentro de la página para dar rango. Sobre negro contrasta por claro,
     sobre blanco por tono; en las dos caras se lee la misma losa. */
  --losa:#E9E3D6; --losa-tinta:#0A0A0B; --losa-texto:#3A352C;
  --losa-haz:#6B5320; --losa-apunte:#6A6154;   /* 5,74:1 y 4,7:1 sobre la losa */

  /* PANEL DE GESTIÓN. Lo que urge se ve sin buscarlo, con la luz encendida
     y con la luz apagada. */
  --urge:#C24A33; --urge-campo:rgba(194,74,51,.10);
  --sello-neutro:rgba(128,128,128,.16);

  /* ── EL CABLEADO ────────────────────────────────────────────────────
     De aquí para abajo no hay ni un color: sólo se dice qué juego manda.
     Por defecto, el claro. */
  --sala:var(--claro-sala);
  --banda:var(--claro-banda);
  --sala-2:var(--claro-sala-2);
  --sala-3:var(--claro-sala-3);
  --borde:var(--claro-borde);
  --borde-vivo:var(--claro-borde-vivo);
  --linea:var(--claro-borde);
  --luz:var(--claro-luz);
  --luz-2:var(--claro-luz-2);
  --luz-3:var(--claro-luz-3);
  --haz:var(--claro-haz);
  --haz-fuerte:var(--claro-haz-fuerte);
  --verde:var(--claro-verde);
  --rojo:var(--claro-rojo);
  --ambar:var(--claro-ambar);
  --papel:var(--claro-papel);
  --tinta:var(--claro-tinta);
  --ambar-hondo:var(--claro-ambar-hondo);
  --hueso:var(--claro-hueso);
  --caja:var(--claro-caja);
  --sombra-1:var(--claro-sombra-1);
  --sombra-2:var(--claro-sombra-2);
  --sombra-3:var(--claro-sombra-3);
  --brillo:0 0 0 1px var(--borde-vivo);
  --filete:var(--claro-filete);
  --filete-suave:var(--claro-filete-suave);
  --filete-fuerte:var(--claro-filete-fuerte);
  --eco:var(--claro-eco);
  --anillo:var(--claro-anillo);
  --vineta:var(--claro-vineta);
  --telon:var(--claro-telon);
  --velo-fin:var(--claro-velo-fin);
  --barrido:var(--claro-barrido);
  --foco:var(--claro-foco);
  --grano:var(--claro-grano);
  --grano-mezcla:var(--claro-grano-mezcla);
  color-scheme:var(--claro-esquema);
}

/* La cara oscura ELEGIDA A MANO: manda sobre el sistema, en los dos sentidos.
   Sin este bloque, quien tiene el ordenador en claro no podría poner la web
   en oscuro. */
:root[data-tema="oscuro"]{
  --sala:var(--oscuro-sala);
  --banda:var(--oscuro-banda);
  --sala-2:var(--oscuro-sala-2);
  --sala-3:var(--oscuro-sala-3);
  --borde:var(--oscuro-borde);
  --borde-vivo:var(--oscuro-borde-vivo);
  --linea:var(--oscuro-borde);
  --luz:var(--oscuro-luz);
  --luz-2:var(--oscuro-luz-2);
  --luz-3:var(--oscuro-luz-3);
  --haz:var(--oscuro-haz);
  --haz-fuerte:var(--oscuro-haz-fuerte);
  --verde:var(--oscuro-verde);
  --rojo:var(--oscuro-rojo);
  --ambar:var(--oscuro-ambar);
  --papel:var(--oscuro-papel);
  --tinta:var(--oscuro-tinta);
  --ambar-hondo:var(--oscuro-ambar-hondo);
  --hueso:var(--oscuro-hueso);
  --caja:var(--oscuro-caja);
  --sombra-1:var(--oscuro-sombra-1);
  --sombra-2:var(--oscuro-sombra-2);
  --sombra-3:var(--oscuro-sombra-3);
  --filete:var(--oscuro-filete);
  --filete-suave:var(--oscuro-filete-suave);
  --filete-fuerte:var(--oscuro-filete-fuerte);
  --eco:var(--oscuro-eco);
  --anillo:var(--oscuro-anillo);
  --vineta:var(--oscuro-vineta);
  --telon:var(--oscuro-telon);
  --velo-fin:var(--oscuro-velo-fin);
  --barrido:var(--oscuro-barrido);
  --foco:var(--oscuro-foco);
  --grano:var(--oscuro-grano);
  --grano-mezcla:var(--oscuro-grano-mezcla);
  color-scheme:var(--oscuro-esquema);
}

/* Y EL AUTOMÁTICO, que es lo que ve quien no toca nada: la misma cara oscura
   cuando el sistema la pide. `:not([data-tema="claro"])` es lo que hace que
   una elección a mano gane a la preferencia del sistema. */
@media (prefers-color-scheme: dark){
  :root:not([data-tema="claro"]){
    --sala:var(--oscuro-sala);
    --banda:var(--oscuro-banda);
    --sala-2:var(--oscuro-sala-2);
    --sala-3:var(--oscuro-sala-3);
    --borde:var(--oscuro-borde);
    --borde-vivo:var(--oscuro-borde-vivo);
    --linea:var(--oscuro-borde);
    --luz:var(--oscuro-luz);
    --luz-2:var(--oscuro-luz-2);
    --luz-3:var(--oscuro-luz-3);
    --haz:var(--oscuro-haz);
    --haz-fuerte:var(--oscuro-haz-fuerte);
    --verde:var(--oscuro-verde);
    --rojo:var(--oscuro-rojo);
    --ambar:var(--oscuro-ambar);
    --papel:var(--oscuro-papel);
    --tinta:var(--oscuro-tinta);
    --ambar-hondo:var(--oscuro-ambar-hondo);
    --hueso:var(--oscuro-hueso);
    --caja:var(--oscuro-caja);
    --sombra-1:var(--oscuro-sombra-1);
    --sombra-2:var(--oscuro-sombra-2);
    --sombra-3:var(--oscuro-sombra-3);
    --filete:var(--oscuro-filete);
    --filete-suave:var(--oscuro-filete-suave);
    --filete-fuerte:var(--oscuro-filete-fuerte);
    --eco:var(--oscuro-eco);
    --anillo:var(--oscuro-anillo);
    --vineta:var(--oscuro-vineta);
    --telon:var(--oscuro-telon);
    --velo-fin:var(--oscuro-velo-fin);
    --barrido:var(--oscuro-barrido);
    --foco:var(--oscuro-foco);
    --grano:var(--oscuro-grano);
    --grano-mezcla:var(--oscuro-grano-mezcla);
    color-scheme:var(--oscuro-esquema);
  }
}


/* ═══════════════════════════════════════════════════════════════════════
   2. EL INTERRUPTOR

   En la cabecera, al lado del idioma y del carrito, que es donde lo busca
   todo el mundo. Es un <button> de verdad: funciona con teclado sin una sola
   línea de más, y sólo aparece si hay JavaScript (sin él no habría nada que
   recordar, y un botón que no hace nada es peor que no tenerlo).

   Tres estados y se DICE cuál es. El icono no basta: media web pone una luna
   y no se sabe si la luna es lo que hay o lo que va a pasar. El aria-label lo
   deja escrito —«Tema: automático (oscuro). Cambiar a claro»— y el title lo
   enseña con el ratón.
   ═══════════════════════════════════════════════════════════════════════ */
.tema-boton{display:none}
:root.js .tema-boton{
  display:inline-flex; align-items:center; justify-content:center;
  width:34px; height:34px; flex:none; padding:0; cursor:pointer;
  background:none; border:1px solid transparent; border-radius:3px;
  color:var(--luz-2); transition:color .16s, border-color .16s, background .16s;
}
.tema-boton:hover{color:var(--luz); border-color:var(--borde-vivo)}
.tema-boton:focus-visible{outline:2px solid var(--haz); outline-offset:3px}
.tema-boton svg{display:block; flex:none}
/* Sólo se enseña el icono del estado que está puesto. Se hace con el
   atributo del <html>, así que el icono correcto ya está pintado en el primer
   fotograma: no hay parpadeo tampoco aquí. */
.tema-icono > g{display:none}
:root[data-tema-modo="auto"] .tema-icono > .i-auto,
:root[data-tema-modo="claro"] .tema-icono > .i-claro,
:root[data-tema-modo="oscuro"] .tema-icono > .i-oscuro{display:block}
@media (max-width:1024px){
  /* 44 px de lado, como el resto de la cabecera: por debajo no se acierta
     con el pulgar. */
  :root.js .tema-boton{width:44px; height:44px}
}


/* ═══════════════════════════════════════════════════════════════════════
   3. LO QUE ESTABA ESCRITO A PELO Y SÓLO VALÍA PARA UNA CARA

   Cada regla de aquí abajo tenía un hexadecimal o un rgba() metido a mano
   pensando en la sala oscura. Ninguna se inventa: se reescribe con el token
   que le toca, y por eso ahora hay dos caras en vez de una cara y su calco.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── 3.1 La página, la tarjeta y el pie ─────────────────────────────── */
body{background:var(--sala); color:var(--luz)}
/* El grano de película es de la sala: sobre papel, «soft-light» al 8,5 % es
   suciedad. Se baja y se cambia a multiplicar, que es lo que hace el grano en
   una impresión de verdad. */
body::after{opacity:var(--grano); mix-blend-mode:var(--grano-mezcla)}

/* La franja alterna: dos tonos a un pelo de distancia, que separa mejor que
   un filete. Estaba clavada en #161518. */
.franja:nth-of-type(even){background:var(--banda)}

/* El eco fantasma de los titulares iba trazado en blanco al 10 %. */
.franja > .cabeza-seccion h2::before{-webkit-text-stroke:1px var(--eco)}

/* El telón de apertura estaba en #000 fijo: en la cara clara, un telón negro
   que se abre sobre una página blanca es un fogonazo. */
.telon i{background:var(--telon)}

/* La viñeta del héroe bajaba a rgba(0,0,0,.62): sobre blanco eso son cuatro
   esquinas sucias. */
.escenario::after{
  background:radial-gradient(120% 100% at 50% 42%, transparent 42%, var(--vineta))}

/* La luz que sigue al cursor sólo tiene sentido sobre oscuro. */
/* En la cara clara --foco es `transparent`: el halo sigue existiendo, no pinta
   nada, y no hace falta ni una media query repetida para apagarlo. */
.con-foco::before{background:radial-gradient(340px circle at var(--fx,50%) var(--fy,50%),
  var(--foco), transparent 62%)}

/* El barrido del botón: blanco sobre botón oscuro, oscuro sobre botón claro.
   El botón sólido es siempre el inverso de la página, así que el barrido
   tiene que invertirse con él. */
.boton::before{background:linear-gradient(100deg, transparent, var(--barrido), transparent)}

/* La bobina y la perforación, trazadas en «casi blanco» a pelo. */
.bobina::before{background:repeating-linear-gradient(90deg,
  transparent 0 22px, var(--filete) 22px 36px, transparent 36px 58px)}
.fotograma-img::before{
  background:linear-gradient(90deg, rgba(var(--velo),.55), transparent),
    repeating-linear-gradient(180deg, transparent 0 9px,
      var(--filete-fuerte) 9px 15px, transparent 15px 24px)}

/* Los aros de foco iban con ámbar de la sala al 12 %: sobre blanco, nada. */
.buscador input:focus,.filtrador select:focus,.busca-col input:focus,
.formulario input:focus,.formulario select:focus{box-shadow:0 0 0 3px var(--anillo)}

/* Sombras y velos que iban en negro puro. */
.panel-fondo{background:var(--velo-modal)}
.guia::backdrop{background:var(--velo-modal)}
.panel-caja{box-shadow:var(--sombra-3)}
.idioma-lista{background:var(--sala-2); border-color:var(--borde-vivo); box-shadow:var(--caja)}
.idioma-lista a:hover{background:var(--sala-3)}
.idioma>summary:hover,.idioma[open]>summary{border-color:var(--borde-vivo)}
body.rodando .cabecera{box-shadow:var(--sombra-2)}
.cartel-coleccion{box-shadow:var(--sombra-2)}

/* ── 3.2 Texto ENCIMA de una foto ───────────────────────────────────────
   Aquí está la trampa que se lleva por delante media web al cambiar de cara:
   estos rótulos van sobre una imagen con velo oscuro pintado encima, así que
   NO pueden seguir al color de texto de la página. En tema claro se habrían
   vuelto casi negros sobre un velo casi negro. Se quedan claros siempre. */
.loza h3,.loza--grande h3,.estampa-txt h2{color:var(--sobre-foto)}
.loza-autor,.loza-tambien,.estampa-pie{color:var(--sobre-foto-2)}
.loza .elementos,.loza-fuente{color:var(--sobre-foto-3)}
.loza-fuente .rotulo,.sello-fuente b{color:var(--verde-foto)}
.sello-fuente{color:var(--sobre-foto-2)}
/* Las dos etiquetas del pie de la losa —«7 obras» y «10 piezas»— también van
   sobre la foto. Heredaban `--luz-3` y `--haz`, que en la cara clara son un
   gris tostado y un ámbar casi marrón: sobre el velo oscuro de la foto
   quedaban en 1,7:1 y 2,1:1. Con los tonos de sobre-foto suben a 8,4:1, y el
   «piezas» se queda ámbar de CAMPO —que no depende del tema— para que siga
   siendo el que canta. */
.loza .marca-tipo{color:var(--sobre-foto-2); border-color:var(--sobre-foto-3)}
.loza .sello.fuerte{color:var(--campo); border-color:var(--campo)}
/* El degradado a sangre acababa en `var(--sala)` para fundirse con la página.
   En la cara clara eso es un desvanecido de negro a blanco justo donde va el
   titular: el título quedaría medio blanco sobre blanco. En claro se cierra
   en velo y la banda se lee como lo que es, una foto a sangre. */
.estampa-sangre::after{
  background:linear-gradient(180deg, rgba(var(--velo),.28) 0%, rgba(var(--velo),.05) 34%,
             rgba(var(--velo),.86) 82%, var(--velo-fin) 100%)}

/* ── 3.3 El ámbar como campo, en las dos caras ──────────────────────────
   Todo esto ponía `color:var(--sala)` sobre fondo ámbar. En la cara oscura
   --sala es casi negro y funcionaba; en la clara es BLANCO, o sea texto
   blanco sobre amarillo: 1,9:1. Va con --campo-tinta, que es la pareja
   medida del campo (8,69:1) y no depende del tema. */
.campo-ambar,.franja--ambar{background:var(--campo); color:var(--campo-tinta)}
.campo-ambar h2,.campo-ambar h3,.campo-ambar p,
.franja--ambar h2,.franja--ambar h3,.franja--ambar p{color:var(--campo-tinta)}
.campo-ambar .rotulo,.campo-ambar .cartela,
.franja--ambar .cartela{color:rgba(20,18,9,.72)}
.campo-ambar .cartela::before,.franja--ambar .cartela::before{background:rgba(20,18,9,.72)}
.pie .boletin{background:var(--campo); color:var(--campo-tinta)}
.pie .boletin .rotulo,.pie .boletin .letra-chica{color:rgba(20,18,9,.72)}
.pie .boletin input{border-color:rgba(20,18,9,.30); background:#FFFFFF; color:#141209}
.pie .boletin button{background:var(--campo-tinta); border-color:var(--campo-tinta);
  color:var(--campo)}
.pie .boletin button:hover{background:#000; border-color:#000}
.etiqueta-genero,.dia-sello,.globo{color:var(--campo-tinta)}
/* EL PRECIO NO ES UN ACENTO: ES EL DATO, y no es ámbar. Es un bloque de TINTA
   —el inverso de la página— porque en la misma columna ya hay un ámbar pleno,
   el botón que cobra, y dos focos calientes en una pantalla son ninguno.
   OJO: esta regla estuvo un rato listada arriba junto a los campos ámbar y en
   la cara clara pintaba el número en `--campo-tinta` (#141209) SOBRE el bloque
   de tinta (#14120E): 1,00:1, el precio literalmente invisible en la ficha.
   Se vio mirando la captura, no en ningún número. 18,71:1 en claro, 16,89:1
   en oscuro. */
/* EL PRECIO ES EL NÚMERO QUE VENDE, y estaba invisible en las 53 fichas.
   Aquí se pintaba el fondo con --papel y en estilo.css la tinta con
   --campo-tinta. En tema claro --papel es #14120E y --campo-tinta es #141209:
   dos casi negros, contraste 1,00:1. El HTML llevaba el número, pero la caja
   sólo enseñaba «IVA incl.».
   El bloque de precio es un CAMPO ámbar, y el campo no cambia con el tema a
   propósito: --campo #E8A33D con --campo-tinta #141209 da 8,69:1 en las dos. */
.precio--bloque{background:var(--campo); color:var(--campo-tinta)}
.precio--bloque small{color:var(--campo-tinta); opacity:.66}
::selection{background:var(--campo); color:var(--campo-tinta)}

/* ── 3.4 La losa de papel ───────────────────────────────────────────────
   `.papel` es el bloque que da rango a la casa oscura: un cartón crema dentro
   de la página. Iba con seis hexadecimales a pelo. Con tokens propios se
   sostiene igual en las dos caras, porque la losa no es la página: es un
   objeto que se cuelga en ella. */
.papel{background:var(--losa); color:var(--losa-tinta)}
.papel h1,.papel h2,.papel h3,.papel .lema-grande,
.papel .museo-pieza figcaption strong{color:var(--losa-tinta)}
.papel p{color:var(--losa-texto)}
.papel .cartela,.papel .rotulo,.papel a{color:var(--losa-haz)}
.papel .cartela::before{background:var(--losa-haz)}
.papel .museo-pieza figcaption{color:var(--losa-apunte)}
.papel .museo-pieza img{border-color:rgba(10,10,11,.20)}

/* ── 3.5 Filetes, fondos y bordes que iban en blanco ────────────────── */
.articulo table th,.articulo table td{border-color:var(--borde)}
.articulo table tbody tr:nth-child(even){background:var(--filete-suave)}
.articulo a{border-bottom-color:var(--filete)}
.lecturas li{border-bottom-color:var(--borde)}
.colores-tarjeta span{border-color:var(--borde-vivo)}
.formatos span,.formatos a{border-color:var(--borde)}
.formatos a:hover{border-color:var(--borde-vivo)}
.a-su-ropa a:hover{background:var(--sala-3)}
.rejilla-404 a{border-color:var(--borde)}
.rejilla-404 a:hover{background:var(--sala-3)}
.buscador-404-fila input{border-color:var(--borde-vivo); background:var(--sala-3);
  color:var(--luz)}
.buscador-404-fila button{background:var(--papel); color:var(--tinta)}
.paginas a,.paginas .pagina-actual{border-color:var(--borde)}
.paginas a:hover{background:var(--sala-3)}
.paginas .pagina-actual{background:var(--papel); color:var(--tinta); border-color:var(--papel)}
.rejilla--carteles .fotograma-img{background:var(--sala-3)}
.fotograma-img--fuente img{background:repeating-linear-gradient(45deg,
  var(--filete-suave) 0 6px, transparent 6px 12px)}
.cuerpo-texto blockquote,.sinopsis--citada{border-left-color:var(--borde-vivo)}
.ficha-coleccion,.franja--procedencia,.acciones-pedido{border-top-color:var(--borde)}
.tablero li,.filtros-estado a,.acciones-pedido select,
.acciones-pedido input{border-color:var(--borde)}
.filtros-estado a[aria-current]{background:var(--papel); color:var(--tinta);
  border-color:var(--papel)}
.tablero--urge{border-color:var(--urge); background:var(--urge-campo)}
.tablero--urge .cifra{color:var(--urge)}
.sello--entregado,.sello--pendiente{background:var(--sello-neutro)}
@media (max-width:860px){
  .nav{border-top-color:var(--borde)}
  .nav a{border-bottom-color:var(--borde)}
}
/* Los puntos de color de la tarjeta son BOTONES que cambian la foto: su
   estado tiene que verse en las dos caras. El contorno va en tinta de la
   casa —negro en la clara, blanco en la oscura—, así que siempre hay borde,
   mida lo que mida el color de dentro. */
/* El <li> ya no pinta: el aro lo lleva SÓLO el botón. Con los dos puestos
   salían dos círculos, uno de 14 px y otro de 16, desalineados 1 px por
   lado. */
.puntos-color li{box-shadow:none; background:none}
.puntos-color .punto-color{
  box-shadow:inset 0 0 0 1px rgba(128,128,128,.5), 0 0 0 1px var(--borde-vivo)}
.puntos-color .punto-color[aria-pressed="true"]{
  box-shadow:inset 0 0 0 1px rgba(128,128,128,.5), 0 0 0 2px var(--luz)}
.puntos-color .punto-color:focus-visible{outline:2px solid var(--luz); outline-offset:3px}


/* ═══════════════════════════════════════════════════════════════════════
   4. EL SUELO DE LA PRENDA: UNO SOLO, Y EN LAS DOS CARAS

   Esto es lo que NO se puede romper, y se repite aquí, al final de la última
   hoja, por una razón práctica: si mañana alguien vuelve a atar el fondo de
   la foto al color de la página —o al color de la prenda—, esta hoja gana.

   El suelo NO cuelga del tema (una prenda se mira igual con la luz encendida
   que apagada) y ya TAMPOCO cuelga del color de la prenda: es #E9E3D4 en la
   rejilla, en la ficha, en las miniaturas, en el carrito y en el panel. Lo
   que separa a la prenda clara del crema no es el fondo, es --recorte-prenda:
   una sombra que sigue la silueta recortada del PNG. Ver la cabecera del
   token, arriba, con las medidas.

   POR QUÉ SE VA fondo-prenda.js. Ese guion existía para una sola cosa: mover
   la clase del suelo cuando el cliente pulsaba un punto de color sin recargar
   la página. Con un suelo único no hay clase que mover — y con él se van sus
   tres parches (el retardo de 600 ms para no enseñar la prenda vieja sobre el
   suelo nuevo, la carrera del `currentSrc`, y el requestAnimationFrame de
   pieza.html que volvía a pisar el suelo un fotograma después). Toda esa
   maquinaria era el precio de tener dos suelos; ya no se paga.
   ═══════════════════════════════════════════════════════════════════════ */
.suelo,.suelo.suelo--claro,.suelo.suelo--oscuro{background:var(--suelo)}
/* El encuadre de la prenda: cuadrado, entera y con aire. */
/* ── EL MARCO DE PRODUCTO, COPIADO DE ECLIPSEANDO ─────────────────────
   Orden de Victor (19-08-2026): «como sale la prenda es muy top, copiar
   eclipseando». Esto es su `.tp-marco` / `.tp-visual` portado, no una
   aproximación: fondo BLANCO, foto a sangre y `object-fit:cover`.

   POR QUÉ LA DE RELIC SE VEÍA POBRE, Y NO ERA LA FOTO. Medido: el mockup de
   Printful trae la prenda ocupando el 95 % del alto del lienzo — exactamente
   el mismo encuadre que las de eclipseando (89-95 %). Lo que la encogía eran
   TRES capas de CSS encima, una sobre otra:
       margin:16px  (el paspartú)  +  padding:6%  +  object-fit:contain
   Entre las tres dejaban la camiseta en poco más de la mitad del hueco, y
   encima sobre un crema que a una prenda arena o blanca le come el borde.

   `cover` sobre un lienzo 1:1 y una foto 1:1 NO recorta nada: escala. La
   prenda no se corta, sólo deja de estar encogida. */
.fotograma-img--prenda{aspect-ratio:1/1; background:#FFFFFF;
  border-bottom:1px solid var(--filete)}
/* SIN RELLENO, Y ESTÁ MEDIDO EN LAS DOS WEBS. El aire ya viene DENTRO del
   fichero: el mockup de Printful trae la prenda al 95 % del alto y 91 % del
   ancho de su lienzo, y las fotos de eclipseando al 89-92 %. Sus tarjetas no
   añaden ni un píxel de `padding`, así que la prenda ocupa el 92 % del hueco.
   Con un 4 % aquí, la de RELIC se quedaba en el 84 % — un 9 % más pequeña con
   la misma foto, y eso es lo que se veía como «se marca menos».
   `contain` y no `cover`: los dos dan igual con foto y hueco cuadrados, pero
   `contain` garantiza que una foto que no fuera 1:1 no pierda las mangas. */
.fotograma-img--prenda img{object-fit:contain !important; padding:0;
  width:100%; height:100%}
/* El marco del producto se queda CLARO también en modo oscuro, igual que en
   eclipseando: la foto es de la prenda sobre blanco y meterla en una caja
   negra la convierte en un recorte flotando. */
[data-tema="oscuro"] .fotograma-img--prenda,
[data-tema="oscuro"] .fotograma-img--lamina{background:#F4F1EA}
/* El velo de cine NO vuelve sobre el producto. Es la causa número uno de «la
   camiseta se ve mal»: sobre una arena funde la mitad inferior con el fondo. */
.fotograma-img--prenda::after,.fotograma-img--lamina::after{display:none}
/* El paspartú: la foto no va a sangre, se monta sobre la tarjeta con el mismo
   margen por los cuatro costados, como una obra sobre su cartón. */
/* EL PASPARTÚ SE VA. Era 16 px por los cuatro costados más un filete interior,
   o sea la tercera capa que encogía la prenda. En eclipseando la foto va a
   sangre hasta el borde de la tarjeta y se separa del texto con UNA línea
   abajo, que es la que queda arriba en `.fotograma-img--prenda`. */
.fotograma-img--prenda.suelo{margin:0; border-radius:0; box-shadow:none}
.rejilla > *:nth-child(7) .fotograma-img--prenda.suelo{margin:0}
.fotograma:has(.fotograma-img--prenda) .fotograma-cuerpo{padding:13px 17px 17px}
/* La lámina es una hoja de papel hueso: mismo crema debajo y menos aire, que
   una lámina se cuelga con más hoja y menos pared. */
.fotograma-img--lamina.suelo{background:#FFFFFF}
/* La lámina lleva MENOS aire que la prenda: una hoja se cuelga con más papel
   y menos pared, y su composición ya trae su propio margen dentro. */
.fotograma-img--lamina img{object-fit:contain !important; padding:0 !important;
  width:100%; height:100%}

/* ── EL RECURSO DE SEPARACIÓN ──────────────────────────────────────────
   Va sobre la IMAGEN, no sobre la caja: `drop-shadow` se calcula con el canal
   alfa, así que dibuja el contorno de la camiseta y no un rectángulo. Es lo
   único que hace visible una camiseta blanca (1,16:1 contra el crema), una
   arena (1,38:1) y el papel de una lámina (1,07:1) sin tener que mover el
   fondo. La caja recorta (`overflow:hidden`), y por eso la sombra cabe: la
   prenda lleva 6 % de aire por los cuatro costados y la lámina 3,5 %.        */
/* LA SOMBRA DE SILUETA SE RETIRA DE LA REJILLA. Existía para despegar una
   camiseta blanca del fondo CREMA (1,16:1 de contraste). Sobre blanco el
   mockup de Printful ya trae su propio sombreado y sus pliegues —comprobado
   mirando una arena y una blanca compuestas sobre #FFFFFF—, así que la sombra
   pasa a ser un halo gris alrededor de la prenda. En la ficha SÍ se queda:
   allí la foto se ve grande y ahí el recorte sí levanta la pieza. */
/* En la ficha la MISMA etiqueta <img> pasa de mockup a fotografía cuando se
   pulsa «de cerca» o «la estampa», así que el recurso se pide por el `src` y
   no por la casilla: sobre una foto rectangular la sombra de silueta es un
   marco negro y sobre el recorte es lo que lo levanta del cartón. El selector
   de atributo se reevalúa solo cuando el guion cambia el `src`; no hace falta
   una línea de JavaScript. */
.galeria-principal img[src*="/mockup/"],
.galeria-principal img[src*="/prenda/"],
.galeria-principal img[src*="/lamina/"]{filter:var(--recorte-prenda)}
/* En 70 px de miniatura una sombra de 12 px de radio es una mancha, y aquí
   sólo la llevan las casillas de COLOR: la escena y la procedencia son fotos
   con su propio fondo dentro. */
.galeria-tiras .tira--color .tira-caja img,
.cel-suelo img,.panel-img.suelo img,#barra-suelo img{
  filter:var(--recorte-prenda-mini)}

/* La galería de la ficha, las miniaturas y las líneas del carrito llevan el
   mismo suelo. Antes iban clavadas a #EFEAE0 con borde #D8D0C0, y después a
   uno de los dos suelos según el color elegido. */
.galeria-principal,
.galeria-principal.suelo--claro,
.galeria-principal.suelo--oscuro{background:var(--suelo); border-color:var(--borde)}
.tira,.tira.suelo--claro,.tira.suelo--oscuro{background:var(--suelo); border-color:var(--borde)}
.barra-pieza img{background:var(--sala-3); border-color:var(--borde)}
#barra-suelo{display:inline-flex; padding:2px; border:1px solid var(--borde);
  background:var(--suelo)}
#barra-suelo img{background:none; border:0}
.cel-img.suelo,.panel-img.suelo{border-radius:2px}
.cel-img.suelo img,.panel-img.suelo img{background:none; border:0}


/* ═══════════════════════════════════════════════════════════════════════
   5. LAS TILDES DEL TITULAR, EN TODA LA CASA

   MEDIDO con TextMetrics sobre la Anton que sirve esta web, a 100 px:
       H, I  (versal limpia)      85,9 px sobre la línea base
       Í, Ó  (versal con tilde)  110,1 px  →  la tilde sobresale 24,2 px
   La tinta de una línea empieza a 1,101 em de su propia base, así que con
   `h1{line-height:.88}` la base siguiente caía a 0,88 em y la tilde de abajo
   aterrizaba 0,221 em DENTRO de la línea de arriba: se leía «BERLIN» donde
   pone BERLÍN y «COMO» donde pone CÓMO.

   El mínimo que despeja una versal con tilde es 1,101; se usa 1,12, un 2 % de
   margen, y se conserva lo que de verdad da el aire de display, que es el
   `letter-spacing` negativo. Los números no llevan tilde, así que los
   contadores y la cuenta grande se quedan apretados.
   ═══════════════════════════════════════════════════════════════════════ */
h1,.escenario h1,.encabezado h1,.articulo-cab h1,.obra-cab h1,.pieza-datos h1{
  line-height:1.12}
h2,.articulo h2,.estampa-txt h2,.estante-txt h2,.cal-titulo h2,.banda .lema-grande,
.pie .lema,.t-medio{line-height:1.12}
h3,.loza h3,.loza--grande h3,.destacado-txt h3,.fotograma h3,.indice-obra{line-height:1.14}
.contador .n{line-height:.84}
.cuenta-grande{line-height:.8}
.dia-sello b{line-height:1}
.precio--bloque{line-height:1}

/* ─── El cupón en la cesta ────────────────────────────────────────────────
   Se prometía «5 % en tu primer pedido» en el pie de las 1.170 páginas y no
   existía el campo para canjearlo. */
.cupon-caja{margin:0 0 1rem; padding:0 0 1rem; border-bottom:1px solid var(--borde)}
.cupon-fila{display:flex; gap:.5rem; margin-top:.4rem}
.cupon-fila input{flex:1 1 auto; min-width:0; padding:.6rem .7rem;
  background:var(--sala-3); color:var(--luz); border:1px solid var(--borde-vivo);
  border-radius:2px; font-family:"IBM Plex Mono",monospace; letter-spacing:.04em}
.cupon-fila input:focus-visible{outline:2px solid var(--haz); outline-offset:1px}
.cupon-fila button{flex:0 0 auto; padding:.6rem 1rem; cursor:pointer;
  background:var(--papel); color:var(--tinta); border:0; border-radius:2px;
  font-weight:600}
.linea-descuento .precio{color:var(--verde)}


/* ═══════════════════════════════════════════════════════════════════════
   PORTE DE ECLIPSEANDO — LA REJILLA Y LA TARJETA DEL CATÁLOGO
   Bloque del agente «rejilla». No reescribe ni una regla de arriba: va al
   final de la última hoja, así que a igualdad de peso gana, y se puede
   borrar entero sin dejar agujeros.

   Origen: web/src/components/tienda/TarjetaPropia.astro y CatalogoPropio.astro
   de /Users/victorgomez/Code/eclipse-2026, en producción en
   https://eclipseando.es/tienda/. Los valores no son de oído: están medidos
   con getComputedStyle sobre la página publicada.

   ── LO QUE ARREGLA, QUE ES LO QUE LLEVABA HORAS PIDIÉNDOSE ────────────
   La caja de la foto era CREMA (#E9E3D4) y las prendas son negras, marinas y
   grises: en una rejilla de cuatro columnas eso pinta un tablero de ajedrez
   de cuadros claros y oscuros, y con `row-gap:3px` las filas se tocaban, así
   que el tablero era continuo. En eclipseando TODAS las cajas son blancas y
   lo que separa a la prenda clara del fondo NO es el fondo: es el recorte de
   silueta (--recorte-prenda), que RELIC ya tiene y aquí se conserva.
   Por eso esto no es un cambio de gusto: es la orden literal del dueño.

   ── LO ÚNICO QUE NO SE COPIA TAL CUAL ─────────────────────────────────
   `object-fit`. Eclipseando usa `cover` porque sus 296 fotos vienen de la
   imprenta recortadas y centradas sobre blanco a 1200×1200. RELIC usa
   `contain` + 6 % de aire, y con `cover` se le cortarían las mangas a 89
   piezas. Se trae la caja blanca cuadrada; se queda el `contain`.
   ═══════════════════════════════════════════════════════════════════════ */

:root{
  /* LA CAJA DE LA FOTO. Blanca, y no cuelga del tema: una prenda se mira
     igual con la luz encendida que apagada. En oscuro eclipseando la deja en
     #F4F1EA —«la caja de foto NUNCA se pone oscura»— y aquí igual. */
  --tp-caja:#FFFFFF;
  --tp-tarjeta:#FFFFFF;
  --tp-radio:16px;
  /* Las sombras del molde. Las de RELIC son más planas (0 1px 1px) y sobre
     un fondo blanco una tarjeta blanca sin sombra no existe. */
  --tp-sombra-1:0 1px 2px rgba(38,34,43,.06), 0 3px 10px rgba(38,34,43,.05);
  --tp-sombra-2:0 2px 6px rgba(38,34,43,.08), 0 14px 34px rgba(38,34,43,.12);
  /* El nombre del producto va en SERIF DE SISTEMA, la misma pila que
     eclipseando: 0 KB de descarga y ni una fuente nueva en la casa. NO se
     sustituye por Bodoni ni por Anton «para mejorarlo». */
  --tp-serif:Georgia,"Iowan Old Style","Times New Roman",Charter,serif;
}
:root[data-tema="oscuro"]{
  --tp-caja:#F4F1EA;
  --tp-tarjeta:var(--sala-2);
  --tp-sombra-1:0 1px 2px rgba(0,0,0,.5), 0 3px 10px rgba(0,0,0,.4);
  --tp-sombra-2:0 2px 6px rgba(0,0,0,.55), 0 14px 34px rgba(0,0,0,.5);
}
@media (prefers-color-scheme:dark){
  :root:not([data-tema="claro"]){
    --tp-caja:#F4F1EA;
    --tp-tarjeta:var(--sala-2);
    --tp-sombra-1:0 1px 2px rgba(0,0,0,.5), 0 3px 10px rgba(0,0,0,.4);
    --tp-sombra-2:0 2px 6px rgba(0,0,0,.55), 0 14px 34px rgba(0,0,0,.5);
  }
}

/* ── 1. LA REJILLA ────────────────────────────────────────────────────
   1 rem de hueco en LOS DOS EJES. El `row-gap:3px` de estilo.css («darkroom.au:
   16 px entre columnas pero sólo 2 entre filas») está copiado de una rejilla
   de fotogramas de cine, donde funde bien; sobre producto pega las cajas de
   foto en columnas continuas. Se corrige SÓLO donde hay producto: las
   rejillas de carteles y de notas se quedan como estaban. */
.rejilla:has(.fotograma-img--prenda),
.rejilla--piezas{
  grid-template-columns:repeat(auto-fill,minmax(min(100%,15rem),1fr));
  column-gap:1rem; row-gap:1rem;
}
@media (max-width:599.98px){
  .rejilla:has(.fotograma-img--prenda),
  .rejilla--piezas{grid-template-columns:repeat(2,minmax(0,1fr)); gap:.75rem}
}

/* ── 2. LA TARJETA ────────────────────────────────────────────────────
   Plana y con filo dorado. Se retira la inclinación 3D y la perforación de
   película: son mecánicas del fotograma de cine, y el molde que se copia es
   un simple `translateY(-3px)` con la sombra que sube un escalón. */
.fotograma:has(.fotograma-img--prenda){
  background:var(--tp-tarjeta);
  border:1px solid transparent;
  border-radius:var(--tp-radio);
  box-shadow:var(--tp-sombra-1);
  transform:none;
  transform-style:flat;
  transition:transform 160ms ease, box-shadow 160ms ease;
}
/* EL FILO DORADO. Un solo borde de 1 px no separa una tarjeta blanca de una
   página blanca; este sí, y es el mismo recurso de eclipseando: doble fondo,
   uno para el relleno y otro para el borde. El ámbar es el de RELIC
   (--campo #E8A33D), que es el mismo ámbar de campo que el de allí. */
.fotograma.tarjeta-aurea:has(.fotograma-img--prenda){
  background:
    linear-gradient(var(--tp-tarjeta),var(--tp-tarjeta)) padding-box,
    linear-gradient(135deg, rgba(232,163,61,.55), rgba(232,163,61,.12) 38%,
                    rgba(232,163,61,.10) 62%, rgba(247,201,120,.5)) border-box;
}
.fotograma:has(.fotograma-img--prenda):hover{
  transform:translateY(-3px);
  box-shadow:var(--tp-sombra-2);
  border-color:transparent;
}
/* La luz derramada por debajo y la perforación del canto son del cine. */
.fotograma:has(.fotograma-img--prenda)::after,
.fotograma:has(.fotograma-img--prenda) .fotograma-img::before{display:none}

/* ── 3. LA CAJA DE LA FOTO ────────────────────────────────────────────
   BLANCA, cuadrada, a sangre y con un filete abajo que la separa del cuerpo.
   Se va el paspartú de 16 px y el anillo interior: el molde no los tiene, y
   con el fondo blanco ya no hacen falta —estaban ahí para despegar la crema
   de la tarjeta crema—. */
.fotograma .tp-marco{
  position:relative; display:block; overflow:hidden;
  border-bottom:1px solid var(--borde);
  background:var(--tp-caja);
}
.fotograma-img--prenda,
.fotograma-img--prenda.suelo,
.fotograma-img--lamina.suelo{
  background:var(--tp-caja);
  margin:0; border-radius:0; box-shadow:none;
}
.fotograma:hover .fotograma-img--prenda.suelo{box-shadow:none}
/* La foto no crece al pasar por encima: en `contain` el zoom recorta la
   prenda contra el borde de la caja. */
.fotograma:hover .tp-marco img{transform:none}

/* ── 4. EL CUERPO ─────────────────────────────────────────────────────
   Columna con 0,5 rem de aire y el pie pegado abajo. El `padding` del molde
   es 1rem 1rem 1.5rem: sobra abajo a propósito, para que el precio no quede
   colgando del canto. */
.fotograma:has(.fotograma-img--prenda) .fotograma-cuerpo{
  display:flex; flex-direction:column; gap:.5rem;
  padding:1rem 1rem 1.5rem; flex:1;
}

/* 4.1 LA ETIQUETA GRIS. Dos líneas la llevan: de dónde sale el dibujo
   (.fuente-alta, que ya existía en ámbar y en mono) y qué es la pieza con
   sus tallas (.tp-marca, nueva). El molde las quiere en sans, en gris y con
   ls .08em; el mono a .14em en ámbar competía con el precio. */
.fotograma:has(.fotograma-img--prenda) .fuente-alta,
.fotograma .tp-marca{
  margin:0; font-family:inherit; font-size:.8rem; font-weight:400;
  line-height:1.28; text-transform:uppercase; letter-spacing:.08em;
  color:var(--luz-3); border:0; padding:0;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden;
}

/* 4.2 EL NOMBRE, EN SERIF Y EN MINÚSCULA CON INICIAL MAYÚSCULA.
   «El Pequod», no «EL PEQUOD» en Anton. Es el cambio que más se nota de
   todos: una versalita condensada de cartel grita, y una tienda no grita. */
.fotograma:has(.fotograma-img--prenda) h3{
  margin:0; font-family:var(--tp-serif); font-size:1.2rem; font-weight:400;
  line-height:1.2; letter-spacing:0; text-transform:none; color:var(--luz);
}
.fotograma:has(.fotograma-img--prenda) h3 a{color:inherit}

/* 4.3 LA PÍLDORA BEIGE CON ESCUDITO. Lleva el plazo, que antes iba en gris
   al 55 % debajo del botón: el dato que decide la compra no se imprime más
   pequeño que el adorno. La cifra sale de app/plazo.py y no se toca. */
.fotograma .tp-cert{
  display:inline-flex; align-items:center; gap:.25rem; align-self:flex-start;
  margin:0; font-size:.8rem; font-weight:600; line-height:1.35;
  color:var(--luz); background:var(--ambar-hondo);
  border-radius:999px; padding:.15rem .5rem;
}
.fotograma .tp-cert svg{color:var(--campo); flex:none}

/* 4.4 LOS PUNTOS DE COLOR. No están en el molde —son de RELIC— pero no se
   quitan: sin ellos la tienda parece de ropa negra y sólo negra. Cambian de
   sitio, eso sí: el pie del molde es [precio ←→ Comprar →] y nada más. */
.fotograma:has(.fotograma-img--prenda) .puntos-color{margin:0 0 .25rem}

/* 4.5 «También en taza, sudadera y lámina», con el tamaño de la etiqueta.
   Va con dos clases porque tienda.css se carga DESPUÉS de esta hoja y allí
   .ft-tambien está en mono. */
.fotograma .ft-tambien{
  margin:0; font-family:inherit; font-size:.8rem; line-height:1.3;
  letter-spacing:0; text-transform:none; color:var(--luz-3);
}

/* 4.6 EL PIE. `margin-top:auto` alinea los precios y los «Comprar →» de toda
   la fila POR CONSTRUCCIÓN, ocupe el nombre una línea o tres. */
.fotograma .tp-pie{
  margin:auto 0 0; padding-top:.5rem; display:flex; align-items:baseline;
  justify-content:space-between; gap:.5rem;
}
/* EL PRECIO NUNCA SE PARTE. En móvil la tarjeta mide 173 px y «desde 23,95 €»
   se rompía en cuatro renglones. Un texto partido se lee; un número partido
   parece un error de la web justo donde se decide la compra. */
.fotograma .tp-precio{
  font-family:inherit; font-size:1.2rem; font-weight:700; color:var(--luz);
  white-space:nowrap; font-variant-numeric:tabular-nums;
}
/* «Comprar →» como ENLACE ÁMBAR a la derecha del precio, no un botón con
   marco a todo el ancho. El ámbar es el de TEXTO (--haz), no el de campo:
   #E8A33D sobre blanco da 1,88:1 y como texto no vale. Y este sí puede
   partirse en dos líneas: un texto en dos renglones se lee. */
.fotograma .tp-mas{
  font-size:.9rem; font-weight:600; line-height:1.25; color:var(--haz);
  text-align:right;
}
.fotograma .tp-mas:hover{text-decoration:underline}

/* ── 5. LAS DOS ESQUINAS ──────────────────────────────────────────────
   Portadas Y ENCENDIDAS (19-08, textos+distintivos). La regla de eclipseando
   es que un sello que sale siempre no distingue nada, así que sólo llevan
   esquina las piezas con un dato que la foto no cuenta:
     · cinta arriba-izquierda  «Hasta la talla 5XL» ....... 13 de 89
     · sello abajo-derecha     «Llega para el estreno» .... 26 de 89
   El porqué de cada uno, y lo que se decidió NO encender, en
   app/venta_textos.py. Nunca dos en la misma esquina; los dos se parten
   antes de cruzar la foto de lado a lado. */
.fotograma .tp-cinta{
  position:absolute; top:.5rem; left:.5rem; z-index:3;
  max-width:calc(100% - 2rem); line-height:1.3;
  color:var(--luz); background:var(--tp-tarjeta);
  border:1px solid var(--campo); border-radius:.6rem;
  font-size:.68rem; font-weight:700; text-transform:uppercase;
  letter-spacing:.05em; padding:.15rem .4rem;
}
.fotograma .tp-sello{
  position:absolute; bottom:.5rem; right:.5rem; z-index:3;
  max-width:calc(100% - 2rem); line-height:1.3;
  color:var(--campo-tinta); background:var(--campo);
  border-radius:.6rem; font-size:.68rem; font-weight:700;
  padding:.05rem .4rem;
}

/* ── 6. MÓVIL: LA TARJETA CABE EN MEDIO ANCHO ─────────────────────────
   Dos columnas por debajo de 600 px: la tarjeta mide unos 173 px en vez de
   268 y el texto ocupaba más alto que la foto. Mismos valores del molde. */
@media (max-width:599.98px){
  .fotograma:has(.fotograma-img--prenda) .fotograma-cuerpo{
    gap:.25rem; padding:.75rem .75rem 1rem;
  }
  .fotograma:has(.fotograma-img--prenda) h3{font-size:1rem; line-height:1.25}
  .fotograma .tp-precio{font-size:1rem}
  .fotograma .tp-mas{font-size:.8rem}
  .fotograma .tp-cert{font-size:.62rem; padding:.1rem .25rem; line-height:1.25}
  .fotograma .tp-cinta{font-size:.6rem; top:.25rem; left:.25rem}
  .fotograma .tp-sello{font-size:.6rem; bottom:.25rem; right:.25rem}
}
@media (prefers-reduced-motion:reduce){
  .fotograma:has(.fotograma-img--prenda){transition:none}
  .fotograma:has(.fotograma-img--prenda):hover{transform:none}
}
/* ─── FIN DEL PORTE DE LA REJILLA ─────────────────────────────────────── */

/* ═══════════════════════════════════════════════════════════════════════
   PORTE DE ECLIPSEANDO — TEXTOS Y DISTINTIVOS   (19-08-2026)
   Bloque propio y al final del fichero: aquí no se reescribe nada de nadie.
   Son dos reglas, y las dos son de TEXTO. Los distintivos de esquina
   (.tp-cinta / .tp-sello) ya estaban vestidos más arriba, en el porte de la
   rejilla: aquí sólo se han encendido con datos —app/venta_textos.py—.

   1. EL VEREDICTO DE LA CAJA (.caja-llegada)
      Porte de `.caja-llegada` de ConfiguradorProducto.astro: .9rem, peso 600,
      y —esto es lo importante— LOS TRES ESTADOS AL MISMO TAMAÑO Y AL MISMO
      PESO. Es la regla escrita de la casa de eclipseando: «la verdad no se
      imprime más pequeña que la promesa». Si el «ya no llega» se pintara
      en .8rem y en gris, la ficha estaría diciendo la mala noticia de
      refilón, que es justo lo que genera la devolución.

      EL ÁMBAR DEL ESTADO «antes» ES --haz Y NO --campo, Y NO ES UNA MEJORA.
      Eclipseando pinta ese estado con su `--color-acento` (#d98e2b). RELIC
      tiene el ámbar PARTIDO EN DOS desde antes de este porte, con la razón
      medida en la cabecera de este mismo fichero: --campo (#E8A33D) es el
      ámbar de FONDOS y daría 1,88:1 como texto sobre papel blanco; --haz
      (#8A5410) es el ámbar de TEXTO y da 6,26:1. El propio molde avisa de
      esta pareja —«--color-foco … ÁMBAR DE TEXTO. NO es --color-acento»—,
      así que usar --haz es coger el token correcto de los dos, no cambiar
      el diseño. Con --campo el veredicto bueno sería ilegible.            */
.caja-llegada{
  margin:.25rem 0 0; font-size:.9rem; font-weight:600; line-height:1.35;
  color:var(--luz);
}
.caja-llegada[data-estado="antes"]{color:var(--haz)}
/* «justo» y «despues» se quedan en tinta normal A PROPÓSITO: ni rojo ni
   letra pequeña. La mala noticia se lee igual de bien que la buena y encima
   reencuadra («es la pieza, y vale igual después de verla»). */

/* 2. HASTA DÓNDE ENVIAMOS (.ambito-envio)
      Debajo de la rejilla, en .9rem legible y a una columna de texto: es la
      regla 6 de eclipseando —«la limitación se escribe antes de cobrar»— y
      su párrafo va exactamente ahí, con `max-width:62ch` para que no cruce
      los 1.152 px de la rejilla de lado a lado. */
.ambito-envio{
  /* A LA IZQUIERDA, NO CENTRADO. Medido en la captura de su tienda: el
     párrafo arranca en el mismo filo que la primera columna de la rejilla y
     que el aviso legal de más abajo. Centrado (margin auto) quedaba flotando
     en medio de la página con la última tarjeta a un lado — se probó, se
     miró y se corrigió. */
  max-width:62ch; margin:1.5rem 0 0; font-size:.9rem; line-height:1.55;
  color:var(--luz-3);
}
/* ─── FIN DEL PORTE DE TEXTOS Y DISTINTIVOS ───────────────────────────── */

/* ── APÉNDICE DEL PORTE: EL PIE, EN MÓVIL, NO SE CORTA ────────────────
   Es el ÚNICO sitio donde no se ha copiado eclipseando tal cual, y se copia
   igualmente el criterio que ellos mismos tienen escrito.

   Medido en producción, https://eclipseando.es/tienda/ a 390 px: con la
   tarjeta a 173 px y el precio con «desde», «Comprar →» se parte en tres
   renglones —«mpr / ar / →»— y las dos primeras letras se las come el
   `overflow:hidden` de la tarjeta. Está pasando HOY en su tienda, y RELIC
   lleva «desde» en las 89 piezas, así que allí es un caso y aquí serían 89.

   Lo que se aplica no es un invento: es el criterio del propio componente
   —TarjetaPropia.astro, `.tp-pie-boton`: «en el móvil la tarjeta mide unos
   160 px y 25,95 € junto a Comprar no cabe en una línea»— sin traerse el
   botón relleno, que el dueño no quiere. El pie sigue siendo [precio ←→
   Comprar →] siempre que quepa; cuando no cabe, «Comprar →» baja a su propia
   línea pegado a la derecha, en vez de cortarse.                            */
.fotograma .tp-pie{flex-wrap:wrap}
.fotograma .tp-mas{min-width:0; margin-left:auto}

/* ── APÉNDICE DEL PORTE: EL CARRUSEL DE PIEZAS DE LA NOTA ─────────────
   La tarjeta es un <li>, así que su carrusel pasó de <div> a <ul>. En la
   nota ese carrusel vive DENTRO del artículo, y `.articulo ul` lo pone en
   `display:flex; flex-direction:column` —es la regla de las listas de la
   prosa—: las ocho piezas se apilaron en una columna de 12.713 px de alto.
   Medido, no supuesto. Aquí se le devuelve la rejilla horizontal, que es lo
   que ya tenía `.carrusel-pista` antes de cambiar de etiqueta. */
ul.carrusel-pista{
  display:grid; grid-auto-flow:column;
  grid-auto-columns:minmax(248px,286px); gap:16px;
  flex-direction:row; list-style:none; margin:0; padding:0 0 4px;
}

/* ── APÉNDICE DEL PORTE: LA TARJETA DENTRO DE UN ARTÍCULO ─────────────
   El carrusel de piezas de la nota vive dentro de `.articulo`, que es prosa:
   allí toda <ul> se apila en columna y todo <a> va subrayado. Con la tarjeta
   metida ahí, los cuatro puntos de color salían uno debajo de otro —medido:
   una torre de 4 puntos donde debía haber una fila— y el nombre en serif
   salía subrayado como un enlace del texto. La tarjeta es un componente, no
   un párrafo: aquí se le devuelven sus dos reglas. */
.fotograma .puntos-color{
  display:flex; flex-direction:row; flex-wrap:wrap; align-items:center;
  gap:.34rem; padding:0;
}
.fotograma h3 a,.fotograma .tp-mas,.fotograma .fotograma-img{text-decoration:none}
.fotograma h3 a:hover{text-decoration:none; color:var(--haz)}
/* Y el subrayado del enlace de prosa: `.articulo a` lo pinta con
   `border-bottom`, no con `text-decoration`, así que quitar el subrayado no
   bastaba. El nombre en serif de una tarjeta no es un enlace de un párrafo. */
.fotograma h3 a,.fotograma .tp-mas,.fotograma .fotograma-img{border-bottom:0}
.fotograma h3 a:hover{border-bottom:0}

/* El nombre del DIBUJO, debajo del titular. El titular dice qué es y para qué
   película («Camiseta Insidious»); esto dice cuál de los dibujos de esa
   película es, que es lo que distingue dos camisetas del mismo bloque. */
.fotograma .tp-dibujo{margin:.15rem 0 0; font-size:.82rem; opacity:.7;
  font-style:italic}
@media (max-width:599.98px){ .fotograma .tp-dibujo{font-size:.76rem} }

/* EL PUNTO DE COLOR QUE ESTÁ PUESTO. Se marca desde el SERVIDOR y no desde el
   guion: la foto que se sirve ya sabe de qué color es (`color_tarjeta`), así
   que el aro sale con el HTML y no espera a que cargue JavaScript. Antes el
   primer punto parecía el elegido aunque la foto fuera de otro color. */
.punto-color--puesto{box-shadow:0 0 0 2px var(--sala), 0 0 0 3.5px var(--luz)}

/* ══════════════════════════════════════════════════════════════════════
   LA TIRA DE DISEÑOS
   ─────────────────────────────────────────────────────────────────────
   RELIC va a tener 5-10 diseños por película. Con los diseños como tarjetas,
   una película con diez servía SETENTA tarjetas y el cliente veía «Camiseta
   Dalgliesh» diez veces: el catálogo castigaba justo lo que es la ventaja de
   la casa. Ahora son siete tarjetas —una por formato— y el diseño se conmuta
   aquí, sin entrar en la ficha.

   POR QUÉ CUADRADO Y NO CÍRCULO. El punto de color funciona porque el control
   ES una miniatura de lo que cambia: un círculo del color. Aquí la miniatura
   ES el diseño, y va en cuadrado redondeado para que las dos tiras se lean
   como dos ejes distintos SIN tener que leer el rótulo. Redondo = color,
   cuadrado = diseño.
   ══════════════════════════════════════════════════════════════════════ */
.fotograma .tp-rotulo{margin:.5rem 0 .2rem; font-family:"IBM Plex Mono",monospace;
  font-size:.58rem; letter-spacing:.16em; text-transform:uppercase;
  color:var(--luz-3); opacity:.85}

.puntos-diseno{display:flex; flex-wrap:nowrap; gap:6px; list-style:none;
  margin:0; padding:2px 2px 4px; overflow-x:auto; overscroll-behavior-x:contain;
  scrollbar-width:none}
.puntos-diseno::-webkit-scrollbar{display:none}
.punto-diseno{flex:none; display:block; width:34px; height:34px; padding:3px;
  border-radius:.45rem; background:var(--banda); border:1px solid var(--filete);
  line-height:0; transition:border-color .14s, transform .14s}
.punto-diseno img{width:100%; height:100%; object-fit:contain; display:block}
.punto-diseno:hover{border-color:var(--haz); transform:translateY(-1px)}
/* El aro del diseño puesto es el MISMO lenguaje que el del color: aro doble,
   fondo de la tarjeta por medio. Si fueran distintos, el cliente tendría que
   aprender dos convenciones para la misma idea. */
.punto-diseno--puesto{border-color:var(--luz);
  box-shadow:0 0 0 2px var(--sala), 0 0 0 3.5px var(--luz)}
.punto-diseno.cargando{opacity:.55}

@media (max-width:599.98px){
  .punto-diseno{width:30px; height:30px}
  .fotograma .tp-rotulo{font-size:.54rem; margin-top:.4rem}
}
@media (prefers-reduced-motion:reduce){ .punto-diseno{transition:none} }

/* ══════════════════════════════════════════════════════════════════════
   LA FILA DE DISEÑOS
   ─────────────────────────────────────────────────────────────────────
   TRES FORMAS, TRES NIVELES, para poder entender la tienda sin leer nada:
       cuadrado → DISEÑO   ·   redondo → COLOR   ·   tarjeta → FORMATO
   El aro del diseño puesto es el MISMO que el del color —aro doble con el
   fondo de la tarjeta por medio—: si fueran distintos habría que aprender
   dos convenciones para la misma idea.
   ══════════════════════════════════════════════════════════════════════ */
.tdis{margin:.7rem 0 0}
.tdis-rot{margin:0 0 .35rem; font-family:"IBM Plex Mono",monospace;
  font-size:.58rem; letter-spacing:.14em; text-transform:uppercase;
  color:var(--luz-3)}
.tdis-tira{display:flex; gap:7px; list-style:none; margin:0;
  padding:3px 3px 5px; overflow-x:auto; overscroll-behavior-x:contain;
  scrollbar-width:none}
.tdis-tira::-webkit-scrollbar{display:none}
.tdis-uno{flex:none; display:block; width:54px; height:54px; padding:6px;
  border-radius:.5rem; background:var(--banda); border:1px solid var(--filete);
  line-height:0; transition:border-color .14s, transform .14s}
.tdis-uno img{width:100%; height:100%; object-fit:contain; display:block}
.tdis-uno:hover{border-color:var(--haz); transform:translateY(-1px)}
.tdis-on{border-color:var(--luz);
  box-shadow:0 0 0 2px var(--sala), 0 0 0 3.5px var(--luz)}
.tdis-uno.cargando{opacity:.5}
/* El nombre del diseño puesto: la miniatura dice CUÁL, esto dice cómo se
   llama. Sin él, diez cuadraditos son diez cuadraditos. */
.tdis-nombre{margin:.3rem 0 0; font-size:.82rem; font-style:italic;
  color:var(--luz-2); min-height:1.1em}

/* EN LA PÁGINA DE LA PELÍCULA VA GRANDE. Allí los diseños no compiten con
   otras treinta y una películas: son lo que se ha venido a ver. */
.tdis--grande{margin:0 0 calc(var(--paso)*.7)}
.tdis--grande .tdis-rot{font-size:.66rem; margin-bottom:.5rem}
.tdis--grande .tdis-uno{width:104px; height:104px; padding:11px;
  border-radius:.8rem}
.tdis--grande .tdis-tira{gap:12px}
.tdis--grande .tdis-nombre{font-size:1rem; margin-top:.5rem}

@media (max-width:599.98px){
  .tdis-uno{width:48px; height:48px; padding:5px}
  .tdis--grande .tdis-uno{width:78px; height:78px; padding:8px}
}
@media (prefers-reduced-motion:reduce){ .tdis-uno{transition:none} }

/* ══════════════════════════════════════════════════════════════════════
   LA CABECERA DE /ropa/<peli>: MENOS CARTEL, MÁS TIENDA
   ─────────────────────────────────────────────────────────────────────
   Medido antes de tocarla: el <h1> ocupaba 344 px, el cartel 450, y la fila
   de diseños caía en el píxel 1.482 con la primera pieza en el 1.760. Casi
   dos pantallas de scroll para ver lo que se ha venido a ver. Esto es una
   página que VENDE, no un cartel de cine: el titular baja de tamaño, el
   cartel se queda en la mitad y los diseños suben a la cabecera.
   ══════════════════════════════════════════════════════════════════════ */
/* DOS COLUMNAS DE VERDAD. No había ninguna regla de disposición, así que el
   cartel caía DEBAJO del texto y la cabecera medía 863 px: el texto acababa
   en el píxel 574 y el cartel ocupaba del 655 al 940 él solo, en horizontal
   vacío. Al lado, la cabecera entera cabe en la primera pantalla. */
.encabezado--coleccion{display:grid;
  grid-template-columns:minmax(0,1fr) 190px; gap:2rem; align-items:start}
.encabezado--coleccion .encabezado-img{grid-column:2; grid-row:1}
.encabezado--coleccion h1{font-size:clamp(1.7rem,3.4vw,2.6rem); line-height:1.05;
  margin-bottom:.5rem}
.encabezado--coleccion .entradilla{font-size:.95rem; margin-bottom:.6rem}
.encabezado--coleccion .cartel-coleccion{width:190px; height:auto;
  aspect-ratio:2/3; object-fit:cover}
.promesas-linea{margin:0 0 .2rem; font-size:.82rem; line-height:1.5;
  color:var(--luz-2)}
.promesas-linea b{font-weight:600; color:var(--luz)}
@media (max-width:699.98px){
  /* En móvil no caben dos columnas con un cartel legible: el cartel se pone
     encima, pequeño y de lado, y el texto ocupa el ancho. */
  .encabezado--coleccion{grid-template-columns:110px minmax(0,1fr); gap:1rem}
  .encabezado--coleccion .encabezado-img{grid-column:1; grid-row:1}
  .encabezado--coleccion > div:first-child{grid-column:2; grid-row:1}
  .encabezado--coleccion .cartel-coleccion{width:110px}
  .promesas-linea{font-size:.78rem}
}

/* El hueco entre la cabecera y las piezas. Con el cartel al lado, la columna
   de texto acaba antes y quedaban ~300 px de blanco muerto entre la fila de
   diseños y «Las piezas»: el cliente que ya ha elegido diseño tenía que
   volver a bajar para ver lo que había elegido. */
.encabezado--coleccion{padding-bottom:.6rem; margin-bottom:0}
.encabezado--coleccion + .franja{padding-top:calc(var(--paso)*.6)}
.encabezado--coleccion + .franja > h2{margin-top:0}

/* El nombre del diseño baja a subtítulo: distingue entre las siete piezas de
   una misma película, pero NO es lo que explica esta página. */
.pieza-subtitulo{margin:.35rem 0 0; font-size:1rem; color:var(--luz-2)}
.pieza-subtitulo b{font-weight:600; color:var(--luz)}

/* ══════════════════════════════════════════════════════════════════════
   LA PRENDA CLARA SOBRE EL MARCO BLANCO
   ─────────────────────────────────────────────────────────────────────
   MEDIDO en la camiseta premium de «La Gorgona», sobre el fichero:
       negro   borde L =  24,9  → separación del marco (255) = 230
       arena   borde L = 214,7  → separación =  40
       blanco  borde L = 226,1  → separación =  29   ← contraste 1,24:1
   Una silueta a 1,24:1 no se ve: la camiseta blanca se disuelve en el marco
   y por eso «se ve mal». Y NO se arregla tocando el fondo — aclararlo lo
   junta más y oscurecerlo convierte el marco en un cuadro gris que ensucia
   las otras cinco prendas.
   Lo que la separa es una sombra que sigue la SILUETA (los mockups son PNG
   con alfa recortado). Va SÓLO en las claras: sobre una prenda negra la
   misma sombra es un halo gris alrededor, que es por lo que se quitó.

   SE PIDE POR EL NOMBRE DEL FICHERO Y NO POR UNA CLASE. El guion de color
   cambia el `src` de la imagen, y un selector de atributo se reevalúa solo
   —sin una línea de JavaScript— en cuanto ese `src` cambia. Es el mismo
   truco que ya usaba la galería de la ficha.
   ══════════════════════════════════════════════════════════════════════ */
.fotograma-img--prenda img[src*="-blanco"],
.fotograma-img--prenda img[src*="-arena"],
.fotograma-img--lamina img[src*="-blanco"],
.fotograma-img--lamina img[src*="-arena"]{
  filter:drop-shadow(0 1px 1px rgba(52,42,24,.28))
         drop-shadow(0 0 1px rgba(52,42,24,.55));
}
/* En la ficha la foto se ve grande y el recorte se agradece más aún. */
.galeria-principal img[src*="-blanco"],
.galeria-principal img[src*="-arena"]{
  filter:drop-shadow(0 2px 3px rgba(52,42,24,.22))
         drop-shadow(0 0 1.5px rgba(52,42,24,.5));
}

/* «LEER MÁS»: el texto entero sigue en el HTML —lo lee Google— pero no le
   cae encima al que está decidiendo. <details> abre sin JavaScript y con
   teclado; un «leer más» que inyecta el texto con JS se lo pierde el
   buscador. */
.mas-texto{margin:.2rem 0 0}
.mas-texto > summary{cursor:pointer; list-style:none; display:inline-flex;
  align-items:center; gap:.4rem; font-size:.88rem; font-weight:600;
  color:var(--haz); padding:.3rem 0}
.mas-texto > summary::-webkit-details-marker{display:none}
.mas-texto > summary::after{content:"▾"; font-size:.8em; opacity:.7}
.mas-texto[open] > summary::after{content:"▴"}
.mas-texto > summary:hover{text-decoration:underline}
.mas-texto > p{margin-top:.7rem}

/* LAS PREGUNTAS, EN ACORDEÓN. Ocho respuestas abiertas eran la mitad del
   texto de la ficha, y nadie lee ocho: se busca UNA. Se ven las preguntas
   —que son el índice— y la respuesta se abre al tocarla. El texto sigue en
   el HTML, así que lo lee el buscador igual. */
.faq{margin:0}
.faq-una{border-bottom:1px solid var(--filete)}
.faq-una > summary{cursor:pointer; list-style:none; display:flex;
  align-items:center; justify-content:space-between; gap:1rem;
  padding:.85rem 0; font-weight:600; font-size:1rem; color:var(--luz)}
.faq-una > summary::-webkit-details-marker{display:none}
.faq-una > summary::after{content:"+"; font-size:1.2rem; color:var(--haz);
  line-height:1; flex:none}
.faq-una[open] > summary::after{content:"–"}
.faq-una > summary:hover{color:var(--haz)}
.faq-resp{padding:0 0 .9rem; color:var(--luz-2); line-height:1.6;
  max-width:62ch}

/* ══════════════════════════════════════════════════════════════════════
   MÓVIL Y TABLETA: SE TIENE QUE PODER PULSAR Y SE TIENE QUE PODER LEER
   ─────────────────────────────────────────────────────────────────────
   AUDITADO en 16 rutas × 4 anchos (360, 390, 768 y 1024) con la pantalla en
   modo táctil. No había ni un desbordamiento ni scroll horizontal: los dos
   fallos eran otros, y estaban en TODA la web.

   1. NO SE PODÍA PULSAR. Los puntos de color medían 16 × 16 px, el «Comprar
      →» 66 × 16, y los radios del panel de filtros 15 × 15. El mínimo que
      recomiendan Apple (44 pt) y las WCAG 2.5.8 (24 px absolutos) está muy
      por encima. Un dedo mide unos 45 px: con 16 se falla, y fallar al
      elegir un color es abandonar la compra.

   2. NO SE PODÍA LEER. Había texto a 9,9 px (el sello de dominio público) y
      a 10,6 (las cartelas). En un móvil eso no se lee, se adivina.

   CÓMO SE ARREGLA SIN DEFORMAR EL DISEÑO. El área de pulsación se agranda
   con un ::after invisible centrado en el control: el círculo se ve del
   mismo tamaño —la fila de colores no se descompone— y el dedo acierta en
   44 px. Es la técnica estándar y no toca la maquetación.
   ══════════════════════════════════════════════════════════════════════ */
/* HASTA 1180 px Y NO 1024. La primera versión cortaba en 1023,98 y dejaba
   fuera justo el iPad —1024 en vertical, 1180 en horizontal—: la auditoría lo
   cazó porque a 1024 reaparecían TODOS los fallos de móvil. Una tableta se
   usa con el dedo igual que un teléfono. */
@media (max-width:1180px){
  /* ── EL PUNTO DE COLOR: 16 px que se ven, 44 que se pulsan ────────── */
  .puntos-color .punto-color{position:relative; width:26px; height:26px}
  .puntos-color .punto-color::after{content:""; position:absolute;
    left:50%; top:50%; width:44px; height:44px; transform:translate(-50%,-50%)}
  .puntos-color{gap:10px}

  /* ── «COMPRAR →»: la fila del pie se separa y crece ───────────────── */
  .fotograma .tp-pie{flex-wrap:wrap; row-gap:.35rem; padding-top:.6rem}
  .fotograma .tp-mas{min-height:44px; display:inline-flex; align-items:center;
    padding:0 .1rem; font-size:.95rem}

  /* ── LA MINIATURA DE DISEÑO Y LOS RADIOS DEL PANEL ────────────────── */
  .tdis-uno{min-width:44px; min-height:44px}
  .ft-opcion{min-height:46px; padding:12px 6px}
  .ft-opcion input{width:22px; height:22px}
  .ft-chip, .ft-op{min-height:44px}
  /* ── LOS CONTROLES QUE SEGUÍAN PEQUEÑOS, DE LA MISMA AUDITORÍA ─────
     `input` (los radios del panel) 33 veces, `a.sello` 25, `a.bo-mas` 24,
     `button.voto` 10. Se les da alto de dedo sin cambiar cómo se ven: un
     enlace de texto con `min-height` y `inline-flex` ocupa lo mismo. */
  input[type="radio"], input[type="checkbox"]{width:22px; height:22px}
  a.sello, a.bo-mas, a.enlace-flecha, button.enlace-guia, button.voto,
  .tp-mas, .ft-cajon-limpiar{min-height:44px; display:inline-flex;
    align-items:center}
  button.voto{min-width:44px; justify-content:center}
  /* El enlace del calendario de estrenos se colapsaba a 14 px de ancho: el
     ancho lo daba el punto de la izquierda y el título no empujaba. */
  .cal-lista a, .calendario a{min-width:0; width:100%}
  .ft-puesto{min-height:36px; padding:.35rem .6rem}
  .ft-cajon-limpiar{min-height:40px; display:inline-flex; align-items:center}

  /* ── EL CALENDARIO DE ESTRENOS ────────────────────────────────────── */
  /* Sus enlaces eran `display:flex` y se colapsaban a 6 × 6 px: el ancho lo
     daba el punto de color de la izquierda y el título no empujaba. */
  .cal-lista a, li > a > .cal-punto{}
  .cal-lista a{display:flex; align-items:center; gap:.5rem; min-height:40px;
    min-width:0; flex:1 1 auto}
  .cal-punto{flex:none}

  /* ── EL SUELO DE TAMAÑO DE TEXTO ──────────────────────────────────── */
  /* Nada por debajo de 11,5 px. Las versalitas de las cartelas y el sello de
     dominio público estaban en 10,6 y 9,9. */
  /* ── EL SUELO DE TAMAÑO DE TEXTO ──────────────────────────────────
     La lista sale de auditar 15 rutas y contar QUÉ clases caen por debajo de
     11,4 px, no de ir mirando a ojo: `span.marca-tipo` salía 398 veces,
     `span.rotulo` 229, `span.tp-cinta` 68… Todas son versalitas de dato, y
     en versalitas se pierde un punto más de legibilidad que en minúscula.
     11,5 px (0,72 rem) es el suelo. */
  .cartela, .sello-dp, .dato, .letra-chica, .ft-legal, .tdis-rot,
  .tp-rotulo, .paginas-cuenta, .bo-tipo, .marca-tipo, .rotulo,
  .tp-cinta, .tp-sello, .etiqueta-genero, .sello, .cat, .cal-dow,
  .ft-des-rot, .talla-precio, .ft-chip i, .ft-chip em, .ft-op em, .ft-op i,
  .contador .rotulo, .cal-lista em, .chips i,
  .marquesina-pista span, .idioma-cod, .pie span, .pie a, footer small{
    font-size:.72rem !important; letter-spacing:.06em}
  .tp-marca{font-size:.78rem}
  /* Nada suelto por debajo de 11,5 px: red de seguridad para lo que no
     tenga clase propia. Va al final para que gane a las reglas de arriba
     sólo cuando ninguna aplica. */
  main small, main i, main em, main b, main dt{font-size:max(.72rem, 1em)}
}

/* En tableta la rejilla no puede quedarse en dos columnas de móvil: a 768 px
   caben tres cómodas, y a 1024 cuatro. Sin esto, una tablet enseñaba las
   tarjetas del tamaño de un cartel y obligaba a bajar el triple. */
@media (min-width:700px) and (max-width:1023.98px){
  .rejilla:has(.fotograma-img--prenda), .rejilla--piezas{
    grid-template-columns:repeat(3,minmax(0,1fr)); gap:1rem}
}

/* ══════════════════════════════════════════════════════════════════════
   MÓVIL Y TABLETA · SEGUNDA PASADA
   ─────────────────────────────────────────────────────────────────────
   La primera auditoría dejó una lista de reincidentes que salían en TODAS
   las rutas: el `summary` de los desplegables a 29 px de alto, el botón del
   carrito de la cabecera a 23 × 31, los enlaces del pie a 18, y algún texto
   suelto por debajo de 9 px que se escapaba del suelo por especificidad.
   Aquí se cierran los tres grupos de una vez, con la especificidad
   suficiente para ganar sin repartir `!important` por todo el fichero.
   ══════════════════════════════════════════════════════════════════════ */
@media (max-width:1180px){
  /* Todo lo que se pulsa, con alto de dedo. `summary` incluido: es un
     control, aunque no lo parezca por la etiqueta. */
  summary, .boton-carrito, .pie a, .pie-int a, footer a, .miga a{
    min-height:40px; display:inline-flex; align-items:center}
  /* LA CABECERA NO CAMBIA DE MODO DE CAJA, Y ES UN FALLO MIO QUE ARREGLO.
     Con `display:inline-flex` en sus enlaces, la fila de navegacion paso de
     ~550 a 655 px y los iconos se salian 104 px por la derecha en una
     tablet de 1024 — lo cazo la auditoria al reejecutarla. Aqui el alto de
     dedo se consigue con RELLENO VERTICAL, que no toca el ancho de nada. */
  .cabecera a, .cabecera button, .nav a{
    padding-top:.55rem; padding-bottom:.55rem; min-height:0}
  .cabecera-int{flex-wrap:wrap; row-gap:.4rem}
  .cabecera-iconos{margin-left:auto; flex:none}
  .ft-des > summary, .ft-cajon > summary{min-height:46px}
  .boton-carrito{min-width:44px; justify-content:center}
  /* La miga y la navegación son filas de enlaces: si cada uno crece a 40 px
     sin ajustar el hueco, la fila se descuadra. */
  .miga{display:flex; flex-wrap:wrap; align-items:center; gap:.15rem .4rem}

  /* EL SUELO DE TEXTO, CON ESPECIFICIDAD SUFICIENTE. Con `main i{…}` no
     bastaba: reglas más específicas de estilo.css lo pisaban y quedaban
     textos a 8,6 y 9,0 px. `body` delante sube la especificidad sin recurrir
     a !important en cada línea. */
  body main i, body main b, body main em, body main small, body main dt,
  body main span, body main label, body .pie span, body .pie a{
    font-size:max(.72rem, 1em)}
  /* Lo que está oculto a la vista no cuenta: es texto para lectores de
     pantalla y no tiene tamaño que leer. */
  .visualmente-oculto{font-size:1px !important}
}

/* El calendario de estrenos se salía 34 px por la derecha a 1180: su
   cabecera tiene ancho fijo y la rejilla de meses no encogía. */
@media (max-width:1240px){
  .cal-titulo, .calendario, .cal-mes{max-width:100%; min-width:0}
  .calendario{overflow-x:auto; overscroll-behavior-x:contain}
}

/* ══════════════════════════════════════════════════════════════════════
   MÓVIL Y TABLETA · LA REGLA GENERAL, EN VEZ DE IR UNO A UNO
   ─────────────────────────────────────────────────────────────────────
   Las dos pasadas anteriores fueron nombrando controles —los puntos de
   color, el botón del carrito, los `summary`, los radios— y siempre quedaban
   más: la auditoría seguía listando enlaces sueltos a 18, 22 y 28 px de alto
   en las quince rutas. Ir uno a uno no termina nunca y deja agujeros para lo
   que se escriba mañana. Esto es la regla general.

   LA DISTINCIÓN QUE IMPORTA, y es la de las WCAG 2.5.8:
     · un enlace DENTRO DE UN TEXTO no puede medir 40 px de alto sin romper
       el interlineado del párrafo, y por eso la norma lo exime;
     · un enlace que ES la fila entera —el único hijo de su <li>, una tarjeta,
       una miga— sí tiene que medir lo que un dedo.
   `:only-child` separa exactamente esos dos casos, que es lo que hacía falta
   para poder escribir una sola regla en vez de una lista de clases.
   ══════════════════════════════════════════════════════════════════════ */
@media (max-width:1180px){
  /* 1. Por defecto, todo enlace tiene alto de dedo. */
  a{min-height:40px; display:inline-flex; align-items:center}

  /* 2. Los que van DENTRO de un texto vuelven a ser texto. */
  p a, li a, dd a, dt a, td a, blockquote a, figcaption a,
  .cuerpo-texto a, .articulo a, .entradilla a, .lede a, .faq-resp a,
  .ficha-procedencia a, .promesas-linea a, .pago-seguro a, .ft-legal a,
  .ficha-hermanas a, h1 a, h2 a, h3 a, h4 a, .bo-tit a, .pieza-subtitulo a{
    min-height:0; display:inline; align-items:initial}

  /* 3. …salvo cuando el enlace ES la fila entera. Es el caso del calendario
        de estrenos (147 objetivos de 19 px medidos), de las listas de
        películas y de las migas. */
  li > a:only-child, p > a:only-child, dd > a:only-child,
  .cal-lista a, .chips a, .miga a, .enlace-mas, .enlace-flecha{
    min-height:40px; display:flex; align-items:center}
  .chips a, .miga a{display:inline-flex}

  /* 3b. EL TITULAR QUE ES TODO ENLACE. Medido: 198 enlaces de 17 px en
        /estrenos, 26 más en la portada, los 12 titulares de bloque de la
        tienda… todos eran un <a> que ocupa entero su <h3> o su <h2>. La
        regla 2 los devolvía a `inline` por ser «texto», y no lo son: son el
        título de una tarjeta, o sea el objetivo grande de esa tarjeta.
        `display:block` y no `flex`: en flex un titular de dos líneas deja de
        partirse como texto, y estos títulos parten en dos casi siempre. */
  h1 > a:only-child, h2 > a:only-child, h3 > a:only-child,
  h4 > a:only-child, .tit > a:only-child, .bo-tit > a:only-child{
    display:block; min-height:40px}

  /* 4. EL SUELO DE TEXTO, DE VERDAD. Las reglas de clase de estilo.css y
        tienda.css ganan por especificidad a cualquier selector de etiqueta,
        y por eso seguían quedando textos a 8,6 y 9,6 px. Un suelo NO es un
        estilo: es un límite que no se puede negociar, y por eso lleva
        `!important` — una vez, aquí, y no repartido por el fichero. */
  main *, .pie *, .cabecera *{font-size:max(11.5px, 1em) !important}
  /* Lo que está oculto para lectores de pantalla no se lee con los ojos. */
  .visualmente-oculto, .visualmente-oculto *{font-size:1px !important}
}

/* La ficha de origen plegada: el resumen manda y la lista de datos va dentro.
   Sin esto, el <dl> heredaba el margen del bloque y quedaba un hueco al
   cerrarlo. */
.mas-texto--origen{margin:.3rem 0 .6rem}
.mas-texto--origen .datos{margin-top:.7rem}

/* La etiqueta de tipo de obra se salía 1 px de su tarjeta en las dos fichas
   de «Aniversario»: al subir el suelo de tamaño de letra, la palabra dejó de
   caber por un pelo. Se limita al ancho de la tarjeta y se parte si hace
   falta, que es lo que tenía que haber hecho desde el principio. */
/* `.marca-tipo` llevaba `white-space:nowrap`, asi que al subir el suelo de
   tamano de letra creció a 99,6 px, dejo de caber en su fila flex de 121 y no
   podia encoger: se salia de la tarjeta. En una tarjeta de 157 px una
   etiqueta de una palabra puede partirse; lo que no puede es desbordar. */
@media (max-width:1180px){
  .marca-tipo{max-width:100%; min-width:0; white-space:normal;
    overflow-wrap:anywhere}
}
