/* inicio.css */
/* ==========================================================================
   El Camino DT — Portal (pantalla de inicio)
   --------------------------------------------------------------------------
   Sólo composición y componentes propios de esta pantalla. Cero tokens
   nuevos: todo sale de tokens.css. El chrome, el panel, el botón, la
   pastilla, la tabla de datos, las barras de forma y el segmentado vienen
   tal cual de app.css.
   ========================================================================== */

/* La pantalla ocupa el alto de la ventana y NO scrollea: lo que scrollea es
   la bandeja y la clasificación, cada una dentro de su columna. Es la misma
   promesa que la ficha — todo a la vista de una vez. */
body {
  display: flex;
  flex-direction: column;
  /* `min-height` y no `height`: el porqué está en `plantel.css`. Resumen: con
     alto fijo, lo que no entra se sale de la caja y el documento rueda sólo
     hasta el borde del cuerpo, no hasta el final del contenido. */
  min-height: var(--alto-ventana);
  /* `auto` y no `hidden`: el porqué está en `copa.css`, donde se escribió
     entero. Resumen: `hidden` recorta lo que no entra y no hay forma de
     llegar; `auto` se comporta igual mientras entra y deja bajar cuando no. */
  overflow: auto;
}

/* SALVO EN EL VISTAZO GENERAL, QUE SÍ SE BAJA (21/9/2026).
   --------------------------------------------------------------------------
   Esa vista mide más que la ventana a propósito —el porqué está abajo, en la
   regla de la retícula de cuatro zonas— y hasta hoy se bajaba dentro de sí
   misma: `.home` era su propio scroller.

   Eso se rompió cuando las tarjetas pasaron a medir lo que miden: `.home`
   creció con su contenido, no le sobró nada por dentro, y una caja con
   `overflow: auto` que no tiene nada que rodar se come la rueda igual. Se le
   sacó el scroller — y entonces apareció lo que estaba debajo todo el tiempo:
   **este `overflow: hidden`**, que recorta y no deja bajar. Medido a 1890:
   1.727 px de contenido en un cuerpo de 1.278, el resto inalcanzable.

   Alberto lo reportó CUATRO veces. Las tres primeras lo diagnostiqué mal
   —dije que era el puntero sobre la tarjeta de noticias, que también se lo
   comía pero era una de ocho— y sólo lo cerró medir la rueda tamaño por
   tamaño a los dos lados del corte de 1280.

   El que se baja es el DOCUMENTO y no una caja de adentro, que es lo que la
   regla de esta vista decía desde el principio: un solo scroller, y es la
   página. Las otras cuatro vistas del Portal y las veinte pantallas siguen
   sin bajarse. */
body:has(.home[data-vista='general']) {
  height: auto;
  min-height: var(--alto-ventana);
  overflow: visible;
}

/* flex-basis 0, no auto: con basis auto el contenido manda y la columna
   crece hasta donde quiera. Con 0, la retícula ocupa exactamente el hueco
   que sobra y son los scrollers internos los que se hacen cargo.

   La retícula ya no dibuja las tres columnas con hairlines de 1px: ahora el
   fondo de la página se ve ENTRE las tarjetas, que es lo que las hace leer
   como placas sueltas y no como tres franjas de un mismo panel. */
.home {
  flex: 1 1 0;
  min-height: 0;
  display: grid;
  grid-template-columns: minmax(330px, 0.92fr) minmax(440px, 1.3fr) minmax(390px, 1fr);
  gap: var(--sp-5);
  padding: var(--sp-5);
  background: var(--bg-page);
}

/* La columna es sólo el reparto vertical: no tiene superficie ni borde, los
   tiene cada tarjeta que hay dentro. */
.col {
  display: flex;
  flex-direction: column;
  gap: var(--sp-5);
  min-height: 0;
  min-width: 0;
}

.col__tools { display: flex; align-items: center; gap: var(--sp-1); }

.col__more {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-sm);
  color: var(--text-muted);
  transition: color var(--dur-fast) var(--ease);
}
@media (hover: hover) {
  .col__more:hover { color: var(--text-primary); }
}

/* Bloque interior de una columna. Agrupa sin dibujar otra tarjeta: el
   sistema no anida contenedores, separa con aire y una etiqueta. */
/* Lo que era el bloque interior —agrupar sin dibujar otra tarjeta— ya no
   existe: en este mundo cada bloque ES una tarjeta y se llama `.tarjeta`
   (app.css). De aquel componente sobreviven sólo sus dos piezas de texto,
   que siguen siendo texto dentro de una placa. */
.sub__lead { font-size: var(--fs-md); font-weight: 600; color: var(--text-primary); }
.sub__note { font-size: var(--fs-xs); color: var(--text-muted); line-height: var(--lh-body); }

/* El mismo canalón que hay entre columnas y entre tarjetas: dos tarjetas
   pegadas con un aire distinto se leen como si fueran otra cosa. */
.duo { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-5); }

/* --------------------------------------------------------------------------
   BANDEJA
   --------------------------------------------------------------------------
   Lo único que distingue un mensaje leído de uno sin leer es el peso y el
   color del asunto. Nada de un punto de color: el acento ya tiene tres
   trabajos en el sistema y este no es uno.
   -------------------------------------------------------------------------- */

.inbox {
  flex: 1 1 0;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  margin-right: calc(var(--sp-4) * -1);
  padding-right: var(--sp-4);
}

/* La fecha se pega arriba mientras el grupo pasa: en una bandeja larga
   perder el día es perder el contexto entero del mensaje. En FM26 no es una
   línea suelta sino una BARRA de ancho completo con superficie propia, que es
   lo que hace que los grupos se lean como días y no como párrafos. */
.inbox__date {
  position: sticky;
  top: 0;
  z-index: 1;
  margin-bottom: var(--sp-2);
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--r-sm);
  background: var(--bg-row);
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--text-secondary);
}


/* El ritmo de LECTURA, no el de tabla. Una bandeja no se escanea en columna:
   se leen cinco titulares de a uno, y a 22px por fila el asunto y el remitente
   se pisaban. `--row-lectura` es la altura que FM26 le da a esto. */
.msg {
  display: grid;
  /* 40 y no 32: es la medida del avatar en la captura de FM26, y con la fila a
     62 el círculo de 32 quedaba flotando en el medio de un renglón que ya no
     era el suyo. El avatar y la altura de fila son una sola decisión. */
  grid-template-columns: 40px minmax(0, 1fr) auto;
  gap: var(--sp-5);
  align-items: center;
  width: 100%;
  min-height: var(--row-lectura);
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--r-sm);
  text-align: left;
  transition: background var(--dur-fast) var(--ease);
}
@media (hover: hover) {
  .msg:hover { background: var(--bg-hover); }
}

/* El mensaje abierto: lavado del acento Y una barra de 4px a la izquierda. La
   barra es lo que hace que se encuentre sin leer nada, que es el trabajo de
   una bandeja de treinta filas. Va con `box-shadow` en vez de `border-left`
   para no correr el contenido de la fila 4px cuando se selecciona. */
.msg[aria-current='true'] {
  background: var(--bg-selected);
  box-shadow: inset 4px 0 0 var(--accent);
}

/* EL PUNTO DEL NO LEÍDO. Entra el 20 de agosto de 2026, leído a 1:1 del video
   de FM26: la fila sin leer lleva un punto del acento pegado al canto izquierdo,
   además del asunto en blanco.

   Y esto contradice una decisión escrita de esta guía —«ningún punto de color:
   el acento ya tiene sus tres trabajos y este no es uno»—, así que vale decir
   por qué se revierte y no simplemente que la fuente lo hace. El argumento de
   entonces daba por sentado que el peso del asunto alcanzaba. No alcanza cuando
   la bandeja se llena: con veinte mensajes y quince leídos, distinguir «blanco
   600» de «apagado 400» obliga a comparar filas entre sí, y comparar es lo que
   un aviso tiene que ahorrar. El punto se ve sin comparar nada.

   El acento acá SÍ es de los suyos: no dice «esto vale mucho» ni nombra una
   sección — dice «esto te está esperando», que es estado, que es su trabajo.
   Y no compite con la fila abierta, que lleva lavado Y barra de 4px: una es un
   punto de 6px y la otra es la fila entera.

   Va con `::before` sobre el avatar y no como una columna de la retícula: una
   columna más para seis píxeles corre las tres restantes en todas las filas,
   incluidas las catorce que no tienen punto. */
.msg[data-leido='false'] { position: relative; }
.msg[data-leido='false']::before {
  content: '';
  position: absolute;
  left: 2px;
  top: 50%;
  width: 6px; height: 6px;
  margin-top: -3px;
  border-radius: var(--r-pill);
  background: var(--accent);
}
/* La fila abierta ya se anuncia con su lavado y su barra: el punto ahí sería el
   tercer aviso de lo mismo, y encima cae justo encima de la barra. */
.msg[aria-current='true']::before { display: none; }

/* Acá NO va la silueta, y es una desviación consciente de la fuente. FM26
   pone un monigote genérico en cada fila de su bandeja; nosotros dejamos el
   monograma porque estos remitentes tienen nombre —la secretaria técnica, el
   cuerpo médico, el de prensa— y la inicial dice cuál de ellos escribió,
   mientras que cinco siluetas idénticas no dicen nada. El hueco de retrato
   con silueta es de la ficha y del plantel, donde el sujeto es un futbolista
   sin cara, y llega con esas pantallas. */
.msg__avatar {
  display: grid;
  place-items: center;
  width: 40px; height: 40px;
  border-radius: var(--r-pill);
  /* Un escalón MÁS OSCURO que el panel, no más claro. En la fuente el círculo
     del remitente se hunde en la fila y la inicial es lo que sube; con el
     control elevado detrás, cuarenta píxeles de superficie clara por fila
     convertían la columna izquierda de la bandeja en una hilera de botones. */
  background: var(--ink-900);
  border: 1px solid var(--line-hairline);
  color: var(--text-secondary);
  font-size: var(--fs-md);
  font-weight: 700;
}
.msg[data-leido='false'] .msg__avatar { color: var(--text-primary); }

.msg__main { display: grid; gap: 1px; min-width: 0; }

.msg__from {
  font-size: var(--fs-xs);
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.msg__subject {
  font-size: var(--fs-md);
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.msg[data-leido='false'] .msg__subject { color: var(--text-primary); font-weight: 600; }
.msg[data-leido='false'] .msg__from { color: var(--text-secondary); }

.msg__meta { display: flex; align-items: center; gap: var(--sp-3); }
.msg__time { font-size: var(--fs-xs); color: var(--text-muted); }
.msg__tag { color: var(--warn); }

/* LA DOBLE TILDE DEL LEÍDO. Es lo último que faltaba de la bandeja de FM26, que
   pone la hora a la derecha con una doble tilde verde al lado.

   No inventa vocabulario: `i-check-double` YA significa «leído» en este juego
   —es el icono del botón «Marcar todo como leído» de esta misma barra—, así que
   la fila usa el mismo signo que la acción que la produce.

   Y no duplica el punto del no leído, aunque los dos hablen del mismo
   estado: son los dos lados de un par y NUNCA caen en la misma fila. El punto
   vive a la izquierda, en la entrada del renglón, porque contesta «¿qué me
   falta?»; la tilde vive al final, pegada a la hora, porque contesta «¿esto ya
   está?». En una bandeja llena de nuevos habla el punto; en una al día, la
   tilde.

   Verde 500 y no `--good`: cumple de sobra el piso de icono —6,26:1 sobre la
   fila abierta, contra un piso de 3— y pesa menos que el verde de los VALORES,
   que en este sistema dice «esto es bueno». Que un mensaje esté leído no es un
   valor alto, es un trámite hecho. */
.msg__visto { color: var(--verde-500); display: inline-grid; place-items: center; }

.inbox__empty {
  margin: auto 0;
  padding: var(--sp-8) var(--sp-3);
  font-size: var(--fs-md);
  color: var(--text-muted);
  line-height: var(--lh-body);
}

/* --------------------------------------------------------------------------
   NOTICIA DESTACADA
   --------------------------------------------------------------------------
   Tres formatos con una sola retícula: portada de diario, posteo y placa de
   televisión. Los tres cuelgan de `--marca`, el color del medio que firma, que
   `prensa.js` planta en el panel y acá se reparte solo. Una hoja de estilo que
   supiera los nombres de los medios sería una hoja que hay que tocar cada vez
   que se agrega un país.
   -------------------------------------------------------------------------- */

/* Sin borde ni relleno propios: la noticia vive dentro de su tarjeta y el
   corte con lo que sigue lo dibuja el borde de la placa.

   Dos filas nombradas —los titulares y los puntos— porque la de arriba es la
   que cede. Los cinco titulares no miden lo mismo: un recorte de diario son
   150px y un posteo con sus cifras son 267, y como la tarjeta pasa sola cada
   siete segundos, esa diferencia sería la columna entera moviéndose de sitio
   —el calendario de abajo subiendo y bajando— cada vez que cambia el titular.
   Acá el que se hace cargo es un scroller interno: la tarjeta mide lo que la
   columna le deja y el titular largo se termina de leer adentro. */
.news {
  display: grid;
  grid-template-rows: minmax(0, 1fr) auto;
  gap: var(--sp-5);
  min-height: 0;
  /* EL AFICHE PREGUNTA POR ESTA CAJA Y NO POR LA VENTANA: la misma tarjeta
     mide 1.073 px en el vistazo general y mucho menos en una ventana angosta,
     y lo que decide si el escudo de 250 px deja sitio al titular es el ancho
     de acá. Es el mismo patrón que el partido del día y la pirámide de
     Carrera. */
  container-type: inline-size;
  container-name: news;
}

/* `overscroll-behavior: contain` SE FUE DE ACÁ, Y NO ERA UN ADORNO (21/9/2026).
   --------------------------------------------------------------------------
   Esta caja puede rodar por dentro cuando el titular no entra, y `contain`
   estaba para que al llegar al final no arrastrara la página. Suena bien y es
   el defecto: la mayoría de las veces el titular ENTRA JUSTO —medido, 166 px en
   166— y entonces esta caja no tiene nada que rodar, pero sigue siendo un
   contenedor de scroll. Una caja así se come la rueda igual, y con `contain`
   tampoco la deja pasar. El puntero cae ahí al entrar al portal, porque es el
   centro de arriba.

   Sin `contain`, cuando hay algo que rodar rueda, y cuando no, el gesto sigue
   de largo hasta la página. Lo único que se pierde es el freno al llegar al
   final de un titular largo, que es un lujo al lado de una pantalla que no se
   puede bajar. */
.news__panels {
  min-height: 0;
  overflow-y: auto;
}

/* Y para que ceda tiene que poder: un ítem flexible no baja de su contenido
   mientras no se le diga. Es la tarjeta que se achica primero porque es la
   única de la columna con una salida —«Ver todas»— y con la nota entera a un
   clic; el calendario, en cambio, tiene piso (ver LA TIRA DE QUINCE DÍAS).

   Y ES ESA TARJETA, UNA, NO LAS TRES. El comentario de arriba dice «la tarjeta»
   en singular desde el día que se escribió, pero el selector decía
   `[data-panel='general']` y en esa columna hay TRES con ese atributo: los
   titulares, «Próximo rival» y «Partidos de hoy». O sea que el permiso de
   achicarse por debajo del contenido —pensado para la única que tiene un
   scroller adentro— se lo llevaban también las otras dos, que no tienen dónde
   meter lo que sobra: lo recortan y ya.

   No se veía porque «Próximo rival» son tres renglones y nunca sobra nada. Se
   ve el último sábado del año, cuando esa misma tarjeta pasa a mostrar el
   balance —campeón, Apertura, Clausura, descensos, retiros y los juveniles que
   dejan las inferiores, siete renglones— y en una ventana baja el último queda
   partido contra el borde. La noticia más importante de la temporada, cortada
   a la mitad.

   `:has(.news)` y no una clase nueva en el HTML: la tarjeta ya se distingue por
   lo que lleva adentro, que es exactamente el motivo por el que puede ceder. */
.home[data-vista='general'] .col > .tarjeta[data-panel='general']:has(.news) { min-height: 0; }

/* --------------------------------------------------------------------------
   EL TITULAR DE LA VISTA GENERAL ES UN ADELANTO, NO LA NOTA
   --------------------------------------------------------------------------
   La tarjeta tiene 198px en la columna del medio y los cuatro formatos piden
   197, 183, 231 y 292 —medidos a 1512×945, o sea con la ventana grande—: dos de
   los cuatro no entran nunca. El contenedor scrollea, así que no se perdía nada
   técnicamente, pero la tarjeta pasa sola cada siete segundos: lo que hay
   debajo del borde no se alcanza a leer ni queriendo, y lo que se ve es un
   renglón partido por la mitad con la barra del carrusel encima.

   Lo que se va es lo DECORATIVO del posteo —las tres cifras y la barra de me
   gusta— y el cuerpo se corta en tres renglones con puntos suspensivos, que es
   un corte que se lee como corte. Queda el titular, la bajada y el pie con el
   medio y la fecha, que es lo que un adelanto tiene que decir. La nota entera
   sigue a un clic en «Ver todas las noticias», y ahí sí está completa: esto
   vale sólo dentro de la vista general.

   Medido después: los cuatro paneles quedan en 197, 183, 194 y 184 contra los
   198 de la tarjeta. */
/* LA BARRA SE QUEDA, DESDE EL 21/9/2026. Se iba con las cifras —las dos eran
   «lo decorativo del posteo»— y estaba mal catalogada: las tarjetas de datos
   son un agregado, pero el renglón de respuestas, reposteos, me gusta y vistas
   es lo que hace que un posteo se lea como un posteo. Sin él la pieza es un
   párrafo con un avatar al lado. «Que tengan el formato real» —Alberto—.

   Lo que se va es sólo la tarjeta de cifras. */
.home[data-vista='general'] .news .xpost__datos { display: none; }

.home[data-vista='general'] .news .news__body,
.home[data-vista='general'] .news .xpost__texto {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
}

/* Y de la portada de diario se van dos cosas más. La bajada segunda —son dos
   párrafos y el segundo es el contexto, «el primer compromiso es contra
   Independiente», que en un adelanto de tres renglones es lo primero que sobra.

   Y EL DIBUJO GRANDE, que era el que de verdad marcaba el alto: 168px de escudo
   contra 121 de texto, así que el panel medía lo que medía el adorno. Esta hoja
   ya lo baja a 96 cuando la columna se angosta —«el dibujo se lleva el ancho del
   titular»— y el argumento por ALTO es el mismo con otro eje: acá tiene 198px de
   tarjeta. */
.home[data-vista='general'] .news .news__text .news__body ~ .news__body { display: none; }
.home[data-vista='general'] .news .news__mark { width: 96px; height: 96px; margin: 0; }

/* El panel es la retícula; el artículo sólo lo contiene junto a los
   indicadores. Cada indicador controla uno de estos. */
.news__panel {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sp-5) var(--sp-6);
  align-items: start;
}

/* CÓMO LLEGA EL TITULAR SIGUIENTE
   --------------------------------------------------------------------------
   La tarjeta pasa sola cada siete segundos y un corte seco a esa cadencia se
   lee como un parpadeo de la pantalla. Es la misma llegada que ya tiene el
   producto entre pantalla y pantalla (`movimiento.css`) y por eso usa sus
   piezas: DOS animaciones sobre el mismo elemento, porque el fundido y el
   recorrido no quieren la misma curva —con la de llegada, que gasta el 90 %
   del camino en el primer tercio, un fundido se termina antes de que el ojo lo
   registre—. El viaje es de 6px y no de 10: es una tarjeta llegando dentro de
   una columna, no una pantalla entera.

   Y no llega de una pieza: el titular primero, la bajada después y las
   etiquetas al final, con 50ms entre medio. Es lo que hace que se lea como una
   noticia que se está escribiendo y no como un bloque que se desliza. Escalón
   corto a propósito: el titular —lo único que se viene a leer— ya está entero
   a los 240ms, y lo que se demora es lo que se lee después. */
@media (prefers-reduced-motion: no-preference) {
  .news__panel:not([hidden]) {
    animation: mov-entra-funde var(--dur-pantalla) ease-out both,
               news-entra-corre var(--dur-pantalla) var(--ease-entrada) both;
  }
  .news__panel:not([hidden]) > * {
    animation: mov-entra-funde var(--dur-pantalla) ease-out backwards;
  }
  .news__panel:not([hidden]) > :nth-child(2) { animation-delay: 50ms; }
  .news__panel:not([hidden]) > :nth-child(3) { animation-delay: 100ms; }
  .news__panel:not([hidden]) > :nth-child(n + 4) { animation-delay: 150ms; }
}
@keyframes news-entra-corre { from { transform: translateY(6px); } }

/* Sólo la portada tiene dos columnas: el resto ocupa el ancho entero porque un
   posteo con una columna de adorno al lado deja de parecer un posteo. */
.news__panel--diario { grid-template-columns: minmax(0, 1fr) auto; }

/* --------------------------------------------------------------------------
   FORMATO 1 · LA PORTADA
   -------------------------------------------------------------------------- */

/* La marca entra UNA vez y entra en horizontal: la regla de abajo, que es como
   se imprime una cabecera. Esto antes llevaba además un filete vertical de
   color por el borde izquierdo del panel y era una segunda marca diciendo lo
   mismo — con el sello ya en color, la barra lateral no informaba, decoraba.

   LA SECCIÓN VA ARRIBA DEL NOMBRE Y NO AL LADO, que es como se compone una
   volanta de verdad: renglón chico en versalitas arriba, el nombre grande
   debajo, y la regla cerrando. Era una fila de dos piezas con `nowrap` a los
   dos lados, y en un teléfono no entran: como `.news__panel--diario` lleva
   `overflow: hidden`, la sección se iba afuera del panel y quedaba CORTADA sin
   que nada avisara —no se ve que falte texto, que es lo peor que puede hacer
   un recorte—.

   MEDIDO EL 17/9/2026 a 375px con los 57 medios de `scripts/prensa.js`: **8
   empujaban la sección fuera del panel**, el peor 77px. Y ya pasaba con la
   siembra de siempre —`ESPN Argentina · Primera División · Previa` se salía
   11px—, así que no era de los países nuevos: era que nadie había mirado esta
   cabecera en un teléfono.

   ENVUELVE SOLA, y NO va en pila a todo ancho. Esto último se probó y Alberto
   lo rechazó en el acto —«no tiene estilos eso, se ve todo muy cuadrado»— y
   tenía razón: en la portada el panel mide 531px, o sea que apilar dejaba
   trescientos píxeles vacíos a la derecha y convertía una cabecera de diario en
   un bloque alineado a la izquierda. El defecto era del teléfono y la cura se
   había aplicado a todos los anchos.

   CÓMO SE LLEGÓ A ESE ERROR, que es lo que no hay que repetir: la lámina que
   sirvió para elegir —`herramientas/cabecera-angosta.html`— dibuja las ocho
   salidas SÓLO al ancho de un teléfono. O sea que la elección se hizo mirando
   el caso angosto y la implementación la extendió al ancho, que nadie había
   visto. Una lámina que muestra un solo régimen no puede decidir por los dos.

   `flex-wrap: wrap` con la sección en `flex: 0 0 auto` se ajusta sola: donde
   los dos entran, entran en un renglón y la cabecera es la de siempre; donde no
   entran, la sección se va a su propio renglón entera. Sin consulta de medios,
   que es lo que hacía falta: este panel mide una cosa en la portada y otra en
   la vista de Noticias dentro de la misma ventana, así que un corte por ancho
   de VENTANA acertaría en una y erraría en la otra.

   El `0 0 auto` no es decoración: sin él la sección se deja apretar y se queda
   en el renglón partida en tres líneas angostas en vez de bajar entera.

   LAS OCHO SALIDAS ESTÁN DIBUJADAS Y MEDIDAS en `herramientas/cabecera-angosta.html`,
   sobre los pares medio × liga que el juego produce de verdad. Las que no
   entran a los dos anchos de teléfono están ahí con su número, y las dos que
   cortan con «…» también — porque «La Gazzetta dello…» es un medio que no
   existe, y el nombre del medio es justo lo que hay que leer.

   Y SE VA EL `column-reverse`, con su cesión: mientras estuvo en pila, el orden
   del marcado —sello y después sección— quedaba al revés de lo dibujado, así
   que lo leído en voz alta y lo visto no coincidían. Envolviendo no hace falta
   invertir nada: el sello va primero en las dos cosas. */
.cabecera {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-2) var(--sp-5);
  min-width: 0;
  padding-bottom: var(--sp-4);
  border-bottom: 2px solid hsl(var(--marca) / 0.4);
}

/* Que la sección BAJE ENTERA en vez de dejarse apretar, y que una vez abajo
   PUEDA envolver. Son dos cosas y hacen falta las dos:

   · `flex: 0 0 auto` le prohíbe encogerse, que es lo que la manda al renglón
     de abajo entera en vez de dejarla quedarse arriba partida en tres líneas
     angostas al lado del sello.
   · `max-width: 100%` es el tope que la deja envolver cuando YA está sola
     abajo. Sin él, un elemento que no encoge mide `max-content` y el texto no
     envuelve nunca: medido a 375px, «Independiente Rivadavia · Rueda de
     prensa» bajaba bien y se seguía saliendo 58px del panel. El `flex-wrap`
     resolvía el renglón y no el ancho. */
.cabecera__seccion { flex: 0 0 auto; max-width: 100%; margin-left: auto; }

/* El sello es lo único de la portada que va del color del medio, y va en
   grande: en un diario la marca pesa más que la volanta.

   Y VA EN SU COLOR PORQUE EL COLOR LLEGA YA CORREGIDO, que es una decisión de
   Alberto del 17/9/2026 y no un descuido. El mismo día se midió que **23 de
   los 57 medios de `scripts/prensa.js` no llegaban a 4,5:1** acá —The Guardian
   `219 84% 34%` en 1,96, L'Équipe `206 96% 28%` en 2,20— y se probaron los dos
   caminos: sacar el nombre del color, como hizo `.placa__canal`, o corregir el
   TONO antes de inyectarlo. Ganó el segundo: `tonoLegible()` en `mundo.js` le
   mueve la luz al tono hasta que pasa, sin tocar matiz ni saturación, así que
   el azul del Guardian sigue siendo azul y el nombre se lee.

   LO QUE ESO **NO** ARREGLA, Y VIVE DOS BLOQUES MÁS ABAJO: la sigla de
   `.xpost__avatar`, que es el color de la marca sobre un lavado del MISMO
   color. Aclarar el tono mueve la tinta y el fondo juntos, así que la razón
   casi no se mueve: con el tono corregido quedaban 33 de 57 por debajo de 4,5,
   el peor en 3,73. Esa sí sale del color. Si algún día se revisa esta
   cabecera, la diferencia entre los dos casos es esa y no otra: acá la tinta
   se apoya en el panel, allá en sí misma.

   EL PISO ACÁ ES 4,5 Y NO 3, que es fácil de errar: el sello mide 18px con
   peso 800, y «texto grande» de WCAG pide 18,66px en negrita. Por 0,66px no
   entra, y `barrido-contraste.html` ya lo mide así. */
.cabecera__sello {
  font-size: var(--fs-lg);
  font-weight: 800;
  letter-spacing: -0.015em;
  line-height: 1;
  color: hsl(var(--marca));
  white-space: nowrap;
}

/* SIN `nowrap`, Y LA AUSENCIA ES LA REGLA. Lo llevaba de cuando esto era una
   fila y la volanta peleaba el ancho con el sello: ahí `nowrap` la mantenía
   entera de un lado. Desde que la cabecera va en pila la volanta tiene el
   renglón para ella sola, y `nowrap` dejó de proteger nada para pasar a ser lo
   único que puede romperla — dentro de `overflow: hidden`, un texto que no
   envuelve no se acomoda: se CORTA, y sin puntos suspensivos que avisen.

   Hoy no corta ninguna: las 558 volantas que el juego sabe producir —93 ligas
   por los seis sufijos de `prensa.js`, «Previa», «Sorteo», «Los premios», la
   fecha, «En juego» y «Final»— entran en un renglón a 375px, medido el
   17/9/2026. O sea que esto no arregla un defecto: **cierra la puerta por la
   que iba a entrar el próximo**, y ya se sabe cuál: la rueda de prensa firma
   con `«<club> · Rueda de prensa»`, y un club de nombre largo —«Independiente
   Rivadavia»— se salía 60px aun en pila. Con la volanta envolviendo, no hay
   nombre que la rompa.

   El precio es que una volanta larga se lleva dos renglones en un teléfono, y
   es el precio correcto: dos renglones se leen, medio renglón no. */
.cabecera__seccion {
  font-size: var(--fs-2xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--text-muted);
}

.news__text { display: grid; gap: var(--sp-4); min-width: 0; }

/* El recorte de tabla que un diario imprime al costado de la nota. Ancho fijo:
   es una columna de imprenta y no un bloque que se estira con el texto. */
.recorte {
  width: 170px;
  display: grid;
  gap: var(--sp-3);
  padding: var(--sp-5);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  background: var(--bg-row);
}

.recorte__fila {
  display: grid;
  grid-template-columns: 2ch minmax(0, 1fr) auto;
  gap: var(--sp-4);
  align-items: baseline;
  font-size: var(--fs-xs);
  color: var(--text-secondary);
}
.recorte__pos { color: var(--text-muted); font-variant-numeric: tabular-nums; }
.recorte__club { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.recorte__pts { font-weight: 700; color: var(--text-primary); font-variant-numeric: tabular-nums; }

.recorte__fila--mio { color: var(--tuyo); }
.recorte__fila--mio .recorte__club { font-weight: 700; }

/* El salto entre los de arriba y vos. Va punteado a propósito: una línea llena
   diría "acá termina la tabla" y lo que dice es "acá faltan renglones". */
.recorte__fila--corte {
  margin-top: var(--sp-3);
  padding-top: var(--sp-5);
  border-top: 1px dashed var(--line);
}

/* --------------------------------------------------------------------------
   FORMATO 2 · EL POSTEO
   -------------------------------------------------------------------------- */

/* EL POSTEO, VESTIDO DEL CLUB Y CON EL FILETE DEL MEDIO. El porqué está en
   `inicio.js`; acá la forma. El resplandor va a la DERECHA, lejos del texto,
   que es la regla que el afiche pagó con 392 clubes en rojo: el color vive
   donde no hay letra.

   `isolation: isolate` es lo que mantiene el resplandor detrás del contenido
   sin pedirle un `z-index` a cada hijo. */
.xpost {
  position: relative;
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr);
  gap: var(--sp-5);
  padding: var(--sp-5) var(--sp-6);
  /* SIN MARGEN NEGATIVO A LOS COSTADOS. Lo tuvo un momento, para ganar ancho,
     y con él el filete del medio quedaba FUERA de la tarjeta: lo recortaba su
     `overflow`. Un filete que marca de qué medio es el posteo y no se ve es
     tres píxeles de nada. */
  border-radius: var(--r-md);
  border-left: 3px solid hsl(var(--marca) / 0.8);
  overflow: hidden;
  isolation: isolate;
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--club, transparent) 10%, transparent),
    transparent 46%);
}

/* LA CAMISETA DEL FUTBOLISTA DEL QUE HABLA EL POSTEO.
   --------------------------------------------------------------------------
   Reemplaza al escudo desenfocado cuando la nota es sobre alguien: «acá ni se
   ve el escudo, podemos poner algo que haga referencia al jugador que se
   menciona» —Alberto, 21/9/2026—.

   El juego no tiene fotos de futbolistas y no las va a tener: son 1.656 clubes.
   Lo que sí tiene es el DORSAL, que es con lo que se identifica a alguien en
   cualquier cancha del mundo, y los colores del club para vestirlo. Un número
   grande en la espalda es una camiseta sin dibujar una camiseta.

   VA APAGADA Y CONTRA EL BORDE, como el resplandor que reemplaza: es ambiente
   del posteo, no su contenido. Si compitiera con el texto haría lo que hacía
   el escudo al 100 % en la pizarra — robarle la lectura a lo que la pieza vino
   a decir. */
