
:root {
  --hbl-b:"02b59ba6ccb896ae3b";
  --bg:        #b8c8d8;
  --bg2:       #a8bccf;
  --glass:     rgba(255,255,255,0.18);
  --glass-md:  rgba(255,255,255,0.28);
  --glass-hi:  rgba(255,255,255,0.42);
  --border:    rgba(255,255,255,0.35);
  --border-lo: rgba(255,255,255,0.18);
  --shadow:    rgba(40,55,80,0.18);
  --shadow-hi: rgba(40,55,80,0.32);
  --text:      #1a2233;
  --text2:     #3a4a62;
  --text3:     rgba(26,34,51,0.5);
  --white:     #ffffff;
  --accent:    #3a7bff;
  --accent2:   #34c47c;
  --danger:    #ff4d5e;
  --accent-rgb:  58,123,255;
  --accent2-rgb: 52,196,124;
  --danger-rgb:  255,77,94;
  --r:         18px;
  --r-sm:      10px;
  --r-xs:      7px;
  --r-md:      12px;
  --r-lg:      14px;
  --r-xl:      22px;
  --r-pill:    99px;
  --font:      'DM Sans';
  --font-size-base: 15px;
  --button-radius: 99px;
  --button-fill: rgba(255,255,255,0.35);
  --button-border: rgba(255,255,255,0.6);
  --button-shadow: rgba(26,34,51,0.08);
  --button-shadow-blur: 12px;
  --button-shadow-y: 2px;
  --pills-col-width: 225px;
  --pills-col-height-offset: 120px;
  --pills-col-gap: 20px;
  --pills-col-padding-top: 68px;
  --pills-col-padding-x: 8px;
  --pills-col-padding-bottom: 40px;
  --pills-fade-top: 64px;
  --pills-fade-bottom: 56px;
  --pill-fill: rgba(214,221,230,0.48);
  --pill-hover-fill: rgba(214,221,230,0.58);
  --pill-text: #ffffff;
  --pill-radius: 20px;
  --pill-pad-y: 18px;
  --pill-pad-x: 24px;
  --pill-font-size: 21px;
  --pill-line-height: 1.22;
  --pill-blur: 20px;
  --pill-saturate: 140%;
  --pill-inset-blur: 26px;
  --pill-inset-opacity: 0.3;
  --pill-inset-bottom-y: 3px;
  --pill-inset-bottom-blur: 9px;
  --pill-inset-bottom-opacity: 0.16;
  --pill-shadow-y: 4px;
  --pill-shadow-blur: 10px;
  --pill-shadow-opacity: 0.1;
  --pill-shadow-hover-opacity: 0.18;
  --pill-hover-lift: 2px;
  --topic-card-radius: 22px;
  --topic-card-fill: rgba(255,255,255,0.25);
  --topic-card-border: rgba(255,255,255,0.5);
  --topic-card-shadow-y: 4px;
  --topic-card-shadow-blur: 24px;
  --topic-card-shadow-opacity: 0.1;
  --exercise-radius: 20px;
  --exercise-fill: rgba(255,255,255,0.32);
  --exercise-border: rgba(255,255,255,0.55);
  --exercise-blur: 24px;
  --exercise-shadow-y: 4px;
  --exercise-shadow-blur: 20px;
  --exercise-shadow-opacity: 0.08;
  --chip-radius: 99px;
  --chip-fill: rgba(255,255,255,0.82);
  --chip-border: rgba(255,255,255,0.7);
  --chip-shadow-blur: 8px;
  --chip-shadow-y: 2px;
  --chip-shadow-opacity: 0.07;
  --chip-font-size: 13px;
  --slot-radius: 99px;
  --slot-fill: rgba(235,240,248,0.72);
  --slot-filled-fill: rgba(240,244,251,0.88);
  --slot-border: rgba(255,255,255,0.7);
  --slot-height: 34px;
  --slot-min-width: 90px;
  --slot-shadow-blur: 4px;
  --slot-shadow-y: 1px;
  --slot-shadow-opacity: 0.06;
  --button-font-size: 15px;
  --button-text: #1a2233;
  --button-blur: 16px;
  --button-saturate: 100%;
  --button-inset-blur: 0px;
  --button-inset-opacity: 0;
  --button-inset-bottom-y: 0px;
  --button-inset-bottom-blur: 0px;
  --button-inset-bottom-opacity: 0;
  --button-hover-fill: rgba(255,255,255,0.42);
  --button-hover-lift: 1px;
  --tab-bar-fill: rgba(255,255,255,0.12);
  --tab-bar-blur: 16px;
  --tab-bar-border: rgba(26,34,51,0.08);
  --tab-bar-radius: 0px;
  --tab-bar-shadow-blur: 0px;
  --tab-bar-shadow-y: 0px;
  --tab-bar-shadow-opacity: 0;
  --tab-bar-font-size: 13px;
  --tab-bar-padding-y: 12px;
  --tab-bar-padding-x: 20px;
  --notebook-width: 290px;
  --notebook-radius: 26px;
  --notebook-fill: rgba(214,221,230,0.48);
  --notebook-blur: 36px;
  --notebook-saturate: 80%;
  --notebook-inset-blur: 40px;
  --notebook-inset-opacity: 0.26;
  --notebook-inset-bottom-y: 4px;
  --notebook-inset-bottom-blur: 14px;
  --notebook-inset-bottom-opacity: 0.14;
  --notebook-border: rgba(255,255,255,0);
  --notebook-shadow-y: 10px;
  --notebook-shadow-blur: 30px;
  --notebook-shadow-opacity: 0.12;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
html, body { height: 100%; height: 100dvh; overflow: hidden; }
body {
  font-family: var(--font), sans-serif;
  font-size: var(--font-size-base);
  background: var(--bg);
  color: var(--text);
  background-image:
    radial-gradient(ellipse 80% 60% at 20% 10%, rgba(180,200,230,0.7) 0%, transparent 60%),
    radial-gradient(ellipse 60% 80% at 80% 80%, rgba(140,165,210,0.5) 0%, transparent 55%),
    radial-gradient(ellipse 40% 40% at 60% 20%, rgba(200,215,240,0.4) 0%, transparent 50%);
}
body::before {
  content:''; position:fixed; inset:0; pointer-events:none; z-index:0;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
}

/* ── LA ENTRADA: entrar y crear cuenta ───────────────────────────────
   Reescrita desde cero el 04/09/2026, cuando la plataforma dejó de ser
   de un solo profesor. Antes era una tarjeta de cristal centrada, de
   otra época: etiquetas en mayúsculas diminutas, cajas con borde y un
   botón oscuro de píldora. Nada de eso existe en el resto de la app.

   Ahora es la MISMA pieza que "Nueva sección" y que el inicio: el
   degradado a sangre, la marca en grande con su sombra, la nav de la
   cápsula metálica que viaja, y los campos invisibles -sin caja, sin
   borde, sin fondo- donde lo único que dice "aquí se escribe" es el
   texto de ayuda y el cursor.

   La escala DIBUJA el árbol, igual que en "clases" (140 → 60 → 40):
       Hablamos                     140  ← dónde estoy
       entrar · crear cuenta         60  ← qué vengo a hacer
       soy profesor · soy alumno     40  ← de qué tipo soy
   ──────────────────────────────────────────────────────────────────── */
#screen-login {
  position:fixed; inset:0; z-index:900; overflow-y:auto;
  background:var(--dc-bg);
}
#screen-login.hidden { display:none; }
.ent-cuerpo {
  min-height:100vh; min-height:100dvh;
  display:flex; flex-direction:column; align-items:flex-start; justify-content:flex-start;
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:calc(14vh) var(--dc-sp-76) var(--dc-sp-60);
  text-align:left;
}
/* La marca lleva sombra SIEMPRE, no sólo al acercarse: aquí no dice
   "esto se pulsa" (no se pulsa), dice "estás en Hablamos". */
.ent-marca {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-140);
  color:var(--dc-ink); line-height:1; letter-spacing:var(--dc-tracking);
  text-shadow:var(--dc-shadow-text-strong);
  user-select:none;
}
/* ── "club" ───────────────────────────────────────────────────────────
   La escuela se llama Hablamos club, así que la marca lo dice. Pero NO en
   el mismo cuerpo: "Hablamosclub" a 140 se comería la pantalla en un móvil
   y dejaría de leerse como un nombre. La misma regla que gobierna el resto
   de la plataforma -la escala dibuja el árbol- resuelve esto: "Hablamos"
   manda y "club" va detrás, a poco más de un tercio, sentado en la misma
   línea de base. Se lee como un logotipo, no como una palabra larga.
   Va en `em`, así que funciona igual en la puerta (140), en la esquina del
   alumno (100), en la marca de las pantallas flotantes (30) y en la
   pizarra, sin una regla por sitio. */
.marca-club {
  font-size:.38em; margin-left:.16em; letter-spacing:var(--dc-tracking);
  opacity:.78; font-weight:inherit; vertical-align:baseline;
}
/* La nav: la misma cápsula metálica que viaja en el inicio y en el aula.
   Una sola pieza para todas las navegaciones del sistema. */
#screen-login .ent-tabs {
  position:relative; display:flex; justify-content:flex-start; gap:var(--dc-sp-14);
  padding:var(--dc-sp-40) 0 var(--dc-sp-24); width:auto;
  border:none; background:none; backdrop-filter:none; overflow:visible;
  /* La cápsula tiene relleno propio a los lados; sin este tirón hacia la
     izquierda, "entrar" no cae bajo la H de Hablamos sino un dedo a su
     derecha, y las dos filas dejan de compartir el eje. */
  margin-left:calc(-1 * var(--dc-sp-40));
}
#screen-login .ent-tabs .aula-tab {
  font-family:var(--dc-font); font-size:var(--dc-fs-60); font-weight:var(--dc-weight);
  letter-spacing:normal; line-height:1.25; text-transform:lowercase;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--dc-ink); background:none; border:none; box-shadow:none;
  padding:var(--dc-sp-10) var(--dc-sp-40); border-radius:var(--dc-r-nav);
  cursor:pointer; position:relative; z-index:1;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
#screen-login .ent-tabs .aula-tab::after { display:none !important; }
#screen-login .ent-tabs .aula-tab.active { background:none; box-shadow:none; color:var(--dc-ink); }
#screen-login .ent-tabs .aula-tab.crecida { transform:scale(1.12); }
#screen-login .aula-tab-indicator {
  position:absolute; left:0; z-index:0; pointer-events:none;
  border-radius:var(--dc-r-nav);
  background:var(--dc-pill-metal); box-shadow:var(--dc-shadow-pill-metal);
  transform:translateX(var(--x, 0)) scale(var(--s, 1));
  transition:transform var(--dc-t-viaje) var(--dc-ease), width var(--dc-t-viaje) var(--dc-ease);
  will-change:transform, width;
}
/* La segunda elección (profesor · alumno) YA NO ES OTRA PÍLDORA (Rolando,
   04/09: "pasa lo mismo de que surgen varias filas de píldora para
   elegir"). En toda la plataforma manda una sola fila de cápsula por
   pantalla; lo que cuelga de ella son OPCIONES: texto suelto, más pequeño,
   donde lo elegido se queda encendido y lo demás se apaga. Misma pieza que
   las opciones de "clases" y las de Ajustes. */
#screen-login .ent-roles {
  display:flex; gap:var(--dc-sp-48); padding:0 0 var(--dc-sp-16);
}
.ent-op {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-40);
  color:var(--dc-ink); letter-spacing:var(--dc-tracking); line-height:1.2;
  background:none; border:none; padding:var(--dc-sp-8) 0; cursor:pointer;
  text-transform:lowercase; opacity:.45; transform-origin:left center;
  transition:opacity var(--dc-t-lento) var(--dc-ease), transform var(--dc-t-lento) var(--dc-ease),
             text-shadow var(--dc-t-lento) var(--dc-ease);
  text-shadow:none;
}
.ent-op.active { opacity:1; text-shadow:var(--dc-shadow-text-strong); }
@media (any-hover: hover) { .ent-op:hover { opacity:1; transform:scale(1.06); } }
.ent-op:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }

/* La caja que aguanta a los dos paneles. `position:relative` no es un
   detalle: el panel que se va se pone en absoluto (`.dc-sale`) y tiene que
   quedarse EXACTAMENTE donde estaba, encima del que llega, no volar a la
   esquina de la pantalla. `min-height` evita que el fondo dé un tirón
   cuando el panel corto (entrar) releva al largo (crear cuenta). */
.ent-panels { position:relative; width:100%; min-height:calc(560 * var(--dc-u)); }
/* SIN `position:relative` aquí, a propósito: `#screen-login .ent-panel` tiene
   más peso que `.dc-sale` (un id contra una clase), así que un `relative`
   puesto aquí GANABA y el panel que se va se quedaba en el flujo - seguía
   ocupando su sitio 340 ms y luego desaparecía de golpe, empujando todo lo de
   debajo. Se veía como "las dos pantallas una debajo de otra y luego un
   salto", que es justo lo que Rolando notó. Quien coloca el panel saliente es
   `.ent-panels`. */
#screen-login .ent-panel { width:100%; display:flex; flex-direction:column; align-items:flex-start; }
/* El código del profesor no desaparece de golpe ni deja un hueco: se cierra
   como una persiana -altura, aire y nitidez a la vez- y lo de abajo sube
   con él. Antes salía del flujo de una vez y el botón "crear cuenta" daba
   un salto seco (Rolando: "los cambios de pantalla en el login deben ser
   súper suaves"). */
/* El código del profesor usa la PERSIANA genérica (ver más abajo): se cierra
   como una fila que se pliega y el botón de debajo sube con ella. */
#reg-codigo { max-height:calc(140 * var(--dc-u)); }
/* Los campos son invisibles de verdad -sin caja, sin borde, sin fondo-,
   igual que la línea de "Nueva sección". Lo que separa uno de otro es el
   aire, no una raya. SIN text-shadow: en un <input> el navegador la pinta
   como una banda rectangular detrás de toda la línea, no como un halo. */
/* El ancho baja de 900 a 560 y el texto va a la IZQUIERDA (Rolando, 04/09):
   una caja de 900 con el texto centrado deja el borde real del campo muy
   lejos de donde se escribe, y el navegador ancla ahí el desplegable de
   "rellenar contraseña" - salía a un palmo a la izquierda de la palabra que
   estabas escribiendo. Alineado a la izquierda, el desplegable cae justo
   debajo de la primera letra, que es donde se le espera. */
.ent-campo {
  width:100%; max-width:calc(560 * var(--dc-u));
  margin-top:var(--dc-sp-18);
  -webkit-appearance:none; appearance:none;
  background:transparent !important; background-image:none; box-shadow:none;
  border:none; outline:none; padding:var(--dc-sp-8) 0;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-50);
  color:var(--dc-ink); caret-color:var(--dc-ink); text-align:left;
}
.ent-campo::placeholder { color:var(--dc-ink-70); text-shadow:none; }
.ent-campo:-webkit-autofill,
.ent-campo:-webkit-autofill:hover,
.ent-campo:-webkit-autofill:focus {
  -webkit-text-fill-color:var(--dc-ink);
  -webkit-box-shadow:0 0 0 1000px transparent inset;
  transition:background-color 9999s ease-in-out 0s;
}
/* El código del profesor se escribe en mayúsculas, siempre - pero eso vale
   para lo que se ESCRIBE, no para el texto de ayuda: en mayúsculas y con
   letras separadas, "el código de tu profesor" parecía un cartel gritando. */
#reg-codigo { text-transform:uppercase; letter-spacing:calc(6 * var(--dc-u)); }
#reg-codigo::placeholder { text-transform:none; letter-spacing:normal; }
/* La acción pierde la píldora: es texto suelto con mucha sombra difuminada
   debajo, como "Restablecer contraseña" en el perfil del alumno. */
.ent-accion {
  margin-top:var(--dc-sp-48); align-self:flex-start; transform-origin:left center;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-60);
  color:var(--dc-ink); letter-spacing:var(--dc-tracking); line-height:1;
  background:none; border:none; box-shadow:none;
  /* Sin relleno a la izquierda: la acción tiene que arrancar en la misma
     línea vertical que los campos y que la marca. Con el relleno de antes
     quedaba un dedo más adentro que todo lo demás. */
  padding:var(--dc-sp-10) var(--dc-sp-24) var(--dc-sp-10) 0;
  cursor:pointer; text-transform:lowercase;
  text-shadow:var(--dc-shadow-text-strong);
  transition:transform var(--dc-t-lento) var(--dc-ease), opacity var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { .ent-accion:hover { transform:scale(1.09); } }
.ent-accion:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }
.ent-accion:disabled { opacity:.5; cursor:default; transform:none; }
/* Una segunda acción en la misma columna: la que casi nunca se pulsa va más
   apagada, para que "copiar" siga siendo la que salta a la vista. */
.ent-accion-suave { opacity:.5; font-size:var(--dc-fs-30); }
@media (any-hover: hover) { .ent-accion-suave:hover { opacity:1; } }
.ent-ayuda {
  margin-top:var(--dc-sp-24); max-width:calc(900 * var(--dc-u));
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink-70); line-height:1.35;
}
.ent-pie { margin-top:var(--dc-sp-34); }
.ent-pie a {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); color:var(--dc-ink-70);
  cursor:pointer; text-decoration:none;
  transition:color var(--dc-t-lento) var(--dc-ease);
}
.ent-pie a:hover { color:var(--dc-ink); }
/* El error no grita: es una línea más, del mismo tamaño que la ayuda, sólo
   que con el calor justo para que se vea que algo no fue bien. */
.ent-error {
  display:none; margin-top:var(--dc-sp-24);
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:#ffdde0; text-shadow:var(--dc-shadow-text);
}
@media (max-width:700px) {
  .ent-marca { font-size:var(--dc-fs-80); }
  #screen-login .ent-tabs { flex-wrap:wrap; row-gap:var(--dc-sp-8); }
  #screen-login .ent-roles { gap:var(--dc-sp-24); }
  #screen-login .ent-tabs .aula-tab { font-size:var(--dc-fs-40); padding:var(--dc-sp-8) var(--dc-sp-20); }
  .ent-campo { font-size:var(--dc-fs-40); }
  .ent-accion { font-size:var(--dc-fs-50); }
}
.login-error {
  background:rgba(var(--danger-rgb),0.1); border:1px solid rgba(var(--danger-rgb),0.3);
  color:var(--danger); border-radius:var(--r-sm); padding:10px 14px;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:15px; font-weight:400; letter-spacing:.3px; margin-bottom:14px; display:none;
}

/* ── APP SHELL ── */
#app { position:relative; z-index:1; height:100vh; height:100dvh; overflow:hidden; display:flex; flex-direction:column; width:100%; transition:width .4s cubic-bezier(.25,.1,.25,1); }
.topbar {
  display:grid; grid-template-columns:1fr auto 1fr;
  align-items:center; padding:22px 24px 14px; flex-shrink:0;
}
.topbar-left { display:flex; gap:8px; align-items:center; min-width:0; }
.topbar-right { display:flex; gap:8px; align-items:center; justify-content:flex-end; min-width:0; }
.topbar-logo-pill {
  display:flex; align-items:center; justify-content:center;
  padding:10px 26px; border-radius:var(--button-radius);
  background:var(--button-fill); backdrop-filter:blur(24px);
  border:1px solid var(--button-border);
  box-shadow:0 var(--button-shadow-y) var(--button-shadow-blur) var(--button-shadow);
  cursor:default;
}
.topbar-logo-text {
  font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:16px; font-weight:400; letter-spacing:.8px;
  color:var(--text);
}
.tb-btn {
  width:36px; height:36px; border-radius:min(var(--button-radius), 12px); border:1px solid var(--button-border); cursor:pointer;
  background:var(--button-fill); backdrop-filter:blur(var(--button-blur)) saturate(var(--button-saturate));
  display:flex; align-items:center; justify-content:center;
  font-size:16px; color:var(--button-text);
  transition:transform .15s cubic-bezier(.34,1.56,.64,1), background .15s;
  box-shadow:
    inset 0 0 var(--button-inset-blur) rgba(16,22,34,var(--button-inset-opacity)),
    inset 0 calc(-1 * var(--button-inset-bottom-y)) var(--button-inset-bottom-blur) rgba(16,22,34,var(--button-inset-bottom-opacity)),
    0 var(--button-shadow-y) var(--button-shadow-blur) var(--button-shadow);
}
.tb-btn:hover { background:var(--button-hover-fill); transform:scale(1.07) translateY(calc(-1 * var(--button-hover-lift))); }
.tb-btn:active { transform:scale(.91); }
.tb-btn.danger:hover { background:rgba(var(--danger-rgb),0.12); color:var(--danger); }

/* Cambio de pantalla: nunca un corte. Entra desenfocada y se asienta, con
   la misma curva y duración que el resto del sistema (--dc-ease / --dc-t-*).
   El filter no añade problemas de "containing block": el transform de aquí
   ya creaba uno. */
.screen {
  position:absolute; inset:0; flex:1; flex-direction:column; overflow:hidden;
  opacity:0; pointer-events:none; transform:translateY(10px); filter:blur(8px);
  /* La SALIDA es más rápida que la entrada a propósito: mientras la pantalla
     vieja se ve pero ya no responde, un clic parece "no hacer nada". Cuanto
     antes desaparezca, menos ventana hay para ese engaño. */
  transition:opacity var(--dc-t-salida) var(--dc-ease),
             transform var(--dc-t-salida) var(--dc-ease),
             filter var(--dc-t-salida) var(--dc-ease);
  display:flex;
}
html.sin-desenfoque .screen { filter:none; transition:opacity var(--dc-t-salida) var(--dc-ease), transform var(--dc-t-salida) var(--dc-ease); }
.screen.active {
  opacity:1; pointer-events:all; transform:translateY(0); filter:blur(0);
  transition:opacity var(--dc-t-entrada) var(--dc-ease),
             transform var(--dc-t-entrada) var(--dc-ease),
             filter var(--dc-t-entrada) var(--dc-ease);
}
html.sin-desenfoque .screen.active { filter:none; }
/* La pantalla que NO está activa no toca a nadie - ni ella ni nada de dentro.
   `pointer-events` se hereda, pero un descendiente puede volver a encenderlo,
   y entonces una pantalla invisible sigue robando clics a la de delante. Pasaba
   de verdad: el carrusel de clases marca cada ficha visible con
   `style.pointerEvents='auto'` (para poder tocar las de atrás), así que al
   salir del alumno esas fichas -invisibles, en la pantalla de al lado- se
   quedaban encima de la lista de nombres. De ahí el "el hover falla y hago
   clic y no pasa nada" (Rolando, 02/09). Con !important ganamos también a los
   estilos en línea. */
.screen:not(.active), .screen:not(.active) * { pointer-events:none !important; }
@media (prefers-reduced-motion:reduce) { .screen { transition:opacity .2s linear; filter:none; transform:none; } }
.scroll { flex:1; overflow-y:auto; -webkit-overflow-scrolling:touch; padding:0 20px 100px; }
@media (min-width:600px) { .scroll { padding:0 32px 100px; } }
@media (min-width:900px) { .scroll { padding:0 48px 100px; } }
@media (max-width:480px) {
  .topbar { padding:20px 14px 12px; gap:6px; }
  .topbar-logo-pill { padding:9px 16px; }
  .topbar-logo-text { font-size:14px; letter-spacing:.4px; }
}
.scroll::-webkit-scrollbar { display:none; }

/* ── SECTION CHIPS ── */
.section-chips {
  display:flex; align-items:baseline; justify-content:center;
  gap:0; padding:6px 24px 20px; overflow-x:auto; flex-shrink:0;
  position:relative;
}
.section-chips::before {
  content:''; position:absolute; bottom:20px; left:50%; transform:translateX(-50%);
  width:calc(100% - 48px); height:1px; background:rgba(26,34,51,0.08);
}
.section-chips::-webkit-scrollbar { display:none; }
.chip {
  white-space:nowrap; padding:4px 20px 10px; border-radius:0;
  font-size:14px; font-weight:500; color:rgba(26,34,51,0.45);
  background:transparent; border:none; cursor:pointer;
  transition:all .38s cubic-bezier(.25,.1,.25,1);
  position:relative; flex-shrink:0;
  font-family:'DM Sans',sans-serif;
}
.chip::after {
  content:''; position:absolute; bottom:0; left:50%; transform:translateX(-50%);
  width:0; height:2px; background:var(--text); border-radius:var(--r-pill);
  transition:width .28s cubic-bezier(.34,1.2,.64,1);
}
.chip.active {
  font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:22px; font-weight:400; color:var(--text); letter-spacing:.3px;
  padding-bottom:10px;
}
.chip.active::after { width:100%; }
.chip:hover:not(.active) { color:rgba(26,34,51,0.7); }
.chip-add {
  color:var(--text3); font-size:20px; padding:4px 16px 10px;
  font-family:'DM Sans',sans-serif; font-weight:400;
}
.sec-label { font-size:11px; font-weight:700; letter-spacing:1.2px; text-transform:uppercase; color:var(--text3); margin: 18px 0 10px; }
.subsec-row { display:flex; gap:8px; overflow-x:auto; overflow-y:hidden; margin:-8px -16px 12px; padding:8px 16px 18px; }
.subsec-row::-webkit-scrollbar { display:none; }
.subsec-pill {
  flex-shrink:0; padding:8px 18px; border-radius:var(--r-pill); font-size:13px; font-weight:600;
  background:rgba(255,255,255,0.35); border:1px solid rgba(255,255,255,0.5);
  cursor:pointer; transition:all .22s cubic-bezier(.34,1.2,.64,1);
  backdrop-filter:blur(20px); position:relative; color:var(--text2);
  box-shadow:0 1px 4px rgba(26,34,51,0.06);
}
.subsec-pill:hover { background:rgba(255,255,255,0.55); }
.subsec-pill.active { background:var(--text); color:#fff; border-color:transparent; box-shadow:0 4px 14px rgba(26,34,51,0.2); }
.subsec-add { color:var(--text3); font-size:20px; padding:8px 12px; }
.subsec-ctx-btn {
  display:none; position:absolute; top:-5px; right:-5px; width:17px; height:17px;
  border-radius:50%; background:rgba(26,34,51,0.6); border:none; cursor:pointer;
  color:#fff; font-size:9px; align-items:center; justify-content:center; z-index:5; line-height:1;
}
.subsec-pill:hover .subsec-ctx-btn { display:flex; }
.subsec-ctx-menu {
  position:fixed; z-index:999; background:rgba(255,255,255,0.95); backdrop-filter:blur(20px);
  border:1px solid var(--border); border-radius:var(--r-md); box-shadow:0 8px 32px var(--shadow-hi);
  overflow:hidden; min-width:148px;
}
.subsec-ctx-item { padding:10px 15px; font-size:13px; font-weight:500; cursor:pointer; display:flex; align-items:center; gap:8px; color:var(--text); transition:background .12s; }
.subsec-ctx-item:hover { background:rgba(var(--accent-rgb),0.08); }
.subsec-ctx-item.danger { color:var(--danger); }
.subsec-ctx-item.danger:hover { background:rgba(var(--danger-rgb),0.08); }

/* ── TOPIC GRID ── */
.topic-grid {
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:14px;
}
@media (min-width:600px) {
  .topic-grid { grid-template-columns:repeat(3,minmax(0,1fr)); gap:20px; }
}
@media (min-width:900px) {
  .topic-grid { grid-template-columns:repeat(3,minmax(0,1fr)); gap:24px; }
}

.topic-card {
  border-radius:var(--topic-card-radius); cursor:pointer; position:relative;
  aspect-ratio:4/3; background:var(--topic-card-fill);
  border:1px solid var(--topic-card-border);
  box-shadow:0 var(--topic-card-shadow-y) var(--topic-card-shadow-blur) rgba(26,34,51,var(--topic-card-shadow-opacity));
  display:flex; flex-direction:column;
  transition:transform .42s cubic-bezier(.25,.1,.25,1), box-shadow .38s;
}
/* Hover shadow derived from the theme's OWN resting shadow (blur/y/opacity),
   just amplified for the lift - so it keeps the same character and can never end
   up weaker than the resting shadow (which is what made it look like the shadow
   "disappeared" when a theme defined a strong resting shadow). */
.topic-card:hover { transform:translateY(-6px) scale(1.015); box-shadow:0 calc(var(--topic-card-shadow-y) + 14px) calc(var(--topic-card-shadow-blur) + 24px) rgba(26,34,51, calc(var(--topic-card-shadow-opacity) + 0.08)); }
.topic-card:active { transform:scale(.97); transition:transform .1s; }

/* ── HOVER-BUFFER: arregla el parpadeo del :hover cerca del borde ──
   Al hacer hover, estos elementos se LEVANTAN (translateY hacia arriba). Su
   borde inferior se retira por encima del cursor → el navegador pierde el
   :hover → el elemento baja → recupera el cursor → vuelve a subir → parpadeo
   ("crashea la animación"). Un ::after transparente extiende el área de hit
   hacia abajo: como el pseudo se transforma junto al elemento, tras subir N px
   su borde inferior vuelve a cubrir la huella original y el :hover nunca se
   pierde. Va detrás del contenido (z-index:-1) para no bloquear clics de los
   botones hijos; solo actúa en la franja extendida, donde no hay nada más. */
.topic-card::after,
.topic-add-card::after,
.w-chip::after,
.back-btn::after,
.otra-clase-btn::after {
  content:''; position:absolute; z-index:-1;
}
/* Buffer inferior = elevación + margen. Como el ::after se transforma junto al
   elemento, su borde inferior absoluto queda SIEMPRE ~5px por debajo del reposo,
   sin importar cuánto suba el hover (aunque el tema lo ponga a 10px). Por eso se
   ata a la MISMA variable que la elevación: si el buffer fuera fijo y la elevación
   lo superara, el :hover se perdería igual y el parpadeo volvería. */
.topic-card::after     { inset:-3px -3px -9px; }
.topic-add-card::after { inset:-3px -3px -6px; }
.w-chip::after         { inset:-2px -2px calc(-1 * var(--chip-hover-lift, 2px) - 5px) -2px; }
.back-btn::after       { inset:-3px -3px calc(-1 * var(--button-hover-lift, 1px) - 5px) -3px; }
.otra-clase-btn::after { inset:-3px -3px calc(-1px - var(--button-hover-lift, 1px) - 5px) -3px; }

/* Title area - top section */
.topic-card-header {
  padding:14px 16px 10px;
  flex-shrink:0; position:relative; z-index:2;
}
.topic-card-title {
  font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:22px; font-weight:400; color:var(--text);
  letter-spacing:.2px; line-height:1.1;
  text-shadow:none;
}
.topic-card-title-small {
  font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:17px; font-weight:400; color:var(--text);
  letter-spacing:.2px; line-height:1.1;
}

/* Image area - bottom section with zoom */
.topic-card-img-wrap {
  flex:1; overflow:hidden; position:relative;
  border-radius:0 0 calc(var(--topic-card-radius) - 2px) calc(var(--topic-card-radius) - 2px);
  margin:0; transform:translateZ(0); backface-visibility:hidden; -webkit-backface-visibility:hidden;
}
.topic-card-img-wrap img {
  /* Overscan by 1px on every side. When the hover-zoom eases from scale(1.07)
     back to scale(1), subpixel rounding of the composited image layer can leave
     a 1px gap at the wrapper edge on low-DPI screens, showing a thin dark seam.
     Making the image slightly larger than the wrapper (clipped by overflow:hidden)
     guarantees full coverage in every frame, so the seam can never appear. */
  width:calc(100% + 2px); height:calc(100% + 2px); margin:-1px;
  object-fit:cover; display:block;
  transition:transform .65s cubic-bezier(.25,.1,.25,1);
  transform-origin:center center;
  backface-visibility:hidden; -webkit-backface-visibility:hidden;
}
.topic-card:hover .topic-card-img-wrap img { transform:scale(1.07); }
/* same seam-hardening for the other hover-zoom images */
.match-card-img, .img-gallery-slide img { backface-visibility:hidden; -webkit-backface-visibility:hidden; }

.topic-card-placeholder {
  width:100%; height:100%; display:flex; align-items:center; justify-content:center;
  font-size:36px; background:rgba(255,255,255,0.15);
  border-radius:0 0 calc(var(--topic-card-radius) - 2px) calc(var(--topic-card-radius) - 2px);
}
.topic-progress-bar {
  position:absolute; bottom:0; left:0; right:0; height:3px;
  background:rgba(255,255,255,0.25); z-index:3;
}
.topic-progress-fill {
  height:100%; background:var(--accent2); border-radius:0 2px 2px 0;
  transition:width .4s cubic-bezier(.34,1.2,.64,1);
}
/* Tema terminado. Antes era un circulo de 24px con un check dentro; Rolando
   (07/09): los checks se ven poco premium. Ahora es un punto: dice lo mismo
   y no grita. */
.topic-done-badge {
  position:absolute; top:12px; right:12px; width:10px; height:10px; border-radius:50%;
  background:var(--accent2); box-shadow:0 2px 6px rgba(var(--accent2-rgb),0.35); z-index:3;
}
/* Completed exercise state */
.ex-wysiwyg.ex-completed { opacity:0.72; }
.ex-completed-banner {
  display:flex; align-items:center; gap:8px; padding:8px 14px;
  background:rgba(var(--accent2-rgb),0.12); border-top:1px solid rgba(var(--accent2-rgb),0.2);
  font-size:12px; font-weight:700; color:var(--accent2);
}
/* Progress in student detail */
.progress-topic-row {
  display:flex; align-items:center; gap:10px; padding:10px 14px;
  background:var(--glass-md); border:1px solid var(--border); border-radius:var(--r-md);
  margin-bottom:8px; backdrop-filter:blur(16px);
}
.progress-topic-name { flex:1; font-size:13px; font-weight:600; }
.progress-topic-bar { width:80px; height:6px; background:rgba(26,34,51,0.1); border-radius:var(--r-pill); overflow:hidden; }
.progress-topic-fill { height:100%; background:var(--accent2); border-radius:var(--r-pill); transition:width .3s; }
.progress-topic-pct { font-size:11px; font-weight:700; color:var(--accent2); min-width:32px; text-align:right; }
.topic-add-card {
  border-radius:var(--r-xl); aspect-ratio:4/3; display:flex; flex-direction:column; position:relative;
  align-items:center; justify-content:center; gap:8px; cursor:pointer;
  border:2px dashed rgba(26,34,51,0.2); background:rgba(255,255,255,0.15);
  transition:all .22s; color:var(--text3);
}
.topic-add-card:hover { background:rgba(255,255,255,0.3); transform:translateY(-3px); }
.topic-add-icon { font-size:24px; }
.topic-add-label { font-size:12px; font-weight:600; letter-spacing:.3px; }

/* ── TOPIC MENU ── */
.topic-menu-btn {
  position:absolute; top:7px; right:7px; z-index:10;
  width:28px; height:28px; border-radius:var(--r-xs); border:none; cursor:pointer;
  background:rgba(0,0,0,0.35); backdrop-filter:blur(8px);
  color:#fff; font-size:16px; display:flex; align-items:center; justify-content:center;
  opacity:0; transition:opacity .18s; line-height:1;
}
.topic-card:hover .topic-menu-btn,
.topic-card:active .topic-menu-btn { opacity:1; }
.topic-ctx-menu {
  position:fixed; z-index:999; background:rgba(255,255,255,0.95); backdrop-filter:blur(20px);
  border:1px solid var(--border); border-radius:var(--r-md); box-shadow:0 8px 32px var(--shadow-hi);
  overflow:hidden; min-width:160px;
}
.topic-ctx-item {
  padding:11px 16px; font-size:14px; font-weight:500; cursor:pointer;
  display:flex; align-items:center; gap:9px; color:var(--text); transition:background .12s;
}
.topic-ctx-item:hover { background:rgba(var(--accent-rgb),0.08); }
.topic-ctx-item.danger { color:var(--danger); }
.topic-ctx-item.danger:hover { background:rgba(var(--danger-rgb),0.08); }

/* ── LESSON ── */
.lesson-header { padding:22px 20px 14px; flex-shrink:0; display:flex; align-items:center; gap:12px; }
.lesson-header-inner { display:flex; align-items:center; gap:12px; width:100%; max-width:720px; margin:0 auto; }
@media (min-width:600px) { .lesson-header { padding:22px 32px 14px; } }
@media (min-width:900px) { .lesson-header { padding:24px 48px 16px; } }
.back-btn {
  height:36px; padding:0 16px; border-radius:var(--button-radius); border:none; cursor:pointer; position:relative;
  background:var(--button-fill); border:1px solid var(--button-border);
  display:flex; align-items:center; justify-content:center; gap:4px;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:var(--button-font-size); letter-spacing:.3px;
  color:var(--button-text); backdrop-filter:blur(var(--button-blur)) saturate(var(--button-saturate)); flex-shrink:0;
  transition:all .38s cubic-bezier(.25,.1,.25,1);
  box-shadow:
    inset 0 0 var(--button-inset-blur) rgba(16,22,34,var(--button-inset-opacity)),
    inset 0 calc(-1 * var(--button-inset-bottom-y)) var(--button-inset-bottom-blur) rgba(16,22,34,var(--button-inset-bottom-opacity)),
    0 var(--button-shadow-y) var(--button-shadow-blur) var(--button-shadow);
}
.back-btn:hover { background:var(--button-hover-fill); transform:translateX(-2px) translateY(calc(-1 * var(--button-hover-lift))); }
.back-btn:active { transform:scale(.93); }
.lesson-title-bar { flex:1; }
.lesson-title-bar h2 { font-family:'Coolvetica','DM Sans',sans-serif; font-size:22px; font-weight:400; letter-spacing:.3px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:300px; }
.lesson-title-bar p { font-size:12px; color:var(--text3); margin-top:2px; font-family:'DM Sans',sans-serif; }

/* ── EXERCISE BLOCKS ── */
.ex-wysiwyg { background:var(--exercise-fill); border:1px solid var(--exercise-border); border-radius:var(--exercise-radius); backdrop-filter:blur(var(--exercise-blur)); margin-bottom:16px; box-shadow:0 var(--exercise-shadow-y) var(--exercise-shadow-blur) rgba(26,34,51,var(--exercise-shadow-opacity)); animation:fadeUp .45s cubic-bezier(.25,.1,.25,1) both; }
/* overflow on body only - lets sticky word-bank escape while keeping rounded card */
.ex-wysiwyg > .ex-top-bar { border-radius:var(--exercise-radius) var(--exercise-radius) 0 0; overflow:hidden; }
@media (min-width:900px) { .ex-wysiwyg { max-width:720px; } }
.ex-wysiwyg-body { padding:16px; }
.ex-top-bar { display:flex; align-items:center; gap:8px; padding:8px 12px; border-bottom:1px solid var(--border-lo); background:rgba(255,255,255,0.12); min-height:36px; }
.ex-type-tag { display:none; }
.ex-actions { margin-left:auto; display:flex; gap:6px; }
.ex-icon-btn { width:28px; height:28px; border-radius:var(--r-xs); border:none; cursor:pointer; background:transparent; display:flex; align-items:center; justify-content:center; font-size:14px; transition:background .15s; }
.ex-icon-btn:hover { background:rgba(26,34,51,0.1); }
.ex-icon-btn.del:hover { background:rgba(var(--danger-rgb),0.12); color:var(--danger); }
.ex-icon-btn:disabled { opacity:.25; cursor:default; pointer-events:none; }
.ex-reorder { display:flex; gap:2px; margin-right:2px; }
.ex-reorder .ex-icon-btn { font-size:15px; color:var(--text2); }
.sv-instruction { font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.3px; color:var(--text2); margin-bottom:14px; text-transform:none; }
.sv-q { font-size:18px; font-weight:700; line-height:1.3; margin-bottom:16px; }
.word-bank {
  display:flex; flex-wrap:wrap; gap:7px; padding:12px;
  background:rgba(255,255,255,0.2); border-radius:var(--r-sm); margin-bottom:14px; min-height:48px;
  position:sticky; top:8px; z-index:30;
  backdrop-filter:blur(20px); -webkit-backdrop-filter:blur(20px);
  background:rgba(220,228,238,0.78);
  box-shadow:0 2px 12px rgba(26,34,51,0.06);
}
.w-chip {
  --chip-hover-lift:2px;
  padding:8px 16px; border-radius:var(--chip-radius); font-size:var(--chip-font-size); font-weight:600; position:relative;
  background:var(--chip-fill); border:1px solid var(--chip-border);
  cursor:pointer;
  transition:background .38s cubic-bezier(.25,.1,.25,1), box-shadow .38s cubic-bezier(.25,.1,.25,1), opacity .3s cubic-bezier(.25,.1,.25,1), color .38s cubic-bezier(.25,.1,.25,1), transform .2s cubic-bezier(.34,1.56,.64,1);
  user-select:none; color:var(--text);
  box-shadow:0 var(--chip-shadow-y) var(--chip-shadow-blur) rgba(26,34,51,var(--chip-shadow-opacity));
}
.w-chip:hover { background:rgba(255,255,255,0.95); transform:translateY(-2px); box-shadow:0 calc(var(--chip-shadow-y) + 4px) calc(var(--chip-shadow-blur) + 8px) rgba(26,34,51, calc(var(--chip-shadow-opacity) + 0.05)); }
.w-chip:active { transform:scale(.94); }
.w-chip.selected { background:var(--text); color:#fff; box-shadow:0 4px 14px rgba(26,34,51,0.25); }
/* used: chip has left the bank (placed in a slot). markChipUsed() blurs the chip
   and forces a reflow before animating, so no stale :hover transform survives -
   that was the Safari crack. */
.w-chip.used {
  opacity:.35; pointer-events:none;
}
/* A settled used chip (not mid-animation) sits at identity transform so a stale
   hover translate can't linger. The :not(.leaving) keeps this from overriding the
   running keyframe. */
.w-chip.used:not(.leaving):not(.removing) { transform:none; }
/* leaving: the live "word just left the list" animation. Applied only on real
   interaction (not on hydration/restore, which would make every used chip flash). */
.w-chip.leaving { animation:chipLeave .26s cubic-bezier(.25,.1,.25,1) both; }
@keyframes chipLeave {
  0%   { opacity:1;   transform:scale(1); }
  100% { opacity:.35; transform:scale(.96); }
}
/* removing: chip returns to bank. Dedicated keyframe; transition excludes transform
   so Safari doesn't fight the running animation. */
.w-chip.removing { transition:background .38s, box-shadow .38s, color .38s; animation:chipReturn .34s cubic-bezier(.25,.1,.25,1) both; }
/* 07/09: la palabra que vuelve al banco CAE en su sitio, perpendicular, desde
   su altura. Antes encogía y rebotaba (0.9 → 1.05 → 1), y ese rebote es lo que
   se leía como un parpadeo. */
@keyframes chipReturn {
  0%   { opacity:0; transform:translateY(-14px); }
  100% { opacity:1; transform:none; }
}

/* ══════════════════════════════════════════════════════════════
   CLASS PILLS (left) + NOTEBOOK (right)
   Flanks the exercises column during a live class. Pills = teacher's
   messages for THIS class/tema, persistent, floating (no box, no
   borders - top/bottom edges fade via mask-image instead of clipping).
   Newest pill lives at the TOP and pushes older ones down. Notebook =
   one global glass notebook per student across the whole course.
   ══════════════════════════════════════════════════════════════ */
.session-layout { display:flex; gap:20px; align-items:flex-start; max-width:1300px; margin:0 auto; }
.session-layout > #exercises-container,
.session-layout > #live-view-content { flex:1; min-width:0; }

.pills-col {
  width:var(--pills-col-width); flex-shrink:0; position:sticky; top:8px;
  height:calc(100vh - var(--pills-col-height-offset)); overflow-y:auto; scrollbar-width:none;
  overscroll-behavior:contain;
  display:flex; flex-direction:column; align-items:center; gap:var(--pills-col-gap);
  padding:var(--pills-col-padding-top) var(--pills-col-padding-x) var(--pills-col-padding-bottom);
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 var(--pills-fade-top), #000 calc(100% - var(--pills-fade-bottom)), transparent 100%);
  mask-image:linear-gradient(to bottom, transparent 0, #000 var(--pills-fade-top), #000 calc(100% - var(--pills-fade-bottom)), transparent 100%);
}
.pills-col::-webkit-scrollbar { display:none; }
/* teacher's column gets a shell: the sticky/size role moves here so the
   compose trigger below can sit OUTSIDE .pills-col's own fade mask -
   nested inside it, the mask was eating the top of the "Escribir" bloom */
.pills-col-shell {
  position:sticky; top:8px; width:var(--pills-col-width); flex-shrink:0;
  height:calc(100vh - var(--pills-col-height-offset));
}
.pills-col-shell .pills-col { position:static; top:auto; width:100%; height:100%; }
.pills-compose-slot { position:absolute; top:0; left:0; right:0; z-index:41; pointer-events:none; }
.pills-compose-slot .pills-compose-trigger { pointer-events:auto; }

/* ── compose trigger - lives at the very top of the teacher's column.
   Idle: fully invisible, no shape, no frame. Hover: a soft radial bloom -
   same muted glass tone as the pills themselves, blurred, fading out in
   EVERY direction (not just top-to-bottom) so there's no straight edge
   anywhere to read as a "box". The word "Escribir" fades in inside it.
   Click: the label is replaced in place by a plain-text input, already
   focused - and the bloom disappears completely (no tint, no blur at
   all) so absolutely nothing sits on top of the text being typed.
   Enter sends; the trigger returns to idle and the new pill blooms in
   below it.
   NOTE on the mask math: the ellipse must be smaller than the box AND
   finish fading to transparent within its OWN radius - if the fade only
   completes at, say, 74% of a 130%-wide ellipse, that's ~96% of the box,
   which still reads as a hard-edged rectangle with only the corners
   softened. Keeping the ellipse itself under 90% of the box and
   completing the fade well inside that guarantees real, fully
   transparent margin at every edge - no rectangle, ever. ── */
/* ── pill composer - a simple, always-legible dark glass bar (not a
   hover-only bloom): background stays dark and translucent in every
   state (idle / hover / typing) so white text always has real contrast.
   Sits in .pills-compose-slot, outside the column's own fade mask. ── */
.pills-compose-trigger {
  position:relative; z-index:40; flex-shrink:0;
  margin:0 4px 14px; padding:13px 20px;
  border-radius:var(--r-pill);
  display:flex; align-items:center; justify-content:center; cursor:text;
  background:rgba(16,22,34,0.22);
  -webkit-backdrop-filter:blur(18px) saturate(140%); backdrop-filter:blur(18px) saturate(140%);
  box-shadow:0 4px 14px rgba(16,22,34,0.14), inset 0 1px 0 rgba(255,255,255,0.08);
  transition:background .3s cubic-bezier(.25,.1,.25,1), box-shadow .3s cubic-bezier(.25,.1,.25,1);
}
.pills-compose-trigger:hover, .pills-compose-trigger.design-pinned {
  background:rgba(16,22,34,0.3);
  box-shadow:0 6px 18px rgba(16,22,34,0.18), inset 0 1px 0 rgba(255,255,255,0.1);
}
.pills-compose-trigger.active {
  background:rgba(16,22,34,0.34);
  box-shadow:0 4px 14px rgba(16,22,34,0.2), inset 0 1px 0 rgba(255,255,255,0.1), 0 0 0 2px rgba(var(--accent-rgb),0.35);
}
.pills-compose-trigger input {
  width:100%; border:none; outline:none; background:transparent; text-align:center;
  font-family:'DM Sans',sans-serif; font-size:14px; font-weight:600; color:#fff;
}
.pills-compose-trigger input::placeholder { color:rgba(255,255,255,0.6); font-weight:500; }

.class-pill {
  position:relative;
  padding:var(--pill-pad-y) var(--pill-pad-x); border-radius:var(--pill-radius);
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400; letter-spacing:.2px;
  font-size:var(--pill-font-size); line-height:var(--pill-line-height); color:var(--pill-text);
  /* same glass tone as the "Mis Notas" panel (#D6DDE6), no border at all -
     depth comes purely from translucency + an inner shadow (the Keynote
     "glass shape" recipe: fill opacity + inset shadow, no stroke), which
     is also what keeps white Coolvetica text readable anywhere on the
     pill instead of only near a hard edge. */
  background:var(--pill-fill);
  backdrop-filter:blur(var(--pill-blur)) saturate(var(--pill-saturate)); -webkit-backdrop-filter:blur(var(--pill-blur)) saturate(var(--pill-saturate));
  box-shadow:
    inset 0 0 var(--pill-inset-blur) rgba(16,22,34,var(--pill-inset-opacity)),
    inset 0 calc(-1 * var(--pill-inset-bottom-y)) var(--pill-inset-bottom-blur) rgba(16,22,34,var(--pill-inset-bottom-opacity)),
    0 var(--pill-shadow-y) var(--pill-shadow-blur) rgba(26,34,51,var(--pill-shadow-opacity));
  /* forces its own compositing layer - this is what actually kills the
     faint "cut" shadow at the rounded corners: backdrop-filter + a
     rounded box-shadow on the same element can leave a thin seam of
     mis-composited pixels right at the corner curve in Chromium/WebKit;
     isolating the layer stops it bleeding into neighboring pills */
  isolation:isolate;
  max-width:100%; word-break:break-word; text-align:center; cursor:default;
}
/* small delete affordance - only rendered for the teacher's own pills;
   invisible until the pill is hovered so the column stays clean */
.pill-del {
  position:absolute; top:-7px; right:-7px; width:22px; height:22px; border-radius:50%;
  background:rgba(18,22,32,0.82); color:#fff; font-size:13px; line-height:22px; text-align:center;
  opacity:0; transform:scale(.7); cursor:pointer; z-index:3;
  transition:opacity .25s cubic-bezier(.16,1,.3,1), transform .25s cubic-bezier(.16,1,.3,1), background .2s;
}
.class-pill:hover .pill-del { opacity:1; transform:scale(1); }
.pill-del:hover { background:rgba(190,60,60,0.9); }
/* hover lifts smoothly; the PRESS itself gets its own fast, dedicated
   transition (separate from hover's) so it reads as an actual "click"
   the instant you press down, same as every other button in the app */
.class-pill.clickable { cursor:pointer; transition:transform .3s cubic-bezier(.25,.1,.25,1), box-shadow .3s cubic-bezier(.25,.1,.25,1), background .3s cubic-bezier(.25,.1,.25,1); }
.class-pill.clickable:hover, .class-pill.clickable.design-pinned {
  transform:translateY(calc(-1 * var(--pill-hover-lift))); background:var(--pill-hover-fill);
  box-shadow:
    inset 0 0 var(--pill-inset-blur) rgba(16,22,34,var(--pill-inset-opacity)),
    inset 0 calc(-1 * var(--pill-inset-bottom-y)) var(--pill-inset-bottom-blur) rgba(16,22,34,var(--pill-inset-bottom-opacity)),
    0 calc(var(--pill-shadow-y) + 4px) calc(var(--pill-shadow-blur) + 8px) rgba(26,34,51,var(--pill-shadow-hover-opacity));
}
/* its OWN short transition - presses in fast (120ms) instead of riding
   the slower .3s hover transition, so the click registers instantly */
.class-pill.clickable:active { transform:scale(.93); transition:transform .12s cubic-bezier(.4,0,.6,1); }
/* pills never change appearance based on notebook-saved status - clicking
   is a pure "copy to notebook" action, repeatable, with no persistent
   visual state on the pill itself */
/* La entrada se sentía troceada, en dos tiempos. La culpa era el fotograma
   intermedio del 60%: con una curva tan frenada, ese 60% del recorrido se
   comía el primer 20% del tiempo, así que el desenfoque caía de golpe de 20 a
   3 y luego se arrastraba de 3 a 0. Dos velocidades = dos fases visibles.
   Ahora es una sola interpolación, con menos desenfoque de salida (20px sobre
   texto es caro de repintar y se nota) y una curva menos extrema. */
.class-pill.bloom { animation:pillBloom .55s cubic-bezier(.22,.61,.36,1) both; will-change:opacity, transform, filter; }
@keyframes pillBloom {
  0%   { opacity:0; filter:blur(12px); transform:scale(.92) translateY(-10px); }
  100% { opacity:1; filter:blur(0);    transform:scale(1)   translateY(0); }
}
/* the "big" incoming teacher message - full column width, darkens/blurs
   what's beneath it until it auto-settles into the normal pill list */
.class-pill.big {
  width:100%; padding:calc(var(--pill-pad-y) + 2px) calc(var(--pill-pad-x) - 2px); border-radius:var(--pill-radius); font-size:calc(var(--pill-font-size) - 3px); line-height:1.4;
  text-align:left; position:relative; z-index:2; cursor:pointer;
  box-shadow:
    inset 0 0 calc(var(--pill-inset-blur) + 4px) rgba(16,22,34,var(--pill-inset-opacity)),
    inset 0 calc(-1 * var(--pill-inset-bottom-y)) calc(var(--pill-inset-bottom-blur) + 1px) rgba(16,22,34,var(--pill-inset-bottom-opacity)),
    0 12px 28px rgba(26,34,51,var(--pill-shadow-hover-opacity));
  animation:pillBigIn .55s cubic-bezier(.22,.61,.36,1) both; will-change:opacity, transform, filter;
}
.class-pill.big.settling { animation:pillSettleOut .5s cubic-bezier(.5,0,.75,0) both; pointer-events:none; }
@keyframes pillSettleOut {
  0%   { opacity:1; filter:blur(0);   transform:scale(1)   translateY(0); }
  100% { opacity:0; filter:blur(8px); transform:scale(.48) translateY(-16px); }
}
@keyframes pillBigIn {
  0%   { opacity:0; filter:blur(14px); transform:scale(.94) translateY(-10px); }
  100% { opacity:1; filter:blur(0);    transform:scale(1)   translateY(0); }
}
.pill-scrim {
  position:absolute; inset:0; background:rgba(16,20,30,0.32);
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
  border-radius:var(--r); z-index:1; pointer-events:none; animation:scrimIn .5s cubic-bezier(.16,1,.3,1) both;
}
.pill-scrim.settling { animation:scrimOut .5s ease both; }
@keyframes scrimIn { from{ opacity:0; } to{ opacity:1; } }
@keyframes scrimOut { from{ opacity:1; } to{ opacity:0; } }

/* "Mis notas" is not always visible: it's opened on demand from the
   "Notas" header button. But it's NOT a viewport-edge overlay - it lives
   in its normal spot in the flex row, right beside the exercises column,
   exactly like the pills column on the left. This matters for two
   reasons: (1) its width is always reserved, so the exercises column
   never re-centers/shifts when the panel opens or closes, and (2) as a
   `position:fixed` panel it was nested inside `.screen`, which always
   carries a CSS `transform` (even at rest, translateY(8px)/0) - a
   transformed ancestor becomes the containing block for fixed
   descendants, which silently broke height/scroll bounds for the
   teacher. Sticky-in-flex sidesteps that class of bug entirely.
   Open/close is purely visual: opacity + blur + a short slide, no
   layout reflow. Mobile is the one exception - there's no room to
   reserve a permanent column, so it becomes a real overlay drawer there
   (see the media query below). */
.notebook-col {
  width:var(--notebook-width); flex-shrink:0; position:sticky; top:8px;
  height:calc(100vh - 100px); border-radius:var(--notebook-radius);
  background:var(--notebook-fill);
  border:1px solid var(--notebook-border);
  backdrop-filter:blur(var(--notebook-blur)) saturate(var(--notebook-saturate)); -webkit-backdrop-filter:blur(var(--notebook-blur)) saturate(var(--notebook-saturate));
  /* same "glass" recipe as the pills: no border, depth from an inset
     shadow + translucency instead - keeps white Coolvetica text legible
     everywhere on the panel, not just near an edge. Every value below is
     theme-driven so the 3D glass depth is fully adjustable. */
  box-shadow:
    inset 0 0 var(--notebook-inset-blur) rgba(16,22,34,var(--notebook-inset-opacity)),
    inset 0 calc(-1 * var(--notebook-inset-bottom-y)) var(--notebook-inset-bottom-blur) rgba(16,22,34,var(--notebook-inset-bottom-opacity)),
    0 var(--notebook-shadow-y) var(--notebook-shadow-blur) rgba(26,34,51,var(--notebook-shadow-opacity));
  display:flex; flex-direction:column; overflow:hidden;
  opacity:0; filter:blur(14px); transform:translateX(28px); pointer-events:none;
  transition:opacity .5s cubic-bezier(.25,.1,.25,1), filter .5s cubic-bezier(.25,.1,.25,1), transform .5s cubic-bezier(.25,.1,.25,1);
}
.notebook-col.open { opacity:1; filter:blur(0); transform:translateX(0); pointer-events:auto; }
.notebook-body {
  flex:1; overflow-y:auto; -webkit-overflow-scrolling:touch; overscroll-behavior:contain;
  padding:8px 24px 24px; display:flex; flex-direction:column; gap:4px;
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 34px, #000 calc(100% - 24px), transparent 100%);
  mask-image:linear-gradient(to bottom, transparent 0, #000 34px, #000 calc(100% - 24px), transparent 100%);
}
.notebook-entry {
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400; font-size:19px; color:#fff;
  background:transparent; border:none; outline:none; width:100%; line-height:1.6;
}
input.notebook-entry::placeholder { color:rgba(255,255,255,0.55); }
/* student-only delete affordance on each saved note */
.notebook-entry { position:relative; padding-right:20px; }
.note-del { position:absolute; top:-1px; right:-4px; width:20px; height:20px; padding:0; border:none;
  background:transparent; color:rgba(255,255,255,0.5); font-family:'DM Sans',sans-serif; font-size:15px;
  line-height:20px; text-align:center; cursor:pointer; border-radius:50%; opacity:0;
  transition:opacity .18s ease, color .18s ease, background .18s ease; }
.notebook-entry:hover .note-del { opacity:1; }
.note-del:hover { color:#fff; background:rgba(255,77,94,0.9); }
@media (hover:none) { .note-del { opacity:.55; } }
.note-cursor { display:inline-block; width:1px; height:1em; vertical-align:-2px; margin-left:1px; background:#fff; animation:cursorBlink 1s steps(1) infinite; }
@keyframes cursorBlink { 0%,49%{opacity:1;} 50%,100%{opacity:0;} }
.notebook-empty { font-size:13px; color:rgba(255,255,255,0.5); text-align:center; padding:30px 10px; font-family:'DM Sans',sans-serif; }

/* ── notebook compose trigger - same language as the teacher's pill
   composer: no box, no straight edges - a soft radial glass bloom fading
   in every direction, with "Escribir" appearing inside it on hover.
   Click swaps it for a live input, and the bloom disappears completely
   (see .active below) so it never sits on top of what's being written.
   Lives as a sibling of .notebook-body (not nested inside it) so the
   scroll area's own fade mask never eats into the bloom - it used to,
   because both shared the same masked box. ── */
/* ── notebook composer - same fix as the pill composer: a simple,
   always-legible dark glass bar instead of a hover-only bloom, so
   white text always has real contrast against it, in every state. ── */
.notebook-compose-trigger {
  position:relative; z-index:5; cursor:text;
  margin:16px 20px 10px; padding:12px 18px;
  border-radius:var(--r-pill);
  display:flex; align-items:center; justify-content:center;
  background:rgba(16,22,34,0.22);
  -webkit-backdrop-filter:blur(14px) saturate(140%); backdrop-filter:blur(14px) saturate(140%);
  box-shadow:0 4px 14px rgba(16,22,34,0.14), inset 0 1px 0 rgba(255,255,255,0.08);
  transition:background .3s cubic-bezier(.25,.1,.25,1), box-shadow .3s cubic-bezier(.25,.1,.25,1);
}
.notebook-compose-trigger:hover, .notebook-compose-trigger.design-pinned {
  background:rgba(16,22,34,0.3);
  box-shadow:0 6px 18px rgba(16,22,34,0.18), inset 0 1px 0 rgba(255,255,255,0.1);
}
.notebook-compose-trigger.active {
  background:rgba(16,22,34,0.34);
  box-shadow:0 4px 14px rgba(16,22,34,0.2), inset 0 1px 0 rgba(255,255,255,0.1), 0 0 0 2px rgba(var(--accent-rgb),0.35);
}
.notebook-compose-trigger input {
  width:100%; border:none; outline:none; background:transparent; text-align:center;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; color:#fff;
}
.notebook-compose-trigger input::placeholder { color:rgba(255,255,255,0.6); }
/* el cuadro de escribir es ahora un textarea que crece en alto con suavidad */
.notebook-compose-trigger textarea {
  width:100%; border:none; outline:none; background:transparent; text-align:center;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; color:#fff;
  resize:none; overflow:hidden; display:block; margin:0; padding:0;
  line-height:1.5; min-height:24px;
  transition:height .3s cubic-bezier(.25,.1,.25,1);
}
.notebook-compose-trigger textarea::placeholder { color:rgba(255,255,255,0.6); }
/* la nota nueva entra suave desde arriba (desde el cuadro donde se escribió) */
.notebook-entry.note-in { animation:noteIn .5s cubic-bezier(.16,1,.3,1) both; will-change:opacity, transform, filter; }
@keyframes noteIn {
  0%   { opacity:0; filter:blur(6px); transform:translateY(-12px) scale(.98); }
  60%  { opacity:1; filter:blur(1px); }
  100% { opacity:1; filter:blur(0);   transform:translateY(0) scale(1); }
}

/* "Notas" toggle button reuses the existing .back-btn / .otra-clase-btn
   pill-button look (same family as "Mensaje" / "Otra clase") so it sits
   naturally in the header instead of floating over the content - no
   dedicated styles needed here. */

@media (max-width:999px) {
  .session-layout { flex-direction:column; }
  .pills-col { width:100%; flex-direction:row; overflow-x:auto; overflow-y:visible; height:auto; position:relative; padding:8px 16px; mask-image:none; -webkit-mask-image:none; }
  .pills-col-shell { position:relative; width:100%; height:auto; top:auto; }
  .pills-compose-slot { position:relative; z-index:auto; }
  /* no room to reserve a permanent side column here - "Mis notas" becomes
     a real overlay drawer, same open/close triggers, just anchored to
     the viewport edge instead of sitting in the flex row */
  .notebook-col {
    width:min(320px,88vw); position:fixed; right:0; top:0; bottom:0; z-index:200;
    max-height:100vh; border-radius:var(--r-xl) 0 0 var(--r-xl);
    transform:translateX(105%);
  }
  .notebook-col.open { transform:translateX(0); }
}



/* ── ITEM BULLETS - soft, premium dots before each line. Three states:
   1. default  → light grey, blurred glow (item not yet answered)
   2. .line-filled → soft blue (student filled this line's answer)
   3. .line-ok     → soft green (checked and correct)
   Each transition is gently blurred/eased for a premium feel. ── */
.sentence-line, .so-line, .wa-line {
  position:relative; padding-left:20px;
}
.sentence-line::before, .so-line::before, .wa-line::before {
  content:'';
  position:absolute; left:1px;
  width:9px; height:9px; border-radius:50%;
  /* soft grey, heavily feathered toward the edges = blurred premium look */
  background:radial-gradient(circle at 42% 38%, rgba(120,135,160,0.55) 0%, rgba(120,135,160,0.22) 45%, rgba(120,135,160,0) 78%);
  box-shadow:0 0 5px rgba(120,135,160,0.18);
  filter:blur(0.3px);
  transition:background .7s cubic-bezier(.25,.1,.25,1), box-shadow .7s cubic-bezier(.25,.1,.25,1), filter .7s cubic-bezier(.25,.1,.25,1), transform .7s cubic-bezier(.34,1.4,.5,1);
}
.sentence-line::before, .so-line::before { top:50%; transform:translateY(-50%); }
.wa-line::before { top:1.3em; transform:translateY(-50%); }
/* State 2 - line filled → soft, blurred blue */
.sentence-line.line-filled::before, .so-line.line-filled::before, .wa-line.line-filled::before {
  background:radial-gradient(circle at 42% 38%, rgba(96,150,255,0.85) 0%, rgba(70,120,240,0.4) 48%, rgba(70,120,240,0) 80%);
  box-shadow:0 0 9px rgba(96,150,255,0.5), 0 0 18px rgba(96,150,255,0.22);
  filter:blur(0.4px);
}
.sentence-line.line-filled::before, .so-line.line-filled::before { transform:translateY(-50%) scale(1.12); }
.wa-line.line-filled::before { transform:translateY(-50%) scale(1.12); }
/* State 3 - line checked correct → soft, blurred green */
.sentence-line.line-ok::before, .so-line.line-ok::before, .wa-line.line-ok::before {
  background:radial-gradient(circle at 42% 38%, rgba(72,205,140,0.9) 0%, rgba(46,180,110,0.42) 48%, rgba(46,180,110,0) 80%);
  box-shadow:0 0 10px rgba(72,205,140,0.5), 0 0 20px rgba(72,205,140,0.22);
  filter:blur(0.4px);
}
.sentence-line.line-ok::before, .so-line.line-ok::before { transform:translateY(-50%) scale(1.18); }
.wa-line.line-ok::before { transform:translateY(-50%) scale(1.18); }
/* State 4 - line checked incorrect → soft, blurred red */
.sentence-line.line-bad::before, .so-line.line-bad::before, .wa-line.line-bad::before {
  background:radial-gradient(circle at 42% 38%, rgba(255,110,125,0.9) 0%, rgba(230,70,90,0.42) 48%, rgba(230,70,90,0) 80%);
  box-shadow:0 0 10px rgba(255,110,125,0.5), 0 0 20px rgba(255,110,125,0.2);
  filter:blur(0.4px);
}
.sentence-line.line-bad::before, .so-line.line-bad::before { transform:translateY(-50%) scale(1.18); }
.wa-line.line-bad::before { transform:translateY(-50%) scale(1.18); }
.sentence-line { display:flex; flex-wrap:wrap; align-items:center; gap:5px; margin-bottom:12px; font-size:17px; line-height:2.2; font-family:'Canela Text','DM Sans',sans-serif; letter-spacing:.2px; }
.drop-slot { display:inline-flex; align-items:center; justify-content:center; min-width:var(--slot-min-width); height:var(--slot-height); border-radius:var(--slot-radius); border:1.5px solid var(--slot-border); background:var(--slot-fill); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); padding:0 14px; font-family:'DM Sans',sans-serif; font-size:13px; font-weight:600; letter-spacing:normal; color:rgba(26,34,51,0.4); cursor:pointer; transition:all .38s cubic-bezier(.25,.1,.25,1); box-shadow:0 var(--slot-shadow-y) var(--slot-shadow-blur) rgba(26,34,51,var(--slot-shadow-opacity)), inset 0 1px 0 rgba(255,255,255,0.6); }
.drop-slot.filled { border-color:rgba(var(--accent-rgb),0.45); background:var(--slot-filled-fill); color:var(--text); box-shadow:0 2px 8px rgba(26,34,51,0.1), inset 0 1px 0 rgba(255,255,255,0.7); }
/* BUG FIX: dedicated drag-hover style (previously reused .filled) */
.drop-slot.drag-over { border-color:var(--accent); background:rgba(var(--accent-rgb),0.08); color:var(--accent); box-shadow:0 0 0 3px rgba(var(--accent-rgb),0.15); }
/* ── TEACHER-ONLY ANSWER TOOLTIP ──
   Hovering any answer blank (drag slot or matching drop zone) shows the correct
   answer in a small frosted pill above it - just for the teacher, so you don't have
   to memorize every answer in every exercise. Pure CSS (data-answer already lives on
   these elements), gated by body.is-teacher so students never see it. Works on these
   two specifically because they're plain <div>s - real form controls (<select>/<input>)
   don't reliably render ::after content in most browsers. */
body.is-teacher .drop-slot[data-answer]:not([data-answer=""]),
body.is-teacher .match-drop-zone[data-answer]:not([data-answer=""]),
body.is-teacher .col-drop[data-answer]:not([data-answer=""]) {
  position: relative;
}
body.is-teacher .drop-slot[data-answer]:not([data-answer=""])::after,
body.is-teacher .match-drop-zone[data-answer]:not([data-answer=""])::after,
body.is-teacher .col-drop[data-answer]:not([data-answer=""])::after {
  content: attr(data-answer);
  position: absolute; left:50%; bottom:calc(100% + 8px); transform:translateX(-50%) translateY(4px);
  background:rgba(26,34,51,0.82); color:#fff; backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
  padding:5px 12px; border-radius:var(--r-pill); font-family:'DM Sans',sans-serif; font-size:12px; font-weight:600;
  white-space:nowrap; pointer-events:none; opacity:0; z-index:50;
  box-shadow:0 4px 14px rgba(26,34,51,0.25);
  transition:opacity .18s cubic-bezier(.25,.1,.25,1), transform .18s cubic-bezier(.25,.1,.25,1);
}
body.is-teacher .drop-slot[data-answer]:not([data-answer=""]):hover::after,
body.is-teacher .match-drop-zone[data-answer]:not([data-answer=""]):hover::after,
body.is-teacher .col-drop[data-answer]:not([data-answer=""]):hover::after {
  opacity:1; transform:translateX(-50%) translateY(0);
}
/* ── TEACHER-ONLY ANSWER KEY (writeans / selectopt) ──
   Los <input> y <select> no renderizan ::after de forma fiable, así que en vez
   de tooltip la respuesta correcta va como píldora en línea junto al cuadro.
   El marcado sólo se genera en modo profesor, y además body.is-teacher lo
   oculta si alguna vez se colara en la pantalla del alumno. */
.wa-key, .so-key {
  display:inline-flex; align-items:center; vertical-align:middle;
  margin:0 2px 0 6px; padding:2px 10px;
  border-radius:var(--r-pill);
  background:rgba(var(--accent2-rgb),0.12);
  border:1px solid rgba(var(--accent2-rgb),0.3);
  font-family:'DM Sans',sans-serif; font-size:12px; font-weight:600;
  letter-spacing:normal; line-height:1.5; color:var(--accent2);
  white-space:nowrap; user-select:text;
}
body:not(.is-teacher) .wa-key, body:not(.is-teacher) .so-key { display:none; }
/* NEW FEATURE: online presence dot in the student list */
.student-presence-dot { width:9px; height:9px; border-radius:50%; flex-shrink:0; background:rgba(26,34,51,0.18); }
.student-presence-dot.online { background:var(--accent2); box-shadow:0 0 0 3px rgba(var(--accent2-rgb),0.18); animation:livePulse 1.4s ease-in-out infinite; }
.drop-slot.ok  { border-color:#22c55e; background:rgba(34,197,94,0.08); color:#16a34a; }
.drop-slot.bad { border-color:var(--danger); background:rgba(var(--danger-rgb),0.08); color:var(--danger); animation:shake .28s; }
.conj-grid { display:flex; flex-direction:column; gap:10px; }
.conj-row { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:14px; }
.conj-pro { font-weight:700; color:var(--accent); min-width:90px; font-size:13px; }
.conj-sel { background:var(--white); border:2px solid var(--border-lo); border-radius:var(--r-sm); color:var(--text); padding:7px 28px 7px 10px; font-size:13px; font-family:'DM Sans',sans-serif; font-weight:600; cursor:pointer; outline:none; appearance:none; transition:border-color .18s; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%233a4a62' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 9px center; }
.conj-sel:focus { border-color:var(--accent); }
.conj-sel.ok  { border-color:#22c55e; }
.conj-sel.bad { border-color:var(--danger); }
.conj-ctx { color:var(--text3); font-size:13px; }
.match-img-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:12px; }
.match-card {
  border-radius:var(--r); overflow:visible; border:none; background:transparent;
  transition:transform .38s cubic-bezier(.25,.1,.25,1);
  display:flex; flex-direction:column; gap:8px;
}
.match-card:hover { transform:translateY(-3px); }
.match-card-img-wrap {
  position:relative; border-radius:var(--r-lg); overflow:hidden; border:1.5px solid rgba(255,255,255,0.5);
  box-shadow:0 4px 20px rgba(26,34,51,0.1);
}
.foto-credito { display:block; font-family:'Coolvetica','DM Sans',sans-serif; font-size:10.5px; letter-spacing:.2px; opacity:.45; text-align:right; margin-top:2px; text-decoration:none; color:inherit; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.loader-spin { width:28px; height:28px; border-radius:50%; border:3px solid rgba(0,0,0,0.12); border-top-color:var(--accent,#4a7dff); animation:loader-spin-rotate .8s linear infinite; }
@keyframes loader-spin-rotate { to { transform:rotate(360deg); } }
@media (prefers-reduced-motion:reduce) { .loader-spin { animation:none; } }
.foto-credito:hover { opacity:.8; text-decoration:underline; }
.match-card-img { width:100%; aspect-ratio:4/3; object-fit:cover; display:block; transition:transform .55s cubic-bezier(.25,.1,.25,1); }
/* Una foto que todavía viaja no enseña el fondo de su caja: nace difuminada
   y se asienta cuando llega (ver _fotoEntra). */
img.foto-entrando { opacity:0; filter:blur(14px); transform:scale(1.015); }
img.foto-entrando.foto-lista { opacity:1; filter:blur(0); transform:none;
  transition:opacity .52s var(--dc-ease, cubic-bezier(.42,0,.18,1)),
             filter .52s var(--dc-ease, cubic-bezier(.42,0,.18,1)),
             transform .52s var(--dc-ease, cubic-bezier(.42,0,.18,1)); }
@media (prefers-reduced-motion:reduce) {
  img.foto-entrando { opacity:1; filter:none; transform:none; }
}
.match-card:hover .match-card-img { transform:scale(1.05); }
.match-card-img-placeholder { width:100%; aspect-ratio:4/3; display:flex; align-items:center; justify-content:center; font-size:32px; background:rgba(255,255,255,0.2); border-radius:var(--r-lg); }
.match-drop-zone {
  min-height:40px; padding:8px 16px;
  display:flex; align-items:center; justify-content:center; flex-wrap:wrap; gap:4px;
  font-family:'DM Sans',sans-serif; font-size:13px; font-weight:600; letter-spacing:normal; color:rgba(26,34,51,0.4);
  transition:all .38s cubic-bezier(.25,.1,.25,1); cursor:pointer;
  border-radius:var(--slot-radius);
  background:var(--slot-fill); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px);
  border:1.5px solid var(--slot-border);
  box-shadow:0 var(--slot-shadow-y) var(--slot-shadow-blur) rgba(26,34,51,var(--slot-shadow-opacity)), inset 0 1px 0 rgba(255,255,255,0.6);
}
.match-drop-zone.drag-over { background:rgba(240,244,251,0.92); border-color:var(--accent); color:var(--accent); box-shadow:0 0 0 3px rgba(var(--accent-rgb),0.15); }
.match-drop-zone.filled { color:var(--text); background:var(--slot-filled-fill); border-color:rgba(var(--accent-rgb),0.4); }
.match-drop-zone.matched { color:var(--accent2); background:rgba(var(--accent2-rgb),0.1); border-color:var(--accent2); }
.match-drop-zone.bad { animation:shake .28s; border-color:var(--danger); background:rgba(var(--danger-rgb),0.06); color:var(--danger); }
/* ── MATCHING INLINE EDITOR - edits happen right on the exercise block, styled
   exactly like the live student grid, no separate modal/preview screen. ── */
.match-card-img-wrap.editable { cursor:pointer; }
.match-card-img-wrap input[type=file] { position:absolute; inset:0; opacity:0; cursor:pointer; z-index:3; }
.match-card-edit-overlay {
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  background:rgba(15,20,35,0.38); color:#fff; font-size:22px; opacity:0;
  transition:opacity .2s cubic-bezier(.25,.1,.25,1); pointer-events:none; z-index:2;
}
.match-card-img-wrap.editable:hover .match-card-edit-overlay { opacity:1; }
@media (hover:none) { .match-card-edit-overlay { opacity:.85; } }
.match-card-del {
  position:absolute; top:6px; right:6px; z-index:4; width:24px; height:24px; border-radius:50%; border:none;
  background:rgba(15,20,35,0.65); color:#fff; font-size:11px; cursor:pointer; display:flex; align-items:center; justify-content:center;
  backdrop-filter:blur(6px); transition:background .18s;
}
.match-card-del:hover { background:rgba(var(--danger-rgb),0.85); }
.match-card-crop-btn {
  position:absolute; bottom:6px; left:6px; z-index:4; width:28px; height:28px; border-radius:var(--r-xs); border:none;
  background:rgba(255,255,255,0.85); backdrop-filter:blur(6px); color:rgba(58,72,98,0.9); cursor:pointer;
  display:flex; align-items:center; justify-content:center; font-size:13px;
  opacity:0; transition:all .22s cubic-bezier(.34,1.56,.64,1); box-shadow:0 4px 12px rgba(26,34,51,0.15);
}
.match-card-img-wrap.editable:hover .match-card-crop-btn { opacity:1; }
.match-card-crop-btn:hover { background:#fff; color:var(--accent); }
@media (hover:none) { .match-card-crop-btn { opacity:1; } }
.match-word-input {
  min-height:40px; padding:8px 16px; width:100%; text-align:center;
  font-family:'DM Sans',sans-serif; font-size:13px; font-weight:600; color:var(--text);
  border-radius:var(--r-pill); background:rgba(235,240,248,0.72); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px);
  border:1.5px solid rgba(255,255,255,0.7); box-shadow:0 1px 4px rgba(26,34,51,0.06), inset 0 1px 0 rgba(255,255,255,0.6);
  outline:none; transition:border-color .18s;
}
.match-word-input:focus { border-color:rgba(var(--accent-rgb),0.55); background:rgba(240,244,251,0.88); }
.match-word-input::placeholder { color:rgba(26,34,51,0.32); }
.match-card-add {
  border:2px dashed rgba(26,34,51,0.22); background:rgba(255,255,255,0.18); box-shadow:none;
  display:flex; align-items:center; justify-content:center; transition:all .28s cubic-bezier(.25,.1,.25,1);
}
.match-card-add:hover { background:rgba(255,255,255,0.42); border-color:rgba(var(--accent-rgb),0.45); }
.match-card-add-icon { font-size:28px; color:var(--text3); pointer-events:none; }
.inline-instruction-input {
  width:100%; border:none; background:transparent; outline:none;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.3px;
  color:var(--text2); margin-bottom:14px; padding:2px 0 6px; border-bottom:1.5px dashed var(--border-lo);
}
.inline-instruction-input:focus { border-bottom-color:var(--accent); }
.inline-instruction-input::placeholder { color:rgba(58,74,98,0.4); }
.ex-wysiwyg.ex-editing { border-color:rgba(var(--accent-rgb),0.4); box-shadow:0 0 0 3px rgba(var(--accent-rgb),0.12), 0 4px 20px rgba(26,34,51,0.08); }
.match-words {
  display:flex; flex-wrap:wrap; gap:7px; margin-bottom:14px;
  position:sticky; top:8px; z-index:30;
  padding:12px; border-radius:var(--r-sm);
  backdrop-filter:blur(20px); -webkit-backdrop-filter:blur(20px);
  background:rgba(220,228,238,0.78);
  box-shadow:0 2px 12px rgba(26,34,51,0.06);
  /* Long/many phrases used to grow this box tall enough to cover the whole exercise
     while scrolling (it's sticky). Cap it to ~3 rows and let it scroll internally
     instead - smooth on trackpad/touch by default, plus scroll-behavior for any
     programmatic/keyboard scrolls. */
  max-height:137px; overflow-y:auto; overscroll-behavior:contain; scroll-behavior:smooth;
  scrollbar-width:thin; scrollbar-color:rgba(26,34,51,0.2) transparent;
}
.match-words::-webkit-scrollbar { width:6px; }
.match-words::-webkit-scrollbar-track { background:transparent; }
.match-words::-webkit-scrollbar-thumb { background:rgba(26,34,51,0.2); border-radius:var(--r-pill); }
.match-words::-webkit-scrollbar-thumb:hover { background:rgba(26,34,51,0.35); }

/* ── COLUMNAS (colsort: clasificar palabras / colwrite: escritura libre) ──
   Cada columna es una "mini nota": usa EXACTAMENTE la receta de vidrio del panel
      "Mis notas", pero con su propia entrada en la pestaña Diseño ("Columnas"), así
   que se ajusta aparte y admite pegarle el estilo de cualquier otro elemento.
   Los valores de aquí son solo el punto de partida: #theme-overrides los pisa.
   Las palabras dentro reutilizan .w-chip para verse idénticas en toda la app. */
.col-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(180px, 1fr)); gap:14px; align-items:stretch; }
.col-block {
  position:relative; display:flex; flex-direction:column; overflow:hidden; min-height:150px;
  border-radius:26px;
  background:rgba(214,221,230,0.48);
  border:1px solid rgba(255,255,255,0);
  backdrop-filter:blur(36px) saturate(80%); -webkit-backdrop-filter:blur(36px) saturate(80%);
  box-shadow:
    inset 0 0 40px rgba(16,22,34,0.26),
    inset 0 -4px 14px rgba(16,22,34,0.14),
    0 10px 30px rgba(26,34,51,0.12);
}
.col-block-title {
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400; font-size:18px; letter-spacing:.3px; color:#fff;
  text-align:center; padding:12px 16px 10px;
  border-bottom:1px solid rgba(255,255,255,0.22);
  min-height:22px; word-break:break-word;
}
.col-drop {
  flex:1; display:flex; flex-direction:column; align-items:center; gap:7px;
  padding:12px; min-height:90px; cursor:pointer;
  transition:background .3s cubic-bezier(.25,.1,.25,1), box-shadow .3s cubic-bezier(.25,.1,.25,1);
}
.col-drop.drag-over { background:rgba(var(--accent-rgb),0.14); box-shadow:inset 0 0 0 2px rgba(var(--accent-rgb),0.45); }
/* la palabra que aterriza en la columna: entra suave (blur + caída corta), igual
   idioma de animación que las notas nuevas del panel Notas (noteIn) */
.col-word { max-width:100%; word-break:break-word; text-align:center; }
.col-word.col-word-in { animation:colWordIn .42s var(--dc-ease, cubic-bezier(.42,0,.18,1)) both; will-change:opacity, transform; }
/* 07/09: la palabra CAE en la columna, no rebota. El encogido de 0.9 con la
   curva de muelle daba ese pequeño salto que se leía como un parpadeo; es la
   misma entrada que usan los huecos (ejEntra). */
@keyframes colWordIn {
  0%   { opacity:0; transform:translateY(-12px); }
  100% { opacity:1; transform:none; }
}
.col-word.ok  { border-color:#22c55e; background:rgba(34,197,94,0.14); color:#16a34a; }
.col-word.bad { border-color:var(--danger); background:rgba(255,255,255,0.9); color:var(--danger); animation:shake .28s; }
/* colwrite: la columna funciona como el cuaderno de notas - texto blanco
   Coolvetica directamente sobre el vidrio, crece con suavidad al escribir */
.col-write-input {
  width:100%; border:none; outline:none; background:transparent; resize:none; overflow:hidden; display:block; margin:0;
  padding:12px 16px 16px;
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400; font-size:18px; line-height:1.55; color:#fff;
  min-height:100px; transition:height .42s var(--dc-ease, cubic-bezier(.42,0,.18,1));
}
.col-write-input::placeholder { color:rgba(255,255,255,0.5); }
/* ── editor inline de columnas (mismo patrón que el editor inline de Matching:
   se edita sobre el bloque real, sin modal - lo que ves es lo que queda) ── */
.col-title-input {
  width:100%; border:none; outline:none; background:transparent; text-align:center;
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400; font-size:18px; letter-spacing:.3px; color:#fff;
  padding:12px 16px 10px; border-bottom:1px dashed rgba(255,255,255,0.35);
  transition:border-color .2s;
}
.col-title-input:focus { border-bottom-color:rgba(255,255,255,0.75); }
.col-title-input::placeholder { color:rgba(255,255,255,0.45); }
.col-words-editor {
  margin:12px; border:none; outline:none; resize:vertical;
  background:rgba(255,255,255,0.16); border-radius:var(--r-sm); padding:10px 12px;
  font-family:'DM Sans',sans-serif; font-size:13px; font-weight:600; color:#fff; line-height:1.8; min-height:110px;
}
.col-words-editor::placeholder { color:rgba(255,255,255,0.45); }
.col-editor-hint { flex:1; display:flex; align-items:center; justify-content:center; text-align:center; font-size:12px; color:rgba(255,255,255,0.5); font-family:'DM Sans',sans-serif; padding:24px 16px; }
.col-del-btn {
  position:absolute; top:8px; right:8px; z-index:4; width:24px; height:24px; border-radius:50%; border:none;
  background:rgba(15,20,35,0.65); color:#fff; font-size:11px; cursor:pointer; display:flex; align-items:center; justify-content:center;
  backdrop-filter:blur(6px); opacity:0; transition:opacity .2s, background .18s;
}
.col-block:hover .col-del-btn { opacity:1; }
.col-del-btn:hover { background:rgba(var(--danger-rgb),0.85); }
@media (hover:none) { .col-del-btn { opacity:.6; } }
.col-block-add {
  min-height:150px; border-radius:26px; cursor:pointer;
  border:2px dashed rgba(26,34,51,0.25); background:rgba(255,255,255,0.14); box-shadow:none;
  display:flex; align-items:center; justify-content:center; gap:8px;
  color:var(--text3); font-family:'DM Sans',sans-serif; font-size:13px; font-weight:600;
  transition:all .28s cubic-bezier(.25,.1,.25,1);
}
.col-block-add:hover { background:rgba(255,255,255,0.42); border-color:rgba(var(--accent-rgb),0.45); }
.col-mode-row { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:12px; }

/* ── DESCRIBE (image + free writing) ── */
.describe-grid { display:flex; flex-direction:column; gap:18px; }
.describe-card {
  display:flex; flex-direction:column; gap:10px;
  transition:transform .38s cubic-bezier(.25,.1,.25,1);
}
.describe-card:hover { transform:translateY(-3px); }
.describe-card .match-card-img-wrap {
  border-radius:var(--r-lg); overflow:hidden; border:1.5px solid rgba(255,255,255,0.5);
  box-shadow:0 4px 20px rgba(26,34,51,0.1);
}
.describe-card .match-card-img { width:100%; aspect-ratio:4/3; object-fit:cover; display:block; transition:transform .55s cubic-bezier(.25,.1,.25,1); }
.describe-card:hover .match-card-img { transform:scale(1.05); }
.describe-input {
  width:100%; border:none; outline:none; resize:none; overflow:hidden;
  background:rgba(235,240,248,0.72); border-radius:var(--r-xl);
  backdrop-filter:blur(20px); -webkit-backdrop-filter:blur(20px);
  padding:14px 20px; font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.3px; line-height:1.5;
  color:var(--text);
  box-shadow:0 2px 12px rgba(26,34,51,0.08), inset 0 1px 0 rgba(255,255,255,0.6);
  border:1.5px solid rgba(255,255,255,0.7);
  transition:height .42s var(--dc-ease, cubic-bezier(.42,0,.18,1)), box-shadow .25s, border-color .25s, background .25s;
  min-height:54px;
}
.describe-input:focus { border-color:rgba(var(--accent-rgb),0.55); box-shadow:0 4px 18px rgba(var(--accent-rgb),0.16), inset 0 1px 0 rgba(255,255,255,0.7); background:rgba(240,244,251,0.85); }
.describe-input::placeholder { color:rgba(26,34,51,0.32); font-family:'Coolvetica','DM Sans',sans-serif; letter-spacing:.3px; }
@media (min-width:700px) {
  .describe-grid { display:grid; grid-template-columns:1fr 1fr; gap:20px; align-items:start; }
}

/* ── TRANSLATE (sentence on top, free writing below) ── */
.translate-list { display:flex; flex-direction:column; gap:18px; }
.translate-card { display:flex; flex-direction:column; gap:10px; }
.translate-sentence {
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.3px; line-height:1.5;
  color:var(--text); background:rgba(255,255,255,0.5); border:1.5px solid rgba(255,255,255,0.6);
  border-radius:var(--r-xl); padding:14px 20px; box-shadow:0 2px 12px rgba(26,34,51,0.06);
}
.w-chip[draggable] { cursor:grab; }
.w-chip.dragging { opacity:.4; }

/* ── IMAGE GALLERY EXERCISE (teacher: carousel/single, optional captions) ── */
.img-gallery-outer {
  position:relative;                 /* las palabras de los lados cuelgan de aquí */
  border-radius:var(--r-xl); overflow:hidden;
  box-shadow:0 4px 24px rgba(26,34,51,0.1);
  transition:transform .42s cubic-bezier(.25,.1,.25,1), box-shadow .38s;
  cursor:default;
}
.img-gallery-outer:hover { transform:translateY(-5px) scale(1.012); box-shadow:0 18px 44px rgba(26,34,51,0.16); }
.img-gallery-wrap {
  position:relative; width:100%; aspect-ratio:16/9; overflow:hidden;
  background:#1a2233; transition:aspect-ratio .32s cubic-bezier(.25,.1,.25,1);
}
/* aspect-ratio above is only a placeholder shown before the image finishes loading -
   _glApplyRatio()/_glOnCarouselImgLoad() (JS) overwrite it inline to match each
   photo's real proportions (4:3, 16:9, portrait, etc.) so nothing gets cropped. */
.img-gallery-track {
  display:flex; height:100%; width:100%;
  transition:transform .45s cubic-bezier(.25,.1,.25,1);
  will-change:transform;
}
.img-gallery-slide {
  flex-shrink:0; width:100%; height:100%; position:relative;
}
.img-gallery-slide img {
  width:100%; height:100%; object-fit:cover; display:block;
  pointer-events:none; -webkit-user-drag:none;
}
.img-gallery-caption {
  position:absolute; bottom:0; left:0; right:0;
  padding:14px 18px 16px;
  background:linear-gradient(to top, rgba(15,20,35,0.72) 0%, transparent 100%);
  color:#fff; font-family:'DM Sans',sans-serif; font-size:14px; font-weight:400;
  line-height:1.4; letter-spacing:.1px;
  pointer-events:none;
}
.img-gallery-arrow {
  position:absolute; top:50%; transform:translateY(-50%);
  width:36px; height:36px; border-radius:50%; border:none; cursor:pointer;
  background:rgba(255,255,255,0.80); backdrop-filter:blur(12px);
  box-shadow:0 2px 12px rgba(26,34,51,0.2);
  display:flex; align-items:center; justify-content:center;
  font-size:16px; color:var(--text); z-index:10;
  transition:all .28s cubic-bezier(.34,1.56,.64,1);
  opacity:0; /* hidden by default, appear on outer hover */
}
/* Anterior / siguiente sobre los bordes de la foto. Son las mismas dos
   palabras de siempre -el lenguaje de "editar" o "eliminar"-, no botones. */
.ig-lado { position:absolute; top:50%; transform:translateY(-50%); z-index:4;
  padding:var(--dc-sp-20) var(--dc-sp-24); margin:0; opacity:0;
  text-shadow:var(--dc-shadow-text-strong); }
.ig-lado.prev { left:var(--dc-sp-6); }
.ig-lado.next { right:var(--dc-sp-6); }
.img-gallery-outer:hover .ig-lado { opacity:.72; }
.ig-lado:hover { opacity:1; transform:translateY(-50%) scale(1.06); }
.ig-lado:active { transform:translateY(-50%) scale(.98); }
.ig-lado:disabled { opacity:0 !important; pointer-events:none; }
/* Sin ratón no hay a qué acercarse: ahí se ven siempre. */
@media (hover:none) { .ig-lado { opacity:.7; } }
.img-gallery-outer:hover .img-gallery-arrow { opacity:0.88; }
.img-gallery-arrow:hover { opacity:1 !important; transform:translateY(-50%) scale(1.12); background:#fff; }
.img-gallery-arrow:active { transform:translateY(-50%) scale(.92) !important; }
.img-gallery-arrow.prev { left:10px; }
.img-gallery-arrow.next { right:10px; }
.img-gallery-arrow:disabled { opacity:0 !important; cursor:default; pointer-events:none; }
/* Slide indicator: a single thin, rounded track that fills smoothly toward
   the right as you move through the gallery (replaces the row of dots). */
.img-gallery-progress {
  width:min(200px,64%); height:5px; margin:12px auto 4px;
  border-radius:99px; background:rgba(26,34,51,0.14); overflow:hidden;
}
.img-gallery-progress-fill {
  height:100%; border-radius:99px; background:var(--text);
  transition:width .5s cubic-bezier(.22,1,.36,1);
}
/* Crop button - reuses pair-crop-btn style */
.img-gallery-crop-btn {
  position:absolute; top:50%; left:50%; transform:translate(-50%,-50%) scale(.85); z-index:5;
  width:52px; height:52px; border-radius:var(--r-lg); border:none; cursor:pointer;
  background:rgba(255,255,255,0.85); backdrop-filter:blur(8px);
  color:rgba(58,72,98,0.9); display:flex; align-items:center; justify-content:center;
  opacity:0; transition:all .22s cubic-bezier(.34,1.56,.64,1);
  box-shadow:0 4px 16px rgba(26,34,51,0.18);
}
.gallery-slide-img-area:hover .img-gallery-crop-btn { opacity:1; transform:translate(-50%,-50%) scale(1); }
.img-gallery-crop-btn:hover { background:#fff; color:var(--accent); transform:translate(-50%,-50%) scale(1.06); }
@media (hover:none) { .img-gallery-crop-btn { opacity:1; transform:translate(-50%,-50%) scale(1); } }
/* Editor: image upload cards for gallery */
.gallery-editor-slides { display:flex; flex-direction:column; gap:10px; }
.gallery-slide-card {
  background:rgba(255,255,255,0.45); border:1.5px solid var(--border);
  border-radius:var(--r-lg); overflow:hidden;
}
.gallery-slide-img-area {
  width:100%; aspect-ratio:16/9; background:#1a2233;
  position:relative; display:flex; align-items:center; justify-content:center;
  cursor:pointer; overflow:hidden; transition:aspect-ratio .32s cubic-bezier(.25,.1,.25,1);
}
.gallery-slide-img-area img { width:100%; height:100%; object-fit:cover; display:block; }
.gallery-slide-footer { display:flex; align-items:center; gap:8px; padding:8px 10px; }
.gallery-slide-caption-input {
  flex:1; background:rgba(255,255,255,0.6); border:1px solid var(--border);
  border-radius:var(--r-xs); padding:7px 11px; font-size:13px; font-family:'DM Sans',sans-serif;
  color:var(--text); outline:none; transition:border-color .18s;
}
.gallery-slide-caption-input:focus { border-color:var(--accent); }
.gallery-slide-caption-input::placeholder { color:var(--text3); }
#modal-crop { z-index:1100; }
#crop-stage {
  position:relative; width:100%; aspect-ratio:4/3; border-radius:var(--r-lg);
  overflow:hidden; background:#1a2233; touch-action:none; cursor:grab;
  user-select:none;
}
#crop-stage:active { cursor:grabbing; }
#crop-img {
  position:absolute; top:0; left:0; transform-origin:0 0;
  pointer-events:none; -webkit-user-drag:none; user-drag:none;
}
#crop-frame {
  position:absolute; inset:0; pointer-events:none;
  border:2px solid rgba(255,255,255,0.85); border-radius:var(--r-lg);
}

/* ── WRITE ANSWER ── */
.wa-line { font-size:17px; line-height:2.6; margin-bottom:2px; font-family:'Canela Text','DM Sans',sans-serif; letter-spacing:.2px; }
.wa-hint { font-style:italic; color:var(--text3); font-size:13px; }
.wa-input {
  display:inline-block; height:34px; border-radius:var(--r-pill); padding:0 14px;
  border:1.5px solid rgba(255,255,255,0.7); background:rgba(235,240,248,0.72);
  backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px);
  font-size:16px; font-weight:400; font-family:'Coolvetica','DM Sans',sans-serif; letter-spacing:.3px;
  color:var(--text); outline:none; vertical-align:middle;
  transition:width .28s cubic-bezier(.25,.1,.25,1), border-color .38s cubic-bezier(.25,.1,.25,1), background .38s cubic-bezier(.25,.1,.25,1), box-shadow .38s cubic-bezier(.25,.1,.25,1);
  min-width:90px; text-align:center; box-shadow:0 1px 4px rgba(26,34,51,0.06), inset 0 1px 0 rgba(255,255,255,0.6);
  margin:0 3px;
}
.wa-input:focus { border-color:rgba(var(--accent-rgb),0.55); background:rgba(240,244,251,0.88); box-shadow:0 2px 10px rgba(var(--accent-rgb),0.15), inset 0 1px 0 rgba(255,255,255,0.7); }
.wa-input.ok  { border-color:#22c55e; background:rgba(34,197,94,0.1); color:#16a34a; }
.wa-input.bad { border-color:var(--danger); background:rgba(var(--danger-rgb),0.08); color:var(--danger); animation:shake .28s; }

/* ── MATCHING EDITOR ── */
.match-editor-bank { display:flex; flex-wrap:wrap; gap:6px; padding:10px 12px; background:rgba(255,255,255,0.35); border-radius:var(--r-sm); min-height:38px; margin-bottom:14px; border:1px solid var(--border-lo); }
/* Per-exercise image aspect ratio picker (Matching editor) */
.ratio-picker { display:flex; gap:6px; margin-bottom:14px; flex-wrap:wrap; }
.ratio-btn { padding:7px 14px; border-radius:var(--r-pill); border:1.5px solid var(--border-lo); background:rgba(255,255,255,0.5); font-family:'DM Sans',sans-serif; font-size:13px; font-weight:600; color:var(--text2); cursor:pointer; transition:all .2s cubic-bezier(.25,.1,.25,1); }
.ratio-btn:hover { background:rgba(255,255,255,0.85); }
.ratio-btn.active { background:var(--text); color:#fff; border-color:var(--text); }
.match-bank-chip { padding:4px 12px; border-radius:var(--r-xs); font-size:13px; font-weight:600; background:var(--white); border:1px solid var(--border-lo); color:var(--text2); }
.match-pair-card { background:rgba(255,255,255,0.45); border:1.5px solid var(--border); border-radius:var(--r-lg); overflow:hidden; margin-bottom:10px; }
.match-pair-img-area {
  width:100%; aspect-ratio:4/3; background:rgba(255,255,255,0.2); position:relative;
  display:flex; align-items:center; justify-content:center; cursor:pointer;
  border-bottom:1px solid var(--border-lo); overflow:hidden;
}
.match-pair-img-area img { width:100%; height:100%; object-fit:cover; display:block; }
.match-pair-img-placeholder { display:flex; flex-direction:column; align-items:center; gap:6px; color:var(--text3); }
.match-pair-img-placeholder span { font-size:26px; }
.match-pair-img-placeholder small { font-size:11px; font-weight:600; }
.match-pair-img-area input[type=file] { position:absolute; inset:0; opacity:0; cursor:pointer; }
.pair-crop-btn {
  position:absolute; top:50%; left:50%; transform:translate(-50%,-50%) scale(.85); z-index:3;
  width:52px; height:52px; border-radius:var(--r-lg); border:none; cursor:pointer;
  background:rgba(255,255,255,0.85); backdrop-filter:blur(8px);
  color:rgba(58,72,98,0.9); display:flex; align-items:center; justify-content:center;
  opacity:0; transition:all .22s cubic-bezier(.34,1.56,.64,1);
  box-shadow:0 4px 16px rgba(26,34,51,0.18);
}
.match-pair-img-area:hover .pair-crop-btn { opacity:1; transform:translate(-50%,-50%) scale(1); }
.pair-crop-btn:hover { background:#fff; color:var(--accent); transform:translate(-50%,-50%) scale(1.06); }
/* On touch devices (no hover), keep the crop button visible */
@media (hover:none) { .pair-crop-btn { opacity:1; transform:translate(-50%,-50%) scale(1); } }
.match-pair-footer { display:flex; align-items:center; gap:8px; padding:8px 10px; }
.match-pair-footer .f-input { margin-bottom:0; flex:1; }

/* ── PRO / FILL-BLANKS ── */
.pro-textarea {
  width:100%; min-height:160px; resize:vertical;
  background:rgba(255,255,255,0.6); border:1.5px solid var(--border);
  border-radius:var(--r-sm); padding:12px; font-size:14px; line-height:1.8;
  font-family:'DM Sans',sans-serif; color:var(--text); outline:none; transition:border-color .18s;
}
.pro-textarea:focus { border-color:var(--accent); background:rgba(255,255,255,0.8); }
.pro-syntax-hint { font-size:11px; color:var(--text3); line-height:1.6; margin:6px 0 10px; background:rgba(var(--accent-rgb),0.06); border-radius:var(--r-xs); padding:8px 10px; }
.pro-syntax-hint code { background:rgba(var(--accent-rgb),0.12); border-radius:4px; padding:1px 5px; font-size:11px; }
.pro-preview-label { font-size:10px; font-weight:700; letter-spacing:.7px; text-transform:uppercase; color:var(--text3); margin:12px 0 6px; }
.pro-preview { background:var(--glass-md); border:1px solid var(--border); border-radius:var(--r-sm); padding:12px; min-height:48px; }

/* ── AULA TABS ── */
.aula-tabs {
  display:flex; gap:0; padding:0 18px 0; flex-shrink:0;
  border-bottom:1px solid rgba(26,34,51,0.08);
  background:rgba(255,255,255,0.12); backdrop-filter:blur(16px);
}
.aula-tab {
  padding:12px 20px; font-size:13px; font-weight:600; letter-spacing:.2px;
  background:transparent; border:none; cursor:pointer; color:var(--text3);
  position:relative; transition:color .2s; font-family:'DM Sans',sans-serif;
}
.aula-tab::after {
  content:''; position:absolute; bottom:0; left:50%; transform:translateX(-50%);
  width:0; height:2px; background:var(--accent); border-radius:var(--r-pill); transition:width .22s cubic-bezier(.34,1.2,.64,1);
}
.aula-tab.active { color:var(--text); }
.aula-tab.active::after { width:70%; }
/* Pill nav (clases/progreso/ajustes del perfil de alumno): la pestaña
   activa es una píldora de cristal - mismo lenguaje que .tb-btn - en vez
   de la rayita de abajo. Las inactivas quedan como texto plano en
   Coolvetica, igual que en el diseño de referencia. */
.aula-tabs-pill { gap:6px; border-bottom:none; background:transparent; backdrop-filter:none; padding:10px 18px 14px; }
.aula-tabs-pill .aula-tab {
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; font-weight:400; letter-spacing:.2px;
  padding:9px 20px; border-radius:var(--r-pill);
}
.aula-tabs-pill .aula-tab::after { display:none; }
.aula-tabs-pill .aula-tab {
  transition:transform .12s ease;
}
.aula-tabs-pill .aula-tab:active { transform:scale(.94); }
.aula-tabs-pill .aula-tab.active {
  background:linear-gradient(90deg,#cfd3d6,#939eb3);
  border:none; color:#fff;
  box-shadow:0 8px 22px rgba(20,30,45,.32);
}
/* Fondo degradado "hero" - igual al lienzo de Claude Design: cubre la
   cabecera del alumno, los tabs y los menús de Progreso/Ajustes (todo lo
   que estaba en tu mockup). El resto de cada pestaña (Palabras guardadas,
   Progreso por tema, los detalles desplegables de Ajustes) NO estaba en tu
   mockup - se queda como una "hoja" clara debajo, con su estilo de siempre. */
#screen-student > .classrooms-header,
.aula-tabs-pill.session-tabs,
.progreso-menu,
.ajustes-menu {
  background:linear-gradient(100deg, #d0d5d7 0%, #b3bdc9 45%, #8d9cb4 100%);
}
.progreso-menu, .ajustes-menu { border-radius:0 0 26px 26px; }
#screen-student #student-detail-name { color:#fff; }
.aula-tabs-pill .aula-tab { color:#fff; }
/* Ajustes como menú: filas de texto grande que se despliegan al tocarlas,
   igual que el diseño de referencia (Restablecer contraseña / Contenido /
   Pagos), en vez de las tres secciones siempre abiertas de antes. */
.ajustes-menu { padding:8px 20px 40px; display:flex; flex-direction:column; }
@media (min-width:600px) { .ajustes-menu { padding:8px 32px 40px; } }
.ajustes-menu-row {
  width:100%; text-align:left; background:none; border:none; border-bottom:1px solid rgba(255,255,255,0.28);
  cursor:pointer; font-family:'Coolvetica','DM Sans',sans-serif; font-size:21px; font-weight:400; letter-spacing:.2px;
  color:#fff; padding:18px 2px; display:flex; align-items:center; justify-content:space-between; gap:10px;
}
.ajustes-menu-row.disabled { color:rgba(255,255,255,0.65); cursor:default; }
.ajustes-menu-row.open { color:#fff; text-decoration:underline; text-underline-offset:4px; }
.ajustes-soon { font-size:11px; font-weight:600; letter-spacing:.3px; text-transform:uppercase; color:var(--text3); background:rgba(255,255,255,0.65); padding:4px 10px; border-radius:var(--r-pill); }
.ajustes-menu-detail .assign-section:first-child { padding-top:6px; }
/* La primera fila de cada menú (Restablecer contraseña / Léxico) es la más
   grande - jerarquía tomada del diseño de referencia, donde esa fila es
   claramente el "titular" y el resto queda secundario. */
#ajustes-row-pw { font-size:28px; }
/* Progreso: mismo look de fila que el menú de Ajustes; el detalle es un
   slider grande centrado, al estilo del diseño de referencia (número en
   palabras dentro de una píldora). */
.progreso-menu { padding:8px 20px 0; display:flex; flex-direction:column; }
@media (min-width:600px) { .progreso-menu { padding:8px 32px 0; } }
.progreso-menu .ajustes-menu-row:first-child { font-size:32px; }
.progreso-pct { display:none; }
.progreso-slider-wrap {
  padding:34px 24px 14px; text-align:center;
  background:linear-gradient(100deg, #d0d5d7 0%, #b3bdc9 45%, #8d9cb4 100%); border-radius:0 0 26px 26px;
}
.progreso-slider-label { font-family:'Coolvetica','DM Sans',sans-serif; font-size:26px; font-weight:400; margin-bottom:20px; color:#fff; }
.progreso-slider-num-pill {
  display:inline-block; font-family:'Coolvetica','DM Sans',sans-serif; font-size:19px; font-weight:400;
  background:var(--button-fill); backdrop-filter:blur(var(--button-blur)) saturate(var(--button-saturate));
  border:1px solid var(--button-border); border-radius:var(--r-pill); padding:10px 24px; margin-bottom:16px;
  box-shadow:0 var(--button-shadow-y) var(--button-shadow-blur) var(--button-shadow);
}
.progreso-slider-track { position:relative; height:6px; border-radius:99px; background:rgba(255,255,255,0.28); margin:0 auto; max-width:520px; }
.progreso-slider-fill { position:absolute; left:0; top:0; height:100%; border-radius:99px; background:#fff; transition:width .3s; }
.progreso-slider-ends { display:flex; justify-content:space-between; max-width:520px; margin:8px auto 0; font-size:13px; color:rgba(255,255,255,0.85); font-family:'Coolvetica','DM Sans',sans-serif; }
.session-tabs {
  background:var(--tab-bar-fill); backdrop-filter:blur(var(--tab-bar-blur));
  border-bottom:1px solid var(--tab-bar-border); border-radius:var(--tab-bar-radius);
  box-shadow:0 var(--tab-bar-shadow-y) var(--tab-bar-shadow-blur) rgba(26,34,51,var(--tab-bar-shadow-opacity));
  padding-left:var(--tab-bar-padding-x); padding-right:var(--tab-bar-padding-x);
}
.session-tabs .aula-tab { padding-top:var(--tab-bar-padding-y); padding-bottom:var(--tab-bar-padding-y); font-size:var(--tab-bar-font-size); }
.live-refresh-hint { font-size:10px; font-weight:400; color:var(--text3); }

/* ── LIVE VIEW redesign ── */
.live-ex-grid {
  display:flex; flex-direction:column; gap:6px;
}
.live-ex-item {
  display:flex; align-items:center; gap:10px; padding:10px 14px;
  background:rgba(255,255,255,0.35); border:1px solid rgba(255,255,255,0.55);
  border-radius:var(--r-md); cursor:pointer; transition:all .18s;
  backdrop-filter:blur(12px);
}
.live-ex-item:hover { background:rgba(255,255,255,0.55); transform:translateX(2px); }
.live-ex-item.is-focused {
  border-color:var(--accent); background:rgba(var(--accent-rgb),0.1);
  box-shadow:0 0 0 2px rgba(var(--accent-rgb),0.2);
}
.live-ex-dot { width:9px; height:9px; border-radius:50%; flex-shrink:0; }
.live-ex-dot.done { background:var(--accent2); }
.live-ex-dot.active { background:var(--accent); animation:livePulse 1.4s ease-in-out infinite; }
.live-ex-dot.pending { background:rgba(26,34,51,0.2); }
.live-ex-label { flex:1; font-size:13px; font-weight:600; }
.live-ex-status-text { font-size:12px; color:var(--text3); }
.live-ex-focus-btn {
  width:28px; height:28px; border-radius:var(--r-xs); border:none; cursor:pointer;
  background:rgba(var(--accent-rgb),0.1); color:var(--accent); font-size:14px;
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
  transition:all .18s;
}
.live-ex-focus-btn:hover { background:var(--accent); color:#fff; }
.live-ex-focus-btn.focused { background:var(--accent); color:#fff; }
.live-ex-reset-btn {
  width:28px; height:28px; border-radius:var(--r-xs); border:none; cursor:pointer;
  background:rgba(var(--danger-rgb),0.08); color:var(--danger); font-size:13px;
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
  transition:all .18s;
}
.live-ex-reset-btn:hover { background:rgba(var(--danger-rgb),0.18); }
.live-student-online {
  display:flex; align-items:center; gap:8px; padding:8px 12px;
  background:rgba(var(--accent2-rgb),0.1); border:1px solid rgba(var(--accent2-rgb),0.2);
  border-radius:var(--r-sm); font-size:12px; font-weight:600; color:var(--accent2);
  margin-bottom:12px;
}
.live-student-offline {
  padding:8px 12px; background:rgba(26,34,51,0.05); border-radius:var(--r-sm);
  font-size:12px; color:var(--text3); margin-bottom:12px;
}

/* ── FOCUS HIGHLIGHT on exercise (student receives this from teacher) ── */
.ex-wysiwyg.ex-teacher-focus {
  border-color:var(--danger) !important;
  box-shadow:0 0 0 3px rgba(var(--danger-rgb),0.25), 0 4px 20px rgba(26,34,51,0.08) !important;
  animation:focusPulse 1.2s ease-in-out 3 forwards;
}
@keyframes focusPulse {
  0%   { box-shadow:0 0 0 3px rgba(var(--danger-rgb),0.25); border-color:var(--danger); }
  50%  { box-shadow:0 0 0 10px rgba(var(--danger-rgb),0.08); border-color:rgba(var(--danger-rgb),0.8); }
  100% { box-shadow:0 0 0 3px rgba(var(--danger-rgb),0.25); border-color:var(--danger); }
}

/* ── RESET exercise button (student, shown on completed exercises) ── */
.ex-reset-own-btn {
  display:flex; align-items:center; gap:5px; padding:6px 14px;
  border-radius:var(--r-pill); border:1px solid rgba(26,34,51,0.12);
  background:rgba(255,255,255,0.4); color:var(--text3); cursor:pointer;
  font-family:'DM Sans',sans-serif; font-size:11px; font-weight:600;
  transition:all .2s; margin-left:8px;
}
.ex-reset-own-btn:hover { background:rgba(255,255,255,0.7); color:var(--text); }

/* ── EXERCISES centered layout ── */
#exercises-container {
  max-width:720px; margin:0 auto; padding:0 16px;
}
@media (min-width:600px) { #exercises-container { padding:0 24px; } }

/* ── AULA centered layout - matches student lesson view ── */
#live-view-content {
  max-width:720px; margin:0 auto;
}
#aula-panel-clase > div { padding:16px 16px 0; }
@media (min-width:600px) { #aula-panel-clase > div { padding:16px 24px 0; } }

/* ── LIVE LESSON BLOCKS (teacher sees full exercises with student data) ── */
.live-lesson-block {
  background:rgba(255,255,255,0.28); border:1px solid rgba(255,255,255,0.5);
  border-radius:var(--r); margin-bottom:14px;
  backdrop-filter:blur(16px); box-shadow:0 2px 12px rgba(26,34,51,0.06);
  transition:border-color .2s, box-shadow .2s;
}
/* round the header corners since the parent no longer clips (sticky needs no clip) */
.live-lesson-block > .live-block-header { border-radius:var(--r) var(--r) 0 0; }
.live-lesson-block.live-focused {
  border-color:var(--accent) !important;
  box-shadow:0 0 0 3px rgba(var(--accent-rgb),0.2), 0 4px 20px rgba(26,34,51,0.1) !important;
}
.live-lesson-block.live-done {
  opacity:0.75;
}
.live-block-header {
  display:flex; align-items:center; gap:8px; padding:8px 12px;
  background:rgba(255,255,255,0.15); border-bottom:1px solid rgba(255,255,255,0.25);
}
.live-block-type { font-size:11px; font-weight:700; letter-spacing:.5px; text-transform:uppercase; color:var(--text3); flex:1; }
.live-block-status { font-size:11px; font-weight:600; color:var(--text2); }
.live-block-body { padding:14px 16px; }

/* ── papelera de clases (aula del profe) ── */
.pap-btn { display:inline-flex; align-items:center; gap:7px; cursor:pointer;
  padding:7px 14px; border-radius:99px; font-size:13px; color:var(--text2);
  background:var(--glass-md); border:1px solid var(--border); font-family:inherit;
  transition:background .2s; }
.pap-btn:hover { background:var(--glass-hi); }
.pap-list { margin-top:10px; display:flex; flex-direction:column; gap:7px; }
.pap-row { display:flex; align-items:center; gap:11px; padding:9px 11px;
  border-radius:14px; background:var(--glass-md); border:1px solid var(--border); }
.pap-info { flex:1; min-width:0; }
.pap-fecha { font-family:'Coolvetica','DM Sans',sans-serif; font-size:15px; letter-spacing:.2px; }
.pap-que { font-size:12px; color:var(--text3); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.pap-act { border:none; background:none; cursor:pointer; font:inherit; font-size:13px;
  padding:5px 10px; border-radius:99px; color:var(--accent); white-space:nowrap; }
.pap-act:hover { background:rgba(58,123,255,0.12); }
.pap-act.danger { color:var(--danger); }
.pap-act.danger:hover { background:rgba(255,77,94,0.12); }

/* ── clases del día (aula del profe) ── */
.clases-dia { display:flex; gap:7px; flex-wrap:wrap; margin-top:9px; }
.clase-dia-pill { display:inline-flex; align-items:center; gap:6px; cursor:pointer;
  padding:5px 8px 5px 12px; border-radius:99px; font-size:13px; color:var(--text2);
  background:var(--glass-md); border:1px solid var(--border); transition:background .2s, color .2s; }
.clase-dia-pill:hover { background:var(--glass-hi); }
.clase-dia-pill.active { background:var(--text); color:#fff; border-color:transparent; }
.clase-dia-x { border:none; background:none; cursor:pointer; color:inherit; opacity:.5;
  font-size:11px; line-height:1; padding:3px; border-radius:99px; }
.clase-dia-x:hover { opacity:1; }

/* Continuar hoy: sale solo dentro de una clase de otro dia. Discreto -
   repasar es lo normal, continuar es la excepcion- pero con el color de
   acento, porque escribe en el diario del alumno. */
.continuar-hoy-btn { margin-left:10px; padding:5px 12px; border-radius:99px; cursor:pointer;
  font-size:13px; font-family:inherit; color:var(--accent);
  background:rgba(var(--accent-rgb),0.10); border:1px solid rgba(var(--accent-rgb),0.28);
  transition:background .2s, transform .2s cubic-bezier(.25,.1,.25,1); }
.continuar-hoy-btn:hover { background:rgba(var(--accent-rgb),0.18); }
.continuar-hoy-btn:active { transform:scale(.96); }

/* ── OTRA CLASE button ── */
.otra-clase-btn {
  display:flex; align-items:center; gap:8px; position:relative;
  padding:10px 20px; border-radius:var(--button-radius); border:none; cursor:pointer;
  background:var(--button-fill); border:1px solid var(--button-border);
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:var(--button-font-size); letter-spacing:.3px;
  color:var(--button-text); backdrop-filter:blur(var(--button-blur)) saturate(var(--button-saturate)); flex-shrink:0;
  transition:all .38s cubic-bezier(.25,.1,.25,1);
  box-shadow:
    inset 0 0 var(--button-inset-blur) rgba(16,22,34,var(--button-inset-opacity)),
    inset 0 calc(-1 * var(--button-inset-bottom-y)) var(--button-inset-bottom-blur) rgba(16,22,34,var(--button-inset-bottom-opacity)),
    0 var(--button-shadow-y) var(--button-shadow-blur) var(--button-shadow);
}
.otra-clase-btn:hover { background:var(--button-hover-fill); transform:translateY(calc(-1px - var(--button-hover-lift))); }
.otra-clase-btn:active { transform:scale(.96); }

/* ── TOPIC PICKER MODAL ── */
.topic-picker-grid {
  display:flex; flex-direction:column; gap:8px;
}
.topic-picker-item {
  display:flex; align-items:center; gap:12px; padding:12px 14px;
  background:rgba(255,255,255,0.45); border:1.5px solid rgba(255,255,255,0.6);
  border-radius:var(--r-lg); cursor:pointer; transition:all .2s;
}
.topic-picker-item:hover { background:rgba(255,255,255,0.75); transform:translateX(3px); }
.topic-picker-item.current { border-color:var(--accent); background:rgba(var(--accent-rgb),0.08); }
.topic-picker-img { width:44px; height:44px; border-radius:var(--r-sm); object-fit:cover; flex-shrink:0; }
.topic-picker-name { font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; font-weight:400; letter-spacing:.3px; flex:1; }
/* Igual en el selector de clase: el punto marca cual es la de ahora. */
.topic-picker-check { display:inline-block; width:8px; height:8px; border-radius:50%;
  background:var(--accent); flex-shrink:0; }

/* ── ASSIGN SECTION title row ── */
.assign-section-title {
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400;
  letter-spacing:.4px; color:var(--text2); margin-bottom:12px;
  display:flex; align-items:center; gap:10px;
}

/* ── CLASSROOMS SCREEN ── */
#screen-classrooms { background:var(--bg); }
.classrooms-header { padding:18px 24px 14px; flex-shrink:0; display:flex; align-items:center; gap:12px; }
@media (min-width:600px) { .classrooms-header { padding:20px 32px 16px; } }
/* Aula header inner centering - matches live-view-content max-width on wide screens */
@media (min-width:820px) {
  .classrooms-header { padding-left:calc(50% - 344px); padding-right:calc(50% - 344px); }
  .aula-tabs { padding-left:calc(50% - 344px); padding-right:calc(50% - 344px); }
}
.classrooms-title { font-family:'Coolvetica','DM Sans',sans-serif; font-size:22px; font-weight:400; flex:1; letter-spacing:.3px; }
/* El nombre del alumno es el título de toda su pantalla - más grande que
   una etiqueta de cabecera normal, al estilo del diseño de referencia. */
#student-detail-name { font-size:42px; letter-spacing:.3px; }
.student-list { padding:0; display:flex; flex-direction:column; }
.estudiantes-body { flex:1; min-height:0; display:flex; overflow:hidden; }
/* Caja invisible centrada: los nombres van pegados a SU izquierda y la barra
   justo a su derecha - no repartidos por toda la pantalla. */
.estudiantes-centro {
  display:flex; align-items:stretch; gap:var(--dc-sp-40);
  width:100%; max-width:var(--dc-w-row-ajustes); margin:0 auto; min-height:0;
}
.estudiantes-centro > .scroll { flex:1; min-width:0; padding:var(--dc-sp-24) 0; }

/* ── ACTIVE LESSON BANNER (student welcome) ── */
.active-lesson-banner {
  margin:0 20px 20px;
  background:linear-gradient(135deg, rgba(var(--accent-rgb),0.18) 0%, rgba(var(--accent2-rgb),0.12) 100%);
  border:1.5px solid rgba(var(--accent-rgb),0.3);
  border-radius:var(--r-xl); padding:20px;
  animation:fadeUp .5s cubic-bezier(.25,.1,.25,1) both;
  backdrop-filter:blur(20px);
}
.active-lesson-label {
  font-size:10px; font-weight:700; letter-spacing:1.2px; text-transform:uppercase;
  color:var(--accent); margin-bottom:8px; display:flex; align-items:center; gap:6px;
}
.active-lesson-dot {
  width:7px; height:7px; border-radius:50%; background:var(--accent);
  animation:livePulse 1.4s ease-in-out infinite;
}
.active-lesson-title {
  font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:26px; font-weight:400; letter-spacing:.3px;
  color:var(--text); margin-bottom:6px; line-height:1.1;
}
.active-lesson-sub {
  font-size:12px; color:var(--text3); margin-bottom:16px;
}
.active-lesson-img {
  width:100%; height:140px; object-fit:cover; border-radius:var(--r-lg);
  margin-bottom:16px; display:block;
}
.active-lesson-btn {
  width:100%; padding:14px; border-radius:var(--r-pill); border:none; cursor:pointer;
  background:var(--accent); color:#fff;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:18px; font-weight:400;
  letter-spacing:.5px; transition:all .38s cubic-bezier(.25,.1,.25,1);
  box-shadow:0 4px 20px rgba(var(--accent-rgb),0.35);
}
.active-lesson-btn:hover { transform:translateY(-2px); box-shadow:0 8px 28px rgba(var(--accent-rgb),0.4); }
.active-lesson-btn:active { transform:scale(.97); }
.active-lesson-progress {
  display:flex; align-items:center; gap:10px; margin-top:14px;
}
.active-lesson-progress-bar {
  flex:1; height:5px; background:rgba(26,34,51,0.12); border-radius:var(--r-pill); overflow:hidden;
}
.active-lesson-progress-fill {
  height:100%; background:var(--accent2); border-radius:var(--r-pill); transition:width .4s cubic-bezier(.34,1.2,.64,1);
}
.active-lesson-progress-pct {
  font-size:11px; font-weight:700; color:var(--accent2); min-width:30px; text-align:right;
}
/* ── SET ACTIVE LESSON (teacher panel) ── */
.set-lesson-btn {
  padding:6px 14px; border-radius:var(--r-pill); border:none; cursor:pointer;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:13px; letter-spacing:.3px;
  background:rgba(var(--accent-rgb),0.12); color:var(--accent);
  border:1px solid rgba(var(--accent-rgb),0.25);
  transition:all .22s; white-space:nowrap; flex-shrink:0;
}
.set-lesson-btn:hover { background:rgba(var(--accent-rgb),0.2); }
.set-lesson-btn.active-now {
  background:var(--accent); color:#fff;
  box-shadow:0 2px 10px rgba(var(--accent-rgb),0.35);
  border-color:transparent;
}
.set-lesson-btn.clear-btn {
  background:rgba(var(--danger-rgb),0.08); color:var(--danger);
  border-color:rgba(var(--danger-rgb),0.2);
}
.set-lesson-btn.clear-btn:hover { background:rgba(var(--danger-rgb),0.15); }
.active-lesson-row {
  background:rgba(var(--accent-rgb),0.07); border:1.5px solid rgba(var(--accent-rgb),0.2);
  border-radius:var(--r-lg); padding:12px 14px; margin-bottom:12px;
  display:flex; align-items:center; gap:10px;
}
.active-lesson-row-icon { font-size:20px; flex-shrink:0; }
.active-lesson-row-info { flex:1; }
.active-lesson-row-name {
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:15px; font-weight:400;
  letter-spacing:.3px; color:var(--text);
}
.active-lesson-row-hint { font-size:11px; color:var(--accent); margin-top:2px; font-weight:600; }
/* ── RESET EXERCISE BUTTON (teacher in live view) ── */
.reset-exercise-btn {
  padding:7px 16px; border-radius:var(--r-pill); border:1px solid rgba(26,34,51,0.15);
  background:rgba(255,255,255,0.4); color:var(--text2); cursor:pointer;
  font-family:'DM Sans',sans-serif; font-size:12px; font-weight:600;
  transition:all .25s; margin-left:auto;
}
.reset-exercise-btn:hover { background:rgba(255,255,255,0.7); }

/* ── STUDENT DETAIL SCREEN ── */
.assign-section { padding:16px 18px; }
.assign-section-title { font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.4px; color:var(--text2); margin-bottom:12px; }
.assign-topic-row {
  display:flex; align-items:center; gap:10px; padding:10px 14px;
  background:var(--glass-md); border:1px solid var(--border); border-radius:var(--r-md);
  margin-bottom:8px; backdrop-filter:blur(16px);
}
.assign-topic-img { width:36px; height:36px; border-radius:var(--r-xs); object-fit:cover; background:rgba(255,255,255,0.2); display:flex; align-items:center; justify-content:center; font-size:18px; flex-shrink:0; }
.assign-topic-name { flex:1; font-size:14px; font-weight:600; }
.toggle-switch { position:relative; width:44px; height:26px; flex-shrink:0; }
.toggle-switch input { opacity:0; width:0; height:0; }
.toggle-slider {
  position:absolute; inset:0; border-radius:var(--r-pill); cursor:pointer;
  background:rgba(26,34,51,0.15); transition:background .2s;
}
.toggle-slider:before {
  content:''; position:absolute; width:20px; height:20px; border-radius:50%;
  left:3px; top:3px; background:#fff; transition:transform .2s;
  box-shadow:0 1px 4px rgba(0,0,0,.2);
}
.toggle-switch input:checked + .toggle-slider { background:var(--accent); }
.toggle-switch input:checked + .toggle-slider:before { transform:translateX(18px); }

.fav-list { padding:0 18px 20px; }
.fav-item {
  display:flex; align-items:center; gap:10px; padding:10px 14px;
  background:rgba(var(--accent-rgb),0.06); border:1px solid rgba(var(--accent-rgb),0.15);
  border-radius:var(--r-sm); margin-bottom:6px; font-size:13px;
}
.fav-es { font-weight:700; color:var(--text); }
.fav-arrow { color:var(--text3); font-size:12px; }
.fav-ru { color:var(--accent); font-weight:600; }
.fav-del { margin-left:auto; background:none; border:none; cursor:pointer; font-size:14px; opacity:.4; }
.fav-del:hover { opacity:1; color:var(--danger); }

/* ── TRANSLATOR BUTTON ── */
/* ── TRANSLATOR FAB (mobile only) ── */
.translator-fab {
  position:fixed; bottom:28px; right:20px; z-index:400;
  height:42px; padding:0 20px; border-radius:var(--r-pill); border:none; cursor:pointer;
  background:rgba(26,34,51,0.85); backdrop-filter:blur(20px);
  color:#fff; font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:15px; letter-spacing:.5px;
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 4px 20px rgba(26,34,51,0.3);
  transition:all .38s cubic-bezier(.25,.1,.25,1);
}
.translator-fab:hover { transform:translateY(-3px); box-shadow:0 8px 28px rgba(26,34,51,0.35); }
.translator-fab.hidden { display:none; }

/* ── TRANSLATOR PANEL - mobile: bottom sheet, desktop: left sidebar ── */
.translator-panel {
  position:fixed; z-index:600;
  background:rgba(220,228,238,0.97); backdrop-filter:blur(30px);
  border:1px solid var(--border);
  display:flex; flex-direction:column;
  /* mobile */
  bottom:0; left:0; right:0;
  border-radius:var(--r-xl) var(--r-xl) 0 0;
  box-shadow:0 -8px 40px rgba(26,34,51,0.2);
  transform:translateY(100%);
  transition:transform .42s cubic-bezier(.25,.1,.25,1);
  max-width:480px; margin:0 auto;
  max-height:80vh;
}
.translator-panel.open { transform:translateY(0); }

@media (min-width: 700px) {
  .translator-fab { display:none !important; }
  /* Desktop: overlay panel on the right, doesn't compress content */
  .translator-panel {
    left:auto; right:0; top:0; bottom:0;
    width:300px; max-width:300px; max-height:100vh; margin:0;
    border-radius:var(--r-xl) 0 0 var(--r-xl);
    border-right:none;
    box-shadow:-4px 0 30px rgba(26,34,51,0.15);
    transform:translateX(100%);
    transition:transform .42s cubic-bezier(.25,.1,.25,1);
  }
  .translator-panel.open { transform:translateX(0); }
  .translator-handle { display:none; }
  /* Persistent toggle tab on the right edge */
  .translator-desktop-toggle {
    position:static; height:36px; padding:0 16px; border-radius:var(--r-pill);
    background:rgba(255,255,255,0.45); border:1px solid rgba(255,255,255,0.7);
    color:var(--text); cursor:pointer;
    font-family:'Coolvetica','DM Sans',sans-serif; font-size:15px; letter-spacing:.3px;
    display:flex; align-items:center; justify-content:center;
    box-shadow:0 2px 8px rgba(26,34,51,0.07); transition:all .38s cubic-bezier(.25,.1,.25,1);
    backdrop-filter:blur(16px);
  }
  .translator-desktop-toggle:hover { background:rgba(255,255,255,0.7); }
  .translator-desktop-toggle.hidden { display:none; }
  /* No content shift needed - panel overlays */
  #screen-lesson.translator-open { padding-left:0; }
}
@media (max-width: 699px) {
  .translator-desktop-toggle { display:none !important; }
}
.translator-panel.open { transform:translateY(0); }
.translator-handle { width:40px; height:4px; background:rgba(26,34,51,0.2); border-radius:var(--r-pill); margin:12px auto 0; flex-shrink:0; }
.translator-head { padding:12px 18px 8px; display:flex; align-items:center; gap:8px; flex-shrink:0; }
.translator-head-title { font-family:'Coolvetica','DM Sans',sans-serif; font-size:18px; font-weight:400; letter-spacing:.4px; flex:1; }
.translator-close { width:28px; height:28px; border-radius:var(--r-xs); border:none; background:rgba(26,34,51,0.08); cursor:pointer; font-size:15px; display:flex; align-items:center; justify-content:center; }
.translator-body { padding:0 18px 8px; flex:1; overflow-y:auto; }
.translator-body::-webkit-scrollbar { display:none; }
.translator-input-row { display:flex; gap:8px; align-items:flex-start; margin-bottom:10px; }
.translator-textarea {
  flex:1; min-height:60px; max-height:120px; resize:none; padding:10px 12px;
  background:rgba(255,255,255,0.7); border:1.5px solid var(--border); border-radius:var(--r-md);
  font-size:14px; font-family:'DM Sans',sans-serif; color:var(--text); outline:none;
  transition:border-color .18s; line-height:1.5;
}
.translator-textarea:focus { border-color:var(--accent); background:rgba(255,255,255,0.9); }
.translator-go-btn {
  width:42px; height:42px; border-radius:var(--r-md); border:none; background:var(--text);
  color:#fff; font-size:16px; cursor:pointer; flex-shrink:0; display:flex;
  align-items:center; justify-content:center; transition:all .18s;
}
.translator-go-btn:hover { background:var(--accent); }
.translator-result {
  background:rgba(var(--accent-rgb),0.07); border:1px solid rgba(var(--accent-rgb),0.18);
  border-radius:var(--r-md); padding:12px 14px; font-size:14px; font-weight:600;
  color:var(--text); min-height:44px; margin-bottom:10px; line-height:1.5;
  display:none;
}
.translator-result.show { display:block; }
.translator-result-actions { display:flex; gap:8px; margin-bottom:12px; }
.translator-save-btn {
  flex:1; padding:10px; border-radius:var(--r-pill); border:none; cursor:pointer;
  background:rgba(var(--accent2-rgb),0.15); color:var(--accent2); font-size:16px;
  font-weight:400; font-family:'Coolvetica','DM Sans',sans-serif; letter-spacing:.3px; transition:all .38s cubic-bezier(.25,.1,.25,1);
}
.translator-save-btn:hover { background:rgba(var(--accent2-rgb),0.25); }
.translator-save-btn:disabled { opacity:.4; cursor:default; }
.translator-lang-toggle {
  padding:9px 14px; border-radius:var(--r-sm); border:1px solid var(--border);
  background:var(--glass); cursor:pointer; font-size:12px; font-weight:700;
  color:var(--text2); font-family:'DM Sans',sans-serif; transition:all .18s; white-space:nowrap;
}

/* ── EPHEMERAL MESSAGES - soft bloom over a dimmed backdrop ── */
#whisper-backdrop {
  position:fixed; inset:0; z-index:680;
  background:rgba(16,20,30,0); backdrop-filter:blur(0px);
  opacity:0; pointer-events:none;
  transition:opacity .6s ease, background .6s ease, backdrop-filter .6s ease;
}
#whisper-backdrop.show { opacity:1; background:rgba(16,20,30,0.5); backdrop-filter:blur(4px); }
#whisper-backdrop.interactive { pointer-events:auto; }

#whisper-stage {
  position:fixed; inset:0; z-index:690;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:14px; padding:32px; pointer-events:none;
}
.whisper {
  max-width:min(560px, 86vw); padding:18px 24px;
  font-size:23px; line-height:1.42; font-family:'DM Sans',sans-serif; font-weight:500;
  border-radius:var(--r-xl); white-space:pre-wrap; word-wrap:break-word; overflow-wrap:anywhere;
  box-shadow:0 18px 60px rgba(8,12,20,0.45); will-change:opacity, transform, filter;
}
.whisper.received { background:rgba(246,248,251,0.98); color:#1a2233; border-bottom-left-radius:9px; }
.whisper.sent { background:var(--accent); color:#fff; border-bottom-right-radius:9px; }
@keyframes whisperIn  { 0%{ opacity:0; transform:translateY(18px) scale(.9);  filter:blur(12px);} 100%{ opacity:1; transform:translateY(0) scale(1); filter:blur(0);} }
@keyframes whisperOut { 0%{ opacity:1; transform:translateY(0) scale(1); filter:blur(0);} 100%{ opacity:0; transform:translateY(-26px) scale(1.06); filter:blur(16px);} }
.whisper.in  { animation:whisperIn .62s cubic-bezier(.2,.8,.2,1) both; }
.whisper.out { animation:whisperOut 1.2s cubic-bezier(.4,0,.6,1) both; }

/* composer - a "free glass" writing surface, no box */
#whisper-composer {
  position:fixed; inset:0; z-index:700;
  display:flex; align-items:flex-end; justify-content:center;
  opacity:0; pointer-events:none; transition:opacity .4s ease;
}
#whisper-composer.open { opacity:1; pointer-events:auto; }
.whisper-composer-inner {
  width:100%; max-width:620px;
  padding:26px 24px calc(28px + env(safe-area-inset-bottom));
  display:flex; flex-direction:column; gap:16px;
  transform:translateY(24px); transition:transform .46s cubic-bezier(.2,.8,.2,1);
}
#whisper-composer.open .whisper-composer-inner { transform:translateY(0); }
.whisper-textarea {
  width:100%; resize:none; border:none; outline:none; background:transparent;
  color:#fff; font-family:'DM Sans',sans-serif; font-size:27px; line-height:1.38; font-weight:500;
  min-height:64px; max-height:42vh; caret-color:var(--accent);
  text-shadow:0 2px 24px rgba(0,0,0,0.35);
}
.whisper-textarea::placeholder { color:rgba(255,255,255,0.42); font-weight:400; }
.whisper-composer-actions { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.whisper-hint { font-size:12.5px; color:rgba(255,255,255,0.5); letter-spacing:.2px; }
.whisper-send {
  border:none; cursor:pointer; height:46px; padding:0 28px; border-radius:var(--r-pill);
  background:var(--accent); color:#fff; font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:18px; letter-spacing:.4px; display:flex; align-items:center;
  box-shadow:0 6px 26px rgba(var(--accent-rgb),0.5); transition:transform .12s, opacity .15s;
}
.whisper-send:hover { transform:translateY(-2px); }
.whisper-send:active { transform:scale(.95); }
.whisper-send:disabled { opacity:.4; cursor:default; transform:none; box-shadow:none; }

/* neutral entry points - no emoji, no colour. The teacher button lives in the
   aula header; the student button lives in the lesson header. Both reuse the
   existing neutral glass button styles, so they read identically. */
.whisper-teacher-btn, .whisper-student-btn { white-space:nowrap; }
@media (max-width:699px) {
  /* on mobile the lesson toolbar is hidden, so the grid lays out
     back-btn | title | Mensaje cleanly in its three columns */
  .whisper-student-btn { justify-self:end; }
}

/* ── FAVORITES DRAWER (student) ── */
.fav-fab {
  position:fixed; bottom:28px; right:80px; z-index:400;
  height:42px; padding:0 20px; border-radius:var(--r-pill); border:none; cursor:pointer;
  background:rgba(var(--accent-rgb),0.85); backdrop-filter:blur(20px);
  color:#fff; font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:15px; letter-spacing:.5px;
  display:flex; align-items:center; justify-content:center; gap:6px;
  box-shadow:0 4px 20px rgba(var(--accent-rgb),0.35);
  transition:all .38s cubic-bezier(.25,.1,.25,1);
}
.fav-fab:hover { transform:translateY(-3px); box-shadow:0 8px 28px rgba(var(--accent-rgb),0.4); }
.fav-fab.hidden { display:none !important; }
/* Pizarra de la sesión: mismo material que los otros FABs, una fila por encima
   para no chocar con Traducir. En escritorio manda el gemelo de la barra. */
.board-fab {
  position:fixed; bottom:78px; right:20px; z-index:400;
  height:42px; padding:0 20px; border-radius:var(--r-pill); border:none; cursor:pointer;
  background:rgba(255,255,255,0.92); backdrop-filter:blur(20px);
  color:var(--text); font-family:'Coolvetica','DM Sans',sans-serif;
  font-size:15px; letter-spacing:.5px;
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 4px 20px rgba(26,34,51,0.22);
  transition:all .38s cubic-bezier(.25,.1,.25,1);
}
.board-fab:hover { transform:translateY(-3px); box-shadow:0 8px 28px rgba(26,34,51,0.28); }
.board-fab.hidden { display:none !important; }
@media(min-width:700px) { .board-fab { display:none !important; } }
@media(min-width:700px) {
  .fav-fab { position:relative; bottom:auto; right:auto; box-shadow:none; background:rgba(255,255,255,0.45); color:var(--text); border:1px solid rgba(255,255,255,0.7); backdrop-filter:blur(16px); }
  .fav-fab:hover { background:rgba(255,255,255,0.7); transform:translateY(-2px); box-shadow:0 8px 28px rgba(26,34,51,0.08); }
  .fav-fab.hidden { display:none !important; }
  .lesson-toolbar { display:flex; gap:8px; }
}
/* Mobile: hide toolbar-injected buttons (use FABs instead), fix title centering */
@media(max-width:699px) {
  #lesson-toolbar { display:none !important; }
  .lesson-header-inner { grid-template-columns: auto 1fr auto; display:grid; align-items:center; gap:8px; }
  .lesson-title-bar { text-align:center; }
  .lesson-title-bar h2 { max-width:none; font-size:17px; }
  /* Both FABs circular and identical size - consistent pair */
  .fav-fab {
    bottom:84px; right:20px; width:48px; height:48px; padding:0; gap:0;
    font-size:0; border-radius:50%;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 3H5a2 2 0 0 0-2 2v14l7-5 7 5V5a2 2 0 0 0-2-2z'/%3E%3C/svg%3E");
    background-repeat:no-repeat; background-position:center;
  }
  .translator-fab {
    width:48px; height:48px; padding:0; border-radius:50%;
    font-size:0;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='10' r='8'/%3E%3Cpath d='M2 10h16M10 2a14 14 0 0 1 0 16M10 2a14 14 0 0 0 0 16'/%3E%3C/svg%3E");
    background-repeat:no-repeat; background-position:center;
  }
}
.fav-count-badge {
  position:absolute; top:-4px; right:-4px; width:18px; height:18px;
  background:var(--danger); border-radius:50%; font-size:10px; font-weight:700;
  color:#fff; display:flex; align-items:center; justify-content:center;
  display:none;
}
.fav-count-badge.show { display:flex; }
.live-topic-card {
  background:rgba(255,255,255,0.35); border:1px solid rgba(255,255,255,0.6);
  border-radius:var(--r-lg); padding:14px 16px; margin-bottom:10px;
}
.live-topic-name { font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.3px; margin-bottom:10px; }
.live-last-seen { font-size:11px; color:var(--text3); margin-bottom:10px; }
.live-ex-row {
  display:flex; align-items:center; gap:8px; padding:8px 12px;
  background:rgba(255,255,255,0.4); border-radius:var(--r-sm); margin-bottom:6px;
  font-size:13px;
}
.live-ex-status { width:8px; height:8px; border-radius:50%; flex-shrink:0; }
.live-ex-status.done { background:var(--accent2); }
.live-ex-status.active { background:var(--accent); animation:livePulse 1.4s ease-in-out infinite; }
.live-ex-status.pending { background:rgba(26,34,51,0.2); }
.live-ex-name { flex:1; font-weight:600; }
.live-ex-answer { font-size:12px; color:var(--text3); font-family:'DM Mono',monospace; max-width:180px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.live-answers-detail { margin-top:6px; padding:8px 12px; background:rgba(var(--accent-rgb),0.05); border-radius:var(--r-xs); }
.live-answer-item { font-size:12px; color:var(--text2); padding:2px 0; display:flex; gap:6px; }
.live-answer-item span:first-child { color:var(--text3); }
.reset-progress-btn {
  padding:7px 16px; border-radius:var(--r-pill); border:1px solid rgba(var(--danger-rgb),0.3);
  background:rgba(var(--danger-rgb),0.07); color:var(--danger); cursor:pointer;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:13px; letter-spacing:.3px;
  transition:all .25s; margin-top:8px;
}
.reset-progress-btn:hover { background:rgba(var(--danger-rgb),0.14); }
/* .login-register-link vivía aquí: el enlace "¿Primera vez? Crear cuenta"
   de la tarjeta de login, que ya no existe - crear cuenta es una pestaña
   de la entrada desde el 04/09/2026. */
.so-line { display:flex; flex-wrap:wrap; align-items:center; gap:4px 5px; font-size:17px; line-height:2.6; margin-bottom:4px; font-family:'Canela Text','DM Sans',sans-serif; letter-spacing:.2px; }
.so-select {
  height:34px; border-radius:var(--slot-radius); padding:0 28px 0 14px; border:1.5px solid var(--slot-border);
  background-color:var(--slot-fill); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); font-size:13px; font-weight:600;
  font-family:'DM Sans',sans-serif; color:var(--text); outline:none; cursor:pointer;
  appearance:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%231a2233' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 10px center;
  transition:all .38s cubic-bezier(.25,.1,.25,1); box-shadow:0 var(--slot-shadow-y) var(--slot-shadow-blur) rgba(26,34,51,var(--slot-shadow-opacity)), inset 0 1px 0 rgba(255,255,255,0.6);
}
.so-select:focus { border-color:rgba(var(--accent-rgb),0.55); box-shadow:0 2px 10px rgba(var(--accent-rgb),0.15), inset 0 1px 0 rgba(255,255,255,0.7); }
.so-select.ok  { border-color:#22c55e; background-color:rgba(34,197,94,0.08); color:#16a34a; }
.so-select.bad { border-color:var(--danger); background-color:rgba(var(--danger-rgb),0.06); animation:shake .28s; }
.so-hint { font-style:italic; color:var(--text3); font-size:13px; }

/* ── DRAG PRO STUDENT ── */
.fb-blank {
  display:inline-flex; align-items:center; justify-content:center;
  min-width:80px; height:34px; border-radius:var(--r-xs); padding:0 10px;
  border:2px dashed rgba(var(--accent-rgb),0.4); background:rgba(var(--accent-rgb),0.05);
  font-size:13px; font-weight:700; color:rgba(var(--accent-rgb),.7); cursor:pointer; transition:all .2s;
  user-select:none;
}
.fb-blank.filled { border-style:solid; border-color:var(--accent2); background:rgba(var(--accent2-rgb),0.1); color:var(--accent2); }
.fb-blank.ok { border-color:#22c55e; background:rgba(34,197,94,0.1); color:#22c55e; }
.fb-blank.bad { border-color:var(--danger); background:rgba(var(--danger-rgb),0.08); color:var(--danger); animation:shake .28s; }
.vocab-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.flip-card { perspective:700px; cursor:pointer; height:120px; }
.flip-inner { position:relative; width:100%; height:100%; transition:transform .45s cubic-bezier(.4,0,.2,1); transform-style:preserve-3d; }
.flip-card.flipped .flip-inner { transform:rotateY(180deg); }
.flip-f, .flip-b { position:absolute; inset:0; border-radius:var(--r-md); backface-visibility:hidden; display:flex; flex-direction:column; align-items:center; justify-content:center; padding:10px; text-align:center; border:1px solid var(--border); backdrop-filter:blur(16px); }
.flip-f { background:var(--glass-md); }
.flip-b { background:rgba(var(--accent2-rgb),0.15); border-color:rgba(var(--accent2-rgb),0.4); transform:rotateY(180deg); }
.flip-em { font-size:26px; margin-bottom:5px; }
.flip-word { font-size:13px; font-weight:700; }
.flip-tr { font-size:13px; color:var(--accent2); font-weight:700; }
.flip-hint { font-size:10px; color:var(--text3); margin-top:3px; }
.check-row { padding:12px 16px; border-top:1px solid var(--border-lo); display:flex; justify-content:flex-end; }
.check-btn {
  padding:11px 26px; border-radius:var(--r-pill); border:none; cursor:pointer;
  font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; font-weight:400; letter-spacing:.4px;
  background:var(--text); color:#fff;
  transition:all .38s cubic-bezier(.25,.1,.25,1);
  box-shadow:0 4px 16px rgba(26,34,51,0.22);
}
.check-btn:hover { transform:translateY(-3px); box-shadow:0 8px 24px rgba(26,34,51,0.28); }
.check-btn:active { transform:scale(.96) !important; box-shadow:0 1px 4px rgba(26,34,51,0.15); }
.check-btn.next { background:var(--accent2); color:#fff; box-shadow:0 2px 8px rgba(var(--accent2-rgb),0.3); }
.check-btn.vocab-ok { background:var(--accent2); }
.result-banner {
  padding:14px 20px; font-size:17px; font-weight:400; text-align:center;
  font-family:'Coolvetica','DM Sans',sans-serif; letter-spacing:.3px;
  border-top:1px solid var(--border-lo); display:none;
  animation:fadeUp .35s cubic-bezier(.25,.1,.25,1) both;
}
.result-banner.ok  { background:rgba(34,197,94,0.12); color:#16a34a; display:block; }
.result-banner.bad { background:rgba(var(--danger-rgb),0.08); color:var(--danger); display:block; animation:shake .3s ease, fadeUp .2s ease; }
.add-ex-btn { width:auto; padding:12px 28px; border-radius:var(--r-pill); border:1.5px dashed rgba(26,34,51,0.2); background:rgba(255,255,255,0.2); cursor:pointer; font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; font-weight:400; letter-spacing:.3px; color:var(--text3); display:flex; align-items:center; justify-content:center; gap:8px; transition:all .38s cubic-bezier(.25,.1,.25,1); margin:0 auto 24px; }
.add-ex-btn:hover { background:var(--glass); color:var(--text); border-color:rgba(26,34,51,0.4); }

/* ── MODAL ── */
.modal-overlay {
  display:none; position:fixed; inset:0; z-index:1000;
  background:rgba(15,20,35,0.45); backdrop-filter:blur(6px);
  align-items:flex-end; justify-content:center;
  opacity:0; transition:opacity .2s;
}
.modal-overlay.open { display:flex; opacity:1; }
.modal-overlay.closing { opacity:0; }
.modal-overlay.closing .modal { animation:slideDown .32s cubic-bezier(.25,.1,.25,1) forwards; }
#modal-favs .modal {
  max-width:320px; height:100vh; max-height:100vh; border-radius:0;
  position:fixed; right:0; top:0; bottom:0; margin:0;
  border-radius:var(--r-xl) 0 0 var(--r-xl);
  animation:slideFromRight .45s cubic-bezier(.25,.1,.25,1);
}
#modal-favs.closing .modal { animation:slideToRight .32s cubic-bezier(.25,.1,.25,1) forwards; }
@media(max-width:600px){#modal-favs .modal{max-width:100%;height:auto;max-height:80vh;border-radius:var(--r-xl) var(--r-xl) 0 0;position:relative;}}
@keyframes slideFromRight { from{opacity:0;transform:translateX(60px)} to{opacity:1;transform:translateX(0)} }
@keyframes slideToRight { from{opacity:1;transform:translateX(0)} to{opacity:0;transform:translateX(60px)} }
.modal {
  width:100%; max-width:560px; max-height:92vh;
  border-radius:var(--r-xl) var(--r-xl) 0 0; background:rgba(220,228,238,0.96);
  backdrop-filter:blur(30px); border:1px solid var(--border);
  padding:0; overflow:hidden; display:flex; flex-direction:column;
  animation:slideUp .45s cubic-bezier(.25,.1,.25,1);
}
@keyframes slideUp { from{opacity:0;transform:translateY(60px) scale(.97)} to{opacity:1;transform:translateY(0) scale(1)} }
@keyframes slideDown { from{opacity:1;transform:translateY(0) scale(1)} to{opacity:0;transform:translateY(50px) scale(.97)} }
.modal-handle { width:40px; height:4px; background:rgba(26,34,51,0.2); border-radius:var(--r-pill); margin:12px auto 0; flex-shrink:0; }
.modal-head { padding:14px 18px 10px; display:flex; align-items:center; gap:10px; flex-shrink:0; }
.modal-title { font-family:'Coolvetica','DM Sans',sans-serif; font-size:20px; font-weight:400; flex:1; letter-spacing:.3px; }
.modal-close { width:30px; height:30px; border-radius:var(--r-pill); border:none; background:rgba(26,34,51,0.08); cursor:pointer; font-size:14px; display:flex; align-items:center; justify-content:center; transition:all .25s; }
.modal-close:hover { background:rgba(26,34,51,0.14); transform:scale(1.08); }
.modal-close:active { transform:scale(.92); }
.modal-body { flex:1; overflow-y:auto; padding:0 18px 24px; }
.modal-body::-webkit-scrollbar { display:none; }
.modal-footer { padding:12px 18px 20px; display:flex; gap:8px; flex-shrink:0; border-top:1px solid var(--border-lo); }
.modal-btn { flex:1; padding:13px; border-radius:var(--r-pill); border:none; cursor:pointer; font-family:'Coolvetica','DM Sans',sans-serif; font-size:17px; font-weight:400; letter-spacing:.3px; transition:all .38s cubic-bezier(.25,.1,.25,1); }
.modal-btn.cancel { background:rgba(26,34,51,0.08); color:var(--text); }
.modal-btn.save { background:var(--text); color:#fff; box-shadow:0 2px 8px rgba(26,34,51,0.2); }
.modal-btn.save:hover { transform:translateY(-2px); box-shadow:0 6px 16px rgba(26,34,51,0.25); }
.modal-btn.save:active { transform:scale(.97); }
.modal-btn.cancel:active { opacity:.7; }

/* ── LA PANTALLA DE CREAR ────────────────────────────────────────────
   Reemplaza el menú que subía desde abajo para "Nueva sección" y compañía
   (Rolando, 03/09, 3.ª vuelta): "nada de menú desplegable de abajo". Ahora
   es pantalla completa, difuminada, con el fondo detenido -nada se mueve
   detrás- y todo en el aire: sin tarjeta, sin borde, sólo el título enorme
   en Coolvetica, la ayuda debajo y una línea invisible donde escribir.
   Enter crea. La esquina es "Hablamos", que aquí hace de salida - la MISMA
   pieza que ya es la salida de la pizarra y el "volver" del resto de la
   plataforma (Rolando: "que refuerza la marca, estoy aquí, en Hablamos").
   El título va DENTRO de un lienzo centrado (--dc-w-canvas) pero alineado a
   la izquierda: no está pegado al borde ni en el centro exacto de la
   pantalla - está a la izquierda de una caja invisible que sí está
   centrada, que es como Rolando lo describió.
   OJO: esto va con backdrop-filter DE VERDAD, a diferencia de la pizarra.
   La pizarra renuncia al desenfoque real porque su lienzo se transforma en
   CADA fotograma (arrastrar, dibujar) y recalcular el desenfoque del fondo
   a esa frecuencia es lo que rompía la fluidez - ahí un color sólido que
   imita el resultado sale gratis. Aquí el fondo está "en stop": nada se
   mueve detrás mientras la pantalla de crear está abierta, así que el
   desenfoque se paga UNA vez al abrir y no vuelve a costar nada. Por eso
   aquí sí es cristal mate de verdad -se ve lo de detrás, congelado y
   desenfocado- y no una superficie opaca. */
/* El velo fue de .55 a .30, y el 04/09 (6.ª vuelta) a .14 con la luz
   levantada: "en pantallas como ajustes y tal, el fondo difuminado es
   demasiado oscuro, hay que hacerlo más claro". Lo que separa esta pantalla
   de la de detrás tiene que ser el CRISTAL, no la oscuridad: sube el
   desenfoque, baja el tinte y `brightness` devuelve el aire que el tinte
   quitaba, de modo que el fondo congelado tiene el mismo brillo que la
   plataforma en vivo - sólo que fuera de foco. */
.crear-ov {
  position:fixed; inset:0; z-index:1450; display:none; opacity:0;
  background:rgba(30,40,55,.14);
  -webkit-backdrop-filter:blur(34px) saturate(140%) brightness(1.10);
  backdrop-filter:blur(34px) saturate(140%) brightness(1.10);
  transition:opacity .30s cubic-bezier(.3,0,.2,1);
}
.crear-ov.show { opacity:1; }
.crear-ov.hide { opacity:0; transition-duration:.20s; }
.crear-marca {
  position:absolute; top:18px; left:26px; z-index:2;
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400;
  font-size:30px; letter-spacing:.5px; line-height:1;
  color:#fff; cursor:pointer; text-shadow:0 16px 28px rgba(20,30,45,.6); user-select:none;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { .crear-marca:hover { transform:scale(1.05); } }
.crear-marca:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }
.crear-cuerpo {
  position:absolute; inset:0; display:flex; flex-direction:column; justify-content:center;
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:0 var(--dc-sp-76);
}
.crear-titulo {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-140);
  color:var(--dc-ink); line-height:1.02; letter-spacing:var(--dc-tracking);
  text-shadow:var(--dc-shadow-text-strong);
}
.crear-ayuda {
  margin-top:var(--dc-sp-24);
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink-70);
}
/* La línea es invisible de verdad: sin borde, sin fondo, sin caja - el texto
   que escribes flota igual que el título, mismo blanco, mismo peso. La única
   señal de que ahí se escribe es el placeholder mientras está vacío y el
   cursor parpadeando. */
.crear-input {
  margin-top:var(--dc-sp-16); width:100%;
  -webkit-appearance:none; appearance:none;
  background:transparent !important; background-image:none; box-shadow:none;
  border:none; outline:none; padding:var(--dc-sp-8) 0;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-60);
  color:var(--dc-ink); caret-color:var(--dc-ink);
}
/* SIN text-shadow aquí, a diferencia del título: en un <input> Chrome no
   sigue el contorno de cada letra - pinta la sombra como una banda
   rectangular detrás de TODA la línea (se veía como un renglón resaltado
   encima del texto, no un halo). El título ya dice "esto es la marca"; lo
   que escribes no necesita decirlo otra vez. */
/* Chrome pinta un fondo claro tras el texto de un <input> mientras está
   enfocado si el usuario tiene "resaltar coincidencias" o cualquier gestor
   de contraseñas activo; con autocomplete/name genéricos a veces se cuela
   igual. `background:transparent!important` arriba ya lo tapa, pero esta
   regla remata el caso de Chrome/Safari autofill, que pinta por encima de
   cualquier `background` con su propio color. */
.crear-input:-webkit-autofill,
.crear-input:-webkit-autofill:hover,
.crear-input:-webkit-autofill:focus {
  -webkit-text-fill-color:var(--dc-ink);
  -webkit-box-shadow:0 0 0 1000px transparent inset;
  transition:background-color 9999s ease-in-out 0s;
}
.crear-input::placeholder { color:var(--dc-ink-70); text-shadow:none; }
/* El error de la pantalla de crear (un correo repetido al dar de alta a un
   alumno, p. ej.): una línea más bajo los renglones, del tamaño de la ayuda.
   Mientras el servidor contesta, la pantalla se queda quieta y apagada en
   vez de cerrarse: si se cerrara, el error no tendría dónde salir. */
.crear-error {
  display:none; margin-top:var(--dc-sp-24);
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:#ffdde0; text-shadow:var(--dc-shadow-text);
}
/* Las otras maneras de hacer lo mismo van debajo, más pequeñas y apagadas:
   lo principal es escribir el nombre; pedírselo a la IA es una salida más. */
.crear-opciones { margin-top:var(--dc-sp-40); }
.crear-opciones .opcion { font-size:var(--dc-fs-40); padding:var(--dc-sp-10) var(--dc-sp-24); text-transform:none; }
@media (any-hover: hover) { .crear-opciones .opcion:hover { font-size:var(--dc-fs-52); } }
.crear-ov.crear-esperando .crear-cuerpo { opacity:.55; pointer-events:none; transition:opacity var(--dc-t-salida) var(--dc-ease); }
@media (max-width:700px) { .crear-titulo { font-size:var(--dc-fs-80); } }

/* ── ELEGIR CLASE - el carrusel que se abre encima ────────────────────
   (Rolando, 04/09: "al estar dentro de una clase y querer añadir una nueva
   [...] debería de aparecer un nuevo menú que te de a elegir cuál en
   carrusel. Un carrusel con dirección horizontal igual que el del profesor y
   el alumno y todo el mundo, con todo detrás difuminado").

   Es la pantalla de "Nueva sección" (mismo velo, misma marca en la esquina
   que hace de salida) con el carrusel de siempre dentro. Lo que la hace
   utilizable con 150 temas es lo de arriba: una línea para buscar y dos
   filas de filtros -nivel y tipo-, porque una lista enorme sin clasificar no
   se puede recorrer ("hay que poner la opción de buscar porque son
   demasiados temas [...] antes de dar una lista enorme de temas sin
   clasificar").

   Los filtros NO son píldoras: son las mismas opciones en fila que separan
   "soy profesor" de "soy alumno" en la puerta. Una sola cápsula por pantalla
   en toda la plataforma, y aquí no hay ninguna. */
#elegir-ov .crear-cuerpo {
  justify-content:flex-start; padding-top:calc(90 * var(--dc-u)); overflow-y:auto;
}
#elegir-ov .crear-titulo { font-size:var(--dc-fs-100); }
#elegir-ov .crear-input { font-size:var(--dc-fs-50); max-width:calc(560 * var(--dc-u)); }
.filtros { display:flex; flex-wrap:wrap; gap:var(--dc-sp-34); margin-top:var(--dc-sp-24); }
.filtros .ent-op { font-size:var(--dc-fs-30); }
.filtros.filtros-secciones .ent-op { font-size:var(--dc-fs-30); opacity:.4; }
.filtros.filtros-secciones .ent-op.active { opacity:1; }
#elegir-ov .galeria { margin-top:var(--dc-sp-16); }
/* El carril vive a sangre dentro de una pantalla que sí tiene márgenes: se
   los quita con márgenes negativos para que la primera y la última puedan
   centrarse igual que en el inicio. */
#elegir-ov .galeria { margin-left:calc(-1 * var(--dc-sp-76)); margin-right:calc(-1 * var(--dc-sp-76)); }
#elegir-ov .galeria-carril { --gal-w: calc(20vw * var(--dc-dens, 1)); }
@media (max-width:620px) { #elegir-ov .galeria-carril { --gal-w: 56vw; } }
#elegir-ov .riel-vacio { padding-left:0; padding-right:0; }
/* Buscando, los filtros no cuentan (se busca en gramática Y temática): se
   apagan para decirlo, sin desaparecer - al borrar lo escrito vuelven. */
#elegir-ov .crear-cuerpo .filtros { transition:opacity var(--dc-t-lento) var(--dc-ease), max-height var(--dc-t-entrada) var(--dc-ease), margin var(--dc-t-entrada) var(--dc-ease), padding var(--dc-t-entrada) var(--dc-ease), filter var(--dc-t-entrada) var(--dc-ease); }
#elegir-ov .crear-cuerpo.elegir-buscando .filtros:not(.plegada) { opacity:.32; }
#elegir-ov #elegir-lista { position:relative; }

/* ── AVISOS Y PREGUNTAS ────────────────────────────────────────────────
   Un aviso ya no es una pastilla oscura abajo con un ✓ dentro (Rolando,
   04/09): es la FRASE, en Coolvetica, con todo lo de detrás desenfocado, y
   se va sola. Misma pieza que "Nueva sección" y Ajustes - la plataforma
   entera dice las cosas de la misma manera.
   Un aviso que PIDE respuesta ("¿quito esta clase?") es exactamente lo
   mismo con dos palabras debajo, sí y no, que se comportan como cualquier
   otra opción del sistema: crecen al acercarse y las demás se apagan.
   El aviso suelto NO recibe el ratón (pointer-events:none): pasa por
   encima de lo que estabas haciendo sin quitártelo de las manos. */
/* Mismo velo claro que la pantalla de crear: cristal, no sombra. */
.aviso-ov {
  position:fixed; inset:0; z-index:2400; display:none; opacity:0;
  align-items:center; justify-content:center;
  padding:var(--dc-sp-60) var(--dc-sp-76);
  background:rgba(30,40,55,.14);
  /* El brillo de más levantaba una banda clara contra los bordes de la
     pantalla -ahí es donde caen "sí" y "no"-, y se leía como si la sombra de
     las palabras estuviera cortada por un cuadro invisible (Rolando, 07/09).
     Con el desenfoque solo, el borde ya no se dibuja. */
  -webkit-backdrop-filter:blur(26px) saturate(130%);
  backdrop-filter:blur(26px) saturate(130%);
  transition:opacity .34s var(--dc-ease);
}
.aviso-ov.abierto { display:flex; }
.aviso-ov.show { opacity:1; }
/* UN AVISO NO RETIENE A NADIE, PERO SÍ DIFUMINA (Rolando, 11/09: "regresemos
   la pantalla difuminada a los avisos. Como en todos"). El 07/09 se le quitó
   el velo para que no pareciera que te sujetaba; volvió a pedirlo. Lo que se
   queda de aquella vuelta es lo importante: el aviso no recibe el ratón (pasa
   por encima de lo que estabas haciendo) y un clic en cualquier sitio lo
   retira. El desenfoque ENTRA un pelín más tarde que la frase: si la pantalla
   de detrás todavía está llegando (al crear una clase), empieza a difuminarse
   cuando ya casi está quieta, que es lo que se veía "tosco". */
.aviso-ov.solo-aviso { pointer-events:none; transition:opacity .42s var(--dc-ease) .08s; }
/* La frase ya lleva la sombra fuerte del sistema (.aviso-frase), que es lo
   que la hace legible ahora que no hay velo debajo. */
.aviso-caja {
  max-width:var(--dc-w-canvas); width:100%;
  transform:scale(.985); filter:blur(2px);
  transition:transform var(--dc-t-entrada) var(--dc-ease), filter var(--dc-t-entrada) var(--dc-ease);
}
.aviso-ov.show .aviso-caja { transform:none; filter:none; }
.aviso-frase {
  font-family:var(--dc-font); font-weight:var(--dc-weight);
  font-size:var(--dc-fs-100); line-height:1.04; letter-spacing:var(--dc-tracking);
  color:var(--dc-ink); text-shadow:var(--dc-shadow-text-strong);
  text-wrap:balance;
}
.aviso-ops { display:flex; gap:var(--dc-sp-64); margin-top:var(--dc-sp-60); }
.aviso-ops:empty { display:none; }
/* SOMBRAS QUE NO SE CORTAN (Rolando, 07/09: "se corta como por un cuadro
   invisible que tiene sí, y también no"). Estas palabras llevan la sombra
   fuerte del sistema, que se derrama bastante más allá de las letras; el
   navegador las pinta en una capa propia del tamaño de su caja, así que lo
   que sobresale desaparece de golpe y deja un rectángulo visible alrededor.
   El relleno es el hueco por el que sale la sombra y el margen negativo
   devuelve la palabra a su sitio: el mismo truco que ya usa el título de las
   fichas del carrusel. */
.aviso-op {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-60);
  color:var(--dc-ink); letter-spacing:var(--dc-tracking); line-height:1;
  background:none; border:none; cursor:pointer;
  padding:var(--dc-sp-24) var(--dc-sp-36);
  margin:calc(var(--dc-sp-24) * -1) calc(var(--dc-sp-36) * -1);
  text-transform:lowercase; text-shadow:var(--dc-shadow-text-strong);
  transform-origin:left center;
  transition:transform var(--dc-t-lento) var(--dc-ease), opacity var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) {
  .aviso-ops:has(.aviso-op:hover) .aviso-op:not(:hover) { opacity:.42; }
  .aviso-op:hover { transform:scale(1.08); }
}
.aviso-op:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }
/* Sin el aro negro del navegador: a este tamaño dibuja una caja alrededor de
   la palabra y rompe el aire de la pantalla. Con el teclado se responde con
   Enter (sí) y Escape (no), que es lo que hace el propio diálogo. */
.aviso-op:focus { outline:none; }
@media (max-width:700px) {
  .aviso-frase { font-size:var(--dc-fs-60); }
  .aviso-op { font-size:var(--dc-fs-40); }
}

/* ── AJUSTES, dentro de la misma pantalla de crear ─────────────────────
   Es más largo que "Nueva sección" -varias tarjetas, una debajo de otra-
   así que en vez de centrarse en la pantalla (.crear-cuerpo) fluye y la
   propia .crear-ov se desplaza; la marca queda fija arriba mientras el
   cuerpo se mueve por debajo (Rolando, 03/09, 3.ª vuelta: "en ajustes lo
   mismo, nada de un menú que surge desde abajo"). */
.ajustes-ov { overflow-y:auto; }
.ajustes-ov .crear-marca { position:fixed; }
.ajustes-cuerpo {
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:calc(140 * var(--dc-u)) var(--dc-sp-76) var(--dc-sp-72);
}
.ajustes-cuerpo .crear-titulo { margin-bottom:var(--dc-sp-48); }
.ajustes-cargando {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); color:var(--dc-ink-70);
}
.ajustes-card { padding:var(--dc-sp-24) 0; border-bottom:1px solid rgba(255,255,255,.14); }
.ajustes-card:first-child { padding-top:0; }
.ajustes-card-cabeza {
  display:flex; justify-content:space-between; align-items:baseline;
  gap:var(--dc-sp-16); flex-wrap:wrap;
}
.ajustes-card-titulo {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-40);
  color:var(--dc-ink);
}
.ajustes-card-ayuda {
  font-family:var(--dc-font); font-size:var(--dc-fs-22); color:var(--dc-ink-70);
  margin-top:6px; max-width:calc(640 * var(--dc-u)); line-height:1.4;
}
.ajustes-card-estado { font-family:var(--dc-font); font-size:var(--dc-fs-22); color:var(--dc-ink-70); }
.ajustes-card-estado.ok { color:#a8e0b8; }
.ajustes-card-cuerpo { margin-top:var(--dc-sp-16); }
.ajustes-fila { display:flex; gap:var(--dc-sp-14); align-items:center; flex-wrap:wrap; }
.ajustes-btn {
  font-family:var(--dc-font); font-size:var(--dc-fs-22); color:var(--dc-ink);
  background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.24);
  border-radius:99px; padding:8px 18px; cursor:pointer;
  transition:background .15s, transform .15s;
}
.ajustes-btn:hover { background:rgba(255,255,255,.18); transform:scale(1.03); }
.ajustes-btn:active { transform:scale(.96); }
.ajustes-btn.quitar { opacity:.7; }
.ajustes-input {
  flex:1; min-width:160px;
  font-family:var(--dc-font); font-size:var(--dc-fs-22); color:var(--dc-ink);
  background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.24);
  border-radius:10px; padding:9px 13px; outline:none;
}
.ajustes-input::placeholder { color:var(--dc-ink-70); }
.ajustes-input:focus { border-color:rgba(255,255,255,.5); }
.ajustes-resultado { margin-top:8px; font-family:var(--dc-font); font-size:var(--dc-fs-22); color:var(--dc-ink-70); }
@media (max-width:700px) { .ajustes-cuerpo { padding-top:calc(100 * var(--dc-u)); } }

/* CSS del panel de Diseño retirado (01/09/2026) */


@media (max-width:600px) {
  .design-panel { width:100%; max-width:100%; }
  .insp-section-body { grid-template-columns:1fr; }
}

.f-label { font-size:11px; font-weight:700; letter-spacing:.8px; text-transform:uppercase; color:var(--text3); margin-bottom:5px; }
.f-input { width:100%; background:rgba(255,255,255,0.6); border:1px solid var(--border); border-radius:var(--r-sm); color:var(--text); padding:10px 13px; font-size:14px; font-family:'DM Sans',sans-serif; outline:none; transition:border-color .18s; margin-bottom:12px; }
.f-input:focus { border-color:var(--accent); background:rgba(255,255,255,0.8); }
.f-input::placeholder { color:var(--text3); }
textarea.f-input { resize:vertical; min-height:64px; }

/* ── EL DESPLEGABLE PROPIO ─────────────────────────────────────────
   Reemplaza el <select> del sistema (Rolando, 03/09, 3.ª vuelta: "las
   selecciones de safari o del navegador se ven feas... que siga el mismo
   diseño de la página"). El botón hereda el color del sitio donde vive -
   funciona igual dentro de un panel claro (el nivel del alumno) que dentro
   de la pantalla de Ajustes, que ahora es oscura y flota; la lista que se
   abre es SIEMPRE el mismo cristal claro, sea cual sea el fondo detrás,
   porque flota por encima de cualquier pantalla y necesita leerse igual en
   todas. Se cierra tocando fuera (ver el oyente global más abajo, junto a
   dcSelToggle) o eligiendo algo. */
.dc-sel { position:relative; display:inline-block; width:100%; margin-bottom:12px; }
.dc-sel-btn {
  width:100%; display:flex; align-items:center; justify-content:space-between; gap:8px;
  background:rgba(127,140,160,.14); border:1px solid rgba(127,140,160,.30);
  border-radius:10px; padding:10px 13px; cursor:pointer;
  font-family:inherit; font-size:14px; color:inherit; text-align:left;
  transition:background .15s, border-color .15s;
}
.dc-sel-btn:hover { background:rgba(127,140,160,.22); }
.dc-sel-txt { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dc-sel-car { opacity:.6; font-size:11px; flex:none; }
.dc-sel-list {
  position:absolute; left:0; right:0; top:calc(100% + 6px); z-index:1500;
  background:rgba(245,248,252,.98); border-radius:12px;
  box-shadow:0 12px 32px rgba(20,30,45,.30); border:1px solid rgba(255,255,255,.6);
  -webkit-backdrop-filter:blur(20px); backdrop-filter:blur(20px);
  max-height:260px; overflow-y:auto; padding:6px;
}
.dc-sel-op {
  display:block; width:100%; text-align:left; background:none; border:none; border-radius:8px;
  padding:9px 11px; cursor:pointer; font-family:'DM Sans',sans-serif; font-size:13.5px; color:#1a2233;
  transition:background .12s;
}
.dc-sel-op:hover { background:rgba(58,123,255,.10); }
.dc-sel-op.active { background:rgba(58,123,255,.14); font-weight:600; }
/* Variante grande, para dentro de la pantalla flotante de Ajustes: mismos
   tokens --dc-* que el resto de esa pantalla, nada de los 14px de aquí. */
.dc-sel.dc-sel-grande .dc-sel-btn {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink);
  background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.24);
  border-radius:calc(20 * var(--dc-u)); padding:calc(14 * var(--dc-u)) calc(20 * var(--dc-u));
}
.dc-sel.dc-sel-grande .dc-sel-btn:hover { background:rgba(255,255,255,.16); }
.dc-sel.dc-sel-grande .dc-sel-car { font-size:var(--dc-fs-22); }
.img-upload { width:100%; border-radius:var(--r-md); border:2px dashed var(--border); background:rgba(255,255,255,0.3); padding:22px; text-align:center; cursor:pointer; transition:background .18s; margin-bottom:12px; position:relative; overflow:hidden; }
.img-upload:hover { background:rgba(255,255,255,0.5); }
.img-upload input[type=file] { position:absolute; inset:0; opacity:0; cursor:pointer; width:100%; height:100%; }
.img-upload-preview { width:100%; height:120px; object-fit:cover; border-radius:var(--r-xs); display:none; }
/* Estado de subida de cada imagen de la galería */
.gslide-status { position:absolute; left:0; right:0; bottom:0; z-index:4; display:flex; align-items:center; justify-content:center; gap:8px; padding:7px 9px; font-family:'DM Sans',sans-serif; font-size:11.5px; font-weight:600; color:#fff; letter-spacing:.01em; }
.gslide-status-up  { background:rgba(20,20,25,.72); backdrop-filter:blur(6px); }
.gslide-status-err { background:rgba(196,48,48,.92); flex-wrap:wrap; }
.gslide-spinner { width:12px; height:12px; border:2px solid rgba(255,255,255,.35); border-top-color:#fff; border-radius:50%; animation:gsspin .7s linear infinite; display:inline-block; }
@keyframes gsspin { to { transform:rotate(360deg); } }
.gslide-retry { border:none; background:#fff; color:#c43030; font-family:'DM Sans',sans-serif; font-size:11px; font-weight:700; padding:3px 9px; border-radius:99px; cursor:pointer; }
.gslide-retry:hover { background:#ffecec; }
.gslide-failed { outline:2px solid rgba(196,48,48,.85); outline-offset:-2px; border-radius:12px; }
.img-upload-icon { font-size:28px; margin-bottom:6px; }
.img-upload-text { font-size:13px; font-weight:600; color:var(--text3); }
.pair-row { display:flex; gap:7px; align-items:center; margin-bottom:8px; }
.pair-row .f-input { margin-bottom:0; }
.pair-del { width:30px; height:30px; flex-shrink:0; border-radius:var(--r-xs); border:none; background:rgba(var(--danger-rgb),0.1); color:var(--danger); cursor:pointer; font-size:15px; display:flex; align-items:center; justify-content:center; }
.pair-move { display:flex; gap:3px; flex-shrink:0; }
.pair-move-btn { width:26px; height:30px; border-radius:var(--r-xs); border:none; background:rgba(26,34,51,0.07); color:var(--text2); cursor:pointer; font-size:14px; display:flex; align-items:center; justify-content:center; transition:background .15s,transform .1s; }
.pair-move-btn:hover { background:rgba(26,34,51,0.14); }
.pair-move-btn:active { transform:scale(0.92); }
.add-pair { width:100%; padding:8px; border-radius:var(--r-sm); border:1px dashed var(--border); background:transparent; cursor:pointer; font-family:'DM Sans',sans-serif; font-size:13px; font-weight:700; color:var(--accent); margin-top:4px; transition:background .15s; }
.add-pair:hover { background:rgba(var(--accent-rgb),0.07); }
.tpl-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.tpl-card { border-radius:var(--r); padding:20px 12px 16px; text-align:center; cursor:pointer; background:rgba(255,255,255,0.45); border:1.5px solid var(--border); transition:all .38s cubic-bezier(.25,.1,.25,1); }
.tpl-card:hover { background:rgba(255,255,255,0.7); transform:translateY(-2px); border-color:var(--accent); }
.tpl-icon { font-size:22px; margin-bottom:2px; opacity:.7; }
.tpl-name { font-family:'Coolvetica','DM Sans',sans-serif; font-size:16px; font-weight:400; letter-spacing:.3px; margin-top:4px; }
.tpl-desc { font-size:11px; color:var(--text3); margin-top:4px; letter-spacing:.2px; }
.toast {
  position:fixed; bottom:88px; left:50%; transform:translateX(-50%) translateY(16px) scale(.92);
  background:rgba(26,34,51,0.92); backdrop-filter:blur(16px); color:#fff;
  border-radius:var(--r-lg); padding:11px 22px; font-size:13px; font-weight:600;
  opacity:0; pointer-events:none; z-index:9999;
  transition:all .3s cubic-bezier(.34,1.56,.64,1);
  white-space:nowrap; border:1px solid rgba(255,255,255,0.12);
  box-shadow:0 8px 24px rgba(26,34,51,0.3);
}
.toast.show { opacity:1; transform:translateX(-50%) translateY(0) scale(1); }
.empty { text-align:center; padding:50px 20px; color:var(--text3); }
.empty-title { font-family:'Coolvetica','DM Sans',sans-serif; font-size:20px; font-weight:400; margin-bottom:6px; color:var(--text2); letter-spacing:.3px; }
.skeleton-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media(min-width:600px){.skeleton-grid{grid-template-columns:repeat(3,1fr);gap:20px;}}
.skeleton-card { border-radius:var(--r-xl); aspect-ratio:4/3; background:rgba(255,255,255,0.2); animation:skeletonPulse 1.6s ease-in-out infinite; }
@keyframes skeletonPulse { 0%,100%{opacity:.5} 50%{opacity:1} }
.empty-icon { font-size:44px; margin-bottom:12px; }
.empty-title { font-size:15px; font-weight:700; margin-bottom:5px; color:var(--text2); }
.empty-sub { font-size:13px; line-height:1.5; }
@keyframes shake { 0%,100%{transform:translateX(0)} 25%{transform:translateX(-4px)} 75%{transform:translateX(4px)} }
@keyframes fadeUp { from{opacity:0;transform:translateY(18px)} to{opacity:1;transform:translateY(0)} }
@keyframes fadeScale { from{opacity:0;transform:translateY(22px) scale(.96)} to{opacity:1;transform:translateY(0) scale(1)} }
.fade-in { animation:fadeScale .55s cubic-bezier(.25,.1,.25,1) both; }

/* ════════ READING (lectura editorial) ════════ */
:root {
  --hl-y: rgba(255,213,105,0.52);
  --hl-p: rgba(255,177,204,0.48);
  --hl-g: rgba(139,211,154,0.46);
}
.rd-reading { padding:2px 2px 4px; }
.rd-title {
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400;
  font-size:25px; line-height:1.2; letter-spacing:.3px; color:var(--text);
  margin-bottom:16px; padding-bottom:14px;
  border-bottom:1px solid var(--border-lo);
}
.rd-paragraph {
  font-family:'Georgia','Times New Roman',serif;
  font-size:17px; line-height:1.85; color:var(--text2);
  margin-bottom:14px; text-align:left; -webkit-font-smoothing:antialiased;
  white-space:pre-wrap; word-break:break-word;
}
.rd-paragraph:last-child { margin-bottom:0; }
.rd-reading strong { font-weight:700; color:var(--text); }
/* highlightable range span - no trailing punctuation inside */
.rd-w {
  border-radius:.22em;
  -webkit-box-decoration-break:clone; box-decoration-break:clone;
}
/* Teacher mode: text cursor */
.rd-reading[data-teacher="1"] { cursor:text; }
/* Student live mode: selection cursor to invite highlighting */
.rd-reading[data-student-live="1"] { cursor:text; }
/* Highlight colours - marker sweep on appear */
.rd-w.hl-yellow, .rd-w.hl-pink, .rd-w.hl-green {
  padding:.04em .08em; border-radius:.22em;
  background-repeat:no-repeat; background-position:left center;
  -webkit-box-decoration-break:clone; box-decoration-break:clone;
  background-size:100% 100%;
}
.rd-w.hl-yellow { background-image:linear-gradient(var(--hl-y),var(--hl-y)); }
.rd-w.hl-pink   { background-image:linear-gradient(var(--hl-p),var(--hl-p)); }
.rd-w.hl-green  { background-image:linear-gradient(var(--hl-g),var(--hl-g)); }
/* Teacher live editable paragraphs */
.rd-reading[data-live="1"] .rd-title,
.rd-reading[data-live="1"] .rd-paragraph {
  outline:none; border-radius:var(--r-xs); transition:background .18s, box-shadow .18s;
}
.rd-reading[data-live="1"] .rd-title:focus,
.rd-reading[data-live="1"] .rd-paragraph:focus {
  background:rgba(255,255,255,0.26);
  box-shadow:0 0 0 3px rgba(255,255,255,0.32);
}
/* Student live: paragraph hover hint */
.rd-reading[data-student-live="1"] .rd-paragraph:hover {
  background:rgba(255,255,255,0.14);
  box-shadow:0 0 0 2px rgba(255,255,255,0.18);
}
/* New highlight animation */
.rd-w.rd-new-hl {
  animation: hlSweep .45s cubic-bezier(.25,.1,.25,1) both,
             rdSpanPulse .55s cubic-bezier(.2,.8,.2,1) both,
             hlAbre .55s cubic-bezier(.33,0,.18,1) both;
}
/* Párrafo modificado/nuevo por el profe - fade de aparición suave */
.rd-new-text {
  animation: rdNewTextFade .7s cubic-bezier(.25,.1,.25,1) both;
}
/* SÓLO el tramo recién escrito por el profe - difuminado rápido y local.
   Se anima el span que envuelve exactamente los caracteres nuevos, no todo
   el párrafo, para que la edición se vea fluida. */
.rd-typed-fade {
  animation: rdTypedFade .34s cubic-bezier(.22,.61,.36,1) both;
  display:inline;
}
@keyframes rdTypedFade {
  0%   { opacity:0; filter:blur(4px); }
  55%  { opacity:1; filter:blur(0.6px); }
  100% { opacity:1; filter:blur(0); }
}
/* Safari: forzar selección de texto */
.rd-reading, .rd-reading * { -webkit-user-select:text; user-select:text; }
@keyframes hlSweep { from{ background-size:0% 100%; } to{ background-size:100% 100%; } }
@keyframes hlAbre { from{ padding-left:0; padding-right:0; } }
@keyframes rdSpanPulse {
  0%   { filter:brightness(1);    transform:translateY(0); }
  38%  { filter:brightness(1.09); transform:translateY(-1px); }
  100% { filter:brightness(1);    transform:translateY(0); }
}
@keyframes rdNewTextFade {
  0%   { opacity:0;   transform:translateY(6px); filter:blur(5px); background:rgba(255,255,255,0.40); border-radius:6px; }
  45%  { opacity:1;   transform:translateY(0);   filter:blur(0);   background:rgba(255,255,255,0.26); border-radius:6px; }
  100% { opacity:1;   transform:translateY(0);   filter:blur(0);   background:transparent;            border-radius:0; }
}

/* ════════ ESCRITURA LIBRE (freewrite) ════════ */
/* Mismo aspecto editorial que Lectura: el alumno escribe donde leería. */
.fw-write { padding:2px 2px 4px; }
.fw-write[data-fw-edit="1"] { cursor:text; }
.fw-title {
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400;
  font-size:25px; line-height:1.2; letter-spacing:.3px; color:var(--text);
  margin-bottom:16px; padding-bottom:14px;
  border-bottom:1px solid var(--border-lo);
}
.fw-body { min-height:58px; }
.fw-p {
  font-family:'Georgia','Times New Roman',serif;
  font-size:17px; line-height:1.85; color:var(--text2);
  margin-bottom:14px; text-align:left; -webkit-font-smoothing:antialiased;
  white-space:pre-wrap; word-break:break-word;
  outline:none; border-radius:var(--r-xs);
  transition:background .18s, box-shadow .18s;
}
.fw-p:last-child { margin-bottom:0; }
.fw-write[data-fw-edit="1"] .fw-p:focus {
  background:rgba(255,255,255,0.26);
  box-shadow:0 0 0 3px rgba(255,255,255,0.32);
}
/* texto de ayuda mientras no hay nada escrito */
.fw-write.fw-empty .fw-p:first-child::before {
  content:attr(data-ph); color:var(--text3); opacity:.6;
  font-style:italic; pointer-events:none;
}
.fw-foot {
  display:flex; align-items:center; justify-content:flex-end; gap:8px;
  margin-top:16px; padding-top:10px; border-top:1px solid var(--border-lo);
  font-family:'DM Sans',sans-serif; font-size:11px; font-weight:600;
  letter-spacing:.3px; color:var(--text3);
}
.fw-dot {
  width:7px; height:7px; border-radius:50%; background:var(--accent2);
  opacity:0; transition:opacity .25s;
}
.fw-dot.on { opacity:1; animation:fwPulse 1.1s ease-in-out infinite; }
@keyframes fwPulse {
  0%,100% { transform:scale(1);    opacity:.5; }
  50%     { transform:scale(1.35); opacity:1; }
}
/* párrafo que aparece desde el otro lado */
.fw-block-in { animation:fwBlockIn .38s cubic-bezier(.22,.61,.36,1) both; }
@keyframes fwBlockIn {
  from { opacity:0; transform:translateY(-5px); filter:blur(3px); }
  to   { opacity:1; transform:none;             filter:blur(0); }
}
.fw-write, .fw-write * { -webkit-user-select:text; user-select:text; }

/* floating colour toolbar - teacher AND student */
.rd-hl-toolbar {
  position:fixed; z-index:1200; display:none; gap:7px; align-items:center;
  padding:7px 9px; border-radius:var(--r-pill);
  background:rgba(245,248,252,0.92); backdrop-filter:blur(22px);
  border:1px solid var(--border); box-shadow:0 10px 30px rgba(40,55,80,0.26);
  transform:translate(-50%,-118%); animation:fadeUp .18s ease both;
  pointer-events:all;
}
.rd-hl-toolbar.show { display:flex; }
.rd-hl-swatch {
  width:26px; height:26px; border-radius:50%; cursor:pointer; border:2px solid rgba(255,255,255,0.9);
  box-shadow:0 1px 4px rgba(40,55,80,0.2); transition:transform .14s;
}
.rd-hl-swatch:hover { transform:scale(1.18); }
.rd-hl-swatch.y { background:rgba(255,213,105,0.85); }
.rd-hl-swatch.p { background:rgba(255,177,204,0.85); }
.rd-hl-swatch.g { background:rgba(139,211,154,0.85); }
.rd-hl-swatch.clear {
  background:rgba(255,255,255,0.7); display:flex; align-items:center; justify-content:center;
  font-size:13px; color:var(--text3); border-color:var(--border);
}

/* ══════════════════════════════════════════════════════════════════
   ANOTACIONES EFÍMERAS SOBRE IMAGEN  (profesor → alumno)
   El profe hace clic en cualquier punto de una foto: sale una onda
   expansiva en ese punto exacto en la pantalla del alumno, escribe una
   palabra y aparece difuminándose. A los 10s se va sola, sin rastro.
   Nada de esto se guarda: vive en memoria y muere.
   ══════════════════════════════════════════════════════════════════ */

/* La capa va DENTRO del contenedor de la imagen (que ya es position:relative
   y overflow:hidden). pointer-events:none para no romper el drag de chips,
   las flechas del carrusel ni nada de lo que ya había. */
.ann-layer {
  position:absolute; inset:0; z-index:6; pointer-events:none;
  overflow:hidden; border-radius:inherit;
}
.ann-mark { position:absolute; width:0; height:0; }

/* ── onda expansiva ── */
.ann-ripple {
  position:absolute; left:0; top:0; width:12px; height:12px; margin:-6px 0 0 -6px;
  border-radius:50%; border:2px solid rgba(255,255,255,0.95);
  box-shadow:0 0 0 1px rgba(0,0,0,0.18), 0 0 10px rgba(0,0,0,0.22);
  transform:scale(0); opacity:0;
  animation:annRipple .7s cubic-bezier(.25,.1,.25,1) both;
}
.ann-ripple.d2 { animation-name:annRipple2; }
@keyframes annRipple {
  0%   { transform:scale(.35); opacity:0; }
  14%  { opacity:1; }
  100% { transform:scale(5.2);  opacity:0; }
}
@keyframes annRipple2 {
  0%,12% { transform:scale(.35); opacity:0; }
  26%    { opacity:.8; }
  100%   { transform:scale(7.4); opacity:0; }
}
/* punto fijo que marca el sitio mientras la nota está viva */
.ann-dot {
  position:absolute; left:0; top:0; width:7px; height:7px; margin:-3.5px 0 0 -3.5px;
  border-radius:50%; background:rgba(255,255,255,0.98);
  box-shadow:0 0 0 1px rgba(0,0,0,0.22), 0 1px 5px rgba(0,0,0,0.35);
  animation:annDotIn .5s cubic-bezier(.22,.61,.36,1) both;
}
/* El punto se va con la misma curva y el mismo desenfoque que el texto: antes
   se quitaba del DOM sin más y desaparecía de golpe. */
.ann-dot.out { animation:annDotOut .8s cubic-bezier(.5,0,.75,0) both; }
@keyframes annDotIn  { from{ opacity:0; transform:scale(.2); } to{ opacity:1; transform:scale(1); } }
@keyframes annDotOut { from{ opacity:1; transform:scale(1); filter:blur(0); } to{ opacity:0; transform:scale(.5); filter:blur(6px); } }

/* ── el texto ── */
.ann-note {
  position:absolute; left:0; top:0;
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400;
  letter-spacing:.4px; line-height:1.22; color:#fff; text-align:center;
  /* NADA de overflow:hidden aquí. La sombra difusa se sale del recuadro del
     elemento, así que recortarlo dibujaba un rectángulo oscuro con los bordes
     cortados en seco alrededor de la palabra: el "recuadro" que se veía. Sin
     recorte, la sombra se degrada hasta desaparecer y no hay caja ninguna.
     Si la frase es larga, ahora parte de línea en vez de cortarse. */
  /* OJO: nada de max-width en %. El contenedor .ann-mark mide 0x0 a propósito
     (es solo un ancla), así que un 96% se resolvía a 0 y el texto se
     renderizaba con ancho cero, o sea invisible. El tope va en px desde
     annPlace(), calculado sobre el ancho real de la foto. */
  /* Sombra ancha y suave, sin ninguna capa corta: un halo que separa la
     palabra de la foto sin dibujarle un contorno pegado a las letras. */
  text-shadow:0 2px 22px rgba(12,18,32,0.58), 0 1px 9px rgba(12,18,32,0.34);
  animation:annNoteIn .55s cubic-bezier(.22,.61,.36,1) both;
  will-change:opacity, transform, filter;
}
.ann-note.out { animation:annNoteOut .8s cubic-bezier(.5,0,.75,0) both; }
/* Mismo lenguaje que las píldoras de Mensajes (pillBigIn / pillSettleOut):
   se enfoca desde el desenfoque al entrar y se va desenfocándose al salir. */
@keyframes annNoteIn {
  0%   { opacity:0; filter:blur(12px); transform:scale(.94) translateY(-8px); }
  100% { opacity:1; filter:blur(0);    transform:scale(1)   translateY(0); }
}
@keyframes annNoteOut {
  0%   { opacity:1; filter:blur(0);    transform:scale(1)   translateY(0); }
  100% { opacity:0; filter:blur(16px); transform:scale(.94) translateY(-8px); }
}
/* el profe puede pinchar su propia nota para quitarla antes de tiempo */
.ann-mark.mine .ann-note { pointer-events:auto; cursor:pointer; }
.ann-mark.mine .ann-note:hover { opacity:.62; }

/* ── recuadro de escritura del profesor (idéntico al resultado) ──
   Va en <body> con position:fixed, no dentro de la foto: si viviera dentro,
   el primer re-render de la clase en vivo se lo llevaría a media palabra. */
.ann-input {
  position:fixed; z-index:1400;
  font-family:'Coolvetica','DM Sans',sans-serif; font-weight:400; letter-spacing:.4px;
  color:#fff; background:rgba(12,18,32,0.22); backdrop-filter:blur(14px);
  border:none; outline:none; border-radius:11px; padding:3px 10px; text-align:center;
  text-shadow:0 2px 22px rgba(12,18,32,0.58), 0 1px 9px rgba(12,18,32,0.34);
  box-shadow:0 8px 26px rgba(12,18,32,0.22);
  caret-color:#fff; pointer-events:auto;
  animation:annNoteIn .4s cubic-bezier(.22,.61,.36,1) both;
}
.ann-input::placeholder { color:rgba(255,255,255,0.5); }

/* El zoom de hover mueve la foto pero no la capa: mientras haya una nota
   viva se desactiva para que la marca caiga donde debe. En la vista en vivo
   se desactiva siempre, así el clic del profe aterriza exacto. (El zoom del
   recorte va en style inline y sigue mandando sobre esto, que es lo correcto.) */
.match-card-img-wrap.ann-live .match-card-img { transform:none; }
#live-view-content .match-card:hover .match-card-img,
#live-view-content .describe-card:hover .match-card-img { transform:none; }
#live-view-content [data-ann] { cursor:crosshair; }
/* El alumno también puede señalar, pero con dos toques (ver annClick): el
   cursor de cruz sólo aparece al acercarse, para no anunciar un gesto que
   compite con el de colocar una palabra. */
body:not(.is-teacher) #screen-lesson [data-ann]:hover { cursor:crosshair; }

/* ═══════════════════════════════════════════════════════════════════════════
   SISTEMA DE DISEÑO - capa portada de design/*.dc.html
   ───────────────────────────────────────────────────────────────────────────
   Copia literal de design/tokens.css. El servidor no sirve design/ (se quitó
   express.static(ROOT) a propósito, server.js:2502), así que los tokens van
   inlineados aquí. SI TOCAS design/tokens.css, COPIA EL CAMBIO A ESTE BLOQUE.
   Las deducciones están registradas en design/DECISIONES.md.
   ═══════════════════════════════════════════════════════════════════════════ */
:root {
  /* -- Literal del artboard -- */
  /* v9 (02/09/2026): el degradado baja MUY poco. La primera versión que
     probé (2,28:1) cumplía más pero se sentía otra cosa - el look claro es
     parte de la identidad. Esto es un punto por debajo del original: el
     texto grande gana algo y la sensación no cambia. El degradado hondo se
     guarda para el modo oscuro, que es donde tiene sentido. */
  --dc-bg: linear-gradient(100deg, #c3c9cd 0%, #a5b0bd 45%, #7f8ea6 100%);
  --dc-ink: #fff;
  --dc-ink-70: rgba(255,255,255,0.70);
  --dc-ink-75: rgba(255,255,255,0.75);
  --dc-ink-dark: #16202f;
  --dc-ink-icon: #333;
  --dc-accent: #3a7bff;
  --dc-card: linear-gradient(165deg, #e7ecef 0%, #aab7c6 60%, #8b9ab3 100%);
  --dc-card-inner: linear-gradient(200deg, #eef2f6, #aebdcf);
  --dc-glass: linear-gradient(135deg, rgba(255,255,255,0.55), rgba(255,255,255,0.16));
  --dc-glass-border: 1px solid rgba(255,255,255,0.55);
  --dc-badge-bg: rgba(255,255,255,0.18);
  --dc-track: rgba(255,255,255,0.28);
  --dc-fill: linear-gradient(90deg, rgba(255,255,255,0.75), rgba(255,255,255,0.35));
  --dc-dot-off: rgba(255,255,255,0.4);
  --dc-close-bg: rgba(255,255,255,0.6);
  --dc-font: 'Coolvetica', sans-serif;
  --dc-font-alt: 'DM Sans', sans-serif;
  --dc-text-68: 68px; --dc-text-56: 56px; --dc-text-52: 52px; --dc-text-40: 40px;
  --dc-text-38: 38px; --dc-text-34: 34px; --dc-text-32: 32px; --dc-text-30: 30px;
  --dc-text-22: 22px; --dc-text-20: 20px; --dc-text-18: 18px;
  --dc-weight: 400; --dc-weight-badge: 700; --dc-tracking: .5px;
  --dc-radius-pill: 999px; --dc-radius-track: 99px; --dc-radius-card: 28px;
  --dc-radius-panel: 18px; --dc-radius-round: 50%;
  --dc-shadow-pill: 0 10px 24px rgba(20,30,45,0.22), inset 0 1px 0 rgba(255,255,255,0.5);
  --dc-shadow-card: 0 30px 60px rgba(15,20,30,0.32);
  --dc-shadow-text: 0 2px 8px rgba(0,0,0,.35);
  /* v3: botones de acción (Guardar contraseña…) pierden la píldora - quedan
     como texto suelto con mucha sombra difuminada debajo, no dura. Prueba
     de Rolando, se refina después. */
  --dc-shadow-text-strong: 0 16px 28px rgba(20,30,45,.6);

  /* -- v4: movimiento. Una sola curva para todo (arranca despacio y frena
     despacio: nada "de golpe") y tres duraciones. Si algo se siente brusco,
     se toca AQUÍ, no en cada regla. -- */
  --dc-ease:      cubic-bezier(.42, 0, .18, 1);
  --dc-t-viaje:   .9s;   /* el pill de nav cruzando de una palabra a otra */
  --dc-t-lento:   .7s;   /* crecer/encoger, difuminar */
  --dc-t-entrada: .85s;  /* aparecer un panel entero */
  --dc-t-salida:  .32s;  /* irse: más rápido que aparecer, a propósito */
  --dc-t-press:   .22s;  /* el hundido al pulsar: corto, pero con la misma curva */

  /* -- v2 (Progreso copy / "Cómo se ve una clase", 01/09/2026): la escala
     de titulares subió y apareció un material nuevo. k SIGUE SIENDO 17/30 -
     el lienzo (1920, padding 76/60, gap 34) no cambió en ningún artboard
     nuevo, sólo la tipografía y el pill de nav. Ver DECISIONES.md. -- */
  --dc-text-140: 140px;  /* nombre del alumno v2 (antes 68) */
  --dc-text-163: 163px;  /* v6: el nombre en la esquina - Rolando confirmó por
                            captura que el 163 de Progreso2 era el bueno */
  --dc-text-100: 100px;  /* fila "titular" de Progreso (antes 56) */
  --dc-text-60:  60px;   /* nav v2 (antes 30) */
  --dc-text-50:  50px;   /* filas secundarias de Progreso (antes 56) */
  --dc-text-80:  80px;   /* "pizarra"/"notas"/palabras en "Cómo se ve una clase" */
  --dc-metal-a: #CFD3D6; --dc-metal-b: #939EB3;
  --dc-pill-metal:  linear-gradient(90deg, var(--dc-metal-a), var(--dc-metal-b));
  --dc-panel-metal: linear-gradient(90deg, var(--dc-metal-b), var(--dc-metal-a));
  --dc-shadow-pill-metal:  0 10px 50px #141E2D84;
  --dc-shadow-panel-metal: 0 4px 50px #0000007F;
  --dc-radius-nav: 34.14px;
  --dc-space-6:6px; --dc-space-8:8px; --dc-space-10:10px; --dc-space-14:14px;
  --dc-space-16:16px; --dc-space-18:18px; --dc-space-20:20px; --dc-space-24:24px;
  --dc-space-34:34px; --dc-space-36:36px; --dc-space-40:40px; --dc-space-48:48px;
  --dc-space-60:60px; --dc-space-64:64px; --dc-space-72:72px; --dc-space-76:76px;
  --dc-card-w:520px; --dc-card-h:600px; --dc-close-size:44px;
  --dc-dot-on:12px; --dc-dot-off-size:8px; --dc-bar-h:8px; --dc-bar-w:1160px;
  --dc-row-w-progreso:900px; --dc-row-w-ajustes:1100px;

  /* -- Capa derivada. ANTES: k fijo = 17/30, que dejaba el lienzo de 1920
     clavado en 1088px y la pantalla medio vacía. AHORA la unidad sigue al
     ancho real: 1 px de artboard = (ancho de ventana / 1920) px reales, así
     que la pantalla se ve EXACTAMENTE en la proporción del artboard, llena.
     El tope evita que en un monitor enorme el cuerpo acabe gigante. -- */
  /* En un iPad en vertical (810 px) la unidad caía a 0,42: el cuerpo se
     quedaba en 12 px, ilegible. Con el suelo, la proporción del artboard se
     mantiene mientras hay sitio y deja de encoger cuando dejaría de leerse.
     0,58 ≈ el tamaño con el que se diseñó todo esto en el portátil. */
  --dc-u: clamp(0.58px, min(100vw, 2200px) / 1920, 1.15px);
  --dc-k: 0.56666666666666667; /* histórico: ya no lo usa la capa derivada */
  --dc-fs-68: calc(68 * var(--dc-u));
  --dc-fs-56: calc(56 * var(--dc-u));
  --dc-fs-52: calc(52 * var(--dc-u));
  --dc-fs-40: calc(40 * var(--dc-u));
  --dc-fs-38: calc(38 * var(--dc-u));
  --dc-fs-34: calc(34 * var(--dc-u));
  --dc-fs-32: calc(32 * var(--dc-u));
  --dc-fs-30: calc(30 * var(--dc-u));
  --dc-fs-140: calc(140 * var(--dc-u));
  --dc-fs-120: calc(120 * var(--dc-u));
  --dc-fs-163: calc(163 * var(--dc-u));
  --dc-fs-100: calc(100 * var(--dc-u));
  --dc-fs-60:  calc(60 * var(--dc-u));
  --dc-fs-50:  calc(50 * var(--dc-u));
  --dc-fs-80:  calc(80 * var(--dc-u));
  --dc-r-nav:  calc(34.14 * var(--dc-u));
  --dc-fs-22: calc(22 * var(--dc-u));
  --dc-fs-20: calc(20 * var(--dc-u));
  --dc-fs-18: calc(18 * var(--dc-u));
  --dc-sp-6:  calc(6 * var(--dc-u));
  --dc-sp-8:  calc(8 * var(--dc-u));
  --dc-sp-10: calc(10 * var(--dc-u));
  --dc-sp-14: calc(14 * var(--dc-u));
  --dc-sp-16: calc(16 * var(--dc-u));
  --dc-sp-18: calc(18 * var(--dc-u));
  --dc-sp-20: calc(20 * var(--dc-u));
  --dc-sp-24: calc(24 * var(--dc-u));
  --dc-sp-34: calc(34 * var(--dc-u));
  --dc-sp-36: calc(36 * var(--dc-u));
  --dc-sp-40: calc(40 * var(--dc-u));
  --dc-sp-48: calc(48 * var(--dc-u));
  --dc-sp-60: calc(60 * var(--dc-u));
  --dc-sp-64: calc(64 * var(--dc-u));
  --dc-sp-72: calc(72 * var(--dc-u));
  --dc-sp-76: calc(76 * var(--dc-u));
  --dc-p-nav:    var(--dc-sp-16) var(--dc-sp-20);
  --dc-p-nav-on: var(--dc-sp-16) var(--dc-sp-40);
  --dc-p-badge:  var(--dc-sp-8)  var(--dc-sp-18);
  --dc-p-pill:   var(--dc-sp-20) var(--dc-sp-48);
  --dc-r-card:  calc(28 * var(--dc-u));
  --dc-r-panel: calc(18 * var(--dc-u));
  --dc-w-dot-on:  calc(12 * var(--dc-u));
  --dc-w-dot-off: calc(8 * var(--dc-u));
  --dc-h-bar:     calc(8 * var(--dc-u));
  --dc-w-bar:     calc(1160 * var(--dc-u));
  --dc-w-row-ajustes: calc(1100 * var(--dc-u));
  --dc-w-row-progreso: calc(900 * var(--dc-u));
  /* El lienzo (1920 del artboard) ahora MIDE la ventana: cada proporción de
     dentro (padding 76, fila 1100, barra 1160) se ve tal cual se dibujó,
     pero llenando la pantalla en vez de quedarse en una franja central. */
  --dc-w-canvas: calc(1920 * var(--dc-u));
  /* La COLUMNA de contenido del inicio. El lienzo (1920) es el ancho de la
     pantalla entera; lo que cuelga de la nav -la lista de alumnos, las
     opciones de clases, los títulos de cada carrusel- va en esta columna más
     estrecha y centrada, para que caiga DEBAJO de las tres palabras y no
     contra el borde izquierdo (Rolando, 04/09). Ronda el ancho de la propia
     nav a 1440, que es donde se mira. */
  --dc-w-columna: calc(760 * var(--dc-u));
  --dc-dens: 1;
}
/* MONITOR GRANDE DE DENSIDAD NORMAL. En un monitor de 23" a 1920×1080 el
   píxel mide casi un tercio más que en un MacBook (unos 96 por pulgada contra
   unos 125): con la misma cuenta, todo salía enorme - "en mi MacBook Air de
   15 pulgadas se ve mucho mejor" (Rolando, 11/09). La pantalla no dice cuánto
   mide, pero sí su densidad: una ventana ancha con densidad 1 es casi siempre
   un monitor de sobremesa. Ahí la unidad baja lo que hace falta para que las
   cosas midan lo mismo con la regla en la mano. Las medidas que no van en
   unidades de artboard (los carruseles, en vw/vh) leen --dc-dens. */
@media (min-width:1600px) and (max-resolution:1.4dppx) {
  /* El lienzo sigue llenando la pantalla: sólo encoge lo que va DENTRO. */
  :root { --dc-dens: .86; --dc-u: clamp(0.58px, min(100vw, 2200px) / 1920 * .86, 1.15px);
          --dc-w-canvas: min(100vw, 2200px); }
}

/* El lienzo es continuo: la cabecera y los tabs no pintan banda propia.
   NOTA: los selectores llevan #screen-student a propósito. El motor de tema
   (theme.json + panel de Diseño) inyecta `.session-tabs .aula-tab.active{...}`
   en un <style> al final del documento (index.html:11653) y ganaría por orden.
   El id lo desempata sin tocar el motor. Ver DECISIONES.md. */
#screen-student { background:var(--dc-bg); }
#screen-student > .classrooms-header,
#screen-student .aula-tabs-pill.session-tabs { background:none; }

/* ── Cabecera del alumno - literal §6.2 ── */
/* El nombre queda en la esquina izquierda. "Pizarra" (centro) y "Notas"
   (derecha) sólo existen durante una clase abierta - ver .clase-modo más
   abajo - así que en el resto de pestañas la cabecera es sólo el nombre.
   Nombre = "volver" (Regla 4: sustituye a los botones "← Aulas"/"← Clases"
   que no estaban en ningún artboard). */
#screen-student > .classrooms-header {
  display:grid; grid-template-columns:1fr auto 1fr; align-items:center;
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:var(--dc-sp-34) var(--dc-sp-76) var(--dc-sp-34);
  column-gap:var(--dc-sp-14);
}
/* Fuera de una clase, la nav cuelga de la LÍNEA BASE del nombre, un poco más
   abajo y sin tocarla. Entre ella y el nombre había casi la altura de otra
   nav, y el carrusel acababa tan abajo que "buscar" no cabía en la pantalla
   (Rolando, 11/09). */
#screen-student:not(.clase-modo) > .classrooms-header { padding-bottom:0; }
/* v6: 140 → 163. El nombre manda en la esquina, como en las capturas. */
#screen-student #student-detail-name {
  font-family:var(--dc-font); font-size:var(--dc-fs-163); font-weight:var(--dc-weight);
  color:var(--dc-ink); letter-spacing:var(--dc-tracking); cursor:pointer;
  grid-column:1; grid-row:1; justify-self:start; line-height:1;
  /* Sin sombra en reposo: a este tamaño ensucia. Aparece al acercarse,
     que es cuando hace falta decir "esto se puede pulsar" (Rolando). */
  text-shadow:none;
  transition:transform var(--dc-t-lento) var(--dc-ease),
             text-shadow var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) {
  #screen-student #student-detail-name:hover { text-shadow:var(--dc-shadow-text-strong); }
}
#screen-student #student-detail-name:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }
/* "En vivo" retirado (Rolando, 02/09): que el alumno esté conectado no es
   algo que haya que anunciar en pantalla. */

/* ── Nav de pestañas - v2: cuerpo 30→60, pill de cristal → pill metálico ── */
/* Centradas (a diferencia del resto de filas, que van a la izquierda) y más
   abajo que antes: en las capturas la nav respira bajo el nombre. */
#screen-student .aula-tabs-pill.session-tabs {
  position:relative;
  gap:var(--dc-sp-14); padding:var(--dc-sp-14) var(--dc-sp-76) var(--dc-sp-10);
  max-width:var(--dc-w-canvas); margin:0 auto; width:100%;
  justify-content:center;
  /* el motor de tema pinta aquí una banda: sombra grande + radio. El lienzo
     del artboard es continuo, no tiene barra flotante. */
  border-bottom:none; box-shadow:none; border-radius:0; backdrop-filter:none;
}
/* Modo "Clase": clases/progreso/ajustes desaparecen - pizarra + notas
   ocupan su lugar en la cabecera (activado/desactivado en _botonesDeClase). */
#screen-student.clase-modo .aula-tabs-pill.session-tabs { display:none; }
/* Padding IDÉNTICO en activa e inactiva: si cambiara, las tres palabras se
   recolocarían al llegar el pill y parecería un bug. Lo único que cambia al
   llegar es una escala (transform), que no toca el layout de nadie.
   Vertical más fino que antes (sp-10 en vez de sp-16) - el pill iba gordo. */
#screen-student .aula-tabs-pill .aula-tab {
  font-family:var(--dc-font); font-size:var(--dc-fs-60); font-weight:var(--dc-weight);
  letter-spacing:normal; line-height:1.25;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--dc-ink); background:none; border:none; box-shadow:none;
  padding:var(--dc-sp-10) var(--dc-sp-40); border-radius:var(--dc-r-nav);
  cursor:pointer; position:relative; z-index:1;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
#screen-student .aula-tabs-pill .aula-tab.active {
  background:none; border:none; box-shadow:none; color:var(--dc-ink);
}
/* Crece un pelín SÓLO cuando el pill ya ha llegado (la clase la pone el JS
   tras el viaje, ver _posicionarNavIndicador). */
#screen-student .aula-tabs-pill .aula-tab.crecida { transform:scale(1.12); }
/* Viaje suave, muy suave: sólo transform/width, nunca layout de verdad.
   La escala va en la misma cadena de transform vía --s, para que el pill
   crezca junto con la palabra en vez de quedarse pequeño detrás. */
#screen-student .aula-tab-indicator {
  position:absolute; left:0; z-index:0; pointer-events:none;
  border-radius:var(--dc-r-nav);
  background:var(--dc-pill-metal); box-shadow:var(--dc-shadow-pill-metal);
  transform:translateX(var(--x, 0)) scale(var(--s, 1));
  transition:transform var(--dc-t-viaje) var(--dc-ease), width var(--dc-t-viaje) var(--dc-ease);
  will-change:transform, width;
}

/* Pizarra (centro) / Notas (derecha): sin píldora - texto y ya, con la
   sombra suave de todos los botones. Sólo existen con una clase abierta. */
#screen-student > .classrooms-header #hc-board-btn,
#screen-student > .classrooms-header #t-notebook-toggle-btn {
  font-family:var(--dc-font); font-size:var(--dc-fs-80); font-weight:var(--dc-weight);
  letter-spacing:normal; color:var(--dc-ink); line-height:1;
  background:none; border:none; box-shadow:none; border-radius:0;
  text-shadow:var(--dc-shadow-text-strong);
  padding:var(--dc-sp-10) var(--dc-sp-24); width:auto; height:auto; cursor:pointer;
  backdrop-filter:none; text-transform:lowercase;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
/* Mismo hover que "Restablecer contraseña": crece, nada más. */
#screen-student > .classrooms-header #hc-board-btn:hover,
#screen-student > .classrooms-header #t-notebook-toggle-btn:hover {
  background:none; box-shadow:none; transform:scale(1.09);
}
#screen-student > .classrooms-header #hc-board-btn { grid-column:2; grid-row:1; justify-self:center; }
#screen-student > .classrooms-header #t-notebook-toggle-btn { grid-column:3; grid-row:1; justify-self:end; }

/* ═══ AJUSTES ═══ */
/* El lienzo llega a todo el panel, no sólo a la cabecera: el detalle
   desplegado vive sobre el degradado, no sobre una "hoja" clara aparte. */
/* Sin fondo propio: el degradado lo pinta #screen-student una sola vez. Si lo
   repinta también el panel, se ve la costura donde vuelve a empezar. */
#aula-panel-ajustes {
  background:none; min-height:100vh;
  margin:0 -20px; padding:0; font-family:var(--dc-font);
}
@media (min-width:600px) { #aula-panel-ajustes { margin:0 -32px; } }
@media (min-width:900px) { #aula-panel-ajustes { margin:0 -48px; } }
/* Como Progreso: overview y detalle son paneles hermanos que se turnan
   (uno de los dos siempre está display:none) - no un acordeón in-place. */
/* Ocupan la pantalla de arriba abajo desde la nav, no una franja en medio:
   el bloque queda centrado en el alto disponible, como en las capturas. */
#ajustes-overview, #ajustes-detalle {
  max-width:var(--dc-w-canvas); margin:0 auto;
  padding:var(--dc-sp-60) var(--dc-sp-76) var(--dc-sp-72);
  min-height:62vh; display:flex; flex-direction:column; justify-content:center;
}
.ajustes-menu { background:none; border-radius:0; display:flex; flex-direction:column; padding:0; }

/* Fila de Ajustes - literal §6.10 */
#aula-panel-ajustes .ajustes-menu-row {
  width:100%; max-width:var(--dc-w-row-ajustes); margin-left:auto; margin-right:auto;
  text-align:center; background:none; border:none; padding:0; cursor:pointer;
  font-family:var(--dc-font); font-size:var(--dc-fs-52); font-weight:var(--dc-weight);
  letter-spacing:normal; color:var(--dc-ink); text-decoration:none;
  display:flex; align-items:center; justify-content:center; gap:var(--dc-sp-20);
  margin-bottom:var(--dc-sp-64);
}
#aula-panel-ajustes .ajustes-menu-row:last-child { margin-bottom:0; }
#aula-panel-ajustes .ajustes-menu-row.disabled { color:var(--dc-ink); cursor:default; }
#aula-panel-ajustes .ajustes-menu-row:disabled { opacity:1; }
/* El botón de eliminar, mientras el nombre escrito no coincide: sigue ahí,
   pero apagado. Aquí no hay rojo que valga -los tokens --dc-* son tinta
   blanca sobre cristal- así que lo que avisa es la escala, no el color. */
#aula-panel-ajustes .modal-btn:disabled { color:var(--dc-ink-75); opacity:.5; cursor:default; }
/* Botón de volver ← mismo pill de cristal que "← Progreso" */
#ajustes-detalle > .back-btn {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-ink); background:none; border:none;
  box-shadow:none; border-radius:0; text-shadow:var(--dc-shadow-text-strong);
  padding:var(--dc-sp-10) 0; margin:0 0 var(--dc-sp-40) !important; width:auto; height:auto;
  backdrop-filter:none;
}

/* Badge - literal §6.11 */
#aula-panel-ajustes .ajustes-soon {
  font-family:var(--dc-font-alt); font-size:var(--dc-fs-18); font-weight:var(--dc-weight-badge);
  letter-spacing:var(--dc-tracking); text-transform:uppercase;
  color:var(--dc-ink-70); background:var(--dc-badge-bg);
  padding:var(--dc-p-badge); border-radius:var(--dc-radius-pill); white-space:nowrap;
}

/* Detalle desplegado - sin caja, separado por espacio */
#aula-panel-ajustes .ajustes-menu-detail { max-width:var(--dc-w-row-ajustes); margin-bottom:var(--dc-sp-64); }
#aula-panel-ajustes .assign-section { padding:0; margin-bottom:var(--dc-sp-48); }
#aula-panel-ajustes .assign-section:last-child { margin-bottom:0; }
#aula-panel-ajustes .ajustes-menu-detail .assign-section:first-child { padding-top:0; }

/* Título de subsección ← paso de "¿Qué falta?" §6.9 */
#aula-panel-ajustes .assign-section-title {
  font-family:var(--dc-font); font-size:var(--dc-fs-34); font-weight:var(--dc-weight);
  letter-spacing:normal; color:var(--dc-ink); margin-bottom:var(--dc-sp-20);
  display:flex; align-items:baseline; gap:var(--dc-sp-10);
}
/* Texto de ayuda ← cuerpo a alfa secundaria §7 */
#aula-panel-ajustes .dc-help {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-ink-75); margin-bottom:var(--dc-sp-20); max-width:var(--dc-w-bar);
}
/* Porcentaje ← valor de fila de Progreso §6.7 */
#aula-panel-ajustes #marco-pct {
  font-family:var(--dc-font); font-size:var(--dc-fs-32); font-weight:var(--dc-weight);
  color:var(--dc-ink-75); opacity:1;
}

/* Input ← panel interior de la tarjeta §6.4 */
#aula-panel-ajustes .f-input {
  width:100%; max-width:var(--dc-w-bar);
  background:var(--dc-card-inner); border:none; border-radius:var(--dc-r-panel);
  color:var(--dc-ink-dark);
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  padding:var(--dc-sp-18) var(--dc-sp-24);
  outline:none; margin-bottom:var(--dc-sp-20); display:block;
}
#aula-panel-ajustes .f-input::placeholder { color:var(--dc-ink-dark); opacity:.75; }

/* Botón de acción - prueba de Rolando: sin píldora, sólo texto con mucha
   sombra difuminada debajo (no dura). "Guardar contraseña" y el resto de
   botones de manejo de esta pantalla; los de VOLVER (← Ajustes/← Progreso)
   no cuentan, siguen siendo el pill de cristal de navegación. */
#aula-panel-ajustes .modal-btn,
#aula-panel-ajustes .dc-pill-btn {
  display:inline-block; width:auto; max-width:none;
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-ink); background:none; border:none;
  box-shadow:none; border-radius:0; text-shadow:var(--dc-shadow-text-strong);
  padding:var(--dc-sp-8) 0; cursor:pointer;
}

/* Select ← pill de cristal §6.8 (un valor se enseña en pill) */
#aula-panel-ajustes select {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-ink); background:var(--dc-glass); border:var(--dc-glass-border);
  box-shadow:var(--dc-shadow-pill); border-radius:var(--dc-radius-pill);
  padding:var(--dc-sp-8) var(--dc-sp-20); margin-left:0;
  -webkit-appearance:none; appearance:none; cursor:pointer; outline:none;
}
#aula-panel-ajustes select option { color:var(--dc-ink-dark); background:#e7ecef; }

/* Mensaje ← único color de atención de la paleta §1 */
#aula-panel-ajustes #reset-pw-msg {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-accent); margin-top:var(--dc-sp-16);
}

/* Etiqueta de grupo ← tipografía del badge §6.11, sin píldora */
#aula-panel-ajustes .dc-group-label {
  font-family:var(--dc-font-alt); font-size:var(--dc-fs-18); font-weight:var(--dc-weight-badge);
  text-transform:uppercase; letter-spacing:var(--dc-tracking);
  color:var(--dc-ink-70); margin:var(--dc-sp-40) 0 var(--dc-sp-20);
}

/* Fila de tema ← fila de Ajustes §6.10 al paso de cuerpo */
#aula-panel-ajustes .assign-topic-row {
  display:flex; align-items:center; justify-content:space-between; gap:var(--dc-sp-20);
  background:none; border:none; border-radius:0; backdrop-filter:none;
  padding:0; margin-bottom:var(--dc-sp-24); max-width:var(--dc-w-row-ajustes);
}
#aula-panel-ajustes .assign-topic-name {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-ink); display:flex; flex-direction:column; gap:2px;
}
#aula-panel-ajustes .dc-topic-sub { font-size:var(--dc-fs-22); color:var(--dc-ink-75); }

/* La papelera dentro de Ajustes: cada clase tirada es una fila con su
   nombre en grande y, debajo, las dos cosas que se pueden hacer con ella.
   Las pastillitas grises de antes (.pap-row) eran de la interfaz vieja. */
#aula-panel-ajustes .pap-fila {
  padding:var(--dc-sp-24) 0; border-bottom:1px solid rgba(255,255,255,.14);
}
#aula-panel-ajustes .pap-fila:last-child { border-bottom:none; }
#aula-panel-ajustes .pap-nombre {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-40);
  color:var(--dc-ink); text-shadow:var(--dc-shadow-text-strong); line-height:1.15;
}
#aula-panel-ajustes .pap-cuando {
  font-family:var(--dc-font); font-size:var(--dc-fs-22); color:var(--dc-ink-70); margin-top:var(--dc-sp-6);
}
#aula-panel-ajustes .pap-ops { display:flex; gap:var(--dc-sp-34); margin-top:var(--dc-sp-10); }
#aula-panel-ajustes .pap-ops .ent-op { font-size:var(--dc-fs-30); opacity:.75; }
@media (any-hover: hover) { #aula-panel-ajustes .pap-ops .ent-op:hover { opacity:1; } }

#aula-panel-ajustes #marco-lista { margin-top:var(--dc-sp-40); }
#aula-panel-ajustes #assign-topic-list { margin-top:var(--dc-sp-20); }

/* Marca de "visto" ← dots del carrusel §6.5 */
/* El dot mide lo que mide en el artboard (6.8px). El área de clic no es un
   valor de diseño, así que se agranda a sp-40 sin tocar el dibujo. */
.dc-dot-toggle {
  position:relative; flex-shrink:0; cursor:pointer;
  width:var(--dc-sp-40); height:var(--dc-sp-40);
  display:flex; align-items:center; justify-content:center;
}
.dc-dot-toggle input { position:absolute; inset:0; opacity:0; margin:0; cursor:pointer; }
.dc-dot-toggle .dc-dot {
  width:var(--dc-w-dot-off); height:var(--dc-w-dot-off);
  border-radius:var(--dc-radius-round); background:var(--dc-dot-off);
  transition:width .18s, height .18s, background .18s; pointer-events:none;
}
.dc-dot-toggle input:checked ~ .dc-dot {
  width:var(--dc-w-dot-on); height:var(--dc-w-dot-on); background:var(--dc-ink);
}

/* ═══ CLASES - carrusel de sesiones ═══ */
/* v6: el carrusel es EL MISMO que ve el alumno al entrar, con su mecánica y
   su piel de siempre (Rolando: "tráelo desde allá"). Aquí ya no se le pinta
   nada encima - mis overrides dc- de la v1 quedaron fuera a propósito.
   Tampoco va dentro de una caja centrada: esa caja recortaba las sombras de
   las fichas y se veía como un bug. Ancho completo y sin overflow propio. */
#aula-panel-clase { max-width:none; margin:0; padding:0; overflow:visible; }
/* El scroll del alumno se desvanece en sus primeros --dc-sp-40 (la máscara de
   #aula-scroll). El título de una clase ocupa DOS líneas cuando es largo, sube
   dentro de su caja y se metía en esa franja: se veía media palabra (Rolando,
   05/09: "si el título de su clase es muy grande, la parte difuminada de
   arriba tapa la mitad"). Con el hueco por encima de la franja ya no alcanza.*/
#aula-sesiones { padding:var(--dc-sp-14) 0 var(--dc-sp-6) !important; overflow:visible; }

/* "Disponibles" ya no es un hueco con un título: son las clases que este
   alumno puede tomar hoy, en dos carruseles con su nombre encima -gramática y
   temática- exactamente como las ve él (Rolando, 04/09). Los títulos y los
   huecos ya traen su propio margen de lienzo, así que el contenedor no pone
   ninguno: el carril tiene que poder llegar al borde para centrar la primera
   y la última ficha. */
#aula-panel-disponibles #aula-disponibles { padding:var(--dc-sp-10) 0 0; }
/* En el aula del profesor el lienzo es el ancho entero, así que la fila que
   elige el riel se alinea con él y no con la columna. */
#aula-panel-disponibles #aula-disponibles .riel-titulo,
#aula-panel-disponibles #aula-disponibles .filtros-riel { max-width:var(--dc-w-canvas); padding-left:var(--dc-sp-76); padding-right:var(--dc-sp-76); }

/* ═══ PROGRESO ═══ */
#aula-panel-progreso {
  background:none; min-height:100vh; margin:0 -20px; padding:0; font-family:var(--dc-font);
}
@media (min-width:600px) { #aula-panel-progreso { margin:0 -32px; } }
@media (min-width:900px) { #aula-panel-progreso { margin:0 -48px; } }
#progreso-overview, #progreso-detalle {
  max-width:var(--dc-w-canvas); margin:0 auto;
  padding:var(--dc-sp-60) var(--dc-sp-76) var(--dc-sp-72);
  min-height:62vh; display:flex; flex-direction:column; justify-content:center;
}
/* La vieja regla de tema pintaba aquí un degradado propio (misma costura
   que en Ajustes): el lienzo lo pinta sólo #screen-student. */
#aula-panel-progreso .progreso-menu { background:none; border-radius:0; padding:0; }

/* Fila de Progreso ← literal §6.7: alineación baseline, no center. */
/* v2, corregido por Rolando: el 100/50/50 NO es jerarquía fija - es lo que
   se ve al pasar el mouse sobre una palabra (esa captura fue un hover, no
   un reposo). En reposo las tres miden igual (50); el hover-grow-blur de
   más abajo es el mismo componente que en Ajustes. */
#aula-panel-progreso .ajustes-menu-row {
  max-width:var(--dc-w-row-progreso); margin-left:auto; margin-right:auto; border:none;
  font-family:var(--dc-font); font-size:var(--dc-fs-50); font-weight:var(--dc-weight);
  letter-spacing:normal; color:var(--dc-ink); text-align:center;
  justify-content:center; margin-bottom:var(--dc-sp-24);
}
#aula-panel-progreso .ajustes-menu-row.disabled { color:var(--dc-ink); cursor:default; }

/* Hover crecer/difuminar - mismo componente en Progreso y en el menú de
   Ajustes: en reposo todas las filas miden igual; al pasar el mouse por
   una, ESA crece (100) y queda nítida, las demás se difuminan un poco
   (blur suave, no fuerte) y se apartan un poco (8px, no un salto). Viaje
   siempre muy suave - mismo espíritu que el indicador de nav. */
/* El área sensible NO es el texto: cada fila es un botón invisible ancho y
   alto, y los tres se tocan entre sí (el aire va en el padding, no en el
   margin - el margin sería zona muerta donde el hover se apaga). */
#aula-panel-progreso .progreso-menu .ajustes-menu-row,
#aula-panel-ajustes .ajustes-menu .ajustes-menu-row {
  max-width:var(--dc-w-canvas);
  padding:var(--dc-sp-48) var(--dc-sp-40);
  margin-bottom:0;
  transition:font-size var(--dc-t-lento) var(--dc-ease),
             filter var(--dc-t-lento) var(--dc-ease),
             transform var(--dc-t-lento) var(--dc-ease);
}
/* Sólo si HAY algún ratón: en táctil puro el :hover se queda pegado tras
   tocar. Ojo con `hover: hover` a secas - mira el aparato PRIMARIO, así que
   en un portátil con pantalla táctil basta tocar una vez para que el hover
   se apague entero hasta volver a usar el ratón. `any-hover` pregunta si
   existe algún puntero con hover, que es lo que de verdad importa. */
@media (any-hover: hover) {
#aula-panel-progreso .progreso-menu .ajustes-menu-row:hover,
#aula-panel-ajustes .ajustes-menu .ajustes-menu-row:hover {
  font-size:var(--dc-fs-68); filter:blur(0);
}
#aula-panel-progreso .progreso-menu:has(.ajustes-menu-row:hover) .ajustes-menu-row:not(:hover),
#aula-panel-ajustes .ajustes-menu:has(.ajustes-menu-row:hover) .ajustes-menu-row:not(:hover) {
  filter:blur(1.4px);
}
#aula-panel-progreso .progreso-menu .ajustes-menu-row:hover ~ .ajustes-menu-row,
#aula-panel-ajustes .ajustes-menu .ajustes-menu-row:hover ~ .ajustes-menu-row {
  transform:translateY(6px);
}
#aula-panel-progreso .progreso-menu .ajustes-menu-row:has(~ .ajustes-menu-row:hover),
#aula-panel-ajustes .ajustes-menu .ajustes-menu-row:has(~ .ajustes-menu-row:hover) {
  transform:translateY(-6px);
}
}

/* v2: el % junto al nombre ya no aparece en ningún ejemplo nuevo - la
   jerarquía de tamaño ya dice cuál importa más, sin necesidad del número
   inline (el número exacto sigue en el detalle, al abrir la fila). */
#aula-panel-progreso .progreso-pct { display:none; }

#aula-panel-progreso .assign-section { margin-bottom:var(--dc-sp-48); padding:0; }
#aula-panel-progreso .assign-section:last-child { margin-bottom:0; }
#aula-panel-progreso .assign-section-title {
  font-family:var(--dc-font); font-size:var(--dc-fs-34); font-weight:var(--dc-weight);
  letter-spacing:normal; color:var(--dc-ink); margin-bottom:var(--dc-sp-20);
}

/* Palabra guardada ← fila sin caja (§7); no hay nada parecido en ningún
   artboard, así que se resuelve como una fila más de la lista. */
#aula-panel-progreso .fav-item {
  background:none; border:none; border-radius:0; padding:0; margin-bottom:var(--dc-sp-16);
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
}
#aula-panel-progreso .fav-es { color:var(--dc-ink); font-weight:var(--dc-weight); }
#aula-panel-progreso .fav-arrow { color:var(--dc-ink-75); }
#aula-panel-progreso .fav-ru { color:var(--dc-accent); font-weight:var(--dc-weight); }
#aula-panel-progreso .fav-del { color:var(--dc-ink-75); opacity:1; }
#aula-panel-progreso .fav-del:hover { color:var(--dc-accent); }

/* Botón de volver ← pill de cristal, tu ejemplo de la Regla 2 */
#progreso-detalle > .back-btn {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight);
  color:var(--dc-ink); background:none; border:none;
  box-shadow:none; border-radius:0; text-shadow:var(--dc-shadow-text-strong);
  padding:var(--dc-sp-10) 0; margin:0 0 var(--dc-sp-40) !important; width:auto; height:auto;
  backdrop-filter:none;
}

/* Slider de detalle ← literal §6.9, tal cual: título 52, pill de valor 38,
   raíl 8px, extremos 34, todo centrado como en ProgresoLexico.dc.html. */
#progreso-detalle .progreso-slider-wrap { background:none; padding:0 0 var(--dc-sp-34); border-radius:0; text-align:center; }
#progreso-detalle .progreso-slider-label {
  font-family:var(--dc-font); font-size:var(--dc-fs-52); font-weight:var(--dc-weight);
  color:var(--dc-ink); margin-bottom:var(--dc-sp-34);
}
#progreso-detalle .progreso-slider-num-pill {
  font-family:var(--dc-font); font-size:var(--dc-fs-38); font-weight:var(--dc-weight);
  background:var(--dc-glass); border:var(--dc-glass-border); box-shadow:var(--dc-shadow-pill);
  border-radius:var(--dc-radius-pill); padding:var(--dc-p-pill);
  display:inline-block; margin-bottom:var(--dc-sp-34);
}
#progreso-detalle .progreso-slider-track {
  max-width:var(--dc-w-bar); height:var(--dc-h-bar); background:var(--dc-track); border-radius:var(--dc-radius-track);
}
#progreso-detalle .progreso-slider-fill { background:var(--dc-fill); border-radius:var(--dc-radius-track); }
#progreso-detalle .progreso-slider-ends {
  max-width:var(--dc-w-bar); margin:var(--dc-sp-18) auto 0;
  font-family:var(--dc-font); font-size:var(--dc-fs-34); font-weight:var(--dc-weight); color:var(--dc-ink);
}
/* "¿Qué falta?" reutiliza la misma fila de tema que el marco de Ajustes. */
#progreso-detalle-falta .assign-topic-row {
  display:flex; align-items:center; justify-content:space-between; gap:var(--dc-sp-20);
  background:none; border:none; border-radius:0; padding:0; margin-bottom:var(--dc-sp-24);
}
#progreso-detalle-falta .assign-topic-name {
  font-family:var(--dc-font); font-size:var(--dc-fs-30); font-weight:var(--dc-weight); color:var(--dc-ink);
  display:flex; flex-direction:column; gap:2px;
}
#progreso-detalle-falta .dc-topic-sub { font-size:var(--dc-fs-22); color:var(--dc-ink-75); }
#progreso-detalle-falta .dc-help { color:var(--dc-ink-75); font-family:var(--dc-font); font-size:var(--dc-fs-30); }

/* ═══ BOTÓN DE TEXTO - el único botón del sistema ═══
   Ya no hay píldoras: un botón es texto con sombra difuminada debajo, que
   crece al pasar por encima y se hunde suavemente al pulsar. Una sola regla
   para todos, para que ninguno se sienta distinto (Rolando, v7). */
#screen-student > .classrooms-header #hc-board-btn,
#screen-student > .classrooms-header #t-notebook-toggle-btn,
#aula-clase-abierta .clase-titulo,
#aula-clase-abierta .clase-vacia-btn,
#aula-clase-abierta .reset-progress-btn,
#ajustes-detalle > .back-btn,
#progreso-detalle > .back-btn,
#aula-panel-ajustes .modal-btn,
#aula-panel-ajustes .dc-pill-btn,
#screen-classrooms .classrooms-header .back-btn {
  text-shadow:var(--dc-shadow-text-strong);
  transition:transform var(--dc-t-lento) var(--dc-ease);
  transform-origin:center center;
}
#screen-student #student-detail-name:hover,
#screen-student > .classrooms-header #hc-board-btn:hover,
#screen-student > .classrooms-header #t-notebook-toggle-btn:hover,
#aula-clase-abierta .clase-titulo:hover,
#aula-clase-abierta .clase-vacia-btn:hover,
#aula-clase-abierta .reset-progress-btn:hover,
#ajustes-detalle > .back-btn:hover,
#progreso-detalle > .back-btn:hover,
#aula-panel-ajustes .modal-btn:hover,
#aula-panel-ajustes .dc-pill-btn:hover,
#screen-classrooms .classrooms-header .back-btn:hover {
  transform:scale(1.06); background:none; box-shadow:none;
}
#screen-student #student-detail-name:active,
#screen-student > .classrooms-header #hc-board-btn:active,
#screen-student > .classrooms-header #t-notebook-toggle-btn:active,
#aula-clase-abierta .clase-titulo:active,
#aula-clase-abierta .clase-vacia-btn:active,
#aula-clase-abierta .reset-progress-btn:active,
#ajustes-detalle > .back-btn:active,
#progreso-detalle > .back-btn:active,
#aula-panel-ajustes .modal-btn:active,
#aula-panel-ajustes .dc-pill-btn:active,
#screen-classrooms .classrooms-header .back-btn:active {
  transform:scale(.965);
  transition:transform var(--dc-t-press) var(--dc-ease);
}
/* "Atrás" SIEMPRE pegado a la izquierda, nunca centrado por el flex del panel */
#ajustes-detalle > .back-btn, #progreso-detalle > .back-btn {
  align-self:flex-start; text-align:left;
}

/* Minúscula en los menús, como el artboard (decisión de Rolando, 02/09).
   Se hace con CSS y no tocando los textos: así el dato sigue escrito bien
   (por si mañana va a un informe) y se revierte quitando una línea.
   El nivel (A1, B2…) se queda como está: no es una palabra. */
#aula-panel-ajustes .ajustes-menu .ajustes-menu-row,
#aula-panel-progreso .progreso-menu .ajustes-menu-row:not(.disabled) {
  text-transform:lowercase;
}

/* ═══ BORDES QUE NO CORTAN ═════════════════════════════════════════════
   El contenido de las zonas con scroll pasaba por debajo de la barra de
   arriba y se cortaba en seco contra ella: se veían dos elementos pegados
   en vez de uno. Con una máscara, los últimos píxeles se desvanecen y la
   barra y lo de abajo se leen como una sola superficie. La máscara no
   pinta nada ni intercepta clics: sólo decide qué se ve. */
#screen-student #aula-scroll,
#screen-home > .scroll,
#screen-classrooms .estudiantes-centro > .scroll {
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-40));
  mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-40));
}
/* Con el carrusel (clases, disponibles) la pestaña CABE entera: no hay nada que
   se deslice por debajo de la nav, así que ni máscara ni el colchón de 100px
   del fondo, que sólo servía para que existiera un scroll vertical. En un
   móvil sí se desplaza, y ahí se queda todo como estaba. */
@media (min-width:620px) {
  #screen-student:not(.clase-modo):is([data-aula-tab="clase"], [data-aula-tab="disponibles"]) #aula-scroll,
  #screen-home[data-alumno-tab="clases"] > .scroll {
    -webkit-mask-image:none; mask-image:none; padding-bottom:0;
  }
}
/* La columna de notas YA NO lleva máscara propia (11/09): una máscara recorta
   todo lo que pinta el elemento a su caja, incluido el desenfoque con el que
   entra al abrirla, y ese corte era "una línea que limita todo por la parte
   izquierda" (Rolando). El desvanecido de arriba y de abajo lo pone
   .notebook-body, que es lo que de verdad se desplaza. */

/* ═══ ENTRADA DE PANEL - una sola animación para TODO cambio de sección
   (pestañas, overview→detalle, detalle→overview, abrir/cerrar clase,
   entrar a una pantalla). Nada aparece de golpe: entra desenfocado y se
   asienta. La pone/quita `_animarEntrada()` en JS. ═══ */
@keyframes dcEntra {
  from { opacity:0; filter:blur(9px); transform:translateY(10px); }
  to   { opacity:1; filter:blur(0);   transform:translateY(0); }
}
/* `will-change` promueve el panel a su propia capa: el desenfoque se
   rasteriza una vez en vez de recalcularse contra el fondo cada fotograma. */
.dc-entra { animation:dcEntra var(--dc-t-entrada) var(--dc-ease) both; will-change:opacity, filter, transform; }
/* Lo que se va no desaparece de golpe: se desvanece mientras lo nuevo
   entra. Durante ese rato sale del flujo (position:absolute) para no
   empujar a lo que está llegando, y deja de recibir clics. */
@keyframes dcSale {
  from { opacity:1; filter:blur(0);   transform:translateY(0); }
  to   { opacity:0; filter:blur(7px); transform:translateY(-8px); }
}
.dc-sale {
  animation:dcSale var(--dc-t-salida) var(--dc-ease) both;
  position:absolute; left:0; right:0; top:0; z-index:0; pointer-events:none;
  will-change:opacity, filter, transform;
}
html.sin-desenfoque .dc-sale { animation-name:dcSaleLigera; }
@keyframes dcSaleLigera {
  from { opacity:1; transform:translateY(0); }
  to   { opacity:0; transform:translateY(-8px); }
}
#screen-student #aula-scroll { position:relative; }
/* Lo mismo para el inicio del profesor: la capa que se va va en absoluto. */
#screen-home #home-scroll { position:relative; }
@media (prefers-reduced-motion:reduce) { .dc-sale { animation:none; display:none !important; } }
/* En aparatos flojos (pocos núcleos/memoria) el desenfoque de pantalla
   completa es lo que rompe la fluidez: se cae a un fundido, que se siente
   igual de suave y cuesta una fracción. La clase la pone el arranque. */
html.sin-desenfoque .dc-entra { animation-name:dcEntraLigera; will-change:opacity, transform; }
@keyframes dcEntraLigera {
  from { opacity:0; transform:translateY(10px); }
  to   { opacity:1; transform:translateY(0); }
}
@media (prefers-reduced-motion:reduce) { .dc-entra { animation:none; } }

/* ═══ INICIO DEL ALUMNO ═══════════════════════════════════════════════
   Mismo esqueleto que el aula del profesor: el nombre manda en la esquina,
   las acciones son texto a la derecha, y debajo el carrusel y lo que tiene
   disponible. Sin barra con píldora, sin chips de tiempos verbales. */
#screen-home { background:var(--dc-bg); }
#screen-home .topbar {
  display:flex; align-items:baseline; gap:var(--dc-sp-24);
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:var(--dc-sp-34) var(--dc-sp-76) var(--dc-sp-24);
}
#screen-home .topbar-logo-pill {
  background:none; border:none; box-shadow:none; backdrop-filter:none;
  padding:0; order:0;
}
/* 163 → 120: a 163 la marca se comía la esquina (Rolando, 03/09).
   v4 (03/09, 3.ª vuelta): la sombra ya no espera al ratón - va SIEMPRE
   puesta. Es la pieza que ancla la marca a la plataforma ("estoy en
   Hablamos") y para eso necesita peso todo el rato, no sólo al pasar por
   encima; el nombre del alumno se queda con su regla vieja (sombra sólo al
   acercarse) porque ahí lo que hace falta decir es "esto se puede pulsar",
   no "esto es la marca". Sigue creciendo un pelín al pasar el ratón. */
#screen-home .topbar-logo-text {
  font-family:var(--dc-font); font-weight:var(--dc-weight);
  font-size:var(--dc-fs-120); color:var(--dc-ink);
  letter-spacing:var(--dc-tracking); line-height:1;
  text-shadow:var(--dc-shadow-text-strong);
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) {
  #screen-home .topbar-logo-pill:hover .topbar-logo-text { transform:scale(1.03); }
}
/* En un móvil estrecho "Hablamos" a 120 se comía el sitio de "salir": la
   fila no envuelve (es una sola línea de siempre) y las dos palabras
   quedaban montadas una encima de la otra. */
@media (max-width:480px) {
  #screen-home .topbar-logo-text { font-size:var(--dc-fs-68); }
}
/* El nombre a la izquierda; todas las acciones juntas a la derecha, en fila. */
#screen-home .topbar-left  { order:1; margin-left:auto; display:flex; gap:var(--dc-sp-24); align-items:baseline; }
#screen-home .topbar-right { order:2; display:flex; gap:var(--dc-sp-24); align-items:baseline; }
#screen-home .topbar .tb-btn {
  font-family:var(--dc-font) !important; font-weight:var(--dc-weight) !important;
  font-size:var(--dc-fs-30) !important; letter-spacing:normal !important;
  color:var(--dc-ink) !important; text-transform:lowercase;
  background:none !important; border:none !important; box-shadow:none !important;
  border-radius:0 !important; backdrop-filter:none !important;
  text-shadow:var(--dc-shadow-text-strong);
  height:auto !important; width:auto !important; padding:var(--dc-sp-8) 0 !important;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { #screen-home .topbar .tb-btn:hover { transform:scale(1.06); background:none !important; } }
#screen-home .topbar .tb-btn:active { transform:scale(.965); transition:transform var(--dc-t-press) var(--dc-ease); }
/* La estantería del profesor (secciones y subsecciones) habla el mismo
   idioma que la nav del aula: palabras en minúscula, la activa en el pill
   metálico. Sin la rayita de antes ni las píldoras de cristal. */
/* ── EL MENÚ GRANDE ──────────────────────────────────────────────────
   Las opciones sueltas y enormes en mitad de la pantalla: la que tocas
   crece, las otras se desenfocan y se apartan un poco. Es UNA pieza con
   nombre (Rolando, 03/09) y se usa en los dos lados: el inicio del profesor
   (alumnos / clases / ajustes, y luego gramática / temática) y las pantallas
   del alumno (disponibles, ajustes). Antes existía sólo como un puñado de
   reglas sueltas colgadas del panel del alumno. */
.menu-grande {
  display:flex; flex-direction:column; align-items:stretch;
  background:none !important; border-radius:0 !important; padding:0 !important;
}
.menu-grande .menu-grande-op {
  width:100%; border:none !important; background:none !important; cursor:pointer;
  text-align:center; justify-content:center; display:block;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-50);
  color:var(--dc-ink); text-transform:lowercase; letter-spacing:normal; line-height:1.1;
  text-shadow:var(--dc-shadow-text-strong);
  padding:var(--dc-sp-48) var(--dc-sp-40);
  transition:font-size var(--dc-t-lento) var(--dc-ease),
             filter var(--dc-t-lento) var(--dc-ease),
             transform var(--dc-t-lento) var(--dc-ease);
}
/* El crecer era demasiado: de 50 a 100 la palabra DUPLICA su tamaño y pasar
   el ratón por encima se sentía como un salto, no como un gesto (Rolando,
   03/09). 50 → 68 se nota igual y deja mover el ratón con tranquilidad. El
   desenfoque de las otras también baja (2,5 → 1,4) y el apartarse, de 10 a 6. */
@media (any-hover: hover) {
  .menu-grande .menu-grande-op:hover { font-size:var(--dc-fs-68); filter:blur(0); }
  .menu-grande:has(.menu-grande-op:hover) .menu-grande-op:not(:hover) { filter:blur(1.4px); }
  .menu-grande .menu-grande-op:hover ~ .menu-grande-op { transform:translateY(6px); }
  .menu-grande .menu-grande-op:has(~ .menu-grande-op:hover) { transform:translateY(-6px); }
}
.menu-grande .menu-grande-op:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }

/* ── LA GALERÍA ──────────────────────────────────────────────────────
   UNA sola pieza para los tres carruseles de la plataforma: las clases del
   profesor, lo que el alumno tiene disponible y su diario (que la lleva en su
   propio módulo, .ses-*, con estas mismas proporciones). Cada clase es su
   nombre en el aire, su foto, y debajo de la foto la línea que la sitúa.
   Todas las medidas salen del ancho de la ficha (--gal-w), que es lo que hace
   que las tres se vean iguales viviendo en contenedores de anchos distintos
   (Rolando, 03/09: "haz el del profe como hiciste el del alumno").

   Aquí ya no vive el menú grande del inicio: la portada del profesor pasó a
   ser la misma pantalla que la del alumno -nav de tres palabras arriba y el
   panel debajo-, así que no hay tres opciones solas en mitad de la pantalla
   ni un "atrás" en la esquina. */
/* Estas reglas valen en DOS sitios: la pantalla de inicio y la pantalla de
   elegir clase (#elegir-ov), que enseña el MISMO carrusel con las mismas
   proporciones. Se escriben con :is(...) en vez de duplicar veinte
   selectores; la especificidad no cambia (los dos son ids). */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .galeria { width:100%; display:flex; flex-direction:column; justify-content:center; }
/* El ancho va en vw y no en %: el carril lleva un relleno enorme a los lados
   (lo que deja centrar la primera y la última), y un % se mediría contra lo
   que queda DENTRO de ese relleno - las clases salían del tamaño de un sello.
   El relleno de ABAJO es el hueco de la sombra de la foto: overflow recorta en
   el borde del relleno y con poco se veía cortada (Rolando, 03/09).
   Sin `scroll-snap-type:mandatory` ni `scroll-behavior:smooth`: con el imán
   puesto, cada empujón de la rueda se corregía al instante y el carril se
   quedaba clavado en la ficha del centro. El encaje lo hace _galEncajar. */
/* El ancho de la ficha manda sobre TODO lo demás (alto, tipografía, sombras),
   así que también tiene que mirar el alto de la ventana. Con `26vw` a secas,
   en una pantalla ancha y baja el carrusel salía más alto que el hueco que le
   quedaba y había que desplazarse en vertical para ver el pie de las fichas -
   justo lo que Rolando no quiere ("no quiero deslizamiento vertical, eso
   confunde"). Un carrusel entero mide algo menos de 1,5 veces el ancho de una
   ficha; con el tope de 38vh cabe en lo que queda bajo la nav y los
   selectores. En el móvil manda la regla de 620px, que es otra. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .galeria-carril {
  --gal-w: calc(min(26vw, 35vh) * var(--dc-dens, 1)); --gal-hueco: calc(var(--gal-w) * .16);
  display:flex; align-items:flex-end; gap:var(--gal-hueco);
  overflow-x:auto; overflow-y:hidden;
  overscroll-behavior-x:contain;
  scrollbar-width:none; -ms-overflow-style:none;
  cursor:grab;
  /* El relleno lateral centra la primera y la última. Va en % del propio
     carril y NO en 50vw: el carril casi nunca empieza en el borde de la
     pantalla (el scroll de la página tiene su propio margen), y con vw todo
     el carrusel quedaba desplazado ese margen hacia la derecha. Ojo: esto
     vale para el RELLENO, que se mide contra el contenedor; el ANCHO de la
     ficha sigue en vw, porque un % ahí se mediría contra lo que queda dentro
     de este relleno enorme y las clases salían del tamaño de un sello. */
  padding:calc(var(--gal-w) * .10) calc(50% - var(--gal-w) / 2) calc(var(--gal-w) * .20);
}
/* Nada choca con el borde de la página: la ficha del extremo se desvanece en
   vez de cortarse contra el marco (Rolando, 07/09). Es la misma máscara que
   usan los bordes de arriba de las zonas con scroll. */
:is(#screen-home, #elegir-ov, #screen-student, #ej-ed) .galeria-carril {
  -webkit-mask-image:linear-gradient(to right, transparent 0, #000 var(--dc-sp-60),
                     #000 calc(100% - var(--dc-sp-60)), transparent 100%);
  mask-image:linear-gradient(to right, transparent 0, #000 var(--dc-sp-60),
             #000 calc(100% - var(--dc-sp-60)), transparent 100%);
}
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .galeria-carril.gal-arrastra { cursor:grabbing; user-select:none; -webkit-user-select:none; }
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .galeria-carril::-webkit-scrollbar { display:none; }
/* Todas las clases se apoyan en la MISMA línea de base (align-items:flex-end
   + transform-origin abajo): antes cada una escalaba desde su centro, así que
   la que acababas de dejar atrás caía por debajo de la del medio y la fila
   quedaba en diagonal. La del centro es la más grande y crece HACIA ARRIBA. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item {
  flex:0 0 var(--gal-w);
  background:none; border:none; padding:0; cursor:pointer;
  display:block;
  transform:scale(var(--gal-s, .90)); transform-origin:center bottom;
  opacity:var(--gal-o, .62);
  transition:transform .16s linear, opacity .16s linear,
             filter var(--dc-t-lento) var(--dc-ease);
  will-change:transform, opacity;
}
/* La caja de dentro es la que crece al pasar el ratón: el escalado del scroll
   vive en el botón y va rápido (sigue al dedo), y éste va con la curva lenta
   del sistema - el mismo gesto del MENÚ GRANDE, con su mismo desenfoque. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-in {
  display:flex; flex-direction:column; align-items:center; gap:calc(var(--gal-w) * .034);
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) {
  :is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item:hover .gal-in { transform:scale(1.06); }
  :is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .galeria-carril:has(.gal-item:hover) .gal-item:not(:hover) { filter:blur(1.4px) brightness(.88); }
}
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item:active .gal-in { transform:scale(.99); transition:transform var(--dc-t-press) var(--dc-ease); }

/* El nombre SIEMPRE ocupa lo mismo (dos líneas) para que las fotos de todas
   las fichas queden a la misma altura. La altura va en em del propio tamaño,
   que es igual en todas: con un tamaño distinto por título largo, la caja
   medía menos y su foto subía. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-titulo {
  width:100%; height:2.3em;
  font-family:var(--dc-font); font-weight:var(--dc-weight);
  font-size:calc(var(--gal-w) * .115); line-height:1.08;
  color:var(--dc-ink); letter-spacing:var(--dc-tracking);
  text-align:center; text-wrap:balance;
  text-shadow:var(--dc-shadow-text-strong);
  display:flex; align-items:flex-end; justify-content:center;
  transform:scale(var(--gal-ts, .62)); transform-origin:center bottom;
  transition:transform .16s linear;
}
/* El recorte a dos líneas necesita `overflow:hidden`, y overflow recorta en el
   borde del RELLENO - sin relleno, cortaba la sombra del título por arriba y
   por abajo y el nombre parecía ir metido en unos rieles. El relleno le abre
   sitio a la sombra y el margen negativo devuelve la caja a donde estaba. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-titulo > span {
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
  padding:0 .2em; margin:0 -.2em;
}
/* Misma cura que el título del diario (.ses-titulo): texto recortado a ras y
   la sombra como filtro del título entero, que no la corta ninguna caja. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov) .gal-titulo {
  text-shadow:none; filter:drop-shadow(0 calc(var(--gal-w) * .03) calc(var(--gal-w) * .035) rgba(20,30,45,.48));
}
/* La caja de la foto manda: 16/10 siempre. Lo de dentro va en ABSOLUTO -si la
   imagen se queda en el flujo, una foto vertical estira la caja y la fila de
   clases deja de estar alineada (encontrado el 03/09: `aspect-ratio` es un
   tamaño PREFERIDO, y el contenido lo desborda). Es lo mismo que hace el
   diario del alumno con .ses-media-in. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-foto {
  position:relative; width:100%; aspect-ratio:16/10; min-height:0; flex:none;
  border-radius:calc(var(--gal-w) * .092);
  background:var(--dc-card-inner);
  box-shadow:0 calc(var(--gal-w) * .052) calc(var(--gal-w) * .115) rgba(15,20,30,.34);
}
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-foto > img,
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-vacia {
  position:absolute; inset:0; width:100%; height:100%;
  border-radius:inherit; display:block;
}
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-foto > img { object-fit:cover; }
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-vacia {
  display:flex; align-items:center; justify-content:center;
  font-family:var(--dc-font); font-size:calc(var(--gal-w) * .07); color:rgba(255,255,255,.55);
}
/* Debajo de la foto: la línea que sitúa la clase (cuántos ejercicios tiene, o
   por dónde va el alumno). Es el sitio que en el diario ocupa la fecha. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-pie {
  width:100%; text-align:center; min-height:2.4em;
  font-family:var(--dc-font); font-weight:var(--dc-weight);
  font-size:calc(var(--gal-w) * .062); line-height:1.15;
  color:var(--dc-ink); letter-spacing:var(--dc-tracking);
  text-shadow:0 10px 20px rgba(20,30,45,.45);
}
/* La de crear es EXACTAMENTE la misma pieza que una clase sin foto: mismo
   degradado, misma sombra, mismo hover. Aquí había un recuadro con borde de
   rayas y un + en el centro, que en mitad de una fila de clases se leía como
   un hueco de formulario y no como algo que apetece pulsar (Rolando, 04/09).
   Lo único que la distingue es su nombre -"nueva clase"- y que va delante.
   Va un punto más apagada mientras no la tocas, igual que "+ nuevo alumno"
   en la lista de nombres: todavía no es una clase, es la promesa de una. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item.gal-nueva .gal-in { opacity:.72; transition:opacity var(--dc-t-lento) var(--dc-ease), transform var(--dc-t-lento) var(--dc-ease); }
@media (any-hover: hover) { :is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item.gal-nueva:hover .gal-in { opacity:1; } }
/* Aquí había un ⋯ dentro de un círculo blanco: un menú escondido detrás de un
   símbolo, en una pantalla donde todo lo demás son palabras (Rolando, 07/09:
   "quitar los tres puntitos y poner un editar pequeño en Coolvetica"). Ahora
   lo que hay es la palabra, en la esquina de la foto y sólo sobre la clase
   que está delante - como el ⋯, no molesta al resto de la fila. */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-editar {
  position:absolute; top:calc(var(--gal-w) * .040); right:calc(var(--gal-w) * .052);
  background:none; border:none; cursor:pointer;
  padding:.3em .45em; margin:-.3em -.45em;
  font-family:var(--dc-font); font-weight:var(--dc-weight); letter-spacing:var(--dc-tracking);
  font-size:calc(var(--gal-w) * .058); line-height:1; color:var(--dc-ink);
  text-shadow:var(--dc-shadow-text-strong);
  opacity:0; pointer-events:none;
  transition:opacity var(--dc-t-lento) var(--dc-ease), transform var(--dc-t-lento) var(--dc-ease);
}
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item.es-centro .gal-editar { opacity:.8; pointer-events:auto; }
@media (any-hover: hover) {
  :is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item.es-centro .gal-editar:hover { opacity:1; transform:scale(1.06); }
}
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item.es-centro { cursor:pointer; }
/* La clase que se está borrando se apaga y se difumina en su sitio; sólo
   después se rehace la fila (Rolando, 07/09). */
:is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .gal-item.gal-yendose {
  opacity:0 !important; filter:blur(8px); pointer-events:none;
  transition:opacity .4s var(--dc-ease), filter .4s var(--dc-ease);
}
/* En un móvil no caben tres: manda una, con las vecinas asomando. */
@media (max-width:620px) { :is(#screen-home, #elegir-ov, #screen-student, #tipo-ov, #ficha-ed, #ej-ed) .galeria-carril { --gal-w: 62vw; } }

/* ── EDITAR UNA CLASE SIN SALIR DE LA FILA ───────────────────────────
   Al pulsar "editar", la propia ficha VIAJA al centro de la pantalla y el
   resto se difumina -no se oscurece- (Rolando, 07/09). No es un formulario
   con la clase dentro: es la clase, más grande, con el nombre escrito encima
   y la foto debajo, exactamente como se va a ver luego en el carrusel. Por
   eso reutiliza .gal-in / .gal-titulo / .gal-foto tal cual, y por eso
   #ficha-ed está metido en la lista de ámbitos de todas esas reglas.

   El velo va en su PROPIA capa, no en el overlay: si el desenfoque viviera en
   el padre, la ficha tendría que aparecer con él y el vuelo empezaría desde la
   nada. Así el velo se funde mientras la ficha vuela, ya visible. */
.fed-ov { position:fixed; inset:0; z-index:1060;
  display:flex; align-items:center; justify-content:center;
  padding:var(--dc-sp-40) var(--dc-sp-60); }
.fed-velo { position:absolute; inset:0; background:rgba(30,40,55,.10);
  -webkit-backdrop-filter:blur(26px) saturate(130%);
  backdrop-filter:blur(26px) saturate(130%);
  opacity:0; transition:opacity .42s var(--dc-ease); }
.fed-ov.on .fed-velo { opacity:1; }
/* El vuelo: la ficha nace con la posición y el tamaño de la del carrusel
   (transform calculado en JS con el centro de la FOTO como origen, que es la
   pieza que tiene que encajar) y desde ahí se suelta hasta su sitio. */
#ficha-ed { position:relative; --gal-w:calc(min(34vw, 40vh) * var(--dc-dens, 1)); --gal-ts:1;
  width:var(--gal-w); will-change:transform;
  transition:transform .58s var(--dc-ease); }
/* El nombre se escribe donde se lee. El relleno es el hueco por el que sale
   la sombra -el mismo truco que en la ficha del carrusel-, y el margen
   negativo devuelve la caja a su sitio. */
#ficha-ed .gal-titulo { height:auto; min-height:2.3em; }
#ficha-ed .fed-t { display:block; max-width:100%; outline:none; cursor:text;
  padding:.35em .5em .7em; margin:-.35em -.5em -.7em; min-width:1.5em;
  border-radius:.2em; transition:background var(--dc-t-lento) var(--dc-ease); }
#ficha-ed .fed-t:empty::before { content:'sin nombre'; opacity:.42; }
@media (any-hover: hover) { #ficha-ed .fed-t:hover { background:rgba(255,255,255,.07); } }
#ficha-ed .fed-t:focus { background:rgba(255,255,255,.10); }
/* La foto entera es el botón de cambiarla: pulsar abre los archivos, ⌘V pega.
   Vacía, es el mismo cuadro que cualquier clase sin foto y dice "añadir". */
#ficha-ed .gal-foto { cursor:pointer; overflow:hidden; }
#ficha-ed .gal-foto > img { transition:transform var(--dc-t-lento) var(--dc-ease); }
@media (any-hover: hover) { #ficha-ed .gal-foto:hover > img { transform:scale(1.03); } }
/* Sobre la foto puesta, al acercarse, SÓLO el símbolo de recortar. */
#ficha-ed .fed-crop { position:absolute; top:50%; left:50%;
  transform:translate(-50%,-50%) scale(.94);
  width:calc(var(--gal-w) * .15); height:calc(var(--gal-w) * .15); border-radius:50%;
  border:none; cursor:pointer; background:rgba(255,255,255,.88); color:var(--dc-ink-dark);
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 calc(var(--gal-w) * .02) calc(var(--gal-w) * .05) rgba(15,20,30,.24);
  opacity:0; transition:opacity var(--dc-t-lento) var(--dc-ease), transform var(--dc-t-lento) var(--dc-ease); }
#ficha-ed .fed-crop svg { width:46%; height:46%; }
@media (any-hover: hover) { #ficha-ed .gal-foto:hover .fed-crop { opacity:1; transform:translate(-50%,-50%) scale(1); } }
@media (hover:none) { #ficha-ed .fed-crop { opacity:1; transform:translate(-50%,-50%) scale(1); } }
/* ── EN VIVO: el espejo con el que entra lo que escribe el otro ── */
.campo-espejo { position:absolute; z-index:4; pointer-events:none; margin:0; overflow:hidden;
  background:none !important; box-shadow:none !important; -webkit-backdrop-filter:none; backdrop-filter:none; }
.campo-espejo .tx-wd { display:inline-block; }
.campo-espejo .tx-nuevo { display:inline-block; animation:txNuevo var(--txdur,.42s) cubic-bezier(.22,.61,.36,1) both; }
@keyframes txNuevo { from { opacity:0; transform:translateY(.06em); } to { opacity:1; transform:none; } }
.campo-espejo .tx-borra { display:inline-block; white-space:pre; font-size:1em; opacity:1;
  transition:opacity .18s ease, font-size .3s cubic-bezier(.4,0,.2,1); }
.campo-espejo .tx-borra.tx-va { opacity:0; font-size:0; }
.campo-animando { color:transparent !important; -webkit-text-fill-color:transparent !important; text-shadow:none !important; }
.campo-animando * { color:transparent !important; -webkit-text-fill-color:transparent !important; text-shadow:none !important; }
/* Mientras la foto sube al servidor, la ficha espera medio apagada. */
#ficha-ed.fed-subiendo .gal-foto { opacity:.62; pointer-events:none; }
/* Un día de sólo pizarra: la marca de siempre y nada que pulsar. */
#ficha-ed .gal-foto.fed-sin-foto { cursor:default;
  background:linear-gradient(140deg,#ccd8e6 0%,#e4ebf3 55%,#cbd8e8 100%); }
/* Debajo, las dos palabras: la que cierra y la que tira. Sin píldoras y sin
   rojo - ahí no hay rojo que valga; la pregunta ya avisa de lo que va a pasar. */
#ficha-ed .fed-pie { display:flex; align-items:center; justify-content:center;
  gap:calc(var(--gal-w) * .10); margin-top:calc(var(--gal-w) * .05);
  opacity:0; transition:opacity .42s var(--dc-ease) .14s; }
.fed-ov.on #ficha-ed .fed-pie { opacity:1; }
#ficha-ed .fed-pie button { background:none; border:none; cursor:pointer;
  padding:.35em .5em; margin:-.35em -.5em;
  font-family:var(--dc-font); font-weight:var(--dc-weight); letter-spacing:var(--dc-tracking);
  font-size:calc(var(--gal-w) * .072); line-height:1; color:var(--dc-ink);
  text-shadow:var(--dc-shadow-text-strong);
  transition:transform var(--dc-t-lento) var(--dc-ease), opacity var(--dc-t-lento) var(--dc-ease); }
#ficha-ed .fed-pie .fed-tirar { opacity:.58; }
@media (any-hover: hover) { #ficha-ed .fed-pie button:hover { transform:scale(1.06); opacity:1; } }
#ficha-ed .fed-pie button:active { transform:scale(.98); }
@media (max-width:620px) { #ficha-ed { --gal-w:74vw; } }


/* ── LOS PANELES DEL INICIO DEL PROFESOR ─────────────────────────────
   La lista de alumnos y las clases son dos paneles hermanos de la misma
   pantalla, como los tres del alumno; antes eran pantallas distintas. */
#prof-panel-alumnos, #prof-panel-clases {
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
}
#prof-panel-alumnos { padding:var(--dc-sp-24) var(--dc-sp-76) var(--dc-sp-72); }
/* Ajustado el 04/09 (7.ª vuelta) para que la pantalla quepa sin desplazarse:
   ahora sólo hay UN carrusel, y lo que sobraba era aire de más entre los
   selectores y él, y por debajo de él. */
#prof-panel-clases { padding:0 0 var(--dc-sp-16); }
#prof-lista .riel-bloque { margin-top:var(--dc-sp-8); }
#prof-panel-ajustes { padding:var(--dc-sp-24) 0 var(--dc-sp-72); max-width:var(--dc-w-canvas); width:100%; margin:0 auto; }
/* Dentro de Ajustes los campos son los de la puerta (.ent-campo), que ocupan
   todo el ancho: sin apilarlos en columna, el botón de guardar se iba a la
   línea de al lado del último renglón. */
#prof-panel-ajustes .prof-cabecera { display:flex; flex-direction:column; align-items:flex-start; }
#prof-galeria { position:relative; }
/* La segunda fila de la navegación: el riel (gramática · temática) en
   "disponibles" del alumno - ahí sí conviven las dos filas con el carrusel,
   porque son sólo dos pisos y caben. Misma pieza que la de arriba -la
   cápsula metálica que viaja-, sólo con menos aire encima. */
#screen-home .alumno-tabs.riel-nav {
  padding:var(--dc-sp-16) var(--dc-sp-76) var(--dc-sp-10);
}

/* ── OPCIONES - la pieza que sustituye a las filas de píldoras ────────
   (Rolando, 04/09: "necesitamos mantener una sola fila de píldora en
   pantalla, lo demás deben de ser opciones. Se ve mal un engranaje de tres
   filas para elegir cosas").

   Lo que había en "clases" eran TRES selectores apilados -la nav de arriba,
   el riel, y los tiempos verbales-, cada uno con su propia cápsula. Tres
   engranajes a la vez. Ahora manda una sola cápsula por pantalla (la nav de
   arriba) y todo lo que cuelga de ella son OPCIONES: el mismo menú grande
   que ya usaban Ajustes y Progreso en el perfil del alumno -la que tocas
   crece, las otras se desenfocan y se apartan-, sólo que alineado a la
   izquierda para que caiga bajo la palabra de la que cuelga y no en mitad
   de la pantalla. */
.opciones { display:flex; flex-direction:column; align-items:flex-start; }
.opcion {
  background:none; border:none; cursor:pointer; text-align:left;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-52);
  color:var(--dc-ink); letter-spacing:normal; line-height:1.16;
  /* La caja lleva más aire que las letras a propósito: cuando el sistema
     desenfoca las opciones hermanas al pasar el ratón, cada una se pinta en
     su propia capa y lo que sobresale de su caja se corta - era la "sombra
     cortada" de "o crearla con IA" al retirar el ratón (Rolando, 07/09). El
     margen negativo devuelve la palabra a su sitio. */
  padding:var(--dc-sp-20) var(--dc-sp-24); margin:0 calc(var(--dc-sp-24) * -1);
  text-transform:lowercase;
  text-shadow:var(--dc-shadow-text-strong);
  transform-origin:left center;
  transition:font-size var(--dc-t-lento) var(--dc-ease),
             filter var(--dc-t-lento) var(--dc-ease),
             transform var(--dc-t-lento) var(--dc-ease),
             opacity var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) {
  .opcion:hover { font-size:var(--dc-fs-68); }
  .opciones:has(.opcion:hover) .opcion:not(:hover) { filter:blur(1.4px); opacity:.6; }
  .opcion:hover ~ .opcion { transform:translateY(6px); }
  .opcion:has(~ .opcion:hover) { transform:translateY(-6px); }
}
.opcion:active { transform:scale(.99); transition:transform var(--dc-t-press) var(--dc-ease); }
/* Una opción que todavía no es nada (crear algo) va más apagada, igual que
   "+ nuevo alumno" en la lista de nombres. */
.opcion.apagada { opacity:.5; }
@media (any-hover: hover) { .opcion.apagada:hover { opacity:1; } }
@media (max-width:700px) {
  .opcion { font-size:var(--dc-fs-40); }
  .opcion:hover { font-size:var(--dc-fs-52); }
}

/* ── DENTRO DE "CLASES" ───────────────────────────────────────────────
   El árbol que se pinta ahora (04/09, 5.ª vuelta). Los tiempos verbales
   dejan de ser un SELECTOR y pasan a ser TÍTULOS: cada uno con su carrusel
   debajo, uno tras otro, igual que Rolando pidió para "disponibles" del
   alumno ("un texto encima de temática, otro para gramática, cada carrusel
   debajo de cada una de esas palabras"). Así se llega a cualquier clase en
   UN toque, no hay segunda fila de píldoras, y desplazarse sustituye a
   navegar.

       clases ├─ gramática → presente [carrusel] · pasado [carrusel] · …
              └─ temática  → [carrusel]

   La palabra elegida se queda arriba, grande, y es el camino de vuelta -
   la misma regla que el nombre del alumno dentro de su aula. */
.prof-cabecera { max-width:var(--dc-w-columna); width:100%; margin:0 auto; padding:0; }
@media (max-width:900px) { .prof-cabecera { padding:0 var(--dc-sp-24); } }
.prof-vuelta {
  background:none; border:none; padding:var(--dc-sp-8) 0; cursor:pointer;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-100);
  color:var(--dc-ink); line-height:1.05; letter-spacing:var(--dc-tracking);
  text-transform:lowercase; text-shadow:var(--dc-shadow-text-strong);
  transform-origin:left center;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { .prof-vuelta:hover { transform:scale(1.05); } }
.prof-vuelta:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }
.riel-bloque { margin-top:var(--dc-sp-24); }
/* ── ELEGIR RIEL - gramática · temática ───────────────────────────────
   "Disponibles" ya no apila los dos carruseles uno debajo del otro
   (Rolando, 04/09, 6.ª vuelta: "eliges uno de los dos y te aparece ese
   carrusel, no scrolleando para ver el siguiente"). Se elige uno y sólo
   se ve ese. NO es una segunda fila de píldoras -en la pantalla ya manda
   la nav de arriba-: son las mismas OPCIONES en fila que en la puerta y
   en los filtros de elegir clase, sólo que del tamaño del título al que
   sustituyen (fs-40), y colgando de la nav en la columna, no a sangre. */
/* CENTRADAS (Rolando, 04/09, 7.ª vuelta: "temática y gramática deben aparecer
   en el centro"). La nav manda desde el centro; lo que cuelga de ella tiene
   que caer bajo su mismo eje, no arrancar en el borde del lienzo. */
.filtros.filtros-riel, .filtros.filtros-tiempos {
  max-width:var(--dc-w-columna); width:100%; margin:0 auto;
  gap:var(--dc-sp-40); padding:0; justify-content:center; text-align:center;
}
.filtros.filtros-riel .ent-op { font-size:var(--dc-fs-40); transform-origin:center; }
/* El segundo escalón (los tiempos verbales) va más pequeño que el primero: la
   escala dibuja el árbol, igual que 140 → 60 → 40 en la puerta. */
/* La fila de tiempos verbales necesita más sitio que la columna: son cuatro o
   cinco palabras más "+ nuevo tiempo verbal", y en 760u se partía en dos
   líneas. Va al ancho del lienzo, pero centrada, así que sigue leyéndose como
   algo que cuelga de la nav. */
.filtros.filtros-tiempos {
  max-width:var(--dc-w-canvas); gap:var(--dc-sp-34); margin-top:var(--dc-sp-8);
  padding-left:var(--dc-sp-40); padding-right:var(--dc-sp-40);
  /* LA SOMBRA CORTADA (Rolando, 04/09: "debajo del tiempo verbal hay una
     sombra cortada"). La fila es una .persiana, y una persiana es
     overflow:hidden - sin eso no puede plegarse. La palabra encendida lleva
     --dc-shadow-text-strong, que cae 16+28 px por debajo de las letras: la
     caja medía 39 px de alto y el resto de la sombra se cortaba en seco,
     dibujando una raya horizontal bajo "presente".
     Se le da a la caja el hueco que la sombra necesita (padding) y se le
     quita al layout con el mismo margen en negativo, así lo de debajo no se
     mueve ni un píxel. Plegada, .plegada anula los dos a la vez. */
  padding-bottom:calc(48 * var(--dc-u)); margin-bottom:calc(-40 * var(--dc-u));
}
.filtros.filtros-tiempos .ent-op { font-size:var(--dc-fs-30); transform-origin:center; }
.filtros.filtros-tiempos .ent-op.apagada { opacity:.28; }
@media (any-hover: hover) { .filtros.filtros-tiempos .ent-op.apagada:hover { opacity:.8; } }
/* "nuevo tiempo verbal": una opción más, no un botón gris. Misma opacidad que
   un tiempo verbal sin elegir; sólo la cursiva la separa de los nombres. */
.filtros.filtros-tiempos .ent-op-crear { opacity:.45; font-style:italic; }
@media (any-hover: hover) { .filtros.filtros-tiempos .ent-op-crear:hover { opacity:1; } }
@media (max-width:900px) { .filtros.filtros-riel, .filtros.filtros-tiempos { padding:0 var(--dc-sp-24); } }
@media (max-width:700px) {
  .filtros.filtros-riel .ent-op { font-size:var(--dc-fs-30); }
  .filtros.filtros-riel, .filtros.filtros-tiempos { gap:var(--dc-sp-24); }
}
/* ── PERSIANA ─────────────────────────────────────────────────────────
   Una fila que aparece o desaparece entre dos pantallas no puede hacerlo de
   golpe: lo de abajo daría un brinco. Se cierra por altura, aire y nitidez a
   la vez, y lo de debajo sube acompañándola. Misma pieza para el código del
   profesor en la puerta y para los tiempos verbales. */
.persiana {
  overflow:hidden;
  transition:max-height var(--dc-t-entrada) var(--dc-ease),
             opacity var(--dc-t-entrada) var(--dc-ease),
             margin var(--dc-t-entrada) var(--dc-ease),
             padding var(--dc-t-entrada) var(--dc-ease),
             filter var(--dc-t-entrada) var(--dc-ease);
  max-height:calc(200 * var(--dc-u));
}
.persiana.plegada {
  max-height:0 !important; opacity:0; filter:blur(6px); pointer-events:none;
  margin-top:0 !important; margin-bottom:0 !important;
  padding-top:0 !important; padding-bottom:0 !important;
}
@media (prefers-reduced-motion:reduce) { .persiana { transition:none; } }
/* Los dos selectores del profesor, juntos, colgando de la nav. */
#prof-selectores { padding-bottom:var(--dc-sp-16); }
.riel-titulo {
  max-width:var(--dc-w-columna); width:100%; margin:0 auto; padding:0;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-40);
  color:var(--dc-ink); letter-spacing:var(--dc-tracking); text-transform:lowercase;
  text-shadow:var(--dc-shadow-text-strong);
}
.prof-codigo {
  margin-top:var(--dc-sp-24);
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-100);
  color:var(--dc-ink); letter-spacing:calc(10 * var(--dc-u)); line-height:1;
  text-shadow:var(--dc-shadow-text-strong);
}
.riel-vacio {
  max-width:var(--dc-w-columna); width:100%; margin:0 auto; padding:var(--dc-sp-16) 0 var(--dc-sp-40);
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink-70);
}
/* La lista de nombres, que era una pantalla entera, ahora es un panel: mismo
   material y mismo hover, sólo cambia dónde vive.
   El ancho baja de todo el lienzo (1920) a la columna de Ajustes (1100) y se
   centra: con el lienzo entero los nombres arrancaban en el borde izquierdo
   de la pantalla mientras la nav seguía en el centro, y la lista no parecía
   colgar de la palabra "alumnos" sino flotar por su cuenta (Rolando, 04/09:
   "debería de aparecer debajo de la pestaña de alumnos, no en el borde
   izquierdo"). */
#screen-home .student-list {
  width:100%; max-width:var(--dc-w-columna); margin:0 auto;
}
/* "+ nuevo alumno" es una fila más de la lista, con la misma tipografía
   gigante: crear un alumno pertenece a esta lista, no a una barra de
   herramientas en otro sitio. Más apagada que un nombre porque no es
   nadie todavía; al acercarse sube al mismo nivel que los demás. */
#screen-home .student-name-row.alumno-nuevo { opacity:.5; }
@media (any-hover: hover) {
  #screen-home .student-list:has(.student-name-row:hover) .student-name-row.alumno-nuevo:not(:hover) { opacity:.28; }
  #screen-home .student-name-row.alumno-nuevo:hover { opacity:1; }
}
/* La otra manera de que exista un alumno, en pequeño al pie de la lista. */
#screen-home .alumno-codigo {
  margin-top:var(--dc-sp-34); cursor:pointer;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink-70); letter-spacing:var(--dc-tracking);
  transition:color var(--dc-t-lento) var(--dc-ease);
}
#screen-home .alumno-codigo b { font-weight:var(--dc-weight); color:var(--dc-ink); letter-spacing:calc(4 * var(--dc-u)); }
#screen-home .alumno-codigo:hover { color:var(--dc-ink); }
/* A la izquierda como los nombres, no centrado: es la primera fila de la
   lista, no un cartel en medio de la pantalla. */
#screen-home .alumno-vacio {
  text-align:left;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-40);
  color:var(--dc-ink-70); padding:var(--dc-sp-14) 0;
}
/* Lo que cuelga de la nav va en la columna, centrado - si no, la frase
   arranca en el borde del lienzo mientras la nav sigue en medio, y no parece
   colgar de nada. Ver la regla de la fila única de cápsula. */
#alumno-panel-clases .alumno-vacio {
  max-width:var(--dc-w-columna); width:100%; margin:0 auto;
  padding:var(--dc-sp-24) 0 0;
}
@media (max-width:900px) { #alumno-panel-clases .alumno-vacio { padding-left:var(--dc-sp-24); padding-right:var(--dc-sp-24); } }
#alumno-panel-clases .vacio-frase {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-40);
  color:var(--dc-ink); line-height:1.25; text-shadow:var(--dc-shadow-text);
  max-width:calc(760 * var(--dc-u));
}
#alumno-panel-clases .opciones { margin-top:var(--dc-sp-24); }
#alumno-panel-clases .opcion { font-size:var(--dc-fs-40); text-transform:none; opacity:.6; }
@media (any-hover: hover) { #alumno-panel-clases .opcion:hover { font-size:var(--dc-fs-52); opacity:1; } }

/* ── LA ESTANTERÍA DEL PROFESOR ──────────────────────────────────────
   Dos niveles de una MISMA navegación, no dos barras distintas:
     1. el tiempo verbal   (presente · pasado · futuro · subjuntivo)
     2. su subsección      (principiante · temática · …)
   Los dos centrados sobre el mismo eje, los dos con la cápsula metálica
   que viaja -la misma pieza que la nav del alumno y las pestañas del
   aula-, y el segundo a la mitad de tamaño para que se lea como lo que
   es: algo que cuelga del primero. Antes eran dos filas pegadas, con
   sangrías distintas y dos píldoras estáticas compitiendo; eso era lo
   que se veía mal (Rolando, 02/09). */
#screen-home .section-chips.nav-estante,
#screen-home .subsec-row.nav-estante {
  position:relative; display:flex; flex-wrap:wrap; align-items:center;
  justify-content:center; overflow:visible;
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  border-bottom:none; background:none; backdrop-filter:none;
}
#screen-home .section-chips.nav-estante {
  gap:var(--dc-sp-14); padding:var(--dc-sp-24) var(--dc-sp-76) var(--dc-sp-10);
}
#screen-home .subsec-row.nav-estante {
  gap:var(--dc-sp-10);
  padding:var(--dc-sp-16) var(--dc-sp-76) var(--dc-sp-48) !important;
  margin:0 auto !important;
}
/* El contenido del profesor comparte lienzo con su nav: mismo ancho y mismo
   margen lateral, para que las tarjetas caigan debajo de las palabras y no
   contra el borde de la pantalla. */
body.is-teacher #screen-home > .scroll { padding-left:0; padding-right:0; }
/* Los 100 px de relleno abajo de `.scroll` eran el hueco que necesitaban los
   botones flotantes redondos, que ya no existen en el inicio. Eran justo lo
   que sobraba: con el carrusel entero cabiendo en pantalla, ese hueco vacío
   obligaba a desplazarse igualmente. */
#screen-home > .scroll { padding-bottom:var(--dc-sp-16); }
body.is-teacher #screen-home .topic-grid {
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:0 var(--dc-sp-76) var(--dc-sp-72);
  gap:var(--dc-sp-34);
}
#screen-home .section-chips::before, #screen-home .subsec-row::before { display:none; }

#screen-home .section-chips.nav-estante .chip,
#screen-home .subsec-row.nav-estante .subsec-pill {
  position:relative; z-index:1;
  font-family:var(--dc-font) !important; font-weight:var(--dc-weight) !important;
  letter-spacing:normal; line-height:1.25; text-transform:lowercase;
  color:var(--dc-ink) !important;
  background:none !important; border:none !important; box-shadow:none !important;
  backdrop-filter:none; border-radius:var(--dc-r-nav);
  display:inline-flex; align-items:center; justify-content:center;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
#screen-home .section-chips.nav-estante .chip {
  font-size:var(--dc-fs-60) !important; padding:var(--dc-sp-10) var(--dc-sp-40);
}
#screen-home .subsec-row.nav-estante .subsec-pill {
  font-size:var(--dc-fs-30) !important; padding:var(--dc-sp-8) var(--dc-sp-24);
  text-shadow:var(--dc-shadow-text-strong);
}
/* La cápsula tapa la sombra del texto cuando pasa por debajo: sin esto la
   palabra activa se ve sucia sobre el metal. */
#screen-home .subsec-row.nav-estante .subsec-pill.active { text-shadow:none; }
#screen-home .section-chips.nav-estante .chip::after,
#screen-home .section-chips.nav-estante .chip.active::after { display:none !important; }
#screen-home .section-chips.nav-estante .chip.crecida,
#screen-home .subsec-row.nav-estante .subsec-pill.crecida { transform:scale(1.12); }
@media (any-hover: hover) {
  #screen-home .section-chips.nav-estante .chip:not(.active):hover,
  #screen-home .subsec-row.nav-estante .subsec-pill:not(.active):hover { transform:scale(1.06); }
}
#screen-home .nav-estante .aula-tab-indicator {
  position:absolute; left:0; top:0; z-index:0; pointer-events:none;
  border-radius:var(--dc-r-nav);
  background:var(--dc-pill-metal); box-shadow:var(--dc-shadow-pill-metal);
  transform:translateX(var(--x, 0)) scale(var(--s, 1));
  transition:transform var(--dc-t-viaje) var(--dc-ease), width var(--dc-t-viaje) var(--dc-ease);
  will-change:transform, width;
}
/* Añadir sección/subsección: un signo discreto, nunca una palabra más de la
   nav. En 'DM Sans' a propósito - el '+' de Coolvetica no existe en todos los
   sistemas y salía un cuadrado. */
#screen-home .nav-estante .chip-add,
#screen-home .nav-estante .subsec-add {
  font-family:var(--dc-font-alt) !important; font-weight:400 !important;
  color:var(--dc-ink-70) !important; cursor:pointer;
  line-height:1; padding:0 !important; border-radius:50% !important;
  display:inline-flex; align-items:center; justify-content:center;
}
#screen-home .nav-estante .chip-add {
  font-size:var(--dc-fs-40) !important;
  width:calc(56 * var(--dc-u)); height:calc(56 * var(--dc-u));
}
#screen-home .nav-estante .subsec-add {
  font-size:var(--dc-fs-30) !important;
  width:calc(34 * var(--dc-u)); height:calc(34 * var(--dc-u));
}
@media (any-hover: hover) {
  #screen-home .nav-estante .chip-add:hover,
  #screen-home .nav-estante .subsec-add:hover { color:var(--dc-ink) !important; transform:scale(1.12); }
}
/* El ⋯ de renombrar/borrar cuelga de la palabra, no del centro de la fila. */
#screen-home .subsec-row.nav-estante .subsec-ctx-btn { top:calc(-6 * var(--dc-u)); right:0; }

/* Nav del alumno: exactamente la misma pieza que la del profesor. */
#screen-home .alumno-tabs {
  position:relative; display:flex; justify-content:center; gap:var(--dc-sp-14);
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:var(--dc-sp-60) var(--dc-sp-76) var(--dc-sp-34);
  border-bottom:none; background:none; backdrop-filter:none; overflow:visible;
}
#screen-home .alumno-tabs::before { display:none; }
#screen-home .alumno-tabs .aula-tab {
  font-family:var(--dc-font); font-size:var(--dc-fs-60); font-weight:var(--dc-weight);
  letter-spacing:normal; line-height:1.25; text-transform:lowercase;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--dc-ink); background:none; border:none; box-shadow:none;
  padding:var(--dc-sp-10) var(--dc-sp-40); border-radius:var(--dc-r-nav);
  cursor:pointer; position:relative; z-index:1;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
/* Con tres palabras (ya venía así en el alumno; ahora también las lleva el
   profesor) la fila no cabía en un móvil estrecho: --dc-u tiene un suelo de
   0,58px para que el cuerpo no se vuelva ilegible, y a ese suelo tres
   palabras a 60 no entran en 380-430px de ancho - se salían por los bordes
   (encontrado el 03/09 viendo la pantalla en un móvil). Bajan de tamaño ahí y
   la fila puede envolver en dos líneas si aun así no cupiera. */
/* 04/09, 6.ª vuelta: envolver NO era una salida aceptable. En un móvil de
   390 px la fila se partía en "mis clases · disponibles" arriba y "ajustes"
   sola debajo, centrada bajo una cápsula que estaba en otro sitio: la nav
   parecía rota. Era lo PRIMERO que veía un alumno nuevo. Ahora la fila no
   se parte nunca: se estrecha el aire (relleno lateral y hueco entre
   palabras, que es de donde sobra sitio) y baja el cuerpo lo justo. */
@media (max-width:480px) {
  #screen-home .alumno-tabs {
    flex-wrap:nowrap; gap:var(--dc-sp-6);
    padding:var(--dc-sp-40) var(--dc-sp-14) var(--dc-sp-24);
  }
  #screen-home .alumno-tabs .aula-tab {
    font-size:var(--dc-fs-30); padding:var(--dc-sp-8) var(--dc-sp-14); white-space:nowrap;
  }
}
/* La nav del profesor dentro de un alumno lleva CUATRO palabras desde el
   11/09 (clases · disponibles · progreso · ajustes): misma regla, un punto más
   apretada, para que en un móvil no se salga por los lados. */
@media (max-width:620px) {
  #screen-student .aula-tabs-pill.session-tabs { flex-wrap:nowrap; gap:var(--dc-sp-6); padding-left:var(--dc-sp-14); padding-right:var(--dc-sp-14); }
  #screen-student .aula-tabs-pill .aula-tab { font-size:var(--dc-fs-30); padding:var(--dc-sp-8) var(--dc-sp-14); white-space:nowrap; }
}
#screen-home .alumno-tabs .aula-tab.active { background:none; box-shadow:none; color:var(--dc-ink); }
/* La rayita azul de la nav vieja no existe en este lenguaje */
#screen-home .alumno-tabs .aula-tab::after,
#screen-home .alumno-tabs .aula-tab.active::after { display:none !important; }
#screen-home .alumno-tabs .aula-tab.crecida { transform:scale(1.12); }
#screen-home .alumno-tabs .aula-tab-indicator {
  position:absolute; left:0; z-index:0; pointer-events:none;
  border-radius:var(--dc-r-nav);
  background:var(--dc-pill-metal); box-shadow:var(--dc-shadow-pill-metal);
  transform:translateX(var(--x, 0)) scale(var(--s, 1));
  transition:transform var(--dc-t-viaje) var(--dc-ease), width var(--dc-t-viaje) var(--dc-ease);
  will-change:transform, width;
}
/* Los paneles: mismo aire que los del profesor */
#alumno-panel-disponibles, #alumno-panel-ajustes {
  max-width:var(--dc-w-canvas); margin:0 auto;
  padding:var(--dc-sp-24) var(--dc-sp-76) var(--dc-sp-72);
  min-height:52vh; display:flex; flex-direction:column; justify-content:center;
}
#alumno-panel-ajustes { min-height:40vh; }
/* ── AJUSTES, CENTRADOS ───────────────────────────────────────────────
   (Rolando, 04/09, 7.ª vuelta: "en ajustes los botones aparecen en el
   centro".) La nav manda desde el centro; lo que cuelga de ella cae bajo su
   mismo eje. Los campos se centran como CAJA pero su texto sigue a la
   izquierda: con el texto centrado, el desplegable de "rellenar contraseña"
   se ancla en el borde del campo y sale a un palmo de donde escribes - ya
   pasó en la puerta y se arregló así. */
/* `.prof-cabecera` es una columna flex, así que quien de verdad coloca la
   lista es ELLA: sin esto, `.opciones` se encoge a su contenido y se queda
   pegada a la izquierda de la columna aunque sus palabras estén centradas
   entre sí. */
#prof-panel-ajustes .prof-cabecera { align-items:center; }
#prof-panel-ajustes .opciones, #alumno-panel-ajustes .opciones { align-items:center; }
#prof-panel-ajustes .opcion,   #alumno-panel-ajustes .opcion { text-align:center; transform-origin:center center; }
#prof-panel-ajustes .prof-cabecera, #alumno-panel-ajustes .aj-cuerpo { text-align:center; }
#prof-panel-ajustes .prof-vuelta { transform-origin:center center; }
#prof-panel-ajustes .ent-campo, #alumno-panel-ajustes .ent-campo,
#prof-panel-ajustes .ent-ayuda, #alumno-panel-ajustes .ent-ayuda { margin-left:auto; margin-right:auto; }
#prof-panel-ajustes .ent-accion, #alumno-panel-ajustes .ent-accion {
  align-self:center; padding-left:var(--dc-sp-24); padding-right:var(--dc-sp-24);
  transform-origin:center center;
}
#prof-panel-ajustes .prof-codigo { text-align:center; }
.aj-cuerpo {
  max-width:var(--dc-w-columna); width:100%; margin:0 auto;
  display:flex; flex-direction:column; align-items:center;
  padding:var(--dc-sp-24) var(--dc-sp-24) 0;
}
.aj-titulo {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-60);
  color:var(--dc-ink); line-height:1.1; text-transform:lowercase;
  text-shadow:var(--dc-shadow-text-strong); margin-bottom:var(--dc-sp-16);
}
/* "Disponibles" ya no es un menú corto que había que centrar: lleva su propia
   fila de nav y un carrusel, y el relleno lateral lo pone cada uno de ellos. */
#alumno-panel-disponibles {
  min-height:0; justify-content:flex-start;
  padding:0 0 var(--dc-sp-48);
}
/* El "disponibles" del alumno usa EL MENÚ GRANDE, la pieza de arriba: aquí
   sólo queda lo que es propio de esta pantalla. */
#alumno-panel-disponibles .menu-grande .menu-grande-op { max-width:var(--dc-w-canvas); margin:0 auto; }
#alumno-panel-disponibles #disp-detalle > .back-btn {
  align-self:flex-start; font-family:var(--dc-font); font-size:var(--dc-fs-30);
  font-weight:var(--dc-weight); color:var(--dc-ink); text-transform:lowercase;
  background:none; border:none; box-shadow:none; border-radius:0; backdrop-filter:none;
  text-shadow:var(--dc-shadow-text-strong); padding:var(--dc-sp-10) 0;
  width:auto; height:auto; margin:0 0 var(--dc-sp-40) !important;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { #alumno-panel-disponibles #disp-detalle > .back-btn:hover { transform:scale(1.06); background:none; } }
#alumno-panel-disponibles #disp-detalle > .back-btn:active { transform:scale(.965); transition:transform var(--dc-t-press) var(--dc-ease); }
#alumno-panel-clases { position:relative; }
.alumno-vacio { text-align:center; padding:var(--dc-sp-72) var(--dc-sp-40); }

#screen-home .disponibles-titulo {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-50);
  color:var(--dc-ink); text-shadow:var(--dc-shadow-text-strong);
  max-width:var(--dc-w-canvas); margin:var(--dc-sp-48) auto var(--dc-sp-24);
  padding:0 var(--dc-sp-76);
}

/* ═══ LA CLASE, DEL LADO DEL ALUMNO ═══════════════════════════════════
   Mismo esqueleto que la clase del profesor: la marca en la esquina (y es
   el botón de volver, igual que allí lo es el nombre del alumno), pizarra
   en el centro, notas a la derecha, y el ancho partido en tres con los
   ejercicios de protagonistas. El título de la clase va donde lo ve el
   profesor: encima de los ejercicios. */
#screen-lesson { background:var(--dc-bg); }
#screen-lesson .lesson-header { background:none; border:none; box-shadow:none; backdrop-filter:none; padding:0; }
#screen-lesson .lesson-header-inner {
  display:grid; grid-template-columns:1fr 3fr 1.25fr; align-items:baseline;
  column-gap:var(--dc-sp-40);
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:var(--dc-sp-34) var(--dc-sp-76) var(--dc-sp-34);
}
/* La marca: mismo comportamiento exacto que el nombre del alumno */
#screen-lesson .marca-alumno {
  grid-column:1; grid-row:1; justify-self:start; align-self:baseline;
  /* Dentro de una clase la marca cede el protagonismo: a 163 se salía de
     su columna y empujaba a "pizarra" fuera del centro. */
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-80);
  color:var(--dc-ink); letter-spacing:var(--dc-tracking); line-height:1;
  cursor:pointer; text-shadow:none;
  transition:transform var(--dc-t-lento) var(--dc-ease),
             text-shadow var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { #screen-lesson .marca-alumno:hover { text-shadow:var(--dc-shadow-text-strong); } }
#screen-lesson .marca-alumno:active { transform:scale(.985); transition:transform var(--dc-t-press) var(--dc-ease); }
/* pizarra centrada sobre los ejercicios; notas a su derecha */
#screen-lesson #board-bar-btn {
  grid-column:2; grid-row:1; justify-self:center; align-self:baseline;
}
#screen-lesson .leccion-der {
  grid-column:3; grid-row:1; justify-self:center; align-self:baseline;
  display:flex; align-items:baseline; gap:var(--dc-sp-20);
}
#screen-lesson .lesson-toolbar { display:flex; gap:var(--dc-sp-20); }
#screen-lesson .lesson-header .back-btn {
  font-family:var(--dc-font) !important; font-weight:var(--dc-weight) !important;
  letter-spacing:normal !important; color:var(--dc-ink) !important; text-transform:lowercase;
  background:none !important; border:none !important; box-shadow:none !important;
  border-radius:0 !important; backdrop-filter:none !important;
  text-shadow:var(--dc-shadow-text-strong);
  width:auto !important; height:auto !important;
  font-size:var(--dc-fs-80) !important; padding:var(--dc-sp-10) var(--dc-sp-24) !important; line-height:1;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { #screen-lesson .lesson-header .back-btn:hover { transform:scale(1.06); background:none !important; } }
#screen-lesson .lesson-header .back-btn:active { transform:scale(.965); transition:transform var(--dc-t-press) var(--dc-ease); }

/* Las tres columnas */
/* Sin rebote al llegar al final (Rolando, 07/09: "cuando rebota arrastras
   también la lista de mensajes y los primeros dejan de verse"). La columna de
   mensajes va pegada (sticky) al scroll de la clase; mientras el scroll está
   dentro de sus límites, ella se queda quieta, pero el rebote empuja el
   contenido MÁS ALLÁ del final y ahí la arrastra con él. Quitando el rebote,
   la lista deja de depender de lo que haga el centro de la página. */
#screen-lesson #lesson-scroll { padding-left:0; padding-right:0; position:relative;
  overscroll-behavior-y:none;
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-40));
  mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-40)); }
#screen-lesson .session-layout {
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
  padding:0 var(--dc-sp-76); gap:var(--dc-sp-40); align-items:flex-start;
}
#screen-lesson .session-layout > .pills-col { flex:1 1 0; width:auto; min-width:0; }
#screen-lesson .session-layout > .leccion-centro { flex:3 1 0; min-width:0; }
#screen-lesson .leccion-centro > #exercises-container { max-width:none; }
#screen-lesson .session-layout > .notebook-col { flex:1.25 1 0; width:auto; min-width:0; max-width:none;
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-24));
  mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-24)); }
/* El título de la clase, encima de los ejercicios */
#screen-lesson .clase-encabezado { margin-bottom:var(--dc-sp-24); }
/* Mismo título que ve el profesor: mismo tamaño, misma sombra y SIN
   recorte - antes se cortaba con puntos suspensivos y él no. */
#screen-lesson .clase-titulo {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-50);
  color:var(--dc-ink); letter-spacing:normal; text-shadow:var(--dc-shadow-text-strong);
  margin:0; white-space:normal; overflow:visible; text-overflow:clip; max-width:none;
}
/* Mensajes del profesor: letras grandes sueltas, sin cápsula ni desvanecido */
#screen-lesson .pills-col {
  align-items:flex-start; padding-left:0; padding-right:0; padding-top:var(--dc-sp-24);
  -webkit-mask-image:none; mask-image:none;
}
#screen-lesson .pills-col .class-pill {
  background:none; box-shadow:none; backdrop-filter:none; -webkit-backdrop-filter:none;
  border-radius:0; text-align:left; width:100%; isolation:auto;
  font-family:var(--dc-font); font-size:var(--dc-fs-50); font-weight:var(--dc-weight);
  color:var(--dc-ink); padding:var(--dc-sp-8) 0; line-height:1.15;
  word-break:normal; overflow-wrap:break-word; hyphens:none;
}
#screen-lesson .pills-col .class-pill.big { width:100%; background:none; box-shadow:none; font-size:var(--dc-fs-50); }
#screen-lesson .pills-col .pill-scrim { display:none; }
@media (any-hover: hover) {
  #screen-lesson .pills-col .class-pill.clickable:hover { transform:scale(1.03); background:none; box-shadow:none; }
}

/* ── TU CUADERNO - dentro de la clase ─────────────────────────────────
   (Rolando, 04/09, 6.ª vuelta: "la parte del chat dentro de una clase no se
   ve del todo premium. Notas que no esté en un bloque de cristal y
   actualizarlo al nuevo lenguaje visual".)

   Los mensajes del profesor ya eran letras sueltas sobre el lienzo; las
   notas seguían siendo el panel viejo: una caja de cristal con borde, una
   píldora oscura de "Escribir" dentro y una lista minúscula con una × roja.
   Dos idiomas en la misma pantalla.

   Ahora la columna es AIRE: sin caja, sin borde, sin sombra. Lo que la
   sostiene es la escala - los mensajes del profesor a 50, tus notas a 30,
   porque son dos voces distintas y la suya manda. La línea de escribir es
   invisible, como los campos de la puerta: lo único que dice "aquí se
   escribe" es el texto de ayuda y el cursor. La × deja de ser un botón rojo
   y pasa a ser un signo apagado que sólo se enciende al acercarse.
   Abrir y cerrar sigue siendo lo de siempre (desenfoque + deslizamiento).
   ──────────────────────────────────────────────────────────────────── */
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-col {
  background:none; border:none; box-shadow:none; border-radius:0;
  backdrop-filter:none; -webkit-backdrop-filter:none;
}
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-body {
  padding:var(--dc-sp-8) 0 var(--dc-sp-40); gap:var(--dc-sp-10);
  /* La de abajo se cortaba a cuchillo contra el marco: se desvanece. */
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-24),
                     #000 calc(100% - var(--dc-sp-60)), transparent 100%);
  mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-24),
             #000 calc(100% - var(--dc-sp-60)), transparent 100%);
}
/* Sin sombra bajo cada nota (Rolando, 07/09: "las notas no se ven bien, con
   una sombra debajo de cada una"). Los mensajes de la izquierda, que son la
   misma pieza al otro lado de la clase, nunca la llevaron: se veía la
   diferencia de una columna a la otra. */
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-entry {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink); line-height:1.35; letter-spacing:var(--dc-tracking);
  padding:var(--dc-sp-6) var(--dc-sp-24) var(--dc-sp-6) 0;
  text-shadow:none;
  word-break:normal; overflow-wrap:break-word; hyphens:none;
}
/* La línea de escribir: invisible, alineada a la izquierda con las notas.
   Sin píldora oscura, sin cristal, sin centrar. */
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-compose-trigger {
  margin:0 0 var(--dc-sp-16); padding:var(--dc-sp-8) 0;
  background:none; box-shadow:none; border:none; border-radius:0;
  backdrop-filter:none; -webkit-backdrop-filter:none;
  justify-content:flex-start;
}
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-compose-trigger textarea {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink); caret-color:var(--dc-ink); text-align:left;
  background:none; border:none; outline:none; box-shadow:none; width:100%;
}
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-compose-trigger textarea::placeholder {
  color:var(--dc-ink-70); text-shadow:none;
}
/* Quitar una nota es un gesto pequeño, no una alarma. Desde el 11/09 no es
   una × sino la PALABRA, al lado de lo escrito, como en el resto de la casa
   (Rolando: "debería de seguir el lenguaje visual de todo escrito, 'eliminar'
   al lado"). Vive apagada al final de la nota y se enciende al acercarse. */
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .note-del {
  position:static; display:inline-block; vertical-align:baseline; width:auto; height:auto;
  margin-left:.55em; padding:.2em .3em;
  font-family:var(--dc-font); font-size:var(--dc-fs-22); line-height:1; letter-spacing:var(--dc-tracking);
  color:var(--dc-ink); background:none; border:none; border-radius:0; opacity:0; cursor:pointer;
  transition:opacity var(--dc-t-lento) var(--dc-ease), text-shadow var(--dc-t-lento) var(--dc-ease);
}
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-entry:hover .note-del { opacity:.55; }
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .note-del:hover { opacity:1; background:none; color:var(--dc-ink); text-shadow:var(--dc-shadow-text-strong); }
@media (hover:none) { :is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .note-del { opacity:.35; } }
/* Lo mismo con los mensajes del profesor: "eliminar" al final del mensaje. */
#screen-student .pills-col.teacher-mode .class-pill .pill-del {
  position:static; display:inline-block; vertical-align:middle; width:auto; height:auto;
  margin-left:.6em; padding:.25em .35em; border-radius:0; background:none; transform:none;
  font-family:var(--dc-font); font-size:var(--dc-fs-22); line-height:1; letter-spacing:var(--dc-tracking);
  color:var(--dc-ink); opacity:0; text-shadow:none;
  transition:opacity var(--dc-t-lento) var(--dc-ease), text-shadow var(--dc-t-lento) var(--dc-ease);
}
#screen-student .pills-col.teacher-mode .class-pill:hover .pill-del { opacity:.55; transform:none; }
#screen-student .pills-col.teacher-mode .class-pill .pill-del:hover { opacity:1; background:none; text-shadow:var(--dc-shadow-text-strong); }
@media (hover:none) { #screen-student .pills-col.teacher-mode .class-pill .pill-del { opacity:.35; } }
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .notebook-empty {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-22);
  color:var(--dc-ink-70); text-align:left; padding:var(--dc-sp-16) 0;
}
:is(#screen-lesson, #aula-clase-abierta, #ej-ed, #lec-ov, #lec-nav, .mp-ej) .note-cursor { background:var(--dc-ink); }

/* ═══ ESTUDIANTES (antes "Aulas") - sin artboard propio, deducido del
   lenguaje existente: nombre grande, mismo tamaño para todos (§ nombre del
   alumno), y la barra de scroll usa el material del pill de nav. ═══ */
/* Mismo lienzo que el resto de pantallas: los nombres van en blanco. */
#screen-classrooms { background:var(--dc-bg); }
/* "Atrás" sin píldora, en la esquina - es lo único de la cabecera. */
#screen-classrooms .classrooms-header {
  justify-content:flex-start; padding:var(--dc-sp-34) var(--dc-sp-76) 0;
  max-width:var(--dc-w-canvas); width:100%; margin:0 auto;
}
#screen-classrooms .classrooms-header .back-btn {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink); background:none; border:none; box-shadow:none; border-radius:0;
  text-shadow:var(--dc-shadow-text-strong);
  padding:var(--dc-sp-10) 0; width:auto; height:auto; backdrop-filter:none;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
#screen-classrooms .classrooms-header .back-btn:hover { transform:scale(1.07); }
#screen-classrooms .classrooms-header .back-btn:hover {
  background:none; transform:none; box-shadow:none;
}
/* Los dos sitios: la pantalla vieja (que ya no se enciende) y el panel
   "alumnos" del inicio, que es donde vive ahora. */
#screen-classrooms .student-name-row,
#screen-home .student-name-row {
  display:block; width:100%; text-align:left; background:none; border:none;
  padding:var(--dc-sp-14) 0;
  cursor:pointer; font-family:var(--dc-font); font-weight:var(--dc-weight);
  font-size:var(--dc-fs-100); color:var(--dc-ink); letter-spacing:var(--dc-tracking);
  line-height:1.05; margin-bottom:0;
  transform-origin:left center; will-change:transform;
  transition:transform var(--dc-t-lento) var(--dc-ease), opacity var(--dc-t-lento) var(--dc-ease);
}
/* Mismo hover que las filas de Ajustes: la tocada manda, las otras se van. */
@media (any-hover: hover) {
#screen-classrooms .student-list:has(.student-name-row:hover) .student-name-row:not(:hover),
#screen-home .student-list:has(.student-name-row:hover) .student-name-row:not(:hover) {
  opacity:.45;
}
/* RENDIMIENTO: crecer con font-size obliga a recalcular la maquetación de
   toda la lista en cada fotograma (medido: 1.4 s de trabajo de pintado con
   CPU de iPad). Con transform el efecto es el mismo a la vista pero lo hace
   el compositor, sin tocar la maquetación. El origen a la izquierda mantiene
   los nombres alineados. */
#screen-classrooms .student-name-row:hover,
#screen-home .student-name-row:hover { transform:scale(1.055); }
}
/* ── EL ALUMNO CONECTADO - el aura ───────────────────────────────────
   Antes era un puntito verde a la derecha del nombre. Un punto de 9 px al
   lado de una palabra de 100 px no se ve; y además es vocabulario de otra
   app, no de ésta (Rolando, 04/09: "¿cómo vemos qué alumno está conectado?
   Aparece aura verde alrededor de él").

   Es el MISMO verde y el mismo halo difuminado que la app de autodidacta
   pone en el punto de una línea acertada (.line-ok) - rgba(72,205,140) con
   dos sombras, una cerca y otra lejos. Aquí va como sombra del TEXTO, así
   que sigue el contorno de las letras en vez de dibujar una caja.

   El latido es a propósito MUY lento y MUY corto de recorrido (6 s, y sólo
   de .55 a 1 de opacidad): tiene que leerse como "está respirando ahí
   detrás", no como una alarma. Se anima `opacity` de una capa aparte y no
   el `text-shadow` del nombre -animar la sombra la recalcula en cada
   fotograma para cada letra- y la capa va detrás con aria-hidden.
   Con "reducir movimiento" el aura se queda encendida, fija: la información
   (está conectado) no se pierde, sólo deja de parpadear. */
/* `isolation:isolate` no es decorativo: sin él, la capa del aura (z-index:-1)
   se va DETRÁS del fondo del antepasado que forme contexto de apilamiento y
   desaparece. Con él, el contexto es la propia fila: el aura queda por
   encima del fondo de la fila (que es transparente) y por debajo del nombre,
   que es justo donde tiene que estar. */
#screen-classrooms .student-name-row,
#screen-home .student-name-row { position:relative; isolation:isolate; }
.student-aura {
  position:absolute; inset:0; z-index:-1; pointer-events:none;
  display:flex; align-items:center;
  font:inherit; letter-spacing:inherit; line-height:inherit;
  color:transparent; white-space:pre;
  /* 07/09: el verde es el de la aplicación (--accent2), no uno parecido; y el
     latido se ve - a 6 segundos y con medio punto de recorrido no se notaba
     que estuviera vivo. */
  text-shadow:0 0 calc(26 * var(--dc-u)) rgba(var(--accent2-rgb),.52),
              0 0 calc(60 * var(--dc-u)) rgba(var(--accent2-rgb),.30),
              0 0 calc(110 * var(--dc-u)) rgba(var(--accent2-rgb),.16);
  animation:auraViva 2.6s ease-in-out infinite;
  will-change:opacity;
}
@keyframes auraViva { 0%,100% { opacity:.28; } 50% { opacity:1; } }
@media (prefers-reduced-motion:reduce) { .student-aura { animation:none; opacity:.85; } }
#screen-classrooms .student-name-row .student-presence-dot,
#screen-home .student-name-row .student-presence-dot { display:none; }
#screen-classrooms .estudiantes-scroll-track {
  width:var(--dc-sp-18); margin:var(--dc-sp-40) 0;
  border-radius:var(--dc-radius-pill); background:rgba(255,255,255,.10); position:relative; flex-shrink:0;
}
#screen-classrooms .estudiantes-scroll-thumb {
  position:absolute; left:0; right:0; border-radius:var(--dc-radius-pill);
  background:var(--dc-pill-metal); box-shadow:var(--dc-shadow-pill-metal);
}

/* ═══ CLASE (modo especial) - "Cómo se ve una clase" ═══
   Sólo la columna del PROFESOR (.pills-col.teacher-mode / #t-pills-col):
   la del alumno (#pills-col, screen-lesson) no se toca - Regla del alcance,
   ver DECISIONES.md. */

/* Encabezado de la clase: título y "Reiniciar todo" como texto con sombra
   (fuera de la píldora roja) con un hover ligero, como el resto. */
#aula-clase-abierta .clase-encabezado {
  display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--dc-sp-20); margin-bottom:var(--dc-sp-24);
}
/* El título de la clase ES el selector de clase (lo que antes era "Otra
   clase"): mismo material que el resto de botones, no un rótulo muerto. */
#aula-clase-abierta .clase-titulo {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-50);
  color:var(--dc-ink); letter-spacing:normal; text-shadow:var(--dc-shadow-text-strong);
  background:none; border:none; padding:0; cursor:pointer; text-align:left;
}
/* "Sin clase activa" es un botón, no un cartel: abre las clases disponibles. */
#aula-clase-abierta .clase-vacia-btn {
  display:block; margin:var(--dc-sp-60) auto; background:none; border:none;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-50);
  color:var(--dc-ink); text-shadow:var(--dc-shadow-text-strong); cursor:pointer;
  padding:var(--dc-sp-10) var(--dc-sp-24);
}
#aula-clase-abierta .reset-progress-btn {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink); background:none; border:none; box-shadow:none; border-radius:0;
  text-shadow:var(--dc-shadow-text-strong); padding:0; cursor:pointer; white-space:nowrap;
  transition:transform var(--dc-t-lento) var(--dc-ease);
}
#aula-clase-abierta .reset-progress-btn:hover {
  background:none; color:var(--dc-ink); transform:scale(1.06);
}

/* ── LAS CLASES DE HOY, DEBAJO DE SU NOMBRE ──────────────────────────
   Cerrado no ocupa nada; al pulsar el título se abre. Sin pastillas y sin
   recuadros: son nombres en el aire, como todo lo demás. La cerrada tiene
   altura 0 y por eso el margen también viaja - si no, dejaría un hueco
   fantasma bajo el título. */
/* SOMBRAS SIN CAJA (Rolando, 11/09: "cuando tienes varias clases añadidas y
   están con sombras, se ve un cuadrado ya que la caja invisible limita"). Para
   plegarse, esta fila necesita overflow:hidden, y eso cortaba en seco la
   sombra de cada nombre, que cae 16+28 px por debajo de las letras. La caja
   se agranda por todos los lados lo que la sombra necesita (relleno) y se le
   devuelve al resto de la página con el mismo margen en negativo: lo de
   alrededor no se mueve, y la sombra ya no choca con nada. */
:is(#aula-clase-abierta, #screen-lesson) .clases-dia {
  display:flex; flex-wrap:wrap; align-items:baseline;
  gap:var(--dc-sp-10) var(--dc-sp-34);
  max-height:0; opacity:0; overflow:hidden; margin:0; padding:0;
  transition:max-height .42s var(--dc-ease), opacity .34s var(--dc-ease),
             margin .42s var(--dc-ease), padding .42s var(--dc-ease);
}
:is(#aula-clase-abierta, #screen-lesson) .clases-dia.abierta {
  max-height:calc(300 * var(--dc-u)); opacity:1;
  padding:calc(14 * var(--dc-u)) calc(40 * var(--dc-u)) calc(56 * var(--dc-u));
  margin:calc(-14 * var(--dc-u)) calc(-40 * var(--dc-u)) calc(var(--dc-sp-24) - 56 * var(--dc-u));
}
/* El alumno: su título despliega las clases del día (si tiene más de una).
   Con el profe dentro se ven, pero las elige él. */
#screen-lesson .clase-titulo.con-dia { cursor:pointer; }
#screen-lesson .clases-dia.bloqueada .dia-clase { cursor:default; }
#screen-lesson .clases-dia.bloqueada .dia-clase:not(.activa) { opacity:.34; }
@media (any-hover: hover) { #screen-lesson .clases-dia.bloqueada .dia-clase:hover { transform:none; } }
#screen-lesson .clases-dia .dia-nota { font-family:var(--dc-font); font-size:var(--dc-fs-20, calc(20 * var(--dc-u)));
  color:var(--dc-ink); opacity:.55; letter-spacing:var(--dc-tracking); align-self:center; }
#screen-lesson .leccion-centro { transition:opacity .24s var(--dc-ease), filter .24s var(--dc-ease); }
#screen-lesson .leccion-centro.lv-cambiando { opacity:0; filter:blur(8px); pointer-events:none; }
/* Cambiar de clase del día: sólo la columna de los ejercicios se va y vuelve. */
#aula-clase-abierta #live-view-content { transition:opacity .24s var(--dc-ease), filter .24s var(--dc-ease); }
#aula-clase-abierta #live-view-content.lv-cambiando { opacity:0; filter:blur(8px); pointer-events:none; }
:is(#aula-clase-abierta, #screen-lesson) .dia-clase,
:is(#aula-clase-abierta, #screen-lesson) .dia-otra {
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-30);
  color:var(--dc-ink); letter-spacing:normal; text-shadow:var(--dc-shadow-text-strong);
  background:none; border:none; padding:0; cursor:pointer; white-space:nowrap;
  display:inline-flex; align-items:baseline; gap:var(--dc-sp-14);
  opacity:.58; transition:opacity var(--dc-t-lento) var(--dc-ease), transform var(--dc-t-lento) var(--dc-ease);
}
:is(#aula-clase-abierta, #screen-lesson) .dia-clase.activa { opacity:1; }
@media (any-hover: hover) {
  :is(#aula-clase-abierta, #screen-lesson) .dia-clase:hover,
  :is(#aula-clase-abierta, #screen-lesson) .dia-otra:hover { opacity:1; transform:scale(1.05); }
}
/* "quitar" sólo asoma sobre la clase que estás mirando: es una acción que se
   busca, no algo que tenga que estar pidiendo sitio todo el rato. */
:is(#aula-clase-abierta, #screen-lesson) .dia-quitar {
  background:none; border:none; padding:0; cursor:pointer;
  font-family:var(--dc-font); font-weight:var(--dc-weight); font-size:var(--dc-fs-20);
  color:var(--dc-ink); letter-spacing:normal; text-shadow:var(--dc-shadow-text-strong);
  opacity:0; transition:opacity var(--dc-t-lento) var(--dc-ease);
}
@media (any-hover: hover) { :is(#aula-clase-abierta, #screen-lesson) .dia-clase:hover .dia-quitar { opacity:.62; } }
@media (hover:none) { :is(#aula-clase-abierta, #screen-lesson) .dia-quitar { opacity:.5; } }

/* Dentro de una clase el ancho es TODO el de la pantalla, partido en tres:
   mensajes | ejercicios | notas. Fuera de la clase (el carrusel) el panel
   sigue encajado en el lienzo de 1920·k, que es donde tiene sentido. */
#screen-student.clase-modo #aula-panel-clase { max-width:none; padding:0; }
#aula-clase-abierta .clase-cuerpo { padding:0 var(--dc-sp-76); }
/* `#aula-panel-clase > div` mete 16-24px a cada hijo: dentro de la clase eso
   descuadraba el cuerpo respecto a la cabecera. Aquí manda la rejilla. */
#screen-student.clase-modo #aula-panel-clase > div { padding:0; }
/* El centro tenía un tope de 720px heredado de la vista antigua: con tres
   columnas eso le robaba su tercio y descentraba todo. */
#aula-clase-abierta .session-layout > #live-view-content { max-width:none; margin:0; }
/* El scroll de la pestaña mete 48px propios a los lados: eso descuadraba el
   cuerpo respecto a la cabecera (pizarra caía sobre el hueco, no sobre los
   ejercicios). Dentro de la clase manda la rejilla, no ese relleno. */
#screen-student.clase-modo #aula-scroll { padding-left:0; padding-right:0; }
/* La cabecera copia la rejilla del cuerpo (1 / 3 / 1.25 con el mismo hueco y
   el mismo margen lateral): así "pizarra" cae justo sobre los ejercicios y
   "notas" sobre su columna, en vez de a ojo. */
#screen-student.clase-modo > .classrooms-header {
  grid-template-columns:1fr 3fr 1.25fr;
  column-gap:var(--dc-sp-40);
  /* Mismo margen lateral que el resto de pantallas del alumno: si aquí
     fuera distinto, el nombre daría un salto al entrar en la clase. */
  padding-left:var(--dc-sp-76); padding-right:var(--dc-sp-76);
}
#screen-student.clase-modo > .classrooms-header #t-notebook-toggle-btn { justify-self:center; }
/* pizarra y notas se apoyan en la MISMA línea de base que el nombre: con
   align-items:center quedaban flotando por encima (son mucho más chicos). */
/* El nombre se queda EXACTAMENTE donde está en las demás pantallas: la
   cabecera mantiene su relleno, y son pizarra/notas las que se bajan hasta
   su línea de base, no el nombre el que sube (Rolando: la posición del
   nombre tiene que ser constante en todas las pantallas de un alumno). */
/* Línea base compartida de verdad: el navegador alinea las bases del
   nombre, de pizarra y de notas. Antes lo aproximaba con un margen
   calculado a ojo y no cuadraba. El nombre no se mueve: como es el texto
   más alto, su borde superior sigue marcando el alto de la fila. */
#screen-student.clase-modo > .classrooms-header { align-items:baseline; }
#screen-student.clase-modo > .classrooms-header #student-detail-name,
#screen-student.clase-modo > .classrooms-header #hc-board-btn,
#screen-student.clase-modo > .classrooms-header #t-notebook-toggle-btn { align-self:baseline; }
#aula-clase-abierta .session-layout {
  max-width:none; width:100%; gap:var(--dc-sp-40); align-items:flex-start;
}
/* ALTO DE LAS COLUMNAS. Iban con `100vh - 100px` desde arriba del todo, pero
   no empiezan arriba del todo: empiezan por debajo del nombre del alumno. La
   suma se salía de la pantalla y la última nota se cortaba a cuchillo contra
   el marco. `--clase-top` lo mide el JS al abrir la clase (_ajustarColumnasClase)
   y es a la vez donde se quedan pegadas: así no se mueven nunca y el hueco de
   abajo es siempre el mismo. */
#aula-clase-abierta .session-layout > .pills-col-shell,
#aula-clase-abierta .session-layout > .notebook-col,
#screen-lesson .session-layout > .pills-col,
#screen-lesson .session-layout > .notebook-col {
  top:var(--clase-top, 8px);
  height:var(--clase-alto, calc(100vh - 220px));
}
/* Proporciones del artboard: los ejercicios son lo principal (la mitad),
   los mensajes la franja fina de la izquierda y las notas algo más. */
#aula-clase-abierta .session-layout > .pills-col-shell { flex:1 1 0; width:auto; min-width:0; }
#aula-clase-abierta .session-layout > #live-view-content { flex:3 1 0; width:auto; min-width:0; }
#aula-clase-abierta .session-layout > .notebook-col { flex:1.25 1 0; width:auto; min-width:0; }

/* ── TRES COLUMNAS QUE NO SE ARRASTRAN UNAS A OTRAS (Rolando, 11/09) ──────
   "Cuando deslizo hasta el final por los bloques de ejercicios, hay un bug que
   arrastra la píldora de mensajes hacia abajo. La columna de mensajes debería
   de ser completamente independiente de los bloques de ejercicios." Era así
   porque las tres vivían en UNA sola zona de scroll -la de la pestaña- y los
   laterales iban pegados (sticky): al llegar al final, el rebote del trackpad
   movía la zona entera y con ella las columnas pegadas. Y la máscara de esa
   zona, que desvanece su borde de arriba, se comía la mitad de arriba de la
   píldora de "escribir".
   Ahora la pestaña no se desplaza: cada columna tiene su propio scroll. Los
   ejercicios llevan su propio desvanecido arriba y abajo, y a los lados (en
   vez de cortarse contra una caja invisible, las sombras se apagan).
   El hueco entre columnas pasa a ser el relleno de la del centro: mismas
   medidas que antes, pero las sombras de los ejercicios tienen sitio. */
#screen-student.clase-modo #aula-scroll {
  overflow:hidden; -webkit-mask-image:none; mask-image:none; padding-bottom:0;
}
#aula-clase-abierta .session-layout {
  gap:0; align-items:stretch; height:var(--clase-alto, calc(100vh - 220px));
}
#aula-clase-abierta .session-layout > .pills-col-shell,
#aula-clase-abierta .session-layout > .notebook-col { position:relative; top:auto; height:auto; }
#aula-clase-abierta .session-layout > #live-view-content {
  height:100%; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain;
  scrollbar-width:none; box-sizing:border-box;
  padding:var(--dc-sp-34) var(--dc-sp-40) var(--dc-sp-72);
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-34), #000 calc(100% - var(--dc-sp-60)), transparent 100%),
                     linear-gradient(to right, transparent 0, #000 var(--dc-sp-24), #000 calc(100% - var(--dc-sp-24)), transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(to bottom, transparent 0, #000 var(--dc-sp-34), #000 calc(100% - var(--dc-sp-60)), transparent 100%),
             linear-gradient(to right, transparent 0, #000 var(--dc-sp-24), #000 calc(100% - var(--dc-sp-24)), transparent 100%);
  mask-composite:intersect;
}
#aula-clase-abierta .session-layout > #live-view-content::-webkit-scrollbar { display:none; }
/* La vista del alumno sigue siendo una sola zona de scroll, pero sin rebote:
   el rebote del final era lo que arrastraba sus columnas pegadas. */
#screen-lesson #lesson-scroll { overscroll-behavior-y:none; }
#aula-clase-abierta .pills-col-shell .pills-col { width:100%; }
/* Los mensajes usan TODA su columna: sin centrar y sin sangría - antes
   empezaban muy a la derecha y dejaban medio carril vacío. */
/* El hueco de arriba es el sitio de la píldora de escribir, que va SUELTA
   encima de la columna (.pills-compose-slot, absoluta): al engordarla, el
   primer mensaje se quedaba debajo y no se leía. */
#aula-clase-abierta .pills-col.teacher-mode {
  align-items:flex-start; padding-left:0; padding-right:0;
  padding-top:calc(112 * var(--dc-u));
  -webkit-mask-image:none; mask-image:none;
}
/* La barra de escribir: más estrecha de lado a lado y más gordita de alto. */
#screen-student .pills-compose-trigger { width:100%; max-width:100%; }
/* Las notas llenan su tercio en vez de quedarse en un ancho fijo a la derecha. */
#aula-clase-abierta .notebook-col { width:100%; }
/* La columna de notas reserva su tercio aunque esté cerrada: si no, al
   abrirla se recolocaría todo (era ya la intención del diseño original). */
#aula-clase-abierta .notebook-col { max-width:none; }
/* Píldora de escribir ← mismo pill metálico del nav activo (§ nav v2),
   tu ejemplo explícito de la Regla 2. */
#screen-student .pills-compose-trigger,
#screen-student .pills-compose-trigger:hover,
#screen-student .pills-compose-trigger.active,
#screen-student .pills-compose-trigger.design-pinned {
  background:var(--dc-pill-metal); border-radius:var(--dc-r-nav);
  /* Sombra corta y suave: la larga se notaba contra la barra de arriba y
     manchaba el primer mensaje. */
  box-shadow:0 6px 18px rgba(20,30,45,.28);
}
/* Esta regla repetía el tamaño y ganaba por venir después: la píldora volvía
   a quedarse diminuta al lado de unos mensajes de 50 (Rolando, 07/09: "la
   píldora de escribir se ve pequeña y los mensajes grandes"). Ahora la caja y
   la letra van a la escala de lo que hay debajo. */
#screen-student .pills-compose-trigger {
  margin:0 0 var(--dc-sp-36); padding:var(--dc-sp-16) var(--dc-sp-24);
}
#screen-student .pills-compose-trigger input {
  font-family:var(--dc-font); font-size:var(--dc-fs-34); font-weight:var(--dc-weight);
}
/* Mensajes ← letras grandes sueltas, sin cápsula (80px literal de "Cómo se
   ve una clase": pizarra/notas/piña/agua/bolígrafo/paño/"por la mañana"). */
#screen-student .pills-col.teacher-mode .class-pill {
  background:none; box-shadow:none; backdrop-filter:none; -webkit-backdrop-filter:none;
  border-radius:0; text-align:left; width:100%; isolation:auto;
  font-family:var(--dc-font); font-size:var(--dc-fs-50); font-weight:var(--dc-weight);
  color:var(--dc-ink); padding:var(--dc-sp-8) 0; line-height:1.15;
  /* el artboard lleva palabras sueltas; aquí caben frases, así que se parten
     por palabra y no por letra (antes salía "vamo s a") */
  word-break:normal; overflow-wrap:break-word; hyphens:none;
}
#screen-student .pills-col.teacher-mode .class-pill.big {
  width:100%; background:none; box-shadow:none;
  font-size:var(--dc-fs-50); padding:var(--dc-sp-8) 0;
}
#screen-student .pills-col.teacher-mode .pill-scrim { display:none; }
