/* ═══════════════════════════════════════════════════════════
   Expedición Atlas — styles.css
   ═══════════════════════════════════════════════════════════ */

/* ── Tipografía propia ──
   Se sirve desde fonts/ y no desde un CDN: en un colegio la red puede
   bloquearlo o caerse, y la app tiene que verse igual sin conexión.
   `font-display: swap` evita el texto invisible mientras carga. */
@font-face {
  font-family: 'Bree Serif';
  src: url('../fonts/bree-serif-latin.woff2') format('woff2');
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Nunito';
  src: url('../fonts/nunito-latin.woff2') format('woff2');
  font-weight: 400 800; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Nunito';
  src: url('../fonts/nunito-italic-latin.woff2') format('woff2');
  font-weight: 400 800; font-style: italic; font-display: swap;
}

:root {
  /* ── Superficies ──
     Cuatro niveles, no uno: página, panel, tarjeta y hueco. Antes casi todo
     compartía el mismo crema y las jerarquías se leían solo por el borde. */
  --paper:            #f2e5cb;   /* fondo de la página */
  --paper-deep:       #e8d8b8;   /* zonas hundidas, huecos, pistas */
  --surface:          #fffdf7;   /* tarjeta */
  --surface-raised:   #ffffff;   /* tarjeta destacada / diálogo */
  --surface-sunken:   #f0e4ca;   /* barras y campos dentro de una tarjeta */

  /* ── Tinta ── */
  --ink:              #33240f;
  --ink-soft:         #6b5638;
  /* Medido: #8a7350 daba 3,62:1 sobre el papel y 4,44:1 sobre la tarjeta,
     los dos por debajo del mínimo. Este llega a 5,27:1 y 6,45:1. */
  --ink-faint:        #6f5a3a;

  /* ── Marca ── */
  --brass:            #8a5a0b;
  --brass-light:      #e6b93f;
  --brass-tint:       #f6e7c4;
  --leather:          #7a4a21;
  --leather-dark:     #4a2c12;
  --jungle:           #37622f;
  --jungle-light:     #6f9e59;
  --jungle-tint:      #e6f0d9;
  --danger:           #a83a25;
  --danger-tint:      #f8e3dd;
  --gold:             #f0c33c;

  /* compatibilidad con las reglas que aún nombran los tokens antiguos */
  --parchment:        var(--paper);
  --parchment-dark:   var(--paper-deep);
  --card:             var(--surface);

  /* ── Tipografía ──
     Escala de quinta mayor recortada; cada paso se nota sin dar saltos. */
  --font-display: "Bree Serif", "Georgia", "Times New Roman", serif;
  --font-text:    "Nunito", "Segoe UI", system-ui, -apple-system, sans-serif;
  --t-xs:   0.78rem;
  --t-sm:   0.88rem;
  --t-base: 1rem;
  --t-md:   1.12rem;
  --t-lg:   1.32rem;
  --t-xl:   1.65rem;
  --t-2xl:  2.1rem;
  --t-3xl:  2.9rem;

  /* ── Espaciado ── */
  --s-1: .25rem;  --s-2: .5rem;   --s-3: .75rem;  --s-4: 1rem;
  --s-5: 1.5rem;  --s-6: 2rem;    --s-7: 3rem;    --s-8: 4rem;

  /* ── Radios ──
     Un solo radio para todo aplanaba la jerarquía: ahora el contenedor es
     más redondo que lo que lleva dentro, como en el papel real. */
  --r-sm: 8px;
  --r-md: 12px;
  --r-lg: 18px;
  --r-xl: 26px;
  --r-pill: 999px;
  --radius: var(--r-lg);   /* compatibilidad */

  /* ── Elevación ──
     Sombras cálidas (tinte de la tinta), no grises: sobre pergamino un gris
     puro se ve sucio. */
  --e-1: 0 1px 2px rgba(51, 36, 15, .07), 0 1px 1px rgba(51, 36, 15, .04);
  --e-2: 0 2px 4px rgba(51, 36, 15, .08), 0 4px 12px rgba(51, 36, 15, .07);
  --e-3: 0 6px 14px rgba(51, 36, 15, .10), 0 14px 34px rgba(51, 36, 15, .10);
  --e-inset: inset 0 1px 2px rgba(51, 36, 15, .10);
  --shadow: var(--e-2);   /* compatibilidad */

  /* Filete: separa sin pesar. Casi todo el orden de la interfaz sale de aquí. */
  --line: 1px solid rgba(122, 74, 33, .18);
  --line-strong: 1px solid rgba(122, 74, 33, .32);

  /* Anchos de contenido: sin esto, en una pantalla de 1000 px la columna se
     quedaba flotando arriba a la izquierda con medio lienzo vacío. */
  --w-narrow: 44rem;
  --w-content: 60rem;
  --w-wide: 76rem;

  --tap: 44px;   /* objetivo táctil mínimo */
}

* { box-sizing: border-box; margin: 0; padding: 0; }

html { -webkit-text-size-adjust: 100%; }

body {
  font-family: var(--font-text);
  font-size: var(--t-base);
  background-color: var(--paper);
  /* Grano de papel: dos capas de ruido muy suave más un viñeteado cálido.
     Todo en CSS, sin imágenes que descargar. */
  background-image:
    radial-gradient(circle at 18% 8%,  rgba(138, 90, 11, .07), transparent 45%),
    radial-gradient(circle at 82% 92%, rgba(55, 98, 47, .07), transparent 45%),
    repeating-linear-gradient(0deg,   rgba(122, 74, 33, .022) 0 1px, transparent 1px 3px),
    repeating-linear-gradient(90deg,  rgba(122, 74, 33, .022) 0 1px, transparent 1px 3px);
  background-attachment: fixed;
  color: var(--ink);
  min-height: 100vh;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* ── Titulares ──
   La serif solo en los titulares: en texto corrido a 8 años cansa. */
h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 400;         /* Bree Serif solo tiene un grosor y ya es robusta */
  line-height: 1.2;
  color: var(--leather-dark);
  letter-spacing: -.01em;
}
h1 { font-size: var(--t-3xl); }
h2 { font-size: var(--t-2xl); }
h3 { font-size: var(--t-lg); }
h4 { font-size: var(--t-md); }
/* Si Bree Serif no carga, la reserva es Georgia: se compensa el grosor */
@supports not (font-variation-settings: normal) { }

/* Ojo tipográfico: los números de las estadísticas alineados en columna */
.num, .kpi-value, .hud-coins, .student-num { font-variant-numeric: tabular-nums; }

.hidden { display: none !important; }
.big-emoji { font-size: 3.2rem; text-align: center; }

button { font-family: inherit; cursor: pointer; }
button:disabled { cursor: not-allowed; opacity: .55; }

/* ── Foco por teclado ──
   El contorno de 1 px del navegador se pierde sobre el pergamino. Este anillo
   se ve sobre cualquiera de las superficies y solo aparece al navegar con
   teclado, no al tocar con el dedo. */
:focus-visible {
  outline: 3px solid var(--brass);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}
#hud :focus-visible, #tabbar :focus-visible { outline-color: var(--gold); }

/* ── Botones ──
   Tres pesos reales: acción principal, secundaria y terciaria (sin fondo).
   Antes casi todo era «secundario» y la mirada no sabía dónde ir. */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .45rem;
  border: none; border-radius: var(--r-md);
  padding: .7rem 1.3rem;
  font-family: var(--font-text);
  font-size: var(--t-base); font-weight: 700; line-height: 1.2;
  min-height: var(--tap);
  box-shadow: var(--e-1);
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease;
}
.btn:hover { box-shadow: var(--e-2); }
.btn:active { transform: translateY(1px); box-shadow: var(--e-1); }
.btn-primary   { background: var(--jungle); color: #fff; }
.btn-primary:hover   { background: #2e5327; }
.btn-secondary { background: var(--brass); color: #fff; }
.btn-secondary:hover { background: #744a08; }
/* 44 px es el objetivo táctil mínimo recomendado, y aquí son dedos de seis
   años sobre una tablet: fallar el toque en la tienda frustra justo en el
   momento de recompensa. */
.btn-small { padding: .4rem .85rem; font-size: var(--t-sm); min-height: var(--tap); }

/* Terciarios: el peso más ligero de los tres, pero botones al fin y al cabo.
   Sin fondo eran letra suelta: el «Volver a la portada» de la sala de mapas
   cae justo encima de las dunas y la pirámide del horizonte, y ahí un texto
   marrón sobre arena marrón no se lee ni se ve que se pueda tocar. Llevan
   papel y un filete propios, que es lo que los despega de cualquier fondo
   sin subirlos al rango de acción principal. */
.btn-back, .btn-quit {
  background: var(--surface);
  color: var(--leather-dark);
  border: var(--line-strong);
  box-shadow: var(--e-1);
  padding-left: 1rem; padding-right: 1rem;
}
.btn-back { font-size: var(--t-sm); margin-bottom: var(--s-3); }
.btn-back:hover, .btn-quit:hover {
  background: var(--brass-tint); border-color: var(--brass); box-shadow: var(--e-1);
}
.btn-quit { color: var(--ink); font-size: var(--t-sm); }
.btn-hint { background: var(--brass-tint); color: var(--leather-dark); box-shadow: var(--e-inset); }
/* Un retrato metido en mitad de una frase, en el sitio del emoji que
   sustituye. Alto de línea y medio como mucho: más grande empuja el renglón
   y se ve como algo pegado encima del texto en vez de dentro. */
.linea-retrato {
  width: 1.5rem; height: 1.5rem; vertical-align: -.4em;
  object-fit: contain; margin-left: .3rem;
}
.btn-hint:hover { background: #f0dcb0; box-shadow: var(--e-inset); }
.btn-restore { background: var(--brass-light); color: var(--leather-dark); margin-bottom: var(--s-3); }

/* ── Onboarding ── */
#screen-onboarding, #screen-auth {
  display: flex; align-items: center; justify-content: center;
  min-height: 100vh; padding: var(--s-5);
}
.onboarding-card {
  background: var(--surface-raised); border-radius: var(--r-xl); box-shadow: var(--e-3);
  border-top: 4px solid var(--brass);
  padding: clamp(1.5rem, 4vw, 2.5rem); max-width: 32rem; width: 100%;
  text-align: center;
}
.onboarding-card h1 { font-size: var(--t-2xl); color: var(--leather-dark); }
.subtitle { color: var(--brass); font-size: var(--t-sm); text-transform: uppercase; letter-spacing: .12em; font-weight: 700; margin-bottom: var(--s-5); }
#onboarding-form { display: flex; flex-direction: column; gap: .8rem; margin-top: var(--s-5); }

/* ── Diálogos de personajes ──
   Bocadillo con el retrato en un medallón: antes era una losa lisa que
   competía con la tarjeta que lo contenía. */
.dialog {
  display: flex; gap: .85rem; align-items: flex-start; text-align: left;
  background: var(--paper); border-radius: var(--r-lg);
  border-left: 4px solid var(--brass);
  padding: .95rem 1.1rem; margin: var(--s-4) 0;
}
.dialog-avatar {
  font-size: 1.5rem; line-height: 1; flex-shrink: 0;
  width: 2.7rem; height: 2.7rem;
  display: grid; place-items: center;
  background: var(--surface); border-radius: var(--r-pill);
  box-shadow: var(--e-1);
}
/* ── Los retratos de los compañeros ──
   `contain` y no `cover`: son dibujos con fondo transparente, y recortarlos
   para llenar un círculo le cortaría a Bruno el sombrero. Y `object-position`
   los sube porque los tres tienen la cara arriba: centrados, el hueco enseñaría
   medio pecho.

   OJO con el tamaño: aquí NO se pone. El retrato lleva dos clases —la suya y la
   del sitio donde va— y si esta declarara un ancho, ganaría por ir después en
   la hoja y reventaría el tamaño de cada sitio. Pasó: Bruno salía a pantalla
   completa en la ficha de resultado. Cada sitio pone su medida. */
.retrato { object-fit: contain; object-position: 50% 16%; }

/* ── Los dibujos de las cosas ──
   Mismo trato que los retratos y por la misma razón: `.icono-dibujo` solo
   dice CÓMO se dibuja dentro de su hueco, y el tamaño lo pone cada sitio.
   La primera vez que esto no se separó, la carta de resultado se llenó con
   un Bruno a pantalla completa. */
.icono-dibujo { display: block; width: 100%; height: 100%; object-fit: contain; }
.icono-emoji { line-height: 1; }

/* En la burbuja de diálogo, el retrato ES el avatar: mismo hueco redondo que
   tenía el emoji, y el dibujo dentro. */
img.dialog-avatar {
  display: block; width: 2.7rem; height: 2.7rem; padding: 0;
  border-radius: var(--r-pill); overflow: hidden;
}
/* Solo el nombre del personaje va en su propia línea. Con el selector
   descendiente, cualquier negrita dentro del párrafo se volvía bloque y
   partía la frase por la mitad. */
.dialog-text > strong {
  color: var(--brass); display: block; margin-bottom: .2rem;
  font-size: var(--t-xs); text-transform: uppercase; letter-spacing: .06em;
}
.dialog-text p strong { color: inherit; }
.dialog-text p { font-size: var(--t-base); line-height: 1.6; }
.dialog.kira { background: var(--jungle-tint); border-left-color: var(--jungle); }
.dialog.kira .dialog-text > strong { color: var(--jungle); }

/* ── Horizonte ──
   La mitad de abajo de casi todas las pantallas se quedaba vacía: pergamino
   y nada más. En lugar de estirar el contenido para taparlo, el fondo pasa a
   tener paisaje —un templo lejano y tres crestas de duna— tan bajo de
   contraste que nunca compite con el texto que pase por encima. Va fijo al
   pie de la ventana y detrás de todo. */
body::after {
  content: '';
  position: fixed; left: 0; right: 0; bottom: 0;
  height: min(46vh, 27rem);
  z-index: -1;
  pointer-events: none;
  /* Dos capas: el paisaje recortado y, debajo, la arena en la que el papel
     se va posando. Sin ese degradado las dunas flotaban sobre el pergamino
     y parecían una mancha de impresión. */
  background-image:
    url("data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 1440 400%22 preserveAspectRatio=%22none%22> <g fill=%22%236b4318%22 fill-opacity=%22.13%22 transform=%22translate(0 62)%22> <path d=%22M556 214v-30h16v-16h22v-16h26v-15h50v15h26v16h22v16h16v30z%22/> <path d=%22M604 214v-40h56v40z%22 fill-opacity=%22.5%22/> <path d=%22M872 214v-22h12v-12h18v-12h20v-11h34v11h20v12h18v12h12v22z%22 fill-opacity=%22.7%22/> </g> <path d=%22M0 232c140-40 250-12 372 14s226 36 354 10 222-52 362-32 282 66 352 44v192H0z%22 fill=%22%236b4318%22 fill-opacity=%22.14%22/> <path d=%22M0 288c158-30 258 6 392 30s244 22 375-6 238-48 369-25 190 52 304 32v121H0z%22 fill=%22%238a5a0b%22 fill-opacity=%22.17%22/> <path d=%22M0 336c176-22 274 10 418 26s272 8 409-13 257-32 392-11 155 30 221 17v45H0z%22 fill=%22%236b4318%22 fill-opacity=%22.22%22/> </svg>"),
    linear-gradient(180deg,
      rgba(200, 160, 96, 0) 0%,
      rgba(200, 160, 96, .10) 46%,
      rgba(184, 141, 78, .22) 100%);
  background-repeat: no-repeat, no-repeat;
  background-position: bottom center, bottom center;
  background-size: 100% 100%, 100% 100%;
}
/* ── El fondo del reto ──
   La cámara por dentro, detrás de todo. Va aquí y no en `#screen-mission`
   porque esa pantalla es una columna estrecha centrada y el fondo tiene que
   ocupar el ancho entero de la ventana.

   Se queda en un cuarto de opacidad a propósito: es el sitio donde está el
   niño, no lo que tiene que mirar. Lo que tiene que mirar es el enunciado, y
   un fondo a plena tinta detrás de un texto es lo contrario de eso. */
body::before {
  content: '';
  position: fixed; inset: 0;
  z-index: -1;
  pointer-events: none;
  background-image: var(--fondo-reto, none);
  background-size: cover;
  /* Anclado arriba y no al centro: la cámara es apaisada y la pantalla de una
     tablet en vertical es todo lo contrario, así que `cover` se come los
     lados, que es donde están los engranajes y las estanterías. Subiendo el
     encuadre se salva la parte que dice dónde estás: el arco, la bóveda y el
     haz de luz. */
  background-position: 50% 18%;
  opacity: 0;
  transition: opacity .45s ease;
}
body.en-mision::before { opacity: .5; }
/* En misión el horizonte estorba: el reto se queda solo con el pergamino, y
   si detrás hay una cámara dibujada, las dunas sobran del todo. */
body.en-mision::after { opacity: .35; }
/* Y del todo cuando de verdad hay cámara: dos paisajes superpuestos no son
   un sitio, son un borrón. La clase la pone el guion al elegir el fondo. */
body.con-camara.en-mision::after { opacity: 0; }

/* ── Iconos dibujados ──
   Un solo trazo, `currentColor` y tamaño en `em`: el mismo símbolo sirve
   sobre cuero, sobre papel y dentro de un botón sin declararlo tres veces.
   `fill`/`stroke` se heredan hacia dentro del <use>, que es la única vía
   que atraviesa el árbol en sombra de un símbolo. */
.ico {
  width: 1.15em; height: 1.15em;
  flex-shrink: 0;
  vertical-align: -.18em;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
}
/* En una caja grande el trazo fino se rompe; en una pequeña, engorda. */
.ico-lg { stroke-width: 1.5; }
.ico-sm { stroke-width: 2; }

/* ── HUD ──
   Barra de estado permanente. Se le da profundidad con un degradado corto y
   un filete dorado inferior: sin él, el marrón plano chocaba con el papel. */
#hud {
  position: sticky; top: 0; z-index: 20;
  display: flex; justify-content: space-between; align-items: center; gap: var(--s-4);
  background-color: var(--leather-dark);
  /* Cuero curtido: una luz cenital, una veta cálida cruzada y el fondo
     hundido abajo. Un marrón plano se leía como una barra de navegación
     cualquiera; esto se lee como material. */
  background-image:
    linear-gradient(180deg, rgba(255, 226, 170, .13) 0%, rgba(255, 226, 170, 0) 42%),
    linear-gradient(96deg, #6a4019 0%, #52310f 46%, #3f2409 100%);
  color: #fdf3dd;
  padding: .5rem clamp(.9rem, 4vw, 2rem);
  /* El filete de latón va como sombra y no como borde: así no suma altura
     ni desplaza el contenido pegajoso del principio. */
  box-shadow:
    inset 0 -2px 0 rgba(240, 195, 60, .40),
    inset 0 -3px 0 rgba(0, 0, 0, .35),
    0 3px 10px rgba(30, 17, 4, .30);
}
.hud-left { display: flex; align-items: center; gap: .65rem; min-width: 0; }
.hud-avatar {
  position: relative;
  font-size: 1.45rem; line-height: 1;
  width: 2.5rem; height: 2.5rem; flex-shrink: 0;
  display: grid; place-items: center;
  border-radius: var(--r-pill);
  /* Medallón: hueco por dentro, con un aro de latón que le da grosor. */
  background:
    radial-gradient(circle at 50% 22%, rgba(255, 240, 205, .22), rgba(0, 0, 0, .30) 78%);
  box-shadow:
    inset 0 2px 4px rgba(0, 0, 0, .45),
    0 0 0 1.5px rgba(240, 195, 60, .45),
    0 1px 0 rgba(255, 235, 190, .18);
}
.hud-identity { display: flex; flex-direction: column; line-height: 1.15; min-width: 0; }
#hud-name {
  font-family: var(--font-display); font-size: var(--t-md);
  letter-spacing: .01em;
  /* Grabado: una luz por debajo, como letras hundidas en el cuero. */
  text-shadow: 0 1px 0 rgba(0, 0, 0, .45), 0 -1px 0 rgba(255, 225, 170, .10);
}
.hud-rank-line { display: flex; align-items: center; gap: .3rem; min-width: 0; }
/* La medalla del rango, del tamaño de la letra de al lado. Es pequeña a
   propósito: acompaña al nombre, no compite con el anillo de nivel. */
.hud-medal {
  width: 1.35rem; height: 1.35rem; flex-shrink: 0;
  object-fit: contain;
  filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .45));
}
.hud-rank {
  font-size: var(--t-xs); color: var(--gold);
  text-transform: uppercase; letter-spacing: .09em; font-weight: 800;
}
.hud-right { display: flex; gap: .55rem; align-items: center; }

/* Los indicadores viven en cajetines hundidos, como los herrajes de una
   caja de instrumentos. Antes eran texto suelto sobre el marrón. */
.hud-stat {
  display: flex; align-items: center; gap: .45rem;
  font-weight: 800; line-height: 1;
  padding: .3rem .6rem; border-radius: var(--r-pill);
  background: rgba(0, 0, 0, .26);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, .40), 0 1px 0 rgba(255, 235, 190, .10);
}
.hud-stat-icon { display: grid; place-items: center; color: var(--gold); }
.hud-stat-icon .ico { width: 1.25rem; height: 1.25rem; }
.hud-num { font-variant-numeric: tabular-nums; font-size: var(--t-md); }

/* Anillo de nivel: el número dentro y los PE cerrando la vuelta. */
.hud-stat-level { gap: .5rem; padding-left: .32rem; }
.lvl-ring { position: relative; width: 2.3rem; height: 2.3rem; display: block; }
.lvl-ring svg { width: 100%; height: 100%; transform: rotate(-90deg); display: block; }
.lvl-ring circle { fill: none; stroke-width: 3.6; stroke-linecap: round; }
.lvl-track { stroke: rgba(255, 236, 200, .22); }
.lvl-fill {
  stroke: var(--gold);
  transition: stroke-dashoffset .6s cubic-bezier(.2, .8, .3, 1);
  filter: drop-shadow(0 0 3px rgba(240, 195, 60, .55));
}
.lvl-ring b {
  position: absolute; inset: 0; display: grid; place-items: center;
  font-family: var(--font-display); font-size: var(--t-md); color: #fff6e2;
  font-weight: 400; font-variant-numeric: tabular-nums;
}
.hud-stat-label {
  font-size: var(--t-xs); text-transform: uppercase;
  letter-spacing: .09em; color: var(--brass-light);
}
/* Al subir de nivel, el aro da un golpe de luz. */
@keyframes sube-nivel {
  0%   { box-shadow: inset 0 1px 3px rgba(0,0,0,.40), 0 0 0 0 rgba(240, 195, 60, .75); }
  60%  { box-shadow: inset 0 1px 3px rgba(0,0,0,.40), 0 0 0 12px rgba(240, 195, 60, 0); }
  100% { box-shadow: inset 0 1px 3px rgba(0,0,0,.40), 0 0 0 0 rgba(240, 195, 60, 0); }
}
.hud-stat-level.lvl-up { animation: sube-nivel 1s ease-out; }
.hud-stat-level.lvl-up .lvl-ring b { animation: late 1s ease-out; }
@keyframes late { 0%,100% { transform: scale(1); } 35% { transform: scale(1.28); } }

/* ── Layout ──
   La columna era de 680 px fijos: en una tablet apaisada o un portátil
   dejaba media pantalla vacía. Ahora crece con el hueco disponible y cada
   pantalla declara cuánto quiere ocupar. */
#main {
  width: 100%;
  max-width: var(--w-content);
  margin: 0 auto;
  padding: var(--s-5) clamp(1rem, 3vw, 2rem) 6rem;
}
.screen { animation: aparece .22s ease-out; }
@keyframes aparece { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  .screen { animation: none; }
  * { transition-duration: .01ms !important; }
}

/* Encabezado de pantalla: título y una línea que explica de qué va. El icono
   va en un medallón de latón —no suelto junto al texto— para que el titular
   tenga peso de portada de capítulo y no de encabezado de formulario. */
.screen > h2, #screen-home h2 {
  margin-bottom: var(--s-2);
  display: flex; align-items: center; gap: .7rem;
}
.screen > h2 > .ico, #screen-home h2 > .ico {
  width: 2.6rem; height: 2.6rem; padding: .45rem;
  flex-shrink: 0; stroke-width: 1.5;
  color: var(--brass); border-radius: var(--r-md);
  background-color: var(--brass-tint);
  background-image: linear-gradient(158deg, #fdf1d2, var(--brass-tint));
  box-shadow:
    inset 0 0 0 1px rgba(138, 90, 11, .26),
    inset 0 -2px 4px rgba(138, 90, 11, .12),
    0 1px 0 rgba(255, 255, 255, .7);
}
.screen h3 {
  color: var(--leather); margin: var(--s-5) 0 var(--s-3);
  display: flex; align-items: baseline; gap: .5rem;
}
/* Filete que continúa después del titular: ordena la página sin ruido */
.screen h3::after {
  content: ''; flex: 1; height: 1px;
  background: rgba(122, 74, 33, .18);
}

/* En misión no hay tabbar: el reto se queda solo en pantalla */
body.en-mision #tabbar { display: none; }
body.en-mision #main { padding-bottom: var(--s-5); }

