﻿/* Estilos de la interfaz. Pensados para funcionar igual en mÃ³vil, tablet,
   PC y en el navegador de una consola: nada de anchos fijos, todo flexible,
   y objetivos tÃ¡ctiles grandes. */

* { box-sizing: border-box; }

:root {
  --fondo: #0e1a12;
  --panel: rgba(14, 26, 18, 0.92);
  /* Mismo color del panel pero traslÃºcido, para los paneles que se ponen
     ENCIMA del mapa (elegir herramientas, inventario del mÃ³vil) y no deben
     tapar lo que hay que mirar para decidir. Subir el valor = mÃ¡s opaco. */
  --panel-suave: rgba(14, 26, 18, 0.6);
  --panel-borde: rgba(126, 190, 140, 0.28);
  --texto: #eef3e9;
  --tenue: #9db3a3;
  --verde: #7ce49a;
  --ambar: #ffd45e;
  --rojo: #ff7a68;
  --alto-barra: 52px;
}

html, body {
  margin: 0;
  height: 100%;
  overflow: hidden;
  background: var(--fondo);
  color: var(--texto);
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  -webkit-user-select: none;
  user-select: none;
  overscroll-behavior: none;
}

#lienzo {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  touch-action: none;
}

/* ------------------------------------------------------------------ HUD -- */

#hud {
  position: fixed;
  inset: 0;
  pointer-events: none;
  display: none;
  flex-direction: column;
  justify-content: space-between;
}
#hud.visible { display: flex; }
#hud > * { pointer-events: auto; }
/* ...menos los dos carteles, que NO atrapan el ratÃ³n.
   EstÃ¡n siempre en el DOM y sÃ³lo se apagan con `opacity`, asÃ­ que su caja
   seguÃ­a ahÃ­, invisible y en mitad del mapa, comiÃ©ndose los clics: pinchabas
   una loseta de la zona de arriba y no pasaba nada. Y ojo con la especificidad
   â€” `#hud > *` (1,0,0) le gana a `.aviso` (0,1,0), que es justo lo que pasaba
   antes: cada uno declaraba `pointer-events: none` y no servÃ­a de nada. */
#hud > .aviso,
#hud > .espera,
#hud > .cartel { pointer-events: none; }

.barra {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 12px;
  background: var(--panel);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--panel-borde);
}
/* La barra de arriba manda sobre todo lo que se abre encima del mapa: el
   registro, los carteles de ambiente, la barra de reproducciÃ³n. Sin esto el
   registro â€”que es un panel largo y pegado a la derecha, justo debajoâ€” se
   pintaba por encima de sus propios botones, y el de "Registro" caÃ­a dentro:
   podÃ­as abrirlo pero no cerrarlo. Se queda por debajo del panel de elegir
   herramientas (z-index 15) y de "Cargando" (20) a propÃ³sito: Ã©sos hay que
   atenderlos antes de seguir toqueteando la partida. */
.barra.superior {
  justify-content: space-between;
  min-height: var(--alto-barra);
  position: relative;
  z-index: 12;
}
.barra.inferior {
  align-items: flex-end;
  gap: 12px;
  border-bottom: none;
  border-top: 1px solid var(--panel-borde);
  padding-bottom: max(8px, env(safe-area-inset-bottom));
}

/* Ficha de personaje: el inventario sobre el arte original */
.ficha {
  flex: 0 0 auto;
  width: 100%;
  display: block;
  border-radius: 10px;
  background: rgba(0, 0, 0, 0.2);
}

/* En horizontal, el panel de juego va en columna a la izquierda: ficha arriba
   (debajo de la barra) y acciones justo debajo. AsÃ­ el mapa queda despejado. */
@media (min-width: 721px) {
  #hud { justify-content: flex-start; }
  .barra.inferior {
    position: absolute;
    top: calc(var(--alto-barra) + 10px);
    left: 10px;
    width: min(360px, 32vw);
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    border: 1px solid var(--panel-borde);
    border-radius: 13px;
    padding: 10px;
    max-height: calc(100% - var(--alto-barra) - 24px);
    overflow-y: auto;
  }
  .barra.inferior .botones { max-height: none; overflow: visible; }
}

/* EL SELECTOR DE TEMA de la portada: flecha, nombre, flecha.
   Va con flechas y no con una lista porque los temas son pocos y se miran uno a
   uno; y va en la portada porque el tema vale para toda la partida, no para la
   pantalla en la que estÃ©s. Con un solo tema las flechas salen apagadas, para que
   se vea que el sitio existe. */
.tema-selector {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  margin-top: 14px;
  padding-top: 12px;
  border-top: 1px solid var(--panel-borde);
}
.tema-selector .flecha {
  flex: 0 0 auto;
  min-width: 40px;
  padding: 8px 10px;
  font-size: 16px;
  line-height: 1;
  border-radius: 10px;
  border: 1px solid var(--panel-borde);
  background: rgba(255, 255, 255, 0.06);
  color: var(--texto);
  cursor: pointer;
}
.tema-selector .flecha:hover:not(:disabled) { background: rgba(255, 255, 255, 0.14); }
.tema-selector .flecha:disabled { opacity: 0.3; cursor: default; }
.tema-selector .tema-nombre {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  min-width: 9rem;
}
.tema-selector .etiqueta { font-size: 11px; color: var(--tenue); text-transform: uppercase; letter-spacing: 0.06em; }
.tema-selector strong { font-size: 16px; }

.grupo { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.grupo.derecha { justify-content: flex-end; }
.tenue { color: var(--tenue); font-size: 12px; }

#hud-jugador { font-size: 16px; font-weight: 700; }

/* La cuenta atrÃ¡s del turno (sÃ³lo por internet, y sÃ³lo si la sala tiene reloj).
   Va con cifras de ancho fijo y un ancho mÃ­nimo para que la barra no dÃ© un
   respingo cada segundo, al pasar de "1:09" a "1:9" de anchura. */
.reloj {
  display: none;
  min-width: 46px;
  text-align: center;
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  font-size: 14px;
  padding: 3px 7px;
  border-radius: 8px;
  border: 1px solid var(--panel-borde);
  color: var(--tenue);
}
.reloj.visible { display: inline-block; }
/* Cuando el que se queda sin tiempo eres tÃº, se ve. */
.reloj.mio { color: var(--texto); border-color: var(--verde); }
.reloj.apurado { color: var(--rojo); border-color: var(--rojo); }
.reloj.mio.apurado { animation: latir 1s steps(2, end) infinite; }

/* El MISMO reloj, colgado debajo de la barra: es el que se usa en el mÃ³vil (ver
   la plantilla del HUD). Va en absoluto y colgando de la barra â€”como el
   desplegable de las tres rayasâ€” para no darle altura: si la barra creciera, el
   mapa se encogerÃ­a (`medirHud` la mide para encuadrar la isla).

   En pantalla ancha no existe, y por eso se apaga con el ID: `#hud-reloj-movil`
   (un id) le gana a `.reloj.visible` (dos clases), que es lo que enciende al
   otro. AsÃ­ los dos nodos llevan las mismas clases y sÃ³lo se ve el que toca.

   Lleva fondo y sombra porque cae sobre el mapa, y no atrapa el dedo: debajo se
   sigue tocando el tablero. */
#hud-reloj-movil {
  display: none;
  position: absolute;
  top: 100%;
  left: 8px;
  margin-top: 6px;
  z-index: 5;
  font-size: 15px;
  padding: 4px 9px;
  background: var(--panel);
  backdrop-filter: blur(8px);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
  pointer-events: none;
}

@keyframes latir { 50% { opacity: 0.35; } }

.acciones-puntos { display: inline-flex; gap: 4px; }
.acciones-puntos .punto {
  width: 11px; height: 11px; border-radius: 50%;
  background: rgba(255, 255, 255, 0.16);
  border: 1px solid rgba(255, 255, 255, 0.24);
}
/* Blancos, los mismos que rodean la ficha del aventurero en el mapa: es el
   mismo contador visto en dos sitios, asÃ­ que tiene que ser el mismo color. */
