/* ═════════════════════════════════════════════════════════════════════════════
   sistema.css — Sistema visual de GRID.

   Reemplaza por completo al styles.css anterior. Nada de aquí hereda de aquel.

   Los tokens viven en tokens.css (Entrega 1). Esta hoja se va vaciando a medida que cada pantalla se rehace con piezas.css.

   REGLAS
   · Color de marca solo en acentos y acciones; el fondo es papel.
   · Nada que se toque mide menos de 44px.
   · Los números de marcador y hora van tabulares para que las tablas no bailen.
   · Ningún estado se comunica solo con color: siempre color + palabra o forma.
   · Un solo verde, un solo ámbar, un solo rojo de estado — el rojo de marca NO es
     el rojo de error.
   ═══════════════════════════════════════════════════════════════════════════ */

*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  font-family:var(--f-texto);
  background:var(--fondo); color:var(--tinta);
  font-size:16px; line-height:1.55; -webkit-font-smoothing:antialiased;
  min-height:100dvh;
}
a{color:var(--azul-osc);text-decoration:none}
a:hover{text-decoration:underline}
:focus-visible{outline:3px solid var(--azul);outline-offset:2px;border-radius:var(--r-sm)}
img{max-width:100%;display:block}

.contenedor{max-width:var(--ancho);margin:0 auto;padding:0 var(--e5)}
.oculto{display:none!important}

/* ── Barra superior ─────────────────────────────────────────────────────── */
/* El marco oscuro del diseño. Lleva la marca de la PLATAFORMA y los destinos de fuera
   de un evento: Inicio, Torneos y —con sesión— Mis jornadas. Dentro de un evento las
   secciones son las pestañas de la cabecera del torneo (#evCab, piezas.css). El fondo lo
   pone marca.css (`body .barra`). */
.barra{
  position:sticky;top:0;z-index:60;background:var(--marino);color:var(--fuerte);
  border-bottom:3px solid var(--marca);
}
.barra-in{display:flex;align-items:center;gap:var(--e3);height:56px;
  max-width:var(--ancho);margin:0 auto;padding:0 22px}
.marca{display:flex;align-items:center;gap:11px;font-weight:800;letter-spacing:-.01em;
  line-height:1.1;flex-shrink:0;min-height:var(--toque);text-decoration:none}
.marca:hover{text-decoration:none}
.barra-sp{flex:1}
/* Pantallas de 320px (iPhone SE de primera generación y similares). El logotipo, tres
   destinos y «Salir» sumaban 343px con los rellenos normales: 10px de scroll horizontal.
   Se aprieta el marco, no se quita nada. */
@media (max-width:360px){
  .barra-in{padding:var(--e2) var(--e3);gap:var(--e2)}
  .barra-nav{margin-left:0;gap:0}
  .ruta-btn{padding:0 var(--e2)}
  .btn-sm{padding:0 var(--e2)}
}

/* Destinos de fuera del evento. En el celular (≤900 px) se esconden enteros: los lleva la
   barra de abajo (ver la regla de `.nav-app` más abajo). */
.barra-nav{display:flex;align-items:center;gap:2px;margin-left:var(--e4)}
.ruta-btn{display:inline-flex;align-items:center;gap:8px;background:none;border:0;font:inherit;
  font-family:var(--f-texto);font-weight:600;font-size:.88rem;color:var(--g-tinta-2);cursor:pointer;
  min-height:var(--toque);padding:0 var(--e3);border-radius:var(--r-sm);white-space:nowrap;
  transition:background .15s,color .15s}
.ruta-btn:hover{background:color-mix(in srgb,var(--fuerte) 9%,transparent);color:var(--fuerte)}
.ruta-btn.active{color:var(--fuerte)}
/* En el celular la navegación de arriba se va entera: la barra de abajo lleva lo mismo y los
   iconos solos de aquí arriba la duplicaban (recorrido: arriba solo logo y avatar). */
@media (max-width:900px){ .nav-app{display:none} }

/* ── Iconos ─────────────────────────────────────────────────────────────── */
/* UIcons entra por una fuente de iconos: el glifo hereda el color y el tamaño del texto,
   así que un icono nunca se queda de un color que no contrasta. Todos son decorativos y
   van con su palabra al lado; si el CDN no responde, no se pierde ninguna información. */
.fi{display:inline-flex;align-items:center;justify-content:center;line-height:0;
  flex-shrink:0;font-size:1em}
.btn .fi{font-size:.95em}

/* ── Marco: el contenido a todo el ancho ───────────────────────────────────
   La columna lateral se fue en la Entrega 2. El aire lateral lo pone `.marco-cue` y no
   `.contenedor`, así la cabecera del torneo (#evCab, fuera de <main>) queda alineada con
   el contenido a cualquier ancho. */
.marco{margin:0 auto}
/* El tope del contenido vive aquí y no en `.marco` ni en `.contenedor`: así la cabecera del
   torneo mide lo mismo que la tabla, y las pantallas sin cromo (Torre, Arena) lo quitan en
   un solo sitio (marca.css, lista de `es-torre`…). Es el ancho del recorrido: 1000 px en el
   torneo y 1040 en Mis jornadas, centrado. A todo lo ancho, en 1440 px los dos equipos de
   una fila quedaban a un metro el uno del otro. */