.xpost__camiseta {
  position: absolute;
  z-index: -1;
  top: 50%;
  right: var(--sp-6);
  display: grid;
  justify-items: center;
  gap: 2px;
  transform: translateY(-50%);
  pointer-events: none;
  opacity: 0.6;
}

.xpost__dorsal {
  font-size: 92px;
  font-weight: 800;
  line-height: 0.82;
  letter-spacing: -0.05em;
  font-variant-numeric: tabular-nums;
  color: color-mix(in srgb, var(--club, var(--accent)) 52%, var(--text-primary));
  text-shadow: 0 6px 24px hsl(0 0% 0% / 0.55);
}

.xpost__apellido {
  max-width: 14ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-secondary);
}

/* EL MISMO ESCUDO QUE LA PIZARRA Y QUE EL AFICHE (21/9/2026: «acá hagamos más
   visible el escudo»). Estaba al 22 % de opacidad y desenfocado a 20 px, que
   es el ajuste que tenía el afiche antes de que Alberto pidiera lo mismo allá:
   a esa distancia el escudo deja de ser un escudo y es una mancha con su
   color. Lo que lo hace valer la pena es que SE RECONOZCA, y eso lo da el
   desenfoque corto — cuatro píxeles, los mismos de las otras dos piezas.

   Y SIGUE SIENDO AMBIENTE. Va contra el borde derecho, detrás del texto, y la
   máscara lo apaga antes de llegar a la columna de la letra: el posteo es una
   voz y no una portada, así que el escudo acompaña y no habla. Es la regla que
   el afiche pagó con 392 clubes en rojo — el color vive donde no hay letra. */
.xpost__halo {
  position: absolute;
  z-index: -1;
  top: 50%;
  right: -60px;
  width: 240px;
  height: 240px;
  object-fit: contain;
  opacity: 0.46;
  filter: blur(4px) saturate(1.35);
  transform: translateY(-50%);
  pointer-events: none;
  mask-image: linear-gradient(90deg, transparent 0%, #000 32%);
  mask-size: 100% 200%;
  mask-position: left center;
  mask-repeat: no-repeat;
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 32%);
  -webkit-mask-size: 100% 200%;
  -webkit-mask-position: left center;
  -webkit-mask-repeat: no-repeat;
}

/* La pastilla del medio. Los logotipos reales no se dibujan —los de los clubes
   tampoco— y una pastilla con las iniciales es lo que hace una aplicación
   cuando no tiene la imagen.

   LA SIGLA NO VA EN EL COLOR DEL MEDIO, Y ES EL ÚNICO SITIO DEL PORTAL DONDE
   ESO HIZO FALTA. En los demás —el sello de la cabecera acá arriba, el hero de
   la portada, la tira de secciones— el color llega ya corregido por
   `tonoLegible()` (`mundo.js`) y el nombre se lee en su marca. Acá no alcanza,
   y el motivo es geométrico y no de tono: **la sigla se apoya en un lavado del
   16 % DE SU MISMO COLOR**. Aclarar el tono mueve la tinta y el fondo juntos,
   así que la razón entre los dos casi no se mueve.

   MEDIDO EL 17/9/2026 sobre los 57 medios de `scripts/prensa.js`, contra el
   fondo compuesto:

       con el tono crudo          33 de 57 bajo 4,5 · peor 1,82 (The Guardian)
       con el tono ya corregido   33 de 57 bajo 4,5 · peor 3,73 (Lance!)
       con la sigla en tinta       0 de 57          · peor 10,37 (Canal+ Sport)

   Los 24,5 puntos de luz que `tonoLegible()` le sube al Guardian le compran a
   este avatar 1,95 puntos de contraste y lo dejan igual de flojo. Es el mismo
   párrafo que `.placa__canal` tiene escrito desde antes: un color de marca
   sobre un lavado de ese mismo color tiene poco de dónde agarrarse.

   LA FIRMA SE QUEDA ENTERA EN LA PASTILLA —el borde y el relleno siguen siendo
   el tono del medio—; lo único que se mueve es la tinta, que es lo que hay que
   LEER. Es la misma cesión que hizo la placa.

   NINGUNA VARA LO VE, Y ESO NO LO ARREGLA ESTE COMENTARIO. Dos motivos
   apilados: el `<span>` lleva `aria-hidden="true"` en `inicio.js` —la sigla la
   dice el nombre de al lado, así que es correcto— y `barrido-contraste.html`
   exime lo marcado como presentacional; y encima el panel del posteo está
   `[hidden]` salvo los siete segundos que le toca al carrusel. O sea que estos
   números no salieron del barrido: salieron de medir los 57 tonos a mano.
   Ver [[lo-eximido-se-cuenta]]. */
.xpost__avatar {
  width: 40px; height: 40px;
  display: grid;
  place-items: center;
  border-radius: var(--r-pill);
  border: 1px solid hsl(var(--marca) / 0.45);
  background: hsl(var(--marca) / 0.16);
  color: var(--text-primary);
  font-size: var(--fs-2xs);
  font-weight: 800;
  letter-spacing: 0.02em;
}

.xpost__cuerpo { display: grid; gap: var(--sp-5); min-width: 0; }

.xpost__quien {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-width: 0;
  font-size: var(--fs-sm);
}
.xpost__nombre { font-weight: 700; color: var(--text-primary); white-space: nowrap; }
.xpost__ok { flex: none; color: hsl(var(--marca)); }
.xpost__arroba {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text-muted);
}
.xpost__logo { flex: none; margin-left: auto; color: var(--text-secondary); }

/* El cuerpo del posteo va un punto más grande que la prosa del diario: en la
   red el texto ES la nota, no la bajada de un titular. */
.xpost__texto {
  max-width: 56ch;
  font-size: var(--fs-lg);
  line-height: var(--lh-body);
  color: var(--text-primary);
  text-wrap: pretty;
}
.xpost__texto strong { font-weight: 700; }

.xpost__hilo {
  display: grid;
  gap: var(--sp-4);
  padding-left: var(--sp-6);
  border-left: 2px solid var(--line);
  font-size: var(--fs-md);
  color: var(--text-secondary);
}

/* La tarjeta de cifras que va enganchada al posteo. Tres como mucho: con
   cuatro deja de leerse de un vistazo, que es lo único que hace bien. */
.xpost__datos { display: flex; gap: var(--sp-4); }
.xpost__datos > div {
  flex: 1;
  min-width: 0;
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  background: var(--bg-row);
}
.xpost__datos dt {
  font-size: var(--fs-2xs);
  text-transform: uppercase;
  letter-spacing: 0.07em;
  color: var(--text-muted);
}
.xpost__datos dd {
  font-size: var(--fs-lg);
  font-weight: 700;
  color: var(--text-primary);
  font-variant-numeric: tabular-nums;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.xpost__pie { font-size: var(--fs-sm); color: var(--text-muted); }

/* LA HORA, SOLA Y ARRIBA DE LA BARRA (21/9/2026: «que tengan el formato real»).
   Estaba pegada al arroba —«@ESPNArgentina · 08:12»—, que es el formato del
   TIMELINE; un posteo mostrado suelto, que es lo que es este módulo, lleva la
   hora en su propio renglón entre el texto y las acciones. Es un renglón de
   nada y es lo que más lo hace parecer un posteo de verdad. */
.xpost__cuando {
  font-size: var(--fs-sm);
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}

/* LA BARRA DE ACCIONES, REPARTIDA A LO ANCHO. Apilada a la izquierda con un
   hueco fijo se lee como el pie de una tarjeta; repartida, como la barra de la
   red. Guardar y compartir se van contra el borde derecho, que es donde X los
   pone y donde no compiten con las cifras. */
.xpost__barra {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line);
  font-size: var(--fs-xs);
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.xpost__barra span { display: inline-flex; align-items: center; gap: var(--sp-3); }
.xpost__barra-fin { gap: var(--sp-5); color: var(--text-muted); }

/* Con la caja estrecha las cuatro cifras y los dos iconos no entran repartidos:
   antes de apretujarlos se van los dos de la derecha, que son los únicos que no
   llevan número. Lo que aprieta es la CAJA del módulo y no la ventana. */
@container news (max-width: 540px) {
  .xpost__barra-fin { display: none; }
}

/* --------------------------------------------------------------------------
   FORMATO 3 · LA PLACA
   -------------------------------------------------------------------------- */

/* El color del canal entra por el borde izquierdo y por el lavado de la banda,
   nunca como relleno macizo detrás de texto: de los doce países hay medios de
   marca clara y de marca oscura, y un relleno que funciona con uno deja el
   texto ilegible con el otro. */
/* ==========================================================================
   LA PIZARRA DEL ESTADIO · el resultado, al tamaño que le corresponde
   --------------------------------------------------------------------------
   Reemplaza a la placa. El porqué está en `inicio.js`; acá, la forma.

   CADA CLUB TIÑE SU MITAD y el centro queda neutro. La diagonal entre los dos
   colores no es decoración: es lo que hace que se lea como un enfrentamiento y
   no como dos tarjetas pegadas. El centro sin color es para que las cifras no
   peleen con ninguno de los dos — el marcador no es de nadie hasta que se lee.
   ========================================================================== */
.pizarra {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  min-height: 210px;
  margin: calc(-1 * var(--sp-5)) calc(-1 * var(--sp-6));
  border-radius: calc(var(--r-tarjeta) - 1px);
  overflow: hidden;
  /* EL TINTE BAJA DE 40 A 18 Y EL ESCUDO SUBE. Los dos cambios son el mismo
     arreglo visto de los dos lados.
     ----------------------------------------------------------------------
     Al 40 %, el nombre del club se apoya en el color del club y el barrido de
     los 1.673 daba 188 por debajo de 4,5:1 — los que juegan de amarillo, de
     celeste y de verde lima. Al 24 % quedan 19; al 18 %, cero. Es el mismo
     defecto que el afiche ya había pagado, en la pieza de al lado.

     Y lo que se pierde en tinte se recupera donde no molesta: «acá ni se ven,
     el efecto está bueno igual» —Alberto, sobre los escudos—. Van del 16 % al
     34 % de opacidad, que es donde se reconocen sin disputarle la lectura a
     las cifras. El color del club pasa a estar dicho por su ESCUDO y no por un
     lavado de fondo, que además es lo que lo hace reconocible: un lavado
     celeste puede ser de cualquiera, el escudo de Racing es de Racing. */
  background:
    linear-gradient(100deg,
      color-mix(in srgb, var(--casa, transparent) 18%, var(--ink-950)) 0%,
      var(--ink-950) 38%,
      var(--ink-950) 62%,
      color-mix(in srgb, var(--visita, transparent) 18%, var(--ink-950)) 100%);
}

.pizarra__lado {
  position: relative;
  display: grid;
  align-content: center;
  gap: var(--sp-2);
  min-width: 0;
  padding: var(--sp-6) var(--sp-7);
}

/* EL CONTRASTE LO DA EL TEXTO, NO UNA BANDA ENCIMA DEL ESCUDO.
   --------------------------------------------------------------------------
   Acá hubo una cortina —un degradado oscuro a lo ancho de cada mitad— y duró
   una medición: resolvía el contraste y tapaba justo lo que Alberto había
   pedido ver. «Es una buena idea, pero tapamos los escudos y no me gusta eso».
   Tenía razón: una banda oscura sobre un escudo es peor que un escudo tenue,
   porque además se ve la banda.

   Sobre una imagen, el contraste lo da el TEXTO. Es lo que hace cualquier
   transmisión cuando pone un nombre sobre el campo de juego: una sombra dura y
   cerrada alrededor de la letra, que oscurece sólo los píxeles que tocan el
   glifo y deja el resto de la imagen intacto. El escudo se ve entero.

   SON CUATRO SOMBRAS Y NO UNA. Una sola tiene dirección, y un nombre en
   negrita sobre un escudo claro se apoya en todos los lados: las cuatro
   cerradas —un píxel— más una difusa de seis arman un contorno completo sin
   que se lea como sombra.

   Lo mide `medir-el-nombre-en-la-pizarra.mjs`, que fotografía la franja del
   nombre y busca su peor píxel; con la sombra puesta, ese peor píxel ya no
   está al lado de la letra. */
.pizarra__club,
.pizarra__pie {
  text-shadow:
    0 1px 0 var(--ink-1000),
    0 -1px 0 var(--ink-1000),
    1px 0 0 var(--ink-1000),
    -1px 0 0 var(--ink-1000),
    0 2px 6px hsl(0 0% 0% / 0.9);
}
.pizarra__lado--der { justify-items: end; text-align: right; }

/* APAGADO, A SANGRE Y DESENFOCADO. Al 100 % el escudo compite con las cifras,
   que son lo que la pizarra vino a decir; apagado da la presencia sin disputar
   la lectura.

   Y DESENFOCADO POR LA MISMA RAZÓN QUE EL DEL AFICHE: pedido a 220 px sobre un
   archivo de 256, en Retina se dibuja al doble de lo que hay. Acá el
   desenfoque puede ser MENOR —8 px contra 22— porque al 16 % de opacidad el
   píxel ya casi no se lee; ocho alcanzan para borrar el borde escalonado, que
   es lo único que se notaba. */
.pizarra__escudo {
  position: absolute;
  top: 50%;
  left: -46px;
  width: 220px;
  height: 220px;
  object-fit: contain;
  /* 46 % Y NO 34: Alberto pidió verlos más, dos veces. A 34 se reconocen; a
     46 se ven. El techo lo puso la medición del píxel real debajo del nombre
     del club —ver `medir-el-nombre-en-la-pizarra.mjs`—: por encima de 46 el
     escudo le come contraste al texto que tiene encima, que es lo que esta
     pieza vino a decir. */
  opacity: 0.46;
  /* Y el desenfoque baja de 8 a 4 con la opacidad al alza: a 46 % un borde
     escalonado sí se leería, y cuatro píxeles alcanzan para borrarlo dejando
     más forma reconocible que ocho. */
  filter: blur(4px) saturate(1.35);
  transform: translateY(-50%);
  pointer-events: none;
}
.pizarra__lado--der .pizarra__escudo { left: auto; right: -46px; }

/* Y ARRIBA, EL ESCUDO DE VERDAD (21/9/2026: «acá también el doble escudo»
   —Alberto—, después de pedir lo mismo para el afiche).
   --------------------------------------------------------------------------
   Son las dos capas del afiche y por el mismo motivo: el borrón de atrás da
   TAMAÑO y el de adelante da FILO. Ninguna de las dos sola hace las dos cosas
   —el material tiene 256 px y a 220 ya se lo está estirando—, y el truco es el
   mismo con el que una transmisión pone un escudo gigante de fondo: nunca está
   nítido, está encendido.

   PERO ACÁ NO VA ENCIMA DEL BORRÓN, Y ÉSA ES LA DIFERENCIA CON EL AFICHE. Se
   probó concéntrico, como allá, y no funciona: en el afiche el texto vive a la
   derecha del escudo y hay sitio; en la pizarra el nombre del club está
   ENCIMA, así que un escudo nítido detrás de la palabra «Liverpool» es una
   segunda figura disputándole el renglón a lo que la pieza vino a decir. Y
   volvía a traer el problema que se acababa de arreglar una capa más abajo: su
   presencia dependía del club.

   Va como un renglón más de la columna —escudo, nombre, goleadores— que es
   como se arma una ficha. El borrón sigue detrás de los tres.

   OCHENTA Y CUATRO Y NO MÁS: en Retina son 148 px físicos sobre los 256 del
   archivo —con el `zoom` del sitio adentro de la cuenta— así que se dibuja
   nítido con margen de sobra. Y es lo que deja que la columna entre en los
   210 px de alto de la pizarra con el nombre y los goleadores debajo. */
.pizarra__nitido {
  width: 84px;
  height: 84px;
  object-fit: contain;
  margin-bottom: var(--sp-2);
  /* La sombra no es adorno: sin ella un escudo claro sobre su propio color
     lavado se funde con el fondo —Racing sobre celeste, River sobre blanco— y
     lo que se ve es una mancha. Es la misma del afiche. */
  filter: drop-shadow(0 8px 20px hsl(0 0% 0% / 0.6));
  pointer-events: none;
}

.pizarra__estado,
.pizarra__donde {
  position: relative;
  font-size: var(--fs-2xs);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.pizarra__club {
  position: relative;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--fs-2xl);
  font-weight: 800;
  letter-spacing: -0.015em;
  color: var(--text-primary);
}

/* Los goleadores, y son SÓLO LOS TUYOS: van debajo de tu escudo y no
   centrados, que es lo que lo dice sin gastar una palabra. Del rival el juego
   no sabe quién juega. */
/* LOS GOLEADORES SE LEEN (21/9/2026, pedido de Alberto: «los que hagan goles,
   que se lean mejor»). Estaban en `--fs-xs` y `--text-secondary`, o sea al
   mismo peso que el rótulo «VOS» de arriba — y no es lo mismo: uno es una
   etiqueta y el otro son los nombres de los que ganaron el partido. Suben a
   `--fs-sm` y a la tinta principal, y el ícono de pelota delante los separa
   del nombre del club sin gastar una palabra. */
.pizarra__pie {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: 1em;
  min-width: 0;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
}
.pizarra__lado--der .pizarra__pie { justify-content: flex-end; }
.pizarra__pie .i { flex: none; color: var(--accent-texto); }
.pizarra__quienes { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.pizarra__centro {
  display: grid;
  justify-items: center;
  gap: var(--sp-2);
  padding: 0 var(--sp-6);
}

.pizarra__n {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  font-size: 64px;
  font-weight: 800;
  line-height: 0.92;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--text-primary);
}
.pizarra__n i { font-style: normal; font-size: 26px; color: var(--text-disabled); }

.pizarra__estado { color: var(--danger); }
.pizarra__pen { font-size: var(--fs-xs); color: var(--text-muted); }

/* ==========================================================================
   EL AFICHE · la nota se viste del club del que habla
   --------------------------------------------------------------------------
   El porqué está en `inicio.js`. Acá: el escudo a sangre por la izquierda, el
   color del club lavado sobre el panel, y el titular en 34 px.
   ========================================================================== */
.afiche {
  position: relative;
  display: grid;
  align-content: center;
  min-height: 210px;
  margin: calc(-1 * var(--sp-5)) calc(-1 * var(--sp-6));
  padding: var(--sp-6) var(--sp-7) var(--sp-6) 186px;
  border-radius: calc(var(--r-tarjeta) - 1px);
  overflow: hidden;
  /* EL TEXTO NO SE APOYA EN EL COLOR DEL CLUB, Y ÉSA ES LA REGLA QUE FALTABA.
     ----------------------------------------------------------------------
     «Ojo acá con el contraste» —Alberto, con el afiche del Atlético de
     Madrid—. Tenía razón y el barrido lo puso en número: teñido al 22 %, el
     titular bajaba de 4,5:1 en 392 de los 1.673 clubes. Los que juegan de
     amarillo, de celeste y de verde lima aclaran el fondo hasta que la tinta
     clara deja de leerse.

     BAJAR EL TINTE NO ES LA SALIDA, y se midió antes de descartarla: al 18 %
     quedan 186 clubes en rojo, al 14 % setenta y cinco, y al 10 % —donde el
     color del club ya no se ve, o sea donde el afiche deja de ser un afiche—
     todavía fallan 18. Perseguir el número es perder las dos cosas.

     Lo que se hace es separar los dos trabajos: el color vive a la IZQUIERDA,
     donde está el escudo y no hay texto, y debajo del texto se apoya una cortina
     del fondo del sistema que lo devuelve a un contraste conocido. El degradado
     va de transparente en el escudo a opaco a partir del 34 % del ancho, que
     es donde el texto arranca.

     Con eso el contraste del titular deja de depender del club: es el mismo
     con Boca que con Leeds. Barrido en los 1.673 después del cambio: cero. */
  background:
    /* LA CORTINA SE CIERRA ANTES DE QUE EMPIECE EL TEXTO, y la primera versión
       no lo hacía: llegaba a opaca recién al 40 % del ancho mientras el texto
       arranca a los 186 px de 1.073, o sea al 17 %. Ahí todavía pasaba color
       del club y el titular del Atlético de Madrid se leía rosa sobre rojo
       claro — lo vio Alberto, y mi barrido lo había dado por bueno porque
       midió un porcentaje que YO SUPUSE en vez del que la hoja pinta.

       Ahora se cierra al 16 %, justo antes del texto. El color no se pierde:
       vive en ese 16 % de la izquierda, que es exactamente donde está el
       escudo, y el resplandor sigue detrás de él. */
    linear-gradient(90deg,
      transparent 0%,
      color-mix(in srgb, var(--bg-panel) 55%, transparent) 9%,
      var(--bg-panel) 16%),
    radial-gradient(120% 150% at 6% 50%,
      color-mix(in srgb, var(--club, transparent) 62%, transparent), transparent 58%),
    linear-gradient(100deg,
      color-mix(in srgb, var(--club, transparent) 30%, var(--bg-panel)),
      var(--bg-panel) 52%);
}

/* ══════════════════════════════════════════════════════════════════════════
   EL ESCUDO, EN DOS CAPAS: UNA QUE DA PRESENCIA Y OTRA QUE DA NITIDEZ
   --------------------------------------------------------------------------
   «Que no se pixelen y queden bien a nivel UI» —Alberto, 21/9/2026—. El
   problema es del material y conviene decirlo con el número: los escudos son
   PNG de 256 × 256 —y 144 los más chicos, medido sobre los 1.677—. Pedido a
   250 px CSS en una pantalla Retina se dibuja a 500 físicos, o sea casi el
   DOBLE de lo que hay. Ningún filtro inventa ese detalle: lo único que se
   puede hacer es no pedirle al archivo lo que no tiene.

   Así que el escudo grande deja de ser un escudo y pasa a ser LUZ. Desenfocado
   a 22 px no hay píxel que se vea —el desenfoque borra justamente la escala a
   la que el archivo falla— y lo que queda es un resplandor con la forma y el
   color del club, que es lo que daba la presencia.

   Y ENCIMA VA EL ESCUDO DE VERDAD, A 104 PX. A 104 CSS son 208 físicos en
   Retina: por DEBAJO de los 256 del archivo, así que se dibuja nítido con
   margen. Es el tamaño más grande que el material aguanta sin inventar nada.

   Las dos capas juntas dan lo que ninguna da sola: el tamaño de la primera y
   el filo de la segunda. Es el mismo truco con el que una transmisión pone un
   escudo gigante de fondo — nunca está nítido, está encendido.
   ══════════════════════════════════════════════════════════════════════════ */
.afiche__halo,
.afiche__escudo {
  position: absolute;
  object-fit: contain;
  pointer-events: none;
}

/* LA LUZ. `saturate` le sube el color porque el desenfoque lo lava, y el
   `opacity` la deja por debajo del texto: es fondo, no figura. */
.afiche__halo {
  top: 50%;
  left: -60px;
  width: 260px;
  height: 260px;
  transform: translateY(-50%);

  /* EL MISMO ESCUDO QUE LA PIZARRA, Y POR PEDIDO: «quiero que se vea así mi
     escudo» —Alberto, 21/9/2026, con la placa de resultado al lado—. Era un
     resplandor de 330 px desenfocado a 22: a esa distancia el escudo ya no es
     un escudo, es una mancha con su color. Lo que le gustó de la pizarra es
     que SE RECONOCE — el trébol del Celtic, el águila del AEL— y eso lo da el
     desenfoque corto, no el largo.

     Así que acá van los mismos cuatro píxeles de `blur` y la misma saturación
     que allá, con el escudo más grande que el afiche para que se corte contra
     los bordes en vez de flotar adentro. El nítido va encima. */
  object-fit: contain;
  opacity: 0.46;
  filter: blur(4px) saturate(1.35);

  /* Y SE APAGA ANTES DEL TEXTO.
     ----------------------------------------------------------------------
     «Podemos mejorar un poco más la zona del texto que queda opacada por el
     escudo». La cortina del fondo se cierra a los 186 px y por eso el barrido
     de contraste daba cero, pero la cortina es parte del BACKGROUND del
     afiche y esto es un `<img>` que va ENCIMA: le pasaba por arriba y
     desembocaba en el titular. Medido con el Atlético de Madrid —el club de
     la captura—: la tinta llegaba a los 222 px, o sea 58 adentro del texto,
     con 120 sobre 255 de desviación justo en la columna donde arranca.

     La máscara lo apaga entre el 72 % y el 90 % de su caja, que en pantalla
     es de los 112 a los 153 px. El escudo nítido termina a los 150, así que
     el borrón muere justo detrás de él y once píxeles antes de la primera
     letra.

     `mask-size` va al 200 % de alto a propósito: la máscara recorta lo que no
     cubre, y al 100 % le comía el desenfoque por arriba y por abajo. */
  mask-image: linear-gradient(90deg, #000 0%, #000 72%, transparent 90%);
  mask-size: 100% 200%;
  mask-position: left center;
  mask-repeat: no-repeat;
  -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 72%, transparent 90%);
  -webkit-mask-size: 100% 200%;
  -webkit-mask-position: left center;
  -webkit-mask-repeat: no-repeat;
}

/* EL ESCUDO. Con sombra, y no es adorno: sin ella, uno claro sobre su propio
   color lavado se funde con el fondo —Racing sobre celeste, River sobre
   blanco— y lo que se ve es una mancha. La sombra es lo que lo despega en los
   1.673. */
.afiche__escudo {
  top: 50%;

  /* MÁS GRANDE, HASTA DONDE EL ARCHIVO AGUANTA Y NI UN PÍXEL MÁS (21/9/2026:
     «subamos un poco el escudo nítido también», con la pizarra al lado como
     referencia). El techo no es una preferencia, es una cuenta: el PNG tiene
     256 px, la pantalla Retina dibuja dos físicos por cada CSS y el sitio va
     con `zoom: 0.88`, así que el máximo real es 256 / (2 × 0,88) = 145 px.
     A 140 se dibuja a 246 físicos sobre 256: nítido, con 10 px de margen.

     Y SE CORRE A LA IZQUIERDA para que crecer no lo empuje contra el texto.
     El titular arranca a los 186; a 140 px desde los 46 el escudo terminaba
     justo encima. Desde los 30 termina a los 170 —y en pantalla, a los 150—,
     o sea adentro de la zona que la cortina deja para el club y por delante
     del corte del resplandor, que muere a los 153. */
  left: 30px;
  /* EL ANCHO YA NO DEPENDE DEL NÚMERO DE LA ESCALA (29/9/2026). Es la línea
     que `tokens.css` dejaba propuesta: a 0,88 da 140, igual que antes; desde
     0,914 para arriba baja lo justo para que el PNG de 256 px nunca se estire
     en Retina —a 0,92 da 139 px, que se pintan a 256 físicos—. Sin esto, subir
     la escala del sitio pixelaba el escudo del afiche. */
  width: min(140px, calc(128px / var(--escala-sitio)));
  height: min(140px, calc(128px / var(--escala-sitio)));
  transform: translateY(-50%);
  filter: drop-shadow(0 10px 26px hsl(0 0% 0% / 0.6));
}

.afiche__txt { display: grid; gap: var(--sp-4); min-width: 0; }

.afiche__kicker {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--sp-4);
  margin: 0;
  font-size: var(--fs-2xs);
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
.afiche__medio { font-weight: 800; color: var(--marca, var(--accent-texto)); }
/* LA VOLANTA SUBE UN ESCALÓN, y el barrido dice por qué: con la cortina
   puesta quedaban TRES clubes por debajo de 4,5:1 —Pescara en 4,48, Vegalta y
   Falkenberg en 4,49— y los tres fallaban por esta tinta, no por el titular.
   Tres de 1.673 es poco y aun así se arregla: lo que cuesta es una línea, y lo
   que se evita es un rótulo ilegible con tres clubes de los que el juego tiene
   pantalla. */
.afiche__volanta { color: var(--text-secondary); }

/* 34 PX Y `balance`. El tamaño es la mitad del argumento de esta forma; el
   `text-wrap: balance` es lo que impide que un titular de dos renglones deje
   una palabra sola abajo, que a este cuerpo se nota mucho más que a 18. */
.afiche__titulo {
  margin: 0;
  font-size: 34px;
  font-weight: 800;
  line-height: 1.06;
  letter-spacing: -0.02em;
  color: var(--text-primary);
  text-wrap: balance;
}

.afiche__bajada {
  margin: 0;
  font-size: var(--fs-sm);
  line-height: var(--lh-snug);
  color: var(--text-secondary);
}

/* EN UNA TARJETA ANGOSTA EL ESCUDO SE CORRE Y EL TITULAR BAJA DE CUERPO. Con
   250 px de sangría fija, por debajo de unos 560 de tarjeta al titular le
   quedan sesenta píxeles. Va por consulta de CONTENEDOR y no por ventana, como
   el partido del día: lo que aprieta es la caja. */
@container news (max-width: 560px) {
  .afiche { padding-left: 140px; }
  .afiche__escudo { width: 104px; height: 104px; left: 22px; }
  .afiche__halo { width: 200px; height: 200px; left: -46px; }
  .afiche__titulo { font-size: 24px; }
}

/* Y LA PIZARRA BAJA DE CUERPO ANTES DE RECORTAR UN NOMBRE. Medido con los dos
   nombres más largos del juego —«Independiente Rivadavia» y «Gimnasia y
   Esgrima La Plata»—: a 28 px no entran en media tarjeta por debajo de los 800
   de ancho, y lo que hacían era terminar en puntos suspensivos. Un nombre de
   club recortado en un afiche es lo contrario de lo que el afiche vino a
   hacer.

   Dos escalones, medidos sobre ese peor caso: a 800 el nombre entra en 22 px y
   a 620 en 17, con el marcador bajando con él para que la proporción entre los
   dos se mantenga — un 64 junto a un nombre de 17 deja de ser un tanteador y
   pasa a ser un número suelto. */
@container news (max-width: 800px) {
  .pizarra__club { font-size: var(--fs-xl); }
  .pizarra__n { font-size: 52px; }
  .pizarra__escudo { width: 180px; height: 180px; }
  /* El nítido baja con él: la columna es escudo, nombre y goleadores, y en una
     caja más angosta el nombre ya se achicó. */
  .pizarra__nitido { width: 64px; height: 64px; }
}
@container news (max-width: 620px) {
  .pizarra__club { font-size: var(--fs-md); }
  .pizarra__n { font-size: 40px; }
  .pizarra__lado { padding: var(--sp-5); }
  .pizarra__escudo { width: 140px; height: 140px; left: -32px; }
  /* Y acá se va. Con el nombre en `--fs-md` y el marcador en 40, un escudo
     nítido de cualquier tamaño deja de acompañar y empieza a empujar: lo que
     la pizarra tiene que decir en esta caja es el marcador. El borrón se
     queda, que es el que pone el color. */
  .pizarra__nitido { display: none; }
  .pizarra__lado--der .pizarra__escudo { left: auto; right: -32px; }

  /* Y LA COLUMNA DEL MEDIO DEJA DE MANDAR (21/9/2026, encontrado por
     `vara-textos-en-el-telefono` con WebKit a 390 px: «Racing Club» se cortaba
     a lo ancho).
     ----------------------------------------------------------------------
     La retícula es `1fr auto 1fr` y ese `auto` se mide por su contenido más
     largo, que no es el marcador: es el renglón de contexto —«Premier League ·
     en casa»— que pide 221 px. Medido en el teléfono: el centro se llevaba 253
     de los 367 y a cada club le quedaban 82 para un nombre que necesita 93.

     Las dos mitades del arreglo son la misma idea. `minmax(0, auto)` le permite
     al centro encogerse por debajo de su contenido, y el renglón de contexto
     pasa a poder partirse en dos líneas — que es lo que tiene que ceder,
     porque es lo único de la pizarra que se lee después del marcador y de los
     dos nombres. */
  /* EL PISO VA EN LOS LADOS Y NO EN EL MEDIO, y la primera versión lo puso al
     revés: `minmax(0, auto)` en el centro no cambió nada, porque `auto` como
     MÁXIMO sigue siendo el contenido entero y la columna se lo toma igual. Lo
     que hace falta es que los clubes RECLAMEN su ancho primero — 96 px, que es
     lo que mide «Boca Juniors» en este cuerpo— y que el resto sea del centro. */
  .pizarra { grid-template-columns: minmax(116px, 1fr) minmax(0, auto) minmax(116px, 1fr); }
  .pizarra__donde { white-space: normal; text-wrap: balance; }

  /* Y EL NOMBRE SE PARTE EN DOS RENGLONES. Con 96 px de columna y el relleno
     del lado le quedan 63, y «Racing Club» pide 93 en este cuerpo: por más que
     se reparta la retícula, en un teléfono un nombre de club no entra en una
     línea. Partirlo es lo que hace cualquier marcador de televisión en
     vertical, y acá hay sitio —la pizarra mide 210 px de alto y en esta caja
     ya no lleva el escudo nítido—.

     El corte con puntos suspensivos se va con el `nowrap`: un nombre de club
     recortado es lo contrario de lo que esta pieza vino a hacer. */
  .pizarra__club {
    white-space: normal;
    overflow: visible;
    text-wrap: balance;
    line-height: 1.05;
  }
}

/* El zócalo de la placa se fue con la placa (21/9/2026): la pizarra pone el
   contexto —torneo y sede— debajo del marcador, en su centro, en vez de en una
   banda aparte al pie. */

/* Registro normal: el ancho comprimido es voz de marcador (cifras, nombres,
   reloj) y esto es un titular de prosa. */
.news__title {
  font-size: var(--fs-xl);
  font-weight: 700;
  line-height: var(--lh-tight);
  color: var(--text-primary);
  text-wrap: balance;
}

.news__body {
  max-width: 62ch;
  font-size: var(--fs-md);
  color: var(--text-secondary);
  line-height: var(--lh-body);
}
.news__body + .news__body { color: var(--text-muted); }

/* La marca de la competición es ornamento, y el acento no decora nunca: va en
   tono neutro. De cal sería el bloque de acento más grande de la pantalla, y
   no dice absolutamente nada.

   CRECIÓ DE 84 A 168 Y SE SALE POR EL BORDE. En la fuente la tarjeta de
   noticias no es un bloque de texto: tiene un dibujo grande a la derecha que se
   corta contra el canto de la placa, y es lo que la hace parecer una portada en
   vez de un párrafo. A 84px y centrada en su columna, la nuestra era una
   viñeta. Al doble y sangrada contra el borde hace el mismo trabajo con la
   misma materia —el escudo del torneo que ya estaba— y sin inventar un arte que
   este juego no tiene.

   Va más apagada que antes justamente porque ahora es grande: al 100 % de
   `--ink-700` un dibujo de 168px compite con el titular, que es lo que se vino
   a leer. Y `overflow: hidden` en el panel es lo que la corta; sin él la
   tarjeta se ensanchaba y empujaba a la columna del medio. */
.news__mark {
  width: 168px; height: 168px;
  margin: calc(var(--sp-6) * -1) calc(var(--sp-7) * -1) calc(var(--sp-6) * -1) 0;
  /* Un paso por debajo del que tenía a 84px, no dos. A `--ink-800` —tres
     puntos de luminancia sobre el panel— el dibujo grande desaparecía y la
     tarjeta volvía a ser un párrafo; a `--ink-700`, que era el de la viñeta,
     168px de escudo compiten con el titular. `--ink-750` es el punto donde se
     ve que hay un dibujo y no se lee antes que la noticia. */
  color: var(--ink-750);
  flex: none;
}
.news__panel--diario { overflow: hidden; }

@media (max-width: 1400px) {
  /* Con la columna del medio estrecha, el dibujo se lleva el ancho del titular:
     vuelve a la viñeta antes que dejar «Arranca la temporada para Platense» en
     cuatro renglones. */
  .news__mark { width: 96px; height: 96px; margin: 0; }
}

/* EL PIE DE LA NOTICIA, CON MÁS PESO (21/9/2026, pedido de Alberto: «un poco
   más de fuerza a este breadcrumb»). Era texto apagado del mismo tamaño que
   todo lo demás y se perdía debajo de un afiche de 34 px. No es decoración:
   dice de qué sección es la nota, de qué club y cuándo — las tres preguntas
   que uno hace después de leer el titular.

   Sube de cuerpo y de tinta, y los separadores pasan a ser puntos medios en
   vez de espacios: lo que lo hacía ilegible no era el color, era que tres
   datos distintos se leían como una frase sola. */
.news__meta {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-secondary);
}