.acciones-puntos .punto.lleno { background: #ffffff; border-color: #ffffff; }

.vidas { display: inline-flex; gap: 2px; align-items: center; }
.vidas canvas { display: block; }

button {
  font: inherit;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid var(--panel-borde);
  border-radius: 9px;
  padding: 9px 12px;
  cursor: pointer;
  transition: background 0.12s, border-color 0.12s, transform 0.06s;
}
button:hover:not(:disabled) { background: rgba(255, 255, 255, 0.15); }
button:active:not(:disabled) { transform: translateY(1px); }
button:disabled { opacity: 0.35; cursor: default; }
button.mini { padding: 6px 9px; font-size: 12px; }
button.mini.activa { border-color: var(--ambar); background: rgba(255, 212, 94, 0.2); }

/* El icono del botÃ³n de cÃ¡mara: va con el texto, no encima ni debajo, asÃ­ que
   se mide en "em" para que crezca y encoja con la letra del botÃ³n. El
   desplazamiento de lÃ­nea base lo centra con las mayÃºsculas de al lado. */
.icono-camara {
  width: 1.35em;
  height: 1.35em;
  vertical-align: -0.34em;
  margin-right: 5px;
}

button.principal {
  width: 100%;
  background: var(--verde);
  color: #0c1a12;
  font-weight: 700;
  border-color: transparent;
  padding: 13px;
  margin-top: 6px;
}
/* Sin esto el hover genÃ©rico lo dejaba blanquecino y parecÃ­a deshabilitado. */
button.principal:hover:not(:disabled) {
  background: #a6f2bb;
  box-shadow: 0 0 0 2px rgba(124, 228, 154, 0.35);
}

/* Botones de acciÃ³n.

   Dos filas y no una: arriba las acciones del momento, que van y vienen segÃºn
   lo que se pueda hacer, y ABAJO LAS FIJAS â€”deshacer y pasar turnoâ€”, que estÃ¡n
   en todos los turnos y por eso no se mueven de su sitio nunca. La de arriba es
   la que crece, se parte en varias lÃ­neas y hace scroll si hace falta; la de
   abajo se queda pegada al fondo del panel. */
.acciones-panel {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 8px;
}
.fijas {
  display: flex;
  gap: 6px;
  flex: 0 0 auto;
  border-top: 1px solid var(--panel-borde);
  padding-top: 8px;
  /* Con tres botones (soltar, deshacer, pasar turno) en una pantalla muy
     estrecha el tercio no da para "Pasar turno". Antes que apretarlos hasta
     partirles el texto en dos lÃ­neas, que se caiga uno a la lÃ­nea de abajo. */
  flex-wrap: wrap;
}
/* En la fila de abajo los dos reparten el ancho: son los botones que se buscan
   sin mirar, y un blanco grande y siempre igual es justo lo que hace falta. */
.fijas button.accion { flex: 1 1 0; justify-content: center; white-space: nowrap; }

/* La fila del helicÃ³ptero sÃ³lo existe dentro de su claro: sin botones no deja
   ni el hueco ni la raya de separaciÃ³n. */
.fijas.helicoptero { display: none; }
.fijas.helicoptero.visible { display: flex; }

/* Eligiendo quÃ© soltar, la ficha es un botÃ³n grande: el cursor lo dice. */
.ficha.soltando { cursor: pointer; }

.botones {
  flex: 1 1 auto;
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  align-content: flex-end;
  max-height: 30vh;
  overflow-y: auto;
  scrollbar-width: thin;
}
.botones::-webkit-scrollbar { width: 5px; }
.botones::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.18); border-radius: 3px; }

button.accion {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
  flex: 0 0 auto;
}
button.accion .coste {
  font-size: 10px;
  font-weight: 700;
  background: rgba(255, 255, 255, 0.16);
  border-radius: 5px;
  padding: 1px 5px;
}
button.accion.activa { border-color: var(--ambar); background: rgba(255, 212, 94, 0.18); }
button.accion.destacada { border-color: var(--verde); background: rgba(124, 228, 154, 0.18); }

/* Aviso flotante */
.aviso {
  position: absolute;
  top: calc(var(--alto-barra) + 10px);
  left: 50%;
  transform: translate(-50%, -8px);
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 10px;
  padding: 8px 14px;
  font-size: 13px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.16s, transform 0.16s;
  max-width: 88vw;
  text-align: center;
}
.aviso.visible { opacity: 1; transform: translate(-50%, 0); }
.aviso.error { border-color: var(--rojo); color: var(--rojo); }

/* "No te toca" â€” el letrero de por quÃ© el tablero no responde.
   Va debajo del aviso de esquina y NO se va solo: mientras dure el motivo,
   ahÃ­ sigue. Sin Ã©l, un turno ajeno se confunde con un juego colgado, que es
   justo lo que pasaba en el mÃ³vil. */
.espera {
  position: absolute;
  /* Por debajo del aviso de esquina, que ocupa ese mismo hueco cuando salta. */
  top: calc(var(--alto-barra) + 52px);
  left: 50%;
  transform: translateX(-50%);
  max-width: 88vw;
  display: none;
  align-items: center;
  gap: 8px;
  background: rgba(8, 16, 11, 0.78);
  backdrop-filter: blur(3px);
  border: 1px solid var(--panel-borde);
  border-left: 3px solid var(--ambar);
  border-radius: 10px;
  padding: 8px 13px;
  font-size: 13px;
  color: var(--texto);
  text-align: center;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
}
.espera.visible { display: flex; }

/* Cartel de ambiente
   Va bastante mÃ¡s arriba que el centro para no caer sobre los paneles que se
   abren en mitad del mapa (elegir herramientas) ni sobre la isla, y nunca
   atrapa el ratÃ³n: aparece solo, se va solo y no interrumpe la partida. */
.cartel {
  position: absolute;
  top: 17%;
  left: 50%;
  transform: translate(-50%, 10px) scale(0.98);
  background: rgba(8, 16, 11, 0.62);
  backdrop-filter: blur(2px);
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: 14px;
  padding: 16px 26px;
  font-size: clamp(15px, 3.4vw, 22px);
  font-weight: 600;
  letter-spacing: 0.01em;
  text-align: center;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.7);
  max-width: min(30em, 88vw);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.35s, transform 0.35s;
}
.cartel.visible { opacity: 1; transform: translate(-50%, 0) scale(1); }

/* Registro */
.registro {
  position: absolute;
  top: calc(var(--alto-barra) + 10px);
  right: 10px;
  width: min(330px, 82vw);
  max-height: 46vh;
  overflow-y: auto;
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 11px;
  padding: 9px 11px;
  font-size: 12px;
  line-height: 1.5;
  display: none;
}
.registro.abierto { display: block; }

/* El cajÃ³n de escribir. Vive donde el registro â€”colgando de la barraâ€” y tambiÃ©n
   por encima del mapa, pero a la izquierda para no taparse con Ã©l: se pueden
   querer las dos cosas abiertas a la vez, leyendo lo que pasÃ³ mientras se
   contesta. */
.chat {
  position: absolute;
  top: calc(var(--alto-barra) + 10px);
  left: 10px;
  z-index: 11;
  display: none;
  gap: 6px;
  width: min(420px, calc(100vw - 20px));
  padding: 8px;
  background: var(--panel);
  backdrop-filter: blur(8px);
  border: 1px solid var(--panel-borde);
  border-radius: 12px;
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45);
}
.chat.abierto { display: flex; }
.chat input { flex: 1 1 auto; min-width: 0; }

/* Los bocadillos de lo que se va diciendo. Cuelgan de la barra, debajo del
   cajÃ³n de escribir, y NO atrapan el ratÃ³n: caen sobre el mapa y hay que poder
   seguir jugando por debajo. Se anclan arriba y no abajo porque la barra
   inferior cambia de alto â€”en el mÃ³vil crece con el inventario desplegadoâ€” y
   los bocadillos se le metÃ­an detrÃ¡s. */
.charla {
  position: absolute;
  left: 10px;
  top: calc(var(--alto-barra) + 10px);
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: min(420px, 78vw);
  pointer-events: none;
  /* Por encima del panel de juego (que no lleva z-index) y por debajo de la
     barra de arriba (12): un bocadillo ancho puede llegar a solaparlo. */
  z-index: 11;
}
.charla .globo {
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 12px;
  padding: 7px 11px;
  font-size: 13px;
  line-height: 1.4;
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
}
.charla .globo strong { margin-right: 6px; }
/* Con el cajÃ³n abierto, los bocadillos se apartan y se ponen debajo de Ã©l. */
.chat.abierto ~ .charla { top: calc(var(--alto-barra) + 66px); }

/* En pantalla ancha los bocadillos NO pueden vivir arriba a la izquierda: ahÃ­
   estÃ¡ el panel de juego, que los tapaba entero. Se van al centro de arriba,
   como el resto de mensajes, debajo del hueco del aviso y del letrero de
   espera para no pisarlos. Va DESPUÃ‰S de las reglas de arriba a propÃ³sito:
   misma especificidad, asÃ­ que sÃ³lo gana el que llega el Ãºltimo. */
@media (min-width: 721px) {
  .charla,
  .chat.abierto ~ .charla {
    left: 50%;
    transform: translateX(-50%);
    /* El cajÃ³n de escribir queda a la izquierda y Ã©stos en el centro: ya no se
       estorban, asÃ­ que abrirlo no los mueve. */
    top: calc(var(--alto-barra) + 96px);
    align-items: center;
    text-align: center;
  }
}
.registro .linea { padding: 2px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.05); }

/* Barra de reproducciÃ³n de la partida */
.reproduccion {
  position: absolute;
  left: 50%;
  bottom: 14px;
  transform: translateX(-50%);
  display: none;
  align-items: center;
  gap: 5px;
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 12px;
  padding: 7px 9px;
  backdrop-filter: blur(8px);
  box-shadow: 0 8px 26px rgba(0, 0, 0, 0.45);
  max-width: 96vw;
  flex-wrap: wrap;
  justify-content: center;
}
.reproduccion.visible { display: flex; }
.reproduccion button { padding: 7px 10px; font-size: 13px; line-height: 1; }
.reproduccion button.activa { border-color: var(--ambar); background: rgba(255, 212, 94, 0.2); }
.reproduccion .pos { font-size: 12px; color: var(--tenue); padding: 0 6px; white-space: nowrap; }
.reproduccion .continuar { border-color: var(--verde); background: rgba(124, 228, 154, 0.16); }

