/* ============================================================================
   COMPONENTS.CSS — disposición y componentes del kit de tableros de serie
   ============================================================================
   Va DESPUÉS de tokens.css (misma carpeta) en el <head> del tablero. Contiene
   la disposición (menú lateral de una columna + contenido), la barra superior,
   las tarjetas y estadísticas, los filtros, los grupos colapsables, los botones
   genéricos, la ventana de detalle y las animaciones: todo lo que un tablero
   de serie necesita ANTES de pintar lo suyo.

   Lo que NO vive aquí, a propósito: nada exclusivo de un proyecto (nombres de
   sus secciones, sus tarjetas de contenido concretas, su lector con fichas,
   su lista de pendientes). Eso va en el dashboard.css propio de cada tablero,
   apoyado en los tokens de tokens.css. Selectores en CLASE (no en id), porque
   el motor de cada tablero pinta su propio HTML con clases.

   ORIGEN: extraído el 2026-08-09 de
   brains/machines/creative/projects/higgsfield-film-festival/everybody-sleeps-at-nine/dashboard/assets/css/dashboard.css,
   traduciendo sus selectores de id (#app, #sidebar, #nav...) a clase
   (.app, .side, .nav...) para que cualquier tablero lo consuma sin
   depender de un esqueleto HTML concreto. Se dejó fuera lo exclusivo de esa
   pieza y del sistema de negocio de la casa (mapa agéntico, calendario
   editorial, banco de ideas, bloques de persona/journey/foda, comparativa de
   plataformas, ficha de experto/función/consejo): nada de eso pertenece a un
   tablero de serie. Un tablero NUEVO no copia esta hoja: la CARGA.
   ============================================================================ */

/* ============ HELPERS ============ */
.hl{background:var(--accent);color:var(--on-accent);border-radius:.28em;padding:.02em .2em;
  box-decoration-break:clone;-webkit-box-decoration-break:clone}
.muted{color:var(--text-dim)}
.pad{padding:var(--sp-3) var(--sp-1)}

/* Sistema de etiquetas, tres variantes. `tag--fill` usa el ACENTO DEL TABLERO
   (el token, no un color fijo): magenta en un tablero, lima en otro, según lo
   que cada board defina en :root/html[data-theme=dark]. */
.tag{display:inline-flex;align-items:center;gap:.4em;border:var(--hairline);border-radius:var(--r-pill);
  padding:.22em .8em;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:var(--ls-rotulo);
  font-weight:var(--w-medio);white-space:nowrap}
/* «COMPLETO» y las demás etiquetas rellenas. EL RELLENO SIGUE SIENDO EL LIMA DE LA CASA; LO
   QUE CAMBIA ES EL FILETE (CEO, 2026-08-11).

   El problema medido: el lima sobre la tarjeta crema da 1,13, así que la píldora no se ve
   como pieza. La letra de dentro se lee perfecta (14,47), el que desaparece es el CONTORNO.
   Antes el filete se pedía del mismo lima que el relleno, o sea que no dibujaba nada.

   Lo primero que probé fue rellenarla del lima hondo. Pasa las medidas (3,60 de forma y 4,52
   de letra), pero deja la etiqueta VERDE OLIVA en tema claro, que es justo el aire vintage
   que el CEO rechazó el 2026-08-10. Y contradice la nota del propio `--accent-deep`, que
   dice por escrito que no es para llevar letra encima.

   Un contorno es exactamente para esto. El lima hondo de filete da 3,60 contra la tarjeta,
   por encima del 3,00 que pide una forma, y el relleno se queda lima, que es la marca. En
   tema oscuro `--accent-deep` ya apunta al lima de siempre, así que allí el filete y el
   relleno vuelven a ser el mismo color y la píldora sigue siendo un bloque lima entero:
   sobre la tarjeta oscura da 13,65 y no necesita contorno. Una línea, los dos temas. */
.tag--fill{background:var(--accent);color:var(--on-accent);border-color:var(--accent-deep)}
.tag--pend{background:var(--text);color:var(--surface);border-color:var(--text)}
/* «EN CURSO» y las etiquetas suaves. EL PROBLEMA NO ERA QUE SE PARECIERA AL FONDO: ERA QUE
   NO TENÍA FONDO (CEO, 2026-08-11). Se pintaba transparente, así que lo único que la
   dibujaba era un filete de 1 píxel del color del filete de la casa, que en tema oscuro es
   casi el mismo tono que la tarjeta. Resultado: en oscuro no había píldora, había texto
   suelto. Ahora lleva la superficie más marcada del tema y un filete que sí se separa de
   ella, así que es una pieza en los dos temas. La letra sigue siendo la atenuada, y sobre
   esa superficie da 4,96 en claro y 5,39 en oscuro. */
.tag--soft{background:var(--surface-strong);border:1px solid var(--text-soft);
  color:var(--text-dim);text-transform:none;letter-spacing:0}

/* ============ LAYOUT: menú lateral + contenido ============ */
/* El ancho del menú lo manda la REJILLA de la página, no el propio menú. Con la columna en
   `auto`, la rejilla la mide por el contenido y estira el menú hasta llenarla: al contraer,
   el menú pedía 76px y la rejilla se los ignoraba, así que unas veces encogía y otras no
   (medido el 2026-08-09). Con la columna declarada, contraer es determinista.
   Sin transición a propósito: animar las pistas de una rejilla no es fiable (el navegador
   devuelve el reparto del paso anterior durante la animación), y el menú tiene que quedar
   donde toca en el mismo momento en que se pulsa. */
.app{display:grid;grid-template-columns:var(--sidebar-w) 1fr;min-height:100vh}
[data-side="collapsed"] .app,
[data-side="collapsed"] #app{grid-template-columns:var(--sidebar-w-collapsed) 1fr}

/* EL CONTENEDOR TAMBIÉN TIENE DOS NOMBRES, y esto se me pasó (2026-08-10).
   Los tableros de serie envuelven el menú en un elemento con clase `.app`, que es una rejilla.
   Los de película lo envuelven en `#sidebar`, que NO es rejilla: es una fila flexible, y su
   ancho lo pone él mismo. Yo había cubierto los dos vocabularios para el MENÚ pero no para su
   CONTENEDOR, así que en película el botón de contraer marcaba el estado y no pasaba nada: el
   menú se quedaba en sus 248 px. Aquí se le da el ancho a quien lo manda de verdad en cada caso.

   La película, además, tenía su propio mecanismo por su cuenta (`#app.thin #sidebar`), que nadie
   activaba porque el botón marca `data-side`. Con esta regla los dos caminos llevan al mismo
   sitio y ya no hace falta el suyo.

   Y aquí SÍ se anima: `#sidebar` es una fila flexible, no una rejilla, y el ancho de un elemento
   flexible sí se puede animar de forma fiable. Ese es el efecto de contraer que faltaba. */
#sidebar{width:var(--sidebar-w);transition:width var(--mov-medio) var(--ease)}
[data-side="collapsed"] #sidebar,
[data-side="collapsed"] #side-rail,
#app.thin #sidebar,
#app.thin #side-rail{width:var(--sidebar-w-collapsed)}
/* El par completo: hay regla para contraído Y para abierto, con el mismo peso.
   Si solo se declara el contraído, al volver a abrir NINGUNA regla fija el ancho (medido el
   2026-08-10: el menú se quedaba en 76 px para siempre y el botón parecía roto). Un estado no se
   describe solo por su contrario: se declaran los dos, y así el resultado no depende de qué hoja
   cargue antes ni de quién tenga más peso. */
[data-side="expanded"] #sidebar,
[data-side="expanded"] #side-rail{width:var(--sidebar-w)}
/* UNA sola columna, con los nombres de las secciones siempre a la vista. Este es el menú
   canónico de la casa (el de everybody-sleeps-at-nine). El menú de dos columnas que hubo
   aquí (un carril de iconos que abría un panel al lado) se retiró el 2026-08-09: escondía
   los nombres detrás de un clic y no es lo que usa ninguna pieza publicada. */
/* ============================================================================
   UNA SOLA REGLA PARA LOS DOS TIPOS DE TABLERO
   ============================================================================
   Los tableros de PELÍCULA y los de SERIE nacieron por separado y nombran sus
   piezas distinto: la película usa identificadores (`#side-rail`, `#nav`) y
   nombres propios (`.nav-item`, `.film-nav-grupo`), las series usan los del
   sistema (`.side`, `.nav a`, `.navgrp`). Cada selector de este bloque cubre
   los DOS nombres, así que los dos tableros comparten la MISMA regla: cambiar
   un espaciado aquí lo cambia en los dos a la vez.

   Se hizo así, y no renombrando el HTML de la película, porque su página se
   genera a partir del cuadro de mandos del DNA de la casa y ese esqueleto no
   es de este proyecto. Cambiar el nombre allí arrastraría a piezas que no
   tienen nada que ver con tableros de producción.

   El CEO lo pilló el 2026-08-09 mirando los dos menús: «¿tú estás usando la
   misma clase para todos los tableros? sigue viéndose distinto el padding».
   Y tenía razón: hasta ese momento los valores estaban IGUALADOS a mano, que
   es lo mismo que no compartir nada, porque el siguiente cambio los vuelve a
   separar. Los espaciados de aquí salen medidos del tablero de la película,
   que es el canon: relleno 26/16/20, bloque del logotipo de 34 de alto, y las
   entradas pegadas, sin separación entre ellas.
   ============================================================================ */
.side,#side-rail{position:sticky;top:0;height:100vh;width:100%;min-width:0;
  overflow-y:auto;overflow-x:hidden;background:var(--surface);border-right:var(--hair-soft);z-index:var(--capa-menu);
  padding:var(--sp-17) var(--sp-13) var(--sp-15);display:flex;flex-direction:column;gap:4px;
  transition:padding var(--mov-lento) var(--ease)}
/* MIN-WIDTH CERO, Y ES OBLIGATORIO. Una columna de rejilla NO encoge por debajo
   de lo que mide su contenido mas ancho, salvo que se le dé permiso. Sin esto, una
   tabla larga o un lector a dos columnas empujan el contenido hasta 2000 px dentro
   de una ventana de 1680, y lo que sobra se sale por la derecha: el panel de fichas
   quedaba fuera de pantalla y el texto cortado. Medido el 2026-08-11. Gotcha 172. */
.main{padding:var(--sp-18) var(--sp-20) var(--sp-23);max-width:2000px;min-width:0}

/* ============ MENÚ LATERAL ============ */
/* Nombre del proyecto, encima de las secciones */
.brand,.film-nav-title{padding:var(--sp-12) var(--sp-11) var(--sp-5);font-size:var(--fs-xs);font-weight:var(--w-max);
  text-transform:uppercase;letter-spacing:var(--ls-rotulo-ancho);color:var(--text-dim)}
.side .sub{font-size:var(--t-12);color:var(--text-dim);margin:var(--sp-1) 0 var(--sp-12);padding:0 var(--sp-11)}
.nav,#nav{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.nav a,#nav .nav-item,#nav .nav-sub a{display:flex;align-items:center;gap:13px;width:100%;
  text-align:left;padding:var(--sp-9) var(--sp-11);border-radius:var(--r-in);color:var(--text);font-weight:var(--w-medio);
  font-size:var(--fs-md);cursor:pointer;transition:background var(--mov-rapido),color var(--mov-rapido)}
.nav-ic{width:20px;height:20px;flex:none;opacity:var(--op-total)}
.nav a .nav-ic,#nav .nav-item .nav-ic{opacity:var(--op-alto)}
.nav a:hover,#nav .nav-item:hover,#nav .nav-sub a:hover{background:var(--surface-alt);
  text-decoration:none;color:var(--text)}
/* La sección abierta se marca en TINTA, no en acento (CEO, 2026-08-09): el lima queda
   para lo que se pulsa, y lo activo no compite con ello. */
.nav a.active,#nav .nav-item.active,#nav .nav-sub a.active{background:var(--ink);
  color:var(--on-ink);font-weight:var(--w-fuerte)}
.nav a.active:hover,#nav .nav-item.active:hover{background:var(--ink);color:var(--on-ink)}
.nav a.active .nav-ic,#nav .nav-item.active .nav-ic{opacity:var(--op-total)}
.backlink .nav-ic{width:17px;height:17px;color:var(--text)}
.side .foot,#side-rail .foot{margin-top:var(--sp-16b);padding-top:var(--sp-13);border-top:var(--hair-soft);
  font-size:var(--t-11);color:var(--text-dim)}

/* Grupo plegable: el título abre y cierra sus secciones ahí mismo, en la misma columna */
.navgrp,.film-nav-grupo{display:flex;flex-direction:column;margin:var(--sp-9) 0 var(--sp-1)}
.navgrp__t,.film-nav-grupo-t{display:flex;align-items:center;justify-content:space-between;
  width:100%;gap:8px;padding:var(--sp-5) var(--sp-11);background:transparent;border:0;cursor:pointer;
  font-family:inherit;font-size:var(--fs-xs);font-weight:var(--w-max);text-transform:uppercase;
  letter-spacing:var(--ls-rotulo-ancho);color:var(--text-dim);border-radius:var(--r-in);transition:color var(--mov-rapido)}
.navgrp__t:hover,.film-nav-grupo-t:hover{color:var(--text)}
.navgrp__b,.film-nav-grupo-b{display:flex;flex-direction:column}
.navchev,.film-nav-chevron{width:16px;height:16px;flex:none;transition:transform var(--mov-rapido)}
.navgrp.is-cerrado .navchev,.film-nav-grupo.is-cerrado .film-nav-chevron{transform:rotate(-90deg)}
.navgrp.is-cerrado .navgrp__b,.film-nav-grupo.is-cerrado .film-nav-grupo-b{display:none}
.navsep{height:1px;background:var(--rule);margin:var(--sp-12) var(--sp-7) var(--sp-9)}

/* Enlace de vuelta al índice del producto: clavado al fondo del menú, para que no compita
   con el botón de contraer que vive arriba (CEO, 2026-08-09) */
.backlink,.film-back{display:flex;align-items:center;gap:13px;font-size:var(--t-13);font-weight:var(--w-fuerte);
  color:var(--text);text-decoration:none;padding:var(--sp-9) var(--sp-11);border-radius:var(--r-in);
  background:var(--surface-alt)}
.nav .backlink,#nav .film-back{margin-top:auto}
.backlink:hover,.film-back:hover{background:var(--surface-strong)}
.backlink .ic{font-size:var(--t-17);line-height:var(--lh-pegado);color:var(--accent-ink)}
.backlink:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}
.backlink,.backlink:hover,.backlink:focus,.backlink:active,.backlink *{text-decoration:none}

/* EL ANILLO DE FOCO, PARA TODO LO QUE SE PUEDE ENFOCAR (2026-08-12).
   Quien navega con el teclado tiene que saber en todo momento donde esta. Hasta hoy el sistema
   solo le ponia anillo propio al boton de volver y al de tema; todo lo demas se quedaba con el
   de fabrica del navegador, que en tema oscuro es un hilo casi negro sobre fondo casi negro:
   medido a 1,07 y 1,16 a 1, cuando el minimo para una forma sin letra es 3.
   Va como regla general y ANTES que las especificas de cada componente, para que cualquiera de
   ellas pueda seguir pisandola si necesita otro color. `:focus-visible` (y no `:focus`) es lo
   que hace que el anillo salga al tabular y NO al hacer clic con el raton, que es justo lo que
   molestaba y por lo que se acaba escribiendo `outline:none`. */