/* EL PRIMERO ES LA SECCIÓN, y es el dato que ordena a los otros dos: «Previa»
   dice qué clase de nota es, y recién después importa de qué liga y de cuándo.
   Va en versales con tinta plena — el resto queda como acompañamiento. */
.news__meta span:first-child {
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-primary);
}

.news__meta span + span::before {
  content: '';
  display: inline-block;
  width: 4px; height: 4px;
  margin-right: var(--sp-5);
  border-radius: var(--r-pill);
  background: var(--ink-500);
  vertical-align: middle;
}

.news__pager { grid-column: 1 / -1; display: flex; gap: var(--sp-3); }

/* Cuando el enlace ES la cabecera sube de tamaño y de peso: pasa de eco al pie
   de un rótulo a ser lo único que encabeza la tarjeta. Sigue sin ser magenta —
   es un enlace, no el nombre de una sección. */
.col__more--titular {
  font-size: var(--fs-sm);
  font-weight: 600;
  /* EN BLANCO Y NO EN GRIS, con el globo en color. Cuando el enlace ES la
     cabecera de la tarjeta deja de ser un eco al pie de un rótulo y pasa a ser
     lo único que la encabeza: en la fuente se lee con el mismo peso visual que
     un rótulo magenta, no como una nota. Leído a 1:1 del video. */
  color: var(--text-primary);
}
@media (hover: hover) {
  .col__more--titular:hover { color: var(--text-primary); }
}
@media (hover: hover) {
  .col__more--titular:hover .i:first-child { color: var(--accent-strong); }
}
.col__more--titular .i:first-child { color: var(--accent); }

/* LA BARRA DEL PAGINADOR, no el puntito. En la captura de FM26 son tramos
   largos que ocupan el ancho entero de la tarjeta —unos 85 px cada uno— y no
   una hilera de guiones cortos arrinconados a la izquierda. La diferencia no es
   de gusto: un tramo largo se puede pulsar sin apuntar, y sobre todo hace de
   REGLA — se ve de un vistazo cuántas noticias hay y en cuál estás, que es lo
   que un carrusel que pasa solo tiene que decir.

   Se reparten el ancho con `flex: 1` en vez de medir fijo, así que cuatro
   noticias dan cuatro tramos anchos y nueve dan nueve angostos, sin que nadie
   elija un número. */
/* LOS DOS COLORES SON UN PAR MEDIDO, Y POR ESO VAN LITERALES Y NO EN TOKENS.
   Los puntos son `role="tab"`: cada uno es un control, así que WCAG 1.4.11 le
   pide 3:1 contra lo que tiene detrás para que se vea DÓNDE está. Con
   `--ink-700` daban **1,32** sobre el panel —medido el 8/9/2026 en producción,
   los cinco— y el barrido de contraste los venía acusando. Un commit anterior
   los había declarado «punto ciego de pseudo-elementos y no un defecto»: eso
   vale para UNO de los cinco —la barra de la cuenta atrás, que vive en un
   `::after` y el arnés no ve—, y los otros cuatro eran ciertos.

   La cuenta tiene DOS pisos y hay que pasarlos a la vez: la pista contra el
   panel (que se vea el control) y el relleno contra la pista (que se vea qué
   nota estás leyendo). La ventana entre los dos es angosta y por eso los
   valores van LITERALES, que es la lección de [[anclar-escalas]]: no valen por
   separado, valen como PAR. Apuntándolos a un escalón de la escala, el día que
   alguien la recalibre el par se rompe en silencio y sin que ninguna vara lo
   cace hasta el próximo barrido. Escritos acá, el que los toque ve los números
   al lado.

   ══════════════════════════════════════════════════════════════════════════
   Y EL DÍA LLEGÓ: EL PAR SE REELIGIÓ CON LA PALETA NUEVA (22/9/2026)
   ══════════════════════════════════════════════════════════════════════════
   Acá decía «un color elegido ahí está roto el día que alguien toque el panel»,
   y el que lo tocó fui yo: el panel pasó de `hsl(243 25% 11%)` —violeta-negro—
   a gris. Medidos los dos pares contra los dos paneles nuevos, el viejo
   —pista `hsl(240 12% 46%)`, relleno `hsl(280 90% 86%)`— daba:

       panel de «Tinta»  (0 0% 9%)    3,28 contra el panel   ← pasa raspando
       panel de la ácida (0 0% 14%)   2,84 contra el panel   ← NO PASA

   O sea que el aviso de este comentario se cumplió tal cual, y no lo habría
   cazado ninguna vara hasta el próximo barrido. Y encima el relleno era
   `hsl(280 90% 86%)`: el único violeta que quedaba en una paleta sin matiz.

   El par nuevo es monocromo y tiene más margen que el que reemplaza, en los
   dos paneles:

       pista   hsl(0 0% 45%)    3,78 en Tinta · 3,27 en la ácida   (piso 3)
       relleno hsl(0 0% 86%)    3,42 contra la pista               (piso 3)
                               12,95 y 11,21 contra el panel

   Se eligió el escalón MÁS ALTO que sigue pasando el segundo eje: subir la
   pista mejora el primer piso y empeora el segundo, así que el par se buscó
   barriendo los dos a la vez y no uno después del otro — que es exactamente el
   error que este bloque ya documentaba como «arreglar sólo la mitad del par».
   ══════════════════════════════════════════════════════════════════════════ */
.news__dot {
  --pista: hsl(0 0% 45%);
  --contado: hsl(0 0% 86%);

  flex: 1 1 0;
  min-width: 0;
  height: 4px;
  border-radius: var(--r-pill);
  background: var(--pista);
  transition: background var(--dur-fast) var(--ease);
}
/* El hover ACLARA. Era `--ink-600`, que ahora quedaría más oscuro que el
   reposo: un hover que apaga el control se lee como si lo deshabilitara. */
@media (hover: hover) {
  .news__dot:hover { background: var(--ink-400); }
}
/* Sin animación no hay cuenta atrás, así que el punto activo se pinta entero
   del color del relleno. Antes era `--accent`, 3,13 contra el panel: pasaba
   solo, pero contra la pista nueva daría 1,02 y el activo dejaría de
   distinguirse de los otros cuatro. */
.news__dot[aria-selected='true'] { background: var(--contado); }

/* El punto de la nota que se está leyendo CUENTA lo que le queda. Se llena en
   los mismos siete segundos que tarda el carrusel en pasar, así que el cambio
   deja de ser una sorpresa y se ve venir; y como la rotación se detiene al
   acercar el mouse o al entrar con el teclado, la barra se detiene con ella y
   dice que el titular ya no se va a ir solo.

   El plazo lo escribe `inicio.js` en `--rotacion-titulares`: la cifra vive en
   el reloj que rota y no escrita dos veces, que es como se desincronizan una
   animación y su temporizador. Se anima la escala y no el ancho: lo mismo a la
   vista, sin pedirle al navegador que rehaga la retícula sesenta veces por
   segundo durante siete segundos. */
@media (prefers-reduced-motion: no-preference) {
  .news__dot[aria-selected='true'] {
    position: relative;
    overflow: hidden;
    /* Lo que TODAVÍA NO transcurrió del punto activo. Va la pista y no
       `--ink-700`: con el oscuro de antes, el punto que se está leyendo
       arrancaba cada rotación siendo el MENOS visible de los cinco. */
    background: var(--pista);
  }
  .news__dot[aria-selected='true']::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: var(--contado);
    transform-origin: left;
    animation: news-cuenta var(--rotacion-titulares, 7000ms) linear both;
  }
  .news:focus-within .news__dot[aria-selected='true']::after,
  .portada__apertura:focus-within .news__dot[aria-selected='true']::after {
    animation-play-state: paused;
  }
  @media (hover: hover) {
    .news:hover .news__dot[aria-selected='true']::after,
    .portada__apertura:hover .news__dot[aria-selected='true']::after {
      animation-play-state: paused;
    }
  }
}
@keyframes news-cuenta { from { transform: scaleX(0); } }

/* --------------------------------------------------------------------------
   PRÓXIMO RIVAL Y PARTIDO DE HOY
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   CUPOS INTERNACIONALES
   --------------------------------------------------------------------------
   Seis filas de 22px, el mismo ritmo que la fila de atributo y la de
   clasificación. La vía va a la derecha y apagada: es el porqué, y el porqué
   se lee después del quién.
   -------------------------------------------------------------------------- */

/* La zona de un club en la tabla de la Nacional. Las dos zonas van apiladas en
   un solo cuadro, así que la letra tiene que viajar con el nombre — sin ella,
   dos primeros puestos seguidos parecen un error. */
.team__zona {
  flex: 0 0 auto;
  margin-left: var(--sp-3);
  font-size: var(--fs-2xs);
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
}


/* La tarjeta del rival tiene dos pisos desde que trae forma y comparación:
   arriba QUIÉN es, abajo CÓMO viene. Separados por un hairline, que es lo que
   este sistema usa para dividir dentro de una placa. */
.rival { display: grid; gap: var(--sp-5); }
.rival__top { display: flex; align-items: center; gap: var(--sp-5); }
.rival__id { display: grid; gap: 1px; min-width: 0; }
.rival__name { font-size: var(--fs-lg); font-weight: 700; color: var(--text-primary); }
.rival__note { font-size: var(--fs-xs); color: var(--text-muted); }

/* LOS DOS DATOS DEL PIE ENVUELVEN ANTES DE APRETARSE. Eran dos columnas
   flexibles sin base, así que se repartían lo que hubiera: en el hueco de 508
   de la grilla de cuatro zonas, cada una quedaba en 106 px y «Sin partidos
   todavía» —que pide 131— se partía en dos, igual que «Más flojo −26 %», que
   además dejaba el «%» separado de su número.

   Con una base de 130 la decisión la toma el ancho disponible y no un umbral
   de ventana: si las dos entran van al lado, y si no, la segunda baja. Es el
   mismo arreglo que `.par`, por el mismo motivo y en el mismo día. */
.rival__pie {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-5) var(--sp-9);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line-hairline);
}
.rival__dato { display: grid; gap: var(--sp-3); align-content: start; flex: 1 1 130px; }
.rival__nada { font-size: var(--fs-xs); color: var(--text-muted); }

/* El veredicto: palabra en su color y cifra al lado en gris. La cifra no se
   tiñe — repetir el color en las dos mitades de la misma frase no lo dice dos
   veces, lo dice más fuerte de lo que es. */
.rival__veredicto { font-size: var(--fs-sm); font-weight: 600; }
.rival__veredicto[data-band='good'] { color: var(--good); }
.rival__veredicto[data-band='ok']   { color: var(--text-secondary); }
.rival__veredicto[data-band='bad']  { color: var(--danger); }
.rival__veredicto em {
  margin-left: var(--sp-3);
  font-style: normal;
  font-weight: 400;
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}

/* LA FILA DE DOS TARJETAS. Es la única del portal, y por eso es una clase y no
   una regla de la columna: el resto de la columna del medio sigue siendo una
   pila. Las dos miden lo mismo —en la captura son 290 y 300 px— así que no hay
   una principal y una accesoria; son dos respuestas a la misma pregunta.

   ARRANCÓ CON `align-items: start` Y AHORA ESTIRA (21/9/2026). El motivo de
   entonces era que forzarlas a la misma altura dejaba media tarjeta vacía
   debajo de la de partidos. Sigue siendo cierto que sobra alto — lo que cambió
   es dónde queda ese sobrante.

   Medido a 1920 con `start`: la tarjeta de partidos medía 152 en una fila de
   283, el Parte médico 98 en una de 263, y el par del club 132 y 77 en una de
   297. Eso son cuatro AGUJEROS en la retícula, no cuatro tarjetas cortas: el
   fondo de la página aparece entre medio y la columna se lee rota.

   Con `stretch` el mismo sobrante se va ADENTRO de la tarjeta, enmarcado, que
   es lo que hace la retícula de FM: todas las cajas llegan al borde de su
   celda. Es la diferencia entre una caja con aire y un hueco. */
/* DOS EN FILA SÓLO SI LAS DOS ENTRAN, Y LO DECIDE EL HUECO Y NO LA VENTANA.
   --------------------------------------------------------------------------
   Esto vivía en un `@media (max-width: 1180px)` que apilaba las tarjetas en
   pantallas chicas, y era correcto mientras el par ocupaba siempre la columna
   del medio. Con la grilla de cuatro zonas dejó de serlo: el par de La caja y
   el Parte médico cae en un hueco de 335 px a 1920 de ventana, o sea con la
   media query dormida, y ahí una tarjeta mide 162.

   Y 162 no alcanza. Medido: «Sueldos por semana» pide 172 y su valor 51 —223
   entre los dos— así que se partían LOS CUATRO renglones del panel. Lo peor
   no era el rótulo largo sino la cifra: **«2,19» y «M» quedaban en renglones
   distintos, y un número separado de su unidad deja de ser un número.**

   `auto-fit` con un mínimo lo resuelve sin umbral que mantener: si las dos
   entran van en fila, y si no, se apilan. Da igual por qué no entran —una
   ventana chica, un hueco angosto o una columna nueva que a nadie se le
   ocurrió todavía—.

   EL MÍNIMO ES 230 Y ESTÁ MEDIDO, no elegido: el par del rival funciona en su
   hueco de 508 (dos de 244) y tiene que seguir yendo en fila, así que el
   mínimo no puede pasar de 244; el par de la caja está en 335 y tiene que
   apilarse, así que dos mínimos tienen que superar 335. Entre 168 y 244,
   cualquiera sirve; 230 deja aire de los dos lados.

   Es el mismo defecto que la leyenda de zonas y por el mismo motivo: una
   regla atada a la ventana cuando lo que aprieta es la caja. */
.par {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: var(--sp-5);
  align-items: stretch;
}

/* Sin borde, sin fondo propio y sin radio: la placa que envuelve esto ya es
   la tarjeta de «Partidos». Una caja dentro de la caja sería el
   segundo marco para una sola cosa. */
/* --------------------------------------------------------------------------
   EL PARTIDO DEL DÍA, DIBUJADO COMO UN DUELO
   --------------------------------------------------------------------------
   Eran dos pastillas con escudo y nombre adentro, separadas por la hora, todo
   en un renglón. El porqué del cambio está en `inicio.js`: en la tarjeta de
   313 px del Portal el nombre salía recortado y abajo sobraban 148 px.

   Los dos escudos enfrentados y grandes, el nombre debajo de cada uno, la hora
   en el medio, el clima después y la salida al pie. Todo CENTRADO: es un
   cartel de partido, y un cartel no tiene margen izquierdo.

   El escudo manda porque es lo que se reconoce antes de leer. Y el nombre deja
   de pelear el ancho con el escudo: ya no comparten renglón, así que entra el
   corto entero —«Argentinos», «Gimnasia»— sin puntos suspensivos. */
.today { display: grid; gap: var(--sp-4); justify-items: center; text-align: center; }

.today__duelo {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: var(--sp-4);
  align-items: center;
  width: 100%;
}

.today__lado {
  display: grid;
  justify-items: center;
  gap: var(--sp-2);
  min-width: 0;
}

.today__escudo { width: 52px; height: 52px; object-fit: contain; }

/* EL NOMBRE NO SE PARTE Y NO SE RECORTA. Con el escudo fuera de su renglón le
   queda la mitad de la tarjeta entera, que alcanza para el corto de los 1.673.
   El `min-width: 0` de arriba es lo que le permite encogerse dentro de la
   columna en vez de ensancharla; el recorte es el seguro para el que no entre. */
.today__nombre {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
}

.today__time {
  display: grid;
  place-items: center;
  min-width: 62px;
  height: 34px;
  padding: 0 var(--sp-4);
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-sm);
  background: var(--ink-950);
  font-size: var(--fs-md);
  font-weight: 700;
  color: var(--text-primary);
  /* Va alineada con los ESCUDOS y no con el centro del bloque: el nombre cuelga
     debajo, y una hora centrada entre los dos renglones queda flotando a media
     altura de un lado y del otro. */
  align-self: start;
  margin-top: 9px;
}

/* La salida, al pie y dicha. Ancho completo porque es la última cosa de la
   tarjeta y no compite con nada: un botón angosto centrado debajo de dos
   escudos grandes se lee como un pie de foto. */
.today__ir { width: 100%; justify-content: center; }

/* --------------------------------------------------------------------------
   CALENDARIO
   --------------------------------------------------------------------------
   La densidad se compra con iconos: a este tamaño "Entrenamiento de
   resistencia" no entra, pero un cono sí, y se reconoce sin leer. El texto
   completo aterriza en la línea de detalle de abajo, que sí es alcanzable.
   -------------------------------------------------------------------------- */

/* LO QUE ACOMPAÑA AL TÍTULO DEL CALENDARIO SON DOS COSAS, y por eso viajan
   juntas. `.panel__head` reparte con `space-between`: con el rango y el botón
   sueltos, tres hijos dejan el rango flotando en el medio de la cabecera, que
   no es donde vive ninguna medida del juego. Envueltos, la cabecera vuelve a
   tener dos lados.

   `align-self: center` por lo mismo que `.col__tools` de la bandeja, doce
   secciones más abajo: `.panel__head` alinea por `baseline`, que es lo correcto
   para un título y su eco de texto y manda media línea abajo a cualquier botón.

   Y el rango conserva su `nowrap`, que lo perdió al dejar de ser hijo directo
   de la cabecera: «16 ago – 29 ago» partido en dos renglones no es un rango. */
.cal__jefe {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: var(--sp-2) var(--sp-4);
}

.panel__head .cal__jefe { align-self: center; }
.cal__jefe .label { white-space: nowrap; }

/* Y AL DOBLAR SE ALINEA A LA IZQUIERDA, que es la regla que `app.css` ya tiene
   escrita para el rótulo suelto de cualquier cabecera: en una línea el grupo
   termina en el borde derecho y ahí `flex-end` no tiene margen sobre el que
   actuar, pero cuando la cabecera dobla —a 860 el título se queda solo arriba—
   dejarlo a la derecha lee torcido debajo de un título alineado a la
   izquierda. El punto de corte es el mismo de esa regla, a propósito: dos
   cabeceras que doblan a anchos distintos son dos cabeceras distintas. */
@media (max-width: 860px) {
  .cal__jefe { justify-content: flex-start; }
}

/* Y SE VE, QUE ES LO QUE NO PASABA. «Simular toda la temporada» era
   `action--callada action--mini`: 20 px de alto y el borde de `--line`, que
   contra el fondo del panel da **1,32 de contraste** — medido el 3/9/2026 en el
   juego cargado—. O sea que la píldora prácticamente no se dibujaba y el botón
   se leía como un rótulo más de la cabecera. Alberto lo pidió con una captura:
   «que el botón sea más grande, que se vea».

   Dos cosas y ninguna es el color de relleno:

   · **Deja de ser `--mini`**, que es el tamaño de un control DENTRO DE UNA FILA
     de tabla y no el de la única acción de un panel. Pasa de 208×20 a 248×34, y
     de `--fs-xs` a `--fs-md`. Cuesta 11 px de cabecera, que es lo caro en esta
     pantalla —acá el alto es el recurso escaso— y por eso se midió que la
     quincena y el mes siguen enteros con la ventana baja.
   · **El borde y el texto, firmes.** Es exactamente el estado `:hover` de
     `action--callada` hecho permanente: `--line-strong` (1,82 contra el panel,
     40 % más que `--line`) y `--text-primary` (15,05, contra 7,27 del
     secundario). Lo que no se veía era la FORMA, no la letra.

   NO LLEVA RELLENO DE ACENTO, y no es timidez: `DESIGN.md` reserva el relleno
   pleno para LA acción de una pantalla, y en el portal ésa ya es CONTINUAR —el
   botón de acento de la barra de arriba, que acá dice «Te esperan 2 tareas» o
   «Empezar 2028»—. Probadas las dos en pantalla: con el acento pleno quedan dos
   botones de acento en la misma vista y ninguno de los dos dice ya cuál es el
   principal.

   `:not(:disabled)` porque el apagado tiene su propia piel tres reglas abajo, y
   un botón que no se puede tocar no puede ser el que más se ve. */
/* SE FUE EL `border-color`, Y EL MOTIVO ES QUE AHORA ESTORBA — 3/9/2026, unas
   horas después de escribirlo. Esta regla subía el contorno de UN botón de
   `--line` a `--line-strong`, o sea de 1,32 a 1,82. Ese mismo día el barrido de
   contorno mostró que no era un caso: `button.action` sin relleno aparecía 146
   veces entre 1,22 y 1,32 en siete pantallas, y el arreglo pasó a ser un token,
   `--line-control`, en `.action--callada`.

   CON EL TOKEN PUESTO, ESTA LÍNEA DEJABA AL BOTÓN DEBAJO DEL RESTO: gana por
   especificidad —`.cal__jefe .action:not(:disabled)` le pasa por encima a
   `.action--callada`— y lo clavaba en 1,82 mientras sus hermanos subían. Un
   parche puntual que sobrevive al arreglo de fondo se convierte en el techo del
   elemento que vino a salvar, y no avisa: el botón sigue viéndose mejor que
   antes.

   El `color` se queda: eso no lo da el token del contorno, y sigue siendo
   cierto que la única acción de este panel merece la tinta primaria. */
.cal__jefe .action:not(:disabled) {
  color: var(--text-primary);
}

/* Apagado cuando no hay temporada que simular: sin club, o con la
   post-temporada ya terminada. Es la misma disciplina que el «Hoy» del mes
   —un control que no significa nada enseña a no leer los que sí—. */
.cal__jefe .action:disabled {
  color: var(--text-disabled);
  cursor: default;
}

@media (hover: hover) {
  .cal__jefe .action:disabled:hover { background: none; color: var(--text-disabled); }
}

/* ==========================================================================
   EL CARTEL DE «SIMULANDO» — rediseñado el 11/10/2026
   --------------------------------------------------------------------------
   «Más grande, visualmente cómodo y entendible, fluido y con buena transición
   (paso del tiempo)», pidió Alberto. Ver la cabecera de `cartelDeEspera()` en
   `inicio.js`: allá está el porqué de cada pieza; acá, cómo se dibuja.

   LA REGLA DE MOVIMIENTO DE ESTA HOJA: todo lo que se mueve mientras corre la
   simulación lo hace con `transform` u `opacity`, que el compositor anima
   aunque el hilo principal esté tomado calculando un tramo. Un `width` o un
   `top` se congelarían hasta que el tramo termina, que es justo el «salto» que
   este rediseño vino a sacar.

   SIN SCROLL en 375×812, 1280×720 y 1440×900: el alto de cada pieza es fijo
   —la ventana de resultados mide cuatro filas, la fecha un renglón de tapa—,
   así que el cartel no crece mientras corre ni cambia de tamaño de un tramo a
   otro.
   ========================================================================== */
.dialogo--espera.simu {
  --simu-fila: 4.1rem;
  --simu-ritmo: 420ms;
  /* El ancho del parte que viene después (medido: 1.068 px visibles a
     1440): el pase de uno al otro es un fundido entre dos cajas del mismo
     tamaño, no una caja que salta. */
  width: min(1160px, calc(100vw - 2 * var(--sp-6)));
  max-height: calc(var(--alto-ventana) - 2 * var(--sp-4));
  overflow: hidden;
}

/* La franja de foto del modo club (`franjaConFoto()`), más baja que en los
   partes: acá el protagonista es la fecha, no la foto. */
.simu > .mfoto { min-height: 6.5rem; }
.simu > .mfoto .dialogo__titulo { letter-spacing: -0.01em; }

/* Desde dónde y hasta dónde: la pregunta «¿qué se está simulando?». */
.simu__tramo {
  margin: 0 0 var(--sp-5);
  font-size: var(--fs-md);
  color: var(--text-muted);
}

.simu__cuerpo {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: var(--sp-6);
  align-items: start;
}

/* --------------------------------------------------------------------------
   HOY: el día como número de tapa y, al lado, el día de la semana y el mes.
   -------------------------------------------------------------------------- */
.simu__fecha {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
}

/* EL GIRO DE CUENTA. Los dos números —el que se va y el que llega— comparten
   la misma celda de la retícula, así que el renglón no cambia de alto ni de
   ancho mientras se cruzan; `overflow: hidden` es la ventanita del contador. */
.simu__giro {
  display: inline-grid;
  overflow: hidden;
  min-width: 1.15em;
  height: 1.08em;
  font-size: clamp(72px, 10vw, 136px);
  line-height: 1.08;
}
.simu__num {
  grid-area: 1 / 1;
  font-weight: 900;
  font-stretch: var(--wd-condensed);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
  color: var(--text-primary);
  text-align: center;
}
/* Uno DETRÁS del otro y no cruzados: el viejo se va rápido hacia arriba y el
   nuevo entra de abajo cuando el viejo ya casi no está. Cruzados a la par, a
   mitad de camino se leían los dos números encimados («6» sobre «11»). */
.simu__num--sale { animation: simu-num-sale 140ms var(--ease-salida) both; }
.simu__num--entra { animation: simu-num-entra 240ms var(--ease-entrada) 60ms both; }
@keyframes simu-num-entra { from { transform: translateY(55%); opacity: 0; } }
@keyframes simu-num-sale { to { transform: translateY(-55%); opacity: 0; } }

.simu__dicho { display: grid; gap: 2px; min-width: 0; }
.simu__semana {
  font-size: var(--fs-2xl);
  font-weight: 800;
  line-height: var(--lh-tight);
  color: var(--text-primary);
}
.simu__mes {
  font-size: var(--fs-lg);
  color: var(--text-secondary);
}

/* TU CLUB Y TU PUESTO. El puesto es un rodillo: todos los ordinales en
   columna detrás de una ventana de un renglón, y la columna se desliza hasta el
   tuyo. Al pasar del 13.º al 9.º se ven pasar el 12, el 11 y el 10, que es la
   forma de contar que no necesita un temporizador. */