/* Fin de partida */
.fin {
  position: absolute;
  inset: 0;
  display: none;
  place-items: center;
  background: rgba(6, 12, 8, 0.82);
  backdrop-filter: blur(3px);
}
.fin.visible { display: grid; }
.fin .panel {
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 16px;
  padding: 26px;
  text-align: center;
  max-width: 460px;
  margin: 16px;
}
.fin h2 { margin: 0 0 16px; font-size: 20px; line-height: 1.4; }

/* Las cuentas del final: una columna por aventurero.

   La tabla puede crecer, asÃ­ que el panel se limita en alto y hace scroll por
   dentro â€” en un mÃ³vil tumbado, si no, el botÃ³n de "Jugar otra partida" se iba
   por debajo de la pantalla y la partida no tenÃ­a salida. */
.fin .panel { max-height: 82vh; overflow-y: auto; }
.fin-datos:not(:empty) { margin: 0 0 18px; }
.tabla-fin {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
  text-align: right;
}
.tabla-fin th, .tabla-fin td { padding: 4px 6px; }
/* La primera columna es el rÃ³tulo de la fila: a la izquierda y en tenue, que lo
   que hay que comparar de un vistazo son los nÃºmeros. */
.tabla-fin tbody th { text-align: left; font-weight: 400; color: var(--tenue); }
.tabla-fin thead th { border-bottom: 1px solid var(--panel-borde); font-size: 12px; }
.tabla-fin tbody tr:nth-child(odd) { background: rgba(255, 255, 255, 0.03); }
.tabla-fin tr.acabo th, .tabla-fin tr.acabo td {
  border-top: 1px solid var(--panel-borde);
  padding-top: 8px;
  font-size: 12px;
}
.tabla-fin tr.acabo td { color: var(--texto); }
.fin-resumen { margin: 10px 0 0; font-size: 12px; color: var(--tenue); }

/* Los dos de refuerzo, debajo de "Jugar otra partida": salir y guardar.

   Verdes como el principal â€”son la misma familia de "y ahora quÃ© hago"â€” pero
   perfilados en vez de macizos, para que el de arriba siga siendo el que mÃ¡s
   pesa. En una pantalla estrecha se apilan solos en vez de encogerse hasta que
   el texto no cabe. */
.fin-botones {
  display: flex;
  gap: 8px;
  margin-top: 8px;
  flex-wrap: wrap;
}
button.secundaria {
  flex: 1 1 140px;
  padding: 11px;
  font-weight: 600;
  color: var(--verde);
  border-color: var(--verde);
  background: rgba(124, 228, 154, 0.12);
}
button.secundaria:hover:not(:disabled) { background: rgba(124, 228, 154, 0.24); }

/* ----------------------------------------------------------------- MenÃº -- */

#menu {
  position: fixed;
  inset: 0;
  display: none;
  place-items: center;
  overflow-y: auto;
  /* El margen entre el recuadro y el borde de la pantalla. Es una variable
     porque las instrucciones NECESITAN saberlo para calcular su alto (ver
     `.instrucciones`): si se cambia aquÃ­ y allÃ­ no, la hoja se pasa de largo. */
  --menu-margen: 16px;
  /* Lo que se ve mientras la foto carga, y lo que queda si el tema no trae
     ninguna: los dos halos verdes de siempre sobre `--fondo`. */
  background:
    radial-gradient(circle at 30% 20%, rgba(60, 130, 80, 0.22), transparent 55%),
    radial-gradient(circle at 75% 75%, rgba(40, 90, 60, 0.22), transparent 55%),
    var(--fondo);
  padding: var(--menu-margen);
}

/* LA FOTO DEL MENÃš SE VE ENTERA, Y POR ESO VAN DOS CAPAS Y NO UNA.

   Con `contain` la foto cabe entera, pero deja bandas muertas donde la pantalla
   no tiene su misma proporciÃ³n. AsÃ­ que se pinta dos veces, como hacen los
   reproductores de vÃ­deo con un vÃ­deo vertical:

     Â· `::before` es el relleno â€” la misma foto en `cover`, muy desenfocada y
       apagada. No se mira, sÃ³lo tapa las bandas y da el color;
     Â· `::after` es la foto de verdad, en `contain` y tal cual es: sin velo, sin
       filtros, sin nada encima. La foto es el menÃº, y se mira. Lo que tiene que
       leerse encima va dentro del recuadro, que tiene su propio fondo oscuro y
       se defiende solo (ver `#menu .panel-menu` mÃ¡s abajo).

   Las dos van en pseudoelementos y no en capas del `background` por dos motivos:
   el desenfoque es un `filter` y un `filter` se aplica al elemento entero â€”
   puesto en `#menu` habrÃ­a emborronado tambiÃ©n los botonesâ€”, y en `fixed` se
   quedan quietas mientras el menÃº se desplaza por dentro (ver abajo).

   `--fondo-menu` la elige el bloque de orientaciÃ³n de mÃ¡s abajo; las rutas de
   las dos fotos las pone `pintarFondoDelMenu` en app.js. */
#menu::before,
#menu::after {
  content: '';
  /* FIJAS, NO ABSOLUTAS: `#menu` tiene `overflow-y: auto` para que en una
     pantalla baja se pueda bajar hasta el Ãºltimo botÃ³n, y con `absolute` el
     fondo se iba hacia arriba con el contenido. En `fixed` se quedan pegadas a
     la pantalla y sÃ³lo se mueve el menÃº, que es lo que se espera de un fondo.
     Vale igual en el mÃ³vil, donde esto se nota mucho mÃ¡s. */
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}
#menu::before {
  background: var(--fondo-menu, none) center / cover no-repeat;
  /* El `scale` tapa el borde transparente que deja el desenfoque al difuminar
     contra el canto de la caja. */
  filter: blur(34px) brightness(0.55) saturate(0.8);
  transform: scale(1.12);
}
#menu::after {
  background: var(--fondo-menu, none) center / contain no-repeat;
}

/* CUÃL DE LAS DOS FOTOS, POR ORIENTACIÃ“N.

   Una foto vertical no cabe entera en una pantalla tumbada sin encogerse hasta
   quedar mÃ¡s estrecha que el panel â€”que es justo lo que la tapabaâ€”, asÃ­ que el
   tema trae las dos y aquÃ­ se elige. Lo decide el CSS y no JavaScript porque
   girar el mÃ³vil es un cambio de medio, no un evento que haya que atender: al
   girarlo se cambia sola, sin repintar nada.

   De pie es la vertical, y es tambiÃ©n lo que se usa si no se sabe. */
#menu { --fondo-menu: var(--fondo-menu-v, none); }

@media (orientation: landscape) {
  #menu { --fondo-menu: var(--fondo-menu-h, none); }
}

/* El contenido, por encima de las dos capas de fondo. */
#menu > * { position: relative; z-index: 1; }
#menu.visible { display: grid; }

.panel-menu {
  width: min(460px, 100%);
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 18px;
  /* A los lados 15 y no 22: con los ajustes a dos columnas, cada pÃ­xel que se
     le quita al margen se lo lleva el contenido, y en el mÃ³vil los dos
     desplegables de una fila iban justos. Arriba y abajo se queda el aire de
     siempre, que ahÃ­ no falta sitio. */
  padding: 22px 15px;
}
/* En el menÃº principal y sus submenÃºs el recuadro deja pasar un poco la foto
   del fondo: lo justo para que se vea que hay isla debajo, sin que los botones
   pierdan contraste. SÃ³lo aquÃ­ â€” los paneles que salen ENCIMA del mapa tienen
   su propia transparencia (`--panel-suave`) y otro motivo para tenerla. */
#menu .panel-menu { background: rgba(14, 26, 18, 0.72); }

/* `line-height: 1` por lo mismo que en `.titulo-pantalla`: el aire de arriba
   del recuadro lo pone el padding, no el interlineado del tÃ­tulo. */
.panel-menu h1 { margin: 0; font-size: 26px; line-height: 1; letter-spacing: 0.3px; }
.panel-menu .subtitulo { margin: 4px 0 18px; color: var(--tenue); font-size: 13px; }

/* El nombre del juego, centrado y con aire hasta la primera opciÃ³n. */
.panel-menu h1.titulo-juego { text-align: center; margin-bottom: 20px; }

/* Las pestaÃ±as del menÃº: son dos menÃºs distintos (local y en lÃ­nea), no un
   ajuste, asÃ­ que van arriba del todo y por encima del tÃ­tulo. */
.pestanas {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 16px;
}
.pestanas .pestana { flex: 1 1 auto; padding: 10px 8px; font-size: 13px; white-space: nowrap; }
.pestanas .pestana.activa {
  border-color: var(--verde);
  background: rgba(124, 228, 154, 0.18);
  font-weight: 700;
}

.campo {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 10px;
  font-size: 14px;
}
.campo > span { color: var(--tenue); }

