/* ============================================================
   CBAT / 24 — Sistema visual de la web pública
   ------------------------------------------------------------
   Fase 1 del proyecto "nueva web pública" (17/08/2026).

   Referencia aprobada por el usuario:
     docs/project-control/referencias/cbat24_home_concept_02.html
   Paleta OFICIAL del club (extraída del PNG del club con un
   lector de píxeles, no estimada a ojo):
     docs/project-control/referencias/cbat_paleta_oficial.png

   ------------------------------------------------------------
   POR QUÉ ESTE ARCHIVO TIENE SU PROPIO :root
   ------------------------------------------------------------
   El front público es una SUPERFICIE AISLADA con estética propia
   — el caso (b) que contempla `.claude/rules/workflow.md`, igual
   que `assets/css/fan-album.css`.

   Su paleta es la OFICIAL del club (azul #004f9f + amarillo
   #fdc300), que NO coincide con la del Manager (navy #071432 +
   dorado #f1c84c). Meter estos valores en `tokens.css`
   retematizaría la plataforma entera —Manager y Portal Coach—,
   que NO es lo que se ha pedido.

   Por eso: las DEFINICIONES viven aquí, en un único bloque, y el
   resto del archivo es 100 % `var()`. Cero hex fuera de la capa
   de tokens. Tintes con `color-mix`, nunca `rgba()` de canales
   fijos (un rgba fijo no seguiría al club si algún día cambia).

   ------------------------------------------------------------
   LA REGLA DEL AMARILLO (heredada de la web actual, medida)
   ------------------------------------------------------------
   Sobre superficies oscuras y sobre el azul, el amarillo es
   texto libre (10,2:1 sobre el navy; 5,1:1 sobre el azul).
   Sobre superficie clara da 1,5:1 y NO se usa como texto: solo
   como fondo, filete o subrayado. Es la misma regla que ya
   aplica `front.css`.
   ============================================================ */

:root {
  /* ---- 1 · PALETA OFICIAL (única capa con hex del archivo) ---- */

  /* Azules */
  --f24-blue:        #004f9f;   /* AZUL CBAT — superficie de sección */
  --f24-blue-mid:    #2968a0;
  --f24-blue-soft:   #4f78a0;
  --f24-blue-pale:   #6f879f;

  /* Oscuros */
  --f24-navy:        #021f47;   /* el más profundo — hero y footer */
  --f24-navy-800:    #122b46;
  --f24-navy-700:    #233347;
  --f24-navy-600:    #313b46;
  /* ⚠️ EL NEGRO SE RETIRÓ del sistema el 17/08/2026 — decisión del
     usuario: «no podemos tener fondos en negro, todo colores CBAT y
     colores claros». No se deja el token "por si acaso": un token que
     nadie usa acaba usándose sin pensar. Para oscurecer sobre foto se
     usa `--f24-navy`, que tiñe en la marca en vez de apagar. */

  /* Amarillos */
  --f24-yellow:      #fdc300;   /* AMARILLO CBAT */
  --f24-yellow-mid:  #fcd44d;
  --f24-yellow-soft: #fbe07f;
  --f24-yellow-pale: #fbecb1;
  --f24-amber:       #efaa00;   /* estado activo / hover */

  /* Neutros */
  --f24-grey:        #706f6f;
  --f24-grey-soft:   #9d9d9c;

  /* ---- 2 · SEMÁNTICAS ---------------------------------------- */
  /* El claro y el blanco los toma de la plataforma: son los
     mismos de la web actual y así el front no inventa un segundo
     "casi blanco" (decisión del usuario: "el resto como está la
     web actual"). */
  --f24-paper:       var(--bg);
  --f24-white:       var(--card);

  /* Superficie EDITORIAL (noticias): claro con un velo del azul del club.
     Se deriva del azul en vez de ser un color suelto, así sigue al club si
     cambia su azul y nunca desafina. Sustituye al negro que había aquí. */
  --f24-editorial:   color-mix(in srgb, var(--f24-blue) 6%, var(--f24-white));

  --f24-ink:         var(--f24-navy);          /* texto sobre claro */
  --f24-ink-soft:    var(--f24-grey);          /* metadatos sobre claro */
  --f24-on-dark:     var(--f24-white);         /* texto sobre oscuro */
  --f24-on-dark-soft: color-mix(in srgb, var(--f24-white) 72%, var(--f24-blue-pale));

  --f24-line-dark:   color-mix(in srgb, var(--f24-white) 16%, transparent);
  --f24-line-light:  color-mix(in srgb, var(--f24-navy) 14%, transparent);
  --f24-veil:        color-mix(in srgb, var(--f24-navy) 82%, transparent);

  /* ---- 3 · TIPOGRAFÍA ---------------------------------------- */
  /* La familia sale del tema del club (Sistema → Configuración).
     Hoy `tema.font_heading` está sin fijar, así que resuelve a
     Inter; si el club activa Bison, los títulos cambian solos y
     este archivo no se toca. */
  --f24-display: var(--font-heading, var(--font-body));
  --f24-body: var(--font-body);

  --f24-d1: clamp(3.25rem, 11.5vw, 11rem);   /* titular del hero        */
  --f24-d2: clamp(2.75rem, 8vw, 7.5rem);     /* título de sección       */
  --f24-d3: clamp(1.75rem, 5.5vw, 5rem);     /* equipo en el marcador   */
  --f24-d4: clamp(2rem, 5vw, 4.75rem);       /* titular de evento       */
  --f24-d5: clamp(1.5rem, 3.2vw, 3rem);      /* titular de noticia      */
  --f24-d6: clamp(4rem, 15vw, 13.75rem);     /* firma del pie           */

  --f24-label:    .6875rem;                  /* 11px — micro-etiquetas  */
  --f24-label-sm: .5625rem;                  /* 9px  — pills            */
  --f24-lead:     1rem;

  --f24-track-display: -.055em;
  --f24-track-label:   .16em;
  --f24-leading-display: .82;

  /* ---- 4 · RITMO Y FORMA ------------------------------------- */
  --f24-gutter:  5vw;
  --f24-section: clamp(3.5rem, 11vh, 8.75rem);
  --f24-nav-h:   72px;
  --f24-tap:     44px;                        /* mínimo táctil */
}

/* ============================================================
   BASE
   ============================================================ */

.f24 {
  margin: 0;
  background: var(--f24-navy);
  color: var(--f24-on-dark);
  font-family: var(--f24-body);
  font-size: var(--font-base, 15px);
  line-height: 1.5;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}
/* `:where()` a propósito: aporta 0 de especificidad.
   Escrito como `.f24 a` (clase + tipo) GANABA a `.f24-btn` (clase
   sola) y todos los botones y enlaces se quedaban con el color
   heredado de su sección: texto navy sobre botón navy —invisible—
   y texto blanco sobre amarillo —1,6:1— en el hero. Es la clase de
   fallo que solo se ve mirando la pantalla, no leyendo el CSS. */
.f24 :where(a) { color: inherit; text-decoration: none; }
.f24 img { max-width: 100%; display: block; }

.f24 h1, .f24 h2, .f24 h3 {
  font-family: var(--f24-display);
  font-weight: 900;
  text-transform: uppercase;
  letter-spacing: var(--f24-track-display);
  line-height: var(--f24-leading-display);
  margin: 0;
  /* Los titulares gigantes parten palabra antes que desbordar:
     con nombres de rival largos (los hay en BD) es la diferencia
     entre "se ve apretado" y "se sale de la pantalla". */
  overflow-wrap: break-word;
}

/* Foco visible SIEMPRE, y con contraste en las dos superficies. */
.f24 :focus-visible {
  outline: 3px solid var(--f24-yellow);
  outline-offset: 3px;
}
.f24 .f24-section--claro :focus-visible,
.f24 .f24-section--editorial :focus-visible,
.f24 .f24-section--amarillo :focus-visible {
  outline-color: var(--f24-blue);
}

.f24-skip {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--f24-yellow); color: var(--f24-navy);
  padding: 12px 18px; font-weight: 900;
  text-transform: uppercase; letter-spacing: var(--f24-track-label);
  font-size: var(--f24-label);
}
.f24-skip:focus { left: 8px; top: 8px; }

/* Etiqueta pequeña de broadcast: el contrapunto del display gigante. */
.f24-kicker {
  display: block;
  font-size: var(--f24-label);
  font-weight: 800;
  letter-spacing: var(--f24-track-label);
  text-transform: uppercase;
  color: var(--f24-yellow);
  margin: 0 0 .75rem;
}
.f24-section--claro .f24-kicker,
.f24-section--editorial .f24-kicker { color: var(--f24-blue); }
.f24-section--amarillo .f24-kicker  { color: var(--f24-navy); }

/* Acciones sueltas dentro de una sección (p. ej. el CTA del estado
   vacío del Match Center). */
.f24-acciones { margin: 1.5rem 0 0; }

/* ------------------------------------------------------------
   EQUIPACIONES (18/08) — el escaparate de las camisetas
   ------------------------------------------------------------
   La del ratón se adelanta un poco y se endereza: el movimiento sugiere
   que se puede coger, sin llegar a ser un juguete. */
.f24-equipaciones {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  gap: clamp(1rem, 3vw, 2.5rem);
  margin-top: 2.5rem;
}
.f24-equipacion { margin: 0; text-align: center; }
.f24-equipacion img {
  display: block; width: 100%; height: auto;
  transform: rotate(-1.5deg);
  transition: transform .3s ease-out, filter .3s ease-out;
  filter: drop-shadow(0 1rem 1.5rem color-mix(in srgb, var(--f24-navy) 45%, transparent));
}
.f24-equipacion:hover img {
  transform: rotate(0) translateY(-.75rem) scale(1.04);
  filter: drop-shadow(0 1.75rem 2rem color-mix(in srgb, var(--f24-navy) 65%, transparent));
}
.f24-equipacion:nth-child(even) img { transform: rotate(1.5deg); }
.f24-equipacion:nth-child(even):hover img { transform: rotate(0) translateY(-.75rem) scale(1.04); }
.f24-equipacion figcaption { margin-top: 1rem; }
.f24-equipacion figcaption strong {
  display: block;
  font-family: var(--f24-display);
  font-size: 1.125rem; font-weight: 900;
  text-transform: uppercase; letter-spacing: .04em;
}
.f24-equipacion figcaption span {
  display: block; margin-top: .25rem;
  font-size: var(--f24-label); font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--f24-yellow);
}

/* ------------------------------------------------------------
   BLOQUE LIBRE (18/08) — la sección comodín del club
   ------------------------------------------------------------
   Sin foto es una columna de texto centrada en su superficie; con foto,
   dos columnas. Se apoya en las piezas que ya existen (`f24-kicker`,
   `f24-lead`, `f24-btn`) para que no parezca de otra web. */
.f24-libre { max-width: 46rem; }
.f24-libre h2 { font-size: var(--f24-d2); margin: 0 0 1rem; }
.f24-libre .f24-lead { margin: 0; }
.f24-libre-foto { margin: 0; }
.f24-libre-foto img { display: block; width: 100%; height: auto; border-radius: var(--f24-radio, 0); }

@media (min-width: 900px) {
  .f24-libre--con-foto {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 22rem);
    gap: clamp(2rem, 5vw, 4rem);
    align-items: center;
    max-width: 68.75rem;
  }
}

/* Aviso temporal del hero: algo puntual y con fecha de caducidad. Amarillo
   sobre navy —pastilla, no texto suelto— para que se lea como un anuncio
   del club y no como parte del titular. */
.f24-aviso {
  display: inline-block;
  margin: 0 0 1rem;
  padding: .4rem .85rem;
  border-radius: 999px;
  background: var(--f24-yellow);
  color: var(--f24-navy);
  font-size: var(--f24-label);
  font-weight: 800;
  letter-spacing: .06em;
  text-transform: uppercase;
}

/* ------------------------------------------------------------
   GEOMETRÍA DE PISTA
   ------------------------------------------------------------
   La zona y el círculo de tiros libres, con la proporción real
   de una pista FIBA (zona 4,9 × 5,8 m · círculo de 3,6 m).
   No es un fondo decorativo: ancla la sección clara como si
   fuera el parqué y ocupa el hueco derecho que dejaba la
   composición a una columna.
   ------------------------------------------------------------ */
.f24-paint {
  position: absolute;
  right: -6vw; top: 50%;
  width: 30vw; height: 25.4vw;
  transform: translateY(-50%);
  border: 2px solid var(--f24-line-light);
  border-right: 0;
  pointer-events: none;
}
.f24-paint::before {
  content: "";
  position: absolute;
  left: -9vw; top: 50%;
  width: 18vw; height: 18vw;
  transform: translateY(-50%);
  border: 2px solid var(--f24-line-light);
  border-radius: 50%;
}

/* Palabra destacada dentro de un titular.
   Sobre oscuro es color; sobre claro es subrayado (contraste). */
.f24-mark { font-style: normal; color: var(--f24-yellow); }
.f24-section--claro .f24-mark,
.f24-section--editorial .f24-mark,
.f24-section--amarillo .f24-mark {
  color: inherit;
  box-shadow: inset 0 -.14em 0 var(--f24-yellow);
}

.f24-lead {
  font-size: var(--f24-lead);
  line-height: 1.5;
  color: var(--f24-on-dark-soft);
  max-width: 34rem;
  margin: 0;
}

/* Botón: rectángulo puro. Sin radio, sin sombra, sin degradado. */
.f24-btn {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  min-height: var(--f24-tap);
  padding: 0 1.5rem;
  background: var(--f24-yellow);
  color: var(--f24-navy);
  font-size: var(--f24-label);
  font-weight: 900;
  letter-spacing: .12em;
  text-transform: uppercase;
  border: 0;
  cursor: pointer;
  transition: background .15s ease, transform .15s ease;
}
.f24-btn:hover { background: var(--f24-amber); transform: translateY(-2px); }
.f24-btn--ink { background: var(--f24-navy); color: var(--f24-yellow); }
.f24-btn--ink:hover { background: var(--f24-navy-800); }

.f24-pill {
  display: inline-block;
  padding: .5rem .625rem;
  border: 1px solid var(--f24-line-dark);
  font-size: var(--f24-label-sm);
  font-weight: 800;
  letter-spacing: .15em;
  text-transform: uppercase;
}

/* ============================================================
   BARRA SUPERIOR — el "24" es el botón, no un adorno
   ============================================================ */

.f24-nav {
  position: sticky; top: 0; z-index: 50;
  min-height: var(--f24-nav-h);
  display: flex; align-items: center;
  padding: 0 var(--f24-gutter);
  background: color-mix(in srgb, var(--f24-navy) 88%, transparent);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--f24-line-dark);
}
.f24-brand {
  display: flex; align-items: center; gap: .625rem;
  font-family: var(--f24-display);
  font-weight: 900; font-size: 1.5rem;
  letter-spacing: -.06em; text-transform: uppercase;
}
.f24-brand img { height: 38px; width: auto; }
.f24-brand b { color: var(--f24-yellow); }

.f24-menu {
  margin-left: auto;
  display: flex; align-items: center; gap: 1.5rem;
  list-style: none; padding: 0; margin-block: 0;
}
.f24-menu a {
  display: inline-flex; align-items: center;
  min-height: var(--f24-tap);
  font-size: var(--f24-label);
  font-weight: 800;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--f24-on-dark-soft);
}
.f24-menu a:hover { color: var(--f24-on-dark); }
.f24-menu a[aria-current="page"] {
  color: var(--f24-yellow);
  box-shadow: inset 0 -3px 0 var(--f24-yellow);
}

/* ------------------------------------------------------------
   EL RELOJ DE POSESIÓN — uno solo, vivo, en la barra
   ------------------------------------------------------------
   Antes había un número dentro de una caja repetido en cada
   sección. Un 24 suelto seis veces es un adorno; un reloj que
   CORRE es el concepto. Ahora es un anillo que se vacía y unos
   dígitos que bajan de 24 a 00 según avanzas por la página, como
   la posesión de un partido. Sigue siendo el acceso al Match
   Center. `--f24-clock-p` (1 → 0) lo escribe el JS.
   ------------------------------------------------------------ */
.f24-clock {
  position: relative;
  margin-left: 1.5rem;
  width: 44px; height: 44px;
  border-radius: 50%;
  display: grid; place-items: center;
  flex: 0 0 auto;
  background: conic-gradient(
    var(--f24-yellow) calc(var(--f24-clock-p, 1) * 360deg),
    color-mix(in srgb, var(--f24-white) 16%, transparent) 0
  );
  transition: background .25s linear;
}
.f24-clock::after {
  content: "";
  position: absolute; inset: 3px;
  border-radius: 50%;
  background: var(--f24-navy);
}
.f24-clock b {
  position: relative; z-index: 1;
  font-family: var(--f24-display);
  font-size: 1rem; font-weight: 900;
  letter-spacing: -.04em;
  color: var(--f24-yellow);
  font-variant-numeric: tabular-nums;
}
/* Últimos segundos: el reloj avisa, como en un pabellón. */
.f24-clock[data-final="true"] {
  background: conic-gradient(
    var(--f24-amber) calc(var(--f24-clock-p, 1) * 360deg),
    color-mix(in srgb, var(--f24-white) 16%, transparent) 0
  );
}
.f24-clock[data-final="true"] b { color: var(--f24-amber); }
.f24-clock:hover::after { background: var(--f24-navy-700); }

/* BOTÓN DE MENÚ (21/09/2026, usuario: «el menú es una caja fea de cojones»).
   Era un cuadrado de 44×44 con filete alrededor y la palabra apretada dentro:
   un recuadro que no se parecía a nada más del sitio.
   Ahora es la PALABRA con el subrayado dorado — el mismo recurso que marca la
   sección activa en el menú de escritorio, así que no se inventa un patrón
   nuevo, se reutiliza el que ya existe. Se mantiene la altura de 44 px de zona
   táctil aunque el borde desaparezca: lo que se quita es la caja, no el sitio
   donde se pulsa.
   ✅ El dorado aquí es filete, nunca texto: sobre claro no llega a contraste. */
.f24-burger {
  display: none;
  margin-left: auto;
  min-height: var(--f24-tap);
  padding: 0 .25rem;
  background: none; border: 0;
  border-bottom: 2px solid var(--f24-yellow);
  color: var(--f24-on-dark);
  cursor: pointer;
  align-items: center; justify-content: center;
  font-family: inherit;
  font-size: var(--f24-label);
  font-weight: 900; letter-spacing: var(--f24-track-label);
  text-transform: uppercase;
  transition: opacity 140ms ease-out;
}
.f24-burger:hover { opacity: .78; }
/* Abierto: el subrayado se apaga y el texto se atenúa, para que se lea como
   «esto ya está desplegado» sin cambiar el tamaño del botón ni mover el resto. */
.f24-burger[aria-expanded="true"] {
  border-bottom-color: color-mix(in srgb, var(--f24-yellow) 35%, transparent);
  opacity: .8;
}

/* ============================================================
   HERO — la entrada en pista
   ============================================================ */

/* ALTURA DEL HERO — decisión del usuario (17/08): «la imagen y el texto es
   súper alto, no podemos hacer tanto scroll en solo eso».
   Antes ocupaba la pantalla entera (100svh) y había que bajar un viewport
   completo para llegar al primer dato. Ahora es una banda: entra el titular
   y ya se intuye lo que viene debajo, que es lo que invita a seguir. */