a:focus-visible,button:focus-visible,[tabindex]:focus-visible,
summary:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--accent-ink);outline-offset:2px}

/* ---- Logotipo lateral: cruce logotipo completo / isologo (crossfade) ---- */
/* El bloque del logotipo lleva 6px a cada lado, para que el logotipo no quede pegado más a la
   izquierda que las entradas del menú (que arrancan en 16+12). Medido en el tablero canónico. */
/* La caja del logotipo mide 34 de alto (el dibujo, 16). Es lo que da el aire de arriba, y por
   eso todo lo que va debajo caía 6 píxeles más arriba en los tableros de serie que en el de la
   película, hasta que se unificó el 2026-08-09. */
.side-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 var(--sp-5) var(--sp-15);flex:none}
.side-logo{position:relative;height:34px;flex:1 1 auto;color:var(--text)}
.side-logo:hover{opacity:var(--op-total);transform:none;background:none}
.side-logo .logo-word,.side-logo .logo-mark{position:absolute;left:6px;top:50%;display:block;
  transition:opacity var(--mov-lento) ease,transform var(--mov-lento) var(--ease)}
.side-logo .logo-word{height:16px;width:auto;opacity:var(--op-total);transform:translateY(-50%)}
.side-logo .logo-mark{height:28px;width:28px;left:50%;opacity:var(--op-nada);
  transform:translate(-50%,-50%) scale(.6) rotate(-8deg)}
.side-logo-link{position:absolute;inset:0;z-index:var(--capa-fondo);border-radius:var(--r-md);display:block}
.side-logo-link:focus-visible{outline:2px solid var(--text);outline-offset:2px}

/* Botón de contraer el menú a solo iconos */
.side-toggle,#side-toggle{width:32px;height:32px;flex:none;display:flex;align-items:center;
  justify-content:center;border-radius:var(--r-9);color:var(--text-dim);border:var(--hair-soft);
  background:transparent;cursor:pointer;padding:0;
  transition:background var(--mov-rapido),color var(--mov-rapido),border-color var(--mov-rapido)}
.side-toggle:hover,#side-toggle:hover{background:var(--surface-alt);color:var(--text);border-color:var(--text)}
.side-toggle svg,#side-toggle svg{width:17px;height:17px;flex:none;transition:transform var(--mov-lento) var(--ease)}
[data-side="collapsed"] .side-toggle svg,[data-side="collapsed"] #side-toggle svg{transform:rotate(180deg)}

/* Menú contraído: se queda en iconos y el isologo. Lo pide el usuario con el botón de
   arriba, y el estado se recuerda entre visitas. */
[data-side="collapsed"] .side,
[data-side="collapsed"] #side-rail{padding:var(--sp-16) var(--sp-7)}
[data-side="collapsed"] .side-top{flex-direction:column;gap:12px;margin:0 0 var(--sp-14)}
[data-side="collapsed"] .side-logo{flex:none;width:100%;height:28px}
[data-side="collapsed"] .brand,
[data-side="collapsed"] .film-nav-title,
[data-side="collapsed"] .side .sub,
[data-side="collapsed"] .side .foot,
[data-side="collapsed"] .backlink span,
[data-side="collapsed"] .film-back span,
[data-side="collapsed"] .nav a span,
[data-side="collapsed"] #nav .nav-item span,
[data-side="collapsed"] .navgrp__t span,
[data-side="collapsed"] .film-nav-grupo-t span,
[data-side="collapsed"] .navchev,
[data-side="collapsed"] .film-nav-chevron,
[data-side="collapsed"] .chev{display:none}
[data-side="collapsed"] .side-logo .logo-word{opacity:var(--op-nada);transform:translate(-10px,-50%)}
[data-side="collapsed"] .side-logo .logo-mark{opacity:var(--op-total);transform:translate(-50%,-50%) scale(1) rotate(0deg)}
[data-side="collapsed"] .nav a,
[data-side="collapsed"] #nav .nav-item{justify-content:center;padding:var(--sp-9) 0}
[data-side="collapsed"] .navgrp__t,
[data-side="collapsed"] .film-nav-grupo-t{justify-content:center;padding:var(--sp-5) 0}
/* Contraído, un grupo plegado escondería sus iconos y dejaría el menú medio vacío sin
   forma de reabrirlo (su título ya no se lee). Contraído se ven todos. */
[data-side="collapsed"] .navgrp.is-cerrado .navgrp__b,
[data-side="collapsed"] .film-nav-grupo.is-cerrado .film-nav-grupo-b{display:flex}
[data-side="collapsed"] .backlink,
[data-side="collapsed"] .film-back{justify-content:center;padding:var(--sp-7) 0}

/* ============ TOPBAR ============ */
/* La barra superior es TRANSLÚCIDA y desenfoca lo que pasa por debajo. Es el acabado de la
   película, y en los tableros de serie estaba opaca: la misma barra con dos acabados, que es
   la diferencia que el CEO vio el 2026-08-09 comparando los dos. El color es el papel de la
   página al 84 %, así que sigue el tema sin escribir ningún color propio.
   Se comparte el ACABADO, no la geometría: cada tablero tiene su propio relleno porque su
   zona de contenido no mide lo mismo, y forzar los dos a la vez descuadraría uno. */
.topbar{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;
  position:sticky;top:0;z-index:var(--capa-menu);
  background:color-mix(in srgb,var(--bg) 84%,transparent);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  /* Los dos negativos sacan la banda hasta los bordes de la pantalla, y por eso valen justo lo
     que mide el relleno de la zona de contenido. Se CALCULAN de ese mismo token, no se escriben:
     si mañana el contenido lleva otro relleno, la banda se ajusta sola en vez de quedarse con un
     escalón por el que se ve pasar el texto. */
  margin:calc(var(--sp-18) * -1) calc(var(--sp-20) * -1) var(--sp-16);
  padding:var(--sp-14) var(--sp-20) var(--sp-12);border-bottom:var(--hair-soft)}
.topbar h1{margin:0;font-size:var(--t-26);font-weight:var(--w-fuerte);letter-spacing:var(--ls-medio)}
.topbar .crumb{font-size:var(--t-11);color:var(--text-dim);text-transform:uppercase;letter-spacing:1.3px;margin-bottom:var(--sp-4)}
/* EL CAMBIO CLARO/OSCURO SE HACE CON EL SOL Y LA LUNA (CEO, 2026-08-10).
   La palabra «Tema» está PROHIBIDA, y también «Modo» y «Theme». Un botón de texto obliga a leer,
   hay que traducirlo y encima no dice qué va a pasar. Dos dibujos lo dicen solos.
   Dentro del botón van los DOS y se cruzan aquí: se ve el del tema CONTRARIO, o sea a dónde te
   lleva pulsarlo. En claro se ve la luna; en oscuro, el sol. Redondo, del tamaño mínimo que se
   puede pulsar con el dedo sin fallar (36 píxeles). */
.theme-btn{background:var(--surface-alt);border:var(--hair-soft);color:var(--text);border-radius:var(--r-circle);
  width:36px;height:36px;padding:0;flex:none;cursor:pointer;font-family:inherit;
  display:inline-flex;align-items:center;justify-content:center;position:relative;
  transition:background var(--mov-rapido),border-color var(--mov-rapido)}
.theme-btn:hover{background:var(--surface-strong);border-color:var(--text)}
.theme-btn:focus-visible{outline:2px solid var(--text);outline-offset:2px}
.theme-btn .ic-sol,.theme-btn .ic-luna{width:18px;height:18px;position:absolute;
  transition:opacity var(--mov-rapido),transform var(--mov-rapido)}
/* en CLARO se ve la luna: pulsar te lleva a oscuro */
.theme-btn .ic-sol{opacity:var(--op-nada);transform:rotate(-45deg) scale(.7)}
.theme-btn .ic-luna{opacity:var(--op-total);transform:none}
/* en OSCURO se ve el sol: pulsar te devuelve a claro */
html[data-theme="dark"] .theme-btn .ic-sol{opacity:var(--op-total);transform:none}
html[data-theme="dark"] .theme-btn .ic-luna{opacity:var(--op-nada);transform:rotate(45deg) scale(.7)}

/* ============ TARJETAS / ESTADÍSTICAS / CABECERA ============ */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin:var(--sp-15) 0}
.stat{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-lg);padding:var(--sp-16) var(--sp-16b) var(--sp-15);box-shadow:var(--sh-1)}
.stat .n{font-family:var(--display);font-size:var(--fs-stat);font-weight:var(--w-normal);color:var(--accent-ink);line-height:var(--lh-pegado);letter-spacing:var(--ls-titulo)}
.stat .l{font-size:var(--fs-xs);font-weight:var(--w-fuerte);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--ls-rotulo-ancho);margin-top:var(--sp-7)}

.card{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-lg);padding:var(--sp-14);box-shadow:var(--sh-1)}
/* Una cadena sin espacios mas ancha que la tarjeta (una ruta, un nombre tecnico
   compuesto) desbordaba el cuerpo entero en movil: 25px medidos en la vista de
   inventario de Utopia (QA del 16/08). Solo parte cuando no hay otro sitio. */
.card p{overflow-wrap:anywhere}

.hero{background:var(--surface-alt);border:var(--hair-soft);border-radius:var(--r-hero);padding:var(--sp-19b) var(--sp-18b);margin-bottom:var(--sp-16b)}
.hero h1{margin:0 0 var(--sp-5);font-size:var(--fs-hero);font-weight:var(--w-normal);letter-spacing:var(--ls-titulo);line-height:var(--lh-pegado)}
.hero .lead{font-size:var(--fs-lead);color:var(--text-dim);margin:var(--sp-9) 0}
.hero .meta{font-size:var(--t-13);color:var(--text-dim);margin-top:var(--sp-7)}

/* --- LOS DOS BOTONES DE LA CASA: fantasma y sólido ---
   LA FORMA LA COMPARTEN LOS DOS (CEO, 2026-08-11). Hasta hoy la geometría (ser una caja
   en línea, el aire de dentro, el radio de píldora y el filete) vivía SOLO en `.btn-ghost`,
   y `.btn-primary` declaraba únicamente fondo, letra y grosor. O sea: `btn-primary` no era
   un botón, era una capa de pintura para el botón fantasma.

   Mientras los dos nombres viajaran juntos (`class="btn-ghost btn-primary"`, 44 sitios) no
   se notaba. Pero hay 17 sitios que piden `btn-primary` a secas, y ahí salía un rectángulo
   sin aire de 15 píxeles de alto al lado de su vecino de 30. El «Guardar» del editor de
   comentarios es uno de ellos, y es el que el CEO señaló.

   Por qué ningún control lo cazó: su contraste es perfecto. Letra clara sobre fondo oscuro,
   diez y pico sobre uno. Las puertas de la casa miden color, y aquí el color estaba bien.
   Lo que faltaba era la FORMA, que no la mide nadie. Gotcha 198.

   Se añaden además dos cosas que faltaban en los dos: la tipografía de la página (un
   <button> sin esto se pinta con la fuente del sistema operativo, no con la de la marca) y
   el cursor de mano. */
.btn-ghost,.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  padding:var(--sp-6) var(--sp-11b);border-radius:var(--r-pill);border:var(--hair-soft);
  font-family:inherit;font-size:var(--fs-sm);color:var(--text);cursor:pointer;text-decoration:none;
  transition:background var(--mov-rapido),border-color var(--mov-rapido),filter var(--mov-rapido)}
.btn-ghost:hover{background:var(--surface-alt);border-color:var(--text)}
/* EL SECUNDARIO SOLIDO (CEO, 2026-08-11). Faltaba en el sistema, y esa falta se veia: los
   botones de dentro de una tarjeta («Copiar», «Copiar prompt», «Ver prompt») estaban
   escritos por su cuenta en la hoja de cada serie, con fondo propio, mientras el sistema
   solo ofrecia el fantasma, que sobre una tarjeta oscura casi no se distingue del fondo.
   Resultado: en la misma tarjeta convivian dos formas de boton y una de ellas no parecia
   un boton. Este es el que va DENTRO de una tarjeta: se apoya en el fondo fuerte, sin
   filete, y se aclara al pasar el raton. */
.btn-soft{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  padding:var(--sp-6) var(--sp-11b);border-radius:var(--r-pill);border:0;
  background:var(--surface-strong);color:var(--text);font-family:inherit;
  font-size:var(--fs-sm);cursor:pointer;text-decoration:none;
  transition:filter var(--mov-rapido),background var(--mov-rapido)}
.btn-soft:hover{filter:brightness(1.14);text-decoration:none}
.btn-primary{background:var(--text);color:var(--surface);border-color:var(--text);font-weight:var(--w-fuerte)}
/* El sólido se apaga un punto al pasar el ratón, en vez de cambiar de color: así el par
   fondo/letra se mantiene entero en los dos temas. `--solid-hover` es el que SÍ se da la
   vuelta con el tema (gris oscuro en claro, crema en oscuro), y por eso se usa para el
   borde: un filtro solo no se nota sobre el casi negro del tema claro. */
.btn-primary:hover{filter:brightness(.96);border-color:var(--solid-hover)}

/* --- BOTÓN DE MARCAR (`.stbtn`): «Marcar listo», «Marcar hecho», «Marcar rodado» ---
   Vivía suelto en la hoja de la película y de ahí lo copiaron los ocho tableros de
   cortometraje, así que su fallo de contraste se arreglaba en uno y seguía roto en los otros
   siete. Sube al sistema para todos (CEO, 2026-08-11).

   Apagado, es un botón sólido: fondo `--text`, letra `--on-solid`. Los dos se dan la vuelta con
   el tema, así que el estado de ratón encima tiene que darse la vuelta con ellos: eso es lo que
   hace `--solid-hover` y lo que NO hacía `--dark-hover`, que es gris oscuro en los dos temas y
   dejaba el botón invisible en oscuro (2,05 de contraste).

   Encendido, es lima. Y encima del lima va SIEMPRE la tinta `--on-accent`, nunca letra clara:
   es el fallo más repetido de la casa. Al pasar el ratón, el lima se apaga un punto con un
   filtro en vez de cambiar de color, que es como ya lo hace `.btn-primary`: así el par
   fondo/letra se mantiene entero en los dos temas y no hay que declarar un lima por tema.

   POR QUÉ EL NOMBRE VA REPETIDO EN EL SELECTOR. Medido con el navegador el 2026-08-11: la hoja
   de cada tablero vuelve a declarar `.btn-ghost:hover` y `.card__foot .btn-ghost:hover` DESPUÉS
   de esta, así que un `.stbtn:hover` a secas perdía y el botón salía con fondo crema y letra
   blanca encima. Repetir la clase sube el peso de la regla lo justo para que gane sin tocar la
   hoja de cada tablero, que es lo que hay que evitar: allí es donde se desparejan. */
.btn-ghost.stbtn.stbtn{background:var(--text);color:var(--on-solid);border-color:var(--text);font-weight:var(--w-fuerte)}
.btn-ghost.stbtn.stbtn:hover{background:var(--solid-hover);color:var(--on-solid);border-color:var(--solid-hover)}
.btn-ghost.stbtn.stbtn.is-on{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}
.btn-ghost.stbtn.stbtn.is-on:hover{background:var(--accent);color:var(--on-accent);border-color:var(--accent);filter:brightness(.93)}