/* LOS AJUSTES DE PARTIDA, A DOS COLUMNAS.
   Diez controles en una sola columna no cabÃ­an en una pantalla de mÃ³vil: habÃ­a
   que ir bajando para ver lo que se estaba configurando, y al llegar abajo ya
   no se veÃ­a lo de arriba. Emparejados, la configuraciÃ³n entera se lee de un
   vistazo en el mÃ³vil y en el PC.

   Dentro de la rejilla el rÃ³tulo va ENCIMA del control y no al lado: al lado no
   hay sitio en media columna, y encima queda ademÃ¡s todo alineado entre las dos
   â€”los nombres arriba, los desplegables debajoâ€”.

   `.ancho` es para lo que se lee mejor de lado a lado (los caminos, la semilla):
   ocupa la fila entera. */
.rejilla-campos {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 12px;
  margin-bottom: 10px;
}
.rejilla-campos .campo {
  flex-direction: column;
  align-items: stretch;
  gap: 5px;
  margin-bottom: 0;
  min-width: 0;
}
.rejilla-campos .campo.ancho { grid-column: 1 / -1; }
/* El control se lleva el ancho de su celda: aquÃ­ ya no hay un ancho fijo que
   respetar, lo pone la columna. */
.rejilla-campos .campo select,
.rejilla-campos .campo input,
.rejilla-campos .campo .paso-selector {
  width: 100%;
  min-width: 0;
}
/* Los rÃ³tulos de la rejilla pueden ser largos ("ReapariciÃ³n de enemigos") y la
   media columna es estrecha: se recortan con puntos suspensivos en vez de
   partir la fila en dos y descuadrar las alturas. El tÃ­tulo completo sigue
   estando en el `title` del control. */
.rejilla-campos .campo > span {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  /* Centrados sobre lo suyo, como las cabeceras de la lista de aventureros:
     el control de debajo ocupa la celda entera, asÃ­ que un rÃ³tulo pegado a la
     izquierda quedaba descolgado de lo que nombra. */
  text-align: center;
}
/* Lo que todavÃ­a no funciona se ve que no funciona: hoy, los dos de los bots. */
.rejilla-campos .campo select:disabled { opacity: 0.45; cursor: not-allowed; }
/* Todos los desplegables del menÃº miden lo mismo y acaban en la misma lÃ­nea:
   con anchos distintos el menÃº parecÃ­a una lista de campos sueltos. Lo que no
   quepa (el nombre largo de una densidad) se recorta con puntos suspensivos. */
.campo select, .campo input, .campo .paso-selector {
  font: inherit;
  font-size: 14px;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid var(--panel-borde);
  border-radius: 9px;
  padding: 9px 10px;
  flex: 0 0 auto;
  width: 210px;
  max-width: 100%;
  text-overflow: ellipsis;
}

/* LA FLECHITA DEL DESPLEGABLE, dibujada por nosotros y no por el navegador.
   La nativa se pega al borde derecho â€”cada navegador la pone donde quiereâ€” y
   con el borde redondeado quedaba apretujada contra la esquina. AquÃ­ se apaga
   el dibujo del sistema y se pinta un triÃ¡ngulo con su aire por la derecha; el
   `padding-right` reserva su hueco para que un nombre largo no se le meta
   debajo. SÃ³lo en los campos del menÃº: los desplegables de una sola cifra
   (campamento, equipo) son demasiado estrechos para gastar 30px en esto.
   El color del triÃ¡ngulo va escrito a mano y no como `var(--texto)` porque
   dentro de un `data:` no se pueden usar variables; es el mismo valor, y si
   algÃºn dÃ­a `--texto` cambia hay que cambiarlo aquÃ­ tambiÃ©n. */
.campo select {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  padding-right: 30px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='7' viewBox='0 0 10 7'><path d='M1 1l4 4 4-4' fill='none' stroke='%23eef3e9' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/></svg>");
  background-repeat: no-repeat;
  background-position: right 14px center;
}
/* Firefox pinta el texto de la opciÃ³n con un relleno propio; se le quita para
   que el recorte con puntos suspensivos siga cayendo antes de la flecha. */
.campo select:-moz-focusring { color: transparent; text-shadow: 0 0 0 var(--texto); }

/* EL SELECTOR DE PASOS del menÃº (hoy, el reloj por turno): flecha, valor,
   flecha. Es el mismo gesto que el selector de tema de la portada, y va asÃ­
   â€”y no con una casilla de escribirâ€” porque los topes son parte de la regla:
   lo que no se puede elegir no se puede teclear. */