.f24-hero {
  position: relative;
  min-height: clamp(19rem, 52vh, 30rem);
  display: flex; align-items: flex-end;
  padding: clamp(2.5rem, 7vh, 4.5rem) var(--f24-gutter) clamp(1.75rem, 5vh, 3rem);
  background:
    radial-gradient(circle at 78% 30%, color-mix(in srgb, var(--f24-blue) 55%, transparent), transparent 33%),
    linear-gradient(135deg, var(--f24-navy) 0%, var(--f24-navy-800) 100%);
  overflow: hidden;
}
/* Foto del club en duotono: nunca a color (regla de la web actual). */
.f24-hero--foto::before {
  content: "";
  position: absolute; inset: 0;
  background-image: var(--f24-hero-img);
  background-size: cover;
  background-position: center 30%;
  filter: grayscale(1);
  opacity: .22;
}
.f24-hero--velo-suave::before  { opacity: .38; }
.f24-hero--velo-fuerte::before { opacity: .12; }

/* ------------------------------------------------------------
   MARCA DE FONDO — el escudo del club, no un círculo cualquiera
   ------------------------------------------------------------
   Antes había aquí una circunferencia dibujada con `border`, que
   era la línea de campo. El usuario preguntó de dónde salía ese
   círculo y propuso el escudo amarillo sin fondo (17/08): tiene
   razón — el escudo YA es un círculo, y además es el del club.
   Sangra por el borde derecho y va a opacidad baja: acompaña el
   titular, no compite con él.
   ------------------------------------------------------------ */
.f24-marca {
  position: absolute;
  right: -7vw; top: 50%;
  transform: translateY(-50%);
  width: min(30rem, 55vw); height: auto;
  opacity: .12;
  pointer-events: none; user-select: none;
}
/* ⚠️ EL "24" GIGANTE DEL HERO SE RETIRÓ (usuario, 17/08): «me gusta arriba
   en el menú pero el grande no». El concepto vive donde funciona —el reloj
   de la barra, que además CORRE— y no repetido a 620px de fondo.
   No reintroducir la marca de agua: se probó, se vio y se descartó. */
.f24-hero-in { position: relative; z-index: 2; width: 100%; max-width: 68.75rem; }
.f24-hero h1 { font-size: var(--f24-d1); letter-spacing: -.075em; margin: .5rem 0 1.75rem; }
.f24-hero-foot { display: flex; flex-wrap: wrap; gap: 2rem; align-items: center; }

/* Alto de la cabecera, elegible desde Configuración (18/08). El valor medio
   es el de siempre: quien no toque nada no nota el cambio. */
.f24-hero--compacta { min-height: clamp(14rem, 34vh, 20rem); }
.f24-hero--completa { min-height: clamp(24rem, 82vh, 46rem); }

/* ------------------------------------------------------------
   FIGURA DEL HERO (18/08) — la camiseta del club, un balón…
   ------------------------------------------------------------
   Va a la derecha del titular y se mueve MUY despacio: la animación está
   para dar vida, no para llamar la atención. Solo desde 900px: en móvil
   robaría el sitio al titular, que es lo que tiene que leerse. */
.f24-hero-figura { display: none; }

@media (min-width: 900px) {
  .f24-hero--con-figura { align-items: center; }
  .f24-hero--con-figura .f24-hero-in { max-width: 60%; }
  .f24-hero-figura {
    display: block;
    position: absolute;
    right: clamp(1rem, 5vw, 5rem);
    top: 50%;
    z-index: 2;
    width: clamp(11rem, 26vw, 20rem);
    transform: translateY(-50%);
    animation: f24-flota 7s ease-in-out infinite alternate;
    filter: drop-shadow(0 1.5rem 2rem color-mix(in srgb, var(--f24-navy) 55%, transparent));
  }
  /* La perspectiva va en el CONTENEDOR y el giro en la imagen: así el
     balanceo (animación CSS del contenedor) y la inclinación que sigue al
     ratón (transform por JS en la imagen) no se pisan. Si ambos escribieran
     `transform` sobre el mismo elemento, el último ganaría y se perdería
     uno de los dos. */
  .f24-hero-figura { perspective: 900px; }
  .f24-hero-figura img {
    display: block; width: 100%; height: auto;
    transform: rotateX(0) rotateY(0);
    transition: transform .25s ease-out;
    will-change: transform;
  }
}

/* El recorrido es de 14px en 7 segundos: se percibe como que respira, no
   como que se mueve. Con `prefers-reduced-motion` el reset global de
   tokens.css la deja quieta, sin necesidad de repetirlo aquí. */
@keyframes f24-flota {
  from { transform: translateY(-50%) rotate(-1.2deg); }
  to   { transform: translateY(calc(-50% - 14px)) rotate(1.2deg); }
}

/* ============================================================
   TICKER — CBAT PULSE en directo
   ============================================================ */

.f24-ticker {
  background: var(--f24-yellow);
  color: var(--f24-navy);
  overflow: hidden;
  padding: .8125rem 0;
}
.f24-ticker-track {
  display: flex; gap: 2rem;
  width: max-content;
  white-space: nowrap;
  padding-left: var(--f24-gutter);
  animation: f24-ticker 38s linear infinite;
}
.f24-ticker:hover .f24-ticker-track,
.f24-ticker:focus-within .f24-ticker-track { animation-play-state: paused; }
.f24-ticker span {
  font-size: var(--f24-label);
  font-weight: 900;
  letter-spacing: .12em;
  text-transform: uppercase;
}
.f24-ticker-dot { color: var(--f24-blue); }
/* Mensaje de la cinta que lleva a algún sitio. Subrayado, porque sobre el
   amarillo el color no puede ser la única señal de que es un enlace. La
   cinta ya se para al pasar por encima o al recibir foco, así que se puede
   pinchar sin perseguirlo. */
.f24-tick-link {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: .25em;
  text-decoration-thickness: 2px;
}
.f24-tick-link:hover { text-decoration-thickness: 3px; }
@keyframes f24-ticker { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* ============================================================
   SECCIONES — cada una es una superficie a sangre, no una card
   ============================================================ */

/* `overflow: visible` a propósito: el CORTE de cada sección se dibuja
   fuera de su caja (translateY -99%) para montarse sobre la anterior.
   Con `hidden` se recortaba y no se veía ni uno. Lo que sobresale por
   los lados lo recorta `.f24 { overflow-x: hidden }` del body. */
/* ⚠️ `overflow-x: clip` y NO `hidden`, y el vertical visible a propósito
   (21/09/2026, el usuario grabó el móvil: «el margen derecho que queda»).
   La portada se podía arrastrar 23 px en horizontal y quedaba una franja
   muerta a la derecha con el titular cortado. El culpable es `.f24-paint`
   —el parqué decorativo— que sangra por la derecha con `right: -6vw`: en una
   pantalla de 390 px son exactamente esos 23 px. El `overflow-x: hidden` que
   lleva `.f24` (el body) no lo frenaba.
   Por qué `clip` y no `hidden`: esta sección tenía `overflow: visible` PORQUE
   los cortes (`.f24-corte`) se dibujan FUERA, por encima del borde superior
   con `translateY(-99%)`. Con `hidden` se decapitan todos. `clip` recorta
   solo el eje que sobra, no crea contenedor de scroll y es la única forma de
   combinarse con `overflow-y: visible` sin que el navegador lo convierta en
   `auto`. En un navegador viejo que no lo entienda, se ignora y queda como
   estaba: no empeora nada. */
.f24-section { position: relative; overflow-x: clip; overflow-y: visible; padding: var(--f24-section) var(--f24-gutter); }
.f24-section > *:not(.f24-paint):not(.f24-corte) { position: relative; z-index: 1; }
.f24-section--claro { background: var(--f24-paper); color: var(--f24-ink); }
.f24-section--azul  { background: var(--f24-blue);  color: var(--f24-on-dark); }
.f24-section--editorial { background: var(--f24-editorial); color: var(--f24-ink); }
.f24-section--amarillo  { background: var(--f24-yellow); color: var(--f24-navy); }
.f24-section--navy  { background: var(--f24-navy); color: var(--f24-on-dark); }

/* ------------------------------------------------------------
   CORTES ENTRE SECCIONES (17/08/2026)
   ------------------------------------------------------------
   Encargo del usuario: «los cortes entre una y otra sección,
   rollo montañita, libro…». Cada sección dibuja su propia
   frontera SUPERIOR con SU color y se monta encima de la
   anterior: así encaja siempre sin saber de qué color era la de
   arriba, y cambiar el fondo de una sección no obliga a tocar la
   vecina.

   `color` se hereda de la superficie y el `<path>` usa
   `fill="currentColor"` — por eso cada modificador de fondo fija
   el color del corte al suyo.
   ------------------------------------------------------------ */
.f24-corte {
  position: absolute;
  left: 0; top: 0;
  width: 100%;
  height: clamp(28px, 4.5vw, 70px);
  transform: translateY(-99%);   /* el -99 evita la costura de 1px del subpíxel */
  pointer-events: none;
  line-height: 0;
}
.f24-corte svg { display: block; width: 100%; height: 100%; }

.f24-section--claro     > .f24-corte { color: var(--f24-paper); }
.f24-section--editorial > .f24-corte { color: var(--f24-editorial); }
.f24-section--azul      > .f24-corte { color: var(--f24-blue); }
.f24-section--navy      > .f24-corte { color: var(--f24-navy); }
.f24-section--amarillo  > .f24-corte { color: var(--f24-yellow); }

.f24-head {
  display: flex; justify-content: space-between; align-items: flex-end;
  gap: 1.25rem; flex-wrap: wrap;
  margin-bottom: 2.75rem;
}
.f24-head h2 { font-size: var(--f24-d2); }
.f24-more {
  display: inline-flex; align-items: center; gap: .5em; min-height: var(--f24-tap);
  font-size: var(--f24-label);
  font-weight: 800;
  letter-spacing: .15em;
  text-transform: uppercase;
  color: var(--f24-yellow);
}
.f24-more:hover { box-shadow: inset 0 -2px 0 currentColor; }
/* Sobre claro el amarillo no se lee (1,5:1): el enlace es azul y
   el amarillo entra como subrayado al pasar. */
.f24-section--claro .f24-more,
.f24-section--editorial .f24-more { color: var(--f24-blue); }
.f24-section--claro .f24-more:hover,
.f24-section--editorial .f24-more:hover { box-shadow: inset 0 -.5em 0 -.35em var(--f24-yellow); }
.f24-section--amarillo .f24-more { color: var(--f24-navy); }

/* Estado vacío: se escribe como titular, no como "no hay datos".
   La web del club no puede tener huecos con cara de error. */
.f24-empty {
  font-family: var(--f24-display);
  font-size: var(--f24-d5);
  font-weight: 900;
  text-transform: uppercase;
  letter-spacing: var(--f24-track-display);
  line-height: .95;
  margin: 0;
  max-width: 20ch;
}
/* La frase de "todavía no hay" es el TITULAR de esa sección, no
   un aviso apagado: se escribe a plena tinta con la palabra clave
   subrayada. Un gris al 55 % la dejaba con cara de error. */
.f24-empty em { font-style: normal; box-shadow: inset 0 -.12em 0 var(--f24-yellow); }
.f24-empty + .f24-lead { margin-top: 1.25rem; }
.f24-section--claro .f24-lead,
.f24-section--editorial .f24-lead { color: var(--f24-ink-soft); }
.f24-section--amarillo .f24-lead  { color: var(--f24-navy); }

/* ============================================================
   MATCH CENTER — un marcador de retransmisión, no una tarjeta
   ============================================================ */

.f24-board {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 1rem;
  padding: 2.375rem 0;
  border-top: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
}
/* NOMBRE EN EL MARCADOR — dos alturas.
   Un marcador de retransmisión enseña el CLUB en grande y el
   equipo en pequeño. Aquí es además lo que evita el desastre:
   con "CBAT Senior Masc." o "CB Rincón de la Victoria" a 7rem,
   el navegador partía las palabras con guiones ("CB MARBE-LLA").
   Nada de `hyphens: auto` en nombres propios. */
/* 🛡️ EL ESCUDO DEL RIVAL EN EL MARCADOR (13/09/2026).
   Tamaño en `em` para que siga al nombre del equipo cuando el marcador
   encoge en móvil, y `contain` porque los escudos llegan en todas las
   proporciones: cuadrados, apaisados y con forma de escudo de verdad.
   No se le pone fondo: los que traen transparencia se apoyan en la
   tarjeta, y ponerles un cuadro blanco los ensuciaría. */
.f24-board-escudo {
  display: block;
  /* Se subió de 2,125em a 3,5em el 13/09/2026: a ojo del usuario se
     quedaban pequeños al lado del nombre del equipo, que en este marcador
     es tipografía display. Sigue en `em` para que encoja con el nombre. */
  width: 3.5em; height: 3.5em;
  object-fit: contain;
  margin-bottom: .25rem;
}
.f24-board-team--away .f24-board-escudo { margin-left: auto; }
.f24-board-team { margin: 0; min-width: 0; }
.f24-board-team strong {
  display: block;
  font-family: var(--f24-display);
  font-size: var(--f24-d3);
  font-weight: 900;
  letter-spacing: -.06em;
  line-height: .88;
  text-transform: uppercase;
  text-wrap: balance;
}
.f24-board-team span {
  display: block;
  margin-top: .5rem;
  font-family: var(--f24-body);
  font-size: var(--f24-label);
  font-weight: 800;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--f24-ink-soft);
}
.f24-board-team--away { text-align: right; }
.f24-board-mid { text-align: center; }
.f24-board-mid strong {
  display: block;
  font-family: var(--f24-display);
  font-size: clamp(1.75rem, 6vw, 5.5rem);
  font-weight: 900;
  letter-spacing: -.06em;
}
.f24-board-mid small {
  display: block;
  font-size: var(--f24-label-sm);
  font-weight: 800;
  letter-spacing: .15em;
  text-transform: uppercase;
  color: var(--f24-ink-soft);
  margin-top: .375rem;
}
/* Resultado: el ganador manda tipográficamente. */
.f24-board-mid strong .f24-score-win  { color: var(--f24-blue); }
.f24-board-mid strong .f24-score-sep  { opacity: .35; margin: 0 .15em; }

/* «Jugado» (Baby y Premini, que no llevan marcador). Es una PALABRA
   donde el marcador pone cifras: al tamaño del resultado —hasta
   5.5rem— se comería los nombres de los dos equipos, así que baja de
   escala y suelta el interletraje negativo, que es para números. */
.f24-board-mid strong.f24-board-jugado {
  font-size: clamp(1.25rem, 3.5vw, 2.75rem);
  letter-spacing: -.02em;
}

/* 🤝 «Partido patrocinado por». Una línea discreta bajo la meta: el
   patrocinador tiene que verse en cada partido, pero lo primero que se lee
   sigue siendo quién juega y cuándo. */
.f24-board-patro {
  display: flex; align-items: center; justify-content: center;
  flex-wrap: wrap; gap: .5rem .75rem;
  margin: .75rem 0 0;
}
.f24-board-patro-txt {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--f24-ink-soft);
}
.f24-board-patro-marca {
  display: inline-flex; align-items: center; gap: .625rem;
  text-decoration: none; color: inherit;
}
/* El alto lo manda la marca mas apretada que tenemos: el logotipo de
   Invermoneda es una palabra ancha y baja (466x86), asi que a 1,5rem de alto
   las letras quedaban en 10 px y solo se leia la M. A 2,5rem la palabra se
   lee entera. */
.f24-board-patro-marca img {
  height: 2.5rem; width: auto; max-width: 12rem;
  object-fit: contain;
}
/* 🏷️ AQUÍ VA EL LOGO NORMAL Y SIN PLACA, porque esta línea vive sobre
   superficie clara. `patrocinadores` guarda las dos versiones de cada
   logotipo desde antes de todo esto: `logo` (el de color, para fondo claro)
   y `logo_blanco` (para fondo oscuro, el de los muros).

   ⚠️ Antes se intentó salir del paso con UNA sola versión: placa blanca bajo
   el logo del muro (desaparecieron los ocho) y placa navy bajo el de la
   línea (se leía, pero encajonado). Ninguna de las dos era el problema: el
   problema era pretender que un archivo sirviera para los dos fondos. */
/* 🔴 ESTA REGLA VA DESPUES DE `.f24-board-patro` A PROPOSITO: las dos
   tienen la misma especificidad, así que escrita antes ganaba la base y la
   línea seguía saliendo centrada por mucho `flex-start` que se le pusiera.
   Pasó al escribirla (13/09/2026) y se vio en la ficha del Invermoneda.
   Encabezando una LISTA se alinea con el título; acompañando a un
   marcador, centrada. */
.f24-board-patro--bloque {
  justify-content: flex-start;
  margin: -.5rem 0 1.25rem;
}
.f24-board-patro-marca strong {
  font-size: var(--f24-label);
  font-weight: 900; letter-spacing: .1em; text-transform: uppercase;
}
/* Sobre fondo oscuro el gris de la meta se apaga demasiado. */
.f24-section--navy .f24-board-patro-txt { color: var(--f24-blue-pale); }

.f24-board-meta {
  display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
  margin-top: 1rem;
  font-size: var(--f24-label);
  font-weight: 800;
  letter-spacing: .12em;
  text-transform: uppercase;
}

/* Lista de partidos: filas con filete de estado. Sin cajas. */
.f24-fixtures { margin-top: 3rem; display: grid; }
.f24-fixture {
  display: grid;
  /* La segunda columna es el hueco FIJO del escudo: se reserva aunque ese
     partido no tenga, para que los nombres de todas las filas empiecen en
     la misma vertical. */
  /* 11,5 rem y no 10: esa columna dejó de ser solo la categoría —ahora lleva
     debajo la competición y a la derecha el logo del patrocinador—. Con 10 rem
     al texto le quedaban ~80 px y «VI Supercopa Diputación Provincial Málaga»
     salía a renglón por palabra en la portada. */
  grid-template-columns: 11.5rem 2.5rem 1fr auto;
  align-items: baseline;
  gap: 1.25rem;
  padding: 1.125rem 0 1.125rem 1rem;
  border-top: 1px solid var(--f24-line-light);
  border-left: 3px solid var(--f24-blue);
  transition: background-color 140ms ease-out;
}
/* Al pasar por encima, la fila se tiñe de azul del club (21/09/2026, pedido
   del usuario: «que cambien de color, se ponga azulito»).
   El tinte va con `color-mix` sobre `--f24-blue` y no con un color fijo: así
   sigue al azul del club si algún día cambia, y al ser un 7 % no compite con
   el verde/rojo del marcador, que es lo único que debe destacar en la fila.
   Solo donde hay ratón: en táctil el `:hover` se queda pegado al tocar. */
@media (hover: hover) {
  .f24-fixture:hover { background-color: color-mix(in srgb, var(--f24-blue) 7%, transparent); }
}
.f24-fixture:last-child { border-bottom: 1px solid var(--f24-line-light); }
/* La crónica del partido, en su propia fila del grid (13/09/2026). Empieza en
   la columna del NOMBRE y no en el margen, para que se lea como lo que es:
   lo que se cuenta de ESE partido, no un texto suelto de la página.
   Filete amarillo, igual que en la ficha de la jornada — es la misma pieza
   editorial y no debe tener dos caras. */
