/* Imagilang 2.0 · shell.css — extraído del index monolítico (Fase 1 refactor) */

/* ═══ cabecera superior + barra de progreso + main + pantallas ═══ */
header.top{position:sticky;top:0;z-index:40;background:var(--bg);display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:16px;padding:12px clamp(16px,4vw,28px)}
/* franja blanca que continúa el sidebar por debajo del logo */
header.top::before{content:'';position:absolute;inset:0 auto 0 0;width:237px;background:var(--surface);
  border-right:1px solid var(--border);display:none;pointer-events:none}
body.app:not(.in-session) header.top::before{display:block}
.top-left{display:flex;align-items:center;gap:10px;justify-self:start;position:relative}
header.top img{height:32px;width:auto}
/* con sidebar visible, el logo se centra dentro de la franja blanca (237px) */
body.app:not(.in-session) .top-left{width:237px;margin-left:calc(-1 * clamp(16px,4vw,28px));justify-content:center}
body.app:not(.in-session) header.top img{height:38px}
.tmid{width:min(560px,54vw);display:flex;flex-direction:column;align-items:center;gap:5px;min-width:0}
.tlabel{font-size:.92rem;font-weight:700;color:var(--purple);min-height:1.2em}
.tlabel b{color:var(--deep);font-weight:800;margin-left:6px}
.tbar{width:100%;height:8px;background:rgba(124,58,237,.14);border-radius:99px;overflow:hidden}
.tbar i{display:block;height:100%;width:0%;background:var(--purple);border-radius:99px;transition:width .3s ease}
/* ── dentro de una etapa (body.in-session: estudio, juegos, cofre) ──
   Nada debe distraer: fuera el logo y el HUD (idioma, gemas, racha). Se queda lo justo —
   la X para salir, el progreso en el centro y el audio. El mapa ya enseña esos datos.
   Y en una PARTIDA (body.en-juego, la pone juegos/nucleo.js) se va también la barra de
   progreso, y su hueco lo ocupa el título del juego. En estudio la barra sí sirve:
   dice por qué palabra vas. */
#topJuego{display:none}
body.in-session .top-left img,
body.in-session .hud-pill{display:none}
/* el Repaso usaba aquí su propio contador aparte (#repProg, body.en-repaso): se unificó
   con el resto de sesiones — su progreso ya pinta esta misma barra (screens/repaso.js) */
body.en-juego .tlabel,
body.en-juego .tbar{display:none}
body.en-juego .tmid{width:auto;visibility:visible}
body.en-juego #topJuego{display:inline-block;margin-bottom:0}
/* cada juego repite el título dentro de su pantalla (rnLabel, jpLabel…); arriba ya está */
body.en-juego .prog-pill[id$="Label"]{display:none}

.icobtn{display:inline-flex;align-items:center;justify-content:center;background:none;border:0;color:var(--purple);width:48px;height:48px;cursor:pointer;border-radius:50%;transition:background .2s}
.icobtn:hover{background:rgba(124,58,237,.08)}
.icobtn svg{width:22px;height:22px}

main{flex:1;min-width:0;width:100%;overflow-y:auto;display:flex;flex-direction:column;align-items:center;padding:8px 16px calc(28px + env(safe-area-inset-bottom))}
main>.screen{width:100%;max-width:560px}
/* los juegos Phaser necesitan lienzo panorámico */
main>#s-runner,main>#s-buceo,main>#s-rpg,main>#s-jump,main>#s-flying,main>#s-meteoros,
main>#s-bubble{max-width:1040px}
/* La Arena: layout de 3 zonas en escritorio (carta ampliada · mini campo · preguntas),
   necesita el ancho grande como los demás juegos */
main>#s-tcg{max-width:1040px}
#runnerStage,#buceoStage,#rpgStage,#jumpStage,#flyingStage,#meteorosStage{position:relative;width:100%;aspect-ratio:16/9;margin-top:14px;border-radius:22px;overflow:hidden;background:#EDEBFB;box-shadow:var(--shadow)}
#runnerStage canvas,#buceoStage canvas,#rpgStage canvas,#jumpStage canvas,#flyingStage canvas,#meteorosStage canvas{display:block}
/* ── Móvil/tablet en VERTICAL: los juegos portados abandonan el 16:9 y llenan todo el
   alto disponible. Cada juego detecta que su contenedor es más alto que ancho y monta
   su lienzo lógico vertical (alto 960, ancho fluido). Portados: jump, rpg. ── */