.simu__club {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--sp-4);
  margin-top: var(--sp-5);
  padding: var(--sp-4);
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-md);
  background: var(--bg-raised);
}
.simu__escudo { width: 60px; height: 60px; object-fit: contain; }
.simu__club-txt { display: grid; gap: 2px; min-width: 0; }
.simu__club-txt b {
  font-size: var(--fs-xl);
  font-weight: 800;
  color: var(--text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.simu__club-txt small {
  font-size: var(--fs-md);
  color: var(--text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.simu__puesto {
  display: grid;
  grid-template-columns: auto auto;
  align-items: center;
  justify-items: end;
  column-gap: var(--sp-2);
}
.simu__puesto[hidden] { display: none; }
.simu__rodillo {
  display: block;
  overflow: hidden;
  height: 1.08em;
  font-size: clamp(40px, 4.6vw, 60px);
  line-height: 1.08;
  font-weight: 900;
  font-stretch: var(--wd-condensed);
  font-variant-numeric: tabular-nums;
  color: var(--text-primary);
}
.simu__rodillo-in {
  display: block;
  transform: translateY(calc(var(--i, 0) * -1.08em));
  /* Más corto que un tramo típico (150 ms a 1 s, medido): el rodillo tiene
     que asentarse en el número antes de que el próximo lo vuelva a mover. */
  transition: transform 420ms var(--ease-entrada);
}
.simu__rodillo-in i { display: block; height: 1.08em; font-style: normal; text-align: right; }
.simu__flecha {
  min-width: 2.2em;
  font-size: var(--fs-md);
  font-style: normal;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  color: var(--text-muted);
}
.simu__flecha[data-va='sube'] { color: var(--good); }
.simu__flecha[data-va='baja'] { color: var(--danger); }
.simu__pts {
  grid-column: 1 / -1;
  font-size: var(--fs-sm);
  font-variant-numeric: tabular-nums;
  color: var(--text-muted);
}

/* LA FORMA: un cuadrito por partido, en orden, que se va llenando mientras
   corre el año. Es la misma tira que el parte muestra completa al terminar
   («La forma, partido a partido»), así que el pase de uno al otro es la misma
   tira, ahora entera. Las copas, redondas, como allá. */
.simu__forma-caja { margin-top: var(--sp-4); }
.simu__forma {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
  gap: 4px;
  height: calc(14px * 3 + 4px * 2);
  margin-top: var(--sp-2);
  overflow: hidden;
}
.simu__f {
  width: 14px;
  height: 14px;
  border-radius: 4px;
  background: var(--text-disabled);
}
.simu__f--g { background: var(--good); }
.simu__f--p { background: var(--danger); }
.simu__f--e { background: var(--text-secondary); }
.simu__f--copa { border-radius: 50%; }
.simu__f--entra { animation: simu-f-entra 260ms var(--ease-entrada) both; animation-delay: calc(var(--k, 0) * 50ms); }
@keyframes simu-f-entra { from { opacity: 0; transform: scale(0.2); } }

/* --------------------------------------------------------------------------
   LOS ÚLTIMOS PARTIDOS. Una ventana de cuatro filas exactas y una lista que se
   corre por dentro: lo nuevo entra arriba, lo viejo baja y se pierde en el
   fundido del borde de abajo.
   -------------------------------------------------------------------------- */
.simu__rotulo { margin: 0 0 var(--sp-2); }
.simu__ventana {
  height: calc(var(--simu-fila) * 4);
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, #000 82%, transparent);
  mask-image: linear-gradient(to bottom, #000 82%, transparent);
}
.simu__lista {
  margin: 0;
  padding: 0;
  list-style: none;
}
.simu__vacio {
  display: flex;
  align-items: center;
  height: var(--simu-fila);
  font-size: var(--fs-md);
  color: var(--text-muted);
}

.simu__fila {
  --tono: var(--text-secondary);
  display: grid;
  grid-template-columns: 5.2rem 2.5rem minmax(0, 1fr) 1.5rem;
  align-items: center;
  gap: var(--sp-3);
  height: var(--simu-fila);
  border-bottom: 1px solid var(--line-hairline);
  transition: opacity 420ms var(--ease);
}
.simu__fila[data-tono='bueno'] { --tono: var(--good); }
.simu__fila[data-tono='malo'] { --tono: var(--danger); }
/* Lo de atrás se aleja: la racha se lee de arriba hacia abajo. */
.simu__fila:nth-child(2) { opacity: 0.86; }
.simu__fila:nth-child(3) { opacity: 0.72; }
.simu__fila:nth-child(n+4) { opacity: 0.58; }
/* El MÁS NUEVO primero y sin demora: los tramos llegan cada 150 ms a 1 s, y
   con la demora larga el último resultado —el que importa— pasaba la mitad
   del tiempo invisible esperando su turno. */
.simu__fila--entra { animation: simu-fila-entra 280ms var(--ease-entrada) both; animation-delay: calc(var(--k, 0) * 50ms); }
@keyframes simu-fila-entra { from { opacity: 0; transform: translateX(-14px); } }

/* EL MARCADOR GRANDE, teñido con los tres tonos de resultado del juego. */
.simu__marcador {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 3px;
  padding: 4px 0;
  border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--tono) 16%, transparent);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--tono) 38%, transparent);
  color: var(--tono);
  font-size: clamp(24px, 2.5vw, 32px);
  font-weight: 900;
  font-stretch: var(--wd-condensed);
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}
.simu__fila[data-tono='igual'] .simu__marcador { background: var(--bg-raised); box-shadow: inset 0 0 0 1px var(--line-hairline); }
.simu__marcador i { font-style: normal; opacity: 0.6; }
.simu__marcador small { font-size: 0.5em; font-weight: 700; }

/* Los escudos del cartel no navegan: un clic a mitad de la simulación no puede
   llevarte a otra página (todo escudo del juego lleva `data-club`). */
.simu .crest { pointer-events: none; }
.simu__escudo-rival { width: 2.5rem; height: 2.5rem; object-fit: contain; }

.simu__txt { display: grid; gap: 1px; min-width: 0; }
.simu__rival {
  font-size: var(--fs-lg);
  font-weight: 700;
  color: var(--text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.simu__donde {
  font-size: var(--fs-sm);
  color: var(--text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.simu__letra {
  font-size: var(--fs-md);
  font-weight: 800;
  text-align: center;
  color: var(--tono);
}

/* --------------------------------------------------------------------------
   EL AÑO: la franja de meses y la barra de fechas, a todo el ancho.
   -------------------------------------------------------------------------- */
.simu__ano { margin-top: var(--sp-5); }
.simu__linea { position: relative; }
.simu__meses {
  position: relative;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  margin: 0;
  padding: 0;
  list-style: none;
  border-radius: var(--r-sm);
  overflow: hidden;
  background: var(--bg-raised);
}
/* LA TINTA CORRE CON EL RITMO MEDIDO de los tramos y en línea recta: llega a
   donde iba más o menos cuando llega el tramo siguiente, y el año se ve correr
   parejo. Es `scaleX` y no `width` por la regla de la cabecera. */
.simu__tinta {
  position: absolute;
  inset: 0;
  transform-origin: left center;
  transform: scaleX(0);
  background: color-mix(in srgb, var(--accent) 34%, transparent);
  transition: transform var(--simu-ritmo) linear;
}
.simu__mes-celda {
  position: relative;
  padding: var(--sp-3) 0;
  text-align: center;
  font-size: var(--fs-sm);
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-disabled);
  transition: color var(--dur-fast) var(--ease);
}
.simu__mes-celda + .simu__mes-celda { box-shadow: inset 1px 0 0 var(--line-hairline); }
.simu__mes-celda[data-estado='pasado'] { color: var(--text-secondary); }
.simu__mes-celda[data-estado='ahora'] { color: var(--text-primary); }
@media (max-width: 560px) {
  .simu__mes-celda { letter-spacing: 0; }
  .simu__mes-celda span { display: none; }
}

/* Las marcas de los hitos, colgadas del borde de abajo de la franja en el
   punto del año donde pasaron. */
.simu__marcas { position: absolute; inset: auto 0 -5px; height: 0; pointer-events: none; }
.simu__marca {
  --tono-marca: var(--accent);
  position: absolute;
  bottom: 0;
  width: 9px;
  height: 9px;
  border: 1.5px solid var(--bg-panel);
  border-radius: 2px;
  background: var(--tono-marca);
  transform: translateX(-50%) rotate(45deg);
  animation: simu-marca 420ms var(--ease-entrada) both;
}
.simu__marca[data-tono='titulo'] { --tono-marca: var(--warn); }
.simu__marca[data-tono='mercado'] { --tono-marca: var(--text-secondary); }
.simu__marca[data-tono='info'] { --tono-marca: var(--text-primary); }
@keyframes simu-marca { from { transform: translateX(-50%) rotate(45deg) scale(0); } }

.simu__avance { margin-top: var(--sp-4); }
.simu__barra {
  height: 12px;
  border-radius: var(--r-pill);
  background: var(--bg-raised);
  overflow: hidden;
}
.simu__barra i {
  display: block;
  height: 100%;
  border-radius: inherit;
  background: var(--accent);
  transform-origin: left center;
  transform: scaleX(0);
  transition: transform var(--simu-ritmo) linear;
}
.simu--fin .simu__barra i { transition: transform 420ms var(--ease); }
.simu__cuenta {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-4);
  margin: var(--sp-2) 0 0;
  font-size: var(--fs-md);
  font-variant-numeric: tabular-nums;
  color: var(--text-secondary);
}
.simu__falta { color: var(--text-muted); }

/* --------------------------------------------------------------------------
   LA CINTA DE HITOS: entra desde arriba sobre la foto, se queda y se va sola.
   La mueve `animate()` (`PASO_DE_LA_CINTA` en `inicio.js`) y no un
   temporizador: no le pide nada al hilo ocupado.
   -------------------------------------------------------------------------- */
.simu__hito {
  --tono-hito: var(--accent);
  position: absolute;
  top: var(--sp-5);
  left: 50%;
  z-index: 2;
  max-width: calc(100% - 2 * var(--sp-6));
  margin: 0;
  padding: var(--sp-2) var(--sp-5);
  overflow: hidden;
  border: 1px solid color-mix(in srgb, var(--tono-hito) 60%, transparent);
  border-radius: var(--r-pill);
  background: color-mix(in srgb, var(--ink-950) 88%, transparent);
  box-shadow: 0 10px 30px rgb(0 0 0 / 0.45);
  color: var(--text-primary);
  font-size: var(--fs-md);
  text-overflow: ellipsis;
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translate(-50%, -160%);
}
.simu__hito strong { color: var(--tono-hito); }
.simu__hito[data-tono='titulo'] { --tono-hito: var(--warn); }
.simu__hito[data-tono='mercado'] { --tono-hito: var(--text-secondary); }
.simu__hito[data-tono='info'] { --tono-hito: var(--text-primary); }

/* EL PASE AL PARTE. El cartel se va agrandándose apenas mientras se funde, y
   el parte entra por debajo: un fundido cruzado. Lleva la lista ENTERA de la
   transición —con `overlay` y `display` discretos— porque reemplaza la de
   `movimiento.css`, y sin esas dos el cartel desaparecería de un cuadro al
   otro en vez de fundirse. */
.dialogo--espera.simu.simu--sale:not([open]) {
  opacity: 0;
  transform: scale(1.025);
  transition:
    opacity 300ms var(--ease-salida),
    transform 340ms var(--ease-salida),
    overlay 340ms allow-discrete,
    display 340ms allow-discrete;
}

/* EL TELÉFONO: una sola columna, la fecha y el club arriba, los partidos
   debajo y el año al pie. Los mismos datos que en la computadora. */
@media (max-width: 760px) {
  .dialogo--espera.simu { --simu-fila: 3.3rem; width: calc(100vw - 2 * var(--sp-4)); padding: var(--sp-4); }
  .dialogo--espera.simu > .mfoto { min-height: 5.5rem; margin: calc(var(--sp-4) * -1) calc(var(--sp-4) * -1) var(--sp-3); }
  .simu__tramo { margin-bottom: var(--sp-3); font-size: var(--fs-xs); }
  .simu__cuerpo { grid-template-columns: minmax(0, 1fr); gap: var(--sp-4); }
  .simu__giro { font-size: 68px; }
  .simu__semana { font-size: var(--fs-xl); }
  .simu__mes { font-size: var(--fs-md); }
  .simu__club-txt b { font-size: var(--fs-lg); }
  .simu__club-txt small, .simu__tramo, .simu__cuenta { font-size: var(--fs-sm); }
  .simu__forma-caja { margin-top: var(--sp-3); }
  /* En el teléfono, una sola fila pegada a la derecha: lo más viejo se va
     por la izquierda y siempre se ve lo último. */
  .simu__forma { flex-wrap: nowrap; justify-content: flex-end; height: 12px; }
  .simu__f { flex: none; }
  .simu__f { width: 12px; height: 12px; }
  .simu__mes-celda { font-size: var(--fs-xs); padding: var(--sp-2) 0; }
  .simu__rival { font-size: var(--fs-md); }
  .simu__donde { font-size: var(--fs-xs); }
  .simu__marcador { font-size: 22px; }
  .simu__club { margin-top: var(--sp-3); padding: var(--sp-3); gap: var(--sp-3); }
  .simu__escudo { width: 44px; height: 44px; }
  .simu__rodillo { font-size: 40px; }
  .simu__fila { grid-template-columns: 4rem 1.9rem minmax(0, 1fr) 1.1rem; gap: var(--sp-2); }
  .simu__escudo-rival { width: 1.9rem; height: 1.9rem; }
  .simu__ano { margin-top: var(--sp-4); }
  .simu__avance { margin-top: var(--sp-3); }
  .simu__hito { top: var(--sp-3); font-size: var(--fs-xs); }
}

/* SIN MOVIMIENTO: los mismos datos, en el acto. La cinta de hitos, que sin su
   animación quedaría invisible, se muestra quieta mientras tenga algo. */
@media (prefers-reduced-motion: reduce) {
  .simu,
  .simu * { animation: none !important; transition: none !important; }
  .simu__hito:not(:empty) { opacity: 1; transform: translate(-50%, 0); }
}

/* --------------------------------------------------------------------------
   LAS PREVIAS EN LA PREGUNTA DE SIMULAR (11/10/2026). Una lista corta con el
   torneo, el rival y la fecha de cada una, dentro del cuerpo del diálogo.
   -------------------------------------------------------------------------- */
.previas {
  display: block;
  margin: 0 0 var(--sp-4);
  padding: var(--sp-3) var(--sp-4);
  border: 1px solid color-mix(in srgb, var(--warn) 45%, transparent);
  border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--warn) 7%, transparent);
  text-align: left;
}
.previas__titulo, .previas__ojo { display: block; }
.previas__ojo { margin-top: var(--sp-2); font-size: var(--fs-xs); color: var(--text-secondary); }
.previas__lista { display: grid; gap: var(--sp-2); margin-top: var(--sp-2); }
.previas__fila {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: baseline;
  column-gap: var(--sp-3);
  font-size: var(--fs-sm);
}
.previas__que { grid-column: 1 / -1; font-size: var(--fs-xs); color: var(--text-muted); }
.previas__rival { color: var(--text-primary); }
.previas__cuando { color: var(--text-muted); font-variant-numeric: tabular-nums; }
.previas__mas { font-size: var(--fs-xs); color: var(--text-muted); }

/* EL BALANCE DEL AÑO, CUANDO LA SIMULACIÓN LO TERMINA. Es el último paso de
   «Simular toda la temporada»: el mismo bloque que el portal dibuja en el
   recuadro del informe del rival, con el marco de un diálogo. Ver
   `cierreDeLaTemporada()` en `inicio.js`.

   MÁS ANCHO QUE UNA PREGUNTA (500 px) porque lo que lleva adentro no es una
   pregunta: la despedida de los que se retiran es un renglón de nombres con sus
   años, y en el peor plantel medido son cinco. Y con TOPE DE ALTO, que es lo
   que la caja del portal no necesita: ahí el panel crece y la tarjeta hace su
   barra; acá el diálogo es la ventana, y un año con cinco retiros, tres
   descensos y dos campeones desbordaría por abajo con los dos botones afuera.
   Se desplaza el cuerpo y el pie se queda.

   EL ALTO SE MIDE CON `--alto-ventana` Y NO CON `100dvh`, que es la regla de
   este proyecto y está escrita entera en `card.css`: adentro del zoom del sitio
   las unidades de viewport siguen midiendo la ventana del navegador y no la
   caja donde el juego dibuja. */
.dialogo--balance {
  width: min(860px, calc(100vw - 2 * var(--sp-6)));
  max-height: calc(var(--alto-ventana) - 2 * var(--sp-6));
}

.dialogo--balance[open] {
  display: grid;
  grid-template-rows: auto minmax(0, 1fr) auto auto;
}

/* Ya no es un `.rival__top` —una fila de escudo y textos— sino el marco del
   balance grande, que trae su propia cabecera adentro. Lo único que sigue
   siendo suyo es rodar cuando el año no entra. */
.balance__cuerpo {
  overflow-y: auto;
  margin-bottom: var(--sp-5);
}

/* --------------------------------------------------------------------------
   EL BALANCE GRANDE
   --------------------------------------------------------------------------
   Tres bloques en una caja de 860: lo tuyo arriba con el escudo, los campeones
   del año y quién se mueve. Las dos grillas son `auto-fill` y no un número de
   columnas: los campeones pueden ser tres (una liga sin copas) o diez (un año
   con las dos de CONMEBOL, la Recopa y el Mundial), y los que se mueven, dos o
   seis. Una grilla de tres fija dejaría una fila coja en los dos extremos.
   -------------------------------------------------------------------------- */
.bal { display: grid; gap: var(--sp-5); }

.bal__tu { display: flex; align-items: center; gap: var(--sp-4); }

.bal__sec { display: grid; gap: var(--sp-3); }

.bal__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
  gap: var(--sp-2) var(--sp-5);
}

/* La fila de un club: escudo, nombre y su rótulo. El rótulo va a la derecha y
   apagado porque la pregunta que este bloque contesta es «quién», no «qué»: la
   columna que se barre con la vista es la de los escudos. */
.bal__club {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-2) 0;
  border-bottom: 1px solid var(--line-hairline);
  font-size: var(--fs-md);
}

/* El nombre del club es lo que se barre con la vista en este panel, así que
   sube a `--fs-md` con la fila: en `--fs-sm` competía con su propio rótulo, que
   está un tamaño más abajo, y los dos se leían como la misma cosa. La columna
   mínima de la grilla subió de 240 a 270 px por lo mismo — con la letra más
   grande, «Independiente Rivadavia» se recortaba con puntos suspensivos. */
.bal__club-n { color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bal__club-r { font-size: var(--fs-xs); color: var(--text-muted); }
.bal__club[data-tono='bueno'] .bal__club-n { color: var(--good); }
.bal__club[data-tono='malo'] .bal__club-n { color: var(--danger); }


/* Los renglones del balance suben de `--fs-xs` a `--fs-sm`: en la cajita del
   portal son una nota al margen de una pantalla llena, y acá son lo único que
   hay que leer. El nombre grande se queda como está — ya es `--fs-lg`. */
.balance__cuerpo .rival__note { font-size: var(--fs-sm); }
.balance__cuerpo .rival__id { gap: var(--sp-2); }

.calendar {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 1px;
  background: var(--line-hairline);
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-sm);
  overflow: hidden;
}

/* La tira de quince días se estira hasta el pie de su tarjeta en vez de dejar
   un hueco muerto debajo: la cabecera de días mide lo suyo y las dos semanas
   se reparten lo que sobra. Son SIEMPRE dos filas —`quincena()` pide catorce
   días desde el lunes—, así que la retícula puede nombrarlas de a una.

   Estira, pero no se deja encoger. Es un ítem flexible dentro de una tarjeta
   que puede quedarse corta, y con `overflow: hidden` encima lo que sobraba se
   recortaba a media semana: el sábado con la mitad de su número y sus marcas
   cortadas al ras. Dos defensas, y las dos dicen lo mismo —dos filas enteras
   o ninguna—: el piso de la tira es su propio contenido, y el piso de cada
   fila es el día más cargado de esa semana y no un número fijo, porque un día
   con tres marcas mide más que uno con una. Que la ventana sea baja se
   resuelve apretando el aire (ver LA VENTANA BAJA), no partiendo un renglón. */
/* Y NO SE ESTIRA, QUE ES LO CONTRARIO DE LO QUE HACÍA. Tenía `flex: 1 1 auto`
   para no dejar un hueco muerto bajo la tira, y ese estirón le salía de la
   única tarjeta de la columna que puede achicarse por debajo de su contenido:
   la de titulares. O sea que el calendario se quedaba con TODO el sobrante y la
   noticia pagaba la cuenta — medido, y es peor cuanto más grande la pantalla:
   en una ventana de 1600x1000 el calendario llegaba a 333px y a la noticia le
   quedaban 211, con la placa cortada por la mitad. Con más pantalla, menos
   noticia.

   Ahora toma lo suyo —`min-content`, que son sus dos semanas enteras— y el
   sobrante queda para el que sí sabe qué hacer con él. El hueco muerto que el
   estirón evitaba no aparece: sin `flex-grow` la tarjeta mide lo que mide su
   contenido y es la tarjeta entera la que se acorta, no la tira dentro de una
   tarjeta alta. */
.home[data-vista='general'] .cal--quincena {
  flex: 0 0 auto;
  min-height: min-content;
  grid-template-rows: auto repeat(2, minmax(min-content, 1fr));
}

/* Y el piso de la tira sólo vale si la tarjeta que la contiene también lo
   tiene: `.tarjeta--grow` trae `min-height: 0` —está pensada para las que se
   encogen porque adentro llevan un scroller— y con ese cero la placa se
   achicaba por debajo de su contenido y la leyenda terminaba dibujada fuera
   del borde. El calendario no tiene scroller ni nada que recortar: mide lo que
   mide, y el hueco que falte lo cede la tarjeta de titulares. */
.home[data-vista='general'] .tarjeta[data-panel~='calendario'] { min-height: min-content; }

.cal__head {
  padding: var(--sp-2) var(--sp-3);
  background: var(--ink-900);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
}

/* Es un <button>, no un <div>: tenía hover y todo su detalle vivía en un
   title, así que con teclado no se llegaba. Ahora abre la línea de detalle. */
.cal__day {
  display: grid;
  align-content: start;
  gap: var(--sp-3);
  /* 68 y no 58: el bloque del día de partido mide 20 y el número 20, y con los
     6px de aire de la celda los 58 dejaban al bloque tocando el borde de
     abajo. Es la misma cuenta que ya se había hecho para la retícula del mes,
     que mide 76 porque ahí el bloque lleva además el nombre del rival. */
  min-height: 68px;
  padding: var(--sp-3);
  border: 0;
  background: var(--bg-panel);
  text-align: left;
  transition: background var(--dur-fast) var(--ease);
}
@media (hover: hover) {
  .cal__day:hover { background: var(--bg-hover); }
}
.cal__day:focus-visible { outline-offset: -2px; }
.cal__day[aria-pressed='true'] { background: var(--bg-active); }

/* Hoy es una selección, y la selección es uno de los tres usos del acento. */
.cal__day--hoy { background: var(--bg-selected); }
.cal__day--hoy .cal__num { color: var(--accent-texto); font-weight: 700; }

.cal__num { font-size: var(--fs-sm); font-weight: 600; color: var(--text-secondary); }

/* EL BLOQUE DEL DÍA DE PARTIDO. Es la única cosa de la retícula que se dibuja
   con superficie en vez de con un glifo, y por eso el día del compromiso se
   encuentra sin leer la tira. Va en el lavado del acento y no en relleno pleno:
   catorce celdas y una de ellas con un bloque de acento sólido se leería como la
   celda SELECCIONADA, que es lo que marca `--hoy`, y las dos coinciden la mitad
   de las semanas. El lavado dice «acá pasa algo» sin decir «acá estás».

   La letra es L o V y no un avión: se lee en el mismo golpe de vista que el
   escudo y ocupa lo mismo, mientras que un icono al lado de otro icono obliga a
   distinguir dos dibujos de 12px. El avión sigue siendo el glifo del viaje en
   la retícula del mes, donde hay sitio para el nombre y para él. */
.cal__chip {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  padding: 2px var(--sp-3) 2px 2px;
  border-radius: var(--r-sm);
  background: var(--accent-wash);
  font-size: var(--fs-2xs);
  font-weight: 700;
  /* El acento que escribe: en `--accent-strong` daba 3,84:1 sobre la celda de
     hoy, que ya está teñida con él. */
  color: var(--accent-texto);
  line-height: 1;
}
/* De visitante, el bloque se apaga: la diferencia entre jugar en tu cancha y
   jugar afuera es la primera cosa que un DT mira en una quincena. */
.cal__chip[data-sede='V'] { background: var(--bg-raised); color: var(--text-secondary); }
/* Sobre la celda de hoy —que ya está teñida con el acento— el bloque sube un paso
   o desaparece dentro de su propio fondo. PERO SÓLO EL DE LOCAL: el de
   visitante subido al lavado del acento se veía idéntico a uno de local, y el
   día que se mira más de la quincena es justamente hoy. La sede es un dato del
   partido y no puede depender de en qué celda cae. */
.cal__day--hoy .cal__chip { background: var(--accent-wash-hi); }
.cal__day--hoy .cal__chip[data-sede='V'] { background: var(--ink-800); }

.cal__marks { display: flex; flex-wrap: wrap; gap: var(--sp-2); color: var(--icon-quiet); }
.cal__marks .i { width: 12px; height: 12px; }
/* El día de partido se marca con BRILLO, no con acento: misma regla que la
   rampa de atributos, y el acento queda libre para sus tres trabajos. */
.cal__mark--partido { color: var(--text-primary); }
.cal__mark--medico { color: var(--warn); }

/* Detalle del día elegido. La retícula no tiene sitio para el texto y un
   title no es alcanzable con teclado: el texto completo aterriza acá. */
.cal__detail {
  min-height: 20px;
  padding: var(--sp-3) 0;
  border-top: 1px solid var(--line-hairline);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
.cal__detail strong { color: var(--text-primary); font-weight: 600; }
.cal__detail em { font-style: normal; color: var(--text-muted); }

.cal-legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3) var(--sp-6);
  font-size: var(--fs-xs);
  color: var(--text-muted);
}
.cal-legend li { display: flex; align-items: center; gap: var(--sp-3); }
.cal-legend .i { width: 12px; height: 12px; color: var(--icon-quiet); }
/* Un amistoso ES un partido, así que lleva la misma pelota. Lo que lo separa
   es el brillo: el oficial va en Primario y el amistoso en Apagado, porque no
   cuenta para ninguna tabla. Dos glifos distintos habrían dicho que son dos
   cosas distintas, y no lo son. */
.cal__mark--amistoso { color: var(--text-muted); }
.cal-legend li[data-acto='amistoso'] .i { color: var(--text-muted); }

/* ==========================================================================
   LA AGENDA
   --------------------------------------------------------------------------
   La vista Calendario a lo ancho. El panel es el mismo que el de la tira de
   quince días; lo que cambia es el corte. Tres piezas, de arriba abajo y de
   izquierda a derecha en el orden en que se preguntan:

     LA BANDA    dónde estoy en el año, y cuándo puedo comprar.
     EL MES      qué me viene, día por día.
     LA LISTA    todo lo que hay, sin recortar y sin tener que pasar meses.

   La banda arriba y no al costado porque es la que sitúa a las otras dos: sin
   ella, un 9 de enero es un número.
   ========================================================================== */

.solo-agenda { display: none; }
.home[data-vista='calendario'] .solo-agenda { display: grid; }
.home[data-vista='calendario'] .solo-vistazo,
.home[data-vista='calendario'] .cal--quincena { display: none; }

/* --------------------------------------------------------------------------
   LA BANDA DEL AÑO
   --------------------------------------------------------------------------
   Cuarenta semanas en una regla. Los tramos del campeonato abajo —cada uno
   proporcional a lo que dura, que es lo único que hace legible que los
   playoffs son cuatro semanas y el Apertura dieciséis— y las ventanas de
   mercado en su propia pista encima, porque se SUPERPONEN a los torneos y
   pintarlas en la misma fila obligaría a partir el Apertura en tres.
   -------------------------------------------------------------------------- */

/* LA PISTA VA EN UNA COLUMNA CON PISO EN CERO, y sin esto la banda del año se
   lleva la vista Calendario de costado en un teléfono: 102 px a 320 y 32 a 390.
   `.solo-agenda` le pone `display: grid` y una retícula sin
   `grid-template-columns` es una pista `auto`, o sea que la pista mide el
   MIN-CONTENT de lo que lleva —acá 392 px, el renglón de la pretemporada— y
   empuja a la caja aunque la caja mida 260. Es la primera de las cuatro formas
   que anota `herramientas/LEEME.md`: el `min-width: 0` de los hijos no salva
   nada, porque lo que hay que poner en cero es el piso de la PISTA. */
.anio { gap: var(--sp-2); grid-template-columns: minmax(0, 1fr); }

.anio__pista {
  position: relative;
  display: flex;
  gap: 1px;
  height: 22px;
  background: var(--line-hairline);
  border-radius: var(--r-xs);
  overflow: hidden;
}

.anio__tramo {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 0;
  padding-inline: var(--sp-2);
  background: var(--bg-row);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* La post-temporada es del mismo año pero no es lo mismo: se hunde un tono en
   vez de cambiar de color. El acento tiene sus tres trabajos y este no es uno. */
.anio__tramo[data-tipo='playoff'] { background: var(--ink-800); color: var(--text-disabled); }
/* En el tramo que se está jugando, el nombre se lee. */
.anio__tramo[data-ahora='true'] { background: var(--bg-selected); color: var(--text-primary); }

/* La pista de las ventanas: fina, y sólo con barras donde hay mercado. */
.anio__ventanas {
  position: relative;
  height: 12px;
  border-radius: var(--r-hair);
  background: var(--line-hairline);
}

/* Ámbar y no acento: una ventana de mercado no es algo que elegiste ni algo
   que se pulsa, es un plazo. Es el mismo trabajo que hace el ámbar en la marca
   de revisión médica del calendario — «esto tiene fecha». */
.anio__ventana {
  position: absolute;
  inset-block: 0;
  display: flex;
  align-items: center;
  padding-inline: var(--sp-3);
  border-radius: var(--r-hair);
  background: hsl(40 90% 52% / 0.22);
  box-shadow: inset 0 0 0 1px hsl(40 90% 52% / 0.42);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--amber-300);
  white-space: nowrap;
  overflow: hidden;
}
.anio__ventana[data-pasada='true'] {
  background: hsl(40 90% 52% / 0.08);
  box-shadow: inset 0 0 0 1px hsl(40 90% 52% / 0.18);
  color: var(--text-disabled);
}

/* Dónde estás. Una línea de acento de 2px cruzando las dos pistas: es una
   selección, que es uno de los tres usos permitidos. */
.anio__hoy {
  position: absolute;
  inset-block: -2px;
  width: 2px;
  margin-left: -1px;
  background: var(--accent-strong);
  border-radius: var(--r-hair);
  pointer-events: none;
}

/* EL PIE ES UNA FILA DE DATOS, NO UN RENGLÓN DE FRASES.
   --------------------------------------------------------------------------
   Decía «Semana 1 de 44 · Mercado de verano abierto · cierra en 6 fechas ·
   Amistosos: 0 de 8 · En la caja: 10,53 M · Pretemporada sin armar»: seis
   hechos de cinco temas distintos, con la misma letra y el mismo peso, y el
   único modo de encontrar uno era leerlos todos. Los puntos separadores no
   ayudaban: separaban tanto los hechos entre sí como las partes de un mismo
   hecho —«abierto · cierra en 6 fechas» es uno solo— así que el renglón tenía
   cinco fronteras falsas.

   Ahora son cinco bloques de `.dato`, la primitiva que el juego ya usa para
   una fila de cifras: EL VALOR ARRIBA Y EL RÓTULO DEBAJO, que es la Regla de
   la Etiqueta —una etiqueta chica encima de un texto grande es un antetítulo,
   y un antetítulo es ruido— y está resuelta con `order` en `app.css`.

   La frontera entre bloques la dibuja una línea vertical y no un punto: un
   separador que ocupa el alto de los dos renglones dice «acá termina un dato»
   sin poder confundirse con la puntuación de adentro. */