/* ============ FILTROS ============ */
.filters{display:flex;gap:8px;flex-wrap:wrap;margin:var(--sp-3) 0 var(--sp-13)}
.fbtn{background:var(--surface);border:var(--hair-soft);color:var(--text-dim);border-radius:var(--r-pill);
  padding:var(--sp-5) var(--sp-12);font-size:var(--t-13);font-weight:var(--w-fuerte);cursor:pointer;font-family:inherit;
  transition:background var(--mov-rapido),border-color var(--mov-rapido),color var(--mov-rapido)}
/* La pestaña elegida, igual que la sección abierta del menú: en tinta */
.fbtn.active{background:var(--ink);color:var(--on-ink);border-color:var(--ink)}
/* NO TENÍAN ESTADO DE RATÓN ENCIMA (CEO, 2026-08-11). Un filtro que se pulsa no daba
   ninguna señal de ser pulsable: ni el apagado ni el encendido cambiaban al pasar por
   encima. El apagado se aclara hacia la superficie alterna y sube la letra a la fuerte; el
   encendido se apoya en `--solid-hover`, que es el único que se da la vuelta con el tema.
   Un filtro de brillo no vale aquí: en tema claro la pestaña activa ya es casi negra y
   oscurecerla no se ve. */
.fbtn:hover{background:var(--surface-alt);border-color:var(--text);color:var(--text)}
.fbtn.active:hover{background:var(--solid-hover);border-color:var(--solid-hover);color:var(--on-ink)}

/* ============ GRUPOS COLAPSABLES ============ */
/* ============================================================================
   LAS TRES FAMILIAS DE TARJETA QUE EXISTEN DE VERDAD (2026-08-10)
   ============================================================================
   Hasta hoy el sistema solo traía `.card`, la caja pelada. Las tarjetas que se
   usan a diario en los tableros publicados (la de capítulo, la de canción y la
   de la portada de una película con su rejilla y sus chips) vivían escritas a
   mano en la hoja PROPIA de cada tablero, y de ahí que hubiera dos y tres
   versiones distintas de la misma tarjeta conviviendo.

   Suben aquí tal cual están en el tablero de Sangre de Luna y en el de
   Everybody Sleeps at Nine, que son las versiones que ya piden sus colores y
   medidas por nombre. Las hojas de cada tablero pueden borrar su copia: al
   quitarla heredan esta y dejan de separarse en el siguiente cambio.
   ============================================================================ */

/* ---- 1. TARJETA DE CAPÍTULO: número, título, gancho, avance y pie ---- */
.capgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px;margin-bottom:var(--sp-9)}
.ccard{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-card);padding:var(--sp-12b) var(--sp-13b);
  box-shadow:var(--sh-1);cursor:pointer;transition:transform var(--mov-rapido);display:flex;flex-direction:column;min-height:150px}
.ccard:hover{transform:translateY(-3px)}
.ccard .chead{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.ccard .cnum{font-family:var(--display);font-size:var(--t-29);color:var(--accent-ink);line-height:var(--lh-pegado)}
.ccard .ctit{font-family:var(--display);font-size:var(--t-16b);color:var(--text);margin:var(--sp-4) 0 var(--sp-3);line-height:var(--lh-titulo)}
.ccard .cgk{font-size:var(--t-12);color:var(--text-soft);line-height:var(--lh-normal);flex:1;overflow:hidden}
.ccard .cprogwrap{display:flex;align-items:center;gap:8px;margin:var(--sp-7) 0 var(--sp-1)}
.ccard .cprog{flex:1;height:6px;background:var(--bg);border:var(--hair-soft);border-radius:var(--r-pill);overflow:hidden}
.ccard .cprog-bar{height:100%;background:var(--accent-deep);border-radius:var(--r-pill);transition:width var(--mov-lento);color:var(--on-accent)}
.ccard .cprogtxt{font-size:var(--t-10b);font-weight:var(--w-max);color:var(--text-soft);white-space:nowrap}
.ccard .cfoot{display:flex;justify-content:space-between;align-items:center;margin-top:var(--sp-9)}
.ccard .copen{font-size:var(--t-12);color:var(--accent-ink);font-weight:var(--w-max)}
/* Terminada: el filete se tiñe y la barra pasa al verde de «hecho». La tarjeta NO cambia de
   forma ni de tamaño, para que la rejilla no baile mientras se va completando. */
.ccard-done{border-color:var(--accent-ink)}
.ccard-done .cprog-bar{background:var(--ok)}
.ccomplete{font-size:var(--t-11);font-weight:var(--w-max);color:var(--accent-ink);background:var(--bg);
  border:var(--hair-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-10);cursor:pointer;
  transition:var(--mov-rapido);flex-shrink:0}
.ccomplete:hover{background:var(--accent);color:var(--on-accent)}
.ccomplete.on{background:var(--ok);border-color:var(--ok);color:var(--on-solid)}
/* LA PASTILLA DE RECUENTO VA SOBRE LA SUPERFICIE MEDIA, NO SOBRE LA MARCADA (2026-08-13).
   Iba sobre `--surface-strong`, que es la mas oscura de las tres, y con el acento haciendo
   de letra encima. Medido en la marca de un cliente: 4,28 en tema claro, por debajo del 4,5
   que pide un texto pequeno. Y en oscuro daba 4,50 clavado, o sea aprobando por el borde.
   Sobre la superficie media sube a 4,78 y 5,22, y la pastilla se sigue distinguiendo del
   papel. Lo caza el control del tablero publicado, recorriendo las dieciocho vistas. */
.pill{display:inline-block;background:var(--surface-alt);color:var(--accent-ink);border-radius:var(--r-sm);
  padding:var(--sp-1) var(--sp-7);font-size:var(--t-11);font-weight:var(--w-max);margin-left:var(--sp-5)}
.cnumbig{font-family:var(--display);font-size:var(--t-42);color:var(--accent-ink);line-height:var(--lh-pegado);
  min-width:56px;text-align:center;flex-shrink:0}

/* ---- 2. TARJETA DE CANCIÓN: número, tipo, título, dónde entra y acciones ---- */
.songrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:14px}
.soncard{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-card);padding:var(--sp-13) var(--sp-14);
  box-shadow:var(--sh-1);display:flex;flex-direction:column;gap:7px}
.soncard.done{border-color:var(--accent-ink)}
.sonhead{display:flex;align-items:center;gap:9px}
.sonnum{font-size:var(--t-12);font-weight:var(--w-max);color:var(--accent-ink);background:var(--surface-alt);
  border-radius:var(--r-pill);padding:var(--sp-2) var(--sp-8)}
.sontag{font-size:var(--t-10b);font-weight:var(--w-max);text-transform:uppercase;letter-spacing:.5px;
  background:var(--accent);color:var(--on-accent);border-radius:var(--r-pill);padding:var(--sp-3) var(--sp-9)}
.sontag.ins{background:var(--text-dim);color:var(--surface)}
.soncard h3.sontit{margin:0;font-size:var(--t-18);font-family:var(--display);line-height:1.18;cursor:pointer}
.sones{font-size:var(--t-13);color:var(--text-dim);font-style:italic}
.sondesc{font-size:var(--t-12b);color:var(--text-dim);margin:0;line-height:var(--lh-normal)}
.sonwhen{font-size:var(--t-12);color:var(--text-dim);line-height:var(--lh-normal)}
.sonwhen b{color:var(--accent-ink);font-size:var(--t-10b);text-transform:uppercase;letter-spacing:.5px;display:block}
.sinaudio{font-size:var(--t-12);color:var(--text-dim);background:var(--surface-alt);border-radius:var(--r-9);
  padding:var(--sp-8) var(--sp-11);margin:var(--sp-1) 0 var(--sp-3);line-height:var(--lh-normal)}
.sonacc{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:auto;padding-top:var(--sp-3)}
.sonopen{font-size:var(--t-12b);font-weight:var(--w-fuerte);border:var(--hair-soft);background:var(--surface);
  color:var(--text);border-radius:var(--r-9);padding:var(--sp-7) var(--sp-12);cursor:pointer;font-family:inherit;text-decoration:none;
  transition:background var(--mov-rapido),border-color var(--mov-rapido)}
.soncard .addbtn{font-size:var(--t-12b);font-weight:var(--w-fuerte);border:var(--hair-soft);background:var(--surface);
  color:var(--text);border-radius:var(--r-9);padding:var(--sp-7) var(--sp-12);cursor:pointer;font-family:inherit;
  transition:background var(--mov-rapido),border-color var(--mov-rapido)}
/* Tampoco tenían estado de ratón encima (CEO, 2026-08-11). Mismo gesto que el botón
   fantasma, para que un botón sea un botón se llame como se llame. */
.sonopen:hover,.soncard .addbtn:hover{background:var(--surface-alt);border-color:var(--text)}

/* ---- 3. TARJETA DE PORTADA: rejilla, título, pie y ficha de datos ---- */
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-top:var(--sp-14)}
.card-grid.mini{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin-top:0}
.card-grid.mini .card{padding:var(--sp-12)}
.card__t{font-family:var(--display);font-size:var(--fs-lg);font-weight:var(--w-fuerte);line-height:var(--lh-subtitulo)}
.card__foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:auto;padding-top:var(--sp-5)}
.chip{font-size:var(--fs-xs);padding:var(--sp-2) var(--sp-8);border-radius:var(--r-pill);
  background:var(--surface-alt);border:var(--hair-soft);white-space:nowrap}
/* La ficha de datos: dos columnas, el nombre del dato a la izquierda y su valor a la derecha.
   Es lo que usa el bloque de «Producción» de la portada de una película. */
.film-spec{display:grid;grid-template-columns:minmax(8.5rem,auto) 1fr;gap:6px 16px;align-items:baseline}
.film-spec-k{font-size:var(--t-13);color:var(--text-dim)}
.film-spec-v{font-size:var(--t-13);color:var(--text)}

/* LA MISMA FICHA, EN REJILLA (2026-08-11). La forma de dos columnas se lee bien cuando los
   valores son párrafos, y desperdicia medio ancho cuando son cuatro palabras: en una tarjeta
   de ancho completo el nombre del dato ocupa 8,5 rem, el valor otras cinco, y el resto de la
   línea se queda vacío. Aquí cada dato es una celda con su nombre encima, y caben tantas
   columnas como quepan de verdad.

   El ancho de cada celda lo manda la PISTA de la rejilla, no lo que hay dentro: por eso el
   `min-width:0` de la celda y el corte de palabra del valor: sin ellos, un correo largo o una
   ruta ensancha su columna y descuadra la fila entera.

   Un dato que trae varias piezas dentro (etiquetas, una nota al pie) se marca con `--ancha` y
   ocupa la fila entera, en vez de pelearse por una columna estrecha.

   La columna mínima son 18 rem y no menos: medido en el navegador, con 15 rem caben cuatro
   columnas en una tarjeta de 1.094 px, la ficha solo trae tres datos cortos y la cuarta se
   queda vacía a la derecha, que es justo lo que había que quitar. Con 18 rem caben tres y la
   fila se llena entera.

   Se escribe con las DOS clases (`.film-spec.film-spec--rejilla`) a propósito: la hoja de cada
   tablero vuelve a declarar `.film-spec` después de esta, y con una sola clase la pisaría. */
.film-spec.film-spec--rejilla{grid-template-columns:repeat(auto-fit,minmax(18rem,1fr));
  gap:var(--sp-12) var(--sp-14);align-items:start}
.film-spec--rejilla .film-spec-celda{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}
.film-spec--rejilla .film-spec-celda--ancha{grid-column:1/-1}
.film-spec--rejilla .film-spec-k{font-size:var(--fs-xs);text-transform:uppercase;
  letter-spacing:var(--ls-rotulo-ancho);color:var(--text-dim)}
.film-spec--rejilla .film-spec-v{min-width:0;overflow-wrap:anywhere}
@media(max-width:640px){.film-spec.film-spec--rejilla{grid-template-columns:1fr}}

/* --- CAMPO ESCRIBIBLE A MANO DENTRO DE UNA FICHA (2026-08-11) ---
   Un dato que el tablero calcula pero que alguien tiene que poder corregir a mano sin tocar un
   archivo: quién firma la pieza, con qué cuenta se genera. Se ve como un dato más hasta que se
   pincha, y lo escrito se guarda en el servidor igual que un comentario.
   Se escribe con `<input>` de verdad, no con un div editable: así funcionan el tabulador, el
   pegado y el teclado del móvil sin código propio. */
.field-inline{width:100%;min-width:0;font-family:inherit;font-size:inherit;color:var(--text);
  background:var(--surface-alt);border:var(--hair-soft);border-radius:var(--r-in);
  padding:var(--sp-5) var(--sp-9);transition:border-color var(--mov-rapido),background var(--mov-rapido)}
.field-inline::placeholder{color:var(--text-soft)}
.field-inline:hover{border-color:var(--text-dim)}
.field-inline:focus{outline:2px solid var(--accent-ink);outline-offset:1px;
  background:var(--surface);border-color:var(--accent-ink)}
/* Confirmación de que lo escrito llegó al servidor. Vive un momento y se va sola: un aviso
   permanente al lado de cada campo convierte la ficha en un panel de alarmas. */
.field-ok{font-size:var(--fs-xs);color:var(--ok-ink);font-weight:var(--w-fuerte);
  opacity:var(--op-nada);transition:opacity var(--mov-medio)}
.field-ok.is-on{opacity:var(--op-total)}
.field-row{display:flex;align-items:center;gap:var(--sp-7);min-width:0}
.field-row .field-inline{flex:1 1 auto}

.grp{border:var(--hair-soft);border-radius:var(--r-lg);margin-bottom:var(--sp-11);overflow:hidden;background:var(--surface)}
.grp__head{display:flex;align-items:center;justify-content:space-between;padding:var(--sp-12) var(--sp-14);cursor:pointer;font-weight:var(--w-fuerte)}
.grp__head .n{font-size:var(--fs-sm);color:var(--text-dim);font-weight:var(--w-medio)}
.grp__body{padding:0 var(--sp-14) var(--sp-13);display:none}
.grp.open .grp__body{display:block}
.grp .chev{transition:transform var(--mov-medio)}
.grp.open .chev{transform:rotate(90deg)}

/* ============ ANIMACIONES ============ */
@keyframes floatHover{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}
@keyframes fadeUp{from{opacity:var(--op-nada);transform:translateY(10px)}to{opacity:var(--op-total);transform:none}}
.reveal.in{animation:fadeUp .5s ease}
.floaty:hover{animation:floatHover 1.6s ease-in-out infinite}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}.reveal{opacity:1}}

/* ============ VENTANA DE DETALLE (armazón) ============
   Solo el armazón (fondo, apertura, animación de entrada): el contenido de la
   ficha (cabecera, cuerpo, botón de cerrar) lo define cada tablero, porque
   cambia de una serie a otra. */
.dv{position:fixed;inset:0;background:var(--veil-ico);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
  display:none;align-items:flex-start;justify-content:center;padding:var(--sp-19b) var(--sp-15);z-index:var(--capa-ventana);overflow-y:auto}
.dv.open{display:flex}
@keyframes dvIn{from{opacity:var(--op-nada);transform:translateY(14px) scale(.985)}to{opacity:var(--op-total);transform:none}}
@media(prefers-reduced-motion:reduce){.dv .box,.dv__panel{animation:none}}

/* Chrome de la tarjeta del modal (radio, sombra, cierre): selector doble a
   propósito. `.dv .box`/`.dv .close` es el naming de Sangre de Luna, `.dv__panel`/
   `.dv__close` el de la pieza de referencia; ningún tablero necesita renombrar su
   HTML para heredar el mismo aspecto. El contenido de dentro (cabecera, cuerpo,
   tablas de datos) sigue siendo propio de cada tablero. */