.marco-cue{min-width:0;max-width:calc(1000px + 2 * var(--e5));margin:0 auto;padding:0 var(--e5)}
.marco-cue:has(#p-casa.active, #p-jornadas.active, #p-staff.active){max-width:calc(1040px + 2 * var(--e5))}
@media (max-width:620px){ .marco-cue{padding:0 var(--e4)} }
.marco-cue .contenedor{max-width:none;padding:0}

/* Lo del staff está OCULTO por defecto y solo aparece con sesión abierta.
   La regla vive aquí, no en JavaScript: antes la ocultaba `setAdmin()`, pero a esa
   función solo se la llamaba SI había sesión, así que a una familia no se la llamaba
   nunca y el Tablero le quedaba a la vista. Siendo CSS es correcto desde el primer
   pintado, sin parpadeo y sin depender de en qué orden corran los scripts.
   (Lo que hay detrás ya estaba protegido: el API responde 403 sin sesión.) */
.admin-only{display:none}
body.is-admin .admin-only{display:revert}
/* `revert` devuelve el valor que trae el navegador para la etiqueta —`inline-block` en un
   <button>—, NO el que le pone esta hoja. Con la navegación en flex, «Tablero» era el
   único botón que no era flex: el icono se le pegaba a la palabra sin separación y, en
   escritorio, no se alineaba con los otros cuatro. Hay que decir el display bueno. */
/* Y lo MISMO acaba de pasar con «Panel» en la barra de arriba: `revert` lo devolvía a
   `inline-block` y el icono quedaba pegado a la palabra, sin la separación de flex. Cada
   familia de botones necesita que se le diga su display; no basta con arreglar una. */
body.is-admin .ruta-btn.admin-only{display:inline-flex}
/* Por nivel. Es cortesía visual —quitar botones que igual iban a dar 403—, NO el candado:
   el candado vive en el servidor, porque el nivel llega en un JSON del navegador. */
.solo-admin{display:none}
body.nivel-admin .solo-admin{display:revert}
body.nivel-admin .nav-btn.solo-admin{display:flex}
body.nivel-admin .ruta-btn.solo-admin{display:inline-flex}

/* Interruptor de «esto se ve o no se ve». Con palabra al lado, nunca solo el color. */
.interruptor{display:inline-flex;align-items:center;gap:8px;cursor:pointer;
  font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;
  min-height:var(--toque);padding:0 4px}
.interruptor input{width:18px;height:18px;min-height:0;flex-shrink:0;accent-color:var(--marca);cursor:pointer}
.tarjeta-cab .interruptor{color:var(--fuerte)}
/* Apagado: se ve que existe pero que no está publicado. Rayado, no solo gris: el gris
   solo se confunde con «deshabilitado» y aquí significa otra cosa. `--linea-fuerte` y no
   `--tinta-3`: con la letra fuerte del modo encima, en claro el gris medio no se leía. */
.tarjeta.apagada .tarjeta-cab{background:var(--linea-fuerte)}
.tarjeta.apagada .tarjeta-cue{background:repeating-linear-gradient(135deg,
  var(--papel) 0 12px, var(--hundido) 12px 24px)}
.panel{display:none;padding:var(--e5) 0 var(--e7)}
.panel.active{display:block}

/* ── Pie ────────────────────────────────────────────────────────────────── */
/* `pie-sitio`, no `pie`: las tarjetas de la portada ya usan `.pie` para su renglón de
   abajo, y un nombre compartido les metía 48px de relleno y el texto centrado. */
.pie-sitio{padding-top:var(--e5);padding-bottom:var(--e7);color:var(--tinta-3);
  font-size:.82rem;text-align:center}
.pie-sitio a{font-weight:700;display:inline-flex;align-items:center;gap:6px;
  min-height:var(--toque);padding:0 10px}
.pie-sitio .pt{opacity:.4}

/* ── Títulos de sección ─────────────────────────────────────────────────── */
.s-eye{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;
  color:var(--marca-osc);margin-bottom:2px}
.s-title{font-family:var(--f-titulo);font-weight:700;
  font-size:1.5rem;letter-spacing:-.01em;color:var(--marino);margin-bottom:var(--e4)}
.s-sub{color:var(--tinta-2);font-size:.92rem;margin:-10px 0 var(--e4)}

/* ── Tarjetas ───────────────────────────────────────────────────────────── */
/* Borde de 1px en vez de sombra: el sistema evita sombras profundas para mantener un
   aspecto nítido y «rápido». La profundidad se hace con capas tonales, no con blur. */
.tarjeta{background:var(--papel);border:1px solid var(--linea);border-radius:var(--r);
  margin-bottom:var(--e4);overflow:hidden}
/* Cabecera en otro tono: separa de un vistazo «de qué grupo es esto» del contenido,
   que es lo que pide una mesa leyendo dos o tres grupos a la vez. Era el marino con letra
   blanca; en claro quedaba una franja negra en la tarjeta blanca. Ahora el `--hundido` del
   modo (en oscuro es el mismo #0d0e12 del marino) y los chips en `--alzado`, con su letra. */
.tarjeta-cab{display:flex;align-items:center;gap:var(--e3);flex-wrap:wrap;
  padding:var(--e3) var(--e4);background:var(--hundido);color:var(--fuerte)}
.tarjeta-cab h3{font-family:var(--f-titulo);font-size:1rem;font-weight:700;color:var(--fuerte);
  letter-spacing:-.01em}
.tarjeta-cab .chip{background:var(--alzado);border-color:transparent}
.tarjeta-cab .sp{flex:1}
.tarjeta-cue{padding:var(--e4)}
/* Con el contenedor ancho, un párrafo suelto llegaba a los 150 caracteres por renglón y
   el ojo perdía la línea al volver. Las tablas y las rejillas sí usan todo el ancho. */
.tarjeta-cue>p,.tarjeta-cue>ul,.s-sub{max-width:78ch}
.tarjeta-pie{padding:var(--e3) var(--e4);background:var(--hundido);
  border-top:1px solid var(--linea);display:flex;gap:var(--e2);flex-wrap:wrap}

/* ── Botones ────────────────────────────────────────────────────────────── */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  font:inherit;font-weight:700;font-size:12px;letter-spacing:.04em;line-height:1;cursor:pointer;
  min-height:40px;padding:0 var(--e4);border-radius:var(--r-sm);
  border:1px solid transparent;transition:background .15s,border-color .15s,color .15s;
  white-space:nowrap;text-decoration:none}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn-primario{background:var(--marca);color:var(--sobre-marca);font-weight:800}