@media (orientation:portrait){
  main:has(>#s-jump.on),main:has(>#s-rpg.on){overflow:hidden;padding-bottom:10px}
  #s-jump.on,#s-rpg.on{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
  #s-jump #jumpStage,#s-rpg #rpgStage{flex:1;min-height:0;aspect-ratio:auto;margin-top:8px}
}
.screen{display:none}
.screen.on{display:block;animation:appear .4s ease}
@keyframes appear{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* "cargando": overlay a pantalla completa, sin cabecera detrás — solo el spinner centrado */
body.cargando header.top{display:none}
#s-loading.on{position:fixed;inset:0;z-index:45;width:100%;max-width:none;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:var(--bg);animation:none}


/* ═══ HUD del jugador ═══ */
/* ── HUD del jugador (nivel, idioma, gemas, racha) ── */
.hud{display:flex;align-items:center;gap:8px;justify-self:end}
.hud-pill{display:inline-flex;align-items:center;gap:6px;background:var(--surface);box-shadow:var(--shadow);
  border-radius:99px;padding:7px 13px;font-weight:800;font-size:.88rem;color:var(--deep);white-space:nowrap}
.hud-pill b{font-weight:800}
.hud-user img{width:24px;height:24px;border-radius:50%;object-fit:cover;background:#F5F3FF}
@media (max-width:700px){.hud-extra{display:none}}

/* ═══ Prepy en el mapa (pie del rail) ═══
   Aquí él está pegado al borde derecho, así que el bocadillo va a su IZQUIERDA y el pico
   apunta a la derecha — al revés que en el onboarding. Mismo lenguaje, misma voz. */
/* Prepy se va al fondo del rail (margin-top:auto lo empuja): los desafíos arriba, él
   abajo, como quien te acompaña desde la esquina. El rail es columna (ver .rail arriba). */
.rail-prepy{display:flex;align-items:center;justify-content:flex-end;gap:10px;
  margin-top:auto;padding:26px 4px 4px}
.rail-prepy img{width:78px;height:auto;flex:0 0 auto;cursor:pointer;
  filter:drop-shadow(0 8px 20px rgba(124,58,237,.22));animation:float-prepy 4s ease-in-out infinite;
  transition:filter .25s ease}
.rail-prepy img.hablando{animation:float-prepy 4s ease-in-out infinite, ob-habla .32s ease-in-out infinite}
/* Al pasar el ratón, Prepy se da por aludido: un balanceo corto y un pelín más de brillo.
   Va sobre la flotación (dos animaciones a la vez), así que no se queda quieto ni pega un
   salto: solo se anima un poco. Sutil a propósito — es un guiño, no un truco. */
.rail-prepy img:hover{
  filter:drop-shadow(0 10px 24px rgba(124,58,237,.34)) brightness(1.05);
  animation:float-prepy 4s ease-in-out infinite, rp-saluda 1.1s ease-in-out infinite}
@keyframes rp-saluda{
  0%,100%{transform:rotate(0) scale(1)}
  25%{transform:rotate(-4deg) scale(1.05)}
  60%{transform:rotate(3.5deg) scale(1.04)}}
@media (prefers-reduced-motion:reduce){.rail-prepy img:hover{animation:none}}
.rp-bubble{position:relative;flex:1 1 auto;min-height:2.6em;display:flex;align-items:center;
  padding:12px 15px;border-radius:18px;border-bottom-right-radius:6px;
  background:var(--surface);border:2px solid var(--border);box-shadow:var(--shadow);
  font-weight:700;font-size:.88rem;line-height:1.4;color:var(--deep);cursor:default}
/* pico hacia Prepy (a la derecha): cuadrado girado que continúa el borde */
.rp-bubble::after{content:'';position:absolute;right:-9px;top:50%;width:14px;height:14px;
  background:var(--surface);border-right:2px solid var(--border);border-bottom:2px solid var(--border);
  border-bottom-right-radius:4px;transform:translateY(-50%) rotate(-45deg)}
.rp-bubble .cursor{display:inline-block;width:2px;height:1em;margin-left:3px;vertical-align:-2px;
  background:var(--purple);border-radius:2px;animation:ob-cursor .7s steps(1,end) infinite}
@media (prefers-reduced-motion:reduce){.rail-prepy img,.rail-prepy img.hablando,.rp-bubble .cursor{animation:none}}

/* ═══ hamburguesa + botón salir ═══ */
/* ── botón hamburguesa ── */
.burger{display:none;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;
  background:none;border:0;color:var(--deep);cursor:pointer;justify-self:start;margin-right:-6px}
.burger:hover{background:rgba(124,58,237,.08)}
.burger svg{width:24px;height:24px}
.exitbtn{display:none}
body.in-session .exitbtn{display:inline-flex;color:var(--purple)}
body.in-session .exitbtn:hover{color:var(--purple-hover);background:rgba(124,58,237,.1)}

/* ═══ panel derecho: desafíos del día ═══ */
/* ── panel derecho: desafíos del día ── */
.rail{display:none;flex-direction:column;flex:0 0 360px;width:360px;padding:22px 22px;overflow-y:auto}
/* sin barras de scroll visibles (sigue haciendo scroll) */
.rail,main{scrollbar-width:none;-ms-overflow-style:none}
.rail::-webkit-scrollbar,main::-webkit-scrollbar{width:0;height:0;display:none}
body.app:not(.in-session) .rail{display:flex}   /* columna: desafíos arriba, Prepy al fondo */
.rail-card{background:var(--surface);border:2px solid var(--border);border-radius:18px;padding:16px 16px 6px}
.rail-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.rail-head h3{font-size:1.02rem;font-weight:900;color:var(--deep)}
.reto{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--border)}
.rail-card .reto:first-of-type{border-top:0}
.reto-ico{flex:0 0 auto;width:40px;height:40px;display:grid;place-items:center}
.reto-ico img{width:34px;height:34px;object-fit:contain}
.reto-body{flex:1;min-width:0}
.reto-txt{font-weight:800;font-size:.94rem;color:var(--text);margin-bottom:7px}
.reto-row{display:flex;align-items:center;gap:10px}
.reto-bar{position:relative;flex:1;min-width:0;height:20px;border-radius:99px;background:#EDEBF7;display:flex;align-items:center}
.reto-bar>i{position:absolute;inset:0 auto 0 0;width:0;border-radius:99px;background:linear-gradient(90deg,#FFC93C,#FFAA00);transition:width .5s cubic-bezier(.2,.8,.2,1)}
.reto-num{position:relative;z-index:1;width:100%;text-align:center;font-size:.72rem;font-weight:900;color:var(--purple);letter-spacing:.02em}
/* cofre: cerrado (gris) → abierto y dorado al completar */
.reto-cofre{flex:0 0 auto;width:30px;height:30px;transition:transform .3s cubic-bezier(.2,1.4,.4,1)}
.reto-cofre svg{width:100%;height:100%;display:block}
.reto.hecho .reto-bar>i{background:linear-gradient(90deg,#5FD068,#3FB950)}
.reto.hecho .reto-num{color:#fff}
.reto.hecho .reto-cofre{transform:scale(1.12) rotate(-4deg)}
.reto.hecho .reto-txt{color:var(--text2)}
@media (max-width:1220px){ body.app:not(.in-session) .rail{display:none} }

/* ═══ barra de progreso oculta fuera de sesión ═══ */
/* en el mapa/vistas ocultamos la barra de progreso; en una etapa (sesión) sí se ve */
/* fuera de sesión la barra de progreso está oculta: además de invisible, NO debe reservar
   ancho (si no, su hueco de 54vw empuja el HUD fuera del borde al estrechar la ventana) */
body.app:not(.in-session) .tmid{visibility:hidden;width:0;min-width:0}

/* ═══ cabecera limpia en bienvenida ═══ */
/* ── pantallas de bienvenida (login/onboarding): cabecera limpia, solo el logo ── */
body.pre .tmid,body.pre .hud{display:none}

/* ═══ shell: sidebar + tarjeta de usuario + perfil + responsive ═══ */
/* ── shell: sidebar (fijo, siempre abierto) + main ── */
.shell{display:flex;flex:1;min-height:0;width:100%}
.sidebar{flex-shrink:0;width:236px;background:var(--surface);border-right:1px solid var(--border);
  padding:16px 12px;display:none;flex-direction:column;gap:6px}
body.app:not(.in-session) .sidebar{display:flex}
.side-btn{display:flex;align-items:center;gap:12px;padding:13px 14px;border-radius:14px;font-weight:800;
  font-size:.98rem;color:var(--text2);min-height:50px;text-align:left;cursor:pointer;background:none;border:0;
  transition:background .18s,color .18s}
.side-btn .ico{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;flex:0 0 auto}
.side-btn .ico svg{width:24px;height:24px}
.ava-ico img{width:28px;height:28px;border-radius:50%;object-fit:cover;background:#F5F3FF}
/* tarjeta de usuario, anclada abajo del panel */
.side-user{position:relative;margin-top:auto;display:flex;align-items:center;gap:11px;width:100%;padding:10px;border:0;
  cursor:pointer;background:none;border-radius:14px;transition:background .18s}
/* separador a todo el ancho del panel (compensa su padding lateral) */
.side-user::before{content:'';position:absolute;left:-12px;right:-12px;top:-9px;height:1px;background:var(--border)}
.side-user:hover{background:#F6F4FE}
.side-user .su-ava{width:42px;height:42px;border-radius:50%;object-fit:cover;background:#F5F3FF;flex:0 0 auto}
.su-txt{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:1px}
.su-txt b{font-size:1rem;font-weight:800;color:var(--text);line-height:1.2;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.su-txt small{font-size:.82rem;font-weight:700;color:var(--text2)}
.su-chev{flex:0 0 auto;width:18px;height:18px;color:#B9B3CC}
.su-chev svg{width:100%;height:100%;display:block}
.side-user.on{background:#F1EEFE}
.side-user.on .su-txt b{color:var(--purple)}
/* modo admin: solo visible para el email autorizado (core/admin.js). Reubicado en el Perfil
   (bajo "Cuenta") como tarjeta propia, con el mismo look que .cuenta-card, para dejar la home
   limpia. pintaAdmin() la muestra con display:flex → por eso flex-direction:column. */
.admin-card{flex-direction:column;gap:16px;background:var(--surface);border-radius:24px;
  box-shadow:var(--shadow);padding:22px 24px;width:100%;max-width:420px;margin:14px auto 28px;text-align:left}
.admin-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.admin-head h3{color:var(--deep);font-size:1.05rem;display:flex;align-items:center;gap:10px}
.admin-switch{position:relative;width:44px;height:26px;min-width:44px;border:0;border-radius:99px;
  background:#D8D4E8;cursor:pointer;transition:background .2s;flex:0 0 auto;padding:0}
.admin-switch .as-knob{position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;
  background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .2s}
.admin-switch.on{background:#22C55E}
.admin-switch.on .as-knob{transform:translateX(18px)}
/* panel de atajos (switch encendido; pintaAdmin le pone display:flex): GRUPOS con título
   (Contenido · Datos · Pruebas · Reiniciar), uno por columna en escritorio y apilados en móvil */
.admin-panel{display:none;flex-wrap:wrap;gap:14px}
.admin-grupo{flex:1 1 220px;display:flex;flex-direction:column;gap:6px;padding:14px;border-radius:16px;background:var(--bg)}
.admin-grupo h4{font-size:.74rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--purple);margin:0 0 4px}
.admin-grupo--peligro{background:#FEF2F2}
.admin-grupo--peligro h4{color:var(--red)}
.admin-shortcut,.admin-shortcut[href]{display:flex;align-items:center;justify-content:flex-start;gap:8px;width:100%;
  min-height:44px;padding:8px 12px;border:1.5px solid var(--border);border-radius:12px;background:var(--surface);
  color:var(--text);font-weight:700;font-size:.88rem;text-align:left;text-decoration:none;cursor:pointer;
  transition:border-color .15s,color .15s}
.admin-shortcut:hover{border-color:var(--purple-light,#C4B5FD);color:var(--purple)}
.admin-shortcut:focus-visible{outline:2px solid var(--purple);outline-offset:2px}
.admin-shortcut.danger{color:var(--red);border-color:#FECACA}
.admin-shortcut.danger:hover{color:#B91C1C;border-color:#F87171}
/* iconos de navegación: normal ↔ filled (al estar activo) */
.nav-ico img{width:26px;height:26px;object-fit:contain}
.nav-ico .i-on{display:none}
.side-btn.on .nav-ico .i-off{display:none}
.side-btn.on .nav-ico .i-on{display:block}
/* tarjeta de perfil */
/* PERFIL a lo ancho en escritorio (Dave 2026-10-06): dos columnas — el niño (perfil + cursos) a
   la izquierda y lo del adulto (plan + cuenta) a la derecha. En móvil, una columna como antes. */
.perfil-grid{width:100%;max-width:420px;margin:0 auto}
.perfil-col{display:flex;flex-direction:column}
.perfil-grid .perfil-card,.perfil-grid .mundo-perfil,.perfil-grid .plan-card,.perfil-grid .cuenta-card{max-width:none}
@media (min-width:1024px){
  main>#v-perfil{max-width:1100px}
  .perfil-grid{max-width:min(1100px,100%);display:grid;grid-template-columns:1fr 1fr;gap:0 24px;align-items:start}
  #sideAdmin{max-width:min(1100px,100%)}
}
.perfil-card{background:var(--surface);border-radius:24px;box-shadow:var(--shadow);padding:28px 24px;text-align:center;width:100%;max-width:420px;margin:14px auto}
.perfil-ava{width:96px;height:96px;border-radius:50%;object-fit:cover;background:#F5F3FF;margin:0 auto;box-shadow:0 0 0 4px #F5F3FF,0 8px 22px rgba(46,16,101,.16)}
.perfil-card h2{margin-top:14px;color:var(--deep);font-size:1.5rem}
.perfil-lang{color:var(--text2);font-weight:700;margin-top:4px;display:flex;align-items:center;justify-content:center;gap:6px}
.perfil-lang b{color:var(--purple)}
.perfil-flag{width:22px;height:22px;border-radius:50%;object-fit:contain}
.perfil-stats{display:flex;justify-content:center;gap:14px;margin-top:22px}
.perfil-stat{flex:1;max-width:110px;background:#F5F3FF;border-radius:16px;padding:14px 8px;display:flex;flex-direction:column;align-items:center;gap:2px}
.pstat-ico{width:26px;height:26px;object-fit:contain}
.perfil-stat .pstat-xp{font-size:1.4rem;height:26px;display:flex;align-items:center;color:var(--purple)}
.perfil-stat b{color:var(--deep);font-size:1.3rem}
.perfil-stat small{color:var(--text2);font-size:.75rem;font-weight:700}
/* iconos del HUD (los mismos de la app): 32px todos — gema, racha, ficha y la banderita del
   idioma — para que las cuatro píldoras midan exactamente lo mismo de alto. Doble clase para
   ganar a `header.top img` (línea 10), que si no impone su altura a los iconos del HUD. */
.hud-ico{width:32px;height:32px;object-fit:contain;display:block}
.hud .hud-ico{width:32px;height:32px}
/* la banderita respira un pelín más que gema/racha/ficha (36 vs 32), pero con margen
   negativo: así gana presencia sin estirar la píldora — las cuatro siguen midiendo 46px. */
.hud .hud-ico.flag{width:28px;height:28px;border-radius:0}
.side-btn:hover:not(.on){background:rgba(124,58,237,.08);color:var(--purple)}
.side-btn.on{background:transparent;color:var(--purple);box-shadow:inset 0 0 0 2px var(--purple)}
/* en móvil el sidebar se estrecha (solo iconos) para no comerse la pantalla */
@media (max-width:760px){
  .sidebar{width:64px;padding:14px 8px}
  .side-btn{justify-content:center;gap:0;padding:12px 6px;font-size:0}
  .side-btn .ico{font-size:1rem}
  .side-user{justify-content:center;gap:0;padding:12px 4px}
  .su-txt,.su-chev{display:none}
  header.top::before{width:65px}
  body.app:not(.in-session) .top-left{width:65px}
  body.app:not(.in-session) header.top img{height:26px}
}

/* ═══ cabecera de vistas + próximamente ═══ */
/* ── vistas de la app (mapa, juegos, premios) ── */
.view-head{text-align:center;margin:6px 0 4px}
.view-head h1{font-size:clamp(1.4rem,5vw,1.9rem)}
.view-head p{color:var(--text2);margin-top:4px;font-weight:600}
.soon{margin:32px auto;max-width:420px;text-align:center;color:var(--text2);background:var(--surface);
  border:1.5px dashed var(--border);border-radius:20px;padding:34px 24px}
.soon .big{font-size:2.4rem}