.campo .paso-selector {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 4px 6px;
}
.campo .paso-selector .flecha {
  flex: 0 0 auto;
  min-width: 26px;
  padding: 6px 6px;
  font: inherit;
  font-size: 14px;
  line-height: 1;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--panel-borde);
  border-radius: 7px;
  cursor: pointer;
}
.campo .paso-selector .flecha:hover:not(:disabled) { background: rgba(255, 255, 255, 0.16); }
.campo .paso-selector .flecha:disabled { opacity: 0.3; cursor: default; }
.campo .paso-valor {
  flex: 1 1 auto;
  text-align: center;
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* El desplegable desplegado lo pinta el sistema: hay que darle color explÃ­cito
   o sale blanco con letra gris (ilegible sobre el tema oscuro). */
select, option, optgroup {
  color-scheme: dark;
  background-color: #16261b;
  color: var(--texto);
}
option:checked, option:hover { background-color: #24422c; }

.titulo-grupo { font-size: 12px; color: var(--tenue); margin-bottom: 8px; line-height: 1.4; }

/* Los dos rÃ³tulos de "En lÃ­nea". Van centrados y con el mismo cuerpo que los
   campos del formulario: no son letra pequeÃ±a de un ajuste, sino los tÃ­tulos de
   las dos mitades del menÃº. */
.rotulo-online { font-size: 14px; text-align: center; }

/* Y la raya parte esas dos mitades â€”entrar en la sala de otro y montar la
   tuyaâ€”, para que el formulario de abajo no parezca la continuaciÃ³n del cÃ³digo
   de sala de arriba. */
.separador-o {
  margin-top: 18px;
  padding-top: 14px;
  border-top: 1px solid rgba(255, 255, 255, 0.12);
}

/* Lista de aventureros del menÃº: foto + nombre + herramientas */
.jugadores-lista { margin: 16px 0; }
.jugador-fila {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 9px;
  padding: 8px;
  background: rgba(255, 255, 255, 0.05);
  border-radius: 11px;
}
.jugador-fila .foto {
  position: relative;
  flex: 0 0 auto;
  width: 56px; height: 56px;
  padding: 0;
  background: rgba(0, 0, 0, 0.3);
  border-radius: 50%;
  /* Sin `border-color`: lo pone la fila con el color del aventurero. En la
     pantalla de entrar por enlace, donde todavÃ­a no hay color, va el del panel. */
  border: 2px solid var(--panel-borde);
  overflow: hidden;
  cursor: pointer;
  display: grid;
  place-items: center;
}
.jugador-fila .foto canvas {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
}
/* LA GALERÃA DE CARAS, igual que la paleta de color y por el mismo motivo: se
   pulsa lo que se quiere cambiar â€”la propia caraâ€” y se despliega debajo lo que
   hay para elegir. Antes esto era un `<input type="file">`, y con Ã©l se colaba
   en la mesa de todos cualquier imagen, de cualquier tamaÃ±o y de cualquier
   asunto; ahora sÃ³lo se puede elegir entre las ocho que trae el tema. */
.selector-retrato { position: relative; flex: 0 0 auto; }
.selector-retrato .galeria {
  position: absolute;
  top: calc(100% + 6px);
  left: -6px;
  z-index: 5;
  display: grid;
  grid-template-columns: repeat(4, 56px);
  gap: 6px;
  padding: 8px;
  background: #16261b;
  border: 1px solid var(--panel-borde);
  border-radius: 11px;
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.5);
}
.selector-retrato .cara {
  width: 56px; height: 56px;
  padding: 0;
  border-radius: 50%;
  border: 2px solid transparent;
  overflow: hidden;
  cursor: pointer;
  background: rgba(0, 0, 0, 0.3);
}
.selector-retrato .cara img { display: block; width: 100%; height: 100%; object-fit: cover; }
.selector-retrato .cara:hover { border-color: var(--verde); }
/* La que ya lleva otro, apagada y sin pulsar, igual que el color ocupado. */
.selector-retrato .cara.ocupado { opacity: 0.3; cursor: not-allowed; }
.selector-retrato .cara.ocupado:hover { border-color: transparent; }
.jugador-datos { flex: 1 1 auto; display: flex; flex-direction: column; gap: 6px; min-width: 0; }

/* LA FILA DE UN BOT. Es una fila como las demÃ¡s â€”un bot sale de un campamento y
   lleva su color en el tablero igual que una personaâ€” y lo Ãºnico que le falta
   es el nombre que teclear: se llama como su personaje. La chapa estÃ¡ para no
   tener que contar filas para saber quiÃ©n es quiÃ©n. */
.jugador-fila.bot { background: rgba(255, 255, 255, 0.03); }
.jugador-fila .nombre-bot {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
  padding: 7px 9px;
  font-size: 14px;
  font-weight: 600;
  color: var(--tenue);
  background: rgba(0, 0, 0, 0.2);
  border: 1px dashed;
  border-radius: 8px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.jugador-fila .nombre-bot b {
  flex: 0 0 auto;
  padding: 1px 5px;
  font-size: 10px;
  letter-spacing: 0.08em;
  color: #0b140e;
  background: var(--tenue);
  border-radius: 5px;
}
.jugador-datos input.nombre {
  font: inherit;
  font-size: 14px;
  font-weight: 600;
  color: var(--texto);
  background: rgba(0, 0, 0, 0.3);
  border: 1px solid;
  border-radius: 8px;
  padding: 7px 9px;
  width: 100%;
}
/* Las cuatro columnas de la lista de aventureros â€”foto, nombre, color y
   campamentoâ€” y su cabecera comparten rejilla: es lo que hace que cada leyenda
   caiga centrada justo encima de lo suyo. El nombre se lleva todo el sitio que
   sobra, que es el dato que hay que poder leer. */
.jugadores-lista .cabecera-aventureros,
.jugadores-lista .jugador-fila {
  display: grid;
  /* La Ãºltima columna es de 38px porque ya no lleva un desplegable sino el
     mismo botÃ³n de 30px que el color: la flecha del desplegable pedÃ­a 62px
     para enseÃ±ar un nÃºmero de una cifra. Esos 24px se los queda el nombre,
     que en el mÃ³vil era lo Ãºnico que iba justo. */
  grid-template-columns: 56px minmax(0, 1fr) 44px 38px;
  gap: 10px;
  align-items: center;
}
.cabecera-aventureros {
  font-size: 11px;
  color: var(--tenue);
  margin-bottom: 6px;
  padding: 0 8px;
  text-align: center;
}
.cabecera-aventureros span { min-width: 0; }

/* EL CAMPAMENTO (o el equipo) SE ELIGE COMO EL COLOR Y COMO LA CARA: se pulsa
   el nÃºmero que llevas y debajo se despliega la cuadrÃ­cula con los que hay.
   Vale igual para el menÃº y para la pantalla de sala.

   Era un desplegable, y el problema no era el desplegable sino su flecha: para
   enseÃ±ar un nÃºmero de una cifra pedÃ­a 62px de columna, y en el mÃ³vil esos
   pÃ­xeles le hacÃ­an falta al nombre del aventurero, que es lo Ãºnico de la fila
   que de verdad hay que leer. Un nÃºmero de 30x30 dice lo mismo en la mitad.

   La cuadrÃ­cula es de dos columnas y no hace falta mÃ¡s: los cuatro campamentos
   caen DOS Y DOS â€”que es como se leen de un vistazoâ€” y los dos equipos llenan
   una sola fila sin dejar hueco debajo. */
.selector-numero { position: relative; display: grid; place-items: center; }
.selector-numero .muestra {
  width: 30px;
  height: 30px;
  padding: 0;
  font: inherit;
  font-size: 14px;
  font-weight: 700;
  line-height: 1;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid var(--panel-borde);
  border-radius: 8px;
  cursor: pointer;
}
.selector-numero .muestra:hover { background: rgba(255, 255, 255, 0.16); }
.selector-numero .rejilla {
  position: absolute;
  top: calc(100% + 6px);
  right: -6px;
  z-index: 5;
  display: grid;
  grid-template-columns: repeat(2, 30px);
  gap: 6px;
  padding: 8px;
  background: #16261b;
  border: 1px solid var(--panel-borde);
  border-radius: 11px;
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.5);
}
.selector-numero .numero {
  width: 30px;
  height: 30px;
  padding: 0;
  font: inherit;
  font-size: 14px;
  font-weight: 700;
  line-height: 1;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid var(--panel-borde);
  border-radius: 7px;
  cursor: pointer;
}
.selector-numero .numero:hover { background: rgba(255, 255, 255, 0.2); }

/* CADA CAMPAMENTO VA DEL COLOR DE QUIEN LO LLEVA, y `--dueno` lo trae puesto
   desde el HTML. Si eres el rojo y ves el 2 en rojo, Ã©se es el tuyo: no hay que
   leer nada mÃ¡s, y es el mismo cÃ³digo de colores con el que vas a mirar el
   tablero luego.

   Ninguno se apaga, al revÃ©s que en la paleta de color: el campamento es un
   reparto y pedir el de otro os lo intercambia. El borde de color dice con
   quiÃ©n estÃ¡s cambiando ANTES de pulsar.

   *(El que llevas puesto salÃ­a antes en verde, el verde de "elegido" que usa
   todo el menÃº. En una mesa con jugador verde eso eran dos verdes distintos
   diciendo cosas distintas en la misma cuadrÃ­cula.)* */
.selector-numero .numero.ocupado {
  border-color: var(--dueno);
  border-width: 2px;
}
/* Y EL TUYO, ADEMÃS, RELLENO: entre cuatro bordes de color hay que poder
   seÃ±alar el propio de un vistazo. El nÃºmero va oscuro porque los colores de
   los aventureros son vivos â€” el mismo apaÃ±o que la muestra ocupada de la
   paleta. */
.selector-numero .numero.mio {
  background: var(--dueno);
  color: #0b140e;
}
.selector-numero .numero.mio:hover { background: var(--dueno); filter: brightness(1.15); }

/* El botÃ³n cerrado lleva tu color en el borde, que es de quien es el nÃºmero. */
.selector-numero .muestra { border-width: 2px; }

/* EL EQUIPO SÃ VA EN VERDE, el verde de "esto es lo que estÃ¡ elegido" que usa
   todo el menÃº. AquÃ­ no choca con nada: un equipo es un 1 o un 2, no es de
   nadie, y no hay ningÃºn color de aventurero con el que confundirlo. */
.selector-numero .numero.puesto {
  border-color: var(--verde);
  background: rgba(124, 228, 154, 0.22);
}

/* El color se elige por el cuadradito y ya estÃ¡. Un desplegable normal obliga a
   escribir el nombre de cada color, y ese nombre se comÃ­a el ancho del nombre
   del aventurero sin decir nada que el propio color no diga mejor. */
.selector-color { position: relative; display: grid; place-items: center; }
.selector-color .muestra {
  width: 30px;
  height: 30px;
  padding: 0;
  border-radius: 8px;
  border: 1px solid rgba(255, 255, 255, 0.35);
}
/* El color que ya lleva otro sale tachado y no se deja pulsar: dos aventureros
   del mismo color no se distinguen en el tablero, que es donde importa. */
.selector-color .muestra.ocupado {
  position: relative;
  opacity: 0.45;
  cursor: not-allowed;
}
.selector-color .muestra.ocupado::after {
  content: "âœ•";
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  font-size: 17px;
  font-weight: 700;
  color: #0b140e;
  text-shadow: 0 0 3px rgba(255, 255, 255, 0.65);
}
.selector-color .paleta {
  position: absolute;
  top: calc(100% + 6px);
  right: -6px;
  z-index: 5;
  display: grid;
  grid-template-columns: repeat(4, 30px);
  gap: 6px;
  padding: 8px;
  background: #16261b;
  border: 1px solid var(--panel-borde);
  border-radius: 11px;
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.5);
}

.jugador-datos select {
  font: inherit;
  font-size: 13px;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid var(--panel-borde);
  border-radius: 8px;
  padding: 6px 8px;
  width: 100%;
}

/* Resumen de una partida guardada: los ajustes con los que se jugÃ³, para poder
   reconocerla antes de entrar. Es de LECTURA â€” ninguno de estos datos se puede
   cambiar, asÃ­ que no van en campos de formulario. */
.resumen-partida { margin-bottom: 12px; }
.resumen-partida .dato {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 6px 8px;
  font-size: 13px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.resumen-partida .dato span { color: var(--tenue); }
.resumen-partida .dato strong { text-align: right; font-weight: 600; }

.resumen-jugadores { margin-bottom: 8px; }
.dato-jugador {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 8px;
  margin-bottom: 6px;
  font-size: 13px;
  background: rgba(255, 255, 255, 0.05);
  border-radius: 9px;
}
.punto-color {
  flex: 0 0 auto;
  width: 14px; height: 14px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.35);
}
.dato-nombre { flex: 1 1 auto; font-weight: 600; min-width: 0; }
.dato-estado { color: var(--tenue); font-size: 12px; text-align: right; }

/* --- Pantalla de salas (partida por internet) ------------------------------
   Reaprovecha el panel del menÃº; sÃ³lo hace falta la lista de quiÃ©n ha llegado
   y el cÃ³digo de la sala, que es lo que la gente se dicta por telÃ©fono. */

.codigo-sala {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  letter-spacing: 3px;
  color: var(--ambar);
}

.sala-lista { margin-bottom: 12px; }

/* El enlace de la sala se lee entero: la leyenda va encima y el campo ocupa el
   ancho del panel, con el botÃ³n de copiar reducido a su icono al lado. Con la
   leyenda a la izquierda (como los campos del menÃº) la direcciÃ³n salÃ­a cortada,
   que es justo lo que no puede pasar con lo Ãºnico que hay que repartir. */