.btn-primario:hover:not(:disabled){background:var(--marca-osc-2);color:#fff}   /* color fijo: --marca-osc-2 está a 7:1 del blanco (aplicarMarca); --sobre-marca mide contra --marca, no contra este fondo */
.btn-plano{background:var(--alzado);color:var(--tinta);border-color:var(--linea-fuerte)}
.btn-plano:hover:not(:disabled){border-color:var(--tinta-3)}
/* Discreto (`.b-fan` del recorrido): sin fondo ni filete. Para lo que acompaña a otra acción
   —«Invitar» junto a «Anoto yo», «+ Equipo» en la cabecera de un club—. */
.btn-fan{background:transparent;color:var(--tinta-2)}
.btn-fan:hover:not(:disabled){color:var(--tinta);background:var(--hundido-2)}
/* Enlace: texto subrayado, para lo que no es una acción del formulario («Olvidé mi contraseña»). */
.link{background:none;border:0;padding:0;font:inherit;font-size:13px;color:var(--tinta);cursor:pointer;
  text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--linea-fuerte)}
.link:hover{text-decoration-color:currentColor}
.btn-peligro{background:var(--papel);color:var(--error);border-color:var(--error-linea)}
.btn-peligro:hover:not(:disabled){background:var(--error-bg)}
/* Chico (`.b-ch` del recorrido): 32 px en el computador. Con el dedo (`pointer:coarse`) todo
   botón vuelve a 44: la regla de arriba de este archivo sigue valiendo donde se toca. */
.btn-sm{min-height:32px;font-size:11px;padding:0 var(--e3)}
@media (pointer:coarse){ .btn,.btn-sm{min-height:var(--toque)} }
.btn-icono{min-width:36px;min-height:36px;padding:0;border-radius:var(--r-sm);
  background:none;border:1px solid var(--linea);color:var(--tinta-2);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;font-size:.9rem}
.btn-icono:hover{background:var(--hundido);color:var(--tinta)}
.btn-icono.peligro:hover{background:var(--error-bg);color:var(--error);border-color:var(--error-linea)}

/* ── Campos ─────────────────────────────────────────────────────────────── */
.campo{display:flex;flex-direction:column;gap:5px}
.campo>label,.etiqueta{font:400 9.5px/1.3 var(--g-mono);text-transform:uppercase;
  letter-spacing:.14em;color:var(--tinta-2)}
input,select,textarea{font:inherit;font-size:14px;color:var(--tinta);background:var(--fondo);
  border:1px solid var(--linea-fuerte);border-radius:var(--r-sm);padding:9px 12px;
  min-height:42px;width:100%}
/* 16 px con el dedo: por debajo, el iPhone agranda la página al tocar el campo. */
@media (pointer:coarse){ input,select,textarea{font-size:16px;min-height:var(--toque)} }
input:focus,select:focus,textarea:focus{outline:0;border-color:var(--tinta-3)}
/* El de ejemplo (P2, tarea 4): sin regla quedaba el gris del navegador, #757575, que da 4,0:1 sobre el
   fondo claro. `opacity:1` porque Firefox le baja la opacidad por su cuenta. */
::placeholder{color:var(--tinta-3);opacity:1}
select{cursor:pointer;appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--tinta-2) 50%),linear-gradient(135deg,var(--tinta-2) 50%,transparent 50%);
  background-position:calc(100% - 18px) 52%,calc(100% - 13px) 52%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:36px}