.f24-fixture-cronica {
  grid-column: 3 / -1;
  max-width: 46rem;
  margin: .75rem 0 0;
  padding-left: 1rem;
  border-left: 3px solid var(--f24-yellow);
  color: var(--f24-ink);
  font-size: .9375rem;
  line-height: 1.55;
}
.f24-fixtures--oscuro .f24-fixture-cronica { color: var(--f24-on-dark-soft); }
/* El filete de la izquierda, por estado (21/09/2026):
   ganado verde · perdido rojo · en casa azul · fuera amarillo · descansa gris.
   El amarillo de `--final` se queda como respaldo para los partidos jugados
   SIN marcador publicado (baby y premini), donde no hay ganador que pintar. */
.f24-fixture--final  { border-left-color: var(--f24-yellow); }
.f24-fixture--rest   { border-left-color: var(--f24-grey-soft); }
.f24-fixture--gana   { border-left-color: var(--green); }
.f24-fixture--pierde { border-left-color: var(--red); }
.f24-fixture--casa   { border-left-color: var(--f24-blue); }
.f24-fixture--fuera  { border-left-color: var(--f24-yellow); }
/* La celda de la categoría es una rejilla de dos columnas: a la izquierda las
   dos líneas (categoría y competición) y a la derecha el logo del
   patrocinador, centrado sobre las DOS (21/09/2026, usuario: «el mejor sitio
   no es debajo sino a la misma altura […] en la derecha una como si fuesen
   las dos»). Puesto debajo empujaba la fila hacia abajo y dejaba la columna
   más alta que el partido. */
.f24-fixture-cat {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .15em; text-transform: uppercase;
  color: var(--f24-ink-soft);
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: .5rem;
  align-items: center;
}
.f24-fixture-cat-txt,
.f24-fixture-competi { grid-column: 1; }
/* La competición, bajo la categoría: en minúsculas, más floja y a DOS LÍNEAS
   como mucho. Sin el tope, «VI Supercopa Diputación Provincial Málaga» se
   partía en cinco renglones dentro de una columna de 11 rem y la fila parecía
   un párrafo; lo que manda ahí es la categoría, esto es el apellido. */
.f24-fixture-competi {
  display: -webkit-box;
  -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  margin-top: .3rem;
  font-size: .6875rem; font-weight: 700; font-style: normal;
  letter-spacing: .02em; text-transform: none;
  line-height: 1.25; opacity: .68;
}
/* El logo del patrocinador dentro de la fila: chiquito, en escala de grises y
   con poca opacidad hasta que se pasa por encima. Así firma el partido sin
   competir con el marcador ni con el escudo del rival, que son los dos
   elementos que sí hay que leer de un vistazo. */
/* ⚠️ Va con `.f24` delante A PROPOSITO: `.f24 img { max-width: 100% }` tiene
   una clase MAS de especificidad que `.f24-fixture-patro` a secas, asi que se
   comia el tope de ancho y el logo salia a 104 px —el doble— aplastando la
   columna de la categoria hasta dejarla en 72 px de texto. */
.f24 .f24-fixture-patro {
  grid-column: 2; grid-row: 1 / span 2; align-self: center;
  display: block;
  max-width: 4.25rem; max-height: 1.4rem;
  width: auto; height: auto;
  object-fit: contain; object-position: left center;
  opacity: .55; filter: grayscale(1);
  transition: opacity 160ms ease-out, filter 160ms ease-out;
}
@media (hover: hover) {
  .f24-fixture:hover .f24-fixture-patro { opacity: 1; filter: grayscale(0); }
}
/* Cuál de las dos versiones del logo se ve: la de color sobre claro y la
   BLANCA sobre navy (21/09/2026, usuario: «en últimos resultados el
   patrocinador en formato blanco, si no los que son azules ni los vemos»).
   Si el patrocinador solo tiene una versión, esa se queda. */
.f24-fixture-patro--blanco { display: none; }
.f24-fixtures--oscuro .f24-fixture-patro--color  { display: none; }
.f24-fixtures--oscuro .f24-fixture-patro--blanco { display: block; opacity: .75; filter: none; }
@media (hover: hover) {
  .f24-fixtures--oscuro .f24-fixture:hover .f24-fixture-patro--blanco { opacity: 1; }
}
@media (max-width: 900px) {
  /* En móvil la categoría ocupa toda la fila y hay sitio de sobra al lado de
     la etiqueta: el logo respira un poco más. */
  .f24 .f24-fixture-patro { max-height: 1.5rem; }
}
.f24-fixture-tie strong {
  font-family: var(--f24-display);
  font-size: clamp(1.125rem, 2.2vw, 1.75rem);
  font-weight: 900; letter-spacing: -.03em; text-transform: uppercase;
  display: block;
}
.f24-fixture-tie em {
  font-style: normal;
  color: var(--f24-ink-soft);
  font-size: .875rem;
}
/* DERBI (02/10/2026): pegatina junto al nombre cuando juegan dos equipos del
   club entre sí. Amarillo con tinta navy, un pelín girada: es una pegatina. */
.f24-derbi {
  display: inline-block;
  vertical-align: middle;
  margin-left: .375rem;
  padding: .2rem .5rem;
  background: var(--f24-yellow);
  color: var(--f24-navy);
  font-family: var(--f24-body);
  font-size: var(--f24-label-sm);
  font-weight: 900;
  letter-spacing: .15em;
  transform: rotate(-4deg);
  border-radius: var(--radius-sm);
}
.f24-fixture-when {
  font-size: var(--f24-label);
  font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  white-space: nowrap;
}
/* LA PISTA, bajo la fecha y la hora (20/09/2026). Va en otra línea, más
   pequeña y sin mayúsculas forzadas: es un dato de apoyo, no un titular, y
   los nombres de pabellón son largos. */
/* El pabellon, cuando lleva mapa, sigue siendo el mismo texto: subrayado
   discreto al pasar por encima y nada mas. No es una llamada a la accion, es
   un dato que ademas resulta que se puede abrir. */
.f24-fixture-pista--mapa {
  color: inherit; text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color 140ms ease-out;
}
@media (hover: hover) {
  .f24-fixture-pista--mapa:hover { border-bottom-color: currentColor; }
}
.f24-fixture-pista--mapa:focus-visible { outline: 2px solid var(--f24-yellow); outline-offset: 2px; }
.f24-fixture-pista {
  display: block; margin-top: .25rem;
  font-size: .78em; font-weight: 700; font-style: normal;
  letter-spacing: .02em; text-transform: none;
  white-space: normal; opacity: .72;
}
/* La fecha que acompaña al marcador NO hereda el verde de ganar ni el rojo de
   perder: el color ahí significa resultado, y una fecha no se gana ni se
   pierde. Va en el gris de metadatos y más pequeña, que el marcador es
   tipografía grande y si no se lee como parte del número. */
.f24-fixture-score .f24-fixture-pista {
  color: var(--f24-ink-soft); opacity: 1;
  font-size: .42em; letter-spacing: .08em; text-transform: uppercase;
  margin-top: .35rem;
}
.f24-fixtures--oscuro .f24-fixture-score .f24-fixture-pista { color: var(--f24-on-dark-soft); }

/* Suscripcion al calendario: el boton y su letra pequena. La nota va en gris
   de metadatos y no en rojo de aviso — informa, no asusta. */
.f24-calsub {
  display: flex; gap: 1.25rem; flex-wrap: wrap;
  /* Anclado arriba y NO centrado: con `center`, al desplegar el «cómo
     funciona» el botón se iba hacia abajo buscando el centro de la fila, y un
     botón que se mueve solo cuando pulsas al lado parece que algo falla. */
  align-items: flex-start;
  margin-bottom: 2.5rem;
}
/* El desplegable de info: cerrado es una linea discreta con su simbolo;
   abierto, tres parrafos cortos. Nada de amarillo — esto informa, no avisa de
   un problema, y el dorado en esta paleta no vale ni para texto. */
.f24-info {
  flex: 1 1 20rem; min-width: 0;
  font-size: .8125rem; line-height: 1.5; color: var(--f24-ink-soft);
}
.f24-info > summary {
  cursor: pointer; list-style: none;
  display: inline-flex; align-items: center; gap: .45rem;
  font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
  font-size: var(--f24-label);
  color: var(--f24-blue);
  padding: .25rem 0;
}
.f24-info > summary::-webkit-details-marker { display: none; }
/* El simbolo de informacion, dibujado con el borde: un icono menos que cargar. */
.f24-info > summary::before {
  content: "i";
  flex: 0 0 auto;
  width: 1.05rem; height: 1.05rem;
  border: 1.5px solid currentColor; border-radius: 50%;
  font-family: var(--f24-display); font-style: italic;
  font-size: .75rem; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center;
}
.f24-info[open] > summary { margin-bottom: .5rem; }
.f24-info-cuerpo {
  border-left: 2px solid var(--f24-line-light);
  padding-left: .9rem;
  max-width: 34rem;
}
.f24-info-cuerpo p { margin: 0 0 .5rem; }
.f24-info-cuerpo p:last-child { margin-bottom: 0; }
.f24-info > summary:focus-visible { outline: 2px solid var(--f24-yellow); outline-offset: 3px; }
@media (max-width: 760px) {
  .f24-calsub { gap: .75rem; }
  .f24-calsub .f24-btn { width: 100%; justify-content: center; }
}

/* ── Calendario en DOS COLUMNAS (20/09/2026) ──────────────────────────────
   «Próximos partidos y resultados en dos columnas para no tener tanto
   scroll»: con el calendario entero son 20-25 partidos por equipo y en fila
   india había que recorrer la página para ver un resultado. */
.f24-calgrid {
  display: grid; gap: 3rem 2.5rem; align-items: start;
  /* `auto-fit` y no `1fr 1fr`: un equipo que aún no ha jugado solo tiene la
     columna de próximos, y con dos columnas fijas se quedaba encogida en la
     mitad izquierda con medio folio en blanco al lado. */
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
}
.f24-calgrid .f24-calcol {
  min-width: 0;
  /* Tope de ancho AUNQUE haya una sola columna: un equipo que todavía no ha
     jugado solo tiene «Próximos partidos», y sin esto la fila se estiraba a
     toda la página dejando la fecha a medio metro del nombre del rival. */
  max-width: 46rem;
}
/* En columna, los dos titulares van en UNA línea («Próximos partidos» perdió su
   salto): así arrancan las dos listas a la misma altura sin reservar hueco. */
.f24-calgrid .f24-head h2 { text-wrap: balance; }
.f24-calgrid .f24-fixtures { margin-top: 1.5rem; }
/* Texto más grande en la lista de partidos (21/09/2026, pedido del usuario).
   Sube el rival, la fecha y la pista; el nombre del equipo ya escala solo con
   `clamp()`. Se toca únicamente dentro de `.f24-calgrid` —la ficha de equipo—
   para no cambiar de paso el Match Center ni la portada. */
.f24-calgrid .f24-fixture-tie em { font-size: 1rem; }
.f24-calgrid .f24-fixture-when  { font-size: .8125rem; }
.f24-calgrid .f24-fixture-cat   { font-size: .75rem; }
.f24-calgrid .f24-fixture-competi { font-size: .75rem; }
/* El MARCADOR, más grande (21/09/2026, usuario: «los de resultado se han
   descuadrado un poco o el resultado se ve pequeñito»). En dos columnas el
   `clamp` con `vw` se quedaba corto: el `vw` mide la VENTANA, no la columna,
   así que al partir la lista en dos el número siguió creciendo igual pero al
   lado de un bloque la mitad de ancho parecía pequeño. */
.f24-calgrid .f24-fixture-score { font-size: clamp(2rem, 3.2vw, 3.25rem); line-height: 1; }
/* Y la fecha de debajo pasa de .42em translúcido a tamaño absoluto con el gris
   de metadatos: es un dato que se lee, no una marca de agua. */
.f24-calgrid .f24-fixture-score .f24-fixture-pista {
  font-size: .8125rem;
  letter-spacing: .04em;
  color: var(--f24-ink-soft);
  opacity: 1;
  margin-top: .4rem;
}
/* LA PISTA, LEGIBLE (21/09/2026, usuario: «la pista sigue sin verse»).
   Estaba en `em` colgando de la fecha, que ya es un texto pequeño: el .78em
   se quedaba en ~9 px, y encima con opacidad .72 sobre gris claro. Se pasa a
   tamaño ABSOLUTO, sin opacidad y con el gris de metadatos, que sí tiene
   contraste. Dónde se juega no es decoración: es lo que busca un padre para
   saber a qué pabellón ir.
   ⚠️ Acotado al bloque de FECHA/HORA (`--when`) y no a cualquier `-pista`:
   la fecha que acompaña al marcador usa la misma clase y es deliberadamente
   diminuta. Sin acotar, esta regla la agrandaba y descuadraba la columna. */
.f24-calgrid .f24-fixture-when .f24-fixture-pista {
  font-size: .8125rem;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  opacity: 1;
  color: var(--f24-ink-soft);
}
@media (max-width: 760px) {
  .f24-calgrid .f24-fixture-when .f24-fixture-pista { font-size: .875rem; }
}
/* La columna de fecha/hora/pista, de ANCHO FIJO y alineada a la derecha: con
   `auto` cada fila empezaba donde terminaba el nombre del rival, así que las
   fechas quedaban desparramadas —una a cada altura— en vez de formar columna. */
/* Centrado vertical dentro de la fila (21/09/2026, usuario: «habría que
   centrar en cuanto al alto»). La fila original alinea por `baseline`, que
   funciona cuando todo son textos de un renglón; aquí la celda de categoría
   puede ocupar cuatro líneas («VI Supercopa Diputación Provincial Málaga») y
   el marcador es tipografía grande, así que por baseline todo quedaba colgando
   de arriba. Centrado, cada bloque se sitúa respecto a la altura real de la
   fila. Solo dentro de `.f24-calgrid`: el Match Center sigue como estaba. */
.f24-calgrid .f24-fixture {
  grid-template-columns: 11.5rem 2.5rem 1fr 10.5rem;
  align-items: center;
}
/* La fecha y la pista van una debajo de otra y con longitudes distintas: si se
   alinean a la derecha, el borde IZQUIERDO queda dentado y cada fila parece
   colocada a su aire. A la izquierda comparten el mismo punto de partida y se
   leen como columna. El marcador sí va a la derecha: es un número. */
.f24-calgrid .f24-fixture-when { text-align: left; }
/* El marcador, CENTRADO en su columna y grande (21/09/2026, elección del
   usuario). Pegado a la derecha quedaba descolgado del partido al que
   pertenece; centrado en su hueco se lee como lo que es, el dato principal de
   la fila. La fecha se centra con él para que formen un bloque. */
.f24-calgrid .f24-fixture-score { text-align: center; }
/* 🔴 Y LO MISMO EN MÓVIL, o la fila se rompe.
   La fila de partido ya tenía su propia rejilla para pantallas pequeñas
   (`2.5rem 1fr auto` y `2.5rem 1fr`), pero esas reglas viven en un `@media`
   con UNA clase de especificidad; la de arriba lleva DOS, así que ganaba en
   todos los anchos. Resultado medido a 390 px: las columnas fijas sumaban más
   que la pantalla y el nombre del equipo salía a palabra por línea
   («VIVE / CBAT / SENIOR / FEM»). */
@media (max-width: 900px) {
  .f24-calgrid .f24-fixture { grid-template-columns: 2.5rem 1fr auto; }
}
@media (max-width: 520px) {
  .f24-calgrid .f24-fixture { grid-template-columns: 2.5rem 1fr; }
}
@media (max-width: 900px) {
  .f24-calgrid { grid-template-columns: 1fr; gap: 2.5rem; }
}
/* 🛡️ El escudo del rival en la fila. Cuadrado fijo y no en `em`: aquí la
   fila es densa y el escudo es un icono de lista, no un protagonista. */
.f24-fixture-escudo {
  width: 2.5rem; height: 2.5rem;
  display: flex; align-items: center; justify-content: center;
  align-self: center;
}
.f24-fixture-escudo img { max-width: 100%; max-height: 100%; object-fit: contain; }
/* 🟢🔴 Ganado y perdido. El color va en el MARCADOR, no en la fila entera:
   una fila verde y otra roja convierten la lista en un semáforo y lo
   primero que hay que leer sigue siendo quién juega contra quién. */
.f24-fixture-score--gana   { color: var(--green); }
.f24-fixture-score--pierde { color: var(--red); }
.f24-fixture-score {
  font-family: var(--f24-display);
  font-size: clamp(1.25rem, 3vw, 2.25rem);
  font-weight: 900; letter-spacing: -.04em;
  white-space: nowrap;
}
/* Misma posición que el marcador, pero es texto: sin el aire de una
   cifra grande, para que no compita con los resultados de al lado. */
.f24-fixture-score--jugado {
  font-size: clamp(.95rem, 1.8vw, 1.3rem);
  letter-spacing: .02em;
}

/* Las mismas filas sobre superficie OSCURA (sección de resultados):
   solo cambian las líneas y los grises, la anatomía es idéntica —un
   partido se lee igual esté donde esté. */
.f24-fixtures--oscuro .f24-fixture { border-top-color: var(--f24-line-dark); }
.f24-fixtures--oscuro .f24-fixture:last-child { border-bottom-color: var(--f24-line-dark); }
.f24-fixtures--oscuro .f24-fixture-cat,
.f24-fixtures--oscuro .f24-fixture-tie em { color: var(--f24-on-dark-soft); }

/* ============================================================
   EVENTOS — rejilla asimétrica, dorsal de fondo
   ============================================================ */

.f24-events { display: grid; grid-template-columns: 1.35fr .65fr; gap: 1.125rem; }
.f24-event {
  position: relative;
  min-height: 35rem;
  overflow: hidden;
  display: flex; align-items: flex-end;
  padding: 1.875rem;
  background: var(--f24-navy-800);
}
/* Los velos van con el NAVY del club, no con negro: oscurecen igual y
   tiñen en la marca en vez de apagar (decisión del usuario, 17/08). */
.f24-event--main {
  background:
    linear-gradient(0deg, color-mix(in srgb, var(--f24-navy) 80%, transparent), transparent 70%),
    radial-gradient(circle at 65% 35%, color-mix(in srgb, var(--f24-blue-mid) 90%, var(--f24-white)), transparent 30%),
    var(--f24-navy-800);
}
.f24-event--side {
  background:
    linear-gradient(0deg, color-mix(in srgb, var(--f24-navy) 85%, transparent), transparent),
    var(--f24-navy);
}
.f24-event-num {
  position: absolute; right: -.625rem; top: -2.2rem;
  font-family: var(--f24-display);
  font-size: 15.625rem; font-weight: 900;
  letter-spacing: -.1em;
  color: color-mix(in srgb, var(--f24-white) 6%, transparent);
  pointer-events: none; user-select: none;
}
.f24-event-txt { position: relative; }
.f24-event-txt h3 { font-size: var(--f24-d4); line-height: .86; margin: .625rem 0; }
.f24-event-txt p { color: var(--f24-on-dark-soft); margin: 0; }

/* ============================================================
   NOTICIAS — separadas por filete de 1px, nunca por caja
   ============================================================ */

/* Flex y no grid: con `1.2fr .8fr .8fr` fijas, una sola noticia dejaba dos
   columnas vacías pintadas de gris —el mismo agujero que tenían los
   partners—. Así la primera sigue mandando cuando hay varias, y cuando hay
   una ocupa el ancho entero. */