.fila-enlace { display: flex; gap: 8px; align-items: stretch; margin-bottom: 10px; }
.fila-enlace input {
  flex: 1 1 auto;
  min-width: 0;
  font: inherit;
  font-size: 13px;
  color: var(--texto);
  background: rgba(0, 0, 0, 0.3);
  border: 1px solid var(--panel-borde);
  border-radius: 9px;
  padding: 9px 10px;
}
button.mini.icono { font-size: 17px; line-height: 1; padding: 8px 11px; }
button.mini.icono.hecho { border-color: var(--verde); background: rgba(124, 228, 154, 0.2); }

.sala-fila {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
  padding: 8px;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid transparent;
  border-radius: 11px;
}
/* Quien ya ha dicho "listo" se ve de un vistazo: es lo Ãºnico que hay que mirar
   en esta pantalla mientras se espera. */
.sala-fila.listo { border-color: var(--verde); background: rgba(120, 220, 150, 0.12); }
.sala-fila.vacia { opacity: 0.5; justify-content: center; padding: 14px 8px; }

/* El aro lleva el color del aventurero: es como se le va a ver en el tablero,
   asÃ­ que un choque de colores se detecta aquÃ­, antes de empezar. */
.sala-foto {
  flex: 0 0 auto;
  width: 44px; height: 44px;
  border-radius: 50%;
  border: 2px solid var(--panel-borde);
  background: rgba(0, 0, 0, 0.3);
}
/* El campamento de la sala: el mismo botÃ³n de 30px del menÃº (ver
   `.selector-numero`), que aquÃ­ tambiÃ©n le devuelve sitio al nombre. */
.sala-fila > .selector-numero { flex: 0 0 auto; }
.sala-hueco { font-size: 13px; color: var(--tenue); }
.sala-datos { flex: 1 1 auto; display: flex; flex-direction: column; min-width: 0; }
.sala-nombre { font-size: 14px; font-weight: 600; }
.sala-estado { font-size: 12px; color: var(--tenue); }

.aviso-error {
  margin: 10px 0;
  padding: 9px 11px;
  font-size: 13px;
  border-radius: 9px;
  color: #ffd9d0;
  background: rgba(255, 110, 80, 0.16);
  border: 1px solid rgba(255, 110, 80, 0.4);
}

.pista { color: var(--tenue); font-size: 12px; line-height: 1.6; margin: 14px 0 0; }

/* Campos que sÃ³lo salen cuando hacen falta (el reloj a medida, por ejemplo). */
.oculto { display: none !important; }

.cargar {
  display: block;
  margin-top: 8px;
  padding: 11px;
  text-align: center;
  font-size: 13px;
  color: var(--texto);
  background: rgba(255, 255, 255, 0.07);
  border: 1px dashed var(--panel-borde);
  border-radius: 9px;
  cursor: pointer;
}
.cargar:hover { background: rgba(255, 255, 255, 0.13); }

/* La lista de tutoriales: botones altos, de tres renglones, porque hay que
   elegir leyendo y no adivinando quÃ© hay dentro de cada uno. */
.lista-tutoriales { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
button.tutorial {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 3px;
  text-align: left;
  padding: 12px 14px;
  white-space: normal;
}
button.tutorial .tutorial-titulo { font-weight: 700; font-size: 14px; }
button.tutorial .tutorial-resumen { font-size: 12px; color: var(--tenue); line-height: 1.4; }
button.tutorial .tutorial-datos { font-size: 11px; color: var(--tenue); opacity: 0.75; }

/* ------------------------------------------------------ Portada del menÃº -- */

/* El tÃ­tulo FUERA del recuadro y las banderas debajo, tambiÃ©n fuera: el
   recuadro es la lista de sitios a los que se puede ir, y nada mÃ¡s. AsÃ­ el
   fondo se puede cambiar por una imagen sin tocar nada de esto. */
.portada {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  width: min(420px, 100%);
  margin: 0 auto;
}
.portada .titulo-juego { margin: 0; text-align: center; }
.portada .panel-menu { width: 100%; margin: 0; }
/* DOS COLUMNAS, y en el mÃ³vil tambiÃ©n: son botones cortos y en una sola columna
   la lista se iba fuera de la pantalla, que es lo que obligaba a bajar para ver
   el final del menÃº. El emparejado lo decide el orden de `OPCIONES` en app.js;
   `.ancho` es para lo que va solo en su fila. */
.opciones-portada {
  display: grid;
  /* `minmax(0, ...)` y no `1fr` a secas: un hijo de rejilla trae `min-width:
     auto`, asÃ­ que un texto largo â€”una traducciÃ³n futura, un tema con nombres
     largosâ€” ensancharÃ­a su columna en vez de recortarse. Hoy no sobra ancho ni
     falta: a 390px la portada mide 358 y cada botÃ³n 159. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 8px;
}
.opciones-portada > * { min-width: 0; }
.opcion-menu.ancho { grid-column: 1 / -1; }
/* El cÃ³digo de sala y el tema no son opciones: ocupan la fila entera. */
.opciones-portada .entrar-rapido,
.opciones-portada .tema-selector { grid-column: 1 / -1; }
.portada .idiomas { justify-content: center; margin: 0; }

/* La versiÃ³n, al pie y sin llamar la atenciÃ³n: se busca cuando hace falta y el
   resto del tiempo no estorba.

   PERO VA SOBRE LA FOTO, no dentro del recuadro, asÃ­ que no puede ir en
   `--tenue` y apagada como el texto secundario de un panel: sobre una playa o
   un claro de sol desaparecÃ­a. Lleva el color de texto normal â€”bajado sÃ³lo un
   pocoâ€” y una sombra oscura que la despega de cualquier fondo, que es lo mismo
   que hacen los rÃ³tulos que van encima del mapa. */
.pie-version {
  margin: 0;
  text-align: center;
  font-size: 12px;
  color: var(--texto);
  opacity: 0.9;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.9), 0 0 12px rgba(0, 0, 0, 0.7);
}

.opcion-menu {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 13px 12px;
  font-size: 16px;
  font-weight: 700;
}
/* Lo que todavÃ­a no existe se ve, pero se ve apagado y lo dice. Un menÃº tambiÃ©n
   es el mapa de lo que va a haber. */
.opcion-menu.pendiente { opacity: 0.5; cursor: default; }
.opcion-menu .pronto {
  font-size: 11px;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  opacity: 0.8;
}

/* Entrar en la sala de otro sin pasar por "En lÃ­nea": es lo que mÃ¡s prisa
   corre â€”te estÃ¡n esperandoâ€” asÃ­ que va aquÃ­, pequeÃ±o pero a un toque. */
.entrar-rapido { display: flex; gap: 6px; margin-top: 6px; }
/* El cÃ³digo va centrado, en negrita y con mÃ¡s letra: son cinco caracteres que
   se teclean mirando el mÃ³vil de otro o al dictado por telÃ©fono, asÃ­ que
   conviene leerlos de un vistazo mientras se escriben. (El campo del submenÃº
   "En lÃ­nea" se queda como los demÃ¡s: allÃ­ estÃ¡ dentro de un formulario y
   alinearlo distinto lo descolocarÃ­a.) */
.entrar-rapido input {
  flex: 1 1 auto;
  min-width: 0;
  text-transform: uppercase;
  text-align: center;
  font-weight: 700;
  letter-spacing: 0.12em;
}
/* En verde para que destaque: entrar en la sala de alguien es lo que mÃ¡s prisa
   corre de todo el menÃº. Y con el ancho suelto â€” los botones verdes llevan
   `width: 100%` de serie, que dentro de un flex se come la fila entera. */
.entrar-rapido .principal { flex: 0 0 auto; width: auto; margin-top: 0; }

/* El tÃ­tulo de la pantalla en la que estÃ¡s, arriba y centrado: dice dÃ³nde
   estÃ¡s, que es lo Ãºnico que hacÃ­a falta al quitar las pestaÃ±as.

   EL `line-height: 1` NO ES UN ADORNO: es lo que iguala el aire de arriba con
   el de abajo. El recuadro tiene el mismo padding por los cuatro lados, pero
   abajo termina en un botÃ³n â€”cuya caja acaba justo donde acaba el fondo verdeâ€”
   y arriba empieza en un tÃ­tulo, cuya caja de lÃ­nea le aÃ±ade la mitad del
   interlineado POR ENCIMA de las letras. Con el interlineado normal eso son
   unos 5px de mÃ¡s que se ven perfectamente al comparar las dos puntas. */
.titulo-pantalla { margin: 0 0 14px; font-size: 20px; line-height: 1; text-align: center; }

/* Volver es un botÃ³n como los demÃ¡s y va ABAJO, al final de la pantalla: es lo
   que se hace cuando se ha terminado de mirar, no lo primero que se ofrece. */
.volver-menu { margin-top: 4px; }

/* -------------------------------------------------------- EstadÃ­sticas -- */

/* Una sola columna que hace scroll, como las instrucciones y por lo mismo: esto
   se mira en el mÃ³vil. Lo que cambia es que aquÃ­ NO hay pÃ¡ginas, asÃ­ que el
   recuadro crece con lo que haya y no se clava a una altura. */
.estadisticas { width: min(620px, 100%); }

.estadisticas h3 {
  margin: 18px 0 8px;
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--tenue);
}
.estadisticas h3:first-of-type { margin-top: 10px; }