.rejilla{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:var(--e3)}
.rejilla .ancho{grid-column:1/-1}

/* ── Distintivos ────────────────────────────────────────────────────────── */
.chip{display:inline-flex;align-items:center;gap:6px;font-size:.72rem;font-weight:800;
  text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;border-radius:var(--r-full);
  background:var(--hundido);color:var(--tinta-2);white-space:nowrap}
.chip-ok{background:var(--ok-bg);color:var(--ok-tx)}
.chip-alerta{background:var(--alerta-bg);color:var(--alerta)}
.chip-error{background:var(--error-bg);color:var(--error)}
.chip-marca{background:var(--marca-suave);color:var(--marca-osc)}
.chip-azul{background:var(--azul-suave);color:var(--azul-osc)}
.chip-vivo{background:var(--error-bg);color:var(--marca-osc-2)}
.chip-vivo::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--vivo);
  animation:latido 1.4s ease-in-out infinite}
@keyframes latido{0%,100%{opacity:1}50%{opacity:.25}}
.punto{width:11px;height:11px;border-radius:50%;display:inline-block;flex-shrink:0;
  border:1.5px solid var(--linea)}

/* ── Reglas por grupo ───────────────────────────────────────────────────── */
/* Cada grupo, su tabla de puntos. En paralelo, no apiladas: la gracia de la pestaña es
   comparar «en Avanzada el triple vale 3, en Desarrollo vale 2» sin hacer memoria. */
.reglas-grid{display:grid;gap:var(--e4);align-items:start;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr))}
.reglas-caja{border:1px solid var(--linea);border-radius:var(--r);padding:var(--e3);
  background:var(--hundido)}
.reglas-caja .tabla-caja{background:var(--papel)}
.reglas-cab{display:flex;align-items:center;justify-content:space-between;gap:var(--e2);
  margin-bottom:var(--e2);flex-wrap:wrap}
.reglas-cab b{font-family:var(--f-titulo);font-size:.98rem;color:var(--marino)}

/* ── Avisos ─────────────────────────────────────────────────────────────── */
.aviso{display:flex;gap:10px;align-items:flex-start;padding:var(--e3) var(--e4);
  border-radius:var(--r-sm);border:1px solid;font-size:.9rem;margin-bottom:var(--e3)}
.aviso b{font-weight:800}
.aviso .fi{font-size:1.05rem;margin-top:3px}
.aviso-ok{background:var(--ok-bg);border-color:var(--ok-linea);color:var(--ok)}
.aviso-alerta{background:var(--alerta-bg);border-color:var(--alerta-linea);color:var(--alerta)}
.aviso-error{background:var(--error-bg);border-color:var(--error-linea);color:var(--error)}

/* ── Tablas ─────────────────────────────────────────────────────────────── */
.tabla-caja{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--r);
  border:1px solid var(--linea);background:var(--papel)}
table{width:100%;border-collapse:collapse}
thead th{background:var(--hundido);color:var(--tinta-2);font-size:.7rem;font-weight:800;
  text-transform:uppercase;letter-spacing:.08em;text-align:left;padding:10px var(--e3);
  border-bottom:1px solid var(--linea);white-space:nowrap}
tbody td{padding:11px var(--e3);border-top:1px solid var(--linea);vertical-align:middle}
.num{font-variant-numeric:tabular-nums;text-align:right}
.destacar td{background:var(--ok-bg)!important}

/* ── Estado vacío ───────────────────────────────────────────────────────── */
.vacio{text-align:center;padding:var(--e7) var(--e4);color:var(--tinta-2)}
.vacio .ico{font-size:2rem;margin-bottom:var(--e2);opacity:.5}
.vacio .t{font-weight:800;color:var(--tinta);margin-bottom:4px;font-size:1.05rem}
.vacio .s{font-size:.9rem;max-width:46ch;margin:0 auto}
.vacio-mini{padding:var(--e4);text-align:center;color:var(--tinta-3);font-size:.9rem;
  background:var(--hundido);border-radius:var(--r-sm)}

/* ── Portada: presentación + herramientas + eventos ─────────────────────── */
.portada{display:grid;grid-template-columns:1fr;gap:var(--e5);align-items:center;
  margin-bottom:var(--e6)}
.portada-tx .chip{margin-bottom:var(--e3)}
.portada-tx h2{font-family:var(--f-titulo);font-weight:800;letter-spacing:-.02em;
  font-size:clamp(1.9rem,5vw,3.2rem);line-height:1.08;color:var(--marino)}
.portada-tx h2 em{font-style:normal;color:var(--marca-osc)}
.portada-tx p{margin-top:var(--e3);color:var(--tinta-2);font-size:1rem;max-width:52ch}
.portada-btns{display:flex;gap:var(--e2);flex-wrap:wrap;margin-top:var(--e5)}
.portada-marca{display:none}
.portada-tit{font-family:var(--f-titulo);font-weight:700;font-size:1.3rem;color:var(--marino);
  margin-bottom:var(--e4);display:flex;align-items:center;gap:var(--e3);flex-wrap:wrap;
  scroll-margin-top:88px}