.f24-news {
  display: flex;
  flex-wrap: wrap;
  gap: 1px;
  background: var(--f24-line-light);
}
.f24-article {
  position: relative;
  flex: 1 1 20rem;
  background: var(--f24-white);
  color: var(--f24-ink);
  min-height: 24rem;
  padding: 1.5rem;
  display: flex; flex-direction: column; justify-content: flex-end;
  overflow: hidden;
  transition: background .18s ease;
}
/* 🔑 CLASE EXPLÍCITA, NO POSICIÓN (08/09/2026). Esto era
   `.f24-article:first-child`, y los selectores posicionales ya han mordido
   dos veces aquí: `a:first-child` el 16/08 (los primeros hijos eran `<form>`)
   y `td:last-child` el 25/08. Quién es la grande lo decide ahora la vista,
   que es la única que sabe cuántas noticias hay. */
.f24-article--principal { flex: 1.4 1 26rem; min-height: 32rem; }
/* Si es la única, no tiene sentido que sea "la grande" a doble altura. */
.f24-article--sola { min-height: 24rem; }

/* Sin fotografía es una tarjeta de TEXTO, y entonces sobra la mitad del
   alto: un bloque enorme vacío está pidiendo una imagen que no existe. */
.f24-article:not(.f24-article--foto) {
  min-height: 11rem;
  justify-content: flex-start;   /* el titular arriba: no hay foto que dejar ver */
}

/* Con fotografía, la tarjeta ES la foto: velo navy de abajo arriba para
   que el titular se lea siempre, tenga la foto que tenga. */
.f24-article--foto {
  background-image:
    linear-gradient(0deg, var(--f24-navy) 2%, color-mix(in srgb, var(--f24-navy) 55%, transparent) 45%, transparent 80%),
    var(--f24-art-img);
  background-size: cover;
  background-position: center;
  color: var(--f24-on-dark);
}
.f24-article--foto::before { content: none; }
.f24-article--foto .f24-article-date { color: var(--f24-yellow); }

/* 🛡️ SIN FOTO, EL ESCUDO DEL CLUB (13/09/2026). Una tarjeta de texto sobre
   blanco al lado de otra con fotografía se lee como un hueco. Con el escudo
   detrás sigue siendo una tarjeta de texto —el alto no crece, no hay nada que
   enseñar— pero con identidad del club en vez de vacío.
   Mismo tratamiento que las tarjetas de EQUIPO sin foto: navy de fondo, logo
   amarillo a la derecha y velo encima para que mande el titular. */
.f24-article--logo {
  background-color: var(--f24-navy);
  background-image: var(--f24-art-logo);
  background-repeat: no-repeat;
  background-size: auto 130%;
  background-position: right -2.5rem center;
  color: var(--f24-on-dark);
}
/* El radial claro de `.f24-article::before` está pensado para superficie
   blanca: sobre navy ensucia. Se retira, igual que en `--foto`. */
.f24-article--logo::before { content: none; }
.f24-article--logo::after {
  /* Capa aparte y no opacidad del fondo, porque `background-image` no tiene
     opacidad propia. Mismo recurso que `.f24-equipo--logo`. */
  content: "";
  position: absolute; inset: 0;
  background: color-mix(in srgb, var(--f24-navy) 72%, transparent);
  pointer-events: none;
}
.f24-article--logo > * { position: relative; z-index: 1; }
.f24-article--logo .f24-article-date { color: var(--f24-yellow); }
/* Velo del azul del club en la esquina, muy tenue: da profundidad sin
   oscurecer. Antes era un radial sobre negro. */
.f24-article::before {
  content: "";
  position: absolute; inset: 0;
  background: radial-gradient(circle at 70% 15%, color-mix(in srgb, var(--f24-blue) 10%, transparent), transparent 45%);
}
/* 🔴 `background-color` Y NO EL SHORTHAND `background` (13/09/2026).
   Aquí ponía `background: var(--f24-editorial)` y **la noticia se volvía
   BLANCA al pasar el ratón**: `--f24-editorial` es blanco con un 6 % de azul,
   y el shorthand RESETEA `background-image` — que en una tarjeta con foto es
   la foto y su velo navy. O sea que el hover borraba la imagen y dejaba la
   tarjeta en blanco con el titular encima.
   👉 La regla general: en un elemento que pueda tener imagen de fondo, el
   hover se escribe con `background-color`. El shorthand no cambia un color:
   rehace la capa entera. */
.f24-article:hover { background-color: var(--f24-editorial); }

/* ⚠️ Y VA DESPUÉS DE LA DE ARRIBA A PROPÓSITO. `.f24-article--foto:hover` y
   `.f24-article:hover` tienen EXACTAMENTE la misma especificidad (una clase +
   una pseudoclase), así que decide el orden. Estaba escrita antes y perdía —
   la misma trampa que mordió dos días seguidos el 12 y el 13/09. Si algún día
   alguien reordena este archivo, esto se rompe sin avisar.
   Sobre la foto el color casi no se ve (lo tapa el `cover`), pero refuerza el
   velo por los bordes y evita el destello claro de la regla general. */
.f24-article--foto:hover { background-color: var(--f24-navy); }
/* Misma trampa, mismo sitio: si esta regla subiera por encima de
   `.f24-article:hover` perdería por orden y la tarjeta parpadearía en blanco
   al pasar el ratón, que es justo el fallo que se arregló hoy. */
.f24-article--logo:hover { background-color: var(--f24-navy); }
.f24-article > * { position: relative; }
.f24-article-date {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
  color: var(--f24-blue);
}
.f24-article h3 { font-size: var(--f24-d5); line-height: .96; letter-spacing: -.04em; margin: .625rem 0 0; }
.f24-article:hover h3 { box-shadow: inset 0 -.08em 0 var(--f24-yellow); }

/* ============================================================
   PARTNERS — los patrocinadores reales del club
   ------------------------------------------------------------
   Muro de logos separados por filete de 1px, la misma gramática
   que las noticias. Nada de cajas redondeadas ni "banner".
   Los logos van en su versión BLANCA sobre superficie oscura, a
   opacidad contenida: acompañan, no gritan. Al pasar, el logo
   sube a plena tinta y el nombre se lee.
   ============================================================ */

/* Flex y no grid a propósito: con `auto-fit` la última fila dejaba
   un hueco muerto cuando el nº de partners no es múltiplo de las
   columnas (9 sobre 5). En flex, la última fila ESTIRA y el muro
   queda cerrado siempre, con los partners que haya. */
.f24-partners {
  display: flex;
  flex-wrap: wrap;
  border-top: 1px solid var(--f24-line-dark);
  border-left: 1px solid var(--f24-line-dark);
}
.f24-partner {
  flex: 1 1 11rem;
  border-right: 1px solid var(--f24-line-dark);
  border-bottom: 1px solid var(--f24-line-dark);
  /* Más alto para que el logo respire: la celda mandaba sobre la imagen y por
     eso se veía diminuta (usuario, 19/08). */
  /* 👀 La CELDA manda sobre la imagen: con la celda muy alta y la imagen
     con techo, sobra hueco arriba y abajo y el logo parece pequeño aunque
     esté a su tamaño. Visto en beta el 13/09/2026: se baja la celda y se
     sube la imagen. */
  min-height: 12.5rem;
  padding: 1.25rem 1rem 1rem;
  display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: .75rem;
  text-align: center;
}
/* 👀 EL LOGO MANDA. Estaba a `3.25rem` de alto y al 72 % de opacidad: «la
   imagen debe ser más grande, es diminuta», y era verdad — quien paga por
   salir en la web tiene que verse. Se sube el alto y se quita casi todo el
   velo; el `--principal` (el de nivel más alto, que ocupa doble ancho) sube en
   proporción y va ya a plena opacidad. */
/* 🔑 ALTO FIJO + `contain`, no `max-height` + `width:auto`. `max-height` solo
   pone un techo: NO agranda. Un logo de 88 px se quedaba en 88 aunque la celda
   diera para el doble, y por eso seguía viéndose diminuto después de subir el
   límite. Con una caja de alto fijo y el ancho completo, `contain` escala la
   imagen hasta el máximo que quepa sin deformarla. */
/* 📈 Subido otra vez el 13/09/2026: «en patrocinadores las imágenes son
   diminutas, y en la portada un pelín más grandes también». El muro se
   comparte entre la portada y la ficha de equipo, así que un solo cambio
   vale para los dos sitios. */
/* ⚠️ AQUI NO HACE FALTA PLACA, Y PONERLA LO ESTROPEA (probado y revertido
   el 13/09/2026). Los logos que ha subido el club son las versiones BLANCAS,
   hechas para fondo oscuro, y este muro es navy: se leen perfectamente. Al
   ponerles una placa blanca detrás desaparecieron los ocho de golpe.
   El problema del logo invisible está en las superficies CLARAS —la línea
   de «partido patrocinado por»—, y se resuelve allí. */
.f24-partner img {
  width: 100%; height: 8.75rem;
  object-fit: contain;
  opacity: 1;
  transition: opacity .18s ease, transform .18s ease;
}
.f24-partner:hover img,
.f24-partner:focus-visible img { transform: translateY(-2px); }
.f24-partner span {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--f24-blue-pale);
}
/* El nivel del acuerdo (MVP, Sexto Hombre…) sale de
   `patrocinador_niveles`, y con él se ORDENA el muro: el de nivel más
   alto va primero y ocupa el doble de ancho. */
.f24-partner-nivel {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
  color: var(--f24-yellow);
}
.f24-partner--principal { flex: 2 1 22rem; min-height: 15rem; }
.f24-partner--principal img { height: 12rem; opacity: 1; }
.f24-partner:hover span { color: var(--f24-yellow); }
/* Sin logo: el nombre hace de logotipo, no se deja el hueco vacío. */
.f24-partner strong {
  font-family: var(--f24-display);
  font-size: 1.25rem; font-weight: 900;
  letter-spacing: -.03em; text-transform: uppercase;
}

/* ============================================================
   PÁGINAS INTERIORES — filtros, día, equipos, plantilla
   ============================================================ */

/* Filtros con aire de retransmisión: micro-etiqueta encima y el
   control debajo. Se envían solos; el <noscript> deja un botón. */
.f24-filtros {
  display: flex; flex-wrap: wrap; gap: 1.25rem 1.75rem;
  padding-bottom: 1.75rem;
  border-bottom: 2px solid currentColor;
  margin-bottom: 2rem;
}
.f24-filtro { display: flex; flex-direction: column; gap: .375rem; }
.f24-filtro > span {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
  color: var(--f24-ink-soft);
}
.f24-filtro select {
  appearance: none;
  min-width: 11rem; max-width: 100%;
  padding: .5rem 2rem .5rem .75rem;
  border: 0; border-bottom: 2px solid var(--f24-blue);
  border-radius: 0;
  background: transparent;
  color: var(--f24-ink);
  font-family: var(--f24-display);
  font-size: 1.0625rem; font-weight: 900;
  letter-spacing: -.01em; text-transform: uppercase;
  cursor: pointer;
  /* La flecha, dibujada: así no depende de un icono ni de una fuente. */
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
                    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 12px center, right 6px center;
  background-size: 6px 6px, 6px 6px;
  background-repeat: no-repeat;
}
.f24-filtro select:focus-visible { outline: 3px solid var(--f24-blue); outline-offset: 3px; }

/* Los KPI sobre superficie clara (Match Center) */
.f24-stats--claro { border-top-color: var(--f24-navy); }
.f24-stats--claro .f24-stat { border-right-color: var(--f24-line-light); }

/* Título de día dentro de una jornada */
.f24-dia {
  font-family: var(--f24-display);
  font-size: clamp(1.25rem, 2.6vw, 2rem);
  font-weight: 900; text-transform: uppercase;
  letter-spacing: var(--f24-track-display);
  margin: 2.75rem 0 .75rem;
}
.f24-dia:first-of-type { margin-top: 2rem; }

/* ---- Muro de equipos ---- */
.f24-equipos {
  display: flex; flex-wrap: wrap; gap: 1px;
  background: var(--f24-line-light);
  border: 1px solid var(--f24-line-light);
}
.f24-equipo {
  flex: 1 1 17rem;
  min-height: 12.5rem;
  padding: 1.25rem 1.375rem;
  background: var(--f24-navy);
  color: var(--f24-on-dark);
  display: flex; flex-direction: column; gap: .25rem;
  position: relative; overflow: hidden;
  transition: background .18s ease;
}
.f24-equipo:hover { background: var(--f24-navy-800); }
.f24-equipo--foto {
  background-image:
    linear-gradient(0deg, var(--f24-navy) 8%, color-mix(in srgb, var(--f24-navy) 60%, transparent) 55%, transparent 90%),
    var(--f24-eq-img);
  background-size: cover; background-position: center;
}
/* 🛡️ SIN FOTO DE EQUIPO, EL LOGO DEL CLUB (12/09/2026, pedido por el usuario:
   «si no tenemos foto de equipo que se vea el logo del club»). Antes quedaba
   una tarjeta navy lisa, y con la mayoría de equipos sin foto la rejilla
   entera parecía sin terminar.

   Va como marca de agua —grande, descentrada a la derecha y traslúcida— y no
   como logo centrado: centrado competiría con el nombre del equipo, que es lo
   que de verdad hay que leer. Y es el logo AMARILLO SIN FONDO, el único que
   funciona sobre superficie oscura (ver `f24_marca_fondo()`). */
.f24-equipo--logo {
  background-image: var(--f24-eq-logo);
  background-repeat: no-repeat;
  background-size: auto 118%;
  background-position: right -2.5rem center;
}
.f24-equipo--logo::after {
  /* Un velo por encima del logo para que el texto mande. Va en una capa
     aparte y no como opacidad del fondo porque `background-image` no tiene
     opacidad propia. */
  content: "";
  position: absolute; inset: 0;
  background: color-mix(in srgb, var(--f24-navy) 78%, transparent);
  pointer-events: none;
}
.f24-equipo--logo > * { position: relative; z-index: 1; }
.f24-equipo-cat {
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
  color: var(--f24-yellow);
}
.f24-equipo strong {
  font-family: var(--f24-display);
  font-size: clamp(1.375rem, 2.4vw, 1.875rem);
  font-weight: 900; line-height: .95;
  letter-spacing: -.03em; text-transform: uppercase;
  margin-top: auto;
}
.f24-equipo em {
  font-style: normal; font-size: .875rem;
  color: var(--f24-on-dark-soft);
}
.f24-equipo-pie {
  display: flex; justify-content: space-between; align-items: center;
  margin-top: .625rem;
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--f24-on-dark-soft);
}
.f24-equipo:hover .f24-equipo-pie { color: var(--f24-yellow); }

/* ---- Plantilla: el DORSAL como elemento gráfico ---- */
/* Fondo TRANSPARENTE y filete por ficha, no en el contenedor: con el
   filete en el contenedor, un equipo con 2 jugadoras dejaba media
   rejilla pintada de gris. Es el mismo agujero que tenían partners y
   noticias — con `auto-fill`, las celdas que sobran siguen existiendo. */
.f24-plantilla {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr));
  gap: 1px;
}
/* Sin borde y sin fondo blanco (21/09/2026, usuario: «yo le quitaba el borde
   y el fondito blanco»). Las fotos son recortes con transparencia: el blanco
   se veía POR DETRÁS de la figura y, con el filete alrededor, cada una parecía
   metida en una casilla. Quitando las dos cosas la figura se apoya sobre la
   página y la rejilla desaparece. Lo demás —tamaño, encuadre y el nombre sobre
   la foto— se queda exactamente igual. */
.f24-jugador {
  position: relative; overflow: hidden;
  background: transparent;
  aspect-ratio: 3 / 4;
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: .875rem;
  transition: transform 160ms ease-out, filter 160ms ease-out;
}
/* Al pasar por encima, la figura se levanta un poco y proyecta sombra.
   🔑 La sombra va en `filter: drop-shadow` y no en `box-shadow`: estas fotos
   son recortes con transparencia, así que el filtro sigue la SILUETA de la
   jugadora. Con `box-shadow` saldría la sombra del rectángulo, que es justo la
   caja que acabamos de quitar.
   Solo `transform` y `filter` —nada de tamaños ni posiciones— para que el
   navegador lo resuelva sin recalcular la rejilla. Y solo donde hay ratón:
   en táctil el `:hover` se queda pegado tras el toque.
   ⚠️ No lleva `prefers-reduced-motion`: `tokens.css` ya trae un reset global
   que apaga transiciones en todo el proyecto. */
@media (hover: hover) {
  .f24-jugador--foto:hover {
    transform: translateY(-.35rem);
    filter: drop-shadow(0 .5rem .7rem color-mix(in srgb, var(--f24-navy) 28%, transparent));
  }
}
/* ⚠️ EL VELO AZUL BAJÓ MUCHO (12/09/2026, dicho por el usuario: «la foto de
   los jugadores se ve con demasiado azul»). Antes el degradado iba al 55 % de
   navy A MEDIA ALTURA y no se aclaraba hasta el 85 %, así que cubría el torso
   entero. Con las camisetas del club —que ya son azules— la rejilla completa
   se leía como una mancha azul y las fotos no se distinguían entre sí.
   Ahora el degradado solo hace su trabajo: tapar la franja donde va el nombre.
   Opaco abajo, transparente por encima del 48 %. */
.f24-jugador--foto {
  background-image:
    linear-gradient(0deg,
      var(--f24-navy) 0%,
      color-mix(in srgb, var(--f24-navy) 82%, transparent) 15%,
      color-mix(in srgb, var(--f24-navy) 22%, transparent) 33%,
      transparent 48%),
    var(--f24-jug-img);
  background-size: cover; background-position: center top;
  color: var(--f24-on-dark);
}

/* Sin foto —el caso de hoy: 3 de 231 con autorización— el dorsal ES
   la imagen. Grande, recortado por arriba, en azul del club. */
.f24-jugador-dorsal {
  position: absolute; inset: auto 0 1.5rem 0;
  font-family: var(--f24-display);
  font-size: clamp(4rem, 9vw, 7rem);
  font-weight: 900; line-height: .8;
  letter-spacing: -.06em; text-align: center;
  color: color-mix(in srgb, var(--f24-blue) 16%, transparent);
  pointer-events: none; user-select: none;
}

/* El número suelto sobre la foto queda solo como RESPALDO: se pinta si el club
   no tiene ninguna equipación subida. Arriba a la derecha, en el mismo sitio
   que la chapa, y con relleno claro + trazo navy —el mismo truco que el número
   de la camiseta— porque es lo único que se lee sobre cualquier foto. */
.f24-jugador--foto .f24-jugador-dorsal {
  inset: .5rem .625rem auto auto;
  font-size: clamp(1.75rem, 4vw, 2.5rem);
  color: var(--f24-white);
  -webkit-text-stroke: .055em var(--f24-navy);
  paint-order: stroke fill;
  text-align: right;
}
/* ------------------------------------------------------------
   CAMISETA CON DORSAL (18/08) — cuando no hay foto del jugador
   ------------------------------------------------------------
   Una sola imagen sin número + el dorsal escrito encima. La posición y el
   tamaño llegan en `style` desde Configuración, porque cada camiseta lleva
   el número en un sitio distinto.

   🔑 El tamaño va en `cqw` (% del ANCHO DE LA CAMISETA, no de la ventana):
   con `vw` el número bailaría respecto a la camiseta al cambiar de pantalla
   y se saldría del hueco. Por eso el contenedor declara `container-type`. */