.dv .box,.dv__panel{background:var(--bg);border-radius:var(--r-hero);max-width:940px;width:100%;
  box-shadow:var(--sh-3);overflow-y:auto;overflow-x:hidden;max-height:calc(100vh - 72px);
  position:relative;animation:dvIn var(--mov-medio) ease}
.dv .close,.dv__close{position:absolute;top:16px;right:20px;background:var(--bg);border:var(--hair-soft);
  border-radius:var(--r-circle);width:36px;height:36px;font-size:var(--t-18);cursor:pointer;color:var(--text);z-index:var(--capa-fondo)}
.dv .close:hover,.dv__close:hover{background:var(--surface-alt)}

/* ============================================================================
   COMENTARIOS · «Comentar» es un COMPONENTE DEL SISTEMA (CEO, 2026-08-11)
   ============================================================================
   Añadir, editar y borrar un comentario sobre cualquier pieza: una tarjeta de
   personaje, un lugar, un prop, una prenda, una canción, el prompt de una
   micro-escena o una línea de la escaleta.

   HABÍA DOS RESOLUCIONES DE LA MISMA IDEA, y el CEO eligió una señalando el
   botón de la película: «ese botón de comentar es el que debería estar como
   estándar en el DS».

     · La de las SERIES abría una VENTANA encima de todo para escribir.
     · La de la PELÍCULA abre el campo DENTRO de la propia tarjeta, con varias
       líneas y firma.

   Gana la de la película, y con razón: una nota de rodaje («la mano rara en el
   segundo 4») se escribe mirando la pieza, no en una ventana que la tapa.

   POR QUÉ EL COMPONENTE RESPONDE A DOS JUEGOS DE NOMBRES. La película llama a
   sus piezas `film-note-*` y las series `nota`/`nbtn`. Renombrar en dieciocho
   tableros para que todos digan lo mismo es tocar dieciocho sitios para no
   cambiar nada a la vista, y ahí es donde se rompen las cosas. El componente
   entiende los dos vocabularios y cada tablero sigue pidiendo lo suyo. El
   nombre corto es el canónico: un tablero NUEVO usa `notas`/`nota`/`nbtn`.

   ANTES ESTABA COPIADO DIECIOCHO VECES y las copias se habían separado: las
   series pintaban el botón de guardar con nombres de color de la generación
   vieja (`--k9`, `--k10`, `--ink2`), que ya ni existen en el sistema. Por eso
   el mismo botón se veía distinto según el tablero. */

/* ---- el bloque, a lo ancho y debajo del contenido ----
   NUNCA dentro del pie de la tarjeta: el pie es una fila flexible y estrangula
   el texto letra a letra (gotcha 156). Se separa con aire, jamás con un filete:
   un filete dentro de una tarjeta es borde decorativo, y está vetado. */
.notas,.film-notes{width:100%;margin-top:var(--sp-8);display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.notas__l,.film-notes-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px;width:100%}
.film-notes-list li{padding-left:0;display:flex;gap:10px;align-items:flex-start;justify-content:space-between}
.film-notes-list li::before{display:none}

/* ---- un comentario ya guardado ---- */
.nota{display:flex;gap:8px;align-items:flex-start;justify-content:space-between;background:var(--surface);
  border-radius:var(--r-in);padding:var(--sp-7) var(--sp-9);font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--text)}
.nota__t,.film-note-txt{flex:1;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;color:var(--text)}
.nota__a,.film-note-acc{display:flex;gap:2px;flex:0 0 auto}
/* Quién lo escribió: el nombre en negrita fuerte, el resto en el tono normal */
.nota__quien,.film-note-who{color:var(--text);font-weight:var(--w-max)}

/* ---- los botones del comentario ----
   `.nbtn` es el de icono (editar, borrar): sin fondo ni filete hasta que se pasa
   por encima. `--add` es el de abrir («Comentar»), que va en el acento como
   letra. `--ok` es el de guardar, sólido en el acento. */
/* ESTE BOTON TAMBIEN TIENE QUE TENER FORMA (2026-08-13).
   Iba con el fondo transparente y sin filete, o sea que «Cancelar» era texto suelto: exacto
   el mismo defecto que el CEO senalo con captura en el boton de comentar, que se arreglo
   ahi al lado y a este no le llego. Un boton sin caja no se lee como boton por muy boton que
   sea en el codigo (gotcha 198). Ahora lleva el filete fino de la casa y el aire de los
   demas, asi que se reconoce en reposo sin necesidad de pasarle el raton. */
.nbtn{background:transparent;border:1px solid var(--rule);color:var(--text-dim);font:inherit;font-size:var(--fs-sm);cursor:pointer;
  border-radius:var(--r-in);padding:var(--sp-4) var(--sp-10);line-height:var(--lh-normal);display:inline-flex;align-items:center;gap:6px;
  transition:background var(--mov-rapido),border-color var(--mov-rapido)}
.nbtn:hover{background:var(--surface-alt);border-color:var(--text-soft);text-decoration:none}
/* «Comentar» ES UN BOTON, CON SU FORMA (CEO, 2026-08-11, con captura).
   Estaba escrito como texto suelto en el acento, sin caja, sin filete y sin aire, y al
   pasar el raton por encima lo unico que hacia era SUBRAYARSE. Dos fallos en una linea:
   un boton sin forma no se lee como boton (gotcha 198), y el subrayado es la senal de un
   enlace, no de un boton. Ahora lleva la misma geometria que el resto de botones del
   sistema, y al pasar el raton se enciende el fondo, como todos. */
.nbtn--add{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  padding:var(--sp-6) var(--sp-11b);border-radius:var(--r-pill);border:0;
  background:var(--surface-strong);color:var(--text);font-weight:var(--w-fuerte);
  text-decoration:none;transition:filter var(--mov-rapido)}
/* El acento se queda SOLO en el dibujo del mas, no en la palabra: asi el boton se lee
   igual que los otros de su misma tarjeta («Copiar prompt», «Ver prompt») y no compite
   con ellos, que es lo que pasaba cuando la palabra entera iba en lima. */
.nbtn--add .nico{color:var(--accent-ink)}
.nbtn--add:hover{filter:brightness(1.14);text-decoration:none}
.nbtn--ok{background:var(--accent);color:var(--on-accent);font-weight:var(--w-fuerte);padding:var(--sp-8) var(--sp-13);border-radius:var(--r-in)}
.nbtn--ok:hover{background:var(--accent);filter:brightness(.96);color:var(--on-accent)}
.nico{width:15px;height:15px;display:block;flex-shrink:0}
.nbtn--add .nico{width:14px;height:14px}
/* En la película los dos iconos van dentro de botones fantasma, sin filete */
.film-note-acc .btn-ghost{padding:var(--sp-4) var(--sp-6);border-color:transparent}
.film-notes .ico{width:15px;height:15px;stroke-width:1.9}
.film-note-add{margin-top:var(--sp-7)}

/* ---- EL EDITOR CANÓNICO: dentro de la tarjeta, varias líneas ----
   Una caja de una sola línea no vale: en ella no cabe una nota de rodaje, y el
   navegador no deja poner fecha ni firma. */
.nota-form,.film-note-form{width:100%;margin-top:var(--sp-9);display:flex;flex-direction:column;gap:8px}
.nota-input,.film-note-input{width:100%;min-height:76px;padding:var(--sp-9) var(--sp-11);border-radius:var(--r-in);
  border:var(--hair-soft);background:var(--surface);color:var(--text);
  font-family:inherit;font-size:var(--fs-sm);line-height:var(--lh-normal);resize:vertical}
.nota-input:focus,.film-note-input:focus{outline:2px solid var(--ink);outline-offset:1px}
.nota-btns,.film-note-btns{display:flex;gap:8px}

/* ---- EL EDITOR EN VENTANA: solo para lo que todavía no ha migrado ----
   Esta es la resolución que el CEO NO eligió. Se queda porque siete tableros de
   serie aún abren una ventana desde su propio motor, y quitarle el estilo los
   dejaría con una ventana sin pintar. Se retira cuando esos motores pasen al
   editor de dentro de la tarjeta. Un tablero NUEVO no la usa. */
.notadlg{position:fixed;inset:0;z-index:var(--capa-ventana);background:var(--veil-ico);display:flex;align-items:center;
  justify-content:center;padding:var(--sp-15)}
.notadlg[hidden]{display:none}
.notadlg__box{background:var(--surface);border-radius:var(--r-lg);box-shadow:var(--sh-1);padding:var(--sp-16);
  width:min(560px,100%);display:flex;flex-direction:column;gap:10px}
.notadlg__box h3{margin:0;font-family:var(--display);font-size:var(--t-20);font-weight:var(--w-fuerte);color:var(--text)}
.notadlg__h{margin:0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--text-dim)}
.notadlg__box textarea{width:100%;font:inherit;font-size:var(--t-14);line-height:var(--lh-normal);color:var(--text);
  background:var(--bg);border:var(--hair-soft);border-radius:var(--r-in);padding:var(--sp-10) var(--sp-11b);resize:vertical}
.notadlg__box textarea:focus-visible{outline:2px solid var(--accent-ink);outline-offset:1px}
.notadlg__a{display:flex;justify-content:flex-end;gap:8px;margin-top:var(--sp-1)}

/* ============ RESPONSIVE (genérico) ============
   Topbar y filtros se apilan en pantallas pequeñas. El comportamiento del
   menú lateral en móvil (off-canvas, estático apilado...) NO va aquí: cada
   tablero lo decide según su propia estructura, y lo declara en su propio
   dashboard.css a partir de estos mismos tokens. */
@media(max-width:640px){
  .stats{grid-template-columns:repeat(2,1fr)}
}

/* ============================================================================
   PIEZAS DE CONTENIDO DE UN TABLERO (subidas al sistema el 2026-08-10)
   ============================================================================
   Hasta hoy vivían copiadas en los SIETE tableros de serie y en ninguna parte
   del sistema. Siete copias de lo mismo son siete sitios donde tocar para
   cambiar una cosa, y la garantía de que dentro de un mes ya no se parecen.

   Son las que hacen rico un tablero: la ficha con su foto, el botón que va
   encima de la imagen, la tira de miniaturas, el avatar, la lista de
   pendientes. Salen del tablero de Punto Ciego, que es el canónico.
   ============================================================================ */

/* el hueco de la foto de una ficha */
.ph,.lh,.dv .dvhead .por{position:relative}
.ph::after,.lh::after,.dv .dvhead .por::after{content:"⤢";position:absolute;top:8px;right:8px;background:var(--veil-ico);color:var(--on-veil);width:27px;height:27px;border-radius:var(--r-md);display:flex;align-items:center;justify-content:center;font-size:var(--t-16);line-height:var(--lh-pegado);pointer-events:none;z-index:var(--capa-fondo)}
.ph,.lh{position:relative}
.ph .addbtn,.lh .addbtn{position:absolute;right:8px;bottom:8px;z-index:var(--capa-fondo);background:var(--veil-btn);color:var(--on-veil);border:0;border-radius:var(--r-9);padding:var(--sp-6) var(--sp-10);font-size:var(--t-12);font-weight:var(--w-fuerte);cursor:pointer;font-family:inherit;line-height:var(--lh-subtitulo);max-width:calc(100% - 16px);text-align:center}
/* `--k9` era un nombre de color de la generacion vieja y YA NO EXISTE. Con el, este boton
   encendido se quedaba con el fondo transparente encima de la foto: el estado «hecho» no
   se veia y no daba ningun error (CEO, 2026-08-11). Es el lima de la casa. */
.ph .addbtn.on,.lh .addbtn.on{background:var(--accent);color:var(--on-accent)}
/* Y AL PASAR EL RATON, ENCIMA DE LA FOTO, LA LETRA SE QUEDA CLARA (2026-08-13).
   La regla general de este boton pone el acento como LETRA al pasar el raton, y eso vale
   sobre el papel de la pagina. Pero esta version vive ENCIMA DE UNA FOTO, con un velo
   oscuro detras: ahi el acento rojo sobre el velo da 2,15, por debajo del 4,5 que pide un
   texto. Sobre un velo oscuro la letra se queda blanca y lo que cambia es el velo, que se
   cierra un punto. El fondo no depende del tema, asi que la letra tampoco. */
.ph .addbtn:hover,.lh .addbtn:hover{color:var(--on-veil);border-color:transparent;
  background:var(--veil-dark,rgba(15,12,10,.92))}

/* el botón que se pone ENCIMA de la imagen */
/* EL BOTÓN DE «HECHO» VA EN EL LIMA DE LA CASA, NO EN UN VERDE CUALQUIERA (CEO, 2026-08-10).
   Estaba en el verde de estado, que es un verde de semáforo y no es de la marca. El acento de la
   casa es el lima, y encima del lima la letra va oscura siempre. Cita: «esto debe ser en verde oh
   wow, no ese verde tío».
   Su versión sin fondo (el estado de «sin hacer») lleva filete y letra normal, NO atenuada: en
   cuanto este botón se pone encima de una foto oscura, una letra atenuada desaparece. */
.addbtn{font:600 11px/1.1 inherit;padding:var(--sp-5) var(--sp-10);border-radius:var(--r-sm);
  border:1px solid var(--rule);background:var(--surface);color:var(--text);cursor:pointer;
  transition:var(--mov-rapido) ease;white-space:nowrap}