.anio__pie {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  gap: var(--sp-3) 0;
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.anio__pie .dato {
  display: grid;
  align-content: start;
  gap: 1px;
  padding-inline: var(--sp-5);
  border-left: 1px solid var(--line-hairline);
}
/* El primero arranca en el borde de la tarjeta, como el resto de la banda: una
   línea a la izquierda del primer bloque lo separaría de nada. */
.anio__pie .dato:first-child { padding-left: 0; border-left: 0; }

/* EL `nowrap` PROTEGE LAS PIEZAS, Y EL `wrap` LAS DEJA BAJAR DE RENGLÓN. Son
   dos reglas que parecen contradecirse y no lo hacen: el `nowrap` impide que
   «2 de 44» se parta en dos líneas por la mitad, y el `flex-wrap` deja que el
   renglón de la pretemporada —«En el predio · 10 días · 0 amistosos» más su
   botón, 392 px de una pieza— se acomode en dos.

   Sin el `wrap`, ese renglón era el min-content del pie, el pie era el
   min-content de la banda, y la banda corría la vista entera de costado. Es la
   cuarta forma de las que anota `herramientas/LEEME.md` —un `nowrap` puesto
   para una medida corta que termina alcanzando a una oración— y ya van cinco
   veces. La diferencia con las otras cuatro es que acá el `nowrap` sí hace
   falta: lo que sobraba era que la LÍNEA no pudiera doblarse. */
.anio__pie .dato__valor {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-3);
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--text-primary);
  white-space: nowrap;
}
/* Lo que matiza al valor —«de 44», «· cierra en 6 fechas»— va en el mismo
   cuerpo y en Apagado: es la diferencia entre la palabra que se busca y la que
   la explica, y hacerla más chica además la volvería un tercer tamaño de letra
   en un bloque que ya tiene dos. */
.anio__pie .dato__valor small { font-size: inherit; font-weight: 500; color: var(--text-muted); }
.anio__pie .dato__valor strong { font-weight: inherit; }

/* --------------------------------------------------------------------------
   EL CUERPO: MES A LA IZQUIERDA, TODO LO DEMÁS A LA DERECHA
   -------------------------------------------------------------------------- */

.agenda {
  /* 1,62 y no 1,45. El reparto se movió el día que la retícula del mes dejó de
     dibujar glifos y pasó a escribir el nombre de cada sesión: con 1,45 la
     celda medía 88px de los que la pastilla gastaba 32 en icono y aire, y
     «Descanso» —la palabra que más veces aparece en un mes— no entraba por dos
     píxeles. La lista de la derecha cede treinta y uno y se queda en 370, muy
     por encima del piso de 300 que ya tenía declarado. */
  grid-template-columns: minmax(0, 1.62fr) minmax(300px, 0.85fr);
  gap: var(--sp-6);
  align-items: start;
  min-height: 0;
}

.agenda__mes { display: grid; gap: var(--sp-4); min-width: 0; }

/* DOBLA ANTES QUE CORTARSE. Son seis piezas en una fila —las dos flechas, el
   mes con su piso de 11ch, «Hoy», el separador y el aviso del mercado— y a 320
   px ya no entraban: la vista Calendario se corría 12,5 px de costado. Apareció
   el 4/9/2026 al llevar `.icon-btn` a los 44 px del dedo, que es el precio
   declarado de esa clase de arreglo —agrandar un objetivo engorda su fila— y es
   la tercera de las cuatro formas que anota `herramientas/LEEME.md`: una caja
   flexible sin `wrap`. El piso de 11ch del título se queda: existe para que la
   cabecera no salte de ancho entre «mayo» y «septiembre». */
.mes__head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); }
.mes__titulo {
  min-width: 11ch;
  font-size: var(--fs-lg);
  font-weight: 600;
  color: var(--text-primary);
  text-transform: capitalize;
}

/* --------------------------------------------------------------------------
   LA RETÍCULA DEL MES, EN LA FORMA DE FM26
   --------------------------------------------------------------------------
   Ocho columnas y no siete: la primera es el carril de las semanas, que en la
   fuente lleva el estilo de entrenamiento de la fila y acá lleva el número de
   semana de la temporada y qué se juega esa semana.

   Es `auto` y no un ancho fijo porque su contenido es texto —«Fecha 12»,
   «Playoffs»— y un carril medido en píxeles o corta el rótulo o deja aire; los
   siete días se reparten lo que queda, que es lo que ya hacían.
   -------------------------------------------------------------------------- */

.calendar--mes {
  grid-template-columns: 62px repeat(7, minmax(0, 1fr));
  /* LA FILA DE LUN…DOM MIDE LO SUYO Y NO LO DE UN DÍA. `grid-auto-rows` vale
     para TODAS las filas implícitas, y la cabecera es una de ellas: llevaba los
     mismos 64px que un martes con dos turnos, o sea cuarenta y dos de aire
     entre los rótulos y el primer día. Cuarenta y dos por retícula, en la
     pantalla que ya llega más justa de alto del portal — y estaban ahí desde
     que la retícula del mes existe, escondidos en un valor que nadie leyó como
     «esto también le toca a la cabecera».

     Se arregla nombrando la primera fila: `auto` es su contenido, y las seis
     semanas siguen saliendo de `grid-auto-rows`. */
  grid-template-rows: auto;
  grid-auto-rows: minmax(64px, auto);
}

/* El hueco de la cabecera sobre el carril: la fila de LUN…DOM tiene ocho
   casillas y la primera no nombra ningún día. */
.cal__head--sem { padding: 0; }

/* EL CARRIL. Va en la misma superficie que la cabecera de días y no en la del
   día, que es lo que lo saca de la retícula sin dibujarle un borde: se lee como
   margen del calendario y no como una octava columna de celdas. */
.cal__sem {
  display: grid;
  align-content: center;
  justify-items: center;
  gap: 1px;
  padding: var(--sp-2);
  background: var(--ink-900);
  text-align: center;
}
.cal__sem b {
  font-size: var(--fs-md);
  font-weight: 700;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
  color: var(--text-secondary);
}
/* Las semanas sin número —el receso y las cuatro fechas FIFA, que son semanas
   que el torneo no tiene— quedan con el punto, que ocupa el mismo sitio: sin
   él, el rótulo de «Receso» sube y las seis filas dejan de alinear sus rótulos
   en la misma vertical. */
.cal__sem--muda { color: var(--text-disabled); }
/* EL RÓTULO NO VA EN VERSALITAS, que es lo que este sistema hace con toda
   etiqueta micro. Acá no entra: «RECESO» son cincuenta píxeles en redonda y
   sesenta en versalitas con su tracking, y el carril mide sesenta y dos —o le
   robaba el ancho a los siete días, que es de donde no se puede sacar. La
   palabra más larga que puede caer acá es «Reducido». */
.cal__sem small {
  font-size: var(--fs-2xs);
  font-weight: 600;
  color: var(--text-muted);
  white-space: nowrap;
}
/* La semana en la que estás, con la misma marca que el día de hoy y por el
   mismo motivo: es una selección, y la selección es uno de los tres usos del
   acento. */
.cal__sem[data-ahora='true'] { background: var(--bg-selected); }
.cal__sem[data-ahora='true'] b { color: var(--accent-texto); }
.cal__sem[data-ahora='true'] small { color: var(--text-secondary); }

.calendar--mes .cal__day {
  min-height: 64px;
  gap: 3px;
  padding: var(--sp-3) var(--sp-3) var(--sp-2);
}
/* El número del día pierde su interlínea de párrafo: la línea de 19,5px que
   trae de fábrica son cuatro píxeles y medio por fila, y seis filas de eso
   empujan al panel del día fuera de una ventana de 800. */
.calendar--mes .cal__num { font-size: var(--fs-sm); line-height: 1.2; }

/* Los días del mes de al lado se ven —una semana partida al medio es peor que
   un día apagado— pero no compiten. */
.cal__day--fuera { background: var(--ink-900); }
.cal__day--fuera .cal__num { color: var(--text-disabled); }
.cal__day--fuera .cal__acto,
.cal__day--fuera .cal__pase { opacity: 0.45; }

/* Un día dentro de una ventana de mercado se levanta un escalón. Sin color:
   el ámbar de la banda ya nombra la ventana, y repetirlo en treinta celdas
   convertiría un plazo en un fondo.

   EL BORDE ÁMBAR SE FUE DE ACÁ. El primer y el último día de la ventana
   llevaban un `inset` de 3px que pretendía decir «acá abre» y «acá cierra».
   Era la franja de color pegada al costado de una celda, que es justo lo que
   este sistema ya había rechazado en la tabla de clasificación: ahí la franja
   de zona es una CELDA de 3px con su leyenda, porque un dato se marca en el
   contenido y no pintándole un borde al contenedor.

   Y no hacía falta. El límite ya está dicho cuatro veces: el escalón de fondo
   cambia entre dos celdas contiguas —ESE es el borde—, la cabecera del mes
   trae la fecha de cierre, la agenda tiene sus filas de «Abre» y «Cierra», y
   la banda del año lleva la barra ámbar. Una marca que hay que buscar no está
   informando; está decorando. */
.cal__day--mercado { background: var(--bg-row); }
.cal__day--mercado.cal__day--fuera { background: var(--ink-850); }

/* --------------------------------------------------------------------------
   LA PASTILLA DEL TURNO
   --------------------------------------------------------------------------
   Un renglón por turno, con el icono y el nombre de la sesión. Lo que dice el
   brillo es la CARGA —ver `pesoDelActo()` en `inicio.js`— y no la familia: el
   acento tiene tres trabajos en este sistema y colorear un calendario no es
   ninguno de los tres.

   Alto de 16px y `line-height` de 1: dos pastillas, el número del día y el aire
   de la celda son exactamente los 72px de la fila, y ese número es el que deja
   las seis semanas de diciembre dentro de la pantalla sin scroller.
   -------------------------------------------------------------------------- */

.cal__acto {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  min-width: 0;
  height: 15px;
  padding: 0 3px;
  border-radius: var(--r-hair);
  font-size: var(--fs-2xs);
  font-weight: 600;
  line-height: 1;
  color: var(--text-muted);
}
.cal__acto span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cal__acto .i { width: 10px; height: 10px; flex: none; color: var(--icon-quiet); }

/* Los tres escalones de carga. El de arriba es el único con superficie: en una
   semana de siete renglones lo que se busca con el ojo es dónde están los dos
   días duros, y una superficie se encuentra sin leer. */
.cal__acto[data-peso='alto'] {
  background: var(--bg-raised);
  color: var(--text-primary);
}
.cal__acto[data-peso='alto'] .i { color: var(--text-secondary); }
.cal__acto[data-peso='medio'] { color: var(--text-secondary); }
.cal__acto[data-peso='bajo'] { color: var(--text-disabled); }
.cal__acto[data-peso='bajo'] .i { color: var(--text-disabled); }

/* --------------------------------------------------------------------------
   EL BLOQUE DEL PARTIDO
   --------------------------------------------------------------------------
   La única cosa de la retícula con superficie propia, y por eso el día de
   compromiso se encuentra sin leer el mes entero. En el mismo renglón que
   ocupa una pastilla de entrenamiento entran la marca de la competición, el
   escudo del rival, su nombre y de qué lado se juega —o el marcador, cuando ya
   se jugó—, que es la forma que tiene en la captura de FM26.

   Va en el lavado del acento y no en relleno pleno, que es la misma decisión
   que ya estaba tomada para el bloque de la tira de quince días: una celda con
   un bloque de acento sólido se leería como la celda SELECCIONADA.
   -------------------------------------------------------------------------- */

.cal__pase {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  min-width: 0;
  height: 19px;
  padding: 0 var(--sp-2);
  border-radius: var(--r-sm);
  background: var(--accent-wash);
  font-size: var(--fs-2xs);
  font-weight: 600;
  line-height: 1;
  color: var(--text-primary);
}
/* De visitante el bloque se apaga: la diferencia entre jugar en tu cancha y
   jugar afuera es la primera cosa que un DT mira en un mes. La cancha neutral
   va con el de visitante porque tampoco es tu casa. */
.cal__pase[data-sede='V'],
.cal__pase[data-sede='N'] { background: var(--bg-raised); color: var(--text-secondary); }

.cal__pase-rival {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cal__pase .crest { width: 12px; height: 14px; flex: none; --halo: 0.25px; }
/* La letra de la sede, al fondo de la casilla. `margin-left: auto` y no
   `justify-content: space-between`: con el nombre del rival encogiéndose, el
   reparto por espacio le regala al nombre el sitio que no tiene. */
.cal__pase-sede { flex: none; margin-left: auto; color: var(--text-muted); }
.cal__pase[data-sede='L'] .cal__pase-sede { color: var(--accent-texto); }

/* Y LA LETRA SE VA CUANDO LA COLUMNA SE ESTRECHA. En una ventana de 1280 la
   celda mide 93px de los que el bloque gasta 36 en el escudo y el aire: al
   nombre del rival le quedaban cuarenta y cinco, o sea siete letras.

   Paga la letra porque el fondo del bloque YA dice si se juega en casa —lavado
   del acento contra superficie levantada— así que es el único dato del renglón
   que está escrito dos veces en el mismo renglón. Lo que se pierde es la
   diferencia entre visitante y cancha neutral, y eso lo contestan el panel del
   día de abajo y la lista de la derecha, las dos a un golpe de vista.

   La consulta es por el ancho de la COLUMNA DEL MES y no de la ventana, igual
   que en la programación y en la clasificación: lo que decide si el nombre
   entra es el sitio que tiene la celda, y ese sitio cambia con el ancho de la
   ventana pero también con el de la lista de al lado. */
.agenda__mes { container: mes / inline-size; }

@container mes (max-width: 800px) {
  .cal__pase-sede { display: none; }
}

/* Sobre la celda de hoy —que ya está teñida con el acento— el bloque de local
   sube un paso o desaparece dentro de su propio fondo. El de visitante NO
   sube: subido al lavado del acento se vería idéntico a uno de local, y el día
   que más se mira del mes es justamente hoy. */
.cal__day--hoy .cal__pase { background: var(--accent-wash-hi); }
.cal__day--hoy .cal__pase[data-sede='V'],
.cal__day--hoy .cal__pase[data-sede='N'] { background: var(--ink-800); }

.cal__day--libre .cal__acto { color: var(--text-disabled); }

/* El marcador de un día jugado, en la celda. Reusa la banda de la tabla de
   programación: verde, gris o arcilla según de qué lado quedó. */
.cal__res {
  flex: none;
  margin-left: auto;
  padding: 0 var(--sp-2);
  border-radius: var(--r-hair);
  font-size: var(--fs-2xs);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.cal__res[data-band='good'] { background: var(--tint-good); color: var(--verde-200); }
.cal__res[data-band='bad']  { background: var(--tint-bad);  color: var(--clay-300); }
.cal__res[data-band='ok']   { background: var(--bg-raised); color: var(--text-secondary); }

/* --------------------------------------------------------------------------
   EL DÍA ELEGIDO
   --------------------------------------------------------------------------
   Debajo del mes y no en un diálogo: elegir un día tiene que poder hacerse
   quince veces seguidas mientras se busca un hueco, y quince diálogos que se
   abren y se cierran son quince interrupciones.
   -------------------------------------------------------------------------- */

.dia {
  display: grid;
  gap: var(--sp-3);
  min-height: 76px;
  align-content: start;
  padding: var(--sp-5);
  background: var(--bg-panel);
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-sm);
}
.dia__titulo { font-size: var(--fs-md); font-weight: 600; color: var(--text-primary); }
.dia__linea { font-size: var(--fs-sm); color: var(--text-secondary); }
.dia__linea strong { color: var(--text-primary); font-weight: 600; }
.dia__nota { font-size: var(--fs-xs); color: var(--text-muted); }
.dia__acciones { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: var(--sp-2); }

/* --------------------------------------------------------------------------
   TODOS LOS COMPROMISOS
   --------------------------------------------------------------------------
   La lista larga que el juego no tenía. La tira de Programación muestra seis
   partidos alrededor de hoy y la vista de temporada completa, sólo partidos.
   Acá entra TODO lo que le pasa al club en el año, hitos incluidos, porque el
   cierre del mercado es un compromiso tanto como un sábado.
   -------------------------------------------------------------------------- */

.agenda__lista { display: grid; gap: var(--sp-4); min-width: 0; }
/* Y contenedor propio, igual que el mes: las dos columnas crecen a ritmos
   distintos —1,62 contra 0,85— y lo que decide si un renglón puede permitirse
   una letra más grande es el ancho de SU columna. */
.agenda__lista { container: lista / inline-size; }

.agenda__scroll {
  display: grid;
  align-content: start;
  /* Medido contra la columna de la izquierda: un mes de seis semanas más su
     cabecera y el panel del día. La lista termina donde termina el mes, que es
     lo que hace que la vista entera quepa sin scroll de página. */
  max-height: 470px;
  overflow-y: auto;
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-sm);
}

/* La cabecera de mes es sticky dentro del scroller: en una lista de sesenta
   filas, perder el mes es perder la fecha. Misma regla que la bandeja. */
.ag__mes {
  position: sticky;
  top: 0;
  z-index: 1;
  padding: var(--sp-2) var(--sp-4);
  background: var(--ink-900);
  border-bottom: 1px solid var(--line-hairline);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
}

.ag {
  display: grid;
  /* La columna del medio son 20px y no 16: es la del escudo del rival y la del
     logo de la competición, o sea las dos cosas de este renglón que se
     reconocen sin leer. A 16 el logo de una liga es una mancha; a 20 se lee, y
     el renglón mide lo mismo —cincuenta— porque quien manda en su alto son las
     dos líneas de texto de al lado y no el icono. */
  grid-template-columns: 52px 20px minmax(0, 1fr) auto;
  /* LOS TRES DE LOS COSTADOS SE ALINEAN CON EL RENGLÓN DEL NOMBRE, no con el
     centro de la fila. La columna del medio lleva DOS renglones —el nombre y
     el pie— y las otras tres uno solo: centrados en la fila, el logo de la
     competición caía entre las dos líneas, unos cuatro píxeles por debajo del
     escudo del rival que tiene al lado. Con el logo en 28 eso deja de leerse
     como un matiz y se lee como un renglón torcido. La fecha y la hora, igual.

     `--ag-linea` es el alto del renglón del nombre —lo manda el escudo, que es
     más alto que la letra— y los tres se centran DENTRO de esa altura: el eje
     del logo, el del escudo, el de la fecha y el de la hora pasan a ser uno
     solo, y el pie cuelga debajo sin arrastrar a nadie. */
  --ag-linea: 20px;
  align-items: start;
  gap: var(--sp-3);
  width: 100%;
  padding: var(--sp-3) var(--sp-4);
  border: 0;
  border-bottom: 1px solid var(--line-hairline);
  background: transparent;
  text-align: left;
  color: inherit;
  font: inherit;
  transition: background var(--dur-fast) var(--ease);
}
.ag:last-child { border-bottom: 0; }
@media (hover: hover) {
  .ag:hover { background: var(--bg-hover); }
}
.ag:focus-visible { outline-offset: -2px; }
.ag[aria-current='true'] { background: var(--bg-selected); }

.ag__dia { font-size: var(--fs-xs); color: var(--text-muted); font-variant-numeric: tabular-nums; }
.ag[aria-current='true'] .ag__dia { color: var(--accent-strong); font-weight: 700; }
.ag__dia,
.ag__marca,
.ag__nombre,
.ag__saldo,
.ag > .kickoff,
.ag > .rating { display: flex; align-items: center; min-height: var(--ag-linea); }
.ag__marca { color: var(--icon-quiet); }
/* El icono y la marca de liga crecen JUNTOS: comparten columna, y dejar el
   icono en 14 con el logo en 16 desalinea los dos renglones que alternan. */
.ag__marca .i, .ag__marca .logo-liga, .ag__marca img { width: 20px; height: 20px; object-fit: contain; }

.ag__que { display: grid; gap: 1px; min-width: 0; }
.ag__nombre {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-width: 0;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
}
.ag__nombre span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ag__nombre .crest { width: 13px; height: 15px; flex: none; --halo: 0.25px; }
.ag__pie { font-size: var(--fs-2xs); color: var(--text-muted); }

/* Un hito no es un partido y no puede parecerlo: sin escudo, con el nombre en
   Secundario y no en Primario. */
.ag[data-clase='hito'] .ag__nombre { font-weight: 500; color: var(--text-secondary); }
.ag[data-clase='libre'] .ag__nombre { font-weight: 500; color: var(--text-disabled); }

.ag__saldo { font-size: var(--fs-xs); font-variant-numeric: tabular-nums; color: var(--text-muted); }
.ag__saldo[data-signo='mas'] { color: var(--good); }
.ag__saldo[data-signo='menos'] { color: var(--danger); }

/* --------------------------------------------------------------------------
   EL DIÁLOGO DEL AMISTOSO
   --------------------------------------------------------------------------
   Tres decisiones en una pantalla, y las tres tienen que verse a la vez: el
   rival cambia lo que piden, la sede cambia quién paga, y el monto cambia si
   aceptan. Repartirlas en tres pasos habría escondido justamente la relación
   que hace que esto sea una negociación y no un formulario.
   -------------------------------------------------------------------------- */

/* El diálogo del sistema mide 420px, que es lo correcto para una pregunta de
   sí o no. Este no es una pregunta: son tres mandos y un resumen que se mueve,
   y a 420px las tres sedes se pisan. Se ensancha con una variante y no
   tocando `.dialogo`, para que la caja de confirmar siga midiendo lo que mide. */
.dialogo--trato { width: min(680px, calc(100vw - 2 * var(--sp-6))); }

.trato { display: grid; gap: var(--sp-5); }
.trato__campo { display: grid; gap: var(--sp-3); }
.trato__campo > .label { color: var(--label-color); }

.trato select,
.trato input[type='number'] {
  width: 100%;
  padding: var(--sp-3) var(--sp-4);
  background: var(--bg-raised);
  border: 1px solid var(--line);
  border-radius: var(--r-xs);
  color: var(--text-primary);
  font: inherit;
  font-size: var(--fs-md);
}
@media (hover: hover) {
  .trato select:hover,
  .trato input[type='number']:hover { border-color: var(--line-strong); }
}

.trato__sedes { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-3); }
.trato__sede {
  display: grid;
  gap: var(--sp-1);
  padding: var(--sp-3) var(--sp-4);
  background: var(--bg-raised);
  border: 1px solid var(--line);
  border-radius: var(--r-xs);
  text-align: left;
  color: var(--text-secondary);
  font: inherit;
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
@media (hover: hover) {
  .trato__sede:hover { border-color: var(--line-strong); }
}
.trato__sede[aria-pressed='true'] {
  background: var(--accent-wash);
  border-color: var(--accent-line);
  color: var(--text-primary);
}
.trato__sede strong { font-size: var(--fs-md); font-weight: 600; }
.trato__sede small { font-size: var(--fs-2xs); color: var(--text-muted); }

/* El resumen del trato. Es lo único de la pantalla que se mueve solo cuando
   tocás cualquiera de los tres mandos, y por eso vive aparte y con borde:
   es el efecto, no un cuarto mando. */
.trato__saldo {
  display: grid;
  gap: var(--sp-2);
  padding: var(--sp-4) var(--sp-5);
  background: var(--bg-row);
  border-radius: var(--r-xs);
}
.trato__cifra { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-4); }
.trato__cifra strong { font-size: var(--fs-2xl); font-weight: 700; font-variant-numeric: tabular-nums; }
.trato__cifra strong[data-signo='mas'] { color: var(--good); }
.trato__cifra strong[data-signo='menos'] { color: var(--danger); }
.trato__desglose { font-size: var(--fs-xs); color: var(--text-muted); }

/* La respuesta del club, en palabras y no en un número. Ver `agenda.js`: la
   franja del medio existe para que el regateo sea una decisión y no una
   cuenta, y dibujar la frontera exacta la resolvería. */
.trato__animo { font-size: var(--fs-sm); font-weight: 600; }
.trato__animo[data-r='si'] { color: var(--good); }
.trato__animo[data-r='quiza'] { color: var(--warn); }
.trato__animo[data-r='no'] { color: var(--danger); }

/* --------------------------------------------------------------------------
   Y EN UNA VENTANA ALTA, LA VISTA SE ESTIRA HASTA EL BORDE
   --------------------------------------------------------------------------
   Toda la geometría de arriba está escrita contra el alto que FALTA: la celda
   con su piso de 64, la lista con su techo de 470, el reparto medido para que
   el panel del día entre en una ventana de 800. En una ventana de 1000 o de
   1400 esos mismos números dejan de ser un piso y pasan a ser un tope: la
   tarjeta ocupa el alto entero —`.tarjeta--grow`— y adentro la agenda medía
   536 de 828, o sea casi trescientos píxeles de nada debajo de una lista con
   sesenta filas que no entran y un mes de celdas apretadas.

   El sobrante se reparte entre las dos únicas cosas que saben qué hacer con
   él: las semanas del mes —las celdas crecen todas lo mismo, y su contenido
   sigue arriba— y el scroller de la lista, que termina donde termina el mes,
   que es lo que ya prometía el comentario de `.agenda__scroll`. El panel del
   día no crece: mide lo que dice.

   VA EN UNA MEDIA QUERY Y NO SUELTO, y el umbral no es de gusto: es
   exactamente cuándo el `body` tiene un alto definido. Por debajo de 1401 de
   ancho o de 891 de alto manda el documento (ver RESPUESTA A PANTALLA y LA
   VENTANA BAJA), y sin alto que repartir un `1fr` mide su contenido — o sea
   que la lista pasaría a medir sus 2.650px de sesenta filas y estiraría la
   página. Ahí siguen mandando los techos de siempre. */