.f24-camiseta {
  position: absolute; inset: 0 0 2.5rem 0;
  display: grid; place-items: center;
  padding: .5rem;
  pointer-events: none; user-select: none;
}
/* El lienzo tiene la PROPORCIÓN EXACTA de la imagen (se la pasa el PHP),
   así que los porcentajes del dorsal son de la camiseta y no de su caja.
   `container-type` va aquí por lo mismo: el tamaño del número en `cqw` se
   mide contra la camiseta, no contra la tarjeta. */
.f24-camiseta-lienzo {
  position: relative;
  container-type: inline-size;
  height: 100%; max-width: 100%;
  background: center / contain no-repeat;
}
.f24-camiseta img {
  /* ⚠️ TAMAÑO EXPLÍCITO + `contain`, no `auto` + `max-*`.
     Medido el 18/08: con `width/height:auto` la imagen reclamaba su altura
     natural (210px en un hueco de 159) y **pisaba el nombre del jugador**,
     porque los items de grid nacen con `min-height:auto` y eso gana a
     `max-height:100%`. Y al forzar `min-height:0` se iba al extremo
     contrario: se encogía hasta desaparecer.
     Dándole el 100% de la caja y dejando que `object-fit` la encaje, la
     camiseta ocupa todo lo que puede sin salirse nunca. */
  width: 100%; height: 100%;
  object-fit: contain;
  min-height: 0; min-width: 0;
}
.f24-camiseta-num {
  position: absolute;
  transform: translate(-50%, -50%);
  font-family: var(--f24-display);
  font-weight: 900; line-height: 1;
  letter-spacing: -.04em;
  /* ⚠️ CONTORNO, NO UN COLOR FIJO. El club tiene equipación BLANCA y AZUL:
     un número blanco desaparecía sobre la blanca (pasó: se veía «vacía»
     aunque el número estaba ahí, medido en el navegador el 18/08) y uno
     navy se perdería sobre la azul. Relleno claro + trazo navy se lee sobre
     las dos, y sobre la que venga mañana.
     `paint-order` manda el trazo DETRÁS del relleno: sin él, el borde se
     come el interior de la cifra y a tamaño pequeño queda ilegible. */
  color: var(--f24-white);
  -webkit-text-stroke: .075em var(--f24-navy);
  paint-order: stroke fill;
}

/* ⚠️ LA CHAPA VA DESPUÉS DE `.f24-camiseta` A PROPÓSITO: las dos reglas
   tienen la misma especificidad, así que si se escribe antes, el
   `inset: 0 0 2.5rem 0` de la camiseta grande gana y la chapa sale
   estirada por toda la tarjeta. Pasó al escribirla (12/09/2026). */
/* 🎽 EL DORSAL SOBRE UNA CAMISETA, ARRIBA A LA DERECHA (12/09/2026).
   Encargo del usuario, con estas palabras: «quiero que se vean sobre una
   equipación en la esquina superior derecha».

   🔴 SE LLEGÓ AQUÍ DESPUÉS DE UN INTENTO QUE FALLÓ, y conviene que quede
   escrito para no repetirlo. Primero se puso el número suelto centrado sobre
   el pecho, en blanco al 58 % con una sombra corta, buscando que se leyera
   como impreso en la tela. NO SE LEÍA: estas fotos llevan camiseta azul con el
   escudo bordado y «ALHAURÍN DE LA TORRE» en letras grandes, así que el número
   se perdía entre el estampado, y sobre la equipación negra desaparecía. Se
   comprobó en el móvil, que es donde se mira esta página.

   Subir la opacidad no era la solución: el problema no es el número, es que
   una cifra sin fondo propio depende de la foto que le toque, y las fotos las
   hace el club. La camiseta le da ese fondo, y además es LA MISMA imagen y el
   MISMO hueco del número que usan las fichas sin foto, así que toda la
   plantilla se lee igual tengan foto o no. */
.f24-camiseta--chapa {
  /* ABAJO A LA DERECHA Y MÁS PEQUEÑA (12/09/2026, pedido del usuario tras
     verla arriba: «más chiquitita la foto, y prueba abajo derecha»).

     🔑 ABAJO DEL TODO, apoyada en el borde de la tarjeta: el usuario lo
     pidió así tras verla a media altura («tiene que estar abajo del todo»).
     Comparte franja con el nombre, y por eso el nombre reserva sitio a su
     derecha — ver `.f24-jugador--chapa .f24-jugador-nombre`. Sin esa reserva,
     un nombre de dos líneas se mete por debajo de la camiseta.

     El ancho va en % de la tarjeta, no en rem, para que la chapa guarde la
     misma proporción en el móvil (dos columnas) y en escritorio (cinco). */
  inset: auto .375rem 0 auto;
  display: block;
  width: 24%; max-width: 3.25rem;
  padding: 0;
  /* La camiseta va sobre una foto: sin sombra se pega al fondo y parece un
     recorte. Va en `filter` y no en `box-shadow` para que siga la silueta
     del PNG, no su caja. */
  filter: drop-shadow(0 .125rem .25rem color-mix(in srgb, var(--f24-navy) 55%, transparent));
}
.f24-camiseta--chapa .f24-camiseta-lienzo {
  /* 🔴 `display:block` NO ES DECORATIVO, es lo que hace que esto funcione.
     El lienzo es un `<span>`, y en la versión grande se comporta como caja
     porque su padre es `display:grid` y la rejilla blockifica a sus hijos.
     Aquí el padre es `block`, así que el span seguía siendo INLINE: ni ancho,
     ni `aspect-ratio`, ni `container-type`. Resultado medido el 12/09/2026:
     camiseta de 53×0 px y el dorsal a 156 px, porque al no haber contenedor
     el `cqw` se medía contra la ventana entera.
     Y el alto sale del `aspect-ratio` que pone el PHP, no de un valor fijo:
     cada equipación tiene su proporción. */
  display: block;
  width: 100%; height: auto; max-width: none;
}
/* El nombre le deja su sitio a la camiseta. Es reserva de ESPACIO, no un
   margen estético: la clase solo está cuando de verdad hay chapa, así que una
   ficha sin equipación configurada sigue usando el ancho completo. */
.f24-jugador--chapa .f24-jugador-nombre { padding-right: 28%; }

.f24-jugador-nombre {
  position: relative;
  font-family: var(--f24-display);
  font-size: .9375rem; font-weight: 900;
  line-height: 1; letter-spacing: -.01em; text-transform: uppercase;
}
/* El dorsal se pinta como decoración, así que el nombre lo dice para
   quien usa lector de pantalla. */
.f24-sr-dorsal {
  position: absolute; width: 1px; height: 1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
}

/* ---- Cuerpo técnico ----
   DOS PRESENTACIONES SOBRE EL MISMO MARCADO (19/08/2026):
   · por defecto, las FILAS anchas navy de siempre — es lo que se ve si el
     club no ha subido la equipación del cuerpo técnico;
   · con `.f24-staff--camisetas`, REJILLA DE TARJETAS igual que la plantilla
     de arriba, porque ahí sí hay una imagen que enseñar.
   🚫 Se probó antes dejar las filas y poner un velo claro detrás de la
   camiseta (el polo navy se camuflaba contra la sección navy). El usuario lo
   rechazó al verlo: «queda fatal». No reintroducir un fondo suelto detrás de
   la imagen: si hace falta contraste, es la tarjeta la que lo da. */
.f24-staff { display: flex; flex-wrap: wrap; gap: 1px; background: var(--f24-line-dark); }
.f24-staff-card {
  flex: 1 1 16rem;
  background: var(--f24-navy);
  padding: 1rem 1.25rem;
}
.f24-staff-nombre {
  display: block;
  font-family: var(--f24-display);
  font-size: 1.125rem; font-weight: 900;
  text-transform: uppercase; letter-spacing: -.02em;
}
.f24-staff-rol {
  display: block; margin-top: .25rem;
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--f24-yellow);
}

/* -- Modo con equipación: siguen siendo FILAS, no tarjetas. --

   🔴 SIN FONDO EN EL CONTENEDOR. El truco de «fondo del contenedor + gap de
   1px» que usa la plantilla para dibujar las líneas solo funciona cuando las
   celdas se llenan: con DOS personas —hoy una sola visible— quedaban huecos
   pintados. Aquí las filas traen su propio color, así que el contenedor no
   necesita fondo. */
.f24-staff--camisetas {
  display: flex; flex-wrap: wrap; gap: 1px;
  background: none;
}
.f24-staff-pie { display: block; }
/* ⚠️ LA CAMISETA VA EN EL FLUJO, NO ABSOLUTA como en la ficha del jugador.
   Allí se coloca con `inset: 0 0 Xrem 0`, que obliga a adivinar cuánto sitio
   ocupa el texto; en una fila es un elemento más y basta con dejarla fluir.
   Sin esto se posicionaría respecto a la fila entera y taparía el nombre. */
.f24-staff--camisetas .f24-camiseta {
  position: static; inset: auto;
}

/* ============================================================
   LA FICHA CON CAMISETA — tratamiento compartido (19/08/2026)
   ------------------------------------------------------------
   Sale de una queja del usuario, y era justa: «es un cuadrado blanco a pelo
   sin nada. Que en realidad con los jugadores pasa igual». Tenía razón — la
   camiseta se pintaba sobre `background: var(--f24-white)` y el nombre iba
   suelto debajo. Se veía como un marcador de posición, no como una ficha.

   Se le da el mismo lenguaje que el resto del sitio, sin inventar estética:
   1) HALO del azul del club detrás de la prenda, para que despegue del fondo;
   2) DEGRADADO claro → tinte azul, que da profundidad y peso visual abajo;
   3) BANDA NAVY a sangre en el pie, con FILETE AMARILLO encima. El filete es
      el acento del club y aquí es uso legal del amarillo: filete, no texto.
      Además resuelve el contraste — sobre navy el nombre va en blanco y el
      rol en amarillo (10,2:1), en vez de pelearse con un fondo claro.

   🔒 Se aplica SOLO a las fichas con camiseta. Las que llevan FOTO ya tienen
   su propio tratamiento (`--foto`, degradado navy sobre la imagen) y las que
   no tienen ni foto ni camiseta viven del dorsal gigante translúcido: las dos
   estaban bien y no se tocan.
   ============================================================ */
/* 🚫 NADA DE TARJETA. Es el tercer intento y la corrección del usuario fue
   clara: «se sigue viendo como tal que cada una es una tarjetilla; eso sería
   guay si no, rollo foto o equipación y nombre debajo y listo».
   Lo que hacía «tarjeta» no era el borde: era que la ficha tuviera un fondo
   PROPIO (`--f24-white`) distinto del claro de la sección (`--f24-paper`), más
   el filete amarillo cerrándola por arriba. Quitados los dos, la equipación
   queda sobre la superficie de la sección, sin caja.
   ✅ Lo único que se conserva del intento anterior es el HALO detrás de la
   prenda, que es lo que el usuario aprobó por su nombre («lo de detrás de la
   camiseta guay») — y es un círculo difuso, no un recuadro. */
.f24-jugador--camiseta {
  /* 🔑 `closest-side`, NO el `farthest-corner` que asume `radial-gradient` por
     defecto. Con el valor por defecto el 100% del gradiente es la distancia a
     la ESQUINA (≈142 px en una ficha de 156×199), así que un `transparent 68%`
     caía a ≈97 px — más que los 78 px que hay hasta el lateral. El degradado
     seguía teniendo color al llegar al borde y **se cortaba en seco**: eso era
     el «rectángulo invisible» que se seguía notando.
     Con `closest-side` el 100% es el lado más cercano (78 px), así que el halo
     puede llegar hasta el 88% —69 px— y aún le sobran 9 px hasta el canto.
     ⚠️ Al acortarlo la primera vez se pasó de frenada: con 14 % apagándose al
     76 % el halo desapareció («veo que hemos perdido el halo azul, a mí me
     gustaba»). Ahora va más intenso y más largo, con la caída en DOS tramos
     para que los últimos píxeles lleguen ya en nada y no haya nada que cortar.
     Tintes con `color-mix` sobre el token del club — nunca `rgba()` de canales
     fijos: si el club cambia su azul, esto lo sigue. */
  background:
    radial-gradient(circle closest-side at 50% 42%,
      color-mix(in srgb, var(--f24-blue) 26%, transparent) 0 28%,
      color-mix(in srgb, var(--f24-blue) 11%, transparent) 58%,
      transparent 88%);
  background-repeat: no-repeat;
  /* ⚠️ `outline`, no `border` — es lo que trae `.f24-jugador`, y hay que
     apagar eso mismo o el recuadro sigue ahí. */
  outline: 0;
}
/* El nombre, debajo y centrado, con la LÍNEA AMARILLA entre la camiseta y él
   («en las jugadoras me gustaba la línea amarilla entre nombre e imagen»).
   🔑 Corta y centrada, NO a sangre de borde a borde: a lo ancho volvía a
   dibujar el canto de la ficha, que es justo lo que se acaba de quitar. Así es
   un subrayado del bloque, no la tapa de una caja.
   Se pinta con un `::before` y no con `border-top` por lo mismo: el borde
   ocuparía todo el ancho del elemento.
   ✅ Uso legal del amarillo — filete, nunca texto sobre claro (1,5:1). */
.f24-jugador--camiseta .f24-jugador-nombre {
  color: var(--f24-navy);
  text-align: center;
  text-wrap: balance;
  padding-top: .625rem;
}
.f24-jugador--camiseta .f24-jugador-nombre::before {
  content: "";
  display: block;
  width: 2.25rem; height: 3px;
  margin: 0 auto .5rem;
  background: var(--f24-yellow);
}

/* ---- CUERPO TÉCNICO: UNA LÍNEA POR PERSONA ----
   Encargo del usuario (19/08): «cuerpo técnico lo pondría en una única línea
   para no agigantar el scroll». Y con razón: la tarjeta 3/4 medía 203 px de
   alto por persona para enseñar un polo y dos palabras.
   🎨 Y OTRO JUEGO DE COLORES, porque el de la plantilla no le servía aquí
   («del entrenador mal, hay que buscar otro juego de colores»): la fila va en
   AZUL del club con filete amarillo a la izquierda —el mismo recurso que usan
   las filas de partido— en vez de la tarjeta clara. Sobre azul el polo navy
   contrasta sin necesidad de ponerle nada detrás, que es lo que se había
   rechazado antes, y el amarillo del rol sigue siendo texto legal (5,1:1). */
.f24-staff--camisetas .f24-staff-card {
  flex: 1 1 22rem;
  aspect-ratio: auto;
  display: flex; align-items: center; gap: .75rem;
  padding: .5rem .875rem;
  background: var(--f24-blue);
  border-left: 3px solid var(--f24-yellow);
}
.f24-staff--camisetas .f24-camiseta {
  flex: 0 0 auto; width: 2.25rem;
  padding: 0;
}
.f24-staff--camisetas .f24-camiseta-lienzo {
  /* El ancho manda y la altura la pone la proporción real de la imagen. */
  width: 100%; height: auto;
}
/* Nombre y rol en la MISMA línea. `wrap` como red: si el nombre es larguísimo
   el rol baja, en vez de desbordar la fila. */
.f24-staff--camisetas .f24-staff-pie {
  display: flex; align-items: baseline; flex-wrap: wrap;
  gap: .125rem .5rem; min-width: 0;
}
.f24-staff--camisetas .f24-staff-nombre {
  font-size: 1rem; line-height: 1.1; letter-spacing: -.01em;
  color: var(--f24-on-dark);
}
.f24-staff--camisetas .f24-staff-rol {
  margin-top: 0; letter-spacing: .1em;
  color: var(--f24-yellow);
}

/* Movimiento con función: señala que la ficha es una pieza y no un bloque
   muerto. `transform`, nada de `width`/`top`.
   `prefers-reduced-motion` NO se declara aquí a propósito: `tokens.css` tiene
   un reset global con selector `*` que ya neutraliza toda transición del
   proyecto (skill `cbat-ui` § 7 — no duplicar por componente). */
.f24-jugador--camiseta .f24-camiseta-lienzo {
  transition: transform 160ms ease-out;
}
.f24-jugador--camiseta:hover .f24-camiseta-lienzo {
  transform: translateY(-4px) scale(1.03);
}

/* ============================================================
   🔄 TARJETA QUE SE DA LA VUELTA (28/09/2026)
   ------------------------------------------------------------
   Idea del usuario al ver la plantilla de la ACB: «por un lado se vea la
   equipación con el número y al dar la vuelta la foto». Solo en las fichas
   con foto y equipación (equipo.php, `--giro`). Las dos caras son las de
   siempre: la camiseta (`--camiseta`) y la foto (`--foto`); aquí solo se
   montan una detrás de otra y se gira.
   · Nace mostrando la camiseta; el script de equipo.php pone `is-foto` al
     entrar en pantalla y gira a la foto.
   · Con ratón: al pasar por encima vuelve a la camiseta, y la ficha se
     inclina hacia el cursor (--f24-inc-x / --f24-inc-y).
   · «Reducir movimiento»: el reset global de tokens.css quita la transición;
     la cara cambia sin girar.
   ============================================================ */
/* `.f24-jugador.` delante: las reglas generales de `.f24-jugador` (transición y
   :hover) van MÁS ABAJO en este archivo y, con la misma especificidad, ganarían. */
.f24-jugador.f24-jugador--giro {
  padding: 0;
  overflow: visible;
  perspective: 900px;
  /* La perspectiva DENTRO del transform: la propiedad `perspective` solo afecta a
     los hijos, y sin ella la inclinación de la propia ficha no se notaba. */
  transform: perspective(900px) rotateX(var(--f24-inc-x, 0deg)) rotateY(var(--f24-inc-y, 0deg));
  transition: transform 150ms ease-out;
}
.f24-jugador.f24-jugador--giro:hover { transform: perspective(900px) rotateX(var(--f24-inc-x, 0deg)) rotateY(var(--f24-inc-y, 0deg)) translateY(-2px); }
.f24-giro {
  position: absolute; inset: 0;
  transform-style: preserve-3d;
  transition: transform 800ms cubic-bezier(.4, 0, .2, 1);
}
.f24-jugador--giro.is-foto .f24-giro { transform: rotateY(180deg); }
@media (hover: hover) {
  .f24-jugador--giro.is-foto:hover .f24-giro { transform: rotateY(0deg); }
}
.f24-cara {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: .875rem;
  overflow: hidden;
  -webkit-backface-visibility: hidden; backface-visibility: hidden;
}
.f24-cara--foto { transform: rotateY(180deg); }

/* ---- Horarios de entrenamiento ---- */
.f24-horarios { display: flex; flex-wrap: wrap; gap: 1px; background: var(--f24-line-light); }
.f24-horario {
  flex: 1 1 12rem;
  background: var(--f24-editorial);
  padding: 1rem 1.25rem;
}
.f24-horario strong {
  display: block;
  font-family: var(--f24-display);
  font-size: 1.0625rem; font-weight: 900;
  text-transform: uppercase; letter-spacing: -.01em;
}
.f24-horario span {
  display: block; margin-top: .125rem;
  font-family: var(--f24-display);
  font-size: 1.5rem; font-weight: 900; letter-spacing: -.03em;
  color: var(--f24-blue);
}
.f24-horario em {
  display: block; font-style: normal; margin-top: .25rem;
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--f24-ink-soft);
}