.portada-lema{margin:var(--e7) auto 0;max-width:210px;opacity:.9}

.herramientas{display:grid;gap:var(--e4);margin-bottom:var(--e6);
  grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
.herr{background:var(--papel);border:1px solid var(--linea);border-radius:var(--r);
  padding:var(--e4)}
.herr-ico{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;
  border-radius:var(--r);background:var(--marca-suave);color:var(--marca-osc);
  font-size:1.1rem;margin-bottom:var(--e3)}
.herr h3{font-family:var(--f-titulo);font-weight:700;font-size:1.05rem;color:var(--marino);
  margin-bottom:6px}
.herr p{font-size:.9rem;color:var(--tinta-2)}

@media (min-width:900px){
  .portada{grid-template-columns:1.35fr .65fr}
  /* El escudo solo entra cuando hay sitio de verdad: por debajo de 900px robaba el ancho
     del titular y lo partía en cuatro renglones. */
  .portada-marca{display:block}
  .portada-marca img{width:100%;max-width:260px;margin-left:auto}
}

/* ── Tarjetas de evento ─────────────────────────────────────────────────── */
.eventos{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:var(--e4)}
.evento{background:var(--papel);border:1px solid var(--linea);border-radius:var(--r);
  box-shadow:var(--sombra);padding:var(--e4);cursor:pointer;text-align:left;
  transition:transform .15s,box-shadow .15s;width:100%;
  font:inherit;color:inherit;display:block}
.evento:hover{transform:translateY(-2px);box-shadow:var(--sombra-alta)}
.evento h3{font-size:1.08rem;font-weight:800;color:var(--marino);margin:var(--e2) 0 4px;
  line-height:1.25}
.evento .meta{font-size:.86rem;color:var(--tinta-2)}
.evento .pie{margin-top:var(--e3);padding-top:var(--e3);border-top:1px solid var(--linea);
  display:flex;gap:var(--e2);align-items:center;flex-wrap:wrap;font-size:.8rem;color:var(--tinta-3)}
.evento .marcas{display:flex;gap:6px;flex-wrap:wrap;align-items:center}

/* ── Partidos ───────────────────────────────────────────────────────────── */
/* Una sola columna, siempre. Las filas son renglones completos —cuándo, equipos y
   marcador—, así que repartirlas en varias columnas rompería justo lo que las hace
   útiles: leer la columna de horas de arriba abajo. */
.partidos{display:grid;grid-template-columns:1fr;gap:6px}
/* Rejilla de grupos: en escritorio corren en paralelo, que es como se juegan y como los
   lee la mesa. Apilados obligaban a bajar y subir para comparar dos que van a la vez.

   `auto-fit` en vez de dos saltos fijos: con puntos de corte medidos sobre la VENTANA, la
   misma pantalla daba una columna o dos según hubiera o no barra lateral, y con tres
   grupos quedaba un hueco del tamaño de una tarjeta. Midiendo el hueco disponible, la
   rejilla mete tantas columnas como quepan de 520px —el ancho al que la tabla de
   posiciones entra entera, con la columna Dif incluida— y reparte lo que sobre. */
.grupos{display:grid;gap:var(--e4);align-items:start;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,520px),1fr))}
.grupos .tarjeta{margin-bottom:0}
.grupos .partidos{grid-template-columns:1fr}   /* dentro de una columna, uno debajo de otro */
.m-card,.bk-match{background:var(--papel);border:1px solid var(--linea);
  border-radius:var(--r);padding:var(--e3);box-shadow:var(--sombra)}
.m-card.jugado,.bk-match.jugado{border-color:var(--ok-linea);background:var(--ok-bg)}
.m-card.envivo,.bk-match.envivo{border-color:var(--error-linea);box-shadow:0 0 0 3px var(--error-bg)}
.m-h{display:flex;align-items:center;gap:var(--e2);flex-wrap:wrap;margin-bottom:var(--e2);
  font-size:.74rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--tinta-3)}
.m-h .sp{flex:1}
.m-er{display:flex;align-items:center;gap:var(--e2);padding:5px 0}
.m-nm{flex:1;font-weight:700;font-size:.96rem;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.m-er .score-in{width:68px;min-height:40px;text-align:center;font-weight:800;font-size:1.1rem;
  font-variant-numeric:tabular-nums;flex-shrink:0;padding:6px}
.m-marcador{font-family:var(--f-titulo);font-weight:700;font-size:1.2rem;font-variant-numeric:tabular-nums;
  color:var(--marino);flex-shrink:0}
.m-gana{color:var(--ok-tx)}
.m-pie{display:flex;gap:var(--e2);align-items:center;margin-top:var(--e2);
  padding-top:var(--e2);border-top:1px solid var(--linea)}
.m-estado{min-height:36px;font-size:.82rem;padding:4px 28px 4px 10px;width:auto;flex:1}
.m-seed{font-size:.8rem;color:var(--tinta-3);font-weight:700}

/* ── Llave ────────────────────────────────────────────────────────────────────
   Cada ronda es una columna y sus partidos se reparten a lo alto con
   `space-around`. Eso es lo que hace que la FINAL quede centrada justo en medio de
   las dos semifinales, en vez de pegada arriba al lado de la primera: las columnas
   miden lo mismo (`align-items:stretch`) y cada una distribuye lo suyo por igual.
   Con cuartos, semis y final el efecto encadena solo y el cuadro sale simétrico.   */
.llave{display:grid;gap:var(--e4);align-items:stretch;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,290px),1fr))}
.llave-col{display:flex;flex-direction:column;min-width:0}
.llave-partidos{flex:1;display:grid;grid-auto-rows:1fr;gap:var(--e2);min-width:0;
  container-type:inline-size}