/* ── Tabbar ── */
#tabbar {
  position: fixed; bottom: 0; left: 0; right: 0; z-index: 20;
  display: flex; justify-content: center; gap: .15rem;
  background-color: #3b230e;
  background-image: linear-gradient(180deg, #4a2c12 0%, #3b230e 100%);
  border-top: 1px solid rgba(240, 195, 60, .22);
  padding: .3rem clamp(.4rem, 2vw, 1rem) calc(.3rem + env(safe-area-inset-bottom));
  box-shadow: 0 -4px 18px rgba(0, 0, 0, .22);
}
.tab {
  flex: 1 1 0; max-width: 8rem;
  background: transparent; border: none; color: #e0cda8;
  display: flex; flex-direction: column; align-items: center; gap: .18rem;
  font-family: var(--font-text);
  font-size: var(--t-xs); font-weight: 700; padding: .3rem .2rem .35rem;
  border-radius: var(--r-md);
  transition: color .16s ease, transform .16s ease;
}
.tab-ico {
  display: grid; place-items: center;
  width: 2.15rem; height: 2.15rem; border-radius: var(--r-md);
  transition: background-color .16s ease, box-shadow .16s ease, color .16s ease;
}
.tab-ico .ico { width: 1.4rem; height: 1.4rem; }
.tab-label { line-height: 1.1; }
.tab:hover { color: #fff4de; }
.tab:hover .tab-ico { background: rgba(255, 255, 255, .09); }
.tab:active { transform: translateY(1px); }
/* El realce claro dejaba el dorado en 4,33:1 sobre sí mismo. Sobre el hueco
   oscuro llega a 8:1, y ahora además el icono se enciende: la pestaña
   elegida parece una lámpara, no un rectángulo pintado. */
.tab.active { color: var(--gold); }
.tab.active .tab-ico {
  color: #2a1806;
  background-image: linear-gradient(180deg, var(--gold) 0%, var(--brass-light) 100%);
  background-color: var(--gold);
  box-shadow:
    0 2px 7px rgba(240, 195, 60, .40),
    inset 0 1px 0 rgba(255, 250, 230, .70),
    inset 0 -2px 0 rgba(122, 74, 33, .30);
}

/* ── Mapa ── */
.map-header { margin-bottom: var(--s-5); }
.map-reveal { margin-top: var(--s-3); }
.map-reveal-bar {
  height: 12px; background: rgba(122, 74, 33, .14); border-radius: var(--r-pill);
  overflow: hidden;
  box-shadow: inset 0 2px 4px rgba(51, 36, 15, .22), 0 1px 0 rgba(255, 255, 255, .5);
}
#map-reveal-fill {
  height: 100%; width: 0; border-radius: var(--r-pill);
  background: linear-gradient(90deg, var(--jungle-light), var(--gold));
  transition: width .6s cubic-bezier(.2, .8, .3, 1);
}
#map-reveal-pct {
  display: block; margin-top: .35rem;
  font-size: var(--t-sm); color: var(--ink-soft);
}

/* Avisos del día: mismo esqueleto, distinto color según lo que sea */
.daily-banner, .fatigue-banner {
  display: flex; gap: .6rem; align-items: flex-start;
  line-height: 1.55;
  border-radius: var(--r-md); padding: .75rem 1rem;
  margin-bottom: var(--s-4); font-size: var(--t-sm);
  box-shadow: var(--e-1);
}
.daily-banner {
  background: var(--jungle-tint); border-left: 4px solid var(--jungle);
  animation: slide-in .4s ease;
}
.fatigue-banner { background: var(--brass-tint); border-left: 4px solid var(--brass); }

/* Cabecera de yacimiento: banda de cuero, no otra tarjeta crema. Así se
   distingue de un golpe de vista el continente del contenido. */