.addbtn:hover{border-color:var(--accent-ink);color:var(--accent-ink)}
.addbtn.on{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
/* EL RATON ENCIMA DE UN BOTON YA ENCENDIDO VA AL TONO DE HOVER, NO AL «HONDO» (2026-08-13).
   Pedia `--accent-deep`, que por doctrina de la casa es el acento para una FORMA SIN LETRA
   ENCIMA. Aqui lleva letra, asi que era el tono equivocado por definicion. Medido en tema
   oscuro con la marca de un cliente: letra blanca sobre su `--accent-deep` da 3,19, y sobre
   su tono de hover da 4,93. Los tres trabajos del acento otra vez: elegir el que no toca es
   el fallo mas repetido del sistema. */
.addbtn.on:hover{background:var(--accent-hover,var(--accent));border-color:var(--accent-hover,var(--accent));color:var(--on-accent)}

/* la tira de miniaturas debajo de la foto */
.minigal{display:grid;grid-template-columns:repeat(5,1fr);gap:4px;padding:var(--sp-9) var(--sp-7) var(--sp-7)}
.minigal img{width:100%;aspect-ratio:1/1;object-fit:cover;object-position:center 20%;border-radius:var(--sp-4);cursor:zoom-in;opacity:var(--op-alto)}
.minigal img:hover{opacity:var(--op-total)}
.minigal .more{display:flex;align-items:center;justify-content:center;background:var(--k9);color:var(--on-accent);border-radius:var(--sp-4);font-size:var(--t-11);font-weight:var(--w-max);cursor:pointer;aspect-ratio:1/1}

/* la galería grande */
.gal img,.minigal img{position:relative}
.gal,.minigal{position:relative}
.gal{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:7px;margin-top:var(--sp-11)}
.gal img{width:100%;aspect-ratio:9/16;object-fit:cover;border-radius:var(--r-md);border:1px solid var(--rule);cursor:zoom-in}

/* la ficha de personaje */
.pcard{background:var(--card);border:1px solid var(--rule);border-radius:var(--sp-13);overflow:hidden;box-shadow:var(--shadow)}
.pcard .ph{width:100%;aspect-ratio:1/1;overflow:hidden;background:var(--k3);cursor:zoom-in}
.pcard .ph img{width:100%;height:100%;object-fit:cover;object-position:center 22%}
.pcard .pb{padding:var(--sp-11b) var(--sp-12b)}
.pcard .pb h3{margin:0;font-size:var(--t-17);line-height:var(--lh-titulo)}
.pcard .pb .rol{font-size:var(--t-12);color:var(--k10);font-weight:var(--w-max);margin:var(--sp-1) 0 var(--sp-6)}
.pcard .pb .corto{font-size:var(--t-12b);color:var(--ink2);line-height:var(--lh-normal)}

/* la ficha de lugar */
.lcard{background:var(--card);border:1px solid var(--rule);border-radius:var(--sp-13);overflow:hidden;box-shadow:var(--shadow)}
.lcard .lh{width:100%;aspect-ratio:3/2;overflow:hidden;background:var(--k3);cursor:zoom-in}
.lcard .lh img{width:100%;height:100%;object-fit:cover}
.lcard .lb{padding:var(--sp-11b) var(--sp-13)}
.lcard .lb h3{margin:0 0 var(--sp-5);font-size:var(--t-16);line-height:var(--lh-titulo)}
.lcard .lb p{margin:0;font-size:var(--t-12b);color:var(--ink2)}
.lcard .minigal{grid-template-columns:repeat(6,1fr)}
.lcard .minigal img{aspect-ratio:3/4}

/* ---- VISOR DE IMAGEN A PANTALLA COMPLETA ----
   El fondo velado que ocupa la pantalla entera. Vivía COPIADO en la hoja propia de cada tablero
   (57 copias medidas el 2026-08-10, en cuatro versiones distintas del mismo velo). Sube aquí para
   que el velo sea uno solo. Se abre añadiéndole la marca `open`. */
.lightbox{position:fixed;inset:0;background:var(--veil-dark);display:none;align-items:center;
  justify-content:center;z-index:var(--capa-encima);padding:var(--sp-16b);cursor:zoom-out}
.lightbox.open{display:flex}
/* La foto ampliada lleva las esquinas redondeadas como cualquier otra pieza de la casa. Llevaba
   8 píxeles, que a ese tamaño no se ven y la foto quedaba con esquina en pico (CEO, 2026-08-10).
   Pasa al radio de tarjeta, que es el que usan la ficha y el tablero de detrás. */
.lightbox img{max-width:100%;max-height:72vh;border-radius:var(--r-lg);object-fit:contain}

/* la columna de dentro del visor: imagen, contador y pie con el prompt */
.lbwrap{display:flex;flex-direction:column;gap:10px;max-width:min(920px,94vw);max-height:94vh;cursor:default}
.lbcap{background:var(--card);border:1px solid var(--rule);border-radius:var(--r-10);padding:var(--sp-10) var(--sp-12);overflow:auto;max-height:20vh}
.lbcap.muted{color:var(--mut);font-size:var(--t-12b);text-align:center}
.lbcaphead{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-4)}
.lbcaphead span{font-size:var(--t-10b);text-transform:uppercase;letter-spacing:.8px;color:var(--k10);font-weight:var(--w-max)}
.lbcopy{background:var(--k9);color:var(--on-accent);border:none;border-radius:var(--r-sm);padding:var(--sp-3) var(--sp-10);font-size:var(--t-11b);font-weight:var(--w-fuerte);cursor:pointer}
.lbcap p{margin:0;font-size:var(--t-12b);line-height:var(--lh-normal);color:var(--ink2);white-space:pre-wrap}
.lbx{position:fixed;top:18px;right:22px;z-index:var(--capa-encima);width:42px;height:42px;border-radius:var(--r-circle);border:none;background:var(--veil-light);color:var(--on-veil);font-size:var(--t-26);line-height:var(--lh-pegado);cursor:pointer;backdrop-filter:blur(4px)}
.lbx:hover{background:var(--veil-light-2)}
.lbnav{position:fixed;top:50%;transform:translateY(-50%);z-index:var(--capa-encima);width:52px;height:52px;border-radius:var(--r-circle);border:none;background:var(--veil-light);color:var(--on-veil);font-size:var(--t-34);line-height:var(--lh-pegado);cursor:pointer;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding-bottom:var(--sp-3)}
.lbnav:hover{background:var(--veil-light-3)}
/* La flecha de ATRÁS tenía su sitio y la de ADELANTE no: al migrar el bloque se perdió
   `.lbnext`, y sin `right` una caja fija se queda donde la dejó el flujo, o sea pegada a la
   izquierda encima de su hermana. No se veía porque las 57 hojas propias aún la declaran.
   Detectado y repuesto el 2026-08-10, junto con su versión de móvil. */
.lbprev{left:20px}
.lbnext{right:20px}
.lbcount{align-self:center;font-size:var(--t-12);color:var(--veil-light-4);letter-spacing:.5px}
@media(max-width:640px){
  .lbnav{width:40px;height:40px;font-size:var(--t-26)}
  .lbprev{left:6px}
  .lbnext{right:6px}
}

/* el avatar redondo y la fila de reparto */
.avs{display:flex;gap:11px;flex-wrap:wrap;margin:var(--sp-9) 0 var(--sp-4)}
.avchip{display:flex;flex-direction:column;align-items:center;gap:4px;width:54px}
.av{width:48px;height:48px;border-radius:var(--r-circle);object-fit:cover;object-position:center 18%;border:2px solid var(--card);box-shadow:0 0 0 1px var(--rule);cursor:zoom-in}
.av.avset{border-radius:var(--r-10)}
.av.avprop{border-radius:var(--r-10);background:var(--on-solid);object-fit:contain;padding:var(--sp-1)}
.avchip span{font-size:var(--t-10);color:var(--ink2);text-align:center;line-height:var(--lh-titulo);max-width:54px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* la lista de pendientes */
.pendlist{list-style:none;margin:0;padding:0}
.pendlist li{display:flex;align-items:flex-start;gap:9px;padding:var(--sp-6) 0;font-size:var(--t-14);color:var(--ink);border-bottom:1px solid var(--rule)}
.pendlist li .pcheck{color:var(--mut);font-weight:var(--w-max);flex-shrink:0}
.pendlist li.done{color:var(--mut);text-decoration:line-through}
.pendlist li.done .pcheck{color:var(--ok-ink)}

/* la micro-escena */
.micro{border-top:1px solid var(--rule);padding:var(--sp-11) 0}
.micro .mh{font-size:var(--t-12b);font-weight:var(--w-max);color:var(--ink)}
.micro pre{background:var(--page);border:1px solid var(--rule);border-radius:var(--r-md);padding:var(--sp-8) var(--sp-10);font-size:var(--t-11b);line-height:var(--lh-normal);white-space:pre-wrap;color:var(--ink2);margin:var(--sp-4) 0;overflow-x:auto;font-family:ui-monospace,Menlo,monospace}
.micro .lbl{font-size:var(--t-10b);text-transform:uppercase;letter-spacing:.8px;color:var(--k10);font-weight:var(--w-max);margin-top:var(--sp-7)}
.micronav{position:sticky;top:0;z-index:var(--capa-fondo);display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:var(--sp-9) var(--sp-17b);margin:0 -28px var(--sp-12);background:var(--card);border-bottom:1px solid var(--rule);box-shadow:0 4px 12px var(--shade-soft)}
.micronav .mnlab{font-size:var(--t-10b);text-transform:uppercase;letter-spacing:.8px;color:var(--mut);font-weight:var(--w-max);margin-right:var(--sp-3)}
.micronav a{font-size:var(--t-11b);font-weight:var(--w-fuerte);color:var(--k10);background:var(--k0);border:1px solid var(--rule);border-radius:var(--r-sm);padding:var(--sp-2) var(--sp-8);cursor:pointer;white-space:nowrap}
.micronav a:hover{background:var(--k9);color:var(--on-accent)}
.micro .mhead{display:flex;justify-content:space-between;align-items:center;gap:10px}
.micro .mprogwrap{display:flex;align-items:center;gap:8px;margin:var(--sp-4) 0 var(--sp-6)}
.micro .mprog{flex:1;height:5px;background:var(--k0);border:1px solid var(--rule);border-radius:var(--r-pill);overflow:hidden}
.micro .mprog-bar{height:100%;background:var(--accent-deep);border-radius:var(--r-pill);transition:width var(--mov-lento);color:var(--on-accent)}
.micro .mprogtxt{font-size:var(--t-10);font-weight:var(--w-max);color:var(--mut);white-space:nowrap}
.micro-done .mprog-bar{background:var(--ok)}
.micro-done .mh{color:var(--ok-ink)}
.micronav a.mndone{background:var(--ok);color:var(--on-solid);border-color:var(--ok)}
.micronav a.mndone:hover{background:var(--ok-hover);color:var(--on-solid)}
.micro{scroll-margin-top:var(--sp-22)}

/* ==========================================================================
   COMPONENTES QUE ESTABAN REPETIDOS EN CADA TABLERO (CEO, 2026-08-11)
   ==========================================================================
   Nueve hojas de tablero declaraban estas mismas reglas, palabra por palabra.
   No eran variantes: eran copias. Suben aquí una sola vez y desaparecen de
   allí. Cambiar uno de estos componentes vuelve a ser tocar UN archivo.

   La colocación dentro de cada tablero (dónde se pega el bloque, qué ancho
   ocupa en esa rejilla) NO sube: eso sí es de cada pieza y se queda en su
   hoja. Lo que sube es cómo SE VE el componente.
   ========================================================================== */

/* --- bib --- */
.bib{display:grid;grid-template-columns:230px 1fr;gap:26px;align-items:start}
.bib-body .sec{margin-bottom:var(--sp-18);scroll-margin-top:var(--sp-15)}
.bib-body li{margin-bottom:var(--sp-4)}
.bib-nav a.on{background:var(--ink);color:var(--on-ink)}

/* --- capcard --- */
.capcard .caphead{display:flex;align-items:center;gap:14px;padding:var(--sp-11b) var(--sp-14);cursor:pointer}
.capcard .capt{flex:1;min-width:0}
.capcard .capt h3{margin:0;font-size:var(--t-15b);line-height:var(--lh-titulo)}
.capcard.open .capbody{display:block}
.capcard.open .chev{transform:rotate(90deg)}

/* --- card --- */
.card>.notas,.pcard>.notas{padding:0 var(--sp-12) var(--sp-12);margin-top:-2px}

/* --- cardfoot --- */
.cardfoot{padding:var(--sp-5) var(--sp-12) var(--sp-11);display:flex;justify-content:flex-end}

/* --- dv --- */
.dv .dvbody{padding:var(--sp-16) var(--sp-17b)}
.dv .dvhead .por{width:150px;flex-shrink:0}
.dv .sonaudio{height:40px;margin:var(--sp-3) 0 var(--sp-12)}
.dv .subh{display:flex;align-items:center;gap:9px}

/* --- escena --- */
.escena{margin:var(--sp-11) 0}

/* --- kv --- */
.kv{display:grid;grid-template-columns:auto 1fr;gap:5px 14px;font-size:var(--t-13b);margin:var(--sp-9) 0}

/* --- lgrid --- */
.lgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}

/* --- mc --- */
.mc-tag{display:inline-block;margin-left:var(--sp-5);font-size:var(--t-9);font-weight:var(--w-max);text-transform:none;letter-spacing:.3px;color:var(--on-solid);background:var(--warn);border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-7);vertical-align:middle}

/* --- mcomplete --- */
.mcomplete:hover{filter:brightness(1.08)}

/* --- micro --- */
.micro:first-child{border-top:none}

/* --- modeltag --- */
.modeltag{display:inline-block;margin-left:var(--sp-7);font-size:var(--t-9);font-weight:var(--w-max);text-transform:none;letter-spacing:.3px;color:var(--on-accent);background:linear-gradient(120deg,var(--tag-a),var(--tag-b));box-shadow:0 1px 3px var(--tag-glow);border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-8);vertical-align:middle}

/* --- pbtns --- */
.pbtns{display:flex;gap:7px;margin:var(--sp-4) 0 var(--sp-1)}
.pbtns .addbtn{margin-left:auto}

/* --- pendcat --- */
.pendcat{margin-bottom:var(--sp-16)}
.pendcat h3{font-size:var(--t-16);font-family:var(--display);margin:0 0 var(--sp-7);display:flex;align-items:center;gap:8px}

/* --- pgrid --- */
.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px}

/* --- shot --- */
.shot .pprompt{margin:0 0 var(--sp-7)}
.shot-t{display:inline-block;font-size:var(--t-10);font-weight:var(--w-max);color:var(--on-accent);background:linear-gradient(120deg,var(--tag-a),var(--tag-b));border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-8);letter-spacing:.4px;margin-bottom:var(--sp-6)}

/* --- shots --- */
.shots{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:var(--sp-5)}
.shots-3{grid-template-columns:repeat(3,1fr)}

/* --- sonaudio --- */
.sonaudio{width:100%;height:36px;margin:var(--sp-1) 0 var(--sp-3);border-radius:var(--r-9)}

/* --- soncount --- */
.soncount.over{background:var(--danger);color:var(--on-solid)}

/* --- sondh --- */
.sondh{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:var(--sp-5)}
.sondh h2{margin:0;font-size:var(--t-24);font-family:var(--display);line-height:var(--lh-titulo)}

/* --- sonlyrs --- */
.sonlyrs{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}

/* --- vestcard --- */
.vestcard .pb{padding:var(--sp-7) var(--sp-9)}

/* --- vestchar --- */
.vestchar{margin-bottom:var(--sp-17)}
.vestchar h2{font-size:var(--t-20);margin:0 0 var(--sp-9)}

/* --- vestgrid --- */
.vestgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}

/* --- wardrobe --- */
.wardrobe .av.avvest{width:40px;height:40px;object-fit:contain;background:var(--surface);border-radius:var(--r-xs)}
.wardrobe .avchip{gap:4px}

/* ==========================================================================
   COMPONENTES QUE ESTABAN REPETIDOS EN CADA TABLERO (CEO, 2026-08-11)
   ==========================================================================
   Nueve hojas de tablero declaraban estas mismas reglas, palabra por palabra.
   No eran variantes: eran copias. Suben aquí una sola vez y desaparecen de
   allí. Cambiar uno de estos componentes vuelve a ser tocar UN archivo.

   La colocación dentro de cada tablero (dónde se pega el bloque, qué ancho
   ocupa en esa rejilla) NO sube: eso sí es de cada pieza y se queda en su
   hoja. Lo que sube es cómo SE VE el componente.
   ========================================================================== */

/* --- acttitle --- */
.acttitle{font-family:var(--display);font-size:var(--fs-h2);font-weight:var(--w-medio);letter-spacing:var(--ls-medio);margin:var(--sp-16) 0 var(--sp-11);color:var(--text);display:flex;align-items:baseline;gap:10px}
.acttitle .cnt{font-size:var(--t-11b);font-family:var(--font);color:var(--text-soft);font-weight:var(--w-fuerte)}
.bib-body em{color:var(--text-soft)}
.bib-body h3{font-size:var(--t-22);color:var(--text);margin:0 0 var(--sp-9);border-bottom:var(--hair-soft);padding-bottom:var(--sp-7)}
.bib-body p{margin:0 0 var(--sp-11);color:var(--text-dim)}
.bib-body strong{color:var(--text)}
.bib-body ul{margin:0 0 var(--sp-11);padding-left:var(--sp-15);color:var(--text-dim)}
.bib-nav{position:sticky;top:20px;background:var(--surface);border:var(--hair-soft);border-radius:var(--r-card);padding:var(--sp-9);box-shadow:var(--sh-1)}
.bib-nav a{display:block;padding:var(--sp-6) var(--sp-10);border-radius:var(--r-md);font-size:var(--t-13);font-weight:var(--w-fuerte);color:var(--text-dim);cursor:pointer;line-height:var(--lh-subtitulo);margin-bottom:var(--sp-0)}
.bib-nav a:hover{background:var(--surface-strong);text-decoration:none}