@media (min-width: 1401px) and (min-height: 891px) {
  .home[data-vista='calendario'] .agenda {
    /* basis 0 y no auto, por lo mismo que `.home`: con basis auto el alto de
       la agenda sale de su contenido, el contenido son filas en `1fr` y esas
       filas vuelven a preguntar por el alto de la agenda. El bucle se corta
       midiendo max-content —celdas de 508px y la lista de 2.650— y desborda
       la tarjeta. Con basis 0, la agenda recibe el hueco que sobra, ese hueco
       es un alto definido, y recién ahí un `1fr` significa una fracción. */
    flex: 1 1 0;
    grid-template-rows: minmax(0, 1fr);
    align-items: stretch;
  }
  /* Cabecera y panel del día miden lo suyo; el mes se lleva el resto. */
  .home[data-vista='calendario'] .agenda__mes { grid-template-rows: auto minmax(0, 1fr) auto; }
  /* El piso de 64 sigue siendo el piso: `1fr` es el techo, no el alto. */
  .home[data-vista='calendario'] .calendar--mes { grid-auto-rows: minmax(64px, 1fr); }
  /* Título y segmentado miden lo suyo; el scroller se lleva el resto. */
  .home[data-vista='calendario'] .agenda__lista { grid-template-rows: auto auto minmax(0, 1fr); }
  .home[data-vista='calendario'] .agenda__scroll { max-height: none; }

  /* --------------------------------------------------------------------
     LA CELDA SABE SI TIENE SITIO
     --------------------------------------------------------------------
     Todo lo que sigue —el bloque del partido en dos renglones, el nombre en
     dos líneas, la letra un escalón más grande— se paga en ALTO DE CELDA, y la
     celda no siempre lo tiene: un mes de seis semanas reparte el mismo hueco
     entre seis filas en vez de cinco. Medido a 1600: en febrero la celda mide
     103 y en septiembre 84, y a 1600x895 —el borde de esta media query— son 71.
     Un bloque de dos renglones necesita 93 y ahí se desbordaba: cinco celdas
     de septiembre pintando por fuera de su casilla.

     Así que la puerta la abre la celda misma. `container-type: size` se puede
     acá y no en la vista suelta porque el alto de la fila sale de `1fr`, o sea
     del hueco de la retícula y no de lo que la celda lleve adentro: contener
     el tamaño no le quita nada y no hay bucle posible. En una ventana donde la
     página scrollea la fila mide su contenido, y ahí esto sería un cero.

     Son dos puertas y no una porque son dos gastos distintos, y los dos números
     están MEDIDOS forzando cada paso en una ventana donde nada se recorta: el
     bloque de dos renglones necesita 84px de contenido y con el escalón de
     letra 89,2. Las puertas van en 86 y 91 —tres y dos de margen— y se miden
     contra la CAJA DE CONTENIDO, que es lo que una consulta de contenedor mira:
     la celda tiene 10px de relleno vertical, así que una fila de 103 pregunta
     con 93. Ese detalle costó una vuelta: con las puertas puestas en el alto de
     la FILA no abría ninguna y todo el trabajo quedaba apagado, que es la clase
     de error que se ve como «no pasó nada».

     Y cada puerta necesita ADEMÁS su ancho —la columna del mes—, que es la otra
     mitad de la misma pregunta: el renglón entero no sirve de nada si la
     palabra no entra. Un mes cambia de forma entero, nunca celda por celda,
     porque las seis filas miden lo mismo. */
  .home[data-vista='calendario'] .calendar--mes .cal__day { container: celda / size; }

  /* EL BLOQUE DEL PARTIDO PASA A DOS RENGLONES, Y EL NOMBRE SE LEE ENTERO.
     --------------------------------------------------------------------
     «Un renglón y no dos» (ver EL BLOQUE DEL PARTIDO) se decidió contra el
     alto que faltaba: la segunda línea costaba doce píxeles por fila y seis
     semanas de eso dejaban el panel del día fuera de la ventana. Donde el alto
     no falta la cuenta se da vuelta: esos píxeles ya están pagados y en su
     lugar hay aire.

     Y lo que compran es lo único que la retícula del mes NO decía: contra
     quién se juega. Medido a 1600, al nombre le quedaban 56px de los 157 que
     mide «Independiente Rivadavia»; con el renglón entero para él son 107 y
     entra en dos líneas. `break-word` es para el club cuyo apellido no entra
     ni solo en una línea —«Mönchengladbach»—, que se parte en vez de cortarse
     sin avisar.

     El ancho es del contenedor del mes, igual que la letra de la sede: a 900 de
     columna el renglón del nombre da 99px e «Independiente» mide 92 en trece. */
  @container mes (min-width: 900px) {
    @container celda (min-height: 86px) {
      .cal__pase {
        display: grid;
        grid-template-columns: auto minmax(0, 1fr) auto;
        align-items: center;
        row-gap: 1px;
        height: auto;
        padding: var(--sp-2);
      }
      /* El escudo crece con el bloque: en doce píxeles un escudo es una mancha
         de color y a veinte es el club. Es la medida de `.crest--sm` más un
         escalón, con su halo en la misma proporción (ver `app.css`). */
      .cal__pase .crest { width: 20px; height: 22px; --halo: 0.36px; }
      .cal__pase-rival {
        grid-column: 1 / -1;
        white-space: normal;
        overflow-wrap: break-word;
        line-height: 1.15;
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 2;
      }
      /* La sede y el marcador se quedan en el primer renglón, al fondo, que es
         donde estaban: lo que se mudó abajo es el nombre. */
      .cal__pase-sede,
      .cal__res { grid-column: 3; grid-row: 1; }
    }
  }

  /* --------------------------------------------------------------------
     Y CON MUCHO SITIO, LA LETRA SUBE UN ESCALÓN
     --------------------------------------------------------------------
     La escala de esta pantalla se fijó contra una celda de 122px de ancho. En
     una ventana de 2000 la celda mide 151 y la letra sigue siendo la misma: el
     mes se lee como una miniatura de sí mismo, con un escudo de 20px flotando
     en una celda de 103 de alto. Acá sube un escalón —13 a 14 en las pastillas
     y en el bloque, 15 a 16 en el número del día— y el escudo pasa a 24.

     EL ANCHO SALE DE LA PALABRA MÁS LARGA. El renglón del nombre mide
     `(columna − 70) / 7 − 20`; a 950 son 105,7 e «Independiente» mide 98,3 en
     catorce, o sea siete de margen. Por debajo, la letra grande le comería a
     la palabra el sitio que la línea nueva le acaba de dar, que es cambiar una
     mejora por otra. A 1600 de ventana la columna mide 960 y entra; a 1440
     mide 830 y no. */
  @container mes (min-width: 950px) {
    @container celda (min-height: 91px) {
      .cal__num { font-size: var(--fs-md); }
      .cal__acto { font-size: var(--fs-xs); }
      .cal__acto .i { width: 12px; height: 12px; }
      .cal__pase, .cal__res { font-size: var(--fs-xs); }
      .cal__pase .crest { width: 24px; height: 26px; --halo: 0.43px; }
    }

    /* Fuera de la celda no hay nada que se pueda desbordar, así que a estos
       les alcanza con el ancho. EL RÓTULO DEL CARRIL NO SUBE Y EL NÚMERO SÍ:
       el carril mide 62 y «Reducido» —la palabra más larga que puede caer
       ahí— mide 60 en trece y 64 en catorce, o sea que subirlo obligaría a
       ensancharlo, y ese ancho sale de los siete días, que es de donde no se
       puede sacar (ver LA RETÍCULA DEL MES). */
    .cal__sem b { font-size: var(--fs-lg); }
    .dia__titulo { font-size: var(--fs-lg); }
    .dia__linea { font-size: var(--fs-md); }
    .dia__nota { font-size: var(--fs-sm); }
  }

  /* --------------------------------------------------------------------
     Y LA LISTA, CON SU PROPIA PUERTA
     --------------------------------------------------------------------
     El renglón de la lista se queda sin sitio por el nombre del rival, que ahí
     va en UNA sola línea y no puede envolver: «Gimnasia y Esgrima La Plata»
     mide 217 en dieciséis en negrita. A 480 de columna el hueco del nombre da
     221; a 456 —una ventana de 1440— da 205 y lo recorta, que es exactamente
     lo que pasó al ensanchar la columna de la fecha. Por debajo de la puerta
     la lista se queda con el escalón anterior, que ya es más grande que el de
     antes de todo esto.

     Lo que manda el alto del renglón son sus dos líneas de texto, así que
     crece de 50 a 54 y la lista muestra dos filas menos: eso es lo que cuesta
     poder leerlas. */
  @container lista (min-width: 480px) {
    /* El renglón crece con lo más alto que lleva, que es el LOGO de 28 y no el
       escudo de 24: con la altura puesta en 24 el logo la excedía por dos por
       arriba y por dos por abajo, y su centro caía dos píxeles más bajo que el
       del escudo. Dos, no cuatro — pero el arreglo cuesta lo mismo. */
    .ag { grid-template-columns: 94px 28px minmax(0, 1fr) auto; --ag-linea: 28px; }
    .ag__marca .i,
    .ag__marca .logo-liga,
    .ag__marca img { width: 28px; height: 28px; }
    .ag__mes { font-size: var(--fs-xs); }
    /* LA FECHA EN VERSALITAS Y EN UN RENGLÓN. El día de la semana es una etiqueta
       —«sáb», «mié»— y este sistema escribe las etiquetas en versalitas; en 52px
       además se partía en dos («sáb» arriba, «13/2» abajo), que es un renglón de
       alto regalado en cada una de las cincuenta filas. Los 94 salen de medir las
       cincuenta: la más ancha es «SÁB 12/10» con 90 en versalitas. El primer
       intento fue 76 —el ancho de un «SÁB 13/2»— y recortaba veintiséis de las
       cincuenta: en una columna de fechas la peor es la de dos dígitos y mes de
       dos dígitos, no la del medio. */
    .ag__dia {
      font-size: var(--fs-sm);
      font-weight: 600;
      letter-spacing: var(--tracking-label);
      text-transform: uppercase;
      white-space: nowrap;
    }
    /* El nombre del rival es LO que se busca en esta lista: 700 y no 600, que es
       el mismo peso que la tabla de clasificación le da al club. */
    .ag__nombre { font-size: var(--fs-md); font-weight: 700; }
    .ag__nombre .crest { width: 22px; height: 24px; --halo: 0.4px; }
    /* Y EL PIE, EN VERSALITAS. «J2 · de visitante» son dos etiquetas y no una
       frase; en versalitas dejan de competir con el nombre de arriba —que es lo
       que se lee primero— y el renglón pasa a tener dos alturas claras en vez de
       dos textos parecidos. */
    .ag__pie {
      font-size: var(--fs-2xs);
      font-weight: 600;
      letter-spacing: var(--tracking-label);
      text-transform: uppercase;
    }
    /* La hora y el marcador, tabulares y en 700: es la columna que se lee en
       vertical, y una cifra que se lee en vertical tiene que alinear y pesar. */
    .ag__saldo { font-size: var(--fs-sm); font-weight: 700; }
  }

  /* Y LA BANDA DEL AÑO, que no está en ninguno de los dos contenedores: mide
     el ancho entero de la tarjeta, y con la ventana en 1401 ya le sobra sitio
     a cualquiera de sus rótulos. Las dos pistas crecen con la letra: una barra
     de 12px con una palabra de 14 adentro la deja fuera de su propia caja. */
  .home[data-vista='calendario'] .anio__tramo,
  .home[data-vista='calendario'] .anio__ventana { font-size: var(--fs-xs); }
  .home[data-vista='calendario'] .anio__pista { height: 26px; }
  .home[data-vista='calendario'] .anio__ventanas { height: 16px; }
  .home[data-vista='calendario'] .anio__pie .dato__valor { font-size: var(--fs-md); }
}

@media (max-width: 1180px) {
  .agenda { grid-template-columns: minmax(0, 1fr); }
  .agenda__scroll { max-height: 360px; }
}

/* --------------------------------------------------------------------------
   PARTIDOS
   -------------------------------------------------------------------------- */


.kickoff { color: var(--text-secondary); font-weight: 600; font-variant-numeric: tabular-nums; }


/* `.zone-chip` se mudó a `app.css` el día que la fase de grupos de la
   Libertadores necesitó la misma franja. La regla del sistema es explícita: una
   regla sube cuando la usa una segunda pantalla. */


/* --------------------------------------------------------------------------
   RESPUESTA A PANTALLA
   Estructural: las columnas se repliegan, la tipografía no se toca.
   -------------------------------------------------------------------------- */

/* Anclar la pantalla al alto de la ventana sólo se sostiene mientras las tres
   columnas caben una al lado de la otra. En cuanto se apilan, el mismo alto
   tiene que repartirse entre más filas y el contenido se recorta. A partir de
   acá manda el documento: la página scrollea y cada columna mide lo que mide,
   con un techo para los dos listados largos. */
@media (max-width: 1400px) {
  body { height: auto; min-height: var(--alto-ventana); overflow: visible; }
  /* basis 0 sólo tiene sentido cuando hay un alto que repartir. Con el
     documento suelto, la retícula vuelve a medir lo que mide su contenido:
     si no, se queda corta y las columnas se recortan entre sí. */
  .home { flex: 0 0 auto; grid-template-columns: minmax(300px, 0.9fr) minmax(400px, 1.2fr); }
  .col { min-height: auto; }
  .inbox { flex: 0 1 auto; max-height: 460px; }
  /* Y LA BANDEJA DEJA PASAR EL GESTO (28/9/2026). Acá la página rueda y la
     bandeja conservaba el `contain` de la pantalla anclada: al llegar al último
     mensaje el gesto moría ahí. En el teléfono es la primera caja y ocupa casi
     toda la primera pantalla —420 de 812—, así que deslizando sobre ella la
     página no bajaba nunca. Es el diagnóstico que ya está escrito en `app.css`
     para `.table-scroll` (21/9): donde la página rueda, `contain` sólo traba. */
  .inbox { overscroll-behavior: auto; }
}

/* LA VENTANA BAJA
   --------------------------------------------------------------------------
   El mismo problema que el ancho, en el otro eje. La columna del medio pide
   unos 760px de alto —noticia, dúo y calendario— y con el chrome de dos pisos
   eso son unos 895 de ventana: en cualquier portátil sobra pantalla a lo ancho
   y falta a lo alto. Lo que faltaba lo pagaba la tira de quince días, el único
   panel que estira, con media semana recortada por abajo.

   La respuesta NO es scrollear —la promesa de esta pantalla es que todo se ve
   de una vez— sino apretar el aire, que es lo único que sobra: el canalón, el
   acolchado de las tarjetas y, sobre todo, la tira, que pasa a un renglón por
   día —número a la izquierda, marcas a la derecha— en vez de dos. Se ven los
   catorce días enteros y ninguna letra cambia de tamaño. */
@media (min-width: 1401px) and (max-height: 900px) {
  .home { gap: var(--sp-4); padding: var(--sp-4); }
  .tarjeta { gap: var(--sp-4); padding: var(--sp-4) var(--sp-5) var(--sp-5); }
}

/* Y EL CALENDARIO SE APRIETA ANTES: HASTA 1040 Y NO HASTA 900.
   --------------------------------------------------------------------------
   Los 900 salían de cuándo la columna deja de entrar ENTERA. Pero la cuenta
   cambió el día que la noticia dejó de poder achicarse hasta desaparecer: lo
   que hay que preguntar ya no es «¿entra todo?» sino «¿entra todo con una
   noticia entera adentro?», y eso pasa a los 1040. Entre 900 y 1040 no
   desbordaba nada y sin embargo la placa salía cortada, que es el defecto que
   nadie miraba porque la pantalla se veía completa.

   La leyenda de las marcas es lo otro que cede, y son 46px que a 1440x900
   deciden entre una noticia entera y una noticia partida.

   Y AHORA LA LEYENDA ES DE ESTA VISTA Y DE NINGUNA OTRA. Este comentario decía
   lo contrario —«la pantalla de Calendario la conserva siempre»— y era cierto
   mientras las dos retículas dibujaran glifos. Desde que la del mes escribe el
   nombre de cada sesión dentro de su pastilla, la leyenda ahí explicaría
   símbolos que ya no están; la tira de quince días del vistazo general sigue
   siendo de glifos —la celda mide 58px y no entra otra cosa— y es el único
   sitio donde hace falta. Por eso la etiqueta `solo-vistazo` en el marcado, y
   por eso esta regla puede seguir apagándola cuando la ventana aprieta: lo que
   se pierde es la traducción de catorce glifos que el panel del día de abajo
   sigue escribiendo con todas sus letras. */
@media (min-width: 1401px) and (max-height: 1040px) {
  /* El día en una línea: el número y sus marcas dejan de apilarse. Es la misma
     información con la mitad del alto, y el que estaba encima de todo —qué
     pasa el sábado— sigue leyéndose igual de rápido. */
  .home[data-vista='general'] .cal--quincena .cal__day {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    min-height: 34px;
    padding: var(--sp-2) var(--sp-3);
  }

  .home[data-vista='general'] .cal-legend { display: none; }
}

/* Y si ni apretada entra —una ventana de portátil viejo, o un día con seis
   partidos en el dúo— manda el documento y la página scrollea, igual que
   cuando las columnas se apilan. Recortar nunca.

   EL UMBRAL SUBE DE 700 A 890, y es la misma regla contestando a una pregunta
   que cambió. Los 700 medían cuándo la columna deja de entrar; desde que la
   noticia no puede achicarse hasta desaparecer, lo que hay que medir es cuándo
   deja de entrar CON UNA NOTICIA ENTERA adentro, y a 1440 de ancho eso pasa a
   los 890: medido, la tarjeta de titulares recibe 238px a 860 y necesita 300.
   Entre 700 y 890 la pantalla se veía completa y la noticia salía partida —el
   defecto no se veía como un error, se veía como una noticia mal escrita. */
@media (min-width: 1401px) and (max-height: 890px) {
  body { height: auto; min-height: var(--alto-ventana); overflow: visible; }
  .home { flex: 0 0 auto; }
  .col { min-height: auto; }
  /* Sin un alto que repartir, los dos listados largos necesitan techo, y acá
     el techo es una fracción de la ventana y no un número fijo: la ventana ya
     es baja y un tope de 460px la haría scrollear de más. */
  .inbox { flex: 0 1 auto; max-height: 45dvh; }
}

@media (max-width: 1080px) {
  .duo { grid-template-columns: 1fr; }
}

@media (max-width: 860px) {
  .home { grid-template-columns: 1fr; }
  .news__panel, .news__panel--diario { grid-template-columns: minmax(0, 1fr); }
  .col { min-height: auto; }
  .inbox { max-height: 420px; }
  .news__mark { display: none; }
  /* El recorte de tabla no se esconde como el ornamento: son puntos, y en el
     teléfono pasa a ser una franja debajo de la nota. */
  .recorte { width: auto; }
  .xpost__datos { flex-wrap: wrap; }
  .xpost__barra { gap: var(--sp-7); }
  .calendar { grid-template-columns: repeat(7, minmax(38px, 1fr)); }
  /* EL MES TIENE OCHO CASILLAS POR FILA, no siete: el carril de la fecha y los
     siete días. La regla de arriba es para la quincena y, por venir después y
     pesar lo mismo, también le ponía siete al mes: cada fila se corría una
     casilla, «DOM» caía debajo del hueco del carril y la «Fecha» iba bajando
     en diagonal por los días. Así se veía en todo teléfono desde que existe el
     carril, y en la computadora nunca, porque esto sólo vale bajo 860. */
  .calendar--mes { grid-template-columns: 44px repeat(7, minmax(0, 1fr)); }
  .calendar--mes .cal__sem { padding: var(--sp-2) 2px; }
  .cal__day { min-height: 48px; }
}


/* --------------------------------------------------------------------------
   LAS VISTAS DE LA BARRA
   --------------------------------------------------------------------------
   La misma pantalla, recortada. Cada solapa deja a la vista un panel y esconde
   los demás; en vez de una regla por panel, se esconde todo lo que NO es el
   elegido. Es una línea por vista y, sobre todo, cada panel que queda conserva
   su propio `display` — la bandeja sigue siendo flex, el dúo sigue siendo
   grid— en vez de que una regla común se lo imponga a todos.
   -------------------------------------------------------------------------- */

.home:not([data-vista='general']) { grid-template-columns: minmax(0, 1fr); }

.home[data-vista='mensajes'] [data-panel]:not([data-panel~='mensajes']),
.home[data-vista='calendario'] [data-panel]:not([data-panel~='calendario']),
.home[data-vista='noticias'] [data-panel]:not([data-panel~='noticias']),
.home[data-vista='rival'] [data-panel]:not([data-panel~='rival']) { display: none; }

/* Los techos que existen para que tres columnas convivan sobran cuando el
   panel es lo único en pantalla: son justo lo que el DT vino a mirar. */
.home[data-vista='mensajes'] .inbox { max-height: none; }

/* Y el dúo de rival y partidos de hoy, con una columna sola, se lee mejor
   partido en dos que estirado a lo ancho de la ventana. */
.home[data-vista='rival'] .duo { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }

/* --------------------------------------------------------------------------
   EL CORREO
   --------------------------------------------------------------------------
   En la vista Mensajes la bandeja y el lector son las dos únicas columnas. El
   buscador y «marcar todo» aparecen sólo ahí: en el vistazo general la bandeja
   es una tira de titulares, y dos controles más serían dos que nadie usa.
   -------------------------------------------------------------------------- */

.solo-correo { display: none; }
.home[data-vista='mensajes'] .solo-correo { display: flex; }
/* Los iconos de la cabecera son retícula y no caja flexible: sin esta línea
   heredarían el `display: flex` de arriba, y `place-items` deja de centrar
   horizontalmente en cuanto el contenedor es flex — el glifo quedaba pegado a
   la izquierda de su cuadrado de 26. */
.home[data-vista='mensajes'] .icon-btn.solo-correo { display: grid; }

/* --------------------------------------------------------------------------
   LOS CUATRO DE LA CABECERA DE LA BANDEJA
   --------------------------------------------------------------------------
   `.panel__head` alinea por `baseline`, que es lo correcto para un título y su
   eco de texto, pero manda los botones media línea abajo. Se los alinea al
   centro sin tocar la regla general.
   -------------------------------------------------------------------------- */

.panel__head .col__tools { align-self: center; }

/* Apagado de verdad: «marcar todo como leído» sin nada por marcar. Se le quita
   también el hover, o al pasar por encima seguiría diciendo que se puede. */
.col__tools .icon-btn:disabled { color: var(--text-disabled); cursor: default; }
@media (hover: hover) {
  .col__tools .icon-btn:disabled:hover { background: none; color: var(--text-disabled); }
}

/* La estrella encendida es el filtro puesto, y se pinta con el mismo acento
   con el que se marca todo lo activo en el resto del juego. */
.col__tools .icon-btn[aria-pressed='true'] { color: var(--accent); background: var(--bg-active); }

/* La estrella lleva su contador adentro, así que deja de ser un cuadrado: en
   columna los dos hijos se apilarían uno encima del otro. */
.col__tools .icon-btn[data-filtro] {
  grid-auto-flow: column;
  width: auto;
  gap: var(--sp-1);
  padding: 0 var(--sp-2);
}
.col__tools .icon-btn[data-filtro] .segmented__count { margin-left: 0; }

/* --------------------------------------------------------------------------
   LAS DOS COLUMNAS DEL CORREO VAN DENTRO DE UN `min-width`, Y ÉSE ES EL
   ARREGLO — no una excepción para el teléfono más abajo.
   --------------------------------------------------------------------------
   Esta regla vivía suelta y ganaba en TODAS las anchuras: tiene la misma
   especificidad que `.home:not([data-vista='general'])` —la que deja una sola
   columna— y está escrita después, y más especificidad que el
   `.home { grid-template-columns: 1fr; }` de la media query de 860. O sea que
   a 375 px de ancho la vista Mensajes seguía siendo una retícula de dos
   columnas con un piso duro de 320 en la primera: la bandeja se quedaba con
   los 320 y **al lector le tocaban 4,6 px, fuera de la pantalla**. Medido:
   `319.997px 4.58984px`, con el panel del mensaje en x=357..393 sobre una
   ventana de 375, y la página corriéndose 78 px de costado.

   El síntoma no se leía como un problema de maqueta: se leía como «no se
   pueden abrir los mensajes». El toque SÍ abría el mensaje —marcaba leído,
   bajaba el contador de «Sin leer»— y lo abría donde no se ve, que es la
   misma familia del clic con efectos invisibles que ya está descrita en el
   manejador de la bandeja, en `inicio.js`.

   Encerrarla en `min-width: 861px` la deja mandando donde tiene razón y la
   saca de donde no la tiene, sin depender de en qué renglón de la hoja quedó
   escrita. El 861 no es nuevo: es el otro lado del 860 con el que el portal
   ya declara que se quedó sin ancho para columnas.
   -------------------------------------------------------------------------- */
@media (min-width: 861px) {
  .home[data-vista='mensajes'] { grid-template-columns: minmax(320px, 0.8fr) minmax(0, 1.2fr); }
}

/* --------------------------------------------------------------------------
   EL CORREO EN EL TELÉFONO: LA LISTA **O** EL MENSAJE
   --------------------------------------------------------------------------
   Con una sola columna los dos paneles no pueden estar los dos: apilados, el
   toque en un mensaje deja al DT mirando la misma lista con el mensaje abierto
   trescientos píxeles más abajo, que es otra vez un toque sin efecto visible.

   Así que se turnan, como en cualquier cliente de correo de teléfono: mientras
   no hay nada abierto se ve la bandeja; en cuanto hay uno, el mensaje ocupa la
   pantalla y la vuelta la da el botón de la cabecera. `data-leyendo` lo pone
   `refrescarCorreo()` y es lo único que hace falta saber acá.
   -------------------------------------------------------------------------- */
/* El botón de volver no existe en la pantalla ancha: la bandeja está al lado y
   nunca se fue, así que sería un botón para deshacer algo que no pasó. VA
   ANTES de la media query que lo enciende: las dos declaraciones tienen la
   misma especificidad y la de más abajo gana, así que escrito después apagaba
   el botón también en el teléfono — se vio en la primera medición, con el
   lector ya ocupando la pantalla y sin manera de volver. */
.lector__volver { display: none; }
/* Pegado al título y no en el extremo: es la vuelta de ESTE panel, y en la
   cabecera el extremo derecho ya es de las herramientas. */
.lector__volver { margin-right: calc(var(--sp-2) * -1); }

@media (max-width: 860px) {
  .home[data-vista='mensajes'] { grid-template-columns: minmax(0, 1fr); }
  /* Leyendo: la bandeja se va y queda el mensaje. */
  .home[data-vista='mensajes'][data-leyendo] [data-panel~='mensajes']:not(.lector) { display: none; }
  /* Sin nada abierto: el lector se va y queda la bandeja. Su «Elegí un mensaje
     de la izquierda» además no sería cierto acá —no hay izquierda— y esto lo
     resuelve escondiéndolo en vez de escribir un segundo texto. */
  .home[data-vista='mensajes']:not([data-leyendo]) .lector { display: none; }
  .lector__volver { display: grid; }
}

/* El lector es un panel más y no una capa encima: leer un mensaje no debería
   tapar la lista de la que salió. */
.lector__cuerpo { display: flex; flex-direction: column; gap: var(--sp-5); min-height: 0; overflow: auto; }

.lector__asunto {
  font-size: var(--fs-lg);
  font-weight: 700;
  color: var(--text-primary);
  letter-spacing: -0.01em;
  line-height: var(--lh-snug);
}

.lector__de {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding-bottom: var(--sp-5);
  border-bottom: 1px solid var(--line-hairline);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

.lector__de strong { color: var(--text-primary); }
.lector__para { display: block; font-size: var(--fs-xs); color: var(--text-muted); }

.lector__texto { font-size: var(--fs-sm); color: var(--text-secondary); line-height: var(--lh-body); max-width: 68ch; }
.lector__texto p + p { margin-top: var(--sp-4); }

.lector__firma { font-size: var(--fs-sm); color: var(--text-muted); line-height: var(--lh-body); }
.lector__firma strong { color: var(--text-secondary); }

.lector__acciones,
.lector__gestion { display: flex; flex-wrap: wrap; gap: var(--sp-4); }

/* --------------------------------------------------------------------------
   LAS RESPUESTAS DE UN PLANTEO
   --------------------------------------------------------------------------
   No son botones de acción y no pueden parecerlo: un enlace del correo te
   lleva a otra pantalla y esto CAMBIA EL JUEGO sin moverte de acá. Por eso
   cada una ocupa su propia fila, dice lo que hace en una línea y no hay
   ninguna destacada sobre las otras — la respuesta buena depende del plantel
   que tengas, y marcar una con el acento sería el juego eligiendo por vos.

   Se apilan en columna y no en fila porque se leen COMPARANDO, y tres cajas
   de anchos distintos en una fila obligan a saltar de una a otra para
   encontrar dónde empieza cada texto.
   -------------------------------------------------------------------------- */

.lector__respuestas {
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  max-width: 68ch;
}

/* `.respuesta` SE MUDÓ A `controles.css` EL 16/9/2026, cuando la pantalla de
   Prensa pasó a ser la segunda que contesta un planteo. Acá se quedan los
   contenedores del lector —`.lector__respuestas` y `.lector__respondido`—
   porque son de ESTA pantalla; lo que se fue es el control en sí, que es el
   mismo botón en las dos. Copiarlo habría dejado dos definiciones del mismo
   botón para desincronizarse a la primera. */

/* Lo que pasó al contestar. Va con el acento porque es la única línea del
   mensaje que no estaba escrita de antemano: es la consecuencia de lo que
   acabás de decidir.

   Y lleva el acento como lo lleva el resto del juego —lavado en el fondo y
   `--accent-line` en los cuatro lados, igual que la opción elegida de la mesa
   y la sede del trato— y no como una barra gruesa a la izquierda, que fue lo
   primero que escribí. La barra lateral no existe en ninguna otra pantalla:
   el único borde izquierdo de color del proyecto es el de `.placa`, y ahí es
   el color de UN MEDIO concreto, que es un dato y no un énfasis. */
.lector__respondido {
  margin-top: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  background: var(--accent-wash);
  border: 1px solid var(--accent-line);
  border-radius: var(--r-md);
  color: var(--text-primary);
}

.lector__gestion {
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line-hairline);
  margin-top: auto;
}

/* El destacado se ve en la lista sin abrir el mensaje. */
.msg__tag .i { color: var(--warn); }


/* ==========================================================================
   LA PRETEMPORADA
   --------------------------------------------------------------------------
   Dos superficies y ninguna nueva: el renglón del pie de la banda del año y un
   diálogo que reusa la placa de `preguntar()`. Las dos mesas —la de la gira y
   la de cada amistoso— no ponen una regla acá: son la mesa compartida de
   `mesa.css`, que es todo el punto de que exista.
   ========================================================================== */

/* El quinto bloque de la banda. Va al final del pie, después de la caja,
   porque es el único de los cinco que además ACCIONA: los cuatro de la
   izquierda dicen cómo está el año y éste abre lo que falta decidir. El botón
   vive en la línea del VALOR —al lado de «Sin armar»— y no debajo del rótulo,
   que lo dejaría flotando sin dueño; de eso se ocupa el `gap` del valor. */
/* Sin armar, el renglón se pone ámbar: es la misma tinta con la que la banda
   nombra las ventanas de mercado, y por lo mismo —un plazo que vence—. No es
   acento: no es algo que elegiste ni algo donde estás, que son dos de los tres
   trabajos del acento. */
.anio__pre[data-estado='sin'] strong { color: var(--warn); }

.dialogo--pre { width: min(600px, calc(100vw - 2 * var(--sp-6))); }
/* CUATRO BOTONES EN EL PIE, que es uno más de los que este diálogo lleva en
   cualquier otra parte del juego. Medidos suman 566px de los 568 que hay: entran
   por dos píxeles con la ventana ancha y no entran con una angosta. Se dejan
   envolver antes que recortarse — la misma decisión que ya tomaron las pestañas
   de la clasificación, y por el mismo motivo: un control escondido detrás de un
   desplazamiento horizontal es un control que no existe. */
.dialogo--pre .dialogo__pie { flex-wrap: wrap; }

/* Los cuatro datos de la gira, en la retícula de datos del sistema. */
.pre__datos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: var(--sp-3) var(--sp-5);
  margin-bottom: var(--sp-4);
}
.pre__dato dt {
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
}
.pre__dato dd { font-size: var(--fs-sm); font-weight: 600; color: var(--text-primary); }
.pre__dato dd[data-tono='bueno'] { color: var(--verde-300); }
.pre__dato dd[data-tono='malo'] { color: var(--clay-300); }

/* Lo que la gira va a dejar, en prosa. Es lo único del diálogo que habla del
   plantel y no de la plata, y por eso va suelto y no en la retícula de arriba:
   una cifra más entre cuatro cifras se lee como una cifra más. */
.pre__lectura {
  padding: var(--sp-3) var(--sp-4);
  border-left: 2px solid var(--line-strong);
  background: var(--bg-row);
  font-size: var(--fs-sm);
  line-height: var(--lh-body);
  color: var(--text-secondary);
}
.pre__lectura strong { color: var(--text-primary); }

.pre__rotulo { margin-top: var(--sp-5); margin-bottom: var(--sp-3); }

.pre__lista { display: grid; gap: 1px; background: var(--line-hairline); border-radius: var(--r-sm); overflow: hidden; }

/* Un renglón por amistoso. Es la misma familia que la fila de la agenda —día,
   escudo, nombre y una cifra a la derecha— porque es la misma cosa contada en
   otro sitio, y dos maneras de dibujar un amistoso son dos maneras de
   confundirse. */
.pre__partido {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-4);
  background: var(--bg-panel);
  font-size: var(--fs-sm);
}
.pre__dia {
  flex: none;
  min-width: 56px;
  font-size: var(--fs-xs);
  font-variant-numeric: tabular-nums;
  color: var(--text-muted);
}
.pre__partido .crest { width: 15px; height: 17px; flex: none; --halo: 0.25px; }
.pre__rival {
  min-width: 0;
  flex: 1 1 auto;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 600;
  color: var(--text-primary);
}
.pre__sede { flex: none; font-size: var(--fs-xs); color: var(--text-muted); }
.pre__plata { flex: none; font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
.pre__plata[data-signo='mas'] { color: var(--verde-300); }
.pre__plata[data-signo='menos'] { color: var(--clay-300); }

.pre__vacio { font-size: var(--fs-sm); color: var(--text-muted); }

/* Los marcadores del parte. Sin fondo ni retícula: son tres renglones dentro de
   un diálogo que ya termina, no una tabla. */
.pre__parte-lista { display: grid; gap: var(--sp-2); margin-bottom: var(--sp-4); }
.pre__parte-lista li {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  font-size: var(--fs-sm);
  color: var(--text-primary);
}
.pre__parte-lista li > span:first-of-type { flex: 1 1 auto; min-width: 0; }
.pre__parte-lista .crest { width: 15px; height: 17px; flex: none; --halo: 0.25px; }

/* La escena del predio (`escenaDePretemporada()`, `pretemporada.js`): la usa
   el parte de la pretemporada. El modal de la llegada pasó a la ventana del
   club el 8/10/2026 (`modo-club.css`, `.pre-v`). */
.llegada__escena { display: block; width: 100%; height: 100%; }

/* ==========================================================================
   LA CAJA Y EL PARTE MÉDICO
   --------------------------------------------------------------------------
   Dos tarjetas cortas al pie de la columna del medio. Su forma es la de las
   filas de estado que el sistema ya tiene —rótulo a la izquierda, dato a la
   derecha, sin iconos— para que no se lean como dos invitadas.
   ========================================================================== */
.caja-vistazo { display: grid; gap: var(--sp-3); }

.caja-vistazo__fila {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
}

.caja-vistazo__valor {
  font-size: var(--fs-lg);
  font-weight: 700;
  color: var(--verde-400);
}

/* LA CAJA FLOJA NO SE PINTA DE ROJO, se pinta de ámbar. Rojo en este sistema
   es una pérdida consumada —un descenso, una roja, una lesión— y quedarse con
   ocho semanas de sueldos no es una pérdida: es un aviso. El motivo se dice
   igual en palabras debajo, porque el color nunca es lo que informa. */
.caja-vistazo__valor--flojo { color: var(--amber-400); }

.caja-vistazo__chico { font-size: var(--fs-sm); font-weight: 600; }

.caja-vistazo__pie {
  margin: 0;
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.medico__eco { margin: 0 0 var(--sp-1); }

.medico { display: grid; gap: var(--sp-2); }

/* LA FILA DEL PARTE, EN TRES RENGLONES Y CON FILETE. El porqué de cada dato
   está en `inicio.js`; acá el reparto: arriba quién y en cuánto vuelve, en el
   medio qué tiene y qué tan grave, y abajo la única pregunta que el DT hace de
   verdad — si llega al sábado.

   EL FILETE DE LA IZQUIERDA LLEVA EL TONO y es lo que hace que el parte se lea
   sin leerlo: tres bajas graves son tres franjas rojas de un vistazo. Va en el
   borde y no en el fondo porque el fondo ya es la tarjeta, y un renglón teñido
   entero pesa más que la noticia. */
.medico__fila {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas: 'quien vuelve' 'que gravedad' 'llega llega';
  align-items: center;
  gap: 0 var(--sp-5);
  padding: var(--sp-2) 0 var(--sp-3) var(--sp-4);
  border-left: 2px solid var(--line);
}
.medico__fila + .medico__fila { margin-top: var(--sp-2); }
.medico__fila[data-tono='leve']    { border-left-color: var(--good); }
.medico__fila[data-tono='media']   { border-left-color: var(--warn); }
.medico__fila[data-tono='grave']   { border-left-color: var(--danger); }
.medico__fila[data-tono='sancion'] { border-left-color: var(--accent); }

/* El puesto, al lado del apellido y en versalita: dice si te quedaste sin
   arquero o sin un lateral suplente, que es lo que cambia la semana. */
.medico__puesto {
  margin-left: var(--sp-2);
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--text-muted);
}

.medico__gravedad {
  grid-area: gravedad;
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--text-muted);
}
.medico__fila[data-tono='leve'] .medico__gravedad    { color: var(--good); }
.medico__fila[data-tono='media'] .medico__gravedad   { color: var(--warn); }
.medico__fila[data-tono='grave'] .medico__gravedad   { color: var(--danger); }
.medico__fila[data-tono='sancion'] .medico__gravedad { color: var(--accent-texto); }