.site-header {
  position: relative;
  display: flex; gap: .9rem; align-items: center;
  background-color: var(--leather-dark);
  /* Piedra tallada: luz cenital, veta diagonal y sombra en el canto. Una
     banda de color plano se leía como el encabezado de una tabla. */
  background-image:
    linear-gradient(180deg, rgba(255, 225, 170, .14) 0%, rgba(255, 225, 170, 0) 38%),
    linear-gradient(118deg, #6f441e 0%, #56340f 52%, #402508 100%);
  color: #f7ead2;
  border-radius: var(--r-lg);
  padding: .9rem 1.15rem;
  margin: var(--s-6) 0 var(--s-3);
  box-shadow:
    inset 0 1px 0 rgba(255, 235, 190, .16),
    inset 0 -2px 0 rgba(0, 0, 0, .30),
    var(--e-2);
}
/* Filete de latón al pie, como el metal que remata una placa grabada. */
.site-header::after {
  content: ''; position: absolute; left: 1.15rem; right: 1.15rem; bottom: 0;
  height: 2px; border-radius: var(--r-pill);
  background: linear-gradient(90deg,
    transparent, rgba(240, 195, 60, .55) 22%, rgba(240, 195, 60, .55) 78%, transparent);
}
.site-header:first-child { margin-top: 0; }
.site-icon {
  font-size: 1.85rem; line-height: 1;
  width: 3.1rem; height: 3.1rem; flex-shrink: 0;
  display: grid; place-items: center;
  border-radius: var(--r-md);
  background:
    radial-gradient(circle at 50% 20%, rgba(255, 240, 205, .20), rgba(0, 0, 0, .26) 80%);
  box-shadow:
    inset 0 2px 5px rgba(0, 0, 0, .40),
    0 0 0 1.5px rgba(240, 195, 60, .38);
}
/* Con dibujo, el hueco del icono lo ocupa la ilustración entera: se posa
   dentro sin fondo ni recorte, que son piezas con silueta propia. */
img.site-icon.site-img {
  width: 5.4rem; height: 4.2rem; padding: 0;
  background: none; box-shadow: none; border-radius: 0;
  object-fit: contain; object-position: 50% 100%;
}
.site-header h3 { margin: 0; color: #fff6e2; font-size: var(--t-lg); }
.site-header h3::after { display: none; }   /* el filete es para las secciones */
.site-header p { font-size: var(--t-sm); color: rgba(247, 234, 210, .82); }

/* ── El color de cada yacimiento ──
   Seis tarjetas del mismo beige se leen como una sola lista. Un filete de
   color por yacimiento las convierte en sitios distintos, que es lo que son.
   Es un filete y un fondo de icono, no un baño de color: el pergamino sigue
   mandando y el texto no pierde contraste en ninguna de las seis. */
.site-header { border-left: 5px solid var(--acento, var(--brass)); }
.site-header .site-icon { box-shadow: inset 0 0 0 2px var(--acento, transparent); }

/* ── La carta de expedición ──
   Lo que hace que esta pantalla sea un mapa. El terreno se abre alrededor de
   cada yacimiento y la arena se queda donde no se ha excavado, así que la carta
   dice de un vistazo algo que la barra de porcentaje no podía decir: dónde has
   estado y dónde no. */
.map-carta { margin: 0 0 var(--s-4); }
/* La proporción es la del dibujo, y `meet` en vez de `slice`: los bordes rotos
   del pergamino son la mitad de su gracia y recortarlos sería tirarlos. */
.carta {
  display: block; width: 100%; aspect-ratio: 11 / 6;
  filter: drop-shadow(0 2px 6px rgba(51, 36, 15, .18));
}
/* El punto de cada yacimiento se puede tocar y se puede tabular: es un botón,
   aunque esté dibujado. */
.carta-sitio { cursor: pointer; }
.carta-sitio .sitio-tela, .carta-sitio .sitio-asta { transition: stroke-width .12s ease; }
.carta-sitio:hover .sitio-tela, .carta-sitio:focus-visible .sitio-tela { stroke-width: 1.2; }
.carta-sitio:hover .sitio-asta, .carta-sitio:focus-visible .sitio-asta { stroke-width: 1.1; }
/* Al pasar por encima, el banderín se levanta un pelo: lo justo para que se
   note que se puede tocar, sin que parezca que se ha despegado del suelo. */
.carta-sitio { transform-box: fill-box; transform-origin: 50% 100%; }
.carta-sitio:hover, .carta-sitio:focus-visible { transform: translateY(-.4px); }

/* La leyenda es la que se toca de verdad. En una tablet el dedo acierta más en
   una etiqueta con nombre que en un punto de doce píxeles, y de paso pone el
   número: cuántos estratos de ese sitio están dominados. */
.carta-leyenda { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .55rem; }
.carta-chip {
  display: inline-flex; align-items: center; gap: .4rem;
  font-family: inherit; font-size: var(--t-sm); color: var(--leather-dark);
  background: var(--surface); border: 0; cursor: pointer;
  border-radius: var(--r-pill); padding: .3rem .9rem .3rem .7rem;
  box-shadow: inset 0 0 0 1px rgba(122, 74, 33, .2);
  /* 44 px, como todo lo que se toca en esta casa. Medían 29 y eran el único
     sitio de la app por debajo del mínimo: el comentario de aquí arriba ya
     decía que son «las que se tocan de verdad», pero el relleno no daba. */
  min-height: var(--tap);
}
.carta-chip b { font-variant-numeric: tabular-nums; color: var(--acento, var(--brass)); }
.carta-chip-punto {
  width: .7rem; height: .7rem; border-radius: 50%; flex-shrink: 0;
  background: var(--acento-suave, var(--paper-deep));
  box-shadow: inset 0 0 0 2px var(--acento, var(--brass));
}
.carta-chip:hover { box-shadow: inset 0 0 0 2px var(--acento, var(--brass)); }

/* ── «Sigue por aquí» ──
   Lo primero que se ve al abrir el mapa, y lo único con este peso: si todo
   grita, no grita nada. Contesta la pregunta que se hace un niño de ocho años
   al abrir la app, que antes había que deducir de seis tarjetas iguales. */
.seguir-card {
  position: relative;
  margin: 0 0 var(--s-4);
  padding: var(--s-4);
  border-radius: var(--r-lg);
  background-image: linear-gradient(180deg, #fffefa 0%, var(--surface) 60%, #fbf5e6 100%);
  background-color: var(--surface);
  border-left: 6px solid var(--acento, var(--brass));
  box-shadow: inset 0 1px 0 #fff, var(--e-3);
}
.seguir-eyebrow {
  font-family: var(--font-display);
  font-size: var(--t-sm); letter-spacing: .06em; text-transform: uppercase;
  color: var(--acento, var(--brass)); margin-bottom: .55rem;
}
.seguir-cuerpo { display: flex; align-items: center; gap: .9rem; }
.seguir-icono {
  font-size: 2.1rem; line-height: 1; flex-shrink: 0;
  width: 3.4rem; height: 3.4rem; display: grid; place-items: center;
  border-radius: var(--r-md);
  background: var(--acento-suave, var(--paper-deep));
  box-shadow: inset 0 0 0 2px var(--acento, transparent);
}
/* ── Los pozos dibujados ──
   El hueco estaba hecho para un emoji, que trae su propio margen dentro. Un
   dibujo no lo trae, así que se le pone aquí: sin margen, el objeto toca los
   bordes del cuadradito y parece recortado. */
.pozo-img { width: 100%; height: 100%; padding: .18rem; }
.seguir-icono .pozo-img { padding: .22rem; }
.seguir-texto { min-width: 0; flex: 1; }
.seguir-texto strong { display: block; font-size: var(--t-lg); color: var(--leather-dark); }
.seguir-texto p { margin: .1rem 0 .4rem; font-size: var(--t-sm); color: var(--ink-soft); }
.seguir-texto small { font-size: var(--t-xs); color: var(--ink-soft); }
.seguir-barra {
  height: .5rem; border-radius: var(--r-pill); overflow: hidden;
  background: var(--paper-deep); margin-bottom: .2rem;
}
.seguir-barra i {
  display: block; height: 100%; border-radius: var(--r-pill);
  background: var(--acento, var(--brass));
  transition: width .6s cubic-bezier(.2, .8, .3, 1);
}
.seguir-btn { width: 100%; margin-top: var(--s-3); }

/* El pozo al que apunta la tarjeta se reconoce, sin robarle protagonismo:
   quien prefiera elegir por su cuenta ve dónde está lo que le proponen. */
.branch-card.branch-aqui { box-shadow: inset 0 1px 0 #fff, inset 0 0 0 2px var(--acento, var(--brass)), var(--e-2); }

/* Los pozos se reparten en rejilla: en una tablet apaisada caben dos por
   fila y se acaba la columna solitaria con medio lienzo vacío al lado. */
.site-branches {
  display: grid; gap: var(--s-3);
  grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
  margin-bottom: var(--s-3);
}
.branch-card {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: .85rem; width: 100%;
  background-color: var(--surface);
  /* Papel grueso: una luz en el canto de arriba y sombra caliente debajo.
     El borde de 1 px que había antes lo dejaba plano como un formulario. */
  background-image: linear-gradient(180deg, #fffefa 0%, var(--surface) 58%, #fbf5e6 100%);
  border: none;
  border-radius: var(--r-lg);
  box-shadow:
    inset 0 1px 0 #fff,
    inset 0 0 0 1px rgba(122, 74, 33, .16),
    var(--e-1);
  padding: .9rem 1rem; text-align: left; font-size: var(--t-base);
  font-family: var(--font-text); color: var(--ink);
  transition: transform .16s cubic-bezier(.2, .8, .3, 1), box-shadow .16s ease;
}
.branch-card:hover {
  transform: translateY(-3px);
  box-shadow:
    inset 0 1px 0 #fff,
    inset 0 0 0 1px rgba(138, 90, 11, .45),
    var(--e-3);
}
.branch-card:active { transform: translateY(-1px); }
/* Hueco de icono de tamaño fijo: los emoji tienen anchos distintos y sin
   esto los títulos de cada fila empezaban en una x diferente. */
.branch-icon {
  font-size: 1.55rem; line-height: 1;
  width: 3rem; height: 3rem; flex-shrink: 0;
  display: grid; place-items: center;
  border-radius: var(--r-md);
  background-color: var(--brass-tint);
  background-image: linear-gradient(158deg, #fdf0cf 0%, var(--brass-tint) 100%);
  box-shadow: inset 0 0 0 1px rgba(138, 90, 11, .22), inset 0 -2px 4px rgba(138, 90, 11, .12);
}
.branch-info { flex: 1; min-width: 0; }
.branch-info strong { display: block; color: var(--ink); font-size: var(--t-md); font-weight: 800; }
.branch-info small { color: var(--ink-soft); font-size: var(--t-xs); }

/* Los cuatro estratos, en vertical y a escala: es el testigo de un sondeo.
   Cuatro puntos sueltos no decían de qué profundidad hablaban. */
.branch-strata-dots {
  display: flex; gap: 3px; margin: .4rem 0 .3rem;
  padding: 3px; border-radius: 5px; width: max-content;
  background: rgba(122, 74, 33, .10);
  box-shadow: inset 0 1px 2px rgba(51, 36, 15, .14);
}
.dot { width: 15px; height: 9px; border-radius: 2px; }
.dot-mastered {
  background-image: linear-gradient(180deg, var(--gold), var(--brass-light));
  background-color: var(--gold);
  box-shadow: inset 0 1px 0 rgba(255, 250, 225, .8), 0 0 5px rgba(240, 195, 60, .55);
}
.dot-open { background: var(--jungle-light); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .35); }
.dot-locked { background: rgba(107, 86, 56, .22); }
.branch-go { color: var(--brass); opacity: .45; transition: opacity .16s ease, transform .16s ease; }
.branch-go .ico { width: 1.5rem; height: 1.5rem; }
.branch-card:hover .branch-go { opacity: 1; transform: rotate(-14deg); }

.bazar-card { margin-top: var(--s-6); }
.bazar-inner {
  display: flex; gap: .85rem; align-items: center;
  background: #f6eaf2; border-left: 4px solid #8d5c82;
  border-radius: var(--r-lg);
  padding: .9rem 1.1rem; box-shadow: var(--e-1);
}
.bazar-icon {
  width: 2.9rem; height: 2.9rem; flex-shrink: 0;
  display: grid; place-items: center;
  color: #7a4c70;
  background: rgba(141, 92, 130, .14); border-radius: var(--r-md);
  box-shadow: inset 0 0 0 1px rgba(141, 92, 130, .28);
}
.bazar-icon .ico { width: 1.6rem; height: 1.6rem; }
.bazar-inner strong { font-size: var(--t-md); }
.bazar-inner p { font-size: var(--t-sm); color: var(--ink-soft); }
.bazar-inner div { flex: 1; min-width: 0; }

/* ── Estratos ── */
.branch-desc { color: var(--ink-soft); font-size: var(--t-base); margin-bottom: var(--s-5); max-width: var(--w-narrow); }
/* El pozo se dibuja como un corte del terreno visto de perfil: cada estrato
   es una capa de tierra con su propio tono, más clara arriba (arena de la
   superficie) y más oscura y arcillosa según se baja. Antes eran cuatro
   filas blancas iguales y la palabra «estrato» no significaba nada. */
/* ── La boca del pozo ──
   Una franja de superficie con el borde roto, encima de la primera capa. Es lo
   que convierte la lista en un corte de terreno: sin ella, la capa de arriba
   flota y no se sabe desde dónde se baja. */
.strata-boca {
  height: 1.5rem; border-radius: var(--r-lg) var(--r-lg) 0 0;
  background-color: #cdae7c;
  background-image: linear-gradient(180deg, #e0c79b 0%, #cdae7c 100%);
  position: relative; box-shadow: inset 0 0 0 1px rgba(122, 74, 33, .18);
}
.strata-boca::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -1px; height: 6px;
  background: repeating-linear-gradient(90deg,
    #cdae7c 0 6px, transparent 6px 9px, #cdae7c 9px 17px, transparent 17px 21px);
}
.strata-boca i {
  position: absolute; left: .9rem; top: 50%; transform: translateY(-50%);
  font-style: normal; font-size: .62rem; font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase; color: #5e451f;
}

.strata-list {
  display: flex; flex-direction: column;
  border-radius: 0 0 var(--r-lg) var(--r-lg); overflow: hidden;
  background: var(--surface);
  box-shadow:
    var(--e-3),
    inset 0 0 0 1px rgba(122, 74, 33, .18);
}
.stratum-row {
  position: relative;
  display: flex; align-items: center; gap: .85rem; width: 100%;
  border: none;
  padding: .95rem 1rem; text-align: left;
  font-family: var(--font-text); font-size: var(--t-base); color: var(--ink);
  transition: background-color .16s ease, transform .16s ease;
}
/* Línea de sedimento entre capas: irregular, no un filete de tabla. */
.stratum-row + .stratum-row::before {
  content: ''; position: absolute; left: 0; right: 0; top: 0; height: 3px;
  background:
    linear-gradient(90deg,
      rgba(122, 74, 33, .26) 0%, rgba(122, 74, 33, .10) 18%,
      rgba(122, 74, 33, .30) 37%, rgba(122, 74, 33, .12) 58%,
      rgba(122, 74, 33, .28) 76%, rgba(122, 74, 33, .13) 100%);
}
/* ── Tonos de tierra por profundidad ──
   Eran cuatro blancos casi iguales: la palabra «estrato» hacía todo el trabajo
   y el dibujo no decía nada. Ahora bajan de arena de superficie a arcilla
   profunda, con bastante recorrido para que se vea la caída de un vistazo. El
   más oscuro sigue por encima de 7:1 con la tinta, que es lo que marca el
   límite de cuánto se puede oscurecer: la legibilidad manda sobre el efecto.

   Y cada capa tiene su GRANO, no solo su tono. Arena fina arriba, gravilla
   suelta en medio, arcilla veteada abajo: cuatro materiales distintos, que es
   lo que hace que una pared de excavación se lea como capas y no como rayas. */
.stratum-row:nth-child(1) {
  background-color: #fbf0d8;
  background-image: radial-gradient(circle at 12% 30%, rgba(160, 125, 70, .10) 0 1px, transparent 1px),
                    radial-gradient(circle at 62% 72%, rgba(160, 125, 70, .09) 0 1px, transparent 1px);
  background-size: 14px 14px, 19px 19px;
}
.stratum-row:nth-child(2) {
  background-color: #f2e0bd;
  background-image: radial-gradient(circle at 30% 40%, rgba(140, 104, 54, .13) 0 1.6px, transparent 1.6px),
                    radial-gradient(circle at 78% 18%, rgba(140, 104, 54, .10) 0 1.2px, transparent 1.2px);
  background-size: 17px 17px, 23px 23px;
}
.stratum-row:nth-child(3) {
  background-color: #e7cfa1;
  background-image: repeating-linear-gradient(102deg,
                      rgba(120, 88, 44, .10) 0 2px, transparent 2px 9px),
                    radial-gradient(circle at 45% 60%, rgba(120, 88, 44, .13) 0 2px, transparent 2px);
  background-size: auto, 21px 21px;
}
.stratum-row:nth-child(4) {
  background-color: #d9bf94;
  background-image: repeating-linear-gradient(96deg,
                      rgba(104, 74, 36, .13) 0 3px, transparent 3px 11px),
                    repeating-linear-gradient(-84deg,
                      rgba(104, 74, 36, .07) 0 2px, transparent 2px 14px);
}

/* Una capa aún enterrada: apagada y con grano grueso, como tierra sin tocar.
   No se aclara —lo enterrado no está más limpio, está más compacto— así que
   se le echa una veladura de sombra por encima. */
.stratum-row.locked {
  color: var(--ink-soft);
  background-image:
    repeating-linear-gradient(114deg,
      rgba(107, 86, 56, .10) 0 3px, transparent 3px 7px);
}
/* La veladura va en una capa aparte y no en `box-shadow`: ahí pisaría el filo
   de latón de lo excavado y el del frente, que son la misma propiedad. */
.stratum-row.locked::after {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: rgba(96, 74, 44, .10);
}
.stratum-row.locked .stratum-icon { color: var(--ink-faint); }

/* ── El frente de excavación ──
   El estrato que la app propone en «Sigue por aquí». Antes las dos capas
   abiertas se veían igual y no había forma de saber por dónde entrar: dos
   puertas idénticas son media puerta. Se marca con el filo del pico a la
   izquierda y una capa de polvo levantado. */
.stratum-row.frente {
  box-shadow: inset 5px 0 0 var(--jungle-light);
}
/* El título deja sitio a la chapa para no pasar por debajo. */
.stratum-row.frente .stratum-info strong { padding-right: 3.4rem; }
.stratum-row.frente::after {
  content: 'Aquí'; position: absolute; right: .8rem; top: .55rem;
  font-family: var(--font-display); font-size: var(--t-xs);
  letter-spacing: .07em; text-transform: uppercase;
  color: #2c4f25; background: var(--jungle-tint);
  padding: .1rem .45rem; border-radius: var(--r-pill);
  box-shadow: inset 0 0 0 1px rgba(55, 98, 47, .35);
}
/* Si además está dominado manda el latón: ya no es por donde hay que entrar. */
.stratum-row.frente.excavado { box-shadow: inset 5px 0 0 var(--gold); }
.stratum-row.frente.excavado::after { display: none; }

/* Una capa excavada: limpia, con el filo de latón a la izquierda. */
.stratum-row.excavado { box-shadow: inset 4px 0 0 var(--gold); }
.stratum-row.excavado .stratum-icon {
  color: var(--brass);
  background-image: linear-gradient(160deg, #fdeec3, var(--brass-tint));
  box-shadow: inset 0 0 0 1px rgba(138, 90, 11, .30), var(--e-1);
}

.stratum-row:not(:disabled):hover { background-color: #fff9ea; }
.stratum-row:not(:disabled):active { transform: translateY(1px); }

/* Regla de profundidad: la palabra pequeña arriba y el número grande
   debajo, como la cota de una pared de excavación. En una sola línea el
   texto se salía de la columna. */
.stratum-depth {
  position: relative;
  flex-shrink: 0; width: 3.1rem;
  display: flex; flex-direction: column; align-items: center; line-height: 1;
  color: var(--brass);
}
/* La cota de la pared: una marca a la izquierda de cada número, como en el
   dibujo de sección de una excavación de verdad. */
.stratum-depth::before {
  content: ''; position: absolute; left: -.55rem; top: 50%; width: .42rem; height: 1px;
  background: currentColor; opacity: .55;
}
.stratum-depth i {
  font-style: normal; font-size: .6rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: .1em;
  color: var(--ink-faint);
}
.stratum-depth b {
  font-family: var(--font-display); font-weight: 400;
  font-size: var(--t-lg); line-height: 1.05;
  font-variant-numeric: tabular-nums;
}
.stratum-row.locked .stratum-depth { color: var(--ink-faint); }

.stratum-icon {
  width: 2.7rem; height: 2.7rem; flex-shrink: 0;
  display: grid; place-items: center;
  color: var(--leather);
  background-color: var(--surface-sunken); border-radius: var(--r-md);
  box-shadow: inset 0 0 0 1px rgba(122, 74, 33, .16), var(--e-inset);
  transition: color .16s ease, box-shadow .16s ease;
}
.stratum-icon .ico { width: 1.5rem; height: 1.5rem; }
/* El estrato dibujado. El candado y la caja siguen siendo iconos de línea:
   no son un estrato, son el estado en que está. */
.estrato-img { width: 2.2rem; height: 2.2rem; }
/* El dibujo del pozo delante de su nombre, a la altura del título. */
#branch-title { display: flex; align-items: center; gap: .5rem; }
.titulo-img { width: 2.6rem; height: 2.6rem; flex-shrink: 0; }
.stratum-info { flex: 1; min-width: 0; }
/* título en su propia línea: en los estratos bloqueados no hay barra de
   dominio que lo separe del texto de ayuda y quedaban pegados */
.stratum-info strong { display: block; font-size: var(--t-base); font-weight: 800; }
.stratum-info small { color: var(--ink-soft); font-size: var(--t-xs); display: block; }
.stratum-go {
  color: var(--brass); opacity: .45;
  transition: opacity .16s ease, transform .16s ease;
}
.stratum-go .ico { width: 1.45rem; height: 1.45rem; }
/* El pico se hunde un poco al pasar por encima: el gesto de picar. */
.stratum-row:not(:disabled):hover .stratum-go { opacity: 1; transform: rotate(-14deg) translateY(1px); }
/* La barra de dominio cruzaba la fila entera de lado a lado y se leía como
   un separador. Acotada y más gruesa, vuelve a ser un medidor. */
.mastery-bar {
  height: 9px; max-width: 15rem;
  background: rgba(122, 74, 33, .13); border-radius: var(--r-pill);
  overflow: hidden; margin: .4rem 0 .25rem;
  box-shadow: inset 0 1px 3px rgba(51, 36, 15, .20);
}
.mastery-fill {
  height: 100%; border-radius: var(--r-pill);
  background-color: var(--jungle-light);
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .38), rgba(0, 0, 0, .06));
  transition: width .5s cubic-bezier(.2, .8, .3, 1);
}
.mastery-fill.gold {
  background-color: var(--gold);
  background-image:
    linear-gradient(180deg, rgba(255, 252, 235, .55), rgba(138, 90, 11, .18)),
    linear-gradient(90deg, var(--brass-light), var(--gold));
  box-shadow: 0 0 7px rgba(240, 195, 60, .55);
}

/* ── Misión ──
   La pantalla donde más rato pasa un niño. Antes la tarjeta flotaba arriba
   y quedaba el 80 % de pergamino vacío debajo. Ahora ocupa el alto de la
   ventana y el reto queda centrado, a la altura de los ojos. */
#screen-mission {
  /* ── Dónde empieza el reto ──
     Estaba centrado dentro de una banda fija de 42 rem. En una tablet eso
     dejaba 160 px de nada por arriba y 440 px por abajo: el reto se hundía a
     media página con medio lienzo vacío debajo.

     Ahora arranca arriba, siempre a la misma altura. No es solo por aprovechar
     el sitio: un enunciado que sube y baja de un reto a otro obliga a
     BUSCARLO cada vez, y son seis veces por expedición. Que esté siempre donde
     estaba es lo que deja pensar en la pregunta en vez de en la pantalla. */
  min-height: calc(100vh - 10rem);
  min-height: calc(100svh - 10rem);   /* móviles con barra que aparece y se va */
  display: flex; flex-direction: column; justify-content: flex-start;
  padding-top: clamp(.25rem, 2vh, 1.25rem);
  max-width: var(--w-narrow); margin: 0 auto;
}
/* Cartela de misión: dónde se está excavando y cuánto queda. Va sobre una
   banda de piedra clara, no suelta sobre el papel, para que se lea como el
   marco del reto y no como una migaja de navegación. */
.mission-header {
  display: flex; justify-content: space-between; align-items: center; gap: .8rem;
  margin-bottom: var(--s-4); flex-wrap: wrap;
  font-weight: 800; color: var(--leather);
  font-size: var(--t-sm); text-transform: uppercase; letter-spacing: .06em;
  padding: .5rem .9rem; border-radius: var(--r-pill);
  background: rgba(255, 253, 247, .72);
  box-shadow: inset 0 0 0 1px rgba(122, 74, 33, .16);
}
#mission-title { display: flex; align-items: center; gap: .45rem; min-width: 0; }
#mission-title .ico { width: 1.15rem; height: 1.15rem; }
.mh-site { display: inline-flex; align-items: center; gap: .35rem; }
.mh-img { width: 1.5rem; height: 1.5rem; flex-shrink: 0; }
/* Separador en forma de rombo: marca el salto de yacimiento a estrato sin
   meter otro punto medio en una línea que ya lleva dos. */
.mh-sep {
  width: 5px; height: 5px; flex-shrink: 0;
  background: var(--brass); transform: rotate(45deg); opacity: .55;
}
.mission-progress { display: flex; gap: .35rem; }

/* ── La racha ──
   Aparece a los tres aciertos seguidos, late cuando el número sube, y al
   fallar se va sin ruido: en esta app el error no penaliza, y una racha que se
   rompe con estruendo es exactamente lo contrario. */
.mission-racha {
  display: inline-flex; align-items: center; gap: .35rem;
  font-size: var(--t-sm); font-weight: 800; letter-spacing: .04em;
  color: #8a3d12; padding: .25rem .6rem; border-radius: var(--r-pill);
  background: linear-gradient(135deg, #ffe9c2, #ffd79a);
  box-shadow: inset 0 0 0 1px rgba(168, 90, 20, .35);
}
.racha-llama { font-size: 1rem; line-height: 1; }
.racha-late { animation: racha-sube .42s cubic-bezier(.2, .8, .3, 1) both; }
@keyframes racha-sube {
  0%   { transform: scale(1); }
  40%  { transform: scale(1.18); }
  100% { transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) { .racha-late { animation: none; } }
.qdot {
  width: 11px; height: 11px; border-radius: 50%;
  background: rgba(122, 74, 33, .14);
  box-shadow: inset 0 1px 2px rgba(51, 36, 15, .25);
  transition: background-color .2s ease, transform .2s ease, box-shadow .2s ease;
}
.qdot-ok {
  background: var(--jungle-light);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .45), 0 0 0 1.5px var(--jungle);
}
.qdot-fail {
  background: var(--danger);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .30), 0 0 0 1.5px var(--danger);
}
.qdot-current {
  background: var(--gold); transform: scale(1.35);
  box-shadow: 0 0 0 1.5px var(--brass), 0 0 7px rgba(240, 195, 60, .8);
}

.question-card, .feedback-card, .result-card {
  position: relative;
  background-color: var(--surface-raised);
  /* Ficha de excavación: papel grueso con luz arriba y peso abajo. */
  background-image: linear-gradient(180deg, #ffffff 0%, #fffdf7 62%, #fdf7ea 100%);
  border-radius: var(--r-xl);
  border: none;
  box-shadow:
    inset 0 1px 0 #fff,
    inset 0 0 0 1px rgba(122, 74, 33, .14),
    var(--e-3);
  padding: clamp(1.2rem, 3vw, 2rem);
}
/* Cinta de latón en el canto superior: remata la tarjeta y le da un frente. */
.question-card::before, .result-card::before {
  content: ''; position: absolute; left: 14%; right: 14%; top: 0; height: 3px;
  border-radius: var(--r-pill);
  background: linear-gradient(90deg,
    transparent, var(--brass-light) 25%, var(--gold) 50%, var(--brass-light) 75%, transparent);
}
.question-text {
  font-size: clamp(1.15rem, 2.4vw, 1.4rem); font-weight: 700; line-height: 1.4;
  margin-bottom: var(--s-5); white-space: pre-line; color: var(--ink);
}
/* Dos columnas cuando el hueco lo permite: cuatro opciones cortas apiladas
   obligaban a barrer toda la pantalla con la vista. */
.options { display: grid; gap: .6rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
/* Cada opción es una losa: canto claro arriba, base oscura abajo y un
   desplazamiento real al pulsar, como una tecla que se hunde. Antes eran
   rectángulos planos y responder no se notaba en la mano. */
.option {
  display: flex; align-items: center; gap: .75rem;
  padding: .9rem 1rem; font-family: var(--font-text);
  font-size: var(--t-md); font-weight: 600; text-align: left; color: var(--ink);
  background-color: var(--paper);
  background-image: linear-gradient(180deg, #f8ecd6 0%, var(--paper) 100%);
  border: 2px solid transparent;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .75),
    0 3px 0 rgba(122, 74, 33, .22),
    var(--e-1);
  border-radius: var(--r-md); min-height: 3.4rem;
  transition: transform .12s ease, border-color .12s ease, box-shadow .12s ease, background-color .12s ease;
}
/* Letra de la opción: da un asidero para leerlas y nombrarlas en voz alta
   («la C»), y de paso alinea todos los textos en la misma x. */
/* La letra lleva la tinta del yacimiento donde se está excavando. No dice
   nada de la respuesta —las cuatro llevan la misma, y diferenciarlas sería
   filtrar cuál es la buena— pero ata el reto a su sitio: se está en Kaldros,
   no en un formulario. */
.option::before {
  content: attr(data-letra);
  flex-shrink: 0; width: 2rem; height: 2rem;
  display: grid; place-items: center;
  background-color: var(--acento-suave, var(--brass-tint));
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .55), transparent);
  color: var(--acento, var(--leather-dark));
  border-radius: var(--r-sm);
  box-shadow: inset 0 0 0 1px rgba(138, 90, 11, .28), 0 1px 0 rgba(255, 255, 255, .6);
  font-family: var(--font-display); font-size: var(--t-sm);
  transition: background-color .12s ease, color .12s ease;
}
.option:not(:disabled):hover {
  border-color: var(--brass); background-color: #fffdf6;
  background-image: linear-gradient(180deg, #fffdf6 0%, #fdf6e6 100%);
  transform: translateY(-2px);
  box-shadow:
    inset 0 1px 0 #fff,
    0 5px 0 rgba(122, 74, 33, .22),
    var(--e-2);
}
/* Se hunde de verdad: baja los 3 px que tenía de canto. */
.option:not(:disabled):active {
  transform: translateY(3px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .6), 0 0 0 rgba(122, 74, 33, .22), var(--e-1);
}
/* Al corregir, las opciones se deshabilitan; la opacidad general de
   :disabled dejaba el acierto y el fallo casi ilegibles justo cuando hay que
   mirarlos. Se devuelve la opacidad a las tres marcadas y se atenúan solo
   las que no dicen nada. */
.option:disabled { opacity: 1; }
.option:disabled:not(.option-correct):not(.option-wrong):not(.option-reveal) { opacity: .5; }
.option-correct { background: var(--jungle-tint) !important; border-color: var(--jungle) !important; }
.option-correct::before { background: var(--jungle); color: #fff; }
.option-wrong { background: var(--danger-tint) !important; border-color: var(--danger) !important; }
.option-wrong::before { background: var(--danger); color: #fff; }
.option-reveal { border-color: var(--jungle) !important; border-style: dashed !important; }
/* Pista, escuchar y abandonar. Se envuelven: son tres botones, y con la letra
   grande de 1.º —o con el de voz visible— no caben en una fila de 390 px. Sin
   envolver, «Abandonar» se salía 40 px de la pantalla. */
.mission-tools {
  display: flex; justify-content: space-between; align-items: center;
  flex-wrap: wrap; gap: .5rem;
  margin-top: var(--s-5); padding-top: var(--s-4); border-top: var(--line);
}

.feedback-card { text-align: center; animation: slide-in .3s ease; }
.feedback-title { font-family: var(--font-display); font-size: var(--t-xl); color: var(--leather-dark); margin: var(--s-3) 0; }
.feedback-explain { color: var(--ink-soft); margin-bottom: var(--s-5); font-size: var(--t-md); }
.feedback-card .btn { margin-top: .3rem; }
/* Quien habla se ve. El emoji va delante del titular, en su tamaño, para que
   se sepa si celebra Kira o acompaña Tobías. */
/* Quien habla, delante del titular. Va en línea con el texto: es quien lo
   dice, no una ilustración aparte. */
img.feedback-quien {
  display: inline-block; width: 3rem; height: 3rem;
  margin-right: .45rem; vertical-align: -.85em;
}

/* Al fallar, lo que hay que leer es la explicación. Era el texto más pequeño y
   más gris de la pantalla, justo al revés de lo que hace falta. */
.feedback-card.feedback-ensena .feedback-title { font-size: var(--t-lg); }
.feedback-card.feedback-ensena .feedback-explain {
  font-size: var(--t-lg); color: var(--ink); line-height: 1.5;
  background: var(--paper); border-radius: var(--r-md);
  padding: .8rem 1rem; text-align: left;
  border-left: 4px solid var(--brass);
}

/* ── Resultado ──
   Mismo centrado que la misión: es el momento de celebrar, y celebrarlo en
   la esquina de arriba de una pantalla vacía no celebra nada. */
#screen-result {
  max-width: var(--w-narrow); margin: 0 auto;
  min-height: min(calc(100vh - 13rem), 42rem);
  display: flex; flex-direction: column; justify-content: center;
}
.result-card { text-align: center; }
.big-emoji { font-size: 3.4rem; text-align: center; line-height: 1; margin-bottom: var(--s-3); }

/* Sello de expedición. Un emoji de 3,4 rem hacía de trofeo, y a ese tamaño
   se ve el estilo de cada sistema operativo, no el del juego. Esto es un
   disco de latón que se estampa al llegar. */
.sello {
  width: 5.4rem; height: 5.4rem; margin: 0 auto var(--s-4);
  display: grid; place-items: center;
  border-radius: var(--r-pill);
  color: var(--ink-soft);
  background-color: var(--surface-sunken);
  background-image: radial-gradient(circle at 50% 26%, #fffdf5, var(--surface-sunken) 78%);
  box-shadow:
    inset 0 0 0 2px rgba(122, 74, 33, .28),
    inset 0 0 0 5px rgba(255, 255, 255, .55),
    inset 0 -3px 6px rgba(122, 74, 33, .16),
    var(--e-2);
  animation: estampa .5s cubic-bezier(.2, 1.4, .4, 1);
}
.sello .ico { width: 2.5rem; height: 2.5rem; }
/* Cuando se ha logrado, el sello es de latón encendido. */
.sello-logro {
  color: var(--leather-dark);
  background-color: var(--gold);
  background-image: radial-gradient(circle at 50% 24%, #fff3c8, var(--brass-light) 62%, #d9a520 100%);
  box-shadow:
    inset 0 0 0 2px rgba(138, 90, 11, .55),
    inset 0 0 0 5px rgba(255, 250, 225, .60),
    inset 0 -3px 8px rgba(138, 90, 11, .30),
    0 0 22px rgba(240, 195, 60, .55),
    var(--e-2);
}
/* Los tres tonos del aviso inmediato. El acierto y el fallo ya no dependen
   de qué emoji tocara: cada uno tiene su color y su símbolo fijos. */
.sello-bien {
  color: #2b5024;
  background-color: var(--jungle-tint);
  background-image: radial-gradient(circle at 50% 24%, #f3fbe9, var(--jungle-tint) 76%);
  box-shadow:
    inset 0 0 0 2px rgba(55, 98, 47, .45),
    inset 0 0 0 5px rgba(255, 255, 255, .60),
    0 0 20px rgba(111, 158, 89, .40),
    var(--e-2);
}
.sello-mal {
  color: #8d2f1e;
  background-color: var(--danger-tint);
  background-image: radial-gradient(circle at 50% 24%, #fdf0ec, var(--danger-tint) 76%);
  box-shadow:
    inset 0 0 0 2px rgba(168, 58, 37, .42),
    inset 0 0 0 5px rgba(255, 255, 255, .60),
    var(--e-2);
}
.sello-bien .ico, .sello-mal .ico { stroke-width: 2.6; }
/* El sello del fallo no rebota: llega de lado, sin celebrarse. */
.sello-mal { animation: llega-mal .34s ease-out; }
@keyframes llega-mal {
  from { transform: translateX(-10px); opacity: 0; }
  to   { transform: none; opacity: 1; }
}
@media (prefers-reduced-motion: reduce) { .sello-mal { animation: none; } }

/* Cae y se asienta, como un cuño sobre el papel. */
@keyframes estampa {
  0%   { transform: scale(1.7) rotate(-9deg); opacity: 0; }
  55%  { opacity: 1; }
  100% { transform: scale(1) rotate(0); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) { .sello { animation: none; } }

/* Los iconos dentro de las filas de recompensa van en su tono de marca. */
.reward-row .ico { color: var(--brass); }
.result-card h2 { margin-bottom: var(--s-4); }
.result-rewards {
  margin: var(--s-5) 0; text-align: left;
  background: var(--paper); border-radius: var(--r-lg); padding: .4rem 1rem;
}
.reward-row {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--s-4);
  padding: .55rem 0; border-bottom: var(--line); font-size: var(--t-base);
}
.reward-row:last-child { border-bottom: none; }
.reward-row span { color: var(--ink-soft); }
.reward-row strong { font-variant-numeric: tabular-nums; font-size: var(--t-md); }
.reward-note {
  font-size: var(--t-sm); color: var(--ink-soft); padding: .55rem 0;
  border-top: var(--line); line-height: 1.5;
}
.reward-levelup {
  background-color: #fff2c9;
  background-image: linear-gradient(135deg, #fff6d9, #ffeeb8);
  border-radius: var(--r-md); box-shadow: 0 0 0 1px rgba(138, 90, 11, .3);
  padding: .7rem .9rem; margin-top: var(--s-3); font-weight: 700; text-align: center;
  color: var(--leather-dark);
}
/* Subir de rango con la medalla al lado: la frase sola se leía como una fila
   más de números y lo que acaba de pasar es lo mejor de la pantalla. */
.reward-rango {
  display: flex; align-items: center; justify-content: center;
  gap: .75rem; text-align: left;
}
.reward-rango p { margin: 0; }
.medalla-subida {
  width: 3.4rem; height: 3.4rem; flex-shrink: 0; object-fit: contain;
  filter: drop-shadow(0 2px 3px rgba(90, 60, 20, .4));
}
/* El fragmento del Atlas, que es el premio de verdad de la Cámara. Grande y
   centrado: se ha ganado el sitio. */
.reward-trofeo {
  display: flex; flex-direction: column; align-items: center; gap: .35rem;
  margin-top: var(--s-3); padding: .8rem;
  background-color: #fff2c9;
  background-image: linear-gradient(135deg, #fff6d9, #ffeeb8);
  border-radius: var(--r-md); box-shadow: 0 0 0 1px rgba(138, 90, 11, .3);
  color: var(--leather-dark); font-weight: 700; text-align: center;
}
.reward-trofeo p { margin: 0; }
.trofeo-img {
  width: min(11rem, 60%); height: auto; object-fit: contain;
  filter: drop-shadow(0 3px 5px rgba(90, 60, 20, .35));
}
/* El trofeo aparece: no estaba y ahora está, que es justo lo que pasó. */
@media (prefers-reduced-motion: no-preference) {
  .trofeo-img { animation: aparece .5s cubic-bezier(.2, .8, .3, 1) both; }
}

/* ── Campamento ── */
/* Avatar y equipo en fila: en columna, el bloque era una losa blanca casi
   vacía que ocupaba media pantalla antes de llegar al almacén. */
.camp-avatar-zone {
  display: flex; align-items: center; gap: var(--s-5);
  background-color: var(--surface);
  background-image: linear-gradient(135deg, var(--surface-raised), var(--surface));
  border-radius: var(--r-xl); box-shadow: var(--e-2);
  padding: var(--s-4) var(--s-5);
}
.camp-gear-equipped { flex: 1; justify-content: flex-start; }
.camp-gear-equipped small { color: var(--ink-soft); font-size: var(--t-sm); }
.camp-avatar {
  position: relative;
  font-size: 2.8rem; line-height: 1; flex-shrink: 0;
  width: 4.4rem; height: 4.4rem; display: grid; place-items: center;
  background: var(--brass-tint); border-radius: var(--r-pill);
  box-shadow: var(--e-inset);
}
.camp-gear-equipped { display: flex; gap: .4rem; flex-wrap: wrap; justify-content: center; min-height: 2.2rem; align-items: center; }
.gear-chip {
  font-size: 1.4rem; background: var(--paper); border-radius: var(--r-sm);
  padding: .2rem .45rem; box-shadow: 0 0 0 1px rgba(138, 90, 11, .25);
}
/* Lo que lleva puesto, dibujado y no en emoji: es lo que ha comprado con su
   trabajo y donde antes había un icono de teclado ahora hay una cosa suya. */
.gear-chip .icono-dibujo { width: 2.2rem; height: 2.2rem; }
/* ── El campamento dibujado ──
   Era una línea de emoji sueltos que no se distinguía de un texto cualquiera.
   Ahora es un SITIO: cielo, dos dunas y suelo, y lo comprado puesto encima en
   su lugar de siempre. La proporción es ancha y baja, como un horizonte, y se
   estira con la pantalla sin que nada se salga. */
.camp-scene { margin-top: var(--s-4); }
.escena {
  position: relative; width: 100%; aspect-ratio: 5 / 2; min-height: 9rem;
  border-radius: var(--r-lg); overflow: hidden;
  box-shadow: inset 0 0 0 1px rgba(122, 74, 33, .22), var(--e-inset);
}
/* El paisaje. Antes eran tres elipses de CSS; ahora es el dibujo, recortado
   por abajo para que el primer plano quede despejado: ahí es donde se posan la
   tienda, el jeep y el explorador. */
.escena-fondo {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: 50% 62%;
}
/* Cada cosa comprada, en su sitio. La sombra bajo el emoji es lo que la posa
   en el suelo en vez de dejarla flotando encima del dibujo. */
.escena-cosa, .escena-yo, .escena-perro {
  position: absolute; line-height: 1;
  filter: drop-shadow(0 2px 2px rgba(90, 60, 20, .35));
}
/* La cosa del campamento se coloca por su ANCHO, no por el tamaño de letra:
   con dibujo el emoji ya no manda, y la tienda y el jeep tienen que guardar
   entre sí la proporción que tienen en la vida. El `font-size` sigue puesto
   desde el guion para lo que no tenga dibujo. */
.escena-cosa .icono-dibujo { width: 100%; height: auto; }
.escena-cosa:has(.icono-emoji) { width: auto !important; }
.escena-yo {
  left: 44%; bottom: 12%; font-size: 2.6rem; z-index: 6;
  display: grid; place-items: center;
}
/* El avatar de rol trae su propio medallón: aquí se queda a la escala de la
   escena, que si no tapa media duna. */
.escena-yo .rol-medallon { width: 2.6rem; height: 2.6rem; }
.escena-perro { left: 55%; bottom: 9%; width: 3rem; z-index: 7; }
.escena-perro .retrato { display: block; width: 100%; height: auto; object-position: center; }
.escena-pie {
  margin: .5rem 0 0; font-size: var(--t-sm); color: var(--ink-soft); text-align: center;
}
.escena-pie .ico { width: 1rem; height: 1rem; vertical-align: -.15em; }

/* En pantallas estrechas el horizonte se hace más alto para que las cosas no
   se amontonen: es la misma escena, con más aire entre pieza y pieza. */
@media (max-width: 30rem) {
  .escena { aspect-ratio: 2 / 1; }
}
.camp-prefs { margin-top: var(--s-4); }
/* La casilla se iba al extremo derecho de una tarjeta muy ancha y perdía la
   relación con su etiqueta. */
.camp-prefs .cfg-field-inline { max-width: 22rem; }
/* Toda la fila es la zona de toque, no la casilla de 28 px: la pulsa un niño
   con el dedo, y son los dos ajustes de accesibilidad de la app. La casilla ya
   viene a 28 px de `.cfg-field-inline`; lo que faltaba era la altura de fila. */
.camp-prefs .cfg-field-inline { min-height: 2.75rem; align-items: center; cursor: pointer; }

.shop-note { font-size: var(--t-sm); color: var(--ink-soft); margin-bottom: var(--s-4); max-width: var(--w-narrow); }
/* El almacén en rejilla: en columna única cada artículo ocupaba una fila
   entera y había que hacer scroll para ver el catálogo completo. */
.shop-list {
  display: grid; gap: .6rem;
  /* 19 rem y no 17: desde que cada artículo enseña su dibujo, el hueco de la
     izquierda ocupa lo suyo y a 17 los nombres se partían en tres renglones
     —«Jeep / de la / expedición»— con el botón encima. */
  grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
}
.shop-item {
  display: flex; align-items: center; gap: .75rem;
  background: var(--surface); border-radius: var(--r-lg); padding: .7rem .85rem;
  box-shadow: var(--e-1); border: var(--line);
}
.shop-icon {
  font-size: 1.5rem; line-height: 1;
  width: 2.7rem; height: 2.7rem; flex-shrink: 0;
  display: grid; place-items: center;
  background: var(--surface-sunken); border-radius: var(--r-md);
}
/* Con dibujo el hueco crece un poco y se le quita el relleno: la mercancía
   es lo que hay que ver, y a 2,7 rem con margen el catalejo era una raya. */
.shop-icon:has(.icono-dibujo) {
  width: 3.4rem; height: 3.4rem; padding: .15rem;
  background: transparent;
}
.shop-icon .icono-dibujo { filter: drop-shadow(0 1px 1px rgba(90, 60, 20, .3)); }
.shop-info { flex: 1; min-width: 0; }
/* Nombre y precio en líneas distintas: pegados se leía «Sombrero de ala
   ancha80 🪙». Mismo arreglo que ya tenían los estratos. */
.shop-info strong { display: block; font-size: var(--t-sm); font-weight: 800; line-height: 1.3; }
/* El precio como ficha: doce botones marrones seguidos gritaban más que la
   mercancía, y lo que hay que comparar es el precio. */
.shop-info small {
  display: inline-block; margin-top: .2rem;
  background: var(--brass-tint); color: var(--leather-dark);
  border-radius: var(--r-sm); padding: .05rem .4rem;
  font-weight: 800; font-size: var(--t-xs);
}
/* Botón de compra terciario: el protagonista es el objeto, no el botón */
.shop-item .btn-secondary {
  background: transparent; color: var(--brass);
  box-shadow: inset 0 0 0 2px rgba(138, 90, 11, .35);
  flex-shrink: 0; white-space: nowrap;
}
.shop-item .btn-secondary:hover:not(:disabled) { background: var(--brass); color: #fff; box-shadow: var(--e-1); }
.shop-item .btn-secondary:disabled { box-shadow: inset 0 0 0 2px rgba(107, 86, 56, .25); color: var(--ink-soft); }

/* ── Fondo de la Sociedad ── */
.fund-block {
  margin-top: var(--s-6); padding: var(--s-5);
  background: var(--surface); border-radius: var(--r-xl);
  box-shadow: var(--e-2); border-top: 4px solid var(--brass);
}
.fund-block h3 { margin: 0 0 .2rem; }
.fund-block h3::after { display: none; }
.fund-bar {
  height: 14px; background: var(--surface-sunken); border-radius: var(--r-pill);
  overflow: hidden; box-shadow: var(--e-inset); margin-top: var(--s-4);
}
.fund-bar-fill {
  height: 100%; border-radius: var(--r-pill);
  background: linear-gradient(90deg, var(--jungle-light), var(--gold));
  transition: width .6s cubic-bezier(.2, .8, .3, 1);
}
.fund-bar-legend {
  display: flex; flex-wrap: wrap; gap: .1rem .6rem;
  font-size: var(--t-sm); color: var(--ink-soft); margin-top: .45rem;
}
.fund-milestones {
  display: grid; gap: .5rem; margin: var(--s-5) 0;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
}
.fund-milestone {
  display: flex; align-items: center; gap: .7rem;
  padding: .55rem .7rem; border-radius: var(--r-md);
  background: var(--paper-deep); color: var(--ink-soft);
}
.fund-milestone.fund-done {
  background: var(--jungle-tint); color: var(--ink);
  border-left: 4px solid var(--jungle-light);
}
.fund-milestone .fund-icon {
  font-size: 1.3rem; line-height: 1;
  width: 2.4rem; height: 2.4rem; flex-shrink: 0;
  display: grid; place-items: center;
  background: rgba(255, 255, 255, .55); border-radius: var(--r-sm);
}
/* Un hito conseguido crece y pierde el cajetín: lo que la clase ha ganado se
   ve, y lo que sigue bajo llave se queda en su candado pequeño. */
.fund-milestone .fund-icon:has(.hito-img) {
  width: 3.4rem; height: 3.4rem; background: none;
}
.hito-img { width: 100%; height: 100%; }
/* El hito que viene, dentro de una frase: a la altura de la letra. */
.hito-linea { display: inline-block; width: 1.5rem; height: 1.5rem; vertical-align: -.4em; }
.fund-milestone strong { display: block; font-size: var(--t-sm); font-weight: 800; color: var(--ink); }
.fund-milestone small { color: var(--ink-soft); font-size: var(--t-xs); }
.fund-donate {
  display: flex; flex-wrap: wrap; align-items: center; gap: .6rem;
  padding-top: var(--s-4); border-top: var(--line);
}
.fund-donate-label { font-weight: 800; font-size: var(--t-sm); }
.fund-buttons { display: flex; flex-wrap: wrap; gap: .4rem; }
.fund-mine { font-size: var(--t-xs); color: var(--ink-soft); margin-top: .6rem; }

/* ── Bitácora ── */
/* ── La semana en curso ──
   Va la primera y dibujada. Tres días es el sello, así que son tres casillas:
   es lo único de esta pantalla que el niño puede cambiar hoy, y lo que
   convierte «0 sellos» en «te falta un día». */
.logbook-semana {
  background-color: var(--surface);
  background-image: linear-gradient(180deg, #fffdf7, var(--surface));
  border-radius: var(--r-lg); border-left: 5px solid var(--brass);
  padding: var(--s-4) var(--s-5); margin-bottom: var(--s-4);
  box-shadow: inset 0 1px 0 #fff, var(--e-1);
}
.logbook-semana.semana-lograda { border-left-color: var(--jungle); background-image: linear-gradient(180deg, #fbfff5, var(--jungle-tint)); }
.semana-titulo {
  margin: 0 0 .6rem; font-family: var(--font-display);
  font-size: var(--t-lg); color: var(--leather-dark);
}
.semana-dias { display: flex; gap: .45rem; margin-bottom: .5rem; }
/* Una casilla por día: hueca la que falta, sellada la que está. El hueco tiene
   el mismo tamaño que la marca, para que se vea CUÁNTO falta y no solo que
   falta algo. */
.semana-dia {
  width: 2.3rem; height: 2.3rem; border-radius: var(--r-md);
  background: var(--paper-deep);
  box-shadow: inset 0 0 0 2px rgba(122, 74, 33, .22);
}
/* El día conseguido lleva el sello dibujado. La casilla se queda sin fondo ni
   borde: el sello ya tiene silueta propia y encerrarlo en un cuadrado le
   quitaría lo que lo hace un sello. */
.semana-dia.dia-hecho {
  background: none; box-shadow: none;
  display: grid; place-items: center;
}
.semana-dia.dia-hecho img { width: 100%; height: 100%; object-fit: contain; display: block; }
.semana-dice { margin: 0; font-size: var(--t-sm); color: var(--ink-soft); }

/* auto-FILL y no auto-fit: ahora las cifras aparecen según hay algo que
   contar, y con una sola tarjeta `auto-fit` la estiraba de lado a lado.
   Con `auto-fill` los carriles vacíos siguen ahí y la tarjeta conserva su
   tamaño de tarjeta. */
.logbook-summary {
  display: grid; gap: .6rem; margin-bottom: var(--s-5);
  grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
}
.logbook-stat {
  display: flex; flex-direction: column; gap: .1rem;
  background: var(--surface); border-radius: var(--r-lg);
  padding: .85rem 1rem; box-shadow: var(--e-1); border: var(--line);
}
.logbook-stat strong {
  font-family: var(--font-display); font-size: var(--t-xl);
  color: var(--leather-dark); font-variant-numeric: tabular-nums;
}
.logbook-stat span { font-size: var(--t-xs); color: var(--ink-soft); text-transform: uppercase; letter-spacing: .04em; font-weight: 700; }

/* La ruta se ciñe a los sellos que hay: estirada a todo lo ancho con un
   solo sello parecía una tira en blanco. */
.stamps-route {
  display: inline-flex; align-items: center; flex-wrap: wrap; gap: .1rem;
  background: var(--surface); border-radius: var(--r-pill);
  padding: .5rem .9rem; box-shadow: var(--e-1); border: var(--line);
}
.logbook-note {
  font-size: var(--t-sm); color: var(--ink-soft); line-height: 1.6;
  max-width: var(--w-narrow); margin-top: var(--s-4);
}
.dashboard-note { font-size: var(--t-base); color: var(--ink-soft); max-width: var(--w-narrow); margin-bottom: var(--s-5); }
.merits-summary .logbook-stat strong { font-size: var(--t-lg); }
.stamp {
  font-size: 1.3rem; width: 2rem; height: 2rem;
  display: grid; place-items: center; border-radius: var(--r-pill);
}
.stamp-earned { background: none; }
.sello-img { width: 100%; height: 100%; object-fit: contain; display: block; }
.stamp-protected { background: #e2ecf5; }
.stamp-missed { color: var(--ink-faint); }
.stamp-current { background: var(--jungle-tint); box-shadow: 0 0 0 2px var(--jungle-light); }
.stamp-current:has(.sello-img) { background: none; box-shadow: none; }
.route-line { flex: 0 0 12px; height: 2px; background: rgba(122, 74, 33, .25); }

/* ── Cuaderno del docente ── */
.dash-intro { color: var(--ink-soft); margin-bottom: var(--s-5); max-width: var(--w-narrow); }
/* auto-fit, no un número fijo de columnas: con 5 tarjetas quedaba una sola
   huérfana en la segunda fila. */
.kpi-grid {
  display: grid; gap: .7rem; margin-bottom: var(--s-5);
  grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr));
}
/* Etiqueta arriba en versalitas, cifra grande debajo, matiz al pie: antes la
   cifra y la etiqueta competían las dos en negrita y no se sabía qué leer. */
.kpi-card {
  display: flex; flex-direction: column; gap: .15rem;
  background: var(--surface); border-radius: var(--r-lg);
  padding: .9rem 1rem; box-shadow: var(--e-1); border: var(--line);
  border-top: 3px solid var(--brass-light);
}
.kpi-label {
  order: -1;
  font-size: var(--t-xs); color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: .05em; font-weight: 700;
  line-height: 1.3;
}
.kpi-value {
  font-family: var(--font-display); font-size: var(--t-xl); line-height: 1.1;
  color: var(--leather-dark);
}
.kpi-card small { font-size: var(--t-xs); color: var(--ink-faint); line-height: 1.35; }

/* Dominio por estrato: columna de etiquetas de ancho fijo para que todas
   las barras arranquen en la misma x. */
.dash-branch {
  background: var(--surface); border-radius: var(--r-lg);
  padding: var(--s-4); box-shadow: var(--e-1); border: var(--line);
  margin-bottom: .6rem;
}
.dash-branch h4 { margin-bottom: .6rem; display: flex; align-items: center; gap: .5rem; }
.dash-row {
  display: grid; grid-template-columns: 7.5rem 1fr auto;
  align-items: center; gap: .7rem; padding: .22rem 0;
  font-size: var(--t-sm);
}
.dash-row-label { color: var(--ink-soft); }
.dash-row-num { font-variant-numeric: tabular-nums; color: var(--ink-soft); font-size: var(--t-xs); white-space: nowrap; }

/* ── Toast ── */
.toast {
  position: fixed; bottom: 5.4rem; left: 50%; transform: translateX(-50%);
  background: var(--leather-dark); color: #fdf3dd; border-radius: var(--r-md);
  padding: .75rem 1.2rem; font-size: var(--t-sm); font-weight: 600; z-index: 50;
  box-shadow: var(--e-3); max-width: min(90vw, 30rem); text-align: center;
  border: 1px solid rgba(240, 195, 60, .3);
}
/* Con cara, el aviso deja de ser un rótulo centrado y pasa a ser alguien
   diciendo algo: el retrato a la izquierda y el texto alineado a su lado. */
.toast-con-cara {
  display: flex; align-items: center; gap: .6rem; text-align: left;
  padding: .55rem 1rem .55rem .6rem;
}
.toast-retrato {
  width: 2.4rem; height: 2.4rem; flex-shrink: 0;
  border-radius: var(--r-pill); background: rgba(255, 245, 220, .12);
  object-fit: cover; object-position: 50% 12%;
}

/* ── Animaciones ── */
@keyframes pulse { 0%,100% { transform: scale(1); } 50% { transform: scale(1.12); } }
@keyframes slide-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.toast { animation: toast-in .3s ease; }
@keyframes toast-in { from { opacity: 0; transform: translate(-50%, 10px); } to { opacity: 1; transform: translate(-50%, 0); } }

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; }
}

/* ══════════ ACCESO ══════════ */
.auth-tabs { display: flex; gap: .4rem; margin: var(--s-5) 0 0; }
.auth-tab {
  flex: 1; padding: .65rem; border: none;
  background: var(--paper-deep); color: var(--ink-soft);
  border-radius: var(--r-md); font-family: var(--font-text);
  font-weight: 700; font-size: var(--t-sm); min-height: var(--tap);
}
.auth-tab.active { background: var(--leather-dark); color: var(--gold); }
#login-form, #register-form { display: flex; flex-direction: column; gap: .7rem; margin-top: var(--s-4); }
#login-form input, #register-form input, #onboarding-form input {
  padding: .8rem 1rem; font-size: var(--t-md); font-family: var(--font-text);
  border-radius: var(--r-md);
  border: 2px solid rgba(122, 74, 33, .28); background: var(--paper); color: var(--ink);
  text-align: center; min-height: var(--tap);
  transition: border-color .15s ease, box-shadow .15s ease;
}
#login-form input:focus, #register-form input:focus, #onboarding-form input:focus {
  outline: none; border-color: var(--brass);
  box-shadow: 0 0 0 3px rgba(138, 90, 11, .18);
}
.auth-error {
  background: var(--danger-tint); border-left: 4px solid var(--danger); color: #7d2d1c;
  border-radius: var(--r-md); padding: .7rem .9rem; margin-top: var(--s-4); font-size: var(--t-sm);
}
.auth-note { font-size: var(--t-xs); color: var(--ink-soft); margin-top: var(--s-4); }
.hud-logout {
  background: transparent; border: none; font-size: 1.15rem; color: inherit;
  padding: .3rem .4rem; border-radius: var(--r-sm); line-height: 1;
}
.hud-logout:hover { background: rgba(255,255,255,.12); }

/* ══════════ MÉRITOS DE CAMPAMENTO ══════════ */
.merits-intro { font-size: var(--t-sm); color: var(--ink-soft); margin-bottom: var(--s-5); max-width: var(--w-narrow); }
.merits-summary {
  display: grid; gap: .6rem; margin-bottom: var(--s-4);
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
}
.merits-today { display: grid; gap: .45rem; grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); }
.merit-row {
  display: flex; align-items: center; gap: .75rem;
  background: var(--surface); border-radius: var(--r-lg); padding: .65rem .85rem;
  box-shadow: var(--e-1); border: var(--line); border-left: 4px solid transparent;
}
.merit-row.merit-earned { border-left-color: var(--gold); }
.merit-icon {
  font-size: 1.4rem; line-height: 1;
  width: 2.6rem; height: 2.6rem; flex-shrink: 0;
  display: grid; place-items: center;
  background: var(--surface-sunken); border-radius: var(--r-md);
}
.merit-icon:has(.icono-dibujo) { background: transparent; padding: .1rem; }
.merit-info { flex: 1; min-width: 0; }
.merit-info strong { display: block; font-size: var(--t-sm); font-weight: 800; }
.merit-info small { color: var(--ink-soft); font-size: var(--t-xs); }
.merit-count { font-size: .9rem; letter-spacing: -2px; }
.merits-history { display: flex; flex-direction: column; gap: .35rem; }
.history-day {
  display: flex; align-items: center; gap: .9rem;
  background: var(--surface); border-radius: var(--r-md); padding: .5rem .85rem;
  box-shadow: var(--e-1); border: var(--line);
}
.history-date {
  font-size: var(--t-xs); font-weight: 700; color: var(--brass);
  min-width: 3.4rem; text-transform: uppercase; letter-spacing: .04em;
}
.history-icons { font-size: 1.2rem; letter-spacing: .15rem; }
/* El historial: los méritos del día en fila, del tamaño de la letra. */
.history-icons { display: inline-flex; align-items: center; gap: .3rem; vertical-align: middle; }
.history-uno { display: inline-block; width: 1.5rem; height: 1.5rem; line-height: 1; }
/* ── Los dibujos de espera ──
   Una pantalla que todavía no tiene nada no puede ser media pantalla de
   beige con una frase encima: se lee como una avería. Con el dibujo se lee
   como lo que es, que la expedición no ha empezado. */
.espera {
  display: flex; flex-direction: column; align-items: center; gap: var(--s-3);
  padding: var(--s-5) var(--s-4); text-align: center;
  /* Centrado por sí mismo: se planta dentro de contenedores que están
     alineados a la izquierda y con el ancho tasado, y ahí un dibujo pegado a
     un lado se lee como un fallo de maquetación. */
  width: 100%; max-width: 34rem; margin-inline: auto;
}
.espera-img { width: min(15rem, 60%); height: auto; opacity: .92; }
.espera p {
  margin: 0; max-width: 26rem;
  color: var(--ink-soft); font-size: var(--t-sm); line-height: 1.55;
}

.empty-note {
  color: var(--ink-soft); font-size: var(--t-sm); padding: var(--s-4);
  background: var(--paper-deep); border-radius: var(--r-md); text-align: center;
}
/* Una pantalla vacía con la cara de quien te está esperando se lee muy
   distinta de una pantalla vacía con una frase. */
.nota-con-cara {
  display: flex; align-items: center; justify-content: center;
  gap: .7rem; text-align: left;
}
.nota-retrato {
  width: 3rem; height: 3rem; flex-shrink: 0;
  border-radius: var(--r-pill); background: var(--surface);
  box-shadow: var(--e-1); object-fit: cover; object-position: 50% 10%;
}

/* Panel del docente (méritos) */
#pin-form { display: flex; gap: .5rem; }
#pin-input {
  flex: 1; max-width: 150px; padding: .55rem .8rem; font-size: var(--t-base);
  font-family: var(--font-text); min-height: var(--tap);
  border-radius: var(--r-md); border: 2px solid rgba(122, 74, 33, .28);
  background: var(--paper); color: var(--ink); text-align: center;
}
.award-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: .5rem; margin-bottom: var(--s-4); }
.award-btn {
  display: flex; flex-direction: column; align-items: center; gap: .25rem;
  background: var(--surface); border: none;
  border-radius: var(--r-lg); padding: .8rem .5rem; box-shadow: var(--e-1);
  border-top: 3px solid var(--jungle-light);
  font-family: var(--font-text); color: var(--ink);
  text-align: center; transition: transform .12s ease, box-shadow .12s ease;
}
.award-btn:not(:disabled):hover { transform: translateY(-2px); box-shadow: var(--e-2); }
.award-btn:not(:disabled):active { transform: translateY(0); }
.award-btn.award-full { border-top-color: rgba(107, 86, 56, .3); background: var(--paper-deep); }
.award-icon { font-size: 1.6rem; line-height: 1; }
.award-icon .icono-dibujo { width: 2.4rem; height: 2.4rem; }
.award-name { font-size: var(--t-sm); font-weight: 800; line-height: 1.25; }
.award-meta { font-size: var(--t-xs); color: var(--ink-soft); }

/* ══════════ EL CURSO POR TRIMESTRES ══════════ */
.course-label {
  font-size: var(--t-sm); color: var(--brass); font-weight: 700;
  text-transform: uppercase; letter-spacing: .05em; margin-bottom: var(--s-3);
}
.tri-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: .7rem; margin-bottom: var(--s-4); }
.tri-card {
  background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--e-1);
  padding: .9rem 1rem; border-top: 3px solid rgba(122, 74, 33, .2); border-right: var(--line);
  border-bottom: var(--line); border-left: var(--line);
}
.tri-card.tri-current { border-top-color: var(--gold); box-shadow: var(--e-2); }
/* El rótulo de estado iba en la misma línea que el título y se partía en dos
   sobre el nombre del trimestre; ahora va encima, como etiqueta. */
.tri-head { display: flex; flex-direction: column-reverse; gap: .1rem; }
.tri-head strong { color: var(--leather-dark); font-family: var(--font-display); font-size: var(--t-md); font-weight: 400; }
.tri-state {
  font-size: var(--t-xs); color: var(--ink-faint);
  text-transform: uppercase; letter-spacing: .06em; font-weight: 700;
}
.tri-card.tri-current .tri-state { color: var(--brass); }
.tri-dates { font-size: var(--t-xs); color: var(--ink-soft); margin: .3rem 0 .6rem; }
.tri-stats {
  display: grid; grid-template-columns: 1fr 1fr; gap: .25rem .7rem;
  font-size: var(--t-sm); padding-top: .5rem; border-top: var(--line);
}
.tri-stats strong { color: var(--ink); font-variant-numeric: tabular-nums; }

/* Aviso: configurado para la nube pero sin poder alcanzarla */
.cloud-warning {
  position: relative; z-index: 40;
  background: var(--brass-tint); border-bottom: 2px solid var(--danger);
  color: #7d2d1c; padding: .75rem 1rem; font-size: var(--t-sm); text-align: center;
}
/* No poder guardar es peor que no tener nube: sin nube el diario al menos
   está en la tablet, y sin poder escribir no está en ninguna parte. */
.cloud-warning-grave {
  background: #fbe3dd; border-bottom-width: 3px; font-weight: 600;
}

/* ══════════ CUADRILLA ══════════ */
.team-banner {
  display: flex; gap: 1rem; align-items: center;
  background-color: var(--leather-dark);
  background-image: linear-gradient(135deg, #6d421d, var(--leather-dark)); color: #f7ead2;
  border-radius: var(--r-xl); box-shadow: var(--e-2);
  padding: 1.1rem 1.3rem; margin-bottom: var(--s-5);
}
.team-icon {
  font-size: 2.2rem; line-height: 1;
  width: 3.6rem; height: 3.6rem; flex-shrink: 0;
  display: grid; place-items: center;
  background: rgba(255,255,255,.12); border-radius: var(--r-lg);
  border: 1px solid rgba(240, 195, 60, .3);
  overflow: hidden;
}
/* El emblema dibujado llena el medallón; el emoji se queda como estaba. Un
   pelo de relleno para que el animal no toque el filete de latón. */
.team-icon .icono-dibujo { width: 100%; height: 100%; padding: .18rem; }

/* El mismo emblema, en pequeño, en los sitios donde solo acompaña al nombre. */
.icono-cuadrilla { width: 1.35em; height: 1.35em; vertical-align: -.3em; }
.aula-grupo-icono .icono-dibujo,
.amg-icono .icono-dibujo,
.team-other-icon .icono-dibujo {
  width: 1.5em; height: 1.5em; display: inline-block; vertical-align: -.35em;
}
.team-banner h3 { margin: 0; color: #fff6e2; }
.team-banner h3::after { display: none; }
.team-banner p { font-size: var(--t-sm); color: rgba(247, 234, 210, .82); }
.team-goal {
  background: var(--surface); border-left: 4px solid var(--jungle);
  border-radius: var(--r-lg); padding: var(--s-5); box-shadow: var(--e-1);
}
.team-goal > strong { color: var(--leather-dark); font-size: var(--t-md); }
.team-goal-note { font-size: var(--t-sm); color: var(--ink-soft); margin: .35rem 0 .7rem; }
.team-goal-nums { display: flex; justify-content: space-between; gap: .6rem; font-size: var(--t-sm); margin-top: .45rem; flex-wrap: wrap; }
.team-goal-nums strong { font-variant-numeric: tabular-nums; }
.team-members { display: flex; flex-wrap: wrap; gap: .4rem; }
.team-member {
  display: inline-flex; align-items: center; gap: .45rem;
  background: var(--surface); border: var(--line);
  border-radius: var(--r-pill); padding: .4rem .9rem; font-size: var(--t-sm);
  box-shadow: var(--e-1);
}
.team-member.team-me { border-color: var(--brass); background: var(--brass-tint); font-weight: 800; }
.team-member-quien { display: flex; flex-direction: column; line-height: 1.2; }
.team-member-quien small { font-weight: 600; font-size: var(--t-xs); color: var(--ink-soft); }

/* El rol propio del explorador: lo primero que quiere ver al abrir Cuadrilla */
.team-rol-mio {
  display: flex; align-items: center; gap: var(--s-4); flex-wrap: wrap;
  background: var(--surface); border: var(--line); border-left: 4px solid var(--brass);
  border-radius: var(--r-lg); padding: var(--s-4) var(--s-5);
  box-shadow: var(--e-1); margin-bottom: var(--s-4);
}
.team-rol-mio h3 { margin: .1rem 0; }
.team-rol-eti {
  font-size: var(--t-xs); text-transform: uppercase; letter-spacing: .06em;
  color: var(--ink-soft); font-weight: 800;
}
.team-rol-que { font-size: var(--t-sm); font-weight: 700; color: var(--leather-dark); margin: 0; }
.team-rol-desc { font-size: var(--t-sm); color: var(--ink-soft); margin: .25rem 0 0; }

/* Avatar de un rol: emoji mientras no haya ilustración, <img> en cuanto la haya */
.rol-emoji { font-size: 1.5rem; line-height: 1; }

/* El retrato dentro de un medallón que ya tiene tamaño: lo llena entero. Y el
   gorro comprado se queda de chapa en la esquina, que un premio que deja de
   verse deja de ser un premio. */
.rol-medallon.rol-img { width: 100%; height: 100%; }
.rol-medallon.rol-emoji { font-size: inherit; }
.avatar-gorro {
  position: absolute; right: -3px; bottom: -3px;
  font-size: .5em; line-height: 1;
  background: var(--surface); border-radius: 50%;
  padding: .1em; box-shadow: var(--e-1);
}
/* La chapa cuando es un dibujo y no un emoji. Va en `em` para que siga al
   tamaño del retrato que tenga debajo —el del HUD es pequeño y el de la
   Cuadrilla grande—, y con un filete de papel alrededor para despegarla de la
   cara sobre la que se apoya. */
.avatar-gorro-img {
  width: .82em; height: .82em;
  padding: .06em; object-fit: contain;
  border: 1px solid var(--brass-tint);
  box-shadow: 0 1px 3px rgba(51, 36, 15, .28);
}
/* Un retrato aguanta —y pide— más tamaño que un emoji: es un dibujo con cara,
   y a 2 rem deja de reconocerse quién es. */
.rol-img { width: 2.5rem; height: 2.5rem; border-radius: 50%; object-fit: cover; }
.rol-emoji.rol-grande { font-size: 3rem; }
.rol-img.rol-grande {
  width: 5.5rem; height: 5.5rem;
  box-shadow: 0 0 0 3px var(--brass-tint), var(--e-1);
}
.aula-card-avatar .rol-img { width: 3.4rem; height: 3.4rem; }

/* Reparto de roles en el panel del docente */
.cfg-rol-fila {
  display: grid; grid-template-columns: auto minmax(6rem, 1fr) minmax(10rem, 1.4fr);
  align-items: center; gap: .5rem .7rem;
  padding: .45rem 0; border-bottom: var(--line);
}
.cfg-rol-fila:last-child { border-bottom: 0; }
.cfg-rol-icono { font-size: 1.4rem; line-height: 1; }
.cfg-rol-quien { font-weight: 700; font-size: var(--t-sm); }
.cfg-rol-fila .cfg-rol-desc { grid-column: 2 / -1; margin: 0; }
@media (max-width: 30rem) {
  .cfg-rol-fila { grid-template-columns: auto 1fr; }
  .cfg-rol-fila .cfg-t-rol { grid-column: 1 / -1; }
}
.team-others { display: grid; gap: .4rem; grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); }
.team-other {
  background: var(--surface); border-radius: var(--r-md); padding: .6rem .85rem;
  box-shadow: var(--e-1); border: var(--line); font-size: var(--t-sm);
}
.team-other small { color: var(--ink-soft); margin-left: .4rem; }

/* ══════════ PANEL DE CONFIGURACIÓN ══════════ */
#screen-config, #screen-class { max-width: var(--w-wide); }
.cfg-top-note { font-size: var(--t-sm); color: var(--ink-soft); margin-bottom: var(--s-4); }

/* Navegación del panel: columna lateral cuando hay sitio.
   Con once secciones, una tira de pestañas obligaba a desplazarse en
   horizontal para descubrir que existían: la mitad quedaban escondidas. */
.cfg-shell { display: grid; gap: var(--s-5); align-items: start; }
@media (min-width: 62rem) {
  .cfg-shell { grid-template-columns: 15.5rem 1fr; }
  .cfg-nav { position: sticky; top: 4.5rem; }
}
.cfg-nav {
  display: flex; flex-direction: column; gap: .15rem;
  background: var(--surface); border-radius: var(--r-lg);
  padding: .45rem; box-shadow: var(--e-1); border: var(--line);
}
/* Títulos de los dos grupos: «El día a día» y «Preparar la expedición».
   En pantalla estrecha son el botón que los pliega; en ancha, una etiqueta. */
.cfg-nav-grupo {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  width: 100%; background: transparent; border: none; text-align: left;
  font-family: var(--font-text);
  font-size: var(--t-xs); font-weight: 800; letter-spacing: .04em;
  text-transform: uppercase; color: var(--ink-faint);
  padding: .55rem .7rem .25rem; margin: 0;
}
.cfg-nav-grupo:first-child { padding-top: .2rem; }
.cfg-nav-chevron { font-size: .9rem; }
.cfg-nav-grupo-body { display: flex; flex-direction: column; gap: .15rem; }
.cfg-nav-grupo-body.cerrado { display: none; }

.cfg-nav-grupo:hover { color: var(--ink); }

/* «Esto no lo ve nadie todavía». Va con el mismo tono que el resto de avisos
   del panel, no en rojo: no es un error, es algo a medio preparar. */
/* Las fichas de curso del currículo: la que se edita va marcada, y las que
   ya tienen texto llevan un punto. De un vistazo se ve qué falta por pegar. */
.curr-chip { position: relative; cursor: pointer; }
.curr-chip.curr-lleno::after {
  content: ''; position: absolute; top: 4px; right: 4px;
  width: 7px; height: 7px; border-radius: 50%; background: var(--jungle);
}
.curr-chip.on.curr-lleno::after { background: var(--gold); }

/* La barra de acciones en bloque de la cola de revisión. */
/* El botón de borrar una clase. Va aparte del de abrirla, apagado, y solo
   toma color al acercarse: no puede competir por la mirada con la acción
   normal, que es entrar. */
/* ── El banco de iconos ── */
.cfg-icono-btn {
  flex: 0 0 auto; min-width: 44px; min-height: 44px;
  background: var(--surface-sunken); border: var(--line); border-radius: var(--r-md);
  font-size: 1.1rem; cursor: pointer;
}
.cfg-icono-btn:hover { background: var(--paper-deep); }
.cfg-icono-panel {
  flex: 1 0 100%; margin-top: .5rem;
  background: var(--surface); border: var(--line); border-radius: var(--r-md);
  padding: .7rem; box-shadow: var(--e-2);
  max-height: 20rem; overflow-y: auto;
}
.cfg-icono-grupo + .cfg-icono-grupo { margin-top: .7rem; }
.cfg-icono-titulo {
  margin: 0 0 .35rem; font-size: var(--t-xs); font-weight: 800;
  letter-spacing: .04em; text-transform: uppercase; color: var(--ink-faint);
}
.cfg-icono-rejilla {
  display: grid; gap: .25rem;
  grid-template-columns: repeat(auto-fill, minmax(44px, 1fr));
}
.cfg-icono-uno {
  min-width: 44px; min-height: 44px; font-size: 1.4rem;
  background: transparent; border: 1px solid transparent; border-radius: var(--r-md);
  cursor: pointer;
}
.cfg-icono-uno:hover { background: var(--paper-deep); }
.cfg-icono-uno.on { border-color: var(--brass); background: var(--brass-tint); }

.aula-card-borrar {
  flex: 0 0 auto; width: 44px; height: 44px;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: none; border-radius: var(--r-md);
  font-size: 1.15rem; opacity: .5; cursor: pointer;
  transition: opacity .15s ease, background-color .15s ease;
}
.aula-card-borrar:hover, .aula-card-borrar:focus-visible {
  opacity: 1; background: var(--danger-tint);
}

.ia-bloque { align-items: center; gap: .6rem; flex-wrap: wrap; margin-bottom: .6rem; }
.ia-marca { display: inline-flex; align-items: center; }
.ia-marca input { width: 20px; height: 20px; accent-color: var(--jungle); margin-right: .4rem; }
.taller-revision.ia-marcado { border-left: 4px solid var(--jungle); background: var(--jungle-tint); }
/* «Va a: pozo / estrato» */
.ia-mover { align-items: center; gap: .5rem; flex-wrap: wrap; }
.ia-mover select { min-height: 44px; }

.cfg-invisible {
  background: var(--brass-tint); border-left: 4px solid var(--brass);
  border-radius: var(--r-md); padding: .6rem .8rem; margin: .5rem 0 0;
  font-size: var(--t-sm); line-height: 1.5; color: var(--ink);
}

/* La línea de estado de los ajustes, cuando hay algo sin subir. */
.cfg-top-warn {
  background: var(--brass-tint); border-left: 4px solid var(--brass);
  border-radius: var(--r-md); padding: .7rem .9rem; color: var(--ink);
}

/* En pantalla estrecha las secciones BAJAN, no se van a la derecha.

   Antes era una tira con scroll horizontal, y medida daba 1 sección visible
   de 13 en un móvil: las otras doce estaban detrás de un gesto que no se ve
   que existe. Ocupar tres dedos más de alto y que estén todas es mejor
   trato que ahorrar sitio escondiendo el panel entero. */
@media (max-width: 61.99rem) {
  .cfg-nav { flex-direction: row; flex-wrap: wrap; gap: .3rem; }
  .cfg-nav-grupo { flex: 1 0 100%; min-height: 44px; }
  .cfg-nav-grupo-body { flex: 1 0 100%; flex-direction: row; flex-wrap: wrap; gap: .3rem; }
  .cfg-nav-btn { flex: 0 1 auto; }
}
.cfg-nav-btn {
  display: flex; align-items: center; gap: .55rem; text-align: left;
  background: transparent; border: none;
  border-radius: var(--r-md); padding: .55rem .7rem;
  font-family: var(--font-text);
  font-size: var(--t-sm); font-weight: 700; color: var(--ink-soft);
  transition: color .15s ease, background-color .15s ease;
}
.cfg-nav-btn:hover { background: rgba(122, 74, 33, .08); color: var(--ink); }
.cfg-nav-btn.active { color: #fff6e2; background: var(--leather-dark); }
.cfg-nav-btn span { font-size: 1.05rem; flex-shrink: 0; }

.cfg-body { display: flex; flex-direction: column; gap: var(--s-3); }
.cfg-intro {
  font-size: var(--t-sm); color: var(--ink-soft); background: var(--paper-deep);
  border-radius: var(--r-md); padding: .8rem 1rem; border-left: 4px solid rgba(122, 74, 33, .3);
  max-width: var(--w-content);
}
.cfg-h4 {
  color: var(--leather-dark); font-size: var(--t-md);
  margin-top: var(--s-4); padding-bottom: .3rem; border-bottom: var(--line);
}
.cfg-field { display: flex; flex-direction: column; gap: .3rem; }
.cfg-label { font-size: var(--t-sm); font-weight: 700; color: var(--ink); }
.cfg-hint { font-size: var(--t-xs); color: var(--ink-soft); line-height: 1.45; }
.cfg-warn {
  font-size: var(--t-sm); color: #7d2d1c; background: var(--danger-tint);
  border-left: 4px solid var(--danger); border-radius: var(--r-md); padding: .6rem .8rem;
}

/* ── Salud de la clase ──
   Dos colores y nada más. El rojo es «se está perdiendo trabajo ahora» y el
   latón «va a doler pronto»; con cinco tonos el docente tendría que aprenderse
   una leyenda para leer un aviso. */
.salud-veredicto {
  font-size: var(--t-sm); border-radius: var(--r-md); padding: .7rem .9rem;
  margin: 0 0 var(--s-4); border-left: 4px solid var(--brass);
  background: var(--paper-deep); color: var(--leather-dark);
}
.salud-veredicto.salud-grave { background: var(--danger-tint); border-left-color: var(--danger); color: #7d2d1c; }
.salud-veredicto.salud-bien { background: var(--jungle-tint); border-left-color: var(--jungle); color: #2c4f25; }

.salud-item {
  border-left: 4px solid var(--brass); background: var(--surface);
  border-radius: var(--r-md); padding: .7rem .9rem; margin: 0 0 var(--s-3);
}
.salud-item.salud-grave { border-left-color: var(--danger); background: var(--danger-tint); }
.salud-titulo { margin: 0 0 .3rem; font-weight: 600; color: var(--leather-dark); }
.salud-detalle { margin: 0 0 .35rem; font-size: var(--t-sm); line-height: 1.5; }
/* Lo que hay que hacer se lee aunque el docente solo mire una línea. */
.salud-accion { margin: 0; font-size: var(--t-sm); line-height: 1.5; color: var(--leather); }

.cfg-body input[type="text"], .cfg-body input[type="number"],
.cfg-body input[type="date"], .cfg-body input[type="password"],
.cfg-body select, .cfg-body textarea {
  padding: .55rem .75rem; font-size: var(--t-sm); font-family: var(--font-text);
  border: 1.5px solid rgba(122, 74, 33, .28); border-radius: var(--r-sm);
  background: var(--surface); color: var(--ink); width: 100%;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.cfg-body input:focus, .cfg-body select:focus, .cfg-body textarea:focus {
  border-color: var(--brass); outline: none;
  box-shadow: 0 0 0 3px rgba(138, 90, 11, .15);
}
.cfg-body textarea { resize: vertical; line-height: 1.5; }
.cfg-list { display: flex; flex-direction: column; gap: .5rem; }
.cfg-acciones { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: var(--s-3); }

/* El inspector del yacimiento: cerrado ocupa una línea, y esa línea ya dice
   cuántas cosas hay que mirar. */
.cfg-inspector {
  border: var(--line); border-left: 4px solid var(--brass);
  border-radius: var(--r-md); background: var(--surface);
  padding: .5rem .8rem; margin-top: var(--s-3); font-size: var(--t-sm);
}
.cfg-inspector summary { cursor: pointer; font-weight: 700; }
.cfg-inspector ul { margin: .5rem 0 0; padding-left: 1.1rem; }
.cfg-inspector li { margin-bottom: .35rem; line-height: 1.45; }

/* Lo que la asistente va a usar, dicho antes de gastar la llamada */
.cfg-nota-curriculo {
  border: var(--line); border-radius: var(--r-md); background: var(--surface);
  padding: .6rem .9rem; margin: var(--s-4) 0; font-size: var(--t-sm); line-height: 1.5;
}
.prop-contenido { margin: .35rem 0; }

/* El paso de «esto se falla» a «genero retos de esto» */
.repaso-fila .repaso-gen { margin-top: .5rem; }
.cfg-card {
  background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--e-1);
  border: var(--line);
  padding: .8rem .9rem; display: flex; flex-direction: column; gap: .5rem;
}
.cfg-row { display: flex; gap: .5rem; align-items: center; flex-wrap: wrap; }
.cfg-row label { display: flex; align-items: center; gap: .35rem; font-size: var(--t-xs); color: var(--ink-soft); flex: 1; min-width: 110px; }
.cfg-row label input[type="number"] { max-width: 84px; }
.cfg-row > input[type="text"] { flex: 1; min-width: 110px; }
.cfg-row > input.cfg-b-icon, .cfg-row > input.cfg-t-icon, .cfg-row > input.cfg-s-icon,
.cfg-row > input.cfg-si-icon, .cfg-row > input.cfg-f-icon {
  flex: 0 0 3.4rem; text-align: center; font-size: 1.2rem;
}
.cfg-big-icon { font-size: 1.6rem; }
.cfg-switch { display: flex; align-items: center; gap: .4rem; font-size: var(--t-xs); flex: 0 0 auto !important; }
.cfg-del {
  background: transparent; border: none; font-size: 1.05rem;
  padding: .3rem .45rem; border-radius: var(--r-sm); flex: 0 0 auto;
}
.cfg-del:hover { background: var(--danger-tint); }
.cfg-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: .7rem; }
.cfg-body .btn { align-self: flex-start; }
/* Un campo de nombre no necesita 900 px: a partir de cierto ancho el ojo
   pierde la relación entre la etiqueta y lo que está escribiendo. */
.cfg-field, .cfg-card > textarea, .cfg-row > input[type="text"] { max-width: 46rem; }

/* Casillas sí/no: junto a su etiqueta, con la pista debajo de ambas */
.cfg-field-inline {
  display: grid; grid-template-columns: 1fr auto; align-items: center; gap: .3rem .6rem;
}
.cfg-field-inline .cfg-hint { grid-column: 1 / -1; }
.cfg-field-inline input[type="checkbox"] { width: 28px; height: 28px; accent-color: var(--jungle); }

/* ══════════ DIÁLOGO PROPIO ══════════ */
.modal {
  position: fixed; inset: 0; z-index: 60;
  display: flex; align-items: center; justify-content: center; padding: 1rem;
  background: rgba(43, 29, 14, .55);
}
.modal.hidden { display: none; }
.modal-card {
  background: var(--card); border: 3px solid var(--brass); border-radius: 20px;
  box-shadow: 0 8px 30px rgba(0,0,0,.3); padding: 1.4rem;
  max-width: 420px; width: 100%; text-align: center;
  animation: slide-in .2s ease;
}
.modal-text { font-size: 1.05rem; font-weight: 600; margin-bottom: .9rem; }
.modal-input {
  width: 100%; padding: .8rem 1rem; font-size: 1.3rem; text-align: center;
  letter-spacing: .3em; font-family: inherit;
  border: 2px solid var(--brass); border-radius: var(--radius);
  background: var(--parchment); color: var(--ink); margin-bottom: .6rem;
}
.modal-actions { display: flex; gap: .6rem; justify-content: center; flex-wrap: wrap; }
.modal-actions .btn { flex: 1; min-width: 120px; }

/* ══════════ EDITOR DE YACIMIENTOS Y RETOS ══════════ */
.cfg-site.cfg-off { opacity: .6; }
.cfg-toggle {
  background: var(--parchment-dark); border: none; border-radius: 10px;
  padding: .4rem .7rem; font-size: .82rem; font-weight: 700; color: var(--leather);
  align-self: flex-start;
}
.cfg-sublist {
  display: flex; flex-direction: column; gap: .5rem;
  margin-top: .3rem; padding-left: .6rem; border-left: 3px solid var(--parchment-dark);
}
.cfg-branch {
  background: var(--parchment); border-radius: 12px; padding: .55rem;
  display: flex; flex-direction: column; gap: .4rem;
}
.cfg-tag {
  font-size: .72rem; color: var(--ink-soft); background: var(--parchment-dark);
  border-radius: 999px; padding: .2rem .6rem; white-space: nowrap;
}
.cfg-tag-warn { background: #f4e3c8; color: #7d2d1c; }

.cfg-bank-title { margin: .2rem 0 .5rem; }
.cfg-strata-tabs { display: flex; flex-wrap: wrap; gap: .35rem; }
.cfg-strat-tab {
  background: var(--card); border: 2px solid var(--parchment-dark); border-radius: var(--radius);
  padding: .4rem .7rem; font-size: .8rem; font-weight: 700; color: var(--ink-soft);
  display: flex; align-items: center; gap: .35rem;
}
.cfg-strat-tab.active { background: var(--leather-dark); color: var(--gold); border-color: var(--leather-dark); }
.cfg-count {
  background: rgba(0,0,0,.12); border-radius: 999px; padding: 0 .4rem;
  font-size: .72rem; font-variant-numeric: tabular-nums;
}
.cfg-strat-tab.active .cfg-count { background: rgba(255,255,255,.2); }

.cfg-q { border-left: 4px solid var(--brass); }
.cfg-q-head { justify-content: space-between; }
.cfg-q-num {
  background: var(--brass); color: #fff; border-radius: 999px;
  width: 1.6rem; height: 1.6rem; display: grid; place-items: center;
  font-size: .8rem; font-weight: 700;
}
/* «(solo si te lo pide)» dentro de una etiqueta: se lee como aclaración,
   no como parte del nombre del campo. */
.cfg-opt { font-weight: 400; color: var(--ink-faint); font-size: var(--t-xs); }
.cfg-opt-row { gap: .5rem; }
.cfg-opt-row input[type="radio"] { width: 20px; height: 20px; flex: 0 0 auto; accent-color: var(--jungle); }
.cfg-opt-row .cfg-q-opt { flex: 1; }
.cfg-body code {
  background: var(--parchment-dark); border-radius: 5px; padding: .05rem .3rem;
  font-size: .82em; word-break: break-word;
}

/* ══════════ VISTA GENERAL DE LA CLASE ══════════ */
.class-status { margin-bottom: var(--s-4); }
.class-loading { color: var(--ink-soft); }
.class-meta { font-size: var(--t-sm); color: var(--ink-soft); }
.class-note, .class-warn {
  background: var(--brass-tint); border-left: 4px solid var(--brass);
  border-radius: var(--r-md);
  padding: .85rem 1rem; font-size: var(--t-sm); line-height: 1.55;
}
.class-warn { margin-top: var(--s-4); border-left-color: var(--danger); background: var(--danger-tint); color: #7d2d1c; }
.class-error {
  background: var(--surface); border-left: 4px solid var(--danger); border-radius: var(--r-lg);
  padding: var(--s-5); box-shadow: var(--e-1); max-width: var(--w-content);
}
.class-error h3 { margin: 0 0 .5rem; color: var(--danger); }
.class-error h3::after { display: none; }
.class-error p, .class-error li { font-size: var(--t-sm); margin-bottom: .4rem; }
.class-error ol { margin: .5rem 0 .5rem 1.2rem; }
.class-alert {
  background: var(--danger-tint); border-left: 4px solid var(--danger); border-radius: var(--r-md);
  padding: .85rem 1rem; margin: var(--s-4) 0; font-size: var(--t-sm);
}

/* Barra de herramientas: el desplegable llenaba toda la fila y parecía un
   campo de texto gigante. */
.class-toolbar {
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  margin: var(--s-5) 0 var(--s-4);
}
.class-toolbar label { font-size: var(--t-sm); font-weight: 700; color: var(--ink-soft); }
.class-toolbar select {
  padding: .5rem .75rem; font-family: var(--font-text); font-size: var(--t-sm);
  min-height: var(--tap);
  border: 1.5px solid rgba(122, 74, 33, .28); border-radius: var(--r-sm);
  background: var(--surface); color: var(--ink);
  flex: 0 1 16rem; min-width: 12rem;
}
.class-toolbar .btn { margin-left: auto; }

/* Fichas de alumno en rejilla: con 25 en columna había que hacer scroll
   cuatro pantallas para ver la clase entera. */
.class-students {
  display: grid; gap: .6rem; margin-top: var(--s-4);
  grid-template-columns: repeat(auto-fill, minmax(23rem, 1fr));
  /* Sin esto, una ficha pendiente (corta) se estiraba hasta la altura de la
     ficha completa que tuviera al lado. */
  align-items: start;
}
.student-card {
  background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--e-1);
  border: var(--line);
  padding: .9rem 1rem; border-left: 4px solid var(--jungle-light);
  display: flex; flex-direction: column; gap: .5rem;
}
.student-card.student-alert { border-left-color: var(--danger); }
/* Pendientes: se ven, pero se distinguen de un vistazo de quien ya excava */
.student-card.student-pending {
  border-left-color: rgba(122, 74, 33, .3);
  border-style: dashed; background: transparent; box-shadow: none;
}
.student-pending .student-head strong { color: var(--ink-soft); }
.student-pending-tag {
  font-size: var(--t-xs); font-weight: 700; color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: .04em;
  background: var(--paper-deep); border-radius: var(--r-pill); padding: .1rem .6rem;
}
.student-head { display: flex; justify-content: space-between; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
.student-head strong { font-size: var(--t-md); font-weight: 800; }
.student-rank { font-size: var(--t-xs); color: var(--brass); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }
.student-bar-row { display: grid; grid-template-columns: 5.5rem 1fr auto; align-items: center; gap: .6rem; font-size: var(--t-xs); }
.student-bar-row > span:first-child { color: var(--ink-soft); }
.student-num { font-variant-numeric: tabular-nums; color: var(--ink-soft); font-size: var(--t-xs); white-space: nowrap; }
.student-stats {
  display: flex; flex-wrap: wrap; gap: .35rem .8rem;
  font-size: var(--t-xs); color: var(--ink-soft);
  padding-top: .5rem; border-top: var(--line);
}
.student-signals { display: flex; flex-wrap: wrap; gap: .3rem; }
.signal-chip {
  background: var(--danger-tint); color: #7d2d1c; border-radius: var(--r-pill);
  padding: .15rem .65rem; font-size: var(--t-xs); font-weight: 700;
}
.student-stuck, .student-seen { font-size: var(--t-xs); color: var(--ink-faint); }

.class-teams-list { display: grid; gap: .6rem; grid-template-columns: repeat(auto-fill, minmax(21rem, 1fr)); }
.class-team {
  background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--e-1);
  border: var(--line);
  padding: .85rem 1rem; margin-bottom: .5rem;
}
.class-team-head { display: flex; justify-content: space-between; gap: .5rem; margin-bottom: .45rem; flex-wrap: wrap; }
.class-team small { color: var(--ink-soft); font-size: var(--t-xs); }

/* Retos escritos por IA: la cita del currículo y lo que se ha tirado. */
.ia-criterio { font-style: italic; border-left: 3px solid var(--brass-light); padding-left: .6rem; }
.ia-tirado { border-left: 3px solid var(--danger); opacity: .85; }
.ia-tirado .taller-rev-q { text-decoration: line-through; opacity: .7; }

/* ══════════ PORTADA ══════════ */
#screen-home, #screen-teacher { min-height: 100vh; padding: var(--s-5) clamp(1rem, 4vw, 2rem) var(--s-7); }
.home-wrap { max-width: var(--w-content); margin: 0 auto; }

/* El encabezado es la primera impresión de la plataforma: se le da aire y
   un sello centrado sobre un halo, en vez de un emoji suelto. */
.home-hero { text-align: center; padding: var(--s-6) 0 var(--s-7); }
.home-crest {
  font-size: 3rem; line-height: 1;
  width: 5.5rem; height: 5.5rem; margin: 0 auto var(--s-4);
  display: grid; place-items: center;
  background-color: var(--brass-tint);
  background-image: radial-gradient(circle at 50% 40%, #fff9e9, var(--brass-tint));
  border-radius: var(--r-pill);
  box-shadow: var(--e-2), 0 0 0 1px rgba(138, 90, 11, .2);
}
.home-hero h1 {
  font-size: clamp(2.2rem, 7vw, 3.4rem); color: var(--leather-dark);
  margin: 0 0 .2rem;
}
.home-tagline {
  color: var(--brass); font-size: var(--t-md);
  text-transform: uppercase; letter-spacing: .22em; font-weight: 700;
}
.home-lead {
  max-width: 38rem; margin: var(--s-5) auto 0;
  font-size: var(--t-md); color: var(--ink-soft); line-height: 1.6;
}
.home-teacher-line { margin-top: var(--s-4); color: var(--brass); font-weight: 700; }
.home-hero-small { padding-bottom: var(--s-5); }

/* Las dos puertas de entrada: son la decisión principal de la portada, así
   que van más grandes que cualquier otra cosa y con el color de su rol. */
.home-doors { display: grid; grid-template-columns: 1fr; gap: .8rem; margin-bottom: var(--s-7); }
@media (min-width: 35rem) { .home-doors { grid-template-columns: 1fr 1fr; } }
.home-door {
  display: flex; flex-direction: column; align-items: center; gap: .3rem;
  background: var(--surface-raised); border: none;
  border-top: 4px solid var(--brass);
  border-radius: var(--r-xl);
  padding: var(--s-5) var(--s-4); box-shadow: var(--e-2); text-align: center;
  font-family: var(--font-text); color: var(--ink);
  transition: transform .14s ease, box-shadow .14s ease;
}
.home-door:hover { transform: translateY(-3px); box-shadow: var(--e-3); }
.home-door:active { transform: translateY(0); box-shadow: var(--e-2); }
.home-door strong { font-family: var(--font-display); font-weight: 400; font-size: var(--t-lg); color: var(--leather-dark); }
.home-door small { font-size: var(--t-sm); color: var(--ink-soft); }
.home-door-icon {
  font-size: 2rem; line-height: 1;
  width: 3.6rem; height: 3.6rem; margin-bottom: .3rem;
  display: grid; place-items: center;
  border-radius: var(--r-pill); background: var(--paper);
}
.home-door-student { border-top-color: var(--jungle); }
.home-door-student .home-door-icon { background: var(--jungle-tint); }
.home-door-teacher { border-top-color: var(--leather-dark); }

/* Bloques de contenido */
.home-block {
  background: var(--surface); border-radius: var(--r-xl); box-shadow: var(--e-1);
  border: var(--line);
  padding: clamp(1.1rem, 3vw, 1.8rem); margin-bottom: var(--s-4);
}
.home-block h2 { font-size: var(--t-xl); color: var(--leather-dark); margin-bottom: var(--s-4); }
/* La entradilla de un bloque, que no es la de la cabecera: esta va alineada a
   la izquierda con el resto del bloque y no centrada como la del héroe. */
.home-block-lead {
  margin: calc(var(--s-4) * -1 + .2rem) 0 var(--s-4);
  font-size: var(--t-sm); color: var(--ink-soft); line-height: 1.55;
}
.home-dialog { margin: 0 0 var(--s-4); }
.home-rule {
  background: var(--jungle-tint); border-left: 4px solid var(--jungle); border-radius: var(--r-md);
  padding: .9rem 1rem; font-size: var(--t-base);
}

/* Cómo se juega */
.home-steps { list-style: none; display: flex; flex-direction: column; gap: .9rem; }
.home-steps li { display: flex; gap: .9rem; align-items: flex-start; font-size: var(--t-base); }
.home-step-n {
  flex: 0 0 2rem; height: 2rem; border-radius: var(--r-pill);
  background: var(--brass); color: #fff;
  font-family: var(--font-display); font-size: var(--t-base);
  display: grid; place-items: center;
}

/* Elenco */
.home-cast { display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); gap: .7rem; }
.cast-card {
  background: var(--paper); border-radius: var(--r-lg); padding: 1rem .9rem;
  text-align: center; border: var(--line);
  display: flex; flex-direction: column; gap: .3rem;
}
.cast-card.cast-villain { border-color: rgba(168, 58, 37, .35); background: var(--danger-tint); }
.cast-face {
  font-size: 1.9rem; line-height: 1;
  width: 3.2rem; height: 3.2rem; margin: 0 auto .2rem;
  display: grid; place-items: center;
  background: var(--surface); border-radius: var(--r-pill); box-shadow: var(--e-1);
}
/* Con dibujo, el círculo de la portada lo llena el retrato. Vera Kovak sigue
   con su emoji porque todavía no tiene ilustración, y se ve perfectamente: es
   el mismo respaldo que usan los roles y los yacimientos. */
img.cast-face { padding: 0; overflow: hidden; }
.cast-card strong { color: var(--leather-dark); font-size: var(--t-sm); font-weight: 800; }
.cast-card small { font-size: var(--t-xs); color: var(--ink-soft); line-height: 1.45; }

/* ── Los papeles de la cuadrilla ──
   Misma tarjeta que el elenco, a propósito: para un niño, su encargo dentro
   del grupo es tan parte del reparto como Kira o Tobías. */
.cast-rol {
  font-size: var(--t-xs); color: var(--brass); font-weight: 800;
  text-transform: uppercase; letter-spacing: .05em; line-height: 1.35;
}
/* Los retratos de rol son de medio cuerpo: encuadrados por el centro se veía
   la cazadora y no la cara. Se sube el encuadre y se llena el círculo. */
/* Seis tarjetas y no cuatro: con la medida del elenco salían cuatro y dos, y
   la fila coja dejaba medio bloque en blanco. A 13 rem caben tres y tres. */
.home-roles { grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); }
/* Y el retrato más grande que el del elenco. No es capricho: los del elenco
   son primeros planos y estos son de medio cuerpo, así que a 3,2 rem la cara
   —que es lo que un niño busca— quedaba del tamaño de una uña. */
/* `contain` y no `cover`: el círculo recortaba justo lo que identifica a cada
   uno —el ala del sombrero de Leo, la mochila de Nico— y al niño le llegaba
   media cara sin sus cosas. Cabiendo entero se pierde algo de tamaño y se
   gana el personaje. */
img.cast-face.rol-face {
  width: 4.6rem; height: 4.6rem;
  object-fit: contain; object-position: 50% 50%;
}
/* El Intendente no es de una cuadrilla, es de la clase entera. Se marca en
   dorado, que aquí es el color de lo que se gana, y no en rojo, que es el de
   Vera. */
.cast-card.cast-encargo {
  border-color: rgba(138, 90, 11, .4); background: var(--brass-tint);
}
.cast-encargo-nota {
  font-size: var(--t-xs); font-weight: 800; color: var(--leather-dark);
  background: var(--surface); border-radius: var(--r-sm);
  padding: .1rem .4rem; margin-top: .15rem; align-self: center;
}

/* Yacimientos */
img.home-site-icon.home-site-img {
  width: 4.4rem; height: 3.4rem; padding: 0;
  background: none; box-shadow: none; border-radius: 0;
  object-fit: contain; object-position: 50% 100%;
}
.home-sites { display: grid; gap: .7rem; grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); }
.home-site {
  display: flex; gap: .9rem; align-items: flex-start;
  background: var(--paper); border-radius: var(--r-lg); padding: 1rem;
  border: var(--line);
}
.home-site-icon {
  font-size: 1.6rem; line-height: 1;
  width: 2.9rem; height: 2.9rem; flex-shrink: 0;
  display: grid; place-items: center;
  background: var(--surface); border-radius: var(--r-md); box-shadow: var(--e-1);
}
.home-site strong { display: block; color: var(--leather-dark); font-size: var(--t-md); font-weight: 800; }
.home-site small { font-size: var(--t-sm); color: var(--ink-soft); }
.home-site-wells { display: flex; flex-wrap: wrap; gap: .3rem; margin-top: .5rem; }
.home-well {
  background: var(--surface); border-radius: var(--r-pill); padding: .2rem .7rem;
  font-size: var(--t-xs); color: var(--ink-soft); box-shadow: 0 0 0 1px rgba(138, 90, 11, .25);
}

/* Bloque para adultos */
.home-adults { border-left: 4px solid var(--leather-dark); }
.home-adults p { font-size: var(--t-base); margin-bottom: var(--s-4); max-width: 46rem; }
.home-facts { list-style: none; display: grid; gap: .6rem; grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); }
.home-facts li {
  font-size: var(--t-sm); color: var(--ink-soft); line-height: 1.55;
  padding-left: 1.1rem; position: relative;
}
.home-facts li::before {
  content: ''; position: absolute; left: 0; top: .55em;
  width: 5px; height: 5px; border-radius: 50%; background: var(--brass);
}
.home-facts strong { color: var(--ink); }

.home-note { font-size: var(--t-sm); color: var(--ink-soft); text-align: center; margin: var(--s-3) 0 var(--s-5); }
/* Una nota que cae al final de la página, donde el pergamino se acaba y
   empieza la duna oscura del horizonte. Es el mismo problema del pie de la
   portada y se arregla igual: papel debajo. Va como clase aparte porque
   `.home-note` también se usa arriba, sobre papel, donde no hace falta. */
.nota-en-duna {
  background: rgba(255, 253, 247, .88);
  border: var(--line); border-radius: var(--r-lg);
  padding: var(--s-3) var(--s-4);
  max-width: 46rem; margin-left: auto; margin-right: auto;
}
/* Pie de la portada: cierra la página en vez de dejarla cortada.
   El panel es lo que hace falta para leerlo. A esa altura de la página el
   fondo ya es la duna oscura y la pirámide del horizonte, y el pie iba en
   tinta clara, en versalitas y al tamaño más pequeño de la casa: cuatro
   cosas que restan contraste a la vez. Ahora se apoya en papel, como
   cualquier otra tarjeta de la portada. */
.home-pie {
  margin-top: var(--s-6);
  padding: var(--s-5) var(--s-4) var(--s-4);
  background: rgba(255, 253, 247, .88);
  border: var(--line);
  border-radius: var(--r-lg);
}
.home-foot {
  text-align: center;
  font-size: var(--t-sm); color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: .08em;
}
/* La autoría, justo debajo del pie. Sin versalitas ni espaciado de rótulo:
   ahí abajo hay un nombre de persona y un nombre se lee, no se decora. */
.home-autor {
  text-align: center; margin-top: var(--s-3); padding-top: var(--s-3);
  border-top: var(--line);
  font-size: var(--t-sm); color: var(--ink-soft); line-height: 1.6;
}
.home-autor strong { color: var(--ink); }

#teacher-exit { display: block; margin: 0 auto; }

/* Modo docente: sin HUD de alumno ni pestañas de juego */
body.teacher-mode #hud,
body.teacher-mode #tabbar { display: none !important; }
body.teacher-mode #main { padding-bottom: 2rem; }

/* ══════════ ALUMNADO Y FIRMA DEL DOCENTE ══════════ */
.home-teacher-line {
  margin-top: .7rem; font-size: .9rem; color: var(--ink-soft);
  background: var(--card); border-radius: 999px; padding: .35rem 1rem;
  display: inline-block; border: 1.5px solid var(--parchment-dark);
}
.cfg-student { border-left: 4px solid var(--jungle-light); }
.cfg-tag-ok { background: #dcedc8; color: #2f5c2b; }
.cfg-row-actions { margin-top: .2rem; }
.ros-log {
  background: var(--parchment); border-radius: 12px; padding: .7rem .9rem;
  font-size: .84rem; margin-top: .5rem; display: flex; flex-direction: column; gap: .2rem;
  max-height: 260px; overflow-y: auto;
}
.ros-log-sum { margin-top: .4rem; font-weight: 700; color: var(--leather); }
#ros-sheet { font-family: ui-monospace, "Cascadia Mono", Menlo, monospace; font-size: .82rem; }

/* Asignar cuadrillas marcando de la lista */
.team-picker {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: .3rem; background: var(--parchment); border-radius: 12px; padding: .6rem;
  max-height: 220px; overflow-y: auto;
}
.team-pick {
  display: flex; align-items: center; gap: .4rem; font-size: .85rem;
  padding: .25rem .35rem; border-radius: 8px;
}
.team-pick input { width: 18px; height: 18px; accent-color: var(--jungle); flex: 0 0 auto; }
.team-pick-taken { opacity: .5; font-style: italic; }

/* ══════════ CURSO Y TAMAÑO DE LETRA ══════════ */
.onb-label { font-size: .9rem; font-weight: 700; color: var(--leather); margin-top: .3rem; }
/* ── Elegir cara ──
   Ocho botones redondos. El elegido se marca con el aro de latón y un poco de
   tamaño, que es como se marca todo lo demás en esta app. */
.cara-picker {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: .5rem;
  margin-bottom: var(--s-4);
}
.cara-btn {
  padding: 0; border: 0; background: var(--surface-sunken); cursor: pointer;
  border-radius: var(--r-pill); aspect-ratio: 1; overflow: hidden;
  box-shadow: inset 0 0 0 2px transparent;
  transition: box-shadow .16s ease, transform .16s ease;
}
.cara-btn img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 12%; display: block; }
.cara-btn:hover { transform: translateY(-2px); }
.cara-btn.active {
  box-shadow: inset 0 0 0 3px var(--brass), var(--e-2);
  transform: translateY(-2px);
}
.cara-btn:focus-visible { outline: 3px solid var(--brass); outline-offset: 2px; }
/* En el campamento el elector nace plegado y lo abre el propio avatar. */
.camp-caras { margin-top: var(--s-3); }
.camp-caras .cara-picker { grid-template-columns: repeat(8, 1fr); margin-bottom: 0; }
@media (max-width: 34rem) { .camp-caras .cara-picker { grid-template-columns: repeat(4, 1fr); } }
/* El avatar del campamento es ahora un botón: que se note que se puede tocar. */
button.camp-avatar { border: 0; cursor: pointer; padding: 0; }
button.camp-avatar:focus-visible { outline: 3px solid var(--brass); outline-offset: 3px; }
/* La cara elegida llena su hueco redondo, sea el del campamento o el del HUD. */
.cara-explorador {
  width: 100%; height: 100%; object-fit: cover; object-position: 50% 12%;
  border-radius: var(--r-pill); display: block;
}

.grade-picker { display: grid; grid-template-columns: repeat(3, 1fr); gap: .4rem; }
.grade-btn {
  display: flex; flex-direction: column; align-items: center; gap: .1rem;
  background: var(--parchment); border: 2px solid var(--parchment-dark);
  border-radius: 14px; padding: .55rem .3rem; color: var(--ink-soft);
  transition: transform .12s ease;
}
.grade-btn strong { font-size: 1.1rem; color: var(--ink); }
.grade-btn small { font-size: .68rem; line-height: 1.1; }
.grade-btn.active {
  background: var(--jungle); border-color: var(--jungle); color: #e8f0e2;
}
.grade-btn.active strong { color: #fff; }
.grade-btn:active { transform: scale(.96); }
.camp-prefs { margin-top: 1rem; background: var(--card); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: .7rem .9rem; }

/* Letra grande: para 1.º y 2.º, donde la lectura aún se construye */
/* ── Letra grande (1.º y 2.º, o a petición) ──
   Antes esto era solo `font-size` en el body, y no servía de casi nada: TODA
   la escala tipográfica va en `rem`, que se resuelve contra la raíz y no
   contra el body. Medido: con el ajuste puesto, la etiqueta de las pestañas
   seguía en 12,5 px, igual que sin él. Justo la letra más pequeña —la que
   necesita el niño de seis años— era la que no crecía.

   Se escala la ESCALA, que es lo que usa todo lo demás. El paso más pequeño
   queda por encima de 14 px, que es el suelo para leer en una tablet. */
body.large-text {
  --t-xs:   0.95rem;
  --t-sm:   1.05rem;
  --t-base: 1.18rem;
  --t-md:   1.30rem;
  --t-lg:   1.50rem;
  --t-xl:   1.85rem;
  --t-2xl:  2.30rem;
  --t-3xl:  3.05rem;
  font-size: 1.18rem;
}
body.large-text .question-text { font-size: 1.45rem; line-height: 1.5; }
body.large-text .option { font-size: 1.28rem; padding: 1rem 1.1rem; }
body.large-text .feedback-title { font-size: 1.4rem; }
body.large-text .feedback-explain { font-size: 1.1rem; }
body.large-text .dialog-text p { font-size: 1.12rem; }
body.large-text .btn { font-size: 1.15rem; }
body.large-text .branch-info strong, body.large-text .stratum-info strong { font-size: 1.1rem; }

/* Rango de cursos de un pozo, en el editor */
.cfg-grades-row { gap: .3rem; }
/* El chip de curso se toca con el dedo, de pie y en clase: medía 36×26 px y la
   recomendación para dedos es 44×44. Se sube el alto sin ensancharlo de más,
   que en el panel van seis en fila. */
.grade-chip {
  display: flex; align-items: center; justify-content: center; gap: .3rem;
  background: var(--parchment); border: 2px solid var(--parchment-dark);
  border-radius: 999px; padding: .5rem .7rem; font-size: .82rem;
  min-height: 2.75rem;
  flex: 0 0 auto !important; min-width: 0 !important;
}
.grade-chip.on { background: #e8ecd8; border-color: var(--jungle); color: var(--ink); }
.grade-chip input { width: 15px; height: 15px; accent-color: var(--jungle); }
.ros-grade { max-width: 190px; }


/* ── Objetivos táctiles ──
   Las casillas no pueden crecer sin descuadrar la retícula, así que el área
   de toque se amplía con un pseudoelemento invisible centrado en ellas. */
.team-pick input[type="checkbox"],
.cfg-body input[type="checkbox"],
.cfg-body input[type="radio"] {
  width: 26px; height: 26px; position: relative; accent-color: var(--jungle);
}
.team-pick input[type="checkbox"]::after,
.cfg-body input[type="checkbox"]::after,
.cfg-body input[type="radio"]::after {
  content: ''; position: absolute; left: 50%; top: 50%;
  width: 44px; height: 44px; transform: translate(-50%, -50%);
}
.cfg-del { min-width: 44px; min-height: 44px; }
.auth-tab { min-height: 44px; }

/* El ampliador vale para CUALQUIER casilla o radio de la app, no solo las del
   panel: la del Campamento se quedaba fuera por estar en otro contenedor. */
input[type="checkbox"], input[type="radio"] { position: relative; }
input[type="checkbox"]::after, input[type="radio"]::after {
  content: ''; position: absolute; left: 50%; top: 50%;
  width: 44px; height: 44px; transform: translate(-50%, -50%);
}
/* Controles del panel: es interfaz de docente, pero también se usa en tablet */
.cfg-nav-btn, .cfg-strat-tab, .cfg-toggle { min-height: 44px; }
.cfg-body input[type="text"], .cfg-body input[type="number"],
.cfg-body input[type="date"], .cfg-body select { min-height: 44px; }
.class-toolbar select, #pin-input, #modal-input { min-height: 44px; }

.class-fund { margin-top: 1.4rem; padding-top: .8rem; border-top: 2px dashed var(--parchment-dark); }
.class-fund h3 { margin-bottom: .25rem; }

/* ── Cámara del Guardián ── */
.branch-guardian { margin-top: .8rem; }
.guardian-card {
  display: flex; align-items: center; gap: .8rem; width: 100%; text-align: left;
  padding: .85rem 1rem; border-radius: var(--radius); font: inherit;
  border: 2px solid var(--brass); background: var(--card); color: var(--ink);
}
.guardian-card strong { display: block; }
.guardian-card small { color: var(--ink-soft); font-size: .82rem; }
.guardian-card-icon { font-size: 1.9rem; }
.guardian-card-go { margin-left: auto; font-size: 1.3rem; }
.guardian-open { cursor: pointer; border-style: solid; border-width: 3px; box-shadow: 0 3px 0 var(--brass); }
.guardian-open:hover { transform: translateY(-1px); }
.guardian-locked, .guardian-wait { border-style: dashed; background: var(--parchment-dark); }
.guardian-done { background: #e9f3d8; border-color: var(--jungle-light); }

.guardian-hall { max-width: 620px; margin: 0 auto; text-align: center; }
.guardian-hall h2 { margin: .3rem 0 .8rem; }
.guardian-hall h3 { margin: 1.2rem 0 .5rem; }
.guardian-hall .dialog { text-align: left; }
.guardian-face { font-size: 4.5rem; line-height: 1; }
/* La cara del Guardián: es el momento más dramático del pozo y era un
   pictograma de trazo. Con dibujo, ocupa lo que merece. */
.guardian-img {
  display: block; width: min(16rem, 72%); height: auto; margin: 0 auto var(--s-2);
  filter: drop-shadow(0 4px 10px rgba(51, 36, 15, .28));
}
.guardian-strata { display: flex; flex-direction: column; gap: .45rem; text-align: left; }
.guardian-stratum {
  display: flex; align-items: center; gap: .7rem;
  padding: .5rem .7rem; border-radius: var(--radius);
  background: var(--card); border-left: 5px solid var(--brass);
}
.guardian-stratum strong { display: block; font-size: .92rem; }
.guardian-stratum small { color: var(--ink-soft); font-size: .8rem; }
.guardian-stratum-icon { font-size: 1.5rem; }
.guardian-free {
  margin: 1rem 0; padding: .7rem .9rem; text-align: left;
  background: #e9f3d8; border-radius: var(--radius); font-size: .88rem;
}
.guardian-actions { margin-top: 1rem; }
.guardian-meta { font-size: .83rem; color: var(--ink-soft); margin-bottom: .7rem; }

/* ── Configuración compartida del equipo docente ── */
.cfg-equipo {
  padding: .65rem .8rem; border-radius: var(--radius);
  font-size: .88rem; margin: .5rem 0 .8rem;
}
.cfg-equipo-ok    { background: #e9f3d8; border-left: 5px solid var(--jungle-light); }
.cfg-equipo-aviso { background: #fbe6c8; border-left: 5px solid var(--brass); }
.cfg-equipo-nota  { background: var(--parchment-dark); border-left: 5px solid var(--ink-soft); }
.cfg-equipo-botones { display: flex; flex-wrap: wrap; gap: .5rem; }

/* ══════════ CLASE DIRIGIDA ══════════ */
#screen-aula { max-width: var(--w-wide); }
.aula-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--s-5); flex-wrap: wrap; margin-bottom: var(--s-5);
}
.aula-sub { color: var(--ink-soft); max-width: 44rem; margin-top: .3rem; }
.aula-toolbar {
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  margin-bottom: var(--s-4); padding-bottom: var(--s-4); border-bottom: var(--line);
}
.aula-toolbar select {
  padding: .5rem .75rem; font-family: var(--font-text); font-size: var(--t-sm);
  min-height: var(--tap); flex: 0 1 22rem;
  border: 1.5px solid rgba(122, 74, 33, .28); border-radius: var(--r-sm);
  background: var(--surface); color: var(--ink);
}
.aula-toolbar .class-meta { margin-left: auto; }

/* Fichas de turno: grandes, porque se tocan de pie y con prisa */
.aula-lista {
  display: grid; gap: .6rem;
  grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
}
/* Agrupada por cuadrillas, el contenedor deja de ser rejilla —si no, los
   títulos entrarían como una celda más— y la rejilla pasa a cada grupo. */
.aula-lista-grupos { display: block; }
.aula-grupo-gente {
  display: grid; gap: .6rem; margin-bottom: var(--s-5);
  grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
}
.aula-grupo-cab {
  display: flex; align-items: center; gap: .5rem;
  margin: var(--s-4) 0 .5rem; padding-bottom: .3rem;
  border-bottom: 2px solid var(--paper-deep);
  font-size: var(--t-md); color: var(--leather-dark);
}
.aula-grupo-cab:first-child { margin-top: 0; }
.aula-grupo-icono { font-size: 1.3rem; line-height: 1; }
.aula-grupo-meta { margin-left: auto; font-size: var(--t-xs); color: var(--ink-soft); font-weight: 400; }

/* El botón de mérito de un grupo: pequeño, al final del título, para que no
   compita con el nombre de la cuadrilla pero se alcance con el pulgar. */
.aula-grupo-merito {
  min-width: 44px; min-height: 36px; padding: .2rem .5rem; margin-left: .4rem;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface); border: var(--line); border-radius: var(--r-md);
  color: var(--leather-dark); cursor: pointer;
}
.aula-grupo-meta + .aula-grupo-merito { margin-left: .4rem; }
.aula-grupo-merito:hover { background: var(--paper-deep); }
.aula-grupo-merito.on { background: var(--leather-dark); color: #fff6e2; border-color: var(--leather-dark); }
.aula-grupo-merito .ico { width: 1.1rem; height: 1.1rem; }
/* Abierto se hunde y se aclara: el botón sigue siendo el mismo, pero se ve
   cuál de los paneles es el suyo cuando hay varios títulos por medio. */
#aula-merito-clase.on {
  background: var(--brass-tint); color: var(--brass);
  box-shadow: inset 0 2px 5px rgba(107, 86, 56, .25), 0 0 0 2px var(--brass);
}
#aula-merito-clase.on:hover { background: var(--brass-tint); color: var(--brass); }

/* El campo de varias líneas del diálogo: la nota que el docente escribe para
   una familia no cabe en una línea, y con una línea se escriben notas de una
   línea. */
.modal-area {
  width: 100%; margin-top: .6rem; padding: .6rem .7rem;
  font-family: var(--font-text); font-size: var(--t-md); line-height: 1.5;
  color: var(--ink); background: var(--paper);
  border: var(--line); border-radius: var(--r-md); resize: vertical;
}
.modal-nota { margin: .5rem 0 0; font-size: var(--t-xs); color: var(--ink-soft); text-align: left; }

/* El nivel de Bloom donde se rompe un concepto, junto a su área. */
.repaso-estrato {
  display: inline-flex; align-items: center; gap: .25rem;
  font-size: var(--t-xs); color: var(--leather-dark);
  background: var(--paper-deep); border-radius: var(--r-sm); padding: .1rem .4rem;
}
.repaso-estrato .ico { width: .95rem; height: .95rem; }

/* ── Evaluación por criterios ──
   La tabla es alumnos por criterios: con veinticuatro y ocho columnas no cabe
   en un móvil, así que rueda dentro de su caja en vez de empujar la página. */
.cr-conceptos { margin: .6rem 0 0; padding: .6rem .7rem; background: var(--paper-deep); border-radius: var(--r-md); }
.cr-area { margin-bottom: .7rem; }
.cr-area > strong { font-size: var(--t-xs); text-transform: uppercase; letter-spacing: .04em; color: var(--ink-soft); }
.cr-casillas { display: grid; gap: .2rem .8rem; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); margin-top: .3rem; }
.cr-casilla { display: flex; align-items: center; gap: .4rem; font-size: var(--t-sm); min-height: 32px; }

.cr-saberes { display: block; margin: .3rem 0; font-size: var(--t-xs); color: var(--ink-soft); }
.cfg-tag-aviso { background: var(--brass-tint); color: var(--brass); }

/* La propuesta que lee la IA del currículo: se revisa entera antes de guardar
   nada, así que se lee como una lista de casillas, no como un formulario. */
.cr-propuesta {
  margin: .6rem 0 1rem; padding: .7rem .8rem;
  background: var(--paper-deep); border: var(--line); border-radius: var(--r-md);
}
.cr-prop-cab { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; font-size: var(--t-sm); }
.cr-prop-fila {
  display: flex; gap: .6rem; align-items: flex-start;
  padding: .5rem .6rem; margin-bottom: .35rem;
  background: var(--surface); border-radius: var(--r-sm); font-size: var(--t-sm);
}
.cr-prop-fila input { margin-top: .25rem; flex-shrink: 0; }
.cr-prop-sin { box-shadow: inset 3px 0 0 var(--brass); }
.cr-prop-conceptos { display: block; margin-top: .25rem; font-size: var(--t-xs); color: var(--ink-soft); }

/* Un código deducido de la posición no es lo mismo que uno que venía escrito
   en el currículo, y el docente tiene que poder distinguirlos de un vistazo
   para corregir los que no cuadren con su centro. */
.cr-cod-deducido { font-style: italic; color: var(--brass); }
/* Los dos bloques de la propuesta: los que Atlas puede medir y los demás. */
.cr-prop-grupo {
  margin: var(--s-4) 0 .2rem; font-size: var(--t-base); color: var(--leather-dark);
}
.cr-prop-otros { margin-top: var(--s-4); }
.cr-prop-otros summary {
  cursor: pointer; font-weight: 800; color: var(--ink-soft); font-size: var(--t-sm);
  padding: .5rem 0;
}
.cr-prop-otros summary:hover { color: var(--leather-dark); }

.cr-tabla-caja { overflow-x: auto; margin: .6rem 0; border: var(--line); border-radius: var(--r-md); }
.cr-tabla { border-collapse: collapse; width: 100%; font-size: var(--t-sm); background: var(--surface); }
.cr-tabla th, .cr-tabla td { padding: .4rem .6rem; border-bottom: 1px solid var(--paper-deep); text-align: left; }
.cr-tabla thead th { background: var(--paper-deep); font-size: var(--t-xs); white-space: nowrap; }
.cr-tabla tbody th { white-space: nowrap; font-weight: 600; }
.cr-tabla td { font-variant-numeric: tabular-nums; white-space: nowrap; }
.cr-tabla td small { display: block; font-size: var(--t-xs); color: var(--ink-soft); font-variant-numeric: normal; }
.cr-tabla td.cr-pocos { color: var(--ink-soft); background: var(--paper-deep); }

/* ── La ficha de datos de un alumno ──
   Va dentro de su tarjeta de la lista, pegada al niño del que habla. Se lee
   como un inventario, no como una tarjeta bonita: quien pregunta esto quiere
   ver lo que hay. */
.cfg-datos {
  min-width: 40px; min-height: 40px; flex-shrink: 0;
  background: none; border: none; border-radius: var(--r-md);
  font-size: 1.05rem; cursor: pointer; color: var(--ink-soft);
}
.cfg-datos:hover { background: var(--paper-deep); color: var(--ink); }
.datos-panel {
  margin: .6rem 0 0; padding: .8rem .9rem;
  background: var(--paper-deep); border: var(--line); border-radius: var(--r-md);
}
/* La marca de que un alumno tiene adaptación. Es para el docente y solo dice
   QUE la tiene: cuál es se queda en su ficha. */
.student-adaptado { font-size: .95rem; line-height: 1; }

/* Los campos de la adaptación se atenúan mientras esté apagada: siguen ahí
   para poder prepararla, pero se ve que no está haciendo nada. */
.ad-campos.ad-apagado { opacity: .5; }
.ad-campos.ad-apagado select, .ad-campos.ad-apagado textarea { pointer-events: none; }

.datos-cab { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.datos-cab strong { font-size: var(--t-sm); color: var(--leather-dark); }
.datos-cerrar {
  margin-left: auto; min-width: 36px; min-height: 36px;
  background: none; border: none; color: var(--ink-soft); cursor: pointer;
}
.datos-panel h5 {
  margin: .9rem 0 .3rem; font-size: var(--t-xs); letter-spacing: .04em;
  text-transform: uppercase; color: var(--ink-soft);
}
.datos-fila {
  display: flex; gap: .6rem; justify-content: space-between;
  padding: .25rem 0; border-bottom: 1px solid var(--rule-suave, rgba(107, 86, 56, .12));
  font-size: var(--t-sm);
}
.datos-fila span { color: var(--ink-soft); }
.datos-fila strong { text-align: right; word-break: break-word; }
.datos-nota {
  background: var(--surface); border-left: 3px solid var(--brass);
  padding: .4rem .6rem; margin: .3rem 0; font-size: var(--t-sm);
}
.datos-nota em { display: block; color: var(--ink-soft); font-size: var(--t-xs); }
.datos-donde { margin: .2rem 0; padding-left: 1.1rem; font-size: var(--t-sm); }
.datos-acciones { display: flex; gap: .5rem; flex-wrap: wrap; margin: .9rem 0 .4rem; }

/* La línea de privacidad de la portada: va bajo la lista de garantías y en
   voz más baja, porque es una invitación a preguntar, no una garantía más. */
.home-privacidad { margin: .8rem 0 0; font-size: var(--t-sm); color: var(--ink-soft); }

/* Leyenda de una tabla de cifras: qué periodo mide cada columna. */
.dash-leyenda { font-size: var(--t-xs); color: var(--ink-soft); margin: .4rem 0 .8rem; }

/* La evaluación de la clase. Tres cifras, y la tercera es la que avisa. */
.class-evaluacion { margin: 0 0 var(--s-5); }
.class-eval-intro { font-size: var(--t-sm); color: var(--ink-soft); margin: 0 0 .7rem; }
.class-eval-cifras {
  display: grid; gap: .6rem;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
}
.class-eval-dato {
  background: var(--surface); border: var(--line); border-radius: var(--r-md);
  padding: .7rem .8rem; display: flex; flex-direction: column; gap: .15rem;
}
.class-eval-dato strong { font-size: var(--t-lg); font-variant-numeric: tabular-nums; }
.class-eval-dato span { font-size: var(--t-xs); color: var(--ink-soft); }
.class-eval-aviso { border-color: var(--brass); box-shadow: inset 0 0 0 1px var(--brass); }
.class-eval-aviso strong { color: var(--brass); }
.class-eval-nota { font-size: var(--t-sm); color: var(--ink-soft); margin: .6rem 0 0; }
.class-eval-nota-aviso {
  color: var(--ink); background: var(--brass-tint);
  border-left: 3px solid var(--brass); padding: .55rem .8rem; border-radius: var(--r-sm);
}

/* El botón de los informes de toda la clase, con su línea de explicación. */
.class-informes { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; margin: 0 0 var(--s-4); }
.class-informes-nota { font-size: var(--t-xs); color: var(--ink-soft); flex: 1 1 16rem; }

/* La barra del modo elegir. */
.aula-seleccion {
  display: flex; align-items: center; gap: .5rem; flex-wrap: wrap;
  margin-bottom: .6rem; padding: .5rem .7rem;
  background: var(--brass-tint); border-radius: var(--r-md);
}
.aula-sel-cuenta { font-size: var(--t-sm); font-weight: 700; color: var(--brass); margin-right: auto; }
#aula-elegir.on {
  background: var(--brass-tint); color: var(--brass);
  box-shadow: inset 0 2px 5px rgba(107, 86, 56, .25), 0 0 0 2px var(--brass);
}
#aula-elegir.on:hover { background: var(--brass-tint); color: var(--brass); }

/* Una tarjeta marcada. El tic va arriba a la derecha, donde estaba la bolsa:
   en este modo la bolsa no se pinta, así que el sitio está libre. */
/* Compuesto a propósito: `.aula-alumno-card` se define más abajo y con la
   misma especificidad ganaría ella, así que la marca no se vería. */
.aula-alumno-card.aula-card-elegida {
  border-top-color: var(--brass); background: var(--brass-tint);
  box-shadow: 0 0 0 3px var(--brass), var(--e-1);
}
.aula-card-tic {
  position: absolute; top: .35rem; right: .45rem;
  font-size: 1.1rem; line-height: 1; color: var(--brass); pointer-events: none;
}

/* El panel de méritos de un grupo, pegado bajo el título al que pertenece. */
.aula-merito-grupo {
  background: var(--paper-deep); border: var(--line); border-radius: var(--r-lg);
  padding: .7rem .8rem .2rem; margin: 0 0 var(--s-4);
}
.amg-cab {
  display: flex; align-items: center; gap: .45rem; margin-bottom: .6rem;
  font-size: var(--t-sm); color: var(--leather-dark);
}
.amg-icono { font-size: 1.2rem; line-height: 1; }
.amg-cuenta { font-size: var(--t-xs); color: var(--ink-soft); font-weight: 400; }
.amg-cerrar {
  margin-left: auto; min-width: 36px; min-height: 36px;
  background: none; border: none; border-radius: var(--r-md);
  color: var(--ink-soft); font-size: var(--t-md); cursor: pointer;
}
.amg-cerrar:hover { background: var(--surface); color: var(--ink); }
.amg-nota { margin: 0 0 .6rem; font-size: var(--t-xs); color: var(--ink-soft); }

/* El interruptor entre las dos vistas. */
.aula-vista { display: flex; gap: .4rem; margin-bottom: .6rem; flex-wrap: wrap; }
.aula-vista-btn {
  min-height: 44px; padding: .5rem .8rem;
  background: var(--surface); border: var(--line); border-radius: var(--r-md);
  font-family: var(--font-text); font-size: var(--t-sm); font-weight: 700;
  color: var(--ink-soft); cursor: pointer;
}
.aula-vista-btn.on { background: var(--leather-dark); color: #fff6e2; border-color: var(--leather-dark); }
/* La tarjeta lleva dos acciones —dar turno y abrir la bolsa— así que es un
   contenedor: el turno es el botón grande que la ocupa entera y la bolsa un
   botón pequeño en la esquina. */
.aula-alumno-card {
  position: relative;
  background: var(--surface); border: none; border-top: 3px solid var(--brass-light);
  border-radius: var(--r-lg);
  box-shadow: var(--e-1); font-family: var(--font-text); color: var(--ink);
  transition: transform .14s ease, box-shadow .14s ease;
}
.aula-card-turno {
  display: flex; flex-direction: column; align-items: center; gap: .2rem;
  width: 100%; min-height: 6.5rem; padding: .9rem .6rem;
  background: none; border: none; border-radius: var(--r-lg);
  font-family: inherit; color: inherit;
}
/* 44 px de objetivo táctil, como el resto: se pulsa con el dedo, de pie y en
   mitad de la clase. Medido, no supuesto. */
.aula-card-bolsa {
  position: absolute; top: .25rem; right: .25rem;
  width: 2.75rem; height: 2.75rem; display: grid; place-items: center;
  background: var(--brass-tint); border: 1px solid var(--brass-light);
  border-radius: 50%; color: var(--leather-dark);
  transition: background-color .14s ease, transform .14s ease;
}
.aula-card-bolsa:hover { background: var(--brass-light); transform: scale(1.06); }
.aula-alumno-card:hover { transform: translateY(-2px); box-shadow: var(--e-2); }
.aula-alumno-card.aula-ya { border-top-color: var(--jungle-light); background: var(--jungle-tint); }
.aula-alumno-card.aula-ya .aula-card-bolsa { background: var(--surface); }

/* La bolsa del alumno: el almacén y el Fondo, manejados por el docente */
#aula-bolsa h3 { margin-top: var(--s-5); }
#aula-bolsa .aula-instruccion { margin-bottom: var(--s-4); }
.aula-card-avatar { font-size: 1.7rem; line-height: 1.2; }
.aula-card-nombre { font-weight: 800; font-size: var(--t-md); }
.aula-card-meta { font-size: var(--t-xs); color: var(--ink-soft); }

/* Cabecera del turno: quién está respondiendo */
.aula-alumno {
  display: flex; align-items: center; gap: .9rem; flex-wrap: wrap;
  background-color: var(--leather-dark);
  background-image: linear-gradient(135deg, #6d421d, var(--leather-dark));
  color: #f7ead2; border-radius: var(--r-lg);
  padding: .8rem 1.1rem; margin-bottom: var(--s-4); box-shadow: var(--e-2);
}
.aula-alumno-avatar {
  position: relative;
  font-size: 1.7rem; line-height: 1;
  width: 3rem; height: 3rem; flex-shrink: 0; display: grid; place-items: center;
  background: rgba(255,255,255,.12); border-radius: var(--r-pill);
  border: 1px solid rgba(240, 195, 60, .3);
}
.aula-alumno-info { flex: 1; min-width: 0; }
.aula-alumno-info strong { display: block; font-size: var(--t-lg); font-family: var(--font-display); font-weight: 400; }
.aula-alumno-info small { color: rgba(247, 234, 210, .82); font-size: var(--t-sm); }
.aula-progreso { display: flex; gap: .3rem; }
/* Sobre la cabecera de cuero el papel del botón terciario se vuelve un
   parche blanco: aquí el mismo filete se dibuja en claro sobre el oscuro. */
.aula-alumno .btn-quit {
  color: #f7ead2; background: rgba(255,255,255,.12);
  border-color: rgba(247, 234, 210, .45);
}
.aula-alumno .btn-quit:hover {
  background: rgba(255,255,255,.24); border-color: rgba(247, 234, 210, .7);
}

/* La pregunta, tamaño de aula: se lee de lejos y desde un proyector */
.aula-instruccion {
  font-size: var(--t-xs); color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: .06em; font-weight: 700;
  margin-bottom: var(--s-4);
}
/* La tarjeta de la pregunta no se estira a lo ancho del panel: una línea de
   texto de 1.100 px no se lee de un vistazo ni desde la mesa de al lado. */
#aula-pregunta-card, #aula-feedback { max-width: 58rem; }
#aula-pregunta { font-size: clamp(1.3rem, 3vw, 1.9rem); }
/* Dos columnas como mucho: en tres, las opciones cortas quedaban desperdigadas
   y se pierde la lectura en Z de un 2×2. */
#aula-opciones { grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); max-width: 46rem; }
@media (min-width: 50rem) { #aula-opciones { grid-template-columns: 1fr 1fr; } }
#aula-opciones .option { font-size: var(--t-lg); min-height: 4rem; }
.aula-fb-acciones { display: flex; gap: .6rem; justify-content: center; flex-wrap: wrap; }
#aula-feedback { text-align: center; }

.aula-meritos { margin-top: var(--s-6); padding-top: var(--s-5); border-top: var(--line); }
.aula-meritos h3 { margin-top: 0; }

/* Bloque plegable del panel (la vía de reserva de la copia) */
.cfg-detalle {
  border: var(--line); border-radius: var(--r-md);
  padding: .2rem .9rem; background: var(--surface);
}
.cfg-detalle > summary {
  cursor: pointer; padding: .6rem 0; min-height: var(--tap);
  display: flex; align-items: center;
  font-size: var(--t-sm); font-weight: 700; color: var(--leather-dark);
}
.cfg-detalle > summary:hover { color: var(--brass); }
.cfg-detalle[open] { padding-bottom: .9rem; }
.cfg-detalle > *:not(summary) { margin-bottom: .5rem; }

/* Aviso de copia pendiente en la sala de mapas */
.teacher-warn {
  display: flex; align-items: center; gap: .9rem; flex-wrap: wrap;
  background: var(--brass-tint); border-left: 4px solid var(--brass);
  border-radius: var(--r-md); padding: .9rem 1.1rem;
  margin-bottom: var(--s-5); font-size: var(--t-sm); line-height: 1.55;
  text-align: left;
}
.teacher-warn > div { flex: 1; min-width: 14rem; }
.teacher-warn-icon { font-size: 1.6rem; line-height: 1; }

/* ── El pulso de la sala de mapas ──
   Cuatro cifras en una fila, no cuatro tarjetas de pantalla y media: son
   números de una o dos cifras y se leen igual pequeños. En un móvil caben
   dos por fila; en el portátil del aula, las cuatro.

   Todas se pulsan, así que todas tienen 44px de alto de sobra: son botones
   de verdad, no adorno. */
.teacher-pulse {
  display: grid; gap: .6rem; margin-bottom: var(--s-5);
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
}
.pulso-ficha {
  display: flex; align-items: center; gap: .6rem;
  min-height: 3.25rem; padding: .7rem .9rem;
  background: var(--surface); border: 1px solid var(--paper-deep);
  border-radius: var(--r-md); box-shadow: var(--e-1);
  font-family: inherit; color: var(--ink); text-align: left; cursor: pointer;
  transition: transform .12s ease, box-shadow .12s ease;
}
.pulso-ficha:hover { transform: translateY(-2px); box-shadow: var(--e-2); }
.pulso-ficha:active { transform: none; }
.pulso-icono { font-size: 1.5rem; line-height: 1; flex: none; }
.pulso-n { font-size: 1.45rem; font-weight: 800; line-height: 1; flex: none; }
.pulso-que { font-size: var(--t-xs); line-height: 1.25; color: var(--ink-soft); }
/* El que pide algo: sin cifra, con el verbo delante. */
.pulso-accion { border-style: dashed; background: transparent; }
.pulso-hacer { font-size: var(--t-sm); font-weight: 700; color: var(--brass); line-height: 1.25; }
/* El que avisa de algo que hay que atender hoy. */
.pulso-avisa { border-left: 4px solid var(--brass); background: var(--brass-tint); }
.pulso-avisa .pulso-que { color: var(--ink); }

/* Barra de clase abierta, en la sala de mapas */
.teacher-aula {
  display: flex; align-items: center; gap: .9rem; flex-wrap: wrap;
  background: var(--surface); border-left: 4px solid var(--jungle-light);
  border-radius: var(--r-md); padding: .85rem 1.1rem;
  margin-bottom: var(--s-5); font-size: var(--t-sm); text-align: left;
  box-shadow: var(--e-1);
}
.teacher-aula > div { flex: 1; min-width: 14rem; }
#screen-aulas .onboarding-card { max-width: 28rem; margin: 0 auto; text-align: left; }
#screen-aulas .onboarding-card h3 { margin-bottom: .3rem; }
#screen-aulas form { display: flex; flex-direction: column; gap: .7rem; margin-top: var(--s-4); }
#screen-aulas input {
  padding: .8rem 1rem; font-size: var(--t-base); font-family: var(--font-text);
  border-radius: var(--r-md); min-height: var(--tap);
  border: 2px solid rgba(122, 74, 33, .28); background: var(--paper); color: var(--ink);
}
#screen-aulas input:focus { outline: none; border-color: var(--brass); box-shadow: 0 0 0 3px rgba(138,90,11,.18); }

/* ═══════════════════════════════════════════════════════════
   MOVIMIENTO
   Un juego responde cuando lo tocas. Hasta ahora la interfaz cambiaba de
   estado sin decirlo: acertar y fallar se distinguían solo por el color.
   Todo lo de aquí abajo es corto (menos de medio segundo), ocurre una sola
   vez y desaparece entero con `prefers-reduced-motion`.
   ═══════════════════════════════════════════════════════════ */

/* Acierto: la losa da un salto y se enciende en verde. */
@keyframes acierto {
  0%   { transform: translateY(3px) scale(1); }
  38%  { transform: translateY(-5px) scale(1.035); }
  70%  { transform: translateY(0) scale(.995); }
  100% { transform: translateY(0) scale(1); }
}
.option-correct {
  animation: acierto .46s cubic-bezier(.2, .9, .3, 1);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .7),
    0 3px 0 rgba(55, 98, 47, .35),
    0 0 0 4px rgba(111, 158, 89, .28),
    var(--e-2) !important;
}
/* Fallo: dos golpes cortos de lado. Nunca un temblor largo: el tono del
   juego con el error es cómico, no punitivo. */
@keyframes fallo {
  0%, 100% { transform: translateX(0); }
  22%      { transform: translateX(-6px); }
  55%      { transform: translateX(5px); }
  80%      { transform: translateX(-2px); }
}
.option-wrong {
  animation: fallo .34s ease-in-out;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .6),
    0 3px 0 rgba(168, 58, 37, .32),
    var(--e-2) !important;
}
/* La respuesta buena, cuando no era la elegida, se señala con calma. */
@keyframes revela {
  0%   { box-shadow: 0 0 0 0 rgba(55, 98, 47, .45); }
  100% { box-shadow: 0 0 0 9px rgba(55, 98, 47, 0); }
}
.option-reveal { animation: revela .9s ease-out .1s 2; }

/* Las tarjetas del mapa entran escalonadas, como piezas que se colocan.
   Sin esto la pantalla aparecía de golpe y no había sensación de llegada. */
@keyframes surge {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}
.site-header, .branch-card, .stratum-row, .bazar-card {
  animation: surge .34s cubic-bezier(.2, .8, .3, 1) backwards;
}
.site-branches .branch-card:nth-child(1) { animation-delay: .04s; }
.site-branches .branch-card:nth-child(2) { animation-delay: .08s; }
.site-branches .branch-card:nth-child(3) { animation-delay: .12s; }
.site-branches .branch-card:nth-child(4) { animation-delay: .16s; }
.strata-list .stratum-row:nth-child(1) { animation-delay: .03s; }
.strata-list .stratum-row:nth-child(2) { animation-delay: .09s; }
.strata-list .stratum-row:nth-child(3) { animation-delay: .15s; }
.strata-list .stratum-row:nth-child(4) { animation-delay: .21s; }

/* Nada de lo anterior es información: quien pide menos movimiento lo pierde
   entero y la interfaz sigue diciendo lo mismo con el color y el texto. */
@media (prefers-reduced-motion: reduce) {
  .option-correct, .option-wrong, .option-reveal,
  .site-header, .branch-card, .stratum-row, .bazar-card,
  .hud-stat-level.lvl-up, .hud-stat-level.lvl-up .lvl-ring b {
    animation: none !important;
  }
}

/* ── Iconos en su sitio ──
   Al pasar de emoji a dibujo, los huecos que antes se llenaban con una
   fuente de emoji quedan a cargo del CSS: aquí se les da el tamaño y el
   color de cada contexto. */
/* El dorado sobre crema casi no se veía: el emblema va en latón, que es el
   tono que aguanta sobre papel. */
.home-crest .ico { width: 3.2rem; height: 3.2rem; color: var(--brass); stroke-width: 1.5; }
.home-door-icon .ico { width: 2.5rem; height: 2.5rem; }
.home-rule .ico, .guardian-free .ico { color: var(--brass); vertical-align: -.22em; }
.guardian-face .ico { width: 4.2rem; height: 4.2rem; color: var(--leather); }
.screen h3 > .ico { width: 1.5rem; height: 1.5rem; color: var(--brass); flex-shrink: 0; }
.btn .ico { width: 1.2rem; height: 1.2rem; }
.cfg-label .ico { color: var(--brass); }
/* Dentro de un botón de color, el icono va del color del texto del botón. */
.btn-primary .ico, .btn-secondary .ico { color: currentColor; }

/* La moneda vale como signo de la divisa dentro de una frase: va del tono
   del latón y alineada con la línea base del texto que la rodea. */
.student-stats .ico, .class-note .ico, .class-meta .ico, .shop-info .ico,
.merit-info .ico, .award-meta .ico, .logbook-stat .ico, .fund-total .ico,
.team-goal-nums .ico, .student-num .ico, .daily-banner .ico, .bazar-inner .ico,
.guardian-meta .ico, .kira .ico {
  color: var(--brass);
}
.student-stats span { display: inline-flex; align-items: center; gap: .3rem; }

/* ── El HUD en pantallas estrechas ──
   En un móvil de 390 px la identidad y los dos indicadores no caben en una
   línea: el rango se partía en tres renglones y la cabecera se comía un
   tercio de la pantalla. El nombre manda; el rango se recorta y la palabra
   «Nivel» sobra porque el anillo ya lo dice. */
@media (max-width: 34rem) {
  #hud { padding: .4rem .7rem; gap: .5rem; }
  .hud-identity { overflow: hidden; }
  .hud-rank-line { overflow: hidden; }
  #hud-name, .hud-rank {
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .hud-rank { letter-spacing: .05em; }
  .hud-stat-label { display: none; }
  .hud-stat { padding: .25rem .5rem; }
  .hud-avatar { width: 2.2rem; height: 2.2rem; font-size: 1.25rem; }
  .lvl-ring { width: 2rem; height: 2rem; }
  .lvl-ring b { font-size: var(--t-base); }

  /* La cartela de misión no cabe entera: el nombre del yacimiento se cae
     porque acabas de salir de él y ya sabes dónde estás. Se queda el
     estrato, que es lo que cambia de reto en reto, y los puntos. */
  .mh-site, .mh-sep { display: none; }
  .mission-header { flex-wrap: nowrap; padding: .45rem .8rem; }
  #mission-title { flex: 1; overflow: hidden; }
  #mission-title > .ico { flex-shrink: 0; }
  /* Si aun así no cabe, se corta con puntos suspensivos y no a mitad de letra:
     «RECORDA» parece un fallo, «RECORD…» se entiende. */
  #mission-title > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* Y la racha se queda en la llama y el número. Aquí no sobra ni un carácter,
     y «3» con una llama al lado se entiende en cualquier idioma. */
  .mission-racha { flex-shrink: 0; padding: .25rem .5rem; }
  .mission-racha .racha-texto { display: none; }

  /* Y en el pozo, la cota de profundidad se aprieta para dejar sitio al
     nombre del estrato, que es lo que hay que leer. */
  .stratum-row { padding: .8rem .7rem; gap: .6rem; }
  .stratum-depth { width: 2.4rem; }
  .stratum-depth i { font-size: .52rem; letter-spacing: .06em; }
  .stratum-icon { width: 2.3rem; height: 2.3rem; }
  .stratum-icon .ico { width: 1.3rem; height: 1.3rem; }
}

/* El ancla del aviso diario se alinea con la primera línea, no con el centro
   del bloque: en un móvil el texto ocupa tres renglones y centrarla la
   dejaba flotando en mitad de la nada. */
.daily-banner > .ico, .fatigue-banner > .ico {
  color: var(--jungle); margin-top: .18rem; flex-shrink: 0;
}
.fatigue-banner > .ico { color: var(--brass); }

/* ═══════════ LO QUE CONVIENE REPASAR (vista de clase) ═══════════
   Va arriba del todo y con peso visual propio: es la respuesta a la pregunta
   con la que el docente entra en esta pantalla. */
.class-repasar {
  background: var(--pergamino, #f6ecd8);
  border: 1px solid var(--borde, #c9b391);
  border-left: 4px solid var(--laton, #b8862b);
  border-radius: 10px;
  padding: 14px 16px;
  margin: 16px 0;
}
.class-repasar h3 { margin: 0 0 4px; display: flex; align-items: center; gap: 8px; }
.class-repasar-intro { margin: 0 0 12px; font-size: .86rem; opacity: .78; }
.class-repasar-nota { margin: 12px 0 0; font-size: .84rem; opacity: .8; font-style: italic; }
.repaso-lista { display: grid; gap: 10px; }
.repaso-fila {
  padding: 9px 11px;
  border-radius: 8px;
  background: rgba(0, 0, 0, .035);
  border-left: 3px solid transparent;
}
/* Lo que falla media clase se distingue de lo que falla un niño: son dos
   decisiones distintas (pizarra o conversación) y deben verse distintas. */
.repaso-fila.repaso-clase {
  background: rgba(184, 134, 43, .13);
  border-left-color: var(--laton, #b8862b);
}
.repaso-cabeza { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.repaso-area { font-size: .76rem; opacity: .65; text-transform: uppercase; letter-spacing: .04em; }
.repaso-barra {
  height: 6px; margin: 6px 0 5px; border-radius: 3px;
  background: rgba(0, 0, 0, .12); overflow: hidden;
}
.repaso-relleno { height: 100%; background: var(--peligro, #a8452f); border-radius: 3px; }
.repaso-pie { display: flex; justify-content: space-between; gap: 10px; font-size: .82rem; flex-wrap: wrap; }
.repaso-num { font-weight: 700; }
.repaso-tasa { opacity: .72; }
.repaso-quien { display: block; margin-top: 3px; font-size: .78rem; opacity: .62; }
.dash-conceptos .dash-row-label em { font-style: normal; opacity: .55; font-size: .8em; }

/* Botón del informe dentro de la ficha del alumno: discreto, que la ficha ya
   tiene mucha información y esto es una acción puntual. */

/* ═══════════ TALLER DE CARTOGRAFÍA ═══════════ */
.taller-block { margin: 22px 0; padding: 15px 17px; border-radius: 12px;
  background: var(--pergamino, #f6ecd8); border: 1px solid var(--borde, #c9b391); }
.taller-block h3 { margin: 0 0 6px; display: flex; align-items: center; gap: 8px; }
.taller-intro { margin: 0 0 10px; font-size: .9rem; opacity: .82; }
.taller-estado { margin-bottom: 10px; font-size: .9rem; }
.taller-quedan strong { font-size: 1.1em; }
.taller-form { display: grid; gap: .6rem; }
.taller-opciones { display: grid; gap: .45rem; }

/* ── Los campos del Taller ──
   Es el único sitio de toda la app donde un niño TECLEA, y estaba sin vestir:
   los estilos de formulario colgaban de `.cfg-body`, que es el panel del
   docente, así que aquí salían los del navegador. Medido: 19 px de alto y
   letra de 13,3. Sobre una tablet, con el dedo, eso no se acierta. */
#taller-block input[type="text"],
#taller-block textarea {
  width: 100%; min-height: 2.75rem;          /* 44 px, como el resto */
  padding: .55rem .75rem;
  font-family: var(--font-text); font-size: var(--t-md); line-height: 1.4;
  color: var(--ink); background: var(--surface);
  border: 1.5px solid rgba(122, 74, 33, .28); border-radius: var(--r-sm);
  transition: border-color .15s ease, box-shadow .15s ease;
}
#taller-block textarea { resize: vertical; }
#taller-block input[type="text"]:focus,
#taller-block textarea:focus {
  outline: none; border-color: var(--brass);
  box-shadow: 0 0 0 3px rgba(191, 145, 63, .25);
}

/* La marca de la correcta va pegada a su opción: separarlas era la forma
   segura de que un niño marcase la que no era. Y va grande —24 px— porque es
   la decisión que más caro cuesta equivocar de todo el formulario. */
.taller-opcion { display: flex; align-items: center; gap: .6rem; }
.taller-opcion input[type="radio"] {
  flex: none; width: 1.5rem; height: 1.5rem; margin: 0;
  accent-color: var(--jungle); cursor: pointer;
}
.taller-opcion input[type="text"] { flex: 1; min-width: 0; }
/* Toda la fila es zona de toque para marcarla, no solo el círculo. */
.taller-opcion { padding: .15rem .25rem; border-radius: var(--r-sm); }
.taller-opcion:focus-within { background: rgba(191, 145, 63, .1); }
.taller-mios { margin-top: 14px; }
.taller-h4 { margin: 0 0 7px; font-size: .95rem; }
.taller-mio { padding: 8px 11px; border-radius: 8px; margin-bottom: 7px;
  background: rgba(0, 0, 0, .04); border-left: 3px solid transparent; }
.taller-mio-cabeza { display: flex; gap: 10px; justify-content: space-between; align-items: baseline; flex-wrap: wrap; }
.taller-tag { font-size: .76rem; white-space: nowrap; opacity: .8; }
.taller-ok { border-left-color: #4a7c3f; }
.taller-aviso { border-left-color: #b8862b; }
.taller-nota { display: block; margin-top: 4px; font-size: .82rem; font-style: italic; opacity: .8; }
/* Revisión del docente */
.taller-revision { display: block; }
.taller-rev-autor { font-size: .8rem; opacity: .65; margin-bottom: 4px; }
.taller-rev-q { margin: 0 0 7px; font-weight: 600; }
.taller-rev-ops { margin: 0 0 8px; padding-left: 22px; }
.taller-rev-ops li { margin: 2px 0; }
.taller-rev-ok { font-weight: 700; color: #4a7c3f; }
.taller-rev-exp { margin: 0 0 9px; font-size: .87rem; font-style: italic; opacity: .82; }
.taller-rev-falta { color: #a8452f; font-style: normal; }
.taller-aprobado { display: flex; justify-content: space-between; align-items: center; gap: 10px; }

/* ═══════════ CONSULTA DEL CUADERNO DE UN ALUMNO ═══════════
   Barra fija: el docente tiene que saber en todo momento que lo que ve no es
   suyo. Va arriba y ocupa el ancho entero a propósito. */
/* ── La demostración ──
   Su puerta en la portada y su barra de aviso. La barra es la misma idea que
   la de consulta y a propósito: las dos dicen «esto que ves no es lo tuyo». */
/* Es la TERCERA PUERTA, no una nota al pie: mismo material que las otras dos
   —tarjeta levantada, esquina grande, filo de color arriba— para que se vea
   que se puede entrar por ahí. Lo que cambia es la forma: las dos de arriba
   van en vertical y en columnas porque el niño elige entre ellas; esta va en
   horizontal y debajo, porque no compite con ellas. Un maestro que busca una
   demostración la encuentra; un niño que busca su diario no se despista. */
.home-demo {
  display: flex; align-items: center; gap: var(--s-4); text-align: left;
  width: 100%; margin: calc(var(--s-7) * -1 + var(--s-4)) 0 var(--s-7);
  padding: var(--s-4) var(--s-5);
  background: var(--surface-raised); border: 0;
  border-top: 4px solid var(--jungle); border-radius: var(--r-xl);
  color: var(--ink); font-family: var(--font-text); font-size: var(--t-sm);
  line-height: 1.5; cursor: pointer; box-shadow: var(--e-2);
  transition: transform .14s ease, box-shadow .14s ease;
}
.home-demo:hover { transform: translateY(-3px); box-shadow: var(--e-3); }
.home-demo:active { transform: translateY(0); box-shadow: var(--e-2); }
.home-demo:focus-visible { outline: 3px solid var(--jungle); outline-offset: 3px; }
.home-demo-icon {
  width: 3.2rem; height: 3.2rem; flex-shrink: 0;
  display: grid; place-items: center;
  border-radius: var(--r-pill); background: var(--jungle-tint);
}
.home-demo-icon .ico { width: 1.9rem; height: 1.9rem; color: var(--jungle); }
.home-demo-texto { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .15rem; }
.home-demo strong {
  font-family: var(--font-display); font-weight: 400;
  font-size: var(--t-lg); color: var(--jungle); line-height: 1.2;
}
.home-demo small { font-size: var(--t-sm); color: var(--ink-soft); }
/* La pastilla de la derecha: sin ella, el bloque se lee como un aviso y nadie
   lo pulsa. Con ella se ve que es un sitio al que se va. */
.home-demo-ir {
  flex-shrink: 0; align-self: center;
  background: var(--jungle); color: #f3f9ef;
  border-radius: var(--r-pill); padding: .45rem .95rem;
  font-size: var(--t-sm); font-weight: 800; white-space: nowrap;
  box-shadow: var(--e-1);
}
/* En pantalla estrecha se apila y la pastilla se va abajo a lo ancho, que es
   donde el pulgar la encuentra. */
@media (max-width: 34rem) {
  /* Y el icono sube a la altura del titular: centrado contra tres renglones
     de texto se quedaba flotando a media frase. */
  .home-demo { flex-wrap: wrap; gap: var(--s-3); align-items: flex-start; }
  .home-demo-icon { width: 2.6rem; height: 2.6rem; }
  .home-demo-icon .ico { width: 1.5rem; height: 1.5rem; }
  .home-demo-texto { flex: 1 1 60%; }
  .home-demo-ir { flex: 1 1 100%; text-align: center; align-self: stretch; }
}

.demo-bar {
  position: fixed; inset: 0 0 auto 0; z-index: 60;
  display: flex; align-items: center; gap: .7rem; flex-wrap: wrap;
  padding: 9px 15px;
  background: var(--jungle); color: #f3f9ef;
  box-shadow: 0 2px 10px rgba(0, 0, 0, .28);
  font-size: .92rem;
}
.demo-bar .ico { flex-shrink: 0; }
.demo-bar em { font-style: normal; opacity: .85; }
.demo-bar #demo-salir {
  margin-left: auto; background: rgba(255, 255, 255, .16); color: #fff;
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .4);
}
.demo-bar #demo-salir:hover { background: rgba(255, 255, 255, .28); }
/* Sitio para la barra, o taparía la cabecera. El alto sale medido de la
   propia barra (`medirBarrasFijas`, en ui.js): el 46 px de antes era a ojo y
   se quedaba corto, y lo que quedaba debajo salía recortado. Los valores de
   detrás de la coma son el apaño por si el guion aún no ha medido. */
body.en-demo #main { padding-top: var(--barras-fijas, 62px); }
body.en-demo #hud { top: var(--barras-fijas, 62px); }
/* En un móvil la frase larga parte la barra en tres renglones y se come un
   quinto de la pantalla. Se queda el titular, que es lo que hay que leer, y
   el botón de salir. Lo demás ya lo dice el titular. */
@media (max-width: 34rem) {
  .demo-bar { flex-wrap: nowrap; padding: 8px 10px; font-size: .85rem; }
  .demo-bar em { display: none; }
  .demo-bar strong { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
}
/* El aviso de «sin conexión» se calla durante la demostración: no hay clase
   real que sincronizar, así que asustar con que el diario no se guarda es
   contar un problema que aquí no existe —y además lo tapaba la barra. */
body.en-demo .cloud-warning { display: none !important; }
/* Y con las dos barras a la vez —la demostración mirando un cuaderno— cada
   una en su renglón, que si no se pisan. */
/* Con las dos barras a la vez la de lectura se cuelga de la de demostración,
   y el hueco de abajo es la suma de las dos, que es justo lo que mide
   `medirBarrasFijas`. */
body.en-demo.en-consulta .lectura-bar { top: var(--alto-demo, 62px); }
body.en-demo.en-consulta #main { padding-top: var(--barras-fijas, 124px); }
body.en-demo.en-consulta #hud { top: var(--barras-fijas, 124px); }

.lectura-bar {
  position: fixed; inset: 0 0 auto 0; z-index: 60;
  display: flex; align-items: center; gap: 11px;
  padding: 9px 15px;
  background: var(--laton, #b8862b); color: #2b1d0e;
  box-shadow: 0 2px 10px rgba(0, 0, 0, .28);
  font-size: .92rem;
}
.lectura-bar em { font-style: normal; opacity: .8; }
.lectura-bar #lectura-salir { margin-left: auto; }
/* Sitio para la barra, o taparía la cabecera del alumno */
body.en-consulta #main { padding-top: var(--barras-fijas, 62px); }
body.en-consulta #hud { top: var(--barras-fijas, 62px); }
/* Lo que en consulta no se puede hacer se esconde además de estar bloqueado:
   una pantalla que ofrece un botón que no hace nada engaña dos veces. */
body.en-consulta #bazar-card,
body.en-consulta .camp-prefs,
body.en-consulta #fund-buttons,
body.en-consulta #taller-block,
body.en-consulta #shop-list button { display: none !important; }
.student-acciones { display: grid; gap: 6px; margin-top: 9px; }
.student-acciones .btn { width: 100%; justify-content: center; opacity: .85; }
.student-acciones .btn:hover { opacity: 1; }

/* Lo que impide que un alumno entre, en su propia ficha de la lista de clase. */
.ros-pega {
  margin: 6px 0 0; padding: 7px 10px; border-radius: 7px;
  background: rgba(168, 69, 47, .1); border-left: 3px solid var(--peligro, #a8452f);
  font-size: .84rem; line-height: 1.4;
}

/* ── El marco desde el que se imprime un informe ──
   Fuera de la pantalla y a su tamaño real. A cero o con opacidad cero hay
   navegadores que lo imprimen en blanco, y eso no se ve hasta que el PDF ya
   ha salido de aquí. */
#marco-impresion {
  position: fixed; left: -12000px; top: 0;
  width: 820px; height: 1100px; border: 0;
}

/* ══════════════════════════════════════════════════════════
   EL TRÁILER DE LA PORTADA
   ══════════════════════════════════════════════════════════ */

/* ── El cartel que lo abre ──
   Mismo molde que la tercera puerta (la demostración) para que se lean como
   dos ofertas del mismo rango, no como un botón y un anuncio. La lámina de la
   izquierda es un dibujo de verdad del juego, oscurecido, con el triángulo
   encima: eso es lo que dice «esto se reproduce» sin escribirlo. */
.home-trailer {
  display: flex; align-items: center; gap: var(--s-4);
  width: 100%; text-align: left;
  margin: var(--s-4) 0 var(--s-2);
  padding: var(--s-3);
  background: var(--surface);
  border: var(--line-strong); border-radius: var(--r-lg);
  box-shadow: var(--e-1);
  font-family: var(--font-text); color: var(--ink);
  cursor: pointer;
  transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
.home-trailer:hover { box-shadow: var(--e-2); border-color: var(--brass); transform: translateY(-1px); }
.home-trailer:active { transform: translateY(0); box-shadow: var(--e-1); }

.home-trailer-lam {
  position: relative; flex-shrink: 0;
  width: 7.5rem; height: 4.6rem;
  border-radius: var(--r-md); overflow: hidden;
  background: var(--leather-dark);
}
.home-trailer-fondo {
  width: 100%; height: 100%; object-fit: cover; display: block;
  /* Oscurecido para que el triángulo blanco de encima se lea siempre, sea cual
     sea el trozo de templo que toque. */
  filter: brightness(.62) saturate(.9);
}
.home-trailer-play {
  position: absolute; inset: 0; display: grid; place-items: center;
  color: #fff;
}
.home-trailer-play .ico {
  filter: drop-shadow(0 2px 6px rgba(0,0,0,.55));
  /* El triángulo va relleno, que es como se reconoce un «play»: el resto de
     iconos de la casa son de contorno, pero este símbolo sin relleno parece
     una señal de ceda el paso. */
  fill: currentColor;
}
.home-trailer-texto { flex: 1; min-width: 0; }
.home-trailer-texto strong { display: block; font-size: var(--t-base); }
.home-trailer-texto small { display: block; color: var(--ink-soft); font-size: var(--t-sm); line-height: 1.45; }
.home-trailer-ir {
  flex-shrink: 0; align-self: center;
  color: var(--leather-dark); font-weight: 700; font-size: var(--t-sm);
  background: var(--brass-tint); border-radius: var(--r-pill);
  padding: .5rem .9rem;
}

/* ── La primera vez ──
   Mismo cartel, más presencia: filete de latón, un fondo cálido y el rótulo
   de «empieza por aquí». En cuanto se abre una vez vuelve a ser un cartel
   normal y se queda ahí para siempre, por si alguien quiere repetir. */
.home-trailer.primera-vez {
  border-color: var(--brass);
  background: linear-gradient(180deg, var(--brass-tint), var(--surface) 70%);
  box-shadow: var(--e-2);
}
.home-trailer-tag {
  display: inline-block; margin-bottom: .3rem;
  background: var(--brass); color: #fff;
  font-size: var(--t-xs); font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase;
  padding: .2rem .6rem; border-radius: var(--r-pill);
}

@media (max-width: 34rem) {
  /* En un móvil las tres columnas dejan la lámina del tamaño de un sello. Se
     apila: lámina ancha arriba, texto debajo, y el rótulo de ir al final. */
  .home-trailer { flex-direction: column; align-items: stretch; text-align: center; }
  .home-trailer-lam { width: 100%; height: 8rem; }
  .home-trailer-ir { align-self: center; }
}

/* ── El reproductor ──
   A pantalla completa y en oscuro. Lo segundo importa tanto como lo primero:
   sobre el pergamino de la portada los dibujos se confunden con el fondo, y
   apagando la luz alrededor se miran como se mira una proyección. */
.trailer {
  position: fixed; inset: 0; z-index: 70;
  display: flex; align-items: center; justify-content: center;
  padding: clamp(.6rem, 2vw, 1.4rem);
  background: #241606;
  /* Un poco de la arena de siempre en las esquinas: negro del todo sería
     cualquier app, y esto sigue siendo un desierto. */
  background-image:
    radial-gradient(120% 80% at 50% 0%, rgba(138, 90, 11, .30), transparent 62%),
    radial-gradient(120% 90% at 50% 100%, rgba(74, 44, 18, .55), transparent 60%);
  color: #f7ead2;
}
.trailer.hidden { display: none; }
/* Mientras está puesto, la portada de debajo no se desplaza. */
body.con-trailer { overflow: hidden; }

.tr-marco {
  display: flex; flex-direction: column;
  width: min(60rem, 100%); height: 100%;
  max-height: 100%;
}

/* Los tramos de arriba: cuántas escenas hay y por cuál vas. */
.tr-barra { display: flex; gap: 4px; flex-shrink: 0; }
.tr-tramo {
  flex: 1; height: 4px; border-radius: 2px;
  background: rgba(247, 234, 210, .22);
  transition: background-color .3s ease;
}
.tr-tramo.vista { background: rgba(247, 234, 210, .55); }
.tr-tramo.actual { background: var(--brass-light); }

.tr-cabecera {
  display: flex; align-items: center; gap: var(--s-2);
  padding: var(--s-3) 0; flex-shrink: 0;
}
.tr-cuenta {
  flex: 1; font-size: var(--t-xs); letter-spacing: .1em; text-transform: uppercase;
  color: rgba(247, 234, 210, .7);
}
/* Los botones del tráiler: el mismo filete claro sobre oscuro que el botón de
   salir de la cabecera de cuero, para no inventar un cuarto estilo de botón. */
.tr-boton {
  background: rgba(255, 255, 255, .12); color: #f7ead2;
  border: 1px solid rgba(247, 234, 210, .45);
  box-shadow: none;
}
.tr-boton:hover { background: rgba(255, 255, 255, .24); border-color: rgba(247, 234, 210, .75); box-shadow: none; }

.tr-lienzo {
  flex: 1; min-height: 0;
  display: flex; align-items: center; justify-content: center;
}
/* La escena se centra como un bloque. El dibujo NO crece para llenar el
   hueco: si lo hiciera, el título y el texto se irían al borde de abajo y la
   escena quedaría descuadrada, con un palmo de oscuro encima del dibujo. */
.tr-escena {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--s-3); height: 100%; width: 100%; text-align: center;
}

/* ── Dibujo ancho a sangre ── (la carta y los dos fondos de yacimiento) */
.tr-escenario {
  flex: 0 1 auto; min-height: 0;
  max-width: 100%; max-height: 58vh; object-fit: contain;
  border-radius: var(--r-lg);
  box-shadow: 0 10px 40px rgba(0, 0, 0, .5);
  /* El acercamiento lento. Es lo único que separa esto de un pase de
     diapositivas: la imagen nunca está del todo quieta, así que el ojo la
     sigue mirando mientras se lee el renglón de abajo. */
  animation: tr-acerca 5s ease-out both;
}

/* ── Recortes ──
   Con el fondo transparente y a su tamaño: el más pequeño del guion mide 91
   píxeles de ancho, así que se topa antes de empezar a verse pastoso. */
.tr-figura {
  display: block;
  max-width: 100%; height: auto;
  animation: tr-entra .5s cubic-bezier(.2,.8,.3,1) both;
}
.tr-figura-sola { width: clamp(9rem, 26vw, 15rem); }
/* El halo. Una figura recortada sobre el oscuro se queda flotando sin peso;
   esto le pone suelo sin dibujarle una caja alrededor. */
.tr-halo {
  flex: 0 1 auto; min-height: 0;
  display: grid; place-items: center;
  padding: clamp(1rem, 4vw, 2.5rem);
  background: radial-gradient(closest-side, rgba(230, 185, 63, .22), transparent 72%);
}

.tr-fila {
  flex: 0 1 auto; min-height: 0;
  display: flex; gap: clamp(.6rem, 3vw, 2rem);
  flex-wrap: wrap; justify-content: center; align-items: flex-end;
}
.tr-pieza { margin: 0; display: flex; flex-direction: column; align-items: center; gap: .4rem; }
.tr-pieza .tr-figura { width: clamp(4.5rem, 13vw, 8rem); }
.tr-pieza figcaption {
  font-size: var(--t-xs); color: rgba(247, 234, 210, .8);
  max-width: 7rem; line-height: 1.3;
}
/* Los cinco rangos van en escalera: la medalla de leyenda, la última, se mira
   por encima de las otras cuatro. Es la promesa de la escena. */
.tr-fila-rangos .tr-pieza:nth-child(2) { transform: translateY(-.5rem); }
.tr-fila-rangos .tr-pieza:nth-child(3) { transform: translateY(-1rem); }
.tr-fila-rangos .tr-pieza:nth-child(4) { transform: translateY(-1.5rem); }
.tr-fila-rangos .tr-pieza:nth-child(5) { transform: translateY(-2rem); }
.tr-fila-rangos .tr-pieza:nth-child(5) .tr-figura { width: clamp(5.5rem, 16vw, 9.5rem); }
.tr-fila .tr-pieza:nth-child(2) .tr-figura { animation-delay: .1s; }
.tr-fila .tr-pieza:nth-child(3) .tr-figura { animation-delay: .2s; }
.tr-fila .tr-pieza:nth-child(4) .tr-figura { animation-delay: .3s; }
.tr-fila .tr-pieza:nth-child(5) .tr-figura { animation-delay: .4s; }

/* En un móvil los cinco rangos no caben en una fila, y la escalera con las
   piezas partidas en dos renglones deja cada rótulo encima de la medalla de
   arriba. Ahí se quita el escalonado y se reparten de tres en tres, todas del
   mismo ancho y alineadas por arriba: dos renglones ordenados se leen; uno
   desordenado, no. */
@media (max-width: 34rem) {
  .tr-fila { align-items: flex-start; gap: var(--s-3) var(--s-2); }
  .tr-fila-rangos .tr-pieza { transform: none; width: 30%; }
  .tr-fila-rangos .tr-pieza .tr-figura,
  .tr-fila-rangos .tr-pieza:nth-child(5) .tr-figura { width: 100%; max-width: 5.5rem; }
  .tr-pieza figcaption { max-width: none; }
}

.tr-titulo {
  font-family: var(--font-display); font-weight: 400;
  font-size: clamp(1.5rem, 5vw, 2.6rem); line-height: 1.15;
  color: var(--brass-light);
  margin: 0; flex-shrink: 0;
  animation: tr-entra .45s cubic-bezier(.2,.8,.3,1) .1s both;
}
.tr-texto {
  font-size: clamp(1rem, 2.4vw, 1.3rem); line-height: 1.5;
  max-width: 44rem; margin: 0; flex-shrink: 0;
  color: #f7ead2;
  animation: tr-entra .45s cubic-bezier(.2,.8,.3,1) .22s both;
}
/* La escena de Vera. El rojo no es decorativo: es la única del guion que
   presenta un problema, y tiene que notarse sin leerla. */
.tr-peligro .tr-titulo { color: #f0a58a; }
.tr-peligro .tr-halo { background: radial-gradient(closest-side, rgba(200, 90, 60, .26), transparent 72%); }

.tr-cierre { gap: var(--s-4); }
.tr-crest {
  display: grid; place-items: center;
  width: 6.5rem; height: 6.5rem; border-radius: 50%;
  font-size: 1.5rem;
  background: var(--brass-tint); color: var(--leather-dark);
  box-shadow: 0 6px 24px rgba(0,0,0,.45);
  animation: tr-entra .5s cubic-bezier(.2,.8,.3,1) both;
}
.tr-empezar { font-size: var(--t-lg); padding: .85rem 1.6rem; flex-shrink: 0; }

.tr-mandos {
  display: flex; gap: var(--s-2); justify-content: center;
  padding: var(--s-3) 0; flex-shrink: 0;
}

@keyframes tr-acerca { from { transform: scale(1); } to { transform: scale(1.07); } }
@keyframes tr-entra { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

/* Quien pide menos movimiento se queda con el tráiler entero: las escenas
   siguen pasando —eso es tiempo, no movimiento— pero nada se acerca ni entra
   deslizándose. */
@media (prefers-reduced-motion: reduce) {
  .tr-escenario, .tr-figura, .tr-titulo, .tr-texto, .tr-crest { animation: none; }
  .tr-fila-rangos .tr-pieza { transform: none; }
  .home-trailer:hover { transform: none; }
}
