/* App de la plataforma — usa el sistema de marca PAME (colors_and_type.css).
   Cargar colors_and_type.css ANTES que este archivo. */

/* La escala tipográfica (+2 sobre nominal en el texto, títulos grandes nominales,
   todo × --ui-scale para el A-/A+) vive AHORA en colors_and_type.css, en un solo
   lugar. Antes se redefinía acá y pisaba la capa 1, dejando afuera tamaños nuevos
   (fs-11/13/15). No volver a duplicarla acá. */

*{box-sizing:border-box}
html,body{margin:0}
body{font-family:var(--font-sans);background:var(--pame-bg-soft);color:var(--fg-1);min-height:100vh}
.brand{font-family:var(--font-display)}

/* ---- Login ---- */
.auth-wrap{min-height:100vh;display:grid;place-items:center;padding:var(--sp-5)}
.card{background:var(--pame-bg);width:100%;max-width:410px;border:1px solid var(--pame-line);
  border-radius:var(--r-lg);padding:40px 36px;box-shadow:var(--shadow-lg)}
.logo{margin-bottom:var(--sp-6);line-height:1}
.logo .logo-main{display:block;font-family:var(--font-display);font-size:var(--fs-32);
  color:var(--pame-blue);letter-spacing:.01em}
.logo .logo-sub{display:block;margin-top:6px;font-size:var(--fs-12);font-weight:700;
  letter-spacing:.32em;text-transform:uppercase;color:var(--pame-teal)}
h1{font-family:var(--font-display);font-weight:400;font-size:var(--fs-24);margin:0 0 var(--sp-2);color:var(--fg-1)}
.lead{margin:0 0 var(--sp-5);color:var(--fg-3);font-size:var(--fs-14)}
form{display:flex;flex-direction:column;gap:var(--sp-4)}
label{display:flex;flex-direction:column;gap:7px;font-size:var(--fs-12);font-weight:700;
  letter-spacing:.02em;text-transform:uppercase;color:var(--fg-2)}
input{font-family:var(--font-sans);font-size:var(--fs-16);padding:12px 14px;border:1px solid var(--pame-line);
  border-radius:var(--r-sm);background:#fff;color:var(--fg-1)}
input::placeholder{color:var(--pame-ink-3);opacity:.6;text-transform:none;font-weight:400}
input:focus{outline:none;border-color:var(--pame-teal);box-shadow:0 0 0 3px rgba(0,168,193,.20)}
button{font-family:var(--font-sans);font-size:var(--fs-16);font-weight:700;cursor:pointer;border:none;
  border-radius:var(--r-md);padding:12px 22px;background:var(--btn-bg);color:var(--fg-on-brand);
  margin-top:var(--sp-1);transition:background var(--t-base) var(--ease-out)}
/* Hover del botón base (fondo azul primario) — SOLO cuando el botón es "pelado" (sin clase),
   típico de los forms de auth (login/reset/plataforma). Un botón con clase propia
   (.btn-add, .btn-mini, .btn-del, .btn-card, .ghost, .rsn-send, .pp-btn…) trae su
   propio :hover: dejarle este azul lleno rompe el contraste (fondo azul + texto oscuro).
   Antes había ~10 overrides "sin esto queda azul" — este scope los vuelve innecesarios. */
button:not([class]):hover{background:var(--btn-bg-h)}
button:disabled{opacity:.6;cursor:default}
.err{color:var(--pame-danger);font-size:var(--fs-14);margin:2px 0 0;min-height:16px}
.link{display:inline-block;margin-top:var(--sp-5);color:var(--fg-3);font-size:var(--fs-14);
  text-decoration:none;border-bottom:1px solid transparent}
.link:hover{color:var(--pame-blue);border-color:var(--pame-blue)}

/* ---- Dashboard ---- */
.topbar{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-4);
  height:var(--topbar-h);padding:0 var(--sp-6);color:var(--top-fg,inherit);
  background:var(--top-bg,var(--surface-card));border-bottom:1px solid var(--slate-200)}
.topbar .brand{font-size:var(--fs-24);color:var(--top-fg,var(--pame-blue))}
/* El nombre de la academia (sin logo) sigue el texto de la barra: sobre una barra oscura
   del tema quedaba navy sobre negro, ilegible. */
.topbar .logo-txt{color:var(--top-fg,var(--pame-blue-900))}
.ghost{background:none;border:1px solid var(--pame-line);color:var(--fg-2);padding:9px 16px;
  border-radius:var(--r-sm);font-size:var(--fs-14);font-weight:600;cursor:pointer;
  transition:border-color var(--t-base),color var(--t-base)}
.ghost:hover{border-color:var(--pame-blue);color:var(--pame-blue);background:var(--pame-blue-10)}
.panel{max-width:1180px;margin:0 auto;padding:var(--sp-5) var(--sp-6) var(--sp-8)}
.panel.ancho{max-width:1140px}
.panel h1{font-family:var(--font-display);font-weight:400;font-size:var(--fs-40);margin:0 0 var(--sp-2)}
.panel .muted{color:var(--fg-3);font-size:var(--fs-14);margin:0}
.hint{margin-top:var(--sp-6);background:var(--pame-orange-10);border:1px solid var(--pame-orange-30);
  border-left:4px solid var(--pame-orange);border-radius:var(--r-md);padding:18px 20px;
  font-size:var(--fs-14);color:var(--pame-ink-2);line-height:var(--lh-normal)}
/* CTA bajo el estado vacío: lleva al catálogo (tienda) para que nadie quede sin salida. */
.hint-cta{margin-top:var(--sp-4);display:flex}
/* Aviso "esperando verificación": una transferencia del alumno subida y a la espera del dueño. */
.tr-pend-box{position:relative;display:flex;align-items:flex-start;gap:12px;margin:var(--sp-4) 0 0;
  background:var(--pame-blue-10);border:1px solid var(--pame-blue-30);border-left:4px solid var(--pame-blue);
  border-radius:var(--r-md);padding:16px 18px}
.tr-pend-x{position:absolute;top:8px;right:10px;background:none;border:0;font-size:20px;line-height:1;
  cursor:pointer;color:var(--fg-3);padding:2px 6px;border-radius:var(--r-sm)}
.tr-pend-x:hover{background:var(--pame-blue-20);color:var(--fg-1)}
.tr-pend-ic{font-size:22px;line-height:1.2;flex:none}
.tr-pend-txt{min-width:0}
.tr-pend-txt b{display:block;color:var(--fg-1);font-size:var(--fs-15);margin-bottom:2px}
.tr-pend-txt span{color:var(--fg-2);font-size:var(--fs-13);line-height:1.5}
.tr-pend-chip{display:inline-flex;align-items:center;gap:6px;margin-top:8px;background:#fff;
  border:1px solid var(--pame-blue-30);color:var(--pame-blue-700,#02334D);border-radius:var(--r-pill);
  padding:4px 11px;font-weight:800;font-size:var(--fs-12)}
.tr-pend-chip .dot{width:7px;height:7px;border-radius:50%;background:var(--btn-bg)}
/* Badge de vencimiento de membresía en la ficha del alumno (panel): que salte a la vista. */
.memb-badge{display:inline-flex;align-items:center;gap:5px;margin-top:4px;padding:3px 10px;
  border-radius:var(--r-pill);font-size:11px;font-weight:800;line-height:1.4;white-space:nowrap}
.memb-badge.ok{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.memb-badge.pronto{background:var(--pame-orange-10);color:var(--pame-orange)}
.memb-badge.vencida{background:#fff4f4;color:var(--pame-danger)}
.memb-badge.off{background:var(--pame-bg-soft);color:var(--fg-3)}
#app{visibility:hidden}

/* ---- Progreso general ---- */
.resumen{display:flex;align-items:center;gap:var(--sp-4);margin:var(--sp-2) 0 var(--sp-7)}
.bar{flex:1;height:10px;background:var(--pame-blue-10);border-radius:var(--r-pill);overflow:hidden}
.bar > i{display:block;height:100%;background:var(--pame-teal);border-radius:var(--r-pill);
  width:0;transition:width var(--t-base) var(--ease-out)}
.resumen .cifra{font-size:var(--fs-14);font-weight:700;color:var(--fg-2);white-space:nowrap}

/* ---- Curso ---- */
.curso-titulo{font-family:var(--font-display);font-weight:400;font-size:var(--fs-32);margin:0 0 6px}
/* Chip del grupo (cohorte) al que pertenece el alumno dentro del curso */
.ch-grupo{--gr:var(--pame-blue);display:inline-block;vertical-align:middle;margin-left:10px;
  font-family:var(--font-sans);font-size:var(--fs-12);font-weight:800;letter-spacing:.02em;
  padding:3px 9px;border-radius:999px;background:color-mix(in srgb,var(--gr) 14%,transparent);
  color:var(--gr);border:1px solid color-mix(in srgb,var(--gr) 38%,transparent)}
.curso-desc{color:var(--fg-3);font-size:var(--fs-14);margin:0 0 var(--sp-6)}

/* Encabezado del curso: datos + portada + "continuar donde quedó" */
.curso-hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,42%);
  gap:var(--sp-6);align-items:center;margin:var(--sp-2) 0 var(--sp-7)}
.curso-hero.sin-img{grid-template-columns:minmax(0,1fr)}
.curso-hero .curso-desc{margin-bottom:var(--sp-4)}
.curso-hero .resumen{margin:0 0 var(--sp-4)}
.ch-media{border-radius:var(--r-lg);overflow:hidden;border:1px solid var(--pame-line);
  background:var(--pame-bg-soft);aspect-ratio:16/9;box-shadow:var(--shadow-sm)}
.ch-media img{width:100%;height:100%;object-fit:cover;display:block}
.ch-cta{display:inline-flex;align-items:center;gap:10px;background:var(--pame-orange);color:#fff;
  font-size:var(--fs-14);font-weight:800;padding:13px 24px;border-radius:var(--r-pill);
  text-decoration:none;box-shadow:var(--shadow-sm);transition:background var(--t-fast) var(--ease-out)}
.ch-cta:hover{background:#e07a04}
.ch-cta svg{width:20px;height:20px;flex:0 0 auto}
.ch-next{margin:10px 0 0;font-size:var(--fs-12);color:var(--fg-3)}
.ch-next b{color:var(--fg-2)}
@media(max-width:820px){
  .curso-hero{grid-template-columns:1fr;gap:var(--sp-4)}
  .ch-media{order:-1}
}

/* ---- Ranking de la formación (gamificación) ----
   Podio de 3 con foto (el resto no expone nombres: cada alumno ve solo su
   propio puesto). Se pinta solo si el curso tiene `gamificacion` encendida.
   Lo arma formacion.html; los datos salen de la RPC ranking_formacion. */
.rank{--av1:var(--sp-8);--av2:var(--sp-7);
  margin:0 0 var(--sp-7);padding:var(--sp-5) var(--sp-5) var(--sp-4);
  background:linear-gradient(180deg,var(--pame-orange-10),var(--bg-1));
  border:1px solid var(--pame-line);border-radius:var(--r-lg);box-shadow:var(--shadow-xs)}
.rank-head{display:flex;align-items:baseline;gap:var(--sp-3);flex-wrap:wrap;margin-bottom:var(--sp-5)}
.rank-tit{font-size:var(--fs-18);margin:0;color:var(--fg-1)}
.rank-sub{font-size:var(--fs-12);color:var(--fg-3)}

/* Las 3 gradas: el 1º al medio y más alto, 2º izquierda, 3º derecha */
.podio{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:end;gap:var(--sp-3);
  list-style:none;margin:0;padding:0;max-width:520px;margin-inline:auto}
.podio-seat{display:flex;flex-direction:column;align-items:center;gap:var(--sp-1);text-align:center}
.podio-seat.p1{order:2}.podio-seat.p2{order:1}.podio-seat.p3{order:3}
.podio-medalla{font-size:var(--fs-24);line-height:1}
.podio-avatar{width:var(--av2);height:var(--av2);border-radius:var(--r-pill);overflow:hidden;
  display:grid;place-items:center;background:var(--pame-blue-10);color:var(--pame-blue);
  font-weight:800;font-size:var(--fs-16);border:2px solid var(--bg-1);box-shadow:var(--shadow-sm)}
.podio-seat.p1 .podio-avatar{width:var(--av1);height:var(--av1);border-color:var(--pame-orange);
  box-shadow:var(--shadow-glow)}
.podio-avatar img{width:100%;height:100%;object-fit:cover}
.podio-nombre{font-size:var(--fs-12);font-weight:700;color:var(--fg-1);max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.podio-pct{font-size:var(--fs-12);font-weight:800;color:var(--pame-teal)}
/* Grada dibujada bajo cada asiento: el 1º más alto */
.podio-base{width:100%;border-radius:var(--r-sm) var(--r-sm) 0 0;margin-top:var(--sp-1);
  background:color-mix(in srgb,var(--pame-orange) 22%,var(--bg-1))}
.podio-seat.p1 .podio-base{height:var(--sp-8)}
.podio-seat.p2 .podio-base{height:var(--sp-6)}
.podio-seat.p3 .podio-base{height:var(--sp-5)}
/* Asiento vacío: todavía no hay nadie en ese puesto */
.podio-seat.vacio .podio-avatar{background:transparent;border:2px dashed var(--pame-line);
  color:var(--fg-3);box-shadow:none}
.podio-seat.vacio .podio-nombre,.podio-seat.vacio .podio-pct{color:var(--fg-3)}

/* Tu lugar: "espacios vacíos" y, si estás más abajo del podio, tu propio puesto */
.rank-yo{display:flex;align-items:center;justify-content:center;gap:var(--sp-2);
  margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:1px dashed var(--pame-line);
  font-size:var(--fs-14);color:var(--fg-2);flex-wrap:wrap}
.rank-yo .vacio-dot{width:var(--sp-4);height:var(--sp-4);border-radius:var(--r-pill);
  border:1px dashed var(--pame-line)}
.rank-yo .yo-chip{display:inline-flex;align-items:center;gap:var(--sp-2);
  padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);
  background:var(--pame-teal);color:var(--fg-on-brand);font-weight:800;font-size:var(--fs-12)}
.rank-yo.en-podio .yo-chip{background:var(--pame-orange)}
.rank-yo b{color:var(--fg-1)}

/* ---- Vista de módulos en tarjetas (cuadrícula con portada) ---- */
.mods-grid{display:grid;gap:var(--sp-5) var(--sp-4);margin-bottom:var(--sp-6);
  grid-template-columns:repeat(auto-fill,minmax(var(--mc-min,215px),1fr))}
.mods-grid.tam-chico{--mc-min:165px}
.mods-grid.tam-medio{--mc-min:215px}
.mods-grid.tam-grande{--mc-min:290px}
.mods-grid.cols{grid-template-columns:repeat(var(--cols,4),minmax(0,1fr))}
.mod-card{display:block;text-decoration:none;color:inherit}
.mc-img{position:relative;border-radius:var(--r-md);overflow:hidden;background:var(--pame-bg-soft);
  border:1px solid var(--pame-line);box-shadow:var(--shadow-xs);
  transition:transform var(--t-base) var(--ease-out),box-shadow var(--t-base) var(--ease-out)}
.mods-grid.apaisada .mc-img{aspect-ratio:16/9}
.mods-grid.cuadrada .mc-img{aspect-ratio:1/1}
.mc-img img{width:100%;height:100%;object-fit:cover;display:block}
.mod-card:hover .mc-img{transform:translateY(-3px);box-shadow:var(--shadow-md)}
.mc-fallback{width:100%;height:100%;display:grid;place-items:center;padding:14px;text-align:center;
  background:linear-gradient(135deg,var(--pame-blue) 0%,var(--pame-teal) 100%)}
.mc-fallback[data-n="1"]{background:linear-gradient(135deg,var(--pame-blue-700) 0%,var(--pame-blue) 100%)}
.mc-fallback[data-n="2"]{background:linear-gradient(135deg,var(--pame-teal) 0%,var(--pame-blue) 100%)}
.mc-fallback[data-n="3"]{background:linear-gradient(135deg,var(--pame-orange) 0%,#f4b23e 100%)}
.mc-fallback[data-n="4"]{background:linear-gradient(160deg,var(--pame-blue) 0%,var(--pame-teal) 100%)}
.mc-fallback span{color:#fff;font-weight:800;font-size:var(--fs-14);line-height:1.25;
  text-shadow:0 1px 6px rgba(0,0,0,.18)}
.mc-lock,.mc-opc{position:absolute;top:8px;right:8px;background:rgba(255,255,255,.92);border-radius:var(--r-pill);
  padding:3px 9px;font-size:var(--fs-12)}
/* El "Opcional" va en la otra punta para no pisarse con el candado del drip */
.mc-opc{right:auto;left:var(--sp-2);font-weight:700;color:var(--fg-3)}
.mod-card.bloq .mc-img img,.mod-card.bloq .mc-fallback{filter:grayscale(.75);opacity:.6}
.mc-prog{display:flex;align-items:center;gap:10px;margin:10px 0 6px}
.mc-pct{font-size:var(--fs-14);font-weight:800;color:var(--fg-1);min-width:34px}
.mc-prog .bar{flex:1;height:6px;background:var(--pame-line);border-radius:var(--r-pill);overflow:hidden}
.mc-prog .bar > i{display:block;height:100%;background:var(--pame-teal);border-radius:var(--r-pill)}
.mc-tit{font-size:var(--fs-16);font-weight:800;color:var(--fg-1);margin:0;line-height:1.25}
.mc-sub{font-size:var(--fs-12);color:var(--fg-3);margin:4px 0 0}
.volver-mods{display:inline-flex;align-items:center;gap:6px;background:var(--pame-blue-10);
  border:1px solid var(--pame-blue-20);color:var(--pame-blue-700);font-size:var(--fs-14);font-weight:700;
  padding:9px 16px;border-radius:var(--r-pill);cursor:pointer;width:auto;margin-bottom:var(--sp-4)}
.volver-mods:hover{background:var(--btn-bg);border-color:var(--pame-blue);color:#fff}
/* En pantallas chicas las columnas fijas se relajan para que no queden minúsculas */
@media(max-width:900px){ .mods-grid.cols{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))} }
@media(max-width:560px){ .mods-grid,.mods-grid.cols{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4) var(--sp-3)} }

/* ---- Sección destacada (arriba del temario, dentro de un curso) ----
   Un módulo marcado como `destacado` en el admin: lo administrativo del
   programa (cómo se navega, el Zoom, el calendario). No es una tarjeta más de
   la cuadrícula, así que se distingue con el fondo crema y la línea naranja. */
.destacada{background:var(--pame-bg-cream);border:1px solid var(--pame-orange-30);
  border-radius:var(--r-md);
  padding:var(--sp-4) var(--sp-5);margin-bottom:var(--sp-6);box-shadow:var(--shadow-glow)}
.dst-head{margin-bottom:var(--sp-3)}
.dst-eyebrow{font-size:var(--fs-12);font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  color:var(--pame-orange-600)}
.dst-tit{font-size:var(--fs-20);font-weight:700;color:var(--fg-1);margin:2px 0 0}
.dst-nota{font-size:var(--fs-14);color:var(--fg-2);margin:var(--sp-1) 0 0;line-height:1.4}
.dst-scroller{position:relative}
.dst-items{display:flex;gap:var(--sp-2);overflow-x:auto;scroll-snap-type:x proximity;scroll-behavior:smooth;scrollbar-width:none;-ms-overflow-style:none}
.dst-items::-webkit-scrollbar{display:none}
/* Flechas del carrusel: solo cuando la fila desborda (.has-nav lo pone el JS). */
.dst-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:2;display:none;
  width:36px;height:36px;border-radius:999px;border:1px solid var(--pame-orange-30);
  background:var(--pame-bg);color:var(--pame-orange-600);font-size:22px;line-height:1;cursor:pointer;
  align-items:center;justify-content:center;box-shadow:var(--shadow-sm)}
.dst-nav.prev{left:-6px}
.dst-nav.next{right:-6px}
.dst-nav:hover{background:var(--pame-orange);color:#fff;border-color:var(--pame-orange)}
.dst-nav:disabled{opacity:.35;cursor:default}
.destacada.has-nav .dst-nav{display:flex}
.destacada.has-nav .dst-items{padding:2px 30px}
/* min-width:0 es lo que le permite achicarse abajo del ancho de su contenido:
   sin eso, el `nowrap` de la descripción le impone un mínimo y la tarjeta se
   sale del panel en pantallas chicas. */
.dst-item{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1 0 260px;scroll-snap-align:start;text-decoration:none;background:var(--pame-bg);
  border:1px solid var(--pame-orange-30);border-radius:var(--r-sm);padding:var(--sp-3);
  transition:border-color var(--t-fast) var(--ease-out),box-shadow var(--t-fast) var(--ease-out)}
.dst-item:hover{border-color:var(--pame-orange);box-shadow:var(--shadow-sm)}
.dst-ico{width:32px;height:32px;flex:none;border-radius:var(--r-sm);display:grid;place-items:center;
  background:var(--pame-orange-20);color:var(--pame-orange-600)}
.dst-ico svg{width:18px;height:18px}
.dst-txt{flex:1;min-width:0}
.dst-txt b{display:block;font-size:var(--fs-14);font-weight:700;color:var(--fg-1);line-height:1.3}
.dst-txt span{display:block;font-size:var(--fs-12);color:var(--fg-3);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dst-flecha{flex:none;color:var(--pame-orange-600);font-weight:700}
@media(max-width:560px){
  .destacada{padding:var(--sp-3) var(--sp-4)}
  .dst-item{flex-basis:85%}
  .destacada.has-nav .dst-items{padding:2px 8px}
  .dst-nav{width:32px;height:32px;font-size:20px}
  .dst-nav.prev{left:-4px}
  .dst-nav.next{right:-4px}
}

/* ---- Avisos y próximos eventos (arriba del curso, deslizante, ocultable) ---- */
#avisos-cont{max-width:1140px;margin:0 auto;padding:var(--sp-5) var(--sp-6) 0}
.avisos{margin:0}
.avisos-tit-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:var(--sp-3)}
.avisos-tit{font-family:var(--font-display);font-weight:400;font-size:var(--fs-20);margin:0;color:var(--fg-1)}
.avisos-hide{background:none;border:1px solid var(--pame-line);color:var(--fg-3);font-size:var(--fs-12);
  font-weight:700;padding:6px 12px;border-radius:var(--r-sm);cursor:pointer;width:auto;white-space:nowrap}
.avisos-hide:hover{border-color:var(--pame-blue);color:var(--pame-blue);background:var(--pame-blue-10)}
.avisos-min{padding:2px 0}
.avisos-open{background:var(--pame-blue-10);border:1px solid var(--pame-blue-20);color:var(--pame-blue-700);
  font-weight:700;font-size:var(--fs-14);padding:9px 18px;border-radius:var(--r-pill);cursor:pointer;width:auto}
.avisos-open:hover{background:var(--pame-blue-20)}
.avisos-wrap{position:relative}
.avisos-track{display:flex;flex-direction:column;gap:10px}
/* De la cuarta tarjeta en adelante: van en el HTML pero no se ven hasta que se
   toca "Ver N más". Se ocultan con display:none (y no con altura) para que el
   `gap` de la columna no deje huecos fantasma. */
.avisos:not(.abierto) .aviso.a-extra{display:none}
.avisos-track .aviso{margin-bottom:0}
/* Modo deslizante (3+ avisos): fila con scroll-snap, cada aviso ocupa el 100% */
.avisos.es-slider .avisos-track{flex-direction:row;overflow-x:auto;scroll-snap-type:x mandatory;
  scroll-behavior:smooth;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.avisos.es-slider .avisos-track::-webkit-scrollbar{display:none}
.avisos.es-slider .aviso{flex:0 0 100%;scroll-snap-align:start}
.av-arrow{position:absolute;top:50%;transform:translateY(-50%);z-index:2;width:34px;height:34px;border-radius:50%;
  border:1px solid var(--pame-line);background:var(--pame-bg);color:var(--pame-blue);font-size:20px;cursor:pointer;
  display:grid;place-items:center;padding:0;box-shadow:var(--shadow-md)}
.av-arrow:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
.av-arrow.prev{left:-6px}
.av-arrow.next{right:-6px}
.avisos-dots{display:flex;gap:6px;justify-content:center;margin-top:10px}
.dot{width:8px;height:8px;border-radius:50%;border:none;background:var(--pame-blue-10);cursor:pointer;padding:0}
.dot.active{background:var(--btn-bg)}
.aviso{display:flex;gap:16px;align-items:flex-start;padding:22px 26px;background:var(--pame-bg);
  border:1px solid var(--pame-line);border-radius:var(--r-lg)}
/* Destacado: fondo degradé suave (sin borde de color) */
.aviso.destacado{background:linear-gradient(120deg,var(--pame-blue-10),var(--pame-teal-10));border-color:var(--pame-blue-20)}
.aviso .ico{width:40px;height:40px;flex:none;border-radius:var(--r-md);display:grid;place-items:center;background:var(--pame-blue-10);color:var(--pame-blue-700)}
.aviso .ico svg{width:22px;height:22px}
.aviso.evento .ico{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.aviso.bonus .ico{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.aviso.recordatorio .ico{background:var(--pame-blue-10);color:var(--pame-blue-700)}
.aviso .a-cont{flex:1;min-width:0}
.aviso .a-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:3px}
.aviso .a-tipo{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--fg-3)}
.aviso .a-star{font-size:11px;font-weight:800;background:var(--pame-orange);color:#fff;padding:2px 8px;border-radius:var(--r-pill)}
.aviso .a-fecha{font-size:var(--fs-12);color:var(--pame-teal-700);font-weight:600;margin-left:auto}
.aviso .a-fecha b{color:var(--pame-orange)}
.aviso .a-tit{font-weight:700;font-size:var(--fs-16);color:var(--fg-1)}
.aviso .a-body{font-size:var(--fs-14);color:var(--fg-3);margin-top:2px;line-height:var(--lh-normal)}
.aviso .a-cta{display:inline-block;margin-top:10px;background:var(--btn-bg);color:#fff;font-size:var(--fs-12);
  font-weight:700;padding:8px 16px;border-radius:var(--r-sm);text-decoration:none}
.aviso .a-cta:hover{background:var(--btn-bg-h)}
@media (max-width:640px){ .aviso .a-fecha{margin-left:0} }

/* ---- Módulo ---- */
.modulo{border:1px solid var(--pame-line);border-radius:var(--r-md);margin-bottom:var(--sp-4);
  background:var(--pame-bg);overflow:hidden}
.mod-head{display:flex;align-items:center;gap:var(--sp-3);cursor:pointer;user-select:none;
  padding:16px 20px;background:var(--pame-bg-soft);border-bottom:1px solid var(--pame-line)}
.mod-head:hover{background:var(--pame-blue-10)}
.mod-head h3{margin:0;font-size:var(--fs-16);font-weight:700;color:var(--fg-1);flex:1;min-width:0}
.mod-caret{font-size:12px;color:var(--fg-3);flex:none;transition:transform var(--t-fast) var(--ease-out)}
.mod-n{font-size:var(--fs-12);color:var(--fg-3);font-weight:700;white-space:nowrap}
.modulo.plegado .mod-caret{transform:rotate(-90deg)}
.modulo.plegado .lecciones{display:none}
.modulo.plegado .mod-head{border-bottom:none}
.tag{font-size:var(--fs-12);font-weight:700;padding:5px 11px;border-radius:var(--r-pill);white-space:nowrap}
.tag.libre{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.tag.lock{background:var(--pame-blue-10);color:var(--pame-blue-700)}
/* Módulo opcional: no suma al avance ni lo exige el certificado (neutro a propósito,
   es un dato, no un estado bueno ni malo) */
.tag.opc{background:#fff;color:var(--fg-3);border:1px solid var(--pame-line)}
.modulo.bloq .mod-head{opacity:.75}

/* ---- Lección ---- */
.lecciones{list-style:none;margin:0;padding:6px 8px}
.leccion{display:flex;align-items:center;gap:var(--sp-3);padding:11px 12px;border-radius:var(--r-sm)}
.leccion + .leccion{border-top:1px solid var(--pame-line)}
/* Indicador de progreso (no es un input marcable): sin borde ni fondo cuando está
   vacío, así no invita a "tildar". Al pasar a .vista se pinta teal con el ✓. */
.leccion .chk{width:22px;height:22px;flex:none;border:2px solid transparent;border-radius:6px;
  display:grid;place-items:center;color:#fff;font-size:13px;background:transparent;
  transition:background var(--t-fast),border-color var(--t-fast)}
.leccion.vista .chk{background:var(--pame-teal);border-color:var(--pame-teal)}
.leccion .txt{flex:1;min-width:0}
.leccion .txt b{font-weight:600;font-size:var(--fs-14);color:var(--fg-1)}
.leccion .txt span{display:block;font-size:var(--fs-12);color:var(--fg-3)}
.leccion.vista .txt b{color:var(--fg-3)}
.ver{border:1px solid var(--pame-line);background:#fff;color:var(--pame-blue);font-size:var(--fs-12);
  font-weight:700;padding:7px 12px;border-radius:var(--r-sm);cursor:pointer;white-space:nowrap}
.ver:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
.modulo.bloq .leccion{opacity:.5}
.modulo.bloq .chk,.modulo.bloq .ver{pointer-events:none}
/* Drip por CLASE: una clase puede liberarse más tarde que su módulo */
.tag.mini{font-size:11px;padding:2px 8px}
.leccion.bloq{opacity:.62}
.ver:disabled{opacity:.7;cursor:default;pointer-events:none;border-color:var(--pame-line);background:var(--pame-bg-soft);color:var(--fg-3)}

.topbar > div{display:flex;gap:10px;align-items:center}
.logo-link{display:inline-flex;align-items:center;line-height:0}
.logo-img{height:52px;width:auto;display:block}
/* La escuela que todavía no cargó su logo se identifica con su nombre en texto.
   Es el reemplazo del <img> (lo decide el middleware, ver app/functions/_middleware.js),
   así que sirve en los cinco lugares donde va un logo: la barra, la landing, el login,
   el checkout y las páginas legales. Uno solo para todos: el nombre de una escuela mide
   lo que mide y no tiene por qué achicarse según la pantalla en la que aparezca. */
.logo-txt{display:block;line-height:1.15;font-size:var(--fs-20);font-weight:700;
          letter-spacing:.01em;color:var(--pame-blue-900);white-space:nowrap;
          overflow:hidden;text-overflow:ellipsis;max-width:min(52vw,320px)}
/* El logo casi siempre va adentro de un <a> (a Inicio). Una imagen no se subraya, un texto
   sí: sin esto el nombre de la escuela aparece subrayado como un link cualquiera. El
   subrayado se propaga desde el padre, así que hay que apagarlo en el padre. */
a:has(> .logo-txt){text-decoration:none}
/* Donde el logo iba centrado y con aire abajo (login, checkout, la puerta del vivo),
   el texto que lo reemplaza tiene que quedar igual: la imagen traía ese margen en su
   propia clase, y el texto no la lleva. */
.logo-img-wrap .logo-txt{margin:0 auto}
.co-head .logo-txt{margin:0 auto var(--sp-4)}
.vivo-caja .logo-txt{margin:0 auto var(--sp-5)}

/* ---- Home: tarjetas de curso ---- */
/* --cc-cols lo setea el dashboard (1/2/3 según cuántos cursos). Sin la var: auto-fill. */
.cursos-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-top:var(--sp-2)}
.cursos-grid[style*="--cc-cols"]{grid-template-columns:repeat(var(--cc-cols,3),minmax(0,1fr))}
/* Con 1 sola formación no estiramos la tarjeta al ancho completo: si no, la
   imagen 16:9 queda a 5:1 (recortada arriba y abajo, cara de "apaisada"). Se
   topa al ancho de una tarjeta de una grilla de tres y queda alineada a la
   izquierda. En tablet/mobile los overrides de abajo se llevan la última palabra. */
.cursos-grid[style*="--cc-cols:1"]{grid-template-columns:minmax(0,340px)}
/* Tablet: máx 2 columnas. Mobile: siempre una debajo de la otra. */
@media(max-width:900px){
  .cursos-grid,.cursos-grid[style*="--cc-cols"]{grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}
}
@media(max-width:640px){
  .cursos-grid,.cursos-grid[style*="--cc-cols"]{grid-template-columns:1fr}
}
.curso-card{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-md);padding:22px;
  display:flex;flex-direction:column;gap:10px}
.curso-card h3{margin:0;font-family:var(--font-display);font-weight:400;font-size:var(--fs-20);color:var(--fg-1)}
.curso-card p{margin:0;font-size:var(--fs-14);color:var(--fg-3);flex:1}
.mini-bar{height:8px;background:var(--pame-blue-10);border-radius:var(--r-pill);overflow:hidden}
.mini-bar > i{display:block;height:100%;background:var(--pame-teal);border-radius:var(--r-pill);width:0}
.card-foot{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:4px}
.card-foot span{font-size:var(--fs-12);color:var(--fg-2);font-weight:700}
.btn-card{background:var(--btn-bg);color:#fff;font-size:var(--fs-12);font-weight:700;padding:9px 16px;
  border-radius:var(--r-sm);text-decoration:none;white-space:nowrap}
.btn-card:hover{background:var(--btn-bg-h)}
.seccion-tit{font-family:var(--font-display);font-weight:400;font-size:var(--fs-24);margin:var(--sp-6) 0 var(--sp-2)}
.volver{display:inline-block;color:var(--fg-3);font-size:var(--fs-14);text-decoration:none;margin-bottom:var(--sp-3)}
.volver:hover{color:var(--pame-blue)}

/* ---- Datos del alumno (autogestión) ---- */
.datos-card{background:var(--pame-blue-10);border:1px solid var(--pame-blue-20);border-radius:var(--r-md);
  padding:20px 22px;margin-bottom:var(--sp-6)}
.datos-card h3{margin:0 0 4px;font-size:var(--fs-16);color:var(--pame-blue-700)}
.datos-card p{margin:0 0 14px;font-size:var(--fs-14);color:var(--fg-2)}
.datos-card .fila{display:flex;gap:var(--sp-3);margin-bottom:12px}
.datos-card .fila > label{flex:1}
.datos-card label{display:flex;flex-direction:column;gap:6px;font-size:var(--fs-12);font-weight:700;
  text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
.datos-card input,.datos-card select{font-family:var(--font-sans);font-size:var(--fs-14);padding:10px 12px;
  border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;color:var(--fg-1)}
.datos-card .tipo{max-width:120px}
.datos-card button{width:auto;padding:12px 22px;margin-top:2px}
.d-msg{margin-left:12px;font-size:var(--fs-12);color:var(--pame-danger)}

/* ---- Panel admin ---- */
.admin-head{display:flex;justify-content:space-between;align-items:end;margin-bottom:var(--sp-5);gap:var(--sp-4);flex-wrap:wrap}
.admin-head h1{margin:0}
.admin-head .cuenta{color:var(--fg-3);font-size:var(--fs-14)}
.tabla-wrap{overflow-x:auto;border:1px solid var(--pame-line);border-radius:var(--r-md);background:#fff}
table.alumnos{border-collapse:collapse;width:100%;min-width:760px;font-size:var(--fs-14)}
table.alumnos th,table.alumnos td{text-align:left;padding:12px 14px;border-bottom:1px solid var(--pame-line);vertical-align:top}
table.alumnos tr:last-child td{border-bottom:none}
/* Alta de alumna nueva (panel Alumnos) */
.alta-form{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:14px 16px;margin:12px 0;background:var(--pame-bg-soft)}
.alta-form[hidden]{display:none}
.alta-ok{margin-top:12px;padding:12px 14px;border:1px solid var(--pame-teal-700);border-radius:var(--r-sm);background:var(--pame-teal-10);line-height:1.7}
.alta-ok code{background:#fff;padding:2px 8px;border-radius:6px;border:1px solid var(--pame-line);font-weight:700;font-family:monospace}
/* Admin · Productos y planes */
.prod-list{display:flex;flex-direction:column;gap:14px;margin-top:14px}
.prod-card{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:14px 16px;background:#fff}
.prod-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:8px}
.planes-list{display:flex;flex-direction:column;gap:8px;margin:8px 0}
.plan-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 12px;border:1px solid var(--pame-line);border-radius:var(--r-sm);background:var(--pame-bg-soft)}
/* El plan en el que ya estás: resaltado con el acento de marca. */
.plan-row.plan-actual{border-color:var(--pame-teal);background:var(--pame-teal-050,var(--pame-bg-soft));box-shadow:inset 0 0 0 1px var(--pame-teal)}
.plan-info{line-height:1.4}
.adm-panel{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:16px 18px;margin:12px 0;background:var(--pame-bg-soft)}
/* En el panel (admin/superadmin) los paneles van en BLANCO para resaltar sobre el
   fondo celeste con manchones. En páginas del alumno se deja el token (tema academia). */
body[data-page="admin"] .adm-panel,
body[data-page="panel"] .adm-panel{background:var(--pame-bg)}
.adm-panel h4{margin:0 0 12px}
table.alumnos th{background:var(--pame-bg-soft);font-size:var(--fs-12);text-transform:uppercase;
  letter-spacing:.03em;color:var(--fg-2)}
table.alumnos td.mail{color:var(--fg-2)}
table.alumnos input,table.alumnos select{font-family:var(--font-sans);font-size:var(--fs-14);padding:7px 9px;
  border:1px solid var(--pame-line);border-radius:6px;background:#fff;color:var(--fg-1);width:100%}
table.alumnos .doc-cell{display:flex;gap:6px}
table.alumnos .doc-cell select{width:82px;flex:none}

/* ── Tablas del panel como TARJETAS en móvil ──────────────────────────────────
   En vez de scroll lateral (el `min-width:760px` lo forzaba), cada fila es una
   tarjeta y cada dato muestra su etiqueta arriba. La etiqueta la pone
   `app/tabla-cards.js` copiando el <th> al data-label del <td>. El orden por
   columnas (thead clickeable) queda solo en desktop. Se usa `table.alumnos` para
   igualar la especificidad de las reglas base de arriba. */
@media(max-width:720px){
  .tabla-wrap{overflow-x:visible;border:none;background:transparent;border-radius:0}
  table.alumnos{display:block;width:100%;min-width:0;background:transparent}
  table.alumnos thead{display:none}
  table.alumnos tbody{display:block}
  table.alumnos tr{display:block;border:1px solid var(--pame-line);border-radius:var(--r-md);
    background:#fff;padding:var(--sp-2) var(--sp-4);margin-bottom:var(--sp-3);box-shadow:var(--shadow-xs)}
  table.alumnos td{display:block;padding:var(--sp-1) 0;border:none;text-align:left;min-width:0}
  table.alumnos td[data-label]::before{content:attr(data-label);display:block;
    font-weight:700;color:var(--fg-3);font-size:var(--fs-11);text-transform:uppercase;
    letter-spacing:.02em;margin-bottom:2px}
  table.alumnos td:empty{display:none}
  /* Celda de acciones (última columna, sin encabezado) = barra de botones al pie. */
  table.alumnos td:last-child{margin-top:var(--sp-2);display:flex;flex-wrap:wrap;gap:var(--sp-2)}
  table.alumnos td:last-child:empty{display:none}
  /* Los inputs de una celda (doc, etc.) no necesitan ocupar todo el ancho acá. */
  table.alumnos .doc-cell{flex-wrap:wrap}
}
.mini{padding:8px 14px;font-size:var(--fs-12);width:auto}
.vistas-pill{display:inline-block;background:var(--pame-teal-10);color:var(--pame-teal-700);font-weight:700;
  padding:3px 10px;border-radius:var(--r-pill);font-size:var(--fs-12)}
.row-msg{font-size:var(--fs-12);margin-left:8px}
.row-msg.ok{color:var(--pame-teal-700)}
.row-msg.no{color:var(--pame-danger)}

/* ---- Mi perfil ---- */
.perfil-form{max-width:560px}
.avatar-row{display:flex;align-items:center;gap:18px;margin-bottom:var(--sp-6)}
.avatar{width:88px;height:88px;border-radius:50%;object-fit:cover;background:var(--pame-blue-10);
  border:1px solid var(--pame-line);display:grid;place-items:center;color:var(--pame-blue);
  font-family:var(--font-display);font-size:34px;overflow:hidden}
.avatar img{width:100%;height:100%;object-fit:cover}
.avatar-row .sub{font-size:var(--fs-12);color:var(--fg-3);margin-top:6px}
.file-btn{display:inline-block;cursor:pointer;border:1px solid var(--pame-line);color:var(--pame-blue);
  font-size:var(--fs-12);font-weight:700;padding:8px 14px;border-radius:var(--r-sm)}
.file-btn:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
.file-btn input{display:none}
.campo{display:flex;flex-direction:column;gap:6px;margin-bottom:16px}
.campo > label{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
.campo input,.campo textarea,.campo select{font-family:var(--font-sans);font-size:var(--fs-14);padding:11px 13px;
  border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;color:var(--fg-1)}
.campo textarea{resize:vertical;min-height:84px}
.campo .fijo{padding:11px 13px;background:var(--pame-bg-soft);border:1px dashed var(--pame-line);
  border-radius:var(--r-sm);color:var(--fg-3);font-size:var(--fs-14)}
.campo .nota{font-size:var(--fs-11);color:var(--fg-3);font-weight:400;text-transform:none;letter-spacing:0}
/* Aclaración DEBAJO del control (la del huso horario cambia según lo que elija) */
.campo .sub{font-size:var(--fs-12);color:var(--fg-3);line-height:var(--lh-normal)}
.campo.doble{flex-direction:row;gap:12px;align-items:flex-end}
.campo.doble .tipo{max-width:120px;flex:none}
.campo.doble > div{display:flex;flex-direction:column;gap:6px}
.campo.doble > div:last-child{flex:1}
.guardar-row{display:flex;align-items:center;gap:12px;margin-top:var(--sp-4)}
.guardar-row button{width:auto;padding:12px 22px}

/* ---- Ver clase (3 partes) ---- */
/* Layout ancho: sidebar de clases + columna principal grande */
body[data-page="clase"]{--sub-w:300px}
.clase-wrap{margin-left:calc(var(--side-w) + var(--sub-w));margin-right:auto;max-width:1180px;padding:var(--sp-5) var(--sp-6) var(--sp-8);transition:margin-left var(--t-base)}
.clase-layout{display:flex;gap:var(--sp-5);align-items:flex-start}
.clase-main{flex:1;min-width:0}
.clase-topbar{display:flex;align-items:center;gap:12px;margin-bottom:var(--sp-4)}

/* Sidebar de clases: FIJO al borde izquierdo (igual que el del dashboard) */
.clase-side{width:300px;position:fixed;top:0;left:0;bottom:0;z-index:55;padding-top:88px;
  border:none;border-right:1px solid var(--pame-line);background:var(--pame-bg);
  overflow:hidden;display:flex;flex-direction:column}
.clase-side-list{flex:1;overflow:auto;min-height:0}
.clase-side .dash-tools{flex:none;margin-top:0;padding:12px 10px 12px}
/* En desktop la barra está siempre fija: sin botón de cerrar */
.side-head .side-close{display:none}
.side-head{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:14px 16px;
  border-bottom:1px solid var(--pame-line);font-weight:700;font-size:var(--fs-14);color:var(--fg-1);
  position:sticky;top:0;background:var(--pame-bg);z-index:2}
.side-close{background:none;border:none;color:var(--fg-3);cursor:pointer;font-size:20px;line-height:1;
  width:auto;padding:0 4px;margin:0}
.side-close:hover{color:var(--pame-blue);background:none}
.side-mod{display:flex;align-items:center;gap:8px;width:100%;background:none;border:none;cursor:pointer;margin:0;
  padding:13px 16px;font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  color:var(--fg-2);text-align:left}
.side-mod:hover{color:var(--pame-blue);background:var(--pame-blue-10)}
.side-mod .chev{font-size:10px;transition:transform var(--t-fast);flex:none;color:var(--fg-3)}
.side-mod .cnt{margin-left:auto;background:var(--pame-blue-10);color:var(--pame-blue-700);border-radius:var(--r-pill);
  padding:1px 8px;font-size:10px;flex:none}
.side-mod-wrap{border-top:1px solid var(--pame-line)}
.side-mod-wrap:first-of-type{border-top:none}
.side-mod-wrap.collapsed .chev{transform:rotate(-90deg)}
.side-mod-wrap.collapsed .side-mod-list{display:none}
.side-mod-list{padding-bottom:6px}
.side-clase{display:flex;gap:10px;align-items:flex-start;padding:10px 16px;font-size:var(--fs-14);
  cursor:pointer;color:var(--fg-2);line-height:var(--lh-tight);border-left:3px solid transparent}
.side-clase:hover{background:var(--pame-blue-10)}
.side-clase.actual{background:var(--pame-blue-10);color:var(--pame-blue-700);font-weight:700;border-left-color:var(--pame-blue)}
.side-clase .ic{width:16px;flex:none;color:var(--pame-teal);font-weight:700}
.side-clase .n{color:var(--fg-3);flex:none}

/* Botón para reabrir el sidebar (desktop colapsado) / abrirlo (celular) */
.side-open-btn{display:none;border:1px solid var(--pame-line);background:#fff;color:var(--pame-blue);
  font-weight:700;font-size:var(--fs-12);padding:9px 14px;border-radius:var(--r-sm);cursor:pointer;width:auto}
.side-open-btn:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
.side-closed .clase-side{display:none}
.side-closed .side-open-btn{display:inline-block}
.clase-side:empty{display:none}
.side-backdrop{display:none}

.clase-head{margin-bottom:var(--sp-5)}
.clase-mod{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--pame-teal-700)}
.clase-titulo{font-family:var(--font-display);font-weight:400;font-size:var(--fs-32);margin:4px 0 2px;color:var(--fg-1)}
.clase-pos{font-size:var(--fs-14);color:var(--fg-3)}

/* Stepper de las 3 partes */
.stepper{display:flex;gap:8px;margin:var(--sp-4) 0 var(--sp-6);flex-wrap:wrap}
.step{display:flex;align-items:center;gap:8px;padding:8px 14px;border:1px solid var(--pame-line);
  border-radius:var(--r-pill);background:var(--pame-bg);font-size:var(--fs-12);font-weight:700;color:var(--fg-3)}
.step .num{width:20px;height:20px;flex:none;border-radius:50%;display:grid;place-items:center;
  background:var(--pame-blue-10);color:var(--pame-blue-700);font-size:12px}
.step.activo{border-color:var(--pame-blue);color:var(--pame-blue-700)}
.step.hecho{border-color:var(--pame-teal);color:var(--pame-teal-700)}
.step.hecho .num{background:var(--pame-teal);color:#fff}
.step.bloq{opacity:.5}

/* Bloque de cada parte */
.parte{border:1px solid var(--pame-line);border-radius:var(--r-md);background:var(--pame-bg);
  margin-bottom:var(--sp-4);overflow:hidden}
.parte-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);
  padding:16px 20px;background:var(--pame-bg-soft);border-bottom:1px solid var(--pame-line)}
.parte-head h3{margin:0;font-size:var(--fs-16);font-weight:700;color:var(--fg-1);display:flex;align-items:center;gap:10px}
.parte-head .estado{font-size:var(--fs-12);font-weight:700;padding:4px 11px;border-radius:var(--r-pill)}
.estado.pend{background:var(--pame-blue-10);color:var(--pame-blue-700)}
.estado.ok{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.parte-body{padding:20px}
.parte.locked{opacity:.55}
.parte.locked .parte-body{display:none}
.lock-msg{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}

/* Contenido: player / instructivo */
.player{position:relative}
.fs-btn{position:absolute;right:12px;top:12px;z-index:4;background:rgba(0,0,0,.55);color:#fff;border:none;
  width:auto;margin:0;padding:8px 13px;border-radius:var(--r-sm);cursor:pointer;font-size:17px;line-height:1;font-weight:700;
  opacity:.6;transition:opacity .15s}
.player:hover .fs-btn{opacity:1}
.fs-btn:hover{background:rgba(0,0,0,.78)}
.player:fullscreen{display:grid;place-items:center;background:#000}
.player:fullscreen .player-stub{width:min(100%,177vh);height:auto;border-radius:0}
.player-stub{aspect-ratio:16/9;background:var(--btn-bg-h);border-radius:var(--r-sm);display:grid;
  place-items:center;color:#fff;text-align:center;padding:20px}
.player-stub .play{font-size:44px;opacity:.85}
.player-stub p{margin:8px 0 0;font-size:var(--fs-12);opacity:.85}
/* Contenido: PDF embebido */
.pdf-frame{width:100%;height:70vh;min-height:460px;border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff}
/* Reproductor de video (Bunny, embed firmado) */
.bunny-frame{width:100%;aspect-ratio:16/9;border:0;border-radius:var(--r-sm);background:#000;display:block}
.player:fullscreen .bunny-frame{height:100vh;aspect-ratio:auto}
/* Marca de agua con el nombre del alumno (disuasiva; encima del video) */
.video-wm{position:absolute;top:10px;left:14px;z-index:3;pointer-events:none;color:#fff;
  display:flex;flex-direction:column;align-items:flex-start;gap:1px;
  opacity:.45;text-shadow:0 1px 3px rgba(0,0,0,.8);letter-spacing:.02em}
.video-wm .wm-name{font-size:var(--fs-12);font-weight:700}
.video-wm .wm-prog{font-size:11px;font-weight:600;opacity:.9}
.pdf-actions{display:flex;gap:10px;margin-top:10px;flex-wrap:wrap}
/* Instructivo de uso del ebook (texto rico, buyer-only) arriba del PDF */
.ebook-instructivo{margin:0 0 var(--sp-6)}

/* Capítulos del video (marcas de tiempo clickeables, bajo el reproductor) */
.caps{margin-top:var(--sp-3)}
.caps-tit{font-size:var(--fs-12);font-weight:800;letter-spacing:.02em;text-transform:uppercase;
  color:var(--fg-3);margin:0 0 var(--sp-2)}
.caps-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--sp-1)}
.cap-row{display:flex;align-items:baseline;gap:var(--sp-3);width:100%;margin:0;text-align:left;
  padding:9px 12px;border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;
  color:var(--fg-1);cursor:pointer;font-size:var(--fs-14);
  transition:border-color var(--t-fast),background var(--t-fast)}
.cap-row:hover{border-color:var(--pame-teal);background:var(--pame-teal-10)}
.caps .cap-t{flex:none;font-variant-numeric:tabular-nums;font-weight:700;font-size:var(--fs-12);
  color:var(--pame-teal-700);min-width:var(--sp-8)}
.caps .cap-tit{flex:1;min-width:0;font-weight:600}
/* Editor de capítulos (admin): el input de tiempo va angosto y centrado */
.adm-row .cap-t{flex:none;width:var(--sp-9);text-align:center;font-variant-numeric:tabular-nums}

/* Material adjunto (descargable) — bloque destacado para que no quede perdido.
   .materiales-parte (histórico, card completa con header verde) sigue existiendo
   por si algún día se usa suelto; hoy va INLINE dentro de la parte contenido
   con .materiales-inline: divisor sutil + label chica arriba, sin card doble. */
.materiales-parte .parte-head{background:var(--pame-teal-10)}
.materiales-inline{margin-top:var(--sp-4);padding-top:var(--sp-4);border-top:1px dashed var(--pame-line)}
.materiales-inline .mi-head{font-size:var(--fs-12);font-weight:700;color:var(--pame-teal-700);
  text-transform:uppercase;letter-spacing:.04em;margin-bottom:var(--sp-2)}
.materiales{display:flex;flex-direction:column;gap:8px}
.material{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--pame-line);
  border-radius:var(--r-sm);text-decoration:none;color:var(--fg-1);background:#fff;
  transition:border-color var(--t-fast),background var(--t-fast)}
.material:hover{border-color:var(--pame-teal);background:var(--pame-teal-10)}
.material .m-ico{font-size:22px;flex:none;line-height:1}
.material .m-tit{flex:1;font-weight:600;font-size:var(--fs-14);min-width:0}
.material .m-dl{font-size:var(--fs-12);font-weight:700;color:var(--pame-teal-700);flex:none}

/* La tipografía del contenido escrito (títulos, listas, citas, tablas,
   alineación, sangría) vive UNA sola vez en `.rt-doc` (ui.css): es la misma
   que se ve al escribir la clase en el panel. Acá solo va lo propio de la
   pantalla del alumno. */
.instructivo{max-width:78ch}

/* Simulación */
.consigna{font-size:var(--fs-14);line-height:var(--lh-normal);color:var(--fg-1);margin:0 0 var(--sp-3)}
.sim-tag{display:inline-block;font-size:var(--fs-12);font-weight:700;padding:3px 10px;border-radius:var(--r-pill);
  background:var(--pame-orange-10);color:var(--pame-orange);margin-bottom:12px}

/* Quiz */
.pregunta{margin-bottom:var(--sp-4)}
.pregunta > p{font-weight:700;font-size:var(--fs-14);margin:0 0 10px;color:var(--fg-1)}
/* Aviso de "marcá todas las que correspondan": va pegado al enunciado, con menos peso */
.preg-multi{font-weight:600;font-size:var(--fs-12);color:var(--fg-3)}
.opcion{display:flex;align-items:center;gap:10px;padding:11px 13px;border:1px solid var(--pame-line);
  border-radius:var(--r-sm);cursor:pointer;margin-bottom:8px;font-size:var(--fs-14);background:#fff;
  transition:border-color var(--t-fast),background var(--t-fast)}
.opcion:hover{border-color:var(--pame-blue)}
.opcion input{width:18px;height:18px;flex:none;accent-color:var(--pame-blue)}
.opcion.sel{border-color:var(--pame-blue);background:var(--pame-blue-10)}
/* Quiz aprobado: opciones bloqueadas (grisadas); la elegida queda resaltada */
.opcion.locked{cursor:default;opacity:.5}
.opcion.locked:hover{border-color:var(--pame-line)}
.opcion.locked.sel{opacity:1}
.opcion input:disabled{cursor:default}
.quiz-foot{display:flex;align-items:center;gap:14px;margin-top:var(--sp-3)}
.quiz-foot button{width:auto;padding:12px 22px}
.quiz-umbral{font-size:var(--fs-12);color:var(--fg-3)}
.quiz-msg{font-size:var(--fs-14);font-weight:700}

/* ════════════════════════════════════════════════════════════════════════
   Trabajo práctico (parte "entrega"): consigna + ventana + envío del alumno.
   ════════════════════════════════════════════════════════════════════════ */
.tp-vent{font-size:var(--fs-14);color:var(--fg-2);margin:var(--sp-3) 0 0}
/* Badge contador de cierre de la entrega. Por defecto teal; vira a ámbar
   con < 1 día y a rojo con < 1 h o ya cerrada. */
.tp-cd{display:inline-flex;align-items:center;gap:6px;margin-left:var(--sp-1);
  padding:2px var(--sp-2);border-radius:var(--r-pill);white-space:nowrap;
  font-size:var(--fs-12);font-weight:700;
  background:var(--pame-teal-10,var(--teal-050));color:var(--pame-teal);
  border:1px solid var(--pame-teal-40)}
.tp-cd::before{content:"⏳";font-weight:400}
.tp-cd.cd-warn{background:var(--warning-soft);color:#8A5A00;border-color:var(--warning)}
.tp-cd.cd-urgent{background:var(--danger-soft);color:var(--danger);border-color:var(--danger)}
.tp-cd.cd-cerrado{background:var(--danger-soft);color:var(--danger);border-color:var(--danger)}
.tp-form{margin-top:var(--sp-3)}
.tp-campo{margin-bottom:var(--sp-3)}
.tp-campo label{display:block;font-size:var(--fs-12);font-weight:700;color:var(--fg-2);margin-bottom:6px}
.tp-nota{font-weight:600;color:var(--fg-3)}
/* Selector de archivos con estilo del sistema (el input nativo va oculto) */
.tp-campo .tp-file{display:inline-flex;flex-direction:row;align-items:center;gap:var(--sp-2);margin:0;cursor:pointer;
  font-size:var(--fs-14);font-weight:600;color:var(--fg-1);text-transform:none;letter-spacing:normal}
.tp-file-btn{display:inline-flex;align-items:center;height:var(--ctl-h);padding:0 var(--sp-4);
  border:1px solid var(--pame-line);border-radius:var(--r-sm);background:var(--bg-2);
  color:var(--fg-2);font-weight:700;white-space:nowrap;
  transition:border-color var(--t-base),color var(--t-base),background var(--t-base)}
.tp-file:hover .tp-file-btn{border-color:var(--pame-teal);color:var(--pame-blue);background:#fff}
.tp-file-name{color:var(--fg-3);font-weight:600}
.tp-file-name.has{color:var(--fg-1);font-weight:700}
.tp-msg{font-size:var(--fs-14);font-weight:700}
.tp-msg.no{color:var(--pame-red,#c0392b)}
.tp-envio{border:1px solid var(--pame-line);border-radius:var(--r-sm);background:var(--pame-bg-soft);
  padding:var(--sp-3);margin:var(--sp-3) 0}
.tp-estado{font-size:var(--fs-13);font-weight:700;margin:0 0 var(--sp-2)}
.tp-estado.tp-aprobada{color:var(--pame-teal)}
.tp-estado.tp-rehacer{color:var(--pame-orange)}
.tp-adjs{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:var(--sp-2) 0}
.tp-adj{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-12);padding:4px 10px;
  border:1px solid var(--pame-line);border-radius:var(--r-pill);background:#fff;color:var(--fg-1)}
.tp-adj-x{border:none;background:none;color:var(--fg-3);cursor:pointer;font-size:var(--fs-14);line-height:1;padding:0}
.tp-adj-x:hover{color:var(--pame-orange)}
.tp-dev{font-size:var(--fs-14);color:var(--fg-1);margin-top:var(--sp-2);white-space:pre-wrap}

/* ════════════════════════════════════════════════════════════════════════
   Consultas del alumno (bloque que aparece SOLO en las clases donde está
   prendido `lecciones.acepta_consultas`).
   Graba la pantalla desde el navegador, suma capturas y manda un texto.
   ════════════════════════════════════════════════════════════════════════ */
.consulta-parte .parte-head{background:var(--pame-orange-10)}
.cns-campo{width:100%;font-family:var(--font-sans);font-size:var(--fs-14);line-height:var(--lh-normal);
  padding:var(--sp-3);border:var(--ctl-bd);border-radius:var(--ctl-r);background:#fff;color:var(--fg-1);
  resize:vertical}
.cns-campo:focus{outline:none;border-color:var(--pame-teal);box-shadow:0 0 0 3px rgba(0,168,193,.20)}

/* Botonera de adjuntos: grabar / subir un video / capturas */
.cns-acciones{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}
.cns-btn{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--ctl-h);width:auto;margin:0;
  padding:0 var(--sp-4);border:var(--ctl-bd);border-radius:var(--ctl-r);background:#fff;color:var(--fg-1);
  font-size:var(--fs-14);font-weight:700}
.cns-btn:hover{background:var(--pame-orange-10);border-color:var(--pame-orange);color:var(--pame-orange-600)}
.cns-btn[disabled]{opacity:.45}
.cns-btn[disabled]:hover{background:#fff;border-color:var(--pame-line);color:var(--fg-1)}

/* Mientras graba: punto rojo latiendo + cuenta regresiva + cortar */
/* Los bloques que se prenden y apagan con [hidden] llevan su guarda: una clase
   con `display` le gana a la regla del navegador y quedarían siempre a la vista. */
.cns-rec[hidden],.cns-prev[hidden],.cns-barra[hidden],.cns-lista[hidden]{display:none}
.cns-rec{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin-top:var(--sp-3);
  padding:var(--sp-3) var(--sp-4);border:1px solid var(--pame-danger);border-radius:var(--r-md);
  background:#fff;font-size:var(--fs-14);font-weight:700;color:var(--fg-1)}
.cns-dot{width:var(--sp-3);height:var(--sp-3);flex:none;border-radius:50%;background:var(--pame-danger);
  animation:cns-late 1s var(--ease-in-out) infinite}
@keyframes cns-late{50%{opacity:.25}}
@media (prefers-reduced-motion:reduce){ .cns-dot{animation:none} }
.cns-reloj{font-variant-numeric:tabular-nums}
.cns-rec .grow{flex:1}

/* Lo que quedó grabado / las capturas elegidas, antes de mandar */
.cns-prev{margin-top:var(--sp-3)}
/* Es una revisión, no una función: alcanza con verlo y confirmar que quedó
   bien. Si ocupara media pantalla, el botón de enviar quedaría fuera de vista. */
.cns-video{width:100%;max-height:42vh;border-radius:var(--r-sm);background:#000;display:block}
.cns-thumbs{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}
.cns-thumb{position:relative;width:var(--sp-9);height:var(--sp-9);border:1px solid var(--pame-line);
  border-radius:var(--r-sm);overflow:hidden;background:var(--pame-bg-soft)}
.cns-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.cns-quitar{position:absolute;top:var(--sp-1);right:var(--sp-1);width:var(--sp-5);height:var(--sp-5);
  display:grid;place-items:center;padding:0;margin:0;border:none;border-radius:50%;
  background:rgba(2,51,77,.72);color:#fff;font-size:var(--fs-12);font-weight:800;line-height:1}
.cns-quitar:hover{background:var(--pame-danger)}

/* Zona para pegar/soltar capturas */
.cns-soltar{margin-top:var(--sp-3);padding:var(--sp-4);border:1px dashed var(--pame-line);
  border-radius:var(--r-md);background:var(--pame-bg-soft);color:var(--fg-3);font-size:var(--fs-12);
  text-align:center;transition:border-color var(--t-fast),background var(--t-fast)}
.cns-soltar.encima{border-color:var(--pame-teal);background:var(--pame-teal-10);color:var(--pame-teal-700)}

/* Barra de subida */
.cns-barra{height:var(--sp-2);margin-top:var(--sp-3);border-radius:var(--r-pill);
  background:var(--pame-blue-10);overflow:hidden}
.cns-barra > i{display:block;height:100%;width:0;border-radius:var(--r-pill);
  background:var(--pame-teal);transition:width var(--t-base) var(--ease-out)}
.cns-msg{font-size:var(--fs-14);font-weight:700;margin:var(--sp-3) 0 0;min-height:var(--sp-4)}
.cns-msg.no{color:var(--pame-danger)}
.cns-msg.ok{color:var(--pame-success)}

/* Las consultas que ya mandó, con tu respuesta */
.cns-lista{display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-5);
  padding-top:var(--sp-5);border-top:1px solid var(--pame-line)}
.cns-lista > h4{margin:0;font-size:var(--fs-14)}
.cns-item{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);background:#fff}
.cns-item-head{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;
  font-size:var(--fs-12);color:var(--fg-3)}
.cns-item-head .grow{flex:1}
.cns-item p{margin:var(--sp-2) 0 0;font-size:var(--fs-14);color:var(--fg-1)}
.cns-estado{font-size:var(--fs-12);font-weight:700;padding:2px var(--sp-3);border-radius:var(--r-pill);
  background:var(--pame-blue-10);color:var(--pame-blue-700);white-space:nowrap}
.cns-estado.resp{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.cns-resp{margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-left:3px solid var(--pame-teal);
  border-radius:0 var(--r-sm) var(--r-sm) 0;background:var(--pame-teal-10)}
.cns-resp b{display:block;font-size:var(--fs-12);color:var(--pame-teal-700);margin-bottom:var(--sp-1)}
.cns-resp p{margin:0;white-space:pre-wrap}

/* ════════════════════════════════════════════════════════════════════════
   Foro de la clase — comentarios y dudas (solo si cuentas.foro_activo).
   Público entre alumnos; el admin responde y modera desde el panel.
   ════════════════════════════════════════════════════════════════════════ */
.foro-parte .parte-head{background:var(--pame-blue-10)}

/* Caja de escritura (comentario nuevo o respuesta) */
.foro-composer{display:flex;flex-direction:column;gap:var(--sp-2)}
.foro-composer--resp{margin-top:var(--sp-3);padding-left:var(--sp-4);border-left:2px solid var(--pame-line)}
.foro-campo{width:100%;font-family:var(--font-sans);font-size:var(--fs-14);line-height:var(--lh-normal);
  padding:var(--sp-3);border:var(--ctl-bd);border-radius:var(--ctl-r);background:#fff;color:var(--fg-1);resize:vertical}
.foro-campo:focus{outline:none;border-color:var(--pame-teal);box-shadow:0 0 0 3px rgba(0,168,193,.20)}
/* Casilla de privacidad en una sola línea: checkbox + texto al lado (el <span>
   mantiene el texto y el link juntos como un solo bloque; alta especificidad para
   ganarle a cualquier regla suelta de input/label). */
.foro-composer .foro-acepta{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:var(--fs-13);color:var(--fg-2);text-transform:none;letter-spacing:normal;margin:8px 0}
.foro-composer .foro-acepta input[type=checkbox]{width:16px;height:16px;flex:none;margin:0;accent-color:var(--pame-teal);cursor:pointer}
.foro-composer .foro-acepta .foro-acepta-txt{flex:1 1 auto;min-width:0;text-transform:none}
.foro-composer .foro-acepta a{color:var(--pame-teal-700);font-weight:700;text-transform:none}
.foro-enviar{min-height:var(--ctl-h);width:auto;margin:0;padding:0 var(--sp-4)}
.foro-msg{font-size:var(--fs-12);font-weight:700;align-self:center}
.foro-msg.no{color:var(--pame-danger)}
.foro-msg.ok{color:var(--pame-success)}

/* La lista de comentarios */
.foro-lista{display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-5);
  padding-top:var(--sp-5);border-top:1px solid var(--pame-line)}
.foro-item{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);background:#fff}
.foro-respuestas{margin-top:var(--sp-3);padding-left:var(--sp-4);border-left:2px solid var(--pame-line);
  display:flex;flex-direction:column;gap:var(--sp-3)}
.foro-item-acc{margin-top:var(--sp-2)}
.foro-responder{font-size:var(--fs-12)}

/* Una línea: avatar + autor + cuándo + cuerpo */
.foro-fila{display:flex;gap:var(--sp-3);align-items:flex-start}
.foro-av{width:var(--sp-7);height:var(--sp-7);flex:none;border-radius:50%;object-fit:cover;
  background:var(--pame-bg-soft);display:grid;place-items:center}
.foro-av--txt{font-size:var(--fs-14);font-weight:800;color:var(--pame-blue-700)}
.foro-fila.es-admin .foro-av{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.foro-cuerpo{flex:1;min-width:0}
.foro-meta{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;font-size:var(--fs-12);color:var(--fg-3)}
.foro-meta b{color:var(--fg-1);font-size:var(--fs-14)}
.foro-badge{font-size:var(--fs-12);font-weight:700;padding:1px var(--sp-2);border-radius:var(--r-pill);
  background:var(--pame-teal-10);color:var(--pame-teal-700)}
.foro-pend{font-size:var(--fs-12);font-weight:700;padding:1px var(--sp-2);border-radius:var(--r-pill);
  background:var(--pame-orange-10);color:var(--pame-orange-600)}
.foro-fecha{white-space:nowrap}
.foro-texto{margin:var(--sp-1) 0 0;font-size:var(--fs-14);color:var(--fg-1);white-space:pre-wrap;word-break:break-word}

/* Foro · vista del panel admin (moderar y responder) */
.foro-badge--off{background:var(--pame-bg-soft);color:var(--fg-3)}
.foro-adm-item{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);
  background:#fff;margin-top:var(--sp-3)}
.foro-adm-head{font-size:var(--fs-14)}
.foro-adm-meta{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;font-size:var(--fs-12);
  color:var(--fg-1);margin-top:var(--sp-1)}
.foro-adm-texto{margin:var(--sp-1) 0 var(--sp-2);font-size:var(--fs-14);color:var(--fg-1);
  white-space:pre-wrap;word-break:break-word}
.foro-adm-acc{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center}
.foro-adm-kids{margin-top:var(--sp-3);padding-left:var(--sp-4);border-left:2px solid var(--pame-line);
  display:flex;flex-direction:column;gap:var(--sp-3)}
.fm-reply-box{margin-top:var(--sp-2)}

/* Cierre + navegación */
.clase-done{background:var(--pame-teal-10);border:1px solid var(--pame-teal);border-radius:var(--r-md);
  padding:18px 20px;margin:var(--sp-5) 0;color:var(--pame-teal-700);font-weight:700;font-size:var(--fs-16);
  display:flex;align-items:center;gap:10px}
.nav-clases{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-3);
  margin-top:var(--sp-6);padding-top:var(--sp-5);border-top:1px solid var(--pame-line)}
.nav-btn{border:1px solid var(--pame-line);background:#fff;color:var(--fg-2);font-size:var(--fs-14);font-weight:700;
  padding:11px 18px;border-radius:var(--r-sm);cursor:pointer;text-decoration:none;white-space:nowrap}
.nav-btn:hover:not(.off){border-color:var(--pame-blue);color:var(--pame-blue)}
.nav-btn.next{background:var(--btn-bg);color:#fff;border-color:var(--btn-bg)}
.nav-btn.next:hover:not(.off){background:var(--btn-bg-h);border-color:var(--btn-bg-h);color:#fff}
.nav-btn.next.destacado{box-shadow:0 0 0 4px var(--pame-teal-10)}
.nav-btn.off{opacity:.4;pointer-events:none}
/* Borde OPCIONAL de los botones primarios: un anillo interno del color --btn-border
   (transparente por default = sin borde). Se usa box-shadow inset para no alterar el layout;
   ninguno de estos botones trae box-shadow propio. Lo setea el dueño con "Borde de botones". */
.btn-card, .a-cta, .nav-btn.next, .cal-btn.primario, .afil-btn, .na-save, .btn-sim-open,
.afil-link button, .mk .btn-primary, .tema-prev-btn{
  box-shadow: inset 0 0 0 1.5px var(--btn-border, transparent);
}

/* ---- Ver clase: sidebar como cajón en pantallas chicas ---- */
@media (max-width:900px){
  body[data-page="clase"]{--sub-w:0px}
  .clase-wrap{margin-left:0}
  .clase-side{position:fixed;left:0;top:0;bottom:0;z-index:70;width:84%;max-width:330px;
    padding-top:16px;border-right:none;box-shadow:var(--shadow-lg);max-height:none}
  .side-head .side-close{display:grid}
  .side-open-btn{display:inline-block}
  .side-backdrop{display:block;position:fixed;inset:0;background:rgba(20,30,50,.45);z-index:69}
  .side-closed .clase-side{display:none}
  .side-closed .side-backdrop{display:none}
}

/* ---- Responsive (celular) ---- */
@media (max-width:640px){
  /* height:auto + min-height: la barra CRECE si algo envuelve, en vez de mantener
     los 64px fijos y derramar los botones sobre el título. */
  .topbar{flex-wrap:wrap;gap:10px;padding:10px 16px;height:auto;min-height:var(--topbar-h)}
  .topbar .brand{font-size:var(--fs-18)}
  .logo-img{height:26px}
  .logo-txt{font-size:var(--fs-16)}
  .topbar > div{flex-wrap:wrap;gap:8px}
  .ghost{padding:8px 12px;font-size:var(--fs-12)}
  /* Accesos de la barra (ayuda, panel, cerrar sesión) en modo ícono: entran en una
     sola fila y la barra no se apila ni se encima con el contenido. */
  .topbar .ghost span{display:none}
  .topbar .ghost{padding:9px}
  /* El control de tamaño de texto no va en la barra de arriba en el celular:
     la dejamos limpia (logo · campana · ayuda · salir). */
  .topbar .size-ctl.in-top{display:none}
  .panel{padding:32px 18px}
  .panel h1{font-size:var(--fs-32)}
  .card{padding:32px 24px}
  .campo.doble{flex-direction:column;align-items:stretch}
  .campo.doble .tipo{max-width:none}
  .datos-card .fila{flex-direction:column}
  .datos-card .tipo{max-width:none}
  .leccion{flex-wrap:wrap}
  .leccion .ver{margin-left:34px}
  .mod-head{flex-wrap:wrap}
}

/* ---- Control de tamaño de texto (accesibilidad) ---- */
.size-ctl{position:fixed;left:16px;bottom:16px;z-index:60;display:flex;align-items:center;gap:2px;
  background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-pill);
  padding:4px;box-shadow:var(--shadow-md)}
.size-ctl button{background:none;border:none;color:var(--pame-blue);font-weight:700;cursor:pointer;
  width:34px;height:34px;border-radius:50%;font-size:15px;padding:0;line-height:1;margin:0}
.size-ctl button:hover{background:var(--pame-blue-10)}
.size-ctl button:disabled{opacity:.35;cursor:default}
/* En la barra de arriba (panel admin): estático, al lado de la campanita. */
/* En la barra el pill mide lo mismo que los demás controles (--ctl-h). El pill
   suma su borde (1px) y su padding (2px) arriba y abajo, así que los botones de
   adentro van más chicos para que el total dé --ctl-h y quede a la par. */
.size-ctl.in-top{position:static;left:auto;bottom:auto;z-index:auto;box-shadow:none;padding:2px;height:var(--ctl-h)}
.size-ctl.in-top button{width:30px;height:30px}

/* ---- PaoBot: botón flotante transversal (shell) ---- */
.paobot-fab{position:fixed;right:20px;bottom:20px;z-index:80;width:60px;height:60px;border-radius:50%;
  background:var(--btn-bg);color:#fff;border:none;cursor:pointer;box-shadow:var(--shadow-lg);padding:0;
  display:grid;place-items:center;transition:transform var(--t-base) var(--ease-out),background var(--t-base)}
.paobot-fab:hover{background:var(--btn-bg-h);transform:translateY(-2px)}
.paobot-fab svg{width:30px;height:30px}
/* Con foto del asistente cargada, la carita llena el botón (sin el globito ni el fondo azul). */
.paobot-fab.con-foto{background:none;overflow:hidden}
.paobot-fab.con-foto:hover{background:none}
.paobot-fab-img{width:100%;height:100%;object-fit:cover;border-radius:50%;display:block}
/* El isologo del chat de Educreia gira suave cada tantos segundos: invita a chatear
   sin ser molesto (pausa larga + un giro lento). Solo el asistente de Educreia, no el
   de alumnos. Se frena mientras el chat está abierto y con prefers-reduced-motion. */
@keyframes edu-iso-gira{ 0%,62%{ transform:rotate(0) } 100%{ transform:rotate(360deg) } }
.edu-ayuda-fab .edu-iso{ display:grid;place-items:center;transform-origin:50% 50%;
  animation:edu-iso-gira 5s cubic-bezier(.45,0,.2,1) infinite }
.edu-ayuda-fab:hover .edu-iso{ animation-play-state:paused }
.edu-ayuda-panel.open ~ .edu-ayuda-fab .edu-iso{ animation:none }
@media (prefers-reduced-motion:reduce){ .edu-ayuda-fab .edu-iso{ animation:none } }
.paobot-fab .badge{position:absolute;top:-4px;right:-4px;background:var(--pame-orange);color:#fff;
  font-size:9px;font-weight:800;padding:3px 6px;border-radius:var(--r-pill);letter-spacing:.04em;text-transform:uppercase}
.paobot-panel{position:fixed;right:20px;bottom:92px;z-index:80;width:340px;max-width:calc(100vw - 40px);
  /* Tope por debajo del encabezado fijo (topbar + cinta de preview): así no se tapa con el menú. */
  max-height:calc(100dvh - 92px - var(--head-h) - 12px);
  background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-lg);box-shadow:var(--shadow-lg);
  overflow:hidden;display:none}
.paobot-panel.open{display:flex;flex-direction:column}
.pb-head{background:var(--btn-bg);color:#fff;padding:16px 18px;display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex:none}
.pb-head-l{display:flex;align-items:center;gap:10px;min-width:0}
.pb-head-tit{min-width:0}
.pb-head-av{width:40px;height:40px;border-radius:50%;object-fit:cover;flex:none;border:2px solid rgba(255,255,255,.55)}
.pb-head h4{margin:0;font-family:var(--font-display);font-weight:400;font-size:var(--fs-20);color:#fff}
.pb-head p{margin:2px 0 0;font-size:var(--fs-12);color:#fff;opacity:.9}
.pb-close{background:none;border:none;color:#fff;font-size:22px;line-height:1;cursor:pointer;width:auto;padding:0;margin:0;opacity:.85}
.pb-close:hover{opacity:1;background:none}
.pb-body{padding:18px;flex:1;min-height:0;overflow:auto}
.pb-soon{background:var(--pame-orange-10);border:1px solid var(--pame-orange-30);border-left:4px solid var(--pame-orange);
  border-radius:var(--r-md);padding:14px 16px;font-size:var(--fs-14);color:var(--pame-ink-2);line-height:var(--lh-normal)}
.pb-input{display:flex;gap:8px;margin-top:14px}
.pb-input input{flex:1;font-size:var(--fs-14);padding:10px 12px;border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;color:var(--fg-1)}
.pb-input button{width:auto;padding:10px 16px;margin:0}
.pb-input input:disabled,.pb-input button:disabled{opacity:.55;cursor:not-allowed}

/* --- PaoBot en modo chat (.vivo). El cartel de "pronto" sigue usando .pb-soon. --- */
.paobot-panel.vivo .pb-body{display:flex;flex-direction:column;overflow:hidden}   /* el que scrollea es .pb-msgs */
.pb-msgs{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:var(--sp-3);padding-right:var(--sp-1)}
.pb-bienvenida{background:var(--pame-blue-10);border-radius:var(--r-md);padding:var(--sp-3);
  font-size:var(--fs-12);color:var(--pame-ink-2);line-height:var(--lh-normal)}
/* El alumno tiene que saber que Pao lee esto, y saberlo ANTES de escribir. */
.pb-aviso{display:block;margin-top:var(--sp-2);font-size:var(--fs-12);color:var(--fg-3)}
.pb-msg{max-width:85%;padding:var(--sp-3);border-radius:var(--r-md);font-size:var(--fs-14);
  line-height:var(--lh-normal);word-wrap:break-word}
.pb-msg--yo{align-self:flex-end;background:var(--btn-bg);color:#fff}
.pb-msg--bot{align-self:flex-start;background:var(--pame-bg-soft);color:var(--pame-ink);
  border:1px solid var(--pame-line)}
/* Respuesta del bot con la carita del asistente al lado (cuando la academia cargó una foto). */
.pb-row--bot{display:flex;align-items:flex-end;gap:var(--sp-2);align-self:flex-start;max-width:88%}
.pb-row--bot .pb-msg--bot{align-self:auto;max-width:100%}
.pb-av{width:28px;height:28px;border-radius:50%;object-fit:cover;flex:none}
/* Listas dentro de una respuesta del bot (formato markdown-lite). */
.pb-msg .pb-h{font-weight:700;margin:var(--sp-2) 0 var(--sp-1);font-size:var(--fs-14)}
.pb-msg .pb-h:first-child{margin-top:0}
.pb-msg .pb-list{margin:6px 0;padding-left:20px}
.pb-msg .pb-list li{margin:3px 0}
.pb-msg b{font-weight:700}
/* Link al artículo del Centro de ayuda que sugiere el asistente de ayuda. */
.pb-arts{margin-top:8px;padding-top:8px;border-top:1px solid var(--pame-line);font-size:var(--fs-13)}
.pb-arts a{color:var(--pame-teal-700);font-weight:700}
/* Link a "Mis consultas a Educreia" (bienvenida y confirmación de ticket). */
.pb-mis-link{color:var(--pame-teal-700);font-weight:700;text-decoration:underline;cursor:pointer}
/* Dejar una consulta cuando la ayuda no tiene la respuesta → se abre un ticket.
   Acento AQUA (marca) para que se lea que va por OTRO canal (soporte humano), no la IA.
   OJO: clases propias pb-dejar-* — NO `pb-soporte` (esa ya es el botón navy "Avisar a
   soporte" del bot de alumnos, y colisionaba: texto oscuro sobre navy = ilegible). */
.pb-dejar{margin-top:var(--sp-3);padding:var(--sp-3);border-radius:var(--r-md);
  background:var(--pame-teal-10);border:1px solid var(--pame-teal-30);border-left:4px solid var(--pame-teal)}
.pb-dejar-lead{margin:0 0 var(--sp-2);font-size:var(--fs-13);color:var(--pame-ink);font-weight:600}
.pb-dejar-txt{width:100%;box-sizing:border-box;font:inherit;font-size:var(--fs-14);padding:10px 12px;
  border:1px solid var(--pame-teal-30);border-radius:var(--r-sm);background:#fff;color:var(--fg-1);resize:vertical}
.pb-dejar-row{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2)}
.pb-dejar-send{width:auto;margin:0}
.pb-dejar-msg{font-size:var(--fs-12);color:var(--fg-3)}
.pb-dejar-ok{margin:0;padding:var(--sp-3);border-radius:var(--r-md);font-size:var(--fs-13);
  color:var(--pame-ink);background:var(--pame-teal-10);border-left:4px solid var(--pame-teal)}
/* Adjuntos del bloque "Dejá tu consulta" (grabar pantalla / imagen / captura anotada). */
.pb-dejar-adj{margin-top:var(--sp-2)}
.adj-btns{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.adj-b{width:auto;margin:0;font-size:var(--fs-12);font-weight:600;padding:8px 12px;cursor:pointer;
  background:#fff;color:var(--pame-teal-700);border:1px solid var(--pame-teal-30);border-radius:var(--r-sm)}
.adj-b:hover{background:var(--pame-teal-10);border-color:var(--pame-teal)}
.adj-rec{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2);font-size:var(--fs-13);color:var(--pame-ink-2)}
.adj-rec .grow{flex:1}
.adj-dot{width:10px;height:10px;border-radius:50%;background:var(--pame-danger);animation:adj-pulse 1s infinite}
@keyframes adj-pulse{50%{opacity:.3}}
.adj-reloj{font-variant-numeric:tabular-nums;font-weight:700}
.adj-lista{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-2)}
.adj-chip{position:relative;display:inline-flex;overflow:hidden;background:#fff;
  border:1px solid var(--pame-teal-30);border-radius:var(--r-sm)}
.adj-chip img{width:56px;height:56px;object-fit:cover;display:block}
.adj-vid{display:flex;align-items:center;height:56px;padding:0 10px;font-size:var(--fs-12);font-weight:600;color:var(--pame-ink-2)}
.adj-x{position:absolute;top:2px;right:2px;width:18px;height:18px;padding:0;margin:0;border:0;border-radius:50%;
  line-height:16px;font-size:13px;cursor:pointer;background:rgba(17,24,39,.72);color:#fff}
.adj-msg{margin:var(--sp-2) 0 0;font-size:var(--fs-12);color:var(--fg-3)}
/* Chips de adjunto (abren la URL firmada) en "Mis consultas" y en el panel. */
.pb-tk-adj{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}
.pb-adj-open,.sop-adj{width:auto;margin:0}
.pb-adj-open{font-size:var(--fs-12);font-weight:600;padding:4px 10px;cursor:pointer;
  background:var(--pame-teal-10);color:var(--pame-teal-700);border:1px solid var(--pame-teal-30);border-radius:var(--r-pill)}
.pb-adj-open:hover{background:var(--pame-teal-20)}

/* ── Anotador de capturas (anotador.js) — modal a pantalla completa ── */
.anot-back{position:fixed;inset:0;z-index:200;padding:16px;background:rgba(2,12,24,.72);
  display:flex;align-items:center;justify-content:center}
.anot-modal{display:flex;flex-direction:column;max-width:min(1100px,96vw);max-height:94vh;overflow:hidden;
  background:var(--pame-bg);border-radius:var(--r-lg);box-shadow:var(--shadow-lg)}
.anot-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);padding:10px 14px;
  border-bottom:1px solid var(--pame-line);background:var(--pame-bg-soft)}
.anot-tools,.anot-colores,.anot-acciones{display:flex;align-items:center;gap:6px}
.anot-t{width:auto;min-width:38px;height:34px;margin:0;padding:0 8px;cursor:pointer;font-size:15px;
  background:#fff;color:var(--pame-ink);border:1px solid var(--pame-line);border-radius:var(--r-sm)}
.anot-t.on{background:var(--pame-teal);color:#fff;border-color:var(--pame-teal)}
.anot-c{width:24px;height:24px;margin:0;padding:0;border-radius:50%;cursor:pointer;
  border:2px solid #fff;box-shadow:0 0 0 1px var(--pame-line)}
.anot-c.on{box-shadow:0 0 0 2px var(--pame-teal)}
.anot-undo,.anot-clear{width:auto;height:34px;margin:0;padding:0 10px;cursor:pointer;font-size:var(--fs-12);
  background:#fff;color:var(--pame-ink-2);border:1px solid var(--pame-line);border-radius:var(--r-sm)}
.anot-lienzo{flex:1;overflow:auto;display:flex;align-items:center;justify-content:center;padding:12px;background:var(--btn-bg)}
.anot-cv{max-width:100%;max-height:72vh;background:#fff;cursor:crosshair;touch-action:none;box-shadow:0 2px 12px rgba(0,0,0,.35)}
.anot-pie{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-3);
  padding:10px 14px;border-top:1px solid var(--pame-line)}
.anot-hint{font-size:var(--fs-12);color:var(--fg-3)}
.anot-cta{display:flex;gap:var(--sp-2)}
.anot-cta button{width:auto;margin:0}
.anot-text-in{position:fixed;z-index:210;min-width:120px;padding:2px 6px;transform:translate(-2px,-2px);
  font:700 16px system-ui,sans-serif;background:#fff;border:2px solid var(--pame-teal);border-radius:4px}

/* ── Manual interno (pestaña Manual del panel de superadmin) — acordeón <details> ── */
.doc{margin-bottom:var(--sp-2);background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-md)}
.doc > summary{display:flex;align-items:center;gap:var(--sp-2);cursor:pointer;list-style:none;
  padding:12px 16px;font-weight:700;color:var(--pame-ink)}
.doc > summary::-webkit-details-marker{display:none}
.doc > summary::before{content:'▸';color:var(--pame-teal-700);transition:transform .15s}
.doc[open] > summary::before{transform:rotate(90deg)}
.doc[open] > summary{border-bottom:1px solid var(--pame-line)}
.doc-body{padding:14px 16px;font-size:var(--fs-14);color:var(--pame-ink-2);line-height:var(--lh-normal)}
.doc-body p{margin:0 0 10px}
.doc-body p:last-child{margin:0}
.doc-body code{background:var(--pame-bg-soft);padding:1px 5px;border-radius:4px;font-size:var(--fs-13)}
/* Lista de "Mis consultas". */
.pb-tk-head{font-weight:700;margin-bottom:var(--sp-2)}
.pb-tk-num,.sop-num{font-size:var(--fs-12);font-weight:700;color:var(--fg-3);font-variant-numeric:tabular-nums}
.pb-tk{border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:var(--sp-2);margin-bottom:var(--sp-2);background:#fff}
.pb-tk-top{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:4px}
.pb-tk-fecha{font-size:var(--fs-12);color:var(--fg-3)}
.pb-tk-msg{margin:0;font-size:var(--fs-13);color:var(--pame-ink)}
.pb-tk-rta{margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px solid var(--pame-line);font-size:var(--fs-13);color:var(--pame-ink-2)}
.pb-tk-chip{font-size:var(--fs-12);font-weight:700;padding:0 var(--sp-2);border-radius:var(--r-pill)}
.pb-tk-esp{background:var(--pame-orange-10);color:var(--pame-orange)}
.pb-tk-ok{background:var(--pame-teal-20);color:var(--pame-teal-700)}
.pb-tk-cerr{background:var(--pame-bg-soft);color:var(--fg-3)}
.pb-err{background:var(--pame-orange-10);border-color:var(--pame-orange-30);color:var(--pame-ink-2)}
/* La cita "Clase 3 · 24:29" que devuelve el bot. Cuando reconocemos la clase es un
   link que abre el video en ese segundo; si no, queda como texto destacado. */
.pb-cita{display:inline-block;background:var(--pame-teal-20);color:var(--pame-teal-700);
  border-radius:var(--r-pill);padding:0 var(--sp-2);font-size:var(--fs-12);font-weight:600;white-space:nowrap}
a.pb-cita{text-decoration:none;cursor:pointer}
a.pb-cita:hover,a.pb-cita:focus-visible{background:var(--pame-teal-30);color:var(--pame-teal-700)}
/* Acciones al pie de una respuesta técnica del bot (video trabado, clase que no carga):
   recargar la página y escalar a soporte. */
.pb-tecacc{align-self:flex-start;display:flex;gap:var(--sp-2);flex-wrap:wrap}
.pb-tecacc button{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--ctl-h);
  padding:0 var(--sp-3);border-radius:var(--r-pill);font-size:var(--fs-14);font-weight:600;cursor:pointer}
/* Recargar: secundario (el primer paso que sugiere el texto, de un tap). */
.pb-recargar{background:var(--pame-bg-soft);color:var(--pame-ink);border:var(--ctl-bd)}
.pb-recargar:hover,.pb-recargar:focus-visible{border-color:var(--pame-blue);color:var(--pame-blue)}
/* Avisar a soporte: primario. Abre el bloque "Consultá" de la clase o cae al mail. */
.pb-soporte{background:var(--btn-bg);color:#fff;border:0}
.pb-soporte:hover,.pb-soporte:focus-visible{background:var(--btn-bg-h)}
.pb-soporte[disabled]{background:var(--pame-bg-soft);color:var(--pame-ink-2);cursor:default}
/* Los tres puntitos mientras piensa */
.pb-pensando{display:flex;gap:var(--sp-1);align-items:center}
.pb-pensando span{width:var(--sp-2);height:var(--sp-2);border-radius:50%;background:var(--pame-ink-3);
  animation:pb-latido 1.2s infinite ease-in-out}
.pb-pensando span:nth-child(2){animation-delay:.15s}
.pb-pensando span:nth-child(3){animation-delay:.3s}
@keyframes pb-latido{0%,60%,100%{opacity:.25}30%{opacity:1}}
@media (prefers-reduced-motion:reduce){ .pb-pensando span{animation:none;opacity:.5} }

@media (max-width:640px){ .paobot-panel{right:12px;bottom:84px} .paobot-fab{right:14px;bottom:14px} }

/* ============================================================
   PANEL ADMIN — pestañas + editores (Contenido / Avisos / Alumnos / Config)
   ============================================================ */
/* (9) Layout admin estilo Bunny: sidebar azul oscuro con íconos + contenido */
/* Admin dentro del shell: rail principal + menú admin FIJO (como en clase) + contenido */
/* El panel admin NO tiene el rail del alumno: --side-w:0 para que las pestañas y el
   contenido queden pegados al borde izquierdo (antes arrastraban los 295px del rail). */
/* El menú del admin tiene el MISMO ancho que el rail del alumno (--side-w, 295px), para
   que los dos menús se vean iguales. --side-w:0 porque el admin no lleva el rail del alumno. */
body[data-page="admin"],body[data-page="panel"]{--side-w:0px;--sub-w:295px}
/* margin-right:0 anula el `auto` que hereda de `.panel{margin:0 auto}`. footer.js pone
   `sf-sticky` al body (flex column): con margin-right:auto, el panel NO se estira y colapsa
   al ancho de su contenido (se veía en el dashboard del home, de filas angostas; las demás
   secciones lo tapaban con sus tablas anchas). Con margin-right:0 ocupa siempre todo el ancho
   disponible a la derecha del menú lateral. */
body[data-page="admin"] .panel.ancho,body[data-page="panel"] .panel.ancho{margin-left:var(--sub-w);margin-right:0;max-width:none;transition:margin-left var(--t-base)}
.adm-layout{display:flex;gap:var(--sp-6);align-items:flex-start;margin-top:var(--sp-5)}
.adm-content{flex:1;min-width:0}
/* Menú admin en CLARO y FIJO a la derecha del rail (panel al ras, como el de clase) */
.admin-tabs.adm-sidebar{display:flex;flex-direction:column;gap:2px;position:fixed;top:var(--head-h);left:var(--side-w);bottom:0;width:var(--sub-w);z-index:54;
  background:#fff;border:none;border-right:1px solid var(--pame-line);border-radius:0;padding:var(--sp-4) 12px 16px;overflow-y:auto;box-shadow:none;transition:left var(--t-base)}
.admin-tabs.adm-sidebar .admin-tab{display:flex;align-items:center;gap:12px;width:100%;text-align:left;
  background:none;border:none;border-radius:var(--r-md);color:var(--fg-2);font-size:var(--fs-14);
  font-weight:600;padding:12px 14px;margin:0;transition:background var(--t-fast),color var(--t-fast)}
.admin-tabs.adm-sidebar .admin-tab svg{width:20px;height:20px;flex:none;opacity:.85}
.admin-tabs.adm-sidebar .admin-tab:hover{background:var(--pame-blue-10);color:var(--pame-blue-700)}
/* Tab activo: fondo con el MISMO degradé de marca (teal) que los iconos, glifo en
   blanco. El gradiente va como background del botón; el icono se fuerza a #fff. */
.admin-tabs.adm-sidebar .admin-tab.on{background:linear-gradient(180deg,#08ABBB,#0A6E80);color:#fff}
.admin-tabs.adm-sidebar .admin-tab.on svg{opacity:1;fill:#fff}
/* Submenú del grupo activo, debajo de su ítem en la barra lateral (espejo de las sub-pestañas de arriba). */
.adm-side-sub{display:flex;flex-direction:column;gap:2px;margin:2px 0 var(--sp-2) var(--sp-5);padding-left:var(--sp-3);border-left:2px solid var(--pame-line)}
.adm-side-sub-item{background:none;border:none;text-align:left;cursor:pointer;border-radius:var(--r-md);color:var(--fg-2);
  font-size:var(--fs-14);font-weight:600;padding:8px 12px;transition:background var(--t-fast),color var(--t-fast)}
.adm-side-sub-item:hover{background:var(--pame-blue-10);color:var(--pame-blue-700)}
.adm-side-sub-item.on{color:var(--pame-blue-700);background:var(--pame-blue-10)}
body.sub-collapsed .adm-side-sub{display:none}
/* Contador de pendientes en la pestaña (hoy: consultas sin responder). */
.adm-pip{margin-left:auto;flex:none;min-width:var(--sp-5);height:var(--sp-5);padding:0 var(--sp-2);
  display:grid;place-items:center;border-radius:var(--r-pill);background:var(--pame-orange);
  color:#fff;font-size:var(--fs-12);font-weight:800;font-style:normal;line-height:1}
.adm-pip[hidden]{display:none}
.admin-sec{display:none}
.admin-sec.on{display:block}
@media(max-width:820px){
  body[data-page="admin"],body[data-page="panel"]{--sub-w:0px}
  body[data-page="admin"] .panel.ancho,body[data-page="panel"] .panel.ancho{margin-left:0}
  /* `align-items:stretch` (contra el `flex-start` de escritorio) es clave: al pasar
     a columna, sin stretch `.adm-content` toma el ANCHO DE SU CONTENIDO, y una tabla
     con `min-width:760px` (las tablas se vuelven tarjetas recién en ≤720) lo estira
     más que la pantalla → toda la sección se desborda a la derecha en la franja
     721–820px (tablet, o escritorio con zoom). Con stretch queda atado al viewport y
     el scroll lateral de la tabla lo maneja `.tabla-wrap{overflow-x:auto}`. */
  .adm-layout{flex-direction:column;align-items:stretch}
  /* En el celular la navegación del panel es la BARRA INFERIOR (bottomnav.js):
     el menú lateral de pestañas se esconde. Ver el bloque "NAVEGACIÓN INFERIOR". */
  .admin-tabs.adm-sidebar{display:none}
}
/* ── Barra lateral del admin contraíble ───────────────────────────────────── */
/* Botón de contraer/expandir: fila discreta arriba de la barra. */
.adm-collapse{display:flex;align-items:center;gap:10px;width:100%;border:none;background:none;color:var(--text-muted);
  cursor:pointer;padding:9px 14px;border-radius:var(--r-md);font:inherit;font-size:var(--fs-12);font-weight:700;
  letter-spacing:.02em;text-transform:uppercase;margin-bottom:6px;transition:background var(--t-fast),color var(--t-fast)}
.adm-collapse:hover{background:var(--surface-hover);color:var(--navy-700)}
.adm-collapse svg{width:17px;height:17px;flex:none;transition:transform var(--t-base) var(--ease-out)}

/* Modo contraído: solo íconos, en botones cuadrados redondeados y centrados.
   Es un modo de la barra VERTICAL de desktop: se envuelve en min-width:821px para
   que NO se filtre al carrusel móvil (si no, un panel que quedó contraído en compu
   mostraba las pestañas del celular como íconos mudos). */
body.sub-collapsed{--sub-w:74px}
@media(min-width:821px){
  body.sub-collapsed .admin-tabs.adm-sidebar{padding:var(--sp-4) 0;gap:6px;align-items:center}
  body.sub-collapsed .admin-tabs.adm-sidebar .admin-tab{position:relative;width:46px;height:46px;padding:0;gap:0;
    justify-content:center;border-radius:var(--r-md)}
  body.sub-collapsed .admin-tabs.adm-sidebar .admin-tab svg{width:22px;height:22px;opacity:.9}
  body.sub-collapsed .admin-tabs.adm-sidebar .admin-tab.on svg{opacity:1}
  body.sub-collapsed .admin-tabs.adm-sidebar .admin-tab span{display:none}
  body.sub-collapsed .adm-collapse{width:46px;height:46px;justify-content:center;padding:0;margin:0 auto 8px}
  body.sub-collapsed .adm-collapse span{display:none}
  body.sub-collapsed .adm-collapse svg{transform:rotate(180deg)}
  /* el contador de pendientes queda como puntito sobre el ícono */
  body.sub-collapsed .adm-pip{position:absolute;margin:0;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;font-size:10px;box-shadow:0 0 0 2px var(--surface-card)}
}
@media(max-width:820px){ body.sub-collapsed{--sub-w:0px} }
.adm-msg{font-size:var(--fs-12);margin-left:8px}
.adm-msg.ok{color:var(--pame-teal-700)}
.adm-msg.no{color:var(--pame-danger)}
/* Estado "trabajando": mientras dura una acción larga (duplicar clase/módulo/
   formación) el aviso se agranda al porte de un control y suma un aro que gira,
   para que no pase inadvertido al lado del botón. */
.adm-msg.busy{ display:inline-flex; align-items:center; gap:var(--sp-2);
  font-size:var(--fs-15); font-weight:700; color:var(--pame-blue); margin-left:var(--sp-3) }
.adm-msg.busy::before{ content:""; flex:none; width:var(--fs-15); height:var(--fs-15);
  box-sizing:border-box; border-radius:var(--r-pill);
  border:2px solid var(--pame-blue-30); border-top-color:var(--pame-blue);
  animation:prov-spin .8s linear infinite }

/* Facturación (ARCA): paso a paso + estado + tabla de comprobantes */
.fact-estado{font-size:var(--fs-14);color:var(--fg-2);background:var(--bg-2);border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-3)}
.fact-estado.ok{color:var(--pame-teal-700);border-color:var(--pame-teal-700)}
.fact-err{font-size:var(--fs-13);color:var(--pame-danger);margin-top:var(--sp-3)}
.fact-steps{margin:var(--sp-3) 0 0;padding-left:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-3);font-size:var(--fs-14);color:var(--fg-2)}
.fact-steps li{line-height:1.5}
.fact-code{background:var(--fg-1);color:#fff;font-size:var(--fs-12);padding:var(--sp-3);border-radius:var(--r-sm);overflow-x:auto;white-space:pre;margin:var(--sp-2) 0}
.fact-tabla{width:100%;border-collapse:collapse;font-size:var(--fs-13);margin-top:var(--sp-2)}
.fact-tabla th{text-align:left;font-size:var(--fs-12);text-transform:uppercase;letter-spacing:.02em;color:var(--fg-3);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--pame-line)}
.fact-tabla td{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--pame-line);color:var(--fg-2)}
.fact-badge{display:inline-block;font-size:var(--fs-12);font-weight:700;padding:2px 8px;border-radius:999px;background:var(--bg-2);color:var(--fg-3)}
.fact-badge.ok{background:var(--pame-teal-50, #e6f4f1);color:var(--pame-teal-700)}
.fact-badge.err{background:#fdecea;color:var(--pame-danger)}

/* Barra de acciones + botones semánticos reutilizables */
.adm-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:var(--sp-5)}
.adm-bar .grow{flex:1}
/* Alto de todos los botones y selects = --ctl-h (ui.css), para que apoyen
   en la misma línea base que los inputs cuando comparten una fila. */
.btn-add{background:var(--pame-teal);color:#fff;width:auto;padding:4px 14px;margin:0;font-size:var(--fs-12);
  min-height:var(--ctl-h);border-radius:var(--ctl-r)}
.btn-add:hover{background:var(--pame-teal-700)}
.btn-del{background:none;border:var(--ctl-bd);color:var(--pame-danger);width:auto;padding:4px 14px;
  margin:0;font-size:var(--fs-12);min-height:var(--ctl-h);border-radius:var(--ctl-r)}
.btn-del:hover{border-color:var(--pame-danger);background:#fdecea}
.btn-mini{background:#fff;border:var(--ctl-bd);color:var(--pame-blue);width:auto;padding:4px 14px;
  margin:0;font-size:var(--fs-12);min-height:var(--ctl-h);border-radius:var(--ctl-r)}
.btn-mini:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
/* Botón chico que además es un interruptor (Cert: Sí/No, Destacada: Sí/No).
   `.on` = la opción está activa. Antes esto se pintaba con un style="…" armado
   en el JS; ahora es una clase. */
.btn-mini.on{background:var(--pame-teal-10);color:var(--pame-teal-700);border-color:var(--pame-teal-30)}
.btn-mini.on:hover{background:var(--pame-teal-20);border-color:var(--pame-teal)}
/* Botón de solo ícono: el ✎ de editar, en cualquier fila o tabla. La palabra
   "Editar" repetida por fila es ruido; lo que dice va en title + aria-label
   (el title lo muestra el navegador al pasar el mouse, el aria lo lee el lector
   de pantalla). Cuadrado, del mismo alto que el resto de los controles. */
.btn-ico{padding:4px;min-width:var(--ctl-h);font-size:var(--fs-14);line-height:1;display:inline-flex;align-items:center;justify-content:center}
/* En el CELULAR los botones de solo-ícono muestran su etiqueta (del aria-label que
   ya tienen): así se entiende qué hace cada lapicito/ojo, y son más grandes para el
   dedo. En computadora quedan como ícono (el título se ve al pasar el mouse). */
@media(max-width:720px){
  button.btn-ico[aria-label],a.btn-ico[aria-label]{width:auto;min-width:0;gap:8px;
    padding:10px 14px;min-height:42px;justify-content:flex-start}
  button.btn-ico[aria-label]::after,a.btn-ico[aria-label]::after{content:attr(aria-label);
    font-size:var(--fs-14);font-weight:600;white-space:normal;text-align:left}
}
.adm-select{font-family:var(--font-sans);font-size:var(--fs-14);min-height:var(--ctl-h);
  padding:0 var(--ctl-px);border:var(--ctl-bd);
  border-radius:var(--ctl-r);background:#fff;color:var(--fg-1)}

/* Tarjetas de módulo / clase en el árbol de contenido */
.adm-mod{border:1px solid var(--pame-line);border-radius:var(--r-md);background:#fff;margin-bottom:var(--sp-4);overflow:hidden}
.adm-mod-head{display:flex;align-items:center;gap:10px;padding:12px 14px;background:var(--pame-bg-soft);
  border-bottom:1px solid var(--pame-line);flex-wrap:wrap}
.adm-mod-head .t{font-weight:700;font-size:var(--fs-16);color:var(--fg-1);flex:1;min-width:120px}
.adm-mod-head .drip{font-size:var(--fs-12);color:var(--pame-blue-700);background:var(--pame-blue-10);
  padding:3px 10px;border-radius:var(--r-pill);font-weight:700}
/* Módulo marcado como sección destacada (va arriba de todo en la vista del alumno) */
.adm-mod-head .dest-chip{background:var(--pame-orange-20);color:var(--pame-orange-600);
  border:1px solid var(--pame-orange-30)}
/* Módulo/encuentro "en vivo": sale por fecha, sin repesca de los anteriores */
.vivo-chip{background:var(--danger-10,rgba(220,38,38,.10));color:var(--danger,#dc2626);
  border:1px solid var(--danger-30,rgba(220,38,38,.30))}
/* Encuentro en vivo aún por salir, en el temario del alumno */
.side-prox{margin-left:auto;font-size:var(--fs-xs,.72rem);font-weight:700;
  color:var(--danger,#dc2626);white-space:nowrap}
/* Contraer/expandir módulos en la visión general del admin */
.adm-fold{background:none;border:1px solid var(--pame-line);color:var(--fg-2);width:26px;height:26px;padding:0;
  border-radius:var(--r-sm);cursor:pointer;font-size:11px;line-height:1;flex:none;
  transition:transform var(--t-fast) var(--ease-out)}
.adm-fold:hover{border-color:var(--pame-blue);color:var(--pame-blue);background:var(--pame-blue-10)}
.adm-mod.plegado .adm-fold{transform:rotate(-90deg)}
.adm-mod.plegado .adm-clase-list{display:none}
.adm-mod.plegado .adm-mod-head{border-bottom:none}
.adm-mod-thumb{width:52px;height:30px;object-fit:cover;border-radius:4px;border:1px solid var(--pame-line);flex:none}
.adm-mod-n{font-size:var(--fs-12);color:var(--fg-3);font-weight:700;flex:none}
.mods-bar{margin-bottom:var(--sp-3)}

.adm-clase-list{list-style:none;margin:0;padding:6px}
.adm-clase{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--r-sm);flex-wrap:wrap}
.adm-clase + .adm-clase{border-top:1px solid var(--pame-line)}
.adm-clase .n{font-size:var(--fs-12);color:var(--fg-3);font-weight:700;flex:none;width:22px}
.adm-clase .t{flex:1 1 180px;min-width:150px;font-size:var(--fs-14);color:var(--fg-1);font-weight:600}
.adm-clase .badges{display:flex;gap:5px;flex-wrap:wrap;flex:none;margin-left:auto}
.adm-badge{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.03em;padding:2px 7px;
  border-radius:var(--r-pill);background:var(--pame-blue-10);color:var(--pame-blue-700)}
.adm-badge.sim{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.adm-badge.quiz{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.adm-badge.off{background:var(--pame-bg-soft);color:var(--fg-3)}
/* Etiquetas de contenido: presente = verde, ausente = tachado */
.adm-badge.tag-on{background:rgba(46,154,107,.14);color:var(--pame-success)}
.adm-badge.tag-off{background:transparent;color:var(--fg-3);border:1px solid var(--pame-line);text-decoration:line-through;opacity:.7}
.adm-badge.tag-drip{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.adm-empty{color:var(--fg-3);font-size:var(--fs-14);padding:14px;text-align:center}

/* Editor (clase / aviso / config) — bloque de formulario */
.adm-editor{border:1px solid var(--pame-line);border-radius:var(--r-md);background:#fff;padding:var(--sp-5);margin-top:var(--sp-4)}
.adm-editor h3{margin:0 0 4px;font-size:var(--fs-20)}
.adm-editor .sub{color:var(--fg-3);font-size:var(--fs-14);margin:0 0 var(--sp-4)}
.adm-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
/* Fechas con labels de distinto alto (uno tiene la nota del huso): alinea los inputs abajo. */
.adm-grid--end{align-items:end}
.adm-grid .full{grid-column:1 / -1}
/* Cupones: los campos alinean su input abajo, así una etiqueta con sub-nota
   (“Moneda (solo monto fijo)”, 2 líneas) no deja el campo desfasado respecto al de al lado. */
.cp-grid{align-items:end}

/* Constructor de encuesta (item 12) */
.enc-q{border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;padding:10px 12px;margin-bottom:10px}
.enc-q.dragging{opacity:.5}
.enc-q.over{outline:2px dashed var(--brand);outline-offset:-2px}
.enc-q-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.enc-q-grip{flex:none;display:inline-grid;place-items:center;color:var(--fg-3);cursor:grab;padding:2px}
.enc-q-grip:active{cursor:grabbing}
.enc-q-n{flex:none;width:22px;height:22px;border-radius:50%;background:var(--pame-bg-soft);color:var(--fg-2);
  font-size:var(--fs-12);font-weight:700;display:grid;place-items:center}
.enc-q-txt{flex:1;min-width:160px}
.enc-q-tipo{width:auto;flex:none}
.enc-q-mov{flex:none;display:inline-flex;gap:2px}
.enc-q-mov .btn-mini{padding:2px 6px;line-height:1;min-width:26px}
.enc-q-mov .btn-mini:disabled{opacity:.35;cursor:not-allowed}
.enc-q-ops{margin-top:8px;padding-left:30px;display:flex;flex-direction:column;gap:4px}
.enc-q-opsin{width:100%;box-sizing:border-box}
.enc-q-del{flex:none}
/* Previsualización de la encuesta (modal admin) */
.encp-card{width:672px;max-width:calc(100vw - 32px)}
.encp-card .sub{margin:2px 0 16px;color:var(--fg-3);font-size:var(--fs-13)}
.encp-qs{max-height:60vh;overflow:auto;margin-bottom:6px;padding-right:4px}
.encp-q{background:var(--pame-bg-soft);border:1px solid var(--pame-line);border-radius:var(--r-sm);
  padding:14px 16px;margin-bottom:12px;display:flex;flex-direction:column;gap:10px}
.encp-q .encp-lbl{display:flex;gap:10px;align-items:flex-start;font-size:var(--fs-15);font-weight:600;
  color:var(--fg-1);margin:0;text-transform:none;letter-spacing:0;line-height:1.35}
.encp-q .encp-lbl .encp-num{flex:none;width:24px;height:24px;border-radius:50%;background:var(--pame-teal);
  color:#fff;font-size:var(--fs-12);font-weight:700;display:grid;place-items:center;margin-top:1px}
.encp-stars{display:flex;gap:8px;font-size:30px;color:var(--pame-line);cursor:default;user-select:none}
.encp-stars span{transition:color var(--t-fast),transform var(--t-fast)}
.encp-stars:hover span{color:#f5b301}
.encp-stars span:hover ~ span{color:var(--pame-line)}
.encp-ops{display:flex;flex-direction:column;gap:8px}
.encp-ops label{display:flex;align-items:center;gap:10px;font-size:var(--fs-14);color:var(--fg-1);
  font-weight:500;text-transform:none;letter-spacing:0;padding:8px 10px;background:#fff;
  border:1px solid var(--pame-line);border-radius:var(--r-sm)}
.encp-ops label input{margin:0}
.encp-txt{width:100%;box-sizing:border-box;border:1px solid var(--pame-line);border-radius:var(--r-sm);
  padding:10px 12px;font-family:inherit;font-size:var(--fs-14);resize:vertical;background:#fff;color:var(--fg-1);min-height:72px}
.encp-txt:focus{outline:none;border-color:var(--pame-teal);box-shadow:0 0 0 3px rgba(0,168,193,.18)}

/* Vista admin de feedback por módulo (item 13) y respuestas de encuesta (item 12) */
.fb-mod{border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;padding:10px 12px;margin-bottom:10px}
.fb-mod-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.fb-mod-prom{margin-left:auto;white-space:nowrap;font-weight:700}
.fb-com{font-size:var(--fs-14);color:var(--fg-1);padding:4px 0;border-top:1px solid var(--pame-line)}
.enc-curso{border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;padding:8px 12px;margin-bottom:10px}
.enc-curso summary{cursor:pointer;font-weight:700;color:var(--fg-1)}
.enc-r{border-top:1px solid var(--pame-line);padding:8px 0;margin-top:8px}
.enc-r-head{margin-bottom:4px}
.enc-r-q{display:flex;justify-content:space-between;gap:16px;padding:2px 0}
.enc-r-q > span:last-child{text-align:right}

/* CTA "Generar / Ver tu certificado" en el encabezado del curso (alumno).
   Va al lado de "Continuar con la clase" y en estilo OUTLINE (contorno) para que se
   distinga del botón principal relleno, no como un duplicado. */
.ch-acciones{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:var(--sp-4)}
.cert-cta{margin:0}
.cert-cta:empty{display:none}
.cert-cta-btn{display:inline-flex;align-items:center;gap:8px;
  padding:11px 22px;border:2px solid var(--pame-orange);border-radius:var(--r-pill);cursor:pointer;
  background:#fff;color:var(--pame-orange);font-family:var(--font-sans);font-size:var(--fs-14);
  font-weight:800;text-decoration:none;transition:background var(--t-fast),color var(--t-fast)}
.cert-cta-btn:hover{background:var(--pame-orange);color:#fff}
.cert-cta-btn:disabled{opacity:.6;cursor:default}
.adm-field{display:flex;flex-direction:column;gap:var(--gap-fld);margin-bottom:14px}
/* La etiqueta de un campo va en versalitas; la de un check no: ahí el texto es la
   opción que se lee al lado de la casilla, no el rótulo de un control de abajo. */
.adm-field > label:not(.adm-check){font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
/* Etiqueta de una OPCIÓN alternativa de fuente ("… o pegá el link", "… o traelo"):
   legible, sin la mayúscula diminuta que no se lee cuando hace de cartel de opción. */
.adm-field > label.op-alt{font-size:var(--fs-15);text-transform:none;letter-spacing:0;color:var(--fg-1)}
/* Fuera de acá quedan los controles que no son "una caja de ancho completo":
   - el selector de color, que estila `.ui-color` (ui.css §4) con su propio ancho;
   - las casillas y los radios, que miden 18px y los estila `.adm-check input`.
   Sin estas exclusiones el width:100% + min-height de acá los estira a lo ancho del
   campo y empuja el texto de la opción fuera de la pantalla. */
.adm-field input:not([type=color]):not([type=checkbox]):not([type=radio]),.adm-field textarea,.adm-field select{font-family:var(--font-sans);font-size:var(--fs-14);
  padding:8px var(--ctl-px);border:var(--ctl-bd);border-radius:var(--ctl-r);background:#fff;color:var(--fg-1);width:100%}
.adm-field input:not([type=color]):not([type=checkbox]):not([type=radio]),.adm-field select{min-height:var(--ctl-h);padding-top:0;padding-bottom:0}
.adm-field input.err,.adm-field select.err,.adm-field textarea.err{border-color:var(--pame-danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--pame-danger) 18%,transparent)}
.adm-acciones{display:flex;gap:8px;justify-content:flex-end;white-space:nowrap}
.adm-field textarea{resize:vertical;min-height:90px;line-height:var(--lh-normal)}
.adm-field textarea.tall{min-height:180px;font-family:var(--font-mono);font-size:var(--fs-14)}
/* Editor de subtítulos (modal Pro): video a la izquierda, líneas editables a la derecha */
.dup-card.sub-modal{width:1360px}
.sub-grid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);gap:16px;margin-top:10px;align-items:start}
@media(max-width:760px){.sub-grid{grid-template-columns:1fr}}
.sub-player{aspect-ratio:16/9;background:#000;border-radius:var(--r-sm);overflow:hidden}
.sub-player iframe{width:100%;height:100%;border:0;display:block}
.sub-cues{max-height:60vh;overflow-y:auto;border:1px solid var(--pame-line);border-radius:var(--r-sm)}
.sub-cue{display:grid;grid-template-columns:3.4rem 1fr;gap:10px;align-items:start;padding:8px 12px;border-top:1px solid var(--pame-line)}
.sub-cue:first-child{border-top:0}
.sub-t{font-family:var(--font-mono);font-size:var(--fs-12);cursor:pointer;padding:6px 6px;border-radius:var(--r-xs);text-align:left;white-space:nowrap;margin-top:3px}
/* Override del button:hover global: sin esto el tiempo queda oscuro sobre oscuro (ilegible) */
.sub-t,.sub-t:hover,.sub-t:focus,.sub-t:active{background:transparent;color:var(--pame-blue);border:0;box-shadow:none}
.sub-t:hover{background:var(--pame-blue-10)}
.sub-cue textarea{width:100%;resize:none;overflow:hidden;font-family:var(--font-sans);font-size:var(--fs-13);line-height:var(--lh-normal);padding:8px var(--ctl-px);border:var(--ctl-bd);border-radius:var(--ctl-r);background:#fff;color:var(--fg-1)}
.sub-cue textarea:focus{outline:none;border-color:var(--pame-blue);box-shadow:0 0 0 3px var(--pame-blue-10)}
.sub-spin{display:inline-block;width:14px;height:14px;border:2px solid color-mix(in srgb,#fff 40%,transparent);border-top-color:#fff;border-radius:50%;animation:prov-spin .8s linear infinite;vertical-align:-2px;margin-right:8px}
.adm-field .nota{font-size:var(--fs-11);color:var(--fg-3);font-weight:400;text-transform:none;letter-spacing:0}
/* Estado tranquilizador ("ya podés cerrar, esto sigue solo"): la misma línea de
   estado del video, pero destacada para que se lea como un permiso, no como letra chica.
   En verde —vía libre, ya quedó guardado— para que se lea como "listo", no como aviso. */
.adm-field .nota.nota-fuerte{font-size:var(--fs-16);color:var(--pame-success);font-weight:700;
  background:var(--success-soft);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-sm)}
/* Advertencia mientras SUBE el archivo ("no cierres la pestaña") y errores de archivo:
   tiene que frenar el ojo. Rojo, con ícono de advertencia, sobre su fondo. */
.adm-field .nota.nota-alerta{font-size:var(--fs-16);color:var(--pame-orange-600);font-weight:700;
  background:var(--pame-orange-10);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-sm)}
.adm-field .nota.nota-peligro{display:flex;align-items:center;gap:var(--sp-2);
  font-size:var(--fs-16);color:var(--pame-danger);font-weight:700;
  background:var(--danger-soft);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-sm)}
.adm-field .nota.nota-peligro .ic{flex:none}
/* La casilla, la opción y su aclaración van en una línea. Si la aclaración es larga y
   no entra, baja entera al renglón siguiente (flex-wrap) en vez de partir en dos el
   nombre de la opción, que es lo que se lee primero. */
.adm-check{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:9px;font-size:var(--fs-14);color:var(--fg-1);
  font-weight:600;text-transform:none;letter-spacing:0;cursor:pointer}
/* `.adm-field`/`.adm-check` traen display:flex, que le gana al `display:none` del
   atributo [hidden] del navegador (misma specificity, la clase va después). Sin esto,
   un campo con `hidden` (p. ej. el 2º color de la oferta cuando el fondo es plano) NO
   se oculta. Esta regla, más específica, hace que `hidden` siempre gane. */
.adm-field[hidden],.adm-check[hidden]{display:none}
.adm-check .nota{min-width:0}
.adm-check h4{text-transform:none}
/* Dentro de un .adm-field el check ya viene espaciado por el grid del formulario:
   sin esto arrastra el margen de `label` y queda desalineado con la fila de al lado. */
.adm-field > .adm-check{margin:0}
.adm-check input{width:18px;height:18px;flex:none;accent-color:var(--pame-teal);cursor:pointer}
.adm-sub-block{border:1px dashed var(--pame-line);border-radius:var(--r-md);padding:var(--sp-4);margin-top:var(--sp-4);background:var(--pame-bg-soft)}
.adm-sub-block > .bh{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:var(--sp-3)}
.adm-sub-block h4{margin:0;font-size:var(--fs-16)}
/* Ícono chico al lado del título de un bloque/panel (reemplaza a los emojis). */
.bh-ico{width:18px;height:18px;vertical-align:-3px;color:var(--pame-teal);flex:none}
.cp-head{display:flex;align-items:center;gap:8px;margin:0}
/* Pop-up: los campos de una fila alinean sus inputs abajo, aunque un label ocupe
   dos renglones (p. ej. "· vacío = sin botón"). Así no quedan escalonados. */
#sec-popup .adm-grid{align-items:end}
/* Editores con labels que traen .nota (se van a dos renglones y desalinean
   el input del compañero de fila): alinear inputs abajo. */
#av-editor .adm-grid,
#vv-editor .adm-grid{align-items:end}
.adm-actions{display:flex;align-items:center;gap:12px;margin-top:var(--sp-5);flex-wrap:wrap}
.adm-actions button{width:auto;padding:12px 22px;margin:0}
.adm-actions .grow{flex:1}

/* Quiz editor */
.adm-preg{border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff;padding:12px 14px;margin-bottom:12px}
.adm-preg-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.adm-preg-head .qn{font-weight:700;color:var(--fg-3);font-size:var(--fs-12);flex:none}
.adm-preg-head input{flex:1}
/* "Respuesta múltiple": va entre el enunciado y las opciones, sangrado como ellas */
.p-multi-lab{margin:0 0 var(--sp-2);padding-left:var(--sp-1)}
.adm-op{display:flex;align-items:center;gap:9px;margin:6px 0}
.adm-op input[type=radio]{width:18px;height:18px;flex:none;accent-color:var(--pame-teal)}
.adm-op input[type=text]{flex:1}
.adm-op .ok-lab{font-size:11px;color:var(--pame-teal-700);font-weight:700;flex:none}

/* Materiales / inscripciones / notas — filas simples */
.adm-row{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap}
.adm-row input:not([type=checkbox]):not([type=radio]):not([type=color]),.adm-row select{
  font-size:var(--fs-14);min-height:var(--ctl-h);height:var(--ctl-h);
  padding:0 var(--ctl-px);border:var(--ctl-bd);
  border-radius:var(--r-sm);background:#fff;color:var(--fg-1)}
.adm-row .flex1{flex:1;min-width:120px}
/* Campo no editable (grisado): mismo criterio que el email de "Mi cuenta". Se destraba
   con su botón "Modificar". */
.adm-row input:disabled,.adm-field input:disabled{
  background:var(--pame-bg-soft);color:var(--fg-3);cursor:default}

/* Drawer de gestión de alumno */
.adm-drawer-bg{position:fixed;inset:0;background:rgba(2,51,77,.34);z-index:90;display:none}
.adm-drawer-bg.open{display:block}
/* Modal "Duplicar clase" */
.dup-ov{position:fixed;inset:0;background:rgba(2,51,77,.34);z-index:95;display:none;align-items:flex-start;justify-content:center;padding:56px 16px;overflow:auto}
.dup-ov.open{display:flex}
.dup-card{background:var(--pame-bg);border-radius:16px;padding:20px 24px 22px;width:520px;max-width:100%;box-shadow:var(--shadow-lg)}
.dup-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.dup-head h3{margin:0;font-size:var(--fs-20)}
.dup-x{background:none;border:0;font-size:18px;line-height:1;cursor:pointer;color:var(--fg-3);padding:4px}
.dup-card .sub{margin:4px 0 14px}
/* Modal diseñado (uiConfirm / uiAlert) — reemplaza los confirm/alert nativos. Centrado. */
.dup-ov.uimodal{align-items:center}
.uimodal-card{width:460px;padding:26px 26px 22px}
.uimodal-tit{margin:0 0 8px;font-size:var(--fs-20);color:var(--fg-1)}
.uimodal-body{margin:0;color:var(--fg-2);line-height:var(--lh-normal);font-size:var(--fs-14)}
.uimodal-dato{margin-top:14px;padding:12px 14px;background:var(--pame-bg-soft);border:1px solid var(--pame-line);
  border-radius:var(--r-md);display:flex;flex-direction:column;gap:4px;font-size:var(--fs-14);color:var(--fg-1);font-weight:700}
.uimodal-input{width:100%;height:var(--ctl-h);margin-top:14px;padding:0 14px;border:1.5px solid var(--pame-line);
  border-radius:var(--r-md);background:#fff;color:var(--fg-1);font-size:var(--fs-14);font-family:inherit;box-sizing:border-box}
.uimodal-input:focus{outline:none;border-color:var(--pame-blue)}
textarea.uimodal-input{height:auto;min-height:calc(var(--ctl-h) * 2.4);padding:12px 14px;resize:vertical;line-height:var(--lh-normal)}
.uimodal-foot{display:flex;justify-content:flex-end;gap:10px;margin-top:20px;flex-wrap:wrap}
/* Utilitarias de color para textos cortos de estado (éxito / error) — reusan tokens. */
.c-ok{color:var(--pame-teal-700)}
.c-danger{color:var(--pame-danger)}
/* Botón "Guardar" con cambios pendientes: se destaca visualmente para invitar al click.
   Reusa la clase .lbb-dirty (landing-builder) para que cualquier botón .btn-add pueda marcarla. */
.btn-add.lbb-dirty{background:var(--pame-teal-10);border-color:var(--pame-teal);color:var(--pame-teal-700);font-weight:800;box-shadow:0 0 0 3px rgba(15,168,184,.14)}
.btn-add.lbb-dirty:hover{background:var(--pame-teal);color:#fff}
/* Toast de confirmación (uiToast). Vive en <body>, sobrevive a re-renders y cierres de modal. */
.ui-toast-stack{position:fixed;right:16px;bottom:16px;z-index:110;display:flex;flex-direction:column;gap:8px;pointer-events:none}
.ui-toast{display:inline-flex;align-items:center;gap:10px;padding:12px 16px;border-radius:var(--r-md);
  background:#fff;border:1px solid var(--pame-line);box-shadow:var(--shadow-md);
  font-size:var(--fs-14);font-weight:700;color:var(--fg-1);line-height:1.2;
  opacity:0;transform:translateY(8px);transition:opacity var(--t-med),transform var(--t-med);max-width:min(92vw,420px)}
.ui-toast.is-in{opacity:1;transform:translateY(0)}
.ui-toast.is-out{opacity:0;transform:translateY(-4px)}
.ui-toast-ic{width:26px;height:26px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}
.ui-toast-tx{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ui-toast--ok .ui-toast-ic{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.ui-toast--ok{border-color:var(--pame-teal-10)}
.ui-toast--no .ui-toast-ic{background:var(--danger-soft,#fdecea);color:var(--pame-danger)}
.ui-toast--no{border-color:var(--danger-soft,#fdecea)}
@media (max-width:640px){
  .ui-toast-stack{right:8px;left:8px;bottom:calc(8px + env(safe-area-inset-bottom,0px));align-items:stretch}
  .ui-toast{width:100%;max-width:100%}
  .ui-toast-tx{white-space:normal}
}
/* "Mis compras": tarjetas de compras y suscripciones (grandes y ordenadas). */
.mc-list{display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-3)}
.mc-item{background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-md);
  padding:18px 20px;box-shadow:var(--shadow-sm)}
.mc-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.mc-tit{font-size:var(--fs-18);font-weight:800;color:var(--fg-1);line-height:1.25}
.mc-sub{margin-top:6px;font-size:var(--fs-14);color:var(--fg-2);line-height:var(--lh-normal)}
.mc-sub a{color:var(--pame-blue);font-weight:700}
.mc-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}
.mc-actions button{height:var(--ctl-h);padding:0 18px;border-radius:var(--r-md);border:1.5px solid var(--pame-line);
  background:#fff;color:var(--fg-1);font-weight:700;font-size:var(--fs-14);font-family:inherit;cursor:pointer;
  transition:border-color var(--t-fast),background var(--t-fast),color var(--t-fast)}
.mc-actions button:hover{border-color:var(--pame-blue);color:var(--pame-blue);background:var(--pame-blue-10)}
.mc-actions button:disabled{opacity:.6;cursor:default}
.mc-actions .sub-renew,.mc-actions .sub-reactivar{background:var(--pame-teal);border-color:var(--pame-teal);color:#fff}
.mc-actions .sub-renew:hover,.mc-actions .sub-reactivar:hover{background:var(--pame-teal-700);border-color:var(--pame-teal-700);color:#fff}
.mc-empty{background:var(--pame-bg-soft);border:1px dashed var(--pame-line);border-radius:var(--r-md);
  padding:18px 20px;color:var(--fg-2);font-size:var(--fs-14);line-height:var(--lh-normal);margin-top:var(--sp-3)}
.mc-sec-tit{font-size:var(--fs-20);font-weight:800;color:var(--fg-1);margin:var(--sp-6) 0 0}
/* Configuración del módulo (crear/editar): campos a la izquierda, portada a la derecha */
.dup-card.mc-card{width:960px}
.mc-grid{display:grid;grid-template-columns:1fr auto;gap:var(--sp-7);align-items:start;margin-top:var(--sp-4)}
.mc-main{min-width:0}
.mc-main .adm-check{margin-bottom:var(--sp-2)}
/* Rótulo de un bloque (mismo estilo que la etiqueta de un .adm-field) */
.mc-block{margin-bottom:var(--sp-4)}
.mc-lbl{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2);margin-bottom:var(--gap-fld)}
.mc-portada{display:flex;flex-direction:column;gap:var(--gap-fld);width:180px}
.mc-portada > label{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
.mc-portada .btn-mini{width:100%}
.mc-thumb{width:180px;height:110px;border-radius:var(--r-md);border:1px solid var(--pame-line);overflow:hidden;display:grid;place-items:center;background:var(--pame-bg-soft)}
.mc-thumb img{width:100%;height:100%;object-fit:cover}
.mc-thumb-ph{font-size:var(--fs-32);opacity:.4}
.mc-grupos{margin-left:var(--sp-5);margin-top:var(--sp-1)}
.mc-grupos.off{opacity:.45}
/* Drip por grupo: una fila por grupo del curso con un input numérico (o vacío = usa el drip global) */
.mc-drip-grupos{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-1)}
.mc-drip-g{display:flex;align-items:center;gap:var(--sp-2)}
.mc-drip-g input{width:88px}
.mc-drip-g .nota{color:var(--fg-2)}
/* Selector de confeti por módulo: chips de preset + campo de emojis propios */
.mc-cf-presets{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.mc-cf-chip{display:inline-flex;flex-direction:column;align-items:center;gap:2px;
  min-width:64px;padding:var(--sp-2) var(--sp-3);cursor:pointer;
  background:var(--bg-1);border:var(--ctl-bd);border-radius:var(--r-md);
  transition:border-color var(--t-fast) var(--ease-out),background var(--t-fast) var(--ease-out)}
.mc-cf-chip:hover{border-color:var(--pame-teal-60);background:var(--pame-teal-10)}
.mc-cf-chip.on{border-color:var(--pame-teal);background:var(--pame-teal-10);box-shadow:inset 0 0 0 1px var(--pame-teal)}
.mc-cf-emo{font-size:var(--fs-20);line-height:1}
.mc-cf-lbl{font-size:var(--fs-12);font-weight:700;color:var(--fg-2)}
/* .adm-field/.adm-check fijan display:flex, que le gana al [hidden] nativo */
.mc-grid [hidden]{display:none!important}
/* Misma guarda para las cajas de la escala de TP (numérica ↔ conceptual): la
   .adm-field oculta con [hidden] necesita el !important o el display:flex la pisa. */
.tp-box[hidden]{display:none!important}
@media (max-width:1000px){.dup-card.mc-card{width:100%}}
@media (max-width:720px){.mc-grid{grid-template-columns:1fr}.mc-portada{width:100%}.mc-thumb{width:100%}}

/* Editor de clase — paso 1 (elegir formato) y paso 2 (formulario) */
.ed-picker{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:var(--sp-4);margin-top:var(--sp-4)}
.ed-fmt{display:flex;flex-direction:column;align-items:flex-start;gap:var(--sp-2);text-align:left;padding:var(--sp-5);
  border:var(--ctl-bd);border-radius:var(--r-md);cursor:pointer;transition:border-color .12s,box-shadow .12s,transform .12s}
/* Gana al button/button:hover global (que pinta el fondo azul lleno): la tarjeta
   queda siempre clara con texto oscuro; el hover solo mueve el borde y la sombra. */
.ed-fmt,.ed-fmt:hover,.ed-fmt:focus,.ed-fmt:active{background:var(--pame-bg);color:var(--fg-1)}
.ed-fmt:hover{border-color:var(--pame-teal);box-shadow:var(--shadow-sm);transform:translateY(-2px)}
/* Tarjeta elegida (picker de método de carga de video): borde teal + fondo suave. */
.ed-fmt.sel,.ed-fmt.sel:hover,.ed-fmt.sel:focus,.ed-fmt.sel:active{border-color:var(--pame-teal);background:var(--pame-teal-10);box-shadow:var(--shadow-sm)}
.ed-fmt-ic{font-size:var(--fs-32);line-height:1}
.ed-fmt-t{font-size:var(--fs-16);font-weight:700;color:var(--fg-1)}
.ed-fmt-d{font-size:var(--fs-13);color:var(--fg-3);font-weight:400}
/* Método no disponible todavía (p. ej. Zoom sin conectar): la tarjeta queda
   apagada pero se puede tocar igual, para que el panel explique cómo activarlo. */
.ed-fmt--off{opacity:.55}
.ed-fmt--off .ed-fmt-ic{filter:grayscale(1)}
.ed-fmt--off:hover{border-color:var(--pame-line);box-shadow:none;transform:none}
.ed-head{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.ed-head h3{margin:0}
.ed-formato{display:inline-flex;align-items:center;gap:var(--sp-2);font-weight:700;color:var(--fg-2)}
.ed-fold{border:1px solid var(--pame-line);border-radius:var(--r-md);margin-top:var(--sp-4);background:var(--pame-bg-soft)}
.ed-fold > summary{cursor:pointer;padding:var(--sp-3) var(--sp-4);font-weight:700;color:var(--fg-2);list-style:none}
.ed-fold > summary::-webkit-details-marker{display:none}
.ed-fold > summary::before{content:'▸ ';color:var(--fg-3)}
.ed-fold[open] > summary::before{content:'▾ '}
.ed-fold-body{display:flex;flex-direction:column;gap:var(--sp-3);padding:0 var(--sp-4) var(--sp-4)}
.ed-narrow{max-width:260px}
.ed-mats-vacio{padding:var(--sp-2)}
/* Materiales de la clase: fila con [Título] · [segmented Subir|Enlace] ·
   [contenido del modo] · [tipo] · [✕]. Todos los controles a --ctl-h. El
   segmented control tiene los dos botones pegados. Reusa el look del resto
   del panel (mismo borde, mismos colores, mismos íconos SVG). */
.mat-row{align-items:center}
.mat-row .m-cont{flex:2;min-width:260px;display:flex;align-items:center;gap:var(--sp-2)}
.mat-row .m-tabs{display:inline-flex;flex:none;background:#fff;border-radius:var(--ctl-r)}
.mat-row .m-tab{background:#fff;border:var(--ctl-bd);color:var(--fg-2);
  padding:0 var(--sp-3);height:var(--ctl-h);line-height:1;
  font-size:var(--fs-12);font-weight:600;cursor:pointer;width:auto;border-radius:0;margin:0;
  display:inline-flex;align-items:center;gap:6px;text-transform:none;letter-spacing:0}
.mat-row .m-tab .ic{width:14px;height:14px;flex:none}
.mat-row .m-tab:first-child{border-radius:var(--ctl-r) 0 0 var(--ctl-r)}
.mat-row .m-tab:last-child{border-radius:0 var(--ctl-r) var(--ctl-r) 0;border-left:0}
.mat-row .m-tab:hover{color:var(--pame-blue);border-color:var(--pame-blue)}
.mat-row .m-tab.on{background:var(--pame-teal-10);color:var(--pame-teal-700);border-color:var(--pame-teal-30);z-index:1}
.mat-row .m-tab.on:hover{color:var(--pame-teal-700);border-color:var(--pame-teal)}
.mat-row .m-body{flex:1;display:flex;align-items:center;gap:var(--sp-2);min-width:0}
.mat-row .m-up-body{flex:1;display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;min-width:0}
/* .m-up-label es un <label> que envuelve un <input type=file> oculto y hace
   de botón "Elegir archivo". El `label{}` global lo pone en columna + uppercase:
   hay que revertir las dos cosas para que se vea como un botón normal. */
.mat-row .m-up-label{display:inline-flex;flex-direction:row;align-items:center;gap:6px;
  height:var(--ctl-h);padding:0 var(--sp-3);cursor:pointer;margin:0;background:#fff;
  border:var(--ctl-bd);color:var(--pame-blue);border-radius:var(--ctl-r);
  font-size:var(--fs-12);font-weight:600;text-transform:none;letter-spacing:0}
.mat-row .m-up-label .ic{width:14px;height:14px;flex:none}
.mat-row .m-up-label:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
.mat-row .m-up-label.is-loading{opacity:.6;pointer-events:none}
.mat-row .m-up-file{font-weight:600;color:var(--pame-teal-700);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}
.mat-row .m-up-reemplazar{margin:0}
.mat-row .m-up-hint,.mat-row .m-up-msg{font-size:var(--fs-12);color:var(--fg-3)}
/* Campo deshabilitado por exclusión (subir video ↔ link externo) */
.ed-off{opacity:.45}
/* Tilde "Avisarle por mail" del diálogo de bloqueo de acceso */
.blq-mail{margin-top:var(--sp-4);font-weight:700;color:var(--fg-1)}
/* Recorte manual de imágenes: marco del aspecto final + arrastre y zoom */
.crop-ov{position:fixed;inset:0;background:rgba(2,51,77,.5);z-index:120;display:none;align-items:center;justify-content:center;padding:24px 16px;overflow:auto}
.crop-ov.open{display:flex}
.crop-card{width:680px}
.crop-frame{position:relative;overflow:hidden;border-radius:var(--r-md);background:var(--pame-blue-900);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.25);cursor:grab;touch-action:none}
.crop-frame:active{cursor:grabbing}
.crop-frame img{position:absolute;left:0;top:0;transform-origin:0 0;max-width:none;user-select:none;-webkit-user-drag:none;display:block}
.crop-zoom{display:flex;align-items:center;gap:12px;margin-top:14px}
.crop-zoom input[type=range]{flex:1;accent-color:var(--pame-blue);cursor:pointer}
.crop-zoom button{flex:none;margin:0}
.crop-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
.crop-actions button{width:auto;margin:0;padding:11px 20px}
.imp-tree{max-height:320px;overflow:auto;border:1px solid var(--pame-line);border-radius:10px;padding:10px 12px;margin:4px 0 14px}
.imp-mod{padding:6px 0}
.imp-mod+.imp-mod{border-top:1px solid var(--pame-line)}
.imp-modlbl{display:flex;align-items:center;gap:7px;cursor:pointer}
.imp-mod ul{list-style:none;margin:5px 0 0 24px;padding:0}
.imp-mod li{padding:2px 0}
.imp-lec{display:flex;align-items:center;gap:7px;cursor:pointer}
.imp-lec.is-incl{opacity:.5}
.imp-tree input[type=checkbox]{width:16px;height:16px;flex:none}
/* Ancho: la ficha del alumno tiene tablas de 4 columnas (formación, grupo, acceso,
   motivo del bloqueo). Con 520px la última quedaba cortada contra el borde.
   `min()` para que en una pantalla angosta no se pase de largo. */
.adm-drawer{position:fixed;top:0;right:0;height:100vh;width:min(760px,92vw);max-width:100vw;background:var(--pame-bg);
  z-index:91;box-shadow:var(--shadow-lg);transform:translateX(100%);transition:transform var(--t-base) var(--ease-out);
  overflow:auto;display:flex;flex-direction:column}
.adm-drawer.open{transform:translateX(0)}
.adm-drawer-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;padding:18px 22px;
  border-bottom:1px solid var(--pame-line);position:sticky;top:0;background:var(--pame-bg);z-index:2}
.adm-drawer-head h3{margin:0;font-size:var(--fs-20)}
.adm-drawer-head .who{font-size:var(--fs-12);color:var(--fg-3);margin-top:2px}
.adm-drawer-body{padding:20px 22px}
.adm-block{margin-bottom:var(--sp-6)}
.adm-block > h4{margin:0 0 10px;font-size:var(--fs-16);display:flex;align-items:center;gap:8px}
.adm-nota{background:var(--pame-bg-soft);border:1px solid var(--pame-line);border-left:3px solid var(--pame-teal);
  border-radius:var(--r-sm);padding:12px 14px;margin-bottom:10px}
.adm-nota .cuerpo{font-size:var(--fs-14);color:var(--fg-1);line-height:var(--lh-normal);white-space:pre-wrap;word-break:break-word}
.adm-nota .meta{font-size:11px;color:var(--fg-3);margin-top:9px;padding-top:9px;border-top:1px solid var(--pame-line);
  display:flex;justify-content:space-between;align-items:center;gap:8px}
.adm-nota .meta .n-del{background:none;border:none;color:var(--pame-danger);font-size:11px;font-weight:700;
  cursor:pointer;padding:0;margin:0;width:auto}
.adm-nota .meta .n-del:hover{text-decoration:underline;background:none}

/* Manija de puntitos para arrastrar y reordenar módulos/clases */
.drag-grip{flex:none;display:inline-grid;place-items:center;width:20px;height:26px;color:var(--fg-3);
  cursor:grab;border-radius:6px;transition:background var(--t-fast),color var(--t-fast)}
.drag-grip:hover{background:var(--pame-blue-10);color:var(--pame-blue)}
.drag-grip:active{cursor:grabbing}
.drag-grip svg{fill:currentColor}
.adm-mod.dragging,.adm-clase.dragging{opacity:.45}
.adm-clase.dragging{background:var(--pame-blue-10)}
.adm-mod.dragging{outline:2px dashed var(--pame-blue-40);outline-offset:2px}
/* Al arrastrar una clase, cada módulo se marca como destino posible */
.adm-clase-list.drop-zone{min-height:42px;border-radius:var(--r-sm);
  outline:1px dashed var(--pame-blue-40);outline-offset:-3px}

/* Grilla de secciones del simulador (selector de ejercicio) */
.adm-secs{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:6px 14px}
.adm-secs .adm-check{font-weight:500;font-size:var(--fs-14)}
/* Acceso a cursos en la ficha del alumno. Un solo grid (.ui-rows), así el
   selector de grupo y el de acceso quedan alineados entre todas las filas. */
.insc-rows{--ui-cols:minmax(120px,1.3fr) minmax(120px,1fr) minmax(130px,1fr) minmax(140px,1.2fr) auto;
  --ui-cols-mob:1fr 1fr}
.insc-rows .ui-row > .cn{justify-self:stretch;font-weight:700;align-self:center;
  min-width:0;overflow-wrap:anywhere}
.insc-rows .cn small{display:block;font-weight:500;font-size:var(--fs-12);color:var(--fg-3)}
/* Bloqueado: la fila se marca sola, para verlo sin leer el selector. */
.insc-rows .ui-row.bloqueada > .cn{color:var(--pame-danger)}
.insc-rows .ui-row.bloqueada .i-est{background:var(--pame-bg-soft);font-weight:700}
.insc-rows .i-motivo:disabled{opacity:.45}
@media (max-width:720px){
  .insc-rows > .ui-head{display:none}
  .insc-rows .ui-row > .cn,.insc-rows .i-motivo,.insc-rows .i-avisar{grid-column:1/-1}
}
.adm-cert{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--pame-line);font-size:var(--fs-14)}
.adm-cert code{font-size:11px;color:var(--fg-2)}
@media (max-width:720px){ .adm-grid{grid-template-columns:1fr} .adm-drawer{width:100vw} }

/* ═══ Ficha del alumno · perfil por pestañas ═══════════════════════════════
   El drawer del alumno pasa a ser un perfil con pestañas. Head + pestañas
   quedan fijos arriba y el cuerpo scrollea solo. Las barras de progreso toman
   su ancho de `data-w` por JS (como el dashboard), no de un estilo inline. */
.ficha-drawer{overflow:hidden;width:min(1000px,94vw);inset:var(--sp-3) var(--sp-3) var(--sp-3) auto;
  height:auto;border-radius:var(--r-lg)}
.ficha-top{position:sticky;top:0;z-index:3;background:var(--pame-bg);flex:none}
.ficha-top .adm-drawer-head{position:static;border-bottom:none;padding-bottom:var(--sp-2)}
.ficha-tabs{display:flex;flex-wrap:wrap;gap:var(--sp-1);padding:0 var(--sp-4) var(--sp-2);
  border-bottom:1px solid var(--pame-line)}
.ficha-tab-btn{flex:none;border:none;background:none;padding:var(--sp-2) var(--sp-3);border-radius:var(--r-pill);
  font-size:var(--fs-13);font-weight:700;color:var(--fg-3);cursor:pointer;white-space:nowrap}
.ficha-tab-btn:hover{background:var(--surface-hover);color:var(--fg-1)}
.ficha-tab-btn.on,.ficha-tab-btn.on:hover{background:var(--btn-bg);color:#fff}
.ficha-body{flex:1;min-height:0;overflow:auto}
.ficha-tab{display:none}
.ficha-tab.on{display:block}

/* Resumen */
.fhero{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin-bottom:var(--sp-4)}
.fhero-name{font-size:var(--fs-20);font-weight:800;color:var(--fg-1)}
.festado{font-size:var(--fs-13);font-weight:700;padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);white-space:nowrap}
.festado.ok{background:var(--success-soft);color:var(--success)}
.festado.warn{background:var(--warning-soft);color:var(--rt-c-naranja)}
.festado.bad{background:var(--danger-soft);color:var(--danger)}
.festado.muted{background:var(--surface-sunken);color:var(--fg-3)}
.fkpis{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-3);margin-bottom:var(--sp-4)}
.fkpi{background:var(--pame-bg-soft);border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3);
  display:flex;flex-direction:column;gap:2px;min-width:0}
.fkpi-num{font-size:var(--fs-24);font-weight:800;color:var(--fg-1);line-height:1.1}
.fkpi-den{font-size:var(--fs-16);color:var(--fg-3);font-weight:700}
.fkpi-lbl{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.fbar{height:var(--sp-2);background:var(--surface-sunken);border-radius:var(--r-pill);overflow:hidden;margin-top:var(--sp-1)}
.fbar .bar-fill{display:block;height:100%;width:0;background:var(--brand-gradient);border-radius:var(--r-pill);
  transition:width var(--t-base) var(--ease-out)}
.fcards{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--sp-3)}
.fcard{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3);min-width:0}
.fcard.warn{border-color:var(--warning);background:var(--warning-soft)}
.fcard-h{font-size:var(--fs-11);color:var(--fg-3);font-weight:700;text-transform:uppercase;letter-spacing:.04em;margin-bottom:var(--sp-1)}
.fcard-b{font-size:var(--fs-14);color:var(--fg-2);overflow-wrap:anywhere}
.fcard-b b{color:var(--fg-1)}
.fcard-sub{display:block;font-size:var(--fs-12);color:var(--fg-3);margin-top:2px}

/* Progreso */
.fp-curso{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3);margin-bottom:var(--sp-3)}
.fp-curso-h{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.fp-curso-h > b{color:var(--fg-1)}
.fp-curso-pct{margin-left:auto;font-size:var(--fs-12);color:var(--fg-3);font-weight:700;white-space:nowrap}
.fp-mods{margin-top:var(--sp-3);display:flex;flex-direction:column;gap:var(--sp-1)}
.fp-mod{border:1px solid var(--pame-line);border-radius:var(--r-sm);overflow:hidden}
.fp-mod > summary{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);cursor:pointer;
  font-weight:700;font-size:var(--fs-13);list-style:none}
.fp-mod > summary::-webkit-details-marker{display:none}
.fp-mod-t{flex:1;min-width:0;overflow-wrap:anywhere}
.fp-mod-c{flex:none;color:var(--fg-3);font-size:var(--fs-12)}
.fp-lecs{margin:0;padding:0 var(--sp-3) var(--sp-2);list-style:none}
.fp-lec{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-1) 0;font-size:var(--fs-13);
  color:var(--fg-3);border-top:1px solid var(--pame-line)}
.fp-ck{flex:none;width:16px;text-align:center;font-weight:800}
.fp-lec.ok{color:var(--fg-1)}
.fp-lec.ok .fp-ck{color:var(--success)}
.fp-lec-t{flex:1;min-width:0;overflow-wrap:anywhere}
.fp-lec-d{flex:none;font-size:var(--fs-11);color:var(--fg-3)}

/* Actividad */
.fa-item{display:flex;gap:var(--sp-3);padding:var(--sp-2) 0;border-bottom:1px solid var(--pame-line)}
.fa-ico{flex:none;font-size:var(--fs-16);line-height:1.4}
.fa-body{min-width:0;flex:1}
.fa-txt{font-size:var(--fs-13);color:var(--fg-2);overflow-wrap:anywhere}
.fa-txt b{color:var(--fg-1)}
.fa-q{font-style:italic;color:var(--fg-1)}
.fa-when{font-size:var(--fs-11);color:var(--fg-3);margin-top:2px}

/* IA */
.fia-q{border:1px solid var(--pame-line);border-radius:var(--r-sm);margin-bottom:var(--sp-2);overflow:hidden}
.fia-q > summary{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);cursor:pointer;list-style:none}
.fia-q > summary::-webkit-details-marker{display:none}
.fia-p{flex:1;min-width:0;font-weight:700;font-size:var(--fs-13);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fia-q[open] .fia-p{white-space:normal;overflow-wrap:anywhere}
.fia-d{flex:none;font-size:var(--fs-11);color:var(--fg-3)}
.fia-r{padding:0 var(--sp-3) var(--sp-3);font-size:var(--fs-13);color:var(--fg-2);white-space:pre-wrap;
  line-height:var(--lh-normal);overflow-wrap:anywhere}
.fia-clase{padding:0 var(--sp-3) var(--sp-2);font-size:var(--fs-11);color:var(--fg-3)}

/* Evaluaciones */
.fe-sec{margin-bottom:var(--sp-5)}
.fe-sec > h4{font-size:var(--fs-14);margin:0 0 var(--sp-2)}
.fe-quiz{--ui-cols:minmax(130px,2fr) auto auto auto;--ui-cols-mob:1fr 1fr}
.fe-tp{--ui-cols:minmax(130px,2fr) auto auto auto;--ui-cols-mob:1fr 1fr}
.fe-cn{font-weight:700;min-width:0;overflow-wrap:anywhere}
.fe-cn small{display:block;font-weight:500;font-size:var(--fs-12);color:var(--fg-3)}
.fe-resena{border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:var(--sp-2) var(--sp-3);margin-bottom:var(--sp-2)}
.fe-resena-h{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;font-size:var(--fs-13)}
.fe-stars{color:var(--warning);letter-spacing:1px}
.fe-resena-c{font-size:var(--fs-13);color:var(--fg-2);margin-top:var(--sp-1)}
.fe-enc{border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:var(--sp-2) var(--sp-3);margin-bottom:var(--sp-2)}
.fe-enc > summary{cursor:pointer;font-size:var(--fs-13)}
.fe-enc-l{margin:var(--sp-2) 0 0;display:grid;grid-template-columns:minmax(120px,1fr) 2fr;gap:var(--sp-1) var(--sp-3)}
.fe-enc-l dt{font-weight:700;font-size:var(--fs-12);color:var(--fg-2)}
.fe-enc-l dd{margin:0;font-size:var(--fs-13);color:var(--fg-1)}

/* Compras */
.fc-tabla{--ui-cols:auto minmax(120px,1fr) minmax(150px,1.1fr) auto auto;--ui-cols-mob:1fr 1fr}
.fc-item{min-width:0;font-weight:700;overflow-wrap:anywhere}
.fc-item small{display:block;font-weight:500;font-size:var(--fs-12);color:var(--fg-3)}

/* Gestión */
.ficha-doc{gap:var(--sp-2)}
.ficha-tipo{width:110px}
.ficha-lbl-normal{font-weight:400}
.ficha-nota-nueva{margin-top:var(--sp-3)}
.ficha-notas-exp{margin-left:auto}

/* En celular el panel flotante vuelve a ocupar toda la pantalla. */
@media (max-width:720px){
  .ficha-drawer{inset:0;width:100vw;border-radius:0}
}
@media (max-width:560px){
  .fkpis{grid-template-columns:repeat(2,1fr)}
  .fcards{grid-template-columns:1fr}
  .fe-enc-l{grid-template-columns:1fr}
}

/* ---- Simulador embebido en la clase (parte "simulación") ---- */
/* Simulador BM: se abre en pestaña nueva (a pantalla completa), no embebido. */
.sim-open{margin:14px 0 4px}
.btn-sim-open{background:var(--btn-bg);color:#fff;border:none;border-radius:var(--r-md);padding:12px 22px;
  font-size:var(--fs-16);font-weight:700;cursor:pointer;width:auto}
.btn-sim-open:hover{background:var(--btn-bg-h)}
.sim-prog{font-size:var(--fs-14);font-weight:600;color:var(--fg-3);margin:10px 0 0}

/* Link discreto tipo botón (p. ej. "↩ deshacer") */
.mini-link{background:none;border:none;color:var(--pame-blue);font-size:var(--fs-12);font-weight:700;
  cursor:pointer;padding:6px 4px;margin:0;width:auto}
.mini-link:hover{background:none;text-decoration:underline}

/* ---- Programas (agrupan cursos en el dashboard) ---- */
.prog-tit{font-family:var(--font-display);font-weight:400;font-size:var(--fs-20);color:var(--fg-1);
  margin:var(--sp-6) 0 var(--sp-2)}
.prog-tit:first-child{margin-top:0}

/* Gestor de programas en el panel admin (Contenido) */
.prog-mgr{margin-bottom:var(--sp-5);padding:16px 18px;background:#fff;border:1px solid var(--pame-line);
  border-radius:var(--r-lg);box-shadow:var(--shadow-xs)}
.prog-mgr-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.prog-mgr-tit{display:flex;flex-direction:column;gap:3px;max-width:640px}
.prog-mgr-tit b{font-size:var(--fs-16);color:var(--fg-1)}
.prog-mgr-tit .nota{font-weight:400}
.prog-list{display:flex;flex-direction:column;gap:8px}
.prog-item{display:flex;align-items:center;gap:12px;padding:9px 12px;background:var(--pame-bg-soft);
  border:1px solid var(--pame-line);border-radius:var(--r-md);flex-wrap:wrap}
.prog-item-name{font-weight:700;color:var(--fg-1);font-size:var(--fs-14)}
.prog-item-count{flex:1;font-weight:400;min-width:60px}

/* Celda de progreso enriquecida en la tabla de alumnos */
.prog-cell{display:flex;flex-direction:column;gap:4px;min-width:150px}
.prog-top{display:flex;align-items:center;gap:8px}
.prog-x{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.prog-cur{font-size:var(--fs-12);color:var(--fg-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}
table.alumnos td.desde{font-size:var(--fs-12);color:var(--fg-2);white-space:nowrap}

/* ============================================================
   AJUSTES 2026-08-12 — header fijo, volver notorio, herramientas,
   notas del alumno, ventas
   ============================================================ */

/* ── (6+8) Header principal FIJO en todo el sistema ── */
.topbar{position:sticky;top:var(--cinta-h,0px);z-index:90;box-shadow:var(--shadow-sm)}   /* sticky por encima del rail/menús (z55/54); en preview, debajo de la cinta */
/* En fullscreen (video) el contenedor se pone por encima; el sticky no molesta. */

/* ── (1) Botón "Volver" notorio (antes era un link tenue) ── */
.volver{display:inline-flex;align-items:center;gap:8px;background:var(--pame-blue-10);
  border:1.5px solid var(--pame-blue-20);color:var(--pame-blue-700);font-size:var(--fs-14);
  font-weight:700;text-decoration:none;padding:9px 16px;border-radius:var(--r-pill);
  margin-bottom:var(--sp-4);transition:all var(--t-base);box-shadow:var(--shadow-xs)}
.volver::before{content:"←";font-size:16px;font-weight:800;line-height:1}
.volver:hover{background:var(--btn-bg);border-color:var(--pame-blue);color:#fff;
  transform:translateX(-2px);box-shadow:var(--shadow-sm)}
/* Ocultamos la flecha textual vieja si el texto ya la traía (se agrega vía ::before) */

/* ── (6+8) Herramientas flotantes: calculadora + timer ── */
.tool-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:none;
  border:1px solid var(--pame-line);color:var(--fg-2);padding:9px 12px;border-radius:var(--r-sm);
  font-size:var(--fs-14);font-weight:600;cursor:pointer;transition:all var(--t-base)}
.tool-btn:hover{border-color:var(--pame-blue);color:var(--pame-blue);background:var(--pame-blue-10)}
.tool-btn svg{width:18px;height:18px;display:block}
.tool-pop{position:fixed;z-index:120;background:#fff;border:1px solid var(--pame-line);
  border-radius:var(--r-md);box-shadow:var(--shadow-lg);padding:14px;width:250px;display:none}
.tool-pop.open{display:block}
.tool-pop h4{margin:0 0 10px;font-size:var(--fs-14);color:var(--fg-1);display:flex;
  justify-content:space-between;align-items:center}
.tool-pop .tp-close{background:none;border:none;font-size:18px;color:var(--fg-3);cursor:pointer;width:auto;padding:0}
/* Calculadora */
.calc-scr{width:100%;box-sizing:border-box;text-align:right;font-family:var(--font-mono);
  font-size:20px;padding:10px 12px;border:1px solid var(--pame-line);border-radius:var(--r-sm);
  background:var(--pame-bg-soft);color:var(--fg-1);margin-bottom:10px;min-height:24px;overflow:hidden}
.calc-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.calc-grid button{padding:11px 0;border:1px solid var(--pame-line);background:#fff;border-radius:var(--r-sm);
  font-size:var(--fs-16);font-weight:600;cursor:pointer;color:var(--fg-1);transition:background var(--t-fast)}
.calc-grid button:hover{background:var(--pame-blue-10)}
.calc-grid button.op{background:var(--pame-blue-10);color:var(--pame-blue-700)}
.calc-grid button.eq{background:var(--btn-bg);color:#fff;grid-column:span 2}
.calc-grid button.clr{background:var(--pame-orange-10);color:var(--pame-orange-600)}
/* Timer */
.timer-disp{text-align:center;font-family:var(--font-mono);font-size:38px;font-weight:700;color:var(--fg-1);
  margin:6px 0 12px;letter-spacing:1px}
.timer-presets{display:flex;gap:6px;justify-content:center;margin-bottom:10px;flex-wrap:wrap}
.timer-presets button{padding:6px 10px;border:1px solid var(--pame-line);background:#fff;border-radius:var(--r-pill);
  font-size:var(--fs-12);font-weight:600;cursor:pointer;color:var(--fg-2)}
.timer-presets button:hover{border-color:var(--pame-blue);color:var(--pame-blue)}
.timer-ctrls{display:flex;gap:6px}
.timer-ctrls button{flex:1;padding:9px 0;border:none;border-radius:var(--r-sm);font-size:var(--fs-14);
  font-weight:700;cursor:pointer}
.timer-ctrls .go{background:var(--pame-success);color:#fff}
.timer-ctrls .rst{background:var(--pame-bg-soft);color:var(--fg-2);border:1px solid var(--pame-line)}
.timer-disp.done{color:var(--pame-danger);animation:tblink 1s steps(2,start) infinite}
@keyframes tblink{50%{opacity:.35}}

/* ── (7) Notas del alumno en el curso ── */
.notas-alumno{background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-md);
  padding:18px 20px;margin-top:var(--sp-5);box-shadow:var(--shadow-xs)}
.notas-alumno h3{font-size:var(--fs-18);margin:0 0 4px;display:flex;align-items:center;gap:8px}
.notas-alumno .na-sub{font-size:var(--fs-12);color:var(--fg-3);margin:0 0 12px}
.notas-alumno textarea{width:100%;box-sizing:border-box;min-height:120px;resize:vertical;
  border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:12px 14px;font-family:var(--font-sans);
  font-size:var(--fs-14);line-height:1.6;color:var(--fg-1)}
.notas-alumno textarea:focus{outline:none;border-color:var(--pame-blue);box-shadow:0 0 0 3px var(--pame-blue-10)}
.na-foot{display:flex;justify-content:space-between;align-items:center;margin-top:10px}
.na-count{font-size:var(--fs-12);color:var(--fg-3)}
.na-count.over{color:var(--pame-danger);font-weight:700}
.na-save{background:var(--btn-bg);color:#fff;border:none;border-radius:var(--r-sm);padding:9px 18px;
  font-size:var(--fs-14);font-weight:700;cursor:pointer}
.na-save:disabled{opacity:.55;cursor:default}
.na-msg{font-size:var(--fs-12);font-weight:600;color:var(--pame-success)}

/* ── (3) Recuperar contraseña / auth extra ── */
.auth-note{font-size:var(--fs-12);color:var(--fg-3);text-align:center;margin-top:10px;line-height:1.5}
/* Pie de la landing de la plataforma (plataforma.html): los accesos van uno debajo del
   otro. `.link` es inline-block, así que dos seguidos caen en la misma línea y se leen
   como una sola frase — el acceso al panel quedaba invisible. El margen propio de `.link`
   se anula porque acá el espaciado lo pone el gap. */
.pf-pie{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);margin-top:var(--sp-5)}
.pf-pie .link{margin-top:0}
/* Logo imagen en el login */
.logo-img-wrap{margin-bottom:var(--sp-5);text-align:center}
.logo-img-wrap .logo-img{height:64px;width:auto;display:inline-block}

/* Vista previa del logo de la escuela en el panel (Integraciones → Marca de la escuela).
   El fondo a cuadros es para ver si el PNG tiene el fondo transparente de verdad: sobre
   blanco liso, un logo con fondo blanco pegado parece transparente y no lo es. */
.marca-logo-prev{display:flex;align-items:center;justify-content:center;min-height:var(--sp-9);
  padding:var(--sp-4);margin-bottom:var(--sp-3);border:var(--ctl-bd);
  border-radius:var(--r-md);background-color:var(--pame-bg-soft);
  background-image:linear-gradient(45deg,var(--pame-blue-10) 25%,transparent 25%,transparent 75%,var(--pame-blue-10) 75%),
                   linear-gradient(45deg,var(--pame-blue-10) 25%,transparent 25%,transparent 75%,var(--pame-blue-10) 75%);
  background-size:var(--sp-4) var(--sp-4);background-position:0 0,var(--sp-2) var(--sp-2)}
.marca-logo-prev img{max-height:var(--sp-8);max-width:100%;width:auto;display:block}

/* Foto del dueño en "Mi cuenta": avatar redondo + botones al lado */
.mc-foto-row{display:flex;align-items:center;gap:var(--sp-4);margin-bottom:var(--sp-4);flex-wrap:wrap}
.mc-foto{width:72px;height:72px;flex:none;border-radius:50%;overflow:hidden;
  display:grid;place-items:center;background:var(--pame-bg-soft);border:1px solid var(--pame-line);
  font-size:var(--fs-24);font-weight:700;color:var(--fg-3)}
.mc-foto img{width:100%;height:100%;object-fit:cover}
.mc-foto-side{display:flex;flex-direction:column;gap:var(--gap-fld);min-width:0}
.mc-foto-side .ui-toolbar{margin:0}
.mc-pass-field{max-width:560px;margin-bottom:var(--sp-4)}

/* Foto del asistente (Asistente IA → config): avatar redondo + botones al lado */
.pbcfg-avatar{display:flex;align-items:center;gap:var(--sp-4);margin-bottom:var(--sp-2);flex-wrap:wrap}
.pbcfg-av-prev{width:72px;height:72px;flex:none;border-radius:50%;overflow:hidden;
  display:grid;place-items:center;background:var(--pame-bg-soft);border:1px solid var(--pame-line);color:var(--fg-3)}
.pbcfg-av-prev img{width:100%;height:100%;object-fit:cover}
.pbcfg-av-ph svg{width:var(--sp-6);height:var(--sp-6)}
.pbcfg-av-btns{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.pbcfg-av-btns .btn-mini{cursor:pointer}

/* Fila del panel "Mails → Marca" con Nombre del remitente + Email de contacto.
   Por defecto `.adm-row` centra verticalmente, así cuando el campo de la derecha
   crece por su nota de ayuda el de la izquierda queda flotando en el medio y las
   etiquetas desalinean. En esta fila alineamos al top para que arranquen parejas. */
.em-marca-row{align-items:flex-start !important}
/* Caja del toggle "Mail activo" (Mails → Textos por mail): alineado a la izquierda */
.em-activo-box{margin-bottom:14px;padding:var(--sp-3) var(--sp-4);background:var(--pame-bg-soft);border-radius:var(--r-md)}
.em-activo-box .adm-check{margin:0}
.nota-critico{margin:var(--sp-2) 0 0;color:var(--pame-orange-600);font-weight:600}
.em-activo-msg{display:block;margin-top:var(--sp-2)}
/* Aviso de "tocá con cuidado" arriba de los campos: naranja fuerte para que se
   note antes de escribir. `--warning-soft` es el mismo tono que usan los estados
   de alerta en el resto del panel, así que se lee como advertencia sin gritar. */
.em-warn{margin:0 0 var(--sp-3);padding:var(--sp-3) var(--sp-4);
  background:var(--warning-soft);border:1px solid var(--warning);
  border-left-width:4px;border-radius:var(--r-md)}
.em-warn-t{font-weight:800;color:var(--pame-orange-600);margin-bottom:4px}
.em-warn-b{font-size:var(--fs-14);line-height:var(--lh-normal);color:var(--fg-1)}
/* Fila de estado del texto (predeterminado / personalizado) + botón reset. */
.em-estado{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;margin:0 0 var(--sp-3)}
.em-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;
  border-radius:999px;font-size:var(--fs-12);font-weight:700}
.em-chip--def{background:var(--pame-bg-soft);color:var(--fg-2);border:1px solid var(--pame-line)}
.em-chip--custom{background:var(--success-soft);color:var(--success);border:1px solid var(--success)}
.em-reset-btn[disabled]{opacity:.5;cursor:not-allowed}

/* ── (12) Ventas ── */
/* auto-fit + minmax(0,...): las tarjetas fluyen solas (4 en desktop, 2-3 en tablet,
   2 en celular, 1 en pantallas muy angostas) sin columnas fijas que desborden a
   anchos intermedios (721-820px, donde el celular ya usa la barra inferior). */
.ventas-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:var(--sp-5)}
.ventas-cards .vc{min-width:0;background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-md);padding:14px 16px;display:flex;flex-direction:column;gap:4px}
.ventas-cards .vc-n{font-size:var(--fs-24);font-weight:800;color:var(--fg-1);font-family:var(--font-sans);overflow-wrap:anywhere}
.ventas-cards .vc.money .vc-n{font-size:var(--fs-18);color:var(--pame-success)}
.ventas-cards .vc-l{font-size:var(--fs-12);color:var(--fg-3);text-transform:uppercase;letter-spacing:.04em;font-weight:700}

/* ── Sub-pestañas de los grupos del menú (Contenido, Agenda, Alumnos, Ventas, Marketing, Configuraciones) ── */
.adm-subtabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:var(--sp-4)}
.adm-subtabs[hidden]{display:none}
/* Fondo explícito en todos los estados: gana al button:hover global (que pinta azul lleno). */
.adm-subtab{background:#fff;color:var(--fg-2);border:1px solid var(--pame-line);border-radius:999px;padding:8px 16px;font-weight:700;font-size:var(--fs-14);cursor:pointer}
.adm-subtab:hover{background:var(--pame-blue-10);color:var(--pame-blue-700);border-color:var(--pame-blue)}
.adm-subtab.on,.adm-subtab.on:hover{background:var(--pame-blue-900);color:#fff;border-color:var(--pame-blue-900)}

/* ── Home (Inicio) ── */
.home-pend{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
@media(max-width:720px){.home-pend{grid-template-columns:repeat(2,1fr)}}
.home-pcard{display:flex;flex-direction:column;gap:4px;align-items:flex-start;text-align:left;background:#fff;color:var(--fg-1);border:1px solid var(--pame-line);border-radius:var(--r-md);padding:14px 16px;cursor:pointer}
.home-pcard:hover{background:var(--pame-blue-10);color:var(--fg-1);border-color:var(--pame-blue)}
.home-pcard.hay{border-color:var(--pame-orange);background:#FFF6EC}
.home-pcard.hay:hover{background:#FFEFD9}
.home-pn{font-family:var(--font-sans);font-size:var(--fs-24);font-weight:800;color:var(--fg-1)}
.home-pcard.hay .home-pn{color:#DE7600}
.home-pl{font-size:var(--fs-12);color:var(--fg-3);text-transform:uppercase;letter-spacing:.04em;font-weight:700}
.home-accesos{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
@media(max-width:720px){.home-accesos{grid-template-columns:repeat(2,1fr)}}
.home-acc{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:#fff;color:var(--fg-1);border:1px solid var(--pame-line);border-radius:var(--r-md);padding:18px 12px;font-weight:700;font-size:var(--fs-14);cursor:pointer;min-height:88px}
.home-acc:hover{background:var(--pame-blue-10);color:var(--pame-blue-700);border-color:var(--pame-blue)}
.home-acc-ic{display:grid;place-items:center;color:var(--pame-blue-900)}
.home-acc-ic svg{width:19px;height:19px}
.home-acc:hover .home-acc-ic{color:var(--pame-blue-700)}

/* ══ Dashboard general del home (panel de la academia) ══════════════════════ */
/* Cabecera: bajada + selector de período. */
.dash-top{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-4)}
.dash-top-sub{color:var(--fg-2);margin:0;font-size:var(--fs-14)}
.dash-rango{display:flex;gap:6px;flex-wrap:wrap}
.dash-rango-b{background:#fff;color:var(--fg-2);border:1px solid var(--pame-line);border-radius:999px;padding:6px 14px;font-weight:700;font-size:var(--fs-13);cursor:pointer}
.dash-rango-b:hover{background:var(--pame-blue-10);color:var(--pame-blue-700);border-color:var(--pame-blue)}
.dash-rango-b.on,.dash-rango-b.on:hover{background:var(--pame-blue-900);color:#fff;border-color:var(--pame-blue-900)}
/* "Personalizado ▾" → botón que abre un popover con dos inputs de fecha. Ancla
   arriba a la derecha para no salirse en desktop; en mobile pasa a la izquierda. */
.dash-rango-cust{position:relative}
.dash-rango-pop{position:absolute;top:calc(100% + 8px);right:0;z-index:10;
  background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-md);
  box-shadow:var(--shadow-md);padding:var(--sp-3);display:flex;flex-direction:column;
  gap:var(--sp-2);min-width:220px}
/* El display:flex de arriba tiene más peso que el `[hidden]{display:none}` global
   (ambos son un selector de clase/atributo, gana el que viene después). Este
   override lo devuelve a la vida para que `hidden` en el HTML esconda el popover. */
.dash-rango-pop[hidden]{display:none}
.dash-rango-pop label{display:flex;flex-direction:column;gap:4px;font-size:var(--fs-12);
  color:var(--fg-2);font-weight:600}
.dash-rango-pop input[type=date]{height:var(--ctl-h);border:1px solid var(--pame-line);
  border-radius:var(--r-sm);padding:0 10px;font-family:var(--font-sans);font-size:var(--fs-14);color:var(--fg-1)}
.dash-rango-pop button{padding:8px 14px;font-size:var(--fs-14);margin-top:2px}
@media(max-width:560px){.dash-rango-pop{right:auto;left:0}}

/* KPIs de arriba (5 tarjetas con ícono, número, variación). */
.dash-kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-bottom:var(--sp-5)}
@media(max-width:980px){.dash-kpis{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.dash-kpis{grid-template-columns:repeat(2,1fr)}}
.dkpi{position:relative;background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-md);padding:16px;display:flex;flex-direction:column;gap:4px;box-shadow:var(--shadow-xs)}
/* Iconos rellenos con gradiente de marca (#eduGrad), sin caja. El glifo se pinta
   con fill:url(#eduGrad); acá solo lo dimensionamos y le damos aire abajo. */
.dkpi-ic{line-height:0;margin-bottom:8px}
.dkpi-ic svg{width:23px;height:23px}
.dkpi-n{font-family:var(--font-sans);font-size:var(--fs-24);font-weight:800;color:var(--pame-teal);line-height:1.1}
.dkpi.money .dkpi-n{font-size:var(--fs-20);color:var(--pame-success)}
.dkpi-l{font-size:var(--fs-12);color:var(--fg-3);text-transform:uppercase;letter-spacing:.03em;font-weight:700}
.dkpi-d{margin-top:2px}
.kpi-delta{display:inline-block;font-size:var(--fs-12);font-weight:800;padding:1px 7px;border-radius:999px}
.kpi-delta.up{background:#E4F5EC;color:#1E7A4E}
.kpi-delta.down{background:#FCE8E8;color:#B42318}

/* Grilla de dos columnas para los paneles del dashboard. */
.dash-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:var(--sp-4)}
@media(max-width:900px){.dash-grid2{grid-template-columns:1fr}}
.dash-grid2 .adm-panel{margin:0}
.bh-mt{margin-top:var(--sp-4)}
.dash-h-sub{color:var(--fg-3);font-weight:600}
/* Link liviano (Ver detalle →) dentro de un encabezado bh. */
.lnk{background:none;border:0;color:var(--pame-blue-700);font-weight:700;font-size:var(--fs-13);cursor:pointer;padding:0;margin-left:auto;white-space:nowrap}
.lnk:hover{color:var(--pame-blue-900);text-decoration:underline;background:none}
/* El "Ver detalle →" va dentro del h4; lo empujamos a la derecha del título. */
.bh h4:has(.lnk){display:flex;align-items:baseline;gap:var(--sp-2)}

/* Créditos del plan (medidores). Ahora agrupados en dos sub-secciones (Formaciones /
   Ebooks) con un subtítulo chiquito que separa sin partir el panel. */
.dplan-sec + .dplan-sec{margin-top:var(--sp-4);padding-top:var(--sp-3);border-top:1px solid var(--pame-line)}
.dplan-sec h5{margin:0 0 4px;font-size:var(--fs-13);color:var(--fg-3);font-weight:800;text-transform:uppercase;letter-spacing:.05em}
.dgauge{margin-top:var(--sp-3)}
.dgauge-top{display:flex;justify-content:space-between;align-items:baseline;gap:10px;font-size:var(--fs-14);color:var(--fg-2);font-weight:600;margin-bottom:6px}
/* La etiqueta ocupa lo que queda; el valor va entero en una línea (no se parte). */
.dgauge-top > span{flex:1 1 auto;min-width:0}
.dgauge-top b{flex:none;white-space:nowrap;color:var(--fg-1);font-family:var(--font-sans);font-weight:800;font-variant-numeric:tabular-nums}
.dbar{height:10px;border-radius:999px;background:var(--pame-blue-10);overflow:hidden}
.dbar-fill{height:100%;border-radius:999px;background:var(--pame-teal);transition:width var(--t-slow)}
.dbar-fill.full{background:var(--pame-warning)}   /* al tope: ámbar de atención (--pame-orange está aliasado a teal y no se distinguía) */
.dbar-fill.over{background:var(--danger)}         /* por encima del tope: rojo, exige acción */
.dgauge-sub{display:block;margin-top:4px;font-size:var(--fs-12);color:var(--fg-3)}
/* Chip "sobre el tope" al lado del número del medidor. Ej: "7 / 1  · +6 sobre el tope". */
.dgauge-over{display:inline-block;margin-left:8px;padding:1px 8px;border-radius:999px;background:var(--danger-soft);color:#7A1418;font-size:var(--fs-12);font-weight:800;white-space:nowrap;vertical-align:1px}
/* CTA que aparece bajo un medidor cuando la academia llegó al tope (mejorar plan / adicional). */
.dgauge-cta{display:inline-block;margin-top:6px;font-size:var(--fs-12);font-weight:800;color:var(--pame-teal);text-decoration:none}
.dgauge-cta:hover{text-decoration:underline}
.dgauge-cta + .dgauge-cta{margin-left:12px}
/* Badge y fila del listado admin cuando un curso/grupo está pausado_por_plan.
   El rojo del badge es igual al del chip de sobrecarga; la fila baja levemente el
   contraste para que se lea "esto no está trabajando ahora mismo".
   Botón "Activar por plan" pisa el look del btn-mini con un ribete rojo suave. */
.fm-pausado{background:var(--danger-soft);color:#7A1418;font-weight:800}
.fm-pausado-row{background:#FFFCFC}
.fm-pausado-row td{position:relative}
.gr-chip.fm-pausado{opacity:.75}
.fm-activar,.gr-activar{border:1px solid var(--danger);color:#7A1418;background:#fff;font-weight:800}
.fm-activar:hover,.gr-activar:hover{background:var(--danger-soft)}
/* Cartel rojo arriba del dashboard cuando la cuenta está por encima del tope en 1+ cupos.
   NO cortamos acceso a lo existente (regla de VENTAS.md); avisamos y bloqueamos altas nuevas. */
.dash-over-alert{display:flex;gap:12px;align-items:flex-start;
  background:var(--danger-soft);border:1px solid var(--danger);border-left:4px solid var(--danger);
  border-radius:var(--r-sm);padding:12px 14px;margin-bottom:var(--sp-4);color:#7A1418}
.dash-over-alert svg{flex:none;width:22px;height:22px;color:var(--danger)}
.dash-over-alert-body{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:4px}
.dash-over-alert-body b{color:#7A1418;font-size:var(--fs-15)}
.dash-over-alert-body p{margin:0;font-size:var(--fs-13);color:#7A1418}
.dash-over-alert-body ul{margin:2px 0 0;padding-left:18px;font-size:var(--fs-13);color:#7A1418}
.dash-over-alert-body li{margin:1px 0}
.dash-over-alert-body li b{color:#7A1418;font-weight:800}
.dash-over-alert-ctas{display:flex;gap:16px;flex-wrap:wrap;margin-top:6px}
.dash-over-alert-ctas a{font-size:var(--fs-13);font-weight:800;color:#7A1418;text-decoration:underline}
.dash-over-alert-ctas a:hover{color:#4A0C0F}
/* Aviso de plataforma (trial / primer cobro) arriba del dashboard. Antes era una
   barra sticky arriba de todo el panel; ahora es una tarjeta dentro del home con el
   degradado de marca, más un pop-up de bienvenida (.plat-popup) al entrar. */
.dash-plan-msg{display:flex;gap:12px;align-items:center;flex-wrap:wrap;
  background:var(--brand-gradient);color:#fff;
  border-radius:var(--r-md);padding:12px 16px;margin-bottom:var(--sp-4)}
.dash-plan-msg svg{flex:none;width:22px;height:22px;color:#fff}
.dash-plan-msg-body{flex:1 1 220px;min-width:0;font-size:var(--fs-14);line-height:1.4;color:#fff}
.dash-plan-msg-body strong{color:#fff;font-weight:800}
.dash-plan-msg a{flex:none;color:#fff;background:rgba(255,255,255,.18);
  border:1px solid rgba(255,255,255,.4);padding:6px 14px;border-radius:var(--r-pill);
  text-decoration:none;font-weight:700;white-space:nowrap;font-size:var(--fs-13)}
.dash-plan-msg a:hover{background:rgba(255,255,255,.3)}
/* Pop-up de bienvenida con el mismo aviso. Se autocierra a los pocos segundos o con
   la X / clic afuera. Aparece abajo a la derecha, no tapa el panel. */
.plat-popup-ov{position:fixed;inset:0;z-index:120;pointer-events:none}
.plat-popup-ov.on .plat-popup{opacity:1;transform:translateY(0)}
.plat-popup{position:absolute;right:var(--sp-4);bottom:var(--sp-4);width:min(360px,calc(100vw - 2*var(--sp-4)));
  pointer-events:auto;background:var(--brand-gradient);color:#fff;
  border-radius:var(--r-lg);padding:18px 18px 16px;box-shadow:var(--shadow-lg);
  display:flex;flex-direction:column;gap:12px;
  opacity:0;transform:translateY(12px);transition:opacity .2s ease,transform .2s ease}
.plat-popup-x{position:absolute;top:8px;right:10px;width:28px;height:28px;
  background:transparent;border:0;color:#fff;font-size:22px;line-height:1;cursor:pointer;opacity:.85}
.plat-popup-x:hover{opacity:1}
.plat-popup-body{font-size:var(--fs-14);line-height:1.45;color:#fff;padding-right:20px}
.plat-popup-body strong{color:#fff;font-weight:800}
.plat-popup-cta{align-self:flex-start;color:#fff;background:rgba(255,255,255,.18);
  border:1px solid rgba(255,255,255,.4);padding:7px 15px;border-radius:var(--r-pill);
  text-decoration:none;font-weight:700;font-size:var(--fs-13)}
.plat-popup-cta:hover{background:rgba(255,255,255,.3)}
/* Sección "sumar cupo" (adicionales) en la página de plan de la academia. */
.adic-wrap{margin-top:var(--sp-4);text-align:left}
.adic-tit{font-size:var(--fs-16);margin:0 0 4px}
.adic-lead{margin:0 0 var(--sp-3);font-size:var(--fs-14)}
.dash-stats-3{grid-template-columns:repeat(3,1fr)}
@media(max-width:560px){.dash-stats-3{grid-template-columns:1fr}}

/* Gráfico de evolución (barras por día, alto por JS). */
.ev-chart{display:flex;align-items:flex-end;gap:2px;height:130px;padding-top:8px}
.ev-col{flex:1 1 0;display:flex;align-items:flex-end;height:100%}
.ev-bar{width:100%;min-height:2px;border-radius:3px 3px 0 0;background:var(--pame-blue-10)}
.ev-bar.on{background:var(--pame-teal)}
/* Mismo gap que .ev-chart para que cada celda quede alineada con su barra. */
.ev-foot{display:flex;gap:2px;margin-top:8px;padding-top:6px;border-top:1px solid var(--pame-blue-10);font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.ev-tick{flex:1 1 0;min-width:0;white-space:nowrap}
.ev-tick--left{text-align:left}
.ev-tick--center{text-align:center}
.ev-tick--right{text-align:right}
/* En celular ocultamos el texto de las marcas intermedias pero NO la celda, así no
   se corre la alineación con las barras. */
@media (max-width:720px){ .ev-tick--desk{visibility:hidden} }
.ev-bar[data-tip]{cursor:default}
.ev-tip{position:fixed;z-index:60;pointer-events:none;opacity:0;transition:opacity .08s;
  background:var(--navy-700);color:#fff;padding:6px 10px;border-radius:var(--r-sm);
  font-size:var(--fs-12);font-weight:600;white-space:nowrap;box-shadow:var(--shadow-md)}
.ev-tip.on{opacity:1}

/* Top productos (filas). */
.dash-top-prod{--ui-cols:minmax(0,1fr) auto auto auto;--ui-cols-mob:minmax(0,1fr) auto auto auto}
.dash-top-prod .ui-head span:not(:first-child){text-align:right}
.dtp-nom{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
/* El nombre debe LLENAR su columna y recortar con "…"; sin esto, el justify-self:start global
   de .ui-rows lo dimensiona al contenido y se desborda sobre "Ventas" en pantallas angostas. */
.dash-top-prod .ui-row .dtp-nom{justify-self:stretch}
.dtp-v{text-align:right;font-weight:700;font-variant-numeric:tabular-nums;color:var(--fg-2)}
.dtp-f{text-align:right;font-weight:800;font-variant-numeric:tabular-nums;color:var(--fg-1);font-family:var(--font-sans)}
.dtp-nil{color:var(--fg-3);font-weight:600}

/* Cross-selling (qué curso lleva a qué curso) y conversión de la ficha: mismas 4
   columnas alineadas a la derecha que "productos más vendidos". Reusan .dtp-* . */
.dash-xsell,.dash-conv{--ui-cols:minmax(0,1fr) auto auto auto;--ui-cols-mob:minmax(0,1fr) auto auto auto}
.dash-xsell .ui-head span:not(:first-child),
.dash-conv  .ui-head span:not(:first-child){text-align:right}
.dash-xsell .ui-row .dtp-nom,
.dash-conv  .ui-row .dtp-nom{justify-self:stretch}
.dxs-arrow{color:var(--pame-blue-40);font-weight:700;padding:0 4px}
.dxs-chica{display:inline-block;margin-left:6px;font-size:var(--fs-12);font-weight:700;color:var(--warning);white-space:nowrap}
.dconv-tasa{font-weight:800;color:var(--pame-teal-700);font-variant-numeric:tabular-nums}
/* En móvil, el nombre (compuesto "A → B" en cross-sell) toma la fila entera y
   envuelve, en vez de recortarse a "C…". Los números quedan debajo. */
@media (max-width:720px){
  .dash-xsell .ui-row .dtp-nom,
  .dash-conv  .ui-row .dtp-nom{grid-column:1/-1;justify-self:start;white-space:normal;overflow:visible;font-weight:700;margin-bottom:2px}
  .dash-xsell .ui-row .dtp-v,.dash-xsell .ui-row .dtp-f{text-align:left}
  .dash-conv  .ui-row .dtp-v,.dash-conv  .ui-row .dtp-f{text-align:left}
}

/* Matriz de disponibilidad de prueba social por curso (Marketing › Prueba social):
   Curso + dos casillas (compradores / personas viendo), alineadas al centro. */
.ps-matrix{--ui-cols:minmax(0,1fr) auto auto;--ui-cols-mob:minmax(0,1fr) auto auto}
.ps-matrix .ui-head span:not(:first-child),
.ps-matrix .ui-row > span:not(.dtp-nom){text-align:center;justify-self:center}
.ps-matrix input[type=checkbox]{width:19px;height:19px;accent-color:var(--pame-teal);cursor:pointer;margin:0}
/* Íconos SVG de la pestaña Prueba social (regla: nada de emojis). */
.ps-ic{display:inline-flex;vertical-align:-4px;margin-right:8px;color:var(--pame-teal-700)}
.ps-ic svg{width:20px;height:20px}
.ps-hic{display:inline-flex;vertical-align:-3px;margin-right:5px}
.ps-hic svg{width:14px;height:14px}

/* Alumnos (4 mini-tarjetas). */
.dash-alu{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media(max-width:560px){.dash-alu{grid-template-columns:repeat(2,1fr)}}
.dalu{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:12px;display:flex;flex-direction:column;gap:2px}
.dalu-n{font-family:var(--font-sans);font-size:var(--fs-20);font-weight:800;color:var(--fg-1)}
.dalu.ok .dalu-n{color:var(--pame-success)}
.dalu.warn .dalu-n{color:#DE7600}
.dalu.bad .dalu-n{color:#B42318}
.dalu-l{font-size:var(--fs-12);color:var(--fg-2);font-weight:700}
.dalu-s{font-size:11px;color:var(--fg-3)}

/* Alertas (Necesita tu atención). */
.dash-alertas{display:flex;flex-direction:column;gap:8px}
.dalerta{display:flex;align-items:flex-start;gap:10px;text-align:left;background:#fff;border:1px solid var(--pame-line);border-left:3px solid var(--pame-orange);border-radius:var(--r-sm);padding:12px 14px;cursor:pointer;color:var(--fg-1)}
.dalerta:hover{background:#FFF6EC}
.dalerta-pagos{border-left-color:#B42318}
.dalerta-riesgo{border-left-color:var(--pame-orange)}
.dalerta-curso{border-left-color:var(--pame-blue)}
.dalerta-ic{flex:none;color:var(--fg-3)}
.dalerta-ic svg{width:18px;height:18px}
.dalerta-tx{display:flex;flex-direction:column;gap:2px}
.dalerta-tx b{font-size:var(--fs-14);color:var(--fg-1)}
.dalerta-tx span{font-size:var(--fs-12);color:var(--fg-3)}

/* Actividad reciente. */
.dash-act{display:flex;flex-direction:column}
.dact{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--pame-line)}
.dact:last-child{border-bottom:0}
.dact-ic{flex:none;font-size:16px}
.dact-tx{flex:1;min-width:0;font-size:var(--fs-14);color:var(--fg-2)}
.dact-when{flex:none;font-size:var(--fs-12);color:var(--fg-3);font-variant-numeric:tabular-nums}

/* Plataforma · gasto de IA (superadmin) */
.gas-total{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--sp-1);margin-bottom:var(--sp-4)}
.gas-total-n{font-family:var(--font-sans);font-size:var(--fs-40);font-weight:800;color:var(--pame-success)}
.gas-total-l{font-size:var(--fs-12);color:var(--fg-3);text-transform:uppercase;letter-spacing:.04em;font-weight:700}
.gas-rangos{gap:var(--sp-2)}
.gas-filas{--ui-cols:1fr auto;--ui-cols-mob:1fr auto}
.gas-monto{text-align:right;font-family:var(--font-sans);font-weight:700;color:var(--fg-1);font-variant-numeric:tabular-nums}
.gas-grupo{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-3);background:var(--pame-bg)}
.gas-grupo > h4{margin:0 0 var(--sp-2);font-size:var(--fs-16)}
/* Subtítulos de las dos partes del bloque "Costos de la plataforma" (IA / Infra). */
.gas-sub{margin-top:var(--sp-5)}
/* La cantidad medida (horas / tokens / GB) debajo del nombre de cada fila. */
.gas-cant{color:var(--fg-3);font-weight:600}
/* Plataforma · salud de colas (superadmin). Semáforo verde/amarillo/rojo con las
   variables de estado de colors_and_type.css; reusa .ui-rows/.gas-* para las filas. */
.sal-filas{--ui-cols:1fr auto;--ui-cols-mob:1fr auto}
.sem-cab{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;padding:var(--sp-3) var(--sp-4);border-radius:var(--r-md);margin-bottom:var(--sp-3);border:1px solid transparent}
.sem-dot{width:10px;height:10px;border-radius:50%;flex:none;background:currentColor}
.sem-txt{font-weight:800;font-size:var(--fs-16);color:var(--fg-1)}
.sem-sub{margin-left:auto;font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.sem-ok{background:var(--success-soft);border-color:var(--success);color:var(--success)}
.sem-atencion{background:var(--warning-soft);border-color:var(--warning);color:var(--warning)}
.sem-alerta{background:var(--danger-soft);border-color:var(--danger);color:var(--danger)}
.sem-pill{display:inline-block;font-size:10px;font-weight:800;text-transform:uppercase;padding:2px 7px;border-radius:var(--r-pill)}
.sal-cron{text-align:right}
/* Migraciones: una academia = un desplegable (details/summary). Cerrada muestra solo
   el nombre + el resumen; se abre al tocarla. Así el superadmin ve claro qué es de cada
   academia sin tener todas las listas expandidas a la vez. */
.migra-aca{border:1px solid var(--pame-line);border-radius:var(--r-md);margin-top:var(--sp-3);background:var(--pame-bg);overflow:hidden}
.migra-aca-sum{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;padding:var(--sp-3) var(--sp-4);cursor:pointer;list-style:none;user-select:none}
.migra-aca-sum::-webkit-details-marker{display:none}
/* Triángulo propio (▸ cerrado → ▾ abierto) para que se lea como desplegable. */
.migra-aca-sum::before{content:"▸";color:var(--fg-3);font-size:var(--fs-12);transition:transform var(--t-fast);flex:none}
.migra-aca[open] > .migra-aca-sum::before{transform:rotate(90deg)}
.migra-aca-sum:hover{background:var(--pame-bg-soft)}
.migra-aca-nom{font-weight:700;color:var(--fg-1)}
.migra-aca .gas-filas{padding:0 var(--sp-4) var(--sp-3)}
/* Selector de rango personalizado (aparece al elegir "Personalizado"). */
.gas-fechas{margin-top:var(--sp-3)}
.pago-pill{display:inline-block;padding:3px 10px;border-radius:var(--r-pill);font-size:var(--fs-12);font-weight:700;white-space:nowrap}
.pago-pill.pagado{background:#E4F5EC;color:#1E7A4E}
.pago-pill.pendiente{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.pago-pill.rechazado{background:#FBE8E6;color:var(--pame-danger)}
/* Reintento abandonado que se cerró solo al crear/acreditar otro pago del mismo curso */
.pago-pill.cancelado{background:var(--surface-sunken);color:var(--pame-ink-3)}
/* Venta devuelta al comprador (reembolso MP autom\00e1tico o marcado a mano en el panel) */
.pago-pill.reembolsado{background:var(--info-soft);color:var(--info)}
/* Venta ya facturada en ARCA (chip informativo, junto al estado del pago) */
.pago-pill.facturada{background:var(--pame-teal-50, #e6f4f1);color:var(--pame-teal-700)}
/* Bloque "Marcar como devuelta" del detalle de venta */
.vd-devol{margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px solid var(--pame-line)}
.vd-cut{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2);font-size:var(--fs-14)}
/* Alumno con el acceso cortado a alguna formación (ver db/bloqueo-acceso.sql) */
.pago-pill.bloqueado{background:#FBE8E6;color:var(--pame-danger);margin-top:var(--sp-1)}
/* Estado de acceso del alumno en la lista (columna ACCESO). "Pagó" reusa .pagado (verde).
   Alta manual = acceso que diste vos, sin pago (teal). Gratis = solo curso gratuito.
   Sin acceso = ninguna inscripción activa (el más tenue). Ver estadoAcceso() en admin.html. */
.pago-pill.manual{background:var(--pame-teal-50,#e6f4f1);color:var(--pame-teal-700)}
.pago-pill.gratis{background:var(--surface-sunken);color:var(--pame-ink-2)}
.pago-pill.sin{background:var(--pame-bg-soft);color:var(--fg-3)}
/* Acceso vencido: se le venció la ventana de acceso comprado (planes.acceso_meses)
   y no renovó. El cron 'inscripciones-vencer' (db/inscripciones-vencida.sql) marca
   estado='vencida'. Rojo tenue para no confundir con 'bloqueado' (corte manual). */
.pago-pill.vencido{background:#FBE8E6;color:var(--pame-danger)}

/* ── (11) Filtros de alumnos ── */
.alumnos-filtros{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:0 0 14px}
.alumnos-filtros .adm-select,.alumnos-filtros input{width:auto}

/* ── Filtros de ventas: todos los controles a la misma altura y línea de base ── */
.ventas-filtros{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:0 0 14px}
.ventas-filtros .adm-select{width:auto}
.ventas-filtros .v-buscar{flex:1 1 180px;min-width:160px;max-width:240px;
  font-family:var(--font-sans);font-size:var(--fs-14);color:var(--fg-1);
  border:var(--ctl-bd);border-radius:var(--r-sm);background:#fff;padding:0 var(--ctl-px)}
.ventas-filtros .v-buscar,.ventas-filtros .adm-select,.ventas-filtros .filtro-fecha input,.ventas-filtros .btn-mini{
  min-height:var(--ctl-h);height:var(--ctl-h)}
.ventas-filtros .filtro-fecha input{padding-top:0;padding-bottom:0}
.ventas-filtros .btn-mini{margin-left:auto}

/* Ventas: filas centradas verticalmente (la celda Cliente tiene 2 líneas) y clickeables */
.ventas-tabla td{vertical-align:middle}
.ventas-tabla .v-num{font-variant-numeric:tabular-nums;color:var(--fg-3);font-weight:700;white-space:nowrap}
.ventas-tabla tbody tr.v-fila{cursor:pointer;transition:background var(--t-fast)}
.ventas-tabla tbody tr.v-fila:hover{background:var(--pame-blue-10)}
.ventas-tabla .v-vacio{text-align:center;color:var(--fg-3)}

/* Detalle de una venta (modal) — reusa .dup-ov / .dup-card */
.vd-card{width:560px}
.vd-card .sub{margin:2px 0 16px}
.vd-grid{display:flex;flex-direction:column;gap:var(--sp-2)}
.vd-fila{display:flex;justify-content:space-between;gap:var(--sp-4);align-items:baseline;
  padding:var(--sp-2) 0;border-bottom:1px solid var(--pame-line)}
.vd-fila:last-child{border-bottom:none}
.vd-k{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-3);flex:none}
.vd-v{font-size:var(--fs-14);color:var(--fg-1);text-align:right;word-break:break-word}
.vd-v code{font-family:var(--font-mono);font-size:var(--fs-12);background:var(--pame-bg-soft);
  border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:2px 6px}
.vd-sub{font-size:var(--fs-14);font-weight:800;color:var(--fg-1);margin:var(--sp-4) 0 var(--sp-1)}

/* ── (2) Selector de varios cursos en el editor de avisos ── */
.av-multi-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:6px 14px;
  border:1px solid var(--pame-line);border-radius:var(--r-sm);padding:12px 14px;background:var(--pame-bg-soft);max-height:220px;overflow:auto}
.av-multi-item{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:6px 8px;font-size:var(--fs-14);font-weight:400;letter-spacing:normal;text-transform:none;color:var(--fg-2);cursor:pointer}
.av-multi-item input{width:16px;height:16px;accent-color:var(--pame-blue);flex:none}

/* ============================================================
   DASHBOARD rediseñado (2026-08-13) — sidebar + stats + cards
   ============================================================ */
/* Fondo por defecto: el token --surface-page, que el middleware PISA con el tema de
   cada academia (tema_fondo) en las páginas del alumno (tienda, dashboard, clase…).
   NO hardcodear acá un color/degradé o le robamos el fondo al tema de la academia. */
.dash-body-page{background:var(--pame-bg-soft)}
/* "Manchones" radiales celeste/periwinkle/teal (estilo fly.io) SOLO en el panel del
   dueño (admin) y de la plataforma (panel superadmin) — ese no se tiñe con el tema.
   Fijo al viewport. Las tarjetas blancas resaltan sobre el ambiente. */
body.dash-body-page[data-page="admin"],
body.dash-body-page[data-page="panel"]{
  background-color:#F1F5FA;
  background-image:
    radial-gradient(880px 620px at 2% -8%,   rgba(56,150,210,.30), transparent 62%),
    radial-gradient(820px 640px at 106% -2%, rgba(120,138,232,.24), transparent 60%),
    radial-gradient(840px 720px at 99% 108%, rgba(15,168,184,.22), transparent 60%),
    radial-gradient(760px 620px at -10% 102%, rgba(84,150,222,.20), transparent 60%);
  background-attachment:fixed;
  background-repeat:no-repeat;
}
/* Todos los controles de la barra a un mismo alto (--ctl-h): así Ayuda, Cerrar
   sesión, la campana y el control de tamaño quedan parejos y alineados. Alto fijo
   con box-sizing:border-box y el padding sólo horizontal (el vertical lo daba el
   9px y desajustaba contra la campana, que es más chica). */
.topbar .ghost{display:inline-flex;align-items:center;gap:7px;height:var(--ctl-h);padding:0 16px;margin:0;color:var(--top-fg,var(--fg-2))}
.topbar .ghost svg{width:16px;height:16px}
/* Área del alumno: la barra habla el mismo idioma que la de la tienda (.land-top) — nombre en
   mayúsculas espaciadas y botones en píldora que toman el texto de la barra. El panel del
   dueño (data-page="admin") queda como estaba. */
body:not([data-page="admin"]) .topbar .logo-txt{text-transform:uppercase;letter-spacing:.14em;font-size:var(--fs-16);font-weight:800}
body:not([data-page="admin"]) .topbar .ghost{border-radius:var(--r-pill);
  border-color:color-mix(in srgb, var(--top-fg,var(--fg-2)) 35%, transparent);
  font-size:var(--fs-13);font-weight:700;letter-spacing:.06em;text-transform:uppercase}
body:not([data-page="admin"]) .topbar .ghost:hover{color:var(--top-fg,var(--fg-1));
  border-color:var(--top-fg,var(--fg-2));background:color-mix(in srgb, var(--top-fg,var(--fg-2)) 10%, transparent)}
@media (max-width:720px){
  body:not([data-page="admin"]) .topbar .logo-txt{font-size:var(--fs-13);letter-spacing:.06em}
}

/* ── Campanita de novedades (la monta notificaciones.js en la barra) ────────
   Es lo único de la barra que cambia solo, así que va primera y con el punto
   naranja de la marca: se busca siempre en el mismo lugar. */
.notif{position:relative;display:flex}
/* Campana: botón cuadrado del alto de la fila, con el ícono centrado (no lleva
   texto, así que no usa el padding lateral de los demás .ghost). */
.topbar .notif-btn{position:relative;width:var(--ctl-h);padding:0;justify-content:center}
.notif-btn svg{width:18px;height:18px}
.notif-pip{position:absolute;top:2px;right:2px;min-width:var(--sp-4);height:var(--sp-4);
  padding:0 var(--sp-1);display:grid;place-items:center;border-radius:var(--r-pill);
  background:var(--pame-orange);color:#fff;font-size:11px;font-weight:800;font-style:normal;line-height:1;
  border:2px solid var(--pame-bg)}
.notif-pip[hidden]{display:none}

.notif-panel{position:absolute;top:calc(100% + var(--sp-2));right:0;z-index:80;
  width:min(360px, calc(100vw - var(--sp-6)));max-height:min(70vh, 460px);overflow-y:auto;
  background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-md);
  box-shadow:var(--shadow-lg);padding:var(--sp-2)}
.notif-panel[hidden]{display:none}
.notif-head{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;
  color:var(--fg-3);padding:var(--sp-2) var(--sp-3)}
.notif-item{display:flex;flex-direction:column;gap:2px;padding:var(--sp-3);border-radius:var(--r-sm);
  text-decoration:none;color:var(--fg-1);transition:background var(--t-fast)}
a.notif-item:hover{background:var(--pame-blue-10)}
/* La no leída se marca con una barrita, no con fondo: el fondo se pisaba con el
   del hover y no se distinguía cuál era cuál. */
.notif-item.nueva{border-left:3px solid var(--pame-orange);padding-left:calc(var(--sp-3) - 3px)}
.notif-t{font-size:var(--fs-14);font-weight:700;line-height:var(--lh-snug)}
.notif-c{font-size:var(--fs-12);color:var(--fg-2);line-height:var(--lh-normal);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.notif-f{font-size:11px;color:var(--fg-3)}
.notif-vacio{margin:0;padding:var(--sp-3);font-size:var(--fs-12);color:var(--fg-3);line-height:var(--lh-normal)}

/* En pantalla chica la campanita queda a la IZQUIERDA de la barra, así que un
   panel colgado de su borde derecho se sale de la pantalla por el costado.
   Soltando el `position` del botón, el panel se ancla a la barra —que ya es
   sticky, o sea posicionada— y se estira de lado a lado, debajo de ella. */
@media (max-width:720px){
  .notif{position:static}
  .notif-panel{left:var(--sp-3);right:var(--sp-3);width:auto}
}
:root{--side-w:295px;--sub-w:0px;--topbar-h:64px}
/* Alto total del encabezado fijo = topbar (+ cinta de vista previa, si está). Los menús
   fijos (rail, subnav, pestañas admin) arrancan debajo de esto; el topbar, debajo de la cinta. */
:root{--head-h:calc(var(--topbar-h) + var(--cinta-h, 0px))}
body.preview-on{--cinta-h:34px}
@media(max-width:640px){ body.preview-on{--cinta-h:56px} }
body.side-collapsed{--side-w:74px}
.tb-left{display:flex;align-items:center;gap:10px}
.dash-menu-btn{display:none;background:none;border:1px solid var(--pame-line);border-radius:var(--r-sm);color:var(--fg-2);width:38px;height:38px;place-items:center;cursor:pointer;padding:0}
.dash-menu-btn svg{width:20px;height:20px}
/* Sin rail del alumno (panel admin): la hamburguesa controlaba ese rail, así que no va. */
body[data-rail="none"] .dash-menu-btn{display:none}
.dash-body{display:block;margin-left:calc(var(--side-w) + var(--sub-w));padding:var(--sp-5) var(--sp-6) var(--sp-8);transition:margin-left var(--t-base)}
/* Menú secundario (lista de clases / pestañas admin): panel fijo a la derecha del rail */
.subnav{position:fixed;top:var(--head-h);left:var(--side-w);bottom:0;width:var(--sub-w);z-index:54;padding-top:var(--sp-4);
  background:#fff;border-right:1px solid var(--pame-line);overflow-y:auto;transition:left var(--t-base),transform var(--t-base);display:flex;flex-direction:column}
/* Sidebar FIJO al borde izquierdo, de punta a punta */
.dash-side{position:fixed;top:var(--head-h);left:0;bottom:0;width:var(--side-w);z-index:55;background:var(--menu-bg,#fff);border-right:1px solid var(--pame-line);
  display:flex;flex-direction:column;gap:var(--sp-4);padding:var(--sp-4) 12px 16px;overflow-y:auto;transition:width var(--t-base),transform var(--t-base)}
.dash-collapse{align-self:flex-end;background:none;border:1px solid var(--pame-line);border-radius:var(--r-sm);color:var(--menu-fg,var(--fg-3));
  width:34px;height:30px;display:grid;place-items:center;cursor:pointer;padding:0;flex:none;transition:all var(--t-fast)}
.dash-collapse:hover{border-color:var(--pame-blue);color:var(--pame-blue);background:var(--pame-blue-10)}
.dash-collapse svg{width:16px;height:16px;transition:transform var(--t-base)}
body.side-collapsed .dash-collapse{align-self:center}
body.side-collapsed .dash-collapse svg{transform:rotate(180deg)}
.dash-nav{display:flex;flex-direction:column;gap:2px}
body.side-collapsed .dash-nav-item{justify-content:center;padding:12px 0;gap:0}
body.side-collapsed .dash-nav-item span,body.side-collapsed .dash-promo{display:none}
.dash-side-backdrop{display:none}
.dash-nav-item{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:var(--r-md);color:var(--menu-fg,var(--fg-2));
  font-size:var(--fs-14);font-weight:600;cursor:pointer;text-decoration:none;transition:all var(--t-fast);margin-bottom:2px}
.dash-nav-item svg{width:20px;height:20px;flex:none}
.dash-nav-item:hover{background:var(--pame-blue-10);color:var(--pame-blue-700)}
/* Sección activa: degradado teal de marca (mismo del rail del panel del dueño), en vez del
   navy plano. Sale de --icon-grad-1/2 → default teal Educreia, pisable por academia en fase 2. */
.dash-nav-item.on{background:linear-gradient(180deg,var(--icon-grad-1,#08ABBB),var(--icon-grad-2,#0A6E80));color:#fff}
/* Iconos del rail rellenos con degradado (fill="url(#eduGrad)"): en el ítem activo (fondo navy)
   se fuerzan a blanco para que contrasten, igual que el rail del panel del dueño. */
.dash-nav-item.on svg{fill:#fff}
.dash-promo{background:linear-gradient(160deg,var(--pame-teal-10),var(--pame-blue-10));border:1px solid var(--pame-blue-20);
  border-radius:var(--r-lg);padding:20px;text-align:left;position:relative;overflow:hidden}
.dash-promo h4{margin:0 0 6px;font-size:var(--fs-16);color:var(--fg-1)}
.dash-promo p{margin:0 0 60px;font-size:var(--fs-12);color:var(--fg-2);line-height:1.5}
.dash-promo-ic{position:absolute;right:14px;bottom:52px;color:var(--pame-teal);opacity:.5}
.dash-promo-ic svg{width:52px;height:52px}
.dash-promo-btn{display:inline-block;background:#fff;border:1px solid var(--pame-blue-20);color:var(--pame-blue-700);
  border-radius:var(--r-pill);padding:9px 16px;font-size:var(--fs-12);font-weight:700;cursor:pointer;text-decoration:none}
.dash-promo-btn:hover{background:var(--btn-bg);color:#fff;border-color:var(--pame-blue)}
/* Main */
.dash-main{max-width:1180px;margin:0 auto;min-width:0}
.dash-hola{font-family:var(--font-display);font-weight:400;font-size:var(--fs-40);margin:0 0 4px}
.dash-sub{color:var(--fg-3);font-size:var(--fs-14);margin:0 0 var(--sp-5)}
/* Stats */
.dash-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:0;background:#fff;border:1px solid var(--pame-line);
  border-radius:var(--r-lg);padding:6px 4px;box-shadow:var(--shadow-xs);margin-bottom:var(--sp-6)}
.stat{display:flex;align-items:center;gap:14px;padding:18px 20px;position:relative}
.stat:not(:last-child)::after{content:"";position:absolute;right:0;top:22%;height:56%;width:1px;background:var(--pame-line)}
.stat-ic{width:48px;height:48px;flex:none;border-radius:var(--r-md);display:grid;place-items:center}
.stat-ic svg{width:24px;height:24px}
.stat-ic.teal{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.stat-ic.orange{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.stat-ic.blue{background:var(--pame-blue-10);color:var(--pame-blue-700)}
/* Variante rellena (glifo con fill:url(#eduGrad), sin cajita tintada). Scopeada a
   .fill para no tocar los .stat-ic con caja de otras páginas (afiliaciones/progreso). */
.stat-ic.fill{width:auto;height:auto;background:none;border-radius:0}
.stat-ic.fill svg{width:30px;height:30px}
.stat-donut{width:52px;height:52px;flex:none}
.stat-donut svg{width:52px;height:52px}
.stat-txt{display:flex;flex-direction:column;min-width:0}
.stat-lbl{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.stat-num{font-size:var(--fs-24);font-weight:800;color:var(--fg-1);line-height:1.1;font-family:var(--font-sans)}
.stat-sub{font-size:11px;color:var(--fg-3)}
/* Sección cursos */
.dash-sec-head{display:flex;justify-content:space-between;align-items:baseline;margin:0 0 var(--sp-4)}
.dash-sec-tit{font-family:var(--font-display);font-weight:400;font-size:var(--fs-24);color:var(--fg-1);margin:0}
.dash-verall{color:var(--text-accent);font-size:var(--fs-14);font-weight:700;text-decoration:none;cursor:pointer}
.dash-verall:hover{text-decoration:underline}
/* En el celular el título de sección y el "ver todas" no entran en una línea:
   apilamos para que el título no se parta contra el link. */
@media(max-width:560px){
  .dash-sec-head{flex-direction:column;align-items:flex-start;gap:var(--sp-1)}
}
/* Card nueva con ilustración */
.curso-card.cc-new{padding:0;overflow:hidden;display:flex;flex-direction:column}
.cc-ilus{position:relative;background:var(--pame-bg-soft);border-bottom:1px solid var(--pame-line);height:188px;display:grid;place-items:center;overflow:hidden}
.cc-ilus svg{height:104px;width:auto}
.cc-ilus.has-img{padding:0}
.cc-ilus .cc-cover{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.cc-badge{position:absolute;top:12px;right:12px;padding:4px 11px;border-radius:var(--r-pill);font-size:11px;font-weight:700;display:inline-flex;align-items:center;gap:5px}
.cc-badge::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.cc-badge.prog{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.cc-badge.new{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.cc-badge.done{background:#E4F5EC;color:#1E7A4E}
.cc-body{padding:18px 20px 20px;display:flex;flex-direction:column;flex:1}
.cc-prog{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--pame-orange);margin-bottom:4px}
.cc-body h3{font-family:var(--font-display);font-weight:400;font-size:var(--fs-20);color:var(--fg-1);margin:0 0 6px;line-height:1.15}
.cc-body p{font-size:var(--fs-14);color:var(--fg-3);margin:0 0 14px;flex:1}
.cc-barwrap{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.cc-barwrap .mini-bar{flex:1}
.cc-pct{font-size:var(--fs-12);font-weight:700;color:var(--pame-teal-700)}
.cc-clases{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.cc-clases svg{width:13px;height:13px;color:var(--pame-blue)}
/* Precio en la tarjeta de la tienda (catálogo). "desde" en chico, el número grande. */
.cc-price{display:inline-flex;align-items:baseline;gap:6px;color:var(--fg-1);font-weight:800;font-size:var(--fs-16)}
.cc-price small{font-size:var(--fs-12);font-weight:600;color:var(--fg-3)}
.cc-badge.tengo{background:var(--pame-teal-10);color:var(--pame-teal-700)}

/* ── Aviso de "vista de alumno" para el admin de la academia ───────────────
   /tienda es la vidriera del alumno. Cuando entra el admin, no vende su propio
   contenido: le mostramos todos los cursos con acceso directo ("Entrar al
   curso") + un enlace chico "Ver ficha" para revisar cómo se ve el pitch.
   El aviso va arriba del grid; el link "Ver ficha" usa .cc-ver-ficha. */
.tienda-owner-notice{
  display:flex;align-items:center;gap:var(--sp-3);
  background:var(--pame-blue-10);border:1px solid var(--pame-blue-20);
  border-radius:var(--r-sm);padding:var(--sp-3) var(--sp-4);
  margin:0 0 var(--sp-4);color:var(--pame-blue-700);
  font-size:var(--fs-13);line-height:var(--lh-normal);
}
.tienda-owner-notice svg{width:20px;height:20px;flex:none;color:var(--pame-blue)}
/* "Ver ficha" en el pie de la tarjeta (solo el admin lo ve). Va como link
   pelado, sin inline-flex — la tarjeta es angosta y cualquier flex que le
   diéramos apilaba las palabras en columnas. */
.cc-ver-ficha{color:var(--pame-blue);font-weight:700;font-size:var(--fs-13);
  text-decoration:none;white-space:nowrap}
.cc-ver-ficha:hover{text-decoration:underline}

/* ── Formación con el acceso suspendido ────────────────────────────────────
   El alumno bloqueado (inscripción 'pausada', ver db/bloqueo-acceso.sql) sigue
   viendo la tarjeta, pero apagada y sin botón para entrar: que el curso
   desapareciera del panel sin explicación era la peor manera de avisarle. */
.curso-card.cc-bloq{opacity:.9}
.cc-bloq .cc-ilus{filter:grayscale(1)}
.cc-bloq .cc-ilus::after{content:"";position:absolute;inset:0;background:var(--pame-bg-soft);opacity:.45}
.cc-badge.bloq{background:#FBE8E6;color:var(--pame-danger);z-index:1}
.cc-bloq-motivo{font-size:var(--fs-14);color:var(--fg-2);margin:0 0 var(--sp-3);flex:1}
.cc-bloq-motivo b{color:var(--pame-danger)}
.cc-bloq .cc-clases{color:var(--fg-3)}
.cc-bloq .btn-card{background:var(--pame-bg-soft);color:var(--fg-1);border:1px solid var(--pame-line)}
.cc-bloq .btn-card:hover{background:var(--pame-line)}
/* El mismo aviso, a pantalla completa, cuando entra derecho a la formación. */
.bloq-cartel{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-lg);
  box-shadow:var(--shadow-sm);padding:var(--sp-6);margin-top:var(--sp-6);max-width:620px;text-align:center}
.bloq-icono{font-size:var(--fs-32);line-height:1;display:block;margin-bottom:var(--sp-3)}
.bloq-cartel h1{margin:0 0 var(--sp-3)}
.bloq-txt{font-size:var(--fs-16);color:var(--fg-2);margin:0 0 var(--sp-3);line-height:1.55}
.bloq-txt b{color:var(--pame-danger)}
.bloq-desde{font-size:var(--fs-12);font-weight:700;color:var(--fg-3);margin:0 0 var(--sp-5)}
.bloq-cartel .btn-card{display:inline-block}

/* Desglose de progreso por curso (página Progreso) */
.prog-cards{display:flex;flex-direction:column;gap:12px}
.prog-row{background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-lg);padding:16px 20px;box-shadow:var(--shadow-xs)}
.pr-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:12px}
.pr-tit{min-width:0}
.pr-tit h3{margin:0;font-size:var(--fs-16);color:var(--pame-blue)}
.pr-tit .cc-prog{display:block}
.pr-head .cc-badge{position:static;top:auto;right:auto;flex:none}
.pr-foot{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
/* Banner impulso */
.dash-banner{display:flex;align-items:center;gap:16px;background:#fff;border:1px solid var(--pame-line);
  border-left:4px solid var(--pame-orange);border-radius:var(--r-lg);padding:18px 22px;margin-top:var(--sp-6);box-shadow:var(--shadow-xs)}
.db-ic{width:48px;height:48px;flex:none;border-radius:var(--r-md);background:var(--pame-blue-10);color:var(--pame-blue-700);display:grid;place-items:center}
.db-ic svg{width:26px;height:26px}
.db-txt{flex:1;display:flex;flex-direction:column}
.db-txt b{font-size:var(--fs-16);color:var(--fg-1)}
.db-txt span{font-size:var(--fs-14);color:var(--fg-3)}
.db-btn{flex:none;background:var(--pame-blue-900);color:#fff;border-radius:var(--r-md);padding:11px 18px;font-size:var(--fs-14);font-weight:700;text-decoration:none;cursor:pointer}
.db-btn:hover{background:var(--btn-bg-h)}
/* #avisos-cont dentro del main del dashboard no debe recentrarse */
.dash-main #avisos-cont{max-width:none;margin:0;padding:0 0 var(--sp-5)}
@media(max-width:980px){
  .dash-menu-btn{display:grid}
  .dash-body{margin-left:0}
  .dash-side{transform:translateX(-100%);width:250px;box-shadow:var(--shadow-lg);padding-top:20px}
  body.side-open .dash-side{transform:none}
  /* En móvil el panel siempre se ve completo (con textos), aunque esté "colapsado" en desktop */
  body.side-collapsed .dash-nav-item{justify-content:flex-start;padding:12px 14px;gap:12px}
  body.side-collapsed .dash-nav-item span{display:inline}
  body.side-collapsed .dash-promo{display:block}
  .dash-collapse{display:none}
  .dash-side-backdrop{display:block;position:fixed;inset:0;background:rgba(2,51,77,.4);z-index:54;opacity:0;pointer-events:none;transition:opacity var(--t-base)}
  body.side-open .dash-side-backdrop{opacity:1;pointer-events:auto}
  .dash-stats{grid-template-columns:repeat(2,1fr)}
  .stat:nth-child(2)::after{display:none}
}
@media(max-width:560px){ .dash-stats{grid-template-columns:1fr} .stat::after{display:none!important} }

/* Herramientas dentro del sidebar del dashboard (calc, timer, tamaño de texto) */
.dash-tools{margin-top:auto;border-top:1px solid var(--pame-line);padding-top:12px;display:flex;flex-direction:column;gap:4px}
.dash-tools-lbl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--menu-fg,var(--fg-3));opacity:.65;padding:0 8px 4px}
.dash-tools .tool-btn.side{width:100%;justify-content:flex-start;gap:12px;border:none;background:none;padding:11px 14px;border-radius:var(--r-md);color:var(--menu-fg,var(--fg-2));font-size:var(--fs-14);font-weight:600}
.dash-tools .tool-btn.side svg{width:20px;height:20px}
.dash-tools .tool-btn.side:hover{background:var(--pame-blue-10);color:var(--pame-blue-700)}
.size-ctl.in-side{position:static;left:auto;bottom:auto;z-index:auto;margin:6px 6px 0;justify-content:center;
  border:1px solid var(--pame-line);border-radius:var(--r-md);background:#fff;padding:4px}
/* Colapsado: solo íconos, sin etiqueta ni barra de tipografía */
body.side-collapsed .dash-tools-lbl{display:none}
body.side-collapsed .dash-tools .tool-btn.side{justify-content:center;padding:11px 0;gap:0}
body.side-collapsed .dash-tools .tool-btn.side span{display:none}
body.side-collapsed .size-ctl.in-side{display:none}
@media(max-width:980px){
  body.side-collapsed .dash-tools .tool-btn.side{justify-content:flex-start;padding:11px 14px;gap:12px}
  body.side-collapsed .dash-tools .tool-btn.side span{display:inline}
  body.side-collapsed .size-ctl.in-side{display:flex}
}
/* Orden dentro de Herramientas: label, calc, timer, y el tamaño de texto al final */
.dash-tools .dash-tools-lbl{order:0}
.dash-tools .tool-btn.side{order:1}
.dash-tools .size-ctl.in-side{order:2}

/* Timer activo visible en la barra (color + tiempo restante) */
.tt-time{font-weight:800;font-variant-numeric:tabular-nums}
.tool-btn.side .tt-time{margin-left:auto;padding-left:8px;font-size:var(--fs-12)}
.tool-btn:not(.side) .tt-time:not(:empty){margin-left:6px;font-size:11px}
.tool-btn.tmr-on{color:var(--pame-teal-700)!important;background:var(--pame-teal-10)!important;border-color:var(--pame-teal-40)!important}
/* Icono relleno con degradado (fill="url(#eduGrad)"): en marcha/terminado se pisa el fill con
   color sólido para que el botón siga señalando el estado, igual que hacía el icono de línea. */
.tool-btn.tmr-on svg{color:var(--pame-teal);fill:var(--pame-teal)}
.tool-btn.tmr-done{color:var(--pame-orange-600)!important;background:var(--pame-orange-10)!important;border-color:var(--pame-orange-40)!important;animation:tmrPulse 1.1s ease-in-out infinite}
.tool-btn.tmr-done svg{fill:var(--pame-orange-600)}
@keyframes tmrPulse{50%{opacity:.55}}

/* Editor de ficha de producto (admin) */
.pf-li{display:flex;gap:8px;align-items:center;margin-bottom:6px}
.pf-li input{flex:1}
.pf-li-del{flex:none;padding:6px 10px}
/* Ficha: listas con ícono elegible (barra de stats + "qué incluye").
   Ojo: `.adm-field input/select` fuerza width:100%, así que acá hay que ganarle
   con selectores de 2 clases (misma especificidad, pero declarados después). */
.pf-ico-lista{display:flex;flex-direction:column;gap:8px}
.pf-ico-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;
  background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-md);padding:8px 10px}
.pf-ico-prev{flex:none;width:34px;height:34px;display:grid;place-items:center;border:1px solid var(--pame-line);border-radius:var(--r-md);background:var(--pame-cream,#f7f4ee)}
.pf-ico-prev svg{width:20px;height:20px;color:var(--pame-blue)}
.pf-ico-row .pf-ico-sel{flex:0 0 172px;width:172px;min-width:0;padding:8px 10px}
.pf-ico-row .pf-ico-inp{flex:1 1 160px;width:auto;min-width:0}
.pf-ico-row .pf-ico-inp.wide{flex:1 1 260px}
.pf-ico-row .pf-ico-del{flex:none;margin-left:auto;padding:6px 10px}
.pf-ico-foot{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:4px}
@media (max-width:760px){
  .pf-ico-row .pf-ico-sel{flex:1 1 140px;width:auto}
  .pf-ico-row .pf-ico-inp{flex:1 1 100%}
}
/* Dónde va cada media en la ficha: checkboxes del video + botones por imagen */
.pf-slots{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:2px}
/* `label{}` global los pone en columna y en mayúsculas: hay que revertir las dos cosas. */
.pf-slot{display:flex;flex-direction:row;align-items:center;gap:6px;font-size:var(--fs-12);color:var(--fg-2);
  font-weight:600;cursor:pointer;text-transform:none;letter-spacing:0}
.pf-slot input{width:16px;height:16px;flex:none;margin:0;accent-color:var(--pame-teal);cursor:pointer}
.pf-img-box{display:flex;flex-direction:column;gap:6px;width:150px;cursor:grab;border-radius:var(--r-md);
  transition:opacity var(--t-fast),box-shadow var(--t-fast)}
.pf-img-box:active{cursor:grabbing}
.pf-img-box.dragging{opacity:.4}
.pf-img-box.over{box-shadow:0 0 0 2px var(--pame-blue)}
.pf-img-slots{display:flex;gap:6px}
.pf-img-mov{display:flex;gap:6px}
.pf-mov{flex:1;width:auto;margin:0;padding:3px 4px;min-height:0;font-size:11px;line-height:1.4;cursor:pointer;
  background:#fff;border:1px solid var(--pame-line);color:var(--fg-2);border-radius:var(--r-sm)}
.pf-mov:hover:not(:disabled){border-color:var(--pame-blue);color:var(--pame-blue)}
.pf-mov:disabled{opacity:.35;cursor:default}
/* Número de orden + botón de recorte sobre la miniatura */
.pf-img-n{position:absolute;top:6px;left:6px;min-width:20px;height:20px;padding:0 5px;display:grid;place-items:center;
  background:rgba(2,51,77,.72);color:#fff;border-radius:var(--r-pill);font-size:11px;font-weight:800;line-height:1}
.pf-img-crop{position:absolute;bottom:6px;right:6px;width:26px;height:26px;padding:0;margin:0;display:grid;place-items:center;
  background:rgba(2,51,77,.72);color:#fff;border:none;border-radius:50%;cursor:pointer;font-size:13px;line-height:1;
  box-shadow:0 1px 4px rgba(2,51,77,.3);transition:background var(--t-fast)}
.pf-img-crop:hover{background:var(--btn-bg)}
.pf-slot-btn{flex:1;width:auto;margin:0;padding:5px 4px;min-height:0;font-size:11px;font-weight:700;cursor:pointer;
  background:#fff;border:1px solid var(--pame-line);color:var(--fg-3);border-radius:var(--r-sm);white-space:nowrap}
.pf-slot-btn:hover{border-color:var(--pame-blue);color:var(--pame-blue)}
.pf-slot-btn.on{background:var(--pame-blue-10);border-color:var(--pame-blue);color:var(--pame-blue-700)}
/* Rotación de la galería: etiqueta + select, en una línea */
.pf-rot{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;margin-top:var(--sp-3)}
.pf-rot span{font-size:var(--fs-12);color:var(--fg-2);font-weight:600}
.pf-rot .adm-select{width:auto}
/* En el celular el select de íconos con `width:auto` se estiraba al ancho de su
   opción más larga y empujaba el editor de costado. Apilado + ancho completo. */
@media(max-width:720px){
  .pf-rot{flex-direction:column;align-items:stretch}
  .pf-rot .adm-select{width:100%;min-width:0}
}
.pf-imgs{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-start}
.pf-img{position:relative;width:150px;height:100px;border-radius:var(--r-md);overflow:hidden;border:1px solid var(--pame-line);box-shadow:var(--shadow-xs)}
.pf-img img{width:100%;height:100%;object-fit:cover;display:block}
.pf-img-del{position:absolute;top:6px;right:6px;width:26px;height:26px;padding:0;margin:0;display:grid;place-items:center;
  background:rgba(2,51,77,.72);color:#fff;border:none;border-radius:50%;cursor:pointer;font-size:13px;line-height:1;
  box-shadow:0 1px 4px rgba(2,51,77,.3);transition:background var(--t-fast)}
.pf-img-del:hover{background:var(--pame-danger)}
.pf-img-add{width:150px;height:100px;border:1.5px dashed var(--pame-blue-30);border-radius:var(--r-md);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;text-align:center;padding:8px;
  color:var(--pame-blue-700);font-weight:700;font-size:var(--fs-12);cursor:pointer;background:var(--pame-blue-10);transition:all var(--t-fast)}
.pf-img-add svg{width:22px;height:22px;opacity:.85}
.pf-img-add small{font-weight:500;font-size:11px;color:var(--fg-3)}
.pf-img-add:hover,.pf-img-add.drag{border-color:var(--pame-blue);background:var(--pame-blue-20)}
.pf-img-add.drag{border-style:solid;transform:scale(1.02)}

/* ── Tipografía de interfaz: los títulos usan --font-display (= la del texto salvo que la
   academia elija una "Tipografía de títulos" en Apariencia) ── */
.panel h1,.dash-hola,.pp-title,.clase-titulo,.curso-titulo,.panel-title{font-family:var(--font-display);font-weight:800;letter-spacing:-0.02em}
.panel-title{font-size:var(--fs-40);margin:0 0 4px;color:var(--fg-1)}
h1,.seccion-tit,.dash-sec-tit,.prog-tit,.avisos-tit,.curso-card h3,.cc-body h3,.pb-head h4,.pame-display,h1.pame{font-family:var(--font-display)}
.logo .logo-main,.brand,.dash-tools-lbl{font-family:var(--font-sans)}
h1,.seccion-tit,.dash-sec-tit,.prog-tit,.avisos-tit,.curso-card h3,.cc-body h3,.pb-head h4,.pame-display{font-weight:700;letter-spacing:-0.01em}

/* Link público editable del curso (admin) */
.c-link-row{display:flex;align-items:center;gap:0;border:1px solid var(--pame-line);border-radius:var(--r-sm);overflow:hidden;background:#fff}
.c-link-base{padding:9px 4px 9px 12px;color:var(--fg-3);font-size:var(--fs-14);white-space:nowrap;background:var(--pame-bg-soft)}
.c-link-row input{flex:1;border:none!important;border-radius:0!important;padding:9px 10px}
.c-link-row input:focus{outline:none;box-shadow:none}
.c-link-row .btn-mini{flex:none;border-radius:0;border:none;border-left:1px solid var(--pame-line)}
@media(max-width:560px){.c-link-base{display:none}}

/* ── Menú superior sin subrayado + contenedores con sombra delicada (Bunny) ── */
.ghost{text-decoration:none}
.ghost:hover{text-decoration:none}
.curso-card,.aviso,.modulo,.datos-card,.notas-alumno,.adm-panel,.adm-editor,.prod-card,.co-card{box-shadow:var(--shadow-sm)}
.curso-card,.aviso,.modulo{border-radius:var(--r-lg)}

/* Título de avisos con ícono SVG (megáfono) */
.avisos-tit{display:flex;align-items:center;gap:8px}
.avisos-tit svg{width:22px;height:22px;color:var(--pame-orange);flex:none}

/* PaoBot: agrandar el chat + botones del header */
.pb-actions{display:flex;align-items:center;gap:8px;flex:none}
.pb-expand,.pb-reset{background:none;border:none;color:#fff;cursor:pointer;width:auto;padding:0;margin:0;opacity:.85;display:grid;place-items:center}
.pb-expand:hover,.pb-reset:hover{opacity:1;background:none}
.pb-expand svg,.pb-reset svg{width:17px;height:17px}
.paobot-panel.big{width:560px;max-width:calc(100vw - 40px)}
.paobot-panel.big .pb-body{min-height:0;overflow:auto;display:flex;flex-direction:column}
.paobot-panel.big .pb-input{margin-top:auto}
/* En modo chat el que scrollea es .pb-msgs, no el cuerpo: si scrollean los dos, el
   campo de escribir se va de pantalla al crecer la conversación. */
.paobot-panel.vivo.big .pb-body{overflow:hidden}

/* Integraciones en una sola columna: bloques y campos apilados (evita desfasajes) */
.adm-integ{display:flex;flex-direction:column;gap:var(--sp-5)}
.adm-integ .adm-sub-block{margin:0}
/* Botones del admin: SIEMPRE su texto real (sentence case), nunca mayúsculas forzadas
   por reglas heredadas de label. Coherencia en todo el panel. */
.btn-add,.btn-mini,.btn-del,.btn-ico,.btn-card,.btn-sim-open{text-transform:none;letter-spacing:0}
/* Igualan botón y label-botón (p. ej. "Cambiar el logo" es un <label> con input file):
   sin display flex, el <label> es inline e ignora min-height → queda más bajo y desalineado. */
.btn-add,.btn-mini,.btn-del{display:inline-flex;align-items:center;justify-content:center;gap:6px;line-height:1.1}
/* Guarda del patrón [hidden]: el display:inline-flex de arriba le gana al atributo nativo,
   así que un botón con `hidden` seguiría visible sin esto. */
.btn-add[hidden],.btn-mini[hidden],.btn-del[hidden]{display:none}
/* Formularios de config: campos con ancho legible y alineados a la izquierda (el panel es
   full-width; sin esto los inputs se estiran de punta a punta). */
.adm-integ .adm-field > input:not([type=color]),
.adm-integ .adm-field > select,
.adm-integ .adm-field > textarea{max-width:560px;width:100%}
.adm-integ .adm-field .adm-row{max-width:560px}
.adm-integ .adm-field .adm-row input{max-width:none}
/* Aire entre la descripción de un bloque y su primer campo (antes quedaban pegados). */
.adm-sub-block > .ui-note--after{margin-bottom:var(--sp-4)}
/* Aire entre un checkbox y el campo que habilita (ej. "usar color de fondo" → el color). */
.adm-check + .adm-field{margin-top:var(--sp-3)}
.adm-integ .adm-grid{grid-template-columns:1fr}
.adm-integ .adm-field{max-width:none}
/* Vista previa de un mail: lienzo blanco propio del correo (como la hoja del
   certificado), alto relativo para que entre sin scrollear la página. */
.mail-frame{width:100%;height:70vh;border:var(--ctl-bd);border-radius:var(--r-sm);background:#fff}
/* Lista de cuentas del panel de plataforma (una fila por cliente) */
.ct-rows{
  --ui-cols:     minmax(120px,1.1fr) minmax(160px,1.5fr) minmax(150px,1.3fr) minmax(80px,.5fr) auto auto;
  --ui-cols-mob: 1fr auto;
}
/* Dominios y emails son tokens largos sin espacios: sin esto se desbordan de su
   celda y pisan la columna de al lado (min-width:auto de un grid item no lo deja
   achicarse). Que quiebren y envuelvan adentro de su columna. */
.ct-rows > .ui-row > span{ min-width:0; overflow-wrap:anywhere; }
/* Alumnos por academia (panel superadmin): 6 columnas, mismo criterio anti-desborde. */
.al-rows{
  --ui-cols:     minmax(160px,1.7fr) minmax(110px,1fr) minmax(110px,1fr) minmax(60px,.4fr) auto auto;
  --ui-cols-mob: 1fr auto;
}
.al-rows > .ui-row > span{ min-width:0; overflow-wrap:anywhere; }
/* Usuarios sin academia (huérfanos) y búsqueda para borrar un alumno puntual (panel superadmin) */
.huerf-rows{
  --ui-cols:     minmax(160px,1.9fr) minmax(110px,1fr) minmax(90px,.6fr) auto;
  --ui-cols-mob: 1fr auto;
}
.busc-rows{
  --ui-cols:     minmax(160px,1.7fr) minmax(140px,1.3fr) auto;
  --ui-cols-mob: 1fr auto;
}
.huerf-rows > .ui-row > span,
.busc-rows > .ui-row > span{ min-width:0; overflow-wrap:anywhere; }
/* Afiliados de Educreia (panel superadmin): 6 columnas + detalle desplegable. */
.af-rows{
  --ui-cols:     minmax(150px,1.6fr) minmax(120px,1.1fr) minmax(80px,.7fr) minmax(70px,.6fr) minmax(90px,.8fr) auto;
  --ui-cols-mob: 1fr auto;
}
.af-rows > .ui-row > span{ min-width:0; overflow-wrap:anywhere; }
.af-code{ font-family:var(--font-mono, monospace); font-size:var(--fs-13); background:var(--pame-bg-soft);
  padding:0 var(--sp-1); border-radius:var(--r-sm) }
.af-acc{ display:flex; flex-wrap:wrap; gap:var(--sp-1); align-items:center }
.af-det-box{ border:1px solid var(--pame-line); border-radius:var(--r-card);
  padding:var(--sp-3); margin:var(--sp-2) 0; background:var(--pame-bg-soft) }
/* Estado de un secreto al lado de su etiqueta ("· cargada ✓" / "· sin cargar") */
.adm-ok{color:var(--pame-teal-700)}
.adm-nop{color:var(--fg-3)}
/* Campo de clave: se le pone tope de ancho porque un input a lo ancho de la pantalla
   no ayuda a leer un secreto pegado. Va con la especificidad de .adm-integ .adm-field,
   que arriba lo saca. */
.adm-integ .bn-clave{--bn-clave-max:560px;max-width:var(--bn-clave-max)}
.bn-grid{margin-top:var(--gap-blk)}

/* Vista previa de los subtítulos: la franja de abajo de un video, con el estilo que se
   está por aplicar. El tamaño llega en px medidos sobre un player de --cap-ref de ancho,
   así que se traduce a un porcentaje del ancho del recuadro (100cqw): la proporción
   letra/pantalla se mantiene aunque acá la caja sea más chica que el player real.
   Los valores los pone capPintar() en admin.html como variables, no como estilos. */
.cap-prev{
  --cap-ref:1280;        /* ancho de player al que se refiere el tamaño en px */
  --cap-pad:.15em .4em;  /* la caja crece con la letra: acá va em, no --sp-* */
  --cap-prev-max:720px;  /* tope de ancho: a lo ancho del panel quedaba un cartelón */
  max-width:var(--cap-prev-max);
  container-type:inline-size;
  display:flex;align-items:flex-end;justify-content:center;
  aspect-ratio:16/5;
  padding:var(--sp-3);
  border-radius:var(--r-sm);
  background:#000;
  overflow:hidden;
}
.cap-prev-cue{
  font-family:var(--cap-fam,var(--font-sans));
  font-size:calc(var(--cap-fs,22) / var(--cap-ref) * 100cqw);
  line-height:var(--lh-normal);
  text-align:center;
  color:var(--cap-color,#fff);
  background:var(--cap-bg,#000);
  padding:var(--cap-pad);
}

/* Vista previa de la marca de agua del video: el rincón de arriba a la izquierda del
   player, con los mismos dos renglones que ve el alumno. No redefine nada: pone la caja
   negra y deja que la dibuje .video-wm, la misma clase que usa la clase de verdad. */
.wm-prev{
  --wm-prev-max:720px;   /* mismo tope que .cap-prev: son dos previews hermanas */
  max-width:var(--wm-prev-max);
  position:relative;
  aspect-ratio:16/5;
  border-radius:var(--r-sm);
  background:#000;
  overflow:hidden;
}

/* Filtro por fecha + columnas ordenables (Ventas / Alumnos) */
.filtro-fecha{display:inline-flex;flex-direction:row;align-items:center;gap:6px;font-size:var(--fs-12);color:var(--fg-3);font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.filtro-fecha input{font-size:var(--fs-14);padding:7px 9px;border:1px solid var(--pame-line);border-radius:var(--r-sm);font-family:var(--font-sans);color:var(--fg-1)}
table.sortable th[data-sort]{cursor:pointer;user-select:none;white-space:nowrap}
table.sortable th[data-sort]:hover{color:var(--pame-blue)}
table.sortable th[data-sort]::after{content:"↕";opacity:.35;margin-left:5px;font-size:10px}
table.sortable th.sorted-asc::after{content:"↑";opacity:1;color:var(--pame-blue)}
table.sortable th.sorted-desc::after{content:"↓";opacity:1;color:var(--pame-blue)}

/* ── Pie de página compartido (footer.js) ── */
/* Oculto hasta que footer.js lo revela (cuando el contenido #app ya se ve), para que
   no se vea SOLO el footer sobre la página en blanco durante la carga. */
.site-footer{border-top:1px solid var(--pame-line);background:var(--footer-bg,var(--pame-bg));color:var(--footer-fg,var(--fg-3));opacity:0;transition:opacity var(--t-slow) var(--ease-out)}
.site-footer.sf-on{opacity:1}
/* Sticky footer: el body se vuelve una columna flex de alto mínimo = viewport y el pie
   se empuja al fondo con margin-top:auto. Así el footer nunca "sube" cuando el contenido
   es corto. footer.js agrega .sf-sticky al body en cada página que tiene footer. */
body.sf-sticky{display:flex;flex-direction:column;min-height:100vh}
body.sf-sticky .site-footer{margin-top:auto}
body.dash-body-page .site-footer{margin-left:calc(var(--side-w) + var(--sub-w));transition:margin-left var(--t-base)}
.sf-inner{max-width:1180px;margin:0 auto;padding:22px var(--sp-6);display:flex;flex-wrap:wrap;gap:10px 24px;
  align-items:center;justify-content:space-between}
.sf-links{display:flex;flex-wrap:wrap;gap:8px 18px}
.sf-links a{color:var(--footer-fg,var(--fg-3));font-size:var(--fs-12);font-weight:600;text-decoration:none}
.sf-links a:hover{color:var(--pame-blue)}
.sf-arrep{color:var(--pame-orange-600)}
.sf-legal{color:var(--footer-fg,var(--fg-3));font-size:var(--fs-12)}
/* Redes sociales del pie: iconitos circulares con el logo de cada red. La academia
   elige cuáles carga; las que no cargó no aparecen. Se pintan siempre (aunque no
   haya ninguna, .sf-social ni siquiera se renderiza — footer.js no imprime nada).
   El fondo y el color del icono heredan de --sf-social-bg / --sf-social-fg, con
   default neutro para que la marca no se rompa por defecto; una academia puede
   pisarlos si quiere igualar su color de acento. */
.sf-social{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.sf-social-btn{
  width:32px;height:32px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;
  background:var(--sf-social-bg,var(--pame-blue,#0E2A46));color:var(--sf-social-fg,#fff);
  text-decoration:none;transition:transform var(--t-base) var(--ease-out),opacity var(--t-base) var(--ease-out)
}
.sf-social-btn:hover{transform:translateY(-1px);opacity:.9}
.sf-social-btn svg{width:16px;height:16px;fill:currentColor;display:block}
/* Burbuja flotante de WhatsApp: fija en la esquina inferior derecha del viewport,
   como la que se ve en Tiendup y en un montón de tiendas. Verde de WhatsApp
   (#25D366) por identificación — es una convención tan clara que no la tocamos
   con la marca de cada academia (si en algún plan queremos re-teñirla, alcanza
   con pisar --wa-burbuja-bg). En móvil sube un poco para no chocar con la barra
   inferior de compra fija (.pp-mbar). z-index alto pero por debajo de modales. */
.wa-burbuja{
  position:fixed; right:22px; bottom:22px; z-index:1200;
  width:56px; height:56px; border-radius:999px; display:inline-flex; align-items:center; justify-content:center;
  background:var(--wa-burbuja-bg,#25D366); color:#fff;
  box-shadow:0 6px 18px rgba(0,0,0,.22), 0 2px 6px rgba(0,0,0,.14);
  text-decoration:none; transition:transform var(--t-base) var(--ease-out),box-shadow var(--t-base) var(--ease-out)
}
.wa-burbuja:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.28),0 3px 8px rgba(0,0,0,.16)}
.wa-burbuja svg{width:30px;height:30px;fill:currentColor;display:block}
@media(max-width:640px){ .wa-burbuja{right:14px;bottom:14px;width:52px;height:52px} .wa-burbuja svg{width:28px;height:28px} }
/* Si el Vendedor IA (comercial-ia.js) montó su widget en esta página, escondemos la
   burbuja de WhatsApp: los dos usan la misma esquina inferior derecha y se pisarían.
   El Vendedor IA gana porque es diferencial del producto y responde 24/7; el WhatsApp
   sigue presente en el iconito del pie. Con :has() reacciona sola cuando el widget
   aparece o desaparece, sin necesidad de una clase del body ni de un observer en JS. */
body:has(.ci-wrap) .wa-burbuja{ display:none }
/* Atribución "Hecho con Educreia": barrita propia, chiquita y centrada, DEBAJO del pie
   (así no se amontona con la línea legal cuando el nombre de la academia es largo). Solo
   aparece en dominios de academia (ver footer.js). */
.sf-madeby{padding:10px var(--sp-6);text-align:center}
.sf-madeby a{color:var(--footer-fg,var(--fg-3));font-size:var(--fs-11);text-decoration:none}
.sf-madeby a strong{font-weight:700;color:var(--footer-fg,var(--fg-2))}
.sf-madeby a:hover,.sf-madeby a:hover strong{color:var(--pame-blue)}
@media(max-width:980px){ body.dash-body-page .site-footer{margin-left:0} }
@media(max-width:640px){ .sf-inner{flex-direction:column;align-items:flex-start;gap:12px} }

/* ── Páginas legales/informativas ── */
.legal-top{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px var(--sp-6);
  background:var(--pame-bg);border-bottom:1px solid var(--pame-line)}
.legal-top img{height:38px;width:auto;display:block}
.legal-wrap{max-width:820px;margin:0 auto;padding:var(--sp-6) var(--sp-5) var(--sp-8)}
.legal-wrap h1{font-family:var(--font-display);font-weight:800;font-size:var(--fs-32);letter-spacing:-0.02em;margin:0 0 6px}
.legal-wrap .upd{color:var(--fg-3);font-size:var(--fs-12);margin:0 0 var(--sp-5)}
/* El texto lo escribe la escuela con el editor del panel, que produce h3 (no h2) y
   strong (no b). Se estilan los dos por si quedara algún documento viejo. */
.legal-wrap h2,.legal-wrap h3{font-size:var(--fs-20);margin:var(--sp-6) 0 8px}
.legal-wrap p,.legal-wrap li{font-size:var(--fs-14);color:var(--fg-2);line-height:var(--lh-loose)}
.legal-wrap ul{margin:0 0 var(--sp-4);padding-left:20px}
/* Los links a los otros dos documentos. Los pone la página, no el texto editable. */
.legal-ver{color:var(--fg-3);font-size:var(--fs-12);margin:var(--sp-6) 0 0}
.legal-wrap a{color:var(--pame-blue);font-weight:600}
/* Lo que la escuela todavía no completó de su documento legal.
   Se ve FUERTE y en la página pública, no solo en el panel: un término legal a medio
   llenar tiene que gritar que está a medio llenar. Disimularlo sería peor que el
   agujero que esto vino a tapar. Ver app/legales.js. */
/* Vista previa del documento dentro del panel: el mismo `.legal-wrap` de la página
   pública, pero encajonado y con scroll para que no empuje el formulario. */
.legal-prev{max-height:50vh;overflow-y:auto;background:var(--pame-bg);border:var(--ctl-bd);
  border-radius:var(--r-md);padding:var(--sp-5);margin:0}
.legal-falta{display:inline-block;background:var(--pame-orange-20);color:var(--pame-orange-600);
  border:var(--ctl-bd);border-color:currentColor;border-radius:var(--r-xs);
  padding:0 var(--sp-2);font-size:var(--fs-12);font-weight:700;letter-spacing:.02em}
.legal-note{background:var(--pame-orange-10);border:1px solid var(--pame-orange-30);border-radius:var(--r-md);
  padding:14px 16px;margin:0 0 var(--sp-6);font-size:var(--fs-12);color:var(--pame-ink-2)}
.legal-note b{color:var(--fg-1)}

/* Filas de plan de precio (editor de curso) */
.price-row{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr auto;gap:10px;align-items:end;margin-bottom:10px}
.price-row .adm-field{margin-bottom:0}
.price-row .btn-del{align-self:center}
.bump-row{grid-template-columns:1.5fr 1fr 1fr auto}
.price-row:has(.p-grupo){grid-template-columns:1.5fr 1fr 1fr 1fr 1.2fr auto}
@media(max-width:720px){.price-row,.price-row:has(.p-grupo){grid-template-columns:1fr 1fr}}

/* Grupos del curso (cohortes) — panel del admin + chips de visibilidad */
.gr-panel[data-vacio]{background:transparent}
/* Filas de grupo: un solo grid (.ui-rows), así las columnas se alinean
   entre TODAS las filas aunque alguna no tenga el badge de vigente. */
.gr-rows{--ui-cols:auto minmax(160px,1.4fr) minmax(150px,1.2fr) auto auto auto;
  --ui-cols-mob:auto 1fr auto}
.gr-rows .gr-nombre{font-weight:700}
.gr-rows .gr-vig{white-space:nowrap;background:var(--pame-teal-10);color:var(--pame-teal-700);
  border:1px solid var(--pame-teal-30);text-transform:none;letter-spacing:0}
.gr-rows .gr-alu,.gr-rows .gr-del{white-space:nowrap}
@media(max-width:720px){
  /* Cada fila es su propia tarjeta (ui.css): colocamos las celdas para que quede
     [punto][nombre] / [fecha] / [entran los nuevos] / [alumnos][✕]. El span vacío
     que alinea columnas en desktop no hace falta acá. */
  .gr-rows > .ui-head{display:none}
  .gr-row > span:empty{display:none}
  .gr-rows .gr-color{grid-column:1}
  .gr-rows .gr-nombre{grid-column:2/-1}
  .gr-rows .gr-inicio{grid-column:1/-1}
  .gr-rows .gr-vig{grid-column:1/-1;justify-self:start}
  .gr-rows .gr-alu{grid-column:1/3;justify-self:start}
  .gr-rows .gr-del{grid-column:3;justify-self:end}
}
.adm-badge.gr-chip{background:color-mix(in srgb,var(--gr) 14%,transparent);color:var(--gr);
  border:1px solid color-mix(in srgb,var(--gr) 38%,transparent);text-transform:none;letter-spacing:0}
/* "Solo estos grupos": marca discreta antes de las pastillas de grupo (ver renderModulos). */
.adm-badge.gr-solo{display:inline-flex;align-items:center;gap:4px;background:var(--pame-bg-soft);
  color:var(--fg-3);border:1px solid var(--pame-line)}
.adm-badge.gr-solo .ic{width:12px;height:12px}
/* FAQ curada de PaoBot. Una sola LÍNEA por pregunta: se recorre la lista de un vistazo
   y se edita ahí mismo. Un solo grid, así las columnas se alinean entre todas las filas. */
.faq-rows{--ui-cols:auto minmax(240px,3fr) minmax(110px,.9fr) minmax(110px,.9fr) auto auto auto;
  --ui-cols-mob:auto 1fr auto auto}
/* ui.css alinea las celdas de texto con justify-self:start, así que la celda se encoge
   al ancho del texto y el recorte con puntos suspensivos nunca llega a activarse: la
   pregunta larga se montaba sobre la columna de al lado. Estas tres ocupan su columna. */
.faq-rows .ui-row > .faq-preg,
.faq-rows .ui-row > .faq-cat,
.faq-rows .ui-row > .faq-curso{justify-self:stretch}
/* La pregunta no puede empujar la fila a dos renglones: se corta con puntos suspensivos
   y el texto completo queda en el title. */
.faq-rows .faq-preg{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.faq-rows .faq-cat,.faq-rows .faq-curso{color:var(--fg-3);font-size:var(--fs-12);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.faq-rows .faq-sin{opacity:.5}
.faq-rows .faq-usos{color:var(--fg-3);font-size:var(--fs-12);text-align:right;white-space:nowrap}
.faq-rows .faq-edit,.faq-rows .faq-del{padding-left:var(--sp-3);padding-right:var(--sp-3)}

/* Semáforo de activa/pausada: un punto que además es el interruptor.
   min-height:0 y align-self:center porque ui.css estira los botones de una fila a
   --ctl-h; sin esto el punto sale como un óvalo de 38px de alto. */
.faq-rows .faq-estado{width:var(--sp-3);height:var(--sp-3);min-height:0;border-radius:50%;padding:0;margin:0;
  align-self:center;justify-self:center;
  border:1px solid var(--pame-line);background:var(--bg-3);cursor:pointer}
.faq-rows .faq-estado.on{background:var(--pame-success);border-color:var(--pame-success)}
.faq-rows .faq-estado:hover{outline:2px solid var(--pame-teal-30)}

/* ── Bandeja de consultas (panel admin) ───────────────────────────────────
   Mismo patrón que la FAQ: una línea por consulta y el detalle —el video, las
   capturas y el cuadro de respuesta— se despliega justo debajo, dentro del
   mismo grid. */
.cns-rows{--ui-cols:auto minmax(140px,1.2fr) minmax(160px,1.6fr) auto auto auto;
  --ui-cols-mob:auto 1fr auto}
.cns-rows .ui-row > .cns-quien,
.cns-rows .ui-row > .cns-donde{justify-self:stretch}
.cns-rows .cns-quien{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.cns-rows .cns-donde{color:var(--fg-3);font-size:var(--fs-12);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;min-width:0}
.cns-rows .cns-adj,.cns-rows .cns-fecha{color:var(--fg-3);font-size:var(--fs-12);white-space:nowrap}
/* Semáforo: naranja sin abrir, azul leída, verde respondida. min-height:0 porque
   ui.css estira los hijos de una fila a --ctl-h. */
.cns-rows .cns-pin{width:var(--sp-3);height:var(--sp-3);min-height:0;border-radius:50%;
  align-self:center;justify-self:center;background:var(--pame-orange)}
.cns-rows .cns-pin.leida{background:var(--pame-blue-50)}
.cns-rows .cns-pin.respondida{background:var(--pame-success)}
.cns-detalle{grid-column:1/-1;background:var(--pame-bg-soft);border:1px solid var(--pame-line);
  border-radius:var(--r-md);padding:var(--sp-4)}
.cns-adm-ruta{margin:0 0 var(--sp-3);font-size:var(--fs-12);color:var(--fg-3)}
.cns-adm-texto{margin:0 0 var(--sp-4);font-size:var(--fs-14);color:var(--fg-1);white-space:pre-wrap}
.cns-adm-video{width:100%;max-height:70vh;border-radius:var(--r-sm);background:#000;display:block}
.cns-adm-imgs{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:var(--sp-3) 0}
.cns-adm-img{display:block;width:var(--sp-9);height:var(--sp-9);border:1px solid var(--pame-line);
  border-radius:var(--r-sm);overflow:hidden;background:#fff}
.cns-adm-img img{width:100%;height:100%;object-fit:cover;display:block}
/* Adjuntos de una entrega (bandeja de trabajos prácticos): links de descarga */
.ent-adjs{display:flex;flex-direction:column;gap:var(--sp-2);margin:var(--sp-3) 0}
.ent-adj{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-14);color:var(--pame-blue);
  text-decoration:none;padding:var(--sp-2) var(--sp-3);border:1px solid var(--pame-line);border-radius:var(--r-sm);background:#fff}
.ent-adj:hover{border-color:var(--pame-blue)}
@media(max-width:720px){
  .cns-rows > .ui-head{display:none}
  .cns-rows .cns-quien{grid-column:2/-1}
  .cns-rows .cns-donde{grid-column:2/-1}
  .cns-rows .cns-adj{grid-column:2}
  .cns-rows .cns-fecha{grid-column:3}
}

/* Filtro por categoría */
/* Uso de PaoBot: las preguntas que hicieron los alumnos.
   Las cifras de arriba reusan .dash-stats/.stat del panel del alumno; acá solo
   está lo que esa pieza no cubre. */
.pbq-rows{--ui-cols:auto minmax(120px,1fr) minmax(220px,3fr) auto auto auto auto;
  --ui-cols-mob:1fr auto}
/* Sin el stretch, .ui-rows deja cada celda del ancho de su contenido (justify-self:start)
   y el text-align:right no tiene contra qué alinearse. */
.pbq-rows .ui-row > .pbq-quien,
.pbq-rows .ui-row > .pbq-preg,
.pbq-rows .ui-row > .pbq-costo{justify-self:stretch}
/* Tokens: números tabulares para que los dígitos queden en columna. */
.pbq-rows .pbq-costo{text-align:right;white-space:nowrap}
.pbq-tok{font-size:var(--fs-12);color:var(--fg-2);font-weight:600;font-variant-numeric:tabular-nums}
.pbq-tok--cero{color:var(--pame-success)}
.pbq-donde{margin:0 0 var(--sp-2);font-size:var(--fs-12);color:var(--fg-3)}
/* Paginado */
.pbq-paginado{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-top:var(--sp-4)}
.pbq-paginado .btn-mini{width:auto;margin:0}
.pbq-pag-txt{font-size:var(--fs-12);color:var(--fg-3);margin:0 var(--sp-2)}
.pbq-porpag{height:var(--ctl-h);width:auto;margin:0;font-size:var(--fs-12)}
/* Configuración: el textarea del prompt necesita ancho y fuente pareja para que se lea
   como el texto que es, no como un campo de formulario. */
.pbcfg-instr{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--fs-12);line-height:1.55}
.pbcfg-abrir,.pbcfg-cerrar{width:auto;margin:0 0 0 var(--sp-3);font-size:var(--fs-12);
  font-weight:600;vertical-align:middle;font-family:var(--font-sans)}
.pbq-rows .pbq-preg{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* Día y hora en la misma celda: la hora va más apagada para que la fecha siga siendo lo
   primero que se lee. Tabulares, así los dos puntos quedan en columna entre filas. */
.pbq-rows .pbq-fecha{color:var(--fg-3);font-size:var(--fs-12);white-space:nowrap;
  font-variant-numeric:tabular-nums}
.pbq-rows .pbq-fecha i{font-style:normal;opacity:.7}
.pbq-rows .pbq-quien,.pbq-rows .pbq-clase{color:var(--fg-3);font-size:var(--fs-12);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.pbq-detalle{grid-column:1/-1;background:var(--pame-bg-soft);border:1px solid var(--pame-line);
  border-radius:var(--r-md);padding:var(--sp-4);margin-bottom:var(--sp-2)}
.pbq-rta{margin:0;font-size:var(--fs-14);color:var(--fg-2);white-space:pre-wrap}
.pbq-tokens{margin:var(--sp-3) 0 0;font-size:var(--fs-12);color:var(--fg-3);
  border-top:1px solid var(--pame-line);padding-top:var(--sp-2)}
/* Ranking de clases: una línea, no una tabla. Es para mirar de reojo. */
.pbq-top{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-2) var(--sp-4);margin-top:var(--sp-4)}
.pbq-top-lbl{font-size:var(--fs-12);font-weight:700;color:var(--fg-3);text-transform:uppercase;letter-spacing:.04em}
.pbq-top-item{font-size:var(--fs-12);color:var(--fg-3)}
.pbq-top-item b{color:var(--pame-blue);font-size:var(--fs-14)}
/* Lista anónima de preguntas (planes sin `preguntas_bot_detalle`): reemplaza a
   la tabla de detalle con solo el texto de la pregunta y su tipo, sin quién ni
   cuándo. Deduplica y muestra × N para las más repetidas. */
.pbq-anon{margin-top:var(--sp-4);padding-top:var(--sp-3);border-top:1px solid var(--pame-line)}
.pbq-anon h5{margin:0 0 var(--sp-1);font-size:var(--fs-14);color:var(--fg-1)}
.pbq-anon-lista{list-style:none;padding:0;margin:var(--sp-2) 0 0;display:flex;flex-direction:column;gap:var(--sp-1)}
.pbq-anon-lista li{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-2);
  padding:var(--sp-2) var(--sp-3);border:1px solid var(--pame-line);border-radius:var(--r-sm);background:var(--pame-bg-soft)}
.pbq-anon-preg{flex:1;min-width:0;font-size:var(--fs-14);color:var(--fg-1);word-break:break-word}
.pbq-anon-n{font-size:var(--fs-12);color:var(--fg-3);font-weight:600;font-variant-numeric:tabular-nums}
.pbq-busca{flex:1;min-width:180px;height:var(--ctl-h);margin:0}
/* Cabeceras ordenables: se ven como el resto de las etiquetas de columna, pero se tocan.
   La flechita queda siempre reservada para que el título no se corra al ordenar. */
.pbq-ord{background:none;border:none;padding:0;margin:0;width:auto;cursor:pointer;
  font:inherit;color:inherit;letter-spacing:inherit;text-transform:inherit;
  display:inline-flex;align-items:center;gap:var(--sp-1)}
.pbq-ord:hover{background:none;color:var(--pame-blue)}
.pbq-ord i{font-style:normal;opacity:.35;font-size:10px;width:9px;display:inline-block}
.pbq-ord.on{color:var(--pame-blue)}
.pbq-ord.on i{opacity:1}
/* Las dos de tokens van alineadas a la derecha, como sus números. */
.pbq-rows .ui-head > span:nth-child(4) .pbq-ord,
.pbq-rows .ui-head > span:nth-child(5) .pbq-ord{justify-content:flex-end;width:100%}
/* Va dentro del <h4>, así que hay que devolverle el peso y el tamaño de un botón. */
.pbq-refrescar{width:auto;margin:0 0 0 var(--sp-3);font-size:var(--fs-12);font-weight:600;
  vertical-align:middle;font-family:var(--font-sans)}
/* Rango de fechas. Los campos miden --ctl-h como cualquier control del sistema. */
.pbq-fechas{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-4)}
/* El `label` global apila en columna y pone el texto en mayúsculas (es el de los
   formularios): acá hay que revertir las dos cosas, o "Desde" queda arriba del campo y la
   fila entera se descentra contra los chips de al lado. */
.pbq-fecha-campo{display:flex;flex-direction:row;align-items:center;gap:var(--sp-2);
  height:var(--ctl-h);margin:0;padding:0;font-size:var(--fs-12);color:var(--fg-3);
  font-weight:600;white-space:nowrap;text-transform:none;letter-spacing:0}
.pbq-fecha-campo input{height:var(--ctl-h);margin:0;width:auto;font-size:var(--fs-14)}
.faq-filtros{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:var(--sp-4) 0}
.faq-chip{width:auto;margin:0;padding:0 var(--sp-3);height:var(--ctl-h);border-radius:var(--r-pill);
  border:1px solid var(--pame-line);background:#fff;color:var(--fg-2);font-size:var(--fs-12);
  font-weight:700;cursor:pointer;white-space:nowrap}
.faq-chip span{opacity:.55;margin-left:var(--sp-1)}
/* Sin esto se comen el `button:hover` global, que los pinta de azul lleno dejando el
   texto gris oscuro encima: ilegible. Apagado, el hover solo se insinúa; encendido,
   apenas oscurece el azul y el texto sigue blanco. */
.faq-chip:hover{background:var(--pame-bg-soft);border-color:var(--pame-blue);color:var(--pame-blue)}
.faq-chip.on{background:var(--btn-bg);border-color:var(--pame-blue);color:#fff}
.faq-chip.on:hover{background:var(--btn-bg-h);border-color:var(--pame-blue-700);color:#fff}
.faq-chip.on span{opacity:.75}

/* El editor se despliega dentro del mismo grid, ocupando el ancho completo justo debajo
   de su fila. Por eso es hijo directo de .ui-rows y no un panel aparte al pie. */
.faq-editor{grid-column:1/-1;background:var(--pame-bg-soft);border:1px solid var(--pame-line);
  border-radius:var(--r-md);padding:var(--sp-4)}
.faq-alta{margin-top:var(--sp-4)}

@media(max-width:720px){
  /* En el celular la pregunta pasa a ocupar el ancho entero y se lee completa;
     el resto queda como una línea de datos arriba y los botones abajo. */
  .pbq-rows > .ui-head{display:none}
  .pbq-rows .pbq-fecha{grid-column:1}
  .pbq-rows .pbq-quien{grid-column:2;text-align:right}
  .pbq-rows .pbq-preg{grid-column:1/-1;white-space:normal}
  /* Sin cabecera no hay forma de saber cuál es cuál, y en el celular no hay hover que
     valga: se etiquetan en la propia celda. */
  .pbq-rows .pbq-leidos{grid-column:1;text-align:left}
  .pbq-rows .pbq-escritos{grid-column:2;text-align:right}
  .pbq-rows .pbq-leidos::before{content:'leyó '}
  .pbq-rows .pbq-escritos::before{content:'escribió '}
  .pbq-rows .pbq-leidos::before,
  .pbq-rows .pbq-escritos::before{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
  .pbq-rows .pbq-ver{grid-column:2;justify-self:end}
  .pbq-rows .ui-row > .pbq-fecha{margin-top:var(--sp-4)}

  .faq-rows > .ui-head{display:none}
  .faq-rows .faq-preg{grid-column:2/-1}
  .faq-rows .faq-cat{grid-column:2}
  .faq-rows .faq-curso{grid-column:3}
  .faq-rows .faq-usos{grid-column:4;text-align:left}
  .faq-rows .faq-edit{grid-column:2}
  .faq-rows .faq-del{grid-column:3/-1}
  /* Sin esto, el hueco entre las líneas de una fila y el hueco entre filas son iguales
     y no se ve dónde termina cada una. */
  .faq-rows .ui-row > .faq-estado{margin-top:var(--sp-4)}
}

/* Preguntas al asistente de AYUDA de Educreia (panel de superadmin). Reutiliza las
   celdas pbq-* del listado del bot; solo cambia el grid: 4 columnas (cuándo · quién ·
   pregunta · ver), sin las de tokens. */
.aye-rows{--ui-cols:auto minmax(140px,1.2fr) minmax(220px,3fr) auto; --ui-cols-mob:1fr auto}
.aye-rows .ui-row > .pbq-quien,
.aye-rows .ui-row > .pbq-preg{justify-self:stretch}
.aye-rows .aye-aca{font-style:normal;opacity:.7}
.aye-costo{display:inline-block;margin-top:2px;font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
@media(max-width:720px){
  .aye-rows > .ui-head{display:none}
  .aye-rows .pbq-fecha{grid-column:1}
  .aye-rows .pbq-quien{grid-column:2;text-align:right}
  .aye-rows .pbq-preg{grid-column:1/-1;white-space:normal}
  .aye-rows .aye-ver{grid-column:2;justify-self:end}
  .aye-rows .ui-row > .pbq-fecha{margin-top:var(--sp-4)}
}

/* Consultas de soporte (bandeja del superadmin): estado en chip + caja para responder.
   Reusa .aye-rows / .pbq-detalle. */
.sop-chip{display:inline-block;font-size:var(--fs-12);font-weight:700;padding:0 var(--sp-2);
  border-radius:var(--r-pill);margin-right:var(--sp-1);vertical-align:middle}
.sop-esp{background:var(--pame-orange-10);color:var(--pame-orange)}
.sop-ok{background:var(--pame-teal-20);color:var(--pame-teal-700)}
.sop-cerr{background:var(--pame-bg-soft);color:var(--fg-3)}
.sop-form{margin-top:var(--sp-3)}
.sop-form .sop-txt{width:100%;box-sizing:border-box;font:inherit;font-size:var(--fs-14);
  padding:10px 12px;border:1px solid var(--pame-line);border-radius:var(--r-sm);
  background:#fff;color:var(--fg-1);resize:vertical;margin-bottom:var(--sp-2)}
.sop-form .btn-add,.sop-form .btn-mini{width:auto;margin:0}

/* Preguntas del bot de alumnos (panel de superadmin). Como .aye-rows pero con una
   columna más para el estado (sin material / técnico / FAQ): 5 columnas. */
.bot-rows{--ui-cols:auto minmax(150px,1.3fr) minmax(200px,3fr) auto auto; --ui-cols-mob:1fr auto}
.bot-rows .ui-row > .pbq-quien,
.bot-rows .ui-row > .pbq-preg{justify-self:stretch}
.bot-rows .aye-aca{font-style:normal;opacity:.7}
.bot-cta{width:auto;margin:0}
/* Filtro por fecha del Asistente Alumnos: etiqueta + input date, a la altura de los
   demás controles de la barra de filtros. */
.bot-fecha{display:inline-flex;align-items:center;gap:var(--sp-1);font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.bot-fecha input[type="date"]{height:var(--ctl-h);margin:0;width:auto}
.bot-fecha-x{margin:0}
@media(max-width:720px){
  .bot-rows > .ui-head{display:none}
  .bot-rows .pbq-fecha{grid-column:1}
  .bot-rows .pbq-quien{grid-column:2;text-align:right}
  .bot-rows .pbq-preg{grid-column:1/-1;white-space:normal}
  .bot-rows .bot-estado{grid-column:1;justify-self:start}
  .bot-rows .bot-ver{grid-column:2;justify-self:end}
  .bot-rows .ui-row > .pbq-fecha{margin-top:var(--sp-4)}
}

.gv-list{display:flex;flex-direction:column;gap:8px;margin-bottom:6px}
.gv-grupos{display:flex;flex-direction:column;gap:7px}

/* Pantalla "Alumnos y grupos": asignar uno por uno */
.dup-card.ancha{width:660px}
.ga-tools{display:flex;gap:10px;margin-bottom:10px}
.ga-tools input{flex:1;font-family:var(--font-sans);font-size:var(--fs-14);padding:8px 10px;
  border:1px solid var(--pame-line);border-radius:6px;background:#fff;color:var(--fg-1)}
.ga-bulk{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--r-sm);
  background:var(--pame-bg-soft);border:1px solid var(--pame-line);margin-bottom:10px}
.ga-list{max-height:46vh;overflow:auto;border:1px solid var(--pame-line);border-radius:var(--r-sm)}
/* Un solo grid para todas las filas (.ui-rows): antes cada fila era su propio
   grid y las columnas no se alineaban entre alumnos. */
.ga-rows{--ui-cols:auto minmax(160px,1fr) minmax(150px,190px) auto;
  --ui-cols-mob:auto 1fr;padding:var(--sp-2) var(--sp-3)}
.ga-rows .ga-chk{width:16px;height:16px;accent-color:var(--pame-blue);align-self:center}
.ga-rows .ui-row > .ga-nom{justify-self:stretch;align-self:center;
  line-height:1.35;min-width:0;overflow-wrap:anywhere}
.ga-rows .ga-bloq{white-space:nowrap}
/* Chip del alumno sin acceso: se ve de un vistazo quién está cortado y por qué. */
.ga-bloq-chip{display:inline-block;margin-top:var(--sp-1);font-size:var(--fs-12);font-weight:700;
  padding:var(--sp-1) var(--sp-2);border-radius:var(--r-pill);
  background:color-mix(in srgb,var(--pame-danger) 12%,transparent);color:var(--pame-danger)}
@media(max-width:720px){
  .ga-rows > .ui-head{display:none}
  .ga-rows .ga-sel,.ga-rows .ga-bloq{grid-column:2}
}

/* Progreso · constancia (días activos, racha, tira de actividad) — dashboard */
.dash-constancia{display:flex;flex-wrap:wrap;gap:18px 28px;align-items:center;justify-content:space-between;
  background:#fff;border:1px solid var(--pame-line);border-radius:var(--r-lg);padding:18px 22px;box-shadow:var(--shadow-xs);margin-bottom:var(--sp-6)}
.dc-nums{display:flex;gap:30px;flex-wrap:wrap}
.dc-num{display:flex;flex-direction:column}
.dc-num b{font-size:var(--fs-24);font-weight:800;color:var(--fg-1);line-height:1.1}
.dc-num span{font-size:var(--fs-12);color:var(--fg-3);font-weight:600;margin-top:2px}
.dc-strip{display:flex;flex-direction:column;gap:8px}
.dc-strip-lbl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--fg-3)}
.dc-dots{display:flex;gap:4px;flex-wrap:wrap;max-width:340px}
.dc-dot{width:12px;height:12px;border-radius:3px;background:var(--pame-blue-10);flex:none}
.dc-dot.on{background:var(--pame-teal)}

/* ── Home / vitrina de cursos (deslogueado) ──
   Es la MISMA pantalla para todas las academias: todo el color sale del tema
   (--top-bg/--top-fg de la barra, --btn-bg del botón, --teal-* = acento). Nada fijo.
   Lenguaje: eyebrow + título en mayúsculas espaciadas + filete de acento, tarjetas
   con imagen 16:9 y un CTA en píldora. Los valores propios de esta pantalla viven
   como variables en body.landing (no hay números sueltos en las reglas). */
body.landing{
  --land-max:1120px;
  --land-card-min:280px;
  --land-card-max:360px;
  --land-track:.14em;
  --land-filete:56px;
  --land-filete-h:3px;
  --land-lift:-4px;
  --land-acento-suave:color-mix(in srgb, var(--teal-600) 10%, transparent);
  --land-acento-borde:color-mix(in srgb, var(--teal-600) 28%, var(--pame-line));
  background:
    radial-gradient(ellipse at 50% -10%, var(--land-acento-suave), transparent 60%),
    var(--surface-page)}
.land-top{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);padding:var(--sp-3) var(--sp-6);
  background:var(--top-bg);color:var(--top-fg,var(--fg-1));border-bottom:1px solid color-mix(in srgb, var(--top-fg,var(--fg-1)) 10%, transparent);
  position:sticky;top:var(--anuncio-h,0px);z-index:10}
.land-top .logo-txt{color:var(--top-fg,var(--pame-blue-900));text-transform:uppercase;letter-spacing:var(--land-track);font-size:var(--fs-16);font-weight:800}
.land-top .ghost{display:inline-flex;align-items:center;height:var(--ctl-h);padding:0 var(--sp-5);border-radius:var(--r-pill);
  background:var(--btn-bg);color:var(--fg-on-brand);border:1px solid var(--btn-border);font-weight:700;font-size:var(--fs-13);
  letter-spacing:.06em;text-transform:uppercase;text-decoration:none;box-shadow:0 0 var(--sp-5) calc(-1 * var(--sp-1)) color-mix(in srgb, var(--btn-bg) 60%, transparent);
  transition:background var(--t-fast),transform var(--t-fast),box-shadow var(--t-fast)}
.land-top .ghost:hover{background:var(--btn-bg-h);color:var(--fg-on-brand);transform:translateY(-1px);
  box-shadow:0 var(--sp-2) var(--sp-5) calc(-1 * var(--sp-2)) var(--btn-bg)}
.land-logo{height:38px;width:auto;display:block}
.land-hero{width:100%;max-width:var(--land-max);margin:0 auto;padding:var(--sp-8) var(--sp-6) var(--sp-5);text-align:center}
.land-eyebrow{display:inline-block;margin:0 0 var(--sp-4);font-size:var(--fs-12);font-weight:700;letter-spacing:.22em;
  text-transform:uppercase;color:var(--text-accent)}
.land-eyebrow:empty{display:none}
.land-hero h1{font-family:var(--font-display);font-weight:800;font-size:var(--fs-48);line-height:1.08;letter-spacing:var(--land-track);
  text-transform:uppercase;margin:0;color:var(--fg-1)}
.land-hero h1::after{content:"";display:block;width:var(--land-filete);height:var(--land-filete-h);margin:var(--sp-5) auto;
  border-radius:var(--r-pill);background:linear-gradient(90deg, var(--teal-500), var(--btn-bg))}
.land-hero p{color:var(--fg-2);margin:0 auto;max-width:36em;font-size:var(--fs-16);line-height:1.6}
.land-hero a{color:var(--text-accent);font-weight:700;text-decoration-thickness:1px;text-underline-offset:.2em}
/* width:100% es obligatorio, no adorno: footer.js le pone `sf-sticky` al body
   (display:flex; flex-direction:column) para pegar el footer abajo. En un flex
   column, los márgenes horizontales `auto` de un item IMPIDEN que se estire, así
   que sin width:100% esta sección colapsa al ancho de su contenido (~450px) y el
   grid de cursos queda en UNA columna en desktop. Con width:100% ocupa la fila y
   el max-width la topa centrada. (En mobile el grid ya es 1 columna.) */
.land-cat{width:100%;max-width:var(--land-max);margin:0 auto;padding:var(--sp-5) var(--sp-6) var(--sp-8)}
/* auto-fit + ancho tope + centrado: con UNA sola tarjeta no queda colgada a la izquierda. */
.land-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(var(--land-card-min),var(--land-card-max)));
  justify-content:center;gap:var(--sp-5)}
.land-card{display:flex;flex-direction:column;background:var(--surface-card);border:1px solid var(--land-acento-borde);border-radius:var(--r-lg);
  overflow:hidden;box-shadow:var(--shadow-sm);text-decoration:none;
  transition:transform var(--t-fast) var(--ease-out),box-shadow var(--t-fast),border-color var(--t-fast)}
.land-card:hover{transform:translateY(var(--land-lift));border-color:var(--teal-600);
  box-shadow:var(--shadow-md),0 0 0 1px var(--teal-600),0 var(--sp-5) var(--sp-7) calc(-1 * var(--sp-5)) color-mix(in srgb, var(--teal-600) 55%, transparent)}
.land-card-img{position:relative;aspect-ratio:16/9;background:linear-gradient(150deg, var(--fg-1) 20%, color-mix(in srgb, var(--teal-600) 55%, var(--fg-1)));
  display:grid;place-items:center;color:color-mix(in srgb, var(--fg-on-brand) 80%, transparent);font-weight:700;padding:var(--sp-3);text-align:center;overflow:hidden}
/* La imagen va a sangre (inset:0 ignora el padding): así no se corre a la derecha ni
   invade el cuerpo. El padding queda para el ícono/texto de respaldo cuando no hay foto. */
.land-card-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform var(--t-slow) var(--ease-out)}
.land-card:hover .land-card-img img{transform:scale(1.04)}
.land-chip{position:absolute;top:var(--sp-3);left:var(--sp-3);background:color-mix(in srgb, var(--surface-card) 92%, transparent);color:var(--fg-1);
  font-size:var(--fs-11);font-weight:800;letter-spacing:.12em;text-transform:uppercase;padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);z-index:1;
  backdrop-filter:blur(6px)}
.land-card-body{padding:var(--sp-5);display:flex;flex-direction:column;flex:1}
.land-card-body h3{font-family:var(--font-display);font-size:var(--fs-20);font-weight:800;line-height:1.25;margin:0 0 var(--sp-2);color:var(--fg-1)}
.land-card-body p{font-size:var(--fs-14);line-height:1.55;color:var(--fg-3);margin:0 0 var(--sp-5);flex:1;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.land-card-body p:empty{margin-bottom:var(--sp-3)}
.land-card-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);padding-top:var(--sp-4);
  border-top:1px solid var(--pame-line)}
.land-price{font-weight:800;color:var(--fg-1);font-size:var(--fs-16);letter-spacing:-.01em}
.land-price small{display:block;font-size:var(--fs-11);font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--text-accent)}
.land-cta{display:inline-flex;align-items:center;height:var(--ctl-h);padding:0 var(--sp-4);border-radius:var(--r-pill);
  background:var(--btn-bg);color:var(--fg-on-brand);border:1px solid var(--btn-border);font-weight:700;font-size:var(--fs-13);
  letter-spacing:.04em;white-space:nowrap;transition:background var(--t-fast)}
.land-card:hover .land-cta{background:var(--btn-bg-h)}
body.landing .auth-wrap{min-height:auto;padding:16px var(--sp-6) 56px}
#login{scroll-margin-top:80px}
.land-empty{grid-column:1/-1;text-align:center;color:var(--fg-3);font-size:var(--fs-16);padding:var(--sp-7) 0}
.land-empty a{color:var(--text-accent);font-weight:700}
@media (max-width:720px){
  .land-top{padding:var(--sp-3) var(--sp-4)}
  .land-top .logo-txt{font-size:var(--fs-13);letter-spacing:.06em}
  .land-top .ghost{padding:0 var(--sp-4);letter-spacing:.04em}
  .land-hero{padding:var(--sp-7) var(--sp-4) var(--sp-4)}
  .land-hero h1{font-size:var(--fs-32);letter-spacing:.08em}
  .land-cat{padding:var(--sp-4) var(--sp-4) var(--sp-7)}
  .land-grid{grid-template-columns:1fr}
}

/* ══════════════════════════════════════════════════════════════════════════
   "A CONTINUACIÓN" AL TERMINAR EL VIDEO  ·  .autoav
   --------------------------------------------------------------------------
   Overlay que tapa el reproductor cuando se termina la clase: dice cuál sigue
   y muestra un botón de play con un aro que se completa mientras corre la
   cuenta regresiva. Vive DENTRO de .player (que ya es position:relative), así
   que también se ve en pantalla completa.
   ══════════════════════════════════════════════════════════════════════════ */

.autoav{
  position:absolute; inset:0; z-index:5;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:var(--sp-3);
  padding:var(--sp-5);
  text-align:center; color:#fff;
  background:rgba(2,51,77,.97);
  border-radius:var(--r-sm);
  /* Medidas propias de este componente. El botón de play no entra en ninguna
     escala existente (no es un control de formulario, es una diana para el
     mouse), así que se declara acá una vez y las pantallas chicas solo cambian
     estos tres valores, en vez de repetir los anchos más abajo. */
  --autoav-play:92px;   /* diámetro del botón */
  --autoav-tri:34px;    /* triangulito de play adentro */
  --autoav-aro:4;       /* grosor del aro (sin unidad: es un stroke de SVG) */
  /* Sin fill-mode: el estado en reposo ya es el visible. Si el navegador tiene
     las animaciones congeladas (pestaña en segundo plano), el overlay se ve
     igual en vez de quedarse pegado en el primer fotograma. */
  animation:autoav-entra var(--t-base) var(--ease-out);
}
@keyframes autoav-entra{ from{ opacity:0 } to{ opacity:1 } }

.autoav-kicker{
  margin:0; font-size:var(--fs-14); color:rgba(255,255,255,.7);
}
.autoav-titulo{
  /* El color va explícito: hay una regla general de h3 en esta misma capa que
     los pinta del azul de marca, y como el overlay tiene ESE MISMO azul de
     fondo, el título quedaba invisible. */
  margin:0; color:#fff;
  font-size:var(--fs-24); font-weight:700; line-height:var(--lh-snug);
  max-width:32ch;
}

/* ── Botón de play con el aro de la cuenta regresiva ── */
.autoav-play{
  position:relative; display:grid; place-items:center;
  width:var(--autoav-play); height:var(--autoav-play); margin:var(--sp-2) 0;
  border-radius:var(--r-pill); text-decoration:none; color:#fff;
  transition:transform var(--t-fast) var(--ease-out);
}
.autoav-play:hover{ transform:scale(1.06) }

.autoav-aro{ position:absolute; inset:0; width:100%; height:100%; transform:rotate(-90deg) }
.autoav-aro circle{ fill:none; stroke-width:var(--autoav-aro); }
.autoav-aro-bg{ stroke:rgba(255,255,255,.28) }
.autoav-aro-fg{
  stroke:var(--pame-orange);
  stroke-linecap:round;
  /* pathLength="100" en el SVG: el trazo se mide de 0 a 100, sin calcular 2πr. */
  stroke-dasharray:100; stroke-dashoffset:100;
  transition:stroke-dashoffset 1s linear;
}
.autoav-tri{ width:var(--autoav-tri); height:var(--autoav-tri); fill:#fff; margin-left:var(--sp-1) }

.autoav-cancelar{
  background:none; border:0; padding:0; cursor:pointer;
  font:inherit; font-size:var(--fs-16); font-weight:700; color:#fff;
}
.autoav-cancelar:hover{ text-decoration:underline }

.autoav-nunca{
  background:none; border:0; padding:0; cursor:pointer;
  font:inherit; font-size:var(--fs-12);
  color:rgba(255,255,255,.55); text-decoration:underline;
}
.autoav-nunca:hover{ color:#fff }

/* En pantallas chicas el video es bajito: achicamos todo para que entre. */
@media (max-width:640px){
  .autoav{ gap:var(--sp-2); padding:var(--sp-4);
           --autoav-play:68px; --autoav-tri:26px }
  .autoav-titulo{ font-size:var(--fs-18) }
  .autoav-play{ margin:var(--sp-1) 0 }
  .autoav-kicker{ font-size:var(--fs-12) }
}

@media (prefers-reduced-motion:reduce){
  .autoav{ animation:none }
  .autoav-play{ transition:none }
}

/* ============================================================
   PANEL ADMIN · FORMACIONES (pestaña Contenido)
   ------------------------------------------------------------
   La lista es la misma tabla que Avisos (.tabla-wrap + table.alumnos);
   acá solo se define lo propio: la celda con chip/cuenta + botón, y el
   encabezado de las tres pantallas de una formación (volver + título +
   navegación Detalles / Grupos / Temario).
   ============================================================ */

.fm-tabla{ min-width:840px }
.fm-tabla td{ vertical-align:middle }
/* Proporciones fijas: si no, el título se come la fila y las columnas de
   edición quedan tan angostas que todo cae en dos líneas. */
.fm-tabla th:nth-child(1){ width:34% }   /* Formación */
.fm-tabla th:nth-child(2){ width:24% }   /* Contenido */
.fm-tabla th:nth-child(3){ width:22% }   /* Grupos    */
.fm-tabla th:nth-child(4){ width:8% }    /* Detalles  */
.fm-tabla th:nth-child(5){ width:12% }   /* Acciones (ver + duplicar) */

/* Celda de la tabla: dato a la izquierda, su botón de edición a la derecha.
   El botón no se parte en dos líneas aunque la columna quede angosta. */
.fm-cel{ display:flex; align-items:center; gap:var(--sp-2); flex-wrap:wrap }
.fm-cel .btn-mini{ flex:none; white-space:nowrap }
/* Columna de acciones (ver como alumno + duplicar): los dos íconos van SIEMPRE en
   una línea. Sin esto la columna quedaba angosta y el ⧉ se caía abajo del ojo,
   estirando el alto de la fila. */
.fm-tabla td:last-child .fm-cel{ flex-wrap:nowrap; justify-content:flex-end }
/* El lápiz va PRIMERO, contra el borde izquierdo de su columna: así queda
   alineado en todas las filas (arrancan todas en el mismo x) y al mismo tiempo
   pegado al dato que edita. Puesto detrás del texto, cada fila lo dejaba en un
   lugar distinto porque los títulos y las cuentas nunca miden lo mismo. */
.fm-sub{ display:block; margin-top:var(--sp-1); color:var(--fg-3); font-size:var(--fs-12) }
/* Los chips ocupan el ancho que queda y se apilan entre ellos: así el lápiz
   nunca se cae a una segunda línea por tener muchos grupos. */
.fm-chips{ display:flex; gap:var(--sp-1); flex-wrap:wrap; flex:1 1 0; min-width:0 }
.fm-nada{ color:var(--fg-3); font-size:var(--fs-14) }
.fm-cuenta{ color:var(--fg-2); font-size:var(--fs-14); white-space:nowrap }
.fm-ver{ display:inline-flex; align-items:center; gap:var(--sp-1); text-decoration:none }

/* Encabezado de una formación abierta (detalles / grupos / temario). */
.fm-head{ display:flex; align-items:center; gap:var(--sp-3); flex-wrap:wrap;
  margin-bottom:var(--sp-5) }
.fm-head .volver{ width:auto; margin:0 }
.fm-head .fm-ver{ white-space:nowrap }
.fm-tit{ margin:0; font-size:var(--fs-24) }

/* margin-left:auto en vez de un separador flexible: si el encabezado se parte
   en dos líneas, la navegación sigue quedando a la derecha de la suya. */
.fm-nav{ display:flex; gap:var(--sp-1); padding:var(--sp-1); margin-left:auto;
  background:var(--pame-bg-soft); border-radius:var(--r-pill) }
.fm-nav-btn{ margin-top:0; padding:var(--sp-2) var(--sp-4); border-radius:var(--r-pill);
  background:none; color:var(--fg-2); font-size:var(--fs-14) }
.fm-nav-btn:hover{ background:#fff; color:var(--pame-blue) }
.fm-nav-btn.on{ background:#fff; color:var(--pame-blue-700); box-shadow:var(--shadow-xs) }

@media (max-width:720px){
  .fm-tit{ width:100%; font-size:var(--fs-20) }
  /* Las 4 pestañas del editor en una grilla 2×2 pareja: todas visibles y prolijas
     (antes envolvían con justify-content:space-between y quedaban desalineadas). */
  .fm-nav{ width:100%; display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-1); border-radius:var(--r-md) }
  .fm-nav-btn{ text-align:center; justify-content:center }
}
/* En pantallas medianas (tablet) las 4 pestañas envuelven antes de apretujarse. */
@media (min-width:721px) and (max-width:920px){ .fm-nav{ flex-wrap:wrap } }

/* ============================================================
   FICHA DE UNA FORMACIÓN · secciones Información / Funcionalidades / Marketing
   ------------------------------------------------------------
   La antigua pestaña "Detalles" se repartió en tres secciones que comparten un
   único formulario: todas viven en el DOM (para que un solo Guardar lea todos los
   campos) y se muestra una por vez según la pestaña activa. La barra de acciones
   queda fija abajo, así se guarda desde cualquier sección.
   ============================================================ */
.ficha-sec{ display:none }
.ficha-sec.on{ display:block }
.ficha-sec-h{ margin:0 0 var(--sp-4) }
.ficha-sec-h h3{ margin:0; font-size:var(--fs-20) }
.ficha-sec-h .sub{ margin:var(--sp-1) 0 0; color:var(--fg-3); font-size:var(--fs-14) }

/* Espaciado normalizado dentro de los bloques (reemplaza los style= sueltos que
   había repartidos por cada .adm-sub-block). */
.adm-sub-block > h4:first-child{ margin:0 0 var(--sp-1) }
.adm-sub-block > .adm-check{ margin:0 }
.adm-sub-block > .adm-check + .adm-check{ margin-top:var(--sp-2) }
.nb-desc{ margin:0 0 var(--sp-3) }              /* bajada bajo el título de un bloque */
.nb-note{ margin:var(--sp-2) 0 var(--sp-3) }    /* aclaración debajo de un toggle */
.nb-foot{ margin:var(--sp-2) 0 0 }              /* nota de cierre al final del bloque */
.nb-inline{ font-weight:400 }                   /* aclaración liviana dentro de un h4 */
.adm-field textarea.tall-desc{ min-height:130px }
.adm-sub-block .adm-field.mini{ max-width:340px; margin-top:var(--sp-4) }
.adm-row{ display:flex; flex-wrap:wrap; gap:var(--sp-4) }
.adm-row .adm-field{ margin-bottom:0 }
.adm-field--narrow{ max-width:220px }

.ficha-actions{ position:sticky; bottom:0; z-index:2;
  margin-top:var(--sp-5); padding:var(--sp-4) 0 var(--sp-2);
  border-top:1px solid var(--pame-line); background:#fff }

/* ============================================================
   CALENDARIO DEL ALUMNO  (calendario.html)
   ------------------------------------------------------------
   Los hitos son los avisos con fecha. Dos piezas: el panel de
   suscripción (una sola vez, se actualiza solo) y la lista de
   próximos eventos, cada uno con su botón para agendarlo suelto.
   ============================================================ */

.cal-sub{ display:flex; gap:var(--sp-5); align-items:center;
  background:linear-gradient(120deg,var(--pame-blue-10),var(--pame-teal-10));
  border:1px solid var(--pame-blue-20); border-radius:var(--r-md);
  padding:var(--sp-5); margin-bottom:var(--sp-6) }
.cal-sub-txt{ flex:1; min-width:0 }
.cal-sub-tit{ font-size:var(--fs-20); font-weight:700; color:var(--fg-1); margin:0 0 var(--sp-2) }
.cal-sub-p{ font-size:var(--fs-14); color:var(--fg-2); margin:0 0 var(--sp-3); max-width:70ch }
.cal-sub-btns{ display:flex; gap:var(--sp-2); flex-wrap:wrap }
.cal-sub-nota{ font-size:var(--fs-12); color:var(--fg-3); margin:var(--sp-3) 0 0; max-width:70ch }
.cal-sub-nota b{ color:var(--fg-2) }

/* Botón del calendario: mismo alto que cualquier control del sistema, sirva de
   <a> (los links a Google/webcal) o de <button> (copiar, bajar el .ics). */
.cal-btn{ display:inline-flex; align-items:center; justify-content:center;
  min-height:var(--ctl-h); padding:0 var(--sp-4); width:auto; margin:0;
  border:var(--ctl-bd); border-radius:var(--r-pill); background:var(--pame-bg);
  color:var(--pame-blue); font-family:var(--font-sans); font-size:var(--fs-12);
  font-weight:700; text-decoration:none; cursor:pointer; white-space:nowrap;
  transition:background var(--t-fast) var(--ease-out),border-color var(--t-fast) var(--ease-out) }
.cal-btn:hover{ border-color:var(--pame-blue); background:var(--pame-blue-10) }
.cal-btn.primario{ background:var(--btn-bg); border-color:var(--pame-blue); color:#fff }
.cal-btn.primario:hover{ background:var(--btn-bg-h); border-color:var(--btn-bg-h) }

.cal-mes{ font-size:var(--fs-14); font-weight:700; text-transform:uppercase; letter-spacing:.08em;
  color:var(--fg-3); margin:var(--sp-6) 0 var(--sp-3) }
.cal-mes:first-child{ margin-top:0 }

.cal-item{ display:flex; gap:var(--sp-4); background:var(--pame-bg);
  border:1px solid var(--pame-line); border-left:4px solid var(--pame-blue-30);
  border-radius:var(--r-md); padding:var(--sp-4); margin-bottom:var(--sp-3);
  box-shadow:var(--shadow-xs) }
.cal-item.evento{ border-left-color:var(--pame-teal) }
.cal-item.bonus{ border-left-color:var(--pame-orange) }

/* Bloque de la fecha, a la izquierda */
.cal-fecha{ flex:none; width:56px; text-align:center; padding-top:2px }
.cal-dia{ display:block; font-size:var(--fs-32); font-weight:800; line-height:1; color:var(--fg-1) }
.cal-mes-mini{ display:block; font-size:var(--fs-12); font-weight:700; text-transform:uppercase;
  letter-spacing:.06em; color:var(--fg-3); margin-top:2px }

.cal-cuerpo{ flex:1; min-width:0 }
.cal-top{ display:flex; align-items:center; gap:var(--sp-2); flex-wrap:wrap; margin-bottom:var(--sp-1) }
.cal-ico{ width:22px; height:22px; flex:none; display:grid; place-items:center; color:var(--pame-teal-700) }
.cal-ico svg{ width:16px; height:16px }
.cal-tipo{ font-size:var(--fs-12); font-weight:700; text-transform:uppercase; letter-spacing:.04em;
  color:var(--fg-3) }
.cal-curso{ font-size:var(--fs-12); font-weight:700; color:var(--pame-blue-700);
  background:var(--pame-blue-10); padding:2px var(--sp-2); border-radius:var(--r-pill) }
.cal-rel{ font-size:var(--fs-12); font-weight:700; color:var(--pame-orange-600); margin-left:auto }
.cal-tit{ font-size:var(--fs-16); font-weight:700; color:var(--fg-1); margin:0 }
.cal-hora{ font-size:var(--fs-12); color:var(--pame-teal-700); font-weight:600; margin:var(--sp-1) 0 0 }
.cal-body{ font-size:var(--fs-14); color:var(--fg-3); margin:var(--sp-2) 0 0; line-height:var(--lh-normal) }
.cal-acciones{ display:flex; gap:var(--sp-2); flex-wrap:wrap; margin-top:var(--sp-3) }

@media (max-width:720px){
  .cal-sub{ padding:var(--sp-4) }
  .cal-item{ gap:var(--sp-3); padding:var(--sp-3) }
  .cal-fecha{ width:44px }
  .cal-dia{ font-size:var(--fs-24) }
  .cal-rel{ margin-left:0 }
  .cal-acciones .cal-btn{ flex:1 1 auto }
}

/* ============================================================
   PUERTA DEL ENCUENTRO EN VIVO  (vivo.html)
   ------------------------------------------------------------
   Pantalla PÚBLICA y suelta: es el link que se comparte en el
   grupo de WhatsApp. Sin menú ni barra a propósito — quien llega
   viene a entrar a una clase que empieza en dos minutos, con el
   teléfono en la mano y probablemente en el navegador interno de
   WhatsApp. Un solo campo por pantalla y botones grandes.
   ============================================================ */

.vivo-body{ margin:0; min-height:100vh; display:grid; place-items:center;
  padding:var(--sp-5); background:var(--pame-bg-soft); font-family:var(--font-sans) }
.vivo-caja{ width:100%; max-width:420px; background:var(--pame-bg);
  border:1px solid var(--pame-line); border-radius:var(--r-lg);
  padding:var(--sp-6) var(--sp-5); box-shadow:var(--shadow-md); text-align:center }
.vivo-logo{ height:44px; width:auto; margin:0 auto var(--sp-5); display:block }
.vivo-tit{ font-size:var(--fs-24); font-weight:700; color:var(--fg-1); margin:0 0 var(--sp-2) }
.vivo-sub{ font-size:var(--fs-14); color:var(--fg-2); margin:0 0 var(--sp-5); line-height:var(--lh-normal) }
.vivo-sub b{ color:var(--fg-1); overflow-wrap:anywhere }

/* Controles grandes: acá no aplica --ctl-h (38px es de escritorio). Un dedo
   apurado necesita 52px, y en iOS un input de menos de 16px hace zoom solo. */
.vivo-input{ width:100%; box-sizing:border-box; height:52px; padding:0 var(--sp-4);
  font-family:var(--font-sans); font-size:var(--fs-16); color:var(--fg-1);
  border:var(--ctl-bd); border-radius:var(--r-md); background:var(--pame-bg);
  text-align:center; margin-bottom:var(--sp-3) }
.vivo-input:focus{ outline:none; border-color:var(--pame-teal); box-shadow:0 0 0 3px var(--pame-teal-20) }
.vivo-codigo{ font-size:var(--fs-32); font-weight:700; letter-spacing:.4em; text-indent:.4em }

.vivo-btn{ width:100%; min-height:52px; margin:0; border:0; border-radius:var(--r-pill);
  background:var(--pame-orange); color:#fff; font-family:var(--font-sans);
  font-size:var(--fs-16); font-weight:800; cursor:pointer }
.vivo-btn:hover{ background:var(--pame-orange-600) }
.vivo-btn:disabled{ opacity:.65; cursor:default }

.vivo-link{ background:none; border:0; margin:var(--sp-4) 0 0; padding:0; width:auto;
  color:var(--pame-blue); font-family:var(--font-sans); font-size:var(--fs-14);
  font-weight:700; text-decoration:underline; cursor:pointer }
.vivo-pie{ font-size:var(--fs-12); color:var(--fg-3); margin:var(--sp-4) 0 0 }
/* Bloque de ayuda bajo el código: para el que se equivocó de mail, el que no
   tiene un encuentro activo o el que tiene el acceso vencido (todos ven la
   misma pantalla neutra, así la puerta no filtra quién es alumno). */
.vivo-ayuda{ margin:var(--sp-5) 0 0; padding:var(--sp-4) 0 0; border-top:1px solid var(--pame-line) }
.vivo-ayuda .vivo-link{ margin:var(--sp-2) 0 0; display:inline-block }
.vivo-cargando{ font-size:var(--fs-16); color:var(--fg-2); margin:var(--sp-6) 0 }
.vivo-error{ font-size:var(--fs-14); color:var(--pame-danger); background:#fdecea;
  border:1px solid #f5c6c0; border-radius:var(--r-sm);
  padding:var(--sp-3); margin:0 0 var(--sp-4); line-height:var(--lh-normal) }

/* Elegir entre dos encuentros (solo aparece si tiene acceso a más de uno) */
.vivo-lista{ display:flex; flex-direction:column; gap:var(--sp-2) }
.vivo-item{ width:100%; margin:0; text-align:left; cursor:pointer;
  background:var(--pame-bg); border:1px solid var(--pame-line); border-radius:var(--r-md);
  padding:var(--sp-4) }
.vivo-item:hover{ border-color:var(--pame-teal); background:var(--pame-teal-10) }
.vivo-item b{ display:block; font-size:var(--fs-16); font-weight:700; color:var(--fg-1) }
.vivo-item span{ display:block; font-size:var(--fs-12); color:var(--fg-3); margin-top:var(--sp-1) }

/* Sala de espera del encuentro: cuenta atrás + la hora convertida a cada país.
   tabular-nums para que los dígitos que cambian no "bailen". Ver vivo-horario.js */
.vivo-cuenta{ font-size:var(--fs-16); color:var(--fg-2); margin:0 0 var(--sp-2);
  font-variant-numeric:tabular-nums }
.vivo-cuenta b{ color:var(--fg-1); font-weight:800 }
.vivo-cuenta.es-vivo{ color:var(--danger); font-weight:800;
  display:flex; align-items:center; justify-content:center; gap:var(--sp-2) }
.vivo-pulso{ width:.6em; height:.6em; border-radius:var(--r-pill);
  background:var(--danger); animation:vivo-late 1.4s ease-in-out infinite }
@keyframes vivo-late{ 0%,100%{ opacity:1; transform:scale(1) } 50%{ opacity:.35; transform:scale(.7) } }
.vivo-fecha{ font-size:var(--fs-14); font-weight:700; color:var(--fg-1); margin:0 0 var(--sp-4) }
.vivo-znota{ display:block; font-size:var(--fs-12); font-weight:400; color:var(--fg-3); margin-top:var(--sp-1) }
.vivo-zonas{ display:flex; flex-direction:column; gap:var(--sp-1); text-align:left;
  border:1px solid var(--pame-line); border-radius:var(--r-md);
  padding:var(--sp-3); margin:0 0 var(--sp-2) }
.vivo-zline{ display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--sp-3); padding:var(--sp-1) var(--sp-2) }
.vivo-zpais{ font-size:var(--fs-14); color:var(--fg-2) }
.vivo-zhora{ font-size:var(--fs-14); font-weight:700; color:var(--fg-1); font-variant-numeric:tabular-nums }
.vivo-zline.es-mia{ background:var(--pame-teal-10); border-radius:var(--r-sm) }
.vivo-zline.es-mia .vivo-zpais{ color:var(--pame-teal); font-weight:700 }
.vivo-zmas{ display:flex; flex-direction:column; gap:var(--sp-1) }
.vivo-zmas[hidden]{ display:none }

/* Editor del panel: los días del encuentro recurrente (pills con checkbox) */
.vv-dias{ display:flex; flex-wrap:wrap; gap:var(--sp-2) }
.vv-dia{ display:inline-flex; align-items:center; gap:var(--sp-1);
  padding:var(--sp-1) var(--sp-3); border:1px solid var(--pame-line);
  border-radius:var(--r-pill); font-size:var(--fs-13); color:var(--fg-2);
  cursor:pointer; user-select:none }
.vv-dia input{ margin:0 }
.vv-dia:has(input:checked){ border-color:var(--pame-teal); background:var(--pame-teal-10);
  color:var(--pame-teal); font-weight:700 }

/* Encuentros en vivo, en el panel de Avisos (columnas de las filas repetidas) */
.vivos-panel{ margin-bottom:var(--sp-5) }
/* La sección cuando el plan no incluye los vivos: se ve, pero apagada (mismo criterio
   que .modulo.bloq). El badge y el texto empujan al upgrade. */
.vivos-bloq{ opacity:.72 }
.vivos-tit{ font-size:var(--fs-18); margin:0 0 var(--sp-2) }
.vivos-filas{ --ui-cols: minmax(200px,1.6fr) minmax(140px,1fr) auto auto auto auto;
  --ui-cols-mob: 1fr auto }
.asis-filas{ --ui-cols: minmax(140px,1.2fr) minmax(140px,1.2fr) auto;
  --ui-cols-mob: 1fr auto }

/* ── Pestaña Certificado del panel ────────────────────────────────────────
   La hoja del certificado se dibuja en cert.css, adentro del <iframe>: acá solo
   está lo que la rodea. El iframe toma la proporción de la hoja para que la
   previa no quede con una franja vacía abajo. */
.cert-quien{ max-width:520px }
.cert-colores{ display:flex; flex-wrap:wrap; gap:var(--sp-5) }
.cert-colores .adm-field{ margin-bottom:0 }
.cert-previa-marco{ background:#fff; border:1px solid var(--pame-line);
  border-radius:var(--r-md); padding:var(--sp-3) }
.cert-previa-acciones{ display:flex; align-items:center; gap:var(--sp-3); flex-wrap:wrap }
/* El lienzo mide lo mismo que la hoja (A4 al 100%, nunca más): así las manijas
   de arrastre, que van encima, caen exactamente sobre cada elemento. */
.cert-lienzo{ position:relative; width:100%; max-width:297mm; margin:0 auto }
.cert-lienzo:has(.cert-frame.vertical){ max-width:210mm }
.cert-frame{ display:block; width:100%; border:0; aspect-ratio:297/210 }
.cert-frame.vertical{ aspect-ratio:210/297 }

/* Campo de imagen: la URL, el botón de subir y el de quitar, todos a la misma
   altura. El <input type=file> real se esconde adentro del botón. */
.cert-img-fila{ display:flex; gap:var(--gap-ctl); align-items:center; flex-wrap:wrap }
.cert-img-fila input[type=text],
.cert-img-fila > input{ flex:1; min-width:220px }
.cert-subir{ position:relative; overflow:hidden; display:inline-flex; align-items:center;
  justify-content:center; min-height:var(--ctl-h); cursor:pointer }
.cert-subir input[type=file]{ position:absolute; inset:0; opacity:0; cursor:pointer }

/* ── Acomodar los elementos sobre la hoja ────────────────────────────────
   Las manijas son cajas transparentes encima de la vista previa: se arrastran
   con el mouse y el cuadradito de la esquina cambia el ancho. El certificado de
   abajo es el de verdad; esto es solo la capa para agarrarlo. */
.cert-mover{ display:flex; align-items:center; gap:var(--sp-2); flex-wrap:wrap;
  margin:0 0 var(--sp-3); padding:var(--sp-2) var(--sp-3);
  background:var(--pame-blue-10); border-radius:var(--r-md) }
.cert-mover[hidden]{ display:none }
.cert-mover-que{ font-size:var(--fs-14); font-weight:700; color:var(--pame-blue-900);
  min-width:160px }
.cert-mover .ui-note{ margin:0; flex:1; min-width:220px }
.cert-manijas{ position:absolute; inset:0 }
.cert-manijas[hidden]{ display:none }
.cert-arr{ position:absolute; left:var(--x,0%); top:var(--y,0%); width:var(--w,100%); height:var(--h,4%);
  border:1px dashed var(--pame-teal); border-radius:var(--r-sm); cursor:move;
  background:color-mix(in srgb, var(--pame-teal) 8%, transparent); touch-action:none }
.cert-arr:hover{ background:color-mix(in srgb, var(--pame-teal) 16%, transparent) }
.cert-arr.sel{ border-style:solid; border-color:var(--pame-orange);
  background:color-mix(in srgb, var(--pame-orange) 14%, transparent) }
.cert-arr-w{ position:absolute; right:calc(var(--sp-3) / -2); bottom:calc(var(--sp-3) / -2);
  width:var(--sp-3); height:var(--sp-3);
  background:#fff; border:var(--ctl-bd); border-color:var(--pame-teal); border-radius:50%; cursor:ew-resize }
.cert-arr.sel .cert-arr-w{ border-color:var(--pame-orange) }

/* ── Vista previa del video de una clase (panel · editor de clase) ─────────
   Aparece recién cuando el video terminó de prepararse: antes la imagen no
   existe del otro lado. Al pasar el mouse cambia por la animación, que es la
   forma más rápida de reconocer "sí, este es el video que subí". */
/* Lista de grabaciones de Zoom (editor de clase): tarjetas clickeables para elegir
   cuál traer. Mismo lenguaje que el resto del editor (tokens, sin números sueltos). */
.zoom-list{ display:flex; flex-direction:column; gap:var(--sp-2); margin-top:var(--sp-2) }
.zoom-item{
  display:flex; flex-direction:column; gap:2px; width:100%; text-align:left;
  padding:var(--sp-2) var(--sp-3); background:var(--bg-1); color:var(--fg-1);
  border:var(--ctl-bd); border-radius:var(--ctl-r); cursor:pointer;
}
.zoom-item:hover{ border-color:var(--pame-blue); background:var(--pame-blue-10); color:var(--fg-1) }
.zoom-item:disabled{ opacity:.55; cursor:default }
.zoom-item.is-sel{ border-color:var(--pame-teal); background:var(--pame-teal-10) }
.zoom-item-tit{ font-weight:600 }
.zoom-item-sub{ color:var(--fg-3); font-size:var(--fs-13) }

/* Zona para soltar el video (drag & drop), estilo Hotmart: se puede arrastrar el archivo
   adentro o clickearla para abrir el buscador. Se oculta mientras sube o cuando ya hay video. */
.vid-drop{ display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:var(--sp-2); padding:var(--sp-6) var(--sp-4); margin-top:var(--sp-3);
  border:1.5px dashed var(--pame-blue-30); border-radius:var(--r-md);
  background:var(--pame-bg-soft); color:var(--fg-3); text-align:center; cursor:pointer;
  transition:border-color var(--t-fast),background var(--t-fast),transform var(--t-fast) }
.vid-drop:hover{ border-color:var(--pame-teal); background:var(--pame-teal-10) }
.vid-drop.encima{ border-style:solid; border-color:var(--pame-teal);
  background:var(--pame-teal-10); color:var(--pame-teal-700); transform:scale(1.01) }
.vid-drop[hidden]{ display:none }
.ed-off .vid-drop{ pointer-events:none }
.vid-drop-ic{ font-size:var(--fs-32); line-height:1; opacity:.9 }
.vid-drop-tit{ font-size:var(--fs-14); font-weight:700; color:var(--fg-1) }
.vid-drop-sub{ font-size:var(--fs-12); color:var(--fg-3) }

.vid-prev{
  display:flex; align-items:center; gap:var(--gap-ctl);
  padding:var(--sp-2); margin:var(--sp-3) 0 0;
  border:var(--ctl-bd); border-radius:var(--ctl-r); background:var(--bg-2);
}
/* La guarda del patrón [hidden]: sin esto el display:flex le gana al atributo y
   la caja se ve vacía (con el primer cuadro sin cargar) antes de subir el video. */
.vid-prev[hidden]{ display:none }
.vid-prev-img{
  position:relative; flex:none;
  width:var(--vidprev-w); aspect-ratio:16/9;
  border-radius:var(--r-sm); overflow:hidden; background:var(--pame-line);
}
/* font-size:0 → si la miniatura no cargó, el texto alternativo no se dibuja
   desbordado: queda solo el fondo del recuadro, nunca el alt cortado. */
.vid-prev-img img{ width:100%; height:100%; object-fit:cover; display:block; font-size:0 }
.vid-prev-img .anim{ position:absolute; inset:0; opacity:0; transition:opacity .25s }
.vid-prev:hover .vid-prev-img .anim{ opacity:1 }
.vid-prev-dur{
  position:absolute; right:var(--sp-1); bottom:var(--sp-1);
  padding:0 var(--sp-1); border-radius:var(--r-sm);
  background:rgb(0 0 0 / .72); color:#fff;
  font-size:var(--fs-12); line-height:1.6; font-variant-numeric:tabular-nums;
}
.vid-prev-txt{ display:flex; flex-direction:column; gap:2px; min-width:0 }
.vid-prev-tit{ font-size:var(--fs-14); font-weight:600; color:var(--fg-1);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
.vid-prev-sub{ font-size:var(--fs-13); color:var(--fg-2) }

/* Preview del link externo (pegado en "Pegar un link externo") — se dibuja apenas
   el link matchea YouTube/Loom/Vimeo, así el dueño confirma sin guardar. */
.embed-preview{ display:flex; flex-direction:column; gap:var(--sp-2); margin-top:var(--sp-2) }
.embed-preview[hidden]{ display:none }
.embed-preview-head{ display:flex; align-items:center; gap:var(--sp-2) }
.embed-preview-frame{ position:relative; width:100%; max-width:480px; aspect-ratio:16/9;
  border-radius:var(--r-sm); overflow:hidden; background:var(--pame-line);
  border:1px solid var(--pame-line) }
.embed-preview-frame iframe{ position:absolute; inset:0; width:100%; height:100%; border:0 }

/* ── Cinta de vista previa (una clase abierta desde el panel) ──────────────
   Se ve la pantalla real del alumno; la cinta está para que nadie confunda
   "estoy mirando cómo queda" con "estoy cursando". */
.preview-cinta{
  position:sticky; top:0; z-index:100;   /* por encima del topbar (z90): se apilan, no se tapan */
  display:flex; align-items:center; justify-content:center; gap:var(--sp-2) var(--sp-3); flex-wrap:wrap;
  padding:var(--sp-2) var(--sp-4);
  background:var(--brand-gradient-control); color:#fff;
  font-size:var(--fs-13); text-align:center;
}
.preview-cinta svg{ width:16px; height:16px; flex:none }
.preview-cinta .preview-volver{ color:#fff; font-weight:700; text-decoration:underline; white-space:nowrap }
/* En vista previa (admin como alumno) no va el link "Panel admin": para volver está la cinta. */
body.preview-on #adminlink{ display:none !important }

/* ── Emitir certificados en lote (pestaña Certificado) ──────────────────── */
.cl-filas{ --ui-cols: auto minmax(200px,1.6fr) auto minmax(140px,.8fr);
  --ui-cols-mob: auto 1fr auto }
.cl-quien{ display:flex; flex-direction:column; min-width:0 }
.cl-quien b{ font-size:var(--fs-14); color:var(--fg-1) }
.cl-quien i{ font-style:normal; font-size:var(--fs-12); color:var(--fg-3);
  overflow:hidden; text-overflow:ellipsis }
.cl-cod{ font-family:var(--font-mono); font-size:var(--fs-12); color:var(--pame-blue);
  font-weight:700; letter-spacing:.02em }

/* Dirección web · cuando hay dominio propio conectado, la principal se destaca y la
   dirección de educreia.com queda secundaria (grisada). Ver admin.html → Configuraciones. */
.dom-princ-box{background:var(--pame-blue-10);border-radius:var(--r-sm);padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4)}
.dom-princ-cap{display:block;font-size:var(--fs-12);color:var(--fg-2);font-weight:700}
.dom-princ-link{display:inline-block;margin-top:var(--sp-2);font-size:var(--fs-18);font-weight:800;color:var(--pame-blue)}
/* La dirección interna es secundaria, pero su input DEBE verse editable (antes el
   opacity:.6 lo hacía parecer deshabilitado). Se subordina con el sub-label, no atenuando todo. */
.dom-interno .dom-princ-cap,.dom-interno > .nota,.dom-interno label{opacity:.7}

/* ── Alta self-service · pantalla de espera (creando-academia.html) ───────────
   Checklist que se va tildando + barra "que respira" + confeti al terminar.
   Todo con tokens; sin números sueltos salvo tamaños de la propia pieza, que van
   a variables locales acá arriba para poder ajustarlos de un solo lugar. */
.prov{ --prov-ic: var(--sp-6); --prov-bar-h: var(--sp-2) }

/* Checklist de pasos. Cada <li> pasa de pendiente → en curso (.is-doing) →
   hecho (.is-done) cambiando de clase por JS, nunca por style inline. */
.prov-steps{ list-style:none; margin:var(--sp-5) 0 var(--sp-6); padding:0; text-align:left; display:grid; gap:var(--sp-3) }
.prov-step{ display:flex; align-items:center; gap:var(--sp-3); color:var(--fg-3); font-size:var(--fs-14); opacity:.5; transition:opacity .3s ease, color .3s ease }
.prov-step.is-doing, .prov-step.is-done{ opacity:1; color:var(--fg-1) }
.prov-step.is-doing{ font-weight:700 }

/* El disquito de estado: pendiente (aro tenue) → en curso (aro que gira) →
   hecho (círculo verde con ✓). */
.prov-ic{ flex:0 0 auto; width:var(--prov-ic); height:var(--prov-ic); border-radius:var(--r-pill);
  border:2px solid var(--pame-line); box-sizing:border-box; position:relative; transition:border-color .3s ease, background .3s ease }
.prov-step.is-doing .prov-ic{ border-color:var(--pame-blue-30); border-top-color:var(--pame-blue); animation:prov-spin .8s linear infinite }
.prov-step.is-done .prov-ic{ border-color:var(--pame-success); background:var(--pame-success); animation:none }
.prov-step.is-done .prov-ic::after{ content:"✓"; position:absolute; inset:0; display:grid; place-items:center;
  color:#fff; font-size:var(--fs-12); font-weight:900; line-height:1 }
@keyframes prov-spin{ to{ transform:rotate(360deg) } }

/* Barra de progreso. El relleno crece solo hasta ~90% con una curva que
   desacelera (sensación de "casi listo") y ahí espera; al confirmarse el alta,
   .is-full lo lleva a 100%. Encima corre un brillo que "respira". */
.prov-bar{ position:relative; height:var(--prov-bar-h); background:var(--slate-100); border-radius:var(--r-pill);
  overflow:hidden; margin:var(--sp-5) 0 var(--sp-3) }
.prov-fill{ height:100%; width:0; border-radius:inherit; background:linear-gradient(90deg,var(--pame-blue),var(--pame-teal));
  animation:prov-grow 40s cubic-bezier(.15,.85,.25,1) forwards }
.prov-bar.is-full .prov-fill{ width:100%; animation:none; transition:width .6s ease }
.prov-fill::after{ content:""; position:absolute; inset:0; border-radius:inherit;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.55),transparent); transform:translateX(-100%); animation:prov-shine 1.8s ease-in-out infinite }
@keyframes prov-grow{ from{ width:0 } to{ width:90% } }
@keyframes prov-shine{ to{ transform:translateX(100%) } }

/* La barra sobra si el navegador pide menos movimiento: la dejamos llena y quieta. */
@media (prefers-reduced-motion: reduce){
  .prov-fill{ width:90%; animation:none }
  .prov-fill::after{ animation:none; opacity:0 }
  .prov-step.is-doing .prov-ic{ animation:none }
}

/* CTA de entrada al panel: es la acción principal de la pantalla "lista", así que
   va como botón lleno (mismos tokens que el <button> primario), a lo ancho de la
   tarjeta y con la altura de control estándar. Es un <a> (magic-link), por eso no
   hereda el estilo del <button>. Entra con una animación suave al aparecer. */
.prov-cta{ display:flex; align-items:center; justify-content:center; min-height:var(--ctl-h);
  margin-top:var(--sp-5); padding:0 var(--sp-6); border-radius:var(--r-md);
  background:var(--btn-bg); color:var(--fg-on-brand); font-weight:800; font-size:var(--fs-16);
  text-decoration:none; transition:background var(--t-base) var(--ease-out), transform var(--t-base) var(--ease-out) }
.prov-cta:hover{ background:var(--btn-bg-h); color:var(--fg-on-brand) }
#mode-listo:not([hidden]) .prov-cta{ animation:prov-in .4s ease both }
@keyframes prov-in{ from{ opacity:0; transform:translateY(var(--sp-2)) } to{ opacity:1; transform:none } }

/* ============================================================
   MARKETING · educreia.com  (landing de la plataforma)
   ------------------------------------------------------------
   Pantalla de la PLATAFORMA (dominio base), no de una academia:
   acá la marca ES Educreia. Todo el bloque está acotado a `.mk`
   (el <body> de plataforma.html) para no tocar el resto de la app.
   Los botones/pills de acá son candidatos a subir a ui.css cuando
   el panel adopte el look Educreia; por ahora viven scopeados.
   Todo sale de tokens (capa 1); los pocos px son geometría de
   dibujo (mock, ticks), como la excepción del certificado.
   ============================================================ */
.mk{
  --mk-max: 1200px;          /* ancho de contenido */
  --mk-gutter: var(--sp-6);  /* respiro lateral */
  --mk-nav-h: 64px;          /* alto de la barra fija */
  --mk-btn-lg: 52px;         /* alto de botón grande */
  --mk-cover: 56px;          /* portada del mock */
  --mk-ic: 44px;             /* caja de ícono de función */
  --au-fld-h: 46px;          /* alto de campo del alta/login (coherente en todo el funnel) */
  background: var(--surface-card);
  color: var(--text-body);
}
html{ scroll-behavior: smooth }
.mk section[id]{ scroll-margin-top: calc(var(--mk-nav-h) + var(--sp-4)) }
.mk-wrap{ max-width:var(--mk-max); margin:0 auto; padding:0 var(--mk-gutter) }
/* El `.lead` global (app.css) quedó chico (fs-14) para el resto de la app; en la
   landing es prosa de marketing → fs-18. Scopeado hasta unificar en el QA general. */
.mk .lead{ font-size:var(--fs-18); line-height:var(--lh-prose) }

/* ── Logo oficial (assets/logo-educreia.svg · inverse para fondo oscuro) ── */
.edu-logo{ display:inline-flex; align-items:center; text-decoration:none; line-height:0 }
.edu-logo-img{ display:block; height:35px; width:auto }   /* nav (+20%) */
.mk-footer-logo{ height:28px }

/* ── Botones (scopeados a la landing) ── */
.mk .btn{ display:inline-flex; align-items:center; justify-content:center; gap:var(--sp-2);
  height:var(--ctl-h); padding:0 var(--sp-4); border:1px solid transparent; border-radius:var(--r-sm);
  font-family:var(--font-sans); font-weight:600; font-size:var(--fs-15); line-height:1; white-space:nowrap;
  text-decoration:none; cursor:pointer;
  transition:background var(--t-fast) var(--ease-out), border-color var(--t-fast) var(--ease-out),
             box-shadow var(--t-fast) var(--ease-out), transform var(--t-fast) var(--ease-out), filter var(--t-fast) var(--ease-out) }
.mk .btn:active{ transform:scale(.985) }
.mk .btn:focus-visible{ outline:none; box-shadow:var(--focus-ring) }
.mk .btn-lg{ height:var(--mk-btn-lg); padding:0 var(--sp-6); font-size:var(--fs-16); border-radius:var(--r-md) }
.mk .btn-accent{ background:var(--brand-gradient-control); color:#fff; box-shadow:var(--shadow-accent) }
.mk .btn-accent:hover{ filter:brightness(1.08) }
.mk .btn-primary{ background:var(--navy-700); color:#fff }
.mk .btn-primary:hover{ background:var(--btn-bg-h); color:#fff }
.mk .btn-outline{ background:transparent; border-color:var(--slate-200); color:var(--text-strong) }
.mk .btn-outline:hover{ background:var(--surface-hover); border-color:var(--slate-300) }
.mk .btn-ghost{ background:transparent; color:var(--text-body) }
.mk .btn-ghost:hover{ background:var(--surface-hover); color:var(--text-strong) }
.mk .btn-glass{ background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.30); color:#fff; backdrop-filter:blur(6px) }
.mk .btn-glass:hover{ background:rgba(255,255,255,.20); color:#fff }

/* ── Pills ── */
.mk .pill{ display:inline-flex; align-items:center; gap:var(--sp-2); padding:var(--sp-1) var(--sp-3);
  border:1px solid transparent; border-radius:var(--r-pill); font-weight:700; font-size:var(--fs-12); letter-spacing:.04em }
.mk .pill-mint{ background:rgba(79,224,200,.14); color:var(--teal-300); border-color:rgba(79,224,200,.30) }
.mk .pill-accent{ background:var(--teal-050); color:var(--teal-700) }

/* ── Barra fija (glass) ── */
.mk-nav{ position:sticky; top:0; z-index:50; background:var(--surface-glass);
  backdrop-filter:blur(14px) saturate(140%); -webkit-backdrop-filter:blur(14px) saturate(140%);
  border-bottom:1px solid var(--slate-200) }
.mk-nav-in{ max-width:var(--mk-max); margin:0 auto; height:var(--mk-nav-h); display:flex; align-items:center;
  gap:var(--sp-5); padding:0 var(--mk-gutter) }
.mk-nav-links{ display:flex; gap:var(--sp-5); margin-left:auto }
.mk-nav-links a{ color:var(--text-body); font-weight:600; font-size:var(--fs-15); text-decoration:none;
  transition:color var(--t-fast) var(--ease-out) }
.mk-nav-links a:hover{ color:var(--text-accent) }
.mk-nav-cta{ display:flex; align-items:center; gap:var(--sp-3) }

/* ── Hero ── (ocupa la primera pantalla) */
.mk-hero{ position:relative; display:flex; flex-direction:column; overflow:hidden;
  min-height:calc(100vh - var(--mk-nav-h)); min-height:calc(100svh - var(--mk-nav-h));
  background:var(--surface-dark); color:#fff }
.mk-hero::before{ content:""; position:absolute; inset:0; z-index:0; background:var(--glow-radial); pointer-events:none }
.mk-hero-in{ position:relative; z-index:2; flex:1; width:100%; max-width:var(--mk-max); margin:0 auto;
  padding:var(--sp-8) var(--mk-gutter) var(--sp-7);
  display:grid; grid-template-columns:1.05fr .95fr; gap:var(--sp-8); align-items:center }

/* Fondo animado: 06 · partículas flotantes (edu-drift / edu-drift-slow) */
.mk-hero-fx{ position:absolute; inset:0; z-index:1; pointer-events:none }
.mk-hero-fx .p{ position:absolute; border-radius:var(--r-pill); background:var(--teal-300);
  opacity:.65; box-shadow:0 0 8px 1px rgba(79,224,200,.5) }
.mk-hero-fx .p1{ width:6px;height:6px; left:8%;  top:24%; animation:edu-drift 6s var(--ease-in-out) infinite }
.mk-hero-fx .p2{ width:8px;height:8px; left:18%; top:64%; animation:edu-drift-slow 7.5s var(--ease-in-out) infinite; animation-delay:-2s }
.mk-hero-fx .p3{ width:4px;height:4px; left:30%; top:40%; animation:edu-drift 5.2s var(--ease-in-out) infinite; animation-delay:-1s }
.mk-hero-fx .p4{ width:5px;height:5px; left:42%; top:78%; animation:edu-drift-slow 6.8s var(--ease-in-out) infinite; animation-delay:-3s }
.mk-hero-fx .p5{ width:7px;height:7px; left:53%; top:18%; animation:edu-drift 8s var(--ease-in-out) infinite; animation-delay:-1.5s }
.mk-hero-fx .p6{ width:4px;height:4px; left:61%; top:52%; animation:edu-drift-slow 5.6s var(--ease-in-out) infinite; animation-delay:-0.5s }
.mk-hero-fx .p7{ width:6px;height:6px; left:72%; top:33%; animation:edu-drift 7s var(--ease-in-out) infinite; animation-delay:-2.5s }
.mk-hero-fx .p8{ width:5px;height:5px; left:80%; top:70%; animation:edu-drift-slow 6.2s var(--ease-in-out) infinite; animation-delay:-1s }
.mk-hero-fx .p9{ width:8px;height:8px; left:88%; top:44%; animation:edu-drift 9s var(--ease-in-out) infinite; animation-delay:-3.5s }
.mk-hero-fx .p10{ width:4px;height:4px; left:95%; top:22%; animation:edu-drift-slow 5s var(--ease-in-out) infinite; animation-delay:-2s }
.mk-hero-fx .p11{ width:5px;height:5px; left:12%; top:85%; animation:edu-drift 6.6s var(--ease-in-out) infinite; animation-delay:-4s }
.mk-hero-fx .p12{ width:6px;height:6px; left:66%; top:88%; animation:edu-drift-slow 8.5s var(--ease-in-out) infinite; animation-delay:-1.2s }
.mk-hero-copy .edu-display{ color:#fff; font-size:var(--fs-56) }
.mk-hero-copy .edu-display em{ color:var(--teal-300) }
.mk-hero-copy .pill{ margin-bottom:var(--sp-4) }
.mk-hero-lead{ color:var(--text-inverse-muted); max-width:52ch; margin-top:var(--sp-4) }
.mk-hero-actions{ display:flex; gap:var(--sp-3); margin-top:var(--sp-6); flex-wrap:wrap }
.mk-hero-note{ margin-top:var(--sp-3); color:var(--text-inverse-muted); font-size:var(--fs-14) }

/* Mock de producto (glass sobre navy) */
.mk-hero-media{ display:flex; justify-content:center }
.mk-mock{ width:100%; background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.14);
  border-radius:var(--r-lg); box-shadow:var(--shadow-xl); overflow:hidden;
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px) }
.mk-mock-top{ display:flex; align-items:center; gap:var(--sp-2); padding:var(--sp-3) var(--sp-4);
  border-bottom:1px solid rgba(255,255,255,.10) }
.mk-mock-dot{ width:var(--sp-2); height:var(--sp-2); border-radius:50%; background:rgba(255,255,255,.30) }
.mk-mock-url{ margin-left:auto; font-family:var(--font-mono); font-size:var(--fs-12); color:var(--text-inverse-muted) }
.mk-mock-body{ padding:var(--sp-4); display:flex; flex-direction:column; gap:var(--sp-3);
  background:rgba(255,255,255,.03) }
.mk-stat-row{ display:grid; grid-template-columns:repeat(3,1fr); gap:var(--sp-3) }
.mk-stat{ display:flex; flex-direction:column; gap:var(--sp-1); padding:var(--sp-3);
  background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.10); border-radius:var(--r-sm) }
.mk-stat-k{ font-size:var(--fs-11); text-transform:uppercase; letter-spacing:.06em; color:var(--text-inverse-muted) }
.mk-stat-v{ font-family:var(--font-mono); font-weight:700; font-size:var(--fs-18); color:#fff }
.mk-stat-up .mk-stat-v{ color:var(--teal-300) }
.mk-course{ display:flex; align-items:center; gap:var(--sp-3); padding:var(--sp-3);
  background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.10); border-radius:var(--r-sm) }
.mk-course-cover{ width:var(--mk-cover); height:var(--mk-cover); flex:none; border-radius:var(--r-xs);
  background:var(--brand-gradient) }
.mk-course-meta{ display:flex; flex-direction:column; gap:var(--sp-1); flex:1; min-width:0 }
.mk-course-title{ color:#fff; font-weight:700; font-size:var(--fs-14) }
.mk-course-sub{ color:var(--text-inverse-muted); font-size:var(--fs-12) }
.mk-bar{ height:var(--barra-h); border-radius:var(--r-pill); background:rgba(255,255,255,.14); overflow:hidden }
.mk-bar span{ display:block; height:100%; width:var(--p); border-radius:inherit; background:var(--brand-gradient) }
.mk-ring{ --sz:52px; width:var(--sz); height:var(--sz); flex:none; position:relative; display:grid; place-items:center;
  border-radius:50%; background:conic-gradient(var(--teal-400) calc(var(--p)*1%), rgba(255,255,255,.14) 0) }
.mk-ring::before{ content:""; position:absolute; inset:6px; border-radius:50%; background:#0b1a30 }
.mk-ring span{ position:relative; font-family:var(--font-mono); font-weight:700; font-size:var(--fs-11); color:#fff }
.mk-lesson{ display:flex; align-items:center; gap:var(--sp-3); padding:var(--sp-2) 0; font-size:var(--fs-13);
  color:var(--text-inverse-muted); border-top:1px solid rgba(255,255,255,.08) }
.mk-lesson-ic{ width:var(--sp-5); height:var(--sp-5); flex:none; border-radius:50%;
  border:1px solid rgba(255,255,255,.25); position:relative }
.mk-lesson-ic::after{ content:""; position:absolute; inset:0; margin:auto; width:0; height:0;
  border-left:6px solid rgba(255,255,255,.65); border-top:4px solid transparent; border-bottom:4px solid transparent;
  transform:translateX(1px) }
.mk-lesson-t{ margin-left:auto; font-family:var(--font-mono) }

/* Tira de atributos bajo el hero */
.mk-marquee{ position:relative; display:flex; flex-wrap:wrap; justify-content:center; gap:var(--sp-2) var(--sp-5);
  max-width:var(--mk-max); margin:0 auto; padding:0 var(--mk-gutter) var(--sp-7) }
.mk-marquee span{ display:inline-flex; align-items:center; gap:var(--sp-2); color:var(--text-inverse-muted);
  font-size:var(--fs-13); font-weight:600 }
.mk-marquee span::before{ content:""; width:var(--mk-dot,6px); height:var(--mk-dot,6px); border-radius:50%;
  background:var(--teal-400) }

/* ── Secciones ── */
.mk-section{ padding:var(--sp-9) 0 }
.mk-section-soft{ background:var(--surface-page) }
.mk-head{ max-width:64ch; margin:0 auto var(--sp-7); text-align:center;
  display:flex; flex-direction:column; align-items:center; gap:var(--sp-3) }
.mk-head .lead{ color:var(--text-muted) }

/* Funciones */
.mk-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:var(--sp-4) }
.mk-feat{ display:flex; flex-direction:column; gap:var(--sp-2); padding:var(--sp-5);
  background:var(--surface-card); border:1px solid var(--slate-200); border-radius:var(--r-md);
  box-shadow:var(--shadow-sm);
  transition:box-shadow var(--t-base) var(--ease-out), transform var(--t-base) var(--ease-out) }
.mk-feat:hover{ box-shadow:var(--shadow-lg); transform:translateY(-2px) }
.mk-feat-ic{ display:inline-flex; align-items:center; justify-content:center; width:var(--mk-ic); height:var(--mk-ic);
  margin-bottom:var(--sp-2); border-radius:var(--r-sm); background:var(--teal-050); color:var(--teal-600) }
.mk-feat-ic svg{ width:22px; height:22px }
.mk-feat h3{ font-size:var(--fs-20) }
.mk-feat p{ color:var(--text-muted); font-size:var(--fs-15) }

/* Cómo funciona */
.mk-steps{ display:grid; grid-template-columns:repeat(3,1fr); gap:var(--sp-6) }
.mk-step-n{ display:inline-flex; align-items:center; justify-content:center; width:var(--sp-7); height:var(--sp-7);
  margin-bottom:var(--sp-3); border-radius:var(--r-pill); background:var(--brand-gradient-control); color:#fff;
  font-weight:800; font-size:var(--fs-18); box-shadow:var(--shadow-accent) }
.mk-step h3{ font-size:var(--fs-20); margin-bottom:var(--sp-1) }
.mk-step p{ color:var(--text-muted) }

/* Precios */
.mk-plans{ display:grid; grid-template-columns:repeat(3,1fr); gap:var(--sp-4); align-items:stretch }
.mk-plan{ position:relative; display:flex; flex-direction:column; gap:var(--sp-2);
  padding:var(--sp-6) var(--sp-5); background:var(--surface-card); border:1px solid var(--slate-200);
  border-radius:var(--r-lg); box-shadow:var(--shadow-sm) }
.mk-plan-feat{ border-color:var(--teal-600); box-shadow:var(--shadow-md), 0 0 0 3px rgba(15,168,184,.14) }
.mk-plan-badge{ position:absolute; top:calc(var(--sp-3) * -1); left:50%; transform:translateX(-50%);
  box-shadow:var(--shadow-sm) }
.mk-plan-name{ font-weight:800; font-size:var(--fs-20); color:var(--text-strong) }
.mk-plan-desc{ color:var(--text-muted); font-size:var(--fs-14) }
.mk-plan-price{ display:flex; align-items:baseline; gap:var(--sp-1); margin:var(--sp-3) 0 }
.mk-plan-cur{ font-weight:700; font-size:var(--fs-20); color:var(--text-strong) }
.mk-plan-num{ font-family:var(--font-mono); font-weight:700; font-size:var(--fs-48); letter-spacing:-.02em;
  color:var(--text-strong) }
.mk-plan-per{ color:var(--text-muted); font-size:var(--fs-14) }
.mk-plan-list{ list-style:none; margin:var(--sp-2) 0 var(--sp-5); padding:0;
  display:flex; flex-direction:column; gap:var(--sp-2) }
.mk-plan-list li{ position:relative; padding-left:var(--sp-6); color:var(--text-body); font-size:var(--fs-15) }
.mk-plan-list li::before{ content:""; position:absolute; left:0; top:2px; width:18px; height:18px;
  border-radius:50%; background:var(--teal-050) }
.mk-plan-list li::after{ content:""; position:absolute; left:6px; top:6px; width:5px; height:9px;
  border-right:2px solid var(--teal-700); border-bottom:2px solid var(--teal-700); transform:rotate(45deg) }
.mk-plan-cta{ margin-top:auto }
.mk-plan .btn{ width:100% }

/* Cierre + acceso */
.mk-close{ position:relative; background:var(--brand-gradient); color:#fff; overflow:hidden }
.mk-close-in{ display:grid; grid-template-columns:1.1fr .9fr; gap:var(--sp-7); align-items:center;
  padding:var(--sp-9) var(--mk-gutter) }
.mk-close-title{ color:#fff }
.mk-close-lead{ color:rgba(255,255,255,.88); margin-top:var(--sp-3) }
.mk-close .eyebrow-on-dark{ color:#EAFBF7 }
.mk-close .btn-glass{ margin-top:var(--sp-5) }
.card-glass{ background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.25); border-radius:var(--r-lg);
  padding:var(--sp-5); box-shadow:var(--shadow-xl); backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px) }
.mk-access-title{ color:#fff; font-size:var(--fs-20); margin-bottom:var(--sp-4) }
.mk-access .field{ display:flex; flex-direction:column; gap:var(--gap-fld) }
.mk-access .field-label{ font-size:var(--fs-13); font-weight:600; color:#fff }
.mk-access input[type=email]{ width:100%; height:var(--ctl-h); padding:0 var(--ctl-px); border-radius:var(--r-sm);
  border:1px solid rgba(255,255,255,.30); background:rgba(255,255,255,.92); color:var(--text-strong);
  font-family:var(--font-sans); font-size:var(--fs-15) }
.mk-access input[type=email]:focus{ outline:none; border-color:var(--teal-400); box-shadow:var(--focus-ring) }
.mk-access .btn-primary{ width:100%; margin-top:var(--sp-3) }
.mk-access-note{ margin-top:var(--sp-3); color:rgba(255,255,255,.80); font-size:var(--fs-13) }
.mk-access .err{ min-height:1em; margin-top:var(--sp-2); color:#FFE1E1; font-size:var(--fs-13) }

/* Footer */
.mk-footer{ background:var(--navy-950); color:var(--text-inverse-muted) }
.mk-footer-in{ display:flex; justify-content:space-between; flex-wrap:wrap; gap:var(--sp-6);
  padding:var(--sp-8) var(--mk-gutter) var(--sp-6) }
.mk-footer-brand{ max-width:36ch; display:flex; flex-direction:column; align-items:flex-start; gap:var(--sp-3) }
.mk-footer-tag{ color:var(--text-inverse-muted); font-size:var(--fs-14) }
.mk-footer-links{ display:grid; grid-template-columns:repeat(2,auto); gap:var(--sp-2) var(--sp-6); align-content:start }
.mk-footer-links a{ color:var(--text-inverse-muted); text-decoration:none; font-size:var(--fs-14);
  transition:color var(--t-fast) var(--ease-out) }
.mk-footer-links a:hover{ color:#fff }
.mk-footer-panel{ color:var(--teal-300); font-weight:600 }
.mk-footer-legal{ border-top:1px solid rgba(255,255,255,.08); padding:var(--sp-4) var(--mk-gutter);
  text-align:center; font-size:var(--fs-13); color:var(--text-inverse-muted) }

/* ============================================================
   ALTA / AUTH · split (panel de marca + formulario) — mismo
   lenguaje que la landing. Scopeado bajo .mk.
   ============================================================ */
.au-split{ display:grid; grid-template-columns:1.05fr .95fr;
  min-height:100vh; min-height:100svh }

/* Panel de marca (navy + partículas + glow) */
.au-brand{ position:relative; overflow:hidden; display:flex; background:var(--surface-dark); color:#fff }
.au-brand::before{ content:""; position:absolute; inset:0; z-index:0; background:var(--glow-radial); pointer-events:none }
.au-brand-in{ position:relative; z-index:2; margin:auto; width:100%; max-width:30rem;
  padding:var(--sp-8) var(--sp-7); display:flex; flex-direction:column; align-items:flex-start; gap:var(--sp-5) }
.au-brand .edu-logo-img{ height:36px }
.au-brand-title{ color:#fff; font-weight:800; font-size:var(--fs-40); line-height:var(--lh-tight); letter-spacing:-0.025em }
.au-brand-title em{ color:var(--teal-500); font-style:normal }
.au-points{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-3) }
.au-points li{ position:relative; padding-left:var(--sp-6); color:var(--text-inverse-muted); font-size:var(--fs-16) }
.au-points li::before{ content:""; position:absolute; left:0; top:2px; width:20px; height:20px;
  border-radius:50%; background:rgba(15,168,184,.15) }
.au-points li::after{ content:""; position:absolute; left:7px; top:6px; width:5px; height:9px;
  border-right:2px solid var(--teal-500); border-bottom:2px solid var(--teal-500); transform:rotate(45deg) }
.au-brand-note{ color:var(--text-inverse-muted); font-size:var(--fs-14) }

/* Formulario */
.au-form{ display:grid; place-items:center; padding:var(--sp-7) var(--sp-6); background:var(--surface-card) }
.au-form-in{ width:100%; max-width:26rem }

.au-progress{ display:flex; align-items:center; gap:var(--sp-3); margin-bottom:var(--sp-5) }
.au-progress-label{ font-size:var(--fs-13); font-weight:600; color:var(--text-muted); white-space:nowrap }
.au-progress-label b{ color:var(--teal-700) }
.au-progress-bar{ flex:1; height:6px; border-radius:var(--r-pill); background:var(--slate-100); overflow:hidden }
.au-progress-bar i{ display:block; height:100%; width:50%; border-radius:inherit;
  background:var(--brand-gradient-control); transition:width var(--t-base) var(--ease-out) }

.au-title{ font-size:var(--fs-32) }
.au-sub{ margin-top:var(--sp-2); margin-bottom:var(--sp-5); color:var(--text-muted) }
.au-step{ display:flex; flex-direction:column; gap:var(--sp-4) }
.au-step[hidden]{ display:none }   /* el display:flex de arriba, si no, pisa el atributo hidden */

.au-field{ display:flex; flex-direction:column; gap:var(--gap-fld) }
.au-label{ font-size:var(--fs-14); font-weight:600; color:var(--text-strong) }
.au-field input{ width:100%; height:var(--au-fld-h); padding:0 var(--sp-4); border-radius:var(--r-sm);
  border:1px solid var(--slate-200); background:var(--surface-card); color:var(--text-strong);
  font-family:var(--font-sans); font-size:var(--fs-16);
  transition:border-color var(--t-fast) var(--ease-out), box-shadow var(--t-fast) var(--ease-out) }
.au-field input::placeholder{ color:var(--text-subtle) }
.au-field input:focus{ outline:none; border-color:var(--teal-400); box-shadow:var(--focus-ring) }

.au-pass{ position:relative; display:block }
.au-pass input{ padding-right:48px }
.au-eye{ position:absolute; right:6px; top:50%; transform:translateY(-50%); width:36px; height:36px;
  display:inline-flex; align-items:center; justify-content:center; border:0; background:transparent;
  color:var(--text-muted); cursor:pointer; border-radius:var(--r-xs) }
.au-eye:hover{ color:var(--text-strong); background:var(--surface-hover) }
/* flex:0 0 auto: sin esto el SVG (sin ancho/alto intrínseco) colapsa a width:0 dentro
   del botón flex y el ojito no se ve, aunque el CSS le ponga width:20px. */
.au-eye svg{ width:20px; height:20px; flex:0 0 auto }
/* El ícono inactivo se oculta con el atributo [hidden]. Un `svg{display:block}` global
   (regla de autor) le gana al [hidden] de la hoja del navegador y deja los DOS ojos
   visibles; esta regla de autor, más específica, lo vuelve a ocultar. */
.au-eye svg[hidden]{ display:none }

.au-hint{ font-size:var(--fs-13); color:var(--text-muted); margin-top:calc(var(--gap-fld) * -1) }
.au-hint.is-ok{ color:var(--success) }
.au-hint.is-bad{ color:var(--danger) }
.au-note{ font-size:var(--fs-13); color:var(--text-muted) }
.au-legal{ margin-top:var(--sp-4) }
.au-legal a, .au-link{ color:var(--text-accent); text-decoration:none; font-weight:600 }
.au-legal a:hover, .au-link:hover{ text-decoration:underline }
.au-link{ display:inline-block; margin-top:var(--sp-4); font-size:var(--fs-14) }

/* Casilla obligatoria de aceptación de Términos (alta de academia). */
.au-accept{ display:flex; align-items:flex-start; gap:var(--sp-3); margin-top:var(--sp-4); font-size:var(--fs-13); line-height:var(--lh-normal); color:var(--text-muted); cursor:pointer }
.au-accept input{ flex:none; margin-top:var(--sp-1) }
.au-accept a{ color:var(--text-accent); font-weight:600; text-decoration:none }
.au-accept a:hover{ text-decoration:underline }
.au-actions{ display:flex; gap:var(--sp-3); margin-top:var(--sp-2) }
.au-actions .btn-accent{ flex:1 }

.au-form .err{ min-height:1em; margin-top:var(--sp-3); color:var(--danger); font-size:var(--fs-14) }

.au-done-ic{ display:inline-flex; align-items:center; justify-content:center; width:56px; height:56px;
  border-radius:var(--r-pill); background:var(--success-soft); color:var(--success); margin-bottom:var(--sp-4) }
.au-done-ic svg{ width:28px; height:28px }
#mode-done .lead{ color:var(--text-body) }

@media (max-width:860px){
  .au-split{ grid-template-columns:1fr; min-height:0 }
  .au-brand-in{ max-width:none; padding:var(--sp-6) var(--sp-5); gap:var(--sp-4) }
  .au-brand-title{ font-size:var(--fs-32) }
  .au-points{ display:none }
  .au-form{ padding:var(--sp-6) var(--sp-5) }
}

/* ── Auth centrado (login): tarjeta con la marca del TENANT sobre fondo navy ──
   login se sirve en el dominio de cada academia; la marca sale de `cuentas`. */
.au-solo{ position:relative; min-height:100svh; overflow:hidden;
  background:var(--login-bg, var(--surface-dark)) }   /* --login-bg lo inyecta el middleware por academia */
.au-solo::before{ content:""; position:absolute; inset:0; z-index:0; background:var(--glow-radial); pointer-events:none }
.au-solo .mk-hero-fx{ z-index:0 }
.au-center{ position:relative; z-index:1; min-height:100svh; display:grid; place-items:center; padding:var(--sp-7) var(--sp-5) }
.au-card{ width:100%; max-width:34rem; background:var(--surface-card); border:1px solid var(--slate-200);
  border-radius:var(--r-lg); box-shadow:var(--shadow-xl); padding:var(--sp-7) var(--sp-6) }
.au-card-logo{ display:flex; justify-content:center; margin-bottom:var(--sp-5) }
.au-card-logo a{ display:inline-flex; line-height:0 }
.au-card-logo .logo-img{ display:block; height:40px; width:auto }
.au-card-logo .logo-txt{ font-size:var(--fs-24); font-weight:800; color:var(--navy-700) }
.au-card .au-title{ text-align:center }
.au-card .au-sub{ text-align:center; margin-bottom:var(--sp-5) }
.au-card form{ display:flex; flex-direction:column; gap:var(--sp-4) }
.au-card form .btn{ width:100%; margin-top:var(--sp-1) }
.au-card .err{ min-height:1em; color:var(--danger); font-size:var(--fs-14) }
.au-card .au-ok{ color:var(--success) }
.au-links{ display:flex; flex-direction:column; align-items:center; gap:var(--sp-2); margin-top:var(--sp-5); text-align:center }
.au-card-foot{ margin-top:var(--sp-4); padding-top:var(--sp-4); border-top:1px solid var(--slate-100) }

/* Footer (footer.js) sobre el fondo navy del login */
.au-solo .site-footer{ position:relative; z-index:1; background:transparent; border:0 }
.au-solo .site-footer a, .au-solo .site-footer .sf-legal{ color:var(--text-inverse-muted) }
.au-solo .site-footer a:hover{ color:#fff }

/* Acento por academia (--login-acento): botón, links y foco del login. Fallback = sistema. */
.au-solo .btn-accent{ background:var(--login-acento, var(--brand-gradient-control)) }
.au-solo .au-link{ color:var(--login-acento, var(--text-accent)) }
.au-solo .au-card input:focus{ border-color:var(--login-acento, var(--teal-400)) }

/* Fondo claro elegido por la academia: sin partículas ni glow, y el pie en texto oscuro. */
html[data-login="claro"] .au-solo .mk-hero-fx,
html[data-login="claro"] .au-solo::before{ display:none }
html[data-login="claro"] .au-solo .site-footer a,
html[data-login="claro"] .au-solo .site-footer .sf-legal{ color:var(--text-muted) }
html[data-login="claro"] .au-solo .site-footer a:hover{ color:var(--text-strong) }

/* Vista previa de "Apariencia del ingreso" en el admin (JS pinta bg del box y del botón) */
.lg-prev{ margin-top:var(--sp-4); min-height:120px; padding:var(--sp-5); border-radius:var(--r-md);
  border:1px solid var(--slate-200); background:var(--surface-dark);
  display:flex; align-items:center; justify-content:center }
.lg-prev-card{ width:180px; padding:var(--sp-3); border-radius:var(--r-sm); background:#fff;
  box-shadow:var(--shadow-lg); display:flex; flex-direction:column; gap:var(--sp-2) }
.lg-prev-line{ height:8px; border-radius:var(--r-pill); background:var(--slate-100) }
.lg-prev-line.short{ width:60% }
.lg-prev-btn{ margin-top:var(--sp-1); height:24px; border-radius:var(--r-xs); background:var(--teal-600);
  color:#fff; font-size:var(--fs-12); font-weight:700; display:flex; align-items:center; justify-content:center }

/* Vista previa del TEMA de la academia (acento + fondo + tipografía) en el admin.
   Los valores elegidos entran por --tp-* (los setea el JS en el propio box), así el
   preview se pinta con el tema SIN teñir el panel. */
.tema-prev{ margin-top:var(--sp-4); padding:var(--sp-5); border-radius:var(--r-md);
  border:1px solid var(--slate-200); background:var(--tp-bg, var(--surface-page));
  font-family:var(--tp-font, var(--font-sans)) }
.tema-prev-card{ max-width:360px; padding:var(--sp-4); border-radius:var(--r-md); background:#fff;
  border:1px solid var(--slate-200); box-shadow:var(--shadow-lg) }
.tema-prev-h{ margin:0 0 var(--sp-2); font-family:var(--tp-font-tit, var(--tp-font, var(--font-display)));
  font-weight:700; font-size:var(--fs-20); color:var(--tp-text, var(--text-strong)); line-height:var(--lh-snug) }
.tema-prev-p{ margin:0 0 var(--sp-4); font-size:var(--fs-14); color:var(--tp-text, var(--text-body)); line-height:var(--lh-normal) }
.tema-prev-a{ color:var(--tp-acento, var(--text-accent)); font-weight:700; text-decoration:none }
.tema-prev-btn{ height:var(--ctl-h); padding:0 var(--sp-4); border:0; border-radius:var(--r-sm);
  background:var(--tp-boton, var(--pame-blue)); color:#fff; font-weight:700;
  font-family:var(--tp-font, var(--font-sans)); display:inline-flex; align-items:center; cursor:default }

/* ── Apariencia fase 2: plantillas + grilla de superficies temables (panel del dueño) ── */
.tema-tpl{ margin:var(--sp-4) 0 var(--sp-5) }
.tema-tpl-lbl{ display:block; font-size:var(--fs-12); font-weight:700; color:var(--fg-2); margin-bottom:var(--sp-2) }
.tema-tpl-chips{ display:flex; flex-wrap:wrap; gap:var(--sp-2) }
.tema-tpl-chip{ height:var(--ctl-h); padding:0 var(--sp-3); border:1px solid var(--slate-200); border-radius:999px;
  background:var(--surface-card); color:var(--fg-1); font-weight:700; font-size:var(--fs-13); cursor:pointer;
  display:inline-flex; align-items:center; transition:all var(--t-fast) }
.tema-tpl-chip:hover{ border-color:var(--pame-blue); background:var(--pame-blue-10); color:var(--pame-blue-700) }
.tema-tpl-reset{ margin-left:auto; color:var(--fg-2) }
/* Cada sección (General/Menú/Pie) es una tarjeta; adentro, cada ajuste es una fila compacta. */
/* 3 columnas de igual ancho y ALTO parejo: General | Menú lateral | (Barra superior + Pie
   apilados). align-items:stretch iguala el alto de las 3; el contenido de cada tarjeta queda
   arriba y el espacio sobrante abajo. La 3ª columna es una sub-grilla de 2 filas iguales. */
.tema-grid{ display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:var(--sp-4); margin-bottom:var(--sp-4); align-items:stretch }
.tema-col-stack{ display:grid; grid-template-rows:1fr 1fr; gap:var(--sp-4); min-width:0; min-height:0 }
.tema-col{ display:flex; flex-direction:column; gap:var(--sp-3); padding:var(--sp-4); min-width:0;
  border:1px solid var(--pame-line); border-radius:var(--r-lg); background:var(--surface-sunken) }
.tema-col-h{ margin:0; font-size:var(--fs-12); font-weight:800; text-transform:uppercase;
  letter-spacing:.04em; color:var(--fg-2); border-bottom:1px solid var(--pame-line); padding-bottom:var(--sp-2) }
.tm-field{ display:flex; flex-direction:column; gap:6px }
.tm-lbl{ display:flex; flex-direction:row; align-items:center; gap:8px; font-size:var(--fs-14); font-weight:700; color:var(--fg-1); cursor:pointer; margin:0; text-transform:none; letter-spacing:normal }
.tm-lbl > span{ flex:0 1 auto }
.tm-lbl input[type=checkbox]{ flex:none }
/* El control de cada campo se apila bajo el nombre (indent = ancho del checkbox). Cada color
   es una fila .tm-crow (pastilla + hex que llena el resto), así TODAS las pastillas quedan a la
   misma izquierda y todos los hex alineados y del mismo ancho. El degradado agrega otra .tm-crow
   idéntica debajo (sin flecha), perfectamente alineada con la de arriba. */
.tm-ctl{ display:flex; flex-direction:column; gap:7px; padding-left:26px }
.tm-crow{ display:flex; align-items:center; gap:8px }
.tm-crow[hidden]{ display:none }
.tm-crow .ui-color{ flex:none }
.tm-hex{ flex:1 1 auto; min-width:0; height:var(--ctl-h); text-transform:uppercase; font-family:var(--font-mono,monospace); font-size:var(--fs-13); letter-spacing:.02em }
.tm-crow .adm-select{ flex:1 1 auto; min-width:0 }
.tm-grad-tg{ display:inline-flex; flex-direction:row; align-items:center; gap:5px; font-size:var(--fs-12); font-weight:600; color:var(--fg-2); cursor:pointer; margin:0; text-transform:none; letter-spacing:normal }
.tm-grad-tg input[type=checkbox]{ flex:none }
@media(max-width:900px){ .tema-grid{ grid-template-columns:1fr; align-items:start } .tema-col-stack{ display:contents } .tema-tpl-reset{ margin-left:0 } }

/* Vista previa de la barra de anuncios en el admin (misma barra real, recortada en un box) */
.an-prev{ margin-top:var(--sp-2); border-radius:var(--r-sm); overflow:hidden; border:1px solid var(--slate-200) }
.an-prev .ui-empty{ margin:0; padding:var(--sp-3) }

/* Vista previa de la imagen del pop-up en el admin */
.pu-img-prev:empty{ display:none }
.pu-img-prev{ margin-bottom:var(--sp-2) }
.pu-img-prev img{ display:block; max-width:100%; max-height:200px; border-radius:var(--r-sm) }

/* Entrada suave */
@keyframes edu-fade-up{ from{ opacity:0; transform:translateY(8px) } to{ opacity:1; transform:none } }
.edu-fade-up{ animation:edu-fade-up var(--t-slow) var(--ease-out) both }
.mk-hero-media.edu-fade-up{ animation-delay:80ms }

/* ── Bloque con 05 · gradiente que se desliza (versión CLARA) ──
   Sección clara (heading oscuro, tarjetas blancas) con un gradiente sutil
   teal→navy muy tenue que se desliza detrás. */
.mk-grad{ position:relative; overflow:hidden;
  background:linear-gradient(120deg, var(--teal-050) 0%, var(--navy-050) 50%, var(--teal-050) 100%);
  background-size:200% 200%; animation:edu-gradient-shift 14s var(--ease-in-out) infinite }
.mk-grad .mk-wrap{ position:relative; z-index:1 }

/* ── Bloque con 02 · puntos en movimiento (versión CLARA) ──
   Grilla de puntos slate que se desliza en diagonal, muy sutil, sobre claro. */
.mk-dots{ position:relative; overflow:hidden }
.mk-dots::before{ content:""; position:absolute; inset:-20%; z-index:0; pointer-events:none;
  background-image:radial-gradient(var(--slate-300) 1px, transparent 1px); background-size:22px 22px;
  animation:edu-dot-shift 6s linear infinite }
.mk-dots .mk-wrap{ position:relative; z-index:1 }

/* Keyframes del sistema Educreia (fondos animados) */
@keyframes edu-drift{ 0%,100%{ transform:translate(0,0) } 50%{ transform:translate(18px,-14px) } }
@keyframes edu-drift-slow{ 0%,100%{ transform:translate(0,0) scale(1) } 50%{ transform:translate(-22px,16px) scale(1.06) } }
@keyframes edu-gradient-shift{ 0%,100%{ background-position:0% 50% } 50%{ background-position:100% 50% } }
@keyframes edu-dot-shift{ to{ background-position:22px 22px } }

/* ── Reveal al hacer scroll ──
   Cada bloque entra (fade + subida) cuando cruza el viewport. Lo dispara un
   IntersectionObserver que agrega .is-in. El escalonado (stagger) dentro de una
   grilla sale por nth-child, sin delays inline. */
.edu-reveal{ --edu-reveal-t:900ms; opacity:0; transform:translateY(26px);
  transition:opacity var(--edu-reveal-t) var(--ease-out), transform var(--edu-reveal-t) var(--ease-out) }
.edu-reveal.is-in{ opacity:1; transform:none }
.mk-grid > .edu-reveal:nth-child(2){ transition-delay:.07s }
.mk-grid > .edu-reveal:nth-child(3){ transition-delay:.14s }
.mk-grid > .edu-reveal:nth-child(4){ transition-delay:.21s }
.mk-grid > .edu-reveal:nth-child(5){ transition-delay:.28s }
.mk-grid > .edu-reveal:nth-child(6){ transition-delay:.35s }
.mk-steps > .edu-reveal:nth-child(2), .mk-plans > .edu-reveal:nth-child(2){ transition-delay:.1s }
.mk-steps > .edu-reveal:nth-child(3), .mk-plans > .edu-reveal:nth-child(3){ transition-delay:.2s }

/* Efecto de tipeo en el título hero */
.mk-typing{
  display:inline-block;
  border-right:3px solid;
  animation:mk-cursor-blink 0.6s infinite;
  min-height:1.2em;
}
@keyframes mk-cursor-blink{
  0%,49%{ border-right-color:transparent }
  50%,100%{ border-right-color:currentColor }
}

/* ── Responsive ── */
@media (max-width:900px){
  .mk-hero-in{ grid-template-columns:1fr; gap:var(--sp-6); padding-top:var(--sp-7) }
  .mk-hero-copy .edu-display{ font-size:var(--fs-40) }
  .mk-close-in{ grid-template-columns:1fr }
  .mk-grid{ grid-template-columns:repeat(2,1fr) }
  .mk-steps, .mk-plans{ grid-template-columns:1fr; max-width:34rem; margin-inline:auto }
  .mk-nav-links{ display:none }
}
@media (max-width:560px){
  .mk-grid{ grid-template-columns:1fr }
  .mk-hero-actions .btn{ flex:1 1 auto }
  .mk-footer-in{ flex-direction:column }
}
@media (prefers-reduced-motion:reduce){
  html{ scroll-behavior:auto }
  .edu-fade-up, .mk-hero-fx .p, .mk-grad, .mk-dots::before{ animation:none }
  .mk-grad{ background-position:0% 50% }
  .edu-reveal{ opacity:1; transform:none; transition:none }
}

/* ── Afiliados: tarjeta "Recomendá y ganá" (vista del alumno) ──────────────── */
.afil-card{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-lg);
  padding:var(--sp-5);margin:var(--sp-5) 0;box-shadow:var(--shadow-sm)}
.afil-head{display:flex;gap:var(--sp-3);align-items:flex-start;margin-bottom:var(--sp-4)}
.afil-emoji{font-size:var(--fs-24);line-height:1}
.afil-tit{font-size:var(--fs-18);margin:0;color:var(--fg-1)}
.afil-sub{font-size:var(--fs-13);color:var(--fg-3);margin:var(--sp-1) 0 0}
.afil-link{display:flex;gap:var(--sp-2)}
.afil-link input{flex:1;height:var(--ctl-h);min-width:0;font-size:var(--fs-13);padding:0 var(--sp-3);
  border:1px solid var(--pame-line);border-radius:var(--r-sm);background:var(--pame-bg-soft);color:var(--fg-2)}
.afil-link button{width:auto;height:var(--ctl-h);padding:0 var(--sp-4);background:var(--btn-bg);color:#fff;
  border:none;border-radius:var(--r-sm);font-weight:700;font-size:var(--fs-14);cursor:pointer}
.afil-link button:hover{background:var(--btn-bg-h)}
.afil-stats{display:flex;flex-wrap:wrap;gap:var(--sp-4);margin-top:var(--sp-4);font-size:var(--fs-13);color:var(--fg-3)}
.afil-stats b{color:var(--fg-1)}
.afil-hint{font-size:var(--fs-13);color:var(--fg-3);margin:var(--sp-4) 0 0}
/* Cuánto gana el afiliado: pill teal, bien a la vista (ficha + Mis afiliaciones). */
.afil-comision{display:inline-flex;align-items:center;margin:var(--sp-3) 0;
  padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);
  background:var(--pame-teal-10);color:var(--pame-teal);font-weight:800;font-size:var(--fs-14)}
.af-row .afil-comision{margin:0 0 var(--sp-3)}
/* Link para releer las condiciones del programa (Mis afiliaciones). */
.af-cond-open{margin-top:var(--sp-3);background:none;border:none;padding:0;width:auto;
  color:var(--pame-blue);font-weight:700;font-size:var(--fs-13);cursor:pointer;text-decoration:underline}
.af-cond-open:hover{color:var(--pame-blue-700)}
.af-row .af-constancia{margin:var(--sp-3) 0 0}
.af-constancia-meta{margin:0 0 var(--sp-3)}
.af-constancia-meta .afil-comision{margin:0 0 var(--sp-2)}

/* ── Afiliados: cola de comisiones en la pestaña Ventas (admin) ────────────── */
.v-afil{margin-top:var(--sp-6)}
.v-afil-head{display:flex;flex-direction:column;gap:var(--sp-1);margin-bottom:var(--sp-4)}
.v-afil-head h3{margin:0;font-size:var(--fs-18);color:var(--fg-1)}
.c-afil-block{margin-top:16px}
.c-afil-block .c-inline{display:inline}
.c-afil-nota{margin:6px 0 10px}
.c-afil-pct{max-width:140px}

/* Utilidad global (antes solo vivía inline en checkout.html). */
.hidden{display:none!important}
/* Afiliados — panel del dueño (pestaña Afiliados). */
.afil-cfg-modo{margin-top:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2)}
.afil-cfg-modo > p{margin:0 0 var(--sp-1);font-weight:700;color:var(--fg-1)}
/* Opciones como tarjetas seleccionables: el texto va SIEMPRE al lado del radio. */
.adm-radio{display:flex;align-items:flex-start;gap:var(--sp-3);font-size:var(--fs-14);color:var(--fg-1);
  margin:0;cursor:pointer;border:1px solid var(--pame-line);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);background:var(--pame-bg);
  transition:border-color var(--t-fast) var(--ease-out),background var(--t-fast) var(--ease-out)}
.adm-radio:hover{border-color:var(--pame-blue)}
.adm-radio:has(input:checked){border-color:var(--pame-blue);background:var(--pame-blue-10)}
.adm-radio input[type=radio]{width:18px;height:18px;flex:none;margin:1px 0 0;accent-color:var(--pame-teal);cursor:pointer}
.adm-radio span{flex:1;text-transform:none;letter-spacing:normal;font-weight:400;line-height:1.4}
.adm-radio span b{font-weight:700;color:var(--fg-1)}
/* Grupo de opciones .adm-radio apiladas (Estado, Disponibilidad, etc.): el gap va
   acá porque cada .adm-radio trae margin:0. */
.adm-choice{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-2)}
/* Bloque inmovilizado (ej. Precios cuando el curso es Gratuito): grisado y sin clicks. */
.adm-sub-block.is-locked{opacity:.5;pointer-events:none}
/* Sección entera bloqueada (ej. Funcionalidades cuando el curso es Cobro directo):
   se aplica a todos los .adm-sub-block hijos, salvo al aviso .nb-lock que queda a
   full opacidad para leer el motivo. */
.ficha-sec.cobro-locked-sec .adm-sub-block{opacity:.5;pointer-events:none}
.ficha-sec.cobro-locked-sec .nb-lock{opacity:1;pointer-events:auto}
/* Aviso de por qué quedó bloqueado (queda a full opacidad, arriba del bloque). */
.nb-lock{margin-top:var(--sp-4);padding:var(--sp-3) var(--sp-4);border-radius:var(--r-md);
  background:var(--pame-orange-10);color:var(--pame-orange-600);line-height:1.4}
/* Ayudita "?": signo chico al lado de un label; al tocarlo despliega .ayudita-pop abajo
   del campo (plegado por default, click no hover → anda en celular). Reusable con ayudita(). */
/* Los labels son flex-column por defecto; un label con "?" quedaría con el signo apilado
   ABAJO del texto (el botón es flex-item). Lo pasamos a fila para que el "?" vaya AL LADO. */
.adm-field > label:has(> .ayudita){flex-direction:row;align-items:center;white-space:nowrap}
.ayudita{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;
  margin-left:var(--sp-1);padding:0;border:1px solid var(--pame-line);border-radius:50%;
  background:var(--pame-bg);color:var(--fg-3);font-size:11px;font-weight:800;line-height:1;
  cursor:pointer;vertical-align:middle;flex:none}
/* Fondo explícito: gana al button:hover global (que pinta azul lleno) y evita el azul-sobre-azul. */
.ayudita:hover{background:var(--pame-blue-10);border-color:var(--pame-blue);color:var(--pame-blue)}
.ayudita[aria-expanded="true"]{background:var(--btn-bg);border-color:var(--pame-blue);color:#fff}
/* Globo flotante: position:fixed (lo ubica el JS por las coords del "?"), así se superpone
   y NO reacomoda el layout. left/top los setea ayudita al abrir. */
.ayudita-pop{position:fixed;z-index:1200;max-width:280px;padding:var(--sp-3) var(--sp-4);
  border-radius:var(--r-md);background:var(--pame-bg);color:var(--fg-2);border:1px solid var(--pame-line);
  box-shadow:var(--shadow-lg);font-size:var(--fs-13);line-height:1.45;font-weight:400;
  text-transform:none;letter-spacing:normal}
.afil-save-row{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-4)}
.afil-btn{width:auto;height:var(--ctl-h);padding:0 var(--sp-5);background:var(--btn-bg);color:#fff;border:none;
  border-radius:var(--r-sm);font-weight:700;font-size:var(--fs-14);cursor:pointer}
.afil-btn:hover{background:var(--btn-bg-h)}
.afil-panel-link{display:inline-block;margin-top:var(--sp-3);font-size:var(--fs-13);font-weight:700;color:var(--pame-blue);text-decoration:none}
.afil-panel-link:hover{text-decoration:underline}
/* Afiliados — panel del alumno (afiliaciones.html). */
.af-list{display:flex;flex-direction:column;gap:var(--sp-4)}
.af-row{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-lg);padding:var(--sp-5);box-shadow:var(--shadow-sm)}
.af-row-head h3{margin:0;font-size:var(--fs-16);color:var(--fg-1)}
.afil-libera{background:var(--pame-teal-10);color:var(--pame-teal-700);border-radius:var(--r-sm);
  padding:2px var(--sp-2);font-weight:600}

/* Afiliado cerrado / dado de baja: cartel + link deshabilitado, saldo sigue visible. */
.af-row--cerrado{opacity:.9}
.af-row--cerrado .af-row-head h3{color:var(--fg-3)}
.af-row-head{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;margin-bottom:var(--sp-3)}
.chip-cerrado{background:var(--pame-line);color:var(--fg-3);border-radius:var(--r-sm);
  padding:2px var(--sp-2);font-size:var(--fs-12);font-weight:700}
.afil-cerrado-banner{display:flex;align-items:flex-start;gap:var(--sp-2);
  background:var(--pame-bg-soft);border:1px dashed var(--pame-line);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);font-size:var(--fs-13);color:var(--fg-2)}
.afil-cerrado-banner svg{width:18px;height:18px;flex:none;color:var(--fg-3);margin-top:2px}

/* Cómo cobrar (datos de facturación de la academia). */
.af-fac{background:var(--pame-bg);border:1px solid var(--pame-line);border-radius:var(--r-lg);
  padding:var(--sp-5);box-shadow:var(--shadow-sm);margin:var(--sp-4) 0}
.af-fac-tit{margin:0 0 var(--sp-1);font-size:var(--fs-16);color:var(--fg-1)}
.af-fac-sub{margin:0 0 var(--sp-3);font-size:var(--fs-13);color:var(--fg-3)}
.af-fac-dl{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:var(--sp-3) var(--sp-4);margin:0}
.af-fac-dl > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.af-fac-dl dt{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.af-fac-dl dd{margin:0;font-size:var(--fs-14);color:var(--fg-1);font-weight:600;word-break:break-word}
.af-fac-note{margin:var(--sp-4) 0 0;padding-top:var(--sp-3);border-top:1px solid var(--pame-line);
  font-size:var(--fs-12);color:var(--fg-3)}

/* Factura del afiliado: bloque dentro de .af-row (subir / esperando cobro). */
.af-fact-box{margin-top:var(--sp-4);padding:var(--sp-4);border:1px solid var(--pame-line);
  border-radius:var(--r-md);background:var(--pame-teal-10);
  display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center;justify-content:space-between}
.af-fact-box.af-fact-need{background:var(--pame-orange-10);border-color:var(--pame-orange-30)}
.af-fact-msg{display:flex;align-items:flex-start;gap:var(--sp-2);font-size:var(--fs-13);
  color:var(--fg-1);min-width:0;flex:1 1 260px}
.af-fact-ic{width:20px;height:20px;flex:none;color:var(--pame-teal-700)}
.af-fact-need .af-fact-ic{color:var(--pame-orange-600)}
.af-fact-acts{display:flex;gap:var(--sp-2);flex-wrap:wrap}

/* Modal de subida de factura: campos apilados dentro del uimodal-card. */
.af-fact-modal{width:min(520px,100%)}
.af-fact-form{display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-3)}
.af-fact-form .adm-field{display:flex;flex-direction:column;gap:var(--sp-1)}
.af-fact-form .adm-field > span{font-size:var(--fs-12);color:var(--fg-3);font-weight:600}
.af-fact-form input[type=file],
.af-fact-form input[type=text],
.af-fact-form input[type=date]{height:var(--ctl-h);padding:0 var(--sp-3);border:1.5px solid var(--pame-line);
  border-radius:var(--r-sm);background:var(--bg-1);font-size:var(--fs-14);color:var(--fg-1);width:100%}
.af-fact-form input[type=file]{padding:6px var(--sp-3);line-height:calc(var(--ctl-h) - 12px)}
.af-fact-form input:focus{outline:none;border-color:var(--pame-blue)}
.af-fact-note{margin:0;font-size:var(--fs-12);color:var(--pame-orange-600);min-height:1em}

/* Chip "Ver factura" en la tabla de comisiones a pagar (panel del admin). */
.v-afil-fact-wrap{margin-top:var(--sp-2)}
.v-afil-fact{display:inline-flex;align-items:center;gap:var(--sp-1);height:auto;
  padding:var(--sp-1) var(--sp-2);background:var(--pame-teal-10);color:var(--pame-teal-700);
  border:1px solid var(--pame-teal-700);border-radius:var(--r-pill);
  font-size:var(--fs-12);font-weight:600;cursor:pointer}
.v-afil-fact:hover{background:var(--pame-teal-700);color:#fff}
.v-afil-fact svg{width:14px;height:14px;flex:none}

/* ═══════════════════════════════════════════════════════════════════════════
   NAVEGACIÓN INFERIOR (móvil) — patrón "bottom nav" (Material 3 / Apple HIG).
   La construye bottomnav.js a partir de la navegación que ya existe. Reemplaza en
   el celular al rail lateral del alumno y a las pestañas del panel: los destinos
   primarios quedan SIEMPRE visibles y al alcance del pulgar; el resto en "Más".
   Solo aparece ≤820px; en desktop no existe.
   ═══════════════════════════════════════════════════════════════════════════ */
.mob-bottomnav,.mob-sheet-wrap{display:none}
@media(max-width:820px){
  /* Se esconden los navegadores de escritorio; manda la barra inferior. */
  .dash-side{display:none}
  .dash-menu-btn{display:none}
  .site-footer{display:none}

  /* Fondo AQUA de la marca (teal), destacado; íconos y etiquetas en blanco. */
  .mob-bottomnav{
    display:flex;position:fixed;left:0;right:0;bottom:0;z-index:80;
    background:var(--pame-teal);border-top:none;
    box-shadow:0 -2px 16px rgba(2,51,77,.18);
    padding-bottom:env(safe-area-inset-bottom,0px);
  }
  .mob-nav-item{
    flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:3px;min-height:56px;padding:8px 4px 6px;border:none;cursor:pointer;
    color:rgba(255,255,255,.74);font-family:inherit;font-size:11px;font-weight:600;line-height:1;
    text-decoration:none;-webkit-tap-highlight-color:transparent;transition:color var(--t-fast),background var(--t-fast)}
  /* Los iconos se clonan del sidebar, donde ahora vienen rellenos con fill=url(#eduGrad)
     (teal). Sobre el fondo teal de la barra quedarían invisibles: los forzamos a seguir
     el color del ítem (blanco/blanco translúcido) pisando ese fill con currentColor. */
  .mob-nav-item svg{width:23px;height:23px;flex:none;stroke-width:2;fill:currentColor}
  .mob-nav-item span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* IMPORTANTE: hay un `button:hover{background:pame-blue-700}` GLOBAL que si no se
     anula pinta la barra de navy. Fijamos el fondo/color en todos los estados. El
     activo es blanco pleno (patrón bottom nav sobre color). */
  .mob-nav-item,.mob-nav-item:hover,.mob-nav-item:focus{background:none;color:rgba(255,255,255,.74)}
  .mob-nav-item.on,.mob-nav-item.on:hover,.mob-nav-item.on:focus{color:#fff}
  .mob-nav-item.on svg{stroke-width:2.6}
  .mob-nav-item:active{background:rgba(255,255,255,.16)}

  /* Deja aire al final del contenido para que la barra no tape lo último. */
  body.has-bottomnav .panel,
  body.has-bottomnav .dash-main,
  body.has-bottomnav .clase-wrap{padding-bottom:calc(74px + env(safe-area-inset-bottom,0px))}
  /* Los flotantes (asistente abajo-derecha, tamaño de texto abajo-izquierda) suben
     por encima de la barra para no quedar tapados ni pisarla. */
  body.has-bottomnav .paobot-fab,
  body.has-bottomnav .size-ctl{bottom:calc(74px + env(safe-area-inset-bottom,0px) + 12px)}

  /* Hoja "Más": sube desde abajo con TODAS las secciones. */
  .mob-sheet-wrap{display:block;position:fixed;inset:0;z-index:85;visibility:hidden}
  .mob-sheet-wrap.open{visibility:visible}
  .mob-sheet-bd{position:absolute;inset:0;background:rgba(2,51,77,.42);opacity:0;transition:opacity var(--t-base)}
  .mob-sheet-wrap.open .mob-sheet-bd{opacity:1}
  .mob-sheet{
    position:absolute;left:0;right:0;bottom:0;background:var(--surface-card);
    border-radius:var(--r-lg) var(--r-lg) 0 0;
    padding:var(--sp-3) var(--sp-3) calc(var(--sp-5) + env(safe-area-inset-bottom,0px));
    max-height:82vh;overflow-y:auto;transform:translateY(100%);transition:transform var(--t-base);
    box-shadow:0 -8px 30px rgba(2,51,77,.22)}
  .mob-sheet-wrap.open .mob-sheet{transform:none}
  .mob-sheet-grab{width:40px;height:4px;border-radius:2px;background:var(--pame-line);margin:2px auto 14px}
  .mob-sheet-tit{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.03em;
    color:var(--fg-3);margin:0 0 var(--sp-3);padding:0 var(--sp-2)}
  .mob-sheet-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-2)}
  .mob-sheet-item{
    display:flex;align-items:center;gap:10px;padding:14px;border-radius:var(--r-md);
    border:1px solid var(--pame-line);background:var(--bg-1);color:var(--fg-1);
    font-family:inherit;font-size:var(--fs-14);font-weight:600;line-height:1.2;
    text-decoration:none;cursor:pointer;text-align:left}
  .mob-sheet-item svg{width:20px;height:20px;flex:none;color:var(--pame-blue);stroke-width:2}
  /* Anula el button:hover global (que pinta el fondo azul lleno y deja el texto ilegible). */
  .mob-sheet-item:hover{background:var(--pame-blue-10);border-color:var(--pame-blue);color:var(--fg-1)}
  .mob-sheet-item.on,.mob-sheet-item.on:hover{border-color:var(--pame-blue);background:var(--pame-blue-10);color:var(--pame-blue-700)}
  .mob-sheet-item.on svg{color:var(--pame-blue-700)}
}

/* ── Cuadernillos de trabajo (IA) — editor en el panel de clase ────────────── */
.cuad-fuentes{display:flex;flex-direction:column;gap:var(--sp-2);max-height:200px;overflow:auto;
  border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3);background:var(--pame-bg)}
.cuad-list{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-3)}
.cuad-item-tit{font-weight:700}
.dup-card.cuad-card{width:720px}
.cuad-bloques{display:flex;flex-direction:column;gap:var(--sp-3);max-height:46vh;overflow:auto;padding-right:4px;margin-bottom:var(--sp-3)}
.cuad-b{border:1px solid var(--pame-line);border-radius:var(--r-md);padding:var(--sp-3);background:var(--pame-bg)}
.cuad-b-head{display:flex;align-items:center;gap:8px;margin-bottom:var(--sp-2)}
.cuad-b-tipo{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.03em;color:var(--pame-teal-700)}
.cuad-b-body{display:flex;flex-direction:column;gap:var(--sp-2)}
.cuad-b-body input,.cuad-b-body textarea{width:100%}
.cuad-inline{display:inline-flex;align-items:center;gap:8px;font-size:var(--fs-14);color:var(--fg-2)}
.cuad-inline input{width:80px}
.cuad-add-row{display:flex;gap:8px;align-items:center}
.cuad-add-row select{max-width:220px}
@media (max-width:760px){.dup-card.cuad-card{width:100%}}

/* ✂️ Cortar con IA — filas de clips propuestos (editables) */
.cort-filas{--ui-cols:auto auto minmax(150px,440px) 84px 84px auto auto auto;--ui-cols-mob:auto auto 1fr auto auto auto}
.cort-filas .cort-silc{justify-self:center}
.cort-del{color:var(--danger,#e23b3b)}
.cort-modo{display:flex;gap:var(--sp-1,.35rem);margin:var(--sp-2,.6rem) 0 var(--sp-1,.35rem)}
.cort-modo .btn-mini.on{background:var(--ac,#e06a3b);color:#fff;border-color:var(--ac,#e06a3b)}
.cort-hint{margin:var(--sp-1,.35rem) 0 var(--sp-2,.6rem);padding:var(--sp-2,.6rem) var(--sp-3,1rem);background:color-mix(in srgb, var(--teal-500,#0FA8B8) 16%, transparent);border-left:4px solid var(--teal-500,#0FA8B8);border-radius:var(--r-2,8px);color:var(--teal-700,#0C6A7C);font-weight:600;font-size:var(--fs-13);line-height:1.4}
.cort-ini,.cort-fin{text-align:center;cursor:text}
.cort-ini:focus,.cort-fin:focus{border-color:var(--ac,#e06a3b)}
.cort-top{display:flex;gap:var(--sp-3,1rem);flex-wrap:wrap;align-items:flex-start;margin-bottom:var(--sp-3,1rem)}
.cort-player-wrap{flex:3 1 560px;min-width:320px;max-width:1040px}
/* Modo "Ver sin lo tachado": que se note dónde estás parado. */
#cort-prev.previewing{background:var(--teal-500,#0FA8B8);border-color:var(--teal-500,#0FA8B8);color:#fff}
.cort-player-wrap.previewing{position:relative;outline:3px solid var(--teal-500,#0FA8B8);outline-offset:2px;border-radius:var(--r-2,8px)}
.cort-player-wrap.previewing::after{content:"▶ Vista sin lo tachado";position:absolute;top:8px;left:8px;z-index:3;pointer-events:none;background:var(--teal-500,#0FA8B8);color:#fff;font-size:var(--fs-11);font-weight:700;padding:2px 8px;border-radius:var(--r-2,8px);box-shadow:0 1px 4px rgba(0,0,0,.25)}
.cort-tl.previewing{box-shadow:inset 0 0 0 2px var(--teal-500,#0FA8B8)}
.cort-player{width:100%;aspect-ratio:16/9;border:0;border-radius:var(--r-2,8px);display:block}
.cort-trans-wrap{flex:1 1 260px;min-width:240px;max-width:360px}
.cort-trans{position:relative;max-height:420px;overflow:auto;border:1px solid var(--ui-bd,#dce2e8);border-radius:var(--r-2,8px);margin-top:var(--sp-2,.6rem)}
.cort-tline{display:block;width:100%;text-align:left;border:0;background:transparent;padding:var(--sp-1,.35rem) var(--sp-2,.6rem);font-size:var(--fs-14);color:inherit;cursor:pointer;line-height:1.45}
.cort-tline:hover{background:var(--bg-2,#f1f4f7)}
.cort-tline.now{background:color-mix(in srgb, var(--ac,#e06a3b) 26%, transparent);font-weight:700;color:var(--fg-1,#26323f);box-shadow:inset 4px 0 0 var(--ac,#e06a3b);border-radius:var(--r-2,8px)}
.cort-row.cort-flash{outline:2px solid var(--ac,#e06a3b);outline-offset:-2px}
.cort-row.cort-sel{background:var(--bg-2,#f1f4f7)}

/* ✂️ Línea de tiempo tipo Loom: cada clip es un bloque; se arrastran los bordes. */
.cort-tl-bar{display:flex;align-items:center;gap:var(--sp-2,.6rem);flex-wrap:wrap;margin-top:var(--sp-3,1rem)}
.cort-tl{--tl-h:58px;--tl-pad:6px;--tl-hand:12px;position:relative;height:var(--tl-h);background:var(--bg-2,#f1f4f7);border:1px solid var(--ui-bd,#dce2e8);border-radius:var(--r-2,8px);margin:var(--sp-1,.35rem) 0;overflow-x:auto;overflow-y:hidden;touch-action:none;user-select:none}
.cort-tl-in{position:relative;height:100%;min-width:100%}
.cort-tl-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--fg-3,#8a97a5);font-size:var(--fs-12)}
.cort-seg{position:absolute;top:var(--tl-pad);bottom:var(--tl-pad);background:color-mix(in srgb, var(--ac,#e06a3b) 16%, transparent);border:1px solid var(--ac,#e06a3b);border-radius:var(--r-2,8px);cursor:pointer;display:flex;align-items:center;overflow:hidden}
.cort-seg.sel{background:color-mix(in srgb, var(--ac,#e06a3b) 30%, transparent);box-shadow:0 0 0 2px var(--ac,#e06a3b);z-index:2}
.cort-seg.off{opacity:.4}
.cort-seg-lbl{flex:1;min-width:0;padding:0 var(--sp-2,.6rem);font-size:var(--fs-11);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--fg-1,#26323f);pointer-events:none}
.cort-seg-h{position:absolute;top:-1px;bottom:-1px;width:var(--tl-hand);background:var(--ac,#e06a3b);cursor:ew-resize;opacity:0;transition:opacity .12s}
.cort-seg-h.ini{left:-1px;border-radius:var(--r-2,8px) 0 0 var(--r-2,8px)}
.cort-seg-h.fin{right:-1px;border-radius:0 var(--r-2,8px) var(--r-2,8px) 0}
.cort-seg:hover .cort-seg-h,.cort-seg.sel .cort-seg-h{opacity:.9}
.cort-seg-cut{position:absolute;top:0;bottom:0;background:color-mix(in srgb, var(--danger,#e23b3b) 52%, transparent);pointer-events:none;z-index:1}
.cort-cut-h{position:absolute;top:0;bottom:0;width:12px;cursor:ew-resize;pointer-events:auto;z-index:2}
.cort-cut-h.a{left:-6px}
.cort-cut-h.b{right:-6px}
.cort-cut-h::after{content:"";position:absolute;top:25%;bottom:25%;left:50%;width:2px;transform:translateX(-50%);background:#fff;opacity:.85;border-radius:1px}
.cort-ph{position:absolute;top:0;bottom:0;width:2px;background:var(--danger,#e23b3b);box-shadow:0 0 3px rgba(0,0,0,.35);pointer-events:none;z-index:5}
.cort-ph::before{content:"";position:absolute;top:-1px;left:50%;transform:translateX(-50%);width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--danger,#e23b3b)}
.cort-tline.cut{text-decoration:line-through;opacity:.45}
.cort-tl-tag{position:absolute;top:0;transform:translateX(-50%);background:var(--fg-1,#26323f);color:#fff;font-size:var(--fs-11);padding:1px 6px;border-radius:var(--r-2,8px);pointer-events:none;z-index:4;white-space:nowrap}
.cort-tl-ayuda{margin:0 0 var(--sp-3,1rem)}
.cort-placas{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3,1rem);margin:var(--sp-2,.6rem) 0 var(--sp-3,1rem);padding:var(--sp-2,.6rem) var(--sp-3,1rem);background:var(--bg-2,#f1f4f7);border:1px solid var(--ui-bd,#dce2e8);border-radius:var(--r-2,8px)}
.cort-placa{display:inline-flex;align-items:center;gap:var(--sp-1,.35rem);flex-wrap:wrap}

/* ── Subir varios videos en lote (pantalla subirVariosVideos) ─────────────── */
.lote-item{margin-top:var(--sp-4);padding:var(--sp-4);border:1px solid var(--pame-line);border-radius:var(--r-lg);background:var(--pame-bg)}
.lote-item > .adm-row.lote-cab{align-items:center;margin-bottom:var(--sp-3)}
/* Archivo de origen: dato secundario, no el campo a completar. */
.lote-arch{display:flex;align-items:center;gap:var(--sp-2);min-width:0;font-size:var(--fs-13);font-weight:600;color:var(--fg-3)}
.lote-arch .ic{width:16px;height:16px;flex:none;opacity:.7}
.lote-arch-nom{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lote-est{font-size:var(--fs-13);font-weight:700;padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);white-space:nowrap}
.lote-est.sub{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.lote-est.ok{background:var(--success-soft);color:var(--pame-success)}
.lote-est.err{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.lote-bar{margin-top:var(--sp-2)}
/* Aviso mientras suben: destacado en verde para que no pase desapercibido. */
.lote-aviso{display:flex;align-items:flex-start;gap:var(--sp-2);margin-top:var(--sp-4);padding:var(--sp-3) var(--sp-4);border-radius:var(--ctl-r);background:var(--success-soft);color:var(--pame-success);font-weight:600;font-size:var(--fs-13);line-height:var(--lh-normal)}
.lote-aviso .ic{width:18px;height:18px;flex:none;margin-top:1px}
.lote-aviso[hidden]{display:none}
/* Cartel de cierre: deja en claro que las clases quedaron guardadas. */
.lote-fin{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-4);padding:var(--sp-3) var(--sp-4);border-radius:var(--ctl-r);background:var(--success-soft);color:var(--pame-success);font-weight:700;font-size:var(--fs-14)}
.lote-fin.con-error{background:var(--pame-orange-10);color:var(--pame-orange-600)}
/* Sin este guardia, .lote-fin{display:flex} pisa el atributo [hidden] y deja una
   barra verde vacía visible durante la subida (mismo caso que .vid-drop[hidden]). */
.lote-fin[hidden]{display:none}

/* ── Vendedor IA · creador y editor de la config comercial ─────────────────
   Vive en admin → Marketing → "Vendedor IA". El JS está en app/vendedor-ia.js;
   estos estilos respetan las reglas (todo desde tokens, --ctl-h, sin px suelto).
   El wizard y el modo edición comparten la misma paleta de componentes:
   .vi-card / .vi-sec (paneles), .vi-campo (label + control + ayuda). */
.vi-wrap{max-width:760px;margin:0 auto;padding:var(--sp-4) 0}
.vi-wrap.vi-wide{max-width:900px}
.vi-prog{margin-bottom:var(--sp-4)}
.vi-prog-txt{font-size:var(--fs-12);color:var(--pame-blue-70);margin-bottom:var(--sp-2)}
.vi-prog-bar{height:6px;background:var(--pame-blue-10);border-radius:var(--r-pill);overflow:hidden}
.vi-prog-fill{height:100%;background:var(--pame-teal);border-radius:var(--r-pill);width:var(--fill,0%);transition:width .2s}
.vi-card{background:#fff;border:var(--ctl-bd);border-radius:var(--r-3);padding:var(--sp-5)}
.vi-titulo{margin:0 0 var(--sp-2);font-size:var(--fs-20);color:var(--pame-blue-900)}
.vi-intro{margin:0 0 var(--sp-5);color:var(--pame-blue-70);font-size:var(--fs-14)}
.vi-campos{display:flex;flex-direction:column;gap:var(--sp-4)}
.vi-campo{display:flex;flex-direction:column;gap:var(--sp-2)}
.vi-label{font-size:var(--fs-13);font-weight:700;color:var(--pame-blue-900)}
.vi-campo input[type=text],
.vi-campo select,
.vi-campo textarea{width:100%}
.vi-campo textarea{min-height:calc(var(--ctl-h) * 2);padding:var(--sp-2) var(--sp-3);border:var(--ctl-bd);border-radius:var(--ctl-r);font-family:inherit;font-size:var(--fs-14);resize:vertical}
.vi-avatar-row{display:flex;align-items:center;gap:var(--sp-4)}
.vi-avatar-prev{width:72px;height:72px;border-radius:50%;background:var(--pame-teal);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:var(--fs-24);overflow:hidden;flex:none;border:var(--ctl-bd)}
.vi-avatar-prev img{width:100%;height:100%;object-fit:cover;display:block}
.vi-avatar-btns{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.vi-avatar-btns .btn-mini{cursor:pointer}
.vi-nav{justify-content:space-between;margin-top:var(--sp-5)}
.vi-link{background:none;border:0;color:var(--pame-teal-700);cursor:pointer;text-decoration:underline;padding:0;font-size:var(--fs-13)}
.vi-header{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-4);margin-bottom:var(--sp-5)}
.vi-estado{display:flex;align-items:center;gap:var(--sp-3);flex-shrink:0}
.vi-badge{padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);font-size:var(--fs-12);font-weight:700}
.vi-badge.on{background:var(--pame-teal-10);color:var(--pame-teal-700)}
.vi-badge.off{background:var(--pame-blue-10);color:var(--pame-blue-70)}
.vi-secciones{display:flex;flex-direction:column;gap:var(--sp-5)}
.vi-sec{background:#fff;border:var(--ctl-bd);border-radius:var(--r-3);padding:var(--sp-5)}
.vi-sec-titulo{margin:0 0 var(--sp-2);font-size:var(--fs-16);color:var(--pame-blue-900)}
.vi-sec-intro{margin:0 0 var(--sp-4);color:var(--pame-blue-70);font-size:var(--fs-13)}
.vi-sub{margin:var(--sp-5) 0 var(--sp-2);font-size:var(--fs-14);color:var(--pame-blue-900)}
.vi-sub:first-child{margin-top:0}
/* Objeciones — lista de tarjetas plegables */
.vi-obj-lista{display:flex;flex-direction:column;gap:var(--sp-3)}
.vi-obj{border:var(--ctl-bd);border-radius:var(--ctl-r);padding:var(--sp-3);background:var(--pame-blue-10)}
.vi-obj-head{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.vi-obj-head input[type=checkbox]{width:auto;height:auto}
.vi-obj-obj{font-weight:700;color:var(--pame-blue-900);font-size:var(--fs-14)}
.vi-obj textarea{width:100%;padding:var(--sp-2) var(--sp-3);border:var(--ctl-bd);border-radius:var(--ctl-r);font-family:inherit;font-size:var(--fs-13);background:#fff}
.vi-obj-propia .vi-obj-head input[type=text]{flex:1}
.vi-obj-propia .btn-del{padding:0 var(--sp-3);height:var(--ctl-h)}
/* Activación — la tarjeta grande del costo */
.vi-activ{max-width:520px;margin:0 auto;text-align:center}
.vi-cost{background:var(--pame-teal-10);border-radius:var(--r-3);padding:var(--sp-5);margin-bottom:var(--sp-4)}
.vi-cost-precio{font-size:var(--fs-32);font-weight:800;color:var(--pame-teal-700);line-height:1}
.vi-cost-unidad{font-size:var(--fs-13);color:var(--pame-blue-70);margin-top:var(--sp-2)}
.vi-note-legal{font-size:var(--fs-12);color:var(--pame-blue-70);margin-top:var(--sp-4)}
/* Medidor del período activo (charlas usadas · días restantes) */
.vi-medidor{background:#fff;border:var(--ctl-bd);border-radius:var(--r-3);padding:var(--sp-4);margin-bottom:var(--sp-4);text-align:left}
.vi-med-txt{font-size:var(--fs-13);color:var(--pame-blue-900);margin-bottom:var(--sp-2)}
.vi-med-bar{height:8px;background:var(--pame-blue-10);border-radius:var(--r-pill);overflow:hidden}
.vi-med-fill{height:100%;background:var(--pame-teal);border-radius:var(--r-pill);width:var(--fill,0%);transition:width .3s}
/* Banner "Sugerir con IA" en el wizard (paso 1) + modal para elegir curso */
.vi-sugerir{display:flex;align-items:center;gap:var(--sp-4);background:var(--pame-teal-10);border:1px solid var(--pame-teal-30);border-radius:var(--r-3);padding:var(--sp-4);margin-bottom:var(--sp-5)}
.vi-sug-icono{flex-shrink:0;width:40px;height:40px;border-radius:50%;background:var(--pame-teal);color:#fff;display:flex;align-items:center;justify-content:center}
.vi-sug-icono svg{width:20px;height:20px}
.vi-sug-txt{flex:1;min-width:0}
.vi-sug-tit{font-weight:800;font-size:var(--fs-14);color:var(--pame-blue-900)}
.vi-sug-sub{font-size:var(--fs-12);color:var(--pame-blue-70);margin-top:2px}
.vi-sug-bd{position:fixed;inset:0;background:rgba(20,30,50,.55);z-index:200;display:flex;align-items:center;justify-content:center;padding:var(--sp-4)}
.vi-sug-modal{background:#fff;border-radius:var(--r-3);width:100%;max-width:520px;max-height:90vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 12px 40px rgba(0,0,0,.3)}
.vi-sug-mhead{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-3);padding:var(--sp-4) var(--sp-5);border-bottom:var(--ctl-bd)}
.vi-sug-mhead .ci-x{color:var(--pame-blue-70)}
.vi-sug-mhead .ci-x:hover{color:var(--pame-blue-900);background:var(--pame-blue-10)}
.vi-sug-mtit{margin:0 0 var(--sp-1);font-size:var(--fs-16);color:var(--pame-blue-900)}
.vi-sug-body{padding:var(--sp-5);overflow-y:auto;display:flex;flex-direction:column;gap:var(--sp-4)}
.vi-sug-mfoot{display:flex;justify-content:flex-end;gap:var(--sp-2);padding:var(--sp-4) var(--sp-5);border-top:var(--ctl-bd);background:var(--pame-bg-soft,#f7f9fb)}
@media(max-width:520px){
  .vi-sugerir{flex-direction:column;text-align:center}
  .vi-sug-modal{max-height:100vh;border-radius:0}
}

/* ── Vendedor IA · widget en la ficha pública del curso (producto.html) ─
   Clases .ci-* propias para no colisionar con .paobot-*: podrían convivir en
   la misma pantalla el día que se abra el asistente del alumno a superficies
   públicas. Todo desde tokens, respeta --ctl-h, sin px sueltos. */
.ci-fab{position:fixed;right:20px;bottom:20px;z-index:80;width:60px;height:60px;border-radius:50%;
  border:0;cursor:pointer;background:var(--pame-teal);color:#fff;box-shadow:0 6px 18px rgba(0,0,0,.18);
  display:flex;align-items:center;justify-content:center;transition:transform .15s,background .15s}
.ci-fab:hover{background:var(--pame-teal-700);transform:translateY(-2px)}
.ci-fab svg{width:28px;height:28px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ci-panel{position:fixed;right:20px;bottom:92px;z-index:81;width:360px;max-width:calc(100vw - 40px);
  height:min(560px, calc(100vh - 120px));background:#fff;border-radius:var(--r-lg);
  box-shadow:0 12px 40px rgba(0,0,0,.22);display:flex;flex-direction:column;overflow:hidden;
  border:var(--ctl-bd)}
.ci-panel[hidden]{display:none}
.ci-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-4);background:var(--pame-blue-900);color:#fff}
.ci-head-who{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1}
.ci-avatar{width:38px;height:38px;border-radius:50%;background:var(--pame-teal);color:#fff;
  display:flex;align-items:center;justify-content:center;flex:none;overflow:hidden;font-weight:800;font-size:var(--fs-14)}
.ci-avatar img{width:100%;height:100%;object-fit:cover;display:block}
.ci-head-tit{min-width:0;flex:1}
.ci-head-nom{font-weight:800;font-size:var(--fs-14);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ci-head-sub{font-size:var(--fs-12);opacity:.75;margin-top:2px}
.ci-head-btns{display:flex;gap:var(--sp-1)}
.ci-x{background:none;border:0;color:#fff;cursor:pointer;padding:var(--sp-1);border-radius:var(--r-sm);
  display:flex;align-items:center;justify-content:center;opacity:.75}
.ci-x:hover{opacity:1;background:rgba(255,255,255,.12)}
.ci-x svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ci-hilo{flex:1;overflow-y:auto;padding:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-3);
  background:var(--pame-bg-soft, #f7f9fb)}
.ci-msg{max-width:85%;padding:var(--sp-2) var(--sp-3);border-radius:var(--r-md);font-size:var(--fs-14);line-height:1.4;
  word-wrap:break-word;overflow-wrap:break-word}
.ci-msg.bot{background:#fff;color:var(--pame-blue-900);border:var(--ctl-bd);align-self:flex-start;border-top-left-radius:6px}
.ci-msg.yo{background:var(--pame-teal);color:#fff;align-self:flex-end;border-top-right-radius:6px}
.ci-msg.pensando{display:inline-flex;gap:6px;align-items:center;padding:var(--sp-3) var(--sp-4)}
.ci-dot{width:8px;height:8px;border-radius:50%;background:var(--pame-blue-40);animation:ci-blink 1s infinite}
.ci-dot:nth-child(2){animation-delay:.2s}
.ci-dot:nth-child(3){animation-delay:.4s}
@keyframes ci-blink{0%,80%,100%{opacity:.3}40%{opacity:1}}
.ci-cta-box{padding:var(--sp-3) var(--sp-4);background:#fff;border-top:var(--ctl-bd);display:flex;flex-direction:column;gap:var(--sp-2)}
.ci-cta{display:block;text-align:center;background:var(--pame-teal);color:#fff;padding:var(--sp-3);border-radius:var(--ctl-r);
  text-decoration:none;font-weight:700;font-size:var(--fs-14)}
.ci-cta:hover{background:var(--pame-teal-700)}
.ci-wa{display:flex;align-items:center;justify-content:center;gap:var(--sp-2);color:var(--pame-blue-70);
  text-decoration:none;font-size:var(--fs-12);padding:var(--sp-1)}
.ci-wa:hover{color:var(--pame-teal-700)}
.ci-wa svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* El form del chat: input + botón enviar, EN LA MISMA LÍNEA. Necesita explicitar
   flex-direction:row (porque el .ci-panel de arriba es flex-column: el hijo
   sin dirección hereda mal en algunos navegadores) y box-sizing en el input,
   o el padding lo hace desbordar y el botón cae debajo. */
.ci-form{display:flex;flex-direction:row;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);background:#fff;border-top:var(--ctl-bd);align-items:center}
.ci-input{flex:1 1 auto;min-width:0;box-sizing:border-box;height:var(--ctl-h);padding:0 var(--sp-4);border:var(--ctl-bd);border-radius:var(--r-pill);font-size:var(--fs-14);font-family:inherit;background:var(--pame-bg-soft, #f7f9fb)}
.ci-input:focus{outline:0;border-color:var(--pame-teal);background:#fff}
/* El botón redondo de enviar. Aclaración de todos los overrides al `button` global
   (que trae padding, margin, background azul y border-radius de tarjeta): sin esto
   el botón queda ovalado y azul, y el ícono se pierde. box-sizing:border-box para
   que width/height sean el tamaño final del círculo. */
.ci-send{width:var(--ctl-h);height:var(--ctl-h);flex:none;padding:0;margin:0;border:0;border-radius:50%;
  background:var(--pame-teal);color:#fff;cursor:pointer;display:inline-flex;
  align-items:center;justify-content:center;box-sizing:border-box}
.ci-send:hover{background:var(--pame-teal-700)}
/* Ícono de avioncito con fill: se lee mejor que un stroke a este tamaño. */
.ci-send svg{width:20px;height:20px;fill:currentColor;stroke:none;display:block}
@media(max-width:520px){
  .ci-panel{right:10px;left:10px;bottom:82px;width:auto;max-width:none;height:min(80vh, 560px)}
  .ci-fab{right:14px;bottom:14px;width:54px;height:54px}
}

/* ── Afiliados · Condiciones y material (panel del dueño y vista del alumno) */
.afil-mat-add{margin:var(--sp-4) 0}
.afil-mat-add summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.afil-mat-add summary::-webkit-details-marker{display:none}
.afil-mat-form{margin-top:var(--sp-4);padding:var(--sp-4);background:var(--pame-bg);
  border:var(--ctl-bd);border-radius:var(--r-md);display:flex;flex-direction:column;gap:var(--sp-3)}
.afil-mat-grid{margin-top:var(--sp-4);display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  gap:var(--sp-3)}
.afil-mat-item{background:var(--pame-bg);border:var(--ctl-bd);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2)}
.afil-mat-item h5{margin:0;font-size:var(--fs-14);color:var(--fg-1)}
.afil-mat-item-head{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.afil-mat-item .btn-mini{align-self:flex-start}
.afil-mat-item .afil-mat-acts{margin-top:auto;display:flex;justify-content:flex-end}
.afil-mat-copy{background:#fff;border:var(--ctl-bd);border-radius:var(--r-sm);padding:var(--sp-2);
  font-size:var(--fs-12);color:var(--fg-2);white-space:pre-wrap;max-height:120px;overflow:auto;margin:0}

/* Alerta al alumno cuando cambiaron las condiciones y hay que re-aceptar */
.afil-cond-alert{background:#fff8ec;border:1px solid #f5c76a;border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);margin:var(--sp-3) 0;display:flex;gap:var(--sp-3);align-items:center;
  flex-wrap:wrap;color:#7a4b04;font-size:var(--fs-14)}
.afil-cond-alert b{color:#5c380a}
.afil-cond-alert .btn-add{margin-left:auto}

/* Sección Material del alumno afiliado */
.afil-mat-al-tabs{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin:var(--sp-3) 0}
.afil-mat-al-tab{background:var(--pame-bg);border:var(--ctl-bd);border-radius:999px;
  padding:6px var(--sp-3);font-size:var(--fs-12);cursor:pointer;color:var(--fg-2)}
.afil-mat-al-tab.on{background:var(--btn-bg);color:#fff;border-color:var(--pame-blue)}

/* Modal de condiciones (aceptar) */
.afil-cond-modal .uimodal-body-html{max-height:50vh;overflow:auto;
  padding:var(--sp-3) var(--sp-4);background:var(--pame-bg-soft, #f7f9fb);
  border-radius:var(--r-md);margin:var(--sp-3) 0;font-size:var(--fs-14);line-height:1.6}
.afil-cond-modal .uimodal-body-html h1,
.afil-cond-modal .uimodal-body-html h2,
.afil-cond-modal .uimodal-body-html h3{margin:var(--sp-3) 0 var(--sp-2);color:var(--fg-1)}
.afil-cond-modal .uimodal-body-html p{margin:0 0 var(--sp-2)}
.afil-cond-modal .uimodal-body-html ul,
.afil-cond-modal .uimodal-body-html ol{margin:0 0 var(--sp-2) var(--sp-4)}

/* ════════════════════════════════════════════════════════════════════════
   COMUNIDAD — feed social (estilo Skool). Usa tokens de colors_and_type.
   Todo con --com-chip-c fallback a --pame-blue para que las categorías
   personalicen su color sin escapar del sistema.
   ════════════════════════════════════════════════════════════════════════ */
.com-wrap{max-width:820px;margin:0 auto;padding:0 var(--sp-2)}
.com-header{margin:0 0 var(--sp-3)}
.com-header h1{margin:0 0 var(--sp-1);font-size:var(--fs-24)}
.com-toolbar{margin:0 0 var(--sp-3)}
.com-sort{display:inline-flex;gap:var(--sp-1);background:var(--pame-bg-soft, #f2f4f7);
  border-radius:999px;padding:3px}
.com-sort-btn,.com-sort-btn:hover,.com-sort-btn:focus,.com-sort-btn:active{
  background:transparent;color:var(--fg-2);border:0;height:calc(var(--ctl-h) - 8px);
  padding:0 var(--sp-3);border-radius:999px;font-size:var(--fs-13);cursor:pointer}
.com-sort-btn:hover{color:var(--fg-1);background:rgba(0,0,0,.04)}
.com-sort-btn.on,.com-sort-btn.on:hover,.com-sort-btn.on:focus,.com-sort-btn.on:active{
  background:#fff;color:var(--fg-1);box-shadow:0 1px 3px rgba(0,0,0,.08);font-weight:600}
.com-search{height:var(--ctl-h);border:var(--ctl-bd);border-radius:var(--r-md);padding:0 var(--sp-3);
  min-width:180px;background:#fff;color:var(--fg-1)}

.com-chips{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-3)}
.com-chip,.com-chip:hover,.com-chip:focus,.com-chip:active{
  --com-chip-c:var(--pame-blue);background:var(--pame-bg);color:var(--fg-2);
  border:1px solid var(--pame-border);border-radius:999px;padding:6px var(--sp-3);
  font-size:var(--fs-12);cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.com-chip:hover{background:var(--pame-bg-soft, #eef1f4);color:var(--fg-1)}
.com-chip.on,.com-chip.on:hover,.com-chip.on:focus,.com-chip.on:active{
  background:var(--com-chip-c);color:#fff;border-color:var(--com-chip-c)}

.com-composer{background:#fff;border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-3);
  margin:0 0 var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2)}
.com-composer-row{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-2)}
.com-cat-sel,.com-titulo{height:var(--ctl-h);border:var(--ctl-bd);border-radius:var(--r-md);
  padding:0 var(--sp-3);background:#fff;color:var(--fg-1);font-size:var(--fs-14)}
.com-cuerpo{border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-2) var(--sp-3);
  background:#fff;color:var(--fg-1);font-size:var(--fs-14);resize:vertical;min-height:80px;
  font-family:inherit}
.com-acepta{display:flex;flex-direction:row;align-items:center;gap:var(--sp-2);
  font-size:var(--fs-12);font-weight:400;letter-spacing:normal;text-transform:none;color:var(--fg-2)}
.com-enviar,.com-enviar:hover,.com-enviar:focus,.com-enviar:active{
  height:var(--ctl-h);padding:0 var(--sp-4);border-radius:var(--r-md);border:0;
  background:var(--btn-bg);color:#fff;cursor:pointer;font-weight:600}
.com-enviar:hover{background:var(--btn-bg-h)}
.com-enviar:disabled{opacity:.5;cursor:not-allowed}
.com-msg{font-size:var(--fs-12);color:var(--fg-2)}
.com-msg.ok{color:var(--pame-teal-700, #036672)}
.com-msg.no{color:#b0324a}

.com-feed{display:flex;flex-direction:column;gap:var(--sp-3)}
.com-card{background:#fff;border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-3);
  transition:box-shadow .15s ease}
.com-card:hover{box-shadow:0 2px 12px rgba(0,0,0,.06)}
.com-card-link{display:block;color:inherit;text-decoration:none}
.com-card-head{display:flex;gap:var(--sp-2);align-items:center;margin:0 0 var(--sp-2)}
.com-card-meta{display:flex;flex-direction:column;gap:2px;font-size:var(--fs-13);color:var(--fg-2)}
.com-card-meta b{color:var(--fg-1);font-weight:600}
.com-card-titulo{margin:var(--sp-1) 0;font-size:var(--fs-16);color:var(--fg-1)}
.com-card-extracto{margin:0;font-size:var(--fs-14);color:var(--fg-2);line-height:1.5}
.com-fecha{color:var(--fg-3);font-size:var(--fs-12)}
.com-badge{background:var(--pame-teal, #0C6A7C);color:#fff;font-size:var(--fs-11);
  padding:2px 8px;border-radius:999px;margin-left:6px;font-weight:600;letter-spacing:.02em}
.com-cat-badge{--com-chip-c:var(--pame-blue);background:var(--com-chip-c);color:#fff;
  font-size:var(--fs-11);padding:2px 8px;border-radius:999px;margin-left:6px;font-weight:600}
.com-fijado{background:#fff8ec;color:#7a4b04;font-size:var(--fs-11);
  padding:2px 8px;border-radius:999px;margin-left:6px;font-weight:600}
.com-pend{background:#fff8ec;color:#7a4b04;font-size:var(--fs-11);
  padding:2px 8px;border-radius:999px;margin-left:6px}

.com-av{width:36px;height:36px;border-radius:50%;object-fit:cover;flex:none}
.com-av--txt{display:inline-flex;align-items:center;justify-content:center;
  background:var(--btn-bg);color:#fff;font-weight:700;font-size:var(--fs-14)}

.com-card-acc{display:flex;gap:var(--sp-3);align-items:center;padding-top:var(--sp-2);
  border-top:1px solid var(--pame-border);margin-top:var(--sp-2)}
.com-like,.com-comentar,
.com-like:hover,.com-comentar:hover,
.com-like:focus,.com-comentar:focus,
.com-like:active,.com-comentar:active{
  display:inline-flex;align-items:center;gap:6px;background:transparent;
  border:0;color:var(--fg-2);cursor:pointer;font-size:var(--fs-13);
  text-decoration:none;padding:4px 6px}
.com-like svg,.com-comentar svg{width:16px;height:16px}
.com-like:hover,.com-comentar:hover{color:var(--fg-1);background:rgba(0,0,0,.04)}
.com-like.on,.com-like.on:hover,.com-like.on:focus,.com-like.on:active{color:#e53e3e;background:transparent}
.com-like.on svg{fill:#e53e3e}
.com-reportar,.com-reportar:hover,.com-reportar:focus,.com-reportar:active{
  background:transparent;color:var(--fg-3);border:0;cursor:pointer;font-size:var(--fs-12);padding:4px 6px}
.com-reportar:hover{color:var(--fg-1)}

.com-mas{text-align:center;margin:var(--sp-4) 0}
.com-empty,.com-select{max-width:640px;margin:var(--sp-4) auto;text-align:center}
.com-select-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));
  gap:var(--sp-3);margin-top:var(--sp-3)}
.com-select-card{background:#fff;border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-4);
  text-decoration:none;color:var(--fg-1);display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
  transition:box-shadow .15s ease}
.com-select-card:hover{box-shadow:0 2px 12px rgba(0,0,0,.06)}
.com-select-emoji{font-size:32px}
.com-select-nombre{font-weight:600}

/* Detalle */
.com-detalle-nav{margin:0 0 var(--sp-3)}
.com-post{background:#fff;border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-4);
  margin:0 0 var(--sp-4)}
.com-post-titulo{margin:var(--sp-2) 0;font-size:var(--fs-24);color:var(--fg-1)}
.com-post-cuerpo{margin:0 0 var(--sp-3);font-size:var(--fs-15);color:var(--fg-1);line-height:1.6}
.com-coms h3{font-size:var(--fs-18);margin:0 0 var(--sp-3)}
.com-com{background:#fff;border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-3);
  margin:0 0 var(--sp-2)}
.com-com-hijos{margin:var(--sp-2) 0 0 var(--sp-4);padding-left:var(--sp-3);
  border-left:2px solid var(--pame-border);display:flex;flex-direction:column;gap:var(--sp-2)}
.com-com-hijos .com-com-fila{padding:var(--sp-2) 0}
.com-com-fila{display:flex;gap:var(--sp-2);align-items:flex-start}
.com-com-fila.es-admin{background:var(--pame-teal-10, #eaf6f8);padding:var(--sp-2);border-radius:var(--r-sm)}
.com-com-cuerpo{flex:1}
.com-com-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px;
  font-size:var(--fs-12);color:var(--fg-2)}
.com-com-meta b{color:var(--fg-1);font-weight:600}
.com-com-texto{margin:4px 0;font-size:var(--fs-14);color:var(--fg-1);line-height:1.5;white-space:pre-wrap}
.com-com-mini{display:flex;gap:var(--sp-3);margin-top:6px}
.com-com-acc{margin:var(--sp-2) 0 0 44px}
.com-composer-resp{margin-top:var(--sp-2)}

@media (max-width:640px){
  .com-toolbar{flex-wrap:wrap}
  .com-search{width:100%}
  .com-composer-row{grid-template-columns:1fr}
}


/* Modal ad-hoc del editor de categorías de la Comunidad (panel admin) */
.com-cat-ov{position:fixed;inset:0;background:rgba(20,30,50,.45);
  display:flex;align-items:center;justify-content:center;z-index:1000;padding:var(--sp-3)}
.com-cat-modal{background:#fff;border-radius:var(--r-md);padding:var(--sp-4);
  max-width:520px;width:100%;box-shadow:0 10px 40px rgba(0,0,0,.2);
  display:flex;flex-direction:column;gap:var(--sp-3)}
.com-cat-modal h3{margin:0;font-size:var(--fs-18);color:var(--fg-1)}
.com-cat-modal .adm-input,
.com-cat-modal .adm-select{width:100%}
/* El color-picker por default se estira a lo ancho y con height alto queda ovalado
   (Chrome lo pinta como elipse). Lo dejamos con ancho fijo y bordes prolijos. */
.com-cat-modal input[type=color]{width:64px;height:var(--ctl-h);padding:2px;
  border:var(--ctl-bd);border-radius:var(--r-md);cursor:pointer;background:#fff}
.com-cat-modal input[type=color]::-webkit-color-swatch-wrapper{padding:0}
.com-cat-modal input[type=color]::-webkit-color-swatch{border:0;border-radius:var(--r-sm)}
.com-cat-modal input[type=color]::-moz-color-swatch{border:0;border-radius:var(--r-sm)}

/* Caja de reportes adjunta a un post/comentario pendiente en la cola de moderación.
   Se pinta con fondo suave y una barrita a la izquierda, para que se lea como
   "esta info viene de los alumnos" y no se confunda con el contenido del post. */
.com-reportes-box{background:#fff8ec;border-left:3px solid #f5c76a;
  border-radius:var(--r-sm);padding:var(--sp-2) var(--sp-3);margin:var(--sp-2) 0;
  font-size:var(--fs-13)}
.com-reportes-tit{font-weight:700;color:#7a4b04;margin-bottom:4px}
.com-reporte-item{margin:2px 0;color:var(--fg-1)}
.com-reporte-item b{color:#7a4b04}

/* ── Comunidad · Perfil del alumno (drawer lateral) ─────────────────────── */
.com-perfil-bd{position:fixed;inset:0;background:rgba(20,30,50,.35);z-index:900;
  opacity:0;transition:opacity .18s var(--ease-out)}
.com-perfil-bd.open{opacity:1}
.com-perfil-drawer{position:fixed;top:0;right:0;bottom:0;width:min(420px,92vw);
  background:#fff;box-shadow:-8px 0 24px rgba(0,0,0,.12);z-index:901;
  transform:translateX(100%);transition:transform .22s var(--ease-out);
  overflow-y:auto;padding-bottom:var(--sp-4)}
.com-perfil-drawer.open{transform:translateX(0)}
.com-perfil-cerrar{display:flex;justify-content:flex-end;padding:var(--sp-2) var(--sp-3)}
.com-perfil-head{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
  padding:var(--sp-2) var(--sp-4) var(--sp-3)}
.com-perfil-head h2{margin:0;font-size:var(--fs-20);color:var(--fg-1);text-align:center}
.com-perfil-av{width:72px;height:72px;border-radius:50%;object-fit:cover}
.com-perfil-av--txt{display:inline-flex;align-items:center;justify-content:center;
  background:var(--btn-bg);color:#fff;font-size:28px;font-weight:700}
.com-perfil-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-2);
  padding:var(--sp-2) var(--sp-4);border-bottom:1px solid var(--pame-border)}
.com-perfil-stats > div{display:flex;flex-direction:column;align-items:center;gap:2px}
.com-perfil-stats b{font-size:var(--fs-18);color:var(--fg-1)}
.com-perfil-stats span{font-size:var(--fs-11);color:var(--fg-3);text-transform:uppercase;letter-spacing:.02em}
.com-perfil-posts{padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2)}
.com-perfil-posts h3{margin:0 0 var(--sp-2);font-size:var(--fs-14);color:var(--fg-2);text-transform:uppercase;letter-spacing:.02em}
.com-perfil-post{display:flex;flex-direction:column;gap:4px;padding:var(--sp-2) var(--sp-3);
  background:var(--pame-bg-soft, #f7f9fb);border-radius:var(--r-sm);text-decoration:none;color:var(--fg-1);
  transition:background var(--t-fast)}
.com-perfil-post:hover{background:var(--pame-bg)}
.com-perfil-post-tit{font-weight:600;font-size:var(--fs-14)}
.com-perfil-post-meta{font-size:var(--fs-11);color:var(--fg-3)}

/* ── Avatar clickeable ──────────────────────────────────────────────────── */
.com-av--link{cursor:pointer;transition:transform var(--t-fast)}
.com-av--link:hover{transform:scale(1.06)}
.com-autor-link{cursor:pointer}
.com-autor-link:hover{color:var(--pame-blue);text-decoration:underline}

/* ── Menciones @ ────────────────────────────────────────────────────────── */
.com-mencion,.com-mencion:hover,.com-mencion:focus,.com-mencion:active{
  color:var(--pame-blue);font-weight:600;text-decoration:none;background:var(--pame-blue-10, #e6eefa);
  padding:1px 6px;border-radius:var(--r-pill)}
.com-mencion:hover{background:var(--pame-blue-20, #d0e0f5)}

/* ── Autocomplete de menciones (dropdown debajo del textarea) ─────────── */
.com-cuerpo-wrap{position:relative}
.com-mencion-drop{position:absolute;left:0;right:0;top:100%;background:#fff;
  border:var(--ctl-bd);border-radius:var(--r-md);box-shadow:0 4px 16px rgba(0,0,0,.1);
  max-height:220px;overflow-y:auto;z-index:50;margin-top:2px}
.com-mencion-op,.com-mencion-op:hover,.com-mencion-op:focus,.com-mencion-op:active{
  display:flex;align-items:center;gap:var(--sp-2);width:100%;background:transparent;
  border:0;padding:8px var(--sp-3);cursor:pointer;text-align:left;font-size:var(--fs-13);color:var(--fg-1)}
.com-mencion-op:hover{background:var(--pame-bg-soft, #f2f4f7)}
.com-mencion-op img{width:24px;height:24px;border-radius:50%;object-fit:cover}

/* Hint chico bajo un textarea del composer (ej: "tipeá @ para mencionar") */
.com-hint{margin:2px 0 0;font-size:var(--fs-12);color:var(--fg-3)}
.com-hint b{color:var(--pame-blue);font-weight:700}

/* ── Composer rich (contenteditable) para post + comentario ─────────────── */
.com-cuerpo-rich{min-height:110px;border:var(--ctl-bd);border-radius:var(--r-md);
  padding:var(--sp-2) var(--sp-3);background:#fff;color:var(--fg-1);
  font-family:inherit;font-size:var(--fs-14);line-height:1.5;outline:none;
  overflow-y:auto;max-height:280px}
.com-cuerpo-rich:focus{border-color:var(--pame-blue);box-shadow:0 0 0 3px var(--pame-blue-10, #e6eefa)}
.com-cuerpo-rich--sm{min-height:60px;max-height:180px}
.com-cuerpo-rich:empty::before{content:attr(data-placeholder);color:var(--pame-ink-3);pointer-events:none}

/* Chip de mención embebido en el editor y en el render */
.com-mencion-chip{display:inline-block;background:var(--pame-blue-10, #e6eefa);color:var(--pame-blue);
  font-weight:600;padding:1px 6px;border-radius:var(--r-pill);margin:0 1px;
  user-select:all;-webkit-user-select:all}

/* ── Toolbar del composer (emoji + imagen) ────────────────────────────── */
.com-tools{display:flex;align-items:center;gap:var(--sp-2);margin-top:6px;padding:0 2px}
.com-tool,.com-tool:hover,.com-tool:focus,.com-tool:active{
  background:transparent;border:0;padding:6px 8px;border-radius:var(--r-sm);cursor:pointer;
  font-size:16px;color:var(--fg-2);display:inline-flex;align-items:center;gap:4px}
.com-tool:hover{background:var(--pame-bg-soft, #f2f4f7);color:var(--fg-1)}

/* Emoji picker popup */
.com-emoji-pop{position:absolute;z-index:1200;background:#fff;border:var(--ctl-bd);
  border-radius:var(--r-md);box-shadow:0 6px 20px rgba(0,0,0,.12);padding:8px;max-width:320px}
.com-emoji-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px}
.com-emoji-btn,.com-emoji-btn:hover,.com-emoji-btn:focus,.com-emoji-btn:active{
  background:transparent;border:0;padding:4px;font-size:18px;cursor:pointer;border-radius:var(--r-sm)}
.com-emoji-btn:hover{background:var(--pame-bg-soft, #f2f4f7)}
@media (max-width:640px){ .com-emoji-grid{grid-template-columns:repeat(8,1fr)} }

/* Preview de adjuntos en el composer (antes de publicar) */
.com-adjs-preview{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-2)}
.com-adj-prev{position:relative;width:80px;height:80px;border-radius:var(--r-sm);overflow:hidden;background:var(--pame-bg-soft)}
.com-adj-prev img{width:100%;height:100%;object-fit:cover;display:block}
.com-adj-x,.com-adj-x:hover,.com-adj-x:focus,.com-adj-x:active{
  position:absolute;top:2px;right:2px;background:rgba(0,0,0,.65);color:#fff;border:0;
  width:20px;height:20px;border-radius:50%;font-size:11px;cursor:pointer;line-height:1;padding:0;
  display:flex;align-items:center;justify-content:center}
.com-adj-x:hover{background:rgba(0,0,0,.85)}

/* Adjuntos renderizados en el post (grid tipo Instagram) */
.com-adjs{display:grid;gap:2px;margin-top:var(--sp-2);border-radius:var(--r-md);overflow:hidden;
  max-height:400px}
.com-adjs--1{grid-template-columns:1fr}
.com-adjs--2{grid-template-columns:1fr 1fr}
.com-adjs--3{grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr}
.com-adjs--3 .com-adj:first-child{grid-row:span 2}
.com-adjs--4{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}
.com-adj{display:block;position:relative;overflow:hidden;background:var(--pame-bg-soft)}
.com-adj img{width:100%;height:100%;object-fit:cover;display:block;min-height:120px;max-height:400px}

/* Links autolinkeados en el cuerpo de un post/comentario */
.com-link,.com-link:hover,.com-link:focus,.com-link:active{color:var(--pame-blue);
  text-decoration:underline;background:transparent}
.com-link:hover{color:var(--pame-blue-700)}

/* Cuando la academia desactivó "mostrar personas", los avatares y nombres de
   otros dejan de comportarse como links (sin cursor, sin hover). El propio
   sigue siendo clickeable — que el alumno pueda ver cómo se le ve al resto. */
body.com-no-perfiles .com-av--link,
body.com-no-perfiles .com-autor-link,
body.com-no-perfiles .com-mencion{cursor:default}
body.com-no-perfiles .com-av--link:hover{transform:none}
body.com-no-perfiles .com-autor-link:hover{color:inherit;text-decoration:none}
body.com-no-perfiles .com-mencion:hover{background:var(--pame-blue-10, #e6eefa)}

/* Multi-select de comunidades en "Nuevo post" del panel admin */
.cp-cats-box{border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-2);
  background:#fff;max-height:220px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}
.cp-cat-grupo{display:flex;flex-direction:column;gap:2px;padding:var(--sp-1) 0}
.cp-cat-grupo + .cp-cat-grupo{border-top:1px solid var(--pame-line);margin-top:4px;padding-top:6px}
.cp-cat-grupo-tit{font-size:var(--fs-11);font-weight:700;text-transform:uppercase;
  letter-spacing:.02em;color:var(--fg-3);padding:2px var(--sp-2)}
.cp-cat-opt{display:flex;align-items:center;gap:var(--sp-2);padding:6px var(--sp-2);
  border-radius:var(--r-sm);cursor:pointer;font-size:var(--fs-14);color:var(--fg-1);
  font-weight:normal;letter-spacing:normal;text-transform:none;flex-direction:row}
.cp-cat-opt:hover{background:var(--pame-bg-soft, #f2f4f7)}

/* ── "Alumnos conectados ahora" (home admin, solo academias con el switch) ──
   Lista en vivo de alumnos logueados adentro del área de alumno. Ver
   db/presencia-alumnos-en-vivo.sql y app/presencia.js. */
.dash-conect .bh h4{display:flex;align-items:center;gap:8px}
.dconect-dot{width:9px;height:9px;border-radius:var(--r-pill);background:var(--success);
  box-shadow:0 0 0 3px var(--success-soft);animation:dconect-latido 1.6s ease-in-out infinite}
@keyframes dconect-latido{50%{opacity:.35}}
.dconect-n{min-width:20px;height:20px;padding:0 6px;display:inline-flex;align-items:center;
  justify-content:center;border-radius:var(--r-pill);background:var(--success);color:#fff;
  font-size:var(--fs-12);font-weight:800}
.dconect-list{display:flex;flex-direction:column;gap:8px}
.dconect-row{display:flex;align-items:center;gap:12px;padding:8px 10px;border-radius:var(--r-sm);
  background:var(--surface-card);border:1px solid var(--pame-line)}
.dconect-av{flex:0 0 auto;width:34px;height:34px;border-radius:var(--r-pill);
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:var(--fs-14);
  color:var(--teal-800);background:var(--teal-100)}
.dconect-tx{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
.dconect-tx b{font-size:var(--fs-14);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dconect-sub{font-size:var(--fs-12);color:var(--text-muted);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.dconect-when{flex:0 0 auto;font-size:var(--fs-12);color:var(--text-muted);white-space:nowrap}

/* ═══════════════════════════════════════════════════════════════════════
   Sesiones 1:1 — reservar.html / mis-sesiones.html
   ═══════════════════════════════════════════════════════════════════════ */
.ses-saldo{font-size:var(--fs-14);color:var(--fg-2);margin:0 0 var(--sp-4)}
.ses-saldo a{color:var(--pame-blue);text-decoration:none}
/* Calendario y panel pegados (no se estiran a los extremos en pantallas anchas) */
.ses-grid{display:grid;grid-template-columns:minmax(0,420px) minmax(300px,460px);justify-content:start;gap:var(--sp-5);align-items:start}
.ses-dias{display:flex;flex-direction:column;gap:var(--sp-5)}
.ses-dia-tit{font-size:var(--fs-14);font-weight:700;color:var(--fg-1);text-transform:capitalize;margin-bottom:var(--sp-2)}
.ses-slots{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.ses-slot{display:inline-flex;align-items:center;justify-content:center;min-height:var(--ctl-h);
  padding:0 var(--sp-4);border:var(--ctl-bd);border-radius:var(--r-pill);background:var(--pame-bg);
  color:var(--pame-blue);font-family:var(--font-sans);font-size:var(--fs-14);font-weight:700;cursor:pointer;
  transition:background var(--t-fast) var(--ease-out),border-color var(--t-fast) var(--ease-out)}
.ses-slot:hover{border-color:var(--pame-blue);background:var(--pame-blue-10)}
.ses-slot.on{background:var(--btn-bg);border-color:var(--btn-bg);color:#fff}
.ses-panel{position:sticky;top:var(--sp-4);background:var(--surface-card);border:1px solid var(--pame-blue-20);
  border-radius:var(--r-lg);padding:var(--sp-5);box-shadow:var(--shadow-sm)}
.ses-conf-fecha{display:flex;flex-direction:column;gap:var(--sp-1)}
.ses-conf-lbl{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-3)}
.ses-conf-fecha strong{font-size:var(--fs-18);color:var(--fg-1);text-transform:capitalize}
.ses-conf-hora{font-size:var(--fs-16);color:var(--pame-blue);font-weight:700}
.ses-field{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-4)}
.ses-field label{display:block;font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
.ses-field input,.ses-field textarea{font-family:var(--font-sans);font-size:var(--fs-14);padding:var(--sp-2) var(--sp-3);
  border:var(--ctl-bd);border-radius:var(--r-md);background:var(--pame-bg);color:var(--fg-1)}
.ses-field input{min-height:var(--ctl-h)}
.ses-req{color:var(--danger)}
/* Preguntas de opciones al reservar (una = radio, varias = checkbox) */
.ses-lbl{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
/* Cartel "Cómo funciona" del reservador (vencimiento, anticipación, cancelación) */
.ses-reglas{margin:var(--sp-3) 0 var(--sp-4);padding:var(--sp-3) var(--sp-4);background:var(--pame-bg);
  border:1px solid var(--pame-blue-20);border-radius:var(--r-md)}
.ses-reglas ul{margin:var(--sp-2) 0 0;padding-left:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-1);
  font-size:var(--fs-14);color:var(--fg-1)}
.ses-ops{display:flex;flex-direction:column;gap:var(--sp-2)}
.ses-field .ses-ops label{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--sp-2);font-size:var(--fs-14);font-weight:400;
  text-transform:none;letter-spacing:normal;color:var(--fg-1);cursor:pointer}
.ses-field .ses-ops input{flex:none;width:auto;min-height:0;padding:0;margin:0;accent-color:var(--pame-teal)}
.ses-msg{margin-top:var(--sp-3);font-size:var(--fs-14)}
.ses-msg.err{color:var(--danger)}
.ses-ok h3{color:var(--pame-blue-700)}
/* Calendario mensual del reservador (vista tipo Calendly) */
.ses-cal{background:var(--surface-card);border:1px solid var(--pame-blue-20);border-radius:var(--r-lg);
  padding:var(--sp-4);box-shadow:var(--shadow-sm);max-width:420px}
.ses-cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--sp-4)}
.ses-cal-mes{font-size:var(--fs-16);font-weight:700;color:var(--fg-1);text-transform:capitalize}
.ses-cal-nav{width:var(--ctl-h);height:var(--ctl-h);display:inline-flex;align-items:center;justify-content:center;
  border:var(--ctl-bd);border-radius:var(--r-pill);background:var(--pame-bg);color:var(--pame-blue);
  font-size:var(--fs-18);line-height:1;cursor:pointer;
  transition:background var(--t-fast) var(--ease-out),border-color var(--t-fast) var(--ease-out)}
.ses-cal-nav:hover:not(:disabled){border-color:var(--pame-blue);background:var(--pame-blue-10)}
.ses-cal-nav:disabled{opacity:.4;cursor:default}
.ses-cal-dows{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:var(--sp-2);margin-bottom:var(--sp-2)}
.ses-cal-dows span{text-align:center;font-size:var(--fs-12);font-weight:700;color:var(--fg-3);text-transform:capitalize}
.ses-cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:var(--sp-2)}
.ses-cd{aspect-ratio:1/1;min-width:0;display:inline-flex;align-items:center;justify-content:center;
  padding:0;margin:0;line-height:1;box-sizing:border-box;appearance:none;-webkit-appearance:none;
  font-family:var(--font-sans);font-size:var(--fs-14);border-radius:var(--r-md);color:var(--fg-3);
  border:1px solid transparent;background:transparent}
.ses-cd.empty{visibility:hidden}
.ses-cd.has{background:var(--pame-blue-10);color:var(--pame-blue-700);font-weight:700;cursor:pointer;
  border-color:var(--pame-blue-20);
  transition:background var(--t-fast) var(--ease-out),border-color var(--t-fast) var(--ease-out)}
.ses-cd.has:hover{border-color:var(--pame-blue);background:var(--pame-blue-20)}
.ses-cd.on{background:var(--btn-bg);border-color:var(--btn-bg);color:#fff}
.ses-cd.hoy:not(.on){border-color:var(--pame-blue)}
.ses-pan-tit{font-size:var(--fs-16);font-weight:700;color:var(--fg-1);text-transform:capitalize;margin-bottom:var(--sp-1)}
.ses-pan-sub{margin:0 0 var(--sp-3)}
@media (max-width:720px){
  .ses-grid{grid-template-columns:1fr}
  .ses-panel{position:static}
}

.ms-lista{display:flex;flex-direction:column;gap:var(--sp-4)}
.ms-card{margin-bottom:0}
.ms-head{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-3)}
.ms-curso{font-size:var(--fs-16);font-weight:700;color:var(--fg-1)}
.ms-fecha{font-size:var(--fs-14);color:var(--fg-2);text-transform:capitalize;margin-top:var(--sp-1)}
.ms-badge{flex:0 0 auto;font-size:var(--fs-12);font-weight:700;padding:var(--sp-1) var(--sp-3);
  border-radius:var(--r-pill);background:var(--pame-blue-10);color:var(--pame-blue-700);white-space:nowrap}
.ms-badge.ok{background:var(--teal-100);color:var(--teal-800)}
.ms-badge.off{background:var(--danger-soft);color:var(--danger)}
.ms-acciones{margin-top:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-3)}
.ms-acc{margin-top:0;justify-content:flex-start}
.ms-cancel:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-soft)}
.ms-repro{margin-top:var(--sp-4);border-top:1px solid var(--pame-blue-20);padding-top:var(--sp-4)}
.ms-repro-tit{font-size:var(--fs-14);font-weight:700;color:var(--fg-1);margin-bottom:var(--sp-3)}
.ms-tit-pas{color:var(--fg-3)}

/* Editor admin — disponibilidad semanal de sesiones (.ui-rows) */
.ses-hor{--ui-cols: minmax(90px,auto) auto minmax(90px,1fr) minmax(90px,1fr);
  --ui-cols-mob: minmax(70px,auto) auto 1fr 1fr}
.ses-hor-dia{font-weight:700;color:var(--fg-1)}
.ses-hor-ck{display:flex;align-items:center;justify-content:center}
/* Panel admin — reservas de sesión */
.ses-adm-empty{margin-top:var(--sp-4)}
.ses-adm{--ui-cols: minmax(150px,auto) minmax(130px,1.2fr) minmax(130px,1.4fr) auto auto;
  --ui-cols-mob: 1fr auto}
.ses-adm-acc{display:flex;gap:var(--sp-2);flex-wrap:wrap}
/* Selectores de calendario (editor de sesiones): revisar conflictos / dónde agendar */
.ses-cals{margin-top:var(--sp-3)}
.ses-cals-list{display:flex;flex-direction:column;gap:var(--sp-2);margin:var(--sp-2) 0 var(--sp-3)}
/* Modal "Gestionar sesión" (detalle + reprogramar + cancelar) */
.ses-det-card{max-width:680px;width:min(680px,92vw)}
.ses-det{display:flex;flex-direction:column;gap:var(--sp-2);margin:var(--sp-2) 0}
.ses-det-item{display:flex;gap:var(--sp-3);font-size:var(--fs-14)}
.ses-det-k{flex:0 0 96px;color:var(--fg-3);font-weight:700}
.ses-det-v{color:var(--fg-1);word-break:break-word}
.ses-det-sub{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-3);margin-top:var(--sp-4)}
.ses-det-repro{gap:var(--sp-2);align-items:center;flex-wrap:wrap;margin-top:var(--sp-2)}
.ses-det-foot{flex-wrap:wrap;gap:var(--sp-2)}
/* Material privado del alumno (modal Gestionar) */
.ses-ent-list{display:flex;flex-direction:column;gap:var(--sp-2);margin:var(--sp-2) 0}
.ses-ent-item{display:flex;align-items:center;gap:var(--sp-2);justify-content:space-between;font-size:var(--fs-14)}
.ses-ent-item a{color:var(--pame-blue);word-break:break-all}
.ses-ent-del{border:none;background:transparent;color:var(--danger);font-size:var(--fs-18);line-height:1;cursor:pointer;padding:0 var(--sp-2)}
.ses-ent-add{gap:var(--sp-2);flex-wrap:wrap;margin-bottom:var(--sp-2)}
/* Material de la sesión, visible para el alumno (Mis sesiones) */
.ms-material{margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px solid var(--pame-blue-20);font-size:var(--fs-14)}
.ms-material a{display:inline-block;margin:var(--sp-1) var(--sp-2) 0 0;color:var(--pame-blue);font-weight:700}
/* Ficha del producto: sesiones ya reservadas por el comprador */
.ses-mis{display:flex;flex-direction:column;gap:var(--sp-2);margin:var(--sp-2) 0 var(--sp-3)}
.ses-mis-item{font-size:var(--fs-15);color:var(--fg-1);text-transform:capitalize}
/* Bloque "tu sesión reservada" arriba del reservador */
.ses-mis-box{background:var(--surface-card);border:1px solid var(--pame-blue-20);border-radius:var(--r-lg);
  padding:var(--sp-5);box-shadow:var(--shadow-sm);margin-bottom:var(--sp-5)}
.ses-mis-tit{font-size:var(--fs-16);font-weight:700;color:var(--fg-1);margin-bottom:var(--sp-3)}
/* Cuadro destacado "tenés una sesión disponible para reservar" */
.ses-disp{background:var(--pame-blue-10);border-color:var(--pame-blue)}
.ses-disp h3{color:var(--pame-blue-700)}
/* Aviso "la academia te pidió reprogramar" en Mis sesiones */
.ms-aviso{background:var(--pame-blue-10);border-left:4px solid var(--pame-blue);border-radius:0 var(--r-md) var(--r-md) 0;
  padding:var(--sp-3) var(--sp-4);margin:var(--sp-3) 0;font-size:var(--fs-14);color:var(--fg-1)}

/* ── Biblioteca de videos (sección del panel + selector del editor de clase) ──
   Lo dibuja app/biblioteca.js. La tarjeta es la misma en los dos usos. */
.bib-filtros{display:flex;flex-wrap:wrap;align-items:center;gap:var(--gap-ctl);margin:0 0 var(--gap-blk)}
.bib-buscar{flex:1;min-width:var(--bib-buscar-min);min-height:var(--ctl-h)}
.bib-filtros .adm-select{width:auto}
.bib-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--bib-card-min),1fr));gap:var(--sp-4)}
.bib-card{display:flex;flex-direction:column;border:var(--ctl-bd);border-radius:var(--r-md);
  background:var(--bg-1);overflow:hidden;box-shadow:var(--shadow-xs)}
.bib-thumb{position:relative;aspect-ratio:16/9;background:var(--pame-line);display:flex;align-items:center;justify-content:center}
.bib-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;font-size:0}
.bib-thumb .anim{opacity:0;transition:opacity var(--t-fast) var(--ease-out)}
.bib-card:hover .bib-thumb .anim[src]{opacity:1}
.bib-thumb-vacio{font-size:var(--fs-32);opacity:.5}
.bib-body{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-3);flex:1}
.bib-tit{font-size:var(--fs-14);font-weight:700;color:var(--fg-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bib-meta{font-size:var(--fs-12);color:var(--fg-3)}
.bib-tags{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1);margin-top:var(--sp-1)}
.bib-est{background:var(--pame-orange-10);color:var(--pame-orange-600)}
.bib-est--err{background:var(--pame-bg-soft);color:var(--pame-danger)}
.bib-usos{font-size:var(--fs-12);color:var(--fg-2);width:100%}
.bib-usos summary{cursor:pointer;color:var(--pame-teal-700);font-weight:700}
.bib-usos ul{margin:var(--sp-1) 0 0;padding-left:var(--sp-4)}
.bib-uso-curso{color:var(--fg-3)}
.bib-acc{margin-top:auto;padding-top:var(--sp-2);display:flex;justify-content:flex-end;gap:var(--sp-2);flex-wrap:wrap}
.bib-usar{width:100%}
.bib-vacio[hidden],.bib-mas[hidden]{display:none}
.dup-card.bib-modal{width:var(--bib-modal-w)}
/* Tarjeta fantasma mientras carga la Biblioteca (latido suave, sin animación si se pidió menos movimiento) */
.bib-card--esq{box-shadow:none}
.bib-card--esq .bib-thumb,.bib-esq-l{animation:bib-late 1.2s ease-in-out infinite}
.bib-esq-l{display:block;height:var(--fs-14);width:80%;border-radius:var(--r-sm);background:var(--pame-line)}
.bib-esq-l--corta{width:45%}
@keyframes bib-late{50%{opacity:.45}}
@media (prefers-reduced-motion:reduce){.bib-card--esq .bib-thumb,.bib-esq-l{animation:none}}

/* ═══ Eventos con entradas ═══════════════════════════════════════════════
   mis-entradas.html (lista del comprador/titular) + entrada.html (el micrositio
   de cada entrada: QR, datos, puerta del organizador) + editor/panel en admin. */
.ent-filas{--ui-cols: auto minmax(160px,1fr) auto auto;
  --ui-cols-mob: auto 1fr auto;
  margin-top:var(--sp-4)}
.ent-num{font-weight:700;color:var(--fg-3)}
.ent-quien{display:flex;flex-direction:column;min-width:0;font-size:var(--fs-14);color:var(--fg-1)}
.ent-quien b{overflow:hidden;text-overflow:ellipsis}
.ent-quien small{font-size:var(--fs-12);color:var(--fg-3);overflow:hidden;text-overflow:ellipsis}
.ent-quien--vacia{color:var(--fg-3);font-style:italic}
.ent-acc{display:flex;flex-wrap:wrap;gap:var(--sp-2);justify-content:flex-end}
.ent-filas .ent-asignar{grid-column:1/-1;padding:var(--sp-3) 0 var(--sp-2);border-bottom:1px solid var(--pame-blue-20)}
.ent-asignar[hidden]{display:none}
.ent-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:0 var(--sp-3)}
@media (max-width:720px){
  .ent-filas .ent-acc{grid-column:1/-1;justify-content:flex-start}
}

/* Micrositio de la entrada (página pública, sin rail) */
.ent-page{margin:0;background:var(--pame-bg-soft);color:var(--fg-1);font-family:var(--font-sans)}
.ent-top{display:flex;justify-content:center;padding:var(--sp-4);background:var(--bg-1);border-bottom:1px solid var(--pame-line)}
.ent-wrap{max-width:calc(var(--sp-9) * 7);margin:0 auto;padding:var(--sp-5) var(--sp-4) var(--sp-8);
  display:flex;flex-direction:column;gap:var(--sp-4)}
.ent-card{background:var(--bg-1);border:1px solid var(--pame-line);border-radius:var(--r-lg);
  padding:var(--sp-5);box-shadow:var(--shadow-sm)}
.ent-vacio{text-align:center}
.ent-vacio h2{margin:0 0 var(--sp-2);font-size:var(--fs-20)}
.ent-vacio p{margin:0;color:var(--fg-2)}
.ent-head{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-3);
  padding-bottom:var(--sp-4);border-bottom:2px dashed var(--pame-line)}
.ent-kicker{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--pame-teal-700)}
.ent-tit{margin:var(--sp-1) 0 0;font-size:var(--fs-24);line-height:1.2;color:var(--fg-1)}
.ent-sub{margin:0 0 var(--sp-1);font-size:var(--fs-18)}
.ent-cuerpo{display:flex;gap:var(--sp-5);align-items:flex-start;padding-top:var(--sp-4)}
.ent-datos{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--sp-3)}
.ent-dato{display:flex;flex-direction:column;gap:var(--sp-1)}
.ent-dato > span{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-3)}
.ent-dato b{font-size:var(--fs-15);color:var(--fg-1)}
.ent-dato b::first-letter{text-transform:uppercase}
.ent-dato small{font-size:var(--fs-13);color:var(--fg-2)}
.ent-zona{display:block;color:var(--fg-3)}
.ent-mapa{font-size:var(--fs-13);font-weight:700;color:var(--pame-blue)}
.ent-qr{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:var(--sp-2)}
.ent-qr svg{display:block;width:calc(var(--sp-9) * 2);height:auto}
.ent-qr-off{width:calc(var(--sp-9) * 2);aspect-ratio:1;display:flex;align-items:center;justify-content:center;
  text-align:center;border-radius:var(--r-md);background:var(--danger-soft);color:var(--danger);font-weight:700}
.ent-codigo{font-family:Consolas,monospace;font-size:var(--fs-16);font-weight:700;letter-spacing:.2em;color:var(--fg-2)}
.ent-online{align-items:center;flex-wrap:wrap}
.ent-acciones{justify-content:flex-start}
.ent-puerta{background:var(--pame-blue-10);border:2px solid var(--pame-blue);border-radius:var(--r-lg);padding:var(--sp-5)}
.ent-puerta--ya{background:var(--teal-100);border-color:var(--pame-teal)}
.ent-puerta-tit{font-size:var(--fs-18);font-weight:700;color:var(--fg-1);margin-bottom:var(--sp-3)}
.ent-puerta p{margin:0 0 var(--sp-3);color:var(--fg-2);font-size:var(--fs-14)}
.ent-puerta textarea{width:100%;box-sizing:border-box;font-family:var(--font-sans);font-size:var(--fs-14);
  padding:var(--sp-2) var(--sp-3);border:1px solid var(--pame-line);border-radius:var(--r-sm);resize:vertical}
.ent-btn-big{width:100%;min-height:calc(var(--ctl-h) * 1.5);font-size:var(--fs-18)}
@media (max-width:560px){
  .ent-cuerpo{flex-direction:column-reverse;align-items:center}
  .ent-datos{width:100%}
}
@media print{
  .ent-page{background:#fff}
  .ent-top{border:0}
  .ent-puerta,.ent-form-card,.ent-acciones,.ent-online,.ui-toast-stack{display:none !important}
  .ent-card{box-shadow:none;break-inside:avoid}
}
/* Ficha (producto.html): selector de fecha + cantidad del evento */
.pp-ev{display:flex;flex-direction:column;gap:var(--sp-2);margin-bottom:var(--sp-4)}
.pp-ev-tit{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-3)}
.pp-ev-fecha::first-letter{text-transform:uppercase}
.pp-ev-agot{opacity:.5;cursor:not-allowed}
.pp-ev-lugar{display:flex;align-items:flex-start;gap:var(--sp-2);font-size:var(--fs-13);color:var(--fg-2)}
.pp-ev-lugar svg{flex:none;width:var(--fs-16);height:var(--fs-16);margin-top:var(--sp-1)}
.pp-ev-cant{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-top:var(--sp-2);
  font-size:var(--fs-14);font-weight:700;color:var(--fg-1)}
.pp-ev-step{display:flex;align-items:center;gap:var(--sp-3)}
.pp-ev-step .cal-btn{width:var(--ctl-h);padding:0;font-size:var(--fs-18)}
.pp-ev-step b{min-width:var(--sp-5);text-align:center;font-size:var(--fs-18)}
.pp-ev-nota{margin:0;text-align:left}
/* Checkout: fecha + cantidad del evento */
.co-ev-fila{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-bottom:var(--sp-3);flex-wrap:wrap}
.co-ev-lbl{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--fg-2)}
.co-ev-sel{flex:1;min-width:0;max-width:100%;height:var(--ctl-h);padding:0 var(--ctl-px);font-family:var(--font-sans);
  font-size:var(--fs-14);border:var(--ctl-bd);border-radius:var(--r-sm);background:var(--bg-1);color:var(--fg-1)}
/* Panel: editor del evento (fechas + campos) y pestaña Eventos */
.ev-funcs{--ui-cols: minmax(170px,1fr) minmax(170px,1fr) minmax(120px,1fr) minmax(90px,auto) auto auto;
  --ui-cols-mob: 1fr 1fr auto}
.ev-campos{--ui-cols: minmax(180px,2fr) minmax(120px,auto) minmax(160px,1.5fr) auto auto;
  --ui-cols-mob: 1fr auto auto}
.ev-vend{font-weight:700;color:var(--fg-2);text-align:center}
.ev-adm-bar{margin-top:0;margin-bottom:var(--sp-3);flex-wrap:wrap}
.ev-adm-bar .adm-select{width:auto;max-width:100%}
.ev-adm-bar .adm-input{flex:1;min-width:0;min-height:var(--ctl-h)}
.ev-adm-bar .grow{flex:1}
.ev-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:var(--sp-3);margin-bottom:var(--sp-4)}
.ev-kpi{background:var(--bg-1);border:var(--ctl-bd);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column}
.ev-kpi b{font-size:var(--fs-24);color:var(--fg-1)}
.ev-kpi span{font-size:var(--fs-12);color:var(--fg-3);text-transform:uppercase;letter-spacing:.02em;font-weight:700}
.ev-adm{--ui-cols: minmax(180px,1.5fr) minmax(110px,auto) minmax(150px,1fr) auto auto;
  --ui-cols-mob: 1fr auto}
.ev-nota{color:var(--fg-2)}
@media (max-width:720px){ .ev-adm .ses-adm-acc{grid-column:1/-1} }
/* .adm-grid es display:grid: sin esto, [hidden] no lo esconde (presencial ↔ online) */
.adm-grid[hidden]{display:none}
.ev-mapa-frame{display:block;width:100%;aspect-ratio:16/7;border:var(--ctl-bd);border-radius:var(--r-md)}
@media (max-width:720px){ .ev-mapa-frame{aspect-ratio:4/3} }
.ent-org{text-align:center}
@media print{ .ent-org{display:none} }
/* Editor del evento: dirección con sugerencias (Photon) + mapa (Leaflet) */
.ev-dir-wrap{position:relative}
.ev-dir-wrap input{width:100%;box-sizing:border-box}
.ev-sug{position:absolute;left:0;right:0;top:calc(100% + var(--sp-1));z-index:1000;background:var(--bg-1);
  border:var(--ctl-bd);border-radius:var(--r-md);box-shadow:var(--shadow-sm);max-height:calc(var(--sp-9) * 3);overflow-y:auto}
.ev-sug[hidden]{display:none}
.ev-sug-it{display:flex;flex-direction:column;align-items:flex-start;gap:var(--sp-1);width:100%;text-align:left;
  padding:var(--sp-2) var(--sp-3);border:0;border-bottom:1px solid var(--pame-line);background:var(--bg-1);color:var(--fg-1);cursor:pointer;font-family:var(--font-sans)}
.ev-sug-it:hover,.ev-sug-it:focus{background:var(--pame-blue-10);color:var(--fg-1)}
.ev-sug-it b{font-size:var(--fs-14)}
.ev-sug-it span{font-size:var(--fs-12);color:var(--fg-3)}
.ev-sug-vacio{padding:var(--sp-3);font-size:var(--fs-13);color:var(--fg-3)}
.ev-mapa-map{height:calc(var(--sp-9) * 3.5);border:var(--ctl-bd);border-radius:var(--r-md);overflow:hidden;z-index:0}

/* ── Academia en PAUSA: panel en modo lectura (ver activarModoPausa en admin.html) ──
   Los controles de las secciones quedan grisados; el click lo ataja el JS y muestra el
   aviso con "Reactivar". Inicio, Estadísticas y la barra de sub-pestañas quedan libres. */
.academia-pausada{ --pausa-opac:.45 }
.academia-pausada .adm-content .admin-sec:not(#sec-home):not(#sec-stats)
  :is(button,input,select,textarea,label,[contenteditable],[role="button"]){
  opacity:var(--pausa-opac); filter:grayscale(1); cursor:not-allowed }

/* Cuentas adicionales de transferencia (Configuraciones → Pagos) */
.tr-otras{--ui-cols: minmax(110px,1fr) minmax(130px,1.2fr) minmax(110px,1fr) minmax(150px,1.3fr) minmax(130px,1.1fr) minmax(150px,1.4fr) auto;
  --ui-cols-mob: 1fr auto}
/* Aviso de textos legales incompletos en el Inicio (pintarLegAviso en admin.html). Tono de
   advertencia, no de error: no corta nada, pero los alumnos ven "COMPLETAR" al comprar. */
.dash-leg-alert{display:flex;gap:var(--sp-3);align-items:center;flex-wrap:wrap;
  background:var(--warning-soft);border:1px solid var(--warning);border-left-width:var(--sp-1);
  border-radius:var(--r-sm);padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-4);color:var(--fg-1)}
.dash-leg-alert svg{flex:none;width:var(--sp-5);height:var(--sp-5);color:var(--warning)}
.dash-leg-alert-body{flex:1 1 calc(var(--sp-9) * 3);min-width:0;display:flex;flex-direction:column;gap:var(--sp-1)}
.dash-leg-alert-body b{font-size:var(--fs-15);color:var(--fg-1)}
.dash-leg-alert-body p{margin:0;font-size:var(--fs-13);color:var(--fg-2)}
.dash-leg-alert .btn-add{flex:none}