/* REJILLA con `grid-auto-rows:1fr`, no flex. Cada partido ocupa una casilla de igual
   alto y se centra dentro, así que el centro de la final ES la media de los dos de
   arriba: exacto, no aproximado.
   Con flex no lo era: `flex:1` reparte el espacio SOBRANTE, pero una tarjeta no encoge
   por debajo de su contenido, así que en cuanto un nombre ocupaba dos renglones esa
   casilla crecía, las dos semifinales dejaban de medir lo mismo y la final quedaba 5px
   desalineada. `1fr` iguala las filas por la más alta y arrastra la columna entera. */
.llave-partidos > *{flex:1;display:flex;flex-direction:column;justify-content:center}
.llave-col h4{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em;
  color:var(--tinta-3);margin-bottom:var(--e2)}
/* También en claro: era el otro resto marino. Un borde rojo grueso y el nombre en
   grande destacan igual sin volver al fondo oscuro. */
.campeon{background:var(--marca-suave);color:var(--marino);border:2px solid var(--marca);
  border-radius:var(--r);padding:var(--e5);text-align:center;margin-top:var(--e4)}
.campeon .et{font-size:.72rem;text-transform:uppercase;letter-spacing:.16em;color:var(--marca-osc);
  font-weight:800}
.campeon .nm{font-family:var(--f-titulo);font-weight:800;font-size:2rem;letter-spacing:-.02em;text-transform:uppercase;
  line-height:1.1;margin-top:4px}

/* ── Modal ──────────────────────────────────────────────────────────────── */
.modal-fondo{position:fixed;inset:0;
  display:none;align-items:flex-start;justify-content:center;z-index:1200;padding:var(--e4);
  overflow-y:auto}
.modal-fondo.open{display:flex}
.modal{background:var(--papel);border-radius:var(--r-lg);box-shadow:var(--sombra-alta);
  width:100%;max-width:640px;margin:auto;padding:var(--e5);color:var(--tinta)}
.modal h3{font-family:var(--f-titulo);font-weight:700;letter-spacing:-.01em;
  font-size:1.4rem;color:var(--marino);margin-bottom:6px}
.modal .pista{font-size:.92rem;color:var(--tinta-2);margin-bottom:var(--e4);line-height:1.55}
.modal .pista strong{color:var(--tinta)}
.modal-acciones{display:flex;gap:var(--e2);justify-content:flex-end;margin-top:var(--e5);
  flex-wrap:wrap}

/* ── Aviso flotante ─────────────────────────────────────────────────────── */
.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);z-index:2000;
  background:var(--marino);color:#fff;padding:12px 20px;border-radius:var(--r-full);   /* color fijo: blanco sobre el marino, oscuro en los dos modos (app.js lo oscurece a 7:1) */
  font-size:.9rem;font-weight:600;box-shadow:var(--sombra-alta);max-width:92vw;text-align:center}
.toast.error{background:var(--error)}
.toast.success{background:var(--ok)}

/* ── Responsive ─────────────────────────────────────────────────────────── */
@media (max-width:720px){
  .cabecera-in{padding:var(--e4) var(--e4) var(--e3)}
  .cifras{gap:var(--e4)}
  .cifra b{font-size:1.35rem}
  .modal{padding:var(--e4);border-radius:var(--r)}
  .modal-acciones{position:sticky;bottom:0;background:var(--papel);margin:var(--e4) -16px -16px;
    padding:var(--e3) var(--e4);border-top:1px solid var(--linea)}
  .modal-acciones .btn{flex:1}
  .partidos{grid-template-columns:1fr}
  .eventos{grid-template-columns:1fr}
}