/* --- capbody --- */
.capbody{display:none;padding:var(--sp-3) var(--sp-15) var(--sp-14) 74px;border-top:var(--hair-soft)}
.capbody .row{font-size:var(--t-12b);margin:var(--sp-8) 0;color:var(--text-dim)}
.capbody .row b{color:var(--text)}

/* --- capcard --- */
.capcard{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-card);margin-bottom:var(--sp-8);box-shadow:var(--sh-1);overflow:hidden}
.capcard .capt .gk{font-size:var(--t-12);color:var(--text-soft);margin-top:var(--sp-1)}
.capcard .chev{color:var(--text-soft);font-size:var(--t-13);transition:transform var(--mov-medio)}
.capcard .num{font-family:var(--display);font-size:var(--t-23);color:var(--accent-ink);min-width:40px;line-height:var(--lh-pegado)}

/* --- cjbtn --- */
.cjbtn{background:transparent;color:var(--accent-ink);border-color:var(--accent-ink)}

/* --- cpbtn --- */
.cpbtn{background:var(--k9);color:var(--on-accent);border-color:var(--k10)}
.cpbtn,.jbtn,.cjbtn{font-size:var(--t-11);font-weight:var(--w-fuerte);border-radius:var(--r-sm);padding:var(--sp-3) var(--sp-10);cursor:pointer;border:var(--hair-soft)}

/* --- dv --- */
.dv .dvhead{display:flex;gap:20px;padding:var(--sp-16b) var(--sp-17b);background:var(--surface);border-bottom:var(--hair-soft)}
.dv .dvhead .por img{width:150px;aspect-ratio:4/5;object-fit:cover;object-position:center 18%;border-radius:var(--r-card);border:var(--hair-soft);cursor:zoom-in}
.dv .dvhead .rol{color:var(--accent-ink);font-weight:var(--w-max);font-size:var(--t-14);margin:var(--sp-1) 0 var(--sp-7)}
.dv .dvhead h2{margin:0;font-size:var(--t-25);font-weight:var(--w-fuerte)}

/* --- escena --- */
.escena h4{margin:0 0 var(--sp-2);font-size:var(--t-13);color:var(--accent-ink);font-family:var(--font);text-transform:uppercase;letter-spacing:.5px}
.escena p{margin:0;font-size:var(--t-13b);color:var(--text-dim);line-height:var(--lh-normal)}

/* --- fichatag --- */
.fichatag{display:inline-block;margin-left:var(--sp-5);font-size:var(--t-9);font-weight:var(--w-max);letter-spacing:.3px;color:var(--text);background:var(--surface-strong);border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-7);vertical-align:middle}

/* --- jbtn --- */
.jbtn{background:transparent;color:var(--accent-ink)}
.jbtn:hover{background:var(--bg)}

/* --- jsonbox --- */
.jsonbox{margin:var(--sp-3) 0 var(--sp-1);border:var(--hair-soft);border-radius:var(--r-9);padding:var(--sp-7);background:var(--bg)}
.jsonbox .pjson{margin:0 0 var(--sp-5);font-size:var(--t-11);white-space:pre-wrap;word-break:break-word;color:var(--text-dim)}

/* --- kv --- */
.kv dd{margin:0;color:var(--text-dim)}
.kv dt{color:var(--text-soft);font-weight:var(--w-max)}

/* --- mbtn --- */
.mbtn{background:var(--surface-strong);color:var(--accent-ink);border:var(--hair-soft);border-radius:var(--r-9);padding:var(--sp-5) var(--sp-11b);font-size:var(--t-12b);font-weight:var(--w-max);cursor:pointer;font-family:inherit;margin-top:var(--sp-9)}

/* --- mcomplete --- */
.mcomplete{font-size:var(--t-11);font-weight:var(--w-max);color:var(--on-accent);background:var(--accent);border:none;border-radius:var(--r-md);padding:var(--sp-3) var(--sp-11);cursor:pointer;transition:var(--mov-rapido);flex-shrink:0}
.mcomplete.on{background:var(--ok);color:var(--on-solid)}

/* --- micro --- */
.micro .mmeta{font-size:var(--t-12);color:var(--text-soft);margin:var(--sp-1) 0 var(--sp-5)}

/* --- noend --- */
.noend{font-size:var(--t-11b);color:var(--text-soft);font-style:italic;background:var(--surface-strong);border-radius:var(--r-md);padding:var(--sp-5) var(--sp-10);margin:var(--sp-1) 0 var(--sp-7)}

/* --- pendcat --- */
.pendcat .pendcount{font-size:var(--t-11);color:var(--text-soft);font-weight:var(--w-fuerte);background:var(--bg);border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-7)}

/* --- shot --- */
.shot{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-10);padding:var(--sp-9) var(--sp-10)}

/* --- soncard --- */
.soncard .addbtn,.dv .sonacc .addbtn{font-size:var(--t-12b);font-weight:var(--w-fuerte);border:var(--hair-soft);background:var(--surface);color:var(--text);border-radius:var(--r-9);padding:var(--sp-7) var(--sp-12)}

/* --- soncopy --- */
.soncopy{margin-left:auto;font-size:var(--t-11b);font-weight:var(--w-fuerte);border:var(--hair-soft);background:var(--surface);color:var(--text);border-radius:var(--r-md);padding:var(--sp-4) var(--sp-11);cursor:pointer;font-family:inherit;letter-spacing:0;text-transform:none}

/* --- soncount --- */
.soncount{font-size:var(--t-11);color:var(--text-dim);background:var(--surface);border-radius:var(--r-pill);padding:var(--sp-1) var(--sp-7);font-weight:var(--w-fuerte);letter-spacing:0;text-transform:none}

/* --- sonpre --- */
.sonpre,.sonlyr{margin:0;padding:var(--sp-11b) var(--sp-12b);background:var(--surface);border-radius:var(--r-in);font-size:var(--t-13);line-height:var(--lh-lectura);white-space:pre-wrap;word-break:break-word;font-family:inherit;color:var(--text)}

/* --- subh --- */
.subh{font-size:var(--t-12b);text-transform:uppercase;letter-spacing:1.1px;color:var(--text-soft);margin:var(--sp-14) 0 var(--sp-7);font-weight:var(--w-max)}

/* --- vestcard --- */
.vestcard{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-12);overflow:hidden;box-shadow:var(--sh-1)}
.vestcard .corto{font-size:var(--t-11b);color:var(--text-dim);line-height:var(--lh-subtitulo);margin-top:var(--sp-2)}
.vestcard .ph{width:100%;position:relative;cursor:zoom-in;background:var(--surface-strong)}
/* LA IMAGEN LLENA SU CAJA (CEO, 2026-08-11, con captura). Estaba en `contain`, que encaja
   la foto entera dentro del hueco y deja franjas del fondo a los lados: la prenda salia
   flotando en una caja mas grande que ella y la rejilla parecia descuadrada. `cover` la
   recorta por donde sobra y la caja queda llena, como en el resto de tarjetas del sistema.
   Se sigue viendo la prenda entera al ampliar, que es donde importa: el visor si usa
   `contain` a proposito, porque ahi el fin es ver la pieza completa. */
.vestcard .ph img{width:100%;height:100%;object-fit:cover;object-position:center}
.vestcard .vestblock{font-size:var(--t-10);text-transform:uppercase;letter-spacing:.5px;color:var(--accent-ink);font-weight:var(--w-max)}

/* --- wardrobe --- */
.wardrobe{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:var(--sp-5) 0 var(--sp-7);padding:var(--sp-5) var(--sp-7);border-radius:var(--r-md);background:var(--surface)}
.wardrobe .wlab{font-size:var(--t-10);text-transform:uppercase;letter-spacing:.5px;color:var(--accent-ink);font-weight:var(--w-max)}

/* ============================================================================
   EL LECTOR CON FICHAS AL LADO (CEO, 2026-08-11)
   ============================================================================
   Un texto largo a la izquierda y una columna de fichas a la derecha. Cada
   nombre del texto que tiene ficha (una persona, un lugar, un objeto, una
   prenda) queda marcado, y al pulsarlo su ficha entra en la columna.

   Vivía SOLO en el tablero de Sangre de Luna, así que las otras seis series y
   cualquier tablero nuevo se quedaban con el texto pelado. Sube aquí con su
   programa al lado (`plantilla/assets/lector.js`), que es un archivo aparte del
   motor a propósito: un tablero que ya tiene motor propio no puede cargar el
   compartido sin que se peleen, pero sí puede cargar una caja de herramientas.

   Los colores de cada familia son los del sistema (`--fam-persona`, `--fam-lugar`,
   `--fam-objeto`, `--fam-prenda`), no los que tenía cada tablero por su cuenta:
   el de la película pintaba el lugar en azul y el de Sangre de Luna en morado.
   ============================================================================ */
.lector{display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,380px);
  gap:var(--sp-16b);align-items:start}
.lector-txt{min-width:0}
/* La columna se queda pegada mientras se lee, a la altura de la barra de arriba. */
.lector-side{position:sticky;top:105px}

/* LA MENCIÓN ES UNA ETIQUETA, NO UN ENLACE SUBRAYADO. Y va en `inline`, no en
   `inline-flex`: una píldora con caja propia crece más que la línea y separa los
   renglones del párrafo. Con `inline` y el recorte clonado, se acomoda al texto
   y el interlineado no se mueve. */
button.term{font:inherit;font-size:.93em;font-weight:var(--w-fuerte);line-height:inherit;
  display:inline;padding:var(--sp-1) var(--sp-7);margin:0;border:0;border-radius:var(--r-pill);
  cursor:pointer;-webkit-box-decoration-break:clone;box-decoration-break:clone;
  background:var(--t-bg,var(--surface-strong));color:var(--t-ink,var(--text));
  transition:background var(--mov-rapido) ease,color var(--mov-rapido) ease}
button.term::before{content:"";display:inline-block;width:5px;height:5px;
  border-radius:var(--r-circle);background:currentColor;opacity:var(--op-casi);
  margin-right:var(--sp-4);vertical-align:.12em}
button.term[data-tipo="personaje"]{--t-bg:var(--fam-persona-bg);--t-ink:var(--fam-persona)}
button.term[data-tipo="lugar"]{--t-bg:var(--fam-lugar-bg);--t-ink:var(--fam-lugar)}
button.term[data-tipo="prop"]{--t-bg:var(--fam-objeto-bg);--t-ink:var(--fam-objeto)}
button.term[data-tipo="vestuario"]{--t-bg:var(--fam-prenda-bg);--t-ink:var(--fam-prenda)}
/* La quinta familia: lo que no es persona, sitio, objeto ni prenda. Un pacto, una ley,
   un territorio. Existia en los datos desde el principio y NO estaba aqui. */
button.term[data-tipo="mundo"]{--t-bg:var(--fam-mundo-bg);--t-ink:var(--fam-mundo)}

/* NINGUN ESTADO SE QUEDA SIN COLOR (CEO, 2026-08-11, con captura y con razon).
   Esta regla decia `background:var(--t-ink)` a secas. Cuando una etiqueta era de un tipo
   sin color asignado, ese nombre no existia, la declaracion entera se anulaba, el fondo
   se quedaba TRANSPARENTE y la letra se pintaba del color del papel. Letra del color del
   fondo, encima de oscuro: invisible. Y no da ningun error, asi que paso todas las
   puertas y lo vio el CEO. Ahora cada color lleva detras el que se usa si el primero no
   existe, de modo que el peor caso posible sigue siendo legible. */
button.term:hover,button.term.on,button.term:focus-visible{
  background:var(--t-ink,var(--text));color:var(--surface,var(--bg))}
button.term.on::before{opacity:var(--op-total)}

/* La pista de uso, una sola vez arriba del texto y solo si hay algo marcado. */
.lector-ayuda{font-size:var(--t-12b);color:var(--text-dim);margin:0 0 var(--sp-12);
  display:flex;align-items:center;gap:7px}
.lector-ayuda::before{content:"";width:7px;height:7px;border-radius:var(--r-circle);
  background:var(--accent-ink);flex:0 0 auto}

/* La ficha de la columna. */
.lector-ficha{background:var(--surface);border:var(--hair-soft);border-radius:var(--r-lg);
  padding:var(--sp-14);display:flex;flex-direction:column;gap:var(--sp-7);box-shadow:var(--sh-1)}
.lector-foto{width:100%;aspect-ratio:3/4;object-fit:cover;border-radius:var(--r-in);
  background:var(--surface-alt)}
.lector-nombre{margin:0;font-family:var(--display);font-size:var(--t-20);
  font-weight:var(--w-fuerte);line-height:var(--lh-subtitulo);color:var(--text)}
.lector-sub{margin:0;font-size:var(--fs-sm);color:var(--text-dim)}
.lector-desc{margin:0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--text-dim)}
.lector-vacio{margin:0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--text-dim);
  background:var(--surface-alt);border-radius:var(--r-lg);padding:var(--sp-14)}

/* En pantalla estrecha la columna deja de estar al lado y se pone debajo: dos
   columnas en un móvil dejan el texto en una tira de cuatro palabras. */
@media (max-width:1024px){
  .lector{grid-template-columns:1fr}
  .lector-side{position:static;margin-top:var(--sp-12)}
  /* Apilada, la ficha ocupa TODO el ancho, y su foto con ella: una cara de mil
     pixeles de alto en mitad de la lectura. Aqui el limite va sobre la IMAGEN y
     la caja, nunca sobre el texto, que es lo que el CEO tiene vetado. */
  .lector-ficha{max-width:420px}
  .lector-foto{max-width:280px}
}

/* ============ MENU DE ANCLAS, ARRIBA (CEO, 2026-08-11) ============
   Las secciones de un documento largo se listan ARRIBA, en una tira que se
   queda pegada al desplazarse. Nunca en una columna a la izquierda: ahí se
   come el ancho del texto y, peor, compite con el menú del propio tablero, que
   ya está en esa banda. Dos columnas de navegación pegadas y el lector no sabe
   cuál es cuál. */
.anclas{position:sticky;top:0;z-index:var(--capa-fondo);display:flex;gap:var(--sp-7);
  flex-wrap:nowrap;overflow-x:auto;padding:var(--sp-9) 0 var(--sp-11);
  margin-bottom:var(--sp-13);background:var(--bg);border-bottom:var(--hair-soft);
  scrollbar-width:thin}
.anclas__a{flex:0 0 auto;padding:var(--sp-5) var(--sp-11);border-radius:var(--r-pill);
  border:var(--hair-soft);background:var(--surface);color:var(--text-dim);
  font-size:var(--t-13);font-weight:var(--w-fuerte);text-decoration:none;white-space:nowrap;
  transition:background var(--mov-rapido),border-color var(--mov-rapido),color var(--mov-rapido)}
.anclas__a:hover{background:var(--surface-alt);border-color:var(--text);color:var(--text)}
/* La sección en la que se está: en tinta, igual que la entrada activa del menú. */
.anclas__a.is-on{background:var(--ink);color:var(--on-ink);border-color:var(--ink)}