/* ============================================================
   CUMPLEAÑOS — venía de la portada vieja
   ------------------------------------------------------------
   🔒 INVARIANTE HEREDADO: nunca la edad ni la fecha de
   nacimiento. Solo nombre, equipo y cuándo. Son menores.
   ============================================================ */

.f24-cumples {
  display: flex; flex-wrap: wrap; gap: 1px;
  background: var(--f24-line-light);
  border-top: 1px solid var(--f24-line-light);
  border-bottom: 1px solid var(--f24-line-light);
}
.f24-cumple {
  flex: 1 1 13rem;
  background: var(--f24-paper);
  padding: 1.125rem 1.25rem;
}
.f24-cumple-cuando {
  display: block;
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .15em; text-transform: uppercase;
  color: var(--f24-blue);
  margin-bottom: .375rem;
}
.f24-cumple.is-hoy { background: var(--f24-yellow); }
.f24-cumple.is-hoy .f24-cumple-cuando { color: var(--f24-navy); }
.f24-cumple strong {
  display: block;
  font-family: var(--f24-display);
  font-size: 1.125rem; font-weight: 900;
  letter-spacing: -.02em; text-transform: uppercase;
  line-height: 1.05;
}
.f24-cumple em {
  display: block; font-style: normal;
  font-size: var(--f24-label); color: var(--f24-ink-soft);
  margin-top: .25rem;
}

/* ============================================================
   ÚNETE AL CLUB — la banda de contacto
   ============================================================ */

.f24-cta {
  display: flex; align-items: center; justify-content: space-between;
  gap: 2rem; flex-wrap: wrap;
}
.f24-cta h2 { font-size: clamp(2rem, 5vw, 4rem); margin: .25rem 0 .75rem; }
.f24-cta .f24-lead { margin: 0; }

/* ============================================================
   CBAT PULSE — los datos, en amarillo, como un marcador
   ============================================================ */

.f24-stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  border-top: 2px solid var(--f24-navy);
  margin-top: 3.125rem;
}
.f24-stat {
  padding: 1.5625rem 1.25rem .625rem 0;
  border-right: 1px solid color-mix(in srgb, var(--f24-navy) 30%, transparent);
}
.f24-stat:last-child { border-right: 0; }
.f24-stat b {
  display: block;
  font-family: var(--f24-display);
  font-size: clamp(3rem, 7vw, 6.25rem);
  font-weight: 900; letter-spacing: -.07em; line-height: .9;
}
.f24-stat span {
  display: block;
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .13em; text-transform: uppercase;
  margin-top: .5rem;
}

/* ============================================================
   FICHA DE CONTENIDO — noticia, evento, página, campus
   ------------------------------------------------------------
   Una sola plantilla, como en el gestor. Cabecera oscura con la
   foto en duotono (misma regla que el hero: nunca a color) y
   cuerpo claro con medida de lectura, que es lo único que hace
   legible un texto largo.
   ============================================================ */

.f24-ficha-head {
  position: relative;
  overflow: hidden;
  padding: clamp(3rem, 9vh, 6rem) var(--f24-gutter) clamp(2rem, 6vh, 4rem);
  background: linear-gradient(135deg, var(--f24-navy) 0%, var(--f24-navy-800) 100%);
}
.f24-ficha-head--foto::before {
  content: "";
  position: absolute; inset: 0;
  background-image: var(--f24-ficha-img);
  background-size: cover; background-position: center;
  filter: grayscale(1);
  opacity: .22;
}
.f24-ficha-head-in { position: relative; z-index: 1; max-width: 56rem; }
.f24-ficha-head h1 {
  font-family: var(--f24-display);
  font-size: clamp(2rem, 5.5vw, 4.5rem);
  font-weight: 900; line-height: .95;
  letter-spacing: var(--f24-track-display);
  text-transform: uppercase;
  margin: .5rem 0 0;
}
.f24-ficha-meta {
  display: flex; flex-wrap: wrap; gap: 1.25rem;
  margin: 1.25rem 0 0;
  font-size: var(--f24-label);
  font-weight: 800; letter-spacing: .12em; text-transform: uppercase;
  color: var(--f24-yellow);
}

.f24-ficha-cuerpo { max-width: 42rem; }
.f24-ficha-entradilla {
  font-size: 1.125rem; line-height: 1.55; font-weight: 700;
  color: var(--f24-ink);
  margin: 0 0 1.75rem;
}

/* Prosa: la única zona de la web con medida de lectura y ritmo
   vertical clásico. El HTML lo escribe el club desde el gestor y
   llega saneado con lista blanca. */
.f24-prosa { color: var(--f24-ink); font-size: 1.0625rem; line-height: 1.65; }
.f24-prosa > :first-child { margin-top: 0; }
.f24-prosa p { margin: 0 0 1.15em; }
.f24-prosa h2, .f24-prosa h3, .f24-prosa h4 {
  font-family: var(--f24-display);
  text-transform: uppercase;
  letter-spacing: var(--f24-track-display);
  line-height: 1;
  margin: 2em 0 .6em;
}
.f24-prosa h2 { font-size: clamp(1.5rem, 3vw, 2.25rem); }
.f24-prosa h3 { font-size: clamp(1.25rem, 2.4vw, 1.6rem); }
.f24-prosa h4 { font-size: 1.125rem; }
.f24-prosa ul, .f24-prosa ol { margin: 0 0 1.15em; padding-left: 1.4em; }
.f24-prosa li { margin-bottom: .35em; }
/* `a[href]` y no `a`: el saneador deja el texto de un enlace peligroso pero
   le quita el `href`. Sin el atributo, eso ya no lleva a ningún sitio y no
   puede seguir pintado como si fuera pulsable. */
.f24-prosa a[href] {
  color: var(--f24-blue);
  box-shadow: inset 0 -.09em 0 color-mix(in srgb, var(--f24-yellow) 70%, transparent);
}
.f24-prosa a[href]:hover { box-shadow: inset 0 -.5em 0 -.05em var(--f24-yellow); }
.f24-prosa blockquote {
  margin: 1.75em 0; padding: .25em 0 .25em 1.25rem;
  border-left: 3px solid var(--f24-yellow);
  font-family: var(--f24-display);
  font-size: clamp(1.25rem, 2.5vw, 1.75rem);
  line-height: 1.15; text-transform: uppercase;
  letter-spacing: var(--f24-track-display);
}
.f24-prosa img { margin: 1.5em 0; width: 100%; height: auto; }
.f24-prosa figcaption {
  font-size: var(--f24-label); font-weight: 800;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--f24-ink-soft);
  margin-top: -1em;
}
.f24-prosa hr { border: 0; border-top: 2px solid var(--f24-line-light); margin: 2.5em 0; }

.f24-ficha-volver { margin: 3rem 0 0; }

/* ------------------------------------------------------------
   LOS CUATRO DISEÑOS DE FICHA (17/08/2026)
   Encargo del usuario: la misma noticia se puede contar de
   cuatro maneras y lo elige quien escribe, desde el gestor.
   Catálogo: `cms_layouts()` en modules/contenido/tipos.php.
   ------------------------------------------------------------ */

/* 1 · EDITORIAL — el de por defecto: cabecera + una columna con
   medida de lectura. Es lo que ya define `.f24-ficha-cuerpo`. */

/* 2 · DOS COLUMNAS — texto a la izquierda, imagen a la derecha
   acompañando mientras se baja. */
.f24-ficha--dos-columnas .f24-ficha-cuerpo {
  max-width: 70rem;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 20rem);
  grid-template-areas:
    "entradilla imagen"
    "prosa      imagen"
    "acciones   imagen"
    "volver     imagen";
  column-gap: 2.5rem;
  align-items: start;
}
.f24-ficha--dos-columnas .f24-ficha-entradilla { grid-area: entradilla; }
.f24-ficha--dos-columnas .f24-prosa { grid-area: prosa; }
.f24-ficha--dos-columnas .f24-acciones { grid-area: acciones; }
.f24-ficha--dos-columnas .f24-ficha-volver { grid-area: volver; }
.f24-ficha-aparte {
  grid-area: imagen;
  position: sticky; top: calc(var(--f24-nav-h) + 1.5rem);
  margin: 0;
}
.f24-ficha-aparte img { width: 100%; height: auto; display: block; }

/* 3 · VÍDEO ARRIBA — 16:9 a sangre, antes del texto. */
.f24-video { background: var(--f24-navy); }
.f24-video iframe {
  display: block;
  width: 100%; aspect-ratio: 16 / 9; border: 0;
  max-height: 80vh; margin: 0 auto;
}

/* 5 · CRÓNICA — el marcador real del partido, arriba.
   Usa el mismo componente `.f24-board` que el Match Center: si el
   resultado se corrige en el Manager, aquí se corrige solo. */
.f24-cronica-marcador { padding-top: clamp(2rem, 5vh, 3.5rem); padding-bottom: clamp(2rem, 5vh, 3.5rem); }
.f24-cronica-marcador .f24-kicker { margin-bottom: 1rem; color: var(--f24-blue); }

/* 6 · GALERÍA — las fotos mandan: mosaico a sangre antes del texto.
   La primera ocupa el doble; el resto rellenan. Sin lightbox ni JS:
   la foto se abre a tamaño completo con un clic del navegador si el
   visitante quiere, y la página no carga nada de más. */
.f24-galeria {
  display: flex; flex-wrap: wrap; gap: 2px;
  background: var(--f24-navy);
}
.f24-gal-foto {
  flex: 1 1 18rem;
  margin: 0; position: relative;
  background: var(--f24-navy-800);
}
.f24-gal-foto--grande { flex: 2 1 32rem; }
.f24-gal-foto img {
  width: 100%; height: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  display: block;
}
.f24-gal-foto figcaption {
  position: absolute; inset: auto 0 0 0;
  padding: 1.75rem .875rem .625rem;
  background: linear-gradient(0deg, var(--f24-navy), transparent);
  color: var(--f24-on-dark);
  font-size: var(--f24-label);
  font-weight: 800; letter-spacing: .06em;
}

/* 4 · REVISTA — tres columnas de periódico. El texto fluye; los
   titulares no se parten entre columnas. */
.f24-ficha--revista .f24-ficha-cuerpo { max-width: 78rem; }
.f24-ficha--revista .f24-ficha-entradilla {
  max-width: 42rem;
  font-size: 1.375rem; line-height: 1.4;
}
.f24-ficha--revista .f24-prosa {
  columns: 3;
  column-gap: 2.5rem;
  column-rule: 1px solid var(--f24-line-light);
}
.f24-ficha--revista .f24-prosa > * { break-inside: avoid-column; }
.f24-ficha--revista .f24-prosa h2,
.f24-ficha--revista .f24-prosa h3 { break-after: avoid-column; }
/* La foto de un reportaje manda: ocupa el ancho de la cabecera. */
.f24-ficha--revista .f24-ficha-head { min-height: 60vh; display: flex; align-items: flex-end; }
.f24-ficha--revista .f24-ficha-head--foto::before { opacity: .38; }

@media (max-width: 900px) {
  /* Dos y tres columnas son de escritorio: en el móvil de una familia
     en la grada, una sola columna. La imagen deja de ser sticky —
     perseguir al lector en una pantalla pequeña es un estorbo. */
  .f24-ficha--dos-columnas .f24-ficha-cuerpo {
    grid-template-columns: 1fr;
    grid-template-areas: "entradilla" "imagen" "prosa" "acciones" "volver";
    row-gap: 1.5rem;
  }
  .f24-ficha-aparte { position: static; }
  .f24-ficha--revista .f24-prosa { columns: 1; column-rule: 0; }
  .f24-ficha--revista .f24-ficha-head { min-height: auto; }
}

/* ============================================================
   PIE — 00.0, final de la posesión
   ============================================================ */

/* 🔴 SIN ESTIRAR (24/09/2026). Aquí había `min-height: 70vh` + `space-between`,
   y tenía sentido cuando el pie era tres cosas cortas: la altura convertía
   «Somos CBAT.» en una declaración y empujaba la firma al fondo.
   Desde que el pie se monta por franjas eso sobra: con cinco franjas el
   contenido mide 444 px y el 70vh pedía 598, así que quedaban **153 px medidos
   de banda navy vacía** en medio. Lo vio el usuario: «mucho aire entre filas».
   Ahora el pie es tan alto como lo que lleva dentro; el respiro lo dan el
   padding de sección y el `gap` entre el cuerpo y la firma, que son medidas que
   no dependen del tamaño de la pantalla. */
.f24-foot {
  padding: var(--f24-section) var(--f24-gutter);
  display: flex; flex-direction: column; gap: 2.5rem;
  background: var(--f24-navy);
}
/* Pie del CHASIS MÍNIMO (MANT.2, 26/08/2026): con la web cerrada y una sección
   abierta, el pie se queda en el copyright y nada más.
   🔴 `min-height: 0` es lo que importa: sin quitarlo hereda el `70vh` pensado
   para el pie grande de «Somos CBAT.», y en el móvil eso son **197 px medidos
   de banda navy vacía** debajo de una sola línea de texto. El padding de
   sección (83 px arriba y abajo) sobra por lo mismo. */
.f24-foot--minimo {
  min-height: 0;
  gap: 0;
  padding: 1.75rem var(--f24-gutter);
}
.f24-foot-big {
  font-family: var(--f24-display);
  font-size: var(--f24-d6);
  font-weight: 900; line-height: .75; letter-spacing: -.08em;
  text-transform: uppercase;
  margin: 0;
}
.f24-foot-nav {
  display: flex; flex-wrap: wrap; gap: 1.5rem;
  list-style: none; padding: 0; margin: 0;
}
.f24-foot-nav a {
  display: inline-flex; align-items: center; min-height: var(--f24-tap);
  font-size: var(--f24-label);
  font-weight: 800; letter-spacing: .14em; text-transform: uppercase;
  color: var(--f24-on-dark-soft);
}
.f24-foot-nav a:hover { color: var(--f24-yellow); }
.f24-foot-base {
  font-size: var(--f24-label-sm);
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--f24-blue-pale);
}
/* EL CUERPO DEL PIE (24/09/2026). Desde que el pie se monta por franjas, todas
   van aquí dentro: `.f24-foot` reparte a sus hijos con `space-between` sobre
   70vh, y con una franja = un hijo el pie se estiraba con huecos de dedos de
   alto (visto en un móvil). Aquí las franjas van pegadas entre sí y el pie
   sigue repartiendo solo dos bloques: este y el de los legales. */
.f24-foot-cuerpo {
  display: flex; flex-direction: column; gap: 1rem;
}
/* 🔴 Y LOS MÁRGENES POR DEFECTO A CERO. El `gap` no era el único aire: cada
   franja lleva un `<p>` o un `<ul>`, y el margen de fábrica del navegador es
   1em arriba y otro abajo — entre dos franjas se sumaban ~32 px de margen a los
   del `gap`, así que el espacio real era el doble del que decía el CSS. Se vio
   en el móvil del usuario antes que en el mío: «mucho aire entre filas, ¿no?».
   El espacio entre franjas lo pone el `gap` y nadie más. */
.f24-foot-cuerpo > * > p,
.f24-foot-cuerpo > * > ul,
.f24-foot-cuerpo > p { margin-top: 0; margin-bottom: 0; }

/* REDES SOCIALES (24/09/2026): comparten la disposición de los enlaces del pie
   pero NO su peso. Iban sin regla propia —la clase estaba puesta y no existía—
   y «Instagram» salía del mismo tamaño que «Partidos», compitiendo con el menú
   por la mirada. Son un enlace de cortesía, no una sección del sitio. */
.f24-foot-redes { gap: 1.1rem; }
.f24-foot-redes a {
  min-height: 0;
  font-size: var(--f24-label-sm);
  font-weight: 700;
  color: var(--f24-on-dark-soft);
}

/* Aviso legal y privacidad (24/09/2026): van en el pie pero en SEGUNDO PLANO.
   Reutilizan `.f24-foot-nav` para la disposición y esto los baja de peso: más
   pequeños, menos separados y del gris del copyright, no del blanco de los
   enlaces de navegar. Son obligatorios, no son un destino: quien los busca los
   encuentra, y a quien viene a ver los partidos no le compiten con el menú. */
.f24-foot-legal { gap: 1rem; margin-top: .9rem; }
.f24-foot-legal a {
  min-height: 0;
  font-size: var(--f24-label-sm);
  font-weight: 600;
  letter-spacing: .1em;
  color: var(--f24-blue-pale);
}
.f24-foot-legal a:hover { color: var(--f24-yellow); }

/* ============================================================
   CAMPAÑA — takeover, no modal educado.
   <dialog> nativo: foco atrapado y Esc gratis.
   ============================================================ */

.f24-campaign {
  width: min(47.5rem, 94vw);
  max-height: 90vh;
  padding: 2.375rem;
  border: 0;
  background: var(--f24-yellow);
  color: var(--f24-navy);
}
.f24-campaign::backdrop {
  background: color-mix(in srgb, var(--f24-navy) 78%, transparent);
  backdrop-filter: blur(8px);
}
.f24-campaign h2 { font-size: clamp(2.5rem, 8vw, 5.625rem); margin: 1.5rem 0 1.25rem; }
.f24-campaign p { max-width: 31.25rem; margin: 0 0 1.5rem; }
.f24-campaign-close {
  position: absolute; right: 1rem; top: .75rem;
  width: var(--f24-tap); height: var(--f24-tap);
  border: 0; background: none; cursor: pointer;
  color: var(--f24-navy);
  font-size: 1.5rem; line-height: 1;
}

/* ============================================================
   RESPONSIVE — escala canónica del proyecto (1180/900/760/520)
   Verificado a 390px: el corte real de este front es 760.
   ============================================================ */

@media (max-width: 1180px) {
  .f24-article--principal { min-height: 30rem; }
  .f24-event { min-height: 30rem; }
}

@media (max-width: 900px) {
  .f24-events,
  .f24-news { grid-template-columns: 1fr; }
  .f24-fixture { grid-template-columns: 2.5rem 1fr auto; }
  .f24-fixture-cat { grid-column: 1 / -1; }
  .f24-stats { grid-template-columns: 1fr 1fr; }
  .f24-stat:nth-child(2) { border-right: 0; }
}