/* LOS CUATRO CORTES SON UNA FILA DE CUATRO, y no un desplegable: son pocos,
   se comparan entre ellos y se cambia de uno a otro sin parar. Un desplegable
   esconderÃ­a tres de los cuatro detrÃ¡s de dos toques. */
.cortes { display: flex; gap: 6px; margin-bottom: 6px; }
.cortes .corte {
  flex: 1;
  padding: 8px 4px;
  font-size: 12px;
  border: 1px solid var(--panel-borde);
  border-radius: 8px;
  background: transparent;
  color: var(--tenue);
  cursor: pointer;
}
.cortes .corte.elegido {
  border-color: var(--verde);
  color: var(--texto);
  font-weight: bold;
}

/* Rejilla que se parte sola: tres columnas en el ordenador y dos en el mÃ³vil,
   sin una media consulta por cada bloque. `minmax(0, â€¦)` para que un nÃºmero
   largo no ensanche la columna y desborde. */
.reparto {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(120px, 100%), 1fr));
  gap: 8px;
}
.dato-stat {
  padding: 10px 8px;
  border: 1px solid var(--panel-borde);
  border-radius: 8px;
  text-align: center;
}
/* EL NÃšMERO GRANDE Y EL RÃ“TULO PEQUEÃ‘O, y no al revÃ©s: se viene aquÃ­ a ver
   cuÃ¡ntas, y la palabra sÃ³lo dice de quÃ©. */
.dato-stat strong { display: block; font-size: 20px; line-height: 1.2; }
.dato-stat span { font-size: 11px; color: var(--tenue); }
/* El porcentaje va pegado al nÃºmero y en tenue: acompaÃ±a, no compite. */
.dato-stat em { font-size: 12px; font-style: normal; color: var(--tenue); }

.tabla-stats { width: 100%; border-collapse: collapse; font-size: 13px; }
.tabla-stats th, .tabla-stats td { padding: 6px 8px; text-align: right; }
.tabla-stats th:first-child, .tabla-stats td:first-child { text-align: left; }
.tabla-stats th { font-size: 11px; color: var(--tenue); font-weight: normal; }
.tabla-stats tbody tr + tr { border-top: 1px solid var(--panel-borde); }

/* -------------------------------------------------------- Instrucciones -- */

/* A pantalla completa y en una sola columna: se piensa para leerlas en el
   mÃ³vil, que es donde se van a leer de verdad. */
.instrucciones {
  display: flex;
  flex-direction: column;
  width: min(620px, 100%);
  /* LA VENTANA MIDE LO MISMO EN TODAS LAS PÃGINAS Y NO SE MUEVE NUNCA: el texto
     hace scroll DENTRO de la hoja y los botones se quedan clavados abajo. Se
     leen diez pÃ¡ginas seguidas y el pulgar se acostumbra al sitio; una ventana
     que crece con el texto obliga a bajar a buscar "Siguiente" cada vez.
     En el mÃ³vil eso es la pantalla entera; en un monitor grande se corta en
     760, que si no queda un recuadro medio vacÃ­o enorme.

     EL ALTO SE MIDE CONTRA LA PANTALLA, NO CONTRA `#menu`. AquÃ­ ponÃ­a
     `min(100%, 760px)` y en el mÃ³vil no hacÃ­a nada: `#menu` es un grid con
     `place-items: center`, asÃ­ que su fila se ajusta al contenido y ese 100 %
     se mide contra un alto indefinido â€” el navegador lo descarta, la hoja crece
     con el texto y quien acaba haciendo scroll es la pÃ¡gina entera, con los
     botones fuera de la pantalla. En el ordenador no se veÃ­a porque el texto
     cabÃ­a de sobra. Por eso va en unidades de pantalla, restando el margen de
     `#menu` (arriba y abajo) para no salirse por el canto.

     `dvh` y no `vh` porque son mÃ³viles: `vh` cuenta la pantalla CON la barra de
     direcciones retraÃ­da, asÃ­ que al abrir con la barra desplegada la ventana
     se pasaba de alto justo lo que mide la barra â€” y lo que se comÃ­a era el pie
     con los botones. `dvh` es el alto que hay de verdad en cada momento. La
     lÃ­nea de `vh` de encima es la red para un navegador que no entienda `dvh`:
     se queda algo corta, que es el lado bueno del error. */
  height: min(100vh - var(--menu-margen) * 2, 760px);
  height: min(100dvh - var(--menu-margen) * 2, 760px);
  margin: 0 auto;
  gap: 10px;
}
.barra-instrucciones { flex: 0 0 auto; }
.barra-instrucciones .titulo-pantalla { margin: 0; }
/* El nÃºmero de pÃ¡gina vive abajo, entre las flechas: aquÃ­ sobraba. */
.barra-instrucciones .paso { display: none; }

/* La hoja crece hasta llenar lo que quede y hace scroll ella sola, para que los
   botones de pasar pÃ¡gina no se muevan de sitio nunca. */
.hoja {
  flex: 1 1 auto;
  /* SIN ESTO NO HAY SCROLL. Un hijo de un flex no encoge por debajo de lo que
     mide su contenido, asÃ­ que una pÃ¡gina larga estiraba la hoja y se llevaba
     los botones fuera de la pantalla en vez de aparecer la barra de scroll. */
  min-height: 0;
  overflow-y: auto;
  /* El scroll se queda DENTRO del recuadro: sin esto, al llegar al final del
     texto el gesto sigue hacia la pÃ¡gina de detrÃ¡s (el "scroll chaining" del
     mÃ³vil) y la ventana se despega justo cuando vas a darle a Siguiente. */
  overscroll-behavior: contain;
  background: var(--panel);
  border: 1px solid var(--panel-borde);
  border-radius: 16px;
  padding: 18px;
  line-height: 1.55;
}
.hoja h1 { font-size: 21px; margin: 0 0 12px; }
.hoja h2 { font-size: 17px; margin: 18px 0 8px; }
.hoja h3 { font-size: 15px; margin: 14px 0 6px; color: var(--tenue); }
.hoja p { margin: 0 0 10px; }
.hoja ul { margin: 0 0 12px; padding-left: 20px; }
.hoja li { margin: 0 0 5px; }
.hoja code { background: rgba(255, 255, 255, 0.08); padding: 1px 5px; border-radius: 5px; }
.hoja figure { margin: 14px 0; text-align: center; }
.hoja img { max-width: 100%; vertical-align: middle; }
/* Las imÃ¡genes sueltas dentro de una frase son iconos: al alto de la lÃ­nea. */
.hoja p img, .hoja li img { height: 1.6em; width: auto; }
.hoja figure img { max-height: 200px; }

.pies-instrucciones {
  display: flex;
  align-items: center;
  gap: 10px;
  flex: 0 0 auto;
}
/* Los dos botones se reparten el ancho a partes iguales.

   OJO CON `width: 100%`: los botones verdes lo llevan de serie (`button.principal`),
   y dentro de un flex eso hace que cada uno PIDA el ancho entero del renglÃ³n â€”
   uno se lo comÃ­a todo y el otro se salÃ­a de la pantalla. Con `flex: 1 1 0` el
   reparto lo decide el flex, y `width: auto` le quita la peticiÃ³n de encima. */
.pies-instrucciones .principal {
  flex: 1 1 0;
  width: auto;
  min-width: 0;
  margin-top: 0;
}
/* El nÃºmero de pÃ¡gina, en medio y sin estirarse: es una etiqueta, no un botÃ³n. */
.pies-instrucciones .paginas {
  flex: 0 0 auto;
  padding: 0 4px;
  color: var(--tenue);
  font-size: 13px;
  white-space: nowrap;
}

/* Las banderas del idioma.

   Van arriba del todo del panel y en la barra del juego. Se dibujan con SVG en
   lÃ­nea (ver `IDIOMAS` en src/idioma.js) porque Windows no pinta las banderas
   emoji: las enseÃ±a como dos letras sueltas, que es justo lo que no sirve en un
   botÃ³n que hay que reconocer sin leer. */
.idiomas {
  display: flex;
  gap: 6px;
  align-items: center;
  justify-content: flex-end;
  margin: 0 0 8px;
}
/* Dentro del desplegable de la partida van centradas, como en la portada: ahÃ­
   son una fila mÃ¡s de la lista y alineadas a la derecha quedaban descolgadas. */
.idiomas.en-menu { margin: 0; align-items: center; justify-content: center; }
.bandera {
  width: 30px;
  height: 20px;
  padding: 0;
  border-radius: 3px;
  overflow: hidden;
  opacity: 0.45;
  border: 1px solid var(--panel-borde);
  background: none;
  line-height: 0;
}
.bandera svg { display: block; width: 100%; height: 100%; }
.bandera:hover { opacity: 0.8; }
/* El puesto va a plena luz y con borde claro: de un vistazo se ve en cuÃ¡l
   estÃ¡s, que es la Ãºnica pregunta que responde este control. */
.bandera.activa {
  opacity: 1;
  border-color: var(--texto);
  box-shadow: 0 0 0 1px var(--texto);
}