/* El separador de un documento. Filete de un píxel, que es un separador y no un
   borde decorativo: lo grueso está vetado. */
hr.sep{border:0;border-top:var(--hair-soft);margin:var(--sp-16b) 0}

/* ---------------------------------------------------------------------------
   TARJETA MINI, HORIZONTAL
   Pedida por el CEO el 2026-08-12 para las ideas descartadas. La pieza queda a
   la vista y sigue siendo reconocible por su imagen, pero ocupa una fila baja en
   vez de una tarjeta entera.

   Lleva SOLO tres cosas: la imagen a la izquierda, el nombre a la derecha en
   pequeno, y sus dos botones. Sin etiquetas, sin recuento y sin descripcion. Lo
   que no cabe en una fila baja no entra: si se le anaden campos deja de ser
   mini y vuelve a ocupar lo mismo que la grande, que es justo lo que se queria
   evitar.

   La imagen lleva medida FIJA y no se estira, para que doce piezas seguidas
   dibujen una columna recta. `object-fit:cover` recorta lo que sobra en vez de
   deformar la cara de nadie.
   --------------------------------------------------------------------------- */
.card-mini{
  display:flex;align-items:center;gap:var(--sp-8);
  padding:var(--sp-4);border-radius:var(--r-md);
  background:var(--surface);border:1px solid var(--line)}
.card-mini:hover{border-color:var(--text-dim)}

.card-mini__foto{
  flex:0 0 auto;width:78px;height:78px;border-radius:var(--r-sm);
  overflow:hidden;background:var(--surface-alt)}
.card-mini__foto img{width:100%;height:100%;object-fit:cover;display:block}
/* Sin imagen no se deja el hueco vacio: se pone la inicial, que sigue
   identificando la pieza en una lista larga. */
.card-mini__inicial{
  width:100%;height:100%;display:flex;align-items:center;justify-content:center;
  font-size:var(--fs-lg);font-weight:var(--w-fuerte);color:var(--text-dim)}

/* El texto ocupa el hueco que quede y se corta con puntos suspensivos. Sin
   `min-width:0` un titulo largo empuja los botones fuera de la fila: es el
   comportamiento por defecto de una fila flexible y no se ve venir. */
.card-mini__cuerpo{flex:1 1 auto;min-width:0}
.card-mini__t{
  font-size:var(--fs-sm);font-weight:var(--w-medio);color:var(--text);
  line-height:var(--lh-subtitulo);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.card-mini__mandos{flex:0 0 auto;display:flex;gap:var(--sp-2)}
.card-mini__mandos .btn-ghost{font-size:var(--fs-xs);padding:var(--sp-2) var(--sp-6)}

/* En pantalla estrecha los botones bajan debajo del nombre en vez de aplastarlo. */
@media (max-width:520px){
  .card-mini{flex-wrap:wrap}
  .card-mini__cuerpo{flex:1 1 100%;order:2}
  .card-mini__mandos{order:3}
}

/* La rejilla de mini va en CINCO columnas (CEO, 2026-08-12). En una sola columna
   la fila se estiraba de lado a lado de la pantalla y quedaba el nombre perdido
   en medio, con metros de vacio hasta los botones.
   `minmax(0, 1fr)` y no `1fr` a secas: sin el cero, una pieza de contenido ancho
   se niega a encoger por debajo de su tamano natural y desborda la columna. Es el
   fallo clasico de las rejillas y no avisa.
   Se baja de columnas segun cabe, hasta una en el movil. */
.grid-mini{display:grid;gap:var(--sp-2);grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:1500px){.grid-mini{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:1180px){.grid-mini{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:860px){ .grid-mini{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:560px){ .grid-mini{grid-template-columns:1fr}}

/* Boton de solo icono. El dibujo es pequeno; el sitio donde se pulsa NO: se
   mantiene en 32 pixeles de lado, que es lo minimo para acertar con el dedo.
   Un icono sin `title` ni etiqueta para lector de pantalla es un boton mudo, asi
   que las dos cosas van siempre en el marcado, no aqui. */
.btn-ico{
  display:inline-flex;align-items:center;justify-content:center;
  width:32px;height:32px;flex:0 0 auto;padding:0;
  border-radius:var(--r-sm);cursor:pointer;
  background:var(--surface-alt);border:1px solid var(--line);color:var(--text-dim)}
.btn-ico .ico{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2}
.btn-ico:hover,.btn-ico:focus-visible{
  background:var(--surface);color:var(--text);border-color:var(--text-dim)}
/* El «fuerte» es el mando principal de la pieza: el que se pulsa por defecto. */
.btn-ico--fuerte{background:var(--ink);color:var(--surface);border-color:var(--ink)}
.btn-ico--fuerte:hover,.btn-ico--fuerte:focus-visible{
  background:var(--text);color:var(--surface);border-color:var(--text)}

/* Con los mandos en icono, TODO cabe en una sola fila: imagen, nombre y los dos
   iconos a la derecha. Antes, con las palabras escritas, hacian falta dos filas.
   El nombre se lleva el hueco que sobre y se corta con puntos suspensivos; los
   iconos no encogen nunca. */
.grid-mini .card-mini{
  display:flex;align-items:center;flex-wrap:nowrap;gap:var(--sp-4);
  padding:var(--sp-3)}
.grid-mini .card-mini__foto{width:46px;height:46px}
.grid-mini .card-mini__cuerpo{flex:1 1 auto;min-width:0}
.grid-mini .card-mini__mandos{flex:0 0 auto;gap:var(--sp-1)}

/* ===========================================================================
   LAS PIEZAS QUE LA PLANTILLA PEDIA Y EL SISTEMA NO TENIA  ·  2026-08-12
   ===========================================================================
   La plantilla se armo con el HTML de un tablero de la generacion anterior, pero
   sus estilos se quedaron en la hoja propia de aquel tablero. El HTML pedia
   piezas que ninguna hoja del sistema definia, y salian desnudas. Una clase que
   nadie define NO da ningun error: simplemente no pinta, y el despliegue termina
   en verde con la pagina rota.

   Estas reglas NO estan inventadas: son las que ya usaban los tableros de
   peliculas, traidas aqui tal cual para que valgan para todos.
   =========================================================================== */

/* LA COLUMNA DE CONTENIDO. Las dos lineas que siguen son las que colocan el pie
   en el borde de abajo: la columna ocupa como minimo la altura de la ventana, y
   el contenido se estira para llenar lo que sobra. Sin ellas el pie se queda
   flotando justo debajo del texto, con media pantalla vacia por debajo. */
#shell{display:flex;flex-direction:column;min-height:100vh;min-width:0}
/* Sin ancho maximo: el contenido ocupa todo lo que le den. Decision del CEO,
   2026-08-12. Un tablero de comparar imagenes necesita el ancho entero. */
main{flex:1;padding:var(--sp-20) var(--sp-21) var(--sp-23);width:100%;min-width:0}

/* LA BARRA SUPERIOR CUANDO ES HERMANA DEL CONTENIDO, que es como la monta la
   plantilla. La regla general de `.topbar` lleva margenes negativos a los lados
   para que la banda llegue a los bordes de la pantalla, y eso da por hecho que la
   barra vive DENTRO de la zona con relleno. Colgada directamente de la columna no
   tiene contra que tirar: se sale 40 px por cada lado y empuja la pagina entera,
   con lo que se corta por la derecha todo lo demas. Aqui se le quitan.
   Medido el 2026-08-12: 40 px de desbordamiento, cero despues. */
#shell > .topbar{margin:0;padding:var(--sp-14) var(--sp-20) var(--sp-12)}


/* LOS BOTONES DE LA BARRA SUPERIOR, QUE VAN POR IDENTIFICADOR  ·  2026-08-12
   ---------------------------------------------------------------------------
   El de menu y el de tema no llevan clase: se identifican con almohadilla. El
   sistema no tenia reglas para ellos, asi que salian sin caja y sin borde, y el
   dibujo de dentro se pintaba a su tamano natural, que descuadra la barra entera.
   Copiadas del tablero de peliculas, donde ya estaban bien. */
#burger{display:none;font-size:var(--t-20);padding:var(--sp-3) var(--sp-7);
  border-radius:var(--r-in);border:none;background:none;color:var(--text);cursor:pointer}
#topbar-title{font-weight:var(--w-fuerte);font-size:var(--fs-lg);margin-right:auto}
#theme-btn,.theme-btn{width:38px;height:38px;border-radius:var(--r-pill);
  border:var(--hair-soft);display:inline-flex;align-items:center;justify-content:center;
  background:var(--surface);color:var(--text);cursor:pointer;padding:0;flex:none}
#theme-btn svg,.theme-btn svg{width:15px;height:15px;flex:none;
  transition:transform var(--mov-lento)}
#theme-btn:hover,.theme-btn:hover{background:var(--surface-alt)}
#theme-btn:focus-visible,.theme-btn:focus-visible{outline:2px solid var(--text);outline-offset:2px}
/* El boton se enciende en el MISMO ancho en el que el menu se aparta. */
@media (max-width:900px){#burger{display:inline-flex}}


/* SEPARACION ENTRE SECCIONES. Un titulo de seccion necesita aire por encima, o se
   lee como el pie de la seccion anterior en vez de como la cabecera de la suya.
   El sistema no tenia ninguna regla para esto, asi que los titulos salian pegados
   a las imagenes de arriba. Se pide el hueco por encima y poco por debajo: el
   titulo tiene que ir con lo que viene despues, no con lo que viene antes. */
/* Descendiente, no hijo directo: el contenido de cada vista se pinta dentro de una
   caja propia, asi que un titulo NUNCA cuelga directamente del contenido y la regla
   de hijo directo no llegaba a aplicarse. */
main h2{margin:var(--sp-21) 0 var(--sp-12);
  font-size:var(--fs-h2);font-weight:var(--w-fuerte);letter-spacing:var(--ls-titulo);
  line-height:var(--lh-titulo)}
main h2:first-child{margin-top:0}
main h3:not(.lcard h3):not(.card h3){margin:var(--sp-16) 0 var(--sp-8);
  font-size:var(--fs-h3);font-weight:var(--w-fuerte)}


/* EL BOTON DE DESCARGA SOBRE LA TARJETA, PEGADO AL DE AMPLIAR.
   Los dos tienen que leerse como un par, asi que comparten TODO menos el dibujo:
   mismo tamano (27), misma forma, mismo velo de fondo y la misma altura. El de
   ampliar vive arriba a la derecha, a 8 del borde, asi que este se pone a su
   izquierda, separado por 6: 8 + 27 + 6 = 41.
   Antes estaba a media altura de la foto, mas grande, redondo y de otro color:
   parecia un boton suelto caido en mitad de la imagen. */
.lcard .lh{position:relative}
.bajar-card{position:absolute;top:8px;right:41px;z-index:var(--capa-fondo);
  width:27px;height:27px;display:flex;align-items:center;justify-content:center;
  border-radius:var(--r-md);border:none;cursor:pointer;text-decoration:none;
  background:var(--veil-ico);color:var(--on-veil);
  transition:background var(--mov-rapido) var(--ease)}
.bajar-card:hover{background:var(--veil-btn)}
.bajar-card:focus-visible{outline:2px solid var(--on-veil);outline-offset:2px}
.bajar-card svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}

/* Medido: al pasar el raton en tema oscuro daba 1,18 sobre 1, o sea el dibujo
   se perdia. El velo de boton no cambia con el tema, asi que el blanco de
   encima se lee siempre. */
.bajar-card:hover{background:var(--veil-btn);transform:scale(1.06);box-shadow:var(--sh-2)}
.bajar-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.bajar-card svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}


/* PANTALLA ESTRECHA: EL MENU SE APARTA Y EL CONTENIDO OCUPA TODO  ·  2026-08-12
   ---------------------------------------------------------------------------
   Sin esto, el armazon se queda en dos columnas fijas tambien en un telefono: el
   menu se lleva 248 px de los 390 que hay, al contenido le quedan 142 y las ocho
   vistas se salen de lado. Medido antes de arreglarlo: la pagina pedia 546 px de
   ancho en un hueco de 390, y el titulo de portada se partia letra a letra.

   El menu pasa a estar fuera de la pantalla y entra deslizandose cuando se pulsa
   el boton de las tres rayas. Ese boton ya existia y no hacia nada: el motor le
   pone la marca `open` al menu, y ninguna hoja decia que hacer con ella.

   El corte va a 900 px, el mismo ancho en el que el sistema enciende el boton.
   Si los dos numeros no coinciden, aparece un boton que todavia no sirve, o el
   menu se aparta sin que haya con que sacarlo.
   --------------------------------------------------------------------------- */
@media (max-width:900px){
  #app,.app{grid-template-columns:1fr}
  #sidebar{position:fixed;left:-110%;top:0;bottom:0;z-index:var(--capa-menu);
    max-width:92vw;transition:left var(--mov-medio) var(--ease)}
  #sidebar.open{left:0;box-shadow:var(--sh-3)}
  /* El ajuste de capa de la barra en movil vive junto a la regla #topbar de
     mas abajo (misma pareja de selectores, despues de ella): un .topbar aqui
     perdia por especificidad contra el identificador y no hacia nada. */
  /* En pantalla estrecha el menu se aparta entero, asi que el estado «contraido»,
     que es cosa del escritorio, no debe estrecharlo ni quitarle las palabras: se
     enseña completo. (Fallo que el CEO ya habia cazado el 2026-07-11.) */
  html[data-side="collapsed"] #side-rail{width:var(--sidebar-w);padding:var(--sp-16) var(--sp-7)}
  html[data-side="collapsed"] #side-rail .nav-item>span,
  html[data-side="collapsed"] #side-rail .chev{display:inline}
  html[data-side="collapsed"] #side-rail .nav-item{justify-content:flex-start;
    padding:var(--sp-9) var(--sp-11)}
  #q{flex:1 1 100%;order:5}
  main{padding:var(--sp-16) var(--sp-13)}
}


/* LO QUE EL CONTROL DE CALIDAD DE INTERFAZ ENCONTRO MAL  ·  2026-08-12
   ===========================================================================
   Copiado del tablero de peliculas, que es la referencia. Antes esto lo tenia
   cada tablero en su hoja propia, y el que nacia de la plantilla se quedaba sin
   ello o con una version inventada.
   =========================================================================== */

/* LA BARRA SUPERIOR. Medido antes: 71 px de alto contra 61 de la referencia, con
   los controles alineados ARRIBA en vez de centrados y el titulo con 507 px de
   hueco a la derecha. Se pega tambien al identificador porque la plantilla usa
   los dos, y con relleno propio pierde la igualdad. */
#topbar,#shell > .topbar{position:sticky;top:0;z-index:var(--capa-pegado);margin:0;
  background:color-mix(in srgb,var(--bg) 84%,transparent);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  border-bottom:var(--hair-soft);padding:var(--sp-10) var(--sp-16b);
  display:flex;align-items:center;justify-content:normal;gap:12px;flex-wrap:wrap}

/* En pantalla estrecha la barra sube UNA capa por encima del cajon del menu.
   Sin esto, la regla de arriba deja la barra en --capa-pegado (20), el cajon
   abierto (--capa-menu, 40) la tapa entera, y el boton de hamburguesa queda
   debajo: el menu abre pero no hay forma de cerrarlo (QA del 16/08, tercera
   pasada). Va con el MISMO selector y DESPUES de la regla que compite, para
   ganar por orden y no por trucos de especificidad. */