/* La respuesta, abajo y sola: es la conclusión de la fila y se lee última. */
.medico__llega {
  grid-area: llega;
  margin-top: var(--sp-1);
  font-size: var(--fs-xs);
  color: var(--text-secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.medico__quien {
  grid-area: quien;
  font-size: var(--fs-sm);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.medico__que {
  grid-area: que;
  font-size: var(--fs-xs);
  color: var(--text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.medico__vuelve {
  grid-area: vuelve;
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--clay-400);
  white-space: nowrap;
}

.medico__sano, .medico__resto {
  margin: 0;
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

/* ==========================================================================
   LA GRILLA DEL VISTAZO GENERAL, A CUATRO ZONAS
   --------------------------------------------------------------------------
   El Portal se dibujaba en tres columnas de arriba abajo, y por eso —por más
   paneles que se le agregaran— seguía leyéndose igual: tres franjas. La
   referencia no hace eso. Tiene una columna alta a la izquierda (los mensajes),
   otra alta a la derecha (la tabla) y, entre medio, BANDAS donde los paneles
   cambian de ancho banda por banda. Eso es lo que hace que una pantalla se lea
   como un tablero y no como tres listas.

   SE PUEDE RECIÉN AHORA, y no antes, por la densidad. Con la escala en 1,04 el
   contenido disponible a 1920 eran 1.660 px de maquetación y las tres columnas
   ya estaban en su mínimo (330 + 440 + 390). Con 0,88 son 1.976: sobran casi
   cuatrocientos, que es exactamente una columna más.

   NO SE TOCÓ UNA LÍNEA DE HTML. Las dos columnas que agrupan paneles pasan a
   `display: contents`, así que sus tarjetas se vuelven hijas directas de la
   grilla y se pueden colocar de a una. La columna de mensajes NO entra en eso
   —es `.col` y `.tarjeta` a la vez, y disolverla sería disolver la tarjeta—.

   Y VA ACOTADA A `[data-vista='general']` a propósito: el Portal tiene cinco
   vistas y las otras cuatro reparten estas mismas tarjetas de otra manera.
   Una grilla suelta acá las rompía a las cuatro.
   ========================================================================== */
/* EL UMBRAL BAJÓ DE 1800 A 1280 AL SACAR EL RIEL, y es la mejor consecuencia
   de haberlo sacado.

   Cuando la grilla de cuatro zonas entró, el riel se llevaba 206 px y la
   medición daba: 1600 → 2 títulos partidos, 1700 → 1, 1800 → 0. De ahí el
   umbral. Devueltos esos 206 px al contenido, la misma medición forzando la
   grilla a cada ancho da CERO en todos: 1280, 1366, 1440, 1520, 1600, 1700,
   1800 y 1920.

   O sea que sacar el riel no sólo devolvió una columna: hizo que la forma
   buena del Portal llegue a casi cualquier pantalla en vez de a los monitores
   grandes. Debajo de 1280 vuelve a sus tres columnas, que es la que entra
   ahí. */
@media (min-width: 1280px) {
  .home[data-vista='general'] {
    grid-template-columns: repeat(20, minmax(0, 1fr));
    align-content: start;
    /* ESTA VISTA SÍ SE BAJA, Y ES LA ÚNICA DEL JUEGO QUE LO HACE.
       --------------------------------------------------------------------
       La regla del proyecto es que una pantalla no se baja: entra o se
       recorta el contenido. Vale para las veintiuna, y vale porque en todas
       lo que sobra es aire.

       Acá no. Con las cinco bandas el vistazo general mide más que la
       ventana y la última —los líderes— se cortaba a la mitad: 68 px para un
       panel que pide 204. Las salidas eran tres y dos son peores: apretar
       cuatro paneles en una banda los deja en 190 px cuando el planteo pide
       250, y tirar un panel es tirar información que el DT vino a buscar.

       Y el boceto que Alberto aprobó mide 1.368 px de alto en una ventana de
       1.200: **el diseño que se eligió ya se bajaba.** Dejarlo bajar acá no
       rompe la regla, la aplica: la regla existe para que no se pierda nada
       abajo, y bajar es justamente no perderlo.

       Va acotado a esta vista y a este corte. Las otras cuatro vistas del
       Portal y las veinte pantallas siguen sin bajarse.

       Y LA QUE SE BAJA ES LA PÁGINA, NO ESTA CAJA (21/9/2026).
       --------------------------------------------------------------------
       Acá vivían `overflow-y: auto` y `overscroll-behavior: contain`, y con
       ellos esta vista era su PROPIO scroller. Funcionaba mientras su
       contenido midiera más que ella; dejó de funcionar el día que las
       tarjetas pasaron a medir lo que miden —`flex: 0 0 auto` en los
       scrollers internos—, porque entonces la caja creció con el contenido y
       ya no le sobró nada por dentro.

       Una caja con `overflow: auto` que no tiene nada que rodar SE COME LA
       RUEDA igual, y con `contain` además no la deja pasar a la página. Ése
       era el defecto: medido a 1400×900, el gesto moría encima de las OCHO
       tarjetas y la página tenía 1.620 px de contenido en 900 de ventana.

       Alberto lo reportó tres veces y las dos primeras lo diagnostiqué mal
       —le dije que era la tarjeta de noticias, que también se lo comía pero
       era una de ocho—. Lo que lo cerró fue medir la rueda ancho por ancho en
       vez de mirar una caja sola.

       Sin estas dos líneas el documento se baja, que es lo que el título de
       esta regla decía desde el principio: **un solo scroller, y es la
       página.** */
  }

  /* La columna que sólo agrupa se disuelve; la que ES una tarjeta, no. */
  .home[data-vista='general'] > .col:not(.tarjeta) { display: contents; }

  /* LAS PIEZAS SE NOMBRAN, NO SE CUENTAN. La primera vuelta de esta grilla usó
     `.par:first-of-type` y `.par:last-of-type` y las dos apuntaron al mismo
     nodo: `:first-of-type` cuenta DIVs hermanos, no elementos con esa clase.
     Los dos pares quedaron uno encima del otro. Es la tercera vez en este
     proyecto que esa pseudoclase me miente por el mismo motivo; la salida es
     siempre la misma y es ésta: una clase propia. */

  /* La columna alta de la izquierda y la de la derecha. */
  .home[data-vista='general'] > .col.tarjeta { grid-column: 1 / 6; grid-row: 1 / 6; }

  /* UN SOLO SCROLLER, Y ES LA PÁGINA.
     --------------------------------------------------------------------------
     Alberto: «el scroll está raro, scrollea por módulo pero no general». Y es
     así: la vista tenía ONCE cajas con `overflow-y: auto` —la bandeja, la
     tabla, los titulares, la programación— más la página. La rueda movía lo
     que hubiera debajo del puntero, así que el mismo gesto hacía una cosa u
     otra según dónde estuviera el ratón. Con la partida de muestra no se nota
     porque ninguna desborda; con una carrera de verdad, la bandeja y la tabla
     sí, y ahí se vuelve impredecible.

     Los scrollers internos eran correctos en la pantalla de alto fijo: cada
     tarjeta se hacía cargo de lo suyo porque la página no se bajaba. Ahora se
     baja —es la única del juego que lo hace— y esa premisa se invirtió.

     Lo que las otras cuatro vistas del Portal hacen sigue igual: esto vive
     dentro del corte de la grilla de cuatro zonas. */
  /* `.news__panels` ESTABA FUERA DE ESTA LISTA Y SE TRAGABA LA RUEDA.
     --------------------------------------------------------------------------
     «Puse el navegador en 90% y no puedo scrollear» —Alberto, 21/9/2026—. No
     era el zoom: era el sitio donde tenía el puntero. La tarjeta de noticias
     ocupa el centro de arriba, que es donde el puntero cae al entrar, y
     `.news__panels` es un scroller con `overscroll-behavior: contain` cuyo
     contenido entra JUSTO —166 px en 166—. Un contenedor que no tiene nada que
     rodar y que además no deja pasar el gesto se come la rueda y no se mueve
     nada. Encima de cualquier otra tarjeta el scroll andaba, que es lo que
     hacía parecer que dependía del zoom.

     Es el mismo defecto del que salió esta regla —«el scroll está raro,
     scrollea por módulo pero no general»— y este scroller se me había quedado
     afuera de la lista. La lección: la lista se derivó a ojo, y lo que hay que
     derivar es la PROPIEDAD. Lo mide `herramientas/vara-la-rueda-no-se-traba.mjs`,
     que prueba la rueda encima de cada tarjeta en vez de fiarse de una lista. */
  .home[data-vista='general'] .inbox,
  .home[data-vista='general'] .news__panels,
  .home[data-vista='general'] .agenda__scroll {
    overflow: visible;
    max-height: none;
    /* Y DEJAN DE CONTENER EL GESTO. `overflow: visible` ya los saca de ser
       contenedores de scroll, pero `overscroll-behavior` se queda escrito y en
       un elemento que vuelva a tener overflow por otra vía seguiría frenando
       la rueda. Se apaga junto con el overflow, que es donde se decidió. */
    overscroll-behavior: auto;
    /* Y DEJAN DE ESTIRARSE Y DE ENCOGERSE, que es la otra mitad del mismo
       arreglo y faltaba.

       Con `flex: 1 1 0` —lo que traían de la pantalla de alto fijo— una caja
       sin scroller hace las dos cosas mal. Medido el 21/9/2026 en Torneos: el
       scroller medía 978 px con una tabla de 576 adentro, o sea 402 px de
       nada entre la última fila y la leyenda de ascensos, que terminaba
       pegada al fondo de la tarjeta en vez de al pie de la tabla. Y al revés,
       con una tabla de 30 clubes el mismo `1 1 0` la encoge por debajo de su
       contenido y, con `overflow: visible`, las filas se dibujan ENCIMA de la
       leyenda: es el pisado que Alberto fotografió.

       `0 0 auto` es lo que quiere decir «medí lo que medís»: la tarjeta crece
       con la tabla —la vista se baja, para eso es la única que scrollea— y lo
       que va debajo queda siempre debajo. */
    flex: 0 0 auto;
  }

  /* EL PERMISO DE ACHICARSE SE REVOCA ACÁ, y sin esto la pantalla se rompe
     fuerte. Más arriba hay una regla que deja a la tarjeta de titulares bajar
     por debajo de su contenido: `min-height: 0`. Estaba bien y su comentario
     lo explica — en la columna flex de antes, ésa era la única con un scroller
     adentro y una salida a mano, así que era la que cedía cuando la columna no
     daba.

     En la grilla de cuatro zonas esa premisa ya no existe: la vista se baja,
     así que nadie necesita ceder. Y el permiso pasó a hacer daño. Con la
     temporada avanzada —el panel de titulares muestra el balance del año, que
     es largo— la tarjeta se quedaba en 30 px y su contenido seguía dibujándose
     174 px MÁS ABAJO, encima de «Partidos» y de «Calendario»: los dos rótulos
     con una línea cruzándolos por el medio. Lo reportó Alberto: «todo pisado».

     Y el recorte es el cinturón, no el arreglo: aunque algo vuelva a colapsar,
     que se corte dentro de su caja y no pinte sobre la vecina. */
  .home[data-vista='general'] .col > .tarjeta[data-panel='general']:has(.news) {
    min-height: auto;
  }
  /* Y la misma revocación un piso más adentro: `.news` también declara
     `min-height: 0`, y es la que de verdad colapsaba —medida en 0 px con la
     tarjeta en 30—. Revocar sólo la de afuera no alcanzaba: el permiso de
     ceder estaba repartido en dos, que es lo que lo hacía difícil de ver. */
  .home[data-vista='general'] .news,
  .home[data-vista='general'] .news__panels { min-height: auto; }

  /* EL RECORTE NO VA EN LA TARJETA, Y ÉSTA ES LA PARTE QUE ME COSTÓ VER.
     Había puesto `overflow: hidden` en la tarjeta como cinturón, para que un
     colapso no pintara sobre la vecina. El cinturón ERA la causa: en CSS, el
     mínimo automático de un ítem de grilla o de flex vale CERO cuando su
     `overflow` no es `visible`. O sea que recortar la tarjeta le devolvía el
     permiso de achicarse que las dos líneas de arriba le acababan de quitar, y
     la fila se quedaba en 30 px con la noticia escondida adentro.

     El recorte se muda al scroller, que es el que de verdad tiene que
     contener lo que sobra y ya vivía para eso. */
  .home[data-vista='general'] .news__panels { overflow: hidden auto; }

  /* Las tres bandas del medio. */
  .home[data-vista='general'] .news-card { grid-column: 6 / 16; grid-row: 1; }
  .home[data-vista='general'] .par--rival { grid-column: 6 / 12; grid-row: 2; }
  .home[data-vista='general'] .tarjeta--grow { grid-column: 12 / 16; grid-row: 2; }
  .home[data-vista='general'] .par--club { grid-column: 12 / 16; grid-row: 3; }
  .home[data-vista='general'] .par--campo { grid-column: 6 / 16; grid-row: 4; }
  .home[data-vista='general'] .par--lideres { grid-column: 6 / 16; grid-row: 5; }

  /* Las tarjetas altas se estiran hasta el pie de su banda; las cortas no,
     para que no queden con un pozo de aire adentro. */
  .home[data-vista='general'] > .col.tarjeta { align-self: stretch; }
}

/* ==========================================================================
   EL PLANTEO Y LA SEMANA, DE UN VISTAZO
   --------------------------------------------------------------------------
   Dos resúmenes, no dos editores. Se miran; se editan en su pantalla.
   ========================================================================== */
/* LA CANCHA VA ACOSTADA Y LOS DATOS DEBAJO (21/9/2026, pedido de Alberto).
   --------------------------------------------------------------------------
   Estaba de pie y al lado las consignas, y eso deja las dos cosas mal: la
   cancha sólo podía medir 132 px de ancho —el resto de la tarjeta se lo comían
   las etiquetas— y las etiquetas quedaban flotando a media altura de una
   columna verde de 200 px. Medido: sobraban 182 px de los 263 de la tarjeta.

   Acostada, la cancha se lleva el ancho entero de la tarjeta y los once puntos
   se separan de verdad; las consignas pasan a ser un renglón debajo, que es
   donde se lee un pie de foto. Es además cómo se dibuja un planteo en
   cualquier lado: el ataque a la derecha y no hacia arriba. */
.planteo-vistazo { display: grid; gap: var(--sp-4); }

/* LAS CONSIGNAS VAN EN FILA Y ENVUELVEN, no apiladas. En fila el renglón se
   llena solo y si el ancho no da, bajan. */
/* CENTRADO BAJO LA CANCHA (21/9/2026, pedido de Alberto). Es un pie de foto y
   un pie de foto se centra: pegado a la izquierda bajo un campo que ocupa el
   ancho entero, el renglón quedaba colgando de una esquina. */
.planteo-vistazo__datos {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--sp-3);
  min-width: 0;
}

.planteo-vistazo__dibujo { flex: 0 0 auto; }

.planteo-vistazo__dibujo {
  font-size: var(--fs-lg);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.02em;
}

.etiqueta-plan {
  display: inline-block;
  padding: 2px var(--sp-4);
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--text-secondary);
  background: var(--bg-raised);
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-sm);
  width: fit-content;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* LA TIRA ARRIBA Y LOS DATOS DEBAJO. El porqué está en `inicio.js`: catorce
   barritas dicen cuándo se entrena y no dicen qué, y era todo lo que la
   tarjeta tenía. */
.semana-vistazo { display: grid; gap: var(--sp-5); align-content: start; }
.semana-vistazo__tira {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: var(--sp-2);
}
.semana-vistazo__pie { display: grid; gap: var(--sp-2); margin: 0; }
.semana-vistazo__peso--fuerte { color: var(--warn); }
.semana-vistazo__peso--suave { color: var(--good); }

.semana-vistazo__dia { display: grid; gap: 3px; justify-items: center; }

.semana-vistazo__rotulo {
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--text-muted);
}

/* EL TURNO ES UNA BARRA Y NO UN ICONO, y eso se decidió por el tamaño: son
   catorce en una tarjeta angosta, y a ese tamaño un icono es una mancha. Lo
   que hay que poder leer de un vistazo no es QUÉ sesión es —para eso está el
   `title` y está la pantalla de Entrenamiento— sino la FORMA de la semana:
   dónde se aprieta y dónde se afloja. Dos tonos y listo. */
.turno {
  display: block;
  width: 100%;
  height: 8px;
  border-radius: 2px;
  background: var(--ink-600);
  border: 1px solid var(--line-strong);
}

/* LOS TRES TONOS TIENEN QUE SEPARARSE DEL FONDO Y ENTRE SÍ. La primera vuelta
   puso el turno normal en `--bg-raised` y el suave en `--ink-800`, y sobre la
   tarjeta los dos desaparecían: de los catorce turnos se veían dos. Un
   indicador que sólo se ve cuando es verde no es un indicador de tres estados,
   es uno de uno. */
.turno--suave  { background: var(--ink-750); border-color: var(--line); }
.turno--fuerte { background: var(--verde-500); border-color: var(--verde-400); }
.turno--vacio  { background: transparent; border-style: dashed; border-color: var(--line); }

/* El día que se juega se marca en el rótulo, no en los turnos: el partido no
   es una sesión y pintarlo como tal sería decir que entrenás cuando jugás. */
.semana-vistazo__dia--partido .semana-vistazo__rotulo {
  color: var(--accent-texto);
  font-weight: 700;
}

/* ==========================================================================
   LOS LÍDERES
   ========================================================================== */
.lideres { display: grid; }

.lider {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-3) 0;
  border-bottom: 1px solid var(--line-hairline);
}
.lider:last-child { border-bottom: 0; }

.lider__escudo { display: flex; }
.lider__escudo .crest { width: 18px; height: 18px; }

/* El dorsal hace de escudo en el panel del plantel: ocupa el mismo lugar y la
   misma caja, así los dos paneles se leen como uno partido en dos y no como
   dos listas con distinta sangría. */
.lider__dorsal {
  display: grid;
  place-items: center;
  width: 20px; height: 18px;
  font-size: var(--fs-2xs);
  font-weight: 700;
  color: var(--text-muted);
  background: var(--bg-raised);
  border: 1px solid var(--line-hairline);
  border-radius: var(--r-sm);
}

.lider__texto { display: grid; min-width: 0; }

.lider__que { font-size: var(--fs-xs); color: var(--text-muted); }

.lider__quien {
  font-size: var(--fs-sm);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.lider__valor {
  font-size: var(--fs-lg);
  font-weight: 700;
  color: var(--accent-texto);
  font-variant-numeric: tabular-nums;
}

.lider__sin { margin: 0; font-size: var(--fs-xs); color: var(--text-muted); }

/* ==========================================================================
   EL ZÓCALO DE LA FECHA
   --------------------------------------------------------------------------
   La banda que corre debajo del titular. El componente es `.ticker` de
   `app.css` —de ahí salen la cinta, la pausa al pasar el mouse y la vuelta sin
   salto—; acá va sólo lo que esta cinta lleva adentro, que son cruces.

   Y LA CAJA PIERDE EL BORDE Y EL FONDO PROPIOS. `.ticker` está hecho para
   vivir suelto en una página —la puerta del sitio— y acá vive DENTRO de la
   tarjeta de noticias: una caja con borde adentro de otra caja con borde es el
   segundo marco para una sola cosa. Lo que queda es la línea de arriba, que es
   lo que separa el zócalo de la placa en una transmisión.
   ========================================================================== */

/* MIDE LO QUE MIDE Y EL SOBRANTE ES DE LA NOTICIA. La tarjeta es una columna
   flex, así que el último hijo se quedaba con todo el alto libre: medido, el
   zócalo salía de 340 px con una cinta de 40 adentro, estirada de arriba abajo.
   `0 0 auto` lo deja en su alto y `flex: 1` manda el resto adonde tiene que
   ir — un zócalo de televisión es una banda de alto fijo al pie de la placa, y
   lo que crece es la placa. */
.news-card > .news { flex: 1 1 auto; min-height: 0; }
.news__zocalo {
  flex: 0 0 auto;
  margin: var(--sp-4) calc(-1 * var(--caja-pad-x, var(--sp-6))) calc(-1 * var(--sp-6));
}

.news__zocalo .ticker {
  border: 0;
  border-top: 1px solid var(--line-hairline);
  border-radius: 0;
  background: var(--bg-row);
}

.news__zocalo .ticker__rotulo {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-5);
  background: transparent;
  border-right: 1px solid var(--line-hairline);
}

/* ENTRE UN CRUCE Y EL SIGUIENTE TIENE QUE HABER MÁS AIRE QUE ADENTRO DEL
   CRUCE, o la cinta se lee como una sola frase larga: «Dep. Maipú Quilmes
   15:00 Almagro Gim. y Tiro 15:00» parecía poner la hora entre los equipos
   equivocados. El de adentro es `--sp-2` y el de afuera `--sp-8`, cuatro
   veces más, y además va un punto separador — el aire solo no alcanza cuando
   la cinta se mueve. */
.news__zocalo .ticker__cinta { padding: var(--sp-3) var(--sp-5); gap: var(--sp-8); }
/* La copia repite la cinta y tiene que formar la misma FILA: sin esto sus
   cruces se apilan y el zócalo crece de 18 px a 339. */
.zocalo__copia { display: flex; align-items: center; gap: var(--sp-8); }

.news__zocalo .zocalo__cruce + .zocalo__cruce::before {
  content: '·';
  margin-right: var(--sp-8);
  color: var(--text-disabled);
}

/* EL PUNTO DE «EN JUEGO» LATE. Es la única cosa de la pantalla que se mueve
   sin que nadie la toque y por eso late despacio: un parpadeo rápido es una
   alarma, y esto no avisa de nada, cuenta que algo está pasando. Quieto para
   quien pidió menos movimiento — el rótulo ya dice «en juego» con letras. */
@keyframes zocalo-late {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: 0.35; transform: scale(0.82); }
}
.zocalo__vivo {
  width: 7px; height: 7px;
  flex: none;
  border-radius: 50%;
  background: var(--danger);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 22%, transparent);
  animation: zocalo-late 1.8s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
  .zocalo__vivo { animation: none; }
}

.zocalo__cruce {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  white-space: nowrap;
  font-size: var(--fs-xs);
  color: var(--text-secondary);
}

/* EL TUYO SE ENCUENTRA SIN LEER LOS OTROS CATORCE. Va en la tinta del texto
   principal y en negrita, no en color: el acento de esta pantalla ya significa
   otras tres cosas, y una cinta con un cruce de acento entre catorce grises
   parecería un enlace. */
.zocalo__cruce--mio { color: var(--text-primary); font-weight: 600; }

.zocalo__escudo { width: 16px; height: 16px; --halo: 0.29px; }

.zocalo__club { max-width: 12ch; overflow: hidden; text-overflow: ellipsis; }

/* El marcador, tabular para que no baile con los dígitos, y la raya apagada:
   lo que se lee son los dos números. */
.zocalo__goles {
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  color: var(--text-primary);
}
.zocalo__goles i { margin: 0 2px; font-style: normal; color: var(--text-disabled); }

.zocalo__hora { font-variant-numeric: tabular-nums; color: var(--text-muted); }


/* ==========================================================================
   EL TEMA DEL MENSAJE, EN EL AVATAR (22/9/2026)
   --------------------------------------------------------------------------
   FM27 colorea la bandeja por tema para poder barrerla sin leerla. Acá el tema
   ya viaja en el dato —`m.tema`, ver `prensa.js`— y lo escribe `inicio.js` como
   `data-tema` en la fila.

   VA EN EL AVATAR Y NO EN UN FILETE A LA IZQUIERDA, que es donde lo pone
   cualquier cliente de correo y donde lo puse yo en el boceto. El canto
   izquierdo de esta fila YA ESTÁ OCUPADO TRES VECES y las tres con el acento:

     · `.msg[aria-current]`      `inset 4px 0 0 var(--accent)`  la fila abierta
     · `.msg[data-leido=false]`  un punto de 6px a `left: 2px`  el no leído
     · y los dos conviven con una regla que apaga el punto sobre la barra

   Un cuarto aviso en esos mismos píxeles no es un color más: es la cuarta cosa
   distinta dicha en el mismo sitio, y las tres que ya están dicen ESTADO —te
   espera, lo abriste—, que es lo que un tema no dice. El avatar, en cambio, son
   cuarenta píxeles por fila que hoy son todos del mismo gris y que el ojo ya
   recorre: es la columna que se barre.

   LA TINTA NO REEMPLAZA AL MONOGRAMA, lo envuelve. La inicial sigue diciendo
   QUIÉN escribió —«la secretaria técnica, el cuerpo médico»— y el color dice de
   QUÉ es. Dos preguntas distintas en la misma pieza y ninguna le saca sitio a
   la otra.

   EL FONDO ES UN LAVADO Y NO EL COLOR PELADO, al 18 %, y el matiz se repite en
   el borde y en la inicial. Pelado convertiría la columna izquierda en una
   hilera de botones, que es justo lo que el comentario de `.msg__avatar` dice
   haber evitado eligiendo un fondo MÁS OSCURO que el panel. El lavado mantiene
   ese hundido y le pone matiz.

   LOS SIETE TEMAS SALEN DE LO QUE HACE EL QUE LEE y no del organigrama:
   quién te pide algo, quién te informa, quién te cura, quién te paga, quién te
   vende, quién sube de abajo y quién te mira de afuera.

   EL MATIZ DE CADA UNO SE ELIGIÓ CONTRA LOS QUE YA SIGNIFICAN ALGO en esta
   misma pantalla, que es la parte cara: el acento (ácido, 64) es la ACCIÓN y no
   se toca; `--warn` (ámbar, 40), `--danger` (clay, 9) y `--good` (verde, 145)
   dicen cuidado, mal y bien. Un tema pintado con cualquiera de esos tres se
   lee como un juicio sobre el mensaje. Por eso:

     medico      clay  (9)    el ÚNICO que se permite pisar un semántico, y
                              porque coincide: el parte médico es malo
     dirigencia  azul (215)   el más lejos de todo lo demás
     mercado     verde (145)  pisa `--good` y se acepta: plata entrando
     vestuario   amber (40)   pisa `--warn`, y el vestuario pide cuidado.
                              Se lleva además a la CANTERA: un juvenil que sube
                              es un movimiento del plantel, y su naranja (nar,
                              26) caía a 12° de este ámbar — dos nombres para
                              el mismo color
     cuerpo      hueso        tu propio cuerpo técnico es la LÍNEA DE BASE de
                              la bandeja: es lo que más llega y lo que menos
                              urge, así que se queda sin matiz a propósito
     prensa      ink          de afuera del club, y el más silencioso de los
                              siete: se distingue por ser el más apagado

   CUATRO TINTES Y DOS GRISES, Y NO SEIS COLORES. Los matices que este sistema
   tiene libres son cuatro —215, 144, 40 y 10— y no hay un quinto: `nar` (26)
   cae a 12° del ámbar y a 18° del clay, o sea que como CATEGORÍA no existe. La
   primera versión de esta hoja tenía cinco tintes y la vara la rechazó con esos
   dos números; la cantera se fue al ámbar del vestuario. Un color que no se
   distingue es peor que ninguno.
   Lo mide `herramientas/vara-temas-de-la-bandeja.mjs`, que exige separación de
   matiz entre los teñidos y 4,5:1 de la inicial contra su propio lavado.
   ========================================================================== */
/* EL TEMA QUE NO EXISTE DEGRADA AL GRIS MÁS CALLADO, y esta línea es el
   motivo. Sin ella, un `data-tema` con un valor que esta hoja no conoce —un
   typo en `despacho.js`, un tema nuevo declarado en el guion y olvidado acá—
   deja las tres `var()` sin resolver, `hsl()` sale inválida y el avatar queda
   con FONDO TRANSPARENTE Y BORDE BLANCO: un anillo que grita en una bandeja de
   treinta filas, o sea peor que no haber teñido nada. Medido en el portal
   poniendo `data-tema="inventado"` a mano.

   Degradar a gris es lo correcto EN PANTALLA y no alcanza como arreglo: un
   tema que no pinta tiene que poder contarse, y eso lo hace
   `vara-temas-de-la-bandeja.mjs`, que exige que cada tema declarado en los
   guiones tenga su regla acá. La hoja calla; la vara grita. */
.msg[data-tema] { --tema-h: 0; --tema-s: 0%; --tema-l: 62%; }

.msg[data-tema] .msg__avatar {
  background: hsl(var(--tema-h) var(--tema-s) var(--tema-l) / 0.18);
  border-color: hsl(var(--tema-h) var(--tema-s) var(--tema-l) / 0.45);
  color: hsl(var(--tema-h) var(--tema-s) var(--tema-l));
}
.msg[data-tema='vestuario']  { --tema-h: 40;  --tema-s: 92%; --tema-l: 62%; }
.msg[data-tema='medico']     { --tema-h: 10;  --tema-s: 74%; --tema-l: 70%; }
.msg[data-tema='dirigencia'] { --tema-h: 215; --tema-s: 85%; --tema-l: 76%; }
.msg[data-tema='mercado']    { --tema-h: 144; --tema-s: 74%; --tema-l: 68%; }
/* Los dos sin matiz. Se escriben igual que los otros cinco —y no se omiten—
   para que la regla de arriba valga para los siete y no haya una fila de la
   bandeja que se dibuje por otro camino. */
.msg[data-tema='cuerpo']     { --tema-h: 0;   --tema-s: 0%;  --tema-l: 94%; }
.msg[data-tema='prensa']     { --tema-h: 0;   --tema-s: 0%;  --tema-l: 62%; }

/* ==========================================================================
   SUBIR UN BLOQUE DEL PORTAL (22/9/2026)
   --------------------------------------------------------------------------
   El botón que reordena el Portal. Va en la cabecera que cada pieza ya tiene
   —`.panel__head`— y al lado del enlace que algunas ya llevan ahí
   (`.col__more`, «La previa», «Ver el plantel»), con el mismo porte y el mismo
   apagado: es un control de cabecera más y no un modo de edición.

   NO LLEVA COLOR NI ACENTO EN REPOSO. El acento de este sistema tiene tres
   trabajos y ninguno es «acá hay un ajuste»; un chevrón encendido en ocho
   cabeceras sería el cuarto, y encima compitiendo con el punto del no leído
   que está a unos píxeles. Se enciende al pasarle por encima y al foco, que es
   cuando el que mira ya preguntó por él.

   SE MIDE 24 Y NO 30 como los del chrome. Los de allá viven solos en una fila
   de 30; éste comparte cabecera con un título y a veces con un enlace, en
   tarjetas de 274 px donde el título de «Líderes de tu plantel» ya llega al
   borde. A 24 el área táctil sigue siendo la que pide el dedo porque la fila
   entera de la cabecera es alta, y el glifo no le come ancho al título.
   ========================================================================== */