/* ── Impresión: la mesa de control trabaja en papel ─────────────────────── */
@media print{
  .barra,.ev,.ev-tabs,.pie-sitio,.modal-fondo,.toast,.no-print,.btn,.tarjeta-pie{display:none!important}
  .marco{display:block;padding:0;max-width:none}
  .grupos{grid-template-columns:1fr}
  body{background:#fff}   /* color fijo: el papel */
  .panel{display:none!important}
  .panel.active{display:block!important}
  .tabla-caja{border:0;overflow:visible}
  thead th{background:#1a1a1a!important;color:#fff!important;   /* color fijo: la cabecera de tabla impresa */
    -webkit-print-color-adjust:exact;print-color-adjust:exact}
  .tarjeta{break-inside:avoid;box-shadow:none}
  a[href]::after{content:""}
}

/* ── Fila de partido ────────────────────────────────────────────────────────
   SIMÉTRICA alrededor del marcador: cuándo · local · MARCADOR · visitante · estado.
   El marcador estaba pegado al borde derecho, así que la fila se leía torcida —los dos
   equipos a un lado y el resultado al otro— y no había forma de saber de un vistazo qué
   número era de quién. Ahora está justo donde estaba el «vs», con los dos equipos
   apuntándolo: local alineado a la derecha y visitante a la izquierda.

   Las dos columnas de equipo son `minmax(0,1fr)` idénticas, así que el marcador cae
   EXACTAMENTE en el centro sin importar cuánto midan los nombres.

   El marcador es un BOTÓN porque abre el detalle: 44px de alto y foco visible. `data-pid`
   va en la fila y en el botón, que es lo que lee `app.js` al guardar.                */
.partidos{container-type:inline-size}
.banda{display:grid;align-items:center;gap:var(--e2) var(--e3);
  grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr) auto;
  grid-template-areas:"cuando local score visita estado";
  background:var(--papel);border:1px solid var(--linea);border-radius:var(--r);
  padding:0 var(--e3) 0 0;min-height:58px;overflow:hidden}
.banda + .banda{margin-top:6px}

/* Cuándo. Números tabulares y ancho fijo para que la columna quede a plomo de fila a
   fila: con ancho automático, «9:00» y «15:30» desalineaban toda la lista. */
.banda-cuando{grid-area:cuando;width:78px;flex-shrink:0;line-height:1.15;
  padding:var(--e2) 0 var(--e2) var(--e3)}
.banda-cuando b{display:block;font-family:var(--f-titulo);font-weight:700;font-size:1rem;
  font-variant-numeric:tabular-nums;color:var(--marino)}
.banda-cuando span{display:block;font-size:.68rem;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;color:var(--tinta-3)}

/* Los dos equipos, en espejo. El local termina contra el marcador y el visitante
   empieza en él: eso es lo que hace que el resultado se lea «de A a B». */
.banda .eq{display:flex;align-items:center;gap:8px;min-width:0}
/* `flex-start` en los DOS, y el de la izquierda invertido con `row-reverse`. Con
   `row-reverse` el eje corre de derecha a izquierda, así que `flex-end` empaqueta al
   borde IZQUIERDO: los nombres se iban a las esquinas y el marcador quedaba solo en
   medio de un desierto. Con `flex-start` los dos equipos se arriman al marcador, que es
   lo que hace que se lea «Naranja 24 – 18 Rojo» de un tirón. */
.banda .eq.izq{grid-area:local;justify-content:flex-start;text-align:right;flex-direction:row-reverse}
.banda .eq.der{grid-area:visita;justify-content:flex-start;text-align:left}
.banda .tope{width:4px;height:22px;border-radius:2px;flex-shrink:0;display:block}
/* Los nombres se PARTEN por palabras, nunca se recortan: «Arepa con h…» y «Arepa de
   qu…» son dos equipos del mismo grupo y del mismo partido. `overflow-wrap` y NO
   `word-break`, que parte a mitad de palabra y en una columna estrecha dejaba una letra
   por renglón. Lo que evita que se llegue a eso es que la llave apile antes de
   estrujar la fila (ver el `@container` de abajo). */
.banda .nm{font-weight:700;font-size:.94rem;color:var(--marino);min-width:0;
  overflow-wrap:break-word;line-height:1.25}
.banda .nm.gana{color:var(--ok-tx)}
.banda .eq .gana-marca{color:var(--ok-tx);flex-shrink:0;font-size:.85rem}
.banda .seed{font-weight:700;color:var(--tinta-3);font-size:.88rem;font-style:italic;
  overflow-wrap:break-word}

.banda-estado{grid-area:estado;display:flex;align-items:center}
.banda-score{grid-area:score;font-family:var(--f-titulo);font-weight:700;font-size:1.05rem;
  min-width:96px;min-height:44px;flex-shrink:0;padding:0 var(--e3);border:0;cursor:pointer;
  border-radius:var(--r-sm);
  background:var(--marca);color:var(--sobre-marca);font-variant-numeric:tabular-nums;
  display:flex;align-items:center;justify-content:center;transition:background .15s}
