/* ===================== SISTEMA ===================== */
  :root{
    --g:#070A0E;      /* fondo */
    --s:#0E141B;      /* superficie */
    --s2:#0B1016;     /* superficie alterna */
    --line:#1B2430;   /* filete */
    --tx:#EAF0F7;     /* texto */
    --mu:#94A6BB;     /* texto secundario. Subido de #7A8A9E el 19-ago-2026:
                         a los tamaños pequeños del nav y el pie se percibía
                         flojo (Salva lo notó). ~7,5:1 sobre el fondo, sigue
                         siendo azul-gris y no blanco: la jerarquía se conserva. */
    --tally:#FF2D2D;  /* al aire */
    --amb:#FFB020;    /* datos */
    --ok:#25D07A;     /* señal correcta */
    --c:#0090D0;      /* acento del canal activo */
    /* Onda de señal del hueco de miniatura. Va como máscara, no como imagen:
       así el trazo toma el color de cada cadena en vez de uno fijo. */
    /* Lo que hacía falta sacar a variable para que exista un modo claro
       (13-sep-2026). Eran los tres sitios donde el color del tema estaba
       escrito a mano: la cabecera translúcida, el velo de los modales y el
       grano de señal que cubre la página. Todo lo demás ya pasaba por
       tokens, y los oscuros que quedan sueltos son texto SOBRE color de
       marca —#04210f sobre el verde de señal, #04070A sobre el azul— que
       funciona igual con cualquier fondo. */
    --cab:rgba(7,10,14,.94);
    --velo:var(--velo);
    --grano:#fff;
    --sombra:rgba(0,0,0,.5);
    /* El degradado de las miniaturas de canal va del color de la cadena a
       este final. En claro no puede acabar en negro casi puro o la pared de
       canales queda de luto en mitad de una pagina blanca. Los logos no
       sufren: cada uno lleva su propia cajita con fondo (sobre-claro /
       sobre-oscuro), asi que aclarar el degradado no los borra. */
    --mini:#070B10;
    --mezcla:#000;
    /* Las veladuras que se echan sobre las tarjetas de canal para que el
       rótulo se lea encima del degradado. Van como componentes RGB sueltos
       porque se usan con seis opacidades distintas, y así basta una variable
       para las seis en vez de seis tokens de color. */
    --vela:8,11,16;
    --onda:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 40"><path d="M0 20 Q 15 3 30 20 T 60 20 T 90 20 T 120 20" fill="none" stroke="black" stroke-width="2.4" stroke-linecap="round"/></svg>');
  }
  /* ===================== MODO CLARO =====================
     Pedido por Salva el 13-sep-2026. Se activa con data-tema="claro" en el
     <html>, y el arranque lo decide en este orden: lo que el usuario eligió
     alguna vez, y si nunca eligió, lo que su sistema pida.

     No es el oscuro con los colores invertidos: los acentos son otros. El
     ámbar #FFB020 sobre blanco da 1,8:1 —ilegible— y el verde y el rojo de
     señal, parecido. Aquí bajan a versiones oscuras del mismo tono, que
     conservan el significado (ámbar=dato, verde=señal, rojo=al aire) y se
     leen. El fondo es blanco roto y no blanco puro, que cansa menos en una
     página que es una tabla enorme. */
  :root[data-tema="claro"]{
    --g:#F4F6FA;      /* fondo */
    --s:#FFFFFF;      /* superficie */
    --s2:#E9EEF5;     /* superficie alterna */
    --line:#D3DDE8;   /* filete */
    --tx:#0F1720;     /* texto */
    --mu:#54657A;     /* texto secundario, 5,5:1 sobre el fondo */
    --tally:#C81E1E;  /* al aire */
    --amb:#8A5A00;    /* datos */
    --ok:#0B7A43;     /* señal correcta */
    --c:#0A6FA8;      /* acento del canal activo */
    --cab:rgba(255,255,255,.92);
    --velo:rgba(15,23,32,.42);
    --grano:#000;
    --sombra:rgba(15,23,32,.18);
    --mini:#C3D1E0;
    --mezcla:#fff;
    --vela:236,241,247;
    color-scheme:light;
  }
  :root{color-scheme:dark}

  *{box-sizing:border-box}
  /* El atributo hidden lo pisa cualquier regla que declare display —le pasaba
     a .hd-right, que es flex y seguía enseñando un reloj parado en las páginas
     sin estado—. Con esto vuelve a significar lo que significa. */
  [hidden]{display:none !important}
  html{scroll-behavior:smooth}
  body{
    margin:0;background:var(--g);color:var(--tx);
    font-family:"Avenir Next Condensed","Avenir Next",Futura,"Helvetica Neue",sans-serif;
    -webkit-font-smoothing:antialiased;overflow-x:hidden;
  }
  body::after{ /* grano de señal sobre todo */
    content:"";position:fixed;inset:0;pointer-events:none;z-index:80;opacity:.03;
    background-image:repeating-linear-gradient(0deg,var(--grano) 0 1px,transparent 1px 3px);
  }
  .mono{font-family:"SF Mono",ui-monospace,"Roboto Mono","Courier New",monospace}
  .wrap{max-width:1240px;margin:0 auto;padding:0 28px}

  /* ===================== CABECERA ===================== */
  header{
    position:sticky;top:0;z-index:60;background:var(--cab);
    backdrop-filter:saturate(150%) blur(12px);border-bottom:1px solid var(--line);
  }
  /* Solo el padding vertical, en longhand a propósito: el lateral lo pone
     .wrap, y el shorthand `padding:14px 0` lo machacaba —misma especificidad,
     regla posterior—. Con pantalla ancha no se veía porque el max-width
     centra de sobra; en cuanto el viewport bajaba, el logo y el reloj
     tocaban el borde mientras el resto de la página guardaba sus 28px. */
  .hd{display:flex;align-items:center;gap:26px;padding-top:14px;padding-bottom:14px;
    flex-wrap:wrap}
  .logo{display:flex;align-items:center;gap:10px;font-size:1.1rem;letter-spacing:.16em;
    text-transform:uppercase;font-weight:600;text-decoration:none;color:var(--tx)}
  /* El logo es el punto rojo de siempre, con su brillo: Salva lo eligió el
     3-sep-2026 (el "Tally con halo" de design/logo.html) frente al de ondas.
     El favicon es este mismo punto con el halo pintado como degradado. */
  .rec{width:8px;height:8px;border-radius:50%;background:var(--tally);
    box-shadow:0 0 12px var(--tally);animation:pulse 1.8s infinite}
  @keyframes pulse{0%,45%{opacity:1;transform:scale(1)}55%,100%{opacity:.25;transform:scale(.8)}}
  nav{display:flex;gap:24px}
  nav a{color:var(--mu);text-decoration:none;font-size:0.88rem;letter-spacing:.15em;
    text-transform:uppercase;padding-bottom:3px;border-bottom:1.5px solid transparent;transition:.2s}
  nav a[aria-current="page"]{color:var(--tx);border-bottom-color:var(--amb)}
  nav a:hover{color:var(--tx)}
  nav a:focus-visible{outline:2px solid var(--amb);outline-offset:4px}
  /* Los dos rótulos de la derecha los rellena el JavaScript, y al pasar de vacío
     a "18 EN DIRECTO" empujaban la fila entera —con flex-wrap, a veces a otra
     línea—. Medido: 0,297 de CLS, el segundo peor de la web. Se reserva el hueco
     antes de tener el dato; sobra un par de píxeles y no salta nada. */
  .hd-right{margin-left:auto;display:flex;align-items:center;gap:18px;min-height:22px}
  .live-count{display:flex;align-items:center;gap:7px;font-size:0.82rem;letter-spacing:.12em;
    text-transform:uppercase;color:var(--mu);min-width:11ch}
  .live-count b{color:var(--ok);font-weight:600;
    font-variant-numeric:tabular-nums;min-width:2ch;display:inline-block;text-align:right}
  .tc{font-size:0.93rem;letter-spacing:.13em;color:var(--amb);font-variant-numeric:tabular-nums;
    min-width:5.4ch;display:inline-block;text-align:right}

  /* ===================== SEÑAL =====================
     Casi ninguna cadena publica imagen de lo que emite, así que este hueco está
     vacío la mayor parte del tiempo. Antes lo rellenaba un <canvas> por canal
     —39 en la portada, a doble resolución y repintados al redimensionar— para
     acabar en un rectángulo casi negro.
     Ahora: color de la cadena, el título de lo que emiten y una onda de señal
     que avanza. Todo CSS, sin trabajo para el procesador. */
  .sig{position:relative;overflow:hidden;
    background:linear-gradient(158deg,color-mix(in srgb,var(--c) 66%,var(--mezcla)) 0%,var(--mini) 76%)}
  /* Reserva para navegadores sin color-mix (Safari < 16.2): color plano oscuro. */
  @supports not (background:color-mix(in srgb,red 50%,#000)){
    .sig{background:linear-gradient(158deg,var(--c) -40%,var(--mini) 76%)}
  }
  .sig .onda{position:absolute;left:0;top:34%;width:200%;height:38px;z-index:1;
    opacity:.5;background:var(--c);
    -webkit-mask:var(--onda) repeat-x center/120px 40px;
            mask:var(--onda) repeat-x center/120px 40px;
    animation:onda-corre 7s linear infinite;will-change:transform}
  @keyframes onda-corre{to{transform:translateX(-120px)}}
  /* Miniatura real encima; si no carga, se retira y queda la señal debajo. */
  .sig .thumb{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:2;
    animation:fadein .45s ease both}
  @keyframes fadein{from{opacity:0}to{opacity:1}}
  /* El título de lo que se emite, como imagen. Debajo de la tarjeta ya no se
     repite: allí va el horario, que es el dato que faltaba. */
  .sig .prg{position:absolute;left:13px;right:13px;top:32px;z-index:4;margin:0;
    font-size:clamp(.95rem,1.35vw,1.12rem);font-weight:800;line-height:1.12;
    letter-spacing:-.022em;text-transform:uppercase;color:#fff;
    text-shadow:0 2px 16px rgba(0,0,0,.65);
    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .sig .vig{position:absolute;inset:0;pointer-events:none;z-index:3;
    background:radial-gradient(130% 90% at 50% 0%,transparent 35%,rgba(var(--vela),.7) 100%)}
  /* Quien pide menos movimiento en su sistema no ve la onda moverse. */
  @media (prefers-reduced-motion:reduce){
    .sig .onda{animation:none}
  }
  .onair{position:absolute;top:10px;left:10px;z-index:4;display:flex;align-items:center;gap:6px;
    font-size:0.78rem;letter-spacing:.17em;text-transform:uppercase;color:#fff;
    background:rgba(255,45,45,.92);padding:3px 8px;font-weight:600}
  .onair i{width:4px;height:4px;background:#fff;border-radius:50%;animation:pulse 1.8s infinite}
  .mark{display:inline-flex;align-items:center;justify-content:center;font-weight:700;
    color:#fff;line-height:1;flex:0 0 auto;box-shadow:0 3px 12px rgba(0,0,0,.55);border-radius:3px}
  .mark{aspect-ratio:1;border-radius:9px}
  .mark.sm{width:30px;height:30px;font-size:0.82rem}
  .mark.md{width:54px;height:54px;font-size:1.25rem}
  .mark.lg{width:70px;height:70px;font-size:1.8rem}

  /* Distintivo del canal: cápsula cuadrada con el logotipo dentro.
     El fondo no es decorativo. Los logos vienen sin fondo propio y hay que
     darles uno que contraste, pero cuál toca no se puede decidir por fuente ni
     a ojo: Neox es amarillo y Nova rosa —tienen color y aun así desaparecen
     sobre blanco—, mientras que Mega y Antena 3 son oscuros y piden lo
     contrario. Lo decide el brillo medido de cada fichero, en scripts/logos.py. */
  .logo-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
    aspect-ratio:1;border-radius:9px;overflow:hidden}
  /* Lo primero que se intenta es el color de la propia cadena: da identidad y
     hace la parrilla legible de un vistazo. Solo se usa cuando el logotipo
     contrasta con él, cosa que decide el generador midiéndolo. */
  .logo-wrap.sobre-canal{background:var(--c);
    box-shadow:0 3px 14px rgba(0,0,0,.55), inset 0 0 0 1px rgba(255,255,255,.20)}
  .logo-wrap.sobre-oscuro{background:#0B1016;
    box-shadow:0 3px 14px rgba(0,0,0,.6), inset 0 0 0 1px rgba(255,255,255,.13)}
  .logo-wrap.sobre-claro{background:#fff;
    box-shadow:0 3px 14px rgba(0,0,0,.5), inset 0 0 0 1px rgba(0,0,0,.14)}
  .logo-wrap.sm{width:30px;height:30px;padding:4px}
  .logo-wrap.md{width:54px;height:54px;padding:8px}
  .logo-wrap.lg{width:70px;height:70px;padding:11px}
  /* Dimensiones explícitas: muchos SVG no declaran tamaño intrínseco y con
     'auto' el navegador les da 300x150 por defecto, desbordando la cápsula.
     Con 100% + contain siempre encajan enteros, sean SVG o PNG. */
  .logo-img{display:block;width:100%;height:100%;object-fit:contain}

  /* Botón de acceso directo a la emisión, en la esquina de cada monitor. */
  .go-live{position:absolute;bottom:9px;right:9px;z-index:5;width:32px;height:32px;
    display:flex;align-items:center;justify-content:center;font-size:0.82rem;
    background:var(--velo);color:#fff;border:1px solid rgba(255,255,255,.28);
    border-radius:50%;opacity:0;transform:scale(.85);transition:.22s;backdrop-filter:blur(4px)}
  .cell:hover .go-live,.cell:focus-within .go-live{opacity:1;transform:scale(1)}
  .go-live:hover{background:var(--c);border-color:var(--c)}

  /* ===================== PORTADA ===================== */
  /* El "monitor de programa": comparte columna con la pared de preview. */
  .hero{position:relative;display:grid;grid-template-columns:1fr 264px;gap:1px;
    background:var(--line);border:1px solid var(--line);min-height:414px;
    margin:26px 0 0;overflow:hidden}
  /* En móvil el monitor pasa debajo y antes se soltaba el min-height. Pero
     #heroMain nace vacío y lo llena el JavaScript, así que sin altura reservada
     todo lo de abajo daba un salto: 0,755 de CLS en <main>, el peor de la web.
     Se reserva aquí lo que va a ocupar. */
  @media(max-width:900px){
    .hero{grid-template-columns:1fr;min-height:0}
    .hero-main{min-height:400px}
  }
  .hero-main{position:relative;display:flex;align-items:stretch;overflow:hidden;background:var(--s2)}
  .hero-main .sig{position:absolute;inset:0}
  /* Oscurecido global suave: la imagen sigue viéndose, solo baja un punto. */
  .veil{position:absolute;inset:0;background:
    linear-gradient(100deg, rgba(var(--vela),.95) 0%, rgba(var(--vela),.80) 42%,
                    rgba(var(--vela),.55) 70%, rgba(var(--vela),.48) 100%),
    radial-gradient(120% 115% at 12% 50%, rgba(var(--vela),.55), transparent 72%)}
  /* Panel de lectura: territorio sólido para el texto, con corte en diagonal
     hacia la imagen. Así el título nunca cae encima de los rótulos del canal. */
  .hero-txt{
    position:relative;z-index:5;padding:38px 40px 32px;width:min(60%,600px);
    align-self:stretch;display:flex;flex-direction:column;justify-content:flex-end;
    background:linear-gradient(100deg,
      rgba(var(--vela),.72) 0%, rgba(var(--vela),.55) 55%, rgba(var(--vela),.22) 82%, rgba(var(--vela),0) 100%);
  }
  @media(max-width:900px){
    .hero-txt{width:100%;align-self:auto;padding-top:120px;
      background:linear-gradient(0deg,
      rgba(9,13,18,.985) 0%,rgba(9,13,18,.95) 62%,rgba(9,13,18,.55) 100%)}
  }
  .hero-txt>*{animation:rise .6s cubic-bezier(.2,.75,.3,1) backwards}
  @keyframes rise{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
  .eyebrow{display:flex;align-items:center;gap:13px;margin-bottom:16px;animation-delay:.05s}
  .eyebrow .lbl{font-size:0.8rem;letter-spacing:.22em;text-transform:uppercase;color:var(--amb)}
  .eyebrow .lbl b{color:var(--tx);font-weight:600}
  /* La miniatura del héroe se ve, pero cede el protagonismo al panel de lectura. */
  .hero-main .sig img{filter:blur(20px) saturate(1.5) brightness(.66);
    transform:scale(1.14);transform-origin:center}
  h1.now{font-size:clamp(2rem,4.4vw,3.35rem);font-weight:700;line-height:.98;
    letter-spacing:-.028em;margin:0 0 14px;text-wrap:balance;animation-delay:.12s}
  .tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:22px;animation-delay:.18s}
  .tag{font-size:0.8rem;letter-spacing:.13em;text-transform:uppercase;color:#A8B6C6;
    border:1px solid #2A3543;padding:5px 11px;background:rgba(14,20,27,.92)}
  .tag.hot{color:var(--amb);border-color:rgba(255,176,32,.55);background:rgba(255,176,32,.09)}
  .prog{max-width:400px;margin-bottom:24px;animation-delay:.24s}
  .track{height:3px;background:rgba(255,255,255,.1);position:relative;overflow:hidden}
  .fill{position:absolute;inset:0 auto 0 0;background:var(--c);transition:width 1s linear}
  .fill::after{content:"";position:absolute;right:-1px;top:-4px;bottom:-4px;width:2px;
    background:#fff;box-shadow:0 0 9px #fff}
  .times{display:flex;justify-content:space-between;margin-top:9px;font-size:0.82rem;
    letter-spacing:.08em;color:#9FADBE;font-variant-numeric:tabular-nums}
  .times .pc{color:var(--tx);font-weight:600}
  .acts{display:flex;gap:11px;flex-wrap:wrap;animation-delay:.3s}
  .btn{display:inline-flex;align-items:center;gap:9px;text-decoration:none;padding:13px 24px;
    font-size:0.85rem;letter-spacing:.16em;text-transform:uppercase;font-weight:600;
    transition:transform .2s,box-shadow .2s,border-color .2s}
  .btn-p{background:var(--c);color:#04070A}
  .btn-p:hover{transform:translateY(-2px);box-shadow:0 10px 28px -10px var(--c)}
  .btn-s{border:1px solid var(--line);color:var(--tx)}
  .btn-s:hover{border-color:var(--tx)}
  .btn:focus-visible{outline:2px solid var(--amb);outline-offset:3px}

  /* --- monitor de señal: nuestro verificador, hecho visible --- */
  .monitor{background:var(--s2);padding:22px 20px;display:flex;flex-direction:column;gap:20px}
  .mon-h{font-size:0.8rem;letter-spacing:.22em;text-transform:uppercase;color:var(--mu);
    display:flex;align-items:center;justify-content:space-between}
  .mon-h .dot{width:6px;height:6px;border-radius:50%;background:var(--ok);
    box-shadow:0 0 9px var(--ok);animation:pulse 2.4s infinite}
  .vu{display:flex;gap:2px;align-items:flex-end;height:52px}
  .vu i{flex:1;background:var(--ok);opacity:.3;border-radius:1px;
    animation:vu 1.3s ease-in-out infinite}
  @keyframes vu{0%,100%{height:18%;opacity:.3}50%{height:100%;opacity:.9}}
  .mon-row{display:flex;justify-content:space-between;align-items:baseline;
    padding:9px 0;border-bottom:1px solid var(--line);font-size:0.85rem}
  .mon-row:last-of-type{border-bottom:0}
  .mon-row span{color:var(--mu);letter-spacing:.05em}
  /* Mismo caso que la cabecera: nacen con un guion y acaban en un número.
     Diez caracteres, no seis: el peor caso no es "67/67" sino el "hace 1 min"
     de la última comprobación, que además se repinta cada segundo. Con seis se
     quedaba corto, el texto envolvía, la fila crecía de alto y empujaba el
     panel entero — 0,229 de CLS medido sobre visitas reales el 14-ago-2026,
     el único que quedaba en rojo. `nowrap` cierra la puerta a que vuelva. */
  .mon-row b{font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.03em;
    min-width:10ch;display:inline-block;text-align:right;white-space:nowrap}
  .mon-foot{font-size:0.8rem;color:var(--mu);line-height:1.5;letter-spacing:.02em;
    border-top:1px solid var(--line);padding-top:14px}

  /* ===================== SECCIONES ===================== */
  section{padding:46px 0 8px}
  .sh{display:flex;align-items:baseline;gap:14px;margin-bottom:22px;flex-wrap:wrap}
  .sh h2{font-size:1.15rem;letter-spacing:.14em;text-transform:uppercase;margin:0;font-weight:600}
  .sh .cnt{font-size:0.82rem;color:var(--mu);letter-spacing:.1em}
  .sh .more{margin-left:auto;font-size:0.82rem;letter-spacing:.14em;text-transform:uppercase;
    color:var(--mu);text-decoration:none;border-bottom:1px solid var(--line);padding-bottom:2px}
  .sh .more:hover{color:var(--tx);border-color:var(--amb)}
  /* Rótulo de la pared de canales solo por internet, que va bajo la principal. */
  .sh-net{margin-top:34px}

  /* pared de monitores */
  .wall{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:14px}
  .cell{background:var(--s2);border:1px solid var(--line);cursor:pointer;text-align:left;
    padding:0;color:inherit;font:inherit;display:block;width:100%;
    transition:border-color .25s,transform .25s;animation:rise .5s cubic-bezier(.2,.75,.3,1) backwards}
  .cell:hover{border-color:var(--c);transform:translateY(-3px)}
  .cell[aria-pressed="true"]{border-color:var(--c);box-shadow:0 0 0 1px var(--c) inset}
  .cell:focus-visible{outline:2px solid var(--amb);outline-offset:2px}
  .cell .sig{aspect-ratio:16/9}
  .cell:hover .sig .thumb{transform:scale(1.04)}
  .cell .sig .thumb{transition:transform .6s cubic-bezier(.2,.75,.3,1)}
  /* Composición espejada el 19-ago-2026 a petición de Salva: el logotipo,
     grande y abajo a la IZQUIERDA; el chip de directo y el título, arriba a
     la DERECHA. Los elementos que ocupaban esas esquinas se intercambian:
     el ▶ de ir al directo baja al hueco del logo y el corazón de favorita
     sube a la izquierda. Solo en tarjetas (.cell): los heros no cambian. */
  .cell .lgm{position:absolute;bottom:10px;left:10px;z-index:5;
    display:flex;align-items:center;gap:10px;right:52px}
  /* El nombre del canal o emisora, de rótulo junto al logo (pedido por
     Salva el 19-ago): la imagen sola no dice quién emite. En radio es un h3
     con el enlace a la ficha — el mismo enlace indexable que antes iba de
     título arriba, mudado, no perdido. */
  .lgm-n{margin:0;color:#fff;font-weight:700;font-size:1rem;line-height:1.1;
    letter-spacing:-.01em;text-shadow:0 2px 12px rgba(0,0,0,.75)}
  .lgm-n a{color:inherit;text-decoration:none}
  .lgm-n a:hover{text-decoration:underline}
  .cell .onair{left:auto;right:10px}
  .cell .sig .prg{text-align:right}
  .cell-b{padding:13px 14px 15px}
  .cell-ch{font-size:0.8rem;letter-spacing:.13em;text-transform:uppercase;color:var(--mu);
    margin-bottom:5px;display:flex;justify-content:space-between}
  /* .radio-meta es el mismo chip en la tarjeta de radio (_tarjeta_emisora):
     comparten clase de estado, no contenedor, así que hace falta listar los
     dos. Sin el segundo selector, el chip de radio queda sin colorear —
     hereda el gris de texto por defecto y parece un fallo mudo. */
  .cell-ch .ok,.radio-meta .ok{color:var(--ok)}
  /* "Hay que salir a verlo/oírlo": ni bien ni mal, solo distinto — el mismo
     ámbar que ya usa la web para lo destacado, no un color de alarma nuevo. */
  .cell-ch .fuera,.radio-meta .fuera{color:var(--amb)}
  /* El botón de estado de la pared de TV (variante D, elegida por Salva
     20-ago-2026): ya no es un puntito junto al nombre, es un botón de
     verdad que ocupa el ancho de la tarjeta. La forma dice el tipo de
     acción antes de leer la palabra — relleno sólido como el propio play
     para lo reproducible, contorno para lo que es una puerta de salida,
     no un error. Reutiliza los mismos .ok/.fuera/.mal que el chip de
     radio, solo que aquí con más peso. */
  .btn-estado{display:block;text-align:center;font-size:0.8rem;font-weight:700;
    letter-spacing:.02em;padding:7px 0;border-radius:5px;margin:9px 0 0}
  .btn-estado.ok{background:var(--ok);color:#04210f}
  .btn-estado.fuera{background:transparent;border:1.5px solid var(--amb);color:var(--amb)}
  .btn-estado.mal{background:transparent;border:1.5px solid #3A414B;color:#7C8898}
  /* Respiro de verdad entre el botón y la barra de progreso: antes se
     tocaban y Salva lo vio "horrible" (20-ago). Solo en la tarjeta: el
     .track del hero vive en su propio .prog, con su propio margen. */
  .cell-b .track{margin-top:10px}
  /* Canales de emisión continua (DW, France 24...): sin parrilla que
     mostrar, ni guiones ni porcentajes huérfanos — una frase muda, en el
     mismo sitio que ocuparía la barra, para que el pie nunca quede vacío. */
  .cell-continua{margin-top:10px;font-size:0.78rem;color:#5F6E80;letter-spacing:.04em;
    text-align:center}
  .cell-t{font-size:.98rem;font-weight:600;line-height:1.22;margin:0 0 11px;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.4em}
  .cell-r{display:flex;justify-content:space-between;font-size:0.8rem;color:var(--mu);
    margin-top:8px;font-variant-numeric:tabular-nums;letter-spacing:.05em}

  /* guía: a continuación */
  .strip{display:flex;gap:12px;overflow-x:auto;padding-bottom:14px;scrollbar-width:thin}
  .slot{flex:0 0 214px;background:var(--s2);border:1px solid var(--line);padding:15px 16px;
    transition:border-color .25s,background .25s;cursor:pointer}
  .slot:hover{border-color:var(--amb);background:var(--s)}
  .slot .h{font-size:1.5rem;font-weight:700;color:var(--amb);font-variant-numeric:tabular-nums;
    letter-spacing:-.01em;margin-bottom:8px}
  .slot .p{font-size:0.97rem;line-height:1.3;margin-bottom:10px;min-height:2.5em}
  .slot .c{display:flex;align-items:center;gap:8px;font-size:0.8rem;letter-spacing:.11em;
    text-transform:uppercase;color:var(--mu)}

  /* dónde ver */
  .ev{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
  .evc{background:var(--s2);border:1px solid var(--line);padding:18px 18px 16px;
    display:flex;flex-direction:column;gap:12px;transition:border-color .25s}
  .evc:hover{border-color:var(--c)}
  .evc .top{display:flex;align-items:center;justify-content:space-between;gap:10px}
  .evc .comp{font-size:0.8rem;letter-spacing:.16em;text-transform:uppercase;color:var(--mu)}
  .evc .when{font-size:0.82rem;color:var(--amb);font-variant-numeric:tabular-nums;letter-spacing:.06em}
  .evc h3{font-size:1.06rem;font-weight:600;margin:0;line-height:1.25}
  /* ===================== MARCADOR DEL PARTIDO =====================
     Los dos equipos, con su escudo, arriba de la página de "dónde ver".
     El hueco del escudo tiene tamaño fijo y se reserva aunque el escudo no
     haya cargado —o no lo tengamos—, para que el bloque no dé un salto. */
  .marcador{margin:22px 0 26px;padding:22px 18px 26px;background:var(--s2);
    border:1px solid var(--line)}
  .marcador .enfrentamiento{display:flex;align-items:center;justify-content:center;
    gap:clamp(16px,5vw,54px)}
  /* El logotipo de la competición va sobre pastilla clara. LaLiga lo publica en
     tinta azul casi negra y no edita versión negativa, así que sobre nuestro
     fondo oscuro se perdería; recolorear una marca ajena es otra cosa distinta
     de reproducirla, así que se le da el fondo con el que su titular la usa. */
  .marcador .competicion{display:flex;justify-content:center;margin-bottom:20px}
  .marcador .competicion img{height:34px;width:auto;max-width:min(200px,60%);
    object-fit:contain;background:#fff;border-radius:6px;padding:7px 14px}
  .marcador .equipo{display:flex;flex-direction:column;align-items:center;gap:12px;
    flex:1 1 0;min-width:0;max-width:230px}
  .marcador .escudo-hueco{width:64px;height:64px;display:flex;
    align-items:center;justify-content:center}
  /* Halo tenue en lugar de fondo claro. Medido contra los 42 escudos: sobre
     nuestro fondo oscuro solo cuatro bajan de 3:1 —el Dépor se queda en 1,44
     con su azul marino—, pero sobre blanco fallarían catorce, porque la
     mayoría son de colores vivos con filete dorado. Cambiar el fondo empeora
     el conjunto para arreglar cuatro.
     El halo sigue el contorno del escudo (drop-shadow respeta la
     transparencia), se aplica igual a todos, y despega del fondo al que lo
     necesita sin tocar al que ya se veía bien. */
  .marcador .escudo{width:64px;height:64px;object-fit:contain;
    filter:drop-shadow(0 0 1px rgba(233,240,247,.55))
           drop-shadow(0 0 4px rgba(233,240,247,.22))}
  .marcador .equipo span{font-size:0.97rem;letter-spacing:.04em;text-align:center;
    text-wrap:balance;line-height:1.15}
  .marcador .vs{font-size:1.5rem;color:var(--mu);flex:0 0 auto}
  @media(max-width:520px){
    .marcador{padding:20px 10px}
    .marcador .escudo-hueco,.marcador .escudo{width:52px;height:52px}
    .marcador .equipo span{font-size:0.88rem}
  }

  .evc .where{display:flex;align-items:center;gap:9px;padding-top:12px;border-top:1px solid var(--line)}
  .evc .where small{font-size:0.8rem;letter-spacing:.13em;text-transform:uppercase;color:var(--mu)}
  .evc .where b{font-size:0.93rem;font-weight:600}

  /* Reproductor propio, cuando el emisor publica la emisión en abierto */
  .player{margin:26px 0 0;border:1px solid var(--line);background:#04070A;
    box-shadow:0 0 0 1px var(--c) inset}
  .player video{display:block;width:100%;aspect-ratio:16/9;background:#04070A}
  /* Mando de calidad. El consumo por hora va al lado de cada opción porque es
     el dato que decide de verdad cuando se ve la tele con datos móviles. */
  .calidad{margin:10px 0 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .calidad label{font-size:0.8rem;letter-spacing:.16em;text-transform:uppercase;color:var(--mu)}
  .calidad select{background:var(--s2);color:var(--tx);border:1px solid var(--line);
    padding:5px 9px;font:inherit;font-size:0.88rem;border-radius:4px;cursor:pointer}
  .calidad select:hover{border-color:var(--c)}
  .calidad select:focus-visible{outline:2px solid var(--amb);outline-offset:2px}
  .cal-nota{font-size:0.82rem;color:#5F6E80}

  /* Ámbito de la señal: lo declara el emisor, se avisa antes de que falle */
  .geo-nota{margin:10px 0 0;font-size:0.85rem;color:#5F6E80;display:flex;gap:7px;align-items:center}
  .geo-nota::before{content:"";width:5px;height:5px;border-radius:50%;
    background:var(--c);flex:none}

  /* Reproducción externa: el emisor no publica la señal o la protege */
  .externa{margin:26px 0 0;border:1px solid var(--line);background:var(--s2);
    padding:28px 30px 26px;position:relative;overflow:hidden}
  .externa::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--c)}
  .externa-lbl{font-size:0.8rem;letter-spacing:.22em;text-transform:uppercase;
    color:var(--c);margin-bottom:12px;font-weight:600}
  .externa h2{font-size:clamp(1.2rem,2.6vw,1.75rem);font-weight:700;margin:0 0 12px;
    letter-spacing:-.018em;text-wrap:balance}
  .externa p{color:var(--mu);line-height:1.62;margin:0 0 20px;max-width:62ch;font-size:0.97rem}
  .externa-nota{font-size:0.85rem;margin:16px 0 0 !important;color:#5F6E80}

  /* Cabeceras de las páginas de sección */
  .page-head{padding:38px 0 26px;border-bottom:1px solid var(--line);margin-bottom:30px}
  .page-head h1{font-size:clamp(1.8rem,4vw,2.7rem);font-weight:700;letter-spacing:-.025em;
    margin:0 0 10px;text-wrap:balance}
  .page-head p{color:var(--mu);margin:0;max-width:60ch;line-height:1.6;font-size:.98rem}
  .vacio{color:var(--mu);padding:40px 0;font-size:0.97rem}
  .btn-sm{padding:9px 16px;font-size:0.8rem;align-self:flex-start;margin-top:2px}

  /* Parrilla completa: una fila por canal, franjas en horizontal.
     La escribe el servidor en HTML —es contenido, no adorno—, y el cliente solo
     marca con data-live cuál está en antena. */
  /* padding:0 explícito: cada carril es un <section> y heredaría los 46px que
     separan las secciones de una página, dejando un hueco por canal. */
  .g-lane{display:grid;grid-template-columns:180px 1fr;border-bottom:1px solid var(--line);
    min-width:min-content;padding:0}
  .g-lane:first-child{border-top:1px solid var(--line)}
  .g-name{margin:0;padding:15px 14px;border-right:2px solid var(--line);display:flex;
    align-items:center;gap:10px;font-size:0.97rem;font-weight:600;position:sticky;left:0;
    background:var(--g);z-index:2}
  .g-name a{color:var(--tx);text-decoration:none}
  .g-name a:hover{color:var(--amb)}
  .g-slots{display:flex;overflow-x:auto;scrollbar-width:thin;list-style:none;margin:0;padding:0}
  .g-slot{flex:0 0 205px;border-left:1px solid var(--line);padding:14px 15px;
    transition:background .18s}
  .g-slot:hover{background:var(--s2)}
  .g-slot[data-live="1"]{background:var(--s);box-shadow:inset 3px 0 0 var(--c)}
  .g-h{display:block;font-size:0.85rem;color:var(--amb);font-variant-numeric:tabular-nums;
    letter-spacing:.06em;margin-bottom:5px}
  .g-t{display:block;font-size:0.93rem;line-height:1.3}

  /* El título de la parrilla, en tres piezas (13-sep-2026).
     Arriba el rótulo de continuidad —"Me caso en la 1", "Home cinema"—, que
     es del canal y no de lo que echan; en el medio la película o el programa;
     debajo el capítulo. La jerarquía se marca con tamaño y color, no con
     filetes ni barras laterales. */
  .g-ses{display:block;font-size:0.8rem;letter-spacing:.07em;text-transform:uppercase;
    color:var(--mu);margin-bottom:2px;line-height:1.25}
  .g-sub{display:block;font-size:0.85rem;color:var(--mu);line-height:1.35;margin-top:2px}
  /* La carátula y el texto van uno al lado del otro; sin carátula, el texto
     ocupa la línea entera sin dejar hueco. */
  /* La carátula ocupa la celda de arriba abajo y el texto va al lado, con la
     hora ya en su columna (Salva, 13-sep-2026). Antes la hora cruzaba la
     celda entera por encima y empujaba la carátula hacia abajo, que quedaba
     flotando en medio.

     Los márgenes negativos se comen el padding del <li> para que la carátula
     llegue de verdad al borde: sin ellos hay catorce píxeles de fondo arriba
     y abajo y ya no parece una carátula, parece una pegatina.

     `object-fit:cover` sobre un ancho fijo y un alto elástico: a la altura
     habitual de una celda el recorte es de unos pocos píxeles, porque 46 de
     ancho contra ~70 de alto anda muy cerca del 2:3 de un póster. */
  /* Posicionada, no en rejilla. Se probó primero con grid-row:1/-1 y
     align-self:stretch, que es lo que uno escribiría, y la carátula salía de
     18px en una celda de 74: una <img> tiene proporción propia y el estirado
     de rejilla no la vence. Anclada arriba y abajo sí llega de un borde al
     otro, y el texto le deja sitio con el padding izquierdo. */
  /* Los tres contextos nombrados y no solo `.g-slot`: en la rejilla manda
     `.g-tabla .g-slot`, que va más abajo en este fichero y con la misma
     especificidad se llevaba el padding —la hora acababa impresa encima de
     la carátula—. Y `height:100%` explícito, porque una <img> colocada con
     top y bottom pero height:auto se queda en su proporción natural: salía de
     69px en una celda de 74 y no llegaba al borde. */
  .g-slot:has(.g-cart),
  .g-tabla .g-slot:has(.g-cart),
  .canal-parrilla .g-slot:has(.g-cart){position:relative;padding-left:60px}
  .g-slot:has(.g-cart) .g-cart,
  .g-tabla .g-slot:has(.g-cart) .g-cart,
  .canal-parrilla .g-slot:has(.g-cart) .g-cart{position:absolute;left:0;top:0;
    bottom:0;width:46px;height:100%;border-radius:0}
  .g-cart{border-radius:3px;display:block;background:var(--s2);object-fit:cover}
  .g-cuerpo{min-width:0}

  /* El desplegable de la emisión.
     Sustituye al globo flotante del 3-sep: se abre una celda DEBAJO del carril
     del canal y se queda abierta hasta que se pulsa otra, que es como lo pidió
     Salva el 13-sep-2026. Se anima con grid-template-rows de 0fr a 1fr, que es
     la única forma de transicionar hasta "lo que mida el contenido" sin fijar
     una altura a mano ni medirla con JavaScript. */
  .g-det{grid-column:1/-1;display:grid;grid-template-rows:0fr;
    position:sticky;left:0;width:100%;max-width:100vw;
    transition:grid-template-rows .26s cubic-bezier(.4,0,.2,1);
    background:var(--s);border-top:1px solid var(--line)}
  .g-det.abierta{grid-template-rows:1fr}
  .g-det>div{overflow:hidden}
  .gd-in{display:flex;gap:16px;padding:16px 18px;align-items:flex-start}
  .g-det:not(.abierta) .gd-in{padding-top:0;padding-bottom:0}
  /* 104px era el tamaño de una miniatura, no de una carátula: en un
     desplegable que ocupa el ancho de la pantalla se quedaba en nada al lado
     de la sinopsis (Salva, 13-sep-2026). 168 es lo que cabe sin empujar el
     texto por debajo de las 60 columnas de lectura. */
  .gd-cart{flex:0 0 168px;border-radius:4px;display:block;background:var(--s2);
    /* `height:auto` obligatorio: el <img> lleva width y height en el HTML
       —que están ahí para reservar el hueco y no mover la página al cargar—,
       y al ensancharlo por CSS sin soltar el alto la carátula salía de
       168x156 en vez de 168x252, o sea aplastada. Se vio midiéndola, no
       mirándola: a ojo pasaba por buena. */
    height:auto;aspect-ratio:2/3;object-fit:cover}
  .gd-txt{min-width:0;flex:1}
  .gd-ses{font-size:0.8rem;letter-spacing:.08em;text-transform:uppercase;color:var(--mu);
    margin:0 0 3px}
  .gd-t{font-size:1.12rem;margin:0 0 4px;line-height:1.25}
  .gd-h{font-size:0.88rem;color:var(--amb);font-variant-numeric:tabular-nums;margin:0 0 2px}
  .gd-meta{font-size:0.85rem;color:var(--mu);margin:0 0 8px}
  /* La sinopsis es lo único que se lee de corrido aquí dentro: se le da
     tamaño de lectura y aire entre líneas, no de anotación al margen. */
  .gd-si{font-size:1rem;line-height:1.65;margin:0 0 10px;max-width:64ch;color:var(--tx)}
  .gd-rep{font-size:.88rem;color:var(--mu);margin:0 0 10px;max-width:64ch}
  .gd-fuente{font-size:.8rem;color:var(--mu);margin:0 0 10px;opacity:.85}
  .gd-fuente a{color:var(--mu)}
  .gd-acts{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:0}
  .gd-lnk{font-size:0.85rem;color:var(--mu)}
  /* La campanita. Va de secundaria, con filete y sin relleno: la acción que
     manda sigue siendo ver la tele, no apuntarlo para luego. */
  .gd-avisar{font:inherit;font-size:0.85rem;letter-spacing:.04em;cursor:pointer;
    background:none;color:var(--tx);border:1px solid var(--line);
    padding:9px 14px;display:inline-flex;align-items:center;gap:7px;
    transition:border-color .18s,color .18s}
  .gd-avisar:hover{border-color:var(--amb);color:var(--amb)}
  .gd-avisar.hecho{border-color:var(--ok);color:var(--ok);cursor:default}
  .gd-x{margin-left:auto;background:none;border:0;color:var(--mu);cursor:pointer;
    font-size:1rem;line-height:1;padding:4px 6px}
  .gd-x:hover{color:var(--tx)}
  .gd-vivo{display:inline-block;font-size:0.8rem;letter-spacing:.06em;text-transform:uppercase;
    color:var(--c,var(--amb));font-weight:600}
  .g-slot.abierta{background:var(--s2);box-shadow:inset 0 -2px 0 var(--c,var(--amb))}
  @media (max-width:560px){
    .gd-in{gap:12px;padding:13px 14px}
    /* En el móvil la carátula no compite con la sinopsis, se pone encima: a
       78px de ancho no se distinguía la película y robaba media línea de
       texto a un ancho donde cada línea cuenta. */
    .gd-in{flex-direction:column}
    .gd-cart{flex-basis:auto;width:132px;align-self:flex-start}
  }

  .g-wrap{overflow-x:auto}
  .vacio{color:var(--mu);padding:18px 0}

  /* En la ficha de un canal la parrilla es la de ese canal y hay sitio de sobra:
     se muestra en rejilla, que se lee mejor que una tira horizontal. */
  .canal-parrilla{display:block;border:0;min-width:0}
  .canal-parrilla .g-slots{display:grid;overflow:visible;
    grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:1px;background:var(--line);
    border:1px solid var(--line)}
  .canal-parrilla .g-slot{flex:none;border-left:0;background:var(--g);padding:14px 15px}
  .canal-parrilla .g-slot[data-live="1"]{background:var(--s)}

  footer{margin-top:60px;border-top:1px solid var(--line);padding:26px 0 46px}
  .ft{display:flex;gap:20px;justify-content:space-between;flex-wrap:wrap;
    font-size:0.85rem;color:var(--mu);line-height:1.65;letter-spacing:.03em}
  .ft p{margin:0;max-width:56ch}
  .ft a{color:var(--mu)}

  @media (prefers-reduced-motion: reduce){
    *,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;
      transition-duration:.001ms !important}
    html{scroll-behavior:auto}
  }

  /* Radio: la tarjeta lleva su propio reproductor, no lleva a ningún sitio. */
  .cell.radio{cursor:default}
  .cell.radio:hover{transform:none}
  .cell.radio .radio-mando{margin-top:2px}
  .radio-meta{display:flex;align-items:center;gap:10px;margin-top:11px;
    font-size:0.8rem;letter-spacing:.12em;text-transform:uppercase;
    color:var(--mu);white-space:nowrap;overflow:hidden}
  .radio-meta .geo{color:#5F6E80}
  .cell.radio .sig{aspect-ratio:16/7}
  .cell.radio audio{width:100%;margin-top:11px;height:34px}
  .cell.radio .cell-t{min-height:0;margin-bottom:0;font-size:1.02rem}

  /* Aviso de cookies: una franja discreta abajo, sin tapar el contenido.
     Nada de muros: la primera visita tiene que ser limpia. */
  .ck{position:fixed;left:0;right:0;bottom:0;z-index:90;display:none;
    align-items:center;gap:18px;padding:14px 26px;background:var(--velo);
    border-top:1px solid var(--line);backdrop-filter:blur(10px);
    font-size:0.88rem;color:var(--mu);flex-wrap:wrap}
  .ck.on{display:flex;animation:ckUp .35s cubic-bezier(.2,.75,.3,1) both}
  @keyframes ckUp{from{transform:translateY(100%)}to{transform:none}}
  .ck p{margin:0;flex:1;min-width:240px;line-height:1.5}
  .ck a,.ck button.lnk{color:var(--mu);text-decoration:underline;background:none;
    border:0;font:inherit;cursor:pointer;padding:0}
  .ck a:hover,.ck button.lnk:hover{color:var(--tx)}
  .ck .ok{background:#22C55E;color:#062012;border:0;font:inherit;font-weight:700;
    padding:11px 30px;border-radius:6px;cursor:pointer;letter-spacing:.02em;
    transition:background .18s,transform .18s}
  .ck .ok:hover{background:#16A34A;transform:translateY(-1px)}
  .ck .ok:focus-visible,.ck button.lnk:focus-visible{outline:2px solid var(--amb);outline-offset:3px}

  /* Documentos legales y de servicio: pensados para leerse, no para escanearse. */
  .doc{max-width:68ch;padding:44px 0 20px}
  .doc h1{font-size:clamp(1.9rem,4vw,2.7rem);font-weight:700;letter-spacing:-.025em;
    margin:0 0 22px;text-wrap:balance}
  .doc h2{font-size:1.02rem;letter-spacing:.11em;text-transform:uppercase;font-weight:600;
    margin:36px 0 12px;color:var(--amb)}
  .doc p{line-height:1.72;margin:0 0 16px;color:#B9C5D4;font-size:.97rem}
  /* La entradilla se distingue por tamaño y color, no por una barra de color
     a la izquierda. Sin adornos: el filete lateral en un párrafo es un recurso
     de plantilla, y aquí la jerarquía la marca la tipografía. */
  .doc-lead{color:var(--tx) !important;font-size:1.06rem !important;
    line-height:1.66 !important}
  /* El :not(.btn) otra vez, y por lo mismo que en las filas del horario: un
     botón dentro del documento también es un <a> dentro de .doc, y esta regla
     —más específica que .btn-ver— le pintaba el texto del color del cuerpo.
     El resultado era texto casi blanco sobre el verde del botón, con un
     contraste de 1,76 cuando el mínimo legible es 4,5: por eso el "¡Verlo
     ahora!" no se leía bien por mucho que se agrandara la letra. */
  .doc a:not(.btn){color:var(--tx);text-decoration:underline;text-underline-offset:3px}
  .doc a:not(.btn):hover{color:var(--amb)}
  /* Los hubs de deporte pintan su texto en .doc-lead fuera de .doc, y los
     nombres de plataforma enlazados salían en azul de navegador (6-sep-2026). */
  .doc-lead a:not(.btn){color:inherit;text-decoration:underline;text-underline-offset:3px}
  .doc-lead a:not(.btn):hover{color:var(--amb)}
  /* Mismo caso que el enlace: el titular del botón es un <b>, y esta regla le
     ponía el color del cuerpo del documento sobre el fondo verde. */
  .doc b:not(.bv-t){color:var(--tx);font-weight:600}
  /* Y el texto del botón, blanco y explícito, para que ninguna regla de
     contenedor vuelva a decidir por él. */
  .btn-ver .bv-t,.btn-ver .bv-s{color:#fff}

  /* Barra de días de la guía. Es lo que enlaza entre sí las páginas de
     programación: sin ella existirían solo en el sitemap, que para un
     rastreador es una pista mucho más débil que un enlace. */
  .dias{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 22px}
  .dia{padding:7px 14px;border:1px solid var(--line);background:var(--s2);
    color:var(--mu);text-decoration:none;font-size:0.85rem;letter-spacing:.08em;
    text-transform:uppercase;transition:.18s}
  a.dia:hover{border-color:var(--amb);color:var(--tx)}
  .dia.actual{background:var(--tx);color:var(--g);border-color:var(--tx);font-weight:600}

  /* Los días ya emitidos, al pie y separados de la barra de arriba: se
     publicaban sin que nadie los enlazara y vivían solo del sitemap, aunque
     alguno llegó a 35 clics en posición 7,3. Van abajo porque no compiten con
     "hoy" ni con "mañana", que es a lo que viene el visitante. */
  .dias-antes{margin-top:40px;padding-top:26px;border-top:1px solid var(--line)}
  .dias-antes .dias{margin-bottom:0}

  /* Ficha técnica del canal: quién lo emite, hasta dónde llega y en qué dial.
     Información estable que no publica nadie en el sector, más dos datos que
     son nuestros: la calidad medida y el estado real de la señal. */
  .ficha dl{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));
    gap:1px;background:var(--line);border:1px solid var(--line);margin:0}
  .ficha dl>div{background:var(--g);padding:14px 16px}
  .ficha dt{font-size:0.8rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--mu);margin-bottom:6px}
  .ficha dd{margin:0;font-size:0.97rem;line-height:1.42}
  .ficha dd a{color:var(--amb)}
  .ft-ayuda{margin-top:8px}
  .doc-lista{margin:0 0 20px;padding-left:22px;color:var(--mu);line-height:1.7}
  .doc-lista li{margin-bottom:6px}
  .doc-lista a{color:var(--amb)}
  /* Tabla dentro de un documento (la de "dónde ver cada canal" de la ayuda).
     El div desplaza en horizontal en móvil: la página no se mueve de lado. */
  .doc-tabla{overflow-x:auto;margin:0 0 22px}
  .doc-tabla table{border-collapse:collapse;width:100%;font-size:0.97rem;
    line-height:1.4}
  .doc-tabla th,.doc-tabla td{padding:7px 10px;border-bottom:1px solid var(--line);
    text-align:left;vertical-align:top;color:#B9C5D4}
  .doc-tabla th{font-size:0.8rem;letter-spacing:.08em;text-transform:uppercase;
    color:var(--mu);font-weight:600}

  /* Partidos: la lista de "dónde ver" y la ficha de cada uno. */
  .partidos{list-style:none;margin:0;padding:0;border:1px solid var(--line)}
  .partido+.partido{border-top:1px solid var(--line)}
  /* La fila se reparte igual lleve enlace o no: un torneo del calendario aún
     no tiene página propia a la que llevar, y sin esta segunda regla sus tres
     datos salían pegados unos a otros. */
  /* El :not(.btn) no es adorno. Un botón dentro de una fila TAMBIÉN es un <a>
     dentro de .partido, así que esta regla —más específica que .btn-ses— le
     imponía su rejilla y su relleno, y el botón se quedaba en 43 px de alto
     por mucho que se le subiera el padding. */
  .partido a:not(.btn),.partido .p-fila{display:grid;
    grid-template-columns:130px 1fr auto;gap:16px;align-items:center;
    padding:14px 16px;text-decoration:none;color:var(--tx);transition:background .18s}
  .partido a:not(.btn):hover{background:var(--s2)}
  .p-fecha{color:var(--amb);font-size:0.88rem}
  .p-equipos{font-weight:600;font-size:.98rem}
  .p-canal{color:var(--mu);font-size:0.85rem;text-align:right}
  @media (max-width:640px){
    .partido a:not(.btn),.partido .p-fila{grid-template-columns:1fr;gap:5px}
    .p-canal{text-align:left}
  }
  /* Cada dato con su propio filete. La técnica anterior —fondo del contenedor
     como rejilla— pintaba un parche claro donde la última fila no se llenaba. */
  .datos-partido{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
    gap:10px;margin:0 0 22px}
  .datos-partido>div{background:var(--s2);border:1px solid var(--line);padding:14px 16px}
  .datos-partido dt{font-size:0.8rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--mu);margin-bottom:6px}
  .datos-partido dd{margin:0;font-size:0.97rem}
  /* Cuando un partido de pago se da además en abierto. Es el dato que nadie
     más puede dar: hace falta tener la parrilla y los partidos a la vez. */
  /* El aviso de abierto destaca por lo que dice y por el color de su texto,
     sin barra lateral ni caja: es una frase, no un cartel. */
  .doc-lead.destacado{color:var(--ok) !important;font-weight:600}
  .doc-lead.destacado b{color:var(--ok)}
  /* ============ DÓNDE VER: cartel, tarjetas, cine y buscador ============
     El lenguaje es el del resto del sitio —sala de control: filetes, ámbar
     para el dato, rojo tally para lo vivo, monoespaciada para la hora— pero
     aquí la hora se trata como en la pizarra de un estadio: es EL dato. */

  /* Un partido en juego no tiene hora que anunciar: tiene estado. */
  .p-fecha.en-juego{color:var(--tally);font-weight:600;letter-spacing:.06em;
    text-transform:uppercase;font-size:0.82rem}

  /* El marcador grande de la ficha y del cartel del índice. */
  .marcador.xl{padding:30px 22px 24px;margin:26px 0 30px;
    background:linear-gradient(180deg,var(--s2) 0%,var(--g) 100%)}
  .marcador.xl .enfrentamiento{gap:min(4vw,42px)}
  .marcador.xl .equipo{flex:1 1 0;max-width:240px}
  .marcador.xl .escudo-hueco,.marcador.xl .escudo{width:104px;height:104px}
  .marcador.xl .escudo{filter:drop-shadow(0 0 16px rgba(255,255,255,.16))}
  .marcador.xl .equipo span{font-size:1rem;font-weight:600}
  /* Dentro de .doc los enlaces van subrayados (texto corrido); las tarjetas
     y el marcador no son texto corrido y el subrayado los ensuciaba. */
  .doc a.pcard,.doc .marcador a,.doc a.btn{text-decoration:none}
  .marcador .equipo a{color:var(--tx);text-decoration:none;
    border-bottom:1px solid transparent;transition:border-color .18s}
  .marcador .equipo a:hover{border-bottom-color:var(--amb)}
  .marcador .centro{display:flex;flex-direction:column;align-items:center;
    gap:7px;flex:0 1 auto;min-width:130px}
  .marcador .hora{font-size:clamp(2rem,5vw,3.2rem);line-height:1;color:var(--amb);
    letter-spacing:.03em;font-variant-numeric:tabular-nums;
    text-shadow:0 0 26px rgba(255,176,32,.28)}
  .marcador .fecha{font-size:0.8rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--mu);white-space:nowrap}
  /* La cuenta en días bajo la fecha: lo que se siente, no solo el dato. */
  .marcador .cuenta{font-size:0.8rem;letter-spacing:.14em;text-transform:uppercase;
    color:var(--amb);opacity:.85}
  .pc-cuando{display:flex;flex-direction:column;align-items:flex-end;gap:2px;
    flex:0 0 auto}
  .pc-resta{font-style:normal;font-size:0.78rem;letter-spacing:.1em;
    text-transform:uppercase;color:var(--mu)}
  .marcador .competicion{display:flex;justify-content:center;align-items:center;
    gap:14px;margin-bottom:22px;font-size:0.82rem;letter-spacing:.18em;
    text-transform:uppercase;color:var(--mu)}
  .marcador .competicion img{height:30px;width:auto;display:block}
  .marcador .jornada{border-left:1px solid var(--line);padding-left:14px}
  .marcador .emision{display:flex;justify-content:center;align-items:center;
    gap:10px;flex-wrap:wrap;margin-top:22px;padding-top:18px;
    border-top:1px solid var(--line)}
  .marcador .emision small{font-size:0.8rem;letter-spacing:.18em;
    text-transform:uppercase;color:var(--mu)}
  .badge-canal{border:1px solid var(--line);background:var(--s);color:var(--tx);
    padding:6px 14px;font-size:0.88rem;letter-spacing:.03em;font-weight:600}
  /* Los distintivos que saben adónde ir son enlaces: al canal de casa o a la
     web oficial de la plataforma. La flecha marca que se sale de aquí. */
  a.badge-canal{text-decoration:none;transition:border-color .18s,background .18s}
  a.badge-canal:hover{border-color:var(--amb);background:var(--s2)}
  .badge-canal .fl,.btn .fl{font-style:normal;font-size:.72em;margin-left:7px;
    color:var(--mu)}
  a.badge-canal:hover .fl{color:var(--amb)}
  /* La emisora que nos deja comisión (tiene enlace de afiliado) se resalta en
     VERDE e invita a ir, con su precio a la vista para que se sepa lo que
     cuesta. La que no monetiza se queda como .badge-canal normal: secundaria y
     neutra. El interruptor es `monetiza` del config; hoy, sin enlaces, nada se
     resalta. */
  .badge-canal.gana{background:var(--ok);border-color:var(--ok);color:#04210f;
    font-weight:700}
  .badge-canal.gana .bc-precio{margin-left:7px;font-weight:800;
    font-variant-numeric:tabular-nums}
  .badge-canal.gana .fl{color:#04210f}
  a.badge-canal.gana:hover{background:#3BE08C;border-color:#3BE08C}
  a.badge-canal.gana:hover .fl{color:#04210f}
  .nota-plataformas{font-size:0.85rem;color:#5F6E80;margin:10px 0 0}
  /* Las competiciones con página propia, en el hub de su deporte. */
  .comp-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
    gap:12px}
  .comp-card{display:flex;flex-direction:column;gap:5px;padding:18px 20px;
    border:1px solid var(--line);background:var(--s);text-decoration:none;
    transition:border-color .18s,background .18s,transform .18s}
  .comp-card:hover{border-color:var(--amb);background:var(--s2);
    transform:translateY(-2px)}
  .comp-card b{color:var(--tx);font-size:1rem;letter-spacing:-.01em}
  .comp-card span{color:var(--mu);font-size:0.85rem;line-height:1.4}
  .comp-card:focus-visible{outline:2px solid var(--amb);outline-offset:3px}

  /* "Añadir a mi calendario": la promesa de la sección llevada al final —no
     perderse el partido— sin pedir cuenta ni correo. */
  .al-calendario{margin:18px 0 0;display:flex;align-items:center;gap:14px;
    flex-wrap:wrap}
  .al-calendario small{color:#5F6E80;font-size:0.85rem;max-width:38ch;
    line-height:1.45}
  .al-calendario i{font-style:normal;margin-right:8px}
  .marcador.vivo{border-color:rgba(255,45,45,.45)}

  /* Tarjeta de suscripción: la plataforma con oferta verificada ocupa la fila
     entera de la botonera, con el precio en el color de los datos. Toda la
     tarjeta es un solo enlace: el "botón" interior es dibujo, no destino. */
  /* El botón de suscribirse va en VERDE —el color del "adelante, es fácil"—,
     no en ámbar: ámbar es el color de los datos (la hora, el marcador), y el
     acceso a la plataforma es una acción, no un dato. El precio, en cambio, se
     queda en blanco fuerte: verlo cuesta y eso tiene que leerse claro, no
     disfrazado del verde de "gratis". */
  .cta-plat{flex:1 1 100%;display:flex;align-items:center;gap:18px;
    justify-content:space-between;text-decoration:none;padding:18px 20px;
    background:linear-gradient(120deg,var(--s) 0%,var(--s2) 60%),
      radial-gradient(circle at 100% 0%,rgba(37,208,122,.14),transparent 55%);
    background-blend-mode:normal;border:1px solid rgba(37,208,122,.45);
    transition:border-color .18s,box-shadow .18s,transform .18s}
  .cta-plat:hover{border-color:var(--ok);
    box-shadow:0 6px 24px rgba(37,208,122,.16);transform:translateY(-2px)}
  .cta-info{display:flex;flex-direction:column;gap:3px;min-width:0}
  .cta-nombre{color:var(--tx);font-size:0.82rem;letter-spacing:.22em;
    text-transform:uppercase;font-weight:700}
  .cta-gancho{color:var(--mu);font-size:0.97rem;line-height:1.35}
  .cta-precio{color:var(--tx);font-weight:700;font-size:1.02rem;
    font-variant-numeric:tabular-nums;letter-spacing:.02em}
  .cta-btn{flex:none;display:inline-flex;align-items:center;background:var(--ok);
    color:#04210f;font-weight:700;font-size:0.85rem;letter-spacing:.14em;
    text-transform:uppercase;padding:12px 22px;transition:background .18s}
  .cta-btn .fl{font-style:normal;font-size:.8em;margin-left:8px;color:#04210f}
  .cta-plat:hover .cta-btn{background:#3BE08C}
  .cta-plat:focus-visible{outline:2px solid var(--ok);outline-offset:3px}
  @media (max-width:560px){
    .cta-plat{flex-direction:column;align-items:flex-start;gap:12px}
    .cta-btn{align-self:stretch;justify-content:center}
  }

  /* Estado del encuentro, en el centro del marcador. */
  .chip-vivo{display:inline-flex;align-items:center;gap:7px;
    background:rgba(255,45,45,.12);border:1px solid rgba(255,45,45,.45);
    color:#FF7B7B;padding:3px 11px;font-size:0.78rem;letter-spacing:.2em;
    text-transform:uppercase;font-weight:600}
  .chip-vivo i{width:5px;height:5px;border-radius:50%;background:var(--tally);
    box-shadow:0 0 8px var(--tally);animation:pulse 1.8s infinite}
  .chip-final{display:inline-block;border:1px solid var(--line);color:var(--mu);
    padding:3px 11px;font-size:0.78rem;letter-spacing:.2em;text-transform:uppercase}

  /* El cartel del índice: el próximo partido en grande, con su rótulo. */
  .cartel{position:relative;border:1px solid var(--line);margin-bottom:38px;
    padding:20px 22px 24px;overflow:hidden;background:var(--s2)}
  .cartel::before{content:"";position:absolute;inset:0;pointer-events:none;
    background:radial-gradient(70% 100% at 50% -20%,rgba(255,176,32,.08),transparent 60%)}
  .cartel .marcador{border:0;background:none;margin:0;padding-bottom:0}
  .cartel-rotulo{font-size:0.8rem;letter-spacing:.22em;text-transform:uppercase;
    color:var(--amb);margin-bottom:4px}
  .cartel-cta{display:flex;justify-content:center;margin-top:20px;
    position:relative;z-index:1}

  /* La próxima cita de motor: manda el NOMBRE del gran premio, con su día y su
     hora en grande —todo el dato, no solo la hora—, y debajo la cuenta atrás
     que hace que cueste irse. Es un .cartel con más aire y centrado. */
  .cartel.cita{text-align:center;padding:26px 22px 28px}
  .cita-comp{font-size:0.82rem;letter-spacing:.22em;text-transform:uppercase;
    color:var(--mu);margin:0 0 10px}
  .cita-nombre{font-size:clamp(1.5rem,3.6vw,2.3rem);font-weight:700;
    letter-spacing:-.02em;line-height:1.12;color:var(--tx);margin:0 0 8px;
    text-wrap:balance}
  .cita-cuando{font-size:clamp(1rem,2vw,1.18rem);color:var(--amb);margin:0;
    font-variant-numeric:tabular-nums;letter-spacing:.01em}

  /* Cuenta atrás en días/horas/min/seg. Los números arrancan en "--" para que
     el hueco no salte al rellenarlos el JS; sin JS quedan la fecha y la hora
     de texto de arriba, que son las que de verdad importan y las que lee un
     buscador. */
  .cuenta-atras{display:flex;justify-content:center;gap:10px;margin:20px 0 4px;
    flex-wrap:wrap}
  .cuenta-atras .ca-u{display:flex;flex-direction:column;align-items:center;
    gap:4px;min-width:66px;padding:12px 8px;border:1px solid var(--line);
    background:var(--s)}
  .cuenta-atras .ca-u b{font-size:1.7rem;font-weight:700;line-height:1;
    color:var(--tx);font-variant-numeric:tabular-nums}
  .cuenta-atras .ca-u span{font-size:0.78rem;letter-spacing:.16em;
    text-transform:uppercase;color:var(--mu)}
  .cuenta-atras.fin .ca-u b{color:var(--amb)}

  /* Los dos accesos de la cita: el horario del finde (sobrio) y el "verlo"
     verde con su precio. En fila; en móvil, apilados y a lo ancho. */
  .cita-botones{display:flex;justify-content:center;flex-wrap:wrap;gap:12px;
    margin-top:22px}
  .btn-ver{background:var(--ok);color:#fff;font-weight:700;
    flex-direction:column;align-items:center;gap:2px;line-height:1.2;
    padding-top:10px;padding-bottom:10px}
  .btn-ver:hover{background:#3BE08C;transform:translateY(-2px)}
  .btn-ver .fl{color:#fff;margin-left:2px}
  /* La acción manda en tamaño; el precio va debajo, legible pero sin competir
     con ella. El .82 de opacidad basta para separarlos sin ensuciar el verde
     con un segundo color. El subtítulo abandona la versalita del .btn: "POR
     SOLO 9,99 € EN DAZN" con el rastreo de los botones se va de ancho y se
     lee peor que una frase normal. */
  .btn-ver .bv-t{font-size:0.93rem;font-weight:700;letter-spacing:.14em;
    display:inline-flex;align-items:center}
  .btn-ver .bv-s{font-size:0.8rem;font-weight:500;opacity:.82;
    text-transform:none;letter-spacing:.01em}
  /* El mismo botón, dentro de una fila del horario. Ocupa la tercera columna
     de la rejilla —la que antes repetía el nombre de los canales— y se ciñe a
     su ancho para no empujar la hora ni el nombre de la sesión. */
  /* 10px arriba y abajo dejan el botón en unos 48 de alto: por debajo de 44
     el dedo falla, y este se pulsa sobre todo desde el móvil. */
  .btn-ses{padding:10px 16px;justify-self:end;white-space:nowrap}
  /* Y el del cartel, bajo la hora de la carrera. Más grande que el de la fila
     porque ahí no compite con nada: es el remate del bloque que el visitante
     mira primero. */
  .btn-cartel{margin-top:20px;padding:15px 34px;gap:4px}
  .btn-cartel .bv-t{font-size:1.12rem;font-weight:800;letter-spacing:.12em}
  /* El precio, sin el velo de opacidad que llevan los subtítulos del resto de
     botones: sobre el verde claro rebajaba el contraste justo donde hay que
     leer una cifra, y una cifra a medio leer no invita a nada. Se separa del
     titular por tamaño y peso, que basta. */
  .btn-cartel .bv-s{font-size:0.97rem;font-weight:700;opacity:1}
  .btn-ses .bv-t{font-size:0.85rem;letter-spacing:.1em}
  .btn-ses .bv-s{font-size:0.8rem}
  @media (max-width:640px){
    /* Apilada, la fila ya no tiene tercera columna: el botón pasa a lo ancho,
       que en el móvil es donde más se pulsa. */
    .btn-ses{justify-self:stretch;justify-content:center;margin-top:6px}
  }
  @media (max-width:560px){
    .cuenta-atras .ca-u{min-width:0;flex:1 1 0;padding:10px 4px}
    .cuenta-atras .ca-u b{font-size:1.4rem}
    .cita-botones{flex-direction:column}
    .cita-botones .btn{justify-content:center}
  }

  /* Cabecera de día en la agenda: HOY · domingo 16 de agosto ————— */
  .dia-sep{display:flex;align-items:baseline;gap:12px;margin:26px 0 14px;font-weight:600}
  .dia-sep b{color:var(--amb);font-size:0.88rem;letter-spacing:.22em;text-transform:uppercase}
  .dia-sep span{color:var(--mu);font-size:0.8rem;letter-spacing:.15em;text-transform:uppercase}
  .dia-sep::after{content:"";flex:1;border-top:1px solid var(--line);transform:translateY(-4px)}

  /* Tarjeta de partido. */
  .pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(255px,1fr));
    gap:14px;margin-bottom:10px}
  .pcard{display:block;border:1px solid var(--line);background:var(--s2);
    padding:14px 16px 12px;text-decoration:none;color:var(--tx);
    transition:transform .18s,border-color .18s,box-shadow .18s}
  .pcard:hover{border-color:var(--amb);transform:translateY(-2px);
    box-shadow:0 10px 26px rgba(0,0,0,.4)}
  .pc-top{display:flex;align-items:baseline;justify-content:space-between;
    gap:10px;margin-bottom:10px}
  .pc-comp{font-size:0.78rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--mu);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .pc-hora{font-size:1.18rem;color:var(--amb);font-variant-numeric:tabular-nums;
    letter-spacing:.04em;flex:0 0 auto}
  .pc-hora.en-juego{display:inline-flex;align-items:center;gap:7px;color:#FF7B7B;
    font-size:0.8rem;letter-spacing:.18em;text-transform:uppercase;font-weight:600}
  .pc-hora.en-juego i{width:5px;height:5px;border-radius:50%;background:var(--tally);
    box-shadow:0 0 8px var(--tally);animation:pulse 1.8s infinite}
  .pc-eq{display:flex;align-items:center;gap:10px;padding:4px 0}
  .pc-eq img{width:26px;height:26px;object-fit:contain;flex:0 0 auto;
    filter:drop-shadow(0 0 6px rgba(255,255,255,.12))}
  .esc-vacio{width:26px;height:26px;flex:0 0 auto;border:1px dashed var(--line)}
  .pc-eq span{font-weight:600;font-size:0.97rem;line-height:1.2}
  .pc-canal{margin-top:10px;padding-top:10px;border-top:1px solid var(--line);
    color:var(--mu);font-size:0.8rem;letter-spacing:.1em;text-transform:uppercase;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .pcard.vivo{border-color:rgba(255,45,45,.5)}
  .pcard.vivo .pc-canal{color:#FF7B7B}
  /* Un gran premio ya corrido se queda en el calendario, atenuado. */
  .pcard.pasado{opacity:.55}
  .pcard.pasado:hover{opacity:.9}

  /* Cine de hoy: sin carteles que no son nuestros, el cartel es tipográfico
     y el color de la banda es el del canal, como en toda la web. */
  .cine{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}
  .cinec{display:flex;align-items:center;gap:16px;border:1px solid var(--line);
    border-left:3px solid var(--c);background:
    linear-gradient(100deg,color-mix(in srgb,var(--c) 12%,var(--s2)) 0%,var(--s2) 55%);
    padding:16px;text-decoration:none;color:var(--tx);
    transition:transform .18s,border-color .18s,box-shadow .18s}
  @supports not (background:color-mix(in srgb,red 50%,#000)){
    .cinec{background:var(--s2)}
  }
  .cinec:hover{transform:translateY(-2px);border-color:var(--c);
    box-shadow:0 10px 26px rgba(0,0,0,.4)}
  .cinec .ch{font-size:1.35rem;color:var(--amb);font-variant-numeric:tabular-nums;
    letter-spacing:.03em;flex:0 0 auto;min-width:3.4ch}
  .cc-cuerpo{min-width:0}
  .cc-cuerpo small{display:block;font-size:0.78rem;letter-spacing:.16em;
    text-transform:uppercase;color:var(--mu);margin-bottom:4px;white-space:nowrap;
    overflow:hidden;text-overflow:ellipsis}
  .cc-cuerpo b{display:block;font-size:1.04rem;font-weight:700;line-height:1.25;
    letter-spacing:-.01em}

  /* Cabecera con foto ambiental, tratamiento "al lado" (elegido por Salva
     sobre maqueta, 20-ago-2026): texto en su columna y foto en la suya.
     Nació con la foto a ratio natural; el 20-ago Salva pidió que TODOS los
     banners midieran lo mismo, y el 21 que fueran más bajos y rectangulares,
     "del alto del texto". La altura la marca AHORA la columna de texto —que es
     idéntica en todos los hubs: título, entradilla y pestañas—, y la foto va
     envuelta y en absoluto para rellenarla con `cover` sin estirar la fila con
     su alto intrínseco: ese era el motivo de que el hero saliera tan alto.
     Uniforme y bajo. En móvil, foto arriba y texto debajo. */
  .page-head.con-tema{display:grid;grid-template-columns:44% 56%;padding:0;
    margin-bottom:30px;border:1px solid var(--line);overflow:hidden;
    background:none;min-height:250px}
  .page-head.con-tema .ct-txt{background:var(--s);padding:34px 34px;
    display:flex;flex-direction:column;justify-content:center;
    border-right:1px solid var(--line)}
  /* La foto del hub va envuelta y en absoluto: no estira la fila con su alto
     intrínseco, sino que rellena y recorta la banda que marca el texto. */
  .page-head.con-tema:not(.ficha) .ct-foto{position:relative;overflow:hidden;
    align-self:stretch}
  .page-head.con-tema:not(.ficha) .ct-foto img{position:absolute;inset:0;
    display:block;width:100%;height:100%;object-fit:cover}
  .page-head.con-tema.ficha .ct-foto{display:block;width:100%;height:100%;
    object-fit:cover}
  .page-head.con-tema h1{text-shadow:none}
  .page-head.con-tema p{color:var(--mu);text-shadow:none}
  .page-head.con-tema .dv-temas a{background:transparent}
  .page-head.con-tema .dv-temas a[aria-current="page"]{background:var(--amb)}
  @media (max-width:720px){
    .page-head.con-tema{grid-template-columns:1fr;min-height:0}
    .page-head.con-tema .ct-txt{border-right:none;order:2;padding:30px 20px}
    .page-head.con-tema .ct-foto{order:1;height:200px}
  }
  /* En una ficha (partido, gran premio) la foto es ambiente, no la noticia:
     el protagonista sigue siendo el marcador con la hora. Por eso ocupa
     menos que en un hub y se recorta en una banda —aquí sí, porque son
     fotos elegidas para eso y ninguna cuenta nada en los bordes—, lo que
     además baja lo que el navegador tiene que pintar antes de la hora. */
  .page-head.con-tema.ficha{grid-template-columns:58% 42%;margin-bottom:22px}
  /* El título de ficha se alinea a la izquierda como su antetítulo: centrado
     dentro de media rejilla quedaba flotando y descuadrado respecto a la
     línea de competición. */
  .page-head.con-tema.ficha .ct-txt{padding:28px 26px;text-align:left}
  .page-head.con-tema.ficha h1,
  .page-head.con-tema.ficha p{text-align:left}
  /* La foto llena la altura del bloque. El tope de 200px que tenía aquí
     venía de cuando cada cabecera medía lo que su foto; con la altura fija
     dejaba 159 px de hueco negro bajo la imagen en todas las fichas. */
  .page-head.con-tema.ficha .ct-foto{height:100%;object-fit:cover;
    align-self:stretch}
  .page-head.con-tema.ficha h1{margin:0 0 6px}
  .page-head.con-tema.ficha p{margin:0;font-size:0.93rem;letter-spacing:.02em}
  @media (max-width:720px){
    .page-head.con-tema.ficha{grid-template-columns:1fr}
    /* Misma banda que en los hubs: si todos los banners miden igual, en el
       teléfono también. */
    .page-head.con-tema.ficha .ct-foto{height:200px}
  }

  /* Temas de la sección: Todo · Fútbol · Cine. Mismo lenguaje que la nav de
     cabecera, en tamaño de página. */
  .dv-temas{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
  .dv-temas a{border:1px solid var(--line);color:var(--mu);text-decoration:none;
    padding:7px 16px;font-size:0.82rem;letter-spacing:.16em;text-transform:uppercase;
    font-weight:600;transition:color .18s,border-color .18s,background .18s}
  .dv-temas a:hover{color:var(--tx);border-color:var(--amb)}
  .dv-temas a[aria-current="page"]{color:var(--g);background:var(--amb);
    border-color:var(--amb)}
  /* La carátula de TMDB, cuando la hay. Medidas fijas: no empuja al cargar. */
  .cc-poster{width:56px;height:84px;object-fit:cover;flex:0 0 auto;
    box-shadow:0 4px 14px rgba(0,0,0,.5)}
  .tmdb-nota{font-size:0.8rem;color:#5F6E80;margin:14px 0 0}
  /* Estados del cine en el día completo. */
  .cinec.pasada{opacity:.5}
  .cinec.pasada:hover{opacity:.85}
  .cinec.ahora{border-color:rgba(255,45,45,.5)}
  .cc-vivo{color:#FF7B7B;font-weight:600}

  /* El buscador. Un sintonizador: campo grande, resultados como diales. */
  .buscador{position:relative;margin-top:22px;max-width:640px}
  .buscador input{width:100%;background:var(--s2);border:1px solid var(--line);
    color:var(--tx);font:inherit;font-size:1rem;padding:14px 18px;
    caret-color:var(--amb);transition:border-color .18s}
  .buscador input::placeholder{color:#5F6E80}
  .buscador input:focus{outline:none;border-color:var(--amb)}
  .buscador input::-webkit-search-cancel-button{-webkit-appearance:none}
  .qres{position:absolute;top:calc(100% - 1px);left:0;right:0;z-index:40;
    background:var(--s);border:1px solid var(--amb);max-height:min(420px,60vh);
    overflow:auto;box-shadow:0 18px 44px rgba(0,0,0,.55)}
  .q-fila{display:flex;align-items:baseline;gap:12px;padding:11px 16px;
    text-decoration:none;color:var(--tx);border-top:1px solid var(--line)}
  .q-fila:first-child{border-top:0}
  .q-fila:hover{background:var(--s2)}
  .q-tipo{flex:0 0 auto;min-width:9ch;font-size:0.78rem;letter-spacing:.16em;
    text-transform:uppercase;color:var(--amb)}
  .q-cuerpo{min-width:0}
  .q-cuerpo b{display:block;font-size:0.97rem;font-weight:600;line-height:1.3}
  .q-cuerpo small{display:block;color:var(--mu);font-size:0.85rem;margin-top:1px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .q-nada{padding:16px;color:var(--mu);font-size:0.93rem}
  .q-nada p{margin:0 0 8px}
  .q-nada a{color:var(--tx)}

  /* Rejilla de equipos del índice. */
  .equipos{list-style:none;margin:0;padding:0;display:grid;gap:1px;
    grid-template-columns:repeat(auto-fill,minmax(200px,1fr));
    background:var(--line);border:1px solid var(--line)}
  .equipos a{display:flex;align-items:center;gap:12px;padding:12px 14px;
    background:var(--g);color:var(--tx);text-decoration:none;font-size:0.97rem;
    font-weight:600;transition:background .18s}
  .equipos a:hover{background:var(--s2)}
  .equipos img{width:34px;height:34px;object-fit:contain;flex:0 0 auto;
    filter:drop-shadow(0 0 6px rgba(255,255,255,.12))}

  /* Ficha de partido y de equipo: contenido centrado y más ancho. El resto de
     .doc (ayuda, programas) sigue a 68ch y a la izquierda: son texto corrido. */
  .doc-evento{max-width:940px;margin:0 auto}
  .doc-evento h1{text-align:center}
  .doc-evento .doc-lead{max-width:62ch;margin-left:auto;margin-right:auto}
  .doc-evento .externa-nota{text-align:center}
  .btns{display:flex;gap:12px;flex-wrap:wrap}

  /* Cabecera de la página de equipo: el escudo preside, centrado. */
  .equipo-cab{display:flex;flex-direction:column;align-items:center;gap:14px;
    margin:0 0 18px}
  .equipo-cab .escudo-hueco{width:88px;height:88px;display:flex;
    align-items:center;justify-content:center}
  .equipo-cab .escudo{width:88px;height:88px;object-fit:contain;
    filter:drop-shadow(0 0 18px rgba(255,255,255,.18))}
  .equipo-cab h1{margin:0}

  /* El plan de la VPN en la página del extranjero: la solución en tres
     pasos, con el mismo lenguaje del cartel de partidos. */
  .vpn-plan{position:relative;border:1px solid var(--line);background:var(--s2);
    padding:26px 26px 22px;margin:30px 0;overflow:hidden}
  .vpn-plan::before{content:"";position:absolute;inset:0;pointer-events:none;
    background:radial-gradient(70% 100% at 50% -20%,rgba(37,208,122,.09),transparent 60%)}
  .vpn-rotulo{font-size:0.8rem;letter-spacing:.22em;text-transform:uppercase;
    color:var(--ok);margin-bottom:6px}
  .vpn-plan h2{margin-top:0 !important;border:0 !important;padding-top:0 !important}
  .vpn-pasos{list-style:none;margin:22px 0;padding:0;display:grid;gap:14px;
    grid-template-columns:repeat(auto-fit,minmax(200px,1fr));counter-reset:paso}
  .vpn-pasos li{counter-increment:paso;background:var(--g);border:1px solid var(--line);
    padding:16px 16px 14px;position:relative}
  .vpn-pasos li::before{content:counter(paso);display:block;font-family:"SF Mono",
    ui-monospace,"Roboto Mono",monospace;font-size:1.6rem;color:var(--amb);
    margin-bottom:8px;text-shadow:0 0 18px rgba(255,176,32,.35)}
  .vpn-pasos b{display:block;font-size:0.97rem;margin-bottom:5px}
  .vpn-pasos span{display:block;color:var(--mu);font-size:0.88rem;line-height:1.5}
  .vpn-cta{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:6px 0 10px;
    position:relative;z-index:1}
  .btn-vpn{border-color:var(--ok) !important;color:var(--ok) !important;
    font-size:0.97rem !important;padding:12px 22px !important}
  .btn-vpn:hover{background:var(--ok) !important;color:var(--g) !important}
  .vpn-garantia{color:var(--mu);font-size:0.85rem}
  @media (prefers-reduced-motion:no-preference){
    .vpn-pasos li{animation:sube .45s ease backwards}
    .vpn-pasos li:nth-child(2){animation-delay:.08s}
    .vpn-pasos li:nth-child(3){animation-delay:.16s}
  }

  /* Entrada suave de las tarjetas. Solo transform y opacity: no mueve el
     layout (CLS 0) y quien pide menos movimiento no la ve. */
  @media (prefers-reduced-motion:no-preference){
    .pcard,.cinec{animation:sube .4s ease backwards}
    .pcard:nth-child(2),.cinec:nth-child(2){animation-delay:.04s}
    .pcard:nth-child(3),.cinec:nth-child(3){animation-delay:.08s}
    .pcard:nth-child(4),.cinec:nth-child(4){animation-delay:.12s}
    .pcard:nth-child(5),.cinec:nth-child(5){animation-delay:.16s}
    .pcard:nth-child(n+6),.cinec:nth-child(n+6){animation-delay:.2s}
  }
  @keyframes sube{from{opacity:0;transform:translateY(8px)}}

  @media (max-width:640px){
    .marcador.xl{padding:22px 12px 18px}
    .marcador.xl .escudo-hueco,.marcador.xl .escudo{width:60px;height:60px}
    .marcador.xl .equipo span{font-size:0.88rem}
    .marcador .hora{font-size:1.9rem}
    .marcador .fecha{white-space:normal;text-align:center}
    .marcador .centro{min-width:0}
    .cartel{padding:16px 12px 18px}
  }

  /* Índice de canales en texto. La rejilla la monta el navegador, pero un
     rastreador no ejecuta JavaScript: sin esta lista la portada no enlazaba a
     ninguna página de canal. Discreta a la vista, decisiva para el rastreo. */
  /* En bloque a propósito: es un <nav> y la regla de la cabecera lo volvía
     flex en fila, así que rótulos y listas quedaban en columnas lado a lado
     y la lista se encogía a dos columnas en vez de usar el ancho entero. */
  .indice-canales{display:block;margin:34px 0 0;padding-top:22px;border-top:1px solid var(--line)}
  .indice-canales h2,.indice-canales h3{font-size:0.8rem;letter-spacing:.18em;
    text-transform:uppercase;color:var(--mu);margin:0 0 12px;font-weight:600}
  .indice-canales h3{margin-top:18px}
  .indice-canales ul{list-style:none;margin:0;padding:0;
    display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:6px 18px}
  .indice-canales li{font-size:0.88rem;color:#5F6E80;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .indice-canales a{color:var(--mu);text-decoration:none}
  .indice-canales a:hover{color:var(--amb)}

  /* H1 de página. En portada y fichas de canal lo escribe el servidor. */
  .h1-pagina{font-size:clamp(1.5rem,3vw,2.1rem);font-weight:700;letter-spacing:-.02em;
    margin:26px 0 18px;text-wrap:balance}
  .doc-lista.columnas{columns:3 220px;column-gap:26px}
  .doc-lista.columnas li{break-inside:avoid}

  /* Rejilla de enlaces a programas: en la ficha del canal y como vecinos en la
     de cada programa. Son enlaces, no adornos — el motivo por el que existen
     es que 307 de las 583 páginas de programa recibían un único enlace. */
  .rejilla-programas{list-style:none;padding:0;margin:14px 0 6px;
    display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:2px 18px}
  .rejilla-programas li{border-bottom:1px solid var(--line)}
  .rejilla-programas a{display:block;padding:9px 2px;color:var(--tx);text-decoration:none;
    font-size:0.93rem;line-height:1.25;overflow:hidden;text-overflow:ellipsis;
    white-space:nowrap;transition:.15s}
  .rejilla-programas a:hover{color:var(--amb);padding-left:5px}
  .programas-canal{margin-top:34px}

  /* ===================== MANDO DE RADIO =====================
     Sustituye al <audio controls> nativo. El motivo no es estético: los
     controles del navegador viven en un shadow DOM inalcanzable, así que no
     había forma de saber cuándo el usuario pulsaba play, ni de decirle que la
     señal estaba conectando. Con un botón normal el gesto es nuestro. */
  .radio-mando{display:flex;align-items:center;gap:12px;margin-top:12px}
  .btn-oir{display:inline-flex;align-items:center;gap:9px;cursor:pointer;
    background:var(--c);color:#fff;border:0;padding:9px 16px 9px 13px;
    font:inherit;font-size:0.85rem;font-weight:600;letter-spacing:.1em;
    text-transform:uppercase;border-radius:999px;transition:.18s;
    box-shadow:0 3px 14px rgba(0,0,0,.4)}
  .btn-oir:hover{filter:brightness(1.14);transform:translateY(-1px)}
  .btn-oir:focus-visible{outline:2px solid var(--amb);outline-offset:3px}
  .btn-oir .ico{width:0;height:0;border-style:solid;border-width:6px 0 6px 10px;
    border-color:transparent transparent transparent #fff;transition:.18s}
  /* Sonando, el triángulo se convierte en el cuadrado de parar. */
  .btn-oir.sonando .ico{width:10px;height:11px;border:0;background:#fff;border-radius:1px}
  .radio-estado{font-size:0.82rem;letter-spacing:.1em;text-transform:uppercase;
    color:var(--mu);min-height:1em}
  .btn-oir.sonando+.radio-estado{color:var(--ok)}
  /* Ficha de emisora: el hero viene escrito del generador, sin parrilla. */
  .hero-radio .now{font-size:clamp(1.7rem,3.6vw,2.7rem);font-weight:700;
    line-height:1;letter-spacing:-.024em;margin:0 0 14px;text-wrap:balance}
  .hero-radio .hero-txt .radio-mando{margin-top:2px}
  .hero-radio .radio-set{margin-bottom:22px}
  .hero-radio .btn-oir{padding:12px 24px 12px 19px;font-size:0.88rem}
  .hero-radio .geo-nota{position:relative;z-index:6}
  .canal-intro,.emisora-intro,.equipo-intro{max-width:74ch;color:var(--mu);font-size:0.97rem;
    line-height:1.6;margin:0 0 30px}

  /* ---- favoritas ----
     El corazón de la tarjeta y el botón de la ficha. El estado vive en
     aria-pressed: el atributo de accesibilidad ES el estado, sin clase aparte. */
  .fav{position:absolute;top:8px;left:8px;z-index:5;width:30px;height:30px;
    display:flex;align-items:center;justify-content:center;border:0;
    border-radius:50%;background:var(--velo);color:#fff;opacity:.55;
    cursor:pointer;transition:opacity .18s,transform .18s}
  .fav:hover{opacity:1;transform:scale(1.12)}
  .fav[aria-pressed="true"]{opacity:1;color:var(--tally)}
  .fav[aria-pressed="true"] svg{animation:favPop .35s cubic-bezier(.2,.75,.3,1)}
  @keyframes favPop{40%{transform:scale(1.45)}}
  .fav:focus-visible{outline:2px solid var(--amb);outline-offset:2px}
  .fav-btn{gap:8px;cursor:pointer;background:none;font:inherit}
  .fav-btn[aria-pressed="true"]{color:var(--tally);border-color:var(--tally)}

  /* ---- buscador de /radio/ ---- */
  .radio-busca{display:flex;align-items:center;gap:14px;margin:0 0 26px;
    flex-wrap:wrap}
  /* El selector de géneros, con el mismo traje que los temas de /donde-ver/
     pero en botón: filtra en cliente para no cortar la emisora que suena. */
  .radio-generos{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
  .radio-generos button{border:1px solid var(--line);background:none;
    color:var(--mu);cursor:pointer;padding:9px 14px;font:inherit;
    font-size:0.82rem;letter-spacing:.14em;text-transform:uppercase;
    font-weight:600;transition:color .18s,border-color .18s,background .18s}
  .radio-generos button:hover{color:var(--tx);border-color:var(--amb)}
  .radio-generos button[aria-pressed="true"]{color:var(--g);
    background:var(--amb);border-color:var(--amb)}
  .radio-generos button:focus-visible{outline:2px solid var(--amb);
    outline-offset:2px}
  #buscaRadio{flex:0 1 340px;background:var(--s2);border:1px solid var(--line);
    color:var(--tx);font:inherit;font-size:0.97rem;padding:11px 14px;
    border-radius:10px}
  #buscaRadio::placeholder{color:var(--mu)}
  #buscaRadio:focus-visible{outline:2px solid var(--amb);outline-offset:2px}
  .busca-n{font-size:0.8rem;letter-spacing:.13em;text-transform:uppercase;
    color:var(--mu)}
  /* Señal caída en el origen: la verdad en vez de un botón que no suena.
     Gris a propósito, no rojo: --tally ya significa "en directo ahora
     mismo" en toda la web (favoritos, partidos en juego, la línea de
     "ahora" en la parrilla) y un canal caído es justo lo contrario de eso. */
  .cell-ch .mal,.radio-meta .mal{color:#7C8898}
  /* La tarjeta entera se apaga un poco cuando está caída: no compite
     visualmente con lo que sí funciona, pero se puede seguir pulsando.
     Vale para .cell.radio también: .radio ya incluye .cell. */
  .cell.caida{opacity:.6;filter:grayscale(.45)}
  .cell.caida:hover{opacity:.85}
  .radio-caida-nota{margin:12px 0 0;font-size:0.88rem;line-height:1.5;color:var(--mu)}
  .radio-caida-nota a{color:var(--tx)}
  /* «Escúchalo por la radio» en las páginas de partido. */
  .radio-partido{margin:34px 0}
  .radio-partido-nota{max-width:74ch;color:var(--mu);font-size:0.93rem;
    line-height:1.55;margin:0 0 18px}
  /* El botón de traspaso comparte estilo con los enlaces .more de sección. */
  button.more{background:none;border:0;border-bottom:1px solid var(--line);
    cursor:pointer;font:inherit;padding:0 0 2px}
  /* Aviso de una sola vez: honesto y que se va solo. */
  .toast{position:fixed;left:50%;bottom:18px;transform:translateX(-50%) translateY(140%);
    z-index:75;max-width:min(520px,calc(100% - 24px));padding:12px 18px;
    background:var(--s2);border:1px solid var(--line);border-radius:5px;
    box-shadow:0 16px 40px -12px rgba(0,0,0,.8);
    font-size:0.93rem;line-height:1.5;color:var(--tx);
    transition:transform .35s cubic-bezier(.2,.75,.3,1)}
  .toast.toast-in{transform:translateX(-50%) translateY(0)}
  @media(prefers-reduced-motion:reduce){.toast{transition:none}}

  /* ---- mini reproductor fijo ----
     Anclado abajo mientras suena una emisora: con 41 tarjetas, la que sonaba
     se perdía con el scroll y no había forma de saber qué sonaba ni de
     pararlo. Va bajo el aviso de cookies (90) y sobre la cabecera (60). */
  /* Hermana de la miniatura de TV del fastplay, y se nota: cuelga del mismo
     sitio (misma esquina, mismo top con --hd1-h, mismo radio, misma sombra y
     misma animación de entrada). Lo que cambia es lo que enseña: la TV tiene
     imagen y la radio tiene color — el fondo va tintado con el de la emisora
     para despegarse del fondo de la web, y una aurora lo mueve al sonar. */
  .mini{position:fixed;display:none;z-index:70;
    width:min(440px,calc(100% - 24px));overflow:hidden;
    cursor:grab;touch-action:none;
    align-items:center;gap:11px;padding:9px 12px;
    background:linear-gradient(115deg,
      color-mix(in srgb,var(--c) 30%,#0B1016) 0%,rgba(11,16,22,.97) 58%);
    border:1px solid color-mix(in srgb,var(--c) 45%,var(--line));
    -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
    border-radius:5px;
    box-shadow:0 16px 40px -12px rgba(0,0,0,.8),0 0 0 1px rgba(255,255,255,.06)}
  /* Reserva para navegadores sin color-mix: fondo neutro y borde del canal. */
  @supports not (background:color-mix(in srgb,red 50%,#000)){
    .mini{background:rgba(11,16,22,.97);border-color:var(--c)}
  }
  .mini.mini-in{display:flex;animation:sh-baja .22s ease}
  /* Los seis anclajes: esquinas y centros de arriba y abajo. Sin transform a
     propósito — la animación de entrada (sh-baja) anima transform y pisaría
     un centrado por translateX; el centro se hace restando el ancho en calc.
     Las cuentas se repiten en miniAnclas() de app.js: si cambian aquí,
     cambian allí. */
  .mini.pos-tl,.mini.pos-tc,.mini.pos-tr{top:calc(var(--hd1-h,49px) + 6px)}
  .mini.pos-bl,.mini.pos-bc,.mini.pos-br{bottom:14px}
  .mini.pos-tl,.mini.pos-bl{left:max(28px,calc((100% - 1240px)/2 + 28px))}
  .mini.pos-tc,.mini.pos-bc{left:calc(50% - min(440px,100% - 24px)/2)}
  .mini.pos-tr,.mini.pos-br{right:max(28px,calc((100% - 1240px)/2 + 28px))}
  /* Mientras se arrastra: sin transiciones, que el mini vaya pegado al
     puntero. La animación de entrada no se anula: ponerla a none y devolverla
     la relanzaba entera en cada suelta, un parpadeo por viaje. */
  .mini.mini-drag{cursor:grabbing;transition:none;
    -webkit-user-select:none;user-select:none}
  /* El contenido va por encima de la aurora del fondo. */
  .mini>*{position:relative;z-index:1}
  /* El filo respira con el color de la emisora; abajo, mirando al contenido. */
  .mini::before{content:"";position:absolute;inset:auto 0 0 0;height:2px;z-index:2;
    background:linear-gradient(90deg,transparent 4%,var(--c) 50%,transparent 96%);
    animation:miniFilo 3.2s ease-in-out infinite}
  @keyframes miniFilo{0%,100%{opacity:.45}50%{opacity:1}}
  /* La aurora: dos manchas difuminadas del color de la emisora que derivan
     despacio por el fondo. Solo se mueven cuando de verdad está sonando —
     la animación es la señal de "activa", no un adorno permanente. */
  .mini::after{content:"";position:absolute;inset:-30%;z-index:0;
    pointer-events:none;
    background:
      radial-gradient(42% 60% at 22% 30%,var(--c) 0%,transparent 70%),
      radial-gradient(38% 55% at 78% 72%,var(--c) 0%,transparent 70%);
    opacity:.10;filter:blur(22px)}
  .mini[data-modo="sonando"]::after{opacity:.22;
    animation:miniAurora 8s ease-in-out infinite alternate}
  @keyframes miniAurora{from{transform:translateX(-5%) rotate(-4deg)}
    to{transform:translateX(5%) rotate(5deg)}}

  /* El hueco del distintivo: dentro va la misma cápsula (logo-wrap/mark) que
     usan las tarjetas, para que el mini hable el idioma del resto de la web. */
  .mini-logo{flex:0 0 auto;display:flex}

  .mini-info{min-width:0;flex:1}
  .mini-nombre{display:block;color:var(--tx);text-decoration:none;
    font-weight:600;font-size:0.97rem;line-height:1.25;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mini-nombre:hover{color:var(--amb)}
  .mini-meta{display:flex;gap:12px;align-items:center;margin-top:2px;
    font-size:0.8rem;letter-spacing:.13em;text-transform:uppercase;color:var(--mu)}
  .mini-estado{display:flex;align-items:center;gap:6px;min-height:1em}
  .mini[data-modo="sonando"] .mini-estado{color:var(--ok)}
  .mini[data-modo="error"] .mini-estado{color:var(--amb)}
  .mini-estado i{width:5px;height:5px;border-radius:50%;background:var(--ok);
    animation:pulse 1.8s infinite}

  /* Ecualizador: cinco barras con el color de la emisora. Duraciones primas
     entre sí para que el conjunto nunca repita el mismo compás. */
  .mini-eq{display:flex;align-items:flex-end;gap:3px;height:24px;flex:0 0 auto}
  .mini-eq i{width:3px;height:100%;border-radius:2px;
    background:linear-gradient(180deg,rgba(255,255,255,.55),var(--c));
    transform:scaleY(.12);transform-origin:bottom;
    transition:transform .3s}
  .mini[data-modo="sonando"] .mini-eq i{animation:miniEq 1s ease-in-out infinite}
  .mini[data-modo="sonando"] .mini-eq i:nth-child(1){animation-duration:.83s;animation-delay:-.30s}
  .mini[data-modo="sonando"] .mini-eq i:nth-child(2){animation-duration:.67s;animation-delay:-.55s}
  .mini[data-modo="sonando"] .mini-eq i:nth-child(3){animation-duration:.97s;animation-delay:-.10s}
  .mini[data-modo="sonando"] .mini-eq i:nth-child(4){animation-duration:.73s;animation-delay:-.42s}
  .mini[data-modo="sonando"] .mini-eq i:nth-child(5){animation-duration:.89s;animation-delay:-.66s}
  @keyframes miniEq{0%,100%{transform:scaleY(.2)}50%{transform:scaleY(1)}}
  /* Conectando: laten bajito y en orden, como buscando la señal. */
  .mini[data-modo="conectando"] .mini-eq i{animation:miniBusca 1.1s ease-in-out infinite}
  .mini[data-modo="conectando"] .mini-eq i:nth-child(2){animation-delay:.12s}
  .mini[data-modo="conectando"] .mini-eq i:nth-child(3){animation-delay:.24s}
  .mini[data-modo="conectando"] .mini-eq i:nth-child(4){animation-delay:.36s}
  .mini[data-modo="conectando"] .mini-eq i:nth-child(5){animation-delay:.48s}
  @keyframes miniBusca{0%,100%{transform:scaleY(.12);opacity:.4}
    50%{transform:scaleY(.42);opacity:1}}

  .mini-vol{width:76px;accent-color:var(--c);cursor:pointer}
  .mini-play{flex:0 0 42px;width:42px;height:42px;border-radius:50%;border:0;
    background:var(--c);cursor:pointer;display:flex;align-items:center;
    justify-content:center;transition:filter .18s,transform .18s;
    box-shadow:0 3px 14px rgba(0,0,0,.4)}
  .mini-play:hover{filter:brightness(1.15);transform:scale(1.06)}
  .mini-play:focus-visible{outline:2px solid var(--amb);outline-offset:3px}
  /* Sonando o conectando: cuadrado de parar; parado: triángulo de play. */
  .mini-play .ico{width:11px;height:12px;background:#fff;border-radius:1px}
  .mini[data-modo="parado"] .mini-play .ico,
  .mini[data-modo="error"] .mini-play .ico{width:0;height:0;background:none;
    border-radius:0;border-style:solid;border-width:7px 0 7px 11px;
    border-color:transparent transparent transparent #fff;margin-left:3px}
  .mini-x{flex:0 0 auto;background:none;border:0;color:var(--mu);
    font-size:1.15rem;line-height:1;cursor:pointer;padding:6px 4px}
  .mini-x:hover{color:var(--tx)}
  .mini-x:focus-visible{outline:2px solid var(--amb);outline-offset:2px}

  @media(max-width:700px){
    .mini{gap:10px;width:calc(100% - 24px)}
    /* A todo lo ancho, las tres posiciones horizontales son la misma. */
    .mini.pos-tl,.mini.pos-tc,.mini.pos-tr,
    .mini.pos-bl,.mini.pos-bc,.mini.pos-br{left:12px;right:auto}
    .mini-vol{display:none}
    .mini-eq{height:20px}
  }
  @media(prefers-reduced-motion:reduce){
    .mini.mini-in{animation:none}
    .mini::before,.mini::after,.mini-eq i,.mini-estado i{animation:none}
    .mini[data-modo="sonando"] .mini-eq i{transform:scaleY(.6)}
  }

  /* ===================== PARRILLA ======================
     Una parrilla de verdad: la posición horizontal es la hora. Lo que había
     antes era una lista por canal puesta en fila —cada cadena empezaba donde
     le tocaba y todos los programas medían igual durase uno cinco minutos y
     otro tres horas—, y así no se puede responder a "qué hay a las diez".

     El ancho de cada emisión sale de su duración en minutos (--d) y su
     posición del minuto en que empieza (--a), contados desde las 6:00, que es
     cuando arranca el día de televisión. */
  /* Subido de 3.6 a 4.2 el 13-sep-2026, a la vez que la letra: con la escala
     nueva los títulos se cortaban a media palabra en las emisiones cortas. */
  .g-tabla{--pxm:4.2px;           /* píxeles por minuto de emisión */
    --colc:190px;                 /* ancho de la columna de canales */
    overflow-x:auto;overflow-y:visible;border:1px solid var(--line);
    background:var(--g);scrollbar-width:thin;
    scrollbar-color:var(--line) transparent}
  @media(max-width:700px){.g-tabla{--pxm:3.1px;--colc:124px}}

  /* Acotadas a .g-tabla a propósito: sin el prefijo, este display:flex pisaba
     la rejilla de .g-lane de arriba y descolocaba las páginas de género y la
     parrilla de la ficha de canal (.canal-parrilla), que también son .g-lane.
     Pasó: se vio en /guia-tv/cine-hoy/ el 18-ago-2026. */
  .g-eje,.g-tabla .g-lane{display:flex;width:max-content;min-width:100%}
  /* La columna del canal se queda pegada al borde mientras la parrilla corre
     por debajo: sin esto, al desplazarse a las 23:00 no sabes de quién es cada
     fila. */
  .g-tabla .g-name,.g-eje .g-name{position:sticky;left:0;z-index:3;flex:0 0 var(--colc);
    display:flex;align-items:center;gap:10px;padding:10px 14px;
    background:var(--g);border-right:2px solid var(--line);
    font-size:0.93rem;line-height:1.15}
  .g-tabla .g-name a{font-weight:600}
  .g-logo{flex:0 0 34px;width:34px;height:34px;border-radius:7px;overflow:hidden;
    display:inline-flex;align-items:center;justify-content:center}
  .g-logo img{width:34px;height:34px;object-fit:contain}
  .g-logo.sobre-claro{background:#fff}
  .g-logo.sobre-oscuro{background:#0B1016;box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
  .g-logo.sobre-canal{background:var(--c);box-shadow:inset 0 0 0 1px rgba(255,255,255,.18)}

  /* La regla de horas, pegada arriba al desplazarse en vertical. */
  .g-eje{position:sticky;top:0;z-index:4;background:var(--g);
    border-bottom:1px solid var(--line)}
  .g-eje-hueco{font-size:0.8rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--mu);z-index:5}
  .g-marcas{position:relative;flex:0 0 calc(var(--mins,1440) * var(--pxm));height:38px}
  .g-marca{position:absolute;top:0;left:calc(var(--a) * var(--pxm));height:38px;
    display:flex;align-items:center;padding-left:8px;
    border-left:1px solid var(--line);
    font-size:0.82rem;color:var(--mu);font-variant-numeric:tabular-nums;
    letter-spacing:.06em;white-space:nowrap}

  /* Todo acotado a .g-tabla a propósito: estas mismas clases viven también en
     la ficha de canal (.canal-parrilla), donde son una rejilla normal. Sin el
     prefijo, el position:absolute con --a/--d se colaba allí y apilaba las
     emisiones en una caja rota — se vio en producción el 18-ago-2026. */
  .g-tabla .g-lane{border-bottom:1px solid var(--line)}
  .g-tabla .g-lane:hover .g-name{background:var(--s2)}
  .g-tabla .g-slots{position:relative;flex:0 0 calc(var(--mins,1440) * var(--pxm));
    height:74px;list-style:none;margin:0;padding:0}
  .g-tabla .g-slot{position:absolute;top:0;bottom:0;
    left:calc(var(--a) * var(--pxm));width:calc(var(--d) * var(--pxm));
    padding:9px 11px;overflow:hidden;
    border-left:1px solid var(--line);background:var(--g);
    transition:background .15s}
  .g-tabla .g-slot:hover{background:var(--s2);z-index:2}
  /* Lo que está en antena ahora mismo, marcado con el color de la cadena. */
  .g-tabla .g-slot[data-live="1"]{background:var(--s);box-shadow:inset 3px 0 0 var(--c)}
  .g-tabla .g-h{display:block;font-size:0.82rem;color:var(--amb);
    font-variant-numeric:tabular-nums;letter-spacing:.04em;margin-bottom:3px}
  .g-tabla .g-t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    overflow:hidden;font-size:0.93rem;line-height:1.25;
    color:var(--tx);text-decoration:none}
  /* Dentro de la rejilla el enlace no reacciona como enlace: el resaltado
     es de la celda entera y la ficha se abre al pulsar (Salva, 3-sep-2026).
     Fuera de .g-tabla (listas de canal, géneros) sigue comportándose normal. */
  .g-tabla a.g-t:hover{color:var(--tx);text-decoration:none}
  /* La hora de fin solo cabe en las emisiones largas; en las cortas estorba. */
  .g-hasta{display:none;font-size:0.8rem;color:var(--mu);margin-top:4px}
  .g-tabla .g-slot{container-type:inline-size}
  @container (min-width: 210px){.g-hasta{display:block}}

  /* La línea de ahora, que coloca el navegador. */
  .g-ahora{position:absolute;top:0;bottom:0;width:2px;background:var(--tally);
    z-index:6;pointer-events:none;box-shadow:0 0 10px var(--tally)}
  .g-ahora::before{content:"";position:absolute;top:0;left:-4px;
    width:10px;height:10px;border-radius:50%;background:var(--tally)}

  /* Los canales que no salen en la parrilla, dichos en voz alta: un canal que
     desaparece sin explicación parece un fallo nuestro, y lo que pasa es que
     su cadena no publica programación. */
  .g-fuera{margin:18px 0 0;font-size:0.88rem;line-height:1.7;color:var(--mu);
    padding:14px 16px;background:var(--s2);border-left:2px solid var(--line)}
  .g-fuera b{color:var(--tx)}
  .g-fuera a{color:var(--mu);text-decoration:none;border-bottom:1px solid var(--line)}
  .g-fuera a:hover{color:var(--amb);border-bottom-color:var(--amb)}

  /* ===================== HERO REPRODUCTOR (fastplay) =====================
     El hero es un reproductor: información a la izquierda, marco con play a
     la derecha. El monitor de señal que ocupaba la columna vive ahora en la
     cabecera como chip con onda de actividad. Las reglas del monitor viejo
     (.monitor, .vu, .mon-*) siguen arriba porque la radio las usa. */

  /* chip de señal en la cabecera */
  .chip-senal{display:flex;align-items:center;gap:8px;font-size:0.8rem;letter-spacing:.12em;
    text-transform:uppercase;color:var(--mu);border:1px solid var(--line);
    padding:5px 10px;border-radius:3px;background:rgba(255,255,255,.02)}
  .chip-senal b{color:var(--ok);font-weight:600;font-variant-numeric:tabular-nums;
    min-width:4ch;text-align:right}
  /* Hueco reservado antes de tener el dato: el rótulo que crece de vacío a
     "hace 43 s" empujaba la fila, y eso ya nos costó 0,297 de CLS una vez. */
  .chip-senal .chip-ago{letter-spacing:.08em;min-width:8.5ch}
  .ecg{overflow:visible;flex:0 0 auto}
  .ecg-base{stroke:var(--ok);opacity:.2;fill:none;stroke-width:1.4}
  /* Un barrido recorre el trazado, como un osciloscopio: señal viva, no icono. */
  .ecg-viva{stroke:var(--ok);fill:none;stroke-width:1.6;stroke-linecap:round;
    stroke-linejoin:round;stroke-dasharray:30 116;stroke-dashoffset:146;
    animation:ecg 2.4s linear infinite;filter:drop-shadow(0 0 3px var(--ok))}
  @keyframes ecg{to{stroke-dashoffset:0}}
  /* En anchos medios el chip suelta el "hace X s" para no empujar al reloj;
     en pantallas pequeñas desaparece entero y manda el reloj. */
  @media(max-width:880px){.chip-senal .chip-ago{display:none}}
  @media(max-width:760px){.chip-senal{display:none}}
  @media(prefers-reduced-motion:reduce){.ecg-viva{animation:none;stroke-dasharray:none}}

  /* ---- ajustes: el botón de la cabecera y el panel único ----
     Pedido por Salva el 16-ago-2026 como mapa-filtro, cerrado el 21-ago con
     teselas, y rehecho el 30-ago a petición suya: el mapa real de provincias
     de la maqueta (encendido por comunidad, que es hasta donde llega el dato)
     y un solo panel con territorio, canales e idioma. El botón dice
     «Ajustes»; el punto ámbar avisa de que hay algún filtro activo. */
  .minimapa{appearance:none;font-family:inherit;cursor:pointer;font-size:0.8rem;
    letter-spacing:.1em;text-transform:uppercase;font-weight:600;color:var(--mu);
    background:transparent;border:1px solid var(--line);border-radius:3px;
    padding:7px 12px;transition:color .15s,border-color .15s;
    display:inline-flex;align-items:center;gap:7px}
  .minimapa:hover,.minimapa[aria-expanded="true"]{color:var(--tx);border-color:var(--amb)}
  .minimapa.activo::before{content:"";width:6px;height:6px;border-radius:50%;
    background:var(--amb);box-shadow:0 0 6px var(--amb)}
  @media(max-width:640px){.minimapa .mm-cifra{display:none}
    .minimapa{padding:7px 9px}.minimapa::after{content:"⚙"}}

  .velo{position:fixed;inset:0;z-index:80;display:flex;align-items:center;
    justify-content:center;background:rgba(3,5,8,.72);backdrop-filter:blur(6px);
    -webkit-backdrop-filter:blur(6px);padding:20px}
  .velo[hidden]{display:none}
  .modal-mapa{background:var(--s2);border:1px solid var(--line);border-radius:8px;
    width:min(760px,100%);max-height:92vh;overflow:auto;padding:22px 24px;
    position:relative;box-shadow:0 30px 80px -20px rgba(0,0,0,.6)}
  .modal-mapa h3{margin:0 0 4px;font-size:0.93rem;letter-spacing:.14em;
    text-transform:uppercase;color:var(--tx)}
  .modal-mapa .sub{font-size:0.85rem;color:var(--mu);margin:0 0 16px;line-height:1.5}
  .modal-mapa .cerrar{position:absolute;top:12px;right:12px;appearance:none;
    border:1px solid var(--line);background:transparent;color:var(--mu);
    border-radius:4px;width:30px;height:30px;cursor:pointer;font-family:inherit}
  .modal-mapa .cerrar:hover{color:var(--tx);border-color:var(--amb)}
  /* Bloques del panel: Tu España, Canales, Idioma. Un filete entre bloque y
     bloque marca la jerarquía; nada de barras laterales. */
  .aj-bloque{border-top:1px solid var(--line);padding-top:16px;margin-top:16px}
  .aj-bloque h4{margin:0 0 4px;font-size:0.82rem;letter-spacing:.14em;
    text-transform:uppercase;color:var(--tx);font-weight:600}
  .aj-bloque .sub{margin-bottom:12px}
  .mapa-grande{display:grid;grid-template-columns:1fr 190px;gap:18px;align-items:start}
  @media(max-width:560px){.mapa-grande{grid-template-columns:1fr}}
  /* El mapa real: cada provincia es un <path data-ccaa>. Se pinta por
     comunidad —todas sus provincias comparten estado— con un filete fino del
     color del panel entre provincias, que sin borde el antialiasing deja una
     costura clara entre vecinas. Ámbar encendido, hueso apagado, como las
     teselas que sustituye. */
  .mapa-lienzo{position:relative}
  .mapa-lienzo svg{display:block;width:100%;height:auto;max-height:52vh}
  .mapa-lienzo path[data-ccaa]{fill:color-mix(in srgb,var(--tx) 9%,var(--g));
    stroke:var(--s2);stroke-width:2.2;cursor:pointer;transition:fill .15s}
  .mapa-lienzo path[data-ccaa]:hover{fill:color-mix(in srgb,var(--tx) 22%,var(--g))}
  .mapa-lienzo path[data-ccaa].viva{fill:color-mix(in srgb,var(--amb) 62%,var(--g))}
  .mapa-lienzo path[data-ccaa].viva:hover{fill:var(--amb)}
  /* fill:none explícito: app.js quita los fill del SVG para que mande el
     CSS, y un <rect> sin fill se pinta negro macizo. */
  .mapa-lienzo #inset-canarias{fill:none;stroke:var(--line);stroke-width:2;stroke-dasharray:8 8}
  .mapa-pie{margin:8px 0 0;font-size:0.8rem;color:var(--mu);min-height:1.2em;
    font-variant-numeric:tabular-nums}
  .mapa-teselas{display:grid;grid-template-columns:repeat(5,52px);
    grid-auto-rows:52px;gap:5px}
  .mapa-teselas[hidden]{display:none}
  .mapa-lienzo[hidden]{display:none}
  .tesela{appearance:none;font-family:inherit;cursor:pointer;color:var(--tx);
    background:var(--g);border:1px solid var(--line);border-radius:5px;
    display:flex;align-items:center;justify-content:center;padding:0;
    font-size:0.78rem;letter-spacing:.05em;transition:background .15s,border-color .15s}
  .tesela[aria-pressed="true"]{background:color-mix(in srgb,var(--amb) 24%,var(--g));
    border-color:var(--amb)}
  .lado{display:flex;flex-direction:column;gap:9px}
  .t-nac{appearance:none;font-family:inherit;cursor:pointer;font-size:0.8rem;
    letter-spacing:.08em;text-transform:uppercase;font-weight:600;padding:9px 0;
    color:var(--mu);background:transparent;border:1px solid var(--line);border-radius:3px}
  .t-nac[aria-pressed="true"]{color:#04121e;background:var(--amb);border-color:var(--amb)}
  .duo{display:flex;gap:7px}
  .duo button{appearance:none;font-family:inherit;cursor:pointer;flex:1;
    font-size:0.78rem;letter-spacing:.06em;text-transform:uppercase;padding:8px 0;
    color:var(--mu);background:transparent;border:1px solid var(--line);border-radius:3px}
  .duo button:hover{color:var(--tx);border-color:var(--amb)}
  .modal-mapa .aj{display:flex;align-items:center;justify-content:space-between;gap:14px}
  .modal-mapa .q{font-size:0.85rem;color:var(--tx)}
  .modal-mapa .opc{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}
  .modal-mapa .opc button{appearance:none;font-family:inherit;cursor:pointer;
    font-size:0.78rem;letter-spacing:.06em;padding:6px 10px;color:var(--mu);
    background:transparent;border:1px solid var(--line);border-radius:3px}
  .modal-mapa .opc button[aria-pressed="true"]{color:#04121e;background:var(--amb);
    border-color:var(--amb)}
  .modal-mapa .opc button.pronto{opacity:.4;cursor:default}
  /* El selector de canales: tres opciones que se leen de un vistazo, con la
     cuenta de cada una entre paréntesis (la pone app.js según el territorio). */
  .modal-mapa .modos{justify-content:flex-start}
  .modal-mapa .modos button{padding:8px 14px;font-size:0.8rem;letter-spacing:.08em;
    text-transform:uppercase;font-weight:600;font-variant-numeric:tabular-nums}

  /* El buscador de la portada reutiliza el mismo componente de la guía
     (.g-busca), solo un poco menos separado del título. */
  .busca-canales{margin:0 0 18px}

  /* el hero en dos columnas; en móvil, el reproductor primero */
  .hero-b{display:grid;grid-template-columns:1fr 1.55fr;gap:26px;align-items:center;
    margin:0 0 14px}
  .hero-info{display:flex;flex-direction:column;justify-content:center;min-width:0}
  .hero-b .now{font-size:clamp(1.5rem,2.8vw,2.2rem);font-weight:800;line-height:1.05;
    letter-spacing:-.02em;text-transform:uppercase;margin:0 0 16px}
  .senal-linea{font-size:0.85rem;color:var(--mu);letter-spacing:.04em;line-height:1.55;
    margin:0 0 20px}
  .senal-linea b{color:var(--ok);font-weight:600}
  .hero-b .lnk{font-size:0.82rem;color:var(--mu);letter-spacing:.1em;text-decoration:none;
    border-bottom:1px solid var(--line);padding-bottom:2px;align-self:center}
  .hero-b .lnk:hover{color:var(--amb)}
  @media(max-width:820px){
    .hero-b{grid-template-columns:1fr;gap:18px}
    .hero-marco-col{order:-1}
  }

  /* el marco: se comporta como un player */
  .hero-marco{position:relative;aspect-ratio:16/9;border:1px solid var(--line);
    border-radius:4px;overflow:hidden}
  .hero-marco .onda{top:38%}
  .hero-marco video{position:absolute;inset:0;width:100%;height:100%;background:#04070A;z-index:5}
  .cred{position:absolute;top:12px;right:12px;z-index:6;display:flex;align-items:center;gap:7px;
    font-size:0.78rem;letter-spacing:.12em;text-transform:uppercase;color:#CFE8DA;
    background:var(--velo);border:1px solid rgba(37,208,122,.35);padding:4px 9px;
    border-radius:3px;backdrop-filter:blur(4px)}
  .cred .cdot{width:6px;height:6px;border-radius:50%;background:var(--ok);
    box-shadow:0 0 8px var(--ok);animation:pulse 2.4s infinite}
  .play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:7;
    display:flex;flex-direction:column;align-items:center;gap:10px;border:0;background:none;
    cursor:pointer;color:#fff;font-family:inherit;padding:0}
  .play .aro{position:relative;width:84px;height:84px;border-radius:50%;display:flex;
    align-items:center;justify-content:center;background:var(--velo);
    border:1.5px solid rgba(255,255,255,.85);backdrop-filter:blur(3px);
    transition:transform .18s ease,box-shadow .18s ease}
  .play .aro::before{content:"";width:0;height:0;border-style:solid;margin-left:6px;
    border-width:13px 0 13px 22px;border-color:transparent transparent transparent #fff}
  .play:hover .aro,.play:focus-visible .aro{transform:scale(1.07);
    box-shadow:0 0 0 10px color-mix(in srgb,var(--c) 30%,transparent),0 12px 40px rgba(0,0,0,.5)}
  .play:focus-visible{outline:none}
  /* El mismo botón que en las tarjetas de la pared, a tamaño de hero: el
     rotulito en versalitas de antes "casi ni se veía" (Salva, 30-ago).
     Verde relleno = se reproduce aquí; ámbar de contorno = se sale a la web
     oficial. La flechita ↗ que flotaba junto al aro se fue en este cambio:
     el texto del botón ya la lleva. */
  .play .sub{font-size:0.88rem;font-weight:700;letter-spacing:.02em;
    background:var(--ok);color:#04210f;padding:10px 22px;border-radius:7px;
    box-shadow:0 8px 28px rgba(0,0,0,.45)}
  .play.ext .sub{background:var(--velo);color:var(--amb);
    border:1.5px solid var(--amb);backdrop-filter:blur(3px)}
  /* Todo el marco invita al clic cuando el canal se ve aquí (Salva, 30-ago);
     reproduciendo mandan los controles del vídeo y el cursor vuelve a serio. */
  .hero-marco.clicable:not(.playing){cursor:pointer}
  /* el progreso de la emisión es el filo inferior del marco */
  .filo{position:absolute;left:0;right:0;bottom:0;height:3px;background:rgba(255,255,255,.14);z-index:6}
  .filo i{display:block;height:100%;background:var(--tally);box-shadow:0 0 10px var(--tally);
    transition:width 1s linear}
  /* reproduciendo: overlay fuera, y el mando de calidad aparece BAJO el
     marco — flotando sobre el vídeo pisaba la mosca del canal y no se leía. */
  .hero-bajo .calidad{display:none;align-items:center;gap:10px;justify-content:flex-end;
    margin-top:10px;font-size:0.82rem}
  .hero-marco.playing+.hero-bajo .calidad{display:flex}
  .hero-marco.playing .play,.hero-marco.playing .cred,.hero-marco.playing .onair,
  .hero-marco.playing .filo{display:none}
  /* si la señal falla, el aviso ocupa el marco en vez de dejar vídeo negro */
  .hero-marco .externa{position:absolute;inset:0;margin:0;z-index:8;overflow:auto;border:0}

  /* --- la tarjeta: al hacer scroll, el canal se queda contigo ---
     La columna del reproductor entera se vuelve una tarjeta flotante: el
     vídeo (o la señal del canal con su play) y, debajo, el canal, lo que
     está en antena y el mando — todo viaja junto, como la cápsula del mini
     de radio, con la que comparte imanes, cuentas y arrastre. El <video> no
     se mueve del DOM (reparentarlo corta la reproducción), solo cambia su
     geometría. Tocarla devuelve arriba. */
  @keyframes sh-baja{from{transform:translateY(-8px);opacity:0}to{transform:none;opacity:1}}
  .tvmini-info{display:none}
  body.mini-on .hero-marco-col{position:fixed;z-index:70;
    top:calc(var(--hd1-h,49px) + 6px);
    right:max(28px,calc((100% - 1240px)/2 + 28px));
    width:236px;cursor:grab;touch-action:none;border-radius:6px;overflow:hidden;
    background:var(--s2);
    border:1px solid color-mix(in srgb,var(--c) 60%,var(--line));
    box-shadow:0 16px 40px -12px rgba(0,0,0,.8),
      0 0 24px -6px color-mix(in srgb,var(--c) 55%,transparent);
    animation:sh-baja .22s ease}
  @media(prefers-reduced-motion:reduce){body.mini-on .hero-marco-col{animation:none}}
  body.mini-on .hero-marco-col .hero-marco{border:0;border-radius:0}
  body.mini-on .hero-marco-col .hero-bajo{display:none}
  /* la fila de información, tintada con el color del canal como la cápsula
     del mini de radio con el de su emisora */
  body.mini-on .tvmini-info{display:flex;align-items:center;gap:9px;padding:8px 10px;
    background:linear-gradient(90deg,color-mix(in srgb,var(--c) 24%,transparent),transparent 78%);
    border-top:1px solid color-mix(in srgb,var(--c) 40%,var(--line))}
  .tvmini-info .mark.sm{width:26px;height:26px;font-size:0.78rem}
  .tvmini-info .logo-wrap.sm{width:26px;height:26px}
  .ti-tx{display:flex;flex-direction:column;min-width:0;flex:1;gap:1px}
  .ti-tx b{font-size:0.8rem;letter-spacing:.12em;text-transform:uppercase;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .ti-prg{font-size:0.8rem;color:var(--mu);white-space:nowrap;overflow:hidden;
    text-overflow:ellipsis}
  .ti-play,.ti-sube{appearance:none;cursor:pointer;font-family:inherit;flex:0 0 auto;
    display:flex;align-items:center;justify-content:center;border-radius:50%;padding:0}
  .ti-play{width:30px;height:30px;border:0;background:var(--c);color:#04121e;
    font-size:0.8rem;font-weight:700}
  .ti-play:hover{filter:brightness(1.14)}
  .ti-sube{width:26px;height:26px;border:1px solid var(--line);background:transparent;
    color:var(--mu);font-size:0.82rem}
  .ti-sube:hover{border-color:var(--amb);color:var(--tx)}
  .ti-play:focus-visible,.ti-sube:focus-visible{outline:2px solid var(--amb);outline-offset:2px}
  /* dentro de la tarjeta, el área de imagen se compacta: play pequeño y sin
     rótulos — la información va en la fila de abajo */
  body.mini-on .hero-marco .play .aro{width:44px;height:44px}
  body.mini-on .hero-marco .play .aro::before{border-width:8px 0 8px 13px;margin-left:4px}
  body.mini-on .hero-marco .play .sub,body.mini-on .hero-marco .cred,
  body.mini-on .hero-marco .onair,body.mini-on .hero-marco .filo{display:none}
  /* los anclajes, con las MISMAS cuentas que .mini.pos-* y anclasDe() */
  body.mini-on .hero-marco-col.pos-tl,
  body.mini-on .hero-marco-col.pos-tr{top:calc(var(--hd1-h,49px) + 6px);bottom:auto}
  body.mini-on .hero-marco-col.pos-bl,
  body.mini-on .hero-marco-col.pos-bc,
  body.mini-on .hero-marco-col.pos-br{bottom:14px;top:auto}
  body.mini-on .hero-marco-col.pos-tl,
  body.mini-on .hero-marco-col.pos-bl{left:max(28px,calc((100% - 1240px)/2 + 28px));right:auto}
  body.mini-on .hero-marco-col.pos-bc{left:calc(50% - 118px);right:auto}
  body.mini-on .hero-marco-col.pos-tr,
  body.mini-on .hero-marco-col.pos-br{right:max(28px,calc((100% - 1240px)/2 + 28px));left:auto}
  /* mientras se arrastra: pegado al puntero, sin viajes propios */
  body.mini-on .hero-marco-col.mini-drag{cursor:grabbing;transition:none;animation:none}
  /* en la tarjeta los controles del navegador no caben: manda su botón */
  body.mini-on .hero-marco video{pointer-events:none}
  @media(max-width:700px){
    body.mini-on .hero-marco-col{width:170px}
    body.mini-on .hero-marco-col.pos-tl,
    body.mini-on .hero-marco-col.pos-bl{left:12px;right:auto}
    body.mini-on .hero-marco-col.pos-tr,
    body.mini-on .hero-marco-col.pos-br{right:12px;left:auto}
    body.mini-on .hero-marco-col.pos-bc{left:calc(50% - 85px);right:auto}
  }
  /* el ancla de "programación de hoy" no debe esconderse bajo las barras */
  #programacion{scroll-margin-top:120px}

  /* ===================== QUÉ VER AHORA =====================
     Elegir por contenido, no por canal: pestañas por género y dos bloques,
     lo que está en antena y lo que empieza en breve. El HTML lo escribe el
     servidor cada hora; el cliente refresca porcentajes y cuentas atrás. */
  #queVer{margin-bottom:52px}
  .qv-gen{display:flex;gap:8px;margin:0 0 16px;flex-wrap:wrap}
  .qv-gen button{appearance:none;font-family:inherit;cursor:pointer;font-size:0.8rem;
    letter-spacing:.14em;text-transform:uppercase;font-weight:600;padding:9px 16px;
    color:var(--mu);background:transparent;border:1px solid var(--line);border-radius:3px}
  .qv-gen button:hover{color:var(--tx)}
  .qv-gen button[aria-pressed="true"]{color:#04121e;background:var(--amb);border-color:var(--amb)}
  .qv-gen button:focus-visible{outline:2px solid var(--amb);outline-offset:2px}
  .qv-sub{font-size:0.8rem;letter-spacing:.2em;text-transform:uppercase;color:var(--ok);
    margin:16px 0 10px}
  .qv-sub.qv-luego{color:var(--amb)}
  .qv{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px;
    list-style:none;margin:0;padding:0}
  .qv-it{background:var(--s2);border:1px solid var(--line);
    border-left:3px solid var(--cc,#3D6E8C)}
  .qv-it[hidden]{display:none}
  .qv-it a{display:flex;flex-direction:column;gap:8px;padding:11px 13px;color:var(--tx);
    text-decoration:none;height:100%;transition:background .15s}
  .qv-it a:hover{background:var(--s)}
  .qv-fila{display:flex;align-items:center;gap:9px}
  .qv-fila .mark.sm{width:30px;height:30px}
  .qv-fila .logo-wrap.sm{width:30px;height:30px}
  .qv-tit{font-size:0.97rem;font-weight:700;line-height:1.15;min-width:0}
  /* la barra de progreso solo existe para lo que está en antena */
  .qv-track{display:none;height:3px;background:rgba(255,255,255,.12);border-radius:2px;
    overflow:hidden}
  .qv-track i{display:block;height:100%;width:0;background:var(--cc,#3D6E8C);
    transition:width 1s linear}
  .qv-it[data-en="1"] .qv-track{display:block}
  .qv-pie{display:flex;justify-content:space-between;gap:8px;font-size:0.8rem;color:var(--mu)}
  .qv-canal{letter-spacing:.12em;text-transform:uppercase;font-size:0.78rem;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .qv-est{color:var(--amb);flex:0 0 auto}
  .qv-it[data-en="1"] .qv-est{color:var(--ok)}
  .qv-dia{display:inline-block;margin-top:14px;font-size:0.8rem;letter-spacing:.12em;
    text-transform:uppercase;color:var(--mu);text-decoration:none;
    border-bottom:1px solid var(--line);padding-bottom:2px}
  .qv-dia:hover{color:var(--amb)}
  /* La cuenta atrás genérica (.cuenta, la de las páginas de partido) cabe en
     la tarjeta a escala compacta: mismo reloj, sin el tamaño de cartel. */
  .qv-it .cuenta.va{margin:0;gap:7px;align-items:baseline}
  .qv-it .cuenta-n{font-size:1.05rem;letter-spacing:-.02em}
  .qv-it .cuenta-u{font-size:0.78rem;letter-spacing:.14em}
  .qv-it .cuenta.emitiendo .cuenta-n{font-size:0.88rem}
  /* Con carátula (cine, vía TMDB), la tarjeta se parte en cartel + cuerpo.
     El cartel es 2:3, como manda el formato; si el hotlink falla, el
     onerror lo retira y la tarjeta vuelve a ser tipográfica. */
  .qv-it a{flex-direction:row;gap:12px}
  .qv-poster{width:58px;aspect-ratio:2/3;object-fit:cover;border-radius:3px;
    flex:0 0 auto;align-self:center;box-shadow:0 4px 14px rgba(0,0,0,.5)}
  .qv-cuerpo{display:flex;flex-direction:column;gap:8px;min-width:0;flex:1;
    justify-content:center}
  .qv-tmdb{margin:18px 0 0;font-size:0.8rem;color:#5F6E80;letter-spacing:.04em}
  .qv-tmdb a{color:var(--mu)}
  .qv-tmdb a:hover{color:var(--amb)}

  /* --- la cartelera de cine: el póster manda (elegida en design/caratulas) ---
     Fila que desfila en horizontal —si hay muchas películas, se hace scroll,
     no papilla— con tarjetas 2:3 de póster completo. Sin carátula, el título
     en grande sobre el degradado del canal: nunca un hueco. */
  .qv-cartelera{display:grid;grid-auto-flow:column;grid-auto-columns:200px;gap:14px;
    overflow-x:auto;padding:2px 2px 12px;scrollbar-width:thin;
    scrollbar-color:var(--line) transparent}
  .qv-cartelera .qv-it{border:0;background:none}
  .qv-cartelera .qv-it a{padding:0;display:block}
  .qv-marco{position:relative;display:block;aspect-ratio:2/3;overflow:hidden;
    border:1px solid var(--line);border-radius:5px;background:var(--s2);
    transition:transform .16s}
  .qv-cine:hover .qv-marco{transform:translateY(-3px)}
  .qv-cartel{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  .qv-tipografica{position:absolute;inset:0;display:flex;align-items:center;
    justify-content:center;padding:16px;text-align:center;font-weight:800;
    font-size:1.05rem;line-height:1.18;text-transform:uppercase;letter-spacing:-.01em;
    background:linear-gradient(158deg,color-mix(in srgb,var(--cc,#3D6E8C) 62%,var(--mezcla)),var(--mini) 82%)}
  .qv-cap{position:absolute;top:8px;right:8px;z-index:3}
  .qv-cap .mark.sm,.qv-cap .logo-wrap.sm{width:34px;height:34px}
  .qv-velo{position:absolute;left:0;right:0;bottom:0;z-index:2;height:62%;
    background:linear-gradient(transparent,rgba(var(--vela),.96) 78%)}
  .qv-pie23{position:absolute;left:12px;right:12px;bottom:10px;z-index:3;display:block}
  .qv-t23{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    overflow:hidden;font-size:1rem;font-weight:700;line-height:1.14;margin-bottom:6px}
  .qv-m23{display:flex;justify-content:space-between;align-items:baseline;gap:8px}
  .qv-cine .qv-canal{font-size:0.8rem}
  .qv-cine .qv-est{font-size:0.85rem;flex:0 0 auto}
  /* el filo inferior del marco es la barra de progreso, como en el hero */
  .qv-cine .qv-track{display:none;position:absolute;left:0;right:0;bottom:0;z-index:4;
    height:3px;border-radius:0;background:rgba(255,255,255,.16)}
  .qv-cine[data-en="1"] .qv-track{display:block}
  .qv-cine .qv-track i{background:var(--cc,#3D6E8C);box-shadow:0 0 8px var(--cc,#3D6E8C)}
  /* el reloj de la cuenta atrás, protagonista en los de «empieza en breve» */
  .qv-cine .cuenta.va{margin:0 0 6px;gap:8px;align-items:baseline}
  .qv-cine .cuenta-n{font-size:1.5rem;letter-spacing:-.03em}
  .qv-cine .cuenta-u{font-size:0.78rem;letter-spacing:.16em}
  .qv-cine .cuenta.emitiendo .cuenta-n{font-size:0.97rem}
  /* La carátula en las filas de la cartelera de género (cine en la tele):
     miniatura 2:3 dentro de la celda del título — la retícula de columnas
     de .cart-fila no se toca. Sin carátula, el degradado del canal para que
     las filas no bailen. */
  /* Doble selector a propósito: el bloque de la cartelera de género define
     más abajo .cart-obra en columna (título sobre duración); aquí la celda
     pasa a fila (cartel + textos) y la columna interior la hace .cart-obra-tx. */
  .cart-fila .cart-obra{display:flex;flex-direction:row;align-items:center;
    gap:13px;min-width:0}
  .cart-obra-tx{display:flex;flex-direction:column;gap:3px;min-width:0}
  .cart-cartel{width:46px;aspect-ratio:2/3;object-fit:cover;border-radius:3px;
    flex:0 0 auto;box-shadow:0 4px 12px rgba(0,0,0,.5)}
  .cart-hueco{display:block;
    background:linear-gradient(158deg,color-mix(in srgb,var(--c,#3D6E8C) 55%,var(--mezcla)),var(--mini))}
  /* la carátula en la ficha de programa de una película: flotada al margen */
  .doc-cartel{float:right;width:132px;aspect-ratio:2/3;object-fit:cover;
    border-radius:4px;margin:0 0 16px 20px;box-shadow:0 10px 30px -8px rgba(0,0,0,.7);
    border:1px solid var(--line)}
  @media(max-width:520px){.doc-cartel{width:96px;margin-left:14px}}

  /* ===================== CUENTA ATRÁS =====================
     El reloj lo pinta el navegador dentro de este hueco, que llega vacío del
     servidor. La hora en texto vive fuera, en la frase de al lado: es lo que
     lee un buscador y lo que queda si el JavaScript no llega. Sin él no falta
     información, solo el reloj. */
  .cuenta{display:none}
  .cuenta.va{display:flex;align-items:baseline;gap:11px;margin:0 0 14px}
  /* Rojo de emisión y con vida (pedido por Salva el 19-ago): el temporizador
     late con el MISMO compás que el puntito del logo (pulse, 1.8s, cortes en
     45/55) — respiran juntos, que es lo que hace leerse "esto está vivo". */
  .cuenta-n{font-family:"SF Mono",ui-monospace,monospace;font-variant-numeric:tabular-nums;white-space:nowrap;
    font-size:clamp(2rem,5.5vw,3.1rem);line-height:.9;letter-spacing:-.045em;
    color:var(--tally);text-shadow:0 0 14px rgba(255,45,45,.45);
    animation:cuenta-glow 1.8s infinite}
  @keyframes cuenta-glow{0%,45%{text-shadow:0 0 18px rgba(255,45,45,.65)}
    55%,100%{text-shadow:0 0 6px rgba(255,45,45,.22)}}
  /* Los segundos, al mismo tamaño que horas y minutos: Salva los quiere
     igual de importantes (19-ago; revierte el "en pequeño" anterior). */
  .cuenta-s{font-size:1em;font-style:normal;letter-spacing:-.01em}
  .cuenta-u{font-size:0.8rem;letter-spacing:.2em;text-transform:uppercase;color:var(--mu)}
  .cuenta.ya .cuenta-n{animation:cuenta-glow 1.8s infinite,cuenta-lat 1s infinite}
  .cuenta.emitiendo .cuenta-n{color:var(--ok);text-shadow:none;animation:none;
    font-size:clamp(1.1rem,3vw,1.5rem)}
  @keyframes cuenta-lat{50%{opacity:.4}}
  @media(prefers-reduced-motion:reduce){
    .cuenta-n,.cuenta.ya .cuenta-n{animation:none}
  }

  /* Los acontecimientos de esta noche, delante de la parrilla. */
  .destacados{margin:0 0 30px}
  .sh-dst{font-size:0.85rem;letter-spacing:.2em;text-transform:uppercase;color:var(--mu);
    margin:0 0 14px;font-weight:600;display:flex;align-items:center;gap:11px}
  .sh-dst::after{content:"";flex:1;height:1px;background:var(--line)}
  .dst-rejilla{display:grid;gap:1px;background:var(--line);
    grid-template-columns:repeat(auto-fit,minmax(258px,1fr));border:1px solid var(--line)}
  .dst{background:var(--s2);padding:18px 20px;display:flex;flex-direction:column;gap:9px}
  .dst-cab{display:flex;align-items:center;gap:10px}
  .dst-logo{flex:0 0 40px;width:40px;height:40px;border-radius:8px;overflow:hidden;
    display:flex;align-items:center;justify-content:center}
  .dst-logo img{width:40px;height:40px;object-fit:contain}
  .dst-logo.sobre-claro{background:#fff}
  .dst-logo.sobre-oscuro{background:#0B1016;box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
  .dst-logo.sobre-canal{background:var(--c)}
  .dst-canal{font-size:0.8rem;letter-spacing:.14em;text-transform:uppercase;color:var(--mu)}
  .dst-tipo{margin-left:auto;font-size:0.78rem;letter-spacing:.14em;text-transform:uppercase;
    color:var(--amb);border:1px solid rgba(255,176,32,.38);padding:2px 7px}
  .dst-t{font-size:1.14rem;line-height:1.15;margin:0;font-weight:600;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .dst-t a{color:var(--tx);text-decoration:none}
  .dst-t a:hover{color:var(--amb)}
  .dst-h{margin:0;font-family:"SF Mono",ui-monospace,monospace;font-size:0.85rem;
    color:var(--mu);font-variant-numeric:tabular-nums}

/* ---- pie a columnas, v2 (18-ago-2026) ----------------------------------
   El primer intento heredó el display:flex del .ft de siempre (pensado para
   tres párrafos en fila) y las columnas salieron aplastadas en una tira
   central. `.ft2` anula ese layout y monta el patrón de plataforma: bloque
   de marca a la izquierda —quién somos y el latido del proyecto— y las
   cuatro columnas de enlaces a la derecha. Jerarquía deliberada: lema en
   claro > enlaces en apagado > títulos y chapas, minúsculos. Las redes sin
   estrenar siguen como texto con «pronto» (nada de enlaces muertos); cuando
   una se estrene, su span pasa a <a> en el PIE y el Schema recibe sameAs. */
.ft2{display:block}
.ft-top{display:grid;grid-template-columns:minmax(230px,320px) 1fr;
  gap:30px 60px;align-items:start}
.ft-quien{max-width:40ch}
.ft-marca{margin:0;font-size:0.93rem;font-weight:800;letter-spacing:.24em;
  color:var(--tx);display:flex;align-items:center;gap:9px}
.ft-punto{width:9px;height:9px;border-radius:50%;background:var(--tally);
  flex:none;box-shadow:0 0 10px rgba(255,45,45,.55)}
.ft-lema{margin:10px 0 0;font-size:0.93rem;line-height:1.65;color:var(--tx)}
.ft-vivo{margin:12px 0 0;font-size:0.82rem}
.ft-cols{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:22px 30px}
.ft-col{display:flex;flex-direction:column;gap:8px;font-size:0.88rem;
  letter-spacing:0}
.ft-tit{margin:0 0 3px;font-size:0.8rem;letter-spacing:.16em;
  text-transform:uppercase;color:var(--mu);font-weight:700}
/* Una regla global del sitio pone los <a> en mayúsculas espaciadas (estética
   de la cabecera). Aquí se devuelve la caja normal: seis enlaces por columna
   en versales gritan, y los spans «pronto» quedaban incoherentes al lado. */
.ft-col a{text-decoration:none;text-transform:none;letter-spacing:0}
.ft-col a:hover{color:var(--tx);text-decoration:underline}
.ft-col a.ft-cta{color:var(--tx);font-weight:600}
.ft-soon{color:var(--mu);opacity:.55;cursor:default}
.ft-soon b{font-size:0.78rem;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;border:1px solid var(--line);border-radius:999px;
  padding:1px 7px;margin-left:6px;vertical-align:1px;color:var(--mu)}
@media (max-width:880px){
  .ft-top{grid-template-columns:1fr;gap:26px}
  .ft-cols{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
}

  /* ── Cartelera (páginas de género) ──────────────────────────────────────
     Una lista cronológica, no una parrilla: aquí la pregunta es "qué
     películas ponen hoy", que se contesta en una columna ordenada por hora.
     Ver _cartelera_html en generar.py. */
  /* Ancho contenido: es una lista para leer en vertical, no una tabla. A
     pantalla completa el canal quedaba a media pantalla de su película. */
  .cartelera{margin:26px 0 0;max-width:940px}
  .cart-franja + .cart-franja{margin-top:34px}
  .cart-franja > h2{margin:0 0 2px;font-size:0.82rem;letter-spacing:.2em;
    text-transform:uppercase;color:var(--mu);font-weight:600;
    padding-bottom:10px;border-bottom:1px solid var(--line)}
  .cart-lista{list-style:none;margin:0;padding:0}
  .cart-fila{display:grid;grid-template-columns:4.6rem minmax(0,1fr) 12rem;
    align-items:center;
    gap:0 18px;padding:10px 12px 10px 14px;border-bottom:1px solid var(--line);
    box-shadow:inset 3px 0 0 transparent;transition:background .12s,box-shadow .12s}
  .cart-fila:hover{background:var(--s2);box-shadow:inset 3px 0 0 var(--c)}
  .cart-h{font-size:1.15rem;font-variant-numeric:tabular-nums;color:var(--amb);
    letter-spacing:.02em}
  .cart-obra{display:flex;flex-direction:column;gap:3px;min-width:0}
  .cart-obra .g-t{font-size:1.02rem;line-height:1.3;color:var(--tx);font-weight:600;
    text-decoration:none}
  /* .g-t no tenía color propio en ningún sitio: los títulos enlazados de la
     parrilla y de la ficha de canal salían con el azul del navegador y
     subrayados. Se ve en cuanto una página usa .g-slot fuera de .g-tabla. */
  a.g-t,.g-slot a.g-t{color:var(--tx);text-decoration:none;
    border-bottom:1px solid transparent}
  a.g-t:hover,.g-slot a.g-t:hover{color:var(--amb);border-bottom-color:var(--amb)}
  .cart-dur{font-size:0.82rem;color:var(--mu);font-variant-numeric:tabular-nums}
  .cart-canal{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
    font-size:0.88rem;color:var(--mu)}
  .cart-canal .g-logo{flex:0 0 26px;width:26px;height:26px;border-radius:5px}
  .cart-canal .g-logo img{width:26px;height:26px}
  .cart-canal a{color:var(--mu);text-decoration:none}
  .cart-canal a:hover{color:var(--amb)}
  .cart-otros{flex:0 0 100%;font-size:0.82rem;color:var(--mu);opacity:.75;
    padding-left:35px;line-height:1.4;margin-top:-2px}
  @media(max-width:700px){
    .cart-fila{grid-template-columns:4.2rem 1fr;gap:0 14px;padding:13px 4px}
    .cart-canal{grid-column:2;margin-top:8px}
    .cart-otros{padding-left:0}
    .cart-h{font-size:1rem}
  }

  /* ── Buscador de la parrilla ────────────────────────────────────────────
     Filtra lo que YA está en el HTML; no navega ni pide nada al servidor. */
  .g-busca{margin:0 0 14px;position:relative}
  .g-busca-l{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .g-busca input{width:100%;max-width:460px;padding:11px 14px;
    background:var(--g);color:var(--tx);border:1px solid var(--line);
    border-radius:8px;font:inherit;font-size:0.97rem}
  .g-busca input::placeholder{color:var(--mu);opacity:.8}
  .g-busca input:focus{outline:2px solid var(--amb);outline-offset:1px;
    border-color:transparent}
  .g-busca-n{margin:8px 0 0;font-size:0.82rem;letter-spacing:.12em;
    text-transform:uppercase;color:var(--amb)}
  .g-busca-cero{margin:18px 0 0;font-size:0.93rem;color:var(--mu)}
  .g-busca-cero a{color:var(--amb)}
  /* Lo que no coincide no se esconde: se apaga. Ver una emisión atenuada en su
     hora sigue diciendo "a esa hora hay algo"; un hueco vacío mentiría. */
  .g-tabla.filtrada .g-slot.apagado{opacity:.22}
  .g-tabla.filtrada .g-slot.acierto{background:var(--s);
    box-shadow:inset 0 0 0 1px var(--amb);z-index:2}
  .g-tabla.filtrada .g-slot.acierto .g-t{color:var(--amb)}
  /* Sin scroll-behavior:smooth a propósito: con él, asignar scrollLeft pasa a
     ser una animación, y donde esa animación no corre —entornos con el
     movimiento desactivado, y el navegador de pruebas— el desplazamiento
     simplemente no ocurre. Un salto instantáneo funciona en todas partes. */

  /* ---- /actualidad/ : la sección editorial -------------------------------
     Medida de lectura corta (68ch) y tipografía mayor que en el resto del
     sitio: aquí se lee de corrido, no se escanea una tabla. Es la única zona
     de la web con ese trato, y por eso vive en su propio bloque. */
  .articulo{max-width:68ch;margin:0 auto;padding:28px 0 56px}
  .art-tipo{margin:0 0 10px;font-size:0.8rem;letter-spacing:.14em;
    text-transform:uppercase;color:var(--amb)}
  .articulo h1{margin:0 0 14px;font-size:clamp(1.5rem,4.2vw,2.1rem);
    line-height:1.2}
  .art-sumario{margin:0 0 16px;font-size:1.05rem;line-height:1.55;
    color:var(--tx);opacity:.92}
  .art-firma{margin:0 0 26px;padding-bottom:18px;font-size:0.88rem;
    color:var(--mu);border-bottom:1px solid var(--line)}
  .articulo p{line-height:1.7;margin:0 0 18px}
  .articulo h2{margin:34px 0 12px;font-size:1.15rem;line-height:1.3}
  .articulo h3{margin:26px 0 10px;font-size:1rem;color:var(--mu)}
  .articulo ul{margin:0 0 18px;padding-left:20px;line-height:1.7}
  .articulo a{color:var(--amb)}
  /* Las tablas de los artículos de dato propio (cifras por comunidad). El
     div desplaza en horizontal porque a 68ch no caben cinco columnas en un
     móvil, y la página no puede desplazarse de lado entera. */
  .art-tabla{overflow-x:auto;margin:0 0 22px}
  .articulo table{border-collapse:collapse;width:100%;font-size:0.97rem;
    line-height:1.4}
  .articulo th,.articulo td{padding:7px 10px;border-bottom:1px solid var(--line);
    text-align:left;vertical-align:top}
  .articulo th{font-size:0.8rem;letter-spacing:.08em;text-transform:uppercase;
    color:var(--mu);font-weight:600}
  .articulo th:not(:first-child),.articulo td:not(:first-child){
    text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
  /* La foto y su crédito son UNA pieza: separarlos es como se pierde la
     atribución. Ver contenido/actualidad/README.md — sin crédito no publica. */
  .art-foto{margin:0 0 24px}
  .art-foto img{width:100%;height:auto;border-radius:10px;display:block}
  .art-foto figcaption{margin:8px 0 0;font-size:0.85rem;color:var(--mu);
    line-height:1.45}
  .art-credito{white-space:nowrap}
  /* El bloque que reparte autoridad a las páginas que sí convierten. */
  .art-rel{margin:36px 0 0;padding:16px 18px;background:var(--s);
    border:1px solid var(--line);border-radius:10px}
  .art-rel-tit{margin:0 0 8px;font-size:0.8rem;letter-spacing:.14em;
    text-transform:uppercase;color:var(--mu)}
  .art-rel ul{margin:0;padding-left:18px}
  .art-rel a{color:var(--amb)}

  .act-lista{list-style:none;margin:0;padding:0;max-width:72ch}
  .act-fila{display:block;padding:20px 0;border-bottom:1px solid var(--line);
    color:var(--tx);text-decoration:none}
  .act-fila:hover .act-tit{color:var(--amb)}
  .act-tipo{display:block;font-size:0.8rem;letter-spacing:.14em;
    text-transform:uppercase;color:var(--amb);margin-bottom:6px}
  .act-tit{display:block;font-size:1.08rem;font-weight:600;line-height:1.3;
    margin-bottom:6px}
  .act-sum{display:block;font-size:0.97rem;line-height:1.5;color:var(--mu);
    margin-bottom:6px}
  .act-fila time{font-size:0.85rem;color:var(--mu);opacity:.8}

  /* ---- Ficha emergente de la rejilla (popGuia en app.js) ----------------
     Una emisión corta no cabe en su hueco: «laSexta Deportes» en diez
     minutos se leía «laS / De». La ficha la da entera al pasar, tocar o
     enfocar. Con ratón va junto a la emisión; con dedo es una hoja abajo. */
  .g-tabla .g-slot{cursor:pointer}
  /* En un hueco estrecho, dos líneas partidas por sílabas son ruido: una sola
     con puntos suspensivos avisa de que hay más, y la ficha lo trae. */
  @container (max-width: 56px){
    .g-tabla .g-t{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  }
  /* Dentro de la rejilla, el título NO reacciona al ratón (Salva, 3-sep):
     ni subrayado, ni cambio de color, ni el borde inferior ámbar que aporta
     la regla genérica `.g-slot a.g-t:hover` de más arriba — esta va al final
     del fichero a propósito para ganarle en cascada. El resaltado es de la
     celda entera y la ficha se abre al pulsar. */
  .g-tabla a.g-t,.g-tabla a.g-t:hover{
    color:var(--tx);text-decoration:none;border-bottom-color:transparent}

  /* Atribución de los datos curados de la ficha técnica (canales_datos.json):
     fuente y fecha de lectura, en voz baja bajo la rejilla de la ficha. */
  .ficha-extra{margin:14px 2px 0;font-size:0.97rem;line-height:1.55}
  .ficha-fuente{margin:10px 2px 0;font-size:0.85rem;color:var(--mu)}
  .ficha-fuente a{color:var(--amb)}