.col__subir {
  display: grid;
  place-items: center;
  flex: none;
  width: 24px; height: 24px;
  margin-left: auto;
  border: 0;
  border-radius: var(--r-sm);
  background: transparent;
  color: var(--icon-quiet);
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
/* Cuando la cabecera ya tiene su enlace —«La previa»—, el `margin-left: auto`
   de los dos pelearía por el hueco y el botón se pegaría al enlace. El que
   empuja es el primero que aparece; éste se queda pegado a su derecha. */
.panel__head .col__more + .col__subir { margin-left: var(--sp-3); }
@media (hover: hover) {
  .col__subir:hover { background: var(--bg-active); color: var(--text-primary); }
}
.col__subir:focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: 1px;
  color: var(--text-primary);
}

/* ==========================================================================
   EL BALANCE DEL AÑO, REDISEÑADO (9/10/2026, «rediseñemos esto al 100 %»)
   --------------------------------------------------------------------------
   Una grilla de dos columnas que entra entera: a la izquierda TU AÑO —la
   tarjeta con los colores del club, el puesto, la campaña, tus torneos y lo
   que ganaste—; a la derecha los campeones en tarjetas con su logo, y abajo
   sube y baja y el plantel. El pie lleva el aviso y los dos botones.
   ========================================================================== */
.dialogo--balance { width: min(1180px, calc(100vw - 2 * var(--sp-6))); }
.dialogo--balance[open] { grid-template-rows: auto minmax(0, 1fr) auto; }
.dialogo--balance .balance__cuerpo { margin-bottom: var(--sp-3); }
.bal2 { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); grid-template-areas: 'tu camp' 'tu mov' 'plantel plantel'; gap: var(--sp-4) var(--sp-5); align-items: start; }
.bal2__tu { grid-area: tu; display: grid; gap: var(--sp-4); padding: var(--sp-5); border-radius: 20px; position: relative; overflow: hidden;
  background: linear-gradient(160deg, color-mix(in srgb, var(--club-a, var(--accent)) 38%, var(--bg-raised)), color-mix(in srgb, var(--club-b, var(--bg-raised)) 18%, var(--bg-panel)) 75%);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, #fff 10%, transparent); }
.bal2__tu-cab { display: flex; align-items: center; gap: var(--sp-4); }
.bal2__tu-esc { width: 76px !important; height: 76px !important; flex: none; filter: drop-shadow(0 6px 18px rgb(0 0 0 / 0.45)); }
.bal2__tu-cab small { font-size: var(--fs-2xs); font-weight: 800; letter-spacing: var(--tracking-label); text-transform: uppercase; color: color-mix(in srgb, #fff 75%, transparent); }
.bal2__tu-cab h3 { margin: 2px 0 4px; font-size: clamp(1.6rem, 2.4vw, 2.2rem); line-height: 1.05; font-weight: 900; font-stretch: var(--wd-condensed); color: #fff; }
.bal2__tu-cab p { margin: 0; font-size: var(--fs-sm); color: color-mix(in srgb, #fff 85%, transparent); }
.bal2__ganados { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.bal2__ganado { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 6px 14px 6px 6px; border-radius: 99px; background: linear-gradient(90deg, rgb(255 210 90 / 0.28), rgb(255 210 90 / 0.08)); box-shadow: inset 0 0 0 1px rgb(255 210 90 / 0.5); }
.bal2__ganado .bal2__logo { width: 30px; height: 30px; }
.bal2__ganado small { display: block; font-size: var(--fs-2xs); font-weight: 800; letter-spacing: var(--tracking-label); text-transform: uppercase; color: rgb(255 214 120); }
.bal2__ganado b { color: #fff; font-size: var(--fs-sm); }
.bal2__numeros { display: grid; grid-template-columns: 1.3fr repeat(6, minmax(0, 1fr)); gap: 6px; }
.bal2__num { display: grid; justify-items: center; padding: var(--sp-2) 4px; border-radius: 14px; background: rgb(0 0 0 / 0.28); }
.bal2__num b { font-size: var(--fs-lg); font-weight: 800; color: #fff; font-variant-numeric: tabular-nums; line-height: 1.1; }
.bal2__num--grande b { font-size: var(--fs-2xl); color: var(--accent-texto); }
.bal2__num small { font-size: var(--fs-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: color-mix(in srgb, #fff 65%, transparent); }
.bal2__torneos { display: grid; gap: 4px; margin: 0; padding: 0; list-style: none; }
.bal2__torneos li { display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: var(--sp-3); padding: 6px var(--sp-3) 6px 6px; border-radius: 12px; background: rgb(0 0 0 / 0.22); font-size: var(--fs-sm); }
.bal2__torneos b { color: #fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bal2__torneos li > span:last-child { color: color-mix(in srgb, #fff 80%, transparent); font-weight: 600; white-space: nowrap; }
.bal2__torneo-logo { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: #fff; }
.bal2__logo { width: 24px; height: 24px; object-fit: contain; }
.bal2__sec { display: grid; gap: var(--sp-2); align-content: start; }
.bal2__sec > h3 { margin: 0; }
.bal2__camp { grid-area: camp; }
.bal2__trofeos { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: var(--sp-2); }
.bal2__trofeo { display: grid; grid-template-columns: 34px minmax(0, 1fr) 30px; align-items: center; gap: var(--sp-2); padding: 8px 10px 8px 8px; border-radius: 14px; background: color-mix(in srgb, var(--bg-raised) 60%, transparent); box-shadow: inset 0 0 0 1px var(--line-hairline); }
.bal2__trofeo--mio { background: linear-gradient(90deg, rgb(255 210 90 / 0.18), transparent); box-shadow: inset 0 0 0 1px rgb(255 210 90 / 0.55); }
.bal2__trofeo-logo { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: #fff; }
.bal2__trofeo-logo .bal2__logo { width: 26px; height: 26px; }
.bal2__trofeo-t { display: grid; min-width: 0; }
.bal2__trofeo-t small { font-size: var(--fs-2xs); color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bal2__trofeo-t b { font-size: var(--fs-sm); color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bal2__trofeo-esc { width: 28px !important; height: 28px !important; }
.bal2__mov { grid-area: mov; }
.bal2__cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: var(--sp-2); }
.bal2__col { padding: var(--sp-3); border-radius: 14px; background: color-mix(in srgb, var(--bg-raised) 50%, transparent); box-shadow: inset 0 0 0 1px var(--line-hairline); }
.bal2__col h4 { display: flex; align-items: center; gap: 8px; margin: 0 0 var(--sp-2); font-size: var(--fs-sm); font-weight: 800; color: var(--text-primary); }
.bal2__col h4 small { margin-left: auto; padding: 1px 8px; border-radius: 99px; background: var(--line-hairline); font-size: var(--fs-2xs); color: var(--text-secondary); }
.bal2__col h4 i { font-style: normal; font-size: 0.8em; }
.bal2__col--sube h4 i { color: var(--good); }
.bal2__col--baja h4 i { color: var(--danger); }
.bal2__col ul { display: grid; gap: 4px; margin: 0; padding: 0; list-style: none; }
.bal2__col li { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; font-size: var(--fs-sm); color: var(--text-primary); }
.bal2__col li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bal2__col li.bal2__yo span { color: var(--accent-texto); font-weight: 800; }
.bal2__esc { width: 22px !important; height: 22px !important; flex: none; }
.bal2__plantel { grid-area: plantel; }
.bal2__retiros { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.bal2__retiro { display: grid; padding: 8px 14px; border-radius: 14px; background: color-mix(in srgb, var(--bg-raised) 60%, transparent); box-shadow: inset 0 0 0 1px var(--line-hairline); }
.bal2__retiro b { color: var(--text-primary); }
.bal2__retiro small { font-size: var(--fs-xs); color: var(--text-muted); }
.bal2__retiro em { font-style: normal; font-size: var(--fs-2xs); font-weight: 800; letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--accent-texto); }
.bal2__chicos { display: flex; flex-wrap: wrap; align-items: center; gap: 6px var(--sp-2); margin: 0; font-size: var(--fs-sm); color: var(--text-secondary); }
.bal2__chicos > span:first-child { font-weight: 700; color: var(--text-primary); margin-right: 4px; }
.bal2__chico { padding: 3px 10px; border-radius: 99px; background: color-mix(in srgb, var(--bg-raised) 70%, transparent); font-size: var(--fs-xs); color: var(--text-muted); }
.bal2__chico b { color: var(--text-primary); }
.bal2__nada { margin: 0; font-size: var(--fs-sm); color: var(--text-muted); }
.bal2__pie { display: flex; align-items: center; justify-content: flex-end; gap: var(--sp-3); flex-wrap: wrap; padding-top: var(--sp-3); border-top: 1px solid var(--line-hairline); }
.bal2__aviso { flex: 1 1 22rem; margin: 0; font-size: var(--fs-xs); line-height: 1.45; color: var(--text-muted); }
.bal2__empezar { display: inline-flex; align-items: center; gap: 6px; padding-inline: var(--sp-5); }
@media (max-width: 860px) {
  .bal2__aviso { flex: 0 0 auto; width: 100%; }
  .bal2__trofeos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bal2__trofeo { grid-template-columns: 30px minmax(0, 1fr); }
  .bal2__trofeo-esc { display: none; }
  .bal2 { grid-template-columns: minmax(0, 1fr); grid-template-areas: 'tu' 'camp' 'mov' 'plantel'; }
  .bal2__numeros { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .bal2__num--grande { grid-column: span 1; }
}

/* portada.css */
/* ==========================================================================
   El Camino DT — La portada
   --------------------------------------------------------------------------
   La solapa «Noticias» a pantalla completa, y la única pantalla del juego que
   NO se compone con las primitivas del producto.

   POR QUÉ ROMPE, QUE ES LO ÚNICO QUE HAY QUE ENTENDER DE ESTA HOJA. Las otras
   diecisiete pantallas están hechas de tarjeta, rótulo y lista, y tienen razón:
   ahí el DT viene a OPERAR y la interfaz tiene que desaparecer debajo del dato.
   Acá viene a LEER. Una pantalla de lectura armada con las herramientas de una
   de gestión sale gris por definición —seis tarjetas con borde propio compiten
   entre sí y no gana ninguna—, y eso fue exactamente lo que pasó: la versión
   anterior de esta hoja repartía el mismo contenido en seis cajas del sistema y
   el resultado no tenía jerarquía ninguna.

   Las cuatro decisiones, cada una con su regla del sistema al lado:

   1. EL TITULAR USA LA VOZ DE LA TAPA. 700 y `--wd-condensed`, versales,
      interlínea corta: es el registro de `.tapa__titular` en `home.css`, que su
      propia hoja declara «el registro del sistema» —el mismo par del nombre de
      club en la barra, en la tabla y en la ficha—. No se inventa una voz para
      esta pantalla: se trae la que ya existía y nunca había entrado al juego.

   2. EL COLOR DE CLUB PINTA LA APERTURA. La Regla del Color de Club dice que
      los colores de club son CONTENIDO y no sistema. En una portada que habla
      de tu club, el fondo ES contenido. Se hunde hacia la pizarra igual que la
      carta del selector: al 32 % sobre `--ink-950`, medido contra los 30
      colores de Primera, el peor caso —River, Huracán y Vélez, los tres
      blancos— deja 6,03:1 con el titular, sobre un piso de 4,5.

   3. NO HAY CAJAS. Un diario separa con reglas y aire. Las únicas superficies
      elevadas que quedan son las dos que sostienen un dato puntual: tu partido
      y la previa del próximo.

   4. LOS RESULTADOS SON UN TABLERO. Escudo, nombre y cifra, con el que ganó en
      blanco y el que perdió apagado: la fecha entera se lee sin leer un solo
      renglón.

   LO QUE NO CAMBIÓ, Y POR QUÉ. El anclaje al alto de la ventana: la promesa de
   esta pantalla sigue siendo que ocupa el alto y no se mueve, así que la fila
   de abajo se queda con lo que sobra y son sus TRES columnas las que
   desplazan por dentro. Es la Regla de Una Lista por Columna, con el mismo
   reparto que tenía la versión anterior.
   ========================================================================== */

/* Sólo existe en su solapa. La vista general no esconde nada —por eso muestra
   todo— así que esta sección tiene que esconderse ella misma y aparecer nada
   más cuando la nombran. */
.portada { display: none; }

/* Cinco filas: cabecera, zócalo, apertura, tira de titulares y el resto. Las
   cuatro primeras miden lo que miden y la quinta se queda con lo que sobra. */
.home[data-vista='noticias'] .portada {
  display: grid;
  grid-template-rows: auto auto auto auto minmax(0, 1fr);
  /* LA COLUMNA VA DECLARADA, y sin esto la pantalla se va de costado. Una
     columna de grid sin declarar es `auto`, y `auto` crece con el contenido: la
     cinta del zócalo lleva `white-space: nowrap` con los quince cruces de la
     fecha, así que pedía 6003 px y arrastraba a la sección entera —medido:
     6222 de ancho dentro de una ventana de 1440, con la tabla y el minuto a
     minuto fuera de la pantalla—. El `overflow: hidden` de la pista recorta lo
     que se VE, no lo que se PIDE; quien lo corta de verdad es este `minmax`. */
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sp-5);
  min-height: 0;
  min-width: 0;
}

/* --------------------------------------------------------------------------
   1 · EL MASTHEAD
   --------------------------------------------------------------------------
   La regla de 2px debajo es lo que lo vuelve la cabecera de un medio y no el
   título de un panel. Va en `--text-primary` y no en la línea del sistema: una
   cabecera de diario tiene una regla que se ve.
   -------------------------------------------------------------------------- */
.portada__cabecera {
  display: flex;
  align-items: baseline;
  gap: var(--sp-4);
  padding-bottom: var(--sp-3);
  border-bottom: 2px solid var(--text-primary);
}

.portada__marca {
  margin: 0;
  font-size: var(--fs-2xl);
  font-weight: 700;
  font-stretch: var(--wd-condensed);
  letter-spacing: -0.015em;
  text-transform: uppercase;
  line-height: 1;
}

.portada__hoy {
  margin: 0;
  font-size: var(--fs-2xs);
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
}

.portada__envivo {
  margin: 0 0 0 auto;
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--fs-2xs);
  color: var(--text-muted);
}

.portada__pulso {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--good);
}

/* --------------------------------------------------------------------------
   2 · EL ZÓCALO
   --------------------------------------------------------------------------
   Lleva la fecha QUE VIENE. Antes repetía la jugada, que es la misma que la
   tarjeta de abajo mostraba entera: quince partidos escritos dos veces en la
   misma pantalla, una corriendo y otra quieta.

   Corre solo; se para al pasarle el mouse por encima y no se mueve si el
   sistema pide menos movimiento. Es una lista de verdad debajo de la
   animación, así que sigue siendo legible parada.
   -------------------------------------------------------------------------- */
.portada__zocalo {
  display: flex;
  border-bottom: 1px solid var(--line-hairline);
}

/* El rótulo va en negativo: es la pieza que no se mueve al lado de la que se
   mueve, y en un zócalo de canal eso se resuelve invirtiendo, no con un borde. */
.portada__zocalo-rotulo {
  display: flex;
  align-items: center;
  padding: var(--sp-3) var(--sp-4);
  background: var(--text-primary);
  color: var(--ink-1000);
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  white-space: nowrap;
}

.portada__zocalo-pista {
  flex: 1;
  /* `min-width: 0` NO ES DECORACIÓN acá, y se paga caro sin él: la cinta lleva
     `white-space: nowrap` con los quince cruces de la fecha, y un ítem flex sin
     esto toma el ancho de su CONTENIDO aunque el padre tenga `overflow: hidden`.
     Medido antes de ponerlo: la sección entera pedía 5982 px, la columna de la
     fecha 5356, y la pantalla se iba de costado con las otras dos columnas
     fuera de la ventana. El `overflow: hidden` recorta lo que se ve, no lo que
     se pide. */
  min-width: 0;
  display: flex;
  align-items: center;
  overflow: hidden;
}

.portada__zocalo-cinta {
  display: flex;
  gap: var(--sp-6);
  padding-left: var(--sp-5);
  white-space: nowrap;
  animation: portada-correr 70s linear infinite;
}

.portada__zocalo:hover .portada__zocalo-cinta,
.portada__zocalo:focus-within .portada__zocalo-cinta { animation-play-state: paused; }

@keyframes portada-correr { to { transform: translateX(-50%); } }

@media (prefers-reduced-motion: reduce) {
  .portada__zocalo-cinta { animation: none; }
}

.portada__pieza { font-size: var(--fs-2xs); color: var(--text-secondary); }
.portada__pieza--mio { color: var(--text-primary); font-weight: 600; }

/* --------------------------------------------------------------------------
   3 · LA APERTURA, A SANGRE
   --------------------------------------------------------------------------
   Las dos puntas del degradado importan y el error es soltar una sola: sin
   hundir arriba es pintura plana, sin llegar abajo a la página es un cuadro
   pegado encima. Es la misma lección de la carta del selector.
   -------------------------------------------------------------------------- */
.portada__apertura {
  position: relative;
  overflow: hidden;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--sp-6);
  min-height: 264px;
  padding: var(--sp-6) var(--sp-7);
  border-radius: var(--r-md);
  background:
    radial-gradient(120% 150% at 6% 0%, color-mix(in srgb, var(--club) 32%, var(--ink-950)) 0%, var(--ink-950) 74%),
    var(--ink-950);
}

/* La barra del canto es lo que ata el bloque a un equipo y no a una paleta. Va
   en el color ACLARADO (`legibleEnPizarra`), porque los colores reales incluyen
   el marrón de Platense, el bordó de Lanús y el negro de Newell's: sobre esta
   pizarra, crudos, son barras invisibles. */
.portada__apertura::before {
  content: '';
  position: absolute;
  inset: 0 auto 0 0;
  width: 4px;
  background: var(--club-luz);
}

/* El escudo, sangrado y en marca de agua. A más tinta competía con el
   marcador, que es la cifra que el DT vino a ver. */
.portada__hero-escudo {
  position: absolute;
  right: -110px;
  top: 50%;
  translate: 0 -50%;
  width: 380px;
  height: 380px;
  object-fit: contain;
  opacity: 0.07;
  filter: grayscale(0.55) brightness(1.4);
  pointer-events: none;
}

.portada__hero-cuerpo { position: relative; min-width: 0; }

.portada__volanta {
  margin: 0 0 var(--sp-4);
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
}

/* El medio firma con su color, que es el mismo `tono` con el que ya firma en el
   feed y en la tarjeta del vistazo. */
.portada__medio { color: hsl(var(--tono)); }

.portada__sello {
  padding: 3px var(--sp-3);
  border-radius: 999px;
  background: hsl(var(--tono) / 0.20);
  color: hsl(var(--tono));
}

/* LA VOZ DE LA TAPA, adentro del juego. Ver la cabecera de esta hoja. */
.portada__titular {
  margin: 0;
  max-width: 18ch;
  font-size: var(--fs-editorial);
  font-weight: 700;
  font-stretch: var(--wd-condensed);
  line-height: 0.92;
  letter-spacing: -0.015em;
  text-transform: uppercase;
  text-wrap: balance;
  color: var(--text-primary);
}

.portada__bajada {
  margin: var(--sp-5) 0 0;
  max-width: 52ch;
  font-size: var(--fs-lg);
  line-height: var(--lh-snug);
  color: var(--text-secondary);
}

.portada__pie {
  margin: var(--sp-5) 0 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-4);
  font-size: var(--fs-2xs);
  color: var(--text-muted);
}

.portada__pie span + span::before { content: '· '; color: var(--ink-600); }

/* El marcador de la apertura: la cifra más grande de la pantalla, porque es el
   dato que el DT vino a ver. */
.portada__marcador {
  position: relative;
  display: grid;
  grid-template-columns: auto auto auto;
  align-items: center;
  gap: var(--sp-5);
}

.portada__marcador-lado {
  display: grid;
  justify-items: center;
  gap: var(--sp-3);
  width: 124px;
}

.portada__marcador-lado span {
  font-size: var(--fs-xs);
  font-weight: 600;
  font-stretch: var(--wd-condensed);
  text-align: center;
}

.portada__cifras {
  font-size: var(--fs-editorial);
  font-weight: 700;
  font-stretch: var(--wd-condensed);
  line-height: 1;
  letter-spacing: -0.02em;
}

.portada__cifras i { font-style: normal; color: var(--text-muted); margin: 0 var(--sp-2); }

.portada__pen {
  grid-column: 1 / -1;
  margin: var(--sp-3) 0 0;
  text-align: center;
  font-size: var(--fs-2xs);
  color: var(--text-muted);
}

/* --------------------------------------------------------------------------
   4 · LA TIRA DE TITULARES
   --------------------------------------------------------------------------
   Cuatro notas en cuatro columnas separadas por una línea, no una pila de
   puntitos: cada titular se lee entero y se elige el que se quiere abrir.

   Y NO ROTA SOLA. La apertura cambiaba de titular cada 7 s, que es lo que hacía
   que una nota se fuera antes de terminar de leerla; el DT elige y se queda.
   -------------------------------------------------------------------------- */
.portada__tira {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
}

.portada__sec {
  display: block;
  padding: 0 var(--sp-5);
  border: 0;
  border-left: 1px solid var(--line-hairline);
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.portada__sec:first-child { border-left: 0; padding-left: 0; }

.portada__sec-medio {
  display: block;
  margin-bottom: var(--sp-3);
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: hsl(var(--tono));
}

.portada__sec-tit {
  display: block;
  font-size: var(--fs-md);
  font-weight: 700;
  font-stretch: var(--wd-condensed);
  line-height: 1.05;
  letter-spacing: -0.01em;
  text-transform: uppercase;
  color: var(--text-secondary);
  transition: color .12s;
}

.portada__sec:hover .portada__sec-tit,
.portada__sec:focus-visible .portada__sec-tit { color: var(--text-primary); }

/* --------------------------------------------------------------------------
   5 · LA REJILLA DE ABAJO
   --------------------------------------------------------------------------
   Tres columnas, y cada una desplaza por dentro: es lo que deja que la pantalla
   siga anclada al alto de la ventana sin recortar nada.
   -------------------------------------------------------------------------- */
.portada__grilla {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 258px 328px;
  gap: var(--sp-7);
  min-height: 0;
}

.portada__col {
  min-width: 0;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding-right: var(--sp-3);
}

/* El rótulo de sección con la regla que lo cruza: es lo que separa dos cuerpos
   sin dibujar una caja alrededor de cada uno. */
.portada__seccion {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  margin: 0 0 var(--sp-4);
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-secondary);
  white-space: nowrap;
}

.portada__seccion::after {
  content: '';
  flex: 1;
  height: 1px;
  background: var(--line-hairline);
}

.portada__seccion em {
  font-style: normal;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--text-muted);
}

.portada__seccion + .portada__seccion,
.portada__previa + .portada__seccion { margin-top: var(--sp-6); }

/* TU PARTIDO, fuera de la lista. Antes había que buscarlo entre quince. */
.portada__mio {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: var(--sp-5);
  padding: var(--sp-5);
  margin-bottom: var(--sp-6);
  border-radius: var(--r-md);
  border-left: 3px solid var(--club-luz);
  background: var(--ink-900);
}

.portada__mio-lado {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  font-size: var(--fs-sm);
  font-weight: 600;
  font-stretch: var(--wd-condensed);
}

.portada__mio-lado--der { justify-content: flex-end; text-align: right; }

.portada__mio-cifras {
  font-size: var(--fs-3xl);
  font-weight: 700;
  font-stretch: var(--wd-condensed);
  line-height: 1;
}

.portada__mio-cifras i { font-style: normal; color: var(--text-muted); margin: 0 var(--sp-2); }

/* EL TABLERO DE LA FECHA. `auto-fit` y no dos columnas fijas: por debajo de los
   1400 la columna se queda corta y los nombres se parten al medio. */
.portada__tablero {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(224px, 1fr));
  gap: 0 var(--sp-6);
}

.portada__partido {
  display: grid;
  gap: 3px;
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--line-hairline);
  font-size: var(--fs-xs);
}

.portada__lado {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-width: 0;
  color: var(--text-secondary);
}

.portada__lado-club {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-stretch: var(--wd-condensed);
}

.portada__lado-gol { margin-left: auto; font-weight: 700; font-variant-numeric: tabular-nums; }

/* El que ganó en blanco y el que perdió apagado. Es lo que deja leer la fecha
   entera sin leer un renglón; un empate no marca a ninguno de los dos. */
.portada__lado--gana { color: var(--text-primary); font-weight: 700; }
.portada__lado--pierde { color: var(--text-muted); }

.portada__pendiente { font-size: var(--fs-2xs); color: var(--text-muted); }

/* LA TABLA, sin caja: la franja es una barra de color al canto. */
.portada__tabla { display: grid; gap: 1px; }

.portada__fila {
  position: relative;
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr) 26px 30px;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-3) var(--sp-3) var(--sp-4);
  border-radius: var(--r-sm);
  font-size: var(--fs-xs);
}

.portada__fila::before {
  content: '';
  position: absolute;
  left: 0;
  top: 5px;
  bottom: 5px;
  width: 3px;
  border-radius: 2px;
  background: var(--franja, transparent);
}

.portada__fila--mio { background: var(--ink-850); }
.portada__fila-pos { color: var(--text-muted); font-variant-numeric: tabular-nums; }

.portada__fila-club {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-stretch: var(--wd-condensed);
}

.portada__fila--mio .portada__fila-club { font-weight: 700; }
.portada__fila-pj { text-align: right; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.portada__fila-pts { text-align: right; font-weight: 700; font-variant-numeric: tabular-nums; }

.portada__leyenda {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-3);
  margin-top: var(--sp-4);
  font-size: var(--fs-2xs);
  color: var(--text-muted);
}

.portada__leyenda i {
  display: inline-block;
  width: 8px;
  height: 3px;
  border-radius: 2px;
  margin-right: 5px;
  vertical-align: middle;
}

/* LO QUE VIENE. Ocupa el sitio que tenía la lista de campeones del continente,
   que era almanaque: cuarenta y siete campeones del año pasado ordenados por
   nada. Esto es lo único que la portada le puede dar a alguien que ya sabe qué
   pasó — qué hacer ahora. */
.portada__previa {
  padding: var(--sp-5);
  border-radius: var(--r-md);
  background: var(--ink-900);
}

.portada__previa-par {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: var(--sp-3);
  text-align: center;
}

.portada__previa-club { display: grid; justify-items: center; gap: var(--sp-3); }

.portada__previa-club span {
  font-size: var(--fs-2xs);
  font-weight: 600;
  font-stretch: var(--wd-condensed);
}

.portada__previa-vs { font-size: var(--fs-2xs); color: var(--text-muted); }
.portada__previa-datos { display: grid; margin-top: var(--sp-4); }

.portada__dato {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-3);
  margin: 0;
  padding: var(--sp-3) 0;
  border-top: 1px solid var(--line-hairline);
  font-size: var(--fs-2xs);
  color: var(--text-muted);
}

.portada__dato b { color: var(--text-primary); font-weight: 600; }

/* EL MINUTO A MINUTO. Era una pila de tarjetas de X con avatar, arroba y
   cifras de repercusión; la línea de tiempo cuenta lo mismo en la mitad del
   espacio y deja de competir con la apertura. El punto se pinta del color del
   medio, que es el mismo dato que antes cargaba el avatar. */
.portada__minuto { display: grid; }

.portada__momento {
  position: relative;
  padding: 0 0 var(--sp-5) var(--sp-6);
  border-left: 1px solid var(--line);
}

.portada__momento:last-child { border-left-color: transparent; padding-bottom: 0; }

.portada__momento::before {
  content: '';
  position: absolute;
  left: -4px;
  top: 5px;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: hsl(var(--tono));
  box-shadow: 0 0 0 3px var(--bg-page);
}

.portada__momento-quien {
  margin: 0 0 3px;
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  font-size: var(--fs-2xs);
}

.portada__momento-medio {
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: hsl(var(--tono));
}

.portada__momento-hora { margin-left: auto; color: var(--text-muted); font-variant-numeric: tabular-nums; }

.portada__momento-texto {
  margin: 0;
  font-size: var(--fs-xs);
  line-height: var(--lh-snug);
  color: var(--text-secondary);
}

.portada__momento-texto strong { color: var(--text-primary); font-weight: 600; }

/* Tus próximos partidos, que es lo que esa columna tiene para dar mientras no
   se jugó ninguna fecha. Antes ahí decía «Resultados de la fecha» y mostraba
   quince «vs.»: un título que promete un dato que todavía no existe. */
.portada__prox {
  display: grid;
  grid-template-columns: 76px auto minmax(0, 1fr) auto auto;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--line-hairline);
  font-size: var(--fs-xs);
}

.portada__prox-et {
  font-size: var(--fs-2xs);
  font-weight: 700;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.portada__prox-club {
  font-weight: 600;
  font-stretch: var(--wd-condensed);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.portada__prox-sede,
.portada__prox-fecha { font-size: var(--fs-2xs); color: var(--text-muted); }

.portada__nada { font-size: var(--fs-2xs); color: var(--text-muted); }

/* --------------------------------------------------------------------------
   LOS QUIEBRES
   --------------------------------------------------------------------------
   Dos, y los dos por el mismo motivo: el ancho que se queda corto para tres
   columnas y el ALTO, que es el recurso escaso de una pantalla anclada a la
   ventana. En un portátil de 800 la apertura no puede quedarse con un tercio
   del alto, así que cede ella —es la que tiene aire— y no las listas.
   -------------------------------------------------------------------------- */
@media (max-width: 1400px) {
  /* Y ACÁ SE SUELTA EL ANCLAJE, que es la otra mitad de la Regla del Alto de
     Ventana: en este mismo quiebre `inicio.css` le devuelve el alto al
     documento —`body { height: auto; overflow: visible }`— porque las columnas
     ya no caben una al lado de la otra. Con la página rodando, los scrollers
     por columna sobran y encima estorban: una barra adentro de otra barra
     esconde justo el final de la lista. Las columnas vuelven a medir lo que
     miden. */
  /* Y la última fila deja de ser `1fr`. Con el documento suelto, `1fr` se
     estira hasta el alto de la ventana ADEMÁS de crecer con su contenido, y eso
     dejaba casi una pantalla de negro debajo del último bloque. */
  .home[data-vista='noticias'] .portada { grid-template-rows: auto auto auto auto auto; }
  .portada__grilla { grid-template-columns: minmax(0, 1fr) 258px; align-content: start; }
  .portada__col { overflow: visible; padding-right: 0; }
  .portada__col--lateral { grid-column: 1 / -1; }
  .portada__titular { font-size: var(--fs-3xl); }
  .portada__hero-escudo { width: 260px; height: 260px; right: -70px; }
}

@media (max-height: 860px) {
  .portada__apertura { min-height: 0; padding: var(--sp-5) var(--sp-6); }
  .portada__titular { font-size: var(--fs-3xl); }
  .portada__cifras { font-size: var(--fs-3xl); }
  .portada__bajada { font-size: var(--fs-md); }
  .portada__hero-escudo { width: 240px; height: 240px; }
}