@media (max-width: 760px) {
  .f24-menu { display: none; }
  .f24-burger { display: inline-flex; }
  /* Sin reordenar: la marca manda a la izquierda y el reloj queda
     junto al botón de menú, a la derecha. */
  .f24-clock { margin-left: .625rem; }

  /* 🔴 EL MENÚ MÓVIL NO SE VEÍA, Y LA CULPA ERA DEL DESENFOQUE (19/08/2026).
     Lo cazó el usuario: «el menú en móvil no funciona».

     `.f24-nav` lleva `backdrop-filter: blur(14px)`, y un ancestro con
     `backdrop-filter` (igual que con `filter`, `transform` o `contain`) se
     convierte en el BLOQUE CONTENEDOR de sus descendientes `position: fixed`.
     O sea: el menú de aquí abajo no se anclaba al viewport sino a la BARRA,
     de 72px de alto. Con `top: var(--f24-nav-h)` dentro de una caja de esa
     misma altura, el desplegable quedaba de **altura cero**: se abría y no
     se veía nada.

     Medido en el navegador, no deducido: un `fixed; inset:0` insertado dentro
     de `.f24-nav` devuelve 72px de alto en vez de los 1048 del viewport.

     El arreglo es quitar el desenfoque MIENTRAS el menú está abierto. No se
     pierde nada: el desplegable tapa la pantalla entera, así que no hay nada
     detrás que desenfocar.

     ⚠️ Cualquier `position: fixed` que se cuelgue de la barra en el futuro
     tropezará con lo mismo. */
  .f24-nav[data-open="true"] { backdrop-filter: none; }

  /* Menú desplegado: ocupa la pantalla, tap targets grandes. */
  .f24-nav[data-open="true"] .f24-menu {
    display: flex;
    position: fixed;
    inset: var(--f24-nav-h) 0 0;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding: 1.5rem var(--f24-gutter);
    background: var(--f24-navy);
    border-top: 1px solid var(--f24-line-dark);
    overflow-y: auto;
  }
  .f24-nav[data-open="true"] .f24-menu a {
    min-height: 3.5rem;
    font-size: 1rem;
    border-bottom: 1px solid var(--f24-line-dark);
  }

  .f24-hero { min-height: auto; padding-top: 2.5rem; }
  .f24-hero-foot { gap: 1.25rem; }

  /* La marca sube a la esquina superior y se aparta del texto: en el
     móvil, centrada, caía justo detrás del párrafo y lo ensuciaba
     (visto en un teléfono real, 17/08). Arriba solo compite con el
     titular, que es display y aguanta. */
  .f24-marca {
    top: 0; right: -14vw;
    transform: none;
    width: 52vw;
    opacity: .09;
  }
  .f24-hero-foot .f24-lead { max-width: none; }

  /* El marcador se apila: nombre / hora / nombre sigue leyéndose
     como marcador, pero deja de comprimir los nombres largos. */
  /* El muro de patrocinadores pasa a una sola columna y el logo se queda
     algo más bajo: a pantalla completa de móvil, 7,5rem de alto ocupaban
     media pantalla por patrocinador. */
  .f24-partner { min-height: 10.5rem; }
  .f24-partner img { height: 7rem; }
  .f24-partner--principal { min-height: 13rem; }
  .f24-partner--principal img { height: 8rem; }
  .f24-board { grid-template-columns: 1fr; text-align: center; gap: .5rem; padding: 1.75rem 0; }
  .f24-board-team--away { text-align: center; }
  /* Apilado, los nombres se centran — y el escudo tiene que centrarse con
     ellos. Con el `margin-left:auto` de escritorio se quedaba pegado al
     borde derecho, separado de su propio nombre. Visto en el movil el
     13/09/2026, que es donde se mira esta portada. */
  .f24-board-escudo { margin-left: auto; margin-right: auto; }
  .f24-board-meta { justify-content: center; text-align: center; }

  .f24-event { min-height: 24rem; padding: 1.25rem; }
  .f24-event-num { font-size: 10rem; top: -1.2rem; }
  .f24-article,
  .f24-article--principal { min-height: 20rem; }
  .f24-foot { min-height: auto; }
}

@media (max-width: 520px) {
  .f24-stats { grid-template-columns: 1fr; }
  .f24-stat { border-right: 0; border-bottom: 1px solid color-mix(in srgb, var(--f24-navy) 30%, transparent); }
  .f24-fixture { grid-template-columns: 2.5rem 1fr; }
  /* En el móvil pequeño la fila se apila: el marcador pasa a la segunda
     columna, debajo del nombre, y el escudo se queda a su izquierda. */
  .f24-fixture-score, .f24-fixture-when { grid-column: 2; }
  .f24-fixture-when { white-space: normal; }
  .f24-campaign { padding: 1.5rem; }
}

/* Bloque de título de la galería cuando NO es la plantilla de galería:
   va pegado al mosaico, sin el aire habitual de sección, para que se lea
   como una sola pieza (título + fotos) y no como dos bloques sueltos. */
.f24-galeria-bloque { padding-bottom: 1.5rem; }

/* ------------------------------------------------------------
   LA JORNADA — la semana entera, marcador a marcador
   ------------------------------------------------------------
   Cada partido usa el MISMO marcador que el Match Center y la
   crónica del entrenador va justo debajo, con filete: es su voz,
   no la del redactor.
   ------------------------------------------------------------ */
/* Página `/jornada`: navegación entre semanas y la voz de comunicación
   cuando la hay. La página existe siempre; esto es lo que se le añade. */
.f24-jornada-nav {
  display: flex; align-items: center; justify-content: space-between;
  gap: .75rem; flex-wrap: wrap; margin-bottom: 2rem;
}
.f24-jornada-actual {
  font-family: var(--f24-display);
  font-size: clamp(1rem, 2vw, 1.4rem);
  font-weight: 900; text-transform: uppercase;
  letter-spacing: var(--f24-track-display);
  text-align: center; flex: 1;
}
.f24-jornada-voz {
  margin-bottom: 2.5rem; padding-left: 1rem;
  border-left: 3px solid var(--f24-yellow);
}
.f24-jornada-voz h2 {
  font-family: var(--f24-display);
  font-size: clamp(1.5rem, 4vw, 2.75rem);
  font-weight: 900; line-height: 1.05; margin: 0 0 .5rem;
}
@media (max-width: 520px) {
  /* En móvil los dos botones de semana caben mal en una línea con el
     rótulo en medio: el rótulo pasa arriba y los botones debajo. */
  .f24-jornada-actual { flex-basis: 100%; order: -1; text-align: left; }
  .f24-jornada-nav .f24-btn { flex: 1; text-align: center; }
}

.f24-jornada-partido { padding-bottom: 1.5rem; }
.f24-jornada-partido + .f24-jornada-partido { padding-top: .5rem; }
.f24-jornada-cronica {
  max-width: 46rem;
  margin: 1rem 0 0;
  padding-left: 1rem;
  border-left: 3px solid var(--f24-yellow);
  color: var(--f24-ink);
  font-size: 1.0625rem; line-height: 1.55;
}

/* ============================================================
   LA VOZ DE LA SEMANA — dentro del Match Center (13/09/2026)
   ------------------------------------------------------------
   Lo que escribe comunicación cuando le pone titular a una
   jornada. Llegó aquí al fusionar `/jornada` dentro de
   `/partidos`, y necesita pesar MÁS que los contadores que
   tiene debajo: es lo único de esta página que ha escrito una
   persona. De ahí el fondo propio y el titular a tamaño de
   sección, en vez de un párrafo más.
   ============================================================ */
.f24-voz {
  margin-top: 3rem;
  padding: 2rem;
  background: var(--f24-editorial);
  border-left: 4px solid var(--f24-yellow);
}
.f24-voz-kicker {
  margin: 0;
  font-size: var(--f24-label-sm);
  font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
  color: var(--f24-blue);
}
.f24-voz-titulo {
  margin: .5rem 0 0;
  font-size: var(--f24-d4);
  line-height: 1;
  letter-spacing: -.03em;
  color: var(--f24-ink);
}
.f24-voz-texto {
  max-width: 46rem;
  margin: 1rem 0 0;
  font-size: 1.0625rem; line-height: 1.55;
  color: var(--f24-ink);
}
.f24-voz .f24-acciones { margin-top: 1.5rem; }

@media (max-width: 760px) {
  .f24-voz { padding: 1.5rem 1.25rem; }
}

/* ════════════════════════════════════════════════════════════════
   LOS NÚMEROS DE UN EQUIPO (22/09/2026)
   Ficha al estilo de ligau.com. Del acta oficial, en la web pública.
   Va al final del archivo: es un bloque nuevo y completo, y meterlo
   entre medias de otros es como se llega a los 95 KB de deuda.
   ════════════════════════════════════════════════════════════════ */
.f24-head-nota { margin: 0; font-size: var(--f24-label); text-transform: uppercase;
  letter-spacing: var(--f24-track-label); color: var(--f24-ink-soft); font-weight: 800; }
.f24-head-nota strong { color: var(--f24-ink); }

.f24-cifras { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin: 1.5rem 0 0; }
.f24-cifra { border-top: 2px solid var(--f24-line-light); padding-top: .75rem; }
.f24-cifra--destaca { border-top-color: var(--f24-blue); }
.f24-cifra-n { display: block; font-family: var(--f24-display); font-size: clamp(2rem, 5vw, 3.5rem);
  font-weight: 900; line-height: .9; letter-spacing: var(--f24-track-display); color: var(--f24-ink); }
.f24-cifra-t { display: block; margin-top: .4rem; font-size: var(--f24-label);
  text-transform: uppercase; letter-spacing: var(--f24-track-label); font-weight: 900; color: var(--f24-blue); }
.f24-cifra-d { display: block; margin-top: .2rem; font-size: .75rem; color: var(--f24-ink-soft); line-height: 1.35; }

/* Los cuatro factores. Quién gana cada uno se dice con una BARRA lateral y
   con el texto, nunca solo con color: un daltónico tiene que poder leerlo. */
.f24-factores { list-style: none; margin: 1.75rem 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr); gap: .75rem; }
.f24-factor { border-left: 3px solid var(--f24-line-light); padding: .1rem 0 .1rem .7rem; }
.f24-factor.is-gana { border-left-color: var(--f24-blue); }
.f24-factor.is-pierde { border-left-color: var(--f24-grey-soft); }
.f24-factor-t { display: block; font-size: var(--f24-label); text-transform: uppercase;
  letter-spacing: var(--f24-track-label); font-weight: 800; color: var(--f24-ink-soft); }
.f24-factor-v { display: block; font-size: 1.45rem; font-weight: 900; color: var(--f24-ink); line-height: 1.15; }
.f24-factor-r { display: block; font-size: .72rem; color: var(--f24-ink-soft); }

/* ⚠️ La tabla se desplaza DENTRO de su caja. Una tabla ancha nunca empuja a la
   página: ese fallo ya costó un scroll horizontal en toda la web el 21/09. */
.f24-tabla-wrap { overflow-x: auto; margin: 1.75rem 0 0; -webkit-overflow-scrolling: touch; }
.f24-numeros { width: 100%; border-collapse: collapse; font-size: .85rem; min-width: 34rem; }
.f24-numeros th { text-align: right; font-size: var(--f24-label); text-transform: uppercase;
  letter-spacing: var(--f24-track-label); color: var(--f24-ink-soft); font-weight: 800;
  padding: .5rem .5rem; border-bottom: 2px solid var(--f24-line-light); white-space: nowrap; }
.f24-numeros td { text-align: right; padding: .55rem .5rem; border-bottom: 1px solid var(--f24-line-light);
  white-space: nowrap; font-variant-numeric: tabular-nums; color: var(--f24-ink); }
.f24-numeros th:first-child, .f24-numeros td:first-child { text-align: left; }
.f24-num-nombre { font-weight: 700; }
.f24-num-nombre b { display: inline-block; min-width: 1.6rem; color: var(--f24-ink-soft); font-weight: 900; }
.f24-num-fuerte { font-weight: 900; }
.f24-nota-pie { margin: .8rem 0 0; font-size: .78rem; color: var(--f24-ink-soft); line-height: 1.5; max-width: 46rem; }

/* Las insignias. El rango se ve en el disco, y el AMARILLO nunca hace de
   texto: sobre claro da 1,60:1 y no se lee. Lleva tinta oscura encima. */
.f24-logros { margin: 2rem 0 0; }
.f24-logros-lista { list-style: none; margin: .75rem 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); gap: .6rem; }
.f24-logro { display: flex; align-items: center; gap: .6rem;
  border: 1.5px solid var(--f24-line-light); border-radius: 999px; padding: .3rem .8rem .3rem .3rem; }
.f24-logro b { display: inline-flex; align-items: center; justify-content: center;
  min-width: 2rem; height: 2rem; border-radius: 999px; font-size: .66rem; font-weight: 900;
  background: var(--f24-line-light); color: var(--f24-ink); }
.f24-logro span { display: flex; flex-direction: column; line-height: 1.2; min-width: 0; }
.f24-logro strong { font-size: .82rem; color: var(--f24-ink); }
.f24-logro em { font-style: normal; font-size: .72rem; color: var(--f24-ink-soft); font-weight: 700; }
.f24-logro--leyenda { border-color: var(--f24-blue); }
.f24-logro--leyenda b { background: var(--f24-blue); color: var(--f24-on-dark); }
.f24-logro--oro { border-color: var(--f24-yellow); }
.f24-logro--oro b { background: var(--f24-yellow); color: var(--f24-navy); }
.f24-logro--plata b { background: var(--f24-yellow-pale); color: var(--f24-navy); }

/* La edad en la tarjeta de la plantilla. Va discreta: el dorsal y el nombre
   siguen mandando, la edad acompaña. */
.f24-jugador-edad { display: block; margin-top: .15rem; font-size: var(--f24-label);
  text-transform: uppercase; letter-spacing: var(--f24-track-label);
  color: var(--f24-ink-soft); font-weight: 800; }
.f24-jugador--foto .f24-jugador-edad { color: var(--f24-on-dark-soft); }
/* La camiseta va sobre la sección CLARA (el nombre, en navy): la edad, en gris de
   metadatos. Con el blanco de --foto no se leía (cbat-revisor, 28/09). */
.f24-jugador--camiseta .f24-jugador-edad { color: var(--f24-ink-soft); }

@media (max-width: 900px) {
  .f24-factores { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
  .f24-cifras { grid-template-columns: 1fr; gap: .75rem; }
  .f24-factores { grid-template-columns: 1fr; }
}

/* ── LA TRASTIENDA: mapa de tiro, quintetos y récords (22/09/2026) ──────
   Va sobre NAVY, así que todo el texto usa los tokens de «sobre oscuro».
   ⚠️ El mapa de tiro trae sus propios colores de `pista.css`, que están
   pensados para fondo claro: por eso su tarjeta se queda clara dentro de
   la sección oscura en vez de repintar el SVG. */
.f24-trastienda { display: grid; gap: 2.5rem; margin-top: 1.5rem; }
.f24-tras-bloque h3 { margin: 0 0 .35rem; font-family: var(--f24-display);
  font-size: clamp(1.25rem, 3vw, 2rem); font-weight: 900; letter-spacing: var(--f24-track-display);
  text-transform: uppercase; color: var(--f24-on-dark); }
.f24-tras-nota { margin: 0 0 1rem; font-size: .85rem; color: var(--f24-on-dark-soft);
  line-height: 1.5; max-width: 44rem; }
.f24-tras-nota strong { color: var(--f24-on-dark); }

/* Los quintetos. Los minutos mandan y van en grande; el +/- acompaña y
   NUNCA aparece sin ellos al lado. */
.f24-quintetos { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; }
.f24-quinteto { display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; flex-wrap: wrap; padding: .6rem .8rem;
  border: 1px solid var(--f24-line-dark); border-radius: var(--radius-md); }
.f24-quinteto-cinco { display: flex; flex-wrap: wrap; gap: .3rem; }
.f24-quinteto-cinco span { font-size: .78rem; font-weight: 700; color: var(--f24-on-dark);
  border: 1px solid var(--f24-line-dark); border-radius: 999px; padding: .1rem .5rem; }
.f24-quinteto-datos { display: flex; align-items: baseline; gap: .6rem; white-space: nowrap; }
.f24-quinteto-datos b { font-family: var(--f24-display); font-size: 1.3rem; font-weight: 900;
  color: var(--f24-on-dark); letter-spacing: var(--f24-track-display); }
.f24-quinteto-datos em { font-style: normal; font-size: .8rem; font-weight: 800;
  color: var(--f24-on-dark-soft); }

/* Los récords. El número manda: es lo que se recuerda. */
.f24-records { list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: 1rem; }
.f24-record { border-top: 2px solid var(--f24-yellow); padding-top: .6rem; }
.f24-record-n { display: block; font-family: var(--f24-display); font-size: clamp(2rem, 4.5vw, 3rem);
  font-weight: 900; line-height: .9; letter-spacing: var(--f24-track-display); color: var(--f24-on-dark); }
.f24-record-t { display: block; margin-top: .3rem; font-size: var(--f24-label-sm);
  text-transform: uppercase; letter-spacing: var(--f24-track-label); font-weight: 900;
  color: var(--f24-on-dark-soft); }
.f24-record-q { display: block; margin-top: .25rem; font-size: .88rem; font-weight: 800;
  color: var(--f24-on-dark); }
.f24-record-d { display: block; font-size: .72rem; color: var(--f24-on-dark-soft); }

@media (max-width: 520px) {
  .f24-quinteto { flex-direction: column; align-items: flex-start; gap: .5rem; }
}

/* ── FICHA PÚBLICA DE JUGADOR (22/09/2026) ──────────────────────────────
   La casa de los logros. Encargo del usuario: «clicando sobre jugador,
   acceder a la típica info de jugador básica, y una pestaña con los
   logros». */

/* El enlace cubre la tarjeta entera. Va en capa propia por encima del
   fondo pero DEBAJO del texto, para que el nombre se pueda seleccionar. */
.f24-jugador { position: relative; }
.f24-jugador-link { position: absolute; inset: 0; z-index: 2; border-radius: inherit; }
.f24-jugador-link:focus-visible { outline: 3px solid var(--f24-yellow); outline-offset: 2px; }
.f24-jugador:hover { transform: translateY(-2px); }
.f24-jugador { transition: transform 140ms ease-out; }
.f24-sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.f24-migas { margin: 0 0 1.25rem; font-size: var(--f24-label); text-transform: uppercase;
  letter-spacing: var(--f24-track-label); font-weight: 800; color: var(--f24-ink-soft); }
.f24-migas a { color: var(--f24-blue); text-decoration: none; }
.f24-migas a:hover { text-decoration: underline; }
.f24-migas span { margin: 0 .4rem; }

.f24-jugcab { display: grid; grid-template-columns: minmax(0, 14rem) minmax(0, 1fr);
  gap: 1.75rem; align-items: start; }
.f24-jugfoto { aspect-ratio: 3 / 4; border-radius: var(--radius-lg);
  background-image: var(--f24-jug-img); background-size: cover; background-position: center top;
  background-color: color-mix(in srgb, var(--f24-blue) 10%, var(--f24-white)); }
.f24-jugfoto { position: relative; overflow: hidden; }
.f24-jugfoto.is-vacia { display: grid; place-items: center; }
.f24-jugfoto.is-vacia span { font-family: var(--f24-display); font-size: clamp(3rem, 8vw, 6rem);
  font-weight: 900; color: color-mix(in srgb, var(--f24-blue) 35%, transparent);
  letter-spacing: var(--f24-track-display); }

.f24-jugnombre { font-family: var(--f24-display); font-size: var(--f24-d3); font-weight: 900;
  letter-spacing: var(--f24-track-display); line-height: .9; text-transform: uppercase;
  margin: .2rem 0 .75rem; color: var(--f24-ink); text-wrap: balance; }
.f24-jugmeta { list-style: none; margin: 0 0 1.25rem; padding: 0;
  display: flex; flex-wrap: wrap; gap: .4rem; }
.f24-jugmeta li { font-size: .8rem; font-weight: 800; color: var(--f24-ink);
  border: 1px solid var(--f24-line-light); border-radius: 999px; padding: .2rem .7rem; }
.f24-jugmeta a { color: var(--f24-blue); text-decoration: none; }
.f24-jugmeta a:hover { text-decoration: underline; }

.f24-jugcifras { list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .75rem; max-width: 30rem; }
.f24-jugcifras li { border-top: 2px solid var(--f24-line-light); padding-top: .5rem; }
.f24-jugcifras b { display: block; font-family: var(--f24-display); font-size: 1.85rem;
  font-weight: 900; line-height: 1; color: var(--f24-ink); letter-spacing: var(--f24-track-display); }
.f24-jugcifras span { display: block; margin-top: .2rem; font-size: var(--f24-label-sm);
  text-transform: uppercase; letter-spacing: var(--f24-track-label); color: var(--f24-ink-soft);
  font-weight: 900; }
.f24-jugcifras-pie { margin: .7rem 0 0; font-size: .75rem; color: var(--f24-ink-soft); }

/* Los logros de la ficha van sobre navy: el texto cambia de par de tokens. */
.f24-logros-lista--ficha .f24-logro { border-color: var(--f24-line-dark); }
.f24-logros-lista--ficha .f24-logro strong { color: var(--f24-on-dark); }
.f24-logros-lista--ficha .f24-logro em { color: var(--f24-on-dark-soft); }
.f24-logros-lista--ficha .f24-logro b { background: var(--f24-line-dark); color: var(--f24-on-dark); }
.f24-logros-lista--ficha .f24-logro--oro b { background: var(--f24-yellow); color: var(--f24-navy); }
.f24-logros-lista--ficha .f24-logro--plata b { background: var(--f24-yellow-pale); color: var(--f24-navy); }
.f24-logros-lista--ficha .f24-logro--leyenda b { background: var(--f24-white); color: var(--f24-navy); }
.f24-jugvacio { color: var(--f24-on-dark-soft); font-size: .95rem; max-width: 40rem; line-height: 1.6; }
.f24-jugvacio--claro { color: var(--f24-ink-soft); }

/* 🎽 LA CAMISETA, FUERA DE LA FOTO. En la plantilla va encima porque cada
   tarjeta es pequeña; aquí la ficha es grande y al lado se lee mejor: la cara
   es la cara y el número es el número, sin taparse. */
.f24-jugvisual { display: grid; gap: .75rem; }

/* 🔴 `.f24-camiseta` ES `position:absolute; inset:0` PORQUE NACIÓ PARA IR
   ENCIMA DE UNA TARJETA. Al sacarla fuera de la foto se escapaba al primer
   antepasado posicionado y cubría la cabecera entera, tapando el nombre —el
   usuario lo vio en el móvil antes que yo. Aquí NO va encima de nada, así que
   se le devuelve el flujo normal y se le da un tamaño propio. */
.f24-jugcamiseta { display: flex; justify-content: center; }
.f24-jugcamiseta .f24-camiseta {
  position: static; inset: auto; padding: 0;
  width: 100%; max-width: 9rem;
}
/* Sin foto, la camiseta ES la imagen: ahí sí llena su hueco, y como
   `.f24-jugfoto` es `position:relative` el absoluto queda contenido. */
.f24-jugfoto--camiseta { background-color: transparent; }
.f24-jugfoto--camiseta .f24-camiseta { inset: 0; padding: .5rem; }

/* ── LAS PESTAÑAS, SIN JAVASCRIPT ───────────────────────────────────────
   Radios ocultos + etiquetas. El navegador ya hace de grupo: las flechas
   cambian de pestaña y el foco se ve. Nada que cargar, nada que parpadee al
   abrir la página, y si el JS falla esto sigue funcionando. */
.f24-tab-radio { position: absolute; opacity: 0; pointer-events: none; }
.f24-tab-barra { display: flex; flex-wrap: wrap; gap: .5rem;
  border-bottom: 2px solid var(--f24-line-light); margin-bottom: 1.5rem; }
.f24-tab-lbl { cursor: pointer; padding: .55rem .95rem; margin-bottom: -2px;
  border-bottom: 2px solid transparent; font-size: var(--f24-label);
  text-transform: uppercase; letter-spacing: var(--f24-track-label); font-weight: 900;
  color: var(--f24-ink-soft); transition: color 140ms ease-out, border-color 140ms ease-out; }
.f24-tab-lbl:hover { color: var(--f24-ink); }
.f24-tab-panel { display: none; }

/* Cada radio enciende SU etiqueta y SU panel. Va enumerado porque son dos como
   mucho; con más, esto pediría otra solución y no merece la pena todavía. */
#tab-stats:checked  ~ .f24-tab-barra label[for="tab-stats"],
#tab-logros:checked ~ .f24-tab-barra label[for="tab-logros"] {
  color: var(--f24-blue); border-bottom-color: var(--f24-blue);
}
#tab-stats:checked  ~ #panel-stats,
#tab-logros:checked ~ #panel-logros { display: block; }
/* El foco del teclado se ve en la ETIQUETA, porque el radio está oculto. */
#tab-stats:focus-visible  ~ .f24-tab-barra label[for="tab-stats"],
#tab-logros:focus-visible ~ .f24-tab-barra label[for="tab-logros"] {
  outline: 2px solid var(--f24-yellow); outline-offset: 2px;
}
.f24-jugtabs .f24-jugcifras { max-width: 34rem; }