.banda-score:hover{background:var(--marca-osc-2);color:#fff}   /* color fijo: --marca-osc-2 está a 7:1 del blanco (aplicarMarca) */
.banda-score.pendiente{background:var(--hundido);color:var(--tinta-2)}
/* Un partido en vivo todavía no tiene marcador, así que le tocaba también `.pendiente`:
   la regla de en-vivo le cambiaba el FONDO a rojo pero el color de texto seguía siendo el
   gris de pendiente, y quedaba en 1,98:1 —gris sobre rojo— justo en el partido que todo el
   mundo está mirando. Hay que decir los dos. */
.banda.envivo .banda-score{background:var(--marca-osc-2);color:#fff}   /* color fijo: --marca-osc-2 está a 7:1 del blanco (aplicarMarca) */

/* En vivo: filo rojo a la izquierda y la hora en rojo. Nunca SOLO el color: al lado va
   el distintivo «En vivo». */
.banda.envivo{box-shadow:var(--sombra-activa)}
.banda.envivo .banda-cuando b{color:var(--marca-osc)}
.banda.jugado{background:var(--papel)}
.banda-meta{font-size:.78rem;color:var(--tinta-3);font-weight:600;margin:4px 0 var(--e2);
  padding-left:var(--e3)}
.banda-wrap{min-width:0}

/* Estrecho. Se mide el CONTENEDOR, no la ventana: la misma fila es ancha en un grupo a
   pantalla completa y estrecha dentro de una columna de la llave, y una consulta por
   ventana no distingue esos dos casos. Eso es lo que dejaba los nombres partidos letra a
   letra dentro del cuadro de la llave en un monitor grande.
   Se apila: el cuándo y el marcador arriba, los dos equipos debajo. */
@container (max-width:460px){
  .banda{grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:"cuando score" "local score" "visita score" "estado score";
    padding:0;row-gap:2px}
  .banda-cuando{width:auto;display:flex;align-items:baseline;gap:8px;padding-top:var(--e2)}
  .banda-cuando span::before{content:"· "}
  .banda .eq.izq{justify-content:flex-start;text-align:left;flex-direction:row;padding-left:var(--e3)}
  .banda .eq.der{padding-left:var(--e3)}
  .banda-estado{padding:0 0 var(--e2) var(--e3)}
  .banda-score{align-self:stretch;min-height:100%;border-radius:0;min-width:84px}
}
/* Respaldo por ventana para navegadores sin `@container`. Hace lo mismo en celular,
   que es donde más duele; dentro de la llave se queda con la rejilla ancha, que es
   peor pero legible porque la llave ya apila a una sola columna a esos anchos. */
@supports not (container-type:inline-size){
  @media (max-width:560px){
    .banda{grid-template-columns:minmax(0,1fr) auto;
      grid-template-areas:"cuando score" "local score" "visita score" "estado score";
      padding:0;row-gap:2px}
    .banda-cuando{width:auto;display:flex;align-items:baseline;gap:8px;padding-top:var(--e2)}
    .banda .eq.izq{justify-content:flex-start;text-align:left;flex-direction:row;padding-left:var(--e3)}
    .banda .eq.der{padding-left:var(--e3)}
    .banda-score{align-self:stretch;border-radius:0;min-width:84px}
  }
}
/* ── Panel del staff ────────────────────────────────────────────────────────
   Es la pantalla a la que se llega al iniciar sesión: sus torneos, su gente, su marca y
   su vitrina. Tiene dirección propia (`#/panel`) a propósito — se puede compartir, se
   puede volver con el botón atrás y no es «la portada con otra cosa dentro». */
.panel-cab{display:flex;align-items:flex-end;gap:var(--e4);flex-wrap:wrap;
  margin-bottom:var(--e5);padding-bottom:var(--e4);border-bottom:1px solid var(--linea)}
.panel-cab .tx{flex:1;min-width:240px}
.panel-cab h2{font-family:var(--f-titulo);font-weight:800;font-size:1.7rem;letter-spacing:-.02em;
  color:var(--marino);line-height:1.15}
.panel-cab p{color:var(--tinta-2);font-size:.92rem;margin-top:4px}
.sub-nav{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:var(--e5)}

/* Enlace para compartir. Campo de solo lectura + botón: se copia de un toque y además
   se VE, que es lo que hace falta para pegarlo en un mensaje desde el celular. */
.enlace{display:flex;gap:var(--e2);align-items:center;flex-wrap:wrap}
.enlace input{flex:1;min-width:200px;font-size:.86rem;font-family:var(--f-texto);
  background:var(--hundido);color:var(--tinta-2)}
.enlace .btn{flex-shrink:0}

/* Cuadrícula de ajustes de marca: la muestra al lado de los campos, para ver el cambio
   sin guardar y sin salir. */
input[type=color]{padding:4px;height:var(--toque);cursor:pointer}

/* Detalle del partido: mientras está abierto, el fondo NO se mueve. Sin esto, en
   celular se scrollea la página de atrás y al cerrar has perdido el sitio donde
   estabas —en una mesa de control eso es volver a buscar el partido a mano—. */
body:has(.modal-fondo.open){overflow:hidden}
.det-cab{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:var(--e3)}
.det-eq{display:flex;align-items:center;gap:10px;padding:10px;border-radius:var(--r);
  background:var(--hundido);margin-bottom:var(--e2)}
.det-eq .tope{width:30px;height:30px;border-radius:8px;flex-shrink:0;
  border:1px solid var(--linea)}
.det-eq .nm{font-weight:800;flex:1;min-width:0}
.det-dato{display:flex;justify-content:space-between;gap:12px;padding:7px 0;
  border-bottom:1px solid var(--linea);font-size:.9rem}
.det-dato b{color:var(--marino)}
.det-eq select,.det-eq input,#detEstado{min-height:var(--toque)}
.det-nomina{font-size:.86rem;color:var(--tinta-2);margin-top:4px;line-height:1.5}