/* El botÃ³n de pantalla completa, que va en la misma fila que las banderas (ver
   `src/pantalla-completa.js`).

   VA UN PUNTO MÃS GRANDE Y MÃS CLARO QUE LAS BANDERAS, y no igual que ellas.
   Son cuatro trazos finos sobre una foto oscura, mientras que una bandera es un
   rectÃ¡ngulo de color macizo: con la misma altura y la misma opacidad que ellas
   el icono desaparecÃ­a. Lo que iguala a los dos controles no es el nÃºmero sino
   verse igual de presentes, que es para lo que estÃ¡n los nÃºmeros.

   En el mÃ³vil, mÃ¡s grande todavÃ­a: ahÃ­ se toca con el dedo, y 24px de alto es
   menos de lo que se acierta sin fallar. */
.pantalla-completa {
  width: 26px;
  height: 24px;
  padding: 0;
  border: none;
  background: none;
  color: var(--texto);
  opacity: 0.72;
  line-height: 0;
}
.pantalla-completa svg { display: block; width: 100%; height: 100%; }
.pantalla-completa:hover { opacity: 1; }
@media (pointer: coarse) {
  .pantalla-completa { width: 32px; height: 30px; }
}

/* Los controles de la mÃºsica, al lado del de pantalla completa (ver
   `src/musica.js`). El altavoz es el mismo botÃ³n que Ã©l â€”mismo tamaÃ±o, misma
   opacidadâ€” porque son hermanos y se pulsan igual. */
.musica-silencio {
  width: 26px;
  height: 24px;
  padding: 0;
  border: none;
  background: none;
  color: var(--texto);
  opacity: 0.72;
  line-height: 0;
}
.musica-silencio svg { display: block; width: 100%; height: 100%; }
.musica-silencio:hover { opacity: 1; }

/* LA BARRA DE VOLUMEN VA CORTA A PROPÃ“SITO.
   Comparte fila con las banderas y con dos botones; larga, empujaba el resto y
   en el mÃ³vil partÃ­a la fila en dos. Con 64 px se gradÃºa de sobra, y quien sÃ³lo
   quiere silencio tiene el altavoz al lado, que es de un toque. */
.musica-volumen {
  width: 64px;
  height: 20px;
  margin: 0;
  padding: 0;
  accent-color: var(--texto);
  opacity: 0.72;
  cursor: pointer;
}
.musica-volumen:hover { opacity: 1; }

@media (pointer: coarse) {
  .musica-silencio { width: 32px; height: 30px; }
  /* Con el dedo, la barra necesita recorrido para acertar. */
  .musica-volumen { width: 80px; height: 28px; }
}

/* ElecciÃ³n de herramientas, con el mapa ya visible detrÃ¡s */
.equipar {
  position: fixed;
  inset: auto 0 0 0;
  display: grid;
  place-items: center;
  padding: 16px;
  z-index: 15;
  pointer-events: none;
}
.equipar .panel {
  pointer-events: auto;
  width: min(560px, 100%);
  background: var(--panel-suave);
  border: 1px solid var(--panel-borde);
  border-radius: 16px;
  padding: 18px;
  /* Poco desenfoque a propÃ³sito: hay que poder ver a travÃ©s quÃ© materiales
     tienes cerca del campamento antes de elegir las herramientas (Â§14). */
  backdrop-filter: blur(2px);
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
}
/* La ranura de la persiana: pliega el panel para poder mirar el mapa (Â§14).
   Va DENTRO del recuadro, arriba a la derecha, como el botÃ³n de recoger de
   cualquier pÃ¡gina â€” no en la fila de las herramientas, que Ã©sa es la elecciÃ³n. */
.equipar .panel { position: relative; }
.equipar .plegar {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 34px;
  height: 34px;
  padding: 0;
  line-height: 1;
  font-size: 15px;
  border-radius: 10px;
  opacity: 0.75;
}
.equipar .plegar:hover { opacity: 1; }
/* Plegado se queda sÃ³lo el nombre y el botÃ³n, y el recuadro se encoge a una
   tira: por debajo se ve la isla y se puede arrastrar y hacer zoom, porque el
   velo de fondo ya no atrapa el dedo (`pointer-events` arriba).

   MANTIENE EL ANCHO de cuando estÃ¡ abierto. EncogiÃ©ndolo al tamaÃ±o del nombre
   quedaba una pastilla diminuta que no parecÃ­a el mismo panel, y al desplegarlo
   la pantalla daba un salto. AsÃ­ es una persiana: baja y sube por el mismo
   hueco. */
.equipar .panel.plegado > :not(h2):not(.plegar) { display: none; }
.equipar .panel.plegado { padding: 8px 52px 8px 14px; }
.equipar .panel.plegado h2 { margin: 0; font-size: 15px; }
.equipar .panel.plegado .plegar { top: 50%; transform: translateY(-50%); }

.equipar h2 { margin: 0 0 6px; font-size: 18px; }
.equipar p { margin: 0 0 14px; font-size: 13px; color: var(--tenue); line-height: 1.5; }
.equipar .opciones { display: flex; gap: 8px; }
.equipar .herramienta {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 12px 8px;
  text-align: center;
}
.equipar .herramienta canvas { display: block; }
.equipar .herramienta .nombre { font-weight: 700; font-size: 14px; }
.equipar .herramienta .ayuda { font-size: 11px; color: var(--tenue); line-height: 1.35; }
.equipar .herramienta.elegida {
  border-color: var(--verde);
  background: rgba(124, 228, 154, 0.18);
}

@media (max-width: 620px) {
  .equipar .opciones { flex-direction: column; }
  .equipar .herramienta { flex-direction: row; text-align: left; gap: 10px; }
  .equipar .herramienta .ayuda { flex: 1 1 auto; }
}

/* Cargando */
#cargando {
  position: fixed;
  inset: 0;
  display: none;
  place-items: center;
  background: rgba(6, 12, 8, 0.9);
  color: var(--texto);
  font-size: 15px;
  z-index: 20;
}
#cargando.visible { display: grid; }

/* El botÃ³n de plegar el inventario sÃ³lo hace falta en pantallas estrechas:
   en las anchas la ficha va en la columna lateral y no tapa nada. */
.solo-movil { display: none; }

/* Las opciones de la barra de arriba. En pantalla ancha NO son un menÃº: caben
   todas y `display: contents` las deja donde estaban, como si esta caja no
   existiera. SÃ³lo en el mÃ³vil se convierten en el desplegable de las rayas.
   OJO con el nombre: `.opciones` a secas ya era la rejilla de herramientas del
   panel de equipar, y llamar igual a las dos cosas la descolocaba entera. */
.menu-opciones { display: contents; }

/* MÃ³vil en vertical: la ficha pasa arriba y los botones debajo */
@media (max-width: 720px) {
  .oculto-movil { display: none; }
  .solo-movil { display: inline-flex; }
  #hud-jugador { font-size: 14px; }
  .barra.superior { padding: 6px 8px; gap: 6px; }

  /* La cuenta atrÃ¡s sale de la barra y se va debajo del nombre: ahÃ­ destaca y,
     sobre todo, no obliga a la barra a partirse en dos lÃ­neas. */
  #hud-reloj.visible { display: none; }
  #hud-reloj-movil.visible { display: inline-block; }
  button.mini { padding: 6px 7px; font-size: 11px; }
  .campo { flex-direction: column; align-items: stretch; gap: 5px; }
  .campo select, .campo input, .campo .paso-selector { min-width: 0; width: 100%; }

  /* El desplegable de las tres rayas. Va en absoluto y COLGANDO de la barra, no
     dentro: si creciera la barra, el mapa se encogerÃ­a al abrirlo (`medirHud`
     mide la barra para encuadrar la isla) y darÃ­a un salto cada vez. */
  .menu-opciones {
    display: none;
    position: absolute;
    top: 100%;
    right: 8px;
    z-index: 5;
    flex-direction: column;
    align-items: stretch;
    gap: 6px;
    padding: 8px;
    background: var(--panel);
    backdrop-filter: blur(8px);
    border: 1px solid var(--panel-borde);
    border-radius: 12px;
    box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45);
  }
  .menu-opciones.abierto { display: flex; }
  /* Dentro del desplegable los botones son de tocar con el dedo, no de barra. */
  .menu-opciones button.mini { padding: 11px 14px; font-size: 13px; text-align: left; }
  #btn-opciones { font-size: 15px; line-height: 1; padding: 6px 9px; }

  /* La barra de abajo se queda con las acciones y deja ver el mapa a travÃ©s.
     El inventario, que ocupaba media pantalla, va plegado hasta que se pide
     con el botÃ³n "Inventario". */
  .barra.inferior {
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    background: var(--panel-suave);
    backdrop-filter: blur(2px);
  }
  .ficha { display: none; width: 100%; }
  #hud.ficha-visible .ficha { display: block; }
  .botones { max-height: 26vh; }
  button.accion { padding: 9px 10px; font-size: 13px; }
}

/* Pantallas bajas: la ficha estorba, se encoge */
@media (max-height: 560px) {
  .ficha { width: clamp(200px, 26vw, 300px); }
}