/* 🔧 EL HUECO. La cabecera y las pestañas son dos secciones seguidas, y cada
   una trae su respiro vertical entero: juntas dejaban un vacío enorme entre
   el nombre y las pestañas. Se recorta el de abajo de una y el de arriba de
   la otra, que es lo mismo que hace cualquier maquetador con dos bloques que
   en realidad son uno. */
.f24-jugficha--pegada { padding-bottom: 1.25rem; }
.f24-jugtabs--pegada { padding-top: 0; }

.f24-jugsub { font-family: var(--f24-display); font-size: 1.15rem; font-weight: 900;
  letter-spacing: var(--f24-track-display); text-transform: uppercase;
  margin: 2rem 0 .5rem; color: var(--f24-ink); }

.f24-jugtabla { width: 100%; border-collapse: collapse; font-size: .85rem; min-width: 30rem; }
.f24-jugtabla th { text-align: right; font-size: var(--f24-label); text-transform: uppercase;
  letter-spacing: var(--f24-track-label); color: var(--f24-ink-soft); font-weight: 800;
  padding: .5rem .5rem; border-bottom: 2px solid var(--f24-line-light); white-space: nowrap; }
.f24-jugtabla td { text-align: right; padding: .55rem .5rem; white-space: nowrap;
  border-bottom: 1px solid var(--f24-line-light); font-variant-numeric: tabular-nums;
  color: var(--f24-ink); }
.f24-jugtabla th:nth-child(-n+3), .f24-jugtabla td:nth-child(-n+3) { text-align: left; }
.f24-jugtabla-rival { white-space: normal; min-width: 10rem; font-weight: 700; }
.f24-jugtabla-donde { color: var(--f24-ink-soft); font-size: .72rem;
  text-transform: uppercase; letter-spacing: var(--f24-track-label); font-weight: 800; }
.f24-jugtabla-fuerte { font-weight: 900; }

/* La insignia ahora lleva DOS líneas: qué es y, debajo, el dato. */
.f24-logro-que { font-style: normal; font-size: .74rem; color: var(--f24-ink-soft);
  line-height: 1.35; font-weight: 600; }
.f24-logro-dato { font-style: normal; font-size: .74rem; font-weight: 900;
  color: var(--f24-blue); }
/* Con dos líneas de texto, la píldora redonda aprieta: se cuadra un poco. */
.f24-logro { align-items: flex-start; border-radius: var(--radius-md); padding: .55rem .8rem .55rem .55rem; }
.f24-logro b { flex: 0 0 auto; }

@media (max-width: 760px) {
  .f24-jugcab { grid-template-columns: 1fr; gap: 1.25rem; }
  .f24-jugfoto { max-width: 11rem; }
  .f24-jugcifras { grid-template-columns: repeat(2, 1fr); }
}

/* ============================================================
   BARRA DE ABAJO — la navegación del móvil (22/09/2026)
   ------------------------------------------------------------
   El menú de hamburguesa sigue montado y manda en escritorio.
   En móvil lo sustituye esta barra: un toque en vez de dos, y
   en la parte de la pantalla donde llega el pulgar.

   Medido a 375 px: la portada son 8.205 px de scroll repartidos
   en ocho secciones. Con una página así, tener los cuatro sitios
   fijos abajo no es un lujo.

   🔑 ES UNA PASTILLA FLOTANTE, no un zócalo pegado al borde, y
   es la misma forma que ya usa el Manager en móvil: el usuario
   pidió «tipo Manager» y esto es lo que quiere decir. Flotando
   se lee como un mando encima de la página y no como el final
   de la página, que es justo lo que es.
   ============================================================ */
.f24-tabbar { display: none; }

@media (max-width: 760px) {
  /* La hamburguesa se va: con la barra abajo serían dos puertas
     a las mismas tres habitaciones. El desplegable se queda en el
     HTML para cuando el menú crezca y haga falta un «Más». */
  .f24-burger { display: none; }

  /* ⚠️ LA BARRA CUELGA DE <body>, NO DE LA CABECERA, y no es casualidad: un
     ancestro con `backdrop-filter` se convierte en el bloque contenedor de sus
     hijos `position: fixed`, así que dentro de `.f24-nav` esto se anclaría a la
     barra de 72 px en vez de a la pantalla. Es exactamente lo que dejó el menú
     móvil con altura cero el 19/08/2026. Comprobado: acaba donde la pantalla. */
  .f24-tabbar {
    position: fixed; z-index: 60;
    left: .625rem; right: .625rem;
    /* En los móviles con barra de gestos el sistema se come la franja de
       abajo: sin el `safe-area` la pastilla queda debajo de ella. */
    bottom: calc(.625rem + env(safe-area-inset-bottom, 0px));
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    gap: .25rem;
    padding: .3rem;
    border: 1px solid var(--f24-line-dark);
    border-radius: 1.35rem;
    background: color-mix(in srgb, var(--f24-navy) 92%, transparent);
    backdrop-filter: blur(14px);
    /* La sombra es lo que la despega de la página: sin ella una caja
       redondeada encima del contenido parece un recorte, no un mando. */
    box-shadow: 0 .75rem 2rem color-mix(in srgb, var(--f24-navy) 45%, transparent);
  }

  .f24-tabbar a {
    display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: .18rem;
    min-height: 52px;
    padding: .4rem .2rem;
    border-radius: 1.05rem;
    color: var(--f24-on-dark-soft);
    font-family: var(--f24-body);
    font-size: .66rem; font-weight: 800;
    letter-spacing: .02em; text-transform: uppercase;
    text-decoration: none;
    transition: background-color 160ms ease-out, color 160ms ease-out;
  }
  .f24-tabbar svg {
    width: 21px; height: 21px;
    fill: none; stroke: currentColor;
    stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
  }

  /* 🔑 EL SITIO DONDE ESTÁS SE PINTA ENTERO DE AMARILLO, con el texto en
     navy. Es la pareja de la casa —la misma del botón del hero y del «24»—
     y sobre amarillo el navy tiene contraste de sobra. Un amarillo de TEXTO
     sobre oscuro se leería peor y encima incumpliría la norma de la casa:
     el dorado no es color de texto. */
  .f24-tabbar a[aria-current="page"] {
    background: var(--f24-yellow);
    color: var(--f24-navy);
  }

  /* Que el dedo note que ha pulsado. Es `transform`, que no repinta, y el
     reset global de `prefers-reduced-motion` ya lo neutraliza para quien
     pide menos movimiento. */
  .f24-tabbar a:active { transform: scale(.94); }

  /* El «24» del Match Center: el mismo círculo del reloj de la cabecera,
     que es la seña de la casa. Cuando está activo se invierte solo, porque
     hereda el color del enlace. */
  .f24-tabbar .f24-tab-24 {
    display: flex; align-items: center; justify-content: center;
    width: 21px; height: 21px;
    border: 2px solid currentColor; border-radius: 50%;
    font-family: var(--f24-display);
    font-size: .6rem; font-weight: 900; letter-spacing: -.04em;
  }

  /* Que la pastilla no tape el final de la página. */
  .f24-foot { padding-bottom: calc(var(--f24-section) + 78px); }
}

/* ── DÍA DE PARTIDO ──────────────────────────────────────────
   Los días que jugamos, el botón del Match Center lo dice: el
   texto pasa a «Hoy» y aparece un punto amarillo que late.

   🔑 El punto es la SEGUNDA señal, no la única: el texto cambia
   también. Un aviso que solo existe como color deja fuera a
   quien no distingue ese color — y a quien mira con prisa.
   ============================================================ */
@media (max-width: 760px) {
  .f24-tabbar .f24-tab-24 { position: relative; }

  .f24-tab-punto {
    position: absolute; top: -3px; right: -4px;
    width: 8px; height: 8px;
    border-radius: 50%;
    background: var(--f24-yellow);
    /* El halo lo despega del círculo del 24, que es del mismo color. */
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--f24-navy) 92%, transparent);
    animation: f24-late 2s ease-in-out infinite;
  }
  /* Cuando el Match está activo, el fondo ya es amarillo: el punto se
     vuelve navy para seguir viéndose. */
  .f24-tabbar a[aria-current="page"] .f24-tab-punto {
    background: var(--f24-navy);
    box-shadow: 0 0 0 2px var(--f24-yellow);
  }

  /* El día de partido, el «24» se enciende aunque no estés en él: es el
     sitio al que hay que ir hoy. */
  .f24-tabbar.es-matchday a:not([aria-current="page"]) .f24-tab-24 {
    color: var(--f24-yellow);
  }
}

/* El latido es de opacidad y escala —no repinta— y el reset global de
   `prefers-reduced-motion` de tokens.css ya lo apaga para quien pide menos
   movimiento. No hace falta repetir la regla aquí. */
@keyframes f24-late {
  0%, 100% { transform: scale(1);   opacity: 1; }
  50%      { transform: scale(.72); opacity: .55; }
}

/* ============================================================
   BARRA DE ABAJO · EFECTO «MENISCO» (27/09/2026)
   ------------------------------------------------------------
   Encargo de Iván, con la referencia «Meniscus» de @_code_and_chill_:
   la pestaña activa es una BOLA DORADA que asoma por encima de la
   barra, y la barra tiene un HUECO curvo debajo de ella. Al tocar
   otra pestaña, bola y hueco se deslizan hasta allí y luego navega.

   🔑 SE AÑADE ENCIMA, NO SUSTITUYE. Solo se activa con la clase
   `f24-menisco`, que pone el JS del pie. Sin JavaScript queda la
   pastilla amarilla de siempre, que ya funciona sola.

   🔑 EL ICONO VIAJA DENTRO DE LA BOLA (.f24-bola, la crea el JS con
   una copia del icono activo). La primera versión subía el icono de
   la propia pestaña con un transform: la bola se deslizaba sola y el
   icono «se quedaba pillado y se movía tarde» (Iván, probándolo). Así
   la bola y su icono son una sola cosa y el centrado es exacto.

   🔑 EL HUECO ES UNA MÁSCARA sobre una capa de fondo (::before), no
   sobre la barra: si la máscara fuera en <nav>, recortaría también
   los enlaces y la sombra. La sombra va con `drop-shadow` en la
   barra, que sí sigue la silueta recortada.
   `--mx` es la posición de la bola (centro de la pestaña activa) y
   va registrada con @property para que se pueda animar.
   ============================================================ */
@property --mx {
  syntax: '<length>';
  inherits: true;
  initial-value: 0px;
}

@media (max-width: 760px) {
  .f24-tabbar.f24-menisco {
    --mb: 46px;                              /* diámetro de la bola  */
    --mh: calc(var(--mb) / 2 + 7px);         /* radio del hueco      */
    background: none;
    border-color: transparent;
    box-shadow: none;
    backdrop-filter: none;
    overflow: visible;
    filter: drop-shadow(0 .75rem 1.25rem color-mix(in srgb, var(--f24-navy) 40%, transparent));
    transition: --mx 420ms cubic-bezier(.2, .9, .25, 1.12);
  }
  /* La barra de verdad: fondo y borde, con el hueco recortado. Sin
     desenfoque: con el `filter` de la barra, el backdrop-filter de aquí no
     ve la página de detrás y no hacía nada salvo gastar GPU (cbat-revisor).
     En la máscara, `black` no es un color que se pinte: es «opaco» (lo que
     se ve) frente a `transparent` (lo que se recorta). */
  .f24-tabbar.f24-menisco::before {
    content: '';
    position: absolute; inset: 0; z-index: 0;
    border: 1px solid var(--f24-line-dark);
    border-radius: 1.35rem;
    background: color-mix(in srgb, var(--f24-navy) 95%, transparent);
    -webkit-mask: radial-gradient(circle var(--mh) at var(--mx) 0, transparent calc(var(--mh) - .5px), black var(--mh));
            mask: radial-gradient(circle var(--mh) at var(--mx) 0, transparent calc(var(--mh) - .5px), black var(--mh));
  }
  /* La bola, con el icono activo dentro. Centrada en el borde de arriba de
     la barra, dentro del hueco; sigue a --mx, que es lo que se anima. */
  .f24-tabbar.f24-menisco .f24-bola {
    position: absolute; z-index: 3;
    top: calc(var(--mb) / -2); left: var(--mx);
    width: var(--mb); height: var(--mb);
    margin-left: calc(var(--mb) / -2);
    display: flex; align-items: center; justify-content: center;
    border-radius: 50%;
    color: var(--f24-navy);
    background: radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--f24-yellow) 70%, var(--f24-white)), var(--f24-yellow) 55%);
    box-shadow: 0 .4rem .9rem color-mix(in srgb, var(--f24-yellow) 35%, transparent),
                inset 0 -3px 6px color-mix(in srgb, var(--f24-navy) 18%, transparent);
    pointer-events: none;
  }
  .f24-tabbar.f24-menisco .f24-bola > * { transform: scale(1.08); }
  /* Al cambiar de icono, un pequeño «pop» para que se note el relevo. */
  .f24-tabbar.f24-menisco .f24-bola.is-cambio > * { animation: f24-bola-pop 260ms ease-out; }
  .f24-tabbar.f24-menisco a {
    position: relative; z-index: 2;
    background: none;
  }
  /* La pestaña activa: sin pastilla. Su icono va en la bola, así que el suyo
     se oculta (sin quitarle el sitio, para que el nombre no se mueva), y el
     nombre se queda abajo en BLANCO: el dorado no es color de texto (norma de
     la casa, 1,6:1 sobre claro). */
  .f24-tabbar.f24-menisco a[aria-current="page"] {
    background: none;
    color: var(--f24-on-dark);
  }
  .f24-tabbar.f24-menisco a[aria-current="page"] > :first-child,
  .f24-tabbar.f24-menisco a[aria-current="page"] .f24-tab-punto { visibility: hidden; }
  .f24-tabbar.f24-menisco a:active { transform: none; }
  /* El punto del día de partido viaja en la bola con el «24» (el JS copia
     todo menos el nombre); aquí se queda en su borde, en navy. */
  .f24-tabbar.f24-menisco .f24-bola .f24-tab-punto {
    top: 2px; right: 2px;
    background: var(--f24-navy);
    box-shadow: 0 0 0 2px var(--f24-yellow);
  }
}
@keyframes f24-bola-pop {
  0%   { transform: scale(.6); opacity: .3; }
  100% { transform: scale(1.08); opacity: 1; }
}