@media (max-width:900px){
  #topbar,#shell > .topbar{z-index:calc(var(--capa-menu) + 1)}
}

/* EL BUSCADOR, con la misma medida que la referencia. */
#q{flex:0 1 260px;min-width:150px;padding:var(--sp-7) var(--sp-12);
  border-radius:var(--r-pill);border:var(--hair-soft);background:var(--surface);
  color:var(--text);font-family:inherit;font-size:var(--fs-md);
  transition:border-color var(--mov-medio)}
#q::placeholder{color:var(--text-dim)}
#q:focus{outline:none;border:1.5px solid var(--ink)}

/* EL CONTROL DE TAMANO DE LETRA. Medido antes: esquinas rectas y sin fondo,
   cuando la referencia lo tiene redondeado y sobre superficie. Y la letra del
   boton central no tenia ninguna regla en ninguna hoja. */
.zoom{display:inline-flex;align-items:center;flex:none;padding:var(--sp-1);
  background:var(--surface);border:var(--hair-soft);border-radius:var(--r-pill)}
.zoom button{padding:var(--sp-5) var(--sp-8);font-weight:var(--w-fuerte);
  display:inline-flex;align-items:center;justify-content:center;min-width:30px;
  line-height:var(--lh-pegado);border:none;background:none;color:var(--text-dim);
  cursor:pointer;font-family:inherit;border-radius:var(--r-pill)}
.zoom button.zoom-sign{font-size:var(--fs-lg);font-weight:var(--w-medio)}
.zoom button.zoom-rst{padding:var(--sp-5) var(--sp-7)}
.zoom .zoom-a{font-weight:var(--w-fuerte);font-size:var(--fs-md);line-height:1}
.zoom button:hover{background:var(--surface-alt);color:var(--text)}
.zoom button:focus-visible{outline:2px solid var(--text);outline-offset:-2px}

/* EL BOTON DE VOLVER ARRIBA. Estaba escrito a mano dentro del HTML del tablero,
   con su propio tamano, su propio fondo y su propia sombra: justo lo que la
   cabecera de la hoja propia prohibe, y ademas asi esquiva al comprobador.
   IMPORTANTE, el contraste: la version escrita a mano pintaba el dibujo con el
   color de la tinta sobre el lima de la casa al pasar el raton, y en tema oscuro
   la tinta ES crema. Medido: 1,02 sobre 1, o sea el dibujo desaparecia. Se
   resuelve dejandolo sobre superficie, como la referencia, sin pintar el fondo
   de lima. */
#scroll-top{position:fixed;right:22px;bottom:22px;width:44px;height:44px;
  border-radius:var(--r-pill);border:var(--hair-soft);background:var(--surface);
  color:var(--text);box-shadow:var(--sh-2);font-size:var(--t-18);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;padding:0;
  opacity:var(--op-nada);pointer-events:none;
  transition:opacity var(--mov-medio),transform var(--mov-medio);
  z-index:var(--capa-pegado)}
#scroll-top.show,#scroll-top.is-on{opacity:var(--op-total);pointer-events:auto}
#scroll-top:hover{transform:translateY(-2px);background:var(--surface-alt)}
#scroll-top:focus-visible{outline:2px solid var(--text);outline-offset:3px}
#scroll-top svg{width:21px;height:21px;fill:none;stroke:currentColor;
  stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
@media (max-width:640px){#scroll-top{right:16px;bottom:16px;width:40px;height:40px}}
@media print{#scroll-top{display:none}}

/* EL MENU LATERAL: fondo propio y pegado, como la referencia. Sin esto no tenia
   fondo y se quedaba quieto por accidente, porque su hijo si estaba pegado.
   OJO, regresion cazada por QA el 2026-08-16: lo PEGADO es solo de escritorio.
   Este bloque iba entero sin media query y, por ir mas abajo en el archivo con
   la misma especificidad, le ganaba al position:fixed del movil (linea ~1385):
   el menu quedaba clavado a ancho completo en pantalla estrecha y el boton de
   abrirlo no hacia nada. El fondo y la fila son de todos los anchos; la
   posicion pegada, solo a partir de 901px. */
#sidebar{display:flex;flex-direction:row;
  background:var(--surface);border-right:var(--hair-soft);z-index:var(--capa-menu)}
@media (min-width:901px){
  #sidebar{position:sticky;top:0;height:100vh}
}

/* EL ORNAMENTO DE LA PORTADA. */
.hero{position:relative;overflow:hidden}
.hero .star-bg{position:absolute;right:-40px;top:-40px;width:220px;height:220px;
  color:var(--accent);opacity:var(--op-alto);pointer-events:none}

/* EL PIE. En fila: el logotipo y la linea de texto a la misma altura. */
#foot,.foot{border-top:var(--hair-soft);padding:var(--sp-17) var(--sp-16b);
  color:var(--text-dim);font-size:var(--fs-sm);display:flex;align-items:center;gap:16px}
#foot p,.foot p{margin:0}
#foot strong,.foot strong{color:var(--text)}
.foot-logo-link{display:inline-flex;align-items:center;flex:none;
  border-radius:var(--r-xs);text-decoration:none}
.foot-logo-link:hover .foot-logo{opacity:var(--op-casi);transition:opacity var(--mov-rapido)}
.foot-logo-link:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
#foot .foot-logo,.foot .foot-logo{width:104px;height:auto;color:var(--ink);flex:none}

/* EL BUSCADOR de la barra superior. */
#q{flex:0 1 260px;min-width:150px;padding:var(--sp-7) var(--sp-12);
  border-radius:var(--r-pill);border:var(--hair-soft);background:var(--surface);
  font-size:var(--fs-md);color:var(--text);font-family:inherit;
  transition:border-color var(--mov-medio)}
#q::placeholder{color:var(--text-dim)}
#q:focus{outline:none;border:1.5px solid var(--ink)}

/* EL CONTROL DE TAMANO DE LETRA: tres botones que se leen como una sola pieza. */
.zoom{display:inline-flex;align-items:center;flex:none;
  border:var(--hair-soft);border-radius:var(--r-pill);overflow:hidden}
.zoom button{padding:var(--sp-5) var(--sp-8);font-weight:var(--w-fuerte);
  display:inline-flex;align-items:center;justify-content:center;min-width:30px;
  line-height:var(--lh-pegado);border:none;background:none;color:var(--text-dim);
  cursor:pointer;font-family:inherit}
.zoom button.zoom-sign{font-size:var(--fs-lg);font-weight:var(--w-medio)}
.zoom button:hover{background:var(--surface-alt);color:var(--text)}
.zoom button:focus-visible{outline:2px solid var(--text);outline-offset:-2px}

/* Las subsecciones del menu lateral. */
.sub-inner{display:flex;flex-direction:column;gap:var(--sp-1)}

/* El cuerpo de la ventana de detalle. */
.dv__body{padding:var(--sp-8) var(--sp-12) var(--sp-12);overflow-y:auto}

/* EL VISOR DE IMAGENES AMPLIADAS. */
#lb{position:fixed;inset:0;z-index:var(--capa-ventana);display:none;
  align-items:center;justify-content:center;flex-direction:column;gap:var(--sp-5);
  padding:var(--sp-8);background:var(--veil-dark);
  backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}
#lb.open{display:flex}
/* Con el visor abierto, la pagina de detras no se mueve con la rueda. */
html:has(#lb.open),body:has(#lb.open){overflow:hidden}
#lb .lb-img{display:flex;align-items:center;justify-content:center;
  max-width:min(92vw,1200px);max-height:74vh;overflow:hidden;border-radius:var(--r-md)}
#lb .lb-img img{display:block;max-width:100%;max-height:74vh;width:auto;height:auto;
  object-fit:contain;border-radius:var(--r-md)}
#lb .lb-ficha{max-width:min(92vw,720px);text-align:center;color:var(--on-veil);
  font-size:var(--fs-sm);line-height:1.5}
#lb .lb-close{position:fixed;top:var(--sp-5);right:var(--sp-5);z-index:var(--capa-encima)}
#lb .lb-bar{display:flex;align-items:center;justify-content:center;gap:var(--sp-5);flex-wrap:wrap}
#lb .lb-n{color:var(--on-veil);font-size:var(--fs-sm);font-variant-numeric:tabular-nums;
  min-width:64px;text-align:center}
/* Los botones viven sobre el velo oscuro, asi que no pueden heredar el color de la
   pagina: se quedarian en tinta oscura sobre fondo oscuro. */
#lb .btn-ghost{color:var(--on-veil);background:var(--veil-light);border-color:var(--veil-light-2)}
#lb .btn-ghost:hover{background:var(--veil-light-2);border-color:var(--veil-light-3)}
#lb .btn-ghost:focus-visible{outline:2px solid var(--on-veil);outline-offset:2px}
@media (max-width:640px){
  #lb .lb-img,.lb-img img{max-height:60vh}
  #lb .lb-close{top:var(--sp-3);right:var(--sp-3)}
}



/* LAS PARTES DE UNA TARJETA DE CIFRA. El motor las pinta con estos nombres
   (`stat__n` el numero, `stat__l` el rotulo, `stat__d` la nota de debajo), y el
   sistema solo tenia reglas para la nomenclatura antigua (`.stat .n`). Resultado:
   la cifra salia del mismo tamano que el texto, y la tarjeta perdia su jerarquia.
   Los tableros anteriores no lo notaban porque las llevan en su hoja propia.
   Vienen de ahi, con los tamanos fijos pasados al sistema. */
.stat__n{font-family:var(--display);font-size:var(--fs-stat);font-weight:var(--w-normal);
  color:var(--accent-ink);line-height:var(--lh-pegado);letter-spacing:var(--ls-titulo)}
.stat__n--txt{font-size:var(--fs-2xl);line-height:var(--lh-titulo);word-break:break-word}
.stat__l{font-size:var(--fs-xs);font-weight:var(--w-fuerte);margin-top:var(--sp-7);
  text-transform:uppercase;letter-spacing:var(--ls-rotulo-ancho);color:var(--text-dim)}
.stat__d{font-size:var(--fs-xs);color:var(--text-soft);margin-top:var(--sp-4);
  line-height:var(--lh-normal)}


/* LAS PIEZAS QUE FALTABAN, TRAIDAS DEL TABLERO DE PELICULAS  ·  2026-08-12
   ---------------------------------------------------------------------------
   Diecisiete piezas que el motor pinta y que ninguna hoja del sistema definia:
   las migas de navegacion, las listas limpias, la caja de prompt, las fichas de
   personaje y los dos botones del control de tamano de letra. Los tableros
   anteriores no lo notaban porque las llevan en su hoja propia; el que nace de la
   plantilla limpia se quedaba sin ellas y salian desnudas, sin dar ningun error.
   No estan inventadas: son las suyas, copiadas tal cual.
   --------------------------------------------------------------------------- */
.card__d{font-size:var(--fs-sm);color:var(--text-dim);line-height:var(--lh-normal)}
/* LA TINTA APAGADA SE PIDE POR SU NOMBRE, NUNCA BAJANDO LA OPACIDAD DEL BLOQUE (2026-08-12).
   Esta segunda regla, que es la que gana, pedia la tinta a plena fuerza y luego apagaba el
   bloque entero al 78%. Dos danos. Uno: el contraste quedaba en 3,38 a 1 en tema claro y 3,96
   en oscuro, cuando el minimo legal es 4,5, y pasaba en los SIETE tableros a la vez porque el
   fallo vive aqui, en el sistema, no en ninguna serie. Dos, y es el que no se ve venir: la
   opacidad se aplica al GRUPO, asi que arrastraba a los hijos que nadie queria apagar, las
   cursivas y las pastillas de termino que van dentro del parrafo.
   Y no lo cazaba nadie: la puerta de contraste de la casa descarta la transparencia de la
   letra al medir, asi que para estos mismos textos daba 5,23 y aprobaba. */
.card__d{font-size:var(--fs-md);line-height:var(--lh-normal);color:var(--text-dim);margin:var(--sp-8) 0 0}
.clean-list{list-style:none;display:flex;flex-direction:column;gap:8px}
.crumbs{display:flex;align-items:center;flex-wrap:wrap;gap:1px;margin-bottom:var(--sp-14);font-size:var(--fs-sm);line-height:var(--lh-pegado)}
.crumb-cur{color:var(--text);font-weight:var(--w-fuerte);padding:var(--sp-3) var(--sp-6)}
.ficha{display:flex;flex-direction:column;gap:12px}
.ficha-foto{width:132px;height:176px;object-fit:cover;border-radius:var(--r-card);align-self:flex-start}
.ficha-role{font-family:var(--display);font-weight:var(--w-medio);font-size:var(--fs-lg);line-height:var(--lh-subtitulo);color:var(--text)}
.ficha-desc{font-size:var(--fs-body);line-height:var(--lh-lectura);color:var(--text-dim)}
.ficha-h{font-size:var(--fs-xs);text-transform:none;letter-spacing:var(--ls-rotulo);color:var(--text-soft);
  font-weight:var(--w-fuerte);margin-top:var(--sp-5)}
/* La caja de un prompt o de un aviso. Nace plegada y se abre con `.show`.
   DOS FALLOS ARREGLADOS EL 2026-08-12, los dos venían copiados de la hoja de origen:
   faltaba la regla que la ABRE (sin ella la caja no aparecía nunca, aunque el HTML
   pidiera `show`), y el fondo estaba escrito como valor suelto sin decir para qué era,
   así que el navegador lo descartaba y la caja salía transparente. */
.prompt-box,.info-box{display:none;margin-top:var(--sp-11);border:var(--hair-soft);border-radius:var(--r-card);background:var(--surface);padding:var(--sp-11)}
.prompt-box.show,.info-box.show{display:block}

/* LA TABLA DE DATOS. No estaba en el sistema y cada tablero que necesitaba una la
   dibujaba por su cuenta, o se quedaba sin ella y salia desnuda. Esta viene del
   tablero de moodboards de Blackwood, donde llevaba tiempo funcionando; lo unico
   que ha cambiado son los valores fijos, que ahora se piden al sistema por su
   nombre para que siga al tema y a la marca. */
.data-table{width:100%;border-collapse:collapse;font-size:var(--fs-md);line-height:1.45}
.data-table th{text-align:left;font-size:var(--fs-xs);font-weight:var(--w-max);
  text-transform:uppercase;letter-spacing:var(--ls-rotulo);color:var(--text-dim);
  padding:var(--sp-5) var(--sp-8);border-bottom:var(--hair-soft);white-space:nowrap}
.data-table td{padding:var(--sp-7) var(--sp-8);border-bottom:var(--hair-soft);
  vertical-align:top;color:var(--text-dim)}
.data-table td.td-lead{color:var(--text);font-weight:var(--w-fuerte)}
.data-table tr:last-child td{border-bottom:none}
.data-table tbody tr:hover td{background:var(--surface-alt)}
/* Una tabla ancha se desplaza dentro de su caja en vez de empujar la pagina de lado. */
.tabla-scroll{width:100%;overflow-x:auto;margin:var(--sp-5) 0 var(--sp-9)}
.tabla-scroll .data-table{min-width:640px}

/* La caja de informacion nace plegada y se abre con `.show`. */
.info-box{display:none;margin-top:var(--sp-5);padding:var(--sp-8) var(--sp-12);
  background:var(--surface);border:var(--hair-soft);border-radius:var(--r-md);
  font-size:var(--fs-body);line-height:1.6;color:var(--text)}
.info-box.show{display:block}
